浏览代码

merge cygx 10.9.1

bding 1 年之前
父节点
当前提交
02ab755af2
共有 67 个文件被更改,包括 4779 次插入497 次删除
  1. 3 1
      config/dev.env.js
  2. 5 3
      config/prod.env.js
  3. 3 1
      config/prod.test.env.js
  4. 1 1
      index.html
  5. 5 1
      src/api/api.js
  6. 108 0
      src/api/modules/businessCustom.js
  7. 37 2
      src/api/modules/crmApi.js
  8. 34 0
      src/api/modules/rai/lableApi.js
  9. 4 0
      src/api/modules/rai/pointsApi.js
  10. 10 0
      src/api/modules/rai/raiApi.js
  11. 8 0
      src/api/modules/setApi.js
  12. 二进制
      src/assets/img/home/icon01.png
  13. 二进制
      src/assets/img/home/icon02.png
  14. 二进制
      src/assets/img/home/icon03.png
  15. 二进制
      src/assets/img/home/logo.png
  16. 二进制
      src/assets/img/icons/msg2.png
  17. 二进制
      src/assets/img/icons/warning_triangle_yellow.png
  18. 二进制
      src/assets/img/login_r_b.png
  19. 二进制
      src/assets/img/rai_m/edit_icon.png
  20. 二进制
      src/assets/img/rai_m/remove_below.png
  21. 4 4
      src/components/questionMsgDia.vue
  22. 1 1
      src/main.js
  23. 46 0
      src/routes/modules/customRoutes.js
  24. 6 0
      src/routes/modules/cygxRoutes.js
  25. 6 6
      src/routes/routes.js
  26. 19 3
      src/views/Home.vue
  27. 16 15
      src/views/Login.vue
  28. 458 0
      src/views/business_ETA_manage/addBusiness.vue
  29. 359 0
      src/views/business_ETA_manage/businessDetail.vue
  30. 391 0
      src/views/business_ETA_manage/businessEdit.vue
  31. 488 0
      src/views/business_ETA_manage/businessList.vue
  32. 77 0
      src/views/business_ETA_manage/components/AddRenewal.vue
  33. 95 0
      src/views/business_ETA_manage/components/ModifySaller.vue
  34. 106 0
      src/views/business_ETA_manage/components/Steps.vue
  35. 3 3
      src/views/contract_manage/addContract.vue
  36. 3 3
      src/views/contract_manage/editContract.vue
  37. 67 20
      src/views/custom_manage/compontents/Ctimeline.vue
  38. 300 0
      src/views/custom_manage/compontents/historyContract.vue
  39. 113 0
      src/views/custom_manage/compontents/permissionDetail.vue
  40. 113 0
      src/views/custom_manage/contacts/compontents/contactsColums.js
  41. 82 0
      src/views/custom_manage/contacts/compontents/remindDlg.vue
  42. 12 58
      src/views/custom_manage/contacts/contactsList.vue
  43. 23 0
      src/views/custom_manage/customList/components/customRemarkDialog.vue
  44. 29 1
      src/views/custom_manage/customList/components/shareListDialog.vue
  45. 147 0
      src/views/custom_manage/customList/customCityList.vue
  46. 29 14
      src/views/custom_manage/customList/customDetail.vue
  47. 79 15
      src/views/custom_manage/customList/customList.vue
  48. 427 47
      src/views/custom_manage/customList/customShareList.vue
  49. 103 8
      src/views/custom_manage/customSearch.vue
  50. 22 9
      src/views/dataReport_manage/components/CollectList.vue
  51. 135 35
      src/views/ficc_manage/userApplication.vue
  52. 5 0
      src/views/interaction_manage/videoManageEN.vue
  53. 36 47
      src/views/rai_manage/activityManage/applyManage.vue
  54. 2 1
      src/views/rai_manage/activityManage/components/addActivity.vue
  55. 62 41
      src/views/rai_manage/activityManage/components/addComopnents/ResearchDeduct.vue
  56. 26 94
      src/views/rai_manage/activityManage/specialResearch.vue
  57. 60 9
      src/views/rai_manage/components/addChoiceness.vue
  58. 19 8
      src/views/rai_manage/components/apply/applyDialog.vue
  59. 5 10
      src/views/rai_manage/components/apply/particularsDialog.vue
  60. 17 22
      src/views/rai_manage/components/apply/templateMessage.vue
  61. 471 0
      src/views/rai_manage/cygxManage/lableManage.vue
  62. 3 1
      src/views/rai_manage/reportManage/appletsReport.vue
  63. 8 8
      src/views/rai_manage/reportManage/summaryManage.vue
  64. 2 1
      src/views/report_manage/reportdtl.vue
  65. 5 4
      src/views/report_manage/tagLib.vue
  66. 81 0
      src/views/transferPage.vue
  67. 二进制
      static/fa.png

+ 3 - 1
config/dev.env.js

@@ -9,5 +9,7 @@ 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"',
+  CYGX_WEB:'"https://clpttest.hzinsights.com"' // 查研观向网页版首页地址
 });

+ 5 - 3
config/prod.env.js

@@ -1,9 +1,11 @@
 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"',
+	CYGX_WEB:'"https://web.hzinsights.com"' // 查研观向网页版首页地址
 }

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

@@ -7,5 +7,7 @@ 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"',
+	CYGX_WEB:'"https://clpttest.hzinsights.com"' // 查研观向网页版首页地址
 }

+ 1 - 1
index.html

@@ -12,7 +12,7 @@
 	<!-- <link rel="stylesheet" href="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css" /> -->
 	<!--<link rel="stylesheet" href="./static/css/reset.min.css">-->
 	<link rel="stylesheet" href="./static/css/iconfont.css"/>
-	<link rel="icon" type="image/x-icon" href="./static/fa.ico" id="icon"/>
+	<link rel="icon" type="image/png" href="./static/fa.png" id="icon"/>
 	<script src="./static/js/vue.js"></script>  <!-- 开发版,开发过程中使用此方案-->
 	<script src="./static/js/main.js"></script>  <!-- 生产版,打包的时候使用此方案 -->
 	<!-- 引入组件库 -->

+ 5 - 1
src/api/api.js

@@ -70,6 +70,9 @@ import {businessTripInterence} from './modules/businessTrip'
 
 import {reportVarietyENInterence} from './modules/reportVariety'
 
