فهرست منبع

Merge branch 'yjw'

jwyu 11 ماه پیش
والد
کامیت
7fdd20ef49

+ 9 - 6
src/router/modules/statisticRoutes.js

@@ -21,12 +21,15 @@ export default [
                     title:'即将到期客户'
                 }
 			},
-			// {
-			// 	path: 'incrementalist',
-			// 	component: () => import('@/views/dataReport_manage/incrementalList.vue'),
-			// 	name: '增量客户数据',
-			// 	hidden: false
-			// },
+			{
+				path: 'incrementalist',
+				component: () => import('@/views/dataReport_manage/incrementalList.vue'),
+				name: 'incrementalist',
+				hidden: false,
+				meta:{
+					title:'增量客户数据'
+				}
+			},
 			// {
 			// 	path: 'stocklist',
 			// 	component: () => import('@/views/dataReport_manage/stockCutomList.vue'),

+ 90 - 0
src/views/dataReport_manage/components/noRenewalReasonDia/addRemark.vue

@@ -0,0 +1,90 @@
+<script setup>
+import { reactive, ref, watch } from "vue"
+
+const emits=defineEmits(['saveRemark'])
+
+const isShow=defineModel('isShow',{type:Boolean,default:false})
+
+const remarkForm = ref({
+    text:''
+})
+const remarkFormRef=ref(null)
+watch(
+    ()=>isShow.value,
+    (n)=>{
+        if(n){
+            remarkForm.text=''
+            remarkFormRef.value&&remarkFormRef.value.clearValidate()
+        }
+    }
+)
+
+function save(){
+        remarkFormRef.value&&remarkFormRef.value.validate(valid=>{
+          if(valid){
+            emits("saveRemark",remarkForm.value.text)
+            remarkFormRef.value.resetFields()
+          }
+        })
+      }
+
+
+</script>
+
+<template>
+  <el-dialog
+    v-model="isShow"
+    @close="isShow=false"
+    :modal-append-to-body="false"
+    width="652px"
+    title="添加备注"
+  >
+    <div class="dialog-box">
+      <el-form :model="remarkForm" ref="remarkFormRef">
+        <el-form-item
+          prop="text"
+          :rules="{ required: true, message: '备注不能为空', trigger: 'blur' }"
+        >
+          <el-input
+            v-model.trim="remarkForm.text"
+            placeholder="请输入备注信息"
+            type="textarea"
+            style="width: 505px"
+            :rows="9"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div class="dialog-footer">
+        <el-button
+          @click="isShow=false"
+          class="dialog-footer-button"
+          >取消</el-button
+        >
+        <el-button
+          @click="save"
+          type="primary"
+          class="dialog-footer-button"
+          style="margin-left: 30px"
+          >确定</el-button
+        >
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+
+<style lang="scss" scoped>
+  .dialog-box{
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: flex-start;
+    .dialog-footer{
+      margin: 30px 0;
+      .dialog-footer-button{
+        height: 40px;
+        width: 120px;
+      }
+    }
+  }
+</style>

+ 238 - 0
src/views/dataReport_manage/components/noRenewalReasonDia/confirmedNoRenewal.vue

