Browse Source

merge 770需求次

bding 1 year ago
parent
commit
36c011b5fd
35 changed files with 1621 additions and 146 deletions
  1. 2 1
      config/dev.env.js
  2. 4 3
      config/prod.env.js
  3. 2 1
      config/prod.test.env.js
  4. 7 0
      src/api/modules/crmApi.js
  5. 34 0
      src/api/modules/rai/lableApi.js
  6. 2 0
      src/api/modules/rai/raiApi.js
  7. 8 0
      src/api/modules/setApi.js
  8. BIN
      src/assets/img/home/icon01.png
  9. BIN
      src/assets/img/home/icon02.png
  10. BIN
      src/assets/img/home/icon03.png
  11. BIN
      src/assets/img/home/logo.png
  12. BIN
      src/assets/img/icons/msg2.png
  13. BIN
      src/assets/img/login_r_b.png
  14. BIN
      src/assets/img/rai_m/edit_icon.png
  15. BIN
      src/assets/img/rai_m/remove_below.png
  16. 4 4
      src/components/questionMsgDia.vue
  17. 1 1
      src/main.js
  18. 6 0
      src/routes/modules/cygxRoutes.js
  19. 6 6
      src/routes/routes.js
  20. 19 3
      src/views/Home.vue
  21. 16 15
      src/views/Login.vue
  22. 3 3
      src/views/contract_manage/addContract.vue
  23. 3 3
      src/views/contract_manage/editContract.vue
  24. 67 20
      src/views/custom_manage/compontents/Ctimeline.vue
  25. 300 0
      src/views/custom_manage/compontents/historyContract.vue
  26. 23 0
      src/views/custom_manage/customList/components/customRemarkDialog.vue
  27. 17 12
      src/views/custom_manage/customList/customDetail.vue
  28. 44 13
      src/views/custom_manage/customList/customList.vue
  29. 423 46
      src/views/custom_manage/customList/customShareList.vue
  30. 46 2
      src/views/custom_manage/customSearch.vue
  31. 22 9
      src/views/dataReport_manage/components/CollectList.vue
  32. 5 0
      src/views/interaction_manage/videoManageEN.vue
  33. 471 0
      src/views/rai_manage/cygxManage/lableManage.vue
  34. 5 4
      src/views/report_manage/tagLib.vue
  35. 81 0
      src/views/transferPage.vue

+ 2 - 1
config/dev.env.js

@@ -9,5 +9,6 @@ module.exports = merge(prodEnv, {
   Login:'"http://localhost:7777/login"',
   CHART_LINK:'"https://charttest.hzinsights.com/chartshow"',
   HR_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8391/login"',
-  FINANCIAL_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8618/login"'
+  FINANCIAL_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8618/login"',
+  ETA_SYSTEM:'"http://8.136.199.33:7778/temppage"'
 });

+ 4 - 3
config/prod.env.js

@@ -1,9 +1,10 @@
 module.exports = {
 	NODE_ENV:'"production"',
-	API_ROOT:'"https://hzcrm.hzinsights.com/adminapi"',  //生产环境
+	API_ROOT:'"https://admin.hzinsights.com/adminapi"',  //生产环境
 	Domain:'"hzinsights.com"',
-	Login:'"https://hzcrm.hzinsights.com/login"',
+	Login:'"https://admin.hzinsights.com/login"',
 	CHART_LINK:'"https://chartlib.hzinsights.com/chartshow"',
 	HR_MANAGEMENT_SYSTEM:'"https://hr.hzinsights.com/login"',
-	FINANCIAL_MANAGEMENT_SYSTEM:'"https://fms.hzinsights.com/login"'
+	FINANCIAL_MANAGEMENT_SYSTEM:'"https://fms.hzinsights.com/login"',
+	ETA_SYSTEM:'"https://eta.hzinsights.com/temppage"'
 }

+ 2 - 1
config/prod.test.env.js

@@ -7,5 +7,6 @@ module.exports = {
 	Login:'"http://8.136.199.33:7777/login"',
 	CHART_LINK:'"https://charttest.hzinsights.com/chartshow"',
 	HR_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8391/login"',
-  FINANCIAL_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8618/login"'
+  FINANCIAL_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8618/login"',
+  ETA_SYSTEM:'"http://8.136.199.33:7778/temppage"'
 }

+ 7 - 0
src/api/modules/crmApi.js

