Commit c352d425 by 李宁

1

1 parent f9320e1d
...@@ -35,7 +35,7 @@ export function deleteRole(data) { ...@@ -35,7 +35,7 @@ export function deleteRole(data) {
*/ */
export function addAndUpdateRole(data) { export function addAndUpdateRole(data) {
return request({ return request({
url: '/compass/api/system/account/create' + (data.id?'/update':''), url: '/compass/api/system/account' + (data.id?'/update':'/create'),
data, data,
}) })
} }
\ No newline at end of file \ No newline at end of file
...@@ -13,8 +13,13 @@ export function queryAllPerson(data) { ...@@ -13,8 +13,13 @@ export function queryAllPerson(data) {
* 添加人员 * 添加人员
*/ */
export function addNewPerson(data) { export function addNewPerson(data) {
let url = '/compass/api/personnel/create'
if(data.id){
url = '/compass/api/personnel/update'
}
return request({ return request({
url: '/compass/api/personnel/create', url: url,
data, data,
}) })
} }
......
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
type="text" type="text"
size="small" size="small"
@click="editAccount(scope.row)" @click="editAccount(scope.row)"
disabled
> >
编辑 编辑
</el-button> </el-button>
...@@ -80,7 +79,7 @@ ...@@ -80,7 +79,7 @@
<el-form-item label="密码" prop="password"> <el-form-item label="密码" prop="password">
<el-input <el-input
v-model="accountForm.password" v-model="accountForm.password"
placeholder="请输入密码" :placeholder="editingAccount?'******':'请输入密码'"
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -213,7 +212,6 @@ export default { ...@@ -213,7 +212,6 @@ export default {
accountName: '', accountName: '',
roleCode: '', roleCode: '',
status: '', status: '',
grid: '',
contactPhone: '', contactPhone: '',
email: '', email: '',
...@@ -235,7 +233,7 @@ export default { ...@@ -235,7 +233,7 @@ export default {
{ required: true, message: '请输入用户名', trigger: 'blur' } { required: true, message: '请输入用户名', trigger: 'blur' }
], ],
password: [ password: [
{ required: true, message: '请输入密码', trigger: 'blur' } {validator: this.validatePassword,message: '请输入密码', trigger: 'blur' }
], ],
accountName: [ accountName: [
{ required: true, message: '请输入姓名', trigger: 'blur' } { required: true, message: '请输入姓名', trigger: 'blur' }
...@@ -266,6 +264,13 @@ export default { ...@@ -266,6 +264,13 @@ export default {
this.queryRole() this.queryRole()
}, },
methods: { methods: {
validatePassword(rule, value, callback) {
if (!this.editingAccount && !value) {
callback(new Error('请输入密码'))
} else {
callback()
}
},
ifRoleCho(key){ ifRoleCho(key){
let gd = this.getData let gd = this.getData
...@@ -390,17 +395,14 @@ export default { ...@@ -390,17 +395,14 @@ export default {
}, },
addAccount(){ addAccount(){
let ad = this.accountForm let ad = this.accountForm
this.editingAccount = null this.editingAccount = null
ad = { ad.account = ''
account: '', ad.accountName = ''
password: '', ad.roleCode = ''
accountName: '', ad.status = ''
roleCode: '', ad.contactPhone = ''
status: '', ad.email = ''
contactPhone: '', ad.password = ''
email: ''
}
if(!this.getData.city){ if(!this.getData.city){
ad.city = '' ad.city = ''
ad.county = '' ad.county = ''
...@@ -416,12 +418,36 @@ export default { ...@@ -416,12 +418,36 @@ export default {
} }
this.isAddDialogOpen = true this.isAddDialogOpen = true
this.$refs.accountForm.clearValidate()
}, },
editAccount(account) { editAccount(row) {
debugger this.editingAccount = row
this.editingAccount = account let ad = this.accountForm
this.accountForm = { ...account }
ad.account = row.account
ad.accountName = row.accountName
ad.roleCode = row.roleCode
ad.status = row.status+''
ad.contactPhone = row.contactPhone
ad.email = row.email
ad.password = row.password
if(row.cityCode){
ad.city = row.cityCode
this.cityChange(ad.city)
if(row.countyCode){
ad.county = row.countyCode
this.countyChange(ad.county)
if(row.gridCode){
ad.grid =row.gridCode
}
}
}
this.isAddDialogOpen = true this.isAddDialogOpen = true
this.$refs.accountForm.clearValidate()
}, },
deleteAccount(id) { deleteAccount(id) {
this.$confirm('确定要删除该账号吗?此操作不可撤销。', '确认删除', { this.$confirm('确定要删除该账号吗?此操作不可撤销。', '确认删除', {
...@@ -476,7 +502,7 @@ export default { ...@@ -476,7 +502,7 @@ export default {
}).then(res=>{ }).then(res=>{
if(res.code == '200'){ if(res.code == '200'){
let __this = this let __this = this
this.$alert('添加成功', '温馨提示', { this.$alert(this.editingAccount?'编辑成功':'添加成功', '温馨提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
callback: () => { callback: () => {
__this.handleFilter() __this.handleFilter()
......
...@@ -96,7 +96,7 @@ ...@@ -96,7 +96,7 @@
<el-table-column prop="phone" label="手机号" width="150"></el-table-column> <el-table-column prop="phone" label="手机号" width="150"></el-table-column>
<el-table-column prop="personnelTypeName" label="人员类型" width="120"></el-table-column> <el-table-column prop="personnelTypeName" label="人员类型" width="120"></el-table-column>
<el-table-column prop="areaName" label="所属区域" width="150"></el-table-column> <el-table-column prop="areaName" label="所属区域" width="150"></el-table-column>
<el-table-column prop="gridName" label="网格" width="220"></el-table-column> <el-table-column prop="gridList" :formatter="gridRender" label="网格" width="220"></el-table-column>
<el-table-column prop="relatedMarketingCode" label="关联支撑人员" width="120" ></el-table-column> <el-table-column prop="relatedMarketingCode" label="关联支撑人员" width="120" ></el-table-column>
<el-table-column label="状态" width="80"> <el-table-column label="状态" width="80">
<template slot-scope="scope"> <template slot-scope="scope">
...@@ -111,7 +111,6 @@ ...@@ -111,7 +111,6 @@
<el-button <el-button
type="text" type="text"
size="small" size="small"
disabled
@click="updatePerson(scope.row)" @click="updatePerson(scope.row)"
> >
编辑 编辑
...@@ -174,38 +173,13 @@ ...@@ -174,38 +173,13 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="人员类型" prop="personnelType"> <el-form-item label="人员类型" prop="personnelType">
<el-select v-model="updatePersonStore.personnelType" @change="personnelTypeChange" style="width: 100%;"> <el-select v-model="updatePersonStore.personnelType" :disabled="!!updatePersonStore.row.id" @change="personnelTypeChange" style="width: 100%;">
<el-option label="装维师傅" value="1"></el-option> <el-option label="装维师傅" value="1"></el-option>
<el-option label="支撑人员" value="2"></el-option> <el-option label="支撑人员" value="2"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20">
<!-- 当选择装维师傅时显示关联支撑人员字段 -->
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-select v-model="updatePersonStore.status" style="width: 100%;">
<el-option label="启用" value="1"></el-option>
<el-option label="关闭" value="0"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="updatePersonStore.personnelType == '1'">
<el-form-item label="关联支撑人" prop="relatedMarketingCode">
<el-select v-model="updatePersonStore.relatedMarketingCode" placeholder="请选择支撑人员" style="width: 100%;">
<el-option
v-for="item in yxPersonList"
:key="item.personnelCode"
:label="item.personnelName"
:value="item.personnelCode"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="30"> <el-col :span="30">
...@@ -247,6 +221,8 @@ ...@@ -247,6 +221,8 @@
v-model="updatePersonStore.grid" v-model="updatePersonStore.grid"
placeholder="选择网格" placeholder="选择网格"
:disabled="getData.grid!=''" :disabled="getData.grid!=''"
:multiple="gridIsMultiple"
@change="gridChange"
clearable> clearable>
<el-option <el-option
v-for="item in updatePersonStore.gridArr" v-for="item in updatePersonStore.gridArr"
...@@ -259,6 +235,31 @@ ...@@ -259,6 +235,31 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20">
<!-- 当选择装维师傅时显示关联支撑人员字段 -->
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-select v-model="updatePersonStore.status" style="width: 100%;">
<el-option label="启用" value="1"></el-option>
<el-option label="关闭" value="0"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="updatePersonStore.personnelType=='1' && updatePersonStore.grid">
<el-form-item label="关联支撑人" prop="relatedMarketingCode">
<el-select v-model="updatePersonStore.relatedMarketingCode" placeholder="请选择支撑人员" style="width: 100%;">
<el-option
v-for="item in yxPersonList"
:key="item.personnelCode"
:label="item.personnelName"
:value="item.personnelCode"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
...@@ -347,12 +348,13 @@ export default { ...@@ -347,12 +348,13 @@ export default {
cityArr: [], cityArr: [],
county: '', county: '',
countyArr: [], countyArr: [],
grid: '', grid: [],
gridArr: [], gridArr: [],
}, },
yxPersonList:[], yxPersonList:[],
formData:{ formData:{
personnelCode: '', personnelCode: '',
phone: '',
personnelTypes: [] personnelTypes: []
}, },
tableData: [], tableData: [],
...@@ -400,6 +402,7 @@ export default { ...@@ -400,6 +402,7 @@ export default {
isImportDialogOpen: false, isImportDialogOpen: false,
selectedFile: null, selectedFile: null,
gridIsMultiple: false
} }
}, },
created(){ created(){
...@@ -410,9 +413,38 @@ export default { ...@@ -410,9 +413,38 @@ export default {
this.queryArea() this.queryArea()
this.handleFilter() this.handleFilter()
this.queryYxPerson()
}, },
methods: { methods: {
personnelTypeChange(value){
// 重置关联支撑人员
this.updatePersonStore.relatedMarketingCode = ''
// 重置网格选择
if (value === '1') {
// 装维师傅 - 单选
this.updatePersonStore.grid = ''
} else {
// 支撑人员 - 多选
this.updatePersonStore.grid = []
}
setTimeout(()=>{
// 设置网格选择模式
this.gridIsMultiple = value === '2'
},100)
// 如果当前有选中的网格且是装维师傅,查询支撑人员
if (value === '1' && this.updatePersonStore.grid) {
this.queryYxPerson()
}
},
gridRender(row,column){
let arr = row.gridList
if(arr && arr.length>0){
return arr.map(item=>{return item.gridName}).join(',')
}
return ""
},
queryArea(){ queryArea(){
this.apiReq.queryLevelAllArea({ this.apiReq.queryLevelAllArea({
areaLevel: 2, areaLevel: 2,
...@@ -426,13 +458,11 @@ export default { ...@@ -426,13 +458,11 @@ export default {
} }
}) })
}, },
personnelTypeChange(){
this.updatePersonStore.relatedMarketingCode = ''
},
queryYxPerson(){ queryYxPerson(){
this.apiReq.queryAllPerson({ this.apiReq.queryAllPerson({
pageSize: 20, pageSize: 20,
pageNum: 1, pageNum: 1,
gridCode: this.updatePersonStore.grid,
personnelTypes: [2] personnelTypes: [2]
}).then(res=>{ }).then(res=>{
if(res.code == 200){ if(res.code == 200){
...@@ -447,13 +477,40 @@ export default { ...@@ -447,13 +477,40 @@ export default {
ud.row =row ud.row =row
ud.personnelName = row.personnelName ud.personnelName = row.personnelName
ud.personnelCode = row.personnelCode ud.personnelCode = row.personnelCode
ud.personnelType = row.personnelType + ''
// 设置网格选择模式
this.gridIsMultiple = ud.personnelType === '2'
if(row.personnelType == '1'){
ud.relatedMarketingCode = row.relatedMarketingCode+''
}
if(row.cityCode){
ud.city = row.cityCode
this.cityChange(ud.city,'person')
if(row.countyCode){
ud.county = row.countyCode
this.countyChange(ud.county,'person')
if(row.gridList){
let arr = row.gridList.map(item=>{return item.gridCode})
ud.grid = row.personnelType=='1'?arr.join(''):arr
if(row.personnelType == '1'){
this.queryYxPerson()
}
}
}
}
ud.phone = row.phone ud.phone = row.phone
ud.status = row.status ud.status = row.status+''
ud.relatedMarketingCode = row.relatedMarketingCode
}else{ }else{
ud.row = {} ud.row = {}
ud.personnelName = '' ud.personnelName = ''
ud.personnelCode = '' ud.personnelCode = ''
ud.personnelType = ''
ud.phone = '' ud.phone = ''
ud.status = '' ud.status = ''
ud.relatedMarketingCode = '' ud.relatedMarketingCode = ''
...@@ -546,6 +603,7 @@ export default { ...@@ -546,6 +603,7 @@ export default {
let ad = type=='person'?this.updatePersonStore:this.addressStore let ad = type=='person'?this.updatePersonStore:this.addressStore
ad.county = value ad.county = value
ad.grid = '' ad.grid = ''
ad.gridArr = []
this.apiReq.queryGridList({ this.apiReq.queryGridList({
areaCode:value areaCode:value
...@@ -559,6 +617,11 @@ export default { ...@@ -559,6 +617,11 @@ export default {
} }
}) })
}, },
gridChange(value){
if(this.updatePersonStore.personnelType==1 && value){
this.queryYxPerson()
}
},
deletePersonnel(id) { deletePersonnel(id) {
this.$confirm('确定要删除该人员吗?此操作不可撤销。', '确认删除', { this.$confirm('确定要删除该人员吗?此操作不可撤销。', '确认删除', {
confirmButtonText: '确定', confirmButtonText: '确定',
...@@ -582,6 +645,7 @@ export default { ...@@ -582,6 +645,7 @@ export default {
if (valid) { if (valid) {
let ud = this.updatePersonStore let ud = this.updatePersonStore
this.apiReq.addNewPerson({ this.apiReq.addNewPerson({
id: ud.row?ud.row.id:'',
personnelName: ud.personnelName, personnelName: ud.personnelName,
personnelCode: ud.personnelCode, personnelCode: ud.personnelCode,
phone: ud.phone, phone: ud.phone,
...@@ -589,11 +653,11 @@ export default { ...@@ -589,11 +653,11 @@ export default {
status: ud.status, status: ud.status,
relatedMarketingCode: ud.relatedMarketingCode, relatedMarketingCode: ud.relatedMarketingCode,
areaCode: ud.county, areaCode: ud.county,
gridCode: ud.grid gridCodeList: ud.personnelType==1?[ud.grid]:ud.grid
}).then(res=>{ }).then(res=>{
if(res.code == '200'){ if(res.code == '200'){
let __this = this let __this = this
this.$alert('添加成功', '温馨提示', { this.$alert(ud.row?'编辑成功':'添加成功', '温馨提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
callback: () => { callback: () => {
__this.handleFilter() __this.handleFilter()
......
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
alt="中国移动 Logo" alt="中国移动 Logo"
class="login-logo" class="login-logo"
> >
<h1 class="login-app-title">上门随销商机管理平台</h1> <h1 class="login-app-title">南通铁通商机管理平台</h1>
</div> </div>
<!-- 登录方式切换 --> <!-- 登录方式切换 -->
......
...@@ -77,7 +77,7 @@ ...@@ -77,7 +77,7 @@
</div> </div>
</el-card> </el-card>
<el-card class="detail-card"> <el-card class="detail-card" v-if="opportunity.opportunityType == 1">
<div class="card-header"> <div class="card-header">
<h3>支撑人员信息</h3> <h3>支撑人员信息</h3>
</div> </div>
...@@ -192,6 +192,7 @@ ...@@ -192,6 +192,7 @@
icon="el-icon-edit" icon="el-icon-edit"
class="action-btn" class="action-btn"
@click="assignBusi" @click="assignBusi"
v-if="opportunity.opportunityType==1"
:disabled="opportunity.status!=1 && opportunity.status!=2" :disabled="opportunity.status!=1 && opportunity.status!=2"
> >
分配商机 分配商机
...@@ -201,7 +202,7 @@ ...@@ -201,7 +202,7 @@
icon="el-icon-s-promotion" icon="el-icon-s-promotion"
class="action-btn" class="action-btn"
@click="dealBusi" @click="dealBusi"
:disabled="opportunity.status!=1 && opportunity.status!=2" :disabled="(opportunity.status!=1 && opportunity.status!=2) || ifCanOperate"
> >
标记成单 标记成单
</el-button> </el-button>
...@@ -210,7 +211,7 @@ ...@@ -210,7 +211,7 @@
icon="el-icon-s-check" icon="el-icon-s-check"
class="action-btn" class="action-btn"
@click="audioBusi" @click="audioBusi"
:disabled="opportunity.status!=3" :disabled="(opportunity.status!=3) || ifCanOperate"
> >
商机审核 商机审核
</el-button> </el-button>
...@@ -219,7 +220,7 @@ ...@@ -219,7 +220,7 @@
icon="el-icon-circle-close" icon="el-icon-circle-close"
class="action-btn" class="action-btn"
@click="shutBusi" @click="shutBusi"
:disabled="opportunity.status==5 || opportunity.status==4" :disabled="(opportunity.status==5 || opportunity.status==4) || ifCanOperate"
> >
关闭商机 关闭商机
</el-button> </el-button>
...@@ -262,7 +263,7 @@ ...@@ -262,7 +263,7 @@
type="text" type="text"
icon="el-icon-edit-outline" icon="el-icon-edit-outline"
class="action-btn" class="action-btn"
:disabled="opportunity.status==5 || opportunity.status==4" :disabled="(opportunity.status==5 || opportunity.status==4) || ifCanOperate"
@click="memoStore.isEdit = true" @click="memoStore.isEdit = true"
> >
编辑 编辑
...@@ -299,12 +300,14 @@ ...@@ -299,12 +300,14 @@
width="500px"> width="500px">
<el-form :model="closeBusiStore" label-width="100px"> <el-form :model="closeBusiStore" label-width="100px">
<el-form-item label="关闭原因"> <el-form-item label="关闭原因">
<el-input <el-select v-model="closeBusiStore.reason" placeholder="请选择关闭理由">
v-model="closeBusiStore.reason" <el-option
type="textarea" v-for="item in closeBusiStore.reasonsList"
:rows="4" :key="item.closeReason"
placeholder="请输入关闭商机原因" :label="item.closeReason"
></el-input> :value="item.closeReason"
></el-option>
</el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
...@@ -354,7 +357,7 @@ ...@@ -354,7 +357,7 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item v-if="audioBusiStore.result == '0'" label="不通过理由" required> <el-form-item label="理由" required>
<el-input <el-input
v-model="audioBusiStore.reason" v-model="audioBusiStore.reason"
type="textarea" type="textarea"
...@@ -429,7 +432,8 @@ export default { ...@@ -429,7 +432,8 @@ export default {
closeBusiStore:{ closeBusiStore:{
isShow: false, isShow: false,
reason: '' reason: '',
reasonsList: [],
}, },
yxPersonList: [], yxPersonList: [],
audioBusiStore:{ audioBusiStore:{
...@@ -461,9 +465,24 @@ export default { ...@@ -461,9 +465,24 @@ export default {
created() { created() {
this.queryDetail() this.queryDetail()
this.queryFollow() this.queryFollow()
this.queryYxPerson() this.queryCloseList()
}, },
methods: { methods: {
ifCanOperate(){
let ui = JSON.parse(localStorage.getItem('accountInfo'))
return this.opportunity.opportunityType==2&&ui.gridCode
},
queryCloseList(){
this.apiReq.queryBusiCloseReansonList({
pageNum: 1,
pageSize: 1000
}).then(res=>{
if(res.code == 200){
this.closeBusiStore.reasonsList = res.data.records
}
})
},
getAddressShow(value){ getAddressShow(value){
if(!value){ if(!value){
return '--' return '--'
...@@ -471,11 +490,19 @@ export default { ...@@ -471,11 +490,19 @@ export default {
return value.split(":")[1] return value.split(":")[1]
}, },
queryYxPerson(){ queryYxPerson(){
this.apiReq.queryAllPerson({ let param = {
pageSize: 20, pageSize: 20,
pageNum: 1, pageNum: 1,
personnelTypes: [2] personnelTypes: [2]
}).then(res=>{ }
if(this.opportunity.opportunityType == 1){
param.gridCode = this.opportunity.gridCode
}else{
param.areaCode = this.opportunity.areaCode
}
this.apiReq.queryAllPerson(param).then(res=>{
if(res.code == 200){ if(res.code == 200){
this.yxPersonList = res.data.records this.yxPersonList = res.data.records
} }
...@@ -564,6 +591,7 @@ export default { ...@@ -564,6 +591,7 @@ export default {
this.memoStore.value = res.data.adminRemark this.memoStore.value = res.data.adminRemark
this.handleAudio() this.handleAudio()
this.queryYxPerson()
}else{ }else{
this.$alert(res.$message, '温馨提示', { this.$alert(res.$message, '温馨提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
...@@ -609,7 +637,7 @@ export default { ...@@ -609,7 +637,7 @@ export default {
audioBusiSubmit(){ audioBusiSubmit(){
let ad = this.audioBusiStore let ad = this.audioBusiStore
if(ad.result==0 && !ad.reason){ if(!ad.reason){
this.$message.error('请输入不通过理由') this.$message.error('请输入不通过理由')
return return
} }
......
...@@ -221,7 +221,7 @@ ...@@ -221,7 +221,7 @@
<el-table <el-table
:data="tableData" border :data="tableData" border
v-loading="loading"> v-loading="loading">
<el-table-column prop="id" label="商机ID" width="150"></el-table-column> <el-table-column prop="opportunityCode" label="商机ID" width="200"></el-table-column>
<el-table-column prop="createTime" label="创建时间" :formatter="timeRender" width="180"></el-table-column> <el-table-column prop="createTime" label="创建时间" :formatter="timeRender" width="180"></el-table-column>
<el-table-column prop="customerAddress" label="客户地址" width="230" :formatter="addressRender" show-overflow-tooltip></el-table-column> <el-table-column prop="customerAddress" label="客户地址" width="230" :formatter="addressRender" show-overflow-tooltip></el-table-column>
<el-table-column prop="customerPhone" label="用户账号" width="120"></el-table-column> <el-table-column prop="customerPhone" label="用户账号" width="120"></el-table-column>
...@@ -245,7 +245,7 @@ ...@@ -245,7 +245,7 @@
<el-table-column label="操作" min-width="200"> <el-table-column label="操作" min-width="200">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" size="small" @click="checkDetail(scope.row)">查看详情</el-button> <el-button type="text" size="small" @click="checkDetail(scope.row)">查看详情</el-button>
<el-button type="text" size="small" @click="checkAudio(scope.row)" :disabled="scope.row.status!=3">审核</el-button> <el-button type="text" size="small" @click="checkAudio(scope.row)" :disabled="ifCanAudio(scope.row)">审核</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -271,12 +271,70 @@ ...@@ -271,12 +271,70 @@
title="新增商机" title="新增商机"
:visible.sync="newOpportunity.isShow" :visible.sync="newOpportunity.isShow"
width="800px"> width="800px">
<el-form label-width="120px"> <el-form :model="newOpportunity" :rules="newOpportunity.rules" ref="opportuntityForm" label-width="120px">
<el-form-item label="用户账号" prop="customerPhone"> <el-form-item label="用户账号" prop="customerPhone">
<el-input v-model="newOpportunity.customerPhone" placeholder="请输入用户账号"></el-input> <el-input v-model="newOpportunity.customerPhone" placeholder="请输入用户账号"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="客户地址" prop="city"> <el-form-item label="装维人员工号" prop="maintenanceStaffNo">
<template v-if="newOpportunity.cityArr.length>0"> <el-input v-model="newOpportunity.maintenanceStaffNo" placeholder="请输入装维人员工号" @blur="getGwName"></el-input>
</el-form-item>
<el-form-item label="装维人员姓名" v-if="newOpportunity.maintenanceStaffName">
<el-input v-model="newOpportunity.maintenanceStaffName" disabled></el-input>
</el-form-item>
<el-form-item label="业务类型" prop="tagIds">
<el-select v-model="newOpportunity.tagIds" placeholder="请选择业务类型" style="width: 100%;" multiple>
<el-option v-for="item in busiLabelStore" :label="item.tagName" :value="item.id" :disabled="isTagCanCho(item)"></el-option>
</el-select>
</el-form-item>
<el-form-item label="客户地址" :required="newOpportunity.tagIds.includes(1)||newOpportunity.tagIds.includes(2)">
<el-form-item prop="city" v-if="newOpportunity.cityArr.length>0" style="display: inline-block">
<el-select
v-model="newOpportunity.city"
placeholder="选择地市"
@change="addCityChange"
style="margin-right: 10px"
clearable>
<el-option
v-for="item in newOpportunity.cityArr"
:key="item.code"
:label="item.name"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item prop="county" v-if="newOpportunity.countyArr.length>0" style="display: inline-block">
<el-select
v-model="newOpportunity.county"
placeholder="选择区县"
@change="addCountyChange"
style="margin-right: 10px"
clearable>
<el-option
v-for="item in newOpportunity.countyArr"
:key="item.code"
:label="item.name"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item prop="streets" v-if="newOpportunity.streetsArr.length>0" style="display: inline-block">
<el-select
v-model="newOpportunity.streets"
placeholder="选择街道"
@change="addStreetsChange"
clearable>
<el-option
v-for="item in newOpportunity.streetsArr"
:key="item.code"
:label="item.name"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item prop="detail" v-if="newOpportunity.streets">
<el-input v-model="newOpportunity.detail" placeholder="请输入详细地址" style="margin-top: 10px;"></el-input>
</el-form-item>
<!-- <template v-if="newOpportunity.cityArr.length>0">
<el-select <el-select
v-model="newOpportunity.city" v-model="newOpportunity.city"
placeholder="选择地市" placeholder="选择地市"
...@@ -320,15 +378,7 @@ ...@@ -320,15 +378,7 @@
></el-option> ></el-option>
</el-select> </el-select>
</template> </template>
<el-input v-if="newOpportunity.streets" v-model="newOpportunity.detail" placeholder="请输入详细地址" style="margin-top: 10px;"></el-input> <el-input v-if="newOpportunity.streets" v-model="newOpportunity.detail" placeholder="请输入详细地址" style="margin-top: 10px;"></el-input> -->
</el-form-item>
<el-form-item label="装维人员工号" prop="maintenanceStaffNo">
<el-input v-model="newOpportunity.maintenanceStaffNo" placeholder="请输入装维人员工号"></el-input>
</el-form-item>
<el-form-item label="业务类型" prop="tagIds">
<el-select v-model="newOpportunity.tagIds" placeholder="请选择业务类型" style="width: 100%;" multiple>
<el-option v-for="item in busiLabelStore" :label="item.tagName" :value="item.id" :disabled="isTagCanCho(item)"></el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="文字描述" prop="textDescription"> <el-form-item label="文字描述" prop="textDescription">
<el-input <el-input
...@@ -376,33 +426,10 @@ ...@@ -376,33 +426,10 @@
</template> </template>
<script> <script>
import { mapGetters } from 'vuex'
// 商机状态映射
const statusMap = {
'assigned': { label: '待跟进', color: 'blue' },
'following': { label: '跟进中', color: 'orange' },
'pending_review': { label: '成单待审核', color: 'purple' },
'completed': { label: '已成单', color: 'green' },
'closed': { label: '已关闭', color: 'gray' }
}
// 商机标签
const opportunityTags = [
'网络升级', '家庭安防', '智能家居', '宽带套餐', '移动套餐', '融合套餐', '企业业务'
]
// 支撑人员列表
const mockSalesPersons = [
{ id: 'SALE001', name: '张营销', gridName: 'A网格', phone: '13812345001' },
{ id: 'SALE002', name: '陈营销', gridName: 'B网格', phone: '13812345002' },
{ id: 'SALE003', name: '刘营销', gridName: 'C网格', phone: '13812345003' },
{ id: 'SALE004', name: '赵营销', gridName: 'A网格', phone: '13812345004' },
{ id: 'SALE005', name: '王营销', gridName: 'B网格', phone: '13812345005' }
]
export default { export default {
name: 'OpportunityManagement', name: 'OpportunityManagement',
data() { data() {
let fthis = this
return { return {
formData:{ formData:{
customerPhone: '', customerPhone: '',
...@@ -449,16 +476,38 @@ export default { ...@@ -449,16 +476,38 @@ export default {
detail: '', detail: '',
maintenanceStaffNo: '', maintenanceStaffNo: '',
maintenanceStaffName: '',
tagIds: [], tagIds: [],
opportunityType: '', opportunityType: '',
textDescription: '' textDescription: '',
rules:{
customerPhone: [
{required: true,message: '请输入用户账号', trigger: 'blur'}
],
maintenanceStaffNo: [
{required: true,message: '请输入装维人员工号', trigger: 'blur'}
],
tagIds: [
{required: true,message: '请选择业务类型', trigger: 'blur'}
],
city: [
{validator: this.validateCity,message: '请选择地市', trigger: 'blur'}
],
county: [
{validator: this.validateCounty,message: '请选择区县', trigger: 'blur'}
],
streets: [
{validator: this.validateStreets,message: '请选择街道', trigger: 'blur'}
],
detail: [
{validator: this.validateDetail,message: '请输入详细地址', trigger: 'blur'}
],
}
}, },
busiLabelStore: [], busiLabelStore: [],
loading: false, loading: false,
statusMap,
opportunityTags,
mockSalesPersons,
activeTab: 'all', activeTab: 'all',
searchTerm: '', searchTerm: '',
selectedRegion: '', selectedRegion: '',
...@@ -489,6 +538,55 @@ export default { ...@@ -489,6 +538,55 @@ export default {
this.queryAllBusiLabel() this.queryAllBusiLabel()
}, },
methods: { methods: {
ifCanAudio(row){
return row.status!=3 || (row.opportunityType==2&&this.getData.grid)
},
getGwName(){
this.apiReq.queryAllPerson({
pageSize: this.pageStore.pageSize,
pageNum: this.pageStore.currentPage,
personnelCode: this.newOpportunity.maintenanceStaffNo
}).then(res=>{
this.newOpportunity.maintenanceStaffName = ''
if(res.code == 200){
let arr = res.data.records
if(arr.length > 0){
this.newOpportunity.maintenanceStaffName = arr[0].personnelName
}
}
})
},
validateCity(rule, value, callback) {
if (this.shouldValidateAddress() && !value) {
callback(new Error('请选择地市'))
} else {
callback()
}
},
validateCounty(rule, value, callback) {
if (this.shouldValidateAddress() && !value) {
callback(new Error('请选择区县'))
} else {
callback()
}
},
validateStreets(rule, value, callback) {
if (this.shouldValidateAddress() && !value) {
callback(new Error('请选择街道'))
} else {
callback()
}
},
validateDetail(rule, value, callback) {
if (this.shouldValidateAddress() && !value) {
callback(new Error('请输入详细地址'))
} else {
callback()
}
},
shouldValidateAddress() {
return this.newOpportunity.tagIds.includes(1)||this.newOpportunity.tagIds.includes(2)
},
addressRender(row,column){ addressRender(row,column){
let value = row[column.property] let value = row[column.property]
...@@ -535,18 +633,10 @@ export default { ...@@ -535,18 +633,10 @@ export default {
addNewBusi(){ addNewBusi(){
let nd = this.newOpportunity let nd = this.newOpportunity
nd.customerPhone = ''
nd.city = ''
nd.cityName = ''
nd.county = ''
nd.countyName = ''
nd.streets = ''
nd.streetsName = ''
nd.maintenanceStaffNo = ''
nd.tagIds = ''
nd.textDescription = ''
nd.isShow = true nd.isShow = true
setTimeout(() => {
this.$refs.opportuntityForm.resetFields()
}, 0);
}, },
queryAllBusiLabel(){ queryAllBusiLabel(){
this.apiReq.queryBusiLabelList({ this.apiReq.queryBusiLabelList({
...@@ -614,8 +704,18 @@ export default { ...@@ -614,8 +704,18 @@ export default {
addCityChange(value){ addCityChange(value){
let ad = this.newOpportunity let ad = this.newOpportunity
ad.city = value ad.city = value
ad.cityName = ad.cityArr.find(item => item.code == value).name
if(!value){
ad.county = ''
ad.countyName = ''
ad.countyArr = []
ad.streets = ''
ad.streetsName = ''
ad.streetsArr = []
return
}
ad.cityName = ad.cityArr.find(item => item.code == value).name
ad.cityArr.forEach(item=>{ ad.cityArr.forEach(item=>{
if(item.code == ad.city){ if(item.code == ad.city){
ad.countyArr = item.districts ad.countyArr = item.districts
...@@ -625,8 +725,15 @@ export default { ...@@ -625,8 +725,15 @@ export default {
addCountyChange(value){ addCountyChange(value){
let ad = this.newOpportunity let ad = this.newOpportunity
ad.county = value ad.county = value
ad.countyName = ad.countyArr.find(item => item.code == value).name
if(!value){
ad.streets = ''
ad.streetsName = ''
ad.streetsArr = []
return
}
ad.countyName = ad.countyArr.find(item => item.code == value).name
ad.countyArr.forEach(item=>{ ad.countyArr.forEach(item=>{
if(item.code == ad.county){ if(item.code == ad.county){
ad.streetsArr = item.streets ad.streetsArr = item.streets
...@@ -689,30 +796,12 @@ export default { ...@@ -689,30 +796,12 @@ export default {
} }
}) })
}, },
addBusiSubmit(){ async addBusiSubmit(){
let nd = this.newOpportunity let nd = this.newOpportunity
if(!nd.customerPhone){ await this.$refs.opportuntityForm.validate()
this.$message.error('请输入用户账号')
return
}
if(!nd.city || !nd.county || !nd.streets || !nd.detail){
this.$message.error('请补全客户地址信息')
return
}
let address = nd.city+'|'+nd.county+'|'+nd.streets+":"+nd.cityName+nd.countyName+nd.streetsName+nd.detail let address = nd.city+'|'+nd.county+'|'+nd.streets+":"+nd.cityName+nd.countyName+nd.streetsName+nd.detail
if(!nd.maintenanceStaffNo){
this.$message.error('请输入装维人员工号')
return
}
if(!nd.tagIds){
this.$message.error('请选择业务类型')
return
}
this.apiReq.createBusi({ this.apiReq.createBusi({
customerAddress: address, customerAddress: address,
...nd ...nd
...@@ -734,9 +823,6 @@ export default { ...@@ -734,9 +823,6 @@ export default {
}, },
getStatusType(status) { getStatusType(status) {
const typeMap = { const typeMap = {
'assigned': 'info', 'assigned': 'info',
......
...@@ -11,7 +11,7 @@ module.exports = { ...@@ -11,7 +11,7 @@ module.exports = {
proxy: { proxy: {
'/compass': { '/compass': {
target: 'https://testznzl.lgyzpt.com/', target: 'https://testznzl.lgyzpt.com/',
//target: 'https://hall.51xinpai.cn', //target: 'http://39.107.104.220:8877',
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
'^/compass': 'compass' '^/compass': 'compass'
......
...@@ -199,7 +199,7 @@ ...@@ -199,7 +199,7 @@
<div class="imgList"> <div class="imgList">
<div class="addImg" v-if="gjStore.imgArr.length<3"> <div class="addImg" v-if="gjStore.imgArr.length<3">
<img class="add" src="images/add.png" alt=""> <img class="add" src="images/add.png" alt="">
<input type="file" @change="fileChange" accept="image/*" :disabled="gjStore.isLoading"> <input type="file" @change="fileChange" accept="image/*" multiple :disabled="gjStore.isLoading">
</div> </div>
<div class="imgShow" v-for="(item,index) in gjStore.imgArr"> <div class="imgShow" v-for="(item,index) in gjStore.imgArr">
<img class="show" :src="item.url" alt=""> <img class="show" :src="item.url" alt="">
...@@ -249,12 +249,25 @@ ...@@ -249,12 +249,25 @@
<div class="botTs">关闭后将无法再进行任何编辑操作</div> <div class="botTs">关闭后将无法再进行任何编辑操作</div>
</div> </div>
</div> </div>
<!-- <div class="outAlertBg">
<div class="imgAlertCon">
<div class="imgDiv">
<img src="https://pic1.arkoo.com/56D0B40F99F841DF8A2425762AE2565D/picture/o_1i4qop009177v1tgf14db15he1iaj1is.jpg" alt="">
</div>
<div class="choButt">
<div class="prev">prev</div>
<div class="next">next</div>
</div>
</div>
</div> -->
</div> </div>
<!-- 引入Vue.js --> <!-- 引入Vue.js -->
<script src="js/vue.min.js"></script> <script src="js/vue.min.js"></script>
<script src="js/axios.min.js"></script> <script src="js/axios.min.js"></script>
<script src="js/util.js"></script> <script src="js/util.js"></script>
<script src="js/busiDetail.js?123"></script> <script src="js/busiDetail.js?000"></script>
</body> </body>
</html> </html>
\ No newline at end of file \ No newline at end of file
...@@ -182,6 +182,32 @@ body { ...@@ -182,6 +182,32 @@ body {
} }
/* .imgAlertCon .imgDiv{
width: 6.5rem;
height: 9rem;
margin-bottom: .3rem;
display: flex;
align-items: center;
justify-content: center;
}
.imgAlertCon .imgDiv img{
max-width: 100%;
max-height: 100%;
}
.imgAlertCon .choButt{
width: 100%;
display: flex;
color: #fff;
font-size: .4rem;
justify-content: space-around;
}
.imgAlertCon .choButt div{
background: #0068EE;
padding: .1rem .3rem;
border-radius: .08rem;
} */
/* 通用卡片样式 */ /* 通用卡片样式 */
.business-info-section, .business-info-section,
.business-detail-section, .business-detail-section,
......
...@@ -337,17 +337,20 @@ new Vue({ ...@@ -337,17 +337,20 @@ new Vue({
return return
} }
let file = e.target.files[0] let files = e.currentTarget.files
console.log(file)
if(file.type.includes('image/') <= 0){ if (files.length > 3) {
util.toast('请上传图片') utils.toast(`最多只能选择3张图片`);
return e.value = '';
return false;
} }
this.gjStore.imgArr.push({ for(let key in files){
file: file, this.gjStore.imgArr.push({
url: URL.createObjectURL(file) file: files[key],
}) url: URL.createObjectURL(files[key])
})
}
}, },
/** /**
......
...@@ -8,7 +8,7 @@ new Vue({ ...@@ -8,7 +8,7 @@ new Vue({
loginForm: { loginForm: {
employeeId: '', employeeId: '',
phoneNumber: '', phoneNumber: '',
verifyCode: '' verifyCode: '123456'
}, },
countdown: 0, countdown: 0,
countdownTimer: null, countdownTimer: null,
...@@ -19,16 +19,16 @@ new Vue({ ...@@ -19,16 +19,16 @@ new Vue({
this.platform = type this.platform = type
localStorage.setItem('platform',type) localStorage.setItem('platform',type)
// if(type == 'gw'){ if(type == 'gw'){
// this.loginForm.employeeId = '54321' this.loginForm.employeeId = '54321'
// this.loginForm.phoneNumber = '15611154004' this.loginForm.phoneNumber = '15611154004'
// }else if(type == 'yx'){ }else if(type == 'yx'){
// this.loginForm.employeeId = '12345' this.loginForm.employeeId = '12345'
// this.loginForm.phoneNumber = '13718590607' this.loginForm.phoneNumber = '13718590607'
// }else{ }else{
// this.loginForm.employeeId = '54321' this.loginForm.employeeId = '54321'
// this.loginForm.phoneNumber = '13212789513' this.loginForm.phoneNumber = '13212789513'
// } }
}, },
getVerifyCode() { getVerifyCode() {
let pa = this.loginForm let pa = this.loginForm
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
<input <input
class="search-input" class="search-input"
type="text" type="text"
placeholder="输入用户账号" placeholder="输入用户联系方式"
v-model="searchKeyword" v-model="searchKeyword"
data-node-id="355:510" data-node-id="355:510"
> >
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!