+//商家管理
+import {businessCustomInterence} from './modules/businessCustom'
+
 export {
   dataBaseInterface,
   mychartInterface,
@@ -106,7 +109,8 @@ export {
   nationalInterface,
   cloudDiskInterface,
   businessTripInterence,
-  reportVarietyENInterence
+  reportVarietyENInterence,
+  businessCustomInterence
 };
 
 //老接口 研报 ppt等

+ 108 - 0
src/api/modules/businessCustom.js

@@ -0,0 +1,108 @@
+/**
+ * 商家管理api
+ */
+import http from "@/api/http.js"
+
+export const businessCustomInterence = {
+    /**
+     * 获取商家列表
+     * @param Keyword String关键字
+     * @param SellerIds String 销售ID(多选),英文逗号拼接
+     * @param SigningStatus Integer 签约状态: 1-首次签约; 2-续约中; 3-已终止
+     * @param Province String 省份(多选),英文逗号拼接
+     * @param City String 城市(多选),英文逗号拼接
+     * @param SortParam Integer 排序字段: 1-签约时间; 2-到期时间; 3-创建时间; 4-用户上限
+     * @param SortType Integer 排序类型: 1-正序; 2-倒序
+     * @param PageSize Integer 每页数据量
+     * @param CurrentIndex Integer 页码
+     * @returns 
+     */
+    getBusinessList:(params)=>{
+        return http.get('/eta_business/page_list',params)
+    },
+    /**
+     * 获取商家签约列表
+     * @param EtaBusinessId Integer 商家ID
+     */
+    getContractList:(params)=>{
+        return http.get('/eta_business/contract_list',params)
+    },
+    /**
+     * 获取操作日志列表
+     * @param EtaBusinessId Integer 商家ID
+     */
+    getTimeLineList:(params)=>{
+        return http.get('/eta_business/operate_record_list',params)
+    },
+    /**
+     * 获取商家详情
+     * @param EtaBusinessId Integer 商家ID
+     */
+    getBusinessDetail:(params)=>{
+        return http.get('/eta_business/detail',params)
+    },
+    /**
+     * 添加续约
+     * @param EtaBusinessId Integer 商家ID
+     * @param SigningTime String 签约时间
+     * @param ExpiredTime String 到期时间
+     * @returns 
+     */
+    addNewContract:(params)=>{
+        return http.post('/eta_business/signing',params)
+    },
+    /**
+     * 修改销售
+     * @param EtaBusinessId Integer 商家ID
+     * @param SellerId Integer 销售ID
+     * @param SellerName String 销售名称
+     */
+    changeBusinessSeller:(params)=>{
+        return http.post('/eta_business/move_seller',params)
+    },
+    /**
+     * 启用禁用商家
+     * @param EtaBusinessId Integer 商家ID
+     */
+    changeBusinessStatus:(params)=>{
+        return http.post('/eta_business/enable',params)
+    },
+    /**
+     * 编辑商家
+     * @param EtaBusinessId Integer 商家ID
+     * @param Province String 省份
+     * @param City String 城市
+     * @param Leader String 决策人姓名
+     * @param IndustryId Integer 行业ID
+     * @param IndustryName String 行业名称
+     * @param CapitalScale String 资金规模
+     * @param ResearchTeamSize String 研究团队规模
+     * @param UserMax Integer 用户上限
+     */
+    editBusiness:(params)=>{
+        return http.post('/eta_business/edit',params)
+    },
+    /**
+     * 添加商家
+     * @param BusinessName String 商家名称
+     * @param CreditCode String 社会信用码
+     * @param RegionType String 所属区域:国内;海外
+     * @param Province String 省份
+     * @param City String 城市
+     * @param SellerId Integer 销售ID
+     * @param SellerName String 销售姓名
+     * @param Leader String 决策人姓名
+     * @param IndustryId Integer 行业ID
+     * @param IndustryName String 行业名称
+     * @param CapitalScale String 资金规模
+     * @param ResearchTeamSize String 研究团队规模
+     * @param UserMax Integer 用户上限
+     * @param SigningTime String 签约时间(IsCheck为false时必填)
+     * @param ExpiredTime String 到期时间(IsCheck为false时必填)
+     * @param IsCheck Boolean 是否仅校验,为true时校验参数但不实际新增
+     * @returns 
+     */
+    addBusiness:(params)=>{
+        return http.post('/eta_business/add',params)
+    }
+}

+ 37 - 2
src/api/modules/crmApi.js

@@ -289,15 +289,29 @@ const customInterence = {
   },
   /* 获取试用用户列表 */
   trialList: (params) => {
-    console.log(params);
     return http.get("/custom/official/user/list", params);
     // return http.get('/api/adminapi/custom/official/user/list?PageSize=10&CurrentIndex=1&SourceType=中文官网', params)
   },
   /* 试用用户确认已处理接口 */
   trialStatus: (params) => {
-    console.log(params);
     return http.post("/custom/official/user/confirm", params);
   },
+  /* 标记研报申请分组
+    ApplyRecordId
+    GroupName
+    UserId
+   */
+  markApplyUser:(params)=>{
+      return http.post('/yb/apply_record/mark_group',params)
+  },
+  /**
+   * 标记官网试用申请
+   * Id
+   * GroupName
+   */
+  markOfficialUser:(params)=>{
+      return http.post('/custom/official/user/mark_group',params)
+  },
   /* 搜索公司 KeyWord  */
   companySearch: (params) => {
     return http.get("/custom/potential/company/search", params);
@@ -512,6 +526,27 @@ const customInterence = {
     addCustomRemark:(params)=>{
         return http.post("/custom/share/remark/add",params)
     },
+    /**
+     * 客户列表,正式客户共享-删除备注
+     * RemarkId
+     */
+    deleteRemark:(params)=>{
+        return http.post("/custom/remark/del",params)
+    },
+    /*
+     * 标记服务记录
+     * CompanyServiceRecordId
+     * Status 0取消标记 1标记
+     */
+    markRecord:(params)=>{
+        return http.post('/custom/share/mark',params)
+    },
+    /**
+     * 同城客户列表
+     */
+    getCustomCityList:(params)=>{
+        return http.get('/custom/share/list/city',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;

+ 4 - 0
src/api/modules/rai/pointsApi.js

@@ -17,6 +17,10 @@ const raiPoints = {
   specialPointsBill: (params) => {
     return http.get("/custom/company/activity/special/points/bill", params);
   },
+  // 扣点的截至时间
+  activityDeadlineSet: (params) => {
+    return http.get("/cygx/activity/deadlineSet", params);
+  },
 };
 
 export default raiPoints;

+ 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/icons/warning_triangle_yellow.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;
 	}

+ 46 - 0
src/routes/modules/customRoutes.js

@@ -33,6 +33,16 @@ export default [
         name: "正式客户共享",
         hidden: false,
       },
+      {
+        path: 'customCityList',
+        component: () => import('@/views/custom_manage/customList/customCityList.vue'),
+        name: '查看同城客户',
+        hidden: false,
+        meta: {
+            pathFrom: 'customShareList',
+            pathName: '正式客户共享'
+        }
+      },
       {
         path: "customAllList",
         component: () => import("@/views/custom_manage/customList/customAllList.vue"),
@@ -370,6 +380,42 @@ export default [
 				component: () => import('@/views/ficc_manage/apply/applyList.vue'),
 				hidden: false,
 			},
+      {
+        path:'businessETAList',
+        name:"商家管理",
+        component: () => import('@/views/business_ETA_manage/businessList.vue'),
+				hidden: false,
+      },
+      {
+        path:'addETABusiness',
+        name:"新增商家",
+        component: () => import('@/views/business_ETA_manage/addBusiness.vue'),
+				hidden: false,
+        meta:{
+          pathFrom: "businessETAList",
+          pathName: "商家管理",
+        }
+      },
+      {
+        path:'editETABusiness',
+        name:"编辑商家",
+        component: () => import('@/views/business_ETA_manage/businessEdit.vue'),
+				hidden: false,
+        meta:{
+          pathFrom: "businessETAList",
+          pathName: "商家管理",
+        }
+      },
+      {
+        path:'businessETADetail',
+        name:"商家详情",
+        component: () => import('@/views/business_ETA_manage/businessDetail.vue'),
+				hidden: false,
+        meta:{
+          pathFrom: "businessETAList",
+          pathName: "商家管理",
+        }
+      }
     ],
   },
 ];

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

+ 458 - 0
src/views/business_ETA_manage/addBusiness.vue

@@ -0,0 +1,458 @@
+<template>
+    <div class="add-business">
+        <!-- 自定义步骤条 -->
+        <Steps 
+            :activeStep="step"
+            :allowStepClick="false"
+        />
+        <div class="first-step-form-wrap" v-show="step===1">
+            <el-form 
+                :model="firstFormData" 
+                :rules="rules"
+                ref="firstFormEl" 
+                label-width="120px"
+                inline
+                class="first-step-form"
+            >
+                <div class="form-line">
+                    <el-form-item label="所属区域" prop="areaType">
+                        <el-radio-group v-model="firstFormData.areaType">
+                            <el-radio label="国内" border>国内</el-radio>
+                            <el-radio label="海外" border>海外</el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                    <el-form-item label="商家名称" prop="name">
+                        <autocomplete
+                            ref="auto"
+                            v-model="firstFormData.name"
+                            :fetch-suggestions="callbackHandle"
+                            placeholder="请输入商家名称"
+                            @blur="checkCompany"
+                            @select="customNameSelect"
+                            @focus="checkCompanyfocus"
+                            :disabled='inquireSuccess'
+                            clearable
+                            value-key="value"
+                            style="width:360px"
+                            :popper-class="isCheck?'el-autocomplete-none':'el-autocomplete-suggestion-data-entry'"
+                            class="autocomplete-input"
+                        >
+                            <span 
+                                v-if="firstFormData.name.length > 3" 
+                                style="color:#409EFF;cursor: pointer;" slot="suffix"  
+                                @click="$refs.auto.search(firstFormData.name)"
+                            > 查询</span>
+                            <template slot-scope="scope">
+                                <div v-if="scope.item.KeyNo">{{scope.item.Name}}</div>
+                                <div v-else style="text-align:center">暂无数据</div>		 
+                            </template>
+                        </autocomplete>
+                        <!-- <el-input placeholder="请输入商家名称" v-model="firstFormData.name"/> -->
+                    </el-form-item>
+                </div>
+                <div class="form-line">
+                    <el-form-item label="社会信用码" prop="creditCode">
+                        <el-input disabled placeholder="请输入社会信用码" v-model="firstFormData.creditCode"/>
+                    </el-form-item>
+                    <el-form-item label="商家地址" prop="address">
+                        <el-cascader 
+                            v-model="firstFormData.address"
+                            :props="locationProps"
+                            clearable 
+                            :options="locationOptions"  
+                            @change="selectRegion" 
+                            placeholder="请选择客户地址" 
+                        />
+                    </el-form-item>
+                </div>
+                <div class="form-line">
+                    <el-form-item label="决策人" prop="decisionMaker">
+                        <el-input placeholder="请输入决策人" v-model="firstFormData.decisionMaker"/>
+                    </el-form-item>
+                    <el-form-item label="研究团队规模" prop="teamSize">
+                        <el-select 
+                            v-model="firstFormData.teamSize" 
+                            placeholder="请选择研究团队规模"
+                            clearable
+                        >
+                            <el-option
+                                v-for="item in teamSizeOpts"
+                                :key="item.val"
+                                :label="item.label"
+                                :value="item.val">
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                </div>
+                <div class="form-line">
+                    <el-form-item label="资金规模" prop="fundsize">
+                        <el-input placeholder="请输入资金规模" v-model="firstFormData.fundsize"/>
+                    </el-form-item>
+                    <el-form-item label="所属行业" prop="industry">
+                        <el-select 
+                            v-model="firstFormData.industry" 
+                            placeholder="请选择行业" 
+                            clearable
+                        >
+                            <el-option
+                                v-for="item in tradeArr"
+                                :key="item.IndustryId"
+                                :label="item.IndustryName"
+                                :value="item.IndustryId">
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                </div>
+                <div class="form-line">
+                    <el-form-item label="用户上限" prop="userMax">
+                        <el-input type="number" placeholder="请输入用户上限" v-model="firstFormData.userMax"/>
+                    </el-form-item>
+                    <el-form-item label="所属销售" prop="saller">
+                        <el-cascader
+                            ref="cascader"
+                            v-model="firstFormData.saller"
+                            :options="salesArr"
+                            :show-all-levels="false"
+                            :props="{
+                                expandTrigger: 'hover',
+                                children: 'Child',
+                                emitPath: false,
+                                label:'AdminName',
+                                value:'AdminId',
+                            }"
+                            filterable
+                            clearable
+                            placeholder="请选择销售"
+                        />
+                    </el-form-item>
+                </div>
+                
+            </el-form>
+        </div>
+        <div class="second-step-form-wrap" v-show="step===2">
+            <el-form 
+                :model="secondFormData" 
+                :rules="rules"
+                ref="secondFormEl" 
+                label-width="120px"
+                inline
+                class="second-step-form"
+            >
+                <div class="form-line">
+                    <el-form-item label="签约日期" prop="signDate">
+                        <el-date-picker
+                            v-model="secondFormData.signDate"
+                            type="date"
+                            placeholder="选择日期"
+                            value-format="yyyy-MM-dd"
+                        />
+                    </el-form-item>
+                    <el-form-item label="到期日期" prop="expirationDate">
+                        <el-date-picker
+                            v-model="secondFormData.expirationDate"
+                            type="date"
+                            placeholder="选择日期"
+                            value-format="yyyy-MM-dd"
+                        />
+                    </el-form-item>
+                </div>
+                
+            </el-form>
+        </div>
+
+        <div class="btns-box">
+            <el-button style="width:80px" type="primary" v-show="step===1" @click="handleStepSecond">下一步</el-button>
+            <el-button style="width:80px" type="primary" v-show="step===1" plain @click="$router.back()">取消</el-button>
+            <el-button style="width:80px" type="primary" v-show="step===2" plain @click="step--">上一步</el-button>
+            <el-button style="width:80px" type="primary" v-show="step===2" @click="handleAddBusiness">保存</el-button>
+        </div>
+    </div>
+</template>
+
+<script>
+import { customInterence,roadshowInterence,businessCustomInterence } from '@/api/api.js'
+import autocomplete from "@/components/autocomplete.vue";
+import Steps from "./components/Steps.vue";
+import {locationOptions} from "@/views/custom_manage/customList/location"
+export default {
+    components: {autocomplete,Steps},
+    data() {
+        return {
+            /* 城市地址数据 */
+            locationOptions,
+            locationProps:{
+                value:'name',
+                children:'city',
+                label:'name'
+            },
+
+            /* 自动输入社会信用码 */
+            isCheckCompanyInfo:false, 
+			checkCompanyfocusIs:false,
+			inquireSuccess:false,
+            nameRepeat:false,
+			codeRepeat:false,
+            isCheck:false,//检查客户弹窗
+			repeatId:'',//重复公司id
+			repeatName:'',//重复公司类型
+
+            salesArr:[],//销售员数据
+            tradeArr:[],//行业数据
+            step:1,//第几步
+
+            /* 研究团队规模数据 */
+            teamSizeOpts:[
+                {
+                    val:'50人及以下',
+                    label:'50人及以下'
+                },
+                {
+                    val:'200人及以下',
+                    label:'200人及以下'
+                },
+                {
+                    val:'超过200人',
+                    label:'超过200人'
+                }
+            ],
+            
+            rules:{
+                areaType:[{ required: true, message: '请选择所属区域', trigger: 'change' },],
+                name:[{ required: true, message: '请输入商家名称', trigger: 'blur' },],
+                creditCode:[{ required: true, message: '请输入社会信用码', trigger: 'blur' },],
+                address:[{ required: true, message: '请选择商家地址', trigger: 'change' },],
+                decisionMaker:[{required: true, message: '请输入决策人', trigger: 'blur' },],
+                teamSize:[{required: true, message: '请选择研究团队规模', trigger: 'change' },],
+                industry:[{required: true, message: '请选择所属行业', trigger: 'change' },],
+                userMax:[{required: true, message: '请输入用户上限', trigger: 'blur' },],
+                signDate:[{required: true, message: '请选择签署日期', trigger: 'change' },],
+                expirationDate:[{required: true, message: '请选择签署日期', trigger: 'change' },],
+                saller:[{required: true, message: '请选择所属销售', trigger: 'change' },],
+            },
+
+            /* 表单初始值 */
+            firstFormData:{
+                areaType:'国内',
+                name:'',
+                creditCode:'',
+                address:'',
+                decisionMaker:'',
+                teamSize:'',
+                fundsize:'',
+                industry:'',
+                userMax:'',
+                saller:''
+            },
+            secondFormData:{
+                signDate:'',
+                expirationDate:''
+            }
+        }
+    },
+    watch:{
+        'firstFormData.areaType':{
+            handler(newVal){
+                console.log('watch?',newVal)
+                if(newVal==='海外'){
+                    this.firstFormData.creditCode = 'HZ' + new Date().getTime()
+                    this.firstFormData.address = ['海外','其他市']
+                    this.selectRegion(['海外','其他市'])
+                }else{
+                    this.firstFormData.creditCode = ''
+                    this.firstFormData.address = []
+                }
+            }
+        }
+    },
+    created() {
+        this.getIndustry()
+        this.getSale()
+    },
+    methods: {
+        normalizingParams(params){
+            const cascaderNodes = this.$refs.cascader.getCheckedNodes({leafOnly:true})
+            const IndustryName = this.tradeArr.find(item=>item.IndustryId===params.industry).IndustryName
+            return {
+                BusinessName:params.name,
+                CreditCode:params.creditCode,
+                RegionType:params.areaType,
+                Province:params.province,
+                City:params.city,
+                SellerId:Number(cascaderNodes[0]?cascaderNodes[0].value:0),
+                SellerName:cascaderNodes[0]?cascaderNodes[0].label:'',
+                Leader:params.decisionMaker,
+                IndustryId:Number(params.industry),
+                IndustryName:IndustryName,
+                CapitalScale:params.fundsize,
+                ResearchTeamSize:params.teamSize,
+                UserMax:Number(params.userMax),
+                SigningTime:params.signDate||'',
+                ExpiredTime:params.expirationDate||''
+            }
+        },
+        //跳转到第二步
+        handleStepSecond(){
+            this.$refs.firstFormEl.validate((valid)=>{
+                if(valid){
+                    const params = this.normalizingParams(this.firstFormData)
+                    businessCustomInterence.addBusiness({
+                        IsCheck:true,
+                        ...params
+                    }).then(res=>{
+                        if(res.Ret!==200) return 
+                        this.step++
+                    })
+                    
+                }
+            })
+        },
+        //保存商家
+        handleAddBusiness(){
+            this.$refs.secondFormEl.validate((valid)=>{
+                if(valid){
+                    const params = this.normalizingParams({...this.firstFormData,...this.secondFormData})
+                    businessCustomInterence.addBusiness({
+                        IsCheck:false,
+                        ...params
+                    }).then(res=>{
+                        if(res.Ret!==200) return 
+                        this.$message.success('添加成功')
+                        this.$router.push('/businessETAList')
+                    })
+                }
+            })
+        },
+
+        async callbackHandle(data,cb) {
+            if (data) {
+                this.isCheckCompanyInfo =true
+                cb([]);
+                let res = await customInterence.companyQccSearch({ KeyWord: data});
+                if (res.Ret === 200) {
+                    this.isCheckCompanyInfo =false;
+                    if (res.Data && res.Data.length > 0) {
+                        let arr = res.Data.map((item) => {
+                            return { value:item.Name, ...item };
+                        });
+                        cb(arr);
+                    }else{
+                        cb([{}]);
+                        // this.checkCompany()
+                    }	
+                }	
+            }
+		},
+
+        checkCompanyfocus(){
+			this.checkCompanyfocusIs =true;
+			setTimeout(() => {
+			    this.checkCompanyfocusIs =false;
+			},500)
+		},
+
+        //选中后增加社会信用码
+		customNameSelect(value) {
+			this.firstFormData.creditCode = value.CreditCode
+			//this.inquireSuccess = true;
+			setTimeout(async()=>{
+				this.checkCompany()
+			},10)
+		},
+
+        /* 客户名称/信用码失焦时校验客户名称是否存在 存在就提示 */
+		checkCompany() {	
+			setTimeout(()=>{
+                if(this.checkCompanyfocusIs) return
+                if((!this.firstFormData.name && !this.firstFormData.creditCode) || (this.isCheckCompanyInfo && this.firstFormData.name)) return
+                    customInterence.checkCompanyInfo({
+                        CompanyName:this.firstFormData.name,
+                        CreditCode:this.firstFormData.creditCode
+                    }).then(res =>{
+                        if(res.Ret === 200){
+                            if(res.Data.RepeatStatus > 0) {
+                                this.repeatId = res.Data.CompanyId;
+                                this.repeatName = res.Data.ProductName;
+                                this.nameRepeat = res.Data.RepeatStatus
+                                this.codeRepeat = res.Data.Status
+                                this.isCheck = true;
+                            }else {
+                                this.nameRepeat = 0
+                                this.isCheck = false;
+                            }
+                        }
+                    })
+			},500)
+		},
+
+        selectRegion(e){
+            this.firstFormData.province=e[0]
+            this.firstFormData.city=e[1]
+        },
+        /* 根据类型获取行业 */
+		getIndustry() {
+			customInterence.getindustry({
+				Classify:'ficc'
+			}).then(res => {
+				if(res.Ret === 200) {
+					this.tradeArr = res.Data.List || [];
+				}
+			})
+		},
+        /* 获取销售 */
+        async getSale() {
+            const res = await roadshowInterence.getSellerList();
+            if(res.Ret!==200) return 
+            this.salesArr = res.Data.List||[]
+            this.salesArr = this.salesArr.map(i=>{
+                if(!i.AdminName){
+                    i.AdminName = i.GroupName
+                }
+                if(!i.AdminId){
+                    i.AdminId = i.GroupId
+                }
+                return i
+            })
+        },
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.add-business{
+    padding:30px;
+    box-sizing: border-box;
+    background-color: #fff;
+    min-width: 1100px;
+    height: calc(100vh - 120px);
+    .first-step-form-wrap,.second-step-form-wrap{
+        margin-top:60px;
+        border-top: 1px solid #DCDCDC;
+        width:70%;
+    }
+    .el-form{
+        .form-line{
+            margin:30px 0;
+            border-bottom: 1px solid #DCDCDC;
+            .el-input,.el-select,.el-cascader,.el-radio-group{
+                width:360px;
+            }
+            .el-radio-group{
+                display: flex;
+                justify-content: space-between;
+                .el-radio{
+                    width: 165px;
+                    text-align: center;
+                }
+            }
+        }
+    }
+}
+.btns-box{
+    position: fixed;
+    left: 50%;
+    bottom: 100px;
+    transform: translateX(-50%);
+    width: 200px;
+    z-index: 99;
+}
+</style>

+ 359 - 0
src/views/business_ETA_manage/businessDetail.vue

@@ -0,0 +1,359 @@
+<template>
+    <div class="business-detail-wrap">
+        <div class="business-detail">
+            <Steps 
+                :activeStep="step"
+                :stepsArr="stepsArr"
+                @changeActiveStep="changeActiveStep"
+            />
+            <div class="first-step-form-wrap" v-show="step===1">
+                <el-form 
+                    :model="firstFormData" 
+                    ref="firstFormEl" 
+                    label-width="120px"
+                    inline
+                    :rules="rules"
+                    :disabled="true"
+                    class="first-step-form"
+                >
+                    <div class="form-line">
+                        <el-form-item label="商家名称" prop="BusinessName">
+                            <el-input disabled placeholder="请输入商家名称" v-model="firstFormData.BusinessName"/>
+                        </el-form-item>
+                        <el-form-item label="商家ID" prop="BusinessCode">
+                            <el-input disabled placeholder="请输入商家ID" v-model="firstFormData.BusinessCode"/>
+                        </el-form-item>
+                    </div>
+                    <div class="form-line">
+                        <el-form-item label="所属区域" prop="RegionType">
+                            <el-radio-group v-model="firstFormData.RegionType" disabled>
+                                <el-radio label="国内" border>国内</el-radio>
+                                <el-radio label="海外" border>海外</el-radio>
+                            </el-radio-group>
+                        </el-form-item>
+                        <el-form-item label="商家地址" prop="address">
+                            <el-cascader 
+                                v-model="firstFormData.address"
+                                :props="locationProps"
+                                clearable 
+                                :options="locationOptions"  
+                                @change="selectRegion" 
+                                placeholder="请选择客户地址" 
+                            />
+                        </el-form-item>
+                    </div>
+                    <div class="form-line">
+                        <el-form-item label="社会信用码" prop="CreditCode">
+                            <el-input disabled placeholder="请输入社会信用码" v-model="firstFormData.CreditCode"/>
+                        </el-form-item>
+                        <el-form-item label="研究团队规模" prop="ResearchTeamSize">
+                            <el-select 
+                                v-model="firstFormData.ResearchTeamSize" 
+                                placeholder="请选择研究团队规模"
+                                clearable
+                            >
+                                <el-option
+                                    v-for="item in teamSizeOpts"
+                                    :key="item.val"
+                                    :label="item.label"
+                                    :value="item.val">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </div>
+                    <div class="form-line">
+                        <el-form-item label="决策人" prop="Leader">
+                            <el-input placeholder="请输入决策人" v-model="firstFormData.Leader"/>
+                        </el-form-item>
+                        <el-form-item label="所属行业" prop="IndustryId">
+                            <el-select 
+                                v-model="firstFormData.IndustryId" 
+                                placeholder="请选择行业" 
+                                clearable
+                            >
+                                <el-option
+                                    v-for="item in tradeArr"
+                                    :key="item.IndustryId"
+                                    :label="item.IndustryName"
+                                    :value="item.IndustryId">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </div>
+                    <div class="form-line">
+                        <el-form-item label="资金规模" prop="CapitalScale">
+                            <el-input placeholder="请输入资金规模" v-model="firstFormData.CapitalScale"/>
+                        </el-form-item>
+                        <el-form-item label="用户上限" prop="UserMax">
+                            <el-input type="number" placeholder="请输入用户上限" v-model="firstFormData.UserMax"/>
+                        </el-form-item>
+                    </div>
+                    <div class="form-line">
+                        <el-form-item label="所属销售" prop="SellerName">
+                            <el-input disabled placeholder="请输入销售" v-model="firstFormData.SellerName"/>
+                        </el-form-item>
+                    </div>
+                    
+                </el-form>
+            </div>
+            <div class="second-step-form-wrap" v-show="step===2">
+                <el-table :data="recordData" border>
+                    <el-table-column
+                        v-for="item in tableColOpts"
+                        :key="item.key"
+                        :prop="item.key"
+                        :label="item.label"
+                        align="center"
+                    >
+                    </el-table-column>
+                </el-table>
+            </div>
+        </div>
+        <div class="business-other">
+            <div class="btn-wrap">
+                    <el-button type="primary" @click="$router.push({
+                        path:'/editETABusiness',
+                        query:{
+                            id:firstFormData.EtaBusinessId
+                        }
+                    })">编辑</el-button>
+            </div>
+            <div class="time-line-wrap">
+                <el-timeline>
+                    <el-timeline-item
+                        v-for="(activity, index) in activities"
+                        :key="index"
+                        color="#409EFF" 
+                        :timestamp="activity.CreateTime">
+                        <template slot="dot">
+                            <div class="dot-wrap">
+                                <div class="dot-inner"></div>
+                            </div>
+                        </template>
+                        {{activity.OperationRemark}}
+                    </el-timeline-item>
+                </el-timeline>
+            </div>
+        </div>
+
+        <!-- 添加续约 -->
+        <el-dialog
+            title="添加续约"
+            :visible.sync="showRenewal"
+            :modal-append-to-body="false"
+            :close-on-click-modal="false"
+            @closed="showRenewal=false"
+            width="580px"
+        >
+            <AddRenewal 
+                @addRenewal="handleAddRenewal"
+                @close="showRenewal=false"/>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { customInterence , businessCustomInterence} from '@/api/api.js'
+import Steps from "./components/Steps.vue";
+import AddRenewal from "./components/AddRenewal";
+import {locationOptions} from "@/views/custom_manage/customList/location"
+export default {
+    components: {Steps,AddRenewal},
+    data() {
+        return {
+            locationOptions,
+            locationProps:{
+                value:'name',
+                children:'city',
+                label:'name'
+            },
+
+            step:1,//第几步
+            teamSizeOpts:[
+                {
+                    val:'50人及以下',
+                    label:'50人及以下'
+                },
+                {
+                    val:'200人及以下',
+                    label:'200人及以下'
+                },
+                {
+                    val:'超过200人',
+                    label:'超过200人'
+                }
+            ],
+            tradeArr:[],
+            firstFormData:{
+                RegionType:'',//1国内 2国外
+                BusinessName:'',
+                CreditCode:'',
+                Address:'',
+                Leader:'',
+                ResearchTeamSize:'',
+                CapitalScale:'',
+                IndustryId:'',
+                UserMax:'',
+                SellerId:'',
+            },
+            rules:{
+                address:[{ required: true, message: '请选择商家地址', trigger: 'change' },],
+                decisionMaker:[{required: true, message: '请输入决策人', trigger: 'blur' },],
+                teamSize:[{required: true, message: '请选择研究团队规模', trigger: 'change' },],
+                industry:[{required: true, message: '请选择所属行业', trigger: 'change' },],
+                userMax:[{required: true, message: '请输入用户上限', trigger: 'blur' },],
+                saller:[{required: true, message: '请选择所属销售', trigger: 'change' },],
+            },
+            recordData:[],
+            tableColOpts:[
+                {
+                    label:'签约时间',
+                    key:'SigningTime'
+                },{
+                    label:'到期时间',
+                    key:'ExpiredTime'
+                },{
+                    label:'到期天数',
+                    key:'ExpireDay'
+                }
+            ],
+            activities:[],
+        }
+    },
+    created() {
+        this.getIndustry()
+        this.getBusinessDetail()
+    },
+    methods: {
+        selectRegion(e){
+            this.firstFormData.province=e[0]
+            this.firstFormData.city=e[1]
+        },
+        /* 根据类型获取行业 */
+		getIndustry() {
+			customInterence.getindustry({
+				Classify:'ficc'
+			}).then(res => {
+				if(res.Ret === 200) {
+					this.tradeArr = res.Data.List || [];
+				}
+			})
+		},
+        changeActiveStep(index){
+            this.step = index + 1
+        },
+        // 获取商家详情
+        getBusinessDetail(){
+            //query id
+            businessCustomInterence.getBusinessDetail({
+                EtaBusinessId:Number(this.$route.query.id)
+            }).then(res=>{
+                if(res.Ret !== 200)return 
+                this.firstFormData = res.Data||{}
+                this.firstFormData.address = [res.Data.Province||'',res.Data.City||'']
+            })
+            //获取签约详情
+            this.getTableData(Number(this.$route.query.id))
+            //获取操作日志列表
+            this.getTimeLineData(Number(this.$route.query.id))
+        },
+        // 获取签约详情
+        getTableData(id){
+            businessCustomInterence.getContractList({
+                EtaBusinessId:id
+            }).then(res=>{
+                if(res.Ret !== 200) return 
+                this.recordData = res.Data||[]
+            })
+        },
+
+        // 获取操作日志详情
+        getTimeLineData(id){
+            businessCustomInterence.getTimeLineList({
+                EtaBusinessId:id
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.activities = res.Data||[]
+            })
+        },
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.business-detail-wrap{
+    display: flex;
+    background-color: #fff;
+    min-width: 1100px;
+    min-height: calc(100vh - 120px);
+    padding:30px;
+    box-sizing: border-box;
+    gap:10%;
+    .business-detail{
+        width:70%;
+        .first-step-form-wrap,.second-step-form-wrap{
+            margin-top:60px;
+            border-top: 1px solid #DCDCDC;
+        }
+        .el-form{
+            .form-line{
+                margin:30px 0;
+                border-bottom: 1px solid #DCDCDC;
+                .el-input,.el-select,.el-cascader,.el-radio-group{
+                    width:360px;
+                }
+                .el-radio-group{
+                    display: flex;
+                    justify-content: space-between;
+                    .el-radio{
+                        width: 165px;
+                        text-align: center;
+                    }
+                }
+            }
+        }
+        .el-table{
+            margin-top: 30px;
+        }
+    }
+    .business-other{
+        flex: 1;
+        .btn-wrap{
+            display: flex;
+            gap:30px;
+            .el-button{
+                flex:1;
+            }
+        }
+        .time-line-wrap{
+            margin-top:30px;
+            border:1px solid #DCDFE6;
+            border-radius: 4px;
+            box-sizing: border-box;
+            padding: 30px;
+            max-height: calc(100vh - 250px);
+            overflow-y: auto;
+            .dot-wrap{
+                width:12px;
+                height:12px;
+                border:6px solid #fff;
+                background-color: #3385FF;
+                position: absolute;
+                left:-6px;
+                top:0;
+                border-radius: 50%;
+                .dot-inner{
+                    position: absolute;
+                    left:3px;
+                    top:3px;
+                    width:6px;
+                    height: 6px;
+                    border-radius: 50%;
+                    background-color: #fff;
+                }
+            }
+        }
+    }
+}
+
+</style>

+ 391 - 0
src/views/business_ETA_manage/businessEdit.vue

@@ -0,0 +1,391 @@
+<template>
+    <div class="business-detail-wrap">
+        <div class="business-detail">
+            <Steps 
+                :activeStep="step"
+                :stepsArr="stepsArr"
+                @changeActiveStep="changeActiveStep"
+            />
+            <div class="first-step-form-wrap" v-show="step===1">
+                <el-form 
+                    :model="firstFormData" 
+                    ref="firstFormEl" 
+                    label-width="120px"
+                    inline
+                    :rules="rules"
+                    class="first-step-form"
+                >
+                    <div class="form-line">
+                        <el-form-item label="商家名称" prop="BusinessName">
+                            <el-input disabled placeholder="请输入商家名称" v-model="firstFormData.BusinessName"/>
+                        </el-form-item>
+                        <el-form-item label="商家ID" prop="BusinessCode">
+                            <el-input disabled placeholder="请输入商家ID" v-model="firstFormData.BusinessCode"/>
+                        </el-form-item>
+                    </div>
+                    <div class="form-line">
+                        <el-form-item label="所属区域" prop="RegionType">
+                            <el-radio-group v-model="firstFormData.RegionType" disabled>
+                                <el-radio label="国内" border>国内</el-radio>
+                                <el-radio label="海外" border>海外</el-radio>
+                            </el-radio-group>
+                        </el-form-item>
+                        <el-form-item label="商家地址" prop="address">
+                            <el-cascader 
+                                v-model="firstFormData.address"
+                                :props="locationProps"
+                                clearable 
+                                :options="locationOptions"  
+                                @change="selectRegion" 
+                                placeholder="请选择客户地址" 
+                            />
+                        </el-form-item>
+                    </div>
+                    <div class="form-line">
+                        <el-form-item label="社会信用码" prop="CreditCode">
+                            <el-input disabled placeholder="请输入社会信用码" v-model="firstFormData.CreditCode"/>
+                        </el-form-item>
+                        <el-form-item label="研究团队规模" prop="ResearchTeamSize">
+                            <el-select 
+                                v-model="firstFormData.ResearchTeamSize" 
+                                placeholder="请选择研究团队规模"
+                                clearable
+                            >
+                                <el-option
+                                    v-for="item in teamSizeOpts"
+                                    :key="item.val"
+                                    :label="item.label"
+                                    :value="item.val">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </div>
+                    <div class="form-line">
+                        <el-form-item label="决策人" prop="Leader">
+                            <el-input placeholder="请输入决策人" v-model="firstFormData.Leader"/>
+                        </el-form-item>
+                        <el-form-item label="所属行业" prop="IndustryId">
+                            <el-select 
+                                v-model="firstFormData.IndustryId" 
+                                placeholder="请选择行业" 
+                                clearable
+                            >
+                                <el-option
+                                    v-for="item in tradeArr"
+                                    :key="item.IndustryId"
+                                    :label="item.IndustryName"
+                                    :value="item.IndustryId">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </div>
+                    <div class="form-line">
+                        <el-form-item label="资金规模" prop="CapitalScale">
+                            <el-input placeholder="请输入资金规模" v-model="firstFormData.CapitalScale"/>
+                        </el-form-item>
+                        <el-form-item label="用户上限" prop="UserMax">
+                            <el-input type="number" placeholder="请输入用户上限" v-model="firstFormData.UserMax"/>
+                        </el-form-item>
+                    </div>
+                    <div class="form-line">
+                        <el-form-item label="所属销售" prop="SellerName">
+                            <el-input disabled placeholder="请输入销售" v-model="firstFormData.SellerName"/>
+                        </el-form-item>
+                    </div>
+                </el-form>
+            </div>
+            <div class="second-step-form-wrap" v-show="step===2">
+                <el-table :data="recordData" border>
+                    <el-table-column
+                        v-for="item in tableColOpts"
+                        :key="item.key"
+                        :prop="item.key"
+                        :label="item.label"
+                        align="center"
+                    >
+                    </el-table-column>
+                </el-table>
+                <el-button type="text" @click="showRenewal=true">添加续约</el-button>
+            </div>
+        </div>
+        <div class="business-other">
+            <div class="btn-wrap">
+                <el-button type="primary" @click="handleSaveDetail">保存</el-button>
+                <el-button type="primary" plain @click="$router.push('/businessETAList')">取消</el-button>
+            </div>
+            <div class="time-line-wrap">
+                <el-timeline>
+                    <el-timeline-item
+                        v-for="(activity, index) in activities"
+                        :key="index"
+                        color="#409EFF" 
+                        :timestamp="activity.CreateTime">
+                        <template slot="dot">
+                            <div class="dot-wrap">
+                                <div class="dot-inner"></div>
+                            </div>
+                        </template>
+                        {{activity.OperationRemark}}
+                    </el-timeline-item>
+                </el-timeline>
+            </div>
+        </div>
+
+        <!-- 添加续约 -->
+        <el-dialog
+            title="添加续约"
+            :visible.sync="showRenewal"
+            :modal-append-to-body="false"
+            :close-on-click-modal="false"
+            @closed="showRenewal=false"
+            width="580px"
+        >
+            <AddRenewal 
+                @addRenewal="handleAddRenewal"
+                @close="showRenewal=false"/>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { customInterence , businessCustomInterence} from '@/api/api.js'
+import Steps from "./components/Steps.vue";
+import AddRenewal from "./components/AddRenewal";
+import {locationOptions} from "@/views/custom_manage/customList/location"
+export default {
+    components: {Steps,AddRenewal},
+    data() {
+        return {
+            locationOptions,
+            locationProps:{
+                value:'name',
+                children:'city',
+                label:'name'
+            },
+
+            step:1,//第几步
+            teamSizeOpts:[
+                {
+                    val:'50人及以下',
+                    label:'50人及以下'
+                },
+                {
+                    val:'200人及以下',
+                    label:'200人及以下'
+                },
+                {
+                    val:'超过200人',
+                    label:'超过200人'
+                }
+            ],
+            tradeArr:[],
+            firstFormData:{
+                RegionType:'',//1国内 2国外
+                BusinessName:'',
+                CreditCode:'',
+                Address:'',
+                Leader:'',
+                ResearchTeamSize:'',
+                CapitalScale:'',
+                IndustryId:'',
+                UserMax:'',
+                SellerId:'',
+                Province:'',
+                City:''
+            },
+            rules:{
+                address:[{ required: true, message: '请选择商家地址', trigger: 'change' },],
+                decisionMaker:[{required: true, message: '请输入决策人', trigger: 'blur' },],
+                teamSize:[{required: true, message: '请选择研究团队规模', trigger: 'change' },],
+                industry:[{required: true, message: '请选择所属行业', trigger: 'change' },],
+                userMax:[{required: true, message: '请输入用户上限', trigger: 'blur' },],
+                saller:[{required: true, message: '请选择所属销售', trigger: 'change' },],
+            },
+            recordData:[],
+            tableColOpts:[
+                {
+                    label:'签约时间',
+                    key:'SigningTime'
+                },{
+                    label:'到期时间',
+                    key:'ExpiredTime'
+                },{
+                    label:'到期天数',
+                    key:'ExpireDay'
+                }
+            ],
+            activities:[],
+            showRenewal:false,
+        }
+    },
+    created() {
+        this.getIndustry()
+        this.getBusinessDetail()
+    },
+    methods: {
+        selectRegion(e){
+            this.firstFormData.Province=e[0]
+            this.firstFormData.City=e[1]
+        },
+        /* 根据类型获取行业 */
+		getIndustry() {
+			customInterence.getindustry({
+				Classify:'ficc'
+			}).then(res => {
+				if(res.Ret === 200) {
+					this.tradeArr = res.Data.List || [];
+				}
+			})
+		},
+        changeActiveStep(index){
+            this.step = index + 1
+        },
+        // 获取商家详情
+        getBusinessDetail(){
+            //query id
+            businessCustomInterence.getBusinessDetail({
+                EtaBusinessId:Number(this.$route.query.id)
+            }).then(res=>{
+                if(res.Ret !== 200)return 
+                this.firstFormData = res.Data||{}
+                this.firstFormData.address = [res.Data.Province||'',res.Data.City||'']
+            })
+            //获取签约详情
+            this.getTableData(Number(this.$route.query.id))
+            //获取操作日志列表
+            this.getTimeLineData(Number(this.$route.query.id))
+        },
+        // 获取签约详情
+        getTableData(id){
+            businessCustomInterence.getContractList({
+                EtaBusinessId:id
+            }).then(res=>{
+                if(res.Ret !== 200) return 
+                this.recordData = res.Data||[]
+            })
+        },
+
+        // 获取操作日志详情
+        getTimeLineData(id){
+            businessCustomInterence.getTimeLineList({
+                EtaBusinessId:id
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.activities = res.Data||[]
+            })
+        },
+        // 保存商家
+        handleSaveDetail(){
+            const {EtaBusinessId,CapitalScale,
+                   address,Leader,IndustryId,
+                   ResearchTeamSize,UserMax} = this.firstFormData
+            const IndustryName = this.tradeArr.find(item=>item.IndustryId===IndustryId).IndustryName
+            businessCustomInterence.editBusiness({
+                EtaBusinessId,Leader,
+                IndustryName,CapitalScale,
+                ResearchTeamSize,
+                IndustryId:Number(IndustryId),
+                UserMax:Number(UserMax),
+                Province:address[0],
+                City:address[1]
+            }).then(res=>{
+                if(res.Ret!==200) return
+                this.$message.success('保存成功')
+                this.getBusinessDetail()
+            })
+        },
+        //添加续约
+        handleAddRenewal({signDate,expirationDate}){
+            businessCustomInterence.addNewContract({
+                EtaBusinessId:Number(this.$route.query.id),
+                SigningTime:signDate,
+                ExpiredTime:expirationDate
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.$message.success('添加续约成功')
+                this.showRenewal=false
+                this.getTableData(Number(this.$route.query.id))
+                this.getTimeLineData(Number(this.$route.query.id))
+            })
+        }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.business-detail-wrap{
+    display: flex;
+    background-color: #fff;
+    min-width: 1100px;
+    min-height: calc(100vh - 120px);
+    padding:30px;
+    box-sizing: border-box;
+    gap:10%;
+    .business-detail{
+        width:70%;
+        .first-step-form-wrap,.second-step-form-wrap{
+            margin-top:60px;
+            border-top: 1px solid #DCDCDC;
+        }
+        .el-form{
+            .form-line{
+                margin:30px 0;
+                border-bottom: 1px solid #DCDCDC;
+                .el-input,.el-select,.el-cascader,.el-radio-group{
+                    width:360px;
+                }
+                .el-radio-group{
+                    display: flex;
+                    justify-content: space-between;
+                    .el-radio{
+                        width: 165px;
+                        text-align: center;
+                    }
+                }
+            }
+        }
+        .el-table{
+            margin-top: 30px;
+        }
+    }
+    .business-other{
+        flex: 1;
+        .btn-wrap{
+            display: flex;
+            gap:30px;
+            .el-button{
+                flex:1;
+            }
+        }
+        .time-line-wrap{
+            margin-top:30px;
+            border:1px solid #DCDFE6;
+            border-radius: 4px;
+            box-sizing: border-box;
+            padding: 30px;
+            max-height: calc(100vh - 250px);
+            overflow-y: auto;
+            .dot-wrap{
+                width:12px;
+                height:12px;
+                border:6px solid #fff;
+                background-color: #3385FF;
+                position: absolute;
+                left:-6px;
+                top:0;
+                border-radius: 50%;
+                .dot-inner{
+                    position: absolute;
+                    left:3px;
+                    top:3px;
+                    width:6px;
+                    height: 6px;
+                    border-radius: 50%;
+                    background-color: #fff;
+                }
+            }
+        }
+    }
+}
+
+</style>

+ 488 - 0
src/views/business_ETA_manage/businessList.vue

@@ -0,0 +1,488 @@
+<template>
+    <div class="business-ETA-list">
+        <div class="top-filter-box">
+            <div>
+                <el-button type="primary" @click="$router.push('/addETABusiness')">新增</el-button>
+                <el-input
+                    placeholder="商家名称/社会信用码/商家ID"
+                    v-model="search_txt"
+                    @input="changeSelectOptions('search')"
+                    clearable
+                    style="maxWidth:500px;float:right">
+                    <i slot="prefix" class="el-input__icon el-icon-search"></i>
+                </el-input>
+            </div>
+            
+        </div>
+        <div class="table-wrap">
+            <div class="select-wrap">
+                <el-select 
+                    v-model="trade" 
+                    placeholder="请选择行业" 
+                    clearable 
+                    @change="changeSelectOptions('trade')"
+                >
+                    <el-option
+                        v-for="item in tradeArr"
+                        :key="item.IndustryId"
+                        :label="item.IndustryName"
+                        :value="item.IndustryId">
+                    </el-option>
+                </el-select>
+                <el-cascader
+                    ref="cascader"
+                    v-model="sales"
+                    :options="salesArr"
+                    :show-all-levels="false"
+                    :props="{
+                        expandTrigger: 'hover',
+                        children: 'Child',
+                        emitPath: false,
+                        label:'AdminName',
+                        value:'AdminId',
+                        multiple:true
+                    }"
+                    collapse-tags
+                    filterable
+                    clearable
+                    placeholder="请选择销售"
+                    @change="changeSelectOptions('sales')"
+                />
+                <el-cascader 
+                    v-model="valueLocation" 
+                    collapse-tags 
+                    :props="locationProps" 
+                    clearable 
+                    :options="locationOptions"  
+                    @change="changeSelectOptions('location')" 
+                    placeholder="请选择客户地址" 
+                />
+                <el-select 
+                    v-model="signStatus" 
+                    placeholder="请选择签约状态" 
+                    clearable
+                    @change="changeSelectOptions('signStatus')"
+                >
+                    <el-option
+                        v-for="item in signStatusOpts"
+                        :key="item.val"
+                        :label="item.label"
+                        :value="item.val">
+                    </el-option>
+                </el-select>
+            </div>
+            <el-table
+                    ref="userTable"
+                    :data="tableData"
+                    v-loading="isTableLoadding"
+                    element-loading-text="数据加载中..."
+                    @sort-change="sortChangeHandle"
+                    border
+                >
+                    <el-table-column
+                        v-for="item in tableColOpts"
+                        :key="item.key"
+                        :prop="item.key"
+                        :label="item.label"
+                        align="center"
+                        :sortable="item.sort"
+                    >
+                        <template slot-scope="scope">
+                            <span v-if="item.key==='SigningStatus'">
+                                {{signStatusOpts[scope.row.SigningStatus - 1].label}}{{!scope.row.Enable?'(禁用)':''}}
+                            </span>
+                            <span v-else-if="item.key==='BusinessName'" class="link" @click="handleShowDetail(scope.row)">
+                                {{ scope.row.BusinessName }}
+                            </span>
+                            <span v-else>{{scope.row[item.key]}}</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column
+                        label="操作"
+                        align="center"
+                    >
+                        <template slot-scope="scope">
+                            <div class="table-opt-btns">
+                                <span @click="handleEdit(scope.row)">编辑</span>
+                                <span @click="handleShowRenewal(scope.row)">添加续约</span>
+                                <el-dropdown 
+                                    size="medium" 
+                                    placement="bottom-start" 
+                                    @command="itemclickHandle($event,scope.row)"
+                                >
+                                    <span class="el-dropdown-link">
+                                        <i class="el-icon-more el-icon--right"></i>
+                                        <el-dropdown-menu slot="dropdown">
+                                            <el-dropdown-item command="modifySale">修改销售</el-dropdown-item>
+                                            <el-dropdown-item command="disable">{{scope.row.Enable?'禁用':'启用'}}</el-dropdown-item>
+                                        </el-dropdown-menu>
+                                    </span>
+                                </el-dropdown>
+                            </div>
+                        </template>
+                    
+                    </el-table-column>
+            </el-table>
+            <div style="text-align:right;margin-top:20px">
+                <el-pagination 
+                        layout="total,prev,pager,next,jumper" 
+                        background 
+                        :current-page="page"
+                        @current-change="handleCurrentChange"
+                        :page-size="pageSize"
+                        :total="total"
+                        style="display: inline-block"
+                    />
+            </div>
+        </div>
+
+        <!-- 添加续约 -->
+        <el-dialog
+            title="添加续约"
+            :visible.sync="showRenewal"
+            :modal-append-to-body="false"
+            :close-on-click-modal="false"
+            @closed="showRenewal=false"
+            width="580px"
+        >
+            <AddRenewal 
+                @addRenewal="handleAddRenewal"
+                @close="showRenewal=false"/>
+        </el-dialog>
+
+        <!-- 修改销售 -->
+        <el-dialog
+            title="修改销售"
+            :visible.sync="showModifySaller"
+            :modal-append-to-body="false"
+            :close-on-click-modal="false"
+            @closed="showRenewal=false"
+            width="580px"
+        >
+            <ModifySaller 
+                :salesArr="salesArr"
+                :data="modifyData"
+                @modifySaller="handleModifySaller"
+                @close="showModifySaller=false"/>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { customInterence ,businessCustomInterence , roadshowInterence} from '@/api/api.js'
+import {locationOptions} from "@/views/custom_manage/customList/location"
+import AddRenewal from './components/AddRenewal.vue'
+import ModifySaller from './components/ModifySaller.vue'
+export default {
+    components:{AddRenewal,ModifySaller},
+    data() {
+        return {
+            /* dialog */
+            showRenewal:false,//显示添加续约
+            showModifySaller:false,//显示修改销售
+            modifyData:{},//当前操作的商家数据
+
+            /* select options */
+            search_txt:'',
+            trade:'',
+            tradeArr:[],
+            sales:[],
+            salesArr:[],//销售
+            locationOptions,
+            valueLocation:[],
+            provinceValue:'',
+            cityValue:'',
+            locationProps:{
+                multiple: true,
+                value:'name',
+                children:'city',
+                label:'name'
+            },
+            signStatus:'',
+            signStatusOpts:[
+                {
+                    label:'首次签约',
+                    val:1
+                },
+                {
+                    label:'续约中',
+                    val:2
+                },
+                {
+                    label:'已终止',
+                    val:3
+                }
+            ],
+            /* sort options */
+            sortParam:0,
+            sortType:0,
+
+            /* table */
+            tableColOpts:[
+                {
+                    label:'商家名称',
+                    key:'BusinessName'
+                },
+                {
+                    label:'商家ID',
+                    key:'BusinessCode'
+                },
+                {
+                    label:'商家地址',
+                    key:'Address'
+                },
+                {
+                    label:'销售',
+                    key:'SellerName'
+                },
+                {
+                    label:'签约状态',
+                    key:'SigningStatus'
+                },
+                {
+                    label:'最新签约时间',
+                    key:'SigningTime',
+                    sort:true
+                },
+                {
+                    label:'到期时间',
+                    key:'ExpiredTime',
+                    sort:true
+                },
+                {
+                    label:'创建时间',
+                    key:'CreateTime',
+                    sort:true
+                },
+                {
+                    label:'用户上限',
+                    key:'UserMax',
+                    sort:true
+                },
+                
+            ],
+            tableData:[],
+            isTableLoadding:false,
+            page:1,
+            pageSize:20,
+            total:0,
+        }
+    },
+    created() {
+        this.getIndustry()
+        this.getSale()
+        this.getBusinessList()
+    },
+    methods: {
+        // 筛选项改变
+        changeSelectOptions(option){
+            if(option === 'location'){
+                const provinceArr = []
+                const cityArr = []
+                this.valueLocation.forEach(item=>{
+                        // 省
+                        provinceArr.push(item[0])
+                        // 市
+                        cityArr.push(item[1])
+                })
+                //provinceArr需要去重
+                this.provinceValue = [...new Set(provinceArr)].join(',')
+                this.cityValue = cityArr.join(',')
+                this.page = 1;
+            }
+            this.getBusinessList()
+        },
+        // 表格排序方式改变
+        sortChangeHandle(params){
+            const sortParamMap = {
+                'SigningTime':1,//签约时间
+                'ExpiredTime':2,//到期时间
+                'CreateTime':3,//创建时间
+                'UserMax':4,//用户上限
+            }
+            this.sortParam = sortParamMap[params.prop]
+            this.sortType = params.order === 'ascending' ? 1 :params.order === 'descending' ? 2 : 0
+            this.page = 1
+            this.getBusinessList()
+        },
+        // 获取表格数据
+        getBusinessList(){
+            this.isTableLoadding = true
+            businessCustomInterence.getBusinessList({
+                Keyword:this.search_txt,
+                SellerIds:this.sales.join(','),
+                SigningStatus:Number(this.signStatus),
+                Province:this.provinceValue,
+                City:this.cityValue,
+                IndustryId:Number(this.trade),
+                PageSize:this.pageSize,
+                CurrentIndex:this.page,
+                SortParam:this.sortParam,
+                SortType:this.sortType
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.tableData = res.Data.List
+                this.total = res.Data.Paging.Totals
+                this.isTableLoadding = false
+            })
+        },
+        // 去详情
+        handleShowDetail(data){
+            this.$router.push({
+                path:'/businessETADetail',
+                query:{
+                    id:data.EtaBusinessId
+                }
+            })
+        },
+        // 前去编辑
+        handleEdit(data){
+            this.$router.push({
+                path:'/editETABusiness',
+                query:{
+                    id:data.EtaBusinessId
+                }
+            })
+        },
+
+        // 显示添加续约
+        handleShowRenewal(e){
+            this.modifyData = e
+            this.showRenewal=true
+        },
+        // 商家添加续约
+        handleAddRenewal({signDate,expirationDate}){
+            businessCustomInterence.addNewContract({
+                EtaBusinessId:this.modifyData.EtaBusinessId,
+                SigningTime:signDate,
+                ExpiredTime:expirationDate
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.$message.success('添加续约成功')
+                this.showRenewal=false
+                this.getBusinessList()
+            })
+        },
+        // 商家修改销售
+        handleModifySaller({saller,sallerName}){
+            businessCustomInterence.changeBusinessSeller({
+                EtaBusinessId:this.modifyData.EtaBusinessId,
+                SellerId:saller,
+                SellerName:sallerName
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.$message.success('修改销售成功')
+                this.showModifySaller = false
+                this.getBusinessList()
+            })
+        },
+        // 启用禁用商家
+        changeBusinessStatus(data){
+            businessCustomInterence.changeBusinessStatus({
+                EtaBusinessId:data.EtaBusinessId
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.$message.success(`${data.Enable?'禁用':'启用'}成功`)
+                this.getBusinessList()
+            })
+        },
+
+        // 操作栏 折叠起来的按钮
+        itemclickHandle(type,data){
+            if(type==='modifySale'){
+                this.modifyData = data
+                this.showModifySaller=true
+            }else if (type==='disable'){
+                this.changeBusinessStatus(data)
+            }
+        },
+
+        /* 根据类型获取行业 */
+		getIndustry() {
+			customInterence.getindustry({
+				Classify:'ficc'
+			}).then(res => {
+				if(res.Ret === 200) {
+					this.tradeArr = res.Data.List || [];
+				}
+			})
+		},
+        /* 获取销售 */
+        async getSale() {
+            const res = await roadshowInterence.getSellerList();
+            if(res.Ret!==200) return 
+            this.salesArr = res.Data.List||[]
+            this.salesArr = this.salesArr.map(i=>{
+                if(!i.AdminName){
+                    i.AdminName = i.GroupName
+                }
+                if(!i.AdminId){
+                    i.AdminId = i.GroupId
+                }
+                return i
+            })
+		},
+        handleCurrentChange(page){
+            this.page = page
+            this.getBusinessList()
+        }
+    },
+}
+</script>
+<style lang="scss">
+.business-ETA-list{
+    .top-filter-box{
+        .el-cascader__search-input {
+            min-width: 30px;
+        }
+    } 
+}
+
+</style>
+<style lang="scss" scoped>
+.top-filter-box{
+    border: 1px solid #ECECEC;
+    padding: 20px 30px;
+    background: #fff;
+    border-radius: 4px;
+    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+}
+.table-wrap{
+    margin-top: 30px;
+    border: 1px solid #ECECEC;
+    padding: 20px 30px;
+    background: #fff;
+    border-radius: 4px;
+    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+    .select-wrap{
+        display: flex;
+        gap:20px;
+        align-items: center;
+        margin-bottom: 20px;
+        .el-select,.el-cascader{
+            width:240px;
+        }
+    }
+    .link{
+        color:#4099ef;
+        cursor: pointer;
+        &:hover{
+            text-decoration: underline;
+        }
+        
+    }
+}
+.table-opt-btns{
+    color:#4099ef;
+    display:flex;
+    align-content: center;
+    justify-content: center;
+    align-items: center;
+    span{
+        margin: 0 3px;
+        cursor: pointer;
+    }
+}
+
+
+</style>

+ 77 - 0
src/views/business_ETA_manage/components/AddRenewal.vue

@@ -0,0 +1,77 @@
+<template>
+    <div class="add-renewal-wrap">
+        <el-form 
+            :model="ruleForm" 
+            :rules="rules" 
+            ref="ruleForm" 
+            label-width="100px" 
+            class="demo-ruleForm"
+        >
+            <el-form-item label="签约时间" prop="signDate">
+                <el-date-picker
+                    v-model="ruleForm.signDate"
+                    type="date"
+                    placeholder="选择日期"
+                    value-format="yyyy-MM-dd"
+                />
+            </el-form-item>
+            <el-form-item label="到期时间" prop="expirationDate">
+                <el-date-picker
+                    v-model="ruleForm.expirationDate"
+                    type="date"
+                    placeholder="选择日期"
+                    value-format="yyyy-MM-dd"
+                />
+            </el-form-item>
+            <div style="text-align:center;margin:30px 0">
+                <el-button type="primary" plain @click="handleClose">取消</el-button>
+                <el-button type="primary" @click="handleSave">保存</el-button>
+            </div>
+        </el-form>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            rules:{
+                signDate:[{required: true, message: '请选择签署日期', trigger: 'change' },],
+                expirationDate:[{required: true, message: '请选择签署日期', trigger: 'change' },],
+            },
+            ruleForm:{
+                signDate:'',
+                expirationDate:''
+            }
+        }
+    },
+    methods: {
+        handleSave(){
+            this.$refs.ruleForm.validate((valid)=>{
+                if(valid){
+                    const flag=this.$moment(this.ruleForm.signDate).isBefore(this.ruleForm.expirationDate);
+                    if(!flag){
+                        this.$message.warning('到期时间不得早于签约时间')
+                        return
+                    }
+                    this.$emit('addRenewal',this.ruleForm)
+                    this.initForm()
+                }
+            })
+        },
+        initForm(){
+            this.ruleForm.signDate = ''
+            this.ruleForm.expirationDate = ''
+            this.$refs.ruleForm.resetFields();
+        },
+        handleClose(){
+            this.initForm()
+            this.$emit('close')
+        }
+    },
+}
+</script>
+
+<style>
+
+</style>

+ 95 - 0
src/views/business_ETA_manage/components/ModifySaller.vue

@@ -0,0 +1,95 @@
+<template>
+    <div class="modify-saller-wrap">
+        <el-form 
+            :model="ruleForm" 
+            :rules="rules" 
+            ref="ruleForm" 
+            label-width="100px" 
+            class="demo-ruleForm"
+        >
+            <el-form-item label="商家名称">
+                <span>{{data.BusinessName||''}}</span>
+            </el-form-item>
+            <el-form-item label="当前销售">
+                <span>{{data.SellerName||''}}</span>
+            </el-form-item>
+            <el-form-item label="移至销售" prop="saller">
+                <el-cascader
+                    ref="cascader"
+                    v-model="ruleForm.saller"
+                    :options="salesArr"
+                    :show-all-levels="false"
+                    :props="{
+                        expandTrigger: 'hover',
+                        children: 'Child',
+                        emitPath: false,
+                        label:'AdminName',
+                        value:'AdminId',
+                    }"
+                    collapse-tags
+                    filterable
+                    clearable
+                    placeholder="请选择销售"
+                />
+            </el-form-item>
+            <div style="text-align:center;margin:30px 0">
+                <el-button type="primary" plain @click="handleClose">取消</el-button>
+                <el-button type="primary" @click="handleSave">保存</el-button>
+            </div>
+        </el-form>
+    </div>
+</template>
+
+<script>
+export default {
+    props:{
+        salesArr:{ //销售数据
+            type:Array,
+            default:()=>{return []}
+        },
+        data:{ //正在编辑的数据
+            type:Object,
+            default:()=>{return {}}
+        }
+    },
+    data() {
+        return {
+            salesArr:[],
+            rules:{
+                saller:[{required: true, message: '请选择所属销售', trigger: 'change' },],
+            },
+            ruleForm:{
+                saller:''
+            }
+        }
+    },
+    created() {},
+    methods: {
+        handleSave(){
+            this.$refs.ruleForm.validate((valid)=>{
+                if(valid){
+                    const cascaderNodes = this.$refs.cascader.getCheckedNodes({leafOnly:true})
+                    this.$emit('modifySaller',{
+                        saller:Number(cascaderNodes[0]?cascaderNodes[0].value:0),
+                        sallerName:cascaderNodes[0]?cascaderNodes[0].label:''
+                    })
+                    this.initForm()
+
+                }
+            })
+        },
+        initForm(){
+            this.ruleForm.saller = ''
+            this.$refs.ruleForm.resetFields();
+        },
+        handleClose(){
+            this.initForm()
+            this.$emit('close')
+        },
+    },
+}
+</script>
+
+<style>
+
+</style>

