浏览代码

10.12 merge master

bding 1 年之前
父节点
当前提交
0232c02cc4
共有 39 个文件被更改,包括 1671 次插入261 次删除
  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. 10 0
      src/api/modules/rai/raiApi.js
  7. 8 0
      src/api/modules/setApi.js
  8. 二进制
      src/assets/img/home/icon01.png
  9. 二进制
      src/assets/img/home/icon02.png
  10. 二进制
      src/assets/img/home/icon03.png
  11. 二进制
      src/assets/img/home/logo.png
  12. 二进制
      src/assets/img/icons/msg2.png
  13. 二进制
      src/assets/img/login_r_b.png
  14. 二进制
      src/assets/img/rai_m/edit_icon.png
  15. 二进制
      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. 1 1
      src/views/rai_manage/activityManage/applyManage.vue
  34. 23 92
      src/views/rai_manage/activityManage/specialResearch.vue
  35. 16 21
      src/views/rai_manage/components/apply/templateMessage.vue
  36. 471 0
      src/views/rai_manage/cygxManage/lableManage.vue
  37. 2 1
      src/views/report_manage/reportdtl.vue
  38. 5 4
      src/views/report_manage/tagLib.vue
  39. 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;

+ 10 - 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,
   /* 
 		优化建议列表
@@ -1202,10 +1204,18 @@ const raiInterface = {
   activitySignupTempMsg: (params) => {
     return http.post("/cygx/activitySignup/tempMsg", params);
   },
+  // 发送模板消息
+  activityTripSignupTempMsg: (params) => {
+    return http.post("/cygx/special/trip/tempMsg", params);
+  },
   // 模版消息发送客户类型列表
   activitySendGroupList: (params) => {
     return http.get("/cygx/activitySignup/tempMsg/sendGroupList", params);
   },
+  // 模版消息发送客户类型列表
+  activityTripSendGroupList: (params) => {
+    return http.get("/cygx/special/trip/tempMsg/sendGroupList", params);
+  },
 };
 
 /* 权益小程序管理 专项调研模块*/

+ 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)
 	}
 }
 

二进制
src/assets/img/home/icon01.png


二进制
src/assets/img/home/icon02.png


二进制
src/assets/img/home/icon03.png


二进制
src/assets/img/home/logo.png


二进制
src/assets/img/icons/msg2.png


二进制
src/assets/img/login_r_b.png


二进制
src/assets/img/rai_m/edit_icon.png


二进制
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,

文件差异内容过多而无法显示
+ 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>

+ 1 - 1
src/views/rai_manage/activityManage/applyManage.vue

@@ -34,7 +34,7 @@
             </el-tooltip>
           </template>
           <el-button type="primary" @click="addOutbound('新增预约纪要')">新增预约纪要</el-button>
-          <el-button v-if="tabsPitchonType !== 4" type="primary" @click="sendMessage">发送模板消息</el-button>
+          <el-button type="primary" @click="sendMessage">发送模板消息</el-button>
         </div>
         <div>
           <el-select placeholder="行业" clearable v-model="industry" @change="conditionChange" style="margin-bottom: 20px">

+ 23 - 92
src/views/rai_manage/activityManage/specialResearch.vue

@@ -2,21 +2,15 @@
   <div class="container special-research">
     <div class="top-wrap">
       <div class="tabs-content">
-        <span @click="tabsHandle(item)" :class="['item', tabsActive == item.id && 'active-item']" v-for="item in tabsTop" :key="item.id">{{
-          item.name
-        }}</span>
+        <span @click="tabsHandle(item)" :class="['item', tabsActive == item.id && 'active-item']" v-for="item in tabsTop" :key="item.id">{{ item.name }}</span>
       </div>
     </div>
     <div class="top-wrap">
       <div>
         <el-button v-if="tabsActive == 2" type="primary" style="margin-right: 20px" @click="addapply">新增报名</el-button>
