Browse Source

编辑客户;全量客户列表;客户列表

Karsa 6 months ago
parent
commit
45165c3d8a

+ 2 - 2
src/hooks/login/use-login.js

@@ -94,9 +94,9 @@ export function useLoginSuccess(res) {
   localStorage.setItem("AdminName", res.Data.AdminName);
 
   getOtherRolePath('myCalendar').then(path => {
-      // path&&router.push({ path });
+      path&&router.push({ path });
       //先跳到主面板
-      path&&router.push({ path:'/dashboard' });
+      // path&&router.push({ path:'/dashboard' });
   });
   
 }

+ 33 - 32
src/router/modules/customRoutes.js

@@ -51,15 +51,15 @@ export default [
           pathName: '正式客户共享'
         }
       },
-      // {
-      //   path: "customAllList",
-      //   component: () => import("@/views/custom_manage/custom/customAllList.vue"),
-      //   name: "customAllList",
-      //   hidden: false,
-      //   meta: {
-      //     title: '全量客户列表'
-      //   }
-      // },
+      {
+        path: "customAllList",
+        component: () => import("@/views/custom_manage/custom/customAllList.vue"),
+        name: "customAllList",
+        hidden: false,
+        meta: {
+          title: '全量客户列表'
+        }
+      },
       {
         path: "customListEn",
         component: () => import("@/views/custom_manage/customEn/customListEn.vue"),
@@ -106,29 +106,30 @@ export default [
           title: '领取列表'
         },
       },
