master_merge
戴余标 2 years ago
parent 1d5647cd81
commit 293a193b86

@ -8,15 +8,17 @@
公司先后获得河南省高新技术企业、国家3A信用企业、IOS9001软件产品认证等20多项荣誉奖项。拥有50余项软件著作权。 获得20余家国内媒体报道。公司自成立以来以高科技为起点以技术为核心、 以完善的售后服务为后盾,秉承稳固与发展、求实与创新的精神,已为国内外上万家企业提供了服务。 在为实现企业价值最大化的过程中, 实现了自身的价值的提升,取得了最大程度的双赢合作,并获得了社会各界的广泛赞誉和认同。 公司先后获得河南省高新技术企业、国家3A信用企业、IOS9001软件产品认证等20多项荣誉奖项。拥有50余项软件著作权。 获得20余家国内媒体报道。公司自成立以来以高科技为起点以技术为核心、 以完善的售后服务为后盾,秉承稳固与发展、求实与创新的精神,已为国内外上万家企业提供了服务。 在为实现企业价值最大化的过程中, 实现了自身的价值的提升,取得了最大程度的双赢合作,并获得了社会各界的广泛赞誉和认同。
官网地址[http://www.5kcrm.com](http://www.5kcrm.com/) 官网:[http://www.5kcrm.com](https://www.5kcrm.com/)
演示地址:(http://demo11.5kcrm.net/) 官网:[http://www.72crm.com](https://www.72crm.com/)
帐号18688888888 密码123456a
Github下载地址[https://github.com/72wukong](https://github.com/72wukong) 论坛:[http://bbs.72crm.net](https://bbs.72crm.net/)
QQ群交流群⑩群[1026560336](http:////shang.qq.com/wpa/qunwpa?idkey=13d5e5809eb9feb350336e55c8b7a00b9cb472078b09b4441222a52dd76b278e) 演示地址:[demo11.5kcrm.net](http://demo11.5kcrm.net/)(帐号18888888888 密码123456a)
码云gitee地址[码云仓库地址](https://gitee.com/wukongcrm)
QQ群交流群⑩群[486745026](https:////shang.qq.com/wpa/qunwpa?idkey=f4687b809bf63f08f707aa1c56dee8dbcb9526237c429c4532222021d65bf83c)
扫码添加小悟官方客服微信,邀您加入千人微信交流群: 扫码添加小悟官方客服微信,邀您加入千人微信交流群:
@ -27,14 +29,13 @@ QQ群交流群⑩群[1026560336](http:////shang.qq.com/wpa/qunwpa?idkey=13d5e
<img src="https://images.gitee.com/uploads/images/2019/1202/135713_d3566c6a_345098.jpeg" width="200"> <img src="https://images.gitee.com/uploads/images/2019/1202/135713_d3566c6a_345098.jpeg" width="200">
``` ```
悟空CRM采用全新的前后端分离模式本仓库代码中已集成前端vue打包后文件可免去打包操作。如需调整前端代码请单独下载前端代码 悟空CRM采用全新的前后端分离模式本仓库代码中已集成前端vue打包后文件可免去打包操作。如需调整前端代码请单独下载前端代码
``` ```
(<a href="https://gitee.com/wukongcrm/crm_pro" target="_blank">查看PHP后端仓库</a>) (<a href="https://github.com/72wukong/72crm-11.0-PHP" target="_blank">查看PHP后端仓库</a>)
#### 项目目录 #### 项目目录

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

@ -3,25 +3,25 @@ const path = require('path')
const utils = require('./utils') const utils = require('./utils')
const config = require('../config') const config = require('../config')
const { const {
VueLoaderPlugin VueLoaderPlugin
} = require('vue-loader') } = require('vue-loader')
const vueLoaderConfig = require('./vue-loader.conf') const vueLoaderConfig = require('./vue-loader.conf')
// el-bigdata-table babel-loader 配置 // el-bigdata-table babel-loader 配置
const fs = require('fs') const fs = require('fs')
function resolve(dir) { function resolve(dir) {
return path.join(__dirname, '..', dir) return path.join(__dirname, '..', dir)
} }
const createLintingRule = () => ({ const createLintingRule = () => ({
test: /\.(js|vue)$/, test: /\.(js|vue)$/,
loader: 'eslint-loader', loader: 'eslint-loader',
enforce: 'pre', enforce: 'pre',
include: [resolve('src'), resolve('test')], include: [resolve('src'), resolve('test')],
options: { options: {
formatter: require('eslint-friendly-formatter'), formatter: require('eslint-friendly-formatter'),
emitWarning: !config.dev.showEslintErrorsInOverlay emitWarning: !config.dev.showEslintErrorsInOverlay
} }
}) })
// el-bigdata-table babel-loader 配置 // el-bigdata-table babel-loader 配置
@ -29,90 +29,89 @@ let bigTableDirName = fs.readdirSync(resolve('node_modules')).filter(dirName =>
const bigTableDirs = bigTableDirName.map(dir => resolve(`node_modules/${dir}/src`)) const bigTableDirs = bigTableDirName.map(dir => resolve(`node_modules/${dir}/src`))
module.exports = { module.exports = {
context: path.resolve(__dirname, '../'), context: path.resolve(__dirname, '../'),
entry: { entry: {
app: ["babel-polyfill", "./src/main.js"] app: ["babel-polyfill", "./src/main.js"]
}, },
output: { output: {
path: config.build.assetsRoot, path: config.build.assetsRoot,
filename: '[name].js', filename: '[name].js',
publicPath: publicPath: process.env.NODE_ENV === 'production' ?
process.env.NODE_ENV === 'production' config.build.assetsPublicPath :
? config.build.assetsPublicPath config.dev.assetsPublicPath
: config.dev.assetsPublicPath },
}, resolve: {
resolve: { extensions: ['.js', '.vue', '.json'],
extensions: ['.js', '.vue', '.json'], alias: {
alias: { '@': resolve('src')
'@': resolve('src')
}
},
module: {
rules: [
...(config.dev.useEslint ? [createLintingRule()] : []),
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [
resolve('src'),
resolve('test'),
resolve('node_modules/webpack-dev-server/client'),
resolve('node_modules/element-ui/src'),
resolve('node_modules/element-ui/packages'),
...bigTableDirs
]
},
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons')],
options: {
symbolId: 'icon-[name]'
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [resolve('src/icons')],
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
} }
}, },
{ module: {
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, rules: [
loader: 'url-loader', // ...(config.dev.useEslint ? [createLintingRule()] : []),
options: { {
limit: 10000, test: /\.vue$/,
name: utils.assetsPath('media/[name].[hash:7].[ext]') loader: 'vue-loader',
} options: vueLoaderConfig
}, },
{ {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, test: /\.js$/,
loader: 'url-loader', loader: 'babel-loader',
options: { include: [
limit: 10000, resolve('src'),
name: utils.assetsPath('fonts/[name].[hash:7].[ext]') resolve('test'),
} resolve('node_modules/webpack-dev-server/client'),
} resolve('node_modules/element-ui/src'),
] resolve('node_modules/element-ui/packages'),
}, ...bigTableDirs
plugins: [new VueLoaderPlugin()], ]
node: { },
// prevent webpack from injecting useless setImmediate polyfill because Vue {
// source contains it (although only uses it if it's native). test: /\.svg$/,
setImmediate: false, loader: 'svg-sprite-loader',
// prevent webpack from injecting mocks to Node native modules include: [resolve('src/icons')],
// that does not make sense for the client options: {
dgram: 'empty', symbolId: 'icon-[name]'
fs: 'empty', }
net: 'empty', },
tls: 'empty', {
child_process: 'empty' test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
} loader: 'url-loader',
} exclude: [resolve('src/icons')],
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
plugins: [new VueLoaderPlugin()],
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
}
}

@ -3,6 +3,6 @@ const merge = require('webpack-merge')
const prodEnv = require('./prod.env') const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, { module.exports = merge(prodEnv, {
NODE_ENV: '"development"', NODE_ENV: '"development"',
BASE_API: '"http://localhost/"', BASE_API: '"/api/"',
}) })

@ -5,97 +5,97 @@
const path = require('path') const path = require('path')
module.exports = { module.exports = {
dev: { dev: {
// Paths // Paths
assetsSubDirectory: 'static', assetsSubDirectory: 'static',
assetsPublicPath: '/', assetsPublicPath: '/',
proxyTable: { proxyTable: {
'/api': { '/api': {
target: 'http://localhost', target: 'http://192.168.50.40:8088',
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
'^/api': '' '^/api': ''
} }
}, },
'/file': { '/file': {
target: 'http://192.168.1.116:8012/', target: 'http://192.168.50.40:8088/',
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
'^/file': '' '^/file': ''
} }
} }
}, },
// Various Dev Server settings // Various Dev Server settings
host: '0.0.0.0', // can be overwritten by process.env.HOST host: '0.0.0.0', // can be overwritten by process.env.HOST
port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined port: 8090, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: false, autoOpenBrowser: false,
errorOverlay: true, errorOverlay: true,
notifyOnErrors: false, notifyOnErrors: false,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
// Use Eslint Loader? // Use Eslint Loader?
// If true, your code will be linted during bundling and // If true, your code will be linted during bundling and
// linting errors and warnings will be shown in the console. // linting errors and warnings will be shown in the console.
useEslint: true, useEslint: true,
// If true, eslint errors and warnings will also be shown in the error overlay // If true, eslint errors and warnings will also be shown in the error overlay
// in the browser. // in the browser.
showEslintErrorsInOverlay: false, showEslintErrorsInOverlay: false,
/** /**
* Source Maps * Source Maps
*/ */
// https://webpack.js.org/configuration/devtool/#development // https://webpack.js.org/configuration/devtool/#development
devtool: 'cheap-source-map', devtool: 'cheap-source-map',
// CSS Sourcemaps off by default because relative paths are "buggy" // CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README // with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps) // (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected, // In our experience, they generally work as expected,
// just be aware of this issue when enabling this option. // just be aware of this issue when enabling this option.
cssSourceMap: false cssSourceMap: false
}, },
build: { build: {
// Template for index.html // Template for index.html
index: path.resolve(__dirname, '../dist/index.html'), index: path.resolve(__dirname, '../dist/index.html'),
// Paths // Paths
assetsRoot: path.resolve(__dirname, '../dist'), assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static', assetsSubDirectory: 'static',
/** /**
* You can set by youself according to actual condition * You can set by youself according to actual condition
* You will need to set this if you plan to deploy your site under a sub path, * You will need to set this if you plan to deploy your site under a sub path,
* for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/, * for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/,
* then assetsPublicPath should be set to "/bar/". * then assetsPublicPath should be set to "/bar/".
* In most cases please use '/' !!! * In most cases please use '/' !!!
*/ */
assetsPublicPath: './', assetsPublicPath: './',
/** /**
* Source Maps * Source Maps
*/ */
productionSourceMap: false, productionSourceMap: false,
// https://webpack.js.org/configuration/devtool/#production // https://webpack.js.org/configuration/devtool/#production
devtool: 'source-map', devtool: 'source-map',
// Gzip off by default as many popular static hosts such as // Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you. // Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to: // Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin // npm install --save-dev compression-webpack-plugin
productionGzip: false, productionGzip: false,
productionGzipExtensions: ['js', 'css'], productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to // Run the build command with an extra argument to
// View the bundle analyzer report after build finishes: // View the bundle analyzer report after build finishes:
// `npm run build --report` // `npm run build --report`
// Set to `true` or `false` to always turn it on or off // Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report || false, bundleAnalyzerReport: process.env.npm_config_report || false,
// `npm run build:prod --generate_report` // `npm run build:prod --generate_report`
generateAnalyzerReport: process.env.npm_config_generate_report || false generateAnalyzerReport: process.env.npm_config_generate_report || false
} }
} }

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

838
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -23,6 +23,7 @@
"@tinymce/tinymce-vue": "^3.2.0", "@tinymce/tinymce-vue": "^3.2.0",
"axios": "0.18.0", "axios": "0.18.0",
"babel-polyfill": "^6.26.0", "babel-polyfill": "^6.26.0",
"chalk": "^5.2.0",
"clipboard": "^2.0.4", "clipboard": "^2.0.4",
"echarts": "^4.3.0", "echarts": "^4.3.0",
"el-bigdata-table": "^1.0.32", "el-bigdata-table": "^1.0.32",
@ -66,7 +67,6 @@
"babel-plugin-transform-vue-jsx": "3.7.0", "babel-plugin-transform-vue-jsx": "3.7.0",
"babel-preset-env": "1.7.0", "babel-preset-env": "1.7.0",
"babel-preset-stage-2": "6.24.1", "babel-preset-stage-2": "6.24.1",
"chalk": "2.4.1",
"copy-webpack-plugin": "4.5.2", "copy-webpack-plugin": "4.5.2",
"css-loader": "1.0.0", "css-loader": "1.0.0",
"eslint": "4.19.1", "eslint": "4.19.1",

@ -434,6 +434,20 @@ export function crmCustomerReceiveAPI(data) {
}) })
} }
/**
* 客户领取公海客户审批
* @param {*} data
*/
export function crmCheckCustomerReceiveAPI(data) {
return request({
url: 'crm/customerPool/checkCustomerReveive',
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/** /**
* 客户下联系人 * 客户下联系人
* @param {*} data * @param {*} data

@ -212,6 +212,35 @@ export function crmMessageCheckBusinessAPI(data) {
}) })
} }
/**
* 新商机
* @param {*} data
*/
export function crmMessageNewBusinessAPI(data) {
return request({
url: 'crm/message/newBusiness',
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/**
* 客户捞取审批待办事项提醒
* @param {*} data
*/
export function crmMessageCheckCustomerCheckAPI(data) {
return request({
url: 'crm/message/checkCustomerCheck',
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/** /**
* 全部标为已处理接口 * 全部标为已处理接口
* @param {*} data * @param {*} data

@ -127,6 +127,37 @@ export function crmExamineReceivablesAuditAPI(data) {
} }
}) })
} }
/**
* 进行商机
*/
export function crmExamineBusinessAuditAPI(data) {
// const url = data.type === 'revoke' ? 'crm/receivables/revokeCheck' : 'crm/receivables/check'
const url = 'crm/business/check'
return request({
url,
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/**
* 进行客户
*/
export function crmExamineCheckCustomerAuditAPI(data) {
// const url = data.type === 'revoke' ? 'crm/receivables/revokeCheck' : 'crm/receivables/check'
const url = 'crm/customerPool/checkCustomerReveive'
return request({
url,
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/** /**
* 查询审批记录 * 查询审批记录

@ -156,6 +156,7 @@ export default {
this.infoType === 'crm_invoice' || this.infoType === 'crm_invoice' ||
this.infoType === 'crm_receivables' || this.infoType === 'crm_receivables' ||
this.infoType === 'crm_business' || this.infoType === 'crm_business' ||
this.infoType === 'crm_customer_check' ||
this.infoType === 'oa_examine' this.infoType === 'oa_examine'
) { ) {
return userListAPI return userListAPI
@ -175,6 +176,7 @@ export default {
this.infoType === 'crm_invoice' || this.infoType === 'crm_invoice' ||
this.infoType === 'crm_receivables' || this.infoType === 'crm_receivables' ||
this.infoType === 'crm_business' || this.infoType === 'crm_business' ||
this.infoType === 'crm_customer_check' ||
this.infoType === 'oa_examine' this.infoType === 'oa_examine'
) { ) {
params.pageType = 0 params.pageType = 0

@ -95,6 +95,7 @@ export default {
crm_receivables: crmExamineRecordLogListAPI, crm_receivables: crmExamineRecordLogListAPI,
crm_invoice: crmExamineRecordLogListAPI, crm_invoice: crmExamineRecordLogListAPI,
crm_business: crmExamineRecordLogListAPI, crm_business: crmExamineRecordLogListAPI,
crm_customer_check: crmExamineRecordLogListAPI,
oa_examine: oaExamineFlowRecordListAPI oa_examine: oaExamineFlowRecordListAPI
}[this.examineType] }[this.examineType]

@ -118,7 +118,8 @@ export default {
crm_contract: crmExamineStepAPI, crm_contract: crmExamineStepAPI,
crm_invoice: crmExamineStepAPI, crm_invoice: crmExamineStepAPI,
crm_receivables: crmExamineStepAPI, crm_receivables: crmExamineStepAPI,
crm_business: crmExamineStepAPI crm_business: crmExamineStepAPI,
crm_customer_check: crmExamineStepAPI
}[this.types] }[this.types]
// //
const params = {} const params = {}
@ -133,8 +134,9 @@ export default {
crm_contract: 1, crm_contract: 1,
crm_receivables: 2, crm_receivables: 2,
crm_invoice: 3, crm_invoice: 3,
crm_business: 4 crm_business: 4,
}[this.types] // 1 2 3 4 crm_customer_check: 5
}[this.types] // 1 2 3 4 5
params.types = this.types params.types = this.types
} }
reqeust(params) reqeust(params)

@ -54,7 +54,7 @@
</el-dialog> </el-dialog>
</template> </template>
<script type="text/javascript"> <script type="text/javascript">
import { crmExamineRecordAuditAPI, crmExamineInvoiceAuditAPI, crmExamineReceivablesAuditAPI } from '@/api/examine' import { crmExamineRecordAuditAPI, crmExamineInvoiceAuditAPI, crmExamineReceivablesAuditAPI, crmExamineBusinessAuditAPI, crmExamineCheckCustomerAuditAPI } from '@/api/examine'
import { oaExamineFlowAuditExamineAPI } from '@/api/oa/examine' import { oaExamineFlowAuditExamineAPI } from '@/api/oa/examine'
import { XhUserCell } from '@/components/CreateCom' import { XhUserCell } from '@/components/CreateCom'
@ -165,7 +165,8 @@ export default {
this.examineType == 'crm_contract' || this.examineType == 'crm_contract' ||
this.examineType == 'crm_invoice' || this.examineType == 'crm_invoice' ||
this.examineType == 'crm_receivables' || this.examineType == 'crm_receivables' ||
this.examineType == 'crm_business' this.examineType == 'crm_business' ||
this.examineType == 'crm_customer_check'
) { ) {
this.$store.dispatch('GetMessageNum') this.$store.dispatch('GetMessageNum')
} }
@ -185,6 +186,8 @@ export default {
crm_contract: crmExamineRecordAuditAPI, crm_contract: crmExamineRecordAuditAPI,
crm_invoice: crmExamineInvoiceAuditAPI, crm_invoice: crmExamineInvoiceAuditAPI,
crm_receivables: crmExamineReceivablesAuditAPI, crm_receivables: crmExamineReceivablesAuditAPI,
crm_business: crmExamineBusinessAuditAPI,
crm_customer_check: crmExamineCheckCustomerAuditAPI,
oa_examine: oaExamineFlowAuditExamineAPI oa_examine: oaExamineFlowAuditExamineAPI
// oa_examine: oaExamineFlowRevokeCheckAPI // oa_examine: oaExamineFlowRevokeCheckAPI
}[this.examineType] }[this.examineType]
@ -222,7 +225,8 @@ export default {
this.examineType == 'crm_contract' || this.examineType == 'crm_contract' ||
this.examineType == 'crm_invoice' || this.examineType == 'crm_invoice' ||
this.examineType == 'crm_receivables' || this.examineType == 'crm_receivables' ||
this.examineType == 'crm_business' this.examineType == 'crm_business' ||
this.examineType == 'crm_customer_check'
) { ) {
this.$store.dispatch('GetMessageNum') this.$store.dispatch('GetMessageNum')
} }

@ -205,6 +205,7 @@ export default {
crm_receivables: crmExamineRecordRecordListAPI, crm_receivables: crmExamineRecordRecordListAPI,
crm_invoice: crmExamineRecordRecordListAPI, crm_invoice: crmExamineRecordRecordListAPI,
crm_business: crmExamineRecordRecordListAPI, crm_business: crmExamineRecordRecordListAPI,
crm_customer_check: crmExamineRecordRecordListAPI,
oa_examine: oaExamineFlowStepListAPI oa_examine: oaExamineFlowStepListAPI
}[this.examineType] }[this.examineType]

@ -135,5 +135,16 @@ export default [
icon: 'business' icon: 'business'
} }
}] }]
},
{
...layout(false),
ignore: true,
children: [{
path: 'crm/customer',
meta: {
title: '待我审批(客户)',
icon: 'customer'
}
}]
} }
] ]

@ -310,7 +310,9 @@ export default {
{ name: '合同', value: 'crm_contract', type: 'crm_contract' }, { name: '合同', value: 'crm_contract', type: 'crm_contract' },
{ name: '回款', value: 'crm_receivables', type: 'crm_receivables' }, { name: '回款', value: 'crm_receivables', type: 'crm_receivables' },
{ name: '发票', value: 'crm_invoice', type: 'crm_invoice' }, { name: '发票', value: 'crm_invoice', type: 'crm_invoice' },
{ name: '商机', value: 'crm_business', type: 'crm_business' } { name: '商机', value: 'crm_business', type: 'crm_business' },
{ name: '客户', value: 'crm_customer_check', type: 'crm_customer_check' }
// { name: '', value: 4 }, // { name: '', value: 4 },
// { name: '', value: 5 }, // { name: '', value: 5 },
// { name: '退', value: 6 }, // { name: '退', value: 6 },

@ -159,7 +159,8 @@ export default {
{ name: '合同', value: 'crm_contract' }, { name: '合同', value: 'crm_contract' },
{ name: '回款', value: 'crm_receivables' }, { name: '回款', value: 'crm_receivables' },
{ name: '发票', value: 'crm_invoice' }, { name: '发票', value: 'crm_invoice' },
{ name: '商机', value: 'crm_business' } { name: '商机', value: 'crm_business' },
{ name: '客户', value: 'crm_customer_check' }
// { name: '', value: 4 }, // { name: '', value: 4 },
// { name: '', value: 5 }, // { name: '', value: 5 },
// { name: '退', value: 6 }, // { name: '退', value: 6 },

@ -106,15 +106,15 @@
</a> </a>
</flexbox> </flexbox>
</div> </div>
<examine-info <examine-info
v-if="detailData.flow_id" v-if="detailData.flow_id"
:id="id" :id="id"
:record-id="detailData.flow_id" :record-id="detailData.flow_id"
:owner-user-id="detailData.owner_user_id" :owner-user-id="detailData.owner_user_id"
class="examine-info" class="examine-info"
examine-type="crm_business" examine-type="crm_contract"
@on-handle="examineHandle" /> @on-handle="examineHandle"/>
<flexbox class="d-container-bd" align="stretch"> <flexbox class="d-container-bd" align="stretch">
<el-tabs <el-tabs
@ -568,8 +568,20 @@ export default {
if (item.type == 2 || item.type == 3) { if (item.type == 2 || item.type == 3) {
var message = '请填写' + item.name + '原因:' var message = '请填写' + item.name + '原因:'
var title = item.name + '原因' var title = item.name + '原因'
this.$prompt(message, title, {
inputType: 'text', // this.$prompt(message, title, {
// inputType: 'text',
// confirmButtonText: '',
// cancelButtonText: ''
// })
const h = this.$createElement
this.$msgbox({
title: title,
message: h('p', message, [
h('i', { style: 'color: teal' }, 'VNode'),
h('<xh-user-cell :radio="false" :value="baseFrom.adminUsers" @value-change="userChange" />')
]),
showCancelButton: true,
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消' cancelButtonText: '取消'
}) })

@ -40,6 +40,17 @@
</el-tooltip> </el-tooltip>
</template> </template>
</c-r-m-detail-head> </c-r-m-detail-head>
<examine-info
v-if="detailData.flow_id"
:id="id"
:record-id="detailData.flow_id"
:owner-user-id="detailData.owner_user_id"
class="examine-info"
examine-type="crm_customer_check"
@on-handle="examineHandle"/>
<flexbox <flexbox
class="d-container-bd" class="d-container-bd"
align="stretch"> align="stretch">

@ -327,7 +327,8 @@ export default {
this.infoType == 'checkContract' || this.infoType == 'checkContract' ||
this.infoType == 'checkReceivables' || this.infoType == 'checkReceivables' ||
this.infoType == 'checkInvoice' || this.infoType == 'checkInvoice' ||
this.infoType == 'checkBusiness' this.infoType == 'checkBusiness' ||
this.infoType == 'checkCustomerCheck'
) { ) {
return [{ name: '待审核', value: 1 }, { name: '已审核', value: 2 }] return [{ name: '待审核', value: 1 }, { name: '已审核', value: 2 }]
} else if (this.infoType == 'remindReceivablesPlan') { } else if (this.infoType == 'remindReceivablesPlan') {
@ -338,8 +339,9 @@ export default {
] ]
} else if (this.infoType == 'endContract') { } else if (this.infoType == 'endContract') {
return [{ name: '即将到期', value: 1 }, { name: '已到期', value: 2 }] return [{ name: '即将到期', value: 1 }, { name: '已到期', value: 2 }]
} else if (this.infoType == 'newBusiness') {
return [{ name: '全部', value: 1 }]
} }
return [] return []
}, },

@ -59,7 +59,7 @@ export default {
loading: false, loading: false,
leftType: '', leftType: '',
/** /**
* model 1今日需联系客户 2分配给我的线索 3分配给我的客户 4待进入公海的客户 5待审核合同 6待审核回款 7待回款提醒 8即将到期的合同 9待回访合同 10待审核发票 13待审核商机 * model 1今日需联系客户 2分配给我的线索 3分配给我的客户 4待进入公海的客户 5待审核合同 6待审核回款 7待回款提醒 8即将到期的合同 9待回访合同 10待审核发票 13待审核商机 14新商机
*/ */
leftSides: [ leftSides: [
{ {
@ -204,6 +204,28 @@ export default {
num: 0, num: 0,
tips: '', tips: '',
hidden: true hidden: true
},
{
name: '新商机',
crmType: 'business',
color: '#704AFD',
iconClass: 'wk wk-business',
infoType: 'newBusiness',
model: 14,
num: 0,
tips: '',
hidden: true
},
{
name: '审批客户捞取',
crmType: 'customer',
color: '#704AFD',
iconClass: 'wk wk-customer',
infoType: 'checkCustomerCheck',
model: 15,
num: 0,
tips: '',
hidden: true
} }
] ]
} }

@ -15,7 +15,9 @@ import {
crmMessagRemindCustomerAPI, crmMessagRemindCustomerAPI,
crmMessagVisitRemindAPI, crmMessagVisitRemindAPI,
crmMessageCheckInvoiceAPI, crmMessageCheckInvoiceAPI,
crmMessageCheckBusinessAPI crmMessageCheckBusinessAPI,
crmMessageNewBusinessAPI,
crmMessageCheckCustomerCheckAPI
} from '@/api/crm/message' } from '@/api/crm/message'
import CheckStatusMixin from '@/mixins/CheckStatusMixin' import CheckStatusMixin from '@/mixins/CheckStatusMixin'
import { invoiceHeaderFields } from '../../invoice/js/fields' import { invoiceHeaderFields } from '../../invoice/js/fields'
@ -236,7 +238,9 @@ export default {
'putInPoolRemind': crmMessagRemindCustomerAPI, 'putInPoolRemind': crmMessagRemindCustomerAPI,
'returnVisitRemind': crmMessagVisitRemindAPI, 'returnVisitRemind': crmMessagVisitRemindAPI,
'checkInvoice': crmMessageCheckInvoiceAPI, 'checkInvoice': crmMessageCheckInvoiceAPI,
'checkBusiness': crmMessageCheckBusinessAPI 'checkBusiness': crmMessageCheckBusinessAPI,
'newBusiness': crmMessageNewBusinessAPI,
'checkCustomerCheck': crmMessageCheckCustomerCheckAPI
}[this.infoType] }[this.infoType]
}, },

@ -158,6 +158,8 @@ export default {
params.type = 3 params.type = 3
} else if (this.crmType == 'business') { } else if (this.crmType == 'business') {
params.type = 4 params.type = 4
} else if (this.crmType == 'customer') {
params.type = 5
} }
crmExamineMyExamineAPI(params) crmExamineMyExamineAPI(params)

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save