企微助手 ,仓库名 短剧

inviteRuleList.vue 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. <template>
  2. <div v-loading="loading" class="inviteRuleList-wrap">
  3. <div class="screenBox" style="align-items: center; padding-right: 16px">
  4. <div class="flex-align-center" style="flex: 1">
  5. <!-- 搜索配置 -->
  6. <self-input
  7. style="width: auto"
  8. label_name="关键词"
  9. :hasLabel="false"
  10. :noMarLeft="true"
  11. @inputChange="
  12. (val) => {
  13. keyword = val;
  14. init(1);
  15. }
  16. "
  17. />
  18. <!-- 关联客服 -->
  19. <serviceSingle
  20. style="width: auto"
  21. title="关联客服"
  22. placeholder="请选择"
  23. @customerDefine="onChangeUser"
  24. />
  25. <!-- 状态 -->
  26. <selfChannelV2
  27. v-model="status"
  28. type="enableStatus"
  29. title="规则状态"
  30. :labelWidth="true"
  31. @change="onChangeStatus"
  32. />
  33. </div>
  34. <el-button type="primary" size="mini" @click="createdMassMsg"
  35. >新建配置</el-button
  36. >
  37. </div>
  38. <div class="tableInfo">
  39. <div>
  40. <div class="flex">
  41. <div class="totalCustom">
  42. 共有<span>{{ total }}</span
  43. >条数据
  44. </div>
  45. </div>
  46. </div>
  47. <div class="flex">
  48. <el-button type="primary" plain size="mini" @click="init(1, 'export')"
  49. >导出Excel</el-button
  50. >
  51. <!-- 使用说明 -->
  52. <!-- <instructions style="margin-left: 20px;" doc="employee_bulk_messaging_log"></instructions>-->
  53. </div>
  54. </div>
  55. <!-- table -->
  56. <el-table
  57. ref="multipleTable"
  58. :height="height"
  59. :data="tableData"
  60. tooltip-effect="dark"
  61. style="width: 100%"
  62. >
  63. <el-table-column
  64. prop="title"
  65. label="标题"
  66. show-overflow-tooltip
  67. align="center"
  68. min-width="140"
  69. fixed="left"
  70. />
  71. <el-table-column
  72. prop="user_name"
  73. label="创建人"
  74. show-overflow-tooltip
  75. align="center"
  76. min-width="140"
  77. />
  78. <el-table-column label="拉群类型" align="center" min-width="140">
  79. <template slot-scope="scope">
  80. <div>
  81. {{
  82. scope.row.join_type == 1
  83. ? "顺序拉群"
  84. : scope.row.join_type == 2
  85. ? "随机拉群"
  86. : "-"
  87. }}
  88. </div>
  89. </template>
  90. </el-table-column>
  91. <el-table-column label="配置状态" align="center" min-width="120">
  92. <template slot-scope="{ row }">
  93. <el-switch
  94. v-if="row.status !== ''"
  95. v-model="row.status"
  96. :active-value="1"
  97. :inactive-value="0"
  98. disabled
  99. @click.native="onClickStatus(row)"
  100. />
  101. <div v-else>-</div>
  102. </template>
  103. </el-table-column>
  104. <el-table-column
  105. min-width="140"
  106. label="操作"
  107. align="center"
  108. fixed="right"
  109. >
  110. <template slot-scope="scope">
  111. <div class="flex" style="justify-content: center">
  112. <div
  113. class="c-00B38A pointer table_button"
  114. @click="goDetail(scope.row)"
  115. >
  116. 编辑
  117. </div>
  118. <!-- <el-popconfirm
  119. @confirm="handleRefresh(scope.row)"
  120. :title="`确定重置【${scope.row.title}】退群客户的退群时间范围筛选吗?`"
  121. >
  122. <div slot="reference" class="c-448AFF pointer table_button">
  123. 重置
  124. </div>
  125. </el-popconfirm> -->
  126. <el-popconfirm
  127. @confirm="deleEvent(scope.row)"
  128. :title="`确定删除【${scope.row.title}】?`"
  129. >
  130. <div slot="reference" class="c-FF604D pointer table_button">
  131. 删除
  132. </div>
  133. </el-popconfirm>
  134. </div>
  135. </template>
  136. </el-table-column>
  137. </el-table>
  138. <div class="pagination" v-show="total > 0">
  139. <el-pagination
  140. background
  141. :current-page="page"
  142. @current-change="handleCurrentChange"
  143. layout="prev, pager, next"
  144. :page-count="Number(pages)"
  145. />
  146. </div>
  147. <el-drawer size="1200px" :visible.sync="massMsgFlag" :with-header="false">
  148. <createData
  149. v-if="massMsgFlag"
  150. ref="createMassMsg"
  151. :rule_id="detail_rule_id"
  152. :title="detail_rule_id ? '配置详情' : '新建配置'"
  153. @close="detailClose"
  154. />
  155. </el-drawer>
  156. </div>
  157. </template>
  158. <script>
  159. import createData from "./createData.vue";
  160. import selfInput from "@/components/assembly/screen/input.vue";
  161. import serviceSingle from "@/components/assembly/screen/serviceSingle.vue";
  162. import selfChannelV2 from "@/components/assembly/screen/channelV2.vue";
  163. export default {
  164. components: {
  165. selfInput,
  166. createData,
  167. serviceSingle,
  168. selfChannelV2,
  169. },
  170. data() {
  171. return {
  172. massMsgFlag: false,
  173. loading: false,
  174. page: 1,
  175. pages: 0,
  176. total: 0,
  177. page_size: 20,
  178. tableData: [],
  179. height: "",
  180. detail_rule_id: "",
  181. keyword: "",
  182. user_id: "",
  183. status: "",
  184. };
  185. },
  186. created() {
  187. this.height = document.documentElement.clientHeight - 290;
  188. this.init(1);
  189. },
  190. methods: {
  191. //删除
  192. deleEvent(row) {
  193. this.$loading(this.$loadingConfig);
  194. this.$axios
  195. .get(this.URL.BASEURL + this.URL.inviteRule_dele, {
  196. params: {
  197. rule_id: row.rule_id,
  198. },
  199. })
  200. .then((res) => {
  201. this.$loading(this.$loadingConfig).close();
  202. var res = res.data;
  203. if (res && res.errno == 0) {
  204. this.init(1);
  205. }
  206. this.$message({
  207. message: res.err,
  208. type: "warning",
  209. });
  210. });
  211. },
  212. //重置
  213. handleRefresh(row) {
  214. this.$loading(this.$loadingConfig);
  215. this.$axios
  216. .get(this.URL.BASEURL + this.URL.inviteRule_reset, {
  217. params: {
  218. rule_id: row.rule_id,
  219. },
  220. })
  221. .then((res) => {
  222. this.$loading(this.$loadingConfig).close();
  223. var res = res.data;
  224. if (res && res.errno == 0) {
  225. this.$message({
  226. message: '重置成功',
  227. type: "success",
  228. });
  229. this.init(this.page);
  230. } else {
  231. this.$message({
  232. message: res.err,
  233. type: "warning",
  234. });
  235. }
  236. });
  237. },
  238. detailClose(val) {
  239. if (val == "update") {
  240. //编辑
  241. this.init(this.page);
  242. } else if (val == "update_new") {
  243. //复制或者新建
  244. this.init(1);
  245. this.$refs.multipleTable.bodyWrapper.scrollTop = 0;
  246. }
  247. this.massMsgFlag = false;
  248. },
  249. createdMassMsg() {
  250. this.detail_rule_id = "";
  251. this.massMsgFlag = true;
  252. },
  253. goDetail(data) {
  254. this.detail_rule_id = data.rule_id;
  255. this.massMsgFlag = true;
  256. },
  257. // 监听点击切换"状态"
  258. async onClickStatus(row) {
  259. try {
  260. await this.$confirm(
  261. `确定${row.status == 0 ? "启用" : "禁用"}【${row.title}】?`,
  262. "提示",
  263. {
  264. confirmButtonText: "确定",
  265. cancelButtonText: "取消",
  266. type: "warning",
  267. }
  268. );
  269. this.handleChangeStatus(row);
  270. } catch (error) {
  271. console.log(error);
  272. }
  273. },
  274. // 执行“切换状态”
  275. async handleChangeStatus({ rule_id, status }) {
  276. try {
  277. this.loading = true;
  278. const url = `${this.URL.BASEURL}${this.URL.inviteRule_editStatus}`;
  279. const params = {
  280. rule_id,
  281. status: status == 1 ? 0 : 1,
  282. };
  283. const { data: res = {} } = await this.$axios.get(url, { params });
  284. if (res && res.errno == 0) {
  285. this.$message.success("操作成功");
  286. this.init();
  287. } else if (res.errno != 4002) {
  288. this.$message.warning(res.err);
  289. }
  290. } catch (error) {
  291. console.log(error);
  292. } finally {
  293. this.loading = false;
  294. }
  295. },
  296. init(page, type) {
  297. if (type != "export") {
  298. this.page = page ? page : this.page;
  299. } else {
  300. if (this.total == 0) {
  301. this.$message({
  302. message: "暂无数据可导出",
  303. type: "warning",
  304. });
  305. return;
  306. }
  307. }
  308. this.loading = true;
  309. this.$axios
  310. .get(this.URL.BASEURL + this.URL.inviteRuleList, {
  311. params: {
  312. page: type == "export" ? 1 : this.page,
  313. page_size:
  314. type == "export"
  315. ? this.$store.state.exportNumber
  316. : this.page_size,
  317. keyword: this.keyword,
  318. user_id: this.user_id,
  319. status: this.status,
  320. },
  321. })
  322. .then((res) => {
  323. var res = res.data;
  324. this.loading = false;
  325. if (res && res.errno == 0) {
  326. if (type == "export") {
  327. this.exportEvent(res.rst.data);
  328. } else {
  329. this.tableData = res.rst.data;
  330. this.total = res.rst.pageInfo.total;
  331. this.pages = res.rst.pageInfo.pages;
  332. }
  333. } else if (res.errno != 4002) {
  334. this.$message.warning(res.err);
  335. }
  336. })
  337. .catch((err) => {
  338. this.loading = false;
  339. });
  340. },
  341. handleCurrentChange(val) {
  342. this.init(val);
  343. },
  344. onChangeUser(val) {
  345. this.user_id = val ? val.user_id : "";
  346. this.init(1);
  347. },
  348. onChangeStatus(val) {
  349. this.status = val;
  350. this.init(1);
  351. },
  352. exportEvent(data) {
  353. let list = data;
  354. let tHeader = ["标题", "创建人", "拉群类型", "规则状态"];
  355. let filterVal = ["title", "user_name", "join_type", "status"];
  356. list.forEach((item) => {
  357. item.join_type =
  358. item.join_type == 1
  359. ? "顺序拉群"
  360. : item.join_type == 2
  361. ? "随机拉群"
  362. : "-";
  363. item.status =
  364. item.status == 1 ? "启用" : item.status == 0 ? "禁用" : "-";
  365. });
  366. let excelDatas = [
  367. {
  368. tHeader: tHeader, // sheet表一头部
  369. filterVal: filterVal, // 表一的数据字段
  370. tableDatas: list, // 表一的整体json数据
  371. sheetName: "", // 表一的sheet名字
  372. },
  373. ];
  374. this.$exportOrder({
  375. excelDatas,
  376. name: `邀请入群配置(导出时间:${this.$getDay(0)})`,
  377. });
  378. },
  379. },
  380. };
  381. </script>
  382. <style lang="scss" scoped>
  383. @import "@/style/list.scss";
  384. .tableInfo {
  385. height: 50px;
  386. }
  387. .table_button {
  388. margin: 0 4px;
  389. min-width: 26px;
  390. }
  391. .inviteRuleList-wrap {
  392. /deep/ .el-switch.is-disabled .el-switch__core {
  393. cursor: pointer;
  394. }
  395. /deep/ .el-switch.is-disabled {
  396. opacity: 1;
  397. }
  398. }
  399. </style>