@@ -512,6 +512,13 @@ const customInterence = {
     addCustomRemark:(params)=>{
         return http.post("/custom/share/remark/add",params)
     },
+    /**
+     * 客户列表,正式客户共享-删除备注
+     * RemarkId
+     */
+    deleteRemark:(params)=>{
+        return http.post("/custom/remark/del",params)
+    },
   /* 审批列表
 		PageSize *
 		CurrentIndex *

+ 34 - 0
src/api/modules/rai/lableApi.js

@@ -0,0 +1,34 @@
+import http from "@/api/http.js";
+
+const lableApi = {
+  // 获取标签列表-自定义顺序
+  getLableTagListCustom: (params) => {
+    return http.get("/cygx/tag/list/custom", params);
+  },
+  // 获取标签列表
+  getLableTagList: (params) => {
+    return http.get("/cygx/tag/list", params);
+  },
+  // 撤下或上线标签
+  getLableTagEnable: (params) => {
+    return http.get("/cygx/tag/enable", params);
+  },
+  // 搜索所有的报告系列
+  getLableTagSubCategoryName: (params) => {
+    return http.get("/cygx/tag/subCategoryName/list", params);
+  },
+  // 获取关联产业列表
+  getLableTagIndustrialManagement: (params) => {
+    return http.get("/cygx/tag/industrialManagement/listByName", params);
+  },
+  // 新增标签
+  postLableTagSave: (params) => {
+    return http.post("/cygx/tag/save", params);
+  },
+  // 移动标签
+  postLableTagMove: (params) => {
+    return http.post("/cygx/tag/move", params);
+  },
+};
+
+export default lableApi;

+ 2 - 0
src/api/modules/rai/raiApi.js

@@ -3,6 +3,7 @@ import timeLineApi from "./timeLine.js";
 import raiReport from "./reportApi";
 import raiBanner from "./bannerApi.js";
 import internalInterface from "./internalApi.js";
+import lableApi from "./lableApi.js"
 import raiPoints from "./pointsApi.js";
 /* 权益小程序管理 */
 const raiInterface = {
@@ -10,6 +11,7 @@ const raiInterface = {
   ...timeLineApi,
   ...raiBanner,
   ...internalInterface,
+  ...lableApi,
   ...raiPoints,
   /* 
 		优化建议列表

+ 8 - 0
src/api/modules/setApi.js

@@ -236,6 +236,14 @@ const departInterence = {
 	 */
 	sortDepart:params=>{
 		return http.post('/system/group/set_sort',params)
+	},
+	// 获取跳转到ETA系统的code
+	getToETASysCode:()=>{
+		return http.get('/sysuser/get_eta_auth_code',{})
+	},
+	//从其他系统跳转来用code换token
+	useCodeLogin:params=>{
+		return http.get('/sysuser/auth_code_login',params)
 	}
 }
 

BIN
src/assets/img/home/icon01.png


BIN
src/assets/img/home/icon02.png


BIN
src/assets/img/home/icon03.png


BIN
src/assets/img/home/logo.png


BIN
src/assets/img/icons/msg2.png


BIN
src/assets/img/login_r_b.png


BIN
src/assets/img/rai_m/edit_icon.png


BIN
src/assets/img/rai_m/remove_below.png


+ 4 - 4
src/components/questionMsgDia.vue

@@ -19,10 +19,10 @@
                 </div>
             </div>
         </div>
-        <div slot="reference" style="position:relative;cursor: pointer;marginRight:26px" >
-            <div v-if="isshow">
-                <img src="~@/assets/img/icons/msg.png" alt="" style="height:32px;marginTop:6px;">
-                <span style="width:8px;height:8px;borderRadius:50%;background:#f00;display:block;position:absolute;right:-4px;top:3px;" v-show="list.length>0"></span>
+        <div slot="reference">
+            <div v-if="isshow" class="icon-box-item">
+                <img src="~@/assets/img/icons/msg2.png" alt="" style="height:20px;width:20px">
+                <span style="width:8px;height:8px;borderRadius:50%;background:#f00;display:block;position:absolute;right:5px;top:3px;" v-show="list.length>0"></span>
             </div>
         </div>
     </el-popover>

+ 1 - 1
src/main.js

@@ -140,7 +140,7 @@ router.beforeEach((to, from, next) => {
 	// let rddp_user_name=http.getCookie('rddp_user_name') || false;
 	// let rddp_admin_access_token=http.getCookie('rddp_admin_access_token') || false;
 	let auth = localStorage.getItem('auth') || false;
-	if( to.path!='/login'&&(!auth)){
+	if( to.path!='/login'&&to.path!='/temppage'&&(!auth)){
 		window.location.href=process.env.Login;
 		return false;
 	}

+ 6 - 0
src/routes/modules/cygxRoutes.js

@@ -337,6 +337,12 @@ export default [
         name: "banner管理",
         hidden: false,
       },
+      {
+        path: "lableManage",
+        component: () => import("@/views/rai_manage/cygxManage/lableManage.vue"),
+        name: "标签管理",
+        hidden: false,
+      },
     ],
   },
 

+ 6 - 6
src/routes/routes.js

@@ -29,12 +29,12 @@ let routes = [
 		name: '',
 		hidden: true
 	},
-	// {
-	// 	path: '/temppage',
-	// 	component: ()=>import('@/views/transferPage.vue'),
-	// 	name: '',
-	// 	hidden: true
-	// },
+	{
+		path: '/temppage',
+		component: ()=>import('@/views/transferPage.vue'),
+		name: '',
+		hidden: true
+	},
 	{
 		path: '/404',
 		component: notFound,

File diff suppressed because it is too large
+ 19 - 3
src/views/Home.vue


+ 16 - 15
src/views/Login.vue

@@ -1,8 +1,8 @@
 <template>
 	<div id="login">
 		<div id="login_wrapper">
-			<img class="login-bg" src="../assets/img/login_bg.png" alt />
-			<img class="login-icon" src="../assets/img/login_icon.png" alt />
+			<img class="login-bg" src="https://hzstatic.hzinsights.com/static/hz_crm_web/imgs/login_bg.png" alt />
+			<img class="login-icon" src="https://hzstatic.hzinsights.com/static/hz_crm_web/imgs/login_logo.png" alt />
 			<el-form
 				:model="ruleForm"
 				:rules="rules"
@@ -16,13 +16,13 @@
 				<el-form-item>
 					<h1
 						style="
-							font-size: 30px;
+							font-size: 38px;
 							text-align: center;
-							color: #3d6ff5;
+							color: #333;
 							margin-bottom: 30px;
 						"
 					>
-						弘则研究后台管理系统
+						运营管理系统
 					</h1>
 				</el-form-item>
 				<el-form-item prop="account">
@@ -68,11 +68,10 @@
 						@click.native="handleSubmit2"
 						:loading="logining"
 						class="submit_btn"
-						>立即登录</el-button
+						>登录</el-button
 					>
 				</el-form-item>
 			</el-form>
-			<img class="login-r-b" src="../assets/img/login_r_b.png" alt />
 		</div>
 	</div>
 </template>
@@ -212,7 +211,8 @@ export default {
 
 					for (let i = 0; i < menuList.length; i++) {
 						const element = menuList[i];
-						if(element.children.some(it => it.path == pathVal)){
+						const arr=menuList[i].children||[]
+						if(arr.some(it => it.path == pathVal)){
 							resolvePath='/'+pathVal
 							break
 						}
@@ -233,7 +233,7 @@ export default {
 #login {
 	width: 100%;
 	height: 100%;
-	background: #e6e6e6;
+	background: #fff;
 	position: relative;
 	overflow: hidden;
 	#login_wrapper {
@@ -241,19 +241,18 @@ export default {
 		height: 100%;
 		background-color: #ffffff;
 		position: relative;
-
 		.login-bg {
 			position: absolute;
-			left: 0;
-			bottom: 0;
-			width: 46%;
+			top: 50px;
+			left: 50px;
+			height: calc(100% - 100px);
+			max-width: 50%;
 		}
 
 		.login-icon {
 			position: absolute;
 			top: 44px;
-			right: 160px;
-			width: 16%;
+			right: 40px;
 		}
 
 		.login-r-b {
@@ -265,6 +264,7 @@ export default {
 
 		#login-container {
 			width: 31%;
+			max-width: 570px;
 			box-sizing: border-box;
 			border-radius: 10px;
 			position: absolute;
@@ -284,6 +284,7 @@ export default {
 				background: #007eff;
 				font-size: 16px;
 				border-radius: 5px;
+				margin-top: 30px;
 			}
 			.el-input input {
 				width: 100%;

+ 3 - 3
src/views/contract_manage/addContract.vue

@@ -472,7 +472,7 @@ export default {
       cb([])
       if(!queryString) return
       let CompanyType=localStorage.getItem('RoleType')
-      let res=await customInterence.customList({KeyWord:queryString,PageSize:10000,CompanyType:CompanyType})
+      let res=await customInterence.customList({KeyWord:queryString,PageSize:10000,CompanyType:CompanyType,IncludeShare:true})
       // this.contractTypeDisable1=false
       // this.contractTypeDisable2=false
       // this.contractTypeDisable3=false
@@ -795,7 +795,7 @@ export default {
 
           // 判断套餐权限
           if(this.cusLastcontract&&!this.handleValidate(params)) return
-
+          
           if(type==='预览'){
             this.handlePreview(params)
           }else{
@@ -868,7 +868,7 @@ export default {
             console.log('时间重叠');
             e.Service.forEach(item2=>{
               console.log(item2.ChartPermissionId,item.ChartPermissionId);
-              if(item2.ChartPermissionId===0||item2.ChartPermissionId===item.ChartPermissionId){
+              if(item2.ChartPermissionId===item.ChartPermissionId){
                 this.$message.warning('同行业有重叠的合同期限,请核实后再提交')
                 tag=false
               }

+ 3 - 3
src/views/contract_manage/editContract.vue

@@ -505,7 +505,7 @@ export default {
     // 初始化客户搜索动作
     async initCustomeSelect(queryString){
       let CompanyType=localStorage.getItem('RoleType')
-      let res=await customInterence.customList({KeyWord:queryString,PageSize:10000,CompanyType:CompanyType})
+      let res=await customInterence.customList({KeyWord:queryString,PageSize:10000,CompanyType:CompanyType,IncludeShare:true})
       if(res.Ret===200){
         if(res.Data.List&&res.Data.List.length>0){
           this.handleSelectCustome(res.Data.List[0])
@@ -518,7 +518,7 @@ export default {
       cb([])
       if(!queryString) return
       let CompanyType=localStorage.getItem('RoleType')
-      let res=await customInterence.customList({KeyWord:queryString,PageSize:10000,CompanyType:CompanyType})
+      let res=await customInterence.customList({KeyWord:queryString,PageSize:10000,CompanyType:CompanyType,IncludeShare:true})
       // this.contractTypeDisable1=false
       // this.contractTypeDisable2=false
       // this.contractTypeDisable3=false
@@ -724,7 +724,7 @@ export default {
             console.log('时间重叠');
             e.Service.forEach(item2=>{
               console.log(item2.ChartPermissionId,item.ChartPermissionId);
-              if(item2.ChartPermissionId===0||item2.ChartPermissionId===item.ChartPermissionId){
+              if(item2.ChartPermissionId===item.ChartPermissionId){
                 this.$message.warning('同行业有重叠的合同期限,请核实后再提交')
                 tag=false
               }

+ 67 - 20
src/views/custom_manage/compontents/Ctimeline.vue

@@ -1,21 +1,28 @@
 <template>
 	<div class="Ctimeline_container" v-if="activities.length">
-		<el-timeline>
-			<el-timeline-item
-				v-for="(activity, index) in activities"
-				:key="index"
-				:timestamp="activity.CreateTime"
-				color="#409EFF"
-				placement="top">
-				{{activity.SysRealName+(specialOperationList.includes(activity.Operation)?'添加未续约说明':activity.Remark)}}
-				<!-- {{activity.SysRealName+activity.Remark}} -->
-				<span v-if="activity.Operation=='freeze'&&activity.ApproveContent" class="freeze-text" @click="showFreeze(activity)">冻结理由</span>
-				<span v-if="(specialOperationList.includes(activity.Operation))&&activity.ApproveContent" @click="showRemark(activity)" class="freeze-text">未续约说明</span>
-				<!-- <span v-if="activity.Operation=='try_out'&&!isHasTryOutRenewalReason" class="freeze-text" @click="showAddRemark(activity)">添加说明</span> -->
-				<span v-if="isShowBtn&&index==firstTryOutIdx" class="freeze-text" @click="showAddRemark(activity)">添加未续约说明</span>
-				<span v-if="activity.Operation==='close'&&activity.ApproveContent" @click="showCloseRemark(activity)" class="freeze-text">关闭理由</span>
-			</el-timeline-item>
-		</el-timeline>
+		<div class="timeline-tab" v-if="ficcProcess.length&&raiProcess.length">
+			<span :class="{'active':timeLineType==='ficc'}" @click="changeTimeLineData('ficc')">FICC</span>
+			<span :class="{'active':timeLineType==='rai'}" @click="changeTimeLineData('rai')">权益</span>
+		</div>
+		<div class="timeline-wrap" :style="{maxHeight:`${(ficcProcess.length&&raiProcess.length)?'430px':'490px'}`}">
+			<el-timeline>
+				<el-timeline-item
+					v-for="(activity, index) in timeLineData"
+					:key="index"
+					:timestamp="activity.CreateTime"
+					color="#409EFF"
+					placement="top">
+					{{activity.SysRealName+(specialOperationList.includes(activity.Operation)?'添加未续约说明':activity.Remark)}}
+					<!-- {{activity.SysRealName+activity.Remark}} -->
+					<span v-if="activity.Operation=='freeze'&&activity.ApproveContent" class="freeze-text" @click="showFreeze(activity)">冻结理由</span>
+					<span v-if="(specialOperationList.includes(activity.Operation))&&activity.ApproveContent" @click="showRemark(activity)" class="freeze-text">未续约说明</span>
+					<!-- <span v-if="activity.Operation=='try_out'&&!isHasTryOutRenewalReason" class="freeze-text" @click="showAddRemark(activity)">添加说明</span> -->
+					<span v-if="isShowBtn&&index==firstTryOutIdx" class="freeze-text" @click="showAddRemark(activity)">添加未续约说明</span>
+					<span v-if="activity.Operation==='close'&&activity.ApproveContent" @click="showCloseRemark(activity)" class="freeze-text">关闭理由</span>
+				</el-timeline-item>
+			</el-timeline>
+		</div>
+		
 		<!-- 冻结理由弹窗 -->
 		<!-- <el-dialog
 		:visible.sync="show"
@@ -116,6 +123,10 @@ export default {
 			// 显示未续约说明按钮类型
 			specialOperationList:['edit_renewal_reason','add_renewal_reason','add_try_out_reason'],
 			isShowBtn: false,	// 是否显示添加未续约说明按钮
+			ficcProcess:[],
+			raiProcess:[],
+			timeLineType:'',
+			timeLineData:[]
 		};
 	},
 	methods: {
@@ -132,7 +143,13 @@ export default {
 							CreateTime:item.CreateTime.replace(/-/g,'.')
 						}
 					}) || [];
-
+					//将进度流程拆分为FICC和权益
+					this.ficcProcess = this.activities.filter(item=>item.ProductName==='ficc')
+					this.raiProcess = this.activities.filter(item=>item.ProductName!=='ficc')
+					this.changeTimeLineData('ficc')
+					if(!this.ficcProcess.length&&this.raiProcess.length){
+						this.changeTimeLineData('rai')
+					}
 				}
 			})
 		},
@@ -214,6 +231,14 @@ export default {
 				showCancelButton:false
 			}).then(()=>{}).catch(()=>{})
 		},
+		//改变时间线展示的内容
+		changeTimeLineData(type){
+			if(type===this.timeLineType) return 
+			this.timeLineType = type
+			type==='ficc'&&(this.timeLineData = this.ficcProcess)
+			type==='rai'&&(this.timeLineData = this.raiProcess)
+			document.querySelector('.timeline-wrap')&&(document.querySelector('.timeline-wrap').scrollTop = 0)
+		}
 	},
 	computed: {
 		// 第一个正式转试用索引
@@ -231,10 +256,9 @@ export default {
 <style lang='scss' >
 .Ctimeline_container {
 	box-sizing: border-box;
-	min-width: 270px;
+	min-width: 428px;
 	max-height: 550px;
-	overflow-y: auto;
-	padding: 28px 44px;
+	padding: 30px;
 	border: 1px solid #AAB4CC;
 	background: #fff;
 	border-radius: 4px;
@@ -258,5 +282,28 @@ export default {
 		cursor: pointer;
 		margin:0 5px;
 	}
+	.el-timeline{
+		margin:5px;
+	}
+	.timeline-tab{
+		display: flex;
+		margin-bottom: 30px;
+		span{
+			flex: 1;
+			text-align: center;
+			display: inline-block;
+			height: 30px;
+			line-height: 30px;
+			cursor: pointer;
+			&.active{
+				background-color: #EDF4FF;
+				color:#3385FF;
+			}
+		}
+	}
+	.timeline-wrap{
+		//max-height: calc(550px - 120px);
+		overflow-y: auto;
+	}
 }
 </style>

+ 300 - 0
src/views/custom_manage/compontents/historyContract.vue

@@ -0,0 +1,300 @@
+<template>
+    <!-- 历史签约弹窗 -->
+    <div class="history-contract-wrap">
+        <el-dialog
+        :visible.sync="isPreview"
+        :modal-append-to-body='false'
+        @close="$emit('close')"
+        title="历史签约"
+        center
+        top="7vh"
+        v-dialogDrag
+        width="1200px">
+            <div class="dialog-wrap">
+                <div class="contract-tab">
+                    <span :class="{'active':contractType==='ficc'}" @click="changeContractType('ficc')">FICC</span>
+                    <span :class="{'active':contractType==='rai'}" @click="changeContractType('rai')">权益</span>
+                </div>
+                <div class="contract-list">
+                    <div class="contract-item" v-for="(item,index) in contractList" :key="item.ContractCode">
+                        <div class="contract-tag">
+                            <el-tag>
+                                {{item.ContractType}}
+                                <el-tooltip
+                                class="item" 
+                                effect="dark"
+                                v-if="item.ContractType!='补充协议'"
+                                placement="top-start">
+                                    <div slot="content" v-if="item.ContractType=='新签合同'">没有正式转试用记录的客户,在申请转正时提交的合同</div>
+                                    <div slot="content" v-if="item.ContractType=='续约合同'">
+                                        1、有正式转试用记录的客户,在申请转正时提交的合同<br>
+                                        2、所有客户在续约申请时提交的合同
+                                    </div>
+                                    <i class="el-icon-info"></i>
+                                </el-tooltip>
+                            </el-tag>
+                            <span :style="{'text-decoration-line':item.ContractId?'underline':'none'}" @click="toContractDetail(item)">合同编号:{{item.ContractCode}}</span>
+                        </div>
+                        <div class="line"></div>
+                        <!-- 合同基本信息 -->
+                        <div class="contract-base">
+                            <ul class="base-lise">
+                                <li><p>合同期限:{{item.StartDate+'~'+item.EndDate}}</p><p>合同金额:{{item.Money}}</p></li>
+                                <li><p>付款方式:{{item.PayMethod}}</p><p>付款渠道:{{item.PayChannel}}</p></li>
+                                <li><p>审批时间:{{item.ModifyTimeStr|formatTime}}</p><p></p></li>
+                            </ul>
+                        </div>
+                        <!-- 权限设置和查看附件 -->
+                        <div class="contract-info">
+                            <div @click="showExpand(index,'root')">权限设置 <span><i :class="item.extend?'el-icon-arrow-down':'el-icon-arrow-right'"></i></span></div>
+                            <!-- <el-button type="primary" style="width:100px;" @click="showContractFiles(item)">合同附件</el-button> -->
+                        </div>
+                        <div class="contract-root" v-show="item.extend">
+                            <ul class="menu_lists">
+                                <li v-for="auth in item.PermissionList" :key="auth.ClassifyName" class="menu_item">
+                                    <el-checkbox :indeterminate="auth.CheckList.length>0&&auth.CheckList.length<auth.Items.length" v-model="auth.CheckAll" disabled style="marginRight:30px;fontWeight:bold;">{{auth.ClassifyName+':'}}</el-checkbox>
+                                    <el-checkbox-group v-model="auth.CheckList" disabled>
+                                        <el-checkbox v-for="list in auth.Items" :label="list.ChartPermissionId" :key="list.ChartPermissionId" class="list_item">{{list.PermissionName}}</el-checkbox>
+                                    </el-checkbox-group>
+                                </li>
+                            </ul>
+                        </div>
+                        <div class="contract-info">
+                            <div @click="showExpand(index,'files')">合同附件 <span><i :class="item.filesExtend?'el-icon-arrow-down':'el-icon-arrow-right'"></i></span></div>
+                        </div>
+                       <div class="contract-files" v-show="item.filesExtend">
+                            <ul class="file-list">
+                                <li v-for="img in item.constractFiles" :key="img">
+                                    <img :src="require('@/assets/img/constract/word-icon.png')" v-if="img.type=='word'" @click="preViewConstractFile(img)"/>
+                                    <img :src="require('@/assets/img/constract/pdf.png')" v-else-if="img.type=='pdf'" @click="preViewConstractFile(img)"/>
+                                    <img :src="img.url" v-else-if="img.type=='img'" @click="preViewConstractFile(img,item.constractFiles)"/>
+                                </li>
+                            </ul>
+                       </div>
+                    </div>
+                    <span v-if="!contractList.length" style="font-size:16px;color:#999;">暂无历史合同</span>
+                </div>
+            </div>
+            <el-image-viewer 
+                v-if="showViewer" 
+                :on-close="()=>{this.showViewer = false}" 
+                :url-list="constractFileImgList" />
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
+export default {
+    props:{
+        isPreview:{
+            type:Boolean,
+            default:false
+        },
+        dealList:{
+            type:Array,
+            default:()=>{return []}
+        }
+    },
+    components:{ElImageViewer},
+    watch:{
+        isPreview(val){
+            if(val){
+                this.getContractList()
+            }
+        }
+    },
+    data() {
+        return {
+            ficcContractList:[],
+            raiContractList:[],
+            contractList:[],
+            contractType:'',
+            showViewer:false,
+            constractFileImgList:[]
+        };
+    },
+    methods: {
+        getContractList(){
+            this.ficcContractList = this.dealList.filter(i=>i.ProductId===1)
+            this.raiContractList = this.dealList.filter(i=>i.ProductId===2)
+            this.changeContractType('ficc')
+            if(!this.ficcContractList.length&&this.raiContractList.length){
+                this.changeContractType('rai')
+            }
+        },
+        changeContractType(type){
+            if(this.contractType===type) return 
+            this.contractType = type
+            type==='ficc'&&(this.contractList=this.ficcContractList)
+            type==='rai'&&(this.contractList=this.raiContractList)
+        },
+        showContractFiles(data){
+            this.constractFileImgList = []
+            const {constractFiles} = data
+            const imageList = constractFiles.filter(i=>i.type==='img')
+            const wordList = constractFiles.filter(i=>i.type==='word')
+            const pdfList = constractFiles.filter(i=>i.type==='pdf')
+            imageList.forEach(i=>{
+                this.constractFileImgList.push(i.url)
+            })
+            /* wordList.forEach(i=>{
+                window.open('https://view.officeapps.live.com/op/view.aspx?src='+i.url,'_blank');
+            })
+            pdfList.forEach(i=>{
+                window.open(i.url);
+            }) */
+            if(this.constractFileImgList.length){
+                this.showViewer = true
+            }
+        },
+        preViewConstractFile(data,list=[]){
+            this.constractFileImgList = []
+            if(data.type==='word'){
+                window.open('https://view.officeapps.live.com/op/view.aspx?src='+data.url,'_blank');
+            }
+            if(data.type==='pdf'){
+                window.open(data.url);
+            }
+            if(data.type==='img'){
+                //改变list的顺序,当前点击的为第一个
+                list.filter(i=>i.type==='img').map(i=>{this.constractFileImgList.push(i.url)})
+                const index = this.constractFileImgList.findIndex(url=>url===data.url)
+                this.constractFileImgList = [...this.constractFileImgList.slice(index),...this.constractFileImgList.slice(0,index)]
+                if(this.constractFileImgList.length){
+                    this.showViewer = true
+                }
+            }
+        },
+        showExpand(index,type='root'){
+            type==='root'&&(this.contractList[index].extend = !this.contractList[index].extend)
+            type==='files'&&(this.contractList[index].filesExtend = !this.contractList[index].filesExtend)
+            this.contractList.splice(index,1,this.contractList[index])
+        },
+        toContractDetail(item){
+            if(!item.ContractId) return 
+            const { href } = this.$router.resolve({path:'/contractdetail',query:{contractId:item.ContractId}})||{href:''}
+            href&&window.open(href, '_blank');
+        }
+    },
+};
+</script>
+
+<style scoped lang="scss">
+.history-contract-wrap{
+    .dialog-wrap{
+        padding:5px 60px 30px 60px;
+        .contract-tab{
+            display: flex;
+            margin-bottom: 30px;
+            span{
+                flex: 1;
+                text-align: center;
+                font-size: 16px;
+                padding-bottom: 5px;
+                cursor: pointer;
+                &.active{
+                    color: #0052D9;
+                    border-bottom: 2px solid #0052D9;
+                }
+            }
+        }
+        .contract-list{
+            max-height: 600px;
+            min-height: 200px;
+            overflow-y: auto;
+            padding-right: 6px;
+            .contract-item{
+                padding:20px;
+                border:1px solid #DCDFE6;
+                border-radius: 4px;
+                margin-bottom: 30px;
+                display: flex;
+                flex-direction: column;
+                gap:20px 0;
+                .contract-tag{
+                    span{
+                        cursor: pointer;
+                        &:last-child{
+                           margin-left: 12px; 
+                        }
+                        font-size: 16px;
+                        color:#409EFF;
+                    }
+                }
+                .line{
+                    height: 1px;
+                    background-color: #DCDFE6;
+                    margin: 0 -20px;
+                }
+                .contract-base{
+                    li{
+                        display: flex;
+                        border: 1px solid #DCDFE6;
+                        border-bottom: none;
+                        &:last-child{
+                            border-bottom: 1px solid #DCDFE6;
+                        }
+                        p{
+                            font-size: 16px;
+                            flex: 1;
+                            min-height: 48px;
+                            display: flex;
+                            align-items: center;
+                            margin-left: 20px;
+                            &:first-child{
+                                border-right: 1px solid #DCDFE6;
+                            }
+                        }
+                    }
+                }
+                .contract-info{
+                    display: flex;
+                    justify-content: space-between;
+                    align-items: center;
+                    div,i::before{
+                        font-size: 14px;
+                        font-weight: bold;
+                        color:#333333;
+                        cursor: pointer;
+                    }
+                }
+                .contract-root{
+                    border:2px dashed #DCDFE6;
+                    border-radius: 4px;
+                    padding:20px;
+                    .menu_lists{
+                        li{
+                            display: flex;
+                            margin-bottom: 20px;
+                            &:last-child{
+                                margin-bottom: 0;
+                            }
+                        }
+                    }
+                }
+                .contract-files{
+                    .file-list{
+                        display: flex;
+                        gap: 10px;
+                        flex-wrap: wrap;
+                        li{
+                            width:240px;
+                            height:180px;
+                            padding: 10px;
+                            box-sizing: border-box;
+                            cursor: pointer;
+                            border-radius: 4px;
+                            background-color: rgb(170, 170, 170);;
+                            img{
+                                width: 100%;
+                                height: 100%;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+</style>

+ 23 - 0
src/views/custom_manage/customList/components/customRemarkDialog.vue

@@ -29,6 +29,12 @@
                 <el-table-column label="创建时间" key="CreateTime" align="center">
                     <template slot-scope="scope">{{scope.row.CreateTime}}</template>
                 </el-table-column>
+                <el-table-column label="操作" align="center" v-if="Role!=='admin'">
+                    <template slot-scope="{row}">
+                        <el-button type="text" size="small" style="color:red;" v-if="row.ButtonDel"
+                            @click="deleteRecord(row)">删除</el-button>
+                    </template>
+                </el-table-column>
             </el-table>
         </template>
         <div style="padding:20px 0;"></div>
@@ -101,6 +107,23 @@ export default {
                 this.tableLoading = false
             })
         },
+        //删除备注
+        deleteRecord(data){
+            this.$confirm('备注删除后不可恢复,确认删除吗?','提示',{
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type:'warning',
+                appendToBody:false
+            }).then(()=>{
+                customInterence.deleteRemark({
+                    RemarkId:data.RemarkId
+                }).then(res=>{
+                    if(res.Ret!==200) return 
+                    this.$message.success("删除成功")
+                    this.getRemarkList()
+                })
+            })
+        },
         closeDia(){
             this.$emit('close')
         }

+ 17 - 12
src/views/custom_manage/customList/customDetail.vue

@@ -127,13 +127,10 @@
 
 				</div>
 				<div style="flex-shrink: 0;">
-					<div style="fontSize:14px;color:#409EFF;textAlign:right;marginBottom:15px;" v-if="isBtnShow.BtnHistoryList&&dealList.length">
-						<span @click="previewHistory" style="cursor:pointer;">历史签约</span>
-					</div>
-					
-					<div style="display:flex;justify-content:flex-end;margin:0 0 30px;">
-						<el-button type="primary" style="width:80px;marginRight:24px;" @click="editHandle" v-if="isBtnShow.BtnEdit">编辑</el-button>
-						<el-button type="primary" plain style="width:80px;" @click="delHandle" v-if="isBtnShow.BtnDelete">删除</el-button>
+					<div style="display:flex;justify-content:flex-end;align-items: center;gap:0 20px;margin:0 0 30px;">
+						<span style="color:#409EFF;cursor:pointer;font-size: 14px;margin-right: 20px;" v-if="isBtnShow.BtnHistoryList&&dealList.length" @click="previewHistory">历史签约</span>
+						<el-button type="primary" style="width:100px;" @click="editHandle" v-if="isBtnShow.BtnEdit">编辑</el-button>
+						<el-button type="danger" plain style="width:100px;" @click="delHandle" v-if="isBtnShow.BtnDelete">删除</el-button>
 					</div>
 					<Ctimeline :id="companyId"></Ctimeline>
 				</div>
@@ -373,8 +370,8 @@
 		v-if="showViewer" 
 		:on-close="closeViewer" 
 		:url-list="[imgView]" />
-		<!-- 历史签约弹窗 -->
-		<el-dialog
+		<!-- 历史签约弹窗 旧版-->
+		<!-- <el-dialog
 		:visible.sync="isPreview"
 		:modal-append-to-body='false'
 		:show-close="false"
@@ -441,7 +438,7 @@
 									<el-image :src="require('@/assets/img/constract/word-icon.png')" style="width:240px;height:180px;" v-if="img.type=='word'" @click.native="preViewConstractFile(img)"></el-image>
 									<pdf ref="pdf" :src="img.url" style="width:240px;height:180px;overflow:hidden" v-else-if="img.type=='pdf'" @click.native="preViewConstractFile(img)"></pdf>
 									<el-image :src="img.url" :preview-src-list="constractFileImgList" alt="" style="background:#aaa;width:240px;height:180px;" v-else @click.native="preViewConstractFile(item.constractFiles)"/>
-									<!-- <i class="el-icon-zoom-in" style="position:absolute;right:12px;top:12px;color:#fff;" @click="preViewConstractFile(img)"></i> -->
+									<i class="el-icon-zoom-in" style="position:absolute;right:12px;top:12px;color:#fff;" @click="preViewConstractFile(img)"></i>
 								</li>
 							</ul>
 						</li>
@@ -449,7 +446,7 @@
 				</div>
 			</template>
 			<span v-else>暂无历史合同</span>
-		</el-dialog>
+		</el-dialog> -->
 		<!-- 导入的联系人表格 -->
 		<el-dialog
 		title="批量导入"
@@ -632,6 +629,12 @@
 		></product-read-info>
 		<!-- 研选服务点数明细 弹框 -->
 		<DeductDetailDlg :isShowResearchNumber.sync="isShowResearchNumber" :dataForm="raiform"/>
+		<!-- 历史签约弹窗 新版 -->
+		<HistoryContract 
+			:isPreview="isPreview"
+			:dealList="dealList"
+			@close="isPreview=false"
+		/>
 	</div>	
 </template>
 
@@ -649,9 +652,10 @@ import CpessionTableEquity from '../compontents/CpessionTableEquity.vue'
 import ExportData from '../compontents/exportData.vue'
 import ProductReadInfo from '../compontents/ProductReadInfo.vue'
 import DeductDetailDlg from './components/deductDetailDlg.vue'
+import HistoryContract from '../compontents/historyContract.vue'
 export default {
 	name:'',
-	components: {Ctimeline,Contactdia,Readia,ElImageViewer,CpessionTable,pdf,chartAuthDialog, ExportData ,CpessionTableEquity, ProductReadInfo, DeductDetailDlg},
+	components: { Ctimeline, Contactdia, Readia, ElImageViewer, CpessionTable, pdf, chartAuthDialog, ExportData, CpessionTableEquity, ProductReadInfo, DeductDetailDlg, HistoryContract },
 	computed:{
 		Role() {
 			let role = localStorage.getItem('Role') || '';
@@ -851,6 +855,7 @@ export default {
 		//点击预览历史签约中的合同附件
 		preViewConstractFile(e) {
 			console.log(e);
+			this.constractFileImgList=[]
 			if(e instanceof Array){
 				e.forEach(item=>{
 					if(item.type==='img'){

+ 44 - 13
src/views/custom_manage/customList/customList.vue

@@ -641,7 +641,8 @@
 		<el-dialog
 		:visible.sync="isRemarkLook"
 		:close-on-click-modal="false"
-		:modal-append-to-body='false'
+		:modal-append-to-body="true"
+		:append-to-body="true"
 		@close="closeDia"
 		width="800px"
 		v-dialogDrag
@@ -674,6 +675,12 @@
 				<el-table-column label="创建时间"  key="CreateTime" align="center">
 					<template slot-scope="scope">{{scope.row.CreateTime}}</template>
 				</el-table-column>
+				<el-table-column label="操作" align="center">
+					<template slot-scope="{row}">
+						<el-button type="text" size="small" style="color:red;" v-if="row.ButtonDel"
+							@click="lookRemarkDelete(row)">删除</el-button>
+					</template>
+				</el-table-column>
 			</el-table>
 			</template>
 			<div style="padding:20px 0;"></div>
@@ -2080,6 +2087,28 @@ ShareListDialog},
 				})
 			}
 		},
+		//删除备注
+		async lookRemarkDelete(data){
+			this.$confirm('备注删除后不可恢复,确认删除吗?','提示',{
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type:'warning',
+				appendToBody:false
+			}).then(async()=>{
+				const res = await customInterence.deleteRemark({
+					RemarkId:data.RemarkId
+				})
+				if(res.Ret!==200) return 
+				this.$message.success("删除成功")
+				customInterence.lookRemarkAuth({
+					CompanyId:this.lookRemarkItem.CompanyId
+				}).then(res => {
+					if(res.Ret === 200) {
+						this.lookRemarkList=res.Data;
+					}
+				})
+			})
+		},
 		accumulativeFrequencyClick(item){
 			this.accumulativeFrequencyDlg = true
 			this.accumulativeFrequencyItem = item.row
@@ -2480,18 +2509,6 @@ ShareListDialog},
 			}
 		}
 	}
-	.look-remark-commit {
-		width: 426px;
-		height: 41px;
-		background: #409EFF;
-		margin:  30px auto;
-		text-align: center;
-		line-height: 41px;
-		color: #fff;
-		box-shadow: 0px 2px 6px 1px rgba(64, 158, 255, 0.05);
-		border-radius: 4px 4px 4px 4px;
-		cursor: pointer;
-	}
 	.mouse-enter {
 		&:hover {
 			text-decoration:underline;
@@ -2545,4 +2562,18 @@ ShareListDialog},
 		}
 	}
 }
+</style>
+<style lang="scss">
+.look-remark-commit{
+	width: 426px;
+	height: 41px;
+	background: #409EFF;
+	margin:  30px auto;
+	text-align: center;
+	line-height: 41px;
+	color: #fff;
+	box-shadow: 0px 2px 6px 1px rgba(64, 158, 255, 0.05);
+	border-radius: 4px 4px 4px 4px;
+	cursor: pointer;
+	}
 </style>

+ 423 - 46
src/views/custom_manage/customList/customShareList.vue

@@ -272,21 +272,38 @@
                     </el-table-column>
 					<el-table-column label="操作" align="center" min-width="7.14%">
 						<template slot-scope="scope">
-						    <div class="tool" style="display: flex;flex-direction: column;">
-						        <span class="editsty" style="white-space: nowrap;" @click="itemclickHandle({type:'查看权限',data:scope.row})">
-						            查看权限
-						        </span>
-						        <span @click="itemclickHandle({type:'分配销售',data:scope.row})" v-if="Role=='thisAdmin'" class="editsty"
-						            style="white-space: nowrap;">
-						            {{scope.row.ShareSellerId?'修改销售':'分配销售'}}
-						        </span>
-						        <span class="editsty" @click="itemclickHandle({type:'服务记录',data:scope.row})">
-						            服务记录
-						        </span>
-						        <span class="editsty" @click="itemclickHandle({type:'备注',data:scope.row})">
-						            备注
-						        </span>
-						    </div>
+							<div class="tool" style="display: flex; align-items: center;justify-content: center;" v-if="scope.row.ApproveStatus!='待审批'">
+								<!-- <span class="editsty" style="white-space: nowrap;" @click="itemclickHandle({type:'查看权限',data:scope.row})">
+									查看权限
+								</span>
+								<span @click="itemclickHandle({type:'分配销售',data:scope.row})" v-if="Role=='thisAdmin'" class="editsty"
+									style="white-space: nowrap;">
+									{{scope.row.ShareSellerId?'修改销售':'分配销售'}}
+								</span>
+								<span class="editsty" @click="itemclickHandle({type:'服务记录',data:scope.row})">
+									服务记录
+								</span>
+								<span class="editsty" @click="itemclickHandle({type:'备注',data:scope.row})">
+									备注
+								</span> -->
+								<div class="font-tool" style="display:flex;flex-direction:column;">
+									<span class="editsty" v-for="item in getToolBtnList(scope.row).slice(0,3)" :key="item.type" @click="itemclickHandle({type:item.type,data:scope.row})">
+										{{item.type==='分配销售'?scope.row.ShareSellerId?'修改销售':'分配销售':item.type}}
+									</span>
+								</div>
+								<el-dropdown size="medium" placement="bottom-start" @command="itemclickHandle" style="height: 16px;margin-left: 5px;" v-if="getToolBtnList(scope.row).length>3">
+									<span class="el-dropdown-link">
+										<i class="el-icon-more el-icon--right"></i>
+										<el-dropdown-menu slot="dropdown">
+											<el-dropdown-item :command="{type:item.type,data:scope.row}" 
+											v-for="item in getToolBtnList(scope.row).slice(3)" :key="item.type">
+												<span>{{item.type}}</span>
+											</el-dropdown-item>
+										</el-dropdown-menu>
+									</span>
+								</el-dropdown>
+
+							</div>
 						</template>
 					</el-table-column>
 					<div slot="empty" style="line-height:44px;margin:60px 0;color:#999;">
@@ -314,7 +331,7 @@
 		:visible.sync="assignedSellerShow"
 		:close-on-click-modal="false"
 		:modal-append-to-body='false'
-    :title="assignedSellerTitle"
+		:title="assignedSellerTitle"
 		@close="cancelAssign"
 		center
 		width="444px">
@@ -328,7 +345,7 @@
 						placeholder="请选择修改的销售"
 						style="width: 240px"
 						filterable>
-            <el-option :label="item.RealName" :value="item.AdminId" v-for="item in salesArr" :key="item.AdminId"></el-option>
+						<el-option :label="item.RealName" :value="item.AdminId" v-for="item in salesArr" :key="item.AdminId"></el-option>
 					</el-select>
 				</el-form-item>
 			</el-form>	
@@ -346,7 +363,7 @@
       :customInfo.sync="customInfo"
     />
     <!-- 路演业阅读的弹框 -->
-		<accumulative-frequency-dlg :accumulativeFrequencyDlg.sync="accumulativeFrequencyDlg" :accumulativeFrequencyItem.sync="accumulativeFrequencyItem" />
+	<accumulative-frequency-dlg :accumulativeFrequencyDlg.sync="accumulativeFrequencyDlg" :accumulativeFrequencyItem.sync="accumulativeFrequencyItem" />
     <!-- 服务记录弹窗 -->
     <share-list-dialog 
         :isShareRecodeDialogShow.sync="isShareRecodeDialogShow"
@@ -359,6 +376,53 @@
         :lookRemarkItem="customInfo"
         @close="isRemarkLook=false"
     />
+	<!-- 补全客户信息弹窗 -->
+	<CompleteInfo
+		:form="completeForm"
+		@cancel="cancelCompleteInfo($event)"
+	></CompleteInfo>
+
+	<!-- 合同  -->
+	<el-dialog
+		:visible.sync="contractModel.show"
+		:modal-append-to-body='false'
+		width="800px"
+		class="self-dialog"
+		v-dialogDrag
+	>
+		<div style="text-align:center;margin:30px 0 100px 0">
+			<img width="191" src="../../../assets/img/cus_m/bzht.png" @click="handleContractModel('标准')" style="margin-right:80px;cursor: pointer;">
+			<img width="191" src="../../../assets/img/cus_m/fbzht.png" @click="handleContractModel('非标准')" style="cursor: pointer;">
+			<p style="font-size:15px;color:#333;text-align:left;padding-left:100px;margin-top:30px">
+				注:<br>
+				系统生成合同请选择标准合同入口<br>
+				非系统生成合同请选择非标准合同入口(包含已走完邮件流程的标准合同)</p>
+		</div>
+	</el-dialog>
+	<!-- 合同信息 -->
+	<ContractInfo 
+		:initData="contractDialog" 
+		@contractInfoDialogClose="contractInfoDialogClose"
+	></ContractInfo>
+
+	<!-- 增开试用弹窗 -->
+	<el-dialog
+		:visible.sync="isAddTrial"
+		:close-on-click-modal="false"
+		:modal-append-to-body='false'
+		@close="isAddTrial=false"
+		width="800px"
+		v-dialogDrag
+		center>
+			<div slot="title" style="display:flex;alignItems:center;">
+				<span style="fontSize:16px;">增开试用(默认两个月)</span>
+			</div>
+			<Cauthlist
+				:autharr="authList"
+				:id="addTryId"
+				@addOver="addTryOver"
+				@close="isAddTrial=false"/>
+		</el-dialog>
 	</div>
 </template>
 
@@ -370,10 +434,13 @@ import mixin from './mixins/customlistMixin';
 import TotalDayDialog from '../compontents/TotalDayDialog.vue'
 import ShareListDialog from './components/shareListDialog.vue';
 import CustomRemarkDialog from './components/customRemarkDialog.vue';
+import ContractInfo from '../compontents/ContractInfo.vue';
+import CompleteInfo from '../compontents/CompleteInfo.vue';
+import Cauthlist from '../compontents/CauthList.vue';
 export default {
 	name:'',
 	mixins: [ mixin ],
-	components: {TotalDayDialog,AccumulativeFrequencyDlg,permissionView, ShareListDialog,CustomRemarkDialog},
+	components: {TotalDayDialog,AccumulativeFrequencyDlg,permissionView, ShareListDialog,CustomRemarkDialog,ContractInfo,CompleteInfo,Cauthlist},
 	computed:{
 		isPWang(){
 			return this.adminId == 66
@@ -398,14 +465,14 @@ export default {
 	},
 	data () {
 
-    this.statusList = ['全部','已分配','待分配']
+		this.statusList = ['全部','已分配','待分配']
 		return {
 			adminId:localStorage.getItem('AdminId'),
 			sales:[],
 			salesArr:[],//销售
 			tableData:[],
 			isShowloadding:false,
-      status:2,
+			status:2,
 			search_txt:'',
 			total:0,
 			page_no:1,
@@ -415,7 +482,7 @@ export default {
 			lookAuthList:[],//查看的权限
 			lookAuthListEquity:[],//权益
 			assignedSellerShow:false,//分配销售弹窗
-      assignedSellerTitle:'分配销售',
+			assignedSellerTitle:'分配销售',
 			assignform:{
 				CompanyId:'',
 				CompanyName:'',
@@ -430,11 +497,29 @@ export default {
 			sort_param:'',//自定义排序方式的哪一个
 			btnCommandList:{
 				BtnView: '查看权限',
-				BtnAllocation: '分配销售'
+				BtnModifySeller: '分配销售',
+				BtnUpdate: '续约申请',
+				BtnAddAgreement: '补充协议',
+				BtnTryOut: '增开试用',
+				BtnServiceRecord:'服务记录',
+				BtnRemarkView:'备注'
 			},	// 按钮命令列表
 			accumulativeFrequencyDlg:false,//路演业阅读的弹框
 			accumulativeFrequencyItem:{},
-            isRemarkLook:false,//备注的弹框
+			isRemarkLook:false,//备注的弹框
+			contractDialog:{
+				show:false,
+				type:'',//类型 续约申请、补充协议
+				cusdata:null,//客户信息(列表用户数据)
+			},//续约申请、补充协议 合同信息弹窗
+			contractModel:{
+				show:false,
+				data:null,//客户信息(列表用户数据)
+				type:'',//类型 续约申请、补充协议
+			},//续约申请、补充协议 选择合同类型弹窗 
+			completeForm:{},
+			isAddTrial:false,
+			authList:[],
 		};
 	},
 	methods: {
@@ -447,8 +532,8 @@ export default {
 				PageSize:this.pageSize,
 				CurrentIndex:this.page_no,
 				Keyword:this.search_txt,
-        ListParam:this.Role=='thisSeller'?1:this.status, // 销售只能看分配给自己的共享客户,即状态需要是已分配
-        SellerId:this.sales.join(',')
+				ListParam:this.Role=='thisSeller'?1:this.status, // 销售只能看分配给自己的共享客户,即状态需要是已分配
+				SellerId:this.sales.join(',')
 			}
 			customInterence.getShareCustomList(params).then(res => {
 				if(res.Ret === 200) {
@@ -474,20 +559,34 @@ export default {
 				query:{
 					id:item.CompanyId,
 				}});
-      		window.open(href, '_blank');
+			window.open(href, '_blank');
+		},
+		getToolBtnList(data){
+			let toolList = []
+			const {BtnItem} = data
+			for(const i in this.btnCommandList){
+				if(BtnItem[i]){
+					toolList.push({type:this.btnCommandList[i]})
+				}
+			}
+			return toolList
 		},
 
 		/* 操作-按钮 */
 		async itemclickHandle(query) {
-			if(query.type == '分配销售') {
-        this.assignedSellerFun(query.data)
+			if(query.type == '分配销售'||query.type=='修改销售') {
+				this.assignedSellerFun(query.data)
 			}else if(query.type=='查看权限'){
 				this.lookHandle(query.data)
-            }else if(query.type=='服务记录'){
-                this.handleShowShareRecode(query.data)
-            }else if(query.type=='备注'){
-                this.handleShowRemark(query.data)
-            }
+			}else if(query.type=='服务记录'){
+				this.handleShowShareRecode(query.data)
+			}else if(query.type=='备注'){
+				this.handleShowRemark(query.data)
+			}else if(["续约申请","补充协议"].includes(query.type)){
+				this.handleOpenContractChoose(query.type,query.data)
+			}else if("增开试用"){
+				this.addTrialHandle(query.data)
+			}
 		},
 		/* 查看权限 */
 		lookHandle(item) {
@@ -496,7 +595,7 @@ export default {
 				CompanyId:item.CompanyId
 			}).then(res => {
 				if(res.Ret === 200) {
-          this.isLook = true;
+					this.isLook = true;
 					let auth = [];			
 					res.Data.List ?	res.Data.List.forEach(item=> { 
 						auth.push(item.Items)
@@ -512,14 +611,14 @@ export default {
 				}
 			})
 		},
-    assignedSellerFun(row){
+		assignedSellerFun(row){
 			this.assignform = {
 				CompanyName:row.CompanyName,
 				CompanyId:row.CompanyId,
 				SellsId:row.ShareSellerId==0?'':row.ShareSellerId+'',
 			}
 			this.assignedSellerShow = true;
-    },
+		},
 		/* 页码改变 */
 		handleCurrentChange(page) {
 			this.page_no = page;
@@ -529,7 +628,7 @@ export default {
 		closeDia() {
 			this.lookTitle = '';
 			this.lookAuthList = [];
-      this.lookAuthListEquity = []
+			this.lookAuthListEquity = []
 			this.isLook = false;
 		},
 		/* 分配销售 */
@@ -562,26 +661,304 @@ export default {
 		},
 		/* 到期天数排序发生变化 全局排序 */
 		sortChangeHandle(item) {
-        this.sort_type = item.order === 'ascending' ? 'asc':item.order === 'descending' ? 'desc' : '';
-        this.sort_param = item.prop;
-				this.getTableData();
+			this.sort_type = item.order === 'ascending' ? 'asc':item.order === 'descending' ? 'desc' : '';
+			this.sort_param = item.prop;
+			this.getTableData();
 		},
 		accumulativeFrequencyClick(item){
 			this.accumulativeFrequencyDlg = true
 			this.accumulativeFrequencyItem = item.row
 		},
-        handleShowRemark(item){
-            this.customInfo = item
-            this.isRemarkLook = true
-        }
+		handleShowRemark(item){
+			this.customInfo = item
+			this.isRemarkLook = true
+		},
+		//关闭合同信息弹窗
+		contractInfoDialogClose(e){
+			this.contractDialog={
+				show:false,
+				type:'',
+				cusdata:null,
+			}
+			if(e==='updateList'){
+				this.getTableData();
+			}
+		},
+		//验证客户信息完整性
+		async getCustomerDetail(id){
+			let res=await customInterence.customDetail({
+				CompanyId:id
+			})
+			if(res.Ret!=200) return
+
+			let RoleType=localStorage.getItem('RoleType')
+			let IndustryId='',Source=';'
+			if(RoleType=='ficc'){
+				IndustryId=res.Data.FiccItem.IndustryId
+				Source=res.Data.FiccItem.Source
+			}else if(RoleType=='权益'){
+				IndustryId=res.Data.RaiItem.IndustryId
+				Source=res.Data.RaiItem.Source
+			}
+			if((res.Data.Item.RegionType!='海外'&&!res.Data.Item.Province&&!res.Data.Item.City)||!res.Data.Item.CreditCode||!IndustryId||!Source){
+				this.completeForm={
+					nameDisable:res.Data.Item.CompanyName!='',
+					CityDisable:res.Data.Item.City!='',
+					CreditCodeDisable:res.Data.Item.CreditCode!='',
+					IndustryIdDisable:IndustryId!=' ',
+					SourceDisable:Source!='',		
+					CompanyId:id,
+					name:res.Data.Item.CompanyName,
+					Province:res.Data.Item.Province,
+					RegionType:res.Data.Item.RegionType,
+					City:res.Data.Item.City,
+					CreditCode:res.Data.Item.CreditCode,
+					IndustryId:IndustryId?IndustryId:'',
+					Source:Source,
+					flag:false,//是否为跨部门
+					show:true
+				}
+			}else{
+				this.completeForm.show=false
+			}
+			return new Promise((resolve,reject)=>{
+				resolve(this.completeForm.show)
+			})
+		},
+		//关闭补全信息弹窗
+		cancelCompleteInfo(refresh){
+			// 刷新列表
+			if(refresh){
+				this.getTableData()
+			}
+			this.completeForm={
+				show:false
+			}
+		},
+		//打开合同选择弹窗
+		async handleOpenContractChoose(type,data){
+			
+			let flag=await this.getCustomerDetail(data.CompanyId)
+			if(flag) return
+			this.contractModel = {
+				type,data,show:true
+			}
+		},
+		//选择标准/非标合同
+		handleContractModel(model){
+			if(model==='标准'){
+				this.contractDialog.type = this.contractModel.type
+				this.contractDialog.cusdata = this.contractModel.data
+				this.contractDialog.show = true
+			}else{
+				sessionStorage.setItem('companyInfo',JSON.stringify(this.contractModel.data))
+				const routeMap = {
+					'续约申请':'/updateCustom',
+					'补充协议':'/addAgreement'
+				}
+				const { href } = this.$router.resolve({path:routeMap[this.contractModel.type],})||{href:''}
+				href&&window.open(href, '_blank');
+			}
+			this.contractModel={
+				type:'',data:null,show:false
+			}
+		},
+		//增加试用完成
+		addTryOver(){
+			this.isAddTrial = false;
+			this.getTableData();
+		},
+		//增开试用
+		addTrialHandle(item) {
+			this.authList = [];
+			customInterence.lookauth({
+				CompanyId:item.CompanyId,
+				LookType:1
+			}).then(res => {
+				if(res.Ret === 200) {
+					let auth = [];
+					// res.Data.List 有值为 ficc
+					// res.Data.ListRai 有值为 权益
+					res.Data.List ? res.Data.List.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,
+							defaultAuth:item.CheckList,
+							customType:'ficc',
+							...item,
+						}
+						auth.push(obj)
+					}):
+					// 权益 RaiMerge 0不管 1合并 2拆分 所传入的数据结构不一样
+					res.Data.ListRai[0].RaiMerge==1?res.Data.ListRai.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,
+							defaultAuth:item.CheckList,
+							...item,
+						}
+						auth.push(obj)
+					}): res.Data.ListRai.forEach(item=> { // 拆分
+						let obj = {
+							defaultAuth:item.CheckList,
+							customType:'权益',
+							...item,
+						}	
+						// 组合所需的数据格式
+						obj.dataList=[
+							{
+								PermissionTypeName:'',
+								medicine:{
+									value:'医药',
+									isIndeterminate:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length ==1,
+									isCheckAll:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length == 2,
+									isDisabled:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length ==2
+								},
+								consumption:{
+									value:'消费',
+									isIndeterminate:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length ==1,
+									isCheckAll:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length == 2,
+									isDisabled:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length ==2
+								},
+								technology:{
+									value:'科技',
+									isIndeterminate:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length ==1,
+									isCheckAll:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length == 2,
+									isDisabled:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length ==2
+								},
+								smart:{
+									value:'智造',
+									isIndeterminate:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==1,
+									isCheckAll:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length == 2,
+									isDisabled:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==2
+								},
+								strategy:{
+									value:'策略'
+								},
+								experts:{
+									value:'专家'
+								},
+								roadshow:{
+									value:'路演服务'
+								},
+								choose:{
+									value:'买方研选'
+								}
+							},
+							{
+								PermissionTypeName:{
+									value:'主观',
+									isIndeterminate:[1,2,3].includes(item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
+										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length),
+									isCheckAll:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
+										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length == 4,
+									isDisabled:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
+										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length ==4
+								},
+								medicine:{
+									value:obj.Items[0].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[0].ChartPermissionId)
+								},
+								consumption:{
+									value:obj.Items[2].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[2].ChartPermissionId)
+								},
+								technology:{
+									value:obj.Items[4].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[4].ChartPermissionId)
+								},
+								smart:{
+									value:obj.Items[6].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[6].ChartPermissionId)
+								},
+								strategy:{
+									value:obj.Items[8].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[8].ChartPermissionId)
+								},
+								experts:{
+									value:obj.Items[9].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[9].ChartPermissionId)
+								},
+								roadshow:{
+									value:obj.Items[10].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[10].ChartPermissionId)
+								},
+								choose:{
+									value:obj.Items[11].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[11].ChartPermissionId)
+								}
+							},
+							{
+								PermissionTypeName:{
+									value:'客观',
+									isIndeterminate:[1,2,3].includes(item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
+										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length),
+									isCheckAll:item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
+										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length == 4,
+									isDisabled:item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
+										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==4
+								},
+								medicine:{
+									value:obj.Items[1].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[1].ChartPermissionId)
+								},
+								consumption:{
+									value:obj.Items[3].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[3].ChartPermissionId)
+								},
+								technology:{
+									value:obj.Items[5].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[5].ChartPermissionId)
+								},
+								smart:{
+									value:obj.Items[7].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[7].ChartPermissionId)
+								},
+								strategy:{
+									value:obj.Items[8].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[8].ChartPermissionId)
+								},
+								experts:{
+									value:obj.Items[9].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[9].ChartPermissionId)
+								},
+								roadshow:{
+									value:obj.Items[10].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[10].ChartPermissionId)
+								},
+								choose:{
+									value:obj.Items[11].ChartPermissionId,
+									isDisabled:item.CheckList.includes(obj.Items[11].ChartPermissionId)
+								}
+							}
+						]
+
+						auth.push(obj)
+					})
+					this.authList = auth;
+				}
+			})
+			this.addTryId = item.CompanyId;
+			this.isAddTrial = true;
+		},
 	},
 	created() {
 		this.getSale()
-    this.getTableData()
+		this.getTableData()
 	}
 }
 </script>
 
+<style lang='scss'>
+	.self-dialog{
+		.el-dialog__header{
+			background-color: #fff !important;
+			.el-dialog__close.el-icon.el-icon-close{
+				color: #666;
+			}
+		}
+	}
+</style>
 <style lang='scss' scoped>
 	.ficc-package {
 		display: inline-block;

+ 46 - 2
src/views/custom_manage/customSearch.vue

@@ -415,7 +415,8 @@
 		<el-dialog
 		:visible.sync="isRemarkLook"
 		:close-on-click-modal="false"
-		:modal-append-to-body='false'
+		:modal-append-to-body="true"
+		:append-to-body="true"
 		@close="closeDia"
 		width="800px"
 		v-dialogDrag
@@ -448,6 +449,12 @@
 				<el-table-column label="创建时间"  key="CreateTime" align="center">
 					<template slot-scope="scope">{{scope.row.CreateTime}}</template>
 				</el-table-column>
+				<el-table-column label="操作" align="center">
+					<template slot-scope="{row}">
+						<el-button type="text" size="small" style="color:red;" v-if="row.ButtonDel"
+							@click="lookRemarkDelete(row)">删除</el-button>
+					</template>
+				</el-table-column>
 			</el-table>
 			</template>
 			<div style="padding:20px 0;"></div>
@@ -1556,7 +1563,29 @@ export default {
 				}
 				})
 			}
-		}
+		},
+		//删除备注
+		async lookRemarkDelete(data){
+			this.$confirm('备注删除后不可恢复,确认删除吗?','提示',{
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type:'warning',
+				appendToBody:false
+			}).then(async()=>{
+				const res = await customInterence.deleteRemark({
+					RemarkId:data.RemarkId
+				})
+				if(res.Ret!==200) return 
+				this.$message.success("删除成功")
+				customInterence.lookRemarkAuth({
+					CompanyId:this.lookRemarkItem.CompanyId
+				}).then(res => {
+					if(res.Ret === 200) {
+						this.lookRemarkList=res.Data;
+					}
+				})
+			})
+		},
 	},
 	created() {
 		/* 返回保持上次的状态 */
@@ -1652,4 +1681,19 @@ export default {
 		}
 	}
 }
+</style>
+<style lang="scss">
+	.look-remark-commit {
+		width: 426px;
+		height: 41px;
+		background: #409EFF;
+		margin:  30px auto;
+		text-align: center;
+		line-height: 41px;
+		color: #fff;
+		box-shadow: 0px 2px 6px 1px rgba(64, 158, 255, 0.05);
+		border-radius: 4px 4px 4px 4px;
+		cursor: pointer;
+	
+	}
 </style>

+ 22 - 9
src/views/dataReport_manage/components/CollectList.vue

@@ -18,7 +18,7 @@
       <div class="dialog-container" >
         <p>共{{total||0}}张图表</p>
         <div class="list-wrap" v-loading="listLoading">
-          <div class="list-item" v-for="item in ListData" :key="item.Id" @click="showChartDetail(item.UniqueCode)">
+          <div class="list-item" v-for="item in ListData" :key="item.Id" @click="showChartDetail(item)">
             <span class="item-title">{{item.ChartName||'该图表已被删除'}}</span>
             <div class="item-image-wrap">
               <div class="image" :style="{backgroundImage:`url(${item.ChartImage})`}">
@@ -52,7 +52,7 @@
 </template>
 
 <script>
-import { dataMainInterface } from '@/api/api.js';
+import { dataMainInterface,departInterence } from '@/api/api.js';
 import chartDetail from '@/views/mychart_manage/components/chartDetailDia.vue';
 export default {
   props:{
@@ -124,13 +124,14 @@ export default {
       const {Paging,List} = res.Data
       this.ListData = List.map(item=>{
         const ChartInfo = item.ChartInfo||{}
-        const {UniqueCode,ChartName,ChartImage,Id} = ChartInfo
+        const {UniqueCode,ChartName,ChartImage,ChartInfoId} = ChartInfo
         const temp = {
-          Id:Id||'',
+          Id:item.Id||'',
           UniqueCode:UniqueCode||'',
           ChartName:ChartName||'',
           ChartImage:ChartImage||'',
-          CreateTime:item.CreateTime||''
+          CreateTime:item.CreateTime||'',
+          ChartInfoId:ChartInfoId||''
         }
         return temp
       })
@@ -145,10 +146,22 @@ export default {
       this.pageNo = page
       this.getCollectList()
     },
-    showChartDetail(id){
-      if(!id) return
-      this.chartId=id
-      this.isOpenDetail = true
+    async showChartDetail(item){
+      if(!item.UniqueCode) return
+      // 跳转去ETA
+      const redirect_uri=encodeURIComponent(`/chartsetting?code=${item.UniqueCode}&id=${item.ChartInfoId}`)
+      let href = process.env.ETA_SYSTEM
+      console.log(href);
+      console.log(redirect_uri);
+      // 获取临时code
+      const res=await departInterence.getToETASysCode()
+      if(res.Ret===200){
+        href=`${href}?code=${res.Data}&redirect_uri=${redirect_uri}`
+        window.open(href,'_blank');
+      }
+      
+      // this.chartId=id
+      // this.isOpenDetail = true
     },
     handleRemove(UniqueCode){
       this.allCharts.splice(this.allCharts.findIndex(item=>item===UniqueCode),1)

+ 5 - 0
src/views/interaction_manage/videoManageEN.vue

@@ -774,6 +774,11 @@ export default {
         }
     }
 }
+.send-email-wrap{
+    .el-input{
+        width: 100%;
+    }
+}
 </style>
 
 <style lang="scss" scoped>

+ 471 - 0
src/views/rai_manage/cygxManage/lableManage.vue

@@ -0,0 +1,471 @@
+<template>
+  <div class="container lable-manage-page">
+    <el-card style="overflow: hidden">
+      <div class="top-comtent">
+        <span>当前标签</span>
+        <el-button type="primary" @click="addOfEitdHandler('添加')">添加标签</el-button>
+      </div>
+      <div ref="lableSortable" class="lable-content">
+        <div class="lable-item" v-for="item in lableList" :key="item.TagId">
+          <div class="text_oneLine">{{ item.TagName }}</div>
+          <div class="lable-img">
+            <img src="~@/assets/img/rai_m/edit_icon.png" alt="" @click="addOfEitdHandler('编辑', item)" />
+            <img src="~@/assets/img/rai_m/remove_below.png" alt="" @click="lableButtonHandel('撤下', item)" />
+          </div>
+        </div>
+      </div>
+    </el-card>
+    <el-card style="margin-top: 20px">
+      <div class="lable-select-box">
+        <div v-for="(item, index) in tableSelect" :key="item.value" @click="tableSelectHandel(item)" class="item">
+          <span :class="['name', tableSelectActive == item.value && 'active']">{{ item.name }}</span>
+          <span v-if="index == 0" class="divide">|</span>
+        </div>
+      </div>
+      <el-table border :data="tableList">
+        <el-table-column align="center" key="name" prop="TagName" label="标签名称" width=""></el-table-column>
+        <el-table-column align="center" key="series" prop="ArticleTypes" label="报告系列" width=""></el-table-column>
+        <el-table-column align="center" key="type" prop="ActivityTypes" label="活动类型" width=""></el-table-column>
+        <el-table-column align="center" key="industry" prop="Industries" label="相关产业" width=""></el-table-column>
+        <el-table-column align="center" key="subject" prop="SubjectNames" label="相关标的" width=""></el-table-column>
+        <el-table-column align="center" key="tiem" prop="OnlineTime" label="上线时间" width="180"></el-table-column>
+        <el-table-column align="center" key="remove" prop="OfflineTime" label="撤下时间" width="180" v-if="tableSelectActive == 0"></el-table-column>
+        <el-table-column align="center" key="pvuv" prop="Sort" label="pv/uv" width="90">
+          <template slot-scope="{ row }">
+            <div class="pv-uv-download">
+              <span>{{ row.Pv }}/{{ row.Uv }}</span>
+              <a :href="exportPvUv(row.TagId)" download>
+                <img src="~@/assets/img/rai_m/pvuv_download.png" alt="" />
+              </a>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" key="operate" label="操作" width="125" v-if="tableSelectActive == 0">
+          <template slot-scope="{ row }">
+            <span class="editsty" @click="lableButtonHandel('上线', row)">重新上线 &nbsp;&nbsp;</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-col :span="24" class="toolbar">
+        <m-page :total="total" :page_no="page_no" @handleCurrentChange="handleCurrentChange" />
+      </el-col>
+    </el-card>
+    <div>
+      <el-dialog :title="dlgTitle" @close="handleClose" :visible.sync="dialogVisible" width="566px" :close-on-click-modal="false" :modal-append-to-body="false">
+        <div>
+          <el-form :model="labelForm" :rules="rules" ref="ruleForm" class="demo-ruleForm">
+            <el-form-item prop="TagName">
+              <el-input style="width: 100%" :maxlength="8" v-model="labelForm.TagName" placeholder="请输入标签名称(8个字以内)"></el-input>
+            </el-form-item>
+            <el-form-item>
+              <el-select
+                style="width: 100%"
+                v-model="labelForm.ArticleTypes"
+                multiple
+                filterable
+                remote
+                reserve-keyword
+                placeholder="请输入关联的报告系列(选填,可输入多个)"
+                :remote-method="remoteMethodArticle"
+              >
+                <el-option v-for="item in optionsArticle" :key="item.SubCategoryName" :label="item.SubCategoryName" :value="item.SubCategoryName"> </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-select style="width: 100%" multiple v-model="labelForm.ActivityTypes" placeholder="请输入关联的活动类型(选填,可输入多个)">
+                <el-option v-for="item in optionsActivity" :label="item.ActivityTypeName" :key="item.ActivityTypeName" :value="item.ActivityTypeName"></el-option
+              ></el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-select
+                style="width: 100%"
+                v-model="labelForm.Industries"
+                multiple
+                filterable
+                remote
+                reserve-keyword
+                placeholder="请输入相关产业(选填,可输入多个)"
+                :remote-method="remoteMethodIndustries"
+              >
+                <el-option v-for="item in optionsIndustries" :key="item.IndustryName" :label="item.IndustryName" :value="item.IndustryName"> </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-select
+                style="width: 100%"
+                v-model="labelForm.SubjectNames"
+                multiple
+                filterable
+                remote
+                reserve-keyword
+                placeholder="请输入相关标的(选填,可输入多个)"
+                :remote-method="remoteMethodSubject"
+              >
+                <el-option v-for="item in optionsSubject" :key="item.SubjectName" :label="item.SubjectName" :value="item.SubjectName"> </el-option>
+              </el-select>
+            </el-form-item>
+          </el-form>
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" @click="addTagHandler">确 定</el-button>
+        </span>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+
+<script>
+import Sortable from "sortablejs";
+import mPage from "@/components/mPage.vue";
+import { raiInterface } from "@/api/api.js";
+import { async } from "@antv/x6/lib/registry/marker/async";
+export default {
+  name: "",
+  components: { mPage },
+  props: {},
+  data() {
+    return {
+      labelForm: {
+        TagName: "",
+        ArticleTypes: "", //关联的报告系列
+        ActivityTypes: [],
+        Industries: "", //关联产业列表
+        SubjectNames: "",
+      },
+      rules: {
+        TagName: [{ required: true, message: "请输入标签名称", trigger: "blur" }],
+      },
+      dialogVisible: false,
+      page_no: 1,
+      total: 0,
+      pageSize: 10,
+      lableList: [],
+      tableList: [],
+      tableSelect: [
+        {
+          name: "当前标签数据",
+          value: 1,
+        },
+        {
+          name: "已撤下的标签",
+          value: 0,
+        },
+      ],
+      tableSelectActive: 1,
+      optionsArticle: [],
+      optionsActivity: [],
+      optionsIndustries: [],
+      optionsSubject: [],
+      dlgTitle: "添加",
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {
+    this.setupSortable();
+    this.getDataList();
+    this.getLableTagList();
+    this.activityType();
+  },
+  methods: {
+    // 获取表格列表
+    async getDataList() {
+      const res = await raiInterface.getLableTagList({
+        Status: this.tableSelectActive,
+        PageSize: this.pageSize,
+        CurrentIndex: this.page_no,
+      });
+      if (res.Ret === 200) {
+        this.total = res.Data.Paging.Totals;
+        this.tableList = res.Data.List || [];
+      }
+    },
+    // 获取标签列表
+    async getLableTagList() {
+      const res = await raiInterface.getLableTagListCustom();
+      if (res.Ret === 200) {
+        this.lableList = res.Data || [];
+      }
+    },
+
+    // 获取活动类型
+    async activityType() {
+      const res = await raiInterface.getActivityType();
+      if (res.Ret === 200) {
+        this.optionsActivity = res.Data.List;
+      }
+    },
+
+    // 表格的切换点击事件
+    tableSelectHandel(item) {
+      if (this.tableSelectActive !== item.value) {
+        this.page_no = 1;
+        this.tableSelectActive = item.value;
+        this.getDataList();
+      }
+    },
+    // 重新上线    // 撤下标签
+    lableButtonHandel(type, item) {
+      this.$confirm(type == "撤下" ? "确定要撤下此标签吗?" : "确定要重新上线此标签吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(async () => {
+          const res = await raiInterface.getLableTagEnable({
+            Status: item.Status == 0 ? 1 : 0,
+            TagId: item.TagId,
+          });
+          if (res.Ret === 200) {
+            this.getLableTagList();
+            this.getDataList();
+            this.$message({
+              type: "success",
+              message: "操作成功!",
+            });
+          }
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消",
+          });
+        });
+    },
+    // 分页的事件
+    handleCurrentChange(page) {
+      this.page_no = page;
+      this.getDataList();
+    },
+    // 拖拽的事件
+    setupSortable() {
+      const _this = this;
+      const sortableInstanceIs = Sortable.create(this.$refs.lableSortable, {
+        ghostClass: "sortable-ghost", // drop placeholder的css类名
+        sort: true,
+        onEnd(obj) {
+          const { newIndex, oldIndex } = obj;
+          const newList = _.cloneDeep(_this.lableList);
+          let PrevTagId = 0;
+          let NextTagId = 0;
+          if (newIndex === 0) {
+            PrevTagId = 0;
+            NextTagId = newList[newIndex].TagId;
+          } else if (newIndex === newList.length - 1) {
+            PrevTagId = newList[newIndex].TagId;
+            NextTagId = 0;
+          } else {
+            if (newIndex > oldIndex) {
+              NextTagId = newList[newIndex + 1].TagId;
+              PrevTagId = newList[newIndex].TagId;
+            } else {
+              NextTagId = newList[newIndex].TagId;
+              PrevTagId = newList[newIndex - 1].TagId;
+            }
+          }
+          let params = {
+            TagId: newList[oldIndex].TagId,
+            PrevTagId,
+            NextTagId,
+          };
+          _this.postLableTagMove(params);
+        },
+      });
+    },
+    // 拖拽的事件
+    async postLableTagMove(params) {
+      const res = await raiInterface.postLableTagMove(params);
+      if (res.Ret === 200) {
+        this.getLableTagList();
+        this.getDataList();
+        this.$message.success("移动成功");
+      }
+    },
+    // 添加或者编辑标签
+    addOfEitdHandler(type, item) {
+      this.dlgTitle = type;
+      if (item) {
+        const { TagName, ArticleTypes, ActivityTypes, Industries, SubjectNames, TagId } = item;
+        this.labelForm.TagName = TagName;
+        this.labelForm.ArticleTypes = ArticleTypes ? ArticleTypes.split(",") : [];
+        this.labelForm.ActivityTypes = ActivityTypes ? ActivityTypes.split(",") : [];
+        this.labelForm.Industries = Industries ? Industries.split(",") : [];
+        this.labelForm.SubjectNames = SubjectNames ? SubjectNames.split(",") : [];
+        this.labelForm.TagId = TagId;
+      }
+      this.dialogVisible = true;
+    },
+    // pv uv  下载
+    exportPvUv(id) {
+      const url = process.env.API_ROOT + `/cygx/tag/PvExport?TagId=${id}&${localStorage.getItem("auth") || ""}`;
+      return url;
+    },
+    // 添加标签
+    addTagHandler() {
+      this.$refs.ruleForm.validate(async (valid) => {
+        if (valid) {
+          let { ArticleTypes, ActivityTypes, Industries, SubjectNames } = this.labelForm;
+          if (!ArticleTypes.length && !ActivityTypes.length && !SubjectNames.length && !Industries.length) return this.$message.error("请至少填写一个关联项");
+          let params = {
+            TagName: this.labelForm.TagName,
+            ArticleTypes: ArticleTypes ? ArticleTypes.join(",") : "",
+            ActivityTypes: ActivityTypes ? ActivityTypes.join(",") : "",
+            Industries: Industries ? Industries.join(",") : "",
+            SubjectNames: SubjectNames ? SubjectNames.join(",") : "",
+            TagId: this.dlgTitle == "添加" ? 0 : this.labelForm.TagId,
+          };
+          const res = await raiInterface.postLableTagSave(params);
+          if (res.Ret === 200) {
+            this.handleClose();
+            this.getLableTagList();
+            this.getDataList();
+            this.$message.success("操作成功");
+          }
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    // 关闭弹框
+    handleClose() {
+      this.optionsArticle = [];
+      this.optionsIndustries = [];
+      this.optionsSubject = [];
+      this.labelForm = {
+        TagName: "",
+        ArticleTypes: "", //关联的报告系列
+        ActivityTypes: [],
+        Industries: "", //关联产业列表
+        SubjectNames: "",
+      };
+      this.dialogVisible = false;
+      this.$refs.ruleForm.resetFields();
+    },
+    // 搜索所有的报告系列
+    async remoteMethodArticle(query) {
+      if (query !== "") {
+        const res = await raiInterface.getLableTagSubCategoryName({
+          KeyWord: query,
+        });
+        if (res.Ret === 200) {
+          this.optionsArticle = res.Data || [];
+        }
+      } else {
+        this.optionsArticle = [];
+      }
+    },
+    // 产业
+    async remoteMethodIndustries(query) {
+      if (query !== "") {
+        const res = await raiInterface.getLableTagIndustrialManagement({
+          KeyWord: query,
+        });
+        if (res.Ret === 200) {
+          this.optionsIndustries = res.Data.List || [];
+        }
+      } else {
+        this.optionsIndustries = [];
+      }
+    },
+    // 标的
+    async remoteMethodSubject(query) {
+      if (query !== "") {
+        const res = await raiInterface.industrialSubjectSearch({
+          KeyWord: query,
+        });
+        if (res.Ret === 200) {
+          this.optionsSubject = res.Data.List || [];
+        }
+      } else {
+        this.optionsSubject = [];
+      }
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.lable-manage-page {
+  .top-comtent {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    span {
+      font-weight: 500;
+      font-size: 16px;
+    }
+  }
+  .lable-content {
+    display: flex;
+    flex-wrap: wrap;
+    padding: 30px 0;
+    width: 105%;
+    .lable-item {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      width: 205px;
+      height: 40px;
+      background: #ecf5ff;
+      border: 1px solid #b3d8ff;
+      color: #409eff;
+      border-radius: 4px;
+      margin: 0 30px 20px 0;
+      padding: 0 10px;
+      cursor: move;
+      box-sizing: border-box;
+      .lable-img {
+        width: 38px;
+        flex-shrink: 0;
+        display: flex;
+        justify-content: space-between;
+        cursor: pointer;
+        img {
+          width: 14px;
+          height: 14px;
+        }
+      }
+    }
+    .sortable-ghost {
+      width: 100px;
+      height: 1px;
+      border: 2px solid #409eff;
+      overflow: hidden;
+    }
+  }
+  .pv-uv-download {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    img {
+      width: 14px;
+      height: 14px;
+      margin-left: 10px;
+    }
+  }
+  .lable-select-box {
+    display: flex;
+    margin-bottom: 20px;
+    .item {
+      display: flex;
+      line-height: 40px;
+      cursor: pointer;
+      .name {
+        width: 120px;
+        height: 40px;
+        text-align: center;
+      }
+      .divide {
+        padding: 0 20px;
+      }
+    }
+    .active {
+      background: #409eff;
+      border-radius: 4px;
+      color: #fff;
+    }
+  }
+}
+</style>

+ 5 - 4
src/views/report_manage/tagLib.vue

@@ -11,13 +11,13 @@
           标签分类列表
         </div>
       </div>
-      <div class="tool-wrap" :style="{'justify-content':tableName==='tag'?'space-between':'flex-end'}">
+      <div class="tool-wrap" >
         <template v-if="tableName==='classify'">
           <el-button  type="primary" size="medium" @click="addTag">添加标签分类</el-button>
         </template>
         <template v-else>
           <el-button type="primary" size="medium" @click="addTag">添加标签</el-button>
-          <el-cascader style="width:200px;" placeholder="请选择标签分类"
+          <el-cascader style="width:200px;margin:0 10px;" placeholder="请选择标签分类"
                       :options="selectTagTree" v-model="searchClassify" @change="handleSearchChange('select')" clearable></el-cascader>
           <el-input  style="width:210px;" placeholder="标签名称"  prefix-icon="el-icon-search" clearable
                      v-model="searchInput" @input="handleSearchChange('input')"
@@ -427,6 +427,7 @@ export default {
   .top-wrap{
     width:100%;
     display: flex;
+    align-items: center;
     justify-content: space-between;
     margin-bottom: 20px;
     .switch-tab{
@@ -447,9 +448,9 @@ export default {
     }
     .tool-wrap{
       display: flex;
-      width:600px;
+      /* width:600px; */
       height: 40px;
-      justify-content: space-between;
+      /* justify-content: space-between; */
     }
   }
   .dialog-container{

+ 81 - 0
src/views/transferPage.vue

@@ -0,0 +1,81 @@
+<template>
+    <div></div>
+</template>
+
+<script>
+import { departInterence } from '@/api/api.js';
+export default {
+    data() {
+        return {
+            
+        }
+    },
+    created(){
+        this.init()
+        
+    },
+    methods:{
+        async init(){
+            if(this.$route.query.code){
+                const res=await departInterence.useCodeLogin({AuthCode:this.$route.query.code})
+                if(res.Ret===200){
+                    localStorage.setItem('auth', res.Data.Authorization)
+					localStorage.setItem('userName', res.Data.RealName)
+					localStorage.setItem('Role', res.Data.RoleTypeCode)
+					localStorage.setItem('RoleIdentity', res.Data.SysRoleTypeCode)
+					localStorage.setItem('RoleType', res.Data.ProductName)
+					localStorage.setItem('ManageType', res.Data.Authority)
+					localStorage.setItem('AdminId', res.Data.AdminId)
+                    localStorage.setItem('AdminName',res.Data.AdminName)
+
+                    // 如果路由参数有redirect_uri则跳转到redirect_uri,redirect_uri通过encode
+                    if(this.$route.query.redirect_uri){
+                        const path=decodeURIComponent(this.$route.query.redirect_uri)
+                        this.$router.push(path)
+                        return
+                    }
+
+
+                    let path = await this.getOtherRolePath('myCalendar');
+                    this.$router.push({path})
+                    return
+                }
+            }
+
+            this.$router.replace('/login')
+        },
+        getOtherRolePath(pathVal){
+			return departInterence.getMenu().then(res => {
+				let resolvePath=''
+				if(res.Ret === 200) {
+					let menuList = res.Data.List||[];
+					if(!menuList.length){
+						this.$message.error('该账号没有任何菜单权限,请联系管理员')
+						return
+					}
+					// 是否已经拿到菜单信息
+					sessionStorage.setItem('hasGetMenu','true')
+					sessionStorage.setItem('MenuList',JSON.stringify(menuList));
+					/* 是否有数据报表权限 */
+					this.$store.commit('SET_DATA_AUTH',menuList.some(item => item.name === '报表统计'))
+
+					for (let i = 0; i < menuList.length; i++) {
+						const element = menuList[i];
+						const arr=menuList[i].children||[]
+						if(arr.some(it => it.path == pathVal)){
+							resolvePath='/'+pathVal
+							break
+						}
+					}
+					return resolvePath || '/'+menuList[0].children[0].path
+				}
+				return '/'+pathVal
+			})
+		}
+    }
+}
+</script>
+
+<style>
+
+</style>

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