equityCustomStatistics.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793
  1. <template>
  2. <div class="dataReport-container" id="dataReport-container">
  3. <div class="dataReport-top">
  4. <a :href="exportExcel" download>
  5. <button class="button-sty act">导出EXCEL</button>
  6. </a>
  7. <button :class="['button-sty', { act: filterObj.month === item.label }]" v-for="item in monthLabel" @click="toggleMonth(item.label)" :key="item.label">
  8. {{ item.label }}
  9. </button>
  10. <date-picker v-model="filterObj.date" type="date" range value-type="format" placeholder="自定义时间段" :clearable="false" :editable="false" @change="dateChange" />
  11. <el-input placeholder="请输入客户名称" v-model="searchVal" style="width: 400px; margin-left: auto" @input="handleSearch" clearable>
  12. <i slot="prefix" class="el-input__icon el-icon-search"></i>
  13. </el-input>
  14. </div>
  15. <div class="dataReport-main">
  16. <div class="main-top">
  17. <el-cascader
  18. v-if="Role == 'finance' || Role == 'admin' || Role == 'ficc_admin' || Role == 'rai_admin' || ManageType != 0"
  19. v-model="filterObj.sale"
  20. placeholder="请选择销售"
  21. style="min-width: 250px; margin-right: 10px; margin-bottom: 8px"
  22. :options="salesArr"
  23. :props="defaultSalesProps"
  24. :show-all-levels="false"
  25. collapse-tags
  26. clearable
  27. filterable
  28. @change="changeFilter"
  29. >
  30. </el-cascader>
  31. </div>
  32. <div class="main-section">
  33. <div v-for="item in data_typeArr" :key="item.label">
  34. <el-card style="margin-right: 50px" :class="['base-card', { 'main-card': filterObj.data_type === item.label }]" shadow="hover" @click.native="toggleType(item.label)">
  35. <div slot="header" class="clearfix">
  36. <span>
  37. {{ lableTextDisplay(item.label) }}数
  38. <el-tooltip class="item" effect="dark" :content="item.label === '新签客户' ? '<br />' : item.label === '续约客户' ? '起始时间在所选时间段内的续约合同' : ''" placement="top">
  39. <template slot="content">
  40. <div v-if="item.label === '新增试用客户'">
  41. <p>新建试用客户的时间或跨部门领取的时间,包含在所选时间段内的客户数</p>
  42. </div>
  43. <div v-else-if="item.label === '新签客户'">
  44. <p>起始时间在所选时间段内的新签合同</p>
  45. <p>(第一份合同起始时间一年内的再次签约仍属于新签合同)</p>
  46. </div>
  47. <div v-else-if="item.label === '续约客户'">
  48. <p>起始时间在所选时间段内的续约合同</p>
  49. <p>(第一份合同起始时间一年以后的再次签约均属于续约合同)</p>
  50. </div>
  51. <p v-else>当前客户状态为非正式、非X类试用,且截止时间在所选时间段内的合同数(打分客户佣金不计入)</p>
  52. </template>
  53. <i class="el-icon-info"></i>
  54. </el-tooltip>
  55. </span>
  56. </div>
  57. <div class="card-cont">
  58. {{
  59. item.label === "新增试用客户"
  60. ? TrialTotal
  61. : item.label === "新签客户"
  62. ? NewCompanyTotal
  63. : item.label === "续约客户"
  64. ? RenewalCompanyTotal
  65. : item.label === "未续约客户"
  66. ? NotRenewalCompanyTotal + " / " + NotRenewalCompanyToBeConfirmTotal
  67. : ""
  68. }}
  69. </div>
  70. </el-card>
  71. </div>
  72. </div>
  73. <div class="tabs-box">
  74. <div class="tabs-box-confirm" v-if="filterObj.data_type == '续约客户'">
  75. <div style="margin-bottom: 0px" class="tabs-box-confirm" v-for="(item, index) in packageTypeList" :key="item">
  76. <div :class="['confirm-box-li', PackageDifference == item && 'active']" @click="notPackageDifferenceChange(item)">{{ item }}</div>
  77. <div v-if="index != 2" class="center-line"></div>
  78. </div>
  79. </div>
  80. </div>
  81. <div class="tabs-box" v-if="filterObj.data_type == '未续约客户'">
  82. <div style="display: flex; align-items: cente; margin-bottom: 20px">
  83. <el-radio-group v-model="isNotRenewedConfirm" style="margin: 0px 20px 0 0" class="tabs-box-confirm" @change="notRenewedConfirmChange">
  84. <el-radio-button :label="1">已确认</el-radio-button>
  85. <div class="center-line"></div>
  86. <el-radio-button :label="0">待确认</el-radio-button>
  87. <div class="center-line"></div>
  88. <el-radio-button :label="2">到期合同</el-radio-button>
  89. </el-radio-group>
  90. <div class="lable-text">
  91. 未续约率
  92. <el-tooltip style="margin-right: 16px" class="item" effect="dark" content="所选年度的续约合同/所选年度的到期合同" placement="top-start">
  93. <template slot="content">
  94. <div>
  95. <p>所选时间段的已确认不续约的合同金额/所选时间段的到期的合同金额</p>
  96. <p>(剔除非业务不续约的金额)</p>
  97. </div>
  98. </template>
  99. <i class="el-icon-info" style="color: #999"></i>
  100. </el-tooltip>
  101. <p class="editsty" v-if="RenewalDataForm.RenewalRateMoney" @click="renewalRateLableHandler">&nbsp;&nbsp;{{ RenewalDataForm.RenewalRateMoney }}&nbsp;&nbsp;</p>
  102. {{ RenewalDataForm.RenewalRateTotalContent ? `(${RenewalDataForm.RenewalRateTotalContent})` : " - -" }}
  103. <el-button v-if="canConfirmNotRenewed" type="primary" size="mini" style="margin-left: 20px" @click="isNotRenewedDlg = true">下载</el-button>
  104. </div>
  105. </div>
  106. <div v-show="isNotRenewedConfirm">
  107. <el-select v-model="noRenewalReasonId" placeholder="请选择不续约归因" clearable @change="getTableData" style="width: 240px; margin-right: 50px">
  108. <el-option :label="item.AscribeContent" :value="item.CompanyAscribeId" v-for="item in noRenewalReasonList" :key="item.reasonId"></el-option>
  109. </el-select>
  110. <el-select v-model="tabsActiveName" placeholder="当前状态" clearable @change="getTableData" style="width: 240px; margin-right: 50px">
  111. <el-option :label="item.name" :value="item.value" v-for="item in tabsList" :key="item.value"></el-option>
  112. </el-select>
  113. </div>
  114. </div>
  115. <el-table :data="tableData" border style="margin-top: 20px; min-height: 400px" v-loading="isShowloadding" element-loading-text="数据加载中...">
  116. <template v-for="item in incrementTableColums">
  117. <el-table-column :key="item.label" :label="item.label" :width="item.widthsty" align="center" v-if="item.key != 'AscribeContent'">
  118. <template slot-scope="scope">
  119. <span :style="item.textsty" @click="jumpHandle(scope.row, item)" v-if="item.key === 'CreateTime'">
  120. {{ scope.row[item.key] | formatTime }}
  121. </span>
  122. <span v-else-if="item.label == '未续约说明'">
  123. <span style="display: block" v-if="scope.row[item.key]">最新情况:{{ scope.row[item.key] }}</span>
  124. <span v-if="scope.row.RenewalTodo">To Do 事项:{{ scope.row.RenewalTodo }}</span>
  125. <span v-if="scope.row[item.key] || scope.row.RenewalTodo" style="color: #409eff; cursor: pointer" @click="renewalReasonMore(scope.row)">&emsp;更多>></span>
  126. </span>
  127. <div v-else-if="item.key == 'CompanyName'" style="padding: 4px 0">
  128. <el-tooltip effect="dark" placement="top-start" content="过去4周,kp均未覆盖服务" v-if="scope.row.IsUserMaker == -1">
  129. <span class="deletesty" @click="jumpHandle(scope.row, item)">{{ scope.row[item.key] }}</span>
  130. </el-tooltip>
  131. <span v-else class="editsty" @click="jumpHandle(scope.row, item)">{{ scope.row[item.key] }}</span>
  132. <div class="package-difference" v-if="scope.row.PackageDifference && filterObj.data_type == '续约客户'" @click="previousDetailHadler(scope.row)">
  133. {{ scope.row.PackageDifference }}
  134. </div>
  135. </div>
  136. <div v-else-if="item.key === 'Remark'" class="remark-row">
  137. <span class="remark-text" @click="viewHistoryRemarkFun(scope.row)" v-if="scope.row.IsShowNoRenewedNote">...</span>
  138. <span class="operation-button" v-show="canConfirmNotRenewed && !isNotRenewedConfirm" style="margin-right: 0" @click="addRemarkFun(scope.row)">添加</span>
  139. </div>
  140. <div v-else-if="item.key == 'AscribeContent'">
  141. <span style="color: #409eff; cursor: pointer" @click="editReasonLabel(scope.row)">
  142. {{ scope.row[item.key] }}
  143. </span>
  144. </div>
  145. <div v-else-if="item.key == 'PermissionName'">
  146. <template v-if="scope.row.PermissionName.length">
  147. <el-tag size="mini" style="margin: 0 10px 10px 0" v-for="key in scope.row.PermissionName.split(',')" :key="key">{{ key }}</el-tag>
  148. </template>
  149. </div>
  150. <div v-else-if="item.key == 'StartDate'">
  151. <span> {{ scope.row[item.key] }} ~ {{ scope.row.EndDate }} </span>
  152. </div>
  153. <span v-else :style="item.textsty" @click="jumpHandle(scope.row, item)">
  154. {{ scope.row[item.key] }}
  155. </span>
  156. </template>
  157. </el-table-column>
  158. <el-table-column :key="item.label" :label="item.label" :width="item.widthsty" align="center" v-else-if="item.key == 'AscribeContent' && isNotRenewedConfirm == 1">
  159. <template slot-scope="scope">
  160. <span style="color: #409eff; cursor: pointer" @click="editReasonLabel(scope.row)">
  161. {{ scope.row[item.key] }}
  162. </span>
  163. </template>
  164. </el-table-column>
  165. </template>
  166. <el-table-column label="操作" width="180px" align="center">
  167. <template slot-scope="scope">
  168. <div>
  169. <span v-if="canConfirmNotRenewed && !isNotRenewedConfirm && filterObj.data_type == '未续约客户'" class="editsty" @click="confirmedNoRenewalFun(scope.row)">确认不续约</span>
  170. <span v-if="isRoleType == 'admin' || isRoleType == '权益'" @click="historicalNotesClickHandler(scope.row)" class="editsty">历史备注</span>
  171. </div>
  172. </template>
  173. </el-table-column>
  174. <div slot="empty" style="line-height: 44px; margin: 60px 0; color: #999">
  175. <img src="~@/assets/img/cus_m/nodata.png" alt="" style="display: block; width: 160px; height: 128px; margin: auto" />
  176. <span>暂无数据</span>
  177. </div>
  178. </el-table>
  179. <el-col :span="24" class="toolbar" v-if="total">
  180. <m-page :total="total" :page_no="page_no" @handleCurrentChange="handleCurrentChange" />
  181. </el-col>
  182. </div>
  183. <!-- 未续约说明列表弹窗 -->
  184. <renewalListDia :isShow.sync="isRenewalShow" :rowInfo="rowInfo" />
  185. <!-- 添加备注弹窗 -->
  186. <addRemark :isShow.sync="isAddRemarkShow" @saveRemark="saveRemark" />
  187. <!-- 历史备注弹窗 -->
  188. <viewRemark :isShow.sync="isViewRemarkShow" :tableData="historyRemarkList" />
  189. <!-- 确认不续约弹窗 -->
  190. <confirmedNoRenewal
  191. :isShow.sync="isConfirmNoRenewalShow"
  192. :dataForm="confirmNoRenewalForm"
  193. :noRenewalReasonList="noRenewalReasonList"
  194. @refreshReasonList="getNORenewalReasonList"
  195. @saveLabel="saveLabel"
  196. equityType="权益客户统计"
  197. />
  198. <previous-detail :previousDetailDlg.sync="previousDetailDlg" :rowInfo="rowInfo" />
  199. <RenewalRateDetail :showRenewalRateDetailDlg.sync="showRenewalRateDetailDlg" :renewalRateDetailForm.sync="renewalRateDetailForm" :noRenewalReasonListSon="noRenewalReasonList" />
  200. <historical-notes-dlg :historicalNotesDlgVisible.sync="historicalNotesDlgVisible" :CompanyId.sync="historicalNotesId" />
  201. <NotRenewedDlg :isNotRenewedDlg.sync="isNotRenewedDlg" :start_date="start_date" :end_date="end_date" :adminId="filterObj.sale" />
  202. </div>
  203. </template>
  204. <script>
  205. import { equityTableColums } from "./configdata.js";
  206. import { dataMainInterface, customInterence } from "@/api/api.js";
  207. import mPage from "@/components/mPage.vue";
  208. import renewalListDia from "./components/renewalListDia.vue";
  209. import addRemark from "./components/noRenewalReasonDia/addRemark.vue";
  210. import viewRemark from "./components/noRenewalReasonDia/viewRemark.vue";
  211. import confirmedNoRenewal from "./components/noRenewalReasonDia/confirmedNoRenewal.vue";
  212. import PreviousDetail from "./components/previousDetail.vue";
  213. import RenewalRateDetail from "./components/renewalRateDetail.vue";
  214. import HistoricalNotesDlg from "@/components/historicalNotesDlg.vue";
  215. import NotRenewedDlg from "./components/NotRenewedDlg.vue";
  216. var moment = require("moment");
  217. moment().format();
  218. export default {
  219. name: "",
  220. components: { mPage, renewalListDia, addRemark, viewRemark, confirmedNoRenewal, PreviousDetail, RenewalRateDetail, HistoricalNotesDlg, NotRenewedDlg },
  221. computed: {
  222. exportExcel() {
  223. let baseUrl = process.env.API_ROOT + "/statistic_report/merge_company_list";
  224. let token = localStorage.getItem("auth") || "";
  225. let paramStr = "";
  226. // 处理销售筛选
  227. let salesArr = [];
  228. if (this.filterObj.sale.length) {
  229. salesArr = this.filterObj.sale.map((item) => {
  230. return item[item.length - 1];
  231. });
  232. }
  233. let obj = {
  234. AdminId: salesArr.join(","),
  235. EndDate: this.end_date,
  236. StartDate: this.start_date,
  237. DataType: this.filterObj.data_type == "新增试用客户" ? "新增试用" : this.filterObj.data_type,
  238. Keyword: this.searchVal,
  239. IsExport: true,
  240. IsConfirm: this.filterObj.data_type == "未续约客户" ? this.isNotRenewedConfirm : -1,
  241. CompanyAscribeId: this.noRenewalReasonId,
  242. };
  243. for (let key in obj) {
  244. paramStr = `${paramStr}&${key}=${obj[key]}`;
  245. }
  246. return `${baseUrl}?${token}${paramStr}`;
  247. },
  248. Role() {
  249. let role = localStorage.getItem("Role") || "";
  250. return role;
  251. },
  252. //管理权限
  253. ManageType() {
  254. return localStorage.getItem("ManageType") || "";
  255. },
  256. //确认未续约权限
  257. canConfirmNotRenewed() {
  258. return ["admin", "rai_admin"].includes(this.Role);
  259. },
  260. // crm 15.9.1 区分权益FICC的展示
  261. isRoleType() {
  262. return localStorage.getItem("RoleType") || "";
  263. },
  264. },
  265. data() {
  266. return {
  267. searchVal: sessionStorage.getItem("incrementBack") ? JSON.parse(sessionStorage.getItem("incrementBack")).searchVal : "",
  268. tableData: [],
  269. isShowloadding: false,
  270. start_date: "",
  271. end_date: "",
  272. /* 筛选条件 */
  273. filterObj: {
  274. month: "近1个月",
  275. date: [],
  276. sale: "",
  277. data_type: "新增试用客户",
  278. },
  279. monthLabel: [
  280. {
  281. label: "近1个月",
  282. },
  283. {
  284. label: "近2个月",
  285. },
  286. {
  287. label: "近3个月",
  288. },
  289. ],
  290. salesArr: [], //销售列表
  291. defaultSalesProps: {
  292. multiple: true,
  293. label: "RealName",
  294. children: "ChildrenList",
  295. value: "AdminId",
  296. }, //销售级联配置
  297. pageSize: 10,
  298. page_no: sessionStorage.getItem("incrementBack") ? JSON.parse(sessionStorage.getItem("incrementBack")).page_no : 1,
  299. total: 0,
  300. data_typeArr: [
  301. {
  302. label: "新增试用客户",
  303. },
  304. {
  305. label: "新签客户",
  306. },
  307. {
  308. label: "续约客户",
  309. },
  310. {
  311. label: "未续约客户",
  312. },
  313. ], //数据类型
  314. NewCompanyTotal: 0, //新签客户数
  315. NotRenewalCompanyTotal: 0, //未续约客户数
  316. RenewalCompanyTotal: 0, //续约客户数
  317. NotRenewalCompanyToBeConfirmTotal: 0,
  318. isRenewalShow: false, //未续约说明列表弹框是否显示
  319. rowInfo: null, // 未续约说明更多行信息
  320. tabsList: [
  321. { name: "试用", value: "试用" },
  322. { name: "冻结/流失", value: "非试用" },
  323. ],
  324. tabsActiveName: "",
  325. TrialTotal: 0, //新增试用数
  326. NotRenewalNotTryOut: 0, //冻结流失的人数
  327. NotRenewalTryOut: 0, //试用的人数
  328. isNotRenewedConfirm: 1, //未续约的是否已确认
  329. noRenewalReasonList: [],
  330. noRenewalReasonId: "",
  331. selectItemRow: {}, // 当前选中的row
  332. // 添加备注
  333. isAddRemarkShow: false,
  334. //历史备注
  335. isViewRemarkShow: false,
  336. historyRemarkList: [],
  337. //确认不续约
  338. isConfirmNoRenewalShow: false,
  339. confirmNoRenewalForm: {
  340. reason: "",
  341. detailReason: "",
  342. },
  343. incrementTableColums: [],
  344. PackageDifference: "",
  345. previousDetailDlg: false,
  346. packageTypeList: ["增加套餐", "减少套餐", "维持套餐"],
  347. yearValue: "",
  348. showRenewalRateDetailDlg: false,
  349. renewalRateDetailForm: {},
  350. RenewalDataForm: {},
  351. historicalNotesDlgVisible: false, //历史备注的弹框
  352. historicalNotesId: 0,
  353. isNotRenewedDlg: false, //未续约 弹框
  354. };
  355. },
  356. /* 页面跳转前记录参数 */
  357. beforeRouteLeave(to, form, next) {
  358. let backData = {
  359. page_no: this.page_no,
  360. end_date: this.end_date,
  361. start_date: this.start_date,
  362. filterObj: this.filterObj,
  363. };
  364. sessionStorage.setItem("incrementBack", JSON.stringify(backData));
  365. next();
  366. },
  367. /* 页面进入前是否清除参数 */
  368. beforeRouteEnter(to, from, next) {
  369. if (from.path != "/customDetail") {
  370. sessionStorage.removeItem("incrementBack");
  371. }
  372. next();
  373. },
  374. methods: {
  375. // 搜索
  376. handleSearch() {
  377. if (!this.searchVal) {
  378. this.page_no = 1;
  379. this.filterObj = {
  380. month: "近1个月",
  381. date: [],
  382. sale: "",
  383. data_type: this.filterObj.data_type,
  384. };
  385. let date_before = moment().subtract(1, "M").format("YYYY-MM-DD");
  386. let date_now = moment().format("YYYY-MM-DD");
  387. let date = [date_before, date_now];
  388. this.start_date = date_before;
  389. this.end_date = date_now;
  390. this.filterObj.date = date;
  391. this.getTableData();
  392. return;
  393. }
  394. this.page_no = 1;
  395. this.filterObj = {
  396. month: "",
  397. date: [],
  398. sale: "",
  399. data_type: this.filterObj.data_type,
  400. };
  401. this.start_date = "";
  402. this.end_date = "";
  403. this.getTableData();
  404. },
  405. //tabs 的点击事件
  406. // tabsHandler(item) {
  407. // this.tabsActiveName = item.value;
  408. // this.noRenewalReasonId = "";
  409. // this.page_no = 1;
  410. // this.getTableData();
  411. // },
  412. notRenewedConfirmChange() {
  413. this.tabsActiveName = "";
  414. this.noRenewalReasonId = "";
  415. this.page_no = 1;
  416. this.getTableData();
  417. },
  418. notPackageDifferenceChange(type) {
  419. if (this.PackageDifference == type) {
  420. this.PackageDifference = "";
  421. } else {
  422. this.PackageDifference = type;
  423. }
  424. this.page_no = 1;
  425. this.getTableData();
  426. },
  427. /* 获取表格 */
  428. getTableData() {
  429. this.isShowloadding = true;
  430. // 处理销售筛选
  431. let salesArr = [];
  432. if (this.filterObj.sale.length) {
  433. salesArr = this.filterObj.sale.map((item) => {
  434. return item[item.length - 1];
  435. });
  436. }
  437. let params = {
  438. Keyword: this.searchVal,
  439. PageSize: this.pageSize,
  440. CurrentIndex: this.page_no,
  441. AdminId: salesArr.join(","),
  442. EndDate: this.end_date,
  443. StartDate: this.start_date,
  444. DataType: this.filterObj.data_type == "新增试用客户" ? "新增试用" : this.filterObj.data_type,
  445. TryOutType: this.filterObj.data_type == "未续约客户" && this.isNotRenewedConfirm == 1 ? this.tabsActiveName : "",
  446. IsConfirm: this.filterObj.data_type == "未续约客户" ? this.isNotRenewedConfirm : -1,
  447. CompanyAscribeId: this.noRenewalReasonId,
  448. PackageDifference: this.PackageDifference,
  449. };
  450. dataMainInterface.incrementalEquityList(params).then((res) => {
  451. if (res.Ret === 200) {
  452. this.tableData = res.Data.List || [];
  453. this.total = res.Data.Paging.Totals;
  454. this.TrialTotal = res.Data.TrialTotal;
  455. this.NewCompanyTotal = res.Data.NewCompanyTotal;
  456. this.RenewalCompanyTotal = res.Data.RenewalCompanyTotal;
  457. this.NotRenewalCompanyTotal = res.Data.NotRenewalCompanyTotal;
  458. this.NotRenewalCompanyToBeConfirmTotal = res.Data.NotRenewalCompanyToBeConfirmTotal;
  459. this.NotRenewalTryOut = res.Data.NotRenewalTryOut;
  460. this.NotRenewalNotTryOut = res.Data.NotRenewalNotTryOut;
  461. this.isShowloadding = false;
  462. }
  463. });
  464. },
  465. /* 获取销售 */
  466. getSale() {
  467. customInterence.getSalesRaiData().then((res) => {
  468. if (res.Ret === 200) {
  469. this.salesArr = res.Data.List;
  470. }
  471. });
  472. },
  473. /* 切换月份 */
  474. toggleMonth(label) {
  475. this.filterObj.month = label;
  476. let days = label == "近1个月" ? 1 : label == "近2个月" ? 2 : label == "近3个月" ? 3 : 0;
  477. this.filterDate(days);
  478. this.getIncrementalCompanyContractPercentageList();
  479. },
  480. /* 选择服务日期 */
  481. dateChange(e) {
  482. if (e[0]) {
  483. this.start_date = e[0];
  484. this.end_date = e[1];
  485. } else {
  486. this.start_date = "";
  487. this.end_date = "";
  488. }
  489. this.filterObj.month = "";
  490. this.page_no = 1;
  491. this.searchVal = "";
  492. this.getTableData();
  493. },
  494. /* 切换数据类型 */
  495. toggleType(label) {
  496. this.filterObj.data_type = label;
  497. this.incrementTableColums = equityTableColums(this.filterObj.data_type);
  498. this.noRenewalReasonId = "";
  499. if (label == "未续约客户") {
  500. this.getIncrementalCompanyContractPercentageList();
  501. this.getNORenewalReasonList();
  502. }
  503. this.tabsActiveName = "";
  504. this.page_no = 1;
  505. this.getTableData();
  506. },
  507. /* 筛选改变时 */
  508. changeFilter() {
  509. this.page_no = 1;
  510. this.searchVal = "";
  511. this.getTableData();
  512. this.getIncrementalCompanyContractPercentageList();
  513. },
  514. /* 切换页码 */
  515. handleCurrentChange(page) {
  516. this.page_no = page;
  517. this.getTableData();
  518. },
  519. /* 获取近几个月的日期范围 */
  520. filterDate(month) {
  521. if (month) {
  522. let date_before = moment().subtract(month, "M").format("YYYY-MM-DD");
  523. let date_now = moment().format("YYYY-MM-DD");
  524. let date = [date_before, date_now];
  525. this.start_date = date_before;
  526. this.end_date = date_now;
  527. this.filterObj.date = date;
  528. this.page_no = 1;
  529. this.searchVal = "";
  530. this.getTableData();
  531. }
  532. },
  533. /* 跳转 */
  534. jumpHandle(row, item) {
  535. if (item.link) {
  536. let { href } = this.$router.resolve({
  537. path: "/customDetail",
  538. query: {
  539. id: row.CompanyId,
  540. },
  541. });
  542. window.open(href, "_blank");
  543. }
  544. },
  545. getNORenewalReasonList() {
  546. dataMainInterface.getAscribList().then((res) => {
  547. if (res.Ret == 200) {
  548. this.noRenewalReasonList = res.Data.List || [];
  549. }
  550. });
  551. },
  552. // 未续约说明更多按钮
  553. renewalReasonMore(row) {
  554. this.rowInfo = {
  555. CompanyId: row.CompanyId,
  556. ProductId: row.ProductId,
  557. };
  558. this.isRenewalShow = true;
  559. },
  560. // 添加备注
  561. addRemarkFun(row) {
  562. this.selectItemRow = row;
  563. this.isAddRemarkShow = true;
  564. },
  565. // 添加备注 保存
  566. saveRemark(remark) {
  567. // console.log(remark);
  568. let params = {
  569. CompanyId: this.selectItemRow.CompanyId,
  570. ProductId: this.selectItemRow.ProductId,
  571. Content: remark,
  572. };
  573. dataMainInterface.addNotRenewedRemark(params).then((res) => {
  574. if (res.Ret == 200) {
  575. this.$message.success("添加成功");
  576. this.getTableData();
  577. this.isAddRemarkShow = false;
  578. this.selectItemRow = {};
  579. }
  580. });
  581. },
  582. // 查看历史备注
  583. viewHistoryRemarkFun(row) {
  584. dataMainInterface.getNotRenewedRemarkList({ CompanyId: row.CompanyId, ProductId: row.ProductId }).then((res) => {
  585. if (res.Ret == 200) {
  586. this.historyRemarkList = res.Data.List || [];
  587. this.isViewRemarkShow = true;
  588. }
  589. });
  590. },
  591. confirmedNoRenewalFun(row) {
  592. this.confirmNoRenewalForm.reason = "";
  593. this.confirmNoRenewalForm.detailReason = "";
  594. this.selectItemRow = row;
  595. this.isConfirmNoRenewalShow = true;
  596. },
  597. editReasonLabel(row) {
  598. dataMainInterface.contractInfoNoRenewedAscribe({ CompanyContractId: row.CompanyContractId }).then((res) => {
  599. if (res.Ret == 200) {
  600. this.confirmNoRenewalForm.reason = res.Data.Detail ? res.Data.Detail.CompanyAscribeId || "" : "";
  601. this.confirmNoRenewalForm.detailReason = res.Data.Detail ? res.Data.Detail.Content || "" : "";
  602. this.selectItemRow = row;
  603. this.isConfirmNoRenewalShow = true;
  604. }
  605. });
  606. },
  607. saveLabel(item) {
  608. let params = {
  609. CompanyContractId: this.selectItemRow.CompanyContractId,
  610. CompanyAscribeId: item.CompanyAscribeId,
  611. Content: item.Content,
  612. };
  613. dataMainInterface.addAscribContract(params).then((res) => {
  614. if (res.Ret == 200) {
  615. this.$message.success("确认成功");
  616. this.isConfirmNoRenewalShow = false;
  617. this.selectItemRow = {};
  618. this.getTableData();
  619. }
  620. });
  621. },
  622. previousDetailHadler(row) {
  623. this.rowInfo = row;
  624. this.previousDetailDlg = true;
  625. },
  626. lableTextDisplay(text) {
  627. let str = text == "新增试用客户" ? "新增试用客户" : text == "新签客户" ? "新签合同" : text == "续约客户" ? "续约合同" : "未续约客户";
  628. return str;
  629. },
  630. // // 年度续约的标签点击事件
  631. // annualSelectHandler(item) {
  632. // this.annualSelectActivue = item.name;
  633. // this.getIncrementalCompanyContractPercentageList();
  634. // },
  635. // 点击了续约率
  636. renewalRateLableHandler() {
  637. this.showRenewalRateDetailDlg = true;
  638. this.renewalRateDetailForm = this.initCompanyContractPercentageList();
  639. },
  640. // 获取年度续约的数据
  641. async getIncrementalCompanyContractPercentageList() {
  642. if (this.filterObj.data_type != "未续约客户") return;
  643. let params = this.initCompanyContractPercentageList();
  644. const res = await dataMainInterface.incrementalCompanyContractPercentageListV2(params);
  645. if (res.Ret === 200) {
  646. this.RenewalDataForm = res.Data;
  647. }
  648. },
  649. // 处理年度续约的数据
  650. initCompanyContractPercentageList() {
  651. let salesArr = [];
  652. if (this.filterObj.sale.length) {
  653. salesArr = this.filterObj.sale.map((item) => {
  654. return item[item.length - 1];
  655. });
  656. }
  657. let params = {
  658. EndDate: this.end_date,
  659. StartDate: this.start_date,
  660. AdminId: salesArr.join(","),
  661. };
  662. return params;
  663. },
  664. // 点击了历史留言
  665. historicalNotesClickHandler(item) {
  666. this.historicalNotesDlgVisible = true;
  667. this.historicalNotesId = item.CompanyId;
  668. },
  669. },
  670. created() {},
  671. mounted() {
  672. this.incrementTableColums = equityTableColums(this.filterObj.data_type);
  673. this.getSale();
  674. if (sessionStorage.getItem("incrementBack")) {
  675. let backData = JSON.parse(sessionStorage.getItem("incrementBack"));
  676. this.page_no = backData.page_no;
  677. this.end_date = backData.end_date;
  678. this.start_date = backData.start_date;
  679. this.filterObj = backData.filterObj;
  680. this.searchVal = backData.searchVal;
  681. }
  682. /* 默认选中近1个月 */
  683. this.filterDate(this.filterObj.month === "近1个月" ? 1 : this.filterObj.month === "近2个月" ? 2 : this.filterObj.month === "近3个月" ? 3 : 0);
  684. },
  685. };
  686. </script>
  687. <style lang="scss" scoped>
  688. @import "./index.scss";
  689. .tabs-box {
  690. flex-direction: column;
  691. .tabs-box-confirm {
  692. display: flex;
  693. align-items: center;
  694. margin-bottom: 20px;
  695. .center-line {
  696. width: 1px;
  697. height: 21px;
  698. background-color: #333333;
  699. margin: 0 20px;
  700. }
  701. .confirm-box-li {
  702. display: flex;
  703. align-items: center;
  704. justify-content: center;
  705. cursor: pointer;
  706. width: 120px;
  707. height: 40px;
  708. border-radius: 4px;
  709. }
  710. .active {
  711. background-color: #409eff;
  712. color: #fff;
  713. }
  714. }
  715. }
  716. .operation-button {
  717. color: #409eff;
  718. cursor: pointer;
  719. font-size: 14px;
  720. margin-right: 10px;
  721. }
  722. .remark-row {
  723. display: flex;
  724. justify-content: center;
  725. .remark-text {
  726. width: 18px;
  727. height: 18px;
  728. margin-right: 8px;
  729. font-size: 18px;
  730. color: #409eff;
  731. cursor: pointer;
  732. }
  733. }
  734. .operation-row {
  735. display: flex;
  736. align-items: center;
  737. justify-content: center;
  738. flex-wrap: wrap;
  739. .operation-button {
  740. &:last-child {
  741. margin-right: 0;
  742. }
  743. }
  744. }
  745. .package-difference {
  746. cursor: pointer;
  747. }
  748. .lable-text {
  749. display: flex;
  750. align-items: center;
  751. }
  752. .select-lable {
  753. display: flex;
  754. align-items: center;
  755. justify-content: center;
  756. box-sizing: border-box;
  757. margin-left: 10px;
  758. width: 92px;
  759. height: 40px;
  760. color: #409eff;
  761. background-color: #ecf5ff;
  762. border: 1px solid #b3d8ff;
  763. border-radius: 4px;
  764. cursor: pointer;
  765. }
  766. .act-select-lable {
  767. color: #fff;
  768. background-color: #409eff;
  769. border: none;
  770. }
  771. </style>
  772. <style lang="scss">
  773. #dataReport-container {
  774. .tabs-box {
  775. .el-radio-button {
  776. margin-right: 0;
  777. }
  778. .el-radio-button .el-radio-button__inner {
  779. border: none;
  780. width: 120px;
  781. height: 40px;
  782. border-radius: 4px;
  783. }
  784. }
  785. }
  786. </style>