+        <el-button v-if="tabsActive == 2" type="primary" @click="sendMessage" style="margin-right: 20px">发送模板消息</el-button>
         <el-select placeholder="请选择行业" clearable v-model="industryValue" @change="changeHandel" style="margin: 0 20px 20px 0">
-          <el-option
-            v-for="item in chartPermissionList"
-            :label="item.PermissionName"
-            :key="item.ChartPermissionId"
-            :value="item.ChartPermissionId"
-          ></el-option>
+          <el-option v-for="item in chartPermissionList" :label="item.PermissionName" :key="item.ChartPermissionId" :value="item.ChartPermissionId"></el-option>
         </el-select>
         <el-select placeholder="发布状态" clearable v-model="status" @change="changeHandel" style="margin: 0 30px 20px 0">
           <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"></el-option>
@@ -35,14 +29,7 @@
     <el-card>
       <el-table @selection-change="selectChange" :data="dataList" style="width: 100%; margin-top: 20px" border>
         <el-table-column v-if="tabsActive == 2" align="center" type="selection" width="55"> </el-table-column>
-        <el-table-column
-          v-for="item in tableColums"
-          :key="item.label"
-          :label="item.label"
-          :width="item.widthsty"
-          :min-width="item.minwidthsty"
-          align="center"
-        >
+        <el-table-column v-for="item in tableColums" :key="item.label" :label="item.label" :width="item.widthsty" :min-width="item.minwidthsty" align="center">
           <template slot-scope="{ row }">
             <span @click="handleRowClick(row, item.key)" :style="handleRowStyle(item.key)">{{ handleRowContent(row, item.key) }}</span>
           </template>
@@ -52,9 +39,7 @@
             <div v-if="tabsActive == 1">
               <template v-if="row.PublishStatus !== 4">
                 <span class="editsty" v-if="row.PublishStatus == 1" @click="applyHandleAllOperate(row.ActivityId, '下线')">下线 &nbsp;&nbsp;</span>
-                <span class="editsty" v-if="row.PublishStatus == 3" @click="applyHandleAllOperate(row.ActivityId, '重新发布')"
-                  >重新发布 &nbsp;&nbsp;</span
-                >
+                <span class="editsty" v-if="row.PublishStatus == 3" @click="applyHandleAllOperate(row.ActivityId, '重新发布')">重新发布 &nbsp;&nbsp;</span>
                 <span v-if="row.PublishStatus == 0" class="editsty" @click="applyHandleAllOperate(row.ActivityId, '发布')">发布 &nbsp;&nbsp;</span>
                 <span class="editsty" @click="editBtn(row.ActivityId, row.PublishStatus, '')">编辑 &nbsp;&nbsp;</span>
                 <span class="editsty" v-if="row.PublishStatus == 1" @click="editBtn(row.ActivityId, row.PublishStatus, '行程')">确定行程</span>
@@ -62,15 +47,8 @@
               </template>
             </div>
             <div v-else>
-              <span
-                class="editsty"
-                v-if="row.PublishStatus == 1 && isStart(row.ActivityTime)"
-                @click="applyHandleAllOperate(row.ActivityId, '取消发布')"
-                >取消发布 &nbsp;&nbsp;</span
-              >
-              <span class="editsty" v-if="row.PublishStatus !== 1" @click="applyHandleAllOperate(row.ActivityId, '重新发布')"
-                >重新发布 &nbsp;&nbsp;</span
-              >
+              <span class="editsty" v-if="row.PublishStatus == 1 && isStart(row.ActivityTime)" @click="applyHandleAllOperate(row.ActivityId, '取消发布')">取消发布 &nbsp;&nbsp;</span>
+              <span class="editsty" v-if="row.PublishStatus !== 1" @click="applyHandleAllOperate(row.ActivityId, '重新发布')">重新发布 &nbsp;&nbsp;</span>
               <span class="editsty" @click="editBtn(row.ActivityId, row.PublishStatus, '行程')">编辑 &nbsp;&nbsp;</span>
               <span class="editsty" v-if="row.IsShowUpdateMeeting" @click="particularsSubmit(row.ActivityId)"> 修改到会情况 </span>
               <span class="editsty" v-if="row.IsShowSubmitMeeting" @click="particularsSubmit(row.ActivityId)"> 提交到会情况 </span>
