Commit 1d7200ad authored by 我在何方's avatar 我在何方

更新帮助客户延迟

parent 2910861d
...@@ -259,3 +259,29 @@ export function getCustomerLines(customerId){ ...@@ -259,3 +259,29 @@ export function getCustomerLines(customerId){
}) })
} }
// 获取客户延期调入公海池的审批详情
export function getDelayInfo(query) {
return request({
url: '/ecw/customer/delay/approval/info',
method: 'get',
params: query
})
}
//客户延期调入公海池的审批申请
export function creatDelayApproval(data){
return request({
url:'/ecw/customer/delay/approval',
method:'post',
data
})
}
// 取消客户延期调入公海池的审批申请
export function cancelDelayApproval(data) {
return request({
url: '/ecw/customer/cancel/delay/approval',
method: 'put',
data: data,
})
}
import request from '@/utils/request'
// 创建对内帮助文档
export function createInternalHelpDoc(data) {
return request({
url: '/system/internal-help-doc/create',
method: 'post',
data: data
})
}
// 更新对内帮助文档
export function updateInternalHelpDoc(data) {
return request({
url: '/system/internal-help-doc/update',
method: 'put',
data: data
})
}
// 删除对内帮助文档
export function deleteInternalHelpDoc(id) {
return request({
url: '/system/internal-help-doc/delete?id=' + id,
method: 'delete'
})
}
// 获得对内帮助文档
export function getInternalHelpDoc(id) {
return request({
url: '/system/internal-help-doc/get?id=' + id,
method: 'get'
})
}
// 获得对内帮助文档分页
export function getInternalHelpDocPage(query) {
return request({
url: '/system/internal-help-doc/page',
method: 'get',
params: query
})
}
// 导出对内帮助文档 Excel
export function exportInternalHelpDocExcel(query) {
return request({
url: '/system/internal-help-doc/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
...@@ -7,10 +7,14 @@ ...@@ -7,10 +7,14 @@
<div class="right-menu"> <div class="right-menu">
<template v-if="device!=='mobile'"> <template v-if="device!=='mobile'">
<div class="right-menu-item">
<el-image style="width: 22px;height: 22px;cursor: pointer;" :src="helpIcon" @click="tohelp"></el-image>
</div>
<el-badge :value="matterNum !== 0 ? matterNum : '' " class="right-menu-item badge"> <el-badge :value="matterNum !== 0 ? matterNum : '' " class="right-menu-item badge">
<div @click="$router.push('/task/todo')" style="font-size: 28px; color: #cccccc;cursor: pointer;" class="el-icon-postcard"></div> <div @click="$router.push('/task/todo')" style="font-size: 28px; color: #cccccc;cursor: pointer;" class="el-icon-postcard"></div>
</el-badge> </el-badge>
<el-badge :value="notMessage !== 0 ? notMessage : '' " class="right-menu-item badge"> <el-badge :value="notMessage !== 0 ? notMessage : '' " class="right-menu-item badge">
<el-image style="width: 22px;height: 20px;cursor: pointer;" :src="unreadMessage" @click="notRead"></el-image> <el-image style="width: 22px;height: 20px;cursor: pointer;" :src="unreadMessage" @click="notRead"></el-image>
</el-badge> </el-badge>
...@@ -40,7 +44,7 @@ ...@@ -40,7 +44,7 @@
<dict-selector :type="DICT_TYPE.SYSTEM_LOCALE" v-model="lang" defaultable class="right-menu-item select-nav" /> <dict-selector :type="DICT_TYPE.SYSTEM_LOCALE" v-model="lang" defaultable class="right-menu-item select-nav" />
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<div class="avatar-wrapper flex-center"> <div class="avatar-wrapper flex-center">
{{$store.getters.name}} {{$store.getters.name}}
<img :src="avatar" class="user-avatar ml-10"> <img :src="avatar" class="user-avatar ml-10">
...@@ -74,11 +78,13 @@ import RuoYiGit from '@/components/RuoYi/Git' ...@@ -74,11 +78,13 @@ import RuoYiGit from '@/components/RuoYi/Git'
import RuoYiDoc from '@/components/RuoYi/Doc' import RuoYiDoc from '@/components/RuoYi/Doc'
import {getLocale, saveLocale} from "@/utils/db"; import {getLocale, saveLocale} from "@/utils/db";
import unreadMessage from "@/assets/images/unread-message.png" import unreadMessage from "@/assets/images/unread-message.png"
import helpIcon from "@/assets/images/help.png"
import i18n from '@/i18n' import i18n from '@/i18n'
export default { export default {
data() { data() {
return { return {
unreadMessage, unreadMessage,
helpIcon,
// locale: getLocale(), // locale: getLocale(),
// 枚举 // 枚举
// langDatas: LangEnum.LANG, // langDatas: LangEnum.LANG,
...@@ -159,6 +165,9 @@ export default { ...@@ -159,6 +165,9 @@ export default {
}, },
notRead(){ notRead(){
this.$router.push({path:'/system/internalMessage/my-internal-message',query:{status:'0'}}); this.$router.push({path:'/system/internalMessage/my-internal-message',query:{status:'0'}});
},
tohelp(){
this.$router.push({path:'/operation_manage/info'});
} }
} }
} }
......
...@@ -148,6 +148,7 @@ export const DICT_TYPE = { ...@@ -148,6 +148,7 @@ export const DICT_TYPE = {
//customer //customer
CUSTOMER_CREDIT_RULE_TYPE: 'customer_credit_rule_type', CUSTOMER_CREDIT_RULE_TYPE: 'customer_credit_rule_type',
CUSTOMER_LEVEL_RULE_TYPE: 'customer_level_rule_type', CUSTOMER_LEVEL_RULE_TYPE: 'customer_level_rule_type',
CUSTOMER_ESOURCE_TYPE:'customer_resource_type',//客户资源类型
// order // order
ORDER_TYPE: 'order_type', // 订单类型 ORDER_TYPE: 'order_type', // 订单类型
PRODUCT_RECORD_ATTRIBUTE: 'product_record_attribute', //产品备案属性 PRODUCT_RECORD_ATTRIBUTE: 'product_record_attribute', //产品备案属性
......
<template>
<div class="app-container">
<el-card>
<el-form :model="handlerParams" ref="queryForms" size="small" :inline="true" label-width="180px" class="card">
<el-row>
<el-form-item :label="$t('客户名称')+':'">
<span style="margin-left: 8px;">{{handlerParams.customerName}}</span>
</el-form-item>
</el-row>
<el-row >
<el-form-item :label="$t('原时间掉入公海池时间')+':'">
<span style="margin-left: 8px;">{{handlerParams.orgEstimateEnterOpenSeaTime}}</span>
</el-form-item>
</el-row>
<el-row>
<el-form-item :label="$t('申请延期后掉入时间')+':'">
<el-date-picker
v-model="handlerParams.estimateEnterOpenSeaTime"
type="date"
value-format="timestamp"
:placeholder="$t('请输入申请延期后掉入时间')">
</el-date-picker>
</el-form-item>
</el-row>
<el-row :span="8">
<el-form-item :label="$t('凭证')+':'" size="medium" :require="true">
<upload v-model="handlerParams.voucher" :limit="1"></upload>
</el-form-item>
</el-row>
<el-row :span="8">
<el-form-item :label="$t('申请理由')+':'" size="medium">
<el-input style="width: 500px;" type="textarea" v-model="handlerParams.reason" />
</el-form-item>
</el-row>
</el-form>
</el-card>
<!-- 只有不需要预付才需要审核 -->
<template>
<div class="page-title">{{$t('审批流程')}}</div>
<work-flow xmlkey="quotation_customer_delay_public" v-model="handlerParams.ccIds" />
</template>
<div slot="footer" class="dialog-footer">
<!-- bpmStatus
异常流程状态,1处理中2通过3不通过4已取消
待审核可能没有bpmStatus字段
-->
<template v-if="handlerParams.status == 1">
<el-button type="primary" @click="$router.push(`/bpm/process-instance/detail?id=`+handlerParams.bpmId)">{{$t('审核中')}}</el-button>
<el-button plain type="primary" @click="cancelAudit">{{$t('取消审核')}}</el-button>
<el-button plain type="primary" @click="$store.dispatch('tagsView/delCurrentView')">{{$t('返回')}}</el-button>
</template>
<template v-else>
<el-button type="primary" @click="submitForm">{{$t('提交')}}</el-button>
<el-button plain type="primary" @click="$store.dispatch('tagsView/delCurrentView')">{{$t('取消')}}</el-button>
</template>
</div>
</div>
</template>
<script>
import upload from '@/components/ImageUpload'
import {getDictData, getDictDatas} from '@/utils/dict'
import {getCustomer,getDelayInfo,creatDelayApproval,cancelDelayApproval} from '@/api/ecw/customer'
import WorkFlow from '@/components/WorkFlow'
import {cancelProcessInstance} from '@/api/bpm/processInstance'
export default {
name: "Delay",
components: {
upload, WorkFlow
},
data() {
return {
// 遮罩层
loading: false,
handlerParams:{
},
customerData:{},
showWorkFlow: false, // 是否显示工作流
dateRangeCreateTime:[]
};
},
created() {
if(this.$route.query.id){
this.getData(this.$route.query.id)
}
},
methods: {
getData(id){
getCustomer(id).then(response => {
this.customerData = response.data
this.getDely(id)
});
},
getDely(id){
console.log(this.customerData)
let that = this
getDelayInfo({customerId:id}).then(res=>{
if(res.data){
that.handlerParams = res.data
if(!that.handlerParams.orgEstimateEnterOpenSeaTime){
that.handlerParams.orgEstimateEnterOpenSeaTime = that.getNowDate(that.customerData.enterOpenSeaTime)
}
console.log(that.handlerParams)
}else{
that.handlerParams = {
customerId:that.customerData.id,
customerName:that.customerData.name,
orgEstimateEnterOpenSeaTime: that.getNowDate(that.customerData.enterOpenSeaTime)
}
}
})
},
submitForm(){
// if(!this.handlerParams.orderExceptionHandlerResult){
// this.$modal.msgError(this.$t('请选择处理结果'));
// return
// }
// if(!this.handlerParams.fileList||this.handlerParams.fileList.length==0){
// this.$modal.msgError(this.$t('请上传报关资料'));
// return
// }
this.handlerParams.ccIds = Array.isArray(this.handlerParams.ccIds) ? this.handlerParams.ccIds.join(',') : this.handlerParams.ccIds
this.handlerParams.voucher = Array.isArray(this.handlerParams.voucher) ? this.handlerParams.voucher.join(',') : this.handlerParams.voucher
this.$set(this.handlerParams,'createTime',this.formatDate())
this.handlerParams.estimateEnterOpenSeaTime = this.getNowDate(this.handlerParams.estimateEnterOpenSeaTime)
creatDelayApproval(this.handlerParams).then(res=>{
this.$modal.msgSuccess(this.$t('提交成功'));
this.$store.dispatch('tagsView/delCurrentView')
})
},
getNowDate(time) {
if(time){
var date = new Date(time);
}else{
var date = new Date();
}
var year = date.getFullYear() // 年
var month = date.getMonth() + 1; // 月
var day = date.getDate(); // 日
// 给一位数的数据前面加 “0”
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (day >= 0 && day <= 9) {
day = "0" + day;
}
return year + "-" + month + "-" + day
},
formatDate() {
var date = new Date()
var year = date.getFullYear()
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
},
// 取消审核
cancelAudit(){
this.$prompt("请输入取消原因", {
inputPattern: /[\S]+/,
inputErrorMessage: '不能为空'
}).then(({value}) => {
return cancelDelayApproval(this.handlerParams.formId, value)
})
.then(res => {
this.getList()
})
}
}
};
</script>
<style scoped>
.card-title{
font-size: 18px;
font-weight: bold;
margin-top: 10px;
}
.header{
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
}
.card{
margin-top: 20px;
}
.dialog-footer{
padding: 40px;
width: 60%;
align-items: center;
display: flex;
/* justify-content: space-between; */
}
</style>
This diff is collapsed.
...@@ -120,6 +120,7 @@ ...@@ -120,6 +120,7 @@
v-hasPermi="['ecw:customer:delete']">{{$t('删除')}}</el-button> v-hasPermi="['ecw:customer:delete']">{{$t('删除')}}</el-button>
<el-button size="mini" type="text" icon="el-icon-collection" @click="followUp(scope.row)">{{$t('跟进')}}</el-button> <el-button size="mini" type="text" icon="el-icon-collection" @click="followUp(scope.row)">{{$t('跟进')}}</el-button>
<el-button size="mini" type="text" icon="el-icon-user" @click="complaint(scope.row)">{{$t('客诉')}}</el-button> <el-button size="mini" type="text" icon="el-icon-user" @click="complaint(scope.row)">{{$t('客诉')}}</el-button>
<el-button size="mini" type="text" icon="el-icon-user" @click="delay(scope.row)">{{$t('延期')}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -753,6 +754,10 @@ export default { ...@@ -753,6 +754,10 @@ export default {
this.$refs.CustomerFollowList.customerFollow.dialogVisible = true; this.$refs.CustomerFollowList.customerFollow.dialogVisible = true;
}) })
}, },
delay(row){
this.$router.push({path:'/customer/delay',query:{id:row.id}})
},
complaint(row){ complaint(row){
this.customerId = row.id; this.customerId = row.id;
this.$nextTick(()=>{ this.$nextTick(()=>{
......
<template>
<div class="app-container">
<!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item :label="$t('客户名称')" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入客户名称" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item :label="$t('联系方式')">
<el-input :placeholder="$t('请输入联系方式')" v-model="queryParams.defaultContactPhone"></el-input>
</el-form-item>
<el-form-item :label="$t('客户经理')" prop="customerService">
<el-select clearable v-model="queryParams.customerService" :placeholder="$t('请选择客户经理')" clearable size="small">
<el-option v-for="dict in customerServiceList"
:key="dict.id" :label="dict.nickname" :value="dict.id"/>
</el-select>
</el-form-item>
<el-form-item :label="$t('客户来源')" prop="source">
<el-select clearable v-model="queryParams.source" :placeholder="$t('请选择客户来源')" clearable size="small">
<el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_SOURCE)"
:key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item :label="$t('创建时间')">
<el-date-picker clearable v-model="dateRangeCreateTime" style="width: 240px" value-format="yyyy-MM-dd"
type="daterange" range-separator="-" :start-placeholder="$t('开始日期')" :end-placeholder="$t('结束日期')" />
</el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{$t('搜索')}}</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">{{$t('重置')}}</el-button>
</el-form-item>
</el-form>
<!-- 列表 -->
<el-table ref="multipleTable" v-loading="loading" :data="list" @selection-change="handleSelectionChange">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column :label="$t('客户名称')" align="center" prop="name" />
<el-table-column :label="$t('联系方式')" prop="defaultContactPhone">
<template v-slot="{row}">
+{{row.defaultContactPhone}}
</template>
</el-table-column>
<el-table-column :label="$t('客户来源')" align="center" prop="sourse">
<template v-slot="{row}">
<dict-tag :value="row.resourceType" :type="DICT_TYPE.CUSTOMER_SOURCE" />
</template>
</el-table-column>
<el-table-column :label="$t('资源类型')" align="center" prop="resourceType">
<template v-slot="{row}">
<dict-tag :value="row.resourceType" :type="DICT_TYPE.CUSTOMER_ESOURCE_TYPE" />
</template>
</el-table-column>
<el-table-column :label="$t('客户类别')" align="center" prop="sourse">
<template v-slot="{row}">
<dict-tag :value="row.type" :type="DICT_TYPE.CUSTOMER_TYPE" />
</template>
</el-table-column>
<el-table-column :label="$t('创建时间')" align="center" prop="createTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('客户经理')" align="center" prop="customerService" :formatter="customerServiceFn">
</el-table-column>
<el-table-column :label="$t('操作')" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-user" @click="delay(scope.row)">{{$t('完善')}}</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
@pagination="getList"/>
</div>
</template>
<script>
import { createCustomer, updateCustomer, deleteCustomer, getCustomer,
getCustomerPage, exportCustomerExcel } from "@/api/ecw/customer";
import { getDictDatas, DICT_TYPE } from '@/utils/dict';
import {CommonStatusEnum} from '@/utils/constants'
import {getNodeList} from "@/api/ecw/node"
import {listServiceUser} from "@/api/system/user";
import {getCreditPage} from "@/api/customer/credit";
export default {
name: "IndirectCustomer",
data() {
return {
getDictDatas,
DICT_TYPE,
// 遮罩层
loading: true,
// 导出遮罩层
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 客户列表
list: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
dateRangeCreateTime: [],
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 10,
name: null,
source: null,
customerService: null,
},
// 网点
nodeList: [],
customerId:undefined,
customerServiceList:[],
};
},
created() {
this.getList();
listServiceUser().then(r=>{
this.customerServiceList = r.data;
})
},
methods: {
customerServiceFn(val){
if(this.customerServiceList.length > 0){
let index =this.customerServiceList.findIndex(item => item.id === val.customerService);
return index !== -1 ? this.customerServiceList[index]?.nickname :''
}else {
return ''
}
},
/** 查询列表 */
getList() {
this.loading = true;
// 处理查询参数
let params = {...this.queryParams};
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
// 执行查询
getCustomerPage(params).then(response => {
this.list = response.data.list;
this.total = response.data.total;
this.loading = false;
});
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNo = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.dateRangeCreateTime = [];
this.resetForm("queryForm");
this.queryParams = {
pageNo: 1,
pageSize: 10,
name: null,
source: null,
customerService: null,
}
this.handleQuery();
},
delay(row){
this.$router.push({path:'/customer/editIndirect',query:{id:row.id}})
},
handleSelectionChange(val){
}
}
};
</script>
This diff is collapsed.
<template>
<div class="infoheader">
<el-collapse v-model="activeNames">
<div v-for="item in helpData" :key="item.id">
<el-collapse-item :title="item.titleZh" :name="item.id">
<span v-html="item.contentZh">{{ item.contentZh }}</span>
</el-collapse-item>
</div>
</el-collapse>
</div>
</template>
<script>
import { getInternalHelpDocPage} from "@/api/system/internalHelpDoc";
export default {
data() {
return {
activeNames: [],
helpData: []
}
},
created() {
getInternalHelpDocPage({ pageNo: 1, pageSize: 100 }).then((r) => {
this.helpData = r.data.list
this.activeNames = this.helpData.map(m => { return m.id })
})
}
}
</script>
<style scoped>
.infoheader{
padding:20px
}
</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