AdwebEnquiryList.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954
  1. <template>
  2. <div class="p-2 adweb-enquiry-list">
  3. <div class="search-form">
  4. <a-row class="r1 search-form-container" :gutter="8">
  5. <a-col :xl="6" :xxl="5">
  6. <div class="choose-site">
  7. <span class="t1">站点:</span>
  8. <select-site ref="selectSiteRef" @set-site-info="getSiteList" select-width="100%" />
  9. </div>
  10. </a-col>
  11. <a-col :xl="7" :xxl="5">
  12. <div class="choose-site">
  13. <span class="t1">询盘时间:</span>
  14. <a-range-picker @change="onChangeDatePciker" :disabledDate="disabledDate" :value="rangeDate" style="width: 70%" />
  15. </div>
  16. </a-col>
  17. <a-col :xl="8" :xxl="10">
  18. <a-button :class="queryParam.dateType == '' ? 'active' : ''" @click="setTime('')">全部时间 </a-button>
  19. <a-button :class="queryParam.dateType == 'thirtyDay' ? 'active' : ''" @click="setTime('thirtyDay')">近30天 </a-button>
  20. <a-button :class="queryParam.dateType == 'sevenDay' ? 'active' : ''" @click="setTime('sevenDay')">近一周 </a-button>
  21. <a-button :class="queryParam.dateType == 'yesterday' ? 'active' : ''" @click="setTime('yesterday')">昨日 </a-button>
  22. <a-button :class="queryParam.dateType == 'today' ? 'active' : ''" @click="setTime('today')"> 今日 </a-button>
  23. </a-col>
  24. <a-col :xl="3" :xxl="4" v-if="isSuperAdmin">
  25. <a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleAdd">新增询盘</a-button>
  26. </a-col>
  27. </a-row>
  28. </div>
  29. <a-row class="r2">
  30. <a-col :span="6">
  31. <p class="t1"><img :src="toEffect" />有效询盘</p>
  32. <p class="t2" @click="getList('product')">{{ enquiryNums.product }}</p>
  33. </a-col>
  34. <a-col :span="6">
  35. <p class="t1"><img :src="toReadImg" />待阅读询盘</p>
  36. <p class="t2" @click="getList('noRead')">{{ enquiryNums.noRead }}</p>
  37. </a-col>
  38. <a-col :span="6">
  39. <p class="t1"><img :src="toClassified" />待分类询盘</p>
  40. <p class="t2" @click="getList('wait')">{{ enquiryNums.wait }}</p>
  41. </a-col>
  42. <a-col :span="6">
  43. <p class="t1"><img :src="toTotal" />累计询盘</p>
  44. <p class="t2" @click="getList('all')">{{ enquiryNums.all }}</p>
  45. </a-col>
  46. </a-row>
  47. <a-row class="r3" type="flex" :gutter="8">
  48. <a-col flex="2">
  49. <a-input placeholder="邮箱/姓名/国家" v-model:value="queryParam.searchText" />
  50. </a-col>
  51. <a-col flex="2">
  52. <a-input placeholder="询盘内容" v-model:value="queryParam.searchContent" />
  53. </a-col>
  54. <a-col flex="2">
  55. <a-select :allowClear="true" placeholder="全部分类" style="width: 100%" @change="filterCategory">
  56. <a-select-option :key="2" :value="2">待分类</a-select-option>
  57. <a-select-option :key="1" :value="1">有效询盘</a-select-option>
  58. </a-select>
  59. </a-col>
  60. <a-col flex="2">
  61. <a-select v-model="queryParam.readStatus" :allowClear="true" placeholder="全部阅读状态" style="width: 100%" @change="filterStatus">
  62. <a-select-option value="0"> 未读 </a-select-option>
  63. <a-select-option value="1"> 已读 </a-select-option>
  64. </a-select>
  65. </a-col>
  66. <a-col v-if="haveSubAccount" flex="2">
  67. <a-select placeholder="全部跟进人" v-model="queryParam.principalUid" showSearch allowClear style="width: 100%" :filterOption="filterOption">
  68. <a-select-option key="ALL" value="ALL">所有人</a-select-option>
  69. <a-select-option v-for="principal in subAccountOptions" :key="principal.id" :value="principal.id">
  70. {{ principal.username }}
  71. </a-select-option>
  72. </a-select>
  73. </a-col>
  74. <a-col flex="500px" style="text-align: right">
  75. <a-button type="primary" @click="searchQuery">查询</a-button>
  76. <a-button ghost type="primary" @click="searchReset" style="margin-left: 8px">重置</a-button>
  77. <a-button ghost type="primary" @click="handleExportXlsLU()" style="margin-left: 8px" :loading="excelLoading">导出Excel </a-button>
  78. <a-button ghost type="primary" @click="recycleBinVisible" style="margin-left: 8px">回收站 </a-button>
  79. <a-button ghost type="primary" @click="showBlackList" style="margin-left: 8px">黑名单 </a-button>
  80. </a-col>
  81. </a-row>
  82. <!--引用表格-->
  83. <BasicTable @register="registerTable" :rowSelection="rowSelection" :columns="enquiryColumns">
  84. <template #alertAfter>
  85. <a-divider type="vertical" />
  86. <a @click="enquiryReady">标为已读</a>
  87. <template v-if="isForwardSite">
  88. <a-divider type="vertical" />
  89. <a @click="forwardDetailAll"> 转发 </a>
  90. </template>
  91. <a-divider type="vertical" />
  92. <a @click="batchHandleDelete">删除</a>
  93. </template>
  94. <!--插槽:table标题-->
  95. <template #tableTitle>
  96. <!-- TODO 高级查询 -->
  97. <!-- <super-query :config="superQueryConfig" @search="handleSuperQuery" />-->
  98. </template>
  99. <!--操作栏-->
  100. <!-- <template #action="{ record }">-->
  101. <!-- <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />-->
  102. <!-- </template>-->
  103. <!-- 操作动作 -->
  104. <template #action="{ record }">
  105. <div style="padding: 5px 8px; display: flex; justify-content: left">
  106. <a-tag v-if="isForwardSite" color="blue" @click="forwardDetail(record)" style="cursor: pointer"> 转发 </a-tag>
  107. <a-tag color="purple" @click="showEnquiryDetail(record)" style="cursor: pointer"> 详情 </a-tag>
  108. <a-popconfirm
  109. title="确认拒收后,该用户会归入【黑名单】,后期不再接收该用户的询盘信息~"
  110. ok-text="是"
  111. cancel-text="否"
  112. placement="topRight"
  113. @confirm="enquiryAddBlackList(record)"
  114. >
  115. <a-tag color="orange" style="cursor: pointer"> 拒收 </a-tag>
  116. </a-popconfirm>
  117. <a-tag color="green" @click="showEnquiryTrackRecord(record)" style="cursor: pointer"> 跟踪 </a-tag>
  118. <a-tag
  119. color="blue"
  120. v-if="record.visitId !== null && record.visitId !== '' && record.visitId !== undefined"
  121. style="cursor: pointer"
  122. @click="showEnquiryTrack(record)"
  123. >
  124. 访问记录
  125. </a-tag>
  126. </div>
  127. </template>
  128. <template #bodyCell="{ column, record, text }">
  129. <!-- 自定义显示字段 -->
  130. <template v-if="column.key == 'principalUid'">
  131. <template v-if="haveSubAccount">
  132. <a-select
  133. placeholder="请选择跟进人"
  134. v-model:value="record.principalUid"
  135. style="width: 180px"
  136. showSearch
  137. :filterOption="filterOption"
  138. @change="selectPrincipal(record)"
  139. :disabled="
  140. userRole.indexOf('admin') > -1 ||
  141. userRole.indexOf('adweb_admin') > -1 ||
  142. userRole.indexOf('adweb_seo_manager') > -1 ||
  143. userRole.indexOf('adweb_site_manager') > -1
  144. "
  145. >
  146. <a-select-option key="ALL" value="ALL">所有人</a-select-option>
  147. <a-select-option v-for="principal in subAccountOptions" :key="principal.id" :value="principal.id">
  148. {{ principal.username }}
  149. </a-select-option>
  150. </a-select>
  151. </template>
  152. <template v-else>{{ record.principalName }}</template>
  153. </template>
  154. <!-- 询盘状态 -->
  155. <template v-if="column.key == 'userEffective'">
  156. <a class="theme-color" v-if="text === 2" @click="showEnquiryDetail(record)">{{ record.userEffectiveStr }}</a>
  157. <span v-else-if="text == 0" style="color: #fa8c16">{{ record.userEffectiveStr }}</span>
  158. <span v-else>{{ record.userEffectiveStr }}</span>
  159. </template>
  160. <!-- 阅读状态 -->
  161. <template v-if="column.key == 'readStatus'">
  162. <a v-if="text == 0" class="theme-color" @click="showEnquiryDetail(record)">未读</a>
  163. <span v-else>已读</span>
  164. </template>
  165. <!-- 询盘详情 -->
  166. <div v-if="column.key == 'details'">
  167. <a @click="showEnquiryDetail(record)" style="margin: 0 10px 0 10px"> {{ record.context ? record.context.substr(0, 50) : '--' }}</a>
  168. </div>
  169. <!-- 来源页面 -->
  170. <template v-if="column.key == 'fromPage'">
  171. <template v-if="!text">-</template>
  172. <template v-else-if="text.indexOf('http') < 0">-</template>
  173. <template v-else-if="text.indexOf('http') === 0">
  174. <template v-if="text.lastIndexOf('/') <= 7">
  175. <a :href="text" target="_blank" style="text-decoration: underline">Home</a>
  176. </template>
  177. <template v-else>
  178. <a :href="text" target="_blank" style="text-decoration: underline">{{
  179. text.substring(text.lastIndexOf('/') + 1).slice(0, 45) + (text.substring(text.lastIndexOf('/') + 1).length > 45 ? '...' : '')
  180. }}</a>
  181. </template>
  182. </template>
  183. <template v-else-if="text.indexOf('http') > 0">
  184. <a :href="text.substring(text.indexOf('http'))" target="_blank" style="text-decoration: underline">{{
  185. text.substring(0, text.indexOf('http')).slice(0, 45) + (text.substring(0, text.indexOf('http')).length > 45 ? '...' : '')
  186. }}</a>
  187. </template>
  188. <template v-else>-</template>
  189. </template>
  190. <!-- 邮箱 -->
  191. <div v-if="column.key == 'fromEmail'">
  192. <a-popover>
  193. <template #content>
  194. {{ text }}
  195. </template>
  196. <a @click.prevent="copyEmailFunction(text)" :href="'mailto:' + text" v-if="text">{{
  197. text.slice(0, 30) + (text.length > 30 ? '...' : '')
  198. }}</a>
  199. <div v-else>--</div>
  200. </a-popover>
  201. </div>
  202. <!-- 审核进度条-->
  203. <div v-if="column.dataIndex == 'verifyProgress'">
  204. <a @click="handleProcess(record, 'enquiry')">
  205. <a-progress :size="10" :showInfo="true" :percent="text" />
  206. </a>
  207. </div>
  208. </template>
  209. </BasicTable>
  210. <!-- 表单区域 -->
  211. <AdwebEnquiryModal ref="registerModal" @success="handleSuccess" />
  212. <!--回收站-->
  213. <xp-recycle-bin-modal ref="XpRecycleBinModalRef" @ok="getTableAndNum" />
  214. <!--询盘详情 reload用于子组件删除询盘功能刷新父组件table showDelBtn用于展示删除按钮-->
  215. <enquiry-detail
  216. :userEffectiveOption="userEffectiveOption"
  217. :showDelBtn="true"
  218. @reload="getTableAndNum()"
  219. @ok="getTableAndNum"
  220. ref="enquiryDetailRef"
  221. />
  222. <!-- 转发询盘 -->
  223. <a-modal title="转发" v-model:open="forwardVisible" @ok="editForward" @cancel="cancelEditForward" :confirm-loading="forwardLoading">
  224. <a-radio-group v-model:value="selectedUserId">
  225. <a-radio v-for="item in subAccountOptions" style="display: block; height: 30px; lineheight: 30px" :value="item.id">
  226. {{ item.username }}
  227. </a-radio>
  228. </a-radio-group>
  229. </a-modal>
  230. <!--黑名单-->
  231. <black-list ref="blackListRef" @ok="getTableAndNum" />
  232. <!--跟踪记录-->
  233. <enquiry-track-record ref="enquiryTrackRecordRef" />
  234. <!--站点访问记录-->
  235. <enquiry-track ref="enquiryTrackRef" />
  236. <enquiry-verify-process ref="enquiryVerifyProcessRef" @reload="reload" />
  237. </div>
  238. </template>
  239. <script lang="ts" name="adweb-adwebEnquiry" setup>
  240. import toEffect from '/@/assets/enquiry/enquiryListTop1.svg';
  241. import toReadImg from '/@/assets/enquiry/enquiryListTop3.svg';
  242. import toClassified from '/@/assets/enquiry/enquiryListTop2.svg';
  243. import toTotal from '/@/assets/enquiry/enquiryListTop4.svg';
  244. import selectSite from '/@/components/Adweb/selectSite.vue';
  245. import { computed, nextTick, onBeforeMount, onMounted, reactive, ref } from 'vue';
  246. import { BasicTable } from '/@/components/Table';
  247. import { useListPage } from '/@/hooks/system/useListPage';
  248. import { columns } from './AdwebEnquiry.data';
  249. import { batchDelete, getExportUrl, getImportUrl, list } from './AdwebEnquiry.api';
  250. import AdwebEnquiryModal from './components/AdwebEnquiryModal.vue';
  251. import { useUserStore } from '/@/store/modules/user';
  252. import { getAction, postAction } from '@/api/manage/manage';
  253. import { useMessage } from '@/hooks/web/useMessage';
  254. import { filterOption } from 'ant-design-vue/es/vc-mentions/src/util';
  255. import enquiryDetail from '@/views/adweb/enquiry/modules/enquiryDetail.vue';
  256. import XpRecycleBinModal from '@/views/adweb/system/modules/XpRecycleBinModal.vue';
  257. import blackList from '@/views/adweb/enquiry/modules/blackList.vue';
  258. import enquiryTrackRecord from '@/views/adweb/enquiry/modules/enquiryTrackRecord.vue';
  259. import { RoleEnum } from '@/enums/roleEnum';
  260. import dayjs, { Dayjs } from 'dayjs';
  261. import EnquiryTrack from '@/views/adweb/enquiry/modules/enquiryTrack.vue';
  262. import EnquiryVerifyProcess from '@/views/adweb/enquiry/modules/enquiryVerifyProcess.vue';
  263. import { getSubscribePlan } from '@/views/adweb/site/AdwebSite.api';
  264. const dateFormat = 'YYYY-MM-DD';
  265. type RangeValue = [Dayjs, Dayjs];
  266. // 过滤日期范围
  267. let rangeDate = ref<RangeValue>();
  268. const userStore = useUserStore();
  269. const queryParam = reactive<any>({});
  270. console.log(userStore.getRoleList, '当前用户所属角色');
  271. const isSuperAdmin = computed(() => {
  272. return userStore.getRoleList.includes(RoleEnum.ADMIN) || userStore.getRoleList.includes(RoleEnum.ADWEB_CHANNEL_ADMIN);
  273. });
  274. const registerModal = ref();
  275. const selectSiteRef = ref(null);
  276. const { createMessage } = useMessage();
  277. // 询盘数量
  278. const enquiryNums = ref({
  279. all: 0,
  280. noRead: 0,
  281. product: 0,
  282. wait: 0,
  283. });
  284. const enquiryVerifyProcessRef = ref();
  285. // 子账号列表
  286. let subAccountOptions = ref([{ id: '', username: '' }]);
  287. // 是否有子账户
  288. let haveSubAccount = ref(false);
  289. // 导出excel进度
  290. let excelLoading = ref<boolean>(false);
  291. // 编辑转发进度
  292. let forwardLoading = ref<boolean>(false);
  293. // 选中跟进人
  294. let selectedUserId = ref<any>(undefined);
  295. let userEffectiveOption = ref([]);
  296. // 当前用户角色
  297. const userRole = ref('');
  298. // 已经选择的站点code
  299. const siteCode = ref<any>('');
  300. const isForwardSite = ref<boolean>(false);
  301. //转发的询盘id
  302. const forwardEnquiryDetail = ref<any>(undefined);
  303. //转发是否可见
  304. const forwardVisible = ref(false);
  305. // 询盘详情子组件
  306. const enquiryDetailRef = ref(null);
  307. // 回收站子组件
  308. const XpRecycleBinModalRef = ref(null);
  309. // 黑名单子组件
  310. const blackListRef = ref(null);
  311. // 跟踪记录
  312. const enquiryTrackRecordRef = ref(null);
  313. // 访问记录
  314. const enquiryTrackRef = ref();
  315. const isSpecialSubscribePlan = ref(false);
  316. const enquiryColumns = ref<any>(columns);
  317. //注册table数据
  318. const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
  319. tableProps: {
  320. title: '询盘信息',
  321. api: list,
  322. canResize: false,
  323. useSearchForm: false,
  324. actionColumn: {
  325. width: 180,
  326. maxWidth: 220,
  327. minWidth: 180,
  328. fixed: 'right',
  329. },
  330. striped: true,
  331. bordered: false,
  332. immediate: false, // 不直接触发,通过reload事件触发接口
  333. beforeFetch: (params) => {
  334. // 如果查询条件中没有设置状态,则默认查出所有状态数据
  335. if (queryParam.userEffective == undefined) {
  336. queryParam.userEffective = '1,2';
  337. }
  338. return Object.assign(params, queryParam);
  339. },
  340. },
  341. exportConfig: {
  342. name: '询盘列表',
  343. url: getExportUrl,
  344. params: queryParam,
  345. },
  346. importConfig: {
  347. url: getImportUrl,
  348. success: handleSuccess,
  349. },
  350. });
  351. const [
  352. registerTable,
  353. { reload, clearSelectedRowKeys, updateTableDataRecord, findTableDataRecord, getDataSource },
  354. { rowSelection, selectedRowKeys },
  355. ] = tableContext;
  356. onBeforeMount(() => {
  357. siteCode.value = localStorage.getItem('siteCode');
  358. getTurnInquiryCode();
  359. getSubAccountOptions();
  360. });
  361. onMounted(async () => {
  362. userRole.value = useUserStore().userInfo?.roles.join(',');
  363. // console.log(useUserStore().userInfo?.roles.join(','), 'useUserStore().roleList');
  364. // getEffectiveList();
  365. });
  366. function getSiteList(selectedSiteInfo: any) {
  367. queryParam.siteId = selectedSiteInfo.id;
  368. // 判断当前站点是否属于苏豪通全托管套餐,如果是,则显示审核进度列,否则不显示
  369. getSubscribePlan().then((res) => {
  370. // 根据接口返回结果判断是否隐藏敏感信息列
  371. if (res.planName !== '苏豪通全托管') {
  372. enquiryColumns.value = enquiryColumns.value.filter((col) => col.dataIndex !== 'verifyProgress');
  373. } else {
  374. // 显示敏感信息列
  375. enquiryColumns.value = columns;
  376. isSpecialSubscribePlan.value = true;
  377. }
  378. getEffectiveList();
  379. });
  380. getTableAndNum(true);
  381. }
  382. // 单个产品,点击下拉框直接修改
  383. function selectPrincipal(record) {
  384. console.log(record);
  385. let params = {
  386. productId: record.id,
  387. uid: record.principalUid === undefined ? 'ALL' : record.principalUid,
  388. };
  389. getAction('/adweb/adwebEnquiry/setPrincipal', params).then((res) => {
  390. if (res.code == 200) {
  391. createMessage.success('操作成功!');
  392. } else {
  393. if (res.code == 403 || res.code == 500) {
  394. createMessage.warning(res.message);
  395. reload();
  396. } else {
  397. createMessage.success('操作失败!');
  398. }
  399. }
  400. });
  401. }
  402. function filterCategory(value: string) {
  403. queryParam.userEffective = value;
  404. }
  405. function filterStatus(value: number) {
  406. queryParam.readStatus = value;
  407. }
  408. //重新刷新页面数据及获取询盘数量
  409. function getTableAndNum(clearParam: boolean = false) {
  410. getEnquiryNums();
  411. if (clearParam) {
  412. if (queryParam.readStatus) {
  413. delete queryParam.readStatus;
  414. }
  415. if (queryParam.searchText) {
  416. delete queryParam.searchText;
  417. }
  418. if (queryParam.searchContent) {
  419. delete queryParam.searchContent;
  420. }
  421. if (queryParam.userEffective) {
  422. delete queryParam.userEffective;
  423. }
  424. if (queryParam.principalUid) {
  425. delete queryParam.principalUid;
  426. }
  427. }
  428. loadData();
  429. }
  430. //搜索条件部分的逻辑
  431. function onChangeDatePciker(date, dateString) {
  432. if (dateString.length > 0) {
  433. rangeDate.value = date;
  434. queryParam.start = dateString[0];
  435. queryParam.end = dateString[1];
  436. queryParam.dateType = undefined;
  437. getTableAndNum();
  438. }
  439. }
  440. //日期选择只能今天之前
  441. function disabledDate(current) {
  442. return current && current > dayjs().endOf('day');
  443. }
  444. //设置列表的时间查询条件
  445. function setTime(time) {
  446. queryParam.dateType = time;
  447. queryParam.start = '';
  448. queryParam.end = '';
  449. // sevenDay thirtyDay today yesterday
  450. if (time == '') {
  451. rangeDate.value = undefined;
  452. } else if (time == 'sevenDay') {
  453. rangeDate.value = [dayjs().subtract(6, 'days'), dayjs()];
  454. } else if (time == 'thirtyDay') {
  455. rangeDate.value = [dayjs().subtract(29, 'days'), dayjs()];
  456. } else if (time == 'today') {
  457. rangeDate.value = [dayjs(), dayjs()];
  458. } else if (time == 'yesterday') {
  459. rangeDate.value = [dayjs().subtract(1, 'days'), dayjs().subtract(1, 'days')];
  460. }
  461. if (rangeDate.value != undefined) {
  462. queryParam.start = rangeDate.value[0].format(dateFormat);
  463. queryParam.end = rangeDate.value[1].format(dateFormat);
  464. }
  465. getTableAndNum();
  466. }
  467. //获取不同状态询盘的数量
  468. function getEnquiryNums() {
  469. let siteId = '';
  470. if (queryParam.siteId && queryParam.siteId != '') {
  471. siteId = queryParam.siteId;
  472. } else {
  473. siteId = '';
  474. }
  475. let d = {
  476. siteId: siteId,
  477. dateType: queryParam.dateType,
  478. start: queryParam.start,
  479. end: queryParam.end,
  480. };
  481. getAction('/adweb/adwebEnquiry/getEnquiryNums', d).then((res) => {
  482. if (res.code == 200) {
  483. enquiryNums.value.all = res.result.all;
  484. enquiryNums.value.noRead = res.result.noRead;
  485. enquiryNums.value.product = res.result.product;
  486. enquiryNums.value.wait = res.result.wait;
  487. } else {
  488. enquiryNums.value.all = 0;
  489. enquiryNums.value.noRead = 0;
  490. enquiryNums.value.product = 0;
  491. enquiryNums.value.wait = 0;
  492. }
  493. });
  494. }
  495. // 获取子账户的下拉框选项
  496. function getSubAccountOptions() {
  497. getAction('/usercountry/subAccounts/options?siteCode=' + siteCode.value, null).then((res) => {
  498. if (res.code === 200) {
  499. subAccountOptions.value = res.result;
  500. haveSubAccount.value = res.result !== null && res.result !== undefined && res.result.length > 0;
  501. }
  502. });
  503. }
  504. function getList(type: String) {
  505. //清空查询条件
  506. queryParam.principalUid = undefined;
  507. queryParam.searchText = undefined;
  508. queryParam.searchContent = undefined;
  509. if (type == 'noRead') {
  510. queryParam.readStatus = '0';
  511. queryParam.userEffective = undefined;
  512. }
  513. if (type == 'product') {
  514. queryParam.userEffective = 1;
  515. console.log('1', queryParam);
  516. queryParam.readStatus = undefined;
  517. console.log('2', queryParam);
  518. }
  519. if (type == 'wait') {
  520. queryParam.userEffective = 2;
  521. queryParam.readStatus = undefined;
  522. }
  523. if (type == 'all') {
  524. queryParam.userEffective = undefined;
  525. queryParam.readStatus = undefined;
  526. }
  527. loadData(1);
  528. }
  529. //批量设为已读
  530. function enquiryReady() {
  531. console.log(selectedRowKeys.value.length, 'selectedRowKeysselectedRowKeysselectedRowKeys');
  532. if (selectedRowKeys.value.length <= 0) {
  533. createMessage.warning('请选择至少一条记录!');
  534. return;
  535. }
  536. getAction('/adweb/adwebEnquiry/read', { id: selectedRowKeys.value.toString() }).then((res) => {
  537. if (res.success) {
  538. createMessage.success('批量设置已读成功!');
  539. getTableAndNum();
  540. clearSelectedRowKeys();
  541. } else {
  542. if (res.code == 403) {
  543. createMessage.warning(res.message);
  544. } else {
  545. createMessage.error('设置失败!');
  546. }
  547. }
  548. });
  549. }
  550. // 加载table列表数据
  551. function loadData(page: number = 1) {
  552. nextTick().then(() => {
  553. reload({ page: page });
  554. });
  555. }
  556. // 导出excel
  557. function handleExportXlsLU() {
  558. excelLoading.value = true;
  559. delete queryParam.userEffective;
  560. onExportXls().then(() => {
  561. excelLoading.value = false;
  562. });
  563. }
  564. //询盘详情
  565. async function showEnquiryDetail(record) {
  566. if (record.readStatus == 0) {
  567. getAction('/adweb/adwebEnquiry/read?id=' + record.id, null).then(() => {
  568. getTableAndNum();
  569. });
  570. }
  571. await nextTick();
  572. if (enquiryDetailRef.value && enquiryDetailRef.value.init) {
  573. enquiryDetailRef.value.init(record);
  574. }
  575. }
  576. //获取询盘分类列表
  577. function getEffectiveList() {
  578. getAction('/adweb/adwebEnquiry/getEnquiryCatalog', null)
  579. .then(function (res) {
  580. if (res.code == 200) {
  581. userEffectiveOption.value = JSON.parse(res.result);
  582. // 针对苏豪全托管套餐,隐藏直接设置有效询盘
  583. if (isSpecialSubscribePlan.value) {
  584. userEffectiveOption.value = userEffectiveOption.value.filter((item) => item.value !== '1');
  585. }
  586. } else {
  587. createMessage.error('获取询盘分类失败!');
  588. }
  589. })
  590. .catch(function (err) {
  591. console.log(err);
  592. });
  593. }
  594. //复制email到剪切板
  595. function copyEmailFunction(text) {
  596. //复制email到剪切板
  597. if (!navigator.clipboard) {
  598. console.log('浏览器不支持navigator');
  599. let copy = (e) => {
  600. e.preventDefault();
  601. e.clipboardData.setData('text/plain', text);
  602. createMessage.success('复制成功');
  603. document.removeEventListener('copy', copy);
  604. };
  605. document.addEventListener('copy', copy);
  606. document.execCommand('Copy');
  607. return;
  608. }
  609. navigator.clipboard.writeText(text).then(
  610. function () {
  611. createMessage.success('复制成功');
  612. },
  613. function (err) {
  614. createMessage.error('复制失败', err);
  615. }
  616. );
  617. }
  618. //获取需要轮流询盘的站点code,判断哪个站点的询盘需要开启转发功能
  619. function getTurnInquiryCode() {
  620. // 站点code
  621. let dictSiteCode = [{ label: '', value: '' }];
  622. getAction('/adweb/adwebEnquiry/getTurnInquiryCode', null).then((res) => {
  623. if (res.code === 200) {
  624. Object.assign(dictSiteCode, res.result);
  625. for (let it in dictSiteCode) {
  626. if (dictSiteCode[it].value === siteCode.value) {
  627. isForwardSite.value = true;
  628. }
  629. }
  630. }
  631. });
  632. }
  633. //转发询盘
  634. function forwardDetail(record) {
  635. forwardEnquiryDetail.value = record.id;
  636. forwardVisible.value = true;
  637. }
  638. //拒收
  639. function enquiryAddBlackList(record) {
  640. delete record.wasteEnquiry;
  641. postAction('/enquiry/blacklist/addBlacklist', record, null).then((res) => {
  642. if (res.success) {
  643. createMessage.success(`拒收成功!`);
  644. this.getTableAndNum();
  645. } else {
  646. if (res.code == 403 || res.code == 500) {
  647. createMessage.warning(res.message);
  648. } else {
  649. createMessage.error('拒收失败!');
  650. }
  651. }
  652. });
  653. }
  654. // 编辑转发
  655. function editForward() {
  656. if (forwardEnquiryDetail.value === undefined) {
  657. createMessage.warning('请选择询盘信息!');
  658. return;
  659. }
  660. if (!selectedUserId.value) {
  661. createMessage.warning('请选择跟进人!');
  662. return;
  663. }
  664. forwardLoading.value = true;
  665. let param = {
  666. ids: forwardEnquiryDetail.value,
  667. uid: selectedUserId.value,
  668. code: siteCode.value,
  669. };
  670. getAction('/adweb/adwebEnquiry/setForward', param)
  671. .then((res) => {
  672. if (res.success) {
  673. createMessage.success(res.message);
  674. loadData();
  675. cancelEditForward();
  676. getEnquiryNums();
  677. clearSelectedRowKeys();
  678. } else {
  679. createMessage.warning(res.message);
  680. }
  681. })
  682. .finally(() => {
  683. forwardLoading.value = false;
  684. });
  685. }
  686. // 取消转发的编辑
  687. function cancelEditForward() {
  688. selectedUserId.value = undefined;
  689. forwardEnquiryDetail.value = undefined;
  690. forwardVisible.value = false;
  691. }
  692. //回收箱
  693. async function recycleBinVisible() {
  694. await nextTick();
  695. if (XpRecycleBinModalRef.value && XpRecycleBinModalRef.value.init) {
  696. XpRecycleBinModalRef.value.init(queryParam.siteId, '1,2');
  697. }
  698. }
  699. //黑名单
  700. async function showBlackList() {
  701. await nextTick();
  702. if (blackListRef.value && blackListRef.value.init) {
  703. blackListRef.value.init(queryParam.siteId);
  704. }
  705. }
  706. //跟踪记录
  707. async function showEnquiryTrackRecord(record) {
  708. await nextTick();
  709. if (enquiryTrackRecordRef.value && enquiryTrackRecordRef.value.init) {
  710. enquiryTrackRecordRef.value.init(record);
  711. }
  712. }
  713. async function showEnquiryTrack(record) {
  714. await nextTick();
  715. if (enquiryTrackRef.value && enquiryTrackRef.value.init) {
  716. enquiryTrackRef.value.init(record);
  717. }
  718. }
  719. /**
  720. * 新增事件
  721. */
  722. function handleAdd() {
  723. registerModal.value.disableSubmit = false;
  724. registerModal.value.add();
  725. }
  726. /**
  727. * 批量删除事件
  728. */
  729. async function batchHandleDelete() {
  730. await batchDelete({ id: selectedRowKeys.value.join(',') }, handleSuccess);
  731. }
  732. /**
  733. * 成功回调
  734. */
  735. function handleSuccess() {
  736. (selectedRowKeys.value = []) && reload();
  737. }
  738. function handleProcess(record, type) {
  739. if (record.userEffective == 1 && record.verifyNum == null) {
  740. createMessage.warning('该询盘是历史有效询盘!');
  741. return;
  742. } else {
  743. enquiryVerifyProcessRef.value.init(record, type);
  744. }
  745. }
  746. /**
  747. * 查询
  748. */
  749. function searchQuery() {
  750. reload();
  751. }
  752. /**
  753. * 重置
  754. */
  755. function searchReset() {
  756. selectedRowKeys.value = [];
  757. //刷新数据
  758. getTableAndNum(true);
  759. }
  760. </script>
  761. <style lang="less" scoped>
  762. .ant-form-item {
  763. flex: 1;
  764. }
  765. .jeecg-basic-table-form-container {
  766. padding: 0;
  767. .table-page-search-submitButtons {
  768. display: block;
  769. margin-bottom: 24px;
  770. white-space: nowrap;
  771. }
  772. .query-group-cust {
  773. min-width: 100px !important;
  774. }
  775. .query-group-split-cust {
  776. width: 30px;
  777. display: inline-block;
  778. text-align: center;
  779. }
  780. .ant-form-item:not(.ant-form-item-with-help) {
  781. margin-bottom: 16px;
  782. height: 32px;
  783. }
  784. :deep(.ant-picker),
  785. :deep(.ant-input-number) {
  786. width: 100%;
  787. }
  788. }
  789. .theme-color {
  790. color: @primary-color;
  791. }
  792. .r1 {
  793. .choose-site {
  794. display: flex;
  795. }
  796. .t1 {
  797. font-size: 18px;
  798. }
  799. .ant-calendar-picker {
  800. margin-right: 20px;
  801. }
  802. }
  803. .r2 {
  804. background: #fff;
  805. border-radius: 10px;
  806. padding: 30px 20px;
  807. .ant-col:not(:last-child) {
  808. border-right: 1px solid #e6e6e6;
  809. }
  810. p {
  811. margin: 0;
  812. text-align: center;
  813. &.t1 {
  814. color: #333;
  815. margin-bottom: 15px;
  816. img {
  817. margin-right: 10px;
  818. width: 15px;
  819. margin-top: -5px;
  820. }
  821. }
  822. &.t2 {
  823. color: @primary-color;
  824. font-size: 30px;
  825. font-weight: 500;
  826. line-height: 1;
  827. text-decoration: underline;
  828. cursor: pointer;
  829. padding-left: 25px;
  830. }
  831. }
  832. }
  833. .r3 {
  834. margin-top: 20px;
  835. }
  836. </style>