@@ -84,70 +62,11 @@
         <m-page :total="total" :page_no="page_no" :pageSize="10" @handleCurrentChange="handleCurrentChange" />
       </el-col>
     </el-card>
-    <!-- <el-dialog width="1000px" v-dialogDrag :modal-append-to-body="false" center :title="dialogTitle" :visible.sync="dialogVisibleActivity" :before-close="handleCloseSubject">
-      <div class="rai-detail-wrap" v-if="dialogTitle == '活动详情'">
-        <div class="activity-top">
-          {{ activityDetail.ResearchTheme }}
-        </div>
-        <p>所属行业: {{ activityDetail.ChartPermissionName }}</p>
-        <p v-if="tabsActive == 1">预期时间: {{ activityDetail.ActivityTimeText }}</p>
-        <p v-else>活动开始时间: {{ activityDetail.ActivityTimeTextByDay }}</p>
-        <p>调研形式: {{ activityDetail.SpecialType == 1 ? "线上" : "线下" }} {{ activityDetail.SpecialType == 2 && activityDetail.City ? "(" + activityDetail.City + ")" : "" }}</p>
-        <template v-if="!activityDetail.IndustrialName && !activityDetail.IndustrialSubjectName">
-          <p>相关主题: {{ activityDetail.Label }}</p>
-        </template>
-        <template v-else>
-          <p>产业名称: {{ activityDetail.IndustrialName }}</p>
-          <p>相关公司: {{ activityDetail.IndustrialSubjectName }}</p>
-        </template>
-        <div class="text-box">
-          <div style="flex-shrink: 0">活动可见:</div>
-          <div>
-            <span>{{ activityDetail.CustomerName }}</span>
-            <div>
-              <span v-if="activityDetail.Scale.includes('3')"> 100亿以上</span>
-              <span v-if="activityDetail.Scale.includes('2')"> 150~100亿</span>
-            </div>
-          </div>
-        </div>
-        <p v-if="activityDetail.Host">主持人: {{ activityDetail.Host }}</p>
-        <p v-if="activityDetail.Host">主持人: {{ activityDetail.PersonInCharge }}</p>
-        <el-image v-if="tabsActive == 1" style="width: 0px; height: 0px" :src="activityDetail.TripImgLink" id="TripImgLink" :preview-src-list="previewList"></el-image>
-        <el-image v-else style="width: 0px; height: 0px" :src="activityDetail.TripImgLinkFix" id="TripImgLink" :preview-src-list="previewList"></el-image>
-        <div class="arrange" @click.stop="imgLink">
-          查看行程安排
-          <i class="el-icon-d-arrow-right"></i>
-        </div>
-      </div>
-      <div v-else>
-        <el-table :data="interestData" style="width: 100%; margin: 20px 0" height="400px" border>
-          <el-table-column min-width="" prop="RealName" align="center" label="姓名"></el-table-column>
-          <el-table-column min-width="" prop="CompanyName" align="center" label="公司名称"></el-table-column>
-          <el-table-column min-width="" prop="SellerName" align="center" label="所属销售"></el-table-column>
-          <el-table-column min-width="180" prop="CreateTime" align="center" label="反馈时间"></el-table-column>
-        </el-table>
-        <div class="dialog-footer">
-          <a :href="exportInterest" download>
-            <el-button type="primary" @click="confirmSubmit">下载名单</el-button>
-          </a>
-          <el-button style="margin-left: 20px" @click="handleCloseSubject">取消</el-button>
-        </div>
-      </div>
-    </el-dialog> -->
-    <special-research-dlg
-      :specialDetailId="specialDetailId"
-      :dialogVisibleActivity.sync="dialogVisibleActivity"
-      :dialogTitle="dialogTitle"
-      :tabsActive="tabsActive"
-    />
-    <partical-dialog
-      :offlineId="offlineId"
-      :dialogVisiblepartica.sync="dialogVisiblepartica"
-      :particlaDlg="particlaDlg"
-      :submitDialog.sync="submitDialog"
-    />
+    <special-research-dlg :specialDetailId="specialDetailId" :dialogVisibleActivity.sync="dialogVisibleActivity" :dialogTitle="dialogTitle" :tabsActive="tabsActive" />
+    <partical-dialog :offlineId="offlineId" :dialogVisiblepartica.sync="dialogVisiblepartica" :particlaDlg="particlaDlg" :submitDialog.sync="submitDialog" />
     <apply-dialog :addDialogVisible.sync="addDialogVisible" :selectList="selectList" :signUpAdd="signUpAdd" :addDialogType="addDialogType" />
     <particulars-all :particularsDialogVisible.sync="particularsDialogVisible" :dialogVisibleList="dialogVisibleList" />
