import React,{Component} from "react"; import { AutoComplete, Button, Cascader, DatePicker, Input, message, Select, Spin, Table, Tabs, Tooltip, Upload, Modal, Tag } from "antd"; import {ChooseList} from "../../../order/orderNew/chooseList"; import $ from "jquery/src/ajax"; import { getSocialAttribute, ShowModal, getChannelAllocationStatus } from "@/tools.js"; import { channelAllocationStatus } from "@/dataDic.js"; import { citySelect, provinceList } from '@/NewDicProvinceList'; import moment from "moment"; import FollowDetail from "./followDetail"; import IntentionDetail from "./intentionDetail/intentionDetail"; import TransferRecords from './transferRecords'; import DuplicateData from './duplicateData'; import OperationTips from './operationTips'; import ShowModalDiv from "@/showModal.jsx"; import './channel.less'; import EnterpriseNameChange from "../../../../common/enterpriseNameChange"; const {TabPane} = Tabs; const { RangePicker } = DatePicker; const Option = Select.Option; class Channel extends Component{ constructor(props) { super(props); this.state={ isGuidance:false, isEditGuidance: true, upLoadFileLoading:false, channelAllocationStatusList : channelAllocationStatus.slice(0,channelAllocationStatus.length-2), columns: [ { title: "客户名称", dataIndex: "userName", key: "userName", render: (text,record) => { return ( {record.recovery === 1 ?
回收
: null}
{text}
) }, }, { title: "地区", dataIndex: "locationProvince", key: "locationProvince", }, { title: "社会性质", dataIndex: "societyTag", key: "societyTag", render: (text) => { return getSocialAttribute(text); }, }, { title: "外联专员", dataIndex: "channelName", key: "channelName", }, { title: "客户联系人", dataIndex: "contacts", key: "contacts", }, { title: "联系电话", dataIndex: "contactMobile", key: "contactMobile", }, { title: "外联初始时间", dataIndex: "createTimes", key: "createTimes", }, { title: "分配状态", dataIndex: "status", key: "status", render: (text) => ( getChannelAllocationStatus(text,true) ) }, ], changeList:[], dataSource:[], pagination: { defaultCurrent: 1, defaultPageSize: 10, showQuickJumper: true, pageSize: 10, onChange: function (page) { this.loadData(page); }.bind(this), showTotal: function (total) { return "共" + total + "条数据"; }, }, pageNo:1, listLoading:false, selectedRowKeys:[], selectedRows:[], modalVisible:false, nameSearch:'', statusSearch:undefined, provinceSearch:undefined, addressSearch:[], releaseDate:[], upLoad: { customRequest: (options) => { this.setState({ upLoadFileLoading: true, }) let params = new FormData(); params.append("file", options.file); $.ajax({ method: "post", url: globalConfig.context + "/api/user/channel/import", async: true, cache: false, contentType: false, processData: false, data:params }).done( function (data) { this.setState({ upLoadFileLoading: false, }) if (data.error.length === 0) { if(data.data === 1){ message.success("导入成功!"); }else if(data.data.list.length > 0){ message.warning('已成功导入!错误/重复客户无法导入,请查看错误外联数据!'); this.setState({ duplicateData: [], duplicateDataVisible: true }) } this.loadData(); } else { message.warning(data.error[0].message); this.loadData(); } }.bind(this) ).always( function () { this.loadData(); this.setState({ upLoadFileLoading: false, }); }.bind(this) ); }, name: "file", action: globalConfig.context + "/api/user/channel/import", }, followData: '', visitModul: false, categoryArr:[], tabsKey:'', adminList:[], } this.loadData = this.loadData.bind(this); this.search = this.search.bind(this); this.reset = this.reset.bind(this); this.changeList = this.changeList.bind(this); this.download = this.download.bind(this); this.category = this.category.bind(this); this.closeDesc = this.closeDesc.bind(this); this.guidanceRead = this.guidanceRead.bind(this); this.tableRowClick = this.tableRowClick.bind(this); this.detailCloseDesc = this.detailCloseDesc.bind(this); this.supervisor = this.supervisor.bind(this); this.httpChange = this.httpChange.bind(this); this.blurChange = this.blurChange.bind(this); this.selectAuto = this.selectAuto.bind(this); this.changeAssigner = this.changeAssigner.bind(this); this.getAdminList = this.getAdminList.bind(this); } componentWillReceiveProps (nextProps) { let next = JSON.stringify(nextProps); let props = JSON.stringify(this.props); if(next !== props){ location.reload(); } } componentDidMount() { this.initialization(); } //获取外联专员列表 getAdminList(value = '') { this.setState({ adminListLoading:true }) $.ajax({ method: "get", dataType: "json", crossDomain: false, url: globalConfig.context + "/api/admin/superviser/adminList", data: { pageNo: 1, pageSize: 99, name: value, roleName: '外联专员', }, success: function (data) { let thedata = data.data.list; let theArr = []; if (data.error && data.error.length) { message.warning(data.error[0].message); }else{ thedata.map(function (item, _) { theArr.push({ value: item.id, label: item.name, }); }); } this.setState({ adminList: theArr, }); }.bind(this), }).always( function () { this.setState({ adminListLoading:false }) }.bind(this) ); } initialization(){ //城市 let provinces = []; provinceList.map(function (item) { var id = String(item.id); provinces.push( {item.name} ); }); this.setState({ provinces }) this.loadData(); this.category(); if(this.props.type === 0 || this.props.type === 3){ this.state.columns.push({ title: "分配时间", dataIndex: "distributionTimes", key: "distributionTimes", }); this.state.columns.push({ title: "剩余签单(天)", dataIndex: "days", key: "days", render: (text,record) => ( record.status !== 7 ? {text}天 : '' ) }); } if(this.props.followUp){ this.state.columns.push({ title: "当前跟进人", dataIndex: "adminName", key: "adminName", render: (text, record) => { return ( record.status !== 0 ? text : '' ) } }); this.state.columns.push({ title: "跟进操作", dataIndex: "abc", key: "abc", render: (text, record, index) => { return (
); }, }); if(this.props.isEditGuidanceLv){ this.state.columns.push({ title: "指导意见", dataIndex: "guidance", key: "guidance", render: (text, record, index) => { return (
{/*指导 0无 1未读 2已读*/} {text === 1 || text === 2 ? :
暂无指导
}
); }, }); } } this.state.columns.push({ title: "备注", dataIndex: "remarks", key: "remarks", render: (text) => { return (
{text}
) } }); this.setState({ columns:this.state.columns }) } visit(e) { this.setState({ followData: e, visitModul: true, }); } loadData(pageNo = 1) { this.setState({ listLoading: true, selectedRows: [], selectedRowKeys: [], }); $.ajax({ method: "post", dataType: "json", crossDomain: false, url: globalConfig.context + '/api/admin/customer/listChannelCustomer', data: { type:this.props.type, pageNo: pageNo || 1, pageSize: this.state.pagination.pageSize, name: this.state.nameSearch, status:this.state.statusSearch, province: !this.state.addressSearch.length ? this.state.provinceSearch : this.state.addressSearch[0], city: !this.state.addressSearch.length ? "" : this.state.addressSearch[1], startTime: this.state.releaseDate[0], endTime: this.state.releaseDate[1], aid:this.state.adminValue, }, success: function (data) { ShowModal(this); let theArr = []; if (data.error.length > 0) { message.warning(data.error[0].message); } else { if(data.data.list.length === 0 && pageNo !== 1){ this.loadData(pageNo - 1) }else{ for (let i = 0; i < data.data.list.length; i++) { let thisdata = data.data.list[i]; let diqu = (thisdata.province == null ? "" : thisdata.province) + (thisdata.city == null ? "" : "-" + thisdata.city) + (thisdata.area == null ? "" : "-" + thisdata.area); thisdata.key = i; thisdata.id = thisdata.uid; thisdata.lastFollowTime = thisdata.lastFollowTime && thisdata.lastFollowTime.split(" ")[0]; thisdata.transferTime= thisdata.transferTime && thisdata.transferTime.split(" ")[0]; thisdata.surplusFollowTime = thisdata.surplusFollowTime && thisdata.surplusFollowTime.split(" ")[0]; thisdata.surplusSignTime = thisdata.surplusSignTime && thisdata.surplusSignTime.split(" ")[0]; thisdata.locationProvince = diqu; theArr.push(thisdata); } this.state.pagination.current = data.data.pageNo; this.state.pagination.total = data.data.totalCount; this.setState({ pageNo: data.data.pageNo, dataSource: theArr, pagination: this.state.pagination, }) } } }.bind(this), }).always( function () { this.setState({ listLoading: false, }); }.bind(this) ); } search(){ this.loadData(); } reset(){ this.setState({ nameSearch:'', provinceSearch:undefined, addressSearch:[], releaseDate:[], statusSearch:undefined, adminValue:undefined, },()=>{ this.loadData(); }) } download() { window.location.href = globalConfig.context + "/api/user/channel/downloadTemplate?" + "sign=user_channel"; } changeList(arr) { const newArr = []; this.state.columns.forEach(item => { arr.forEach(val => { if (val === item.title) { newArr.push(item); } }); }); this.setState({ changeList: newArr }); } category() { $.ajax({ method: "get", dataType: "json", crossDomain: false, url: globalConfig.context + "/api/admin/Varieties/getSuperList", data: {}, success: function (data) { let thedata = data.data; let theArr = []; if (!thedata) { if (data.error && data.error.length) { message.warning(data.error[0].message); } thedata = {}; } else { thedata.map(function (item, index) { theArr.push({ value: item.id, key: item.cname, }); }); } this.setState({ categoryArr: theArr, }); }.bind(this), }); } closeDesc(){ this.setState({ followData:'', visitModul:false }) } //已读指导记录 guidanceRead(id) { return new Promise((resolve,reject)=>{ $.ajax({ method: "post", dataType: "json", crossDomain: false, url: globalConfig.context + "/api/admin/customer/pushGuidance", data: { uid: id, } }).done(function(data) { if(!data.error.length) { resolve(); } else { message.warning(data.error[0].message); reject(); }; }.bind(this)); }) } tableRowClick(record) { if(this.props.deliver === 2 && record.status === 2 && this.props.isEditGuidanceLv){ this.setState({ isGuidance: true, tabsKey:"4", }) } //营销经理人员 取消指导自己的操作 if(this.props.deliver === 2 && record.status === 1 && this.props.isEditGuidanceLv){ this.setState({ isEditGuidance: false, }) } //营销人员 取消指导的操作 if(this.props.deliver === 0 && record.status === 2 && this.props.isEditGuidanceLv){ this.setState({ isEditGuidance: false, }) } this.setState({ rowData:record, modalVisible: true, basicState: true, contactState: true, modalName: record.userName }) } detailCloseDesc(){ this.setState({ rowData:'', modalVisible: false, basicState: false, contactState: false, modalName: '', isGuidance: false, isEditGuidance: true, tabsKey: '', },()=>{ this.loadData(this.state.pageNo); }) } supervisor(e) { $.ajax({ method: "get", dataType: "json", crossDomain: false, url: globalConfig.context + "/api/admin/customer/listAdminByName", data: { adminName: e, }, success: function (data) { let thedata = data.data; if (!thedata) { if (data.error && data.error.length) { message.warning(data.error[0].message); } thedata = {}; } this.setState({ customerArr: thedata, }); }.bind(this), }).always( function () { }.bind(this) ); } httpChange(e) { if (e.length >= 1) { this.supervisor(e); } this.setState({ auto: e, }); } blurChange(e) { let theType = ""; let contactLists = this.state.customerArr || []; if (e) { contactLists.map(function (item) { if (item.name == e.toString()) { theType = item.id; } }); } this.setState({ theTypes: theType, }); } selectAuto(value, options) { this.setState({ auto: value, }); } changeAssigner(remarks,type,lv) { //type 0 总监分配 1经理分配 2回收 let arr = this.state.selectedRows.filter(v=>v.status === 1); let arr1 = this.state.selectedRows.filter(v=>v.status === 2); let arr2 = this.state.selectedRows.filter(v=>v.status === 7); let arr3 = this.state.selectedRows.filter(v=>v.status === 6); if(type === 0 && (arr.length>0 || arr1.length>0)){ message.warning('选中的信息中存在“已分配”数据,请取消这些选项后重新提交') return; } if(type === 1 && arr1.length>0){ message.warning('选中的信息中存在“经理已分配”数据,请取消这些选项后重新提交') return; } //处于回收状态的客户经理和营销员不能点击回收 if(this.props.deliver !== 1 && arr3.length>0){ message.warning('外联客户已回收!待营销总监,重新分配') return; } //this.props.deliver && this.props.recovery 用于判断是否为经理 if(this.props.deliver === 2 && this.props.recovery && type === 2 && arr1.length>0){ message.warning('操作失败,存在客户已被分配营销员') return; } if(arr2.length>0){ message.warning('不能操作已签单客户') return; } if(!remarks){ message.warning(type === 1 ? "请输入分配原因" : type === 2 ? "请输入回收原因" : type === 0 ? "请输入分配原因" : ""); return; } if (this.state.theTypes || lv) { this.setState({ listLoading: true, }) let changeIds = ''; let oldAid = ''; for (let idx = 0; idx < this.state.selectedRows.length; idx++) { let rowItem = this.state.selectedRows[idx]; if(rowItem.recovery === 1 && type === 2){ let arr = this.state.selectedRows.filter(v => v.recovery === 1) Modal.info({ title: '以下数据属于回收再分配资源,无法再次回收', content: (
{ arr.map(i=>(
{i.userName}
)) }
), onOk() {}, }); return ; } if (rowItem.id) { oldAid = rowItem.aid; changeIds = this.state.selectedRows.length-1 === idx ? changeIds +rowItem.id : changeIds + rowItem.id + ',' ; } } $.ajax({ method: "post", dataType: "json", crossDomain: false, url: globalConfig.context + "/api/admin/customer/channelCustomerDeliver", data: { userIds: changeIds, //这一行数据的ID receiveId: this.state.theTypes, //指定分配人的ID remarks: remarks, type, //0总监分配 1经理分配 2回收 }, }).done( function (data) { this.setState({ listLoading: false, }) if (!data.error.length) { message.success(type === 1 ? "分配成功!" : type === 2 ? "回收成功!" : type === 0 ? "分配成功!" : ""); this.setState({ auto: "", loading: false, selectedRowKeys: [], visible:false, recoveryVisible: false, },()=>{ this.loadData(this.state.pageNo); }); } else { message.warning(data.error[0].message); } }.bind(this) ); } else { message.warning("请输入分配人姓名"); } } render() { const rowSelection = { hideDefaultSelections: true, selectedRowKeys: this.state.selectedRowKeys, onChange: (selectedRowKeys, selectedRows) => { this.setState({ modalVisible: false, selectedRows: selectedRows, selectedRowKeys: selectedRowKeys, }); }, onSelect: (recordt, selected, selectedRows) => { this.setState({ modalVisible: false, }); }, }; const dataSources = this.state.customerArr || []; const options = dataSources.map((group) => ( {group.name} )); const hasSelected = this.state.selectedRowKeys.length > 0; return (
{ this.setState({ showModal: false }) }} />
外联客户
{ this.setState({ nameSearch: e.target.value }); }} /> { this.setState({ addressSearch: e }); }} /> { this.setState({ releaseDate: dataString }); }} /> {this.props.type !== 1 ? : null}
{this.props.deliver ? : ''} {this.props.deliver ? : ''} {this.props.recovery ? : ''} {this.props.deliver || this.props.recovery ? : ''} {this.props.channel ? : null} {this.props.channel ? : ''} {this.props.channel ? : ''}
{this.state.duplicateDataVisible ? { this.setState({ duplicateData:[], duplicateDataVisible: false },()=>{ this.loadData(this.state.pageNo); }) }} /> : null} {this.state.transferVisible || this.state.returnVisible ? { this.setState({ transferVisible:false, returnVisible: false, transferId:'' }) }} /> : '' } {/*外联客户分配*/} {this.state.visible ? { // 0 总监分配 1经理分配 2回收 this.changeAssigner(value,this.props.deliver === 1 ? 0 : this.props.deliver === 2 ? 1 : '') }} onCancel={()=>{ this.setState({ visible:false }) }}/> : ''} {/*外联客户回收*/} {this.state.recoveryVisible ? { this.changeAssigner(value,2,true) }} onCancel={()=>{ this.setState({ recoveryVisible:false }) }}/> : ''} {this.state.upLoadFileLoading ?
客户名称匹配中...
: null} ) } } export default Channel;