+ 106 - 0
src/views/business_ETA_manage/components/Steps.vue

@@ -0,0 +1,106 @@
+<template>
+    <div class="step-wrap">
+        <div class="step-item" :class="{'active':activeStep===index+1}"
+            v-for="(step,index) in stepsArr" :key="index"
+            @click="changeActiveStep(index)">
+            <div class="step-line"></div>
+            <div class="step-icon" v-if="(activeStep<=index+1)||allowStepClick">{{index+1}}</div>
+            <div class="step-icon finished" v-else><i class="el-icon-check"></i></div>
+            <div class="step-text">{{step.text}}</div>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    props:{
+        allowStepClick:{ //是否允许点击切换步骤
+            type:Boolean,
+            default:true
+        },
+        activeStep:{ //激活的步骤
+            type:Number,
+            default:0
+        },
+        stepsArr:{ //步骤数组
+            type:Array,
+            default:()=>{
+                return [
+                    {
+                        text:'基础信息'
+                    },{
+                        text:'签约信息'
+                    }
+                ]
+            }
+        }
+    },
+    data() {
+        return {
+
+        };
+    },
+    methods: {
+        changeActiveStep(index){
+            if(!this.allowStepClick) return 
+            this.$emit('changeActiveStep',index)
+        }
+    },
+};
+</script>
+
+<style scoped lang="scss">
+.step-wrap{
+    display: flex;
+    .step-item{
+        position: relative;
+        display: flex;
+        align-items: center;
+        gap:16px;
+        color:rgba(0, 0, 0, 0.4);
+        cursor: pointer;
+        .step-line{
+            flex: 1;
+            height:2px;
+            background-color: #DCDCDC;
+            min-width: 270px;
+        }
+        .step-icon{
+            width:24px;
+            height:24px;
+            border-radius: 50%;
+            border:2px solid rgba(0, 0, 0, 0.4);
+            text-align: center;
+            line-height: 24px;
+            font-size: 16px;
+            &.finished{
+                border-color: #3385FF;
+                i{
+                    color:#3385FF;
+                    font-weight: bold;
+                }
+            }
+        }
+        .step-text{
+            margin-right: 16px;
+        }
+        &:first-child{
+            .step-line{
+                display: none;
+            }
+        }
+
+        &.active{
+            color:#3385FF;
+            .step-icon{
+                background-color: #3385FF;
+                color:#fff;
+                border-color: transparent;
+            }
+            .step-line{
+                background-color: #3385FF;
+            }
+        }
+    }
+}
+</style>

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