@@ -0,0 +1,238 @@
+<script setup>
+import { ElMessage } from "element-plus"
+import { computed, nextTick, reactive, watch,ref } from "vue"
+
+const props = defineProps({
+  dataForm: {
+    type: Object,
+    required: true
+  },
+  noRenewalReasonList: {
+    type: Array,
+    required: true
+  }
+})
+const emits=defineEmits(['refreshReasonList','saveLabel'])
+
+const pageState = reactive({
+  remarkForm: {
+    AscribeContent: ''
+  },
+  labelForm: {
+    reason: '',
+    detailReason: ''
+  },
+  createReasonShow: false
+})
+
+const isShow = defineModel('isShow', { type: Boolean, default: false })
+const confirmNoRenewalFormRef = ref(null)
+
+
+watch(() => isShow, (value) => {
+  if (value) {
+    pageState.labelForm.reason = props.dataForm.reason
+    pageState.labelForm.detailReason = props.dataForm.detailReason
+    nextTick(() => {
+      confirmNoRenewalFormRef.value && confirmNoRenewalFormRef.value.clearValidate()
+    })
+  }
+})
+
+const Role = computed(() => {
+  return localStorage.getItem('Role') || '';
+})
+const canConfirmNotRenewed = computed(() => {
+  return ['admin', 'rai_admin'].includes(Role.value)
+})
+
+
+function createReason() {
+  pageState.createReasonShow = true
+}
+const confirmReasonRef=ref(null)
+function resetReasonForm(){
+  pageState.remarkForm.AscribeContent = ""
+  confirmReasonRef.value?.clearValidate()
+}
+function querySearch(queryString, cb){
+  if (!queryString) {
+    cb(props.noRenewalReasonList.map(item => {
+      return { value: item.AscribeContent }
+    }))
+  } else {
+    cb(props.noRenewalReasonList.map(item => {
+      if (item.AscribeContent.indexOf(queryString) != -1) {
+        return { value: item.AscribeContent }
+      }
+    }).filter(Boolean))
+  }
+}
+function saveReason(){
+ confirmReasonRef.value?.validate(valid => {
+    if (valid) {
+      pageState.remarkForm.AscribeContent = pageState.remarkForm.AscribeContent.replace(/\s*/g, "")
+      dataMainInterface.addAscrib({ AscribeContent: pageState.remarkForm.AscribeContent })
+        .then(res => {
+          if (res.Ret == 200) {
+            ElMessage.success("新建成功")
+            pageState.createReasonShow = false
+            emits("refreshReasonList")
+          }
+        })
+    }
+  })
+}
+function save(){
+  if ((Role.value != 'rai_admin' && props.dataForm.reason) || (!canConfirmNotRenewed.value)) {
+    ElMessage.error("仅管理员可修改")
+    return
+  }
+  confirmNoRenewalFormRef.value?.validate(valid => {
+    if (valid) {
+      emits("saveLabel", { CompanyAscribeId: pageState.labelForm.reason, Content: pageState.labelForm.detailReason })
+    }
+  })
+}
+
+
+</script>
+
+<template>
+  <el-dialog
+    v-model="isShow"
+    @close="isShow = false"
+    :modal-append-to-body="false"
+    width="652px"
+    title="确认不续约"
+  >
+    <div class="dialog-box">
+      <el-form :model="pageState.labelForm" ref="confirmNoRenewalFormRef">
+        <el-form-item
+          prop="reason"
+          :rules="{
+            required: true,
+            message: '不续约归因不能为空',
+            trigger: 'change',
+          }"
+        >
+          <div
+            style="
+              display: flex;
+              align-items: center;
+              justify-content: space-between;
+            "
+          >
+            <el-select
+              v-model="pageState.labelForm.reason"
+              placeholder="不续约归因"
+              style="width: 424px"
+            >
+              <el-option
+                :label="item.AscribeContent"
+                :value="item.CompanyAscribeId"
+                v-for="item in props.noRenewalReasonList"
+                :key="item.reasonId"
+              ></el-option>
+            </el-select>
+            <span class="create-reason" @click="createReason">新建</span>
+          </div>
+        </el-form-item>
+        <el-form-item
+          prop="detailReason"
+          :rules="{
+            required: true,
+            message: '详细原因不能为空',
+            trigger: 'blur',
+          }"
+        >
+          <el-input
+            v-model="pageState.labelForm.detailReason"
+            placeholder="请描述详细原因"
+            type="textarea"
+            style="width: 505px"
+            :rows="9"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div class="dialog-footer">
+        <el-button @click="isShow = false" class="dialog-footer-button"
+          >取消</el-button
+        >
+        <el-button
+          @click="save"
+          type="primary"
+          class="dialog-footer-button"
+          style="margin-left: 30px"
+          >确定</el-button
+        >
+      </div>
+    </div>
+  </el-dialog>
+  <el-dialog
+    v-model="pageState.createReasonShow"
+    @close="resetReasonForm"
+    :modal-append-to-body="false"
+    width="652px"
+    title="新建归因"
+  >
+    <div class="dialog-box">
+      <el-form :model="pageState.remarkForm" ref="confirmReasonRef">
+        <el-form-item
+          prop="AscribeContent"
+          :rules="{ required: true, message: '归因不能为空', trigger: 'blur' }"
+        >
+          <el-autocomplete
+            class="autocomplete-input"
+            v-model.trim="pageState.remarkForm.AscribeContent"
+            :fetch-suggestions="querySearch"
+            placeholder="请输入归因名称"
+          ></el-autocomplete>
+        </el-form-item>
+      </el-form>
+      <div class="dialog-footer">
+        <el-button
+          @click="pageState.createReasonShow = false"
+          class="dialog-footer-button"
+          >取消</el-button
+        >
+        <el-button
+          @click="saveReason"
+          type="primary"
+          class="dialog-footer-button"
+          style="margin-left: 30px"
+          >确定</el-button
+        >
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+<style lang="scss" scoped>
+.dialog-box {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: flex-start;
+  .create-reason {
+    cursor: pointer;
+    color: #409eff;
+    font-size: 14px;
+    margin-right: 20px;
+  }
+  .dialog-footer {
+    margin: 30px 0;
+    .dialog-footer-button {
+      height: 40px;
+      width: 120px;
+    }
+  }
+}
+</style>
+<style lang="scss">
+.autocomplete-input {
+  .el-input {
+    width: 505px;
+  }
+}
+</style>

+ 42 - 0
src/views/dataReport_manage/components/noRenewalReasonDia/viewRemark.vue