+    <template-message :messageDialog.sync="messageDialogVisible" :selectionArr="selectionArr" typeMessage="确定行程"/>
   </div>
 </template>
 
@@ -159,9 +78,10 @@ import ParticalDialog from "../components/particalDialog.vue";
 import ApplyDialog from "../components/apply/applyDialog.vue";
 import ParticularsAll from "./specialResearch/particularsAll.vue";
 import SpecialResearchDlg from "../components/special/specialResearchDlg.vue";
+import TemplateMessage from "../components/apply/templateMessage.vue";
 export default {
   name: "",
-  components: { mPage, ParticalDialog, ApplyDialog, ParticularsAll, SpecialResearchDlg },
+  components: { mPage, ParticalDialog, ApplyDialog, ParticularsAll, SpecialResearchDlg, TemplateMessage },
   props: {},
   data() {
     return {
@@ -194,6 +114,8 @@ export default {
       particularsDialogVisible: false,
       dialogVisibleList: {},
       specialDetailId: null,
+      messageDialogVisible: false, // 发送模版消息
+      selectionArr: {},
     };
   },
   computed: {
@@ -423,6 +345,7 @@ export default {
     },
     // 新增活动报名的表格选择
     selectChange(selection) {
+      this.selectionArr = selection;
       let arr = [];
       selection.forEach((item) => {
         arr.push(item.ActivityId);
@@ -440,6 +363,14 @@ export default {
       this.industryValue = "";
       this.getsDataList();
     },
+    // 发送模版消息
+    sendMessage() {
+      if (this.selectList && this.selectList.split(",").length === 1) {
+        this.messageDialogVisible = true;
+      } else {
+        this.$message.error("请选择一个活动");
+      }
+    },
   },
   beforeRouteEnter(to, from, next) {
     if (from.path !== "/addResearch" && from.path !== "/determineTravel" && from.path !== "/editResearch") {

+ 16 - 21
src/views/rai_manage/components/apply/templateMessage.vue

@@ -2,7 +2,7 @@
   <div class="container container-message-dlg">
     <el-dialog width="560px" v-dialogDrag :close-on-click-modal="false" :modal-append-to-body="false" center :visible.sync="messageDialog" title="发送模板消息" :before-close="handleClose">
       <div class="content">
-        <div class="annotation" >
+        <div class="annotation">
           <div class="annotation-box" @click="annotationHandler">
             <img style="margin-right: 5px" src="~@/assets/img/icons/annotation_icon.png" alt="" />
             注释
@@ -10,15 +10,12 @@
         </div>
         <el-form :model="messageForm" :rules="rules" ref="messageFormRef" class="demo-ruleForm">
           <el-form-item prop="sendId">
-            <el-select style="width: 100%" v-model="messageForm.sendId" multiple placeholder="请选择发送对象(可多选)">
+            <el-select style="width: 100%" v-model="messageForm.sendId" multiple placeholder="请选择发送对象(可多选)" :disabled="typeMessage == '确定行程'">
               <el-option v-for="item in sendOptions" :key="item.Id" :label="item.Name" :value="item.Id"> </el-option>
             </el-select>
           </el-form-item>
-          <!-- <el-form-item prop="beforeText">
-            <el-input type="textarea" :rows="2" placeholder="请输入首段提示文字" v-model="messageForm.beforeText"> </el-input>
-          </el-form-item> -->
           <el-form-item prop="activityName">
-            <el-input type="textarea" :rows="2" placeholder="请输入活动名称(20字内)" v-model="messageForm.activityName"> </el-input>
+            <el-input type="textarea" :rows="2" :placeholder="`请输入${this.typeMessage == '确定行程' ? '调研主题' : '活动名称'}(20字内)`" v-model="messageForm.activityName"> </el-input>
           </el-form-item>
           <el-form-item prop="content">
             <el-input type="content" :rows="2" placeholder="请输入变更内容(20字内)" v-model="messageForm.content"> </el-input>
@@ -55,6 +52,10 @@ export default {
       required: true,
       default: false,
     },
+    typeMessage: {
+      type: String,
+      default: "",
+    },
   },
   data() {
     return {
@@ -67,7 +68,6 @@ export default {
       },
       rules: {
         sendId: [{ required: true, message: "请选择发送对象", trigger: "change" }],
-        // beforeText: [{ required: true, message: "请输入首段提示文字", trigger: "blur" }],
         activityName: [{ required: true, message: "请输入活动名称", trigger: "blur" }],
         content: [{ required: true, message: "请输入变更内容", trigger: "blur" }],
       },
@@ -76,23 +76,15 @@ export default {
         label: "Name",
         value: "Id",
       },
-      sendOptions: [
-        {
-          value: 1,
-          label: "东南",
-        },
-        {
-          value: 17,
-          label: "西北",
-        },
-      ],
+      sendOptions: [],
     };
   },
   computed: {},
   watch: {
     messageDialog: {
       handler(newValue) {
-        if (newValue) this.messageForm.activityName = this.selectionArr[0].ActivityName;
+        console.log(this.selectionArr);
+        if (newValue) this.messageForm.activityName = this.selectionArr[0].ActivityName || this.selectionArr[0].ResearchTheme;
         this.activitySendGroupList();
       },
     },
@@ -101,9 +93,10 @@ export default {
   mounted() {},
   methods: {
     async activitySendGroupList() {
-      const res = await raiInterface.activitySendGroupList();
+      const res = this.typeMessage == "确定行程" ? await raiInterface.activityTripSendGroupList() : await raiInterface.activitySendGroupList();
       if (res.Ret === 200) {
         this.sendOptions = res.Data;
+        this.messageForm.sendId = this.typeMessage == "确定行程" ? [1] : [7];
       }
     },
     // 点击了注释
@@ -138,13 +131,15 @@ export default {
     confirmPerson() {
       this.$refs["messageFormRef"].validate(async (valid) => {
         if (valid) {
-          const res = await raiInterface.activitySignupTempMsg({
+          let params = {
             ActivityIds: this.selectionArr[0].ActivityId + "",
+            ResearchTheme: this.selectionArr[0].ResearchTheme || "",
             SendGroup: this.messageForm.sendId.join(","),
             // FirstText: this.messageForm.beforeText,
             ActivityName: this.messageForm.activityName,
             Content: this.messageForm.content,
-          });
+          };
+          const res = this.typeMessage == "确定行程" ? await raiInterface.activityTripSignupTempMsg(params) : await raiInterface.activitySignupTempMsg(params);
           if (res.Ret === 200) {
             this.$message.success("发送成功");
             this.handleClose();

+ 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>

+ 2 - 1
src/views/report_manage/reportdtl.vue

@@ -198,8 +198,9 @@
       }
     }
 		#resetcss{
-			p{
+			ul,ol,li,p{
 				font-size: 18px !important;
+				line-height: 26px !important;
 			}
 			span{
 				font-size: 18px !important;

+ 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>

部分文件因为文件数量过多而无法显示