-      // {
-      //   path: "addCustom",
-      //   name: "addCustom",
-      //   component: () => import("@/views/custom_manage/custom/addCustom.vue"),
-      //   hidden: true,
-      //   meta: {
-      //     title: '新增客户',
-      //     pathFrom: "customList",
-      //     pathName: "客户列表",
-      //     keepAlive: false,
-      //   },
-      // },
-      // {
-      //   path: "editCustom",
-      //   name: "编辑客户",
-      //   component: () => import("@/views/custom_manage/customList/editCustom.vue"),
-      //   hidden: true,
-      //   meta: {
-      //     pathFrom: "customList",
-      //     pathName: "客户列表",
-      //     keepAlive: false,
-      //   },
-      // },
+      {
+        path: "addCustom",
+        name: "addCustom",
+        component: () => import("@/views/custom_manage/custom/addCustom.vue"),
+        hidden: true,
+        meta: {
+          title: '新增客户',
+          pathFrom: "customList",
+          pathName: "客户列表",
+          keepAlive: false,
+        },
+      },
+      {
+        path: "editCustom",
+        name: "editCustom",
+        component: () => import("@/views/custom_manage/custom/editCustom.vue"),
+        hidden: true,
+        meta: {
+          title: '编辑客户',
+          pathFrom: "customList",
+          pathName: "客户列表",
+          keepAlive: false,
+        },
+      },
       {
         path: "addCustomEn",
         component: () => import("@/views/custom_manage/customEn/editCustomEn.vue"),

+ 440 - 43
src/views/custom_manage/custom/addCustom.vue

@@ -1,5 +1,426 @@
 <script setup>
-import { ref } from 'vue'
+import { computed, reactive, ref, watch } from 'vue'
+import { customInterence } from '@/api/api.js'
+import country from "@/utils/countryData"
+import Contactdia from './components/Contactdialog.vue'
+import { useList } from './hooks/customlistHook'
+import { useRouter } from 'vue-router'
+import { ElMessage } from 'element-plus'
+// import autocomplete from "@/components/autocomplete.vue";
+import searchDistPicker from '@/components/searchDistPicker.vue';
+
+const $router = useRouter()
+const { Role,RoleType } = useList()
+
+const countryData = country;
+const typeArr = computed(() => {
+	let type = localStorage.getItem('RoleType') || '';
+	if(type == 'ficc') {
+		return ['ficc']
+	}else if(type == '权益') {
+		return ['权益']
+	}else {
+		return ['ficc','权益']
+	}
+})
+
+const formRule = {
+	/* 客户名称 */
+	custom_name:[
+		{ required: true, message: '公司全称不能为空', trigger: 'change' },
+	],
+	/* 社会信用码 */
+	code:[
+		{ required: true, message: '社会信用码不能为空', trigger: 'blur' },
+	],
+	/* 客户状态 */
+	cuStatus:[
+		{ required: true, message: '客户状态不能为空', trigger: 'blur' },
+	],
+	/* 客户类型 */
+	custype:[
+		{ required: true, message: '客户类型不能为空', trigger: 'blur' },
+	],
+	/* 行业 */
+	trade:[
+		{ required: true, message: '行业不能为空', trigger: 'blur' },
+	],
+	/* 客户来源 */
+	from:[
+		{ required: true, message: '客户来源不能为空', trigger: 'blur' },
+	],
+	/* 销售 */
+	sales:[
+		{ required: true, message: '所属销售不能为空', trigger: 'blur' },
+	],
+	/* 备注 */
+	// addreason:[
+	// 	{ required: true, message: '备注不能为空', trigger: 'blur' },
+	// ],
+}
+const optionsMoney = [
+	{value:'1',label:'50亿以下'},
+	{value:'2',label:'50~100亿'},
+	{value:'3',label:'100亿以上'}
+]
+const diaform = {
+	name:'',
+	sex:1,
+	telCode:'86',
+	tel1:'',
+	tel2:'',
+	mail:'',
+	post:'',
+	desiger:'',
+	depart:'',
+	carte:'',
+	mailQY:'',
+	telQY:'',
+	Source:'add_custom',
+}
+
+
+const fromArr = ref([])
+/* 获取客户来源数据 */
+function getCustomerSourceList(){
+	customInterence.customerSourceList({}).then(res=>{
+		if(res.Ret===200){
+			fromArr.value=res.Data.List
+		}
+	})
+}
+getCustomerSourceList()
+
+
+const salesArr = ref([])
+/* 获取销售 */
+function getSale() {
+	customInterence.saleslist().then(res => {
+		if(res.Ret === 200) {
+			salesArr.value = res.Data.List;
+		}
+	})
+}
+getSale()
+
+const dataForm = reactive({
+	area:'国内',
+	custom_name:'',
+	code:'',
+	province:'',
+	city:'',
+	cuStatus:'试用',
+	custype:typeArr.value[0]||'',
+	trade:'',
+	from:'',
+	sales:Number(localStorage.getItem('AdminId')) || 0,
+	addreason:'',
+	money:''
+})
+const companyList = ref([])
+const checkCompanyfocusIs = ref(false) 
+const isCheckCompanyInfo = ref(false) //
+const isCheck = ref(false)//检查客户弹窗
+const repeatId = ref('')//重复公司id
+const repeatName = ref('')//重复公司类型
+const nameRepeat = ref(false)
+const codeRepeat = ref(false)
+const codeDisable = ref(false)//是否可编辑社会信用码国内可
+const inquireSuccess = ref(false)
+/* 获取客户名称 */
+function getCompany(query) {
+	if(query) {
+		customInterence.companySearch({
+			KeyWord:query
+		}).then(res =>{
+			if(res.Ret === 200) {
+				let arr = [];
+				if(res.Data.List) {
+					res.Data.List.forEach(item => {
+						let obj = {
+							...item,
+							value:item.CompanyName
+						}
+						arr.push(obj)
+					})
+				}
+				companyList.value = arr;
+			}
+		})
+	}else {
+		companyList.value = []
+	}
+}
+function checkCompanyfocus(){
+	checkCompanyfocusIs.value =true;
+	setTimeout(() => {
+	checkCompanyfocusIs.value =false;
+	},500)
+}
+/* 客户名称/信用码失焦时校验客户名称是否存在 存在就提示 */
+function checkCompany() {	
+	setTimeout(()=>{
+	if(checkCompanyfocusIs.value) return
+	if((!dataForm.custom_name && !dataForm.code) || (isCheckCompanyInfo.value && dataForm.custom_name)) return
+		customInterence.checkCompanyInfo({
+		CompanyName:dataForm.custom_name,
+		CreditCode:dataForm.code
+	}).then(res =>{
+		if(res.Ret === 200){
+			if(res.Data.RepeatStatus > 0) {
+				repeatId.value = res.Data.CompanyId;
+				repeatName.value = res.Data.ProductName;
+				nameRepeat.value = res.Data.RepeatStatus
+				codeRepeat.value = res.Data.Status
+				isCheck.value = true;
+			}else {
+				nameRepeat.value = 0
+				isCheck.value = false;
+			}
+		}
+	})
+	},500)
+}
+/* 关闭检查弹窗 */
+function closeDia() {
+	repeatId.value = '';
+	repeatName.value = '';
+	isCheck.value = false;
+}
+async function callbackHandle(data,cb) {
+	if (data) {
+		isCheckCompanyInfo.value =true
+		cb([]);
+		let res = await customInterence.companyQccSearch({ KeyWord: data});
+		if (res.Ret === 200) {
+			isCheckCompanyInfo.value =false;
+			if (res.Data && res.Data.length > 0) {
+				let arr = res.Data.map((item) => {
+				return { value:item.Name, ...item };
+				});
+				cb(arr);
+			}else{
+				cb([{}]);
+				checkCompany()
+			}	
+		}	
+	}
+}
+//选中后增加社会信用码
+function customNameSelect(value) {
+	dataForm.code = value.CreditCode
+	inquireSuccess.value = true;
+	setTimeout(async()=>{
+			checkCompany()
+	},10)
+}
+
+
+watch(
+	() => dataForm.area,
+	(newval) => {
+		if(newval == '海外') {
+			codeDisable.value = true;
+			dataForm.code = 'HZ' + new Date().getTime();
+			dataForm.province='海外'
+			setTimeout(()=>{
+				dataForm.city='其它市'
+			},0)
+		}else {
+			codeDisable.value = false;
+			dataForm.code = '';
+			dataForm.province=''
+			dataForm.city=''
+		}
+	},
+	{
+		deep: true
+	}
+)
+watch(
+	() =>dataForm.custype,
+	() => {
+		getIndustry();
+		getAuthBasic()
+	},
+	{
+		deep:true
+	}
+)
+
+const authList = ref([])//权限列表
+/* 获取基本权限信息 */
+function getAuthBasic() {
+	customInterence.authList({
+		CompanyType:dataForm.custype,
+		NoUpgrade:true
+	}).then(res => {
+		if(res.Ret === 200) {
+			let newArr = [];
+			res.Data.List.length&&res.Data.List.forEach(item => {
+				item.Items=item.Items||[]
+				const temarr=item.Items?item.Items.filter(_e=>_e.IsPublic==1):[]
+				let obj = {
+					...item,
+					// 修改为通过公有私有判断
+					checkAll:item.Items.length>0?temarr.length==item.Items.length:false,
+					isIndeterminate:item.Items.length>0?temarr.length==item.Items.length?false:item.Items.some(_e=>_e.IsPublic==1):false,
+					CheckList:item.CheckList||[],
+					
+				}
+				newArr.push(obj)
+			})
+			authList.value = newArr;
+		
+		}
+	})
+}
+getAuthBasic()
+const tradeArr = ref([])//行业分类
+/* 根据类型获取行业 */
+function getIndustry() {
+	customInterence.getindustry({
+		Classify:dataForm.custype
+	}).then(res => {
+		if(res.Ret === 200) {
+			tradeArr.value = res.Data.List || [];
+		}
+	})
+}
+getIndustry()
+
+
+//控制权限设置是否禁用编辑
+function setSelectPerDisabled(data){
+	const arr=data.Items?data.Items.filter(_e=>_e.IsPublic==1):[]
+	return arr.length==data.Items.length
+}
+
+/* 去领取 */
+function goPickHandle() {
+	$router.push({
+		path:'/customSearch',
+		query:{
+			name: nameRepeat.value == 2 ? dataForm.custom_name :'',
+			code: nameRepeat.value == 1 ?  dataForm.code : '' 
+		}
+	})
+}
+
+
+const dataFormRef = ref(null)
+const regionType = ref('')
+const isAddContact = ref(false)//添加联系人
+const companyId = ref('')
+/* 保存 */
+function saveHandle() {
+	dataFormRef.value.validate((valid) => {
+		if (valid) {
+			if(nameRepeat.value){
+				ElMessage.warning('客户已存在,请重新填写!')
+				return
+			}
+			if(codeRepeat.value){
+				ElMessage.warning('社会信用码已存在!')
+				return
+			}
+
+			regionType.value=dataForm.area
+			isAddContact.value = true;
+		}
+	}
+)}
+
+function canceldialog(type,id) {
+	isAddContact.value = false;
+	if(type == 1) {
+		/* 新增联系人之后在新增客户 */
+		let checkArr = [];
+		authList.value.forEach(item => {
+			if(item.CheckList.length) {
+				checkArr.push(item.CheckList)
+			}
+		})
+		let PermissionIds = checkArr.flat(2).join(',');
+		
+		let params = {
+			RegionType:dataForm.area,
+			CompanyName:dataForm.custom_name,
+			CreditCode:dataForm.code,
+			Province:dataForm.province,
+			City:dataForm.city,
+			Status:dataForm.cuStatus,
+			CompanyType:dataForm.custype,
+			IndustryId:dataForm.trade,
+			Source:dataForm.from,
+			SellsId:dataForm.sales,
+			Reasons:dataForm.addreason,
+			PermissionIds,
+			Scale:dataForm.money,
+			UserId:Number(id),
+			Nation:dataForm.area==='海外'?dataForm.Nation:''
+		}
+		customInterence.customAdd(params).then(res => {
+			if(res.Ret === 200) {
+				companyId.value = res.Data.CompanyId;
+				
+				$router.replace({
+					path:'/customDetail',
+					query:{
+						id:companyId.value
+					}	
+				})
+			}
+		})
+	}else {
+		ElMessage.warning('新增失败')
+	}
+}
+
+
+/* 选择行业先校验是否选择了客户类型提示  */
+function slideTrade(e) {
+	if(!dataForm.custype) {
+		ElMessage.warning('请先选择客户类型!')
+	}
+}
+
+/* 地区选择 */
+function selectRegion(data) {
+	dataForm.province = data.province.value;
+	dataForm.city = data.city.value =='市'?'':data.city.value;
+}
+
+//选地地区时 选则的省份改变重置city为空
+function provinceChange(){
+	dataForm.city=''
+}
+
+/* 选择全选或取消全选 */
+function handleCheckAll(item) {
+	// 取到所有的子菜单id
+
+	//获取公有的id合集
+	let publicIds=[]
+
+	
+	let ids = item.Items.map(item =>{
+		if(item.IsPublic==1){
+			publicIds.push(item.ChartPermissionId)
+		}
+		return item.ChartPermissionId
+	})
+	item.CheckList = item.checkAll ? ids : publicIds;	
+			item.isIndeterminate = publicIds.length>0&&!item.checkAll?true:false;
+}
+
+/* 复选框組选中时 */
+function handleChecked(item) {
+	let len = item.CheckList.length;
+	item.checkAll = len === item.Items.length;
+	item.isIndeterminate = len > 0 && len < item.Items.length;
+}
+
 
 </script>
 <template>
@@ -10,49 +431,26 @@ import { ref } from 'vue'
 		:model="dataForm" 
 		:rules="formRule"
 		hide-required-asterisk
-		ref="dataForm" 
+		ref="dataFormRef" 
 		label-width="100px"
 		class="demo-ruleForm">
 			<el-form-item label="所属区域" prop="cuStatus" style="marginRight:120px;">
 				<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
-				<el-radio-group v-model="dataForm.area" size="medium" style="width:400px;">
+				<el-radio-group v-model="dataForm.area" size="default" style="width:400px;">
 					<el-radio border label="国内"  style="width:184px;"></el-radio>
 					<el-radio border label="海外" style="width:184px;marginLeft:0;"></el-radio>
 				</el-radio-group>
 			</el-form-item>
 			<el-form-item label="客户全称" prop="custom_name">
 				<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
-				<!-- <el-autocomplete
+				<el-autocomplete
 				v-model="dataForm.custom_name"
 				:fetch-suggestions="callbackHandle"
 				placeholder="请输入公司全称"
 				@input="getCompany(dataForm.custom_name)"
 				@blur="checkCompany(dataForm.custom_name,'')"
 				style="width:400px"
-				clearable></el-autocomplete> -->
-				  <autocomplete
-						ref="auto"
-						v-model="dataForm.custom_name"
-						:fetch-suggestions="callbackHandle"
-						placeholder="请输入公司全称"
-						@blur="checkCompany"
-						@select="customNameSelect"
-						@focus="checkCompanyfocus"
-						:disabled='inquireSuccess'
-						clearable
-						value-key="value"
-						style="width:400px"
-						:popper-class="isCheck?'el-autocomplete-none':'el-autocomplete-suggestion-data-entry'"
-						class="autocomplete-input"
-						>
-					<span v-if="dataForm.custom_name.length > 3" style="color:#409EFF;cursor: pointer;" slot="suffix"  @click="$refs.auto.search(dataForm.custom_name)"> 查询</span>
-						<template slot-scope="scope">
-						<div  v-if="scope.item.KeyNo" >
-							{{scope.item.Name}}
-						</div>
-						<div v-else style="text-align:center">暂无数据</div>		 
-						</template>
-				</autocomplete>
+				clearable></el-autocomplete>
 			</el-form-item>
 			<el-form-item label="社会信用码" prop="code" style="marginRight:120px;">
 				<i style="color:#f00;fontSize:20px;position:absolute;left:-106px;top:10%;">*</i>
@@ -86,7 +484,7 @@ import { ref } from 'vue'
 			</el-form-item>
 			<el-form-item label="客户状态" prop="cuStatus" style="marginRight:120px;">
 				<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
-				<el-radio-group v-model="dataForm.cuStatus" size="medium" style="width:400px;">
+				<el-radio-group v-model="dataForm.cuStatus" size="default" style="width:400px;">
 					<el-radio border label="试用"  style="width:184px;">试用(2个月)</el-radio>
 					<el-radio border label="永续" style="width:184px;marginLeft:0;" v-if="Role=='admin'">永续</el-radio>
 				</el-radio-group>
@@ -105,14 +503,12 @@ import { ref } from 'vue'
 			<el-form-item label="客户类型" prop="custype" style="marginRight:120px;">
 				<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
 				<el-select v-model="dataForm.custype" placeholder="请选择客户类型" style="width:400px;">
-					<template>
 						<el-option
 							v-for="item in typeArr"
 							:key="item"
 							:label="item"
 							:value="item">
 						</el-option>
-					</template>
 				</el-select>
 			</el-form-item>
 			<el-form-item label="行业" prop="trade">
@@ -171,16 +567,16 @@ import { ref } from 'vue'
 		</div>
 		<!-- 添加联系人弹窗 -->
 		<Contactdia
-		:id="companyId"
-		:title="'新增联系人'"
-		:userForm="diaform"
-		:custom_name="dataForm.custom_name"
-		:isShowclose="isShowclose"
-		:isAddContact="isAddContact"
-		:regionType="regionType"
-		:isAddUser="true"
-		:needCard="true"
-		@cancel="canceldialog">
+			:id="companyId"
+			:title="'新增联系人'"
+			:userForm="diaform"
+			:custom_name="dataForm.custom_name"
+			:isShowclose="false"
+			:isAddContact="isAddContact"
+			:regionType="regionType"
+			:isAddUser="true"
+			:needCard="true"
+			@cancel="canceldialog">
 		</Contactdia>
 		<!-- 检查客户弹窗 -->
 		<el-dialog
@@ -231,20 +627,21 @@ import { ref } from 'vue'
 		width: 100%;
 	}
 	.el-checkbox-group {
-		height: 40px;
+		min-height: 40px;
 	}
 	:deep(.distpicker-address-wrapper) select {
 		width: 198px;
 	}
 	/*  */
 	.menu_lists {
+		width: 100%;
 		padding: 40px 18px;
 		border: 1px dashed #AAB4CC;
 		border-radius: 4px;
 		.menu_item {
 			display: flex;
 			// align-items: center;
-			margin-bottom: 40px;
+			margin-bottom: 20px;
 			&:last-child {
 				margin-bottom: 0;
 			}

+ 180 - 0
src/views/custom_manage/custom/components/CheckToDoDialog.vue

@@ -0,0 +1,180 @@
+<script setup>
+import { ref, watch } from 'vue'
+import { customInterence } from '@/api/api.js'
+import moment from 'moment'
+
+const props = defineProps({
+  ischeckToDoDialogShow: {
+    type: Boolean,
+    default: false,
+  },//控制弹窗展示
+  todoInfo: {
+    type: Object,
+  },//todo的info
+})
+const emit = defineEmits(['close','change'])
+
+watch(
+  () => props.ischeckToDoDialogShow,
+  (newval) => {
+    if(!newval) return 
+      //获取历史记录
+      customInterence.getHistory({
+        CompanyId:props.todoInfo.CompanyId
+      }).then(res=>{
+        if(res.Ret===200){
+          todoData.value = res.Data
+        }
+      })
+      //获取最新记录
+      customInterence.getToDoItem({
+          CompanyId:props.todoInfo.CompanyId
+        }).then(res=>{
+          if(res.Ret===200&&res.Data){
+            textarea.value = res.Data[0].Content
+            todoId.value = res.Data[0].Id
+            remake.value = res.Data[0].Remark||''
+          }
+      })
+  }
+)
+
+
+const textarea = ref("") //任务描述
+const remake = ref("")//任务备注
+const activeTab = ref(1)
+const todoData = ref([])//表格数据
+const todoId = ref(0)//任务的id
+function closeDia(type) {
+    if(type==='confirm'){
+    emit('check',{Id:todoId.value,Remark:remake.value})
+  }else{
+    emit("close");
+  }
+  textarea.value= ""
+  remake.value=""
+  todoData.value=[]
+  todoId.value=0
+}
+
+function isLast(info){
+  if(info.$index===todoData.value.length-1){
+    return true
+  }else{
+    return false
+  }
+}
+
+</script>
+
+<template>
+   <el-dialog
+    v-if="ischeckToDoDialogShow"
+    :model-value="ischeckToDoDialogShow"
+    :close-on-click-modal="false"
+    :modal-append-to-body="false"
+    @close="closeDia"
+    width="889px"
+    draggable
+    center
+  >
+    <template #header>
+      <div style="display: flex; alignitems: center">
+        <span style="fontsize: 16px"
+          >{{ todoInfo ? todoInfo.CompanyName : "" }}——任务审核详情</span
+        >
+      </div>
+    </template>
+    <div class="dialog-container">
+      <div class="input-container">
+        <span>任务描述:</span>
+        <el-input
+          type="textarea"
+          disabled
+          :rows="2"
+          resize="none"
+          v-model="textarea"
+        >
+        </el-input>
+      </div>
+      <div class="input-container">
+        <span>备注:</span>
+        <el-input
+          type="textarea"
+          placeholder="请输入备注"
+          :rows="2"
+          resize="none"
+          v-model="remake"
+        >
+        </el-input>
+      </div>
+    </div>
+    <div class="foot-container">
+      <el-button type="primary" @click="closeDia('confirm')">确 定</el-button>
+      <el-button @click="closeDia('cancel')">取 消</el-button>
+    </div>
+    <div class="table-container">
+        <el-table
+			:data="todoData"
+      v-if="todoData"
+			border
+			max-height="300"
+			style="width: 100%; margin-top: 20px;margin-bottom: 20px">
+            <el-table-column label="任务描述" align="center" prop="Content">
+              <template #default="scope">
+                {{scope.row['Content']||'--'}}
+              </template>
+            </el-table-column>
+            <el-table-column label="创建时间" align="center" prop="CreateTime" :min-width="120">
+              <template #default="{row}">
+                  <span>
+                   {{row['CreateTime']==='0001-01-01T00:00:00Z'?'':moment(row['CreateTime']).format('YYYY-MM-DD HH:mm:ss')}}
+                  </span>
+              </template>
+            </el-table-column>
+            <el-table-column label="截止日期" align="center" prop="EndTimeStr" :min-width="120">
+              <template #default="scope">
+                  <span :style="{color:isLast(scope)&&scope.row['EndTimeStr']?'red':'#606266'}">
+                   {{scope.row['EndTimeStr']||'--'}}
+                  </span>
+              </template>
+            </el-table-column>
+            <el-table-column label="备注" align="center" prop="Remark" :min-width="120">
+              <template #default="scope">
+                  <span>
+                   {{scope.row['Remark']||'--'}}
+                  </span>
+              </template>
+            </el-table-column>
+        </el-table>
+    </div>
+  </el-dialog>
+</template>
+
+
+<style lang="scss" scoped>
+  .dialog-container {
+    .input-container {
+      display: flex;
+      align-items: center;
+      font-size: 16px;
+      margin-bottom: 30px;
+      span{
+        width:80px;
+        font-size: 14px;
+      }
+      .el-textarea {
+        font-size: 16px;
+      }
+    }
+  }
+  .foot-container {
+    display: flex;
+    justify-content: center;
+    margin-bottom: 20px;
+     .el-button {
+      width: 224px;
+      height: 40px;
+    }
+  }
+</style>

+ 1 - 1
src/views/custom_manage/custom/components/CpessionTable.vue

@@ -1,5 +1,5 @@
 <script setup>
-import { reactive, ref } from 'vue'
+import { reactive, ref,nextTick } from 'vue'
 
 const props = defineProps({
   	authList: {

+ 132 - 0
src/views/custom_manage/custom/components/HistoryToDoDialog.vue

@@ -0,0 +1,132 @@
+<script setup>
+import { customInterence } from '@/api/api.js'
+import moment from 'moment'
+import { watch,ref } from 'vue'
+
+const props = defineProps({
+  isHistoryDialogShow: {
+    type: Boolean,
+    default: false,
+  },//控制弹窗展示
+  todoInfo: {
+    type: Object,
+  },//todo的info
+})
+const emit = defineEmits(['close'])
+
+watch(
+  () =>props.isHistoryDialogShow,
+  (newval) => {
+     if(!newval) return 
+      //获取历史记录
+      customInterence.getHistory({
+        CompanyId:props.todoInfo.CompanyId
+      }).then(res=>{
+        if(res.Ret===200&&res.Data){
+          todoData.value = res.Data
+        }
+      })
+  }
+)
+
+const todoData = ref([])//表格数据
+const tableLabel = [
+    {
+        label:'任务描述',
+        key:'Content',
+        widthsty:150
+    },
+    {
+        label:'客户类型',
+        key:'ProductId',
+        widthsty:80
+    },
+    {
+        label:'创建人',
+        key:'CreateUserName'
+    },
+    {
+        label:'创建时间',
+        key:'CreateTime',
+        minwidthsty:150
+    },
+    {
+        label:'截止日期',
+        key:'EndTimeStr',
+        minwidthsty:120
+    },
+    {
+        label:'备注',
+        key:'Remark',
+        widthsty:150
+    },
+    {
+        label:'审核人',
+        key:'ApproveUserName'
+    },
+    {
+        label:'审核时间',
+        key:'ApproveTime',
+        minwidthsty:150
+    }
+]
+
+
+function closeDia() {
+  todoData.value=[]
+  emit("close");
+}
+
+
+</script>
+
+<template>
+  <el-dialog
+    v-if="isHistoryDialogShow"
+    :model-value="isHistoryDialogShow"
+    :close-on-click-modal="false"
+    :modal-append-to-body="false"
+    @close="closeDia"
+    width="1020px"
+    draggable
+    center
+  >
+    <template #header>
+      <div style="display: flex; align-items: center">
+        <span style="fontsize: 16px"
+          >{{ todoInfo ? todoInfo.CompanyName : "" }}——任务历史记录</span
+        >
+      </div>
+    </template>
+    <div class="dialog-container">
+        <div class="table-container">
+            <el-table
+                v-if="todoData"
+                :data="todoData"
+                border
+                max-height="600"
+                style="width: 100%; margin-bottom: 20px">
+                <el-table-column align="center"
+                    v-for="item in tableLabel" :key="item.key"
+                    :label="item.label"
+                    :prop="item.prop"
+                    :width="item.widthsty" 
+                    :min-width="item.minwidthsty"
+                >
+                <template #default="{row}">
+                  <span v-if="['CreateTime','ApproveTime'].includes(item.key)">
+                   {{row[item.key]==='0001-01-01T00:00:00Z'?'--':moment(row[item.key]).format('YYYY-MM-DD HH:mm:ss')}}
+                  </span>
+                  <span v-else-if="item.key==='ProductId'">{{row[item.key]===1?'ficc':'权益'}}</span>
+                  <span v-else>{{row[item.key]||'--'}}</span>
+                </template>
+                </el-table-column>
+            </el-table>
+        </div>
+    </div>
+  </el-dialog>
+</template>
+
+
+<style>
+</style>

+ 273 - 0
src/views/custom_manage/custom/components/ModifyToDoDialog.vue

@@ -0,0 +1,273 @@
+<script setup>
+import { customInterence } from '@/api/api.js'
+import { ElMessage } from 'element-plus'
+import { computed, watch,ref } from 'vue'
+
+const props = defineProps({
+  type:{
+    type:String,
+    default:'add'
+  },//是新增还是修改
+  isModifyDialogShow: {
+    type: Boolean,
+    default: false,
+  },//控制弹窗展示
+  todoInfo: {
+    type: Object,
+  },//todo的info
+})
+const emit = defineEmits(['close','modify'])
+
+
+const Role = computed(()=> {
+  return localStorage.getItem("Role");
+})
+const isTabsShow = computed(()=>{
+  if(Role.value==='admin'&&props.todoInfo.IsShared&&props.type==='add'){
+    return true
+  }else{
+    return false
+  }   
+})
+const ProductId = computed(()=>{
+  if(props.todoInfo.IsShared){
+    return activeTab.value
+  }else{
+    return props.todoInfo.CompanyType==='ficc'?1:2
+  }
+  
+})
+
+watch(
+  () =>props.isHistoryDialogShow,
+  (newval) => {
+     if(props.type==='edit'&&newval){
+        //获取最新记录
+        customInterence.getToDoItem({
+          CompanyId:props.todoInfo.CompanyId
+        }).then(res=>{
+          if(res.Ret!==200) return
+
+          if(!props.todoInfo.IsShared){
+           textarea.value = res.Data[0].Content
+           modiDate.value = res.Data[0].EndTimeStr
+           todoId.value = res.Data[0].Id
+           editTabs.value=[]
+          }else{
+           todoList.value = res.Data
+            if(this.todoList.value.length>1){
+             editTabs.value =Tabs.value
+            }else{
+             editTabs.value = Tabs.value.filter(i=>i.key===todoList.value[0].ProductId)
+            }
+            if(Role.value!=='admin'){
+              editTabs.value=[]
+            }
+            activeTab.value = res.Data[0].ProductId
+            textarea.value = res.Data[0].Content
+            modiDate.value = res.Data[0].EndTimeStr
+            todoId.value = res.Data[0].Id
+          }  
+          
+        })
+      }
+  }
+)
+
+const pickerOptions = {
+    disabledDate(time) {
+      return time.getTime() < Date.now() - 24*60*60*1000;
+    }
+}
+
+const Tabs = ref([
+  {
+    label: "FICC任务",
+    key: 1,
+    textarea: "FiccTextarea",
+  },
+  {
+    label: "权益任务",
+    key: 2,
+    textarea: "qyTextarea",
+  },
+]) //任务类型
+const textarea = ref("") //任务描述
+const FiccTextarea = ref("") //ficc任务描述
+const qyTextarea = ref("") //权益任务描述
+const activeTab = ref(1)
+const todoId = ref(0)//编辑时有用,任务的id
+const todoList = ref(null)//编辑时有用,任务的列表
+const editTabs = ref([])
+const modiDate = ref(null)//截止时间
+
+function closeDia(type) {
+  if(type==='confirm'){
+    if(!checkInput()) return
+    emit('modify',{
+      type:props.type,
+      Description:textarea.value,
+      ProductId:ProductId.value,
+      CompanyId:props.todoInfo.CompanyId,
+      Id:todoId.value,
+      EndTime:modiDate.value
+    })
+    textarea.value=''
+    modiDate.value=null
+    activeTab.value=1
+    editTabs.value=[]
+  }else{
+    activeTab.value=1
+    textarea.value=''
+    modiDate.value=null
+    editTabs.value=[]
+    emit("close");
+  }
+}
+
+
+function changeTabs({ key, textarea }) {
+  if (key === activeTab.value) return;
+  activeTab.value = key;
+  if(props.type==='add'){
+    textarea.value = "";
+    modiDate.value=null
+  }else{
+    textarea.value = todoList.value.filter(i=>i.ProductId===key)[0].Content
+    modiDate.value = todoList.value.filter(i=>i.ProductId===key)[0].EndTimeStr
+    todoId.value = todoList.value.filter(i=>i.ProductId===key)[0].Id
+  }     
+}
+
+
+function checkInput(){
+  let flag = true
+  if(!textarea.value.length){
+      ElMessage.error('请输入任务描述')
+      flag = false
+  }else if(props.type==='add'&!modiDate.value){
+    ElMessage.error('请输入截止时间')
+    flag=false
+  }
+  return flag
+}
+
+</script>
+
+<template>
+  <el-dialog
+    v-if="isModifyDialogShow"
+    :model-value="isModifyDialogShow"
+    :close-on-click-modal="false"
+    :modal-append-to-body="false"
+    @close="closeDia"
+    width="889px"
+    draggable
+    center
+  >
+    <template #header>
+      <div style="display: flex; align-items: center">
+        <span style="fontsize: 16px"
+          >{{ todoInfo ? todoInfo.CompanyName : "" }}——任务详情</span
+        >
+      </div>
+    </template>
+    <div class="dialog-container">
+      <div class="tabs" v-if="isTabsShow">
+        <span
+          class="tab-item"
+          v-for="item in Tabs"
+          :key="item.key"
+          @click="changeTabs(item)"
+          :style="activeTab === item.key ? 'color:#409EFF;' : ''"
+          >{{ item.label }}</span
+        >
+      </div>
+      <div class="tabs" v-if="type==='edit'">
+        <span
+          class="tab-item"
+          v-for="item in editTabs"
+          :key="item.key"
+          @click="changeTabs(item)"
+          :style="activeTab === item.key ? 'color:#409EFF;' : ''"
+          >{{ item.label }}</span
+        >
+      </div>
+      <div class="input-container">
+        <div class="input-item">
+          <span>*</span>
+          <el-input
+            type="textarea"
+            :rows="12"
+            placeholder="请输入任务描述"
+            v-model="textarea"
+            required
+          >
+        </el-input>
+        </div>
+        <!-- v-if="type==='add'" -->
+        <div class="input-item">
+          <span>*</span>
+          <el-date-picker
+            v-model="modiDate"
+            type="date"
+            format="yyyy-MM-dd"
+            value-format="yyyy-MM-dd"
+            :picker-options="pickerOptions"
+            placeholder="截止日期">
+          </el-date-picker>
+        </div>
+      </div>
+    </div>
+    <div class="foot-container">
+      <el-button type="primary" @click="closeDia('confirm')">确 定</el-button>
+      <el-button @click="closeDia('cancel')">取 消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+
+<style scoped lang="scss">
+  .dialog-container {
+    .tabs {
+      margin-bottom: 10px;
+      .tab-item {
+        font-size: 14px;
+        color: #999999;
+        cursor: pointer;
+        margin-right: 20px;
+      }
+    }
+    .input-container {
+      font-size: 16px;
+      margin-bottom: 30px;
+      .el-textarea {
+        font-size: 16px;
+      }
+      .input-item{
+        display: flex;
+        margin-bottom:20px;
+        font-size: 14px;
+        span{
+          color: red;
+          margin-right: 5px;
+          &.time{
+            margin-left: 5px;
+            align-self: center;
+          }
+          &.empty{
+            color: #606266;
+          }
+        }
+      }
+      
+    }
+  }
+  .foot-container {
+    margin-bottom: 20px;
+    .el-button {
+      width: 224px;
+      height: 40px;
+    }
+  }
+</style>

+ 1076 - 2
src/views/custom_manage/custom/customAllList.vue

@@ -1,10 +1,1084 @@
 <script setup>
-import { ref } from 'vue'
+import { ref,computed, watch } from 'vue'
+import { Search } from '@element-plus/icons-vue'
+import { useRoute,useRouter,onBeforeRouteLeave } from 'vue-router'
+import {customInterence} from '@/api/api.js'
+import{customAllInterence} from '@/api/modules/crmApi.js'
+import {locationOptions} from "./location"
+import DatePicker from "vue-datepicker-next";
+import { useViewPermissionDia,useList,useViewRoadShowDia,useLookTrialDia  } from "./hooks/customlistHook";
+import TotalDayDialog from './components/TotalDayDialog.vue'
+import AccumulativeFrequencyDlg from './components/accumulativeFrequencyDlg.vue'
+import permissionView from './components/premissionView.vue'
+import moment from 'moment'
+import { ElMessage } from 'element-plus'
+
+const $router = useRouter()
+const $route = useRoute()
+
+//导出客户
+const exportUrlDl = computed(() => {
+		let url = import.meta.env.VITE_APP_API_ROOT+'/custom/export';
+		/* 处理品种结构 */
+		let param_arr = [];
+		let param_arr_red = []
+		//已购权限
+		if(variety.value.length) {
+			param_arr = variety.value.map(item => {
+				return item[1];
+			})
+		}
+		//阅读权限
+		if(variety_red.value.length){
+				param_arr_red = variety_red.value.map(item => {
+						return item[1]
+				})
+		}
+		let param_token = localStorage.getItem('auth')||'';
+		let param_variety = param_arr.join(',');
+					let param_variety_red = param_arr_red.join(',')
+
+		let param_saleArr = sales.value.length? sales.value.map(item=>{
+				return item[item.length-1]
+			}):[];
+		let param_sale = param_saleArr.length ? param_saleArr.join(',') : ''
+		let param_trade = trade.value?Number(trade.value):'';
+		let param_package = setmealSelect.value ? Number(setmealSelect.value) : 0
+		return `${url}?Status=${act_status.value}`+
+              `&IsFullCompany=1`+
+							`&CompanyType=${type.value}`+
+							`&PackageType=${param_package}`+
+							`&IndustryId=${param_trade}`+
+							`&AdminId=${param_sale}`+
+							`&Province=${provinceValue.value}`+
+							`&City=${cityValue.value}`+
+							`&ChartPermissionIds=${param_variety_red}`+
+							`&ContractPermissionIds=${param_variety}`+
+							`&StartDate=${start_date.value}`+
+							`&EndDate=${end_date.value}`+
+							`&CreateStartDate=${createdate.value.length ? createdate.value[0]:''}`+
+							`&CreateEndDate=${createdate.value.length ? createdate.value[1]:''}`+
+							`&KeyWord=${search_txt.value}&${param_token}`
+})
+//导出联系人
+const exportUserDl = computed(() => {
+	let url = import.meta.env.VITE_APP_API_ROOT+'/custom/user/export';
+	/* 处理品种结构 */
+	let param_arr = [];
+	let param_arr_red = []
+				//已购品种
+	if(variety.value.length) {
+		param_arr = variety.value.map(item => {
+			return item[1];
+		})
+	}
+	//阅读权限
+	if(variety_red.value.length){
+			param_arr_red = variety_red.value.map(item => {
+					return item[1]
+			})
+	}
+	let param_token = localStorage.getItem('auth')||'';
+	let param_variety = param_arr.join(',');
+	let param_variety_red = param_arr_red.join(',')
+
+	let param_saleArr = sales.value.length? sales.value.map(item=>{
+			return item[item.length-1]
+		}):[];
+	let param_sale = param_saleArr.length ? param_saleArr.join(',') : ''
+	let param_trade = trade.value?Number(trade.value):'';
+	let param_package = setmealSelect.value ? Number(setmealSelect.value) : 0
+	return `${url}?Status=${act_status.value}`+
+            `&IsFullCompany=1`+
+						`&CompanyType=${type.value}`+
+						`&Province=${provinceValue.value}`+
+						`&City=${cityValue.value}`+
+						`&PackageType=${param_package}`+
+						`&IndustryId=${param_trade}`+
+						`&AdminId=${param_sale}`+
+						`&ChartPermissionIds=${param_variety_red}`+
+						`&ContractPermissionIds=${param_variety}`+
+						`&StartDate=${start_date.value}`+
+						`&EndDate=${end_date.value}`+
+						`&CreateStartDate=${createdate.value.length ? createdate.value[0]:''}`+
+						`&CreateEndDate=${createdate.value.length ? createdate.value[1]:''}`+
+						`&KeyWord=${search_txt.value}&${param_token}`
+})
+
+
+const typeArr = [{
+    name: 'ficc'
+}, {
+    name: '权益'
+}] //类型
+const setmealArr = [{
+    name: '大套餐',
+    id: 1
+}, {
+    name: '小套餐',
+    id: 2
+}]
+const trialTags = [ 
+  {
+    label: '推进',
+    value: 2
+  },
+  {
+    label: '跟踪',
+    value: 3
+  },
+  {
+    label: '预备',
+    value: 4
+  },
+  {
+    label: '未分类',
+    value: 1
+  },
+]// 试用的标签状态
+const	areaArr = [{name:'国内'},{name:'海外'}]
+
+const { 
+  suspendHandle,
+  editHandle,
+  Role,
+  RaiSellerRole,
+  RoleType,
+  RoleIdentity,
+  SellerAdminId,
+} = useList();
+
+
+const tabs =  ref([])
+const act_status = ref('全部') //状态
+const type = ref('') //类型
+const setmealSelect = ref('') //套餐的选择
+const trade = ref('')
+const sales = ref('')
+const variety = ref([]) //已购品种
+const variety_red = ref([]) //阅读权限
+const date = ref('')
+const start_date = ref('') //开始日期
+const end_date = ref('') //结束日期
+const createdate = ref('') //创建日期
+const tableData = ref([])
+const isShowloadding = ref(false)
+const search_txt = ref('')
+const total = ref(1)
+const page_no = ref(1)
+const pageSize = ref(10)
+const sort_type = ref('') //自定义排序方式
+const sort_param = ref('') //自定义排序方式的哪一个
+const valueLocation = ref([])
+const provinceValue = ref('')
+const cityValue = ref('')
+const SortByTodo= ref(false)
+const AddCompanyBtn= ref(false) //控制新增客户按钮是否显示
+const act_trialTag = ref(0)//默认的标签状态
+const trialTagArr = ref([])
+const userTableRef = ref(null)
+/* 获取表格 */
+function getTableData() {
+    isShowloadding.value = true;
+    /* 处理品种结构 和 阅读权限 */
+    let param_arr = [];
+    let variety_red_arr = []
+    if (variety.value.length) {
+        param_arr = variety.value.map(item => {
+            return item[1];
+        })
+    }
+    if (variety_red.value.length) {
+        variety_red_arr = variety_red.value.map(item => {
+            return item[1];
+        })
+    }
+    // 处理销售筛选
+    let salesArr = []
+    if (sales.value.length) {
+        salesArr = sales.value.map(item => {
+            return item[item.length - 1]
+        })
+    }
+
+    let params = {
+        SortParam: sort_param.value, //自定义排序字段
+        SortType: sort_type.value, //排序方式
+        PageSize: pageSize.value,
+        CurrentIndex: page_no.value,
+        Status: act_status.value,
+        CompanyType: type.value,
+        IndustryId: trade.value ? Number(trade.value) : '',
+        AdminId: salesArr.join(','),
+        ChartPermissionIds: variety_red_arr.join(','), //阅读权限
+        ContractPermissionIds: param_arr.join(','), //已购权限
+        StartDate: start_date.value,
+        EndDate: end_date.value,
+        CreateStartDate: createdate.value[0] ? createdate.value[0] : '',
+        CreateEndDate: createdate.value[0] ? createdate.value[1] : '',
+        KeyWord: search_txt.value,
+        Province: provinceValue.value,
+        City: cityValue.value,
+        PackageType: setmealSelect.value ? Number(setmealSelect.value) : 0,
+        SortByTodo: SortByTodo.value,
+        TryStage: act_trialTag.value
+    }
+    customAllInterence.customList(params).then(res => {
+        if (res.Ret === 200) {
+
+            res.Data.List && res.Data.List.forEach(item => {
+                item.StartDate = item.StartDate.replace(/-/g, '.');
+                item.EndDate = item.EndDate.replace(/-/g, '.');
+                item.FreezeStartDate = item.FreezeStartDate ? item.FreezeStartDate.replace(
+                    /-/g, '.') : '';
+                item.FreezeEndDate = item.FreezeEndDate ? item.FreezeEndDate.replace(/-/g,
+                    '.') : '';
+                item.LossTime = item.LossTime ? item.LossTime.replace(/-/g, '.') : '';
+                item.ApproveStatus = item.ApproveStatus == '待审批' ? '待审批' : ''
+            })
+            tabs.value = res.Data.StatusCount;
+
+            total.value = res.Data.Paging.Totals;
+
+            trialTagArr.value = res.Data.TryStageCount ? res.Data.TryStageCount.sort((x, y) => x.TryStage - y.TryStage) : []
+            if (trialTagArr.value.length) {
+                const [x, y, ...res] = trialTagArr.value;
+                trialTagArr.value = [x, ...res, y];
+            }
+
+            tableData.value = res.Data.List || [];
+            AddCompanyBtn.value = res.Data.AddCompanyBtn
+            isShowloadding.value = false;
+        }
+    })
+}
+getTableData()
+ /* 页码改变 */
+function handleCurrentChange(page) {
+    page_no.value = page;
+    getTableData();
+}
+/* 搜索客户 重置筛选条件 */
+function searchHandle() {
+    init();
+    getTableData();
+}
+/* 重置 */
+function init() {
+    act_status.value = '全部';
+    if (['admin','finance'].includes(Role.value)) {
+        type.value = '';
+    }
+    trade.value = '';
+    sales.value = '';
+    variety.value = '';
+    date.value = '';
+    valueLocation.value = []
+    provinceValue.value = ''
+    cityValue.value = ''
+    start_date.value = ''; //开始日期
+    end_date.value = ''; //结束日期
+    page_no.value = 1;
+}
+/* 选择类型时 */
+function changeType() {
+    trade.value = '';
+    variety.value = []
+    page_no.value = 1;
+    getTableData()
+}
+/* 选择行业 */
+function filterChange() {
+    page_no.value = 1;
+    getTableData();
+}
+/* 选择服务日期 */
+function dateChange(e) {
+    if (e[0]) {
+        start_date.value = e[0];
+        end_date.value = e[1];
+    } else {
+        start_date.value = '';
+        end_date.value = '';
+    }
+    page_no.value = 1;
+    getTableData();
+}
+/* 选择日期 */
+function dateChange2(e) {
+    // console.log(e[0]);
+    if (!e[0]) {
+        createdate.value = []
+    }
+    page_no.value = 1;
+    getTableData();
+}
+/* 切换状态 表格重置 */
+function changeStatus(item, index) {
+    act_status.value = item.Status;
+    act_trialTag.value = 0;
+    userTableRef.value.clearSort()
+    sort_type.value = '';
+    sort_param.value = '';
+    SortByTodo.value = false
+    page_no.value = 1;
+    getTableData()
+    //重新获取销售信息
+    getSale();
+}
+function handleChangeLocation() {
+    const provinceArr = []
+    const cityArr = []
+    valueLocation.value.forEach(item => {
+        // 省
+        provinceArr.push(item[0])
+        // 市
+        cityArr.push(item[1])
+    })
+    //provinceArr需要去重
+    provinceValue.value = [...new Set(provinceArr)].join(',')
+    cityValue.value = cityArr.join(',')
+    page_no.value = 1;
+    getTableData();
+}
+function changeSort() {
+    SortByTodo.value = !SortByTodo.value
+    page_no.value = 1;
+    //自定义排序规则互斥,把其他的排序设置成默认值
+    sort_type.value = ''
+    getTableData()
+}
+/* 到期天数排序发生变化 全局排序 */
+function sortChangeHandle(item) {
+    if (item.column.label === 'To-Do') {
+        SortByTodo.value = !SortByTodo.value
+        sort_type.value = ''
+        sort_param.value = ''
+    } else if (item.prop === 'Status') {
+        SortByTodo.value = false
+        sort_type.value = 'asc'
+        sort_param.value = sort_param.value === 'tryStage' ? '' : 'tryStage'
+    } else if (item.prop === 'deadline') {
+        SortByTodo.value = false
+        sort_type.value = 'asc'
+        sort_param.value = sort_param.value === 'deadline' ? '' : 'deadline'
+    } else {
+        SortByTodo.value = false
+        sort_type.value = item.order === 'ascending' ? 'asc' : item.order === 'descending' ? 'desc' : '';
+        sort_param.value = item.column.label == '转正时间' ? 'formalTime' : item.column.label == '冻结时间' ?
+            'freezeTime' : item.column.label == '流失时间' ? 'lossTime' : item.prop;
+    }
+    page_no.value = 1;
+    getTableData();
+}
+	/* 切换标签状态 */
+function changeTagStatus({ TryStage }) {
+    act_trialTag.value = TryStage;
+    userTableRef.value.clearSort()
+    sort_type.value = '';
+    sort_param.value = '';
+    SortByTodo.value = false
+    page_no.value = 1;
+    getTableData()
+}
+	/* 改变客户的试用标签 */
+function changeTrialHandle({ CompanyId },trialItem) {
+  const { ProductId,TryStage } = trialItem;
+
+  customInterence.setTrialTag({
+    CompanyId,
+    ProductId,
+    TryStage
+  }).then(res => {
+    if(res.Ret !== 200) return
+    ElMessage.success('设置成功');
+
+    getTableData()
+  })
+}
+       
+
+const salesArr = ref([]) //销售
+/* 获取销售 */
+function getSale() {
+    let status = 0;
+    if (act_status.value == '流失') {
+        status = 1;
+    }
+    customInterence.getSale({
+        "Status": status
+    }).then(res => {
+        if (res.Ret === 200) {
+            salesArr.value = res.Data.List;
+        }
+    })
+}
+getSale()
+
+
+
+watch(() => type.value,
+  () => {
+      getIndustry();
+      getVariety();
+  }
+)
+const varietyArr = ref([])
+ /* 获取品种信息 */
+function getVariety() {
+    customInterence.getvariety({
+        CompanyType: type.value
+    }).then(res => {
+
+        if (res.Ret === 200) {
+            varietyArr.value = res.Data.List;
+        }
+    })
+}
+const tradeArr = ref([]) //行业
+/* 根据类型获取行业 */
+function getIndustry() {
+    customInterence.getindustry({
+        Classify: type.value
+    }).then(res => {
+        if (res.Ret === 200) {
+            tradeArr.value = res.Data.List || [];
+        }
+    })
+}
+
+/* 前往详情页 */
+function goDetail(item) {
+    const {
+        href
+    } = $router.resolve({
+        path: '/customDetail',
+        query: {
+            id: item.CompanyId,
+            IsFullCompany:1
+        }
+    });
+    window.open(href, '_blank');
+}
+
+
+const { 
+  isLook,
+  lookTitle,
+  lookAuthList,
+  lookAuthListEquity,
+  lookHandle,
+  closeDia
+} = useViewPermissionDia();//查看权限弹窗
+ /* 下拉菜单操作 */
+async function itemclickHandle(query) {
+    if (query.type == '查看权限') {
+        lookHandle(query.data)
+    }
+}
+
+
+const { accumulativeFrequencyClick,accumulativeFrequencyDlg,accumulativeFrequencyItem,closeAccumulativeDlg } = useViewRoadShowDia();//路演详情弹窗
+
+
+const { isTotalDayDialogShow,customItem,handleTotalDayClick,closeLookTrial } = useLookTrialDia();//查看累计试用天数弹窗
+
+
+
+
+
+function initData() {
+   /* 除admin账号 客户类型默认 */
+  if (!['admin','finance'].includes(Role.value)) {
+      type.value = RoleType.value;
+  }
+  variety.value = type.value == 'ficc' ? [[100, 1]] : []
+}
+initData()
+
 
 </script>
 <template>
-  <div></div>
+  <!-- 全量客户列表 是customList的阉割版 -->
+    <div class="customList_container" ref="cusContainer">
+        <div class="customList_bot_top">
+            <div>
+                <a :href="exportUrlDl" download>
+                    <el-button type="primary" plain style="width:100px;marginRight:10px;">导出客户</el-button>
+                </a>
+                <a :href="exportUserDl" download>
+                    <el-button type="primary" plain style="width:110px;">导出联系人</el-button>
+                </a>
+            </div>
+            <el-input placeholder="客户名称/社会信用码/手机号码/邮箱" v-model="search_txt" style="max-width:520px"
+                @input="searchHandle" clearable>
+                <template #prefix>
+                  <el-icon><Search/></el-icon>
+                </template>
+            </el-input>
+        </div>
+        <div class="customList_bot">
+            <div class="customList_top">
+                <el-row :span="24">
+                    <el-select v-model="type" placeholder="请选择客户类型"
+                        style="width:200px;marginRight:10px;marginBottom:8px;" clearable
+                        v-if="Role=='finance'||Role=='admin'" @change="changeType">
+                        <el-option v-for="item in typeArr" :key="item" :label="item.name" :value="item.name">
+                        </el-option>
+                    </el-select>
+                    <el-select v-model="trade" placeholder="请选择行业"
+                        style="width:200px;marginRight:10px;marginBottom:8px;" clearable @change="filterChange">
+                        <el-option v-for="item in tradeArr" :key="item.IndustryId" :label="item.IndustryName"
+                            :value="item.IndustryId">
+                        </el-option>
+                    </el-select>
+                    <el-cascader v-model="sales" placeholder="请选择销售"
+                        style="width:200px;marginRight:10px;marginBottom:8px;" :options="salesArr"
+                        :props="{
+                          multiple: true,
+                          label: 'RealName',
+                          children: 'ChildrenList',
+                          value: 'AdminId'
+                        }" :show-all-levels="false" collapse-tags clearable filterable
+                        @change="filterChange">
+                    </el-cascader>
+                    <el-select v-model="setmealSelect" placeholder="请选择套餐类型"
+                        style="width:200px;marginRight:10px;marginBottom:8px;" clearable @change="filterChange">
+                        <el-option v-for="item in setmealArr" :key="item.id" :label="item.name" :value="item.id">
+                        </el-option>
+                    </el-select>
+                    <el-cascader 
+                      v-model="variety" 
+                      placeholder="请选择已购品种"
+                      style="width:200px;marginRight:10px;marginBottom:8px;" 
+                      :options="varietyArr"
+                      :props="{
+                        multiple: true,
+                        label: 'ClassifyName',
+                        children: 'Items',
+                        value: 'ChartPermissionId'
+                      }" 
+                      :show-all-levels="false" 
+                      collapse-tags 
+                      clearable 
+                      filterable
+                      @change="filterChange"
+                    >
+                    </el-cascader>
+                    <el-cascader 
+                      v-model="variety_red" 
+                      placeholder="请选择阅读权限"
+                      style="width:200px;marginRight:10px;marginBottom:8px;"
+                      :options="varietyArr"
+                      :props="{
+                          multiple: true,
+                          label: 'ClassifyName',
+                          children: 'Items',
+                          value: 'ChartPermissionId'
+                        }" 
+                        :show-all-levels="false" 
+                        collapse-tags 
+                        clearable 
+                        filterable
+                        @change="filterChange"
+                    >
+                    </el-cascader>
+                    <el-cascader 
+                      v-model="valueLocation" 
+                      collapse-tags 
+                      :props="{
+                        multiple: true,
+                        value: 'name',
+                        children: 'city',
+                        label: 'name'
+                      }" 
+                      clearable
+                      :options="locationOptions" 
+                      @change="handleChangeLocation" 
+                      placeholder="请选择客户地址"
+                      style="width:200px;marginRight:10px;marginBottom:8px;"
+                    >
+                    </el-cascader>
+                    <date-picker v-model:value="date" type="date" range value-type="format" placeholder="服务日期"
+                        @change="dateChange" style="width:200px;marginRight:10px;marginBottom:8px;">
+                    </date-picker>
+                    <date-picker v-model:value="createdate" type="date" range value-type="format" placeholder="创建时间"
+                        @change="dateChange2" style="width:200px;marginRight:10px;marginBottom:8px;">
+                    </date-picker>
+                </el-row>
+            </div>
+            <ul class="tabs_cont">
+                <li :class="['tab',{'act':act_status === item.Status}]" v-for="(item,index) in tabs" :key="index"
+                    @click="changeStatus(item,index)">
+                    {{item.Status+'('+item.Count+')'}}
+                </li>
+            </ul>
+            <ul class="tabs_cont trial-ul" v-if="act_status === '试用'">
+                <li :class="['trial-item',{'act':act_trialTag === item.TryStage}]" v-for="item in trialTagArr"
+                    :key="item.TryStage" @click="changeTagStatus(item)">
+                    {{item.TryStageStr+'('+item.Count+')'}}
+                </li>
+            </ul>
+            <div class="bot_cont">
+                <el-table ref="userTableRef" :data="tableData" v-loading="isShowloadding" element-loading-text="数据加载中..."
+                    @sort-change="sortChangeHandle" border>
+                    <el-table-column prop="CompanyName" label="客户名称" align="center" min-width="7.14%">
+                        <template #default="scope" >
+                          <div :class="{'isShared':scope.row.IsShared}">
+                            <span v-if="scope.row.IsSuspend ===1 || scope.row.Status=='潜在'" @click="goDetail(scope.row)"
+                                class="mouse-enter"
+                                :class="{'color-red':act_status==='正式'&&scope.row.Status.includes('正式')&&scope.row.WeekViewActive===0}"
+                                :style="scope.row.Status=='潜在'?'':'color:#bbb;cursor:pointer'">
+                                {{scope.row.CompanyName}}
+                            </span>
+                            <span v-else style="color:#409EFF;cursor:pointer;" @click="goDetail(scope.row)"
+                                class="customName"
+                                :class="{'isShared':scope.row.IsShared,'color-red':act_status==='正式'&&scope.row.Status.includes('正式')&&scope.row.WeekViewActive===0}">{{scope.row.CompanyName}}</span>
+                            <img width="15" src="../../../assets/img/icons/remark.png" alt=""
+                                v-if="scope.row.RenewalReason||(scope.row.Status==='冻结'&&scope.row.FreezeReason)">
+                          </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="DL" prop="deadline" align="center" min-width="5%" sortable="custom">
+                        <template #header>
+                            <div class="todolabel" :class="{sort:sort_param==='deadline'}"
+                                style="display:inline-block;">
+                                <span>DL</span>
+                                <el-tooltip effect="dark" placement="top-start" content="未完成To Do任务的截止日期-当前日期">
+                                    <i class="el-icon-info" />
+                                </el-tooltip>
+                            </div>
+                        </template>
+                        <template #default="{row}">
+                            <span>{{row.Deadline||'--'}}</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="CompanyType" label="类型" align="center" min-width="4.14%">
+                        <template #default="{row}">
+                            <template v-if="row.CompanyType.indexOf('/')!==-1">
+                                <span
+                                    :style="row.IsSuspend===1?'color:#bbb':''">{{row.CompanyType.split('/')[0]}}</span><br />
+                                <span v-if="row.FiccPackageType"
+                                    class="ficc-package">{{row.FiccPackageType == 1 ? '大套餐': '小套餐'}}</span>
+                                <br v-if="row.FiccPackageType" />
+                                <span
+                                    :style="row.IsSuspend===1?'color:#bbb':''">{{row.CompanyType.split('/')[1]}}</span>
+                            </template>
+                            <template v-else>
+                                <span :style="row.IsSuspend===1?'color:#bbb':''">{{row.CompanyType}}</span>
+                                <span v-if="row.FiccPackageType&&row.CompanyType.includes('ficc')"
+                                    class="ficc-package">{{row.FiccPackageType == 1 ? '大套餐': '小套餐'}}</span>
+                            </template>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="IndustryName" label="所属行业" min-width="6.14%" align="center">
+                        <template #default="scope">
+                            <div :style="scope.row.IsSuspend===1?'color:#bbb':''">
+                                <p :style="scope.row.IsSuspend===1?'color:#bbb':''"
+                                    v-for="item in scope.row.IndustryName.split('/')" :key="item">{{item}}</p>
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="City" label="客户地址" min-width="6.14%" align="center">
+                        <template #default="scope">
+                            <span v-if="scope.row.Province && scope.row.City"
+                                :style="scope.row.IsSuspend===1?'color:#bbb':''">{{scope.row.Province}}<br />{{scope.row.City}}</span>
+                            <span v-else
+                                :style="scope.row.IsSuspend===1?'color:#bbb':''">{{scope.row.RegionType}}</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="SellerName" label="销售" min-width="6.14%" align="center">
+                        <template #default="scope">
+                            <p :style="scope.row.IsSuspend===1?'color:#bbb':''"
+                                v-for="item in scope.row.SellerName.split('/')" :key="item">{{item}}</p>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="Status" label="状态" min-width="7.14%" align="center" :sortable="act_status==='试用'&&act_trialTag===0?'custom':false" style="background:red">
+                        <template #header>
+                            <div class="todolabel" :class="{sort:sort_param==='tryStage'}"
+                                style="display:inline-block;">
+                                <span>状态</span>
+                            </div>
+                        </template>
+                        <template #default="scope">
+                            <p :style="scope.row.IsSuspend===1?'color:#bbb;margin:3px 0':'margin:3px 0'"
+                                v-for="(item,index) in scope.row.Status.split('/')" :key="item">
+                                {{ item }}
+                                <template v-if="item === '试用' && scope.row.TryStageSlice">
+                                    <el-select v-model="scope.row.TryStageSlice[index].TryStage"
+                                        v-if="scope.row.Status === '试用/试用'"
+                                        :disabled="!scope.row.TryStageSlice[index].HasPermission" size="small"
+                                        style="width: 50px" placeholder=""
+                                        @change="changeTrialHandle(scope.row,scope.row.TryStageSlice[index])">
+                                        <el-option v-for="item in trialTags" :key="item.value" :label="item.label"
+                                            :value="item.value">
+                                        </el-option>
+                                    </el-select>
+                                    <el-select v-model="scope.row.TryStageSlice[0].TryStage"
+                                        :disabled="!scope.row.TryStageSlice[0].HasPermission" v-else size="small"
+                                        style="width: 50px" placeholder=""
+                                        @change="changeTrialHandle(scope.row,scope.row.TryStageSlice[0])">
+                                        <el-option v-for="item in trialTags" :key="item.value" :label="item.label"
+                                            :value="item.value">
+                                        </el-option>
+                                    </el-select>
+                                </template>
+                            </p>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="累计试用天数" align="center" min-width="5.14%" prop="tryOutDay" sortable="custom">
+                        <template #default="{row}">
+                            <el-tooltip :disabled="row.IsSuspend===1||(row.FiccTryOutDay+row.RaiTryOutDay===0)">
+                              <template #content>
+                                <div>
+                                    <p v-if="row.FiccTryOutDay">FICC累计试用天数:{{row.FiccTryOutDay}}</p>
+                                    <p v-if="row.RaiTryOutDay">权益累计试用天数:{{row.RaiTryOutDay}}</p>
+                                </div>
+                              </template>
+                                <span :style="row.IsSuspend===1?'color:#bbb':'color:#409EFF;cursor:pointer;'"
+                                    @click="handleTotalDayClick(row)">
+                                    {{row.FiccTryOutDay+row.RaiTryOutDay}}
+                                </span>
+                            </el-tooltip>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="阅读" align="center" min-width="5.14%" prop="viewTotal" sortable="custom">
+                        <template #default="{row}">
+                            <el-tooltip :disabled="row.IsSuspend===1 || (row.FiccView+row.RaiView)===0">
+                              <template #content>
+                                <div>
+                                    <p v-if="row.FiccView">FICC报告阅读次数:{{row.FiccView}}</p>
+                                    <p v-if="row.RaiView">权益报告阅读次数:{{row.RaiView}}</p>
+                                </div>
+                              </template>
+                                <span :style="row.IsSuspend===1?'color:#bbb':'color:#409EFF;cursor:pointer;'">
+                                    {{row.AllViewTotal}}
+                                </span>
+                            </el-tooltip>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="路演" align="center" min-width="5.14%" prop="roadShowTotal" sortable="custom">
+                        <template #default="scope">
+                            <span :style="scope.row.IsSuspend===1?'color:#bbb':''"
+                                @click="accumulativeFrequencyClick(scope)" class="editsty"
+                                v-if="scope.row.RoadShowTotal > 0">{{scope.row.RoadShowTotal}}</span>
+                            <span :style="scope.row.IsSuspend===1?'color:#bbb':''"
+                                v-else>{{scope.row.RoadShowTotal}}</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="最近阅读" min-width="8.14%" align="center" prop="viewTime" sortable="custom">
+                        <template #default="scope">
+                            <p v-if="scope.row.FiccLastViewTime" :style="scope.row.IsSuspend===1?'color:#bbb':''">ficc:
+                                {{moment(scope.row.FiccLastViewTime).format('YYYY.MM.DD')}}</p>
+                            <p v-else-if="scope.row.RaiLastViewTime" :style="scope.row.IsSuspend===1?'color:#bbb':''">
+                                权益: {{moment(scope.row.RaiLastViewTime).format('YYYY.MM.DD')}}</p>
+                            <p v-else :style="scope.row.IsSuspend===1?'color:#bbb':''">--</p>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="EndDate" :label="act_status=='冻结'?'冻结期限':'服务期限'" align="center"
+                        min-width="6.14%">
+                        <template #default="scope">
+                            <span :style="scope.row.IsSuspend===1?'color:#bbb':''">
+                                <!-- 正常的时间显示 -->
+                                <template v-if="scope.row.StartDate.indexOf('/')==-1">
+                                    <template v-if="act_status=='流失'">
+                                        创建时间:{{scope.row.CreatedTime}}
+                                    </template>
+                                    <template v-else-if="scope.row.Status == '永续'">
+                                        永久
+                                    </template>
+                                    <template v-else-if="act_status == '冻结'">
+                                        {{scope.row.FreezeStartDate}}~{{scope.row.FreezeEndDate}}
+                                    </template>
+                                    <template v-else>
+                                        {{scope.row.StartDate}}~{{scope.row.EndDate}}
+                                    </template>
+                                </template>
+                                <!-- 公用客户的时间显示 -->
+                                <template v-else>
+                                    {{scope.row.StartDate.substr(0,10)}}~{{scope.row.EndDate.substr(0,10)}}/{{scope.row.StartDate.substr(11)}}~{{scope.row.EndDate.substr(11)}}
+                                </template>
+                            </span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="expireDay" :label="act_status=='冻结'?'解冻':'到期'" align="center"
+                        min-width="5.14%" sortable="custom">
+                        <template #default="scope">
+                            <span :style="scope.row.IsSuspend===1?'color:#bbb':''">
+                                <template v-if="act_status=='冻结'">
+                                    {{scope.row.FreezeExpireDays||'--'}}
+                                </template>
+                                <template v-else>
+                                    {{scope.row.ExpireDay||'--'}}
+                                </template>
+                            </span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="createTime"
+                        :label="act_status=='冻结'?'冻结时间':act_status=='正式'?'转正时间':act_status=='流失'?'流失时间':'创建时间'"
+                        sortable="custom" align="center" min-width="6.14%">
+                        <template #default="scope">
+                            <span :style="scope.row.IsSuspend===1?'color:#bbb':''">
+                                <template v-if="act_status=='冻结'">
+                                    {{moment(scope.row.FreezeTime).format('YYYY.MM.DD')}}
+                                </template>
+                                <template v-else-if="act_status=='正式'">
+                                    {{moment(scope.row.FormalTime).format('YYYY.MM.DD')}}
+                                </template>
+                                <template v-else-if="act_status=='流失'">
+
+                                    {{scope.row.LossTime
+                                        ?(`${scope.row.LossTime.split('/')[0].substr(0,10)}`)
+                                        :''}}
+                                    {{scope.row.LossTime&&scope.row.IsShared&&scope.row.LossTime.split('/')[1]
+                                        ? `/${scope.row.LossTime.split('/')[1].substr(0,10)}`
+                                        :''}}
+                                </template>
+                                <template v-else>
+                                    {{moment(scope.row.CreatedTime).format('YYYY.MM.DD')}}
+                                </template>
+                            </span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="操作" align="center" min-width="7.14%">
+                        <template #default="scope" >
+                            <div class="tool" style="display: flex;flex-direction: column;" v-if="!scope.row.ApproveStatus">
+                                <span class="editsty" style="white-space: nowrap;"
+                                    @click="itemclickHandle({type:'查看权限',data:scope.row})">
+                                    查看权限
+                                </span>
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <template #empty>
+                      <div style="lineHeight:44px;margin:60px 0;color:#999;">
+                          <img src="~@/assets/img/cus_m/nodata.png" alt=""
+                              style="display:block;width:160px;height:128px;margin: auto;">
+                          <span>暂无信息</span>
+                      </div>
+                    </template>
+                </el-table>
+                <div class="toolbar fixedbar">
+                    <el-pagination 
+                      layout="prev,pager,next" 
+                      background 
+                      :current-page="page_no"
+                      @current-change="handleCurrentChange" 
+                      :page-size="pageSize"
+                      :total="total" 
+                      style="float:right;"
+                    >
+                    </el-pagination>
+                </div>
+            </div>
+        </div>
+        <!-- 查看权限弹窗 -->
+        <permissionView 
+          :isLook="isLook" 
+          :lookTitle="lookTitle" 
+          :lookAuthList="lookAuthList"
+          :lookAuthListEquity="lookAuthListEquity" 
+          @closeDia="closeDia"
+        ></permissionView>
+
+        <!-- 累计试用天数弹窗 -->
+        <total-day-dialog 
+          :isTotalDayDialogShow="isTotalDayDialogShow" 
+          :customInfo="customItem" 
+          @close="closeLookTrial"
+        />
+        <!-- 路演业阅读的弹框 -->
+        <accumulative-frequency-dlg
+          :accumulativeFrequencyDlg="accumulativeFrequencyDlg"
+          :accumulativeFrequencyItem="accumulativeFrequencyItem"
+          @close="closeAccumulativeDlg"
+        />
+    </div>
 </template>
 <style scoped lang="scss">
+  .ficc-package {
+        display: inline-block;
+        font-size: 12px;
+        padding: 0 5px;
+        border-radius: 5px;
+        color: #3994fb;
+        background-color: #dcecfc;
+  }
+
+  .color-red {
+      color: red !important;
+  }
+
+  .isShared::after {
+      content: '共享';
+      font-size: 12px;
+      // padding: 0px 0px 0px 2px;
+      width: 30px;
+      color: #3994fb;
+      background-color: #dcecfc;
+      position: absolute;
+      left: 0;
+      bottom: 0;
+      border-top-right-radius: 5px;
+  }
+
+  .customList_container {
+      .mx-datepicker {
+          width: 200px !important;
+      }
+
+      :deep(.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner) {
+          background-color: #409EFF !important;
+          border-color: #409EFF;
+      }
+
+      :deep(.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner) {
+          background-color: #409EFF !important;
+          border-color: #409EFF;
+      }
+
+      .customList_bot_top {
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+          margin-bottom: 28px;
+          padding: 20px 30px;
+          background: #fff;
+          border: 1px solid #ECECEC;
+          border-radius: 4px;
+          box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+      }
+
+      .customList_bot {
+          min-height: calc(100vh - 324px);
+          padding: 20px 30px 80px;
+          background: #fff;
+          position: relative;
+          border: 1px solid #ECECEC;
+          border-radius: 4px;
+          box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+
+          .customList_top {
+              padding: 20px 0 30px;
+              background: #fff;
+
+              .el-cascader__search-input {
+                  min-width: 30px;
+              }
+          }
+
+          .tabs_cont {
+              display: flex;
+              align-items: center;
+              color: #333;
+              margin-bottom: 30px;
+
+              &.trial-ul {
+                  padding: 0 30px;
+              }
+
+              .tab {
+                  width: 129px;
+                  height: 22px;
+                  line-height: 22px;
+                  text-align: center;
+                  font-size: 14px;
+                  border-right: 1px solid #707070;
+                  cursor: pointer;
+                  transition-delay: 0.05s;
+
+                  &:hover {
+                      color: #409EFF;
+                  }
+
+                  &.act {
+                      // padding: 9px 24px;
+                      height: 40px;
+                      line-height: 40px;
+                      background: #409EFF;
+                      border-radius: 4px;
+                      color: #fff;
+                      border-color: #409EFF;
+                      transform: scale(1.014);
+                  }
+
+                  &:last-child {
+                      border: none;
+                  }
+              }
+
+              .trial-item {
+                  cursor: pointer;
+                  margin-right: 30px;
+
+                  &:hover {
+                      color: #409EFF;
+                  }
+
+                  &.act {
+                      color: #409EFF;
+                      position: relative;
+
+                      &::after {
+                          content: "";
+                          width: 100%;
+                          height: 2px;
+                          position: absolute;
+                          bottom: -10px;
+                          left: 50%;
+                          transform: translateX(-50%);
+                          background: #409EFF;
+                      }
+                  }
+              }
+          }
+
+          .try_style {
+              color: #BBBBBB;
+          }
+
+          .bot_cont {
+
+              //padding-bottom: 20px;
+              .fixedbar {
+                  position: fixed;
+                  right: 45px;
+                  bottom: 20px;
+                  background-color: transparent;
+                  z-index: 2;
+              }
+          }
+      }
+
+      .mouse-enter {
+          &:hover {
+              text-decoration: underline;
+          }
+      }
+  }
+
+  :deep(.el-input--small) {
+      .el-input__inner {
+          height: 24px;
+          line-height: 24px;
+          color: #409EFF;
+          background: #ECF5FF;
+          border-color: #409EFF;
+          text-align: center;
+      }
+
+      .el-input__suffix {
+          right: -22px;
+      }
+
+      &.is-disabled {
+          .el-input__inner {
+              border-color: #E4E7ED;
+          }
 
+          .el-input__suffix {
+              display: none;
+          }
+      }
+  }
 </style>

File diff suppressed because it is too large
+ 1081 - 48
src/views/custom_manage/custom/customList.vue


+ 1267 - 0
src/views/custom_manage/custom/editCustom.vue

@@ -0,0 +1,1267 @@
+<script setup>
+import { ref,computed,reactive } from 'vue'
+import $ from 'jquery'
+import { ElImageViewer, ElMessage, ElMessageBox } from 'element-plus'
+import { Search } from '@element-plus/icons-vue'
+import Ctimeline from './components/Ctimeline.vue'
+import Contactdia from './components/Contactdialog.vue'
+import Readia from './components/ReadDialog.vue'
+import CpessionTable from './components/CpessionTable.vue'
+import { customInterence } from '@/api/api.js'
+// import autocomplete from "@/components/autocomplete.vue";
+import searchDistPicker from '@/components/searchDistPicker.vue';
+import country from "@/utils/countryData"
+import { useList,useReadia } from './hooks/customlistHook'
+import { useRoute, useRouter } from 'vue-router'
+
+
+const $router = useRouter()
+const $route = useRoute()
+const { Role,RoleType } = useList()
+
+const { readId, isRead, cancelRead, lookReport, readTit } = useReadia()
+
+//下载模板
+const downTemplate = computed(() => {
+	return import.meta.env.VITE_APP_API_ROOT+'/custom/template?'+localStorage.getItem('auth')||''
+}) 
+
+const optionsMoney = [
+  {value:'1',label:'50亿以下'},{value:'2',label:'50~100亿'},{value:'3',label:'100亿以上'}
+]
+const	basicformRule = {
+  CompanyName:[{ required: true, message: '公司名称不能为空', trigger: 'blur' }],
+  City: [{ required: true, message: "请选择地址", trigger: "change" }],
+  CreditCode:[{ required: true, message: '社会信用码不能为空', trigger: 'blur' }],
+}
+const raiformRule = {
+  IndustryId:[{ required: true, message: "请选择行业", trigger: "change" }],
+  Source:[{ required: true, message: "请选择来源", trigger: "change" }]
+}
+const ficcformRule = {
+  IndustryId:[{ required: true, message: "请选择行业", trigger: "change" }],
+  Source:[{ required: true, message: "请选择来源", trigger: "change" }]
+}
+
+
+const countryData = country;
+const typeArr = computed(() => {
+	let type = localStorage.getItem('RoleType') || '';
+	if(type == 'ficc') {
+		return ['ficc']
+	}else if(type == '权益') {
+		return ['权益']
+	}else {
+		return ['ficc','权益']
+	}
+})
+
+
+const companyId = ref(Number($route.query.id))
+const showData = ref(false)
+const canEidtBtns = ref({})
+const basicform = ref(null)
+const ficcform = ref(null)
+const raiform = ref(null)
+const companyStatus = ref('')
+const regionType = ref('')
+const authList = ref([])
+const	raiCollapseOpen = ref('1')//1展开 0 收起
+const	ficcCollapseOpen = ref('1')// 1展开 0 收起
+/* 获取客户详情信息 */
+function getDetail() {
+  customInterence.customDetail({
+    CompanyId:companyId.value,
+    IsEdit:true // 是否时编辑页详情
+  }).then(res => {
+    if(res.Ret === 200) {
+      showData.value = true;
+
+      canEidtBtns.value={
+        FiccEdit:res.Data.BtnItem.FiccEdit,
+        RaiEdit:res.Data.BtnItem.RaiEdit,
+        BaseInfoEdit:res.Data.BtnItem.BaseInfoEdit
+      }
+      basicform.value = {...res.Data.Item,CreateAuth:res.Data.CreateAuth};//客户基本信息
+      ficcform.value= res.Data.FiccItem;//ficc添加的信息
+      raiform.value = res.Data.RaiItem;//权益添加的信息
+
+      // 处理ficc权限列表格式
+      if(res.Data.FiccItem){
+        let auth = [];
+        res.Data.FiccItem.PermissionList.forEach(item=> {
+          item.Items=item.Items||[]
+          item.CheckList=item.CheckList||[]
+          let obj = {
+            checkAll:item.CheckList&&item.CheckList.length===item.Items.length?true:false,
+            isIndeterminate:item.CheckList&&item.CheckList.length>0 && item.CheckList.length<item.Items.length,
+            ...item,
+          }
+          auth.push(obj)
+        })
+        console.log(auth);
+        ficcform.value={...ficcform.value,authList:auth}
+      }
+      // 处理权益权限列表格式
+      if(res.Data.RaiItem){
+        let auth = [];
+        res.Data.RaiItem.PermissionList.forEach(item=> {
+          let obj = {
+            checkAll:item.CheckList&&item.CheckList.length===item.Items.length?true:false,
+            isIndeterminate:item.CheckList&&item.CheckList.length>0 && item.CheckList.length<item.Items.length,
+            ...item,
+          }
+          auth.push(obj)
+        })
+        raiform.value={...raiform.value,authList:auth}
+      }
+
+      companyStatus.value=res.Data.CreateAuth === 1?ficcform.value.Status:raiform.value.Status
+
+      regionType.value=basicform.value.RegionType
+      /* 基础表单 */
+      dataForm.value = {
+        area:basicform.value.RegionType,
+        custom_name:basicform.value.CompanyName,
+        code:basicform.value.CreditCode,
+        province:basicform.value.Province,
+        city:basicform.value.City,
+        CompanyProductId:res.Data.CreateAuth == 1?ficcform.value.CompanyProductId:raiform.value.CompanyProductId,
+        cuStatus:res.Data.CreateAuth == 1?ficcform.value.Status:raiform.value.Status,
+        custype:res.Data.CreateAuth == 1?ficcform.value.ProductName:raiform.value.ProductName,
+        trade:res.Data.CreateAuth == 1?ficcform.value.IndustryId:raiform.value.IndustryId,
+        from:res.Data.CreateAuth == 1?ficcform.value.Source:raiform.value.Source,
+        sales:res.Data.CreateAuth == 1?ficcform.value.SellerId:raiform.value.SellerId,
+        addreason:res.Data.CreateAuth == 1?ficcform.value.Reasons:raiform.value.Reasons
+      }
+      if(res.Data.CreateAuth == 1) { //ficc创建客户
+        /* 处理权限列表格式 */
+        let auth = [];
+        ficcform.value.PermissionList.forEach(item=> {
+          let obj = {
+            checkAll:item.CheckList&&item.CheckList.length===item.Items.length?true:false,
+            isIndeterminate:item.CheckList&&item.CheckList.length>0 && item.CheckList.length<item.Items.length,
+            ...item,
+          }
+          auth.push(obj)
+        })
+        authList.value = auth;
+        // 
+      }else if (res.Data.CreateAuth == 2){ //权益创建客户
+        // /* 基础表单 */
+        
+        /* 处理权限列表格式 */
+        let auth = [];
+        raiform.value.PermissionList.forEach(item=> {
+          let obj = {
+            checkAll:item.CheckList&&item.CheckList.length===item.Items.length?true:false,
+            isIndeterminate:item.CheckList&&item.CheckList.length>0 && item.CheckList.length<item.Items.length,
+            ...item,
+          }
+          auth.push(obj)
+        })
+        authList.value = auth;
+        
+      }
+    }
+  })
+}
+getDetail()
+
+
+const fromArr = ref([])
+/* 获取客户来源数据 */
+function getCustomerSourceList(){
+  customInterence.customerSourceList({}).then(res=>{
+    if(res.Ret===200){
+      fromArr.value=res.Data.List
+    }
+  })
+}
+getCustomerSourceList()
+
+
+const tradeArr = ref([])//行业1
+const tradeArr2 = ref([])//行业2
+/* 根据类型获取行业 */
+function getIndustry(type) {
+  customInterence.getindustry({
+    Classify:type
+  }).then(res => {
+    if(res.Ret === 200) {
+      if(type=='权益') {
+        tradeArr.value = res.Data.List || [];
+      }else {
+        tradeArr2.value = res.Data.List || [];
+      }
+    }
+  })
+}
+getIndustry('ficc')
+getIndustry('权益')
+
+
+const search_txt = ref('')
+const	userTable = ref([])//联系人表格
+const	total = ref(1)
+const	page_no = ref(1)
+const	isAddContact = ref(false)//联系人弹窗
+const defaultName = ref('')//默认公司名称
+const	diatit = ref('新增联系人')
+const userId = ref(0)//联系人id
+const diaform = ref({
+  companyName:'',
+  name:'',
+  sex:1,
+  telCode:'86',
+  tel1:'',
+  tel2:'',
+  mail:'',
+  post:'',
+  desiger:'',
+  depart:'',
+  carte:'',
+  Source:'add_user'
+})
+/* 获取联系人列表 */
+function getuserTable() {
+  customInterence.concactList({
+    PageSize:10,
+    CurrentIndex:page_no.value,
+    CompanyId:companyId.value,
+    KeyWord:search_txt.value
+  }).then(res => {
+    
+    if(res.Ret === 200) {
+      userTable.value = res.Data.List || [];
+      total.value = res.Data.Paging.Totals
+    }else {
+      userTable.value = []
+    }
+  })
+}
+getuserTable()
+/* 页码改变 */
+function handleCurrentChange(page) {
+  page_no.value = page;
+  getuserTable();
+}
+/* 搜索联系人 */
+function searchUser() {
+  page_no.value = 1;
+  getuserTable();
+}
+/* 新增联系人 */
+function addConcat() {
+  diaform.value.companyName = dataForm.value.custom_name;
+  defaultName.value = dataForm.value.custom_name;
+  isAddContact.value = true;
+  diatit.value = '新增联系人';
+}
+/* 编辑联系人 */
+function editContact(item) {
+  defaultName.value = item.CompanyName;
+  diaform.value = {
+    companyName:item.CompanyName,
+    name:item.RealName,
+    sex:item.Sex,
+    telCode:item.CountryCode,
+    tel1:item.Mobile,
+    tel2:item.MobileTwo||'',
+    mail:item.Email||'',
+    post:item.Position||'',
+    desiger:item.IsMaker,
+    depart:item.DepartmentName,
+    carte:item.BusinessCardUrl,
+    telQY:item.Mobile,
+    mailQY:item.Email
+
+  }
+  userId.value = item.UserId;
+  isAddContact.value = true;
+  diatit.value = '编辑联系人';
+}
+/* 删除联系人 */
+async function delConcat(item) {
+  //删除前的判断 试用、正式、冻结、永续状态下的客户 如只剩一个联系人不允许删除
+  let totalRes=await customInterence.companyUserTotal({CompanyId:companyId.value})
+  if(totalRes.Ret===200){
+    if(totalRes.Data.Total<=1&&(['试用','正式','永续','冻结'].includes(companyStatus.value))){
+      ElMessageBox.confirm('当前只有一个联系人,无法删除','提示',{
+        confirmButtonText: '知道了',
+        showCancelButton:false,
+        type: 'warning',
+      })
+      return
+    }
+  }else{
+    return
+  }
+
+  ElMessageBox.confirm('是否确认删除该联系人吗?','提示',{
+    type:'warning'
+  }).then(() => {
+    customInterence.concactDel({
+      UserId:item.UserId
+    }).then(res => {
+      if(res.Ret === 200) {
+        ElMessage.success(res.Msg);
+        page_no.value = 1;
+        getuserTable();
+      }
+    })
+  }).catch(() => {});
+}
+
+
+
+const isShowImportDia = ref(false)//导入联系人弹窗
+const importData = ref([])//要导入的信息
+const isImportRepeat = ref(false)//导入数据出现重复
+const repeatData = ref([])//重复的联系人
+const importParams = ref(null)
+// 导入联系人弹窗中的移动至当前客户
+function handleMoveToCurrentCustom(e,index){
+  let SellerId=localStorage.getItem('AdminId')
+  let params={
+    CompanyId: Number(companyId.value),
+    BusinessCardUrl:e.BusinessCardUrl,
+    DepartmentName:e.DepartmentName,
+    Email:e.Email,
+    IsMaker:Number(e.IsMaker),
+    Mobile:e.Mobile,
+    Position:e.Position,
+    RegionType:"",
+    RealName:e.RealName,
+    Remark:"",
+    SellerId:Number(SellerId),
+    Sex:Number(e.Sex),
+    UserId:Number(e.UserId),
+  }
+  customInterence.moveUser(params).then(res=>{
+    if(res.Ret==200){
+      ElMessage.success("移动成功!");
+      repeatData.value[index].HasMove=false
+    }
+  })
+}
+/* 导入联系人打开弹窗 */
+async function importHandle() {
+  let totalRes=await customInterence.companyUserTotal({CompanyId:companyId.value})
+  if(totalRes.Ret===200){
+    if(totalRes.Data.Total>=1) {
+      $('#fileImport').click();
+    }else {
+      ElMessage.error('请先至少添加一位名片联系人')
+    }
+  }else{
+    ElMessage.error(totalRes.ErrMsg)
+  }
+  
+}
+/* 关闭导入弹窗 */
+function cancelImport(type) {
+  isShowImportDia.value = false;
+  isImportRepeat.value = false;
+  importData.value = [];
+  repeatData.value = [];
+  importParams.value = null;
+  if(type == 1) {
+    getuserTable();
+  }
+}
+// 获取文件上传的数据
+function fileSelected(type){
+    if( document.getElementById('fileImport').files[0] ){
+      let hostfile = document.getElementById('fileImport').files[0];
+      let size = Math.floor(hostfile.size / 1024 / 1024);
+      if( size>200 ){
+            ElMessage.error('上传文件大小不能大于200M!');
+            hostfile = {};
+            return false
+      }
+      if( hostfile.name.toLowerCase().includes('.xlsx')){
+        let form = new FormData();
+          form.append('File',hostfile);  //hostfile.name
+          form.append('CompanyId',that.companyId);
+    
+          customInterence.getimportList(form).then((res) => {
+            if( res.Ret === 200 ){
+            
+              if(res.Data.RepeatUser.length>0){
+                ElMessageBox.confirm('excel表中存在重复手机号,请去重后,重新导入','提示',{
+                  confirmButtonText: '知道了',
+                  showCancelButton:false,
+                  type: 'warning'
+                })
+              }else{
+                isShowImportDia.value = true;
+                importParams.value = form;
+                importData.value = res.Data.ValidUser || [];
+              }
+            }
+            $("#fileImport").val('');
+            hostfile = {};
+          });
+      }else{
+        ElMessage.error('请上传.xlsx的文件格式!');
+      }
+    } 
+}
+/* 确认导入联系人 */
+function ensureImport() {
+  customInterence.importUser(importParams.value).then(res => {
+    if(res.Ret === 200) {
+     ElMessage.success('导入成功');
+      cancelImport(1);
+    }else if(res.Ret === 600) {
+      cancelImport();
+      isShowImportDia.value = true;
+      isImportRepeat.value = true;
+      repeatData.value = res.Data;
+    }
+  })
+}
+	/* 关闭联系人弹窗 */
+function canceldialog(type) {
+  isAddContact.value = false;
+  defaultName.value = dataForm.value.custom_name;
+  diaform.value = {
+    companyName:dataForm.value.custom_name,
+    sex:1,
+    telCode:'86',
+    tel1:'',
+    tel2:'',
+    mail:'',
+    post:'',
+    desiger:'',
+    depart:'',
+    carte:''
+  }
+  if(type==1) {
+    getuserTable();
+  }
+}
+
+
+
+const dataForm = reactive({
+	area:'国内',
+	custom_name:'',
+	code:'',
+	province:'',
+	city:'',
+	cuStatus:'试用',
+	custype:typeArr.value[0]||'',
+	trade:'',
+	from:'',
+	sales:Number(localStorage.getItem('AdminId')) || 0,
+	addreason:'',
+	money:''
+})
+const companyList = ref([])
+const checkCompanyfocusIs = ref(false) 
+const isCheckCompanyInfo = ref(false) //
+const isCheck = ref(false)//检查客户弹窗
+const repeatId = ref('')//重复公司id
+const repeatName = ref('')//重复公司类型
+const nameRepeat = ref(false)
+const codeRepeat = ref(false)
+const codeDisable = ref(false)//是否可编辑社会信用码国内可
+/* 获取客户名称 */
+function getCompany(query) {
+	if(query) {
+		customInterence.companySearch({
+			KeyWord:query
+		}).then(res =>{
+			if(res.Ret === 200) {
+				let arr = [];
+				if(res.Data.List) {
+					res.Data.List.forEach(item => {
+						let obj = {
+							...item,
+							value:item.CompanyName
+						}
+						arr.push(obj)
+					})
+				}
+				companyList.value = arr;
+			}
+		})
+	}else {
+		companyList.value = []
+	}
+}
+function checkCompanyfocus(){
+	checkCompanyfocusIs.value =true;
+	setTimeout(() => {
+	checkCompanyfocusIs.value =false;
+	},500)
+}
+/* 客户名称/信用码失焦时校验客户名称是否存在 存在就提示 */
+function checkCompany() {	
+	setTimeout(()=>{
+	if(checkCompanyfocusIs.value) return
+	if((!basicform.value.CompanyName && !basicform.value.CreditCode) || (isCheckCompanyInfo.value && basicform.value.CompanyName )) return
+	customInterence.checkCompanyInfo({
+		CompanyName:basicform.value.CompanyName,
+		CreditCode:basicform.value.CreditCode
+	}).then(res =>{
+		if(res.Ret === 200){
+			if(res.Data.RepeatStatus > 0) {
+				repeatId.value = res.Data.CompanyId;
+				repeatName.value = res.Data.ProductName;
+				nameRepeat.value = res.Data.RepeatStatus
+				codeRepeat.value = res.Data.Status
+				isCheck.value = true;
+			}else {
+				nameRepeat.value = 0
+				isCheck.value = false;
+			}
+		}
+	})
+	},500)
+}
+/* 关闭检查弹窗 */
+function closeDia() {
+	repeatId.value = '';
+	repeatName.value = '';
+	isCheck.value = false;
+}
+async function callbackHandle(data,cb) {
+	if (basicform.value.CompanyName) {
+		isCheckCompanyInfo.value =true
+		cb([]);
+		let res = await customInterence.companyQccSearch({ KeyWord: basicform.value.CompanyName});
+		if (res.Ret === 200) {
+			isCheckCompanyInfo.value =false;
+			if (res.Data && res.Data.length > 0) {
+				let arr = res.Data.map((item) => {
+				  return { value:item.Name, ...item };
+				});
+				cb(arr);
+			}else{
+				cb([{}]);
+				checkCompany()
+			}	
+		}	
+	}
+}
+//选中后增加社会信用码
+function customNameSelect(value) {
+	basicform.value.CreditCode = value.CreditCode
+	setTimeout(async()=>{
+			checkCompany()
+	},10)
+}
+
+
+/* 选择行业先校验是否选择了客户类型提示  */
+function slideTrade(e) {
+  if(!dataForm.value.custype) {
+    ElMessage.warning('请先选择客户类型!')
+  }
+}
+
+
+const basicformRef = ref(null)
+const raiformRef = ref(null)
+const ficcformRef = ref(null)
+/* 保存 */
+async function saveHandle() {
+  try {
+    let valid1=await basicformRef.value.validate()
+    if(!valid1) return
+    if(raiform.value){
+      let valid2=await raiformRef.value.validate()
+      if(!valid2) return
+    }
+    if(ficcform.value){
+      let valid3=await ficcform.value.validate()
+      if(!valid3) return
+    }
+    dealedit()
+  } catch (error) {
+  }
+
+}
+/* 取消 */
+function handleCancel(){
+  if(window.history.length>1){
+    $router.go(-1)
+  }else{
+    $router.push({path:'/customList'})
+  }
+}
+function dealedit() {
+    /* 处理公用客户表单 */
+    let params_arr = [];
+    /* 处理权限列表 */
+    const { FiccEdit,RaiEdit  } = canEidtBtns.value;
+
+    if(raiform.value && RaiEdit){
+      let PermissionIds=check_auth.value.join(',')
+      let obj={
+        CompanyProductId:raiform.value.CompanyProductId,
+        CompanyType:raiform.value.ProductName,
+        IndustryId:raiform.value.IndustryId,
+        PermissionIds:PermissionIds,
+        Reasons:raiform.value.Reasons,
+        SellsId:raiform.value.SellerId,
+        Source:raiform.value.Source,
+        Status:raiform.value.Status,
+        Scale:raiform.value.Scale
+      }
+      params_arr.push(obj)
+    }
+    if(ficcform.value && FiccEdit){
+      let PermissionIds=check_auth2.value.join(',')
+      let obj={
+        CompanyProductId:ficcform.value.CompanyProductId,
+        CompanyType:ficcform.value.ProductName,
+        IndustryId:ficcform.value.IndustryId,
+        PermissionIds:PermissionIds,
+        Reasons:ficcform.value.Reasons,
+        SellsId:ficcform.value.SellerId,
+        Source:ficcform.value.Source,
+        Status:ficcform.value.Status
+      }
+      params_arr.push(obj)
+    }
+
+
+    let params = {
+      CompanyId:Number(companyId.value),
+      City:basicform.value.City,
+      Province:basicform.value.Province,
+      CompanyName:basicform.value.CompanyName,
+      CreditCode:basicform.value.CreditCode,
+      Products:params_arr,
+      Nation:basicform.value.RegionType==='海外'?basicform.value.Nation:''
+    }
+    
+    customInterence.customEdit(params).then(res => {
+      if(res.Ret === 200) {
+        ElMessage.success(res.Msg);
+        if(window.history.length>1){
+          $router.go(-1)
+        }else{
+          $router.push({path:'/customList'})
+        }
+        
+      }
+    })
+}
+
+
+const check_auth = ref([])//勾选1 权益
+const	check_auth2 = ref([])//勾选2 ficc
+/* 获取1选中的权限列表key */
+function  getAuthSelect(keys) {
+  check_auth.value = keys;
+}
+/* 获取2选中的权限列表key */
+function getAuthSelect2(keys) {
+  check_auth2.value = keys;
+}
+
+/* 选择全选或取消全选 */
+function handleCheckAll(item) {
+  // 取到所有的子菜单id
+  let ids = item.Items.map(item =>{
+    return item.ChartPermissionId
+  })
+  item.CheckList = item.checkAll ? ids : [];	
+      item.isIndeterminate = false;
+}
+/* 复选框組选中时 */
+function handleChecked(item) {
+  let len = item.CheckList.length;
+  item.checkAll = len === item.Items.length;
+  item.isIndeterminate = len > 0 && len < item.Items.length;
+}
+
+
+
+	//选择地区
+function selectRegion(e) {
+  basicform.value.Province =e.province.value=='省'?'':e.province.value;
+  basicform.value.City = e.city.value=='市'?'':e.city.value;
+}
+
+
+const showViewer = ref(false)
+const	imgView = ref('')
+	/* 预览名片 */
+function reviewCard(card) {
+  showViewer.value = true;
+  imgView.value = card;
+}
+/* 关闭预览 */
+function closeViewer() {
+  imgView.value = '';
+  showViewer.value = false;
+}
+
+
+	/* 去领取 */
+function goPickHandle() {
+  $router.push({
+    path:'/customSearch',
+    query:{
+      name: nameRepeat.value == 2 ? basicform.value.CompanyName :'',
+      code: nameRepeat.value == 1 ?   basicform.value.CreditCode : '' 
+    }
+  })
+}
+
+
+</script>
+<template>
+  <div class="editCustom_box" v-if="showData">
+		<div class="editCustom_container" style="display:flex">
+			<div style="flex:1;margin-right:100px">
+				<div>
+					<p class="page-title">基础信息</p>
+					<el-form
+						:model="basicform"
+						:rules="basicformRule"
+						ref="basicformRef"
+						label-width="100px"
+						style="display:flex;flex-wrap:wrap;"
+						:disabled="!canEidtBtns.BaseInfoEdit"
+					>
+						<el-form-item label="客户名称" prop="CompanyName" style="width:40%;font-size:15px">
+							<el-input
+                disabled
+								v-model="basicform.CompanyName" 
+								placeholder="请输入客户名称"
+								style="width:80%">
+							</el-input>
+							
+						</el-form-item>
+						<el-form-item label="所属区域" prop="RegionType" style="width:26%">
+							<span style="color:#333;font-size: 15px;">{{basicform.RegionType}}</span>
+						</el-form-item>
+						<el-form-item v-if="basicform.RegionType==='海外'" label="所属国家" prop="Nation" style="width:33%"
+							:rules="[{required:true,message: '所属国家不能为空', trigger: 'change' }]">
+							<el-select v-model="basicform.Nation" placeholder="请选择" filterable style="width:80%;">
+								<el-option :label="item.cnName" :value="item.cnName" v-for="item in countryData" :key="item.code" >
+									<div style="display: flex;justify-content: space-between;">
+										<span>{{ item.cnName }}</span>
+										<span style="color: #8492a6; font-size: 13px">{{ item.code }}</span>
+									</div>
+								</el-option>
+							</el-select>
+						</el-form-item>
+						<el-form-item v-else label="客户地址" prop="City" style="width:33%">
+							<search-dist-picker 
+								:provinceInfo="basicform.Province"
+								:cityInfo="basicform.City"
+								:disabled="!canEidtBtns.BaseInfoEdit"
+								@selected="selectRegion"/>
+						</el-form-item>
+						<el-form-item label="社会信用码" prop="CreditCode" style="width:40%">
+							<el-input 
+								v-model="basicform.CreditCode" 
+								placeholder="请输入社会信用码"
+								@blur="checkCompany"
+								@focus="checkCompanyfocus"
+								:disabled="$route.query.id?true:false"
+								style="width:80%">
+							</el-input>
+						</el-form-item>
+						<el-form-item label="客户类型" style="width:26%">
+							<span style="color:#333;font-size: 15px;">{{
+								raiform&&ficcform?'FICC/权益':
+								basicform.CreateAuth==1?'FICC':"权益"
+								}}</span>
+						</el-form-item>
+					</el-form>
+				</div>
+				<!-- 权益模块 -->
+				<div v-if="raiform">
+					<p class="page-title">权益类型信息</p>
+					<el-form
+						:model="raiform"
+						:rules="raiformRule"
+						ref="raiformRef"
+						label-width="100px"
+						style="display:flex;flex-wrap:wrap;width:100%"
+						:disabled="!canEidtBtns.RaiEdit"
+					>
+						<el-form-item label="客户状态" style="width:40%">
+							<span style="color:#333;font-size: 15px;">{{raiform.Status}}</span>
+						</el-form-item>
+						<el-form-item label="所属销售" style="width:26%">
+							<span style="color:#333;font-size: 15px;">{{raiform.SellerName}}</span>
+						</el-form-item>
+						<el-form-item label="所属行业" prop="IndustryId" style="width:33%">
+							<el-select v-model="raiform.IndustryId" placeholder="请选择行业" style="width:80%;" @focus="slideTrade">
+								<el-option
+									v-for="item in tradeArr"
+									:key="item"
+									:label="item.IndustryName"
+									:value="item.IndustryId">
+								</el-option>
+							</el-select>
+						</el-form-item>
+						<el-form-item label="客户来源" prop="Source" style="width:40%">
+							<el-select v-model="raiform.Source" placeholder="请选择客户来源" style="width:80%;" filterable>
+								<el-option
+									v-for="item in fromArr"
+									:key="item.SourceId"
+									:label="item.SourceName"
+									:value="item.SourceName">
+								</el-option>
+							</el-select>
+						</el-form-item>
+						<!-- <el-form-item label="备注" prop="Reasons" style="width:58%">
+							<el-input 
+								v-model="raiform.Reasons" 
+								placeholder="请输入备注"
+								style="width:92%">
+							</el-input>
+						</el-form-item> -->
+						<el-form-item prop="money" label="管理规模"   style="width:40%">
+							<el-select v-model="raiform.Scale" style="width:80%;" clearable placeholder="请选择管理规模(选填)">
+								<el-option
+								v-for="item in optionsMoney"
+								:key="item.value"
+								:label="item.label"
+								:value="item.value">
+								</el-option>
+							</el-select>
+						</el-form-item>
+						<div style="width:98%">
+							<el-collapse v-model="raiCollapseOpen" accordion>
+								<el-collapse-item name="1">
+									<template #title>
+										<p style="display:inline-block;font-size:15px;padding-left:32px">
+											<span style="font-weight:bold">权限配置 </span>
+											<span style="color:#1989FA;display:inline-block;margin-left:10px">{{raiCollapseOpen=='1'?'收起':'展开'}}</span>
+										</p>
+									</template>
+									<CpessionTable fromType="edit" :authList="raiform.authList" :form="1" @selectAuthHandle="getAuthSelect"/>
+										<!-- <CpessionTableEquity fromType="edit" :authList="raiform.authList" :form="1" @selectAuthHandle="getAuthSelect"/> -->
+								</el-collapse-item>
+							</el-collapse>
+						</div>
+					</el-form>
+				</div>
+				<!-- FICC模块 -->
+				<div v-if="ficcform">
+					<p class="page-title">FICC类型信息</p>
+					<el-form
+						:model="ficcform"
+						:rules="ficcformRule"
+						ref="ficcformRef"
+						label-width="100px"
+						style="display:flex;flex-wrap:wrap;width:100%"
+						:disabled="!canEidtBtns.FiccEdit"
+					>
+						<el-form-item label="客户状态" style="width:40%">
+							<span style="color:#333;font-size: 15px;">{{ficcform.Status}}</span>
+						</el-form-item>
+						<el-form-item label="所属销售" style="width:26%">
+							<span style="color:#333;font-size: 15px;">{{ficcform.SellerName}}</span>
+						</el-form-item>
+						<el-form-item label="所属行业" prop="IndustryId" style="width:33%">
+							<el-select v-model="ficcform.IndustryId" placeholder="请选择行业" style="width:80%;" @focus="slideTrade">
+								<el-option
+									v-for="item in tradeArr2"
+									:key="item"
+									:label="item.IndustryName"
+									:value="item.IndustryId">
+								</el-option>
+							</el-select>
+						</el-form-item>
+						<el-form-item label="客户来源" prop="Source" style="width:40%">
+							<el-select v-model="ficcform.Source" placeholder="请选择客户来源" style="width:80%;" filterable>
+								<el-option
+									v-for="item in fromArr"
+									:key="item.SourceId"
+									:label="item.SourceName"
+									:value="item.SourceName">
+								</el-option>
+							</el-select>
+						</el-form-item>
+						<!-- <el-form-item label="备注" prop="Reasons" style="width:58%">
+							<el-input 
+								v-model="ficcform.Reasons" 
+								placeholder="请输入备注"
+								style="width:92%">
+							</el-input>
+						</el-form-item> -->
+						<div style="width:98%">
+							<el-collapse v-model="ficcCollapseOpen"  accordion>
+								<el-collapse-item name="1">
+									<template #title>
+										<p style="display:inline-block;font-size:15px;padding-left:32px">
+											<span style="font-weight:bold">权限配置 </span>
+											<span style="color:#1989FA;display:inline-block;margin-left:10px">{{ficcCollapseOpen=='1'?'收起':'展开'}}</span>
+										</p>
+									</template>
+									<CpessionTable fromType="edit" :authList="ficcform.authList" :form="2" @selectAuthHandle2="getAuthSelect2"/>
+								</el-collapse-item>
+							</el-collapse>
+						</div>
+					</el-form>
+				</div>
+
+			</div>
+
+			<div style="flex-shrink: 0;">
+				<div style="display:flex;justify-content:flex-end;margin:0 0 30px;">
+					<el-button type="primary" style="width:80px;marginRight:24px;" @click="saveHandle">保存</el-button>
+					<el-button type="primary" plain style="width:80px;" @click="handleCancel">取消</el-button>
+				</div>
+				<Ctimeline :id="companyId"></Ctimeline>
+			</div>
+		</div>
+		<!-- 联系人 -->
+		<div class="editCustom_container" style="marginTop:20px;padding:30px 40px 80px 60px;">
+			<div class="customList_bot_top">
+				<div>
+					<input type="file" size="default" name="file" @change="fileSelected()" id="fileImport" class="true-file" style="display:none;">
+					<el-button type="primary" @click="addConcat">添加联系人</el-button>
+					<el-button type="primary" @click="importHandle">批量导入</el-button>
+					<!-- <span style="fontSize:16px;color:#AAB4CC;">(请至少添加一位联系人)</span> -->
+					<a :href="downTemplate" download style="fontSize:14px;color:#409eff;margin-left:30px">下载导入模板</a>
+				</div>
+				<el-input
+					placeholder="姓名/手机号码/邮箱"
+					v-model="search_txt"
+					@input="searchUser"
+					style="maxWidth:500px">
+          <template #prefix>
+            <el-icon><Search/></el-icon>
+          </template>
+				</el-input>
+			</div>
+			<div class="bot_cont">
+				<el-table
+				ref="userTableRef"
+				:data="userTable"
+				border>
+					<el-table-column
+					prop="RealName"
+					label="姓名"
+					align="center">
+						<template #default="scope">
+							<img :src="$icons.card" alt="" style="width:17px;cursor:pointer;marginRight:5px;" 
+							v-if="scope.row.BusinessCardUrl"
+							@click="reviewCard(scope.row.BusinessCardUrl)">
+							<span>{{scope.row.RealName}}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="Position" label="职位" align="center" min-width="80px"></el-table-column>
+					<el-table-column
+					prop="Mobile"
+					label="手机号"
+					align="center"
+					min-width="100">
+						<template #default="scope"><span v-if="scope.row.Mobile&&scope.row.CountryCode">{{scope.row.CountryCode}}-</span><span>{{scope.row.Mobile+(scope.row.MobileTwo?'/'+scope.row.MobileTwo:'')}}</span> </template>
+					</el-table-column>
+					<el-table-column
+					prop="Email"
+					label="邮箱"
+					align="center"
+					min-width="120">
+						<template #default="scope"> <span>{{scope.row.Email}}</span> </template>
+					</el-table-column>
+					<el-table-column
+					prop="IsMaker"
+					label="是否KP"
+					align="center">
+						<template #default="scope"> <span>{{scope.row.IsMaker==1?'是':'否'}}</span> </template>
+					</el-table-column>
+					<el-table-column
+					prop="IsRegister"
+					label="是否注册"
+					align="center">
+						<template #default="scope"> <span>{{scope.row.IsRegister?'已注册':'未注册'}}</span> </template>
+					</el-table-column>
+					<el-table-column
+					prop="CreatedTime"
+					label="注册时间"
+					min-width="150"
+					align="center">
+						<template #default="scope"> <span>{{scope.row.RegisterTime}}</span> </template>
+					</el-table-column>
+					<el-table-column
+					prop="ViewTotal"
+					label="累计阅读次数"
+					align="center">
+						<template #default="scope"> <span>{{scope.row.ViewTotal||'暂无'}}</span> </template>
+					</el-table-column>
+					<el-table-column
+					prop="LastViewTimeStr"
+					label="最近一次阅读时间"
+					min-width="150"
+					align="center">
+						<template #default="scope"> <span>{{scope.row.ViewTotal?scope.row.LastViewTimeStr:''}}</span> </template>
+					</el-table-column>
+					<el-table-column
+					label="阅读报告列表"
+					align="center">
+						<template #default="scope"> <span v-if="scope.row.ViewTotal!=0" class="editsty" @click="lookReport(scope.row)">点击查看</span></template>
+					</el-table-column>
+					<el-table-column label="操作" align="center" width="140px">
+						<template #default="scope">
+							<div style="color:#4099ef; font-size:24px;">
+								<span class="editsty" style="marginRight:8px;" @click="editContact(scope.row)">编辑</span>
+								<span class="deletesty" @click.stop="delConcat(scope.row)">删除</span>
+							</div>
+						</template>
+					</el-table-column>
+          <template #empty>
+            <div style="lineHeight:40px;margin:30px 0;color:#999;">
+              <img src="~@/assets/img/cus_m/nodata.png" alt="" style="display:block;width:160px;height:128px;margin: auto;">
+              <span>暂无联系人</span>
+            </div>
+          </template>
+				</el-table>
+				<el-col :span="24" class="toolbar">
+					<el-pagination 
+					layout="total,prev,pager,next,jumper" 
+					background 
+					:current-page="page_no"
+					@current-change="handleCurrentChange"
+					:page-size="10" 
+					:total="total"
+					style="float:right;">
+					</el-pagination>
+				</el-col>
+			</div>
+		</div>
+		<!-- 添加联系人弹窗 -->
+		<Contactdia
+		:userId="userId"
+		:id="companyId"
+		:name="defaultName"
+		:title="diatit"
+		:userForm="diaform"
+		:custom_name="diaform.companyName||''"
+		:isAddContact="isAddContact"
+		:isEditUser="true"
+		:regionType="regionType"
+		@cancel="canceldialog">
+		</Contactdia>
+		<!-- 阅读报告弹窗 -->
+		<Readia
+		:readId="readId"
+		:lookRead="isRead"
+		:title="readTit"
+		@cancelRead="cancelRead">
+		</Readia>
+		<!-- 图片预览 -->
+		<el-image-viewer 
+		v-if="showViewer" 
+		@close="closeViewer" 
+		:url-list="[imgView]" />
+		<!-- 导入的联系人表格 -->
+		<el-dialog
+		title="批量导入"
+		v-model="isShowImportDia"
+		:close-on-click-modal="false"
+		:modal-append-to-body='false'
+		@close="cancelImport"
+		center
+		width="1000px">
+			<template  v-if="!isImportRepeat">
+				<div style="fontSize:15px;color:#606266;marginBottom:10px;">请确认导入信息(已过滤信息不全的联系人):</div>
+				<el-table :data="importData" border height="350">
+					<el-table-column align="center" label="姓名">
+						<template #default="scope">{{scope.row.RealName}}</template>
+					</el-table-column>
+					<el-table-column align="center" label="性别">
+						<template #default="scope">{{scope.row.Sex==1?'男':scope.row.Sex==2?'女':''}}</template>
+					</el-table-column>
+					<el-table-column align="center" label="手机号">
+						<template #default="scope">{{scope.row.Mobile?scope.row.CountryCode+'-'+scope.row.Mobile:''}}</template>
+					</el-table-column>
+					<!-- <el-table-column align="center" label="手机号2">
+						<template #default="scope">{{scope.row.MobileTwo||''}}</template>
+					</el-table-column> -->
+					<el-table-column align="center" label="邮箱">
+						<template #default="scope">{{scope.row.Email||''}}</template>
+					</el-table-column>
+					<el-table-column align="center" label="是否决策人">
+						<template #default="scope">{{scope.row.IsMaker==1?'是':'否'}}</template>
+					</el-table-column>
+					<el-table-column align="center" label="职位">
+						<template #default="scope">{{scope.row.Position||''}}</template>
+					</el-table-column>
+					<el-table-column align="center" label="部门">
+						<template #default="scope">{{scope.row.DepartmentName||''}}</template>
+					</el-table-column>
+				</el-table>
+			</template>
+			<!-- 重复联系人 -->
+			<template v-else>
+				<div style="font-size:16px;color:#606266;margin-bottom:10px">导入完成。</div>
+				<div style="fontSize:16px;color:#606266;marginBottom:20px;">请单独处理以下系统中已存在的联系人:</div>
+				<el-table :data="repeatData" border height="300">
+					<el-table-column align="center" label="联系人">
+						<template #default="scope">{{scope.row.RealName}}</template>
+					</el-table-column>
+					<el-table-column  align="center" label="手机号/邮箱" width="300">
+						<template #default="scope">
+							{{scope.row.Mobile}} 
+							{{(scope.row.Mobile&&scope.row.Email)?'/':''}}
+							{{scope.row.Email}}
+						</template>
+					</el-table-column>
+					<el-table-column align="center" label="销售">
+						<template #default="scope">{{scope.row.SellerRealName}}</template>
+					</el-table-column>
+					<el-table-column align="center" label="关联客户" min-width="150">
+						<template #default="scope">{{scope.row.CompanyName}}</template>
+					</el-table-column>
+					<el-table-column align="center" label="操作">
+						<template #default="scope">
+							<el-button type="text" size="default" @click="handleMoveToCurrentCustom(scope.row,scope.$index)" v-if="scope.row.HasMove">移至当前客户</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+			</template>
+			<div style="display:flex;justify-content:center;margin:30px 0">
+				<template  v-if="!isImportRepeat">
+					<el-button type="primary" style="marginRight:24px;" @click="ensureImport">确定</el-button>
+					<el-button  type="primary" plain style="width:80px;" @click="cancelImport">取消</el-button>
+				</template>
+				<el-button type="primary" style="width:100px;" v-else @click="cancelImport(1)">知道了</el-button>
+			</div>
+		</el-dialog>
+		<el-dialog
+		v-model="isCheck"
+		:close-on-click-modal="false"
+		:modal-append-to-body='false'
+		:show-close="false"
+		center
+		width="560px">
+      <template #header>
+        <div style="display:flex;alignItems:center;">
+          <span style="fontSize:16px;">提示</span>
+        </div>
+      </template>
+			<div style="textAlign:center;fontSize:16px;" v-if="codeRepeat == 1">
+				<span v-if='raiform'>该客户属于权益客户,是否领取?</span>
+				<span v-if='ficcform'>该客户属于FICC客户,是否领取?</span>
+			</div>	
+			<div style="textAlign:center;fontSize:16px;" v-else>
+				<span>该客户已存在,请前往【客户检索】页面核实</span>
+			</div>	
+			<div style="display:flex;justify-content:center;margin:75px 0 50px;">
+				<el-button type="primary" style="width:80px;marginRight:24px;" @click="goPickHandle">{{codeRepeat == 1 ?'去领取':'去核实'}}</el-button>
+				<el-button  type="primary" plain style="width:80px;" @click="closeDia">取消</el-button>
+			</div>
+		</el-dialog>
+	</div>
+</template>
+<style lang="scss" scoped>
+:deep(.el-icon-arrow-right:before){
+	color: #1989FA;
+}
+.page-title{
+	font-size: 16px;
+	font-weight: bold;
+	color: #333;
+	height: 40px;
+	line-height: 40px;
+	padding-left: 10px;
+	background: #F0F2F5;
+	margin-bottom: 40px;
+}
+.editCustom_container {
+
+	padding:30px 40px 60px 60px;
+	background: #fff;
+	position: relative;
+	border: 1px solid #ECECEC;
+	border-radius: 4px;
+	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+	font-size: 16px;
+	color: #666;
+	/* reset */
+	:deep(.el-form-item) {
+		margin-bottom: 30px;
+		
+		.el-form-item__label{
+			font-size: 15px;
+		}
+		&:last-child {
+			margin-bottom: 0;
+		}
+    .el-form-item__content {
+      height: 40px;
+    }
+	}
+	:deep(.el-collapse) {
+		border: none;
+	}
+	:deep(.el-collapse-item__header) {
+		display: block;
+		border: none;
+		font-size: 16px;
+		color: #333;
+    text-align: left;
+	}
+	:deep(.el-collapse-item__wrap) {
+		border: none;
+	}
+	:deep(.textarea_item .el-form-item__content) {
+		width: 100%;
+	}
+	:deep(.el-form-item__content .menu_item) {
+		line-height: 20px;
+	}
+	:deep(.distpicker-address-wrapper select) {
+		width: 45%;
+	}
+	/*  */
+	.menu_lists {
+		padding: 40px 18px;
+		border: 1px dashed #AAB4CC;
+		border-radius: 4px;
+		.menu_item {
+			display: flex;
+			// align-items: center;
+			margin-bottom: 30px;
+			&:last-child {
+				margin-bottom: 0;
+			}
+			.list_item {
+				margin-right: 30px;
+				margin-bottom: 10px;
+				&:last-child {
+					margin-right: 0;
+				}
+			}
+		}
+	}
+	.customList_bot_top {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		margin-bottom: 28px;
+	}
+}
+:deep(.el-autocomplete-suggestion-data-entry) {
+	width:auto !important;
+}
+:deep(.el-autocomplete-none) {
+	display: none !important;
+}
+.autocomplete-input {
+.el-input__inner {
+	padding-right:65px ;
+	}
+	input {
+	overflow: hidden; // 溢出隐藏
+ 	text-overflow: ellipsis; // 显示省略号
+ 	white-space: nowrap; // 不换行
+	}	
+}
+</style>

+ 22 - 0
src/views/custom_manage/custom/hooks/customlistHook.js

@@ -733,6 +733,27 @@ export function useViewRemarkCustomDia() {
 		isRemarkLook.value = true;
 	}
 
+	//新增备注
+	async function lookRemarkAdd(){
+		if(!lookRemarkTextarea.value) return ElMessage.error("请输入文本内容")
+		const res = await customInterence.lookRemarkAuthAdd({
+			CompanyId:lookRemarkItem.value.CompanyId,
+			Remark:lookRemarkTextarea.value
+		})
+		if(res.Ret===200) {
+			ElMessage.success('保存成功')
+			lookRemarkList.value = []
+			lookRemarkTextarea.value =''
+			customInterence.lookRemarkAuth({
+				CompanyId:lookRemarkItem.value.CompanyId
+			}).then(res => {
+				if(res.Ret === 200) {
+					lookRemarkList.value=res.Data;
+				}
+			})
+		}
+	}
+
 	//删除备注
 	async function lookRemarkDelete(data){
 		ElMessage('备注删除后不可恢复,确认删除吗?','提示',{
@@ -767,6 +788,7 @@ export function useViewRemarkCustomDia() {
 		isRemarkLook,
 		lookRemarkItem,
 		lookRemarkDelete,
+		lookRemarkAdd,
 		closeRemark,
 		lookRemarkHandle
 	}

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