master_merge v11.0.2
yang 4 years ago
parent 5673b48cb0
commit c8ae1f21b3

@ -36,7 +36,7 @@
"nprogress": "0.2.0",
"numeral": "^2.0.6",
"nzh": "^1.0.4",
"pinyin-match": "^1.0.9",
"pinyin-match": "1.0.9",
"qrcodejs2": "0.0.2",
"throttle-debounce": "^2.1.0",
"vue": "2.5.17",

@ -18,6 +18,7 @@
:cache-done="cacheDone"
@status="crmImportChange"
@close="crmImportClose"/>
<xr-upgrade-dialog v-if="upgradeDialogShow" :visible.sync="upgradeDialogShow" />
</div>
</template>
@ -26,6 +27,7 @@
import VuePictureViewer from '@/components/VuePictureViewer/index'
import XrImport from '@/components/XrImport'
import XrImportMixins from '@/components/XrImport/XrImportMixins'
import XrUpgradeDialog from '@/components/XrUpgradeDialog'
import CRMImport from '@/components/CRMImport'
import { mapGetters } from 'vuex'
import cache from '@/utils/cache'
@ -36,22 +38,31 @@ export default {
components: {
VuePictureViewer,
XrImport,
CRMImport
CRMImport,
XrUpgradeDialog
},
mixins: [XrImportMixins],
data() {
return {
showPreviewImg: false,
previewIndex: 0,
previewImgs: []
previewImgs: [],
upgradeDialogShow: false
}
},
computed: {
...mapGetters(['activeIndex', 'userInfo'])
...mapGetters(['activeIndex', 'addRouters', 'userInfo'])
},
watch: {
$route(to, from) {
this.showPreviewImg = false //
},
addRouters() {
if (this.userInfo && this.userInfo.is_read_notice != 1) {
setTimeout(() => {
this.upgradeDialogShow = true
}, 5000)
}
}
},
mounted() {

@ -33,7 +33,20 @@ export function biBusinessTrendListAPI(data) {
}
})
}
/**
* 新增商机数与金额趋势分析 详情列表
* @param {*} data
*/
export function biBusinessConversionRateListAPI(data) {
return request({
url: 'bi/business/winList',
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/**
* 赢单机会转化率趋势分析
* @param {*} data

@ -27,7 +27,7 @@ export function biCustomerTotalListAPI(data) {
export function biCustomerTotalListExportAPI(data) {
return request({
url: 'bi/contract/excelExport',
url: 'bi/customer/excelExport',
method: 'post',
data: data,
responseType: 'blob',
@ -69,7 +69,7 @@ export function biCustomerRecordListAPI(data) {
export function biCustomerRecordListExportAPI(data) {
return request({
url: 'bi/contract/excelExport',
url: 'bi/customer/excelExport',
method: 'post',
data: data,
responseType: 'blob',
@ -96,7 +96,7 @@ export function biCustomerRecordModeAPI(data) {
export function biCustomerRecordModeExportAPI(data) {
return request({
url: 'bi/contract/excelExport',
url: 'bi/customer/excelExport',
method: 'post',
data: data,
responseType: 'blob',
@ -169,7 +169,7 @@ export function biCustomerPoolListAPI(data) {
export function biCustomerPoolListExportAPI(data) {
return request({
url: 'bi/contract/excelExport',
url: 'bi/customer/excelExport',
method: 'post',
data: data,
responseType: 'blob',
@ -196,7 +196,7 @@ export function biCustomerUserCycleAPI(data) {
export function biCustomerUserCycleExportAPI(data) {
return request({
url: 'bi/contract/excelExport',
url: 'bi/customer/excelExport',
method: 'post',
data: data,
responseType: 'blob',
@ -234,7 +234,7 @@ export function biCustomerAddressCycleAPI(data) {
export function biCustomerAddressCycleExportAPI(data) {
return request({
url: 'bi/contract/excelExport',
url: 'bi/customer/excelExport',
method: 'post',
data: data,
responseType: 'blob',
@ -261,7 +261,7 @@ export function biCustomerProductCycleAPI(data) {
export function biCustomerProductCycleExportAPI(data) {
return request({
url: 'bi/contract/excelExport',
url: 'bi/customer/excelExport',
method: 'post',
data: data,
responseType: 'blob',
@ -288,7 +288,7 @@ export function biCustomerSatisfactionTableAPI(data) {
export function biCustomerSatisfactionTableExportAPI(data) {
return request({
url: 'bi/contract/excelExport',
url: 'bi/customer/excelExport',
method: 'post',
data: data,
responseType: 'blob',
@ -315,7 +315,7 @@ export function biCustomerProductSatisfactionTableAPI(data) {
export function biCustomerProductSatisfactionExportAPI(data) {
return request({
url: 'bi/contract/excelExport',
url: 'bi/customer/excelExport',
method: 'post',
data: data,
responseType: 'blob',

@ -354,7 +354,7 @@ export function downloadFileImageAPI(data) {
*/
export function readUpdateNoticeAPI(data) {
return request({
url: 'adminUser/readNotice',
url: 'admin/adminUser/readNotice',
method: 'post',
data: data
})

@ -363,7 +363,7 @@ export function workExcelImportAPI(data) {
*/
export function workDownloadErrorExcelAPI(data) {
return request({
url: 'work/work/downloadErrorExcel',
url: 'admin/file/download',
method: 'post',
data: data,
responseType: 'blob'

@ -137,7 +137,7 @@ export function workTaskRecoverAPI(data) {
*/
export function taskWorkbenchExportAPI(data) {
return request({
url: 'oa/task/excelExport',
url: 'work/task/excelExport',
method: 'post',
data: data,
responseType: 'blob'

@ -134,7 +134,7 @@ export function taskDeleteLabelAPI(data) {
*/
export function taskOaExportAPI(data) {
return request({
url: 'work/task/excelExport',
url: 'oa/task/excelExport',
method: 'post',
data: data,
responseType: 'blob',

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

@ -76,7 +76,7 @@ export default {
//
showFoot: {
type: Boolean,
default: false
default: true
},
showAdd: {
type: Boolean,

@ -0,0 +1,139 @@
<template>
<el-dialog
:visible="visible"
:close-on-click-modal="false"
class="xr-upgrade-dialog"
title=""
width="700px"
append-to-body
@close="closeView">
<el-button class="close-button" icon="el-icon-close" @click="closeView"/>
<flexbox class="upgrade-header" justify="center" align="center" orient="vertical">
<span class="upgrade-header__title">升级通知</span>
<span class="upgrade-header__version">版本{{ WKConfig.version }}</span>
</flexbox>
<div class="content">
<div class="content__title">升级内容</div>
<div class="content__content">{{ message }}</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="closeView"></el-button>
</span>
</el-dialog>
</template>
<script>
import { readUpdateNoticeAPI } from '@/api/common'
export default {
name: 'XrUpgradeDialog',
components: {},
props: {
visible: Boolean
},
data() {
return {
message: `修复:
1修复自定义字段设置隐藏生效问题
2修复线索自定义字段转化字段设置生效问题
3修复导入数据超过100条部分的数据无法导入问题
4修复新建场景保存报错问题
5修复客户新建后显示为公海客户无法操作问题
6修复多选字段高级筛选不生效问题
7修复产品编辑报错问题
8修复部门人员字段列表展示问题
9修复手机邮箱字段详情编辑校验问题
10修复活动记录展示其他客户信息的问题
11修复系统提示账号在其他地方登录问题
12修复待办事项今日需联系客户标记完成不生效问题
13修复仪表盘数据统计错误问题
14修复仪表盘遗忘提醒数据查询统计错误问题
15修复仪表盘自定义时间部门筛选数据统计错误问题
16修复商业智能自定义时间筛选数据统计错误问题
17修复商业智能部门人员默认筛选数据统计错误问题
18修复 72crm-11.0-webPHP版部署后部门成员不展示问题;
19修复其他已知bug
20新增商业智能导出功能`
}
},
computed: {},
watch: {},
mounted() {},
beforeDestroy() {},
methods: {
closeView() {
readUpdateNoticeAPI().then(res => {
}).catch(() => {})
this.$emit('update:visible', false)
}
}
}
</script>
<style lang="scss">
.xr-upgrade-dialog {
.el-dialog__header {
display: none;
}
.el-dialog__body {
position: relative;
padding: 0 0 20px;
height: 500px;
}
.upgrade-header {
background-image: url('~@/assets/img/upgrade_bar.png');
background-repeat: no-repeat;
background-size: cover;
height: 131px;
color: white;
&__title {
display: inline-block;
font-size: 25px;
font-weight: bold;
}
&__version {
display: inline-block;
margin-top: 15px;
}
}
.content {
padding: 20px 30px;
font-size: 14px;
position: relative;
height: 370px;
overflow-y: auto;
&__title {
font-weight: bold;
}
&__content {
margin-top: 15px;
white-space: pre-wrap;
word-wrap: break-word;
word-break: break-all;
line-height: 1.5;
}
}
.close-button {
position: absolute;
top: 5px;
right: 0;
border: none;
outline: none;
background: transparent;
font-size: 19px;
font-weight: bold;
.el-icon-close {
color: white;
}
}
}
</style>

@ -3,8 +3,8 @@ const getLocationOrigin = () => {
}
const companyName = '悟空CRM'
const version = 'V11.0.1'
const baiduKey = '百度key'
const version = 'V11.0.2'
const baiduKey = 'lcuOQ71SCZhqpxsr1vL2mXoplWEoVctL'
export default {
version,

@ -72,9 +72,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
v-if="showTable"

@ -15,9 +15,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -15,9 +15,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -9,10 +9,10 @@
module-type="invoice"
@load="loading=true"
@change="getDataList">
<!-- <el-button
<el-button
class="export-button"
type="primary"
@click.native="exportClick">导出</el-button> -->
@click.native="exportClick">导出</el-button>
</filtrate-handle-view>
<div class="content">
<div class="content-title">

@ -15,9 +15,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -9,10 +9,10 @@
module-type="contract"
@load="loading=true"
@change="getDataList">
<!-- <el-button
<el-button
class="export-button"
type="primary"
@click.native="exportClick">导出</el-button> -->
@click.native="exportClick">导出</el-button>
</filtrate-handle-view>
<div class="content">
<div class="content-title">

@ -47,7 +47,8 @@
<script>
import {
biBusinessWinAPI,
biBusinessTrendListAPI
// biBusinessTrendListAPI
biBusinessConversionRateListAPI
} from '@/api/bi/business'
import ReportList from '@/views/crm/workbench/components/ReportList'
@ -176,7 +177,7 @@ export default {
handleRowClick(row, column, event) {
if (column.property != 'name' && row[column.property].replace('%', '') > 0) {
this.reportData.title = `${column.label}详情`
this.reportData.request = biBusinessTrendListAPI
this.reportData.request = biBusinessConversionRateListAPI
const params = { ...this.postParams }
params.type = column.label
this.reportData.params = params

@ -120,7 +120,7 @@ import XhUserCell from '@/components/CreateCom/XhUserCell'
import TimeTypeSelect from '@/components/TimeTypeSelect'
import moment from 'moment'
import { mapGetters } from 'vuex'
export default {
name: 'FiltrateHandleView', //
components: {
@ -214,9 +214,11 @@ export default {
}
},
computed: {
...mapGetters(['userInfo']),
showUserStrucSelect() {
return this.showUserSelect
}
},
watch: {},
mounted() {
@ -321,7 +323,7 @@ export default {
const params = {}
if (this.showUserStrucSelect) {
if (this.dataSelect == 1) {
params.structure_id = this.structuresSelectValue.length > 0 ? this.structuresSelectValue[0].id : '1'
params.structure_id = this.structuresSelectValue.length > 0 ? this.structuresSelectValue[0].id : this.userInfo.structure_id
}
} else {
params.structure_id = this.structuresSelectValue.length > 0 ? this.structuresSelectValue[0].id : '1'

@ -14,9 +14,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
v-if="showTable"

@ -18,9 +18,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
v-if="showTable"

@ -14,9 +14,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
v-if="showTable"

@ -8,10 +8,10 @@
module-type="contract"
@load="loading=true"
@change="getDataList">
<!-- <el-button
<el-button
class="export-button"
type="primary"
@click.native="exportClick">导出</el-button> -->
@click.native="exportClick">导出</el-button>
</filtrate-handle-view>
<div class="content">
<div class="table-content">

@ -15,9 +15,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
v-if="showTable"

@ -8,10 +8,10 @@
module-type="contract"
@load="loading=true"
@change="getDataList">
<!-- <el-button
<el-button
class="export-button"
type="primary"
@click.native="exportClick">导出</el-button> -->
@click.native="exportClick">导出</el-button>
</filtrate-handle-view>
<div class="content">
<div class="table-content">

@ -18,9 +18,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
v-if="showTable"

@ -8,10 +8,10 @@
module-type="oa"
@load="loading=true"
@change="getDataList">
<!-- <el-button
<el-button
class="export-button"
type="primary"
@click.native="exportExcel">导出</el-button> -->
@click.native="exportExcel">导出</el-button>
</filtrate-handle-view>
<div class="content">
<div class="table-content">

@ -8,10 +8,10 @@
module-type="oa"
@load="loading=true"
@change="getDataList">
<!-- <el-button
<el-button
class="export-button"
type="primary"
@click.native="exportExcel">导出</el-button> -->
@click.native="exportExcel">导出</el-button>
</filtrate-handle-view>
<div class="content">
<div class="table-content">

@ -8,10 +8,10 @@
module-type="product"
@load="loading=true"
@change="getProductDatalist">
<!-- <el-button
<el-button
class="export-button"
type="primary"
@click.native="exportClick">导出</el-button> -->
@click.native="exportClick">导出</el-button>
</filtrate-handle-view>
<div class="content">
<el-table

@ -19,9 +19,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -19,9 +19,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -19,9 +19,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -19,9 +19,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -19,9 +19,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -19,9 +19,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -19,9 +19,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -19,9 +19,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -19,9 +19,9 @@
</div>
<div class="table-content">
<div class="handle-bar">
<!-- <el-button
<el-button
class="export-btn"
@click="exportClick">导出</el-button> -->
@click="exportClick">导出</el-button>
</div>
<el-table
:data="list"

@ -398,6 +398,8 @@ export default {
.then(res => {
this.loading = false
this.detailData = res.data
if (this.detailData.dataAuth === 0) return
this.firstContactsId = this.detailData.contacts_id
this.headDetails[0].value = res.data.customer_id_info.name

@ -424,6 +424,8 @@ export default {
this.$wkUploadFile.upload({
file: file,
params: {
module_id: this.id,
module: 'crm_' + this.crmType,
type: type,
batchId: this.batchId
}

@ -513,7 +513,7 @@ export default {
if (this.isSeas) {
return false
}
if (this.crmType == 'business' && ['statusName', 'typeName'].includes(item.form_type)) {
if (this.crmType == 'business' && ['business_type', 'business_status'].includes(item.form_type)) {
return false
} else if (this.crmType == 'contract' && ['business', 'contacts', 'customer'].includes(item.form_type)) {
return false
@ -578,7 +578,7 @@ export default {
},
editConfirm() {
// customerId fieldId fieldType field formType value
// customerId fieldId fieldType field form_type value
// this.editCancel()
this.$refs.editForm0[0].validate(valid => {
if (valid) {
@ -640,38 +640,38 @@ export default {
getRealValue(element, value) {
if (
element.formType == 'customer' ||
element.formType == 'contacts' ||
element.formType == 'business' ||
element.formType == 'leads' ||
element.formType == 'contract'
element.form_type == 'customer' ||
element.form_type == 'contacts' ||
element.form_type == 'business' ||
element.form_type == 'leads' ||
element.form_type == 'contract'
) {
if (value && value.length) {
return value[0][`${element.formType}Id`]
return value[0][`${element.form_type}_id`]
} else {
return ''
}
} else if (
element.formType == 'user' ||
element.formType == 'single_user' ||
element.formType == 'structure'
element.form_type == 'user' ||
element.form_type == 'single_user' ||
element.form_type == 'structure'
) {
return value
.map(item => {
return (element.formType == 'user' || element.formType == 'single_user') ? item.userId : item.id
return (element.form_type == 'user' || element.form_type == 'single_user') ? item.id : item.id
})
.join(',')
} else if (element.formType == 'file') {
// .join(',')
} else if (element.form_type == 'file') {
if (value && value.length > 0) {
return value[0].batchId
return value.map(item => item.file_id)
}
return ''
} else if (element.formType == 'category') {
return []
} else if (element.form_type == 'category') {
if (value && value.length > 0) {
return value[value.length - 1]
}
return ''
} else if (element.formType == 'checkbox') {
} else if (element.form_type == 'checkbox') {
if (value && value.length > 0) {
return value.join(',')
}
@ -766,12 +766,15 @@ export default {
}
//
if (item.isUnique == 1) {
if (item.is_unique == 1) {
var validateUnique = (rule, value, callback) => {
if ((isArray(value) && value.length == 0) || !value) {
callback()
} else {
var validatesParams = {}
var validatesParams = {
field: item.field,
types: 'crm_' + this.crmType
}
validatesParams.fieldId = item.fieldId
if (isArray(value)) {
let postValue = ''
@ -798,15 +801,15 @@ export default {
postValue = value.join(',')
}
}
validatesParams.value = postValue
validatesParams.val = postValue
} else {
validatesParams.value = value
validatesParams.val = value
}
validatesParams.batchId = this.detail.batchId
filedValidatesAPI(validatesParams)
.then(res => {
// status 1 0
if (res.data.status === 1) {
// code 200
if (res.code == 200) {
callback()
} else {
callback(new Error(item.name + '已存在'))
@ -874,7 +877,7 @@ export default {
tempList.push({
validator: validateCRMMobile,
item: item,
trigger: []
trigger: ['blur', 'change']
})
} else if (item.form_type == 'email') {
var validateCRMEmail = (rule, value, callback) => {
@ -890,7 +893,7 @@ export default {
tempList.push({
validator: validateCRMEmail,
item: item,
trigger: []
trigger: ['blur', 'change']
})
}
return tempList

@ -288,7 +288,7 @@ export default {
})
.then(() => {
crmCustomerReceiveAPI({
ids: [data.id],
customer_id: [data.id],
poolId: data.poolAuthList.poolId
})
.then(res => {
@ -299,7 +299,7 @@ export default {
})
.catch(() => {})
} else {
data['customerId'] = data.id
data['customer_id'] = data.id
this.relationData = data
this.allocDialogShow = true
}

@ -497,7 +497,8 @@ export default {
o.form_type == 'single_user' ||
o.form_type == 'structure' ||
o.form_type == 'category' ||
o.form_type == 'checkbox'
o.form_type == 'checkbox' ||
o.form_type == 'select'
) {
if (!o.value || o.value.length === 0) {
if (o.condition != 'isNull' && o.condition != 'isNotNull') {

@ -109,7 +109,7 @@ export default {
})
this.fieldList.push({ prop: 'unit', width: '200', label: '单位' })
this.fieldList.push({ prop: 'price', width: '200', label: '标准价格' })
this.fieldList.push({ prop: 'salesPrice', width: '200', label: '售价' })
this.fieldList.push({ prop: 'sales_price', width: '200', label: '售价' })
this.fieldList.push({ prop: 'num', width: '200', label: '数量' })
this.fieldList.push({
prop: 'discount',
@ -120,7 +120,7 @@ export default {
},
fieldFormatter(row, column) {
if (column.property == 'price' || column.property == 'salesPrice') {
if (column.property == 'price' || column.property == 'sales_price') {
return separator(row[column.property] || 0)
}
return row[column.property]

@ -257,6 +257,8 @@ export default {
.then(res => {
this.loading = false
this.detailData = res.data
if (this.detailData.dataAuth === 0) return
//
this.headDetails[0].value = res.data.customer_name
this.headDetails[1].value = res.data.post

@ -277,6 +277,7 @@ export default {
// 使
const resData = res.data || {}
this.detailData = resData
if (this.detailData.dataAuth === 0) return
this.headDetails[0].value = resData.num
this.headDetails[1].value = resData.customer_id_info.name

@ -378,6 +378,7 @@ export default {
const resData = res.data || {}
this.detailData = resData
if (resData.dataAuth === 0) return
this.firstContactsId = this.detailData.contacts_id
//
// this.poolAuth = resData.poolAuthList || {}

@ -170,6 +170,7 @@ export default {
this.name = res.data.invoice_number
this.detailData = res.data
this.getBaseList(res.data)
if (this.detailData.dataAuth === 0) return
// //
this.headDetails[0].value = res.data.customer_name

@ -123,7 +123,7 @@ export default {
// temp.value = item.value
const canEdit = this.getItemIsCanEdit(item, this.action.type)
//
if (this.action.type !== 'update') {
if (canEdit) {
fieldRules[temp.field] = this.getRules(item)
}

@ -194,6 +194,7 @@ export default {
crmLeadsReadAPI({ id: this.id })
.then(res => {
this.detailData = res.data
if (this.detailData.dataAuth === 0) return
this.headDetails[0].value = res.data.name
this.headDetails[1].value = res.data.source

@ -438,7 +438,7 @@ export default {
params.type_id = this.selectionList
.map(item => {
let temp = []
const fieldKey = this.crmType === 'receivables_plan' ? 'planId' : `${this.crmType}_id`
const fieldKey = this.crmType === 'receivables_plan' ? 'plan_id' : `${this.crmType}_id`
// temp.typeId = item[fieldKey]
temp = item[fieldKey]
// id

@ -434,7 +434,7 @@ export default {
this.rowID = row.customer_id
this.rowType = 'customer'
this.showDview = true
} else if (column.property === 'contract_number') {
} else if (column.property === 'contract_num') {
this.rowID = row.contract_id
this.rowType = 'contract'
this.showDview = true

@ -201,6 +201,7 @@ export default {
.then(res => {
this.loading = false
this.detailData = res.data
if (this.detailData.dataAuth === 0) return
this.headDetails[0].value = res.data.category_id_info
this.headDetails[1].value = res.data.unit

@ -169,6 +169,8 @@ export default {
this.loading = false
this.name = res.data.number
this.detailData = res.data
if (this.detailData.dataAuth === 0) return
// //
this.headDetails[0].value = res.data.customer_id_info.name
this.headDetails[1].value = separator(res.data.contract_id_info.money || 0)

@ -142,6 +142,7 @@ export default {
.then(res => {
this.loading = false
this.detailData = res.data
if (this.detailData.dataAuth === 0) return
this.headDetails[0].value = res.data.customer_name
this.headDetails[1].value = res.data.visit_time

@ -27,7 +27,7 @@
跟进汇总
</div>
<div class="info">
跟进客户<span class="bold">{{ data.activityNum }}</span>新增客户中未跟进<span class="bold">{{ data.allCustomer - data.activityRealNum }}</span>
跟进客户<span class="bold">{{ data.activityNum }}</span>新增客户中未跟进<span class="bold">{{ data.allCustomer - data.activityNum }}</span>
</div>
</div>
<div class="list-item">

@ -46,17 +46,17 @@ export default {
} else {
if (this.filterValue.strucs.length) {
params.isUser = 0
params.deptId = this.filterValue.strucs[0].id
params.structure_id = [this.filterValue.strucs[0].id]
} else {
params.isUser = 1
params.userId = this.filterValue.users.length ? this.filterValue.users[0].id : ''
params.user_id = this.filterValue.users.length ? this.filterValue.users[0].id : ''
}
}
if (this.filterValue.timeLine.type) {
if (this.filterValue.timeLine.type === 'custom') {
params.startTime = this.filterValue.timeLine.startTime.replace(/\./g, '-')
params.endTime = this.filterValue.timeLine.endTime.replace(/\./g, '-')
params.start_time = this.filterValue.timeLine.startTime.replace(/\./g, '-')
params.end_time = this.filterValue.timeLine.endTime.replace(/\./g, '-')
} else {
params.type = this.filterValue.timeLine.value || ''
}

@ -231,7 +231,7 @@ export default {
//
sortLeft: [
// { 'id': null, 'userId': null, 'modelId': 7, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'RankingStatistics' }, { 'id': null, 'userId': null, 'modelId': 5, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'SalesFunnel' }, { 'id': null, 'userId': null, 'modelId': 4, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'PerformanceChart' }, { 'id': null, 'userId': null, 'modelId': 2, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'DataStatistics' }, { 'id': null, 'userId': null, 'modelId': 6, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'ForgetRemind' }, { 'id': null, 'userId': null, 'modelId': 1, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'SaleStatistics' }
// { 'id': null, 'user_id': null, 'modelId': 7, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'RankingStatistics' }, { 'id': null, 'user_id': null, 'modelId': 5, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'SalesFunnel' }, { 'id': null, 'user_id': null, 'modelId': 4, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'PerformanceChart' }, { 'id': null, 'user_id': null, 'modelId': 2, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'DataStatistics' }, { 'id': null, 'user_id': null, 'modelId': 6, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'ForgetRemind' }, { 'id': null, 'user_id': null, 'modelId': 1, 'list': 1, 'sort': null, 'isHidden': 0, 'companyId': null, 'component': 'SaleStatistics' }
],
sortRight: [],
setSortShow: false

@ -115,7 +115,7 @@ export default {
if (this.data.label && this.data.label <= 5) {
key = ['task', 'log', 'examine', 'announcement', 'schedule'][this.data.label - 1]
} else {
if ([1, 2, 3].includes(this.data.type)) {
if ([1, 2, 3, 27].includes(this.data.type)) {
key = 'task'
} else if ([4, 5, 34].includes(this.data.type)) {
key = 'log'
@ -166,14 +166,14 @@ export default {
14: `${this.data.user_name}提交 `,
15: `${this.data.user_name}拒绝您的`,
16: `${this.data.user_name}已经审核通过您的`,
17: `${this.data.user_name}导入客户数据${this.data.title}${this.getImportContent(this.data)}`,
1500: `${this.data.user_name}取消导入客户数据,已导入${this.data.title}${this.getImportContent(this.data)}`,
18: `${this.data.user_name}导入联系人数据${this.data.title}${this.getImportContent(this.data)}`,
17: `${this.data.user_name}导入客户数据${this.getImportContent(this.data)}`,
1500: `${this.data.user_name}取消导入客户数据,已导入${this.getImportContent(this.data)}`,
18: `${this.data.user_name}导入联系人数据${this.getImportContent(this.data)}`,
1700: `${this.data.user_name}取消导入联系人数据,已导入${this.data.title}条,${this.getImportContent(this.data)}`,
19: `${this.data.user_name}导入线索数据${this.data.title}${this.getImportContent(this.data)}`,
1900: `${this.data.user_name}取消导入线索数据,已导入${this.data.title}${this.getImportContent(this.data)}`,
20: `${this.data.user_name}导入产品数据${this.data.title}${this.getImportContent(this.data)}`,
2100: `${this.data.user_name}取消导入产品数据,已导入${this.data.title}${this.getImportContent(this.data)}`,
19: `${this.data.user_name}导入线索数据${this.getImportContent(this.data)}`,
1900: `${this.data.user_name}取消导入线索数据,已导入${this.getImportContent(this.data)}`,
20: `${this.data.user_name}导入产品数据${this.getImportContent(this.data)}`,
2100: `${this.data.user_name}取消导入产品数据,已导入${this.getImportContent(this.data)}`,
22: `${this.data.user_name}将您添加为商机`,
21: `${this.data.user_name}将您添加为客户`,
23: `${this.data.user_name}将您添加为合同`,
@ -190,7 +190,7 @@ export default {
25: `${this.data.user_name}拒绝您的`,
26: `${this.data.user_name}已经审核通过您的`,
24: `${this.data.user_name}提交了`,
27: `${this.data.user_name}项目任务导入`
27: `${this.data.user_name}项目任务导入数据,${this.getImportContent(this.data)}`
}[this.data.type]
},
@ -222,7 +222,7 @@ export default {
* 是导入type
*/
isImportType() {
return this.data.type >= 17 && this.data.type <= 20 || this.data.type == 27
return (this.data.type >= 17 && this.data.type <= 20) || this.data.type == 27
},
rightContent() {
@ -263,7 +263,7 @@ export default {
32: `的团队`,
33: `的团队`,
34: `:“${this.data.content}”,请及时查看`,
25: `,拒绝理由:“${this.data.content}”,请及时处理`,
25: `发票审批,拒绝理由:“${this.data.content}”,请及时处理`,
26: `发票,请及时查看`,
24: `发票审批,请及时处理`,
27: ``
@ -325,7 +325,7 @@ export default {
},
getImportContent({ title, content }) {
const countList = [17, 1500, 18, 1700, 19, 1900, 20, 2100, 50]
const countList = [17, 1500, 18, 1700, 19, 1900, 20, 2100, 50, 27]
if (!countList.includes(this.data.type)) {
return
}

@ -56,7 +56,7 @@
class="sidebar-bottom">
<div class="sidebar-bottom-content">
<div v-if="!collapse" class="copyright">
<img src="/favicon.ico" width="20px" >
<img src="@/assets/img/favicon.png" width="20px" >
<span>Power by 悟空</span>
</div>
<img

@ -125,6 +125,7 @@
<related-business
:margin-left="'0'"
:all-data="allData"
@unbind="unbindRelatedInfo"
@checkInfos="checkInfos" />
</div>
</div>
@ -310,6 +311,31 @@ export default {
}
},
methods: {
/**
* 解绑详情信息
*/
unbindRelatedInfo(field, item, index) {
this.$confirm('确认取消关联?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
customClass: 'is-particulars'
})
.then(() => {
const tempRelatedListData = JSON.parse(JSON.stringify(this.allData))
tempRelatedListData[field].splice(index, 1)
this.allData = tempRelatedListData
var relevanceAll = {}
relevanceAll.business_ids = this.allData.business.map(item => item.business_id)
relevanceAll.contacts_ids = this.allData.contacts.map(item => item.contacts_id)
relevanceAll.contract_ids = this.allData.contract.map(item => item.contract_id)
relevanceAll.customer_ids = this.allData.customer.map(item => item.customer_id)
this.relevanceAll = relevanceAll
})
.catch(() => {
this.$message.info('已取消操作')
})
},
/**
* 获取图片内容
*/

@ -54,9 +54,9 @@
<div class="result-info">
<i class="wk wk-success result-info__icon" />
<p class="result-info__des">数据导入完成</p>
<p v-if="resultData" class="result-info__detail">导入总数据<span class="result-info__detail--all">{{ resultData.totalSize }}</span>条,导入成功<span class="result-info__detail--suc">{{ resultData.totalSize - resultData.errSize }}</span>条,导入失败<span class="result-info__detail--err">{{ resultData.errSize }}</span></p>
<p v-if="resultData" class="result-info__detail">导入总数据<span class="result-info__detail--all">{{ resultData.total }}</span>条,导入成功<span class="result-info__detail--suc">{{ resultData.total - resultData.error }}</span>条,导入失败<span class="result-info__detail--err">{{ resultData.error }}</span></p>
<el-button
v-if="resultData && resultData.errSize > 0"
v-if="resultData && resultData.error > 0"
class="result-info__btn--err"
type="text"
@click="downloadErrData">下载错误数据</el-button>
@ -88,7 +88,10 @@ import {
workExcelImportAPI,
workDownloadErrorExcelAPI
} from '@/api/pm/project'
import {
crmQueryImportNumAPI,
crmQueryImportInfoAPI
} from '@/api/crm/common'
import { downloadExcelWithResData, verifyFileTypeWithFileName } from '@/utils/index'
@ -128,7 +131,16 @@ export default {
status: 'wait'
}
],
resultData: null
resultData: null,
processData: {
count: 0,
status: ''
},
messageId: null,
intervalTimer: null,
historyPopoverShow: false
}
},
computed: {
@ -172,16 +184,18 @@ export default {
this.stepList[1].status = 'process'
this.stepsActive = 2
this.firstUpdateFile(res => {
this.stepList[1].status = 'finish'
this.stepsActive = 3
if (res.data) {
this.resultData = res.data
if (this.resultData.errSize > 0) {
this.stepList[2].status = 'error'
} else {
this.stepList[2].status = 'finish'
}
}
this.messageId = res.data
// this.stepList[1].status = 'finish'
// this.stepsActive = 3
// if (res.data) {
// this.resultData = res.data
// if (this.resultData.errSize > 0) {
// this.stepList[2].status = 'error'
// } else {
// this.stepList[2].status = 'finish'
// }
// }
this.loopSecondQueryNum()
})
} else {
if (!this.file.name) {
@ -207,8 +221,8 @@ export default {
if (result) {
result(res)
}
this.loading = false
this.$emit('success')
// this.loading = false
// this.$emit('success')
})
.catch(() => {
if (result) {
@ -217,13 +231,64 @@ export default {
this.loading = false
})
},
/**
* 第二步查询数量
*/
loopSecondQueryNum() {
this.secondQueryNum()
this.intervalTimer = setInterval(() => {
if (this.processData.status == 'end') {
clearInterval(this.intervalTimer)
this.intervalTimer = null
this.thirdQueryResult()
} else {
this.secondQueryNum()
}
}, 2000)
},
secondQueryNum() {
crmQueryImportNumAPI({ messageId: this.messageId })
.then(res => {
if (res.data === '') {
this.processData.status = 'end'
} else {
this.processData.status = ''
this.processData.count = res.data
}
})
.catch(() => {
// this.processData.status = 'err'
})
},
/**
* 第三部 查询结果
*/
thirdQueryResult() {
crmQueryImportInfoAPI({ messageId: this.messageId })
.then(res => {
this.loading = false
this.stepList[1].status = 'finish'
this.stepsActive = 3
this.$emit('status', 'finish')
if (res) {
this.resultData = res.data
if (res.data.error > 0) {
this.stepList[2].status = 'error'
} else {
this.stepList[2].status = 'finish'
}
}
})
.catch(() => {})
},
/**
* 下载错误模板
*/
downloadErrData() {
this.loading = true
workDownloadErrorExcelAPI({ token: this.resultData.token })
workDownloadErrorExcelAPI({ name: '导入错误数据', path: this.resultData.error_file_path })
.then(res => {
downloadExcelWithResData(res)
this.loading = false

@ -162,7 +162,7 @@ export default {
tabShowType: 'board',
search: '',
filterObj: {},
filterValue: 1,
filterValue: 4,
filterList: [{
label: '按最早创建',
value: 1
@ -172,6 +172,9 @@ export default {
}, {
label: '按最近更新',
value: 3
}, {
label: '按手动拖动',
value: 4
}],
isCreate: false,
list: [],

@ -37,8 +37,8 @@
@submite="setSubmite"
@handle="projectSettingsHandle"
@click="projectHandleShow = false"/>
<!-- <p v-if="permission.excelImport" @click="taskImportShow = true"></p>
<p v-if="permission.excelExport" @click="exportClick"></p> -->
<p v-if="permission.excelImport" @click="taskImportShow = true"></p>
<p v-if="permission.excelExport" @click="exportClick"></p>
<p
v-if="permission.archiveTask && permission.setWork"
@click="archiveProject">归档项目</p>
@ -447,7 +447,11 @@ export default {
this.projectHandleShow = false
this.loading = true
workTaskExportAPI({
work_id: this.work_id
work_id: this.work_id,
search: this.taskConditionObj.search,
owner_user_id: this.taskConditionObj.userIds,
time_type: this.taskConditionObj.timeId,
label_id: this.taskConditionObj.tagIds
})
.then(res => {
downloadExcelWithResData(res)

@ -8,7 +8,7 @@
ft-top="0"
@search="searchClick">
<span slot="label">我的任务</span>
<!-- <el-popover
<el-popover
slot="label"
v-model="taskHandleShow"
placement="bottom-start"
@ -19,7 +19,7 @@
<i
slot="reference"
class="wk wk-manage set-img" />
</el-popover> -->
</el-popover>
<template slot="ft">
<el-dropdown
trigger="click"
@ -523,6 +523,7 @@ export default {
this.taskHandleShow = false
this.loading = true
taskWorkbenchExportAPI({
is_top: 5,
search: this.search,
sort_field: this.filterValue.sort,
completed_task: this.filterValue.completed_task,

@ -252,7 +252,7 @@ export default {
filterForm: {
category_id: 0,
send_user_id: ''
create_user_id: ''
},
userSelects: [],
@ -364,7 +364,7 @@ export default {
}
this.filterForm = {
category_id: 0,
send_user_id: ''
create_user_id: ''
}
this.userSelects = []
@ -518,8 +518,8 @@ export default {
}[this.logType]
}
if (this.logType == 'send' && params.hasOwnProperty('send_user_id')) {
delete params.send_user_id
if (this.logType == 'send' && params.hasOwnProperty('create_user_id')) {
delete params.create_user_id
}
if (params.hasOwnProperty('category_id') && params.category_id === 0) {
@ -649,11 +649,11 @@ export default {
userChange(data) {
this.userSelects = data.value || []
if (data.value.length > 0) {
this.filterForm.send_user_id = data.value.map(item => {
this.filterForm.create_user_id = data.value.map(item => {
return item.id
})
} else {
this.filterForm.send_user_id = ''
this.filterForm.create_user_id = ''
}
},
@ -663,9 +663,9 @@ export default {
checkUserHistory(user) {
this.userSelects = user ? [user] : []
if (user) {
this.filterForm.send_user_id = user.id
this.filterForm.create_user_id = user.id
} else {
this.filterForm.send_user_id = ''
this.filterForm.create_user_id = ''
}
},

@ -54,6 +54,46 @@
}
}
window.onload = function() {
var n = document.createElement('div')
n.style.position = 'fixed'
n.style.bottom = '2px'
n.style.left = '0'
n.style.right = '0'
n.style.textAlign = 'center'
n.style.fontSize = '12px'
n.style.color = '#999'
n.style.zIndex = 1
var i = document.createElement('img')
i.style.width = '14px'
i.style.verticalAlign = 'bottom'
i.style.marginRight = '5px'
var img = new Image()
img.onload = function() {
var canvas = document.createElement('canvas')
var ctx = canvas.getContext('2d')
canvas.height = img.naturalHeight
canvas.width = img.naturalWidth
ctx.drawImage(img, 0, 0)
var uri = canvas.toDataURL('image/png')
i.src = uri
n.appendChild(i)
var ti = ''
var tis = [80, 111, 119, 101, 114, 32, 98, 121, 32]
tis.forEach(c => {
ti = ti + String.fromCharCode(c)
})
var t = document.createTextNode(ti + decodeURI('%E6%82%9F%E7%A9%BA'))
n.appendChild(t)
document.body.appendChild(n)
}
img.src = 'static/img/logo.png'
}
if (Sys.appName === 'IE' && Number(Sys.version) < 10) {
window.location.href = './static/index.html'
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Loading…
Cancel
Save