+ 113 - 0
src/views/custom_manage/compontents/permissionDetail.vue

@@ -0,0 +1,113 @@
+<template>
+  <div class="container-remindDlg">
+    <el-dialog title="权限详情" v-dialogDrag :visible.sync="isPermissionDetailShow" :close-on-click-modal="false" :modal-append-to-body="false" @close="cancelHandle" center width="800px">
+      <CpessionTableEquity v-if="tableData.length" fromType="detail" :authList="tableData" style="margin-bottom: 20px" />
+      <div style="margin: 20px 0" v-if="Points">
+        <span>研选服务点数</span>
+        <span>{{ Points }}</span>
+        <span class="editsty" @click="lookNumber">明细>></span>
+      </div>
+    </el-dialog>
+    <el-dialog title="研选服务点数明细" :visible.sync="isShowResearchNumber" width="80%" v-dialogDrag :close-on-click-modal="false" :modal-append-to-body="false" center @close="handleClose">
+      <el-table style="margin-bottom: 30px" :data="tableListResearch" border height="500">
+        <el-table-column align="center" prop="Content" label="事项"></el-table-column>
+        <el-table-column align="center" prop="CreateTime" label="时间"></el-table-column>
+        <el-table-column align="center" prop="RealName" label="参会人" width="150"></el-table-column>
+        <el-table-column align="center" prop="minNumber" label="小计" width="100">
+          <template slot-scope="{ row }">
+            <span :style="{ color: row.BillDetailed > 0 ? '#31c640' : '#ec808d' }"> {{ row.BillDetailed > 0 ? "+" + row.BillDetailed : row.BillDetailed }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="Points" label="合计" width="100"></el-table-column>
+      </el-table>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { customInterence, equityContacts, raiInterface } from "@/api/api.js";
+import CpessionTableEquity from "./CpessionTableEquity.vue";
+export default {
+  name: "",
+  components: { CpessionTableEquity },
+  props: {
+    isPermissionDetailShow: {
+      default: false,
+      type: Boolean,
+    },
+    researchDetailId: {
+      default: 0,
+      type: Number,
+    },
+  },
+  data() {
+    return {
+      tableData: [],
+      isShowResearchNumber: false, // 研选服务点数明细 弹框
+      tableListResearch: [], // 严选数据
+      Points: "",
+    };
+  },
+  computed: {},
+  watch: {
+    isPermissionDetailShow: {
+      handler(newVal) {
+        newVal && this.getDetailList();
+      },
+    },
+  },
+  created() {},
+  mounted() {},
+  methods: {
+    // 弹框关闭的事件
+    cancelHandle() {
+      this.$emit("update:researchDetailId", 0);
+      this.$emit("update:isPermissionDetailShow", false);
+      this.tableData = [];
+    },
+    /* 获取客户详情 */
+    async getDetailList() {
+      this.tableData = [];
+      const res = await customInterence.customDetail({
+        CompanyId: this.researchDetailId,
+      });
+      if (res.Ret !== 200) return;
+      this.Points = res.Data.RaiItem.Points || "";
+      let auth = [];
+      res.Data.RaiItem.PermissionList.forEach((item) => {
+        let obj = {
+          checkAll: item.CheckList && item.CheckList.length === item.Items.length ? true : false,
+          isIndeterminate: item.CheckList && item.CheckList.length > 0 && item.CheckList.length < item.Items.length,
+          ...item,
+        };
+        auth.push(obj);
+      });
+      this.tableData = auth;
+    },
+    // 查看
+    lookNumber() {
+      this.isShowResearchNumber = true;
+      this.getDataList();
+    },
+    // 明细弹框关闭
+    handleClose() {
+      this.isShowResearchNumber = false;
+      this.tableListResearch = [];
+    },
+    // 获取表格数据
+    async getDataList() {
+      const res = await raiInterface.activityPointsBill({
+        CompanyId: this.researchDetailId,
+      });
+      if (res.Ret === 200) {
+        this.tableListResearch = res.Data.List || [];
+      }
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.container-remindDlg {
+  display: block;
+}
+</style>

+ 113 - 0
src/views/custom_manage/contacts/compontents/contactsColums.js

@@ -218,6 +218,38 @@ export const tableColums = (type) => {
           widthsty: 300,
         },
       ]
+    : type === 10
+    ? [
+        {
+          label: "标签名称",
+          key: "TagName",
+        },
+        {
+          label: "报告系列",
+          key: "ArticleTypes",
+          // widthsty: 200,
+        },
+        {
+          label: "活动类型",
+          key: "ActivityTypes",
+          // widthsty: 300,
+        },
+        {
+          label: "相关产业",
+          key: "Industries",
+          // widthsty: 300,
+        },
+        {
+          label: "相关标的",
+          key: "SubjectNames",
+          // widthsty: 300,
+        },
+        {
+          label: "点击时间",
+          key: "CreateTime",
+          // widthsty: 300,
+        },
+    ]      
     : [];
 };
 
@@ -618,6 +650,44 @@ export const organizationTableColums = (type) => {
           key: "CreateTime",
         },
       ]
+    : type === 10
+    ? [
+        {
+          label: "姓名",
+          key: "RealName",
+          // widthsty: 130,
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+        },
+        {
+          label: "标签名称",
+          key: "TagName",
+          // widthsty: 500,
+        },
+        {
+          label: "报告系列",
+          key: "ArticleTypes",
+        },
+        {
+          label: "活动类型",
+          key: "ActivityTypes",
+        },        
+        {
+          label: "相关产业",
+          key: "SubjectNames",
+          // widthsty: 500,
+        },
+        {
+          label: "相关标的",
+          key: "SubjectNames",
+        },
+        {
+          label: "点击时间",
+          key: "CreateTime",
+        },
+      ]
     : [];
 };
 