@@ -0,0 +1,42 @@
+<script setup>
+
+const props = defineProps({
+  tableData: {
+    type: Array,
+    default: () => []
+  }
+})
+const isShow = defineModel('isShow', { type: Boolean, default: false })
+
+</script>
+
+<template>
+  <el-dialog
+    v-model="isShow"
+    @close="isShow = false"
+    :modal-append-to-body="false"
+    width="652px"
+    title="历史备注"
+  >
+    <div class="dialog-box">
+      <el-table :data="props.tableData" border max-height="360">
+        <el-table-column label="备注信息" prop="Content" align="center">
+          <template #default="{ row }">
+            {{ row.Content }}
+          </template>
+        </el-table-column>
+        <el-table-column label="备注时间" prop="CreateTime" align="center">
+          <template #default="{ row }">
+            {{ row.CreateTime }}
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+  </el-dialog>
+</template>
+
+<style lang="scss" scoped>
+.dialog-box {
+  padding: 0 35px 20px;
+}
+</style>

+ 61 - 0
src/views/dataReport_manage/components/renewalListDia.vue

@@ -0,0 +1,61 @@
+<script setup>
+import { ref, watch } from 'vue'
+import { dataMainInterface } from '@/api/api.js'
+
+const props = defineProps({
+  rowInfo: {
+    type: Object,
+    default: null
+  },
+})
+
+const isShow = defineModel('isShow', { type: Boolean, default: false })
+const renewalList = ref([])
+
+async function getrenewalReasonList() {
+  try {
+    const res = await dataMainInterface.moreRenewReason(props.rowInfo)
+    if (res.Ret == 200) renewalList.value = res.Data || []
+  } catch (err) {
+    console.log(err);
+  }
+}
+
+watch(
+  () => isShow.value,
+  (val) => {
+    if (val) {
+      getrenewalReasonList()
+    } else {
+      renewalList.value = []
+    }
+  }
+)
+</script>
+
+<template>
+  <el-dialog
+    draggable
+    v-model="isShow"
+    @close="isShow = false"
+    :modal-append-to-body="false"
+    center
+    title="未续约说明"
+  >
+    <el-table :data="renewalList" border max-height="250">
+      <el-table-column label="最新情况" prop="RenewalReason" align="center" />
+      <el-table-column label="To Do 事项" prop="RenewalTodo" align="center" />
+      <el-table-column label="添加时间" prop="CreateTime" align="center" />
+      <el-table-column
+        label="超出到期时间(天)"
+        prop="ExpirationTimeExceeded"
+        align="center"
+      />
+    </el-table>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="isShow = false" type="primary">知道了</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>

+ 835 - 0
src/views/dataReport_manage/incrementalList.vue

