瀏覽代碼

Merge branch 'cpq-dev' of wangfan/adweb3-web into master

chenpeiqing 6 天之前
父節點
當前提交
c95a58c7ad

+ 6 - 5
src/views/adweb/enquiry/AdwebEnquiry.data.ts

@@ -1,5 +1,6 @@
 import { BasicColumn, FormSchema } from '/@/components/Table';
 import { rules } from '@/utils/helper/validator';
+
 //列表数据
 export const columns: BasicColumn[] = [
   {
@@ -85,11 +86,11 @@ export const columns: BasicColumn[] = [
     align: 'center',
     dataIndex: 'userEffective',
   },
-  // {
-  //   title: '询盘审核进度',
-  //   align: 'center',
-  //   dataIndex: 'verifyProgress',
-  // },
+  {
+    title: '询盘审核进度',
+    align: 'center',
+    dataIndex: 'verifyProgress',
+  },
   {
     title: '来源国家',
     align: 'left',

+ 83 - 100
src/views/adweb/enquiry/AdwebEnquiryList.vue

@@ -85,7 +85,7 @@
     </a-row>
 
     <!--引用表格-->
-    <BasicTable @register="registerTable" :rowSelection="rowSelection">
+    <BasicTable @register="registerTable" :rowSelection="rowSelection" :columns="enquiryColumns">
       <template #alertAfter>
         <a-divider type="vertical" />
         <a @click="enquiryReady">标为已读</a>
@@ -214,7 +214,9 @@
 
         <!-- 审核进度条-->
         <div v-if="column.dataIndex == 'verifyProgress'">
-          <a-progress :size="10" :showInfo="true" :percent="50" />
+          <a @click="handleProcess(record, 'enquiry')">
+            <a-progress :size="10" :showInfo="true" :percent="text" />
+          </a>
         </div>
       </template>
     </BasicTable>
@@ -250,6 +252,8 @@
 
     <!--站点访问记录-->
     <enquiry-track ref="enquiryTrackRef" />
+
+    <enquiry-verify-process ref="enquiryVerifyProcessRef" @reload="reload" />
   </div>
 </template>
 
@@ -264,7 +268,7 @@
   import { BasicTable } from '/@/components/Table';
   import { useListPage } from '/@/hooks/system/useListPage';
   import { columns } from './AdwebEnquiry.data';
-  import { batchDelete, deleteOne, getExportUrl, getImportUrl, list } from './AdwebEnquiry.api';
+  import { batchDelete, getExportUrl, getImportUrl, list } from './AdwebEnquiry.api';
   import AdwebEnquiryModal from './components/AdwebEnquiryModal.vue';
   import { useUserStore } from '/@/store/modules/user';
   import { getAction, postAction } from '@/api/manage/manage';
@@ -278,6 +282,8 @@
   import { RoleEnum } from '@/enums/roleEnum';
   import dayjs, { Dayjs } from 'dayjs';
   import EnquiryTrack from '@/views/adweb/enquiry/modules/enquiryTrack.vue';
+  import EnquiryVerifyProcess from '@/views/adweb/enquiry/modules/enquiryVerifyProcess.vue';
+  import { getSubscribePlan } from '@/views/adweb/site/AdwebSite.api';
 
   const dateFormat = 'YYYY-MM-DD';
   type RangeValue = [Dayjs, Dayjs];
@@ -294,47 +300,6 @@
   const registerModal = ref();
   const selectSiteRef = ref(null);
   const { createMessage } = useMessage();
-  //注册table数据
-  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
-    tableProps: {
-      title: '询盘信息',
-      api: list,
-      columns,
-      canResize: false,
-      useSearchForm: false,
-      actionColumn: {
-        width: 180,
-        maxWidth: 220,
-        minWidth: 180,
-        fixed: 'right',
-      },
-      striped: true,
-      bordered: false,
-      immediate: false, // 不直接触发,通过reload事件触发接口
-      beforeFetch: (params) => {
-        //  如果查询条件中没有设置状态,则默认查出所有状态数据
-        if (queryParam.userEffective == undefined) {
-          queryParam.userEffective = '1,2';
-        }
-
-        return Object.assign(params, queryParam);
-      },
-    },
-    exportConfig: {
-      name: '询盘列表',
-      url: getExportUrl,
-      params: queryParam,
-    },
-    importConfig: {
-      url: getImportUrl,
-      success: handleSuccess,
-    },
-  });
-  const [
-    registerTable,
-    { reload, clearSelectedRowKeys, updateTableDataRecord, findTableDataRecord, getDataSource },
-    { rowSelection, selectedRowKeys },
-  ] = tableContext;
 
   // 询盘数量
   const enquiryNums = ref({
@@ -344,6 +309,7 @@
     wait: 0,
   });
 
+  const enquiryVerifyProcessRef = ref();
   // 子账号列表
   let subAccountOptions = ref([{ id: '', username: '' }]);
 
@@ -359,7 +325,7 @@
   // 选中跟进人
   let selectedUserId = ref<any>(undefined);
 
-  let userEffectiveOption = ref<[]>([]);
+  let userEffectiveOption = ref([]);
 
   // 当前用户角色
   const userRole = ref('');
@@ -390,6 +356,50 @@
   // 访问记录
   const enquiryTrackRef = ref();
 
+  const isSpecialSubscribePlan = ref(false);
+
+  const enquiryColumns = ref<any>(columns);
+  //注册table数据
+  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
+    tableProps: {
+      title: '询盘信息',
+      api: list,
+      canResize: false,
+      useSearchForm: false,
+      actionColumn: {
+        width: 180,
+        maxWidth: 220,
+        minWidth: 180,
+        fixed: 'right',
+      },
+      striped: true,
+      bordered: false,
+      immediate: false, // 不直接触发,通过reload事件触发接口
+      beforeFetch: (params) => {
+        //  如果查询条件中没有设置状态,则默认查出所有状态数据
+        if (queryParam.userEffective == undefined) {
+          queryParam.userEffective = '1,2';
+        }
+
+        return Object.assign(params, queryParam);
+      },
+    },
+    exportConfig: {
+      name: '询盘列表',
+      url: getExportUrl,
+      params: queryParam,
+    },
+    importConfig: {
+      url: getImportUrl,
+      success: handleSuccess,
+    },
+  });
+  const [
+    registerTable,
+    { reload, clearSelectedRowKeys, updateTableDataRecord, findTableDataRecord, getDataSource },
+    { rowSelection, selectedRowKeys },
+  ] = tableContext;
+
   onBeforeMount(() => {
     siteCode.value = localStorage.getItem('siteCode');
     getTurnInquiryCode();
@@ -399,13 +409,27 @@
   onMounted(async () => {
     userRole.value = useUserStore().userInfo?.roles.join(',');
 
-    console.log(useUserStore().userInfo?.roles.join(','), 'useUserStore().roleList');
-    getEffectiveList();
+    // console.log(useUserStore().userInfo?.roles.join(','), 'useUserStore().roleList');
+    // getEffectiveList();
   });
 
   function getSiteList(selectedSiteInfo: any) {
     queryParam.siteId = selectedSiteInfo.id;
 
+    // 判断当前站点是否属于苏豪通全托管套餐,如果是,则显示审核进度列,否则不显示
+    getSubscribePlan().then((res) => {
+      // 根据接口返回结果判断是否隐藏敏感信息列
+      if (res.planName !== '苏豪通全托管') {
+        enquiryColumns.value = enquiryColumns.value.filter((col) => col.dataIndex !== 'verifyProgress');
+      } else {
+        // 显示敏感信息列
+        enquiryColumns.value = columns;
+        isSpecialSubscribePlan.value = true;
+      }
+
+      getEffectiveList();
+    });
+
     getTableAndNum(true);
   }
 
@@ -632,6 +656,11 @@
       .then(function (res) {
         if (res.code == 200) {
           userEffectiveOption.value = JSON.parse(res.result);
+
+          // 针对苏豪全托管套餐,隐藏直接设置有效询盘
+          if (isSpecialSubscribePlan.value) {
+            userEffectiveOption.value = userEffectiveOption.value.filter((item) => item.value !== '1');
+          }
         } else {
           createMessage.error('获取询盘分类失败!');
         }
@@ -792,29 +821,6 @@
   }
 
   /**
-   * 编辑事件
-   */
-  function handleEdit(record: Recordable) {
-    registerModal.value.disableSubmit = false;
-    registerModal.value.edit(record);
-  }
-
-  /**
-   * 详情
-   */
-  function handleDetail(record: Recordable) {
-    registerModal.value.disableSubmit = true;
-    registerModal.value.edit(record);
-  }
-
-  /**
-   * 删除事件
-   */
-  async function handleDelete(record) {
-    await deleteOne({ id: record.id }, handleSuccess);
-  }
-
-  /**
    * 批量删除事件
    */
   async function batchHandleDelete() {
@@ -828,36 +834,13 @@
     (selectedRowKeys.value = []) && reload();
   }
 
-  /**
-   * 操作栏
-   */
-  function getTableAction(record) {
-    return [
-      {
-        label: '编辑',
-        onClick: handleEdit.bind(null, record),
-      },
-    ];
-  }
-
-  /**
-   * 下拉操作栏
-   */
-  function getDropDownAction(record) {
-    return [
-      {
-        label: '详情',
-        onClick: handleDetail.bind(null, record),
-      },
-      {
-        label: '删除',
-        popConfirm: {
-          title: '是否确认删除',
-          confirm: handleDelete.bind(null, record),
-          placement: 'topLeft',
-        },
-      },
-    ];
+  function handleProcess(record, type) {
+    if (record.userEffective == 1 && record.verifyNum == null) {
+      createMessage.warning('该询盘是历史有效询盘!');
+      return;
+    } else {
+      enquiryVerifyProcessRef.value.init(record, type);
+    }
   }
 
   /**

+ 1 - 1
src/views/adweb/enquiry/AdwebEnquiryVerifyFlow.vue

@@ -13,7 +13,7 @@
   onMounted(() => {
     nextTick(() => {
       processEditRef.value.onClose();
-      processEditRef.value.init({}, 'build');
+      processEditRef.value.init({}, 'enquiry');
     });
   });
 </script>

+ 21 - 16
src/views/adweb/enquiry/AdwebWasteEnquiryList.vue

@@ -211,7 +211,7 @@
   import { nextTick, onBeforeMount, onMounted, reactive, ref } from 'vue';
   import { BasicTable } from '/@/components/Table';
   import { useListPage } from '/@/hooks/system/useListPage';
-  import { wasteColumns } from './AdwebEnquiry.data';
+  import { columns, wasteColumns } from './AdwebEnquiry.data';
   import { batchDelete, getExportUrl, getImportUrl, list } from './AdwebEnquiry.api';
   import AdwebEnquiryModal from './components/AdwebEnquiryModal.vue';
   import { useUserStore } from '/@/store/modules/user';
@@ -227,6 +227,7 @@
   import blackList from '@/views/adweb/enquiry/modules/blackList.vue';
   import enquiryTrackRecord from '@/views/adweb/enquiry/modules/enquiryTrackRecord.vue';
   import EnquiryTrack from '@/views/adweb/enquiry/modules/enquiryTrack.vue';
+  import { getSubscribePlan } from '@/views/adweb/site/AdwebSite.api';
 
   const dateFormat = 'YYYY-MM-DD';
   type RangeValue = [Dayjs, Dayjs];
@@ -281,19 +282,6 @@
     { rowSelection, selectedRowKeys },
   ] = tableContext;
 
-  // const labelCol = reactive({
-  //   xs: 24,
-  //   sm: 4,
-  //   xl: 6,
-  //   xxl: 4,
-  // });
-  // const wrapperCol = reactive({
-  //   xs: 24,
-  //   sm: 20,
-  // });
-  //
-  // let siteCode: string | null = ref('');
-
   // 站点列表
   let siteList = ref([{ id: '', code: '' }]);
 
@@ -320,13 +308,15 @@
   // 选中跟进人
   let selectedUserId = ref<any>(undefined);
 
-  let userEffectiveOption = ref<[]>([]);
+  let userEffectiveOption = ref([]);
 
   // 当前用户角色
   const userRole = ref<any>([]);
 
   // 已经选择的站点code
   const siteCode = ref<any>('');
+  // 是否是苏豪全托管套餐
+  const isSpecialSubscribePlan = ref(false);
 
   const isForwardSite = ref<boolean>(false);
 
@@ -360,12 +350,22 @@
 
   onMounted(async () => {
     userRole.value = userStore.getRoleList;
-    getEffectiveList();
+    // getEffectiveList();
   });
 
   function getSiteList(selectedSiteInfo: any) {
     queryParam.siteId = selectedSiteInfo.id;
 
+    // 判断当前站点是否属于苏豪通全托管套餐,如果是,则显示审核进度列,否则不显示
+    getSubscribePlan().then((res) => {
+      // 根据接口返回结果判断是否隐藏敏感信息列
+      if (res.planName === '苏豪通全托管') {
+        isSpecialSubscribePlan.value = true;
+      }
+
+      getEffectiveList();
+    });
+
     getTableAndNum(true);
   }
   function filterStatus(value: number) {
@@ -548,6 +548,11 @@
       .then(function (res) {
         if (res.code == 200) {
           userEffectiveOption.value = JSON.parse(res.result);
+
+          // 针对苏豪全托管套餐,隐藏直接设置有效询盘
+          if (isSpecialSubscribePlan.value) {
+            userEffectiveOption.value = userEffectiveOption.value.filter((item) => item.value !== '1');
+          }
         } else {
           createMessage.error('获取询盘分类失败!');
         }

+ 0 - 1
src/views/adweb/enquiry/modules/enquiryDetail.vue

@@ -240,7 +240,6 @@ v-if="edition === 1" :href="record.fromPage.substring(record.fromPage.indexOf('h
       onChangeUserEffect(e){
         let that = this
 
-        console.log(e.target.value, "e.target.valuee.target.value");
         if(e.target.value === 0){
           that.wasteEnquiryVisible = true
         }else{

+ 252 - 0
src/views/adweb/enquiry/modules/enquiryVerifyProcess.vue

@@ -0,0 +1,252 @@
+<template>
+  <a-drawer :title="title" placement="right" :closable="true" :visible="visible" @close="onClose" destroyOnClose :width="600">
+    <a-spin :spinning="loading">
+      <a-steps :current="current" direction="vertical" class="self_step">
+        <a-step v-for="(item, index) in stepData" :key="index">
+          <template #title>
+            <div v-if="item.status == 1" style="width: 100%; line-height: 21px">
+              <span>{{ item.name }}</span>
+              <a-button
+                style="margin-left: 16px"
+                ghost
+                disabled
+                v-if="!isCustomer"
+                type="primary"
+                size="small"
+                @click="finishOrRollbackStep(item.id, 0, null, item.nodeType, item.description)"
+              >
+                撤销
+              </a-button>
+
+              <span style="margin-left: 40px">{{ item.finTime }}</span>
+            </div>
+
+            <div style="margin: 2.5px 0" v-if="item.finName !== null">
+              <span>审核人: {{ item.finName }}</span>
+            </div>
+
+            <div style="width: 100%; line-height: 21px" v-else-if="index === current">
+              <span :style="{ color: 'blue' }">{{ item.name }}</span>
+              <a-button
+                style="margin-left: 16px"
+                v-if="showFinBtn && !isCustomer"
+                ghost
+                type="primary"
+                size="small"
+                @click="finishOrRollbackStep(item.id, 1, item.finTime, item.nodeType, item.description)"
+              >
+                完成
+              </a-button>
+              {{ item.finTime }}
+            </div>
+            <div style="width: 100%; line-height: 21px" v-else>
+              <span :style="{ color: '#606266' }">{{ item.name }}</span>
+              <a-button
+                style="margin-left: 16px"
+                v-if="showFinBtn && !isCustomer"
+                ghost
+                type="primary"
+                size="small"
+                @click="finishOrRollbackStep(item.id, 1, item.finTime, item.nodeType, item.description)"
+                >完成</a-button
+              >
+            </div>
+          </template>
+          <template #description>
+            <div style="margin: 2.5px 0" v-if="item.timeDesc !== null">{{ item.timeDesc }}</div>
+            <div style="margin: 2.5px 0" v-if="item.status == 1">
+              <a-textarea v-model:value="item.description" disabled="disabled" :rows="8" placeholder="请输入审核日志记录" />
+            </div>
+            <div style="margin: 2.5px 0" v-if="item.status == 0">
+              <a-textarea v-model:value="item.description" :rows="8" placeholder="请输入审核日志记录" />
+            </div>
+          </template>
+        </a-step>
+      </a-steps>
+    </a-spin>
+  </a-drawer>
+</template>
+
+<script lang="ts" setup>
+  import '/@/assets/less/common.less';
+  import { getAction, postAction } from '/@/api/manage/manage';
+  import { computed, reactive, ref } from 'vue';
+  import { useMessage } from '@/hooks/web/useMessage';
+  import { RoleEnum } from '@/enums/roleEnum';
+  import { useUserStore } from '@/store/modules/user';
+  const userStore = useUserStore();
+  const visible = ref(false);
+  const title = ref('询盘审核流程');
+  const url = ref('');
+  const current = ref(0);
+  let stepData = ref([{ id: '', status: 0, name: '未提交', description: '未提交', nodeType: 4, finName: '', finTime: '', timeDesc: '', finUid: '' }]);
+  let record = reactive({});
+  const showFinBtn = ref(false);
+  const isCustomer = ref(false);
+  // const finishTime = ref('');
+  // const dateFormat = 'YYYY-MM-DD HH:mm:ss';
+
+  const loading = ref(false);
+  const emit = defineEmits(['close', 'reload']);
+  const { createMessage } = useMessage();
+
+  const isAdmin = computed(() => {
+    return (
+      userStore.getRoleList.includes(RoleEnum.ADMIN) ||
+      userStore.getRoleList.includes(RoleEnum.ADWEB_ADMIN) ||
+      userStore.getRoleList.includes(RoleEnum.SEO_ADMIN) ||
+      userStore.getRoleList.includes(RoleEnum.ADWEB_SITE_MANAGER) ||
+      userStore.getRoleList.includes(RoleEnum.ADWEB_SEO_MANAGER) ||
+      userStore.getRoleList.includes(RoleEnum.ADWEB_CHANNEL_ADMIN)
+    );
+  });
+
+  const enquiryMaster = ref(false);
+
+  // 判断询盘所有者是否已经审核过该询盘
+  const enquiryMasterHasBeenVerify = ref(false);
+
+  function init(r, t) {
+    record = r;
+    visible.value = true;
+    if (t === 'seo') {
+      url.value = '/adweb/executeNode/querySEOFlow?siteCode=' + r.code + '&historyId=' + r.historyId;
+    } else if (t === 'enquiry') {
+      url.value = '/adweb/executeNode/queryEnquiryVerifyFlow?enquiryId=' + r.id;
+    } else {
+      url.value = '/adweb/executeNode/querySiteBuildFlow?siteCode=' + r.code;
+    }
+    showStep();
+
+    // 判断当前询盘是否属于当前登录用户
+    if (r.uid == userStore.userInfo?.id) {
+      enquiryMaster.value = true;
+    }
+  }
+  function onClose() {
+    emit('close');
+    closeStep();
+  }
+  function showStep() {
+    stepData.value = [];
+
+    loading.value = true;
+    getAction(url.value, {})
+      .then((res) => {
+        loading.value = false;
+        if (res.code === 200) {
+          stepData.value = res.result;
+          // 当前步骤
+          for (let i = 0; i < res.result.length; i++) {
+            if (res.result[i].status === 0) {
+              current.value = i;
+              showFinBtn.value = true;
+              return;
+            }
+          }
+
+          current.value = res.result.length;
+          showFinBtn.value = false;
+        }
+      })
+      .catch((e) => {
+        createMessage.warn('获取数据失败!' + e.message());
+        loading.value = false;
+      });
+  }
+
+  function closeStep() {
+    showFinBtn.value = false;
+    current.value = 0;
+    stepData.value = [];
+    visible.value = false;
+  }
+
+  function finishOrRollbackStep(id, status, finishTime, nodeType, description) {
+    for (let i = 0; i < stepData.value.length; i++) {
+      // 判断当前登录用户是否是询盘所有者,并且是否已经审核过询盘
+      if (enquiryMaster.value && stepData.value[i].status === 1 && stepData.value[i].finUid === record.uid) {
+        createMessage.warn('询盘所有者已经审核过,请等待其他管理员审核!');
+        return;
+      }
+
+      if (isAdmin.value && stepData.value[i].status === 1 && stepData.value[i].finUid !== record.uid) {
+        createMessage.warn('管理员用户已经审核过,请等待询盘所有者审核!');
+        return;
+      }
+    }
+
+    if (status == 1 && description == '') {
+      createMessage.warn('审核日志记录不能为空');
+      return;
+    }
+
+    loading.value = true;
+    let params = {
+      id: id,
+      status: status,
+      hostId: record.id,
+      finTime: finishTime,
+      nodeType: nodeType,
+      stepCount: stepData.value.length,
+      description: description,
+    };
+    postAction('/adweb/executeNode/finishOrRollbackEnquiryVerifyStep', params, 120000).then((res) => {
+      if (res.code === 200) {
+        createMessage.success('操作成功');
+        showStep();
+        emit('reload');
+      }
+
+      loading.value = false;
+    });
+  }
+
+  defineExpose({
+    init,
+    onClose,
+  });
+</script>
+
+<style lang="less" scoped>
+  .self_step {
+    /deep/ .ant-steps-item-content {
+      width: 410px;
+
+      .ant-steps-item-title {
+        width: 100%;
+
+        span {
+          font-size: 13px;
+          color: green;
+
+          &.fr {
+            float: right;
+          }
+        }
+      }
+
+      .ant-steps-item-description {
+        div {
+          //padding-left: 20px;
+          font-size: 14px;
+        }
+      }
+    }
+  }
+
+  .doBtn {
+    position: absolute;
+    bottom: 15px;
+    width: 150px;
+    right: 150px;
+  }
+</style>
+
+<style lang="less">
+  .self_step {
+    .ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {
+      background: green;
+    }
+  }
+</style>

+ 115 - 84
src/views/adweb/modules/flowProcessEdit.vue

@@ -16,44 +16,47 @@
       class="j-table-force-nowrap"
       size="middle"
     >
-      <template v-for="col in ['name', 'description', 'timeDesc', 'proportion']" #[col]="text, record, index">
-        <div :key="col">
-          <a-input v-if="record.editable" style="margin: -5px 0" :value="text" @change="(e) => handleChange(e.target.value, record.key, col)" />
-          <template v-else>
-            {{ text }}
-          </template>
-        </div>
-      </template>
-      <template #proportionTitle>
-        <span
-          >权重
-          <a-tooltip placement="top">
-            <template #title>
-              <span>权重之和应为100</span>
+      <template #bodyCell="{ column, record, index, text }">
+        <template v-if="['name', 'description', 'timeDesc', 'proportion'].includes(column.dataIndex)">
+          <div>
+            <a-input
+              v-if="editableData[record.key]"
+              style="margin: -5px 0"
+              v-model:value="editableData[record.key][column.dataIndex]"
+              @change="(e) => handleChange(e.target.value, record.key, column)"
+            />
+            <template v-else>
+              {{ text }}
             </template>
-            <a-icon type="question-circle" />
-          </a-tooltip>
-        </span>
-      </template>
-      <template #id="text, record, index">
-        <a-tag color="pink" @click="up(record, index)" style="cursor: pointer" :class="index == 0 ? 'disabled' : ''">
-          <a-icon type="arrow-up" />
-        </a-tag>
-        <a-tag color="blue" @click="down(record, index)" style="cursor: pointer" :class="index == data.length - 1 ? 'disabled' : ''">
-          <a-icon type="arrow-down" />
-        </a-tag>
-      </template>
-      <template #action="text, record, index">
-        <div class="editable-row-operations">
-          <span v-if="record.editable">
-            <a @click="() => save(record.key)">保存</a>
-          </span>
-          <span v-else>
-            <a :disabled="editingKey !== ''" @click="() => edit(record.key)">编辑</a>
-            <a-divider type="vertical" />
-            <a :disabled="editingKey !== ''" @click="() => deleteRow(index)">删除</a>
-          </span>
-        </div>
+          </div>
+        </template>
+
+        <template v-if="column.dataIndex === 'id'">
+          <a-tag color="pink" @click="up(record, index)" style="cursor: pointer" :class="index == 0 ? 'disabled' : ''">
+            <a-icon type="arrow-up" />
+          </a-tag>
+          <a-tag color="blue" @click="down(record, index)" style="cursor: pointer" :class="index == data.length - 1 ? 'disabled' : ''">
+            <a-icon type="arrow-down" />
+          </a-tag>
+        </template>
+
+        <template v-if="column.dataIndex === 'action'">
+          <div class="editable-row-operations">
+            <span v-if="editableData[record.key]">
+              <a @click="() => save(record.key)" style="margin-right: 10px">保存</a>
+              <a-popconfirm title="确定取消吗?" @confirm="cancel(record.key)">
+                <a>取消</a>
+              </a-popconfirm>
+            </span>
+            <span v-else>
+              <a v-if="editableData[record.key]" disabled @click="() => edit(record.key)">编辑</a>
+              <a v-else @click="() => edit(record.key)">编辑</a>
+              <a-divider type="vertical" />
+              <a v-if="editableData[record.key]" disabled @click="() => deleteRow(index)">删除</a>
+              <a v-else @click="() => deleteRow(index)">删除</a>
+            </span>
+          </div>
+        </template>
       </template>
     </a-table>
   </div>
@@ -61,8 +64,10 @@
 
 <script lang="ts" setup>
   import { getAction, postAction } from '/@/api/manage/manage';
-  import { reactive, ref } from 'vue';
+  import { reactive, ref, UnwrapRef } from 'vue';
   import { useMessage } from '@/hooks/web/useMessage';
+  import { cloneDeep } from 'lodash-es';
+
   const columns = [
     {
       title: '节点名称',
@@ -80,6 +85,7 @@
       scopedSlots: { customRender: 'timeDesc' },
     },
     {
+      title: '权重',
       dataIndex: 'proportion',
       scopedSlots: { customRender: 'proportion', title: 'proportionTitle' },
     },
@@ -95,17 +101,21 @@
     },
   ];
 
-  let data = reactive([{}]);
-  const editingKey = ref('');
+  let data = ref([{}]);
+
+  const editableData: UnwrapRef<Record<string, {}>> = reactive({});
+
   const hostId = ref('');
   const tableLoading = ref(false);
   const loading = ref(false);
+  const url = ref('');
   let record = reactive({});
   let cacheData = reactive([{}]);
 
   const { createMessage } = useMessage();
+
   function submitAll() {
-    let d = data;
+    let d = data.value;
     let proportion = 0;
     for (let i in d) {
       proportion += parseInt(d[i].proportion);
@@ -132,7 +142,7 @@
       });
   }
   function addNew() {
-    data.push({
+    data.value.push({
       createTime: null,
       delFlag: 0,
       description: '',
@@ -147,88 +157,109 @@
       status: null,
       timeDesc: null,
       type: 1,
-      key: data.length,
+      key: data.value.length,
     });
-    cacheData = data;
+    cacheData = data.value;
   }
   //排序
   function up(r, i) {
     if (i == 0) {
       return;
     }
-    data.splice(i - 1, 0, data[i]);
-    data.splice(i + 1, 1);
+    data.value.splice(i - 1, 0, data.value[i]);
+    data.value.splice(i + 1, 1);
   }
   function down(r, i) {
-    if (i == data.length - 1) {
+    console.log(data.value, 'data.value');
+    if (i == data.value.length - 1) {
       return;
     }
-    data.splice(i + 2, 0, data[i]);
-    data.splice(i, 1);
+    data.value.splice(i + 2, 0, data.value[i]);
+    data.value.splice(i, 1);
   }
   function deleteRow(i) {
-    data.splice(i, 1);
+    data.value.splice(i, 1);
   }
   function onClose() {
-    data = [];
+    data.value = [];
   }
   function init(r, t) {
     record = r;
     if (t == 'seo') {
-      url = '/adweb/executeNode/querySEOTemplateFlow?planId=' + r.id;
+      url.value = '/adweb/executeNode/querySEOTemplateFlow?planId=' + r.id;
+    } else if (t == 'enquiry') {
+      url.value = '/adweb/executeNode/queryEnquiryVerifyTemplateFlow';
     } else {
-      url = '/adweb/executeNode/querySiteBuildTemplateFlow';
+      url.value = '/adweb/executeNode/querySiteBuildTemplateFlow';
     }
     showStep();
   }
   function showStep() {
-    let that = this;
-    that.tableLoading = true;
-    getAction(that.url)
+    tableLoading.value = true;
+
+    getAction(url.value, {})
       .then((res) => {
-        that.tableLoading = false;
+        tableLoading.value = false;
         if (res.success) {
           res.result.map((item, index) => {
-            that.data.push(Object.assign({}, item, { key: index }));
-            cacheData = data;
+            data.value.push(Object.assign({}, item, { key: index }));
+            cacheData = data.value;
             hostId.value = res.result[0].hostId;
           });
         }
       })
       .catch((e) => {
-        createMessage.warn('获取数据失败!');
+        createMessage.warn('获取数据失败!', e.message());
       });
   }
   function handleChange(value, key, column) {
-    const newData = [...data];
+    const newData = [...data.value];
     const target = newData.filter((item) => key === item.key)[0];
+
     if (target) {
       target[column] = value;
-      data = newData;
-    }
-  }
-  function edit(key) {
-    const newData = [...data];
-    const target = newData.filter((item) => key === item.key)[0];
-    editingKey.value = key;
-    if (target) {
-      target.editable = true;
-      data = newData;
+      data.value = newData;
     }
   }
-  function save(key) {
-    const newData = [...data];
-    const newCacheData = [...cacheData];
-    const target = newData.filter((item) => key === item.key)[0];
-    const targetCache = newCacheData.filter((item) => key === item.key)[0];
-    if (target && targetCache) {
-      delete target.editable;
-      data = newData;
-      Object.assign(targetCache, target);
-      cacheData = newCacheData;
-    }
-    editingKey.value = '';
-  }
+  // function edit(key) {
+  //   const newData = [...data.value];
+  //   const target = newData.filter((item) => key === item.key)[0];
+  //   editingKey.value = key;
+  //   if (target) {
+  //     target.editable = true;
+  //     data.value = newData;
+  //   }
+  // }
+  // function save(key) {
+  //   const newData = [...data.value];
+  //   const newCacheData = [...cacheData];
+  //   const target = newData.filter((item) => key === item.key)[0];
+  //   const targetCache = newCacheData.filter((item) => key === item.key)[0];
+  //   if (target && targetCache) {
+  //     delete target.editable;
+  //     data.value = newData;
+  //
+  //     console.log(data.value, '123123');
+  //     Object.assign(targetCache, target);
+  //     cacheData = newCacheData;
+  //   }
+  //   editingKey.value = '';
+  // }
+
+  const edit = (key: string) => {
+    editableData[key] = cloneDeep(data.value.filter((item) => key === item.key)[0]);
+  };
+  const save = (key: string) => {
+    Object.assign(data.value.filter((item) => key === item.key)[0], editableData[key]);
+    delete editableData[key];
+  };
+  const cancel = (key: string) => {
+    delete editableData[key];
+  };
+
+  // function cancel(key: string) {
+  //   delete data.value[key];
+  // }
 
   defineExpose({ onClose, init });
 </script>

+ 8 - 0
src/views/adweb/site/AdwebSite.api.ts

@@ -22,6 +22,7 @@ enum Api {
   bindGoogleAdsAccount = '/marketing/googleads/account/add', // 添加绑定接口地址
   getFaceBookAccount = '/marketing/facebook/account/get',
   bindFaceBookAccount = '/marketing/facebook/account/add',
+  getSubscribePlan = '/adweb/adwebSite/getSubscribePlanBySite',
 }
 
 /**
@@ -113,3 +114,10 @@ export const isSohoeb2b = () => {
     userStore.getRoleList.includes(RoleEnum.ADWEB_CHANNEL_ADMIN) && userStore.getLoginInfo.tenantList.some((obj) => obj.name.includes('苏豪纺织集团'))
   );
 };
+export const getSubscribePlan = () => {
+  const params: Record<string, any> = {
+    siteId: localStorage.getItem('siteID'),
+  };
+
+  return defHttp.get({ url: Api.getSubscribePlan, params });
+};

+ 1 - 1
src/views/adweb/site/AdwebSiteList.vue

@@ -162,7 +162,7 @@
     <site-set-enquiry ref="siteSetEnquiryRef" @success="reload" />
     <!-- 自动化嵌入GTM 代码     -->
     <gtm-add ref="gtmRef" />
-    <!--SEO流程-->
+    <!--建站流程-->
     <site-process ref="siteProcessRef" :visible="seoProcessVisible" :title="processTitle" @close="closeProcess" @reload="reload" />
     <google-ads-modal ref="googleAdsModalRef" @success="reload" />
     <facebook-modal ref="faceBookModalRef" @success="reload" />