@@ -986,5 +1056,48 @@ export const wholeOrganizationTableColums = (type) => {
           key: "CreateTime",
         },
       ]
+    : type === 10
+    ? [
+        {
+          label: "公司名",
+          key: "CompanyName",
+          // widthsty: 200,
+        },
+        {
+          label: "姓名",
+          key: "RealName",
+          // widthsty: 100,
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+          // widthsty: 100,
+        },
+        {
+          label: "标签名称",
+          key: "TagName",
+        },
+        {
+          label: "报告系列",
+          key: "ArticleTypes",
+          // widthsty: 500,
+        },
+        {
+          label: "活动类型",
+          key: "ActivityTypes",
+        },
+        {
+          label: "相关产业",
+          key: "SubjectNames",
+        },
+        {
+          label: "相关标的",
+          key: "SubjectNames",
+        },
+        {
+          label: "点击时间",
+          key: "CreateTime",
+        },
+      ]
     : [];
 };

+ 82 - 0
src/views/custom_manage/contacts/compontents/remindDlg.vue

@@ -0,0 +1,82 @@
+<template>
+  <div class="container-remindDlg">
+    <el-dialog
+      :title="remindList.IsRemind ? '取消提醒' : '互动提醒'"
+      v-dialogDrag
+      :visible.sync="isShowRemindDlg"
+      :close-on-click-modal="false"
+      :modal-append-to-body="false"
+      @close="cancelHandle"
+      center
+      width="500px"
+    >
+      <div>
+        <p v-if="remindList.IsRemind">请选择取消范围</p>
+        <p v-else>设置提醒后,联系人的互动行为都将通过【查研观向小助手】提醒你,请选择设置范围</p>
+        <div style="margin-top: 20px">
+          <el-radio-group v-model="remindRadio">
+            <el-radio :label="1" style="display: block">{{ remindList.IsRemind ? "单独取消此联系人的提醒" : "对此联系人单独设置" }}</el-radio>
+            <el-radio :label="2" style="margin: 20px 0">{{ remindList.IsRemind ? "对该机构下的联系人批量取消" : "对该机构下的联系人批量设置" }}</el-radio>
+          </el-radio-group>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="cancelHandle">取 消</el-button>
+        <el-button type="primary" @click="remindBtnHandler">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { customInterence, equityContacts } from "@/api/api.js";
+export default {
+  name: "",
+  components: {},
+  props: {
+    isShowRemindDlg: {
+      default: false,
+      type: Boolean,
+    },
+    remindList: {
+      default: {},
+      type: Object,
+    },
+  },
+  data() {
+    return {
+      remindRadio: 1,
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {},
+  methods: {
+    // 弹框关闭的事件
+    cancelHandle() {
+      this.remindRadio = 1;
+      this.$parent.isShowRemindDlg = false;
+      this.$emit("update:remindList", {});
+    },
+    // 确认事件
+    async remindBtnHandler() {
+      const res = await equityContacts.postUserRemind({
+        UserId: this.remindList.UserId,
+        SourceType: this.remindRadio,
+        DoType: this.remindList.IsRemind ? 2 : 1,
+      });
+      if (res.Ret === 200) {
+        this.cancelHandle();
+        this.$parent.getCygxContactsList();
+        this.$message.success("操作成功!");
+      }
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.container-remindDlg {
+  display: block;
+}
+</style>

+ 12 - 58
src/views/custom_manage/contacts/contactsList.vue

@@ -1,13 +1,7 @@
 <template>
   <div class="container-contactsList">
     <div class="top-wrap">
-      <el-input
-        style="width: 200px; margin-right: 20px"
-        v-model="contactWay"
-        placeholder="手机号/邮箱/姓名/公司名"
-        prefix-icon="el-icon-search"
-        clearable
-      ></el-input>
+      <el-input style="width: 200px; margin-right: 20px" v-model="contactWay" placeholder="手机号/邮箱/姓名/公司名" prefix-icon="el-icon-search" clearable></el-input>
       <el-select v-model="decisionValue" placeholder="是否决策人" @change="handelGetData" clearable>
         <el-option v-for="item in decisionOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option>
       </el-select>
@@ -111,13 +105,7 @@
               >
                 {{ item }}
               </el-tag>
-              <span
-                @click="showLabelDlg(row)"
-                style="font-weight: 700; padding: 5px 10px"
-                class="editsty"
-                v-if="row.Labels && row.Labels.split(',').length > 10"
-                >...</span
-              >
+              <span @click="showLabelDlg(row)" style="font-weight: 700; padding: 5px 10px" class="editsty" v-if="row.Labels && row.Labels.split(',').length > 10">...</span>
             </div>
           </template>
         </el-table-column>
@@ -142,21 +130,9 @@
         <m-page :total="total" :page_no="page_no" :pageSize="10" @handleCurrentChange="handleCurrentChange" />
       </el-col>
     </el-card>
-    <el-dialog
-      v-dialogDrag
-      :visible.sync="remarkDlgShow"
-      :close-on-click-modal="false"
-      :modal-append-to-body="false"
-      @close="cancelHandle"
-      center
-      :width="addRemarFrom.IsShowSee ? '800px' : '500px'"
-    >
+    <el-dialog v-dialogDrag :visible.sync="remarkDlgShow" :close-on-click-modal="false" :modal-append-to-body="false" @close="cancelHandle" center :width="addRemarFrom.IsShowSee ? '800px' : '500px'">
       <div slot="title">
-        <i
-          class="el-icon-close"
-          style="fontsize: 24px; cursor: pointer; position: absolute; right: 20px; top: 50%; transform: translateY(-50%)"
-          @click="cancelHandle"
-        ></i>
+        <i class="el-icon-close" style="fontsize: 24px; cursor: pointer; position: absolute; right: 20px; top: 50%; transform: translateY(-50%)" @click="cancelHandle"></i>
         <span style="fontsize: 16px">{{ addRemarFrom.IsShowSee ? "历史备注" : "添加备注" }}</span>
       </div>
       <div v-if="addRemarFrom.IsShowSee">
@@ -177,6 +153,7 @@
     </el-dialog>
     <InteractionDlg :interactionDlg.sync="interactionDlg" :interactionFrom="interactionFrom" />
     <label-dlg :isShowLabelDlg.sync="isShowLabelDlg" :dlgLabelList.sync="dlgLabelList" @labelChildren="labelChildren" :userLabel="userLabel" />
+    <remind-dlg :isShowRemindDlg.sync="isShowRemindDlg" :remindList.sync="remindList" />
   </div>
 </template>
 
@@ -186,9 +163,10 @@ import mPage from "@/components/mPage.vue";
 import mDialog from "@/components/mDialog.vue";
 import InteractionDlg from "./compontents/interactionDlg.vue";
 import LabelDlg from "./compontents/labelDlg.vue";
+import RemindDlg from "./compontents/remindDlg.vue";
 export default {
   name: "",
-  components: { mPage, mDialog, InteractionDlg, LabelDlg },
+  components: { mPage, mDialog, InteractionDlg, LabelDlg, RemindDlg },
   props: {},
   data() {
     return {
@@ -242,6 +220,8 @@ export default {
       organizationTableL: [], //互助量机构的
       isShowLabelDlg: false, //
       dlgLabelList: {}, //
+      isShowRemindDlg: false, // 消息提醒的弹框
+      remindList: {}, // 消息提醒的数据
     };
   },
   computed: {},
@@ -260,9 +240,7 @@ export default {
   created() {},
   mounted() {
     if (sessionStorage.getItem("contactsListBack")) {
-      const { keyword, decisionValue, registerValue, sales, clientStatus, userLabel, isFollowValue } = JSON.parse(
-        sessionStorage.getItem("contactsListBack")
-      );
+      const { keyword, decisionValue, registerValue, sales, clientStatus, userLabel, isFollowValue } = JSON.parse(sessionStorage.getItem("contactsListBack"));
       this.contactWay = keyword;
       this.decisionValue = decisionValue;
       this.registerValue = registerValue;
@@ -440,32 +418,8 @@ export default {
     },
     //点击操作的互助提醒
     async remindHandler(item) {
-      if (item.IsRemind) {
-        const result = await equityContacts.postUserRemind({
-          UserId: item.UserId,
-        });
-        this.$message.success("已取消互动提醒");
-        this.getCygxContactsList();
-      } else {
-        this.$confirm("该联系人的互动行为都将通过【查研观向小助手】提醒你,确定设置吗?", "提示", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning",
-        })
-          .then(async () => {
-            const result = await equityContacts.postUserRemind({
-              UserId: item.UserId,
-            });
-            this.$message.success("互动提醒成功");
-            this.getCygxContactsList();
-          })
-          .catch(() => {
-            this.$message({
-              type: "info",
-              message: "已取消",
-            });
-          });
-      }
+      this.remindList = item;
+      this.isShowRemindDlg = true;
     },
     sortChangeHandle(item) {
       console.log(item.order);

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

+ 29 - 1
src/views/custom_manage/customList/components/shareListDialog.vue

@@ -25,6 +25,7 @@
                 <el-table 
                     border 
                     :data="recordList"
+                    :row-class-name="tableRowClassName"
                     v-loading="tableLoading">
                     <el-table-column v-for="column in tableColumns" :key="column.key"
                         :prop="column.key"
@@ -37,8 +38,12 @@
                         v-if="allowEdit"
                         label="操作"
                         align="center"
+                        width="160"
                     >
-                    <template slot-scope="{row}">
+                    <template slot-scope="{row,$index}">
+                        <el-button type="text" size="small" style="color:#409eff;"
+                            @click="markRecord(row,$index)"
+                        >{{row.Mark?'取消标记':'标记'}}</el-button>
                         <el-button type="text" size="small" style="color:red;"
                             @click="deleteRecord(row)"
                         >删除</el-button>
@@ -114,6 +119,12 @@ export default {
                 this.tableLoading = false
             })
         },
+        tableRowClassName({row}){
+            if(row.Mark){
+                return 'mark-row'
+            }
+            return ''
+        },
         addNewRecord(){
             if(!this.recordContent.length){
                 this.$message.warning('请输入服务描述')
@@ -146,6 +157,17 @@ export default {
                 })
             })
         },
+        markRecord(data,index){
+            customInterence.markRecord({
+                CompanyServiceRecordId:data.CompanyServiceRecordId,
+                Status:data.Mark?0:1
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.$message.success(`${data.Mark?'取消标记':'标记'}成功`)
+                this.getRecordList()
+            })
+
+        },
         closeDia(){
             this.$emit('close')
         }
@@ -174,6 +196,12 @@ export default {
                 .el-table__empty-block{
                     border-bottom: 1px solid #EBEEF5;
                 }
+                .mark-row{
+                    background: #FEF0F0;
+                    &:hover>td{
+                        background-color: #FEF0F0 !important;
+                    }
+                }
             }
         }
     }

+ 147 - 0
src/views/custom_manage/customList/customCityList.vue

@@ -0,0 +1,147 @@
+<template>
+    <div class="custom-city-list-wrap">
+        <div class="select-box box-wrap">
+            <el-cascader v-model="searchCitys" 
+                :props="{multiple: true,value:'name',children:'city',label:'name'}" 
+                :options="locationOptions"
+                clearable collapse-tags 
+                placeholder="请选择客户地址"
+                @change="handleChangeLocation" >
+            </el-cascader>
+            <el-input placeholder="客户名称/原销售/分配销售" 
+                prefix-icon="el-icon-search" 
+                v-model="searchText" 
+                clearable
+                @input="getTableList"></el-input>
+        </div>
+        <div class="table-box box-wrap">
+            <el-table :data="tableData" border>
+                <el-table-column 
+                    v-for="item in tableColumns" :key="item.key"
+                    :label="item.label" align="center"
+                    >
+                    <template slot-scope="{row}">
+                        {{ row[item.key] }}
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination 
+                layout="prev,pager,next,total" 
+                background
+                :current-page="pageNo"
+                @current-change="currentChange"
+                :page-size="pageSize" 
+                :total="total"
+                >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+
+<script>
+import {locationOptions} from "./location"
+import { customInterence } from '@/api/api.js'
+export default {
+    data() {
+        this.locationOptions = locationOptions
+        return {
+            searchCitys:[],
+            provinceValue:'',
+            cityValue:'',
+            searchText:'',
+            tableColumns:[
+                {
+                    label:'客户名称',
+                    key:'CompanyName'
+                },{
+                    label:'类型',
+                    key:'CompanyType'
+                },{
+                    label:'所属行业',
+                    key:'IndustryName'
+                },{
+                    label:'客户地址',
+                    key:'City'
+                },{
+                    label:'原销售',
+                    key:'SellerName'
+                },{
+                    label:'分配销售',
+                    key:'ShareSeller'
+                },{
+                    label:'状态',
+                    key:'Status'
+                }
+            ],
+            tableData:[],
+            tableLoading:false,
+            pageNo:1,
+            pageSize:10,
+            total:0,
+        };
+    },
+    methods: {
+        handleChangeLocation(){
+            const provinceArr = []
+            const cityArr = []
+            this.searchCitys.forEach(item=>{
+                // 省
+                provinceArr.push(item[0])
+                // 市
+                cityArr.push(item[1])
+            })
+        //provinceArr需要去重
+            this.provinceValue = [...new Set(provinceArr)].join(',')
+            this.cityValue = cityArr.join(',')
+            this.page_no = 1;
+            this.getTableList();
+        },
+        getTableList(){
+            this.tableLoading=true
+            customInterence.getCustomCityList({
+                PageSize:this.pageSize,
+                CurrentIndex:this.pageNo,
+                Keyword:this.searchText,
+                Province:this.provinceValue,
+                City:this.cityValue
+            }).then(res=>{
+                if(res.Ret!==200) return
+                this.tableData = res.Data.List
+                this.total = res.Data.Paging.Totals
+            })
+            
+        },
+        currentChange(page){
+            this.pageNo=page
+            this.getTableList()
+        }
+    },
+    mounted(){
+        this.getTableList()
+    }
+};
+</script>
+
+<style scoped lang="scss">
+.custom-city-list-wrap{
+    .box-wrap{
+        padding:30px;
+        background-color: #fff;
+        border-radius: 4px;
+    }
+    .select-box{
+        display: flex;
+        justify-content: space-between;
+        .el-input{
+            width:400px;
+        }
+    }
+    .table-box{
+        margin-top: 30px;
+        .el-pagination{
+            margin-top: 30px;
+            text-align: right;
+        }
+    }
+}
+</style>

+ 29 - 14
src/views/custom_manage/customList/customDetail.vue

@@ -7,7 +7,13 @@
 					<ul class="detail_item" v-if="basicform">
 						<li style="width:40%">
 							<label class="label">客户名称</label>
-							<span class="con">{{basicform.CompanyName}}</span>
+							<span class="con">
+								<span style="margin-right: 10px;">{{basicform.CompanyName}} </span>
+								<el-tooltip content="此客户存在长期且反复申请试用,但从未签约的情况,请谨慎领取" placement="top" :open-delay="500" 
+								v-if="RaiSellerRole && basicform.IsScrounge==1" >
+									<img width="16" style="cursor: pointer;vertical-align: text-top;" src="../../../assets/img/icons/warning_triangle_yellow.png" />
+								</el-tooltip>
+							</span>
 						</li>
 
 						<li style="width:26%">
@@ -64,7 +70,7 @@
 								>客户编码</label>
 								<span class="con" style="word-break: break-word;">{{raiform.OpenCode}}</span>
 							</li>
-							<li  style="width:100%" v-if="!['试用','冻结','流失'].includes(raiform.Status) && raiform.Points">
+							<li  style="width:100%" v-if="raiform.Points">
 								<label class="label-num">研选服务点数</label>
 								<span class="con" style="word-break: break-word;">{{raiform.Points}}</span>
 								<span v-if="raiform.Points" @click="clickDlgNumberHandler('研选服务')" class="con" style="word-break: break-word;color:#409EFF;padding-left:10px;cursor: pointer;">明细>></span>
@@ -127,13 +133,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 +376,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 +444,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 +452,7 @@
 				</div>
 			</template>
 			<span v-else>暂无历史合同</span>
-		</el-dialog>
+		</el-dialog> -->
 		<!-- 导入的联系人表格 -->
 		<el-dialog
 		title="批量导入"
@@ -631,7 +634,14 @@
 		@close="productReadInfoShow=false"
 		></product-read-info>
 		<!-- 研选服务点数明细 弹框 -->
+
 		<DeductDetailDlg :isShowResearchNumber.sync="isShowResearchNumber" :isShowDlgType.sync="isShowDlgType" :dataForm="raiform"/>
+		<!-- 历史签约弹窗 新版 -->
+		<HistoryContract 
+			:isPreview="isPreview"
+			:dealList="dealList"
+			@close="isPreview=false"
+		/>
 	</div>	
 </template>
 
@@ -649,9 +659,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') || '';
@@ -661,6 +672,9 @@ export default {
 			let type = localStorage.getItem('RoleType') || '';
 			return type;
 		},
+		RaiSellerRole(){
+			return ['rai_seller','rai_admin','admin'].includes(this.Role)
+		},
 	},	
 	beforeRouteLeave(to, from, next)  {
 		from.matched[0].name='客户管理'
@@ -852,6 +866,7 @@ export default {
 		//点击预览历史签约中的合同附件
 		preViewConstractFile(e) {
 			console.log(e);
+			this.constractFileImgList=[]
 			if(e instanceof Array){
 				e.forEach(item=>{
 					if(item.type==='img'){

+ 79 - 15
src/views/custom_manage/customList/customList.vue

@@ -156,6 +156,10 @@
 							:class="{'isShared':scope.row.IsShared,'color-red':act_status==='正式'&&scope.row.Status.includes('正式')&&scope.row.WeekViewActive===0}"
 							>{{scope.row.CompanyName}}</span>
 							<img width="15" src="../../../assets/img/icons/remark.png" alt="" v-if="scope.row.RenewalReason||(scope.row.Status==='冻结'&&scope.row.FreezeReason)">
+							<el-tooltip content="此客户存在长期且反复申请试用,但从未签约的情况,请谨慎领取" placement="top" :open-delay="500" 
+							v-if="RaiSellerRole && scope.row.IsScrounge == 1">
+								<img width="16" style="cursor: pointer;" src="../../../assets/img/icons/warning_triangle_yellow.png" />
+							</el-tooltip>
 						</template>
 					</el-table-column>
 					<el-table-column label="To-Do" prop="todo" align="center" min-width="5.14%" sortable="custom">
@@ -641,7 +645,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 +679,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>
@@ -759,6 +770,9 @@ ShareListDialog},
 			let type = localStorage.getItem('RoleType') || '';
 			return type;
 		},
+		RaiSellerRole(){
+			return ['rai_seller','rai_admin','admin'].includes(this.Role)
+		},
 		SellerAdminId() {
 			let type = localStorage.getItem('AdminId') || '';
 			return type;
@@ -1544,9 +1558,25 @@ ShareListDialog},
 			}else if(query.type=='申请解冻'){
 				this.applyPick(query.data,'申请解冻')
 			}else if(query.type=='申请领取'){
-				this.applyPick(query.data,'申请领取')
+				if(this.RaiSellerRole && query.data.IsScrounge == 1){
+					this.$confirm('此客户存在长期且反复申请试用,但从未签约的情况,确定要领取吗?','申请领取',{
+						type:'warning'
+					}).then(() => {
+						this.applyPick(query.data,'申请领取')
+					}).catch(() => {});
+				}else{
+					this.applyPick(query.data,'申请领取')
+				}
 			}else if(query.type=='领取客户'){
-				this.pickHandle(query.data)
+				if(this.RaiSellerRole && query.data.IsScrounge == 1){
+					this.$confirm('此客户存在长期且反复申请试用,但从未签约的情况,确定要领取吗?','领取客户',{
+						type:'warning'
+					}).then(() => {
+						this.pickHandle(query.data)
+					}).catch(() => {})
+				}else{
+					this.pickHandle(query.data)
+				}
 			}else if(query.type=='备注'){
 				this.lookRemarkHandle(query.data)
 			}else if(query.type=='设置共享' || query.type=='取消共享'){
@@ -1628,6 +1658,16 @@ ShareListDialog},
 			let flag=await this.getCustomerDetail(item.CompanyId)
 			if(flag) return
 
+			if(this.RaiSellerRole && item.IsScrounge == 1){
+				// 已经弹过二次确认弹窗 避免再一次的弹窗
+				this.isPickLoss = true;
+				this.regionType = item.RegionType;
+				this.addCompanyId = item.CompanyId;
+				this.diaform.telCode='86'
+				this.isAddContact = true;
+				return 
+			}
+
 			this.$confirm('是否确认领取该客户?','提示',{
 				type:'warning'
 			}).then(() => {
@@ -2080,6 +2120,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 +2542,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 +2595,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>

+ 427 - 47
src/views/custom_manage/customList/customShareList.vue

@@ -12,6 +12,9 @@
             <el-option :label="item.RealName" :value="item.AdminId" v-for="item in salesArr" :key="item.AdminId" ></el-option>
           </el-select>
         </div>
+        <div v-else>
+            <el-button type="primary" @click="$router.push('/customCityList')">查看同城客户</el-button>
+        </div>
         <el-input 
           placeholder="客户名称/社会信用码/手机号码/邮箱"
           v-model="search_txt"
@@ -92,7 +95,7 @@
 					</el-table-column>
 					<el-table-column
 					prop="SellerName"
-					label="销售"
+					label="销售"
 					min-width="6.14%"
 					align="center">
 						<template slot-scope="scope"> 
@@ -272,21 +275,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 +334,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 +348,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 +366,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 +379,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 +437,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 +468,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 +485,7 @@ export default {
 			lookAuthList:[],//查看的权限
 			lookAuthListEquity:[],//权益
 			assignedSellerShow:false,//分配销售弹窗
-      assignedSellerTitle:'分配销售',
+			assignedSellerTitle:'分配销售',
 			assignform:{
 				CompanyId:'',
 				CompanyName:'',
@@ -430,11 +500,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 +535,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 +562,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 +598,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 +614,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 +631,7 @@ export default {
 		closeDia() {
 			this.lookTitle = '';
 			this.lookAuthList = [];
-      this.lookAuthListEquity = []
+			this.lookAuthListEquity = []
 			this.isLook = false;
 		},
 		/* 分配销售 */
@@ -562,26 +664,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;

+ 103 - 8
src/views/custom_manage/customSearch.vue

@@ -29,6 +29,10 @@
 							{{scope.row.CompanyName}}
 						</span>
 						<span v-else :class="scope.row.BtnItem.BtnView?'customName':''" :style="{color:scope.row.BtnItem.BtnView?'#409EFF':'#606266',cursor:scope.row.BtnItem.BtnView?'pointer':'text'}" @click="goDetail(scope.row)">{{scope.row.CompanyName}}</span>
+						<el-tooltip content="此客户存在长期且反复申请试用,但从未签约的情况,请谨慎领取" placement="top" :open-delay="500" 
+						v-if="RaiSellerRole && scope.row.IsScrounge == 1">
+							<img width="16" style="cursor: pointer;" src="../../assets/img/icons/warning_triangle_yellow.png" />
+						</el-tooltip>
 					</template>
 				</el-table-column>
 				<el-table-column
@@ -415,7 +419,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,11 +453,19 @@
 				<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>
 		</el-dialog>
 		<!-- 查看备注弹窗 -->
+		<!-- 权限详情弹框 -->
+		<permission-detail :isPermissionDetailShow.sync="isPermissionDetailShow" :researchDetailId.sync="researchDetailId"/>
 	</div>
 </template>
 
@@ -464,10 +477,18 @@ import Cauthlist from './compontents/CauthList.vue'
 import CompleteInfo from './compontents/CompleteInfo.vue'
 import ContractInfo from './compontents/ContractInfo.vue'
 import mPage from '@/components/mPage.vue'
+import PermissionDetail from './compontents/permissionDetail.vue'
 export default {
 	name:'',
-	components: {Capplydia,Contactdia,Cauthlist,CompleteInfo,ContractInfo,mPage},
+	components: {Capplydia,Contactdia,Cauthlist,CompleteInfo,ContractInfo,mPage, PermissionDetail},
 	computed:{
+		Role() {
+			let role = localStorage.getItem('Role') || '';
+			return role;
+		},
+		RaiSellerRole(){
+			return ['rai_seller','rai_admin','admin'].includes(this.Role)
+		},
 		RoleType() {
 			let type = localStorage.getItem('RoleType') || '';
 			return type;
@@ -621,13 +642,16 @@ export default {
 				BtnTurnPositive: '申请转正',
 				BtnUpdate: '续约申请',
 				BtnView: '查看权限',
-				BtnRemarkView: '备注'
+				BtnRemarkView: '备注',
+				IsResearchShow:'研选详情'
 			},	// 按钮命令列表
 			lookRemarkTitle:'',//查看备注标题
 			lookRemarkList:[],//查看备注列表
 			lookRemarkTextarea:'',//备注的文本框
 			isRemarkLook:false ,////查看备注弹窗
 			lookRemarkItem:{},////查看备注的item项
+			isPermissionDetailShow:false ,// 权限详情 弹框
+			researchDetailId:0,
 		};
 	},
 	/* 页面跳转前记录参数 */
@@ -731,7 +755,7 @@ export default {
 			}).then(res => {
 				if(res.Ret === 200) {
 					this.tableData = res.Data?res.Data.List:[];
-					this.pageinfo.total=res.Data.Paging.Totals
+					this.pageinfo.total=res.Data && res.Data.Paging ? res.Data.Paging.Totals : 0
 					this.tableData.forEach(item => {
 						item.ApproveStatus = item.ApproveStatus=='待审批'?'待审批':''
 					})
@@ -771,8 +795,18 @@ export default {
 		itemclickHandle(query) {
 			if(query.type == '申请转正') {
 				this.applyTurn(query.data)
-			}else if(query.type == '申请延期' || query.type == '申请解冻' || query.type == '申请领取') {
+			}else if(query.type == '申请延期' || query.type == '申请解冻') {
 				this.applyHandle(query.type,query.data)
+			}else if(query.type == '申请领取') {
+				if(this.RaiSellerRole && query.data.IsScrounge == 1){
+					this.$confirm('此客户存在长期且反复申请试用,但从未签约的情况,确定要领取吗?','申请领取',{
+						type:'warning'
+					}).then(() => {
+						this.applyHandle('申请领取',query.data)
+					}).catch(() => {});
+				}else{
+					this.applyHandle('申请领取',query.data)
+				}
 			}else if(query.type == '修改销售') {
 				this.updateSale(query.data);
 			}else if(query.type == '启用' || query.type == '暂停') {
@@ -795,9 +829,19 @@ export default {
 				this.addAgreement(query.data)
 				this.addAgreement(query.data)
 			}else if(query.type=='领取客户'){
-				this.receiveHandle(query.data)
+				if(this.RaiSellerRole && query.data.IsScrounge == 1){
+					this.$confirm('此客户存在长期且反复申请试用,但从未签约的情况,确定要领取吗?','领取客户',{
+						type:'warning'
+					}).then(() => {
+						this.receiveHandle(query.data)
+					}).catch(() => {})
+				}else{
+					this.receiveHandle(query.data)
+				}
 			}else if(query.type=='备注'){
 				this.lookRemarkHandle(query.data)
+			}else if(query.type=='研选详情'){
+				this.researchDetailHandle(query.data)
 			}
 		},
 		/* 查看权限 */
@@ -1061,6 +1105,16 @@ export default {
 			let flag=await this.getCustomerDetail(item.CompanyId,0)
 			if(flag) return
 
+			if(this.RaiSellerRole && item.IsScrounge == 1){
+				// 已经弹过二次确认弹窗 避免再一次的弹窗
+				this.isPickLoss = true;
+				this.regionType = item.RegionType;
+				this.addCompanyId = item.CompanyId;
+				this.diaform.telCode='86'
+				this.isAddContact = true;
+				return 
+			}
+			
 			this.$confirm('是否确认领取该客户?','提示',{
 				type:'warning'
 			}).then(() => {
@@ -1069,8 +1123,8 @@ export default {
 					this.isPickLoss = true;
 					this.addCompanyId = item.CompanyId;
 					this.regionType=item.RegionType
+					this.diaform.telCode='86'
 					this.isAddContact = true;
-
 				// }else {
 				// 	customInterence.Pick({
 				// 		CompanyId:item.CompanyId,
@@ -1556,7 +1610,33 @@ export default {
 				}
 				})
 			}
-		}
+		},
+	researchDetailHandle(item) {
+		this.isPermissionDetailShow = true
+		this.researchDetailId = item.CompanyId
+	},
+	//删除备注
+	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 +1732,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)

+ 135 - 35
src/views/ficc_manage/userApplication.vue

@@ -2,26 +2,40 @@
   <div class="container-userapplication">
     <div class="userapplication-top">
       <div class="top-tabs">
-        <span v-for="item in Tabs" :key="item.name" @click="handleTabsClick(item)" :class="activeName == item.type ? 'active' : ''">
+        <!-- <span v-for="item in Tabs" :key="item.name" @click="handleTabsClick(item)" :class="activeName == item.type ? 'active' : ''">
           {{ item.name }}
-        </span>
+        </span> -->
+        <el-radio-group v-model="activeItem" @input="handleTabsClick(activeItem)">
+            <el-radio-button :label="item" v-for="item in Tabs" :key="item.name">{{item.name}}</el-radio-button>
+        </el-radio-group>
       </div>
-      <div class="export-select">
-        <a style="width:80px; margin-right: 20px" :href="exportUrl" download v-if="Tabs.length>1">
+    </div>
+    <el-card style="margin-top: 20px">
+        <div class="export-select">
+        <!-- <a style="width:80px; margin-right: 20px" :href="exportUrl" download v-if="Tabs.length>1">
           <el-button type="primary" style="width: 100%"  >导出</el-button>
-        </a>
-        <el-select v-if="activeName == 1" v-model="custom_apply_type" placeholder="请选择申请类型" style="width: 300px; margin-right: 20px" clearable>
+        </a> -->
+        <date-picker 
+            v-model="date_range" 
+            type="date" 
+            range
+            value-type="format"
+            :placeholder="`请选择${activeName===1?'提交':activeName===2?'申请':'发送'}时间`"
+            @change="changeQuery">
+        </date-picker>
+        <el-select v-if="activeName == 1" v-model="custom_apply_type" placeholder="请选择申请类型" style="width: 160px;" clearable @change="changeQuery">
           <el-option v-for="item in applyArr" :key="item.name" :label="item.name" :value="item.name"> </el-option>
         </el-select>
-        <el-select v-if="activeName == 1" v-model="custom_type" placeholder="请选择状态" style="width: 300px; margin-right: 20px" clearable multiple>
+        <el-select v-if="activeName == 1" v-model="custom_type" placeholder="请选择用户状态" style="width: 200px;" clearable multiple @change="changeQuery">
           <el-option v-for="item in statusArr" :key="item.name" :label="item.name" :value="item.name"> </el-option>
         </el-select>
-        <el-input placeholder="姓名/手机号/邮箱/公司名称" v-model="search_txt" clearable style="max-width: 500px">
+        <el-select v-model="group_type" placeholder="请选择分组" style="width: 160px;" clearable @change="changeQuery">
+          <el-option v-for="item in groupArr" :key="item.name" :label="item.name" :value="item.name"> </el-option>
+        </el-select>
+        <el-input placeholder="姓名/手机号/邮箱/公司名称" v-model="search_txt" clearable style="max-width: 240px" @input="changeQuery">
           <i slot="prefix" class="el-input__icon el-icon-search"></i>
         </el-input>
       </div>
-    </div>
-    <el-card style="margin-top: 20px">
       <el-table :data="tableData" v-loading="tableLoading" element-loading-text="数据加载中..." border>
         <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 }">
@@ -47,16 +61,23 @@
             <span v-else>{{ row[item.key] }}</span> -->
           </template>
         </el-table-column>
+        <el-table-column label="分组" align="center">
+            <template slot-scope="{ row }">
+                <span>{{row.MarkGroup}}</span>
+            </template>
+        </el-table-column>
         <el-table-column label="操作" align="center">
           <template slot-scope="{ row }">
             <div v-if="activeName == 1">
-              <span class="editsty" v-if="row.OpStatus === 0 && row.IsMove === 0&&!(row.Status==='潜在用户'||row.Status==='流失')" @click="dealHandle(row)">标记处理</span>
-              <span class="editsty" v-if="row.IsMove === 0" @click="moveHandle(row)">移动</span>
+             <!--  <span class="editsty" v-if="row.OpStatus === 0 && row.IsMove === 0&&!(row.Status==='潜在用户'||row.Status==='流失')" @click="dealHandle(row)">标记处理</span> -->
+              <span class="editsty" v-if="row.OpStatus === 0 && row.IsMove === 0" @click="handleChooseGroup(row)">标记</span>
             </div>
             <div v-else>
-              <span class="editsty" v-if="row.Status==='待处理'" @click="dealHandle(row)">标记处理</span>
+              <!-- <span class="editsty" v-if="row.Status==='待处理'" @click="dealHandle(row)">标记处理</span> -->
+              <span class="editsty" v-if="row.Status==='待处理'" @click="handleChooseGroup(row)">标记</span>
             </div>
-            <span class="editsty" style="color:#ff0000" v-if="row.DelBtn" @click="delHandle(row)">删除</span>
+            <span class="editsty" v-if="activeName == 1&&row.IsMove === 0" @click="moveHandle(row)">移动</span>
+            <!-- <span class="editsty" style="color:#ff0000" v-if="row.DelBtn" @click="delHandle(row)">删除</span> -->
           </template>
         </el-table-column>
         <div slot="empty" style="padding: 20px 0">
@@ -74,6 +95,27 @@
     <intervewDia :isShowDia.sync="isShowDia" :item="dealObj" v-if="isShowDia" :activeName="activeName"/>
     <!-- 移动弹窗 -->
     <moveCustomDia :isShow.sync="isShowMoveDia" :item="dealObj" v-if="isShowMoveDia" />
+    <!-- 标记分组弹窗 -->
+    <el-dialog
+        v-dialogDrag 
+        :visible.sync="isChooseGroupDialogShow"
+        :close-on-click-modal="false"
+        :modal-append-to-body="false"
+        title="标记" width="480px" center
+        @close="isChooseGroupDialogShow=false">
+        <div class="dialog-container">
+            <div class="select" style="display:flex;align-items: center;">
+                <span>分组:</span>
+                <el-select v-model="choosed_group" placeholder="请选择分组" style="flex:1;margin-left: 10px;">
+                    <el-option v-for="item in groupArr" :key="item.name" :label="item.name" :value="item.name"> </el-option>
+                </el-select>
+            </div>
+        </div>
+        <div style="display:flex;justify-content:center;margin:20px 0;">
+            <el-button type="primary" style="width:80px;marginRight:24px;" @click="chooseGroup">保存</el-button>
+            <el-button type="primary" plain style="width:80px;" @click="isChooseGroupDialogShow=false">取消</el-button>
+        </div>
+	</el-dialog>
   </div>
 </template>
 
@@ -94,6 +136,7 @@ export default {
       tableData: [],
       tableColums: [],
       activeName: 1,
+      activeItem: { name: "弘则研报", type: 1 },
       total: 0,
       page_no: 1,
       pageSize: 10,
@@ -109,8 +152,18 @@ export default {
         { name: "冻结", value: 4 },
         {name:'试用暂停',value:5}
       ],
+      groupArr:[
+        {name:"楼颖丹组",value:"楼颖丹组"},
+        {name:"时代组",value:"时代组"},
+        {name:"岳梦琳组",value:"岳梦琳组"},
+        {name:"权益组",value:"权益组"}
+        ],
+      choosed_group:'',
+      choosed_row:null,
       custom_type:[],
       custom_apply_type:'',//申请类型
+      date_range:[],
+      group_type:'',
       applyArr:[
         {name:'已申请',value:'已申请'},
         {name:'未申请',value:'未申请'},
@@ -122,6 +175,7 @@ export default {
       dealObj: {},
       isShowDia: false, //处理弹窗
       isShowMoveDia: false, //移动弹窗
+      isChooseGroupDialogShow:false
     };
   },
   computed: {
@@ -147,26 +201,17 @@ export default {
       return this.custom_type.join(',')
     },//筛选客户的类型,可多选
   },
-  watch: {
-    search_txt(newval) {
-			this.page_no = 1;
-			this.getTableData();
-		},
-		custom_type(newval) {
-			this.page_no = 1;
-			this.getTableData();
-		},
-    custom_apply_type(newval){
-      this.page_no = 1;
-			this.getTableData();
-    }
-  },
+  watch: {},
   created() {},
   mounted() {
     this.tableColums = tableColums(1);
     this.getTableData();
   },
   methods: {
+    changeQuery(){
+        this.page_no = 1
+        this.getTableData()
+    },
     /* 获取表格数据 */
     async getTableData() {
       this.tableLoading = true;
@@ -177,13 +222,19 @@ export default {
               CurrentIndex: this.page_no,
               KeyWord: this.search_txt,
               States: this.search_type,
-              ApplyStatus:this.custom_apply_type
+              ApplyStatus:this.custom_apply_type,
+              MarkGroup:this.group_type,
+              StartDate:this.date_range[0],
+              EndDate:this.date_range[1],
             })
           : await customInterence.trialList({
-              PageSize: 10,
+              PageSize: this.pageSize,
               CurrentIndex: this.page_no,
               SourceType: this.activeName == 2 ? "中文官网" : this.activeName == 3 ? "英文官网" : "",
               KeyWord: this.search_txt,
+              MarkGroup:this.group_type,
+              StartDate:this.date_range[0],
+              EndDate:this.date_range[1],
             });
 
       if (res.Ret === 200) {
@@ -198,6 +249,13 @@ export default {
         this.activeName = item.type;
         this.tableColums = tableColums(this.activeName);
       }
+      //重置筛选项
+      this.search_txt=''
+      this.custom_type=[]
+      this.custom_apply_type=[]
+      this.date_range=[]
+      this.group_type=''
+
       this.page_no = 1;
       this.getTableData();
     },
@@ -236,10 +294,10 @@ export default {
       this.isRead = true;
     },
     /* 关闭阅读报告弹窗 */
-		cancelRead() {
-			this.readTit = '阅读报告列表';
-			this.isRead = false;
-		},
+    cancelRead() {
+        this.readTit = '阅读报告列表';
+        this.isRead = false;
+    },
     // 移动
     moveHandle(item) {
       this.dealObj = item;
@@ -269,12 +327,45 @@ export default {
       }).catch(() => {
                   
       });
+    },
+    //打开标记分组弹窗
+    handleChooseGroup(row){
+        this.choosed_row = row
+        this.choosed_group=''
+        this.isChooseGroupDialogShow = true
+    },
+    //标记分组
+    async chooseGroup(){
+        if(!this.choosed_group){
+            this.$message.warning('请选择分组')
+            return 
+        }
+        const {ApplyRecordId,UserId,Id} = this.choosed_row
+        //请求接口
+        const res = this.activeName===1?await customInterence.markApplyUser({
+            ApplyRecordId,UserId,GroupName:this.choosed_group
+        }):await customInterence.markOfficialUser({Id,GroupName:this.choosed_group})
+
+        if(res.Ret!==200) return 
+        this.$message.success('标记分组成功')
+        this.isChooseGroupDialogShow = false
+        this.choosed_group=''
+        this.getTableData()
+        
     }
   },
 };
 </script>
-<style scoped lang="less">
+<style lang="scss">
+.container-userapplication{
+    .mx-datepicker{
+        width:200px !important;
+    }
+}
+</style>
+<style scoped lang="scss">
 .container-userapplication {
+    min-width: 1500px;
   .userapplication-top {
     display:flex;
     align-items:center;
@@ -305,10 +396,19 @@ export default {
       color: #409eff;
       border-radius: 4px;
       margin-right: 20px;
+      cursor: pointer;
     }
   }
   .export-select {
     display: flex;
+    flex: 1;
+    justify-content: flex-start;
+    align-items: flex-start;
+    gap: 10px;
+    margin-bottom: 20px;
+    .el-input{
+        margin-left: auto;
+    }
   }
 }
 </style>

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

+ 36 - 47
src/views/rai_manage/activityManage/applyManage.vue

@@ -4,13 +4,9 @@
     <div class="top-wrap" style="margin-bottom: 20px">
       <div class="top-card-box">
         <div class="tabs-box">
-          <span
-            v-for="(item, index) in listTitle"
-            :key="item.ChartPermissionId"
-            @click="tabsBoxBtn(item, index)"
-            :class="item.ChartPermissionId == tabsPitchonType ? 'pitch' : ''"
-            >{{ item.PermissionName }}</span
-          >
+          <span v-for="(item, index) in listTitle" :key="item.ChartPermissionId" @click="tabsBoxBtn(item, index)" :class="item.ChartPermissionId == tabsPitchonType ? 'pitch' : ''">{{
+            item.PermissionName
+          }}</span>
         </div>
         <div>
           <el-input v-model="titleValue" style="width: 521px" placeholder="请输入活动名称" clearable>
@@ -30,39 +26,22 @@
           </template>
           <!-- 公司调研下的单独按钮 -->
           <template v-if="tabsPitchonType === 3">
-            <el-tooltip class="item" effect="dark" content="不限人数的公司调研电话会请点此" placement="bottom">
+            <!-- <el-tooltip class="item" effect="dark" content="不限人数的公司调研电话会请点此" placement="bottom">
               <el-button type="primary" v-if="tabsSelectionOne" @click="addOutbound('新增外呼人员')">新增外呼人员</el-button>
-            </el-tooltip>
+            </el-tooltip> -->
             <el-tooltip class="item" effect="dark" content="公司线下调研、限制人数的公司调研电话会请点此" placement="bottom">
               <el-button v-if="tabsPitchonType !== 1" type="primary" @click="addapply">新增报名</el-button>
             </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">
-            <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
-            @focus="activityType"
-            v-model="cactivityTypeVal"
-            @change="conditionChange"
-            style="margin-bottom: 20px"
-          >
-            <el-option
-              v-for="item in cactivityTypeList"
-              :label="item.ActivityTypeName"
-              :key="item.ActivityTypeId"
-              :value="item.ActivityTypeId"
-            ></el-option>
+          <el-select placeholder="活动类型" clearable @focus="activityType" v-model="cactivityTypeVal" @change="conditionChange" style="margin-bottom: 20px">
+            <el-option v-for="item in cactivityTypeList" :label="item.ActivityTypeName" :key="item.ActivityTypeId" :value="item.ActivityTypeId"></el-option>
           </el-select>
           <date-picker v-model="issueTime" type="date" range placeholder="活动时间" value-type="format" @change="conditionChange"> </date-picker>
           <el-select placeholder="活动状态" clearable v-model="cactivityStatus" @change="conditionChange" style="margin-bottom: 20px">
@@ -76,14 +55,7 @@
       <!-- 表格部分 -->
       <el-table @selection-change="selectChange" :data="dataList" style="width: 100%; margin-top: 15px" border ref="multipleTable">
         <el-table-column type="selection" align="center" key="ActivityId"></el-table-column>
-        <el-table-column
-          v-for="item in tableApplyColums"
-          :key="item.label"
-          :label="item.label"
-          :width="item.widthsty"
-          :min-width="item.minwidthsty"
-          align="center"
-        >
+        <el-table-column v-for="item in tableApplyColums" :key="item.label" :label="item.label" :width="item.widthsty" :min-width="item.minwidthsty" align="center">
           <template #header>
             <span>{{ item.label }}</span>
             <el-tooltip
@@ -96,9 +68,7 @@
           </template>
           <template slot-scope="{ row }">
             <div v-if="item.key == 'ReminderPeopleNum'">
-              <span v-if="row.ReminderPeopleNum > 0" class="editsty" @click="particularsBtn('会议提醒人数', row.ActivityId)">{{
-                row.ReminderPeopleNum
-              }}</span>
+              <span v-if="row.ReminderPeopleNum > 0" class="editsty" @click="particularsBtn('会议提醒人数', row.ActivityId)">{{ row.ReminderPeopleNum }}</span>
               <span v-else>--</span>
             </div>
             <div v-else-if="item.key == 'SignupFailPeopleNum'">
@@ -185,6 +155,7 @@ export default {
       cactivityStatus: 1,
       publishStatus: "1", //发布状态
       messageDialogVisible: false, //发送消息模版
+      isResearchPoints: false, //
     };
   },
   computed: {
@@ -225,6 +196,7 @@ export default {
       this.tabsPitchonType = item.ChartPermissionId;
       this.tableApplyColums = TableApplyColums(item.ChartPermissionId);
       this.cactivityTypeVal = "";
+      this.isResearchPoints = false;
       this.tabsSelectionOne = item.ChartPermissionId == 2 ? false : true;
       this.page_no = 1;
       this.getsDataList();
@@ -274,12 +246,14 @@ export default {
       const summation = [];
       const genre = [];
       let minimum = [];
+      let isResearch = [];
       this.selectionArr = selection;
       selection.forEach((item) => {
         arr.push(item.ActivityId);
         num.push(item.LimitPeopleNum);
         summation.push(item.SignupPeopleNum);
         genre.push(item.ActivityTypeName);
+        isResearch.push(item.IsResearchPoints);
         minimum.push(item.LimitPeopleNum - item.SignupPeopleNum);
       });
       this.activityTypeName = genre;
@@ -288,15 +262,31 @@ export default {
       this.reminder = num.some((item) => item > 0);
       this.selectList = str;
       this.isGenre = new Set(genre).size > 1 ? true : false;
-      console.log(this.isGenre, genre);
-      if (this.tabsPitchonType !== 1) {
+      if (this.tabsPitchonType !== 1 && (selection[0] ? selection[0].LimitPeopleNum > 0 : true)) {
         num.forEach((item) => {
           this.numberFull = summation.some((key) => key >= item);
         });
+      }
+      if (this.tabsPitchonType !== 1) {
+        console.log(isResearch, isResearch.length);
+        this.tabsPitchonType == 3 && this.isResearchHandler(isResearch);
         this.minimumSummation = Math.min(...minimum);
         this.numberLimi = num.includes(0) && num.some((item) => item > 0);
       }
     },
+    // 公司调研下的判断
+    isResearchHandler(isResearch) {
+      if (isResearch && isResearch.length > 1) {
+        for (let i = 0; i < isResearch.length - 1; i++) {
+          if (isResearch[i] !== isResearch[i + 1]) {
+            this.isResearchPoints = true;
+            break;
+          }
+        }
+      } else {
+        this.isResearchPoints = false;
+      }
+    },
     //报名详情的弹框
     particularsBtn(val, id) {
       this.dialogVisibleId = id;
@@ -353,15 +343,14 @@ export default {
     },
     //新增报名
     addapply() {
-      console.log(123);
       if (!this.selectList) {
         return this.$message.warning("请先选择活动");
       } else if (this.isGenre) {
         return this.$message.warning("活动类型不同,无法同时新增报名");
+      } else if (this.isResearchPoints && this.tabsPitchonType == 3) {
+        return this.$message.warning("所选活动无法同时新增报名");
       } else {
-        if (!this.reminder && this.tabsPitchonType !== 4) {
-          return this.$message.warning("请点击新增外呼人员!");
-        } else if (this.numberLimi && this.tabsPitchonType !== 4) {
+        if (this.numberLimi && this.tabsPitchonType !== 4) {
           return this.$message.warning("不限人数的电话会请新增外呼人员,限制人数的电话会请新增报名");
         } else if (this.numberFull && this.tabsPitchonType !== 4) {
           return this.$message.warning("新增失败,活动人数超限。");

+ 2 - 1
src/views/rai_manage/activityManage/components/addActivity.vue

@@ -75,7 +75,7 @@
         </div>
         <!-- 复选 模块 -->
         <div style="margin-top: 20px">
-          <research-deduct ref="researchSelect" :cactivityType="cactivityType" />
+          <research-deduct ref="researchSelect" :cactivityType="cactivityType" :optionFormregion="optionFormregion" />
         </div>
         <div style="margin: 20px 0 0 98px" class="add-delete" v-for="(item, index) in addSubjectLabel" :key="index">
           <template v-if="subjectRadio == 2">
@@ -613,6 +613,7 @@ export default {
         Body: this.content,
         PermissionName: this.optionFormregion,
         CustomerTypeIds: this.checkedCitiesTwo,
+        IsAllCustomerType:this.checkAll?1:0,
         LimitPeopleNum: Number(this.astrict) || 0,
         IndustrialManagementIdS: arr.length ? arr.join(",") : "",
         IndustrialSubjectIdS: this.markValue.length ? this.markValue.join(",") : "",

+ 62 - 41
src/views/rai_manage/activityManage/components/addComopnents/ResearchDeduct.vue

@@ -22,43 +22,50 @@
       </el-checkbox>
       <el-checkbox v-if="isYidongConduct && cactivityType == 2" v-model="isBClass"> B类非公开会议 </el-checkbox>
     </template>
-
-    <el-checkbox v-model="isDeduct" style="margin-right: 20px"> 研选扣点 </el-checkbox>
-    <el-select clearable @change="ObjectChangeHandler" v-model="PointsSet.PointsObject" placeholder="请选择扣点对象" v-if="isDeduct" style="width: 160px">
-      <el-option v-for="item in deductUser" :key="item.value" :label="item.label" :value="item.value"> </el-option>
-    </el-select>
-    <template v-if="isDeduct && PointsSet.PointsObject">
-      <el-select clearable v-model="PointsSet.CompanyPointsNum" placeholder="办会人扣点点数" v-if="PointsSet.PointsObject == 3" style="width: 160px">
-        <el-option v-for="item in dataPointsSet" :key="item.PointsNum" :label="item.PointsNum" :value="item.PointsNum"> </el-option>
-      </el-select>
-      <el-select clearable v-model="PointsSet.UserPointsNum" placeholder="请选择扣点点数" style="width: 160px" v-if="PointsSet.PointsObject == 1">
-        <el-option v-for="item in dataPointsSet" :key="item.PointsNum" :label="item.PointsNum" :value="item.PointsNum"> </el-option>
-      </el-select>
-      <el-select clearable v-model="PointsSet.CompanyPointsNum" placeholder="请选择扣点点数" style="width: 160px" v-if="PointsSet.PointsObject == 2">
-        <el-option v-for="item in dataPointsSet" :key="item.PointsNum" :label="item.PointsNum" :value="item.PointsNum"> </el-option>
-      </el-select>
-      <el-autocomplete
-        :fetch-suggestions="querySearchAsync"
-        clearable
-        v-model="institutionName"
-        placeholder=" 请输入办会机构名称"
-        v-if="PointsSet.PointsObject != 1"
-        style="width: 300px"
-        @select="companyChangeHandler"
-        @clear="companyClearHandler"
-      ></el-autocomplete>
-      <el-select clearable v-model="PointsSet.UserPointsNum" placeholder="参会人扣点点数" v-if="PointsSet.PointsObject == 3" style="width: 160px">
-        <el-option v-for="item in dataPointsSet" :key="item.PointsNum" :label="item.PointsNum" :value="item.PointsNum"> </el-option>
-      </el-select>
-      <el-select clearable v-model="PointsSet.PointsType" placeholder="请选择扣点形式" v-if="PointsSet.PointsObject != 2" style="width: 160px">
-        <el-option v-for="item in pointsTypeList" :key="item.val" :label="item.label" :value="item.val"> </el-option>
+    <template v-if="optionFormregion.includes('研选')">
+      <el-checkbox v-model="isDeduct" style="margin-right: 20px"> 研选扣点 </el-checkbox>
+      <el-select clearable @change="ObjectChangeHandler" v-model="PointsSet.PointsObject" placeholder="请选择扣点对象" v-if="isDeduct" style="width: 160px">
+        <el-option v-for="item in deductUser" :key="item.value" :label="item.label" :value="item.value"> </el-option>
       </el-select>
+      <template v-if="isDeduct && PointsSet.PointsObject">
+        <el-select clearable v-model="PointsSet.CompanyPointsNum" placeholder="办会人扣点点数" v-if="PointsSet.PointsObject == 3" style="width: 160px">
+          <el-option v-for="item in dataPointsSet" :key="item.PointsNum" :label="item.PointsNum" :value="item.PointsNum"> </el-option>
+        </el-select>
+        <el-select clearable v-model="PointsSet.UserPointsNum" placeholder="请选择扣点点数" style="width: 160px" v-if="PointsSet.PointsObject == 1">
+          <el-option v-for="item in dataPointsSet" :key="item.PointsNum" :label="item.PointsNum" :value="item.PointsNum"> </el-option>
+        </el-select>
+        <el-select clearable v-model="PointsSet.CompanyPointsNum" placeholder="请选择扣点点数" style="width: 160px" v-if="PointsSet.PointsObject == 2">
+          <el-option v-for="item in dataPointsSet" :key="item.PointsNum" :label="item.PointsNum" :value="item.PointsNum"> </el-option>
+        </el-select>
+        <el-autocomplete
+          :fetch-suggestions="querySearchAsync"
+          clearable
+          v-model="institutionName"
+          placeholder=" 请输入办会机构名称"
+          v-if="PointsSet.PointsObject != 1"
+          style="width: 300px"
+          @select="companyChangeHandler"
+          @clear="companyClearHandler"
+        ></el-autocomplete>
+        <el-select clearable v-model="PointsSet.UserPointsNum" placeholder="参会人扣点点数" v-if="PointsSet.PointsObject == 3" style="width: 160px; margin-left: 20px">
+          <el-option v-for="item in dataPointsSet" :key="item.PointsNum" :label="item.PointsNum" :value="item.PointsNum"> </el-option>
+        </el-select>
+        <el-select clearable v-model="PointsSet.PointsType" placeholder="请选择扣点形式" v-if="PointsSet.PointsObject != 2" style="width: 160px">
+          <el-option v-for="item in pointsTypeList" :key="item.val" :label="item.label" :value="item.val"> </el-option>
+        </el-select>
+      </template>
+      <span style="margin: 0 20px" v-if="isDeduct">
+        报名截止时间:
+        <el-date-picker clearable v-model="SiginupDeadline" type="datetime" placeholder="选择日期时间" value-format="yyyy-MM-dd HH:mm:ss"> </el-date-picker>
+      </span>
+      <span style="margin: 0 20px 0 0" v-if="PointsSet.PointsType == 1">
+        取消报名截止时间:
+        <el-select clearable v-model="PointsSet.CancelDeadlineType" placeholder="请选择截止时间" style="width: 200px">
+          <el-option v-for="item in dataDeadlineSet" :key="item.Id" :label="item.Name" :value="item.Id"> </el-option>
+        </el-select>
+      </span>
+      <el-checkbox v-model="provideEmail"> 需提供邮箱 </el-checkbox>
     </template>
-    <span style="margin: 0 20px">
-      报名截止时间:
-      <el-date-picker clearable v-model="SiginupDeadline" type="datetime" placeholder="选择日期时间" value-format="yyyy-MM-dd HH:mm:ss"> </el-date-picker>
-    </span>
-    <el-checkbox v-model="provideEmail"> 需提供邮箱 </el-checkbox>
   </div>
 </template>
 
@@ -73,6 +80,11 @@ export default {
       required: true,
       default: "",
     },
+    optionFormregion: {
+      required: true,
+      type: String,
+      default: "",
+    },
   },
   data() {
     return {
@@ -94,7 +106,9 @@ export default {
         UserPointsNum: "", //参会人扣点数量
         PointsType: "", //扣点形式,1:报名即扣点,2:到会即扣点
         CompanyPointsNum: "", //办会人扣点数量
+        CancelDeadlineType: "", //截至报名时间
       },
+      dataDeadlineSet: [],
     };
   },
   computed: {
@@ -116,15 +130,14 @@ export default {
         }
       },
     },
-    SiginupDeadline: {
-      handler(newval) {
-        console.log(newval);
-      },
-    },
   },
-  created() {},
+  created() {
+    let time = new Date().toISOString().substr(0, 10);
+    this.SiginupDeadline = time + " 15:30:00";
+  },
   mounted() {
     this.getActivityPointsSet();
+    this.getActivityDeadlineSet();
   },
   methods: {
     // 获取扣点点数的
@@ -134,6 +147,13 @@ export default {
         this.dataPointsSet = res.Data.List;
       }
     },
+    // 获取截取时间的
+    async getActivityDeadlineSet() {
+      const res = await raiInterface.activityDeadlineSet();
+      if (res.Ret === 200) {
+        this.dataDeadlineSet = res.Data;
+      }
+    },
     // 远程搜索公司
     async querySearchAsync(query, cb) {
       cb([]);
@@ -173,6 +193,7 @@ export default {
       this.PointsSet.UserPointsNum = ""; //参会人扣点数量
       this.PointsSet.PointsType = ""; //扣点形式,1=报名即扣点,2=到会即扣点
       this.PointsSet.CompanyPointsNum = ""; //办会人扣点数量
+      this.PointsSet.CancelDeadlineType = ""; //办会人扣点数量
       this.institutionName = ""; //
     },
   },

+ 26 - 94
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 {
@@ -171,7 +91,7 @@ export default {
       themeVal: "",
       dataList: [],
       page_no: 1,
-      total: "",
+      total: 0,
       dialogVisibleActivity: false,
       dialogTitle: "",
       activityDetail: {},
@@ -193,7 +113,10 @@ export default {
 
       particularsDialogVisible: false,
       dialogVisibleList: {},
-      specialDetailId: null,
+      specialDetailId: 0,
+      selectList: [],
+      messageDialogVisible: false, // 发送模版消息
+      selectionArr: {},
     };
   },
   computed: {
@@ -423,6 +346,7 @@ export default {
     },
     // 新增活动报名的表格选择
     selectChange(selection) {
+      this.selectionArr = selection;
       let arr = [];
       selection.forEach((item) => {
         arr.push(item.ActivityId);
@@ -440,6 +364,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") {

+ 60 - 9
src/views/rai_manage/components/addChoiceness.vue

@@ -50,16 +50,28 @@
             </div>
           </el-form-item>
         </el-form>
-        <!-- 产业/标的 模块 -->
-        <div class="content-module">
-          <div class="content-industry" v-for="(item, index) in industryList" :key="item.ChartPermissionId">
-            <div class="content-name" :class="industryIndex == index ? 'active' : ''" @click="industryBtn(item, index)">{{ item.ChartPermissionName }}</div>
-          </div>
+          <!-- 产业/标的 模块 -->
+          <div class="content-module">
+          <draggable
+          v-model="industryList"
+          animation="300"
+          @update="sortChange">
+            <div class="content-industry" v-for="(item, index) in industryList" :key="item.ChartPermissionId">
+              <div class="content-name" :class="industryIndex == index ? 'active' : ''" @click="industryBtn(item, index)">{{ item.ChartPermissionName }}</div>
+            </div>
+          </draggable>
           <div v-for="(item, index) in industryList" :key="item.ChartPermissionId">
             <RichText v-show="industryIndex == index" :ref="'logic' + index" :spareId="'logictest' + index" :isText="contentTextLogic" />
           </div>
-          <div class="classification">
-            <div v-for="(val, num) in industryListItem" :key="val.IndustrialSubjectId" class="industrial" @click="ificationIndustrialBtn(val, num)" :class="num == ificationIndustrial ? 'pitch' : ''">
+          <draggable
+          :list="industryListItem"
+          animation="300"
+          class="classification"
+          filter=".addIndustrial"
+          :move="onMove"
+          @update="ificationSortChange">
+            <div v-for="(val, num) in industryListItem" :key="val.IndustrialSubjectId" class="industrial" 
+            @click="ificationIndustrialBtn(val, num)" :class="num == ificationIndustrial ? 'pitch' : ''">
               <span style="margin-right: 19px">{{ val.IndustrialSubjectName }}</span>
               <span v-if="num == ificationIndustrial">
                 <img src="~@/assets/img/icons/edit1.png" style="width: 12px; height: 12px; marginright: 10px" @click="editText(val, num)" />
@@ -70,7 +82,7 @@
               <i class="el-icon-plus"></i>
               <span>添加标的</span>
             </div>
-          </div>
+          </draggable>
           <template v-for="(val, num) in industryListItem">
             <div class="industrial-is-new" :key="val.IndustrialSubjectId" v-if="num == ificationIndustrial">
               <el-checkbox v-model="val.IsNew" :true-label="1" :false-label="0">显示new标签</el-checkbox>
@@ -125,9 +137,11 @@
 <script>
 import RichText from "./richText.vue";
 import { raiInterface } from "@/api/api.js";
+import draggable from 'vuedraggable';
+
 export default {
   name: "",
-  components: { RichText },
+  components: { RichText , draggable},
   props: {},
   data() {
     return {
@@ -475,6 +489,7 @@ export default {
             return this.$message.error("请输入公司标签");
           }
           let params = this.dataHandle(type);
+          // console.log(params);
           if (type == "预览") {
             console.log(params);
             sessionStorage.setItem("choicenessPre", JSON.stringify(params));
@@ -557,6 +572,42 @@ export default {
     deleteLabelItem(item, index) {
       this.industryListItem[this.ificationIndustrial].CompanyLabel.splice(index, 1);
     },
+      // 拖拽排序更新
+  sortChange({oldIndex,newIndex}){
+    this.industryIndex=this.sortChangeFun(this.industryIndex,oldIndex,newIndex)
+  },
+  //标的拖拽排序更新
+  ificationSortChange({oldIndex,newIndex}){
+    this.ificationIndustrial=this.sortChangeFun(this.ificationIndustrial,oldIndex,newIndex)
+  },
+  // 排序更新后的逻辑
+  sortChangeFun(currentIndex,oldIndex,newIndex){
+    console.log({currentIndex,oldIndex,newIndex});
+    let bigger,smaller
+    if(oldIndex>newIndex){
+      bigger=oldIndex
+      smaller=newIndex
+    }else{
+      bigger=newIndex
+      smaller=oldIndex
+    }
+    // 当前算中tab的排序 小于较小的 大于较大的 则不用做变动
+    if(currentIndex < smaller || currentIndex > bigger) return currentIndex
+    // 移动的是当前选中的
+    if(currentIndex == oldIndex) return newIndex
+    if(oldIndex>newIndex){
+      // 向左移 加加
+      currentIndex++
+    }else if(oldIndex<newIndex){
+      // 向右移 减减
+      currentIndex--
+    }
+    return currentIndex
+  },
+  onMove(e){
+    // 返回false表示不允许停靠
+    return !!e.relatedContext.element
+  },
   },
 };
 </script>

+ 19 - 8
src/views/rai_manage/components/apply/applyDialog.vue

@@ -26,13 +26,24 @@
             :trigger-on-focus="false"
             clearable
           ></el-autocomplete>
-          <div v-if="isType && addDialogType !== '新增预约纪要'" class="radio-content">
-            <el-radio v-model="item.radio" label="1">预约外呼</el-radio>
-            <el-radio v-model="item.radio" label="2">自主拨入</el-radio>
-          </div>
-          <div style="margin: 0 20px" v-if="isShowSummary && signUpAdd !== '易董' && signUpAdd !== '专项'">
-            <el-checkbox v-model="item.checked">同时预约纪要</el-checkbox>
-          </div>
+          <template v-if="selectionArr && selectionArr.length && selectionArr[0].ActivityTypeName == '公司调研电话会'">
+            <div class="radio-content" v-if="selectionArr[0].IsResearchPoints != 1">
+              <el-radio v-model="item.radio" label="1">预约外呼</el-radio>
+              <el-radio v-model="item.radio" label="2" v-if="selectionArr[0].LimitPeopleNum > 0">自主拨入</el-radio>
+            </div>
+            <div style="margin: 0 20px" v-if="selectionArr[0].IsCanAppointmentMinutes > 0">
+              <el-checkbox v-model="item.checked">同时预约纪要</el-checkbox>
+            </div>
+          </template>
+          <template v-else>
+            <div v-if="isType && addDialogType !== '新增预约纪要'" class="radio-content">
+              <el-radio v-model="item.radio" label="1">预约外呼</el-radio>
+              <el-radio v-model="item.radio" label="2">自主拨入</el-radio>
+            </div>
+            <div style="margin: 0 20px" v-if="isShowSummary && signUpAdd !== '易董' && signUpAdd !== '专项'">
+              <el-checkbox v-model="item.checked">同时预约纪要</el-checkbox>
+            </div>
+          </template>
           <div style="width: 20px"><img @click="deleteItem(item, index)" src="~@/assets/img/icons/delete-Item.png" :class="index == 0 ? 'defaultyi' : ''" alt="" /></div>
         </div>
         <p v-if="item.isShow">系统中无此人,请先将其添加到对应公司的联系人列表下</p>
@@ -270,7 +281,7 @@ export default {
 <style lang="scss">
 .container-applydialog {
   .container-custom {
-    width: 600px;
+    width: 700px;
   }
   .container-applydial {
     width: 900px;

+ 5 - 10
src/views/rai_manage/components/apply/particularsDialog.vue

@@ -44,7 +44,7 @@
             <el-table-column v-if="isSignupTypeShow" min-width="110" key="meeting" align="center" label="参会方式">
               <template slot-scope="{ row }">
                 <span>
-                  {{ row.SignupType == 1 ? "预约外呼" : row.SignupType == 2 ? "自主拨入" : row.SignupType == 4 ? "自主入会" : "" }}
+                  {{ row.SignupType == 1 ? "预约外呼" : row.SignupType == 2 ? "自主拨入" : row.SignupType == 4 ? "自主入会" : "--" }}
                 </span>
               </template>
             </el-table-column>
@@ -89,20 +89,15 @@
         </div>
       </div>
       <div slot="footer" class="dialog-footer">
-        <div style="margin: 10px 0" v-if="subscribe !== '报名失败详情' && subscribe !== '预约外呼详情' && !Teleconference">
+        <div style="margin: 10px 0" v-if="subscribe !== '报名失败详情' && subscribe !== '预约外呼详情'">
           <span style="margin-left: 30px">
-            <el-button type="primary" v-if="AppointmentCall || this.excelType == 'CClass'" @click="appointmentCallDownloadHandler">下载名单</el-button>
+            <el-button type="primary" v-if="AppointmentCall || this.excelType == 'CClass'|| this.excelType == 'Teleconference'" @click="appointmentCallDownloadHandler">下载名单</el-button>
             <a :href="exportUser" download v-else>
               <el-button type="primary">下载名单</el-button>
             </a>
           </span>
-          <el-button style="margin-left: 30px" type="primary" plain @click="okBtn">知道了</el-button>
-        </div>
-        <div style="margin: 10px 0" v-if="subscribe == '预约外呼详情' || (Teleconference && subscribe !== '报名失败详情')">
-          <a :href="exportUser" download>
-            <el-button type="primary">下载外呼名单</el-button>
-          </a>
-          <el-button style="margin-left: 30px" type="primary" plain @click="okBtn">取消</el-button>
+          <el-button style="margin-left: 30px" v-if="subscribe == '预约外呼详情' || (Teleconference && subscribe !== '报名失败详情')" type="primary" plain @click="okBtn">取消</el-button>
+          <el-button v-else style="margin-left: 30px" type="primary" plain @click="okBtn">知道了</el-button>
         </div>
         <div v-if="subscribe == '报名失败详情'">
           <el-button style="margin: 10px 0" type="primary" @click="okBtn">知道了</el-button>

+ 17 - 22
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>
@@ -48,13 +45,17 @@ export default {
     selectionArr: {
       type: Array,
       required: true,
-      default: [],
+      default: () => [],
     },
     messageDialog: {
       type: Boolean,
       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>

+ 3 - 1
src/views/rai_manage/reportManage/appletsReport.vue

@@ -669,7 +669,9 @@ export default {
     },
     //文章详情
     lookDetail(item) {
-      let href = `https://vmp.hzinsights.com/v2/articles/${item.ArticleId}`;
+      // let href = `https://vmp.hzinsights.com/v2/articles/${item.ArticleId}`;
+      // window.open(href, "_blank");
+      let href = `${process.env.CYGX_WEB}/material/info/${item.ArticleId}`
       window.open(href, "_blank");
     },
     //筛选行业的清除事件

+ 8 - 8
src/views/rai_manage/reportManage/summaryManage.vue

@@ -30,7 +30,7 @@
       <el-table :data="dataList" style="width: 100%" border>
         <el-table-column key="title" align="center" label="报告标题" min-width="300">
           <template slot-scope="scope">
-            <span class="editsty" style="color: #409eff" @click="lookDetail(scope.row.ArticleIdMd5)">{{ scope.row.Title }}</span>
+            <span class="editsty" style="color: #409eff" @click="lookDetail(scope.row.ArticleId)">{{ scope.row.Title }}</span>
           </template>
         </el-table-column>
         <el-table-column key="category" prop="ArticleTypeName" align="center" label="报告类型" min-width="95"></el-table-column>
@@ -252,13 +252,13 @@ export default {
     },
     //文章详情
     lookDetail(id) {
-      let url =
-        process.env.NODE_ENV === "production"
-          ? "https://details.hzinsights.com/cygx/report"
-          : process.env.NODE_ENV === "test"
-          ? "http://xcxh5test.hzinsights.com/xcx_h5/cygx/report"
-          : "http://xcxh5test.hzinsights.com/xcx_h5/cygx/report";
-      let href = `${url}?id=${id}`;
+      // let url =
+      //   process.env.NODE_ENV === "production"
+      //     ? "https://details.hzinsights.com/cygx/report"
+      //     : process.env.NODE_ENV === "test"
+      //     ? "http://xcxh5test.hzinsights.com/xcx_h5/cygx/report"
+      //     : "http://xcxh5test.hzinsights.com/xcx_h5/cygx/report";
+      let href = `${process.env.CYGX_WEB}/material/info/${id}`
       window.open(href, "_blank");
     },
     //列表

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

二进制
static/fa.png


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