@@ -0,0 +1,835 @@
+<script>
+import { defineComponent } from 'vue'
+export default defineComponent({
+  //进入前是否清除参数
+  beforeRouteEnter(to, from, next) {
+    if (from.path != '/customDetail') {
+      sessionStorage.removeItem('incrementBack')
+    }
+    next()
+  }
+})
+
+</script>
+<script setup>
+import { reactive, ref, computed, onMounted } from 'vue'
+import { incrementTableColums } from './configdata.js'
+import { dataMainInterface, customInterence } from '@/api/api.js'
+import mPage from '@/components/mPage.vue'
+import renewalListDia from './components/renewalListDia.vue'
+import addRemark from './components/noRenewalReasonDia/addRemark.vue'
+import viewRemark from './components/noRenewalReasonDia/viewRemark.vue'
+import confirmedNoRenewal from './components/noRenewalReasonDia/confirmedNoRenewal.vue'
+import moment from 'moment'
+import { onBeforeRouteLeave, useRouter } from 'vue-router'
+import { ElMessage } from 'element-plus'
+import { Search } from "@element-plus/icons-vue";
+import { formatTime } from '@/utils/date'
+
+const router = useRouter()
+
+const pageState = reactive({
+  searchVal: sessionStorage.getItem('incrementBack') ? JSON.parse(sessionStorage.getItem('incrementBack')).searchVal : '',
+  tableData: [],
+  isShowloadding: false,
+  start_date: '',
+  end_date: '',
+  /* 筛选条件 */
+  filterObj: {
+    month: '近1个月',
+    date: [],
+    type: '',
+    sale: '',
+    area: '',
+    data_type: '新增试用客户'
+  },
+  monthLabel: [
+    {
+      label: "近1个月"
+    },
+    {
+      label: "近2个月"
+    },
+    {
+      label: "近3个月"
+    }
+  ],
+  salesArr: [],//销售列表
+  defaultSalesProps: {
+    multiple: true,
+    label: 'RealName',
+    children: 'ChildrenList',
+    value: 'AdminId'
+  },//销售级联配置
+  typeArr: [
+    {
+      name: 'ficc'
+    }, {
+      name: '权益'
+    }
+  ],//类型
+  areaArr: ['国内', '海外'],
+  pageSize: 10,
+  page_no: sessionStorage.getItem('incrementBack') ? JSON.parse(sessionStorage.getItem('incrementBack')).page_no : 1,
+  total: 0,
+  data_typeArr: [
+    {
+      label: '新增试用客户'
+    },
+    {
+      label: '新签客户'
+    },
+    {
+      label: '续约客户'
+    },
+    {
+      label: '未续约客户'
+    },
+  ],//数据类型
+  TrialTotal: 0,//新增试用数
+  NewCompanyTotal: 0,//新签客户数
+  NotRenewalCompanyTotal: 0,//未续约客户数
+  RenewalCompanyTotal: 0,//续约客户数
+  isRenewalShow: false,	//未续约说明列表弹框是否显示
+  rowInfo: null,	// 未续约说明更多行信息
+  tabsList: [{ name: '试用', value: '试用' }, { name: '冻结/流失', value: '非试用' }],
+  tabsActiveName: '试用',
+  NotRenewalNotTryOut: 0,//冻结流失的人数
+  NotRenewalTryOut: 0,//试用的人数
+  isNotRenewedConfirm: 1,//未续约的是否已确认
+  noRenewalReasonList: [],
+  noRenewalReasonId: '',
+  selectItemRow: {},// 当前选中的row
+  // 添加备注
+  isAddRemarkShow: false,
+  //历史备注
+  isViewRemarkShow: false,
+  historyRemarkList: [],
+  //确认不续约
+  isConfirmNoRenewalShow: false,
+  confirmNoRenewalForm: {
+    reason: "",
+    detailReason: ""
+  }
+})
+const exportExcel = computed(() => {
+  let baseUrl = import.meta.env.VITE_APP_API_ROOT + "/statistic_report/incremental_company_list";
+  let token = localStorage.getItem("auth") || "";
+  let paramStr = "";
+  // 处理销售筛选
+  let salesArr = []
+  if (pageState.filterObj.sale.length) {
+    salesArr = pageState.filterObj.sale.map(item => {
+      return item[item.length - 1]
+    })
+  }
+  let obj = {
+    CompanyType: pageState.filterObj.type,
+    AdminId: salesArr.join(','),
+    RegionType: pageState.filterObj.area,
+    EndDate: pageState.end_date,
+    StartDate: pageState.start_date,
+    DataType: pageState.filterObj.data_type == '新增试用客户' ? '新增试用' : pageState.filterObj.data_type,
+    Keyword: pageState.searchVal,
+    IsExport: true,
+    IsConfirm: pageState.filterObj.data_type == '未续约客户' ? 1 : -1,
+    CompanyAscribeId: pageState.noRenewalReasonId
+  };
+  for (let key in obj) {
+    paramStr = `${paramStr}&${key}=${obj[key]}`;
+  }
+  return `${baseUrl}?${token}${paramStr}`;
+})
+const Role = computed(() => {
+  return localStorage.getItem('Role') || '';
+})
+//管理权限
+const ManageType = computed(() => {
+  return localStorage.getItem('ManageType') || '';
+})
+//确认未续约权限
+const canConfirmNotRenewed = computed(() => {
+  return ['admin', 'rai_admin'].includes(Role.value)
+})
+/* 页面跳转前记录参数 */
+onBeforeRouteLeave((to, form, next) => {
+  let backData = {
+    page_no: pageState.page_no,
+    end_date: pageState.end_date,
+    start_date: pageState.start_date,
+    filterObj: pageState.filterObj
+  }
+  sessionStorage.setItem('incrementBack', JSON.stringify(backData))
+  next()
+})
+
+function controlTableColumnShow(item) {
+  return !item.dataType ||
+    (item.dataType === pageState.filterObj.data_type &&
+      (!item.notRenewedConfirm || item.notRenewedConfirm == pageState.isNotRenewedConfirm)) // 已确认和待确认
+}
+// 搜索
+function handleSearch() {
+  if (!pageState.searchVal) {
+    pageState.page_no = 1
+    pageState.filterObj = {
+      month: '近1个月',
+      date: [],
+      type: '',
+      sale: '',
+      area: '',
+      data_type: pageState.filterObj.data_type
+    }
+    let date_before = moment().subtract(1, 'M').format("YYYY-MM-DD");
+    let date_now = moment().format("YYYY-MM-DD");
+    let date = [date_before, date_now]
+    pageState.start_date = date_before;
+    pageState.end_date = date_now;
+    pageState.filterObj.date = date;
+    getTableData()
+    return
+  }
+  pageState.page_no = 1
+  pageState.filterObj = {
+    month: '',
+    date: [],
+    type: '',
+    sale: '',
+    area: '',
+    data_type: pageState.filterObj.data_type
+  }
+  pageState.start_date = '';
+  pageState.end_date = '';
+  getTableData()
+}
+//tabs 的点击事件
+function tabsHandler(item) {
+  pageState.tabsActiveName = item.value;
+  pageState.noRenewalReasonId = ''
+  pageState.page_no = 1;
+  getTableData()
+}
+function notRenewedConfirmChange() {
+  pageState.tabsActiveName = '试用'
+  pageState.noRenewalReasonId = ''
+  pageState.page_no = 1;
+  getTableData()
+}
+/* 获取表格 */
+function getTableData() {
+  pageState.isShowloadding = true;
+  // 处理销售筛选
+  let salesArr = []
+  if (pageState.filterObj.sale.length) {
+    salesArr = pageState.filterObj.sale.map(item => {
+      return item[item.length - 1]
+    })
+  }
+  let params = {
+    Keyword: pageState.searchVal,
+    PageSize: pageState.pageSize,
+    CurrentIndex: pageState.page_no,
+    CompanyType: pageState.filterObj.type,
+    AdminId: salesArr.join(','),
+    RegionType: pageState.filterObj.area,
+    EndDate: pageState.end_date,
+    StartDate: pageState.start_date,
+    DataType: pageState.filterObj.data_type == '新增试用客户' ? '新增试用' : pageState.filterObj.data_type,
+    TryOutType: pageState.filterObj.data_type == '未续约客户' && pageState.isNotRenewedConfirm == 1 ? pageState.tabsActiveName : '',
+    IsConfirm: pageState.filterObj.data_type == '未续约客户' ? pageState.isNotRenewedConfirm : -1,
+    CompanyAscribeId: pageState.noRenewalReasonId
+  }
+  dataMainInterface.incrementalList(params).then(res => {
+    if (res.Ret === 200) {
+      pageState.tableData = res.Data.List || [];
+      pageState.total = res.Data.Paging.Totals;
+      pageState.TrialTotal = res.Data.TrialTotal;
+      pageState.NewCompanyTotal = res.Data.NewCompanyTotal;
+      pageState.RenewalCompanyTotal = res.Data.RenewalCompanyTotal;
+      pageState.NotRenewalCompanyTotal = res.Data.NotRenewalCompanyTotal;
+      pageState.NotRenewalTryOut = res.Data.NotRenewalTryOut
+      pageState.NotRenewalNotTryOut = res.Data.NotRenewalNotTryOut
+      pageState.isShowloadding = false;
+    }
+  })
+}
+/* 获取销售 */
+function getSale() {
+  customInterence.getSale().then(res => {
+    if (res.Ret === 200) {
+      pageState.salesArr = res.Data.List;
+    }
+  })
+}
+/* 切换月份 */
+function toggleMonth(label) {
+  pageState.filterObj.month = label;
+  let days = label == '近1个月' ? 1 : label == '近2个月' ? 2 : label == '近3个月' ? 3 : 0;
+  filterDate(days)
+}
+/* 选择服务日期 */
+function dateChange(e) {
+  if (e[0]) {
+    pageState.start_date = e[0];
+    pageState.end_date = e[1];
+  } else {
+    pageState.start_date = '';
+    pageState.end_date = '';
+  }
+  pageState.filterObj.month = '';
+  pageState.page_no = 1;
+  pageState.searchVal = ''
+  getTableData();
+}
+/* 切换数据类型 */
+function toggleType(label) {
+  pageState.filterObj.data_type = label;
+  pageState.noRenewalReasonId = ''
+  if (label == "未续约客户") {
+    getNORenewalReasonList()
+  }
+  pageState.tabsActiveName = '试用';
+  pageState.page_no = 1;
+  getTableData()
+}
+/* 筛选改变时 */
+function changeFilter() {
+  pageState.page_no = 1;
+  pageState.searchVal = ''
+  getTableData()
+}
+/* 切换页码 */
+function handleCurrentChange(page) {
+  pageState.page_no = page;
+  getTableData()
+}
+/* 获取近几个月的日期范围 */
+function filterDate(month) {
+  if (month) {
+    let date_before = moment().subtract(month, 'M').format("YYYY-MM-DD");
+    let date_now = moment().format("YYYY-MM-DD");
+    let date = [date_before, date_now]
+    pageState.start_date = date_before;
+    pageState.end_date = date_now;
+    pageState.filterObj.date = date;
+    pageState.page_no = 1;
+    pageState.searchVal = ''
+    getTableData();
+  }
+}
+/* 跳转 */
+function jumpHandle(row, item) {
+  if (item.link) {
+    router.push({
+      path: '/customDetail',
+      query: {
+        id: row.CompanyId
+      }
+    })
+  }
+}
+function getNORenewalReasonList() {
+  dataMainInterface.getAscribList().then(res => {
+    if (res.Ret == 200) {
+      pageState.noRenewalReasonList = res.Data.List || []
+    }
+  })
+}
+// 未续约说明更多按钮
+function renewalReasonMore(row) {
+  pageState.rowInfo = {
+    CompanyId: row.CompanyId,
+    ProductId: row.ProductId
+  }
+  pageState.isRenewalShow = true
+}
+// 添加备注
+function addRemarkFun(row) {
+  pageState.selectItemRow = row
+  pageState.isAddRemarkShow = true
+}
+// 添加备注 保存
+function saveRemark(remark) {
+  // console.log(remark);
+  let params = {
+    CompanyId: pageState.selectItemRow.CompanyId,
+    ProductId: pageState.selectItemRow.ProductId,
+    Content: remark
+  }
+  dataMainInterface.addNotRenewedRemark(params).then(res => {
+    if (res.Ret == 200) {
+      ElMessage.success("添加成功")
+      getTableData()
+      pageState.isAddRemarkShow = false
+      pageState.selectItemRow = {}
+    }
+  })
+}
+// 查看历史备注
+function viewHistoryRemarkFun(row) {
+  dataMainInterface.getNotRenewedRemarkList({ CompanyId: row.CompanyId, ProductId: row.ProductId })
+    .then(res => {
+      if (res.Ret == 200) {
+        pageState.historyRemarkList = res.Data.List || []
+        pageState.isViewRemarkShow = true
+      }
+    })
+}
+function confirmedNoRenewalFun(row) {
+  pageState.confirmNoRenewalForm.reason = ""
+  pageState.confirmNoRenewalForm.detailReason = ""
+  pageState.selectItemRow = row
+  pageState.isConfirmNoRenewalShow = true
+}
+function editReasonLabel(row) {
+  dataMainInterface.infoNoRenewedAscribe({ CompanyId: row.CompanyId, ProductId: row.ProductId })
+    .then(res => {
+      if (res.Ret == 200) {
+        pageState.confirmNoRenewalForm.reason = res.Data.Detail ? res.Data.Detail.CompanyAscribeId || "" : ""
+        pageState.confirmNoRenewalForm.detailReason = res.Data.Detail ? res.Data.Detail.Content || "" : ""
+        pageState.selectItemRow = row
+        pageState.isConfirmNoRenewalShow = true
+      }
+    })
+}
+function saveLabel(item) {
+  let params = {
+    CompanyId: pageState.selectItemRow.CompanyId,
+    ProductId: pageState.selectItemRow.ProductId,
+    CompanyAscribeId: item.CompanyAscribeId,
+    Content: item.Content
+  }
+  dataMainInterface.addNoRenewedAscribe(params).then(res => {
+    if (res.Ret == 200) {
+      ElMessage.success("确认成功")
+      pageState.isConfirmNoRenewalShow = false
+      pageState.selectItemRow = {}
+      getTableData()
+    }
+  })
+}
+
+onMounted(() => {
+  getSale();
+  if (sessionStorage.getItem('incrementBack')) {
+    let backData = JSON.parse(sessionStorage.getItem('incrementBack'));
+    pageState.page_no = backData.page_no
+    pageState.end_date = backData.end_date
+    pageState.start_date = backData.start_date
+    pageState.filterObj = backData.filterObj
+    pageState.searchVal = backData.searchVal
+  }
+  /* 默认选中近1个月 */
+  filterDate(pageState.filterObj.month === '近1个月' ? 1 : pageState.filterObj.month === '近2个月' ? 2 : pageState.filterObj.month === '近3个月' ? 3 : 0);
+})
+
+
+
+</script>
+
+<template>
+  <div class="dataReport-container" id="dataReport-container">
+    <div class="dataReport-top">
+      <a :href="exportExcel" download>
+        <button class="button-sty act">导出EXCEL</button>
+      </a>
+      <button
+        :class="[
+          'button-sty',
+          { act: pageState.filterObj.month === item.label },
+        ]"
+        v-for="item in pageState.monthLabel"
+        @click="toggleMonth(item.label)"
+        :key="item.label"
+      >
+        {{ item.label }}
+      </button>
+      <el-date-picker
+        style="max-width: 300px"
+        v-model="pageState.filterObj.date"
+        type="daterange"
+        range
+        value-format="YYYY-MM-DD"
+        placeholder="自定义时间段"
+        :clearable="false"
+        :editable="false"
+        @change="dateChange"
+      />
+      <el-input
+        placeholder="请输入客户名称"
+        v-model="pageState.searchVal"
+        style="max-width: 400px; margin-left: auto"
+        @input="handleSearch"
+        clearable
+        :prefix-icon="Search"
+      >
+      </el-input>
+    </div>
+    <div class="dataReport-main">
+      <div class="main-top">
+        <el-cascader
+          v-if="
+            Role == 'finance' ||
+            Role == 'admin' ||
+            Role == 'ficc_admin' ||
+            Role == 'rai_admin' ||
+            ManageType != 0
+          "
+          v-model="pageState.filterObj.sale"
+          placeholder="请选择销售"
+          style="min-width: 250px; margin-right: 10px; margin-bottom: 8px"
+          :options="pageState.salesArr"
+          :props="pageState.defaultSalesProps"
+          :show-all-levels="false"
+          collapse-tags
+          clearable
+          filterable
+          @change="changeFilter"
+        >
+        </el-cascader>
+        <el-select
+          v-model="pageState.filterObj.type"
+          placeholder="请选择客户类型"
+          style="width: 150px; margin-right: 10px; margin-bottom: 8px"
+          v-if="Role == 'finance' || Role == 'admin'"
+          clearable
+          @change="changeFilter"
+        >
+          <el-option
+            v-for="item in pageState.typeArr"
+            :key="item"
+            :label="item.name"
+            :value="item.name"
+          >
+          </el-option>
+        </el-select>
+        <el-select
+          v-model="pageState.filterObj.area"
+          placeholder="请选择所属区域"
+          style="width: 150px; margin-right: 10px; margin-bottom: 8px"
+          clearable
+          @change="changeFilter"
+        >
+          <el-option
+            v-for="item in pageState.areaArr"
+            :key="item"
+            :label="item"
+            :value="item"
+          >
+          </el-option>
+        </el-select>
+      </div>
+      <div class="main-section">
+        <el-row :gutter="36">
+          <el-col
+            :span="6"
+            v-for="item in pageState.data_typeArr"
+            :key="item.label"
+          >
+            <el-card
+              :class="[
+                'base-card',
+                { 'main-card': pageState.filterObj.data_type === item.label },
+              ]"
+              shadow="hover"
+              @click="toggleType(item.label)"
+            >
+              <template #header>
+                <div class="clearfix">
+                  <span>
+                    {{ item.label }}数
+                    <el-tooltip
+                      class="item"
+                      effect="dark"
+                      :content="
+                        item.label === '新增试用客户'
+                          ? '新建试用客户的时间或跨部门领取的时间,包含在所选时间段内的客户数'
+                          : item.label === '新签客户'
+                          ? '新签合同的起始日期包含在所选时间段内的客户'
+                          : item.label === '续约客户'
+                          ? '续约合同的起始日期包含在所选时间段内且不包含在新签合同存续期内的客户'
+                          : '筛选时间段内有过正式转试用记录,且当前为非正式、非永续状态的客户'
+                      "
+                      placement="top"
+                    >
+                      <i class="el-icon-info"></i>
+                    </el-tooltip>
+                  </span>
+                </div>
+              </template>
+
+              <div class="card-cont">
+                {{
+                  item.label === "新增试用客户"
+                    ? pageState.TrialTotal
+                    : item.label === "新签客户"
+                    ? pageState.NewCompanyTotal
+                    : item.label === "续约客户"
+                    ? pageState.RenewalCompanyTotal
+                    : item.label === "未续约客户"
+                    ? pageState.NotRenewalCompanyTotal
+                    : ""
+                }}
+              </div>
+            </el-card>
+          </el-col>
+        </el-row>
+      </div>
+      <div
+        class="tabs-box"
+        v-if="pageState.filterObj.data_type == '未续约客户'"
+      >
+        <el-radio-group
+          v-model="pageState.isNotRenewedConfirm"
+          class="tabs-box-confirm"
+          @change="notRenewedConfirmChange"
+        >
+          <el-radio-button :label="1">已确认</el-radio-button>
+          <div class="center-line"></div>
+          <el-radio-button :label="0">待确认</el-radio-button>
+        </el-radio-group>
+        <div class="tabs-box-status" v-show="pageState.isNotRenewedConfirm">
+          <el-select
+            v-model="pageState.noRenewalReasonId"
+            placeholder="请选择不续约归因"
+            clearable
+            @change="getTableData"
+            style="width: 240px; margin-right: 50px"
+          >
+            <el-option
+              :label="item.AscribeContent"
+              :value="item.CompanyAscribeId"
+              v-for="item in pageState.noRenewalReasonList"
+              :key="item.reasonId"
+            ></el-option>
+          </el-select>
+          <span
+            @click="tabsHandler(item)"
+            :class="pageState.tabsActiveName === item.value ? 'active' : ''"
+            v-for="item in pageState.tabsList"
+            :key="item"
+          >
+            {{ item.name }}({{
+              item.name === "试用"
+                ? pageState.NotRenewalTryOut
+                : pageState.NotRenewalNotTryOut
+            }})
+          </span>
+        </div>
+      </div>
+      <el-table
+        :data="pageState.tableData"
+        border
+        style="margin-top: 20px; min-height: 400px"
+        v-loading="pageState.isShowloadding"
+        element-loading-text="数据加载中..."
+      >
+        <template v-for="item in incrementTableColums">
+          <el-table-column
+            :key="item.label"
+            :label="item.label"
+            :width="item.widthsty"
+            align="center"
+            v-if="controlTableColumnShow(item)"
+          >
+            <template #default="scope">
+              <span
+                :style="item.textsty"
+                @click="jumpHandle(scope.row, item)"
+                v-if="
+                  item.key === 'CreateTime' ||
+                  item.key === 'StartDate' ||
+                  item.key === 'EndDate'
+                "
+              >
+                {{ formatTime(scope.row[item.key]) }}
+              </span>
+              <span v-else-if="item.label == '未续约说明'">
+                <span style="display: block" v-if="scope.row[item.key]"
+                  >最新情况:{{ scope.row[item.key] }}</span
+                >
+                <span v-if="scope.row.RenewalTodo"
+                  >To Do 事项:{{ scope.row.RenewalTodo }}</span
+                >
+                <span
+                  v-if="scope.row[item.key] || scope.row.RenewalTodo"
+                  style="color: #409eff; cursor: pointer"
+                  @click="renewalReasonMore(scope.row)"
+                  >&emsp;更多>></span
+                >
+              </span>
+              <div v-else-if="item.key == 'CompanyName'" style="padding: 4px 0">
+                <span
+                  :style="item.textsty"
+                  @click="jumpHandle(scope.row, item)"
+                >
+                  {{ scope.row[item.key] }}
+                </span>
+                <div
+                  class="package-difference"
+                  v-if="scope.row.PackageDifference"
+                >
+                  {{ scope.row.PackageDifference }}
+                </div>
+              </div>
+              <div v-else-if="item.key === 'Remark'" class="remark-row">
+                <span
+                  class="remark-text"
+                  @click="viewHistoryRemarkFun(scope.row)"
+                  v-if="scope.row.IsShowNoRenewedNote"
+                  >...</span
+                >
+                <span
+                  class="operation-button"
+                  v-show="
+                    pageState.canConfirmNotRenewed &&
+                    !pageState.isNotRenewedConfirm
+                  "
+                  style="margin-right: 0"
+                  @click="addRemarkFun(scope.row)"
+                  >添加</span
+                >
+              </div>
+              <div v-else-if="item.key == 'AscribeContent'">
+                <span
+                  style="color: #409eff; cursor: pointer"
+                  @click="editReasonLabel(scope.row)"
+                >
+                  {{ scope.row[item.key] }}
+                </span>
+              </div>
+              <span
+                v-else
+                :style="item.textsty"
+                @click="jumpHandle(scope.row, item)"
+              >
+                {{ scope.row[item.key] }}
+              </span>
+            </template>
+          </el-table-column>
+        </template>
+        <el-table-column
+          label="操作"
+          width="180px"
+          align="center"
+          v-if="
+            pageState.canConfirmNotRenewed &&
+            !pageState.isNotRenewedConfirm &&
+            pageState.filterObj.data_type == '未续约客户'
+          "
+        >
+          <template #default="scope">
+            <div class="operation-row">
+              <span
+                class="operation-button"
+                @click="confirmedNoRenewalFun(scope.row)"
+                >确认不续约</span
+              >
+            </div>
+          </template>
+        </el-table-column>
+        <template #empty>
+          <div style="line-height: 44px; margin: 60px 0; color: #999">
+            <img
+              src="~@/assets/img/cus_m/nodata.png"
+              alt=""
+              style="display: block; width: 160px; height: 128px; margin: auto"
+            />
+            <span>暂无数据</span>
+          </div>
+        </template>
+      </el-table>
+      <el-col :span="24" class="toolbar" v-if="pageState.total">
+        <m-page
+          :total="pageState.total"
+          :page_no="pageState.page_no"
+          @handleCurrentChange="handleCurrentChange"
+        />
+      </el-col>
+    </div>
+    <!-- 未续约说明列表弹窗 -->
+    <renewalListDia
+      v-model:isShow="pageState.isRenewalShow"
+      :rowInfo="pageState.rowInfo"
+    />
+    <!-- 添加备注弹窗 -->
+    <addRemark
+      v-model:isShow="pageState.isAddRemarkShow"
+      @saveRemark="saveRemark"
+    />
+    <!-- 历史备注弹窗 -->
+    <viewRemark
+      v-model:isShow="pageState.isViewRemarkShow"
+      :tableData="pageState.historyRemarkList"
+    />
+    <!-- 确认不续约弹窗 -->
+    <confirmedNoRenewal
+      v-model:isShow="pageState.isConfirmNoRenewalShow"
+      :dataForm="pageState.confirmNoRenewalForm"
+      :noRenewalReasonList="pageState.noRenewalReasonList"
+      @refreshReasonList="getNORenewalReasonList"
+      @saveLabel="saveLabel"
+    />
+  </div>
+</template>
+
+<style lang='scss' scoped>
+@import "./index.scss";
+.tabs-box {
+  flex-direction: column;
+  .tabs-box-confirm {
+    display: flex;
+    align-items: center;
+    margin-bottom: 20px;
+    .center-line {
+      width: 1px;
+      height: 21px;
+      background-color: #333333;
+      margin: 0 20px;
+    }
+  }
+}
+.operation-button {
+  color: #409eff;
+  cursor: pointer;
+  font-size: 14px;
+  margin-right: 10px;
+}
+.remark-row {
+  display: flex;
+  justify-content: center;
+  .remark-text {
+    width: 18px;
+    height: 18px;
+    margin-right: 8px;
+    font-size: 18px;
+    color: #409eff;
+    cursor: pointer;
+  }
+}
+.operation-row {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-wrap: wrap;
+  .operation-button {
+    &:last-child {
+      margin-right: 0;
+    }
+  }
+}
+</style>
+<style lang="scss">
+#dataReport-container {
+  .tabs-box {
+    .el-radio-button {
+      margin-right: 0;
+    }
+    .el-radio-button .el-radio-button__inner {
+      border: none;
+      width: 120px;
+      border-radius: 4px;
+    }
+  }
+}
+</style>