index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. /*消息配置*/
  2. <template>
  3. <div class="table-box">
  4. <el-form>
  5. <el-form-item style="float: left">
  6. <el-button
  7. type="primary"
  8. icon="el-icon-plus"
  9. @click="dialogAddVisible = true"
  10. class="lake-Blue"
  11. >
  12. 新增
  13. </el-button>
  14. </el-form-item>
  15. </el-form>
  16. <el-table
  17. ref="multipleTable"
  18. v-loading="loding"
  19. :data="tableData"
  20. element-loading-text="加载中..."
  21. border
  22. fit
  23. highlight-current-row
  24. height="500"
  25. @row-dblclick="rowClick"
  26. >
  27. <template slot="empty">
  28. <img src="" alt />
  29. <p>暂无数据</p>
  30. </template>
  31. <el-table-column
  32. fixed="left"
  33. align="center"
  34. type="index"
  35. label="序号"
  36. width="50"
  37. />
  38. <el-table-column label="消息标题" prop="msgTitle" align="center" />
  39. <el-table-column label="消息类型" prop="msgType" align="center">
  40. <template slot-scope="scope">
  41. <span v-if="scope.row.msgType === 'notice'"> 通知 </span>
  42. <span v-if="scope.row.msgType === 'warning'"> 预警 </span>
  43. <span v-if="scope.row.msgType === 'inform'"> 告知 </span>
  44. </template>
  45. </el-table-column>
  46. <el-table-column label="消息大类" prop="msgClass" align="center">
  47. <template slot-scope="scope">
  48. <span v-if="scope.row.msgClass === '1'"> 业务 </span>
  49. <span v-if="scope.row.msgClass === '0'"> 资质 </span>
  50. <span v-if="scope.row.msgClass === '2'"> 审核 </span>
  51. <span v-if="scope.row.msgClass === '3'"> 对账 </span>
  52. <span v-if="scope.row.msgClass === '4'"> 库存 </span>
  53. </template>
  54. </el-table-column>
  55. <el-table-column label="启用/停用" prop="invdFlag" align="center">
  56. <template slot-scope="scope">
  57. <el-switch
  58. v-model="scope.row.invdFlag"
  59. active-color="#13ce66"
  60. inactive-color="#ff4949"
  61. active-value="0"
  62. inactive-value="1"
  63. @change="handleSwitch(scope.row)"
  64. >
  65. </el-switch>
  66. </template>
  67. </el-table-column>
  68. <el-table-column
  69. align="center"
  70. label="操作"
  71. #default="{ row }"
  72. fixed="right"
  73. >
  74. <span class="operate-btn" @click.stop="editData(row)">编辑</span>
  75. </el-table-column>
  76. </el-table>
  77. <div class="block">
  78. <el-pagination
  79. @size-change="handleSizeChange"
  80. @current-change="handleCurrentChange"
  81. :current-page="crutPage"
  82. :page-sizes="[10, 20, 30, 40]"
  83. :page-size="pageSize"
  84. layout="total, sizes, prev, pager, next, jumper"
  85. :total="total"
  86. >
  87. </el-pagination>
  88. </div>
  89. <el-dialog
  90. title="消息编辑"
  91. :visible.sync="dialogVisible"
  92. width="50%"
  93. :before-close="handleClose"
  94. >
  95. <el-form
  96. :model="formAdd"
  97. ref="queryAddForm"
  98. :inline="true"
  99. label-width="90px"
  100. label-position="left"
  101. >
  102. <el-form-item label="消息类型" prop="msgType">
  103. <template slot-scope="scope">
  104. <el-select v-model="selectedItem.msgType" placeholder="请选择">
  105. <el-option
  106. v-for="item in formMsgType"
  107. :key="item.listId"
  108. :label="item.listName"
  109. :value="item.listId"
  110. ></el-option>
  111. </el-select>
  112. </template>
  113. </el-form-item>
  114. <el-form-item label="消息大类" prop="msgClass">
  115. <template slot-scope="scope">
  116. <el-select v-model="selectedItem.msgClass" placeholder="请选择">
  117. <el-option
  118. v-for="item in formMsgClass"
  119. :key="item.listId"
  120. :label="item.listName"
  121. :value="item.listId"
  122. ></el-option>
  123. </el-select>
  124. </template>
  125. </el-form-item>
  126. <el-form-item label="消息内容">
  127. <el-input
  128. style="width: 600px"
  129. v-model="selectedItem.msgText"
  130. placeholder="请输入消息内容"
  131. type="textarea"
  132. ></el-input>
  133. </el-form-item>
  134. </el-form>
  135. <div class="dialog-content">
  136. <el-button
  137. type="primary"
  138. icon="el-icon-plus"
  139. class="lake-Blue Listbutton"
  140. @click="newAdd(form)"
  141. >添加行</el-button
  142. >
  143. <el-table
  144. :data="form"
  145. element-loading-text="加载中..."
  146. border
  147. fit
  148. highlight-current-row
  149. height="200"
  150. >
  151. <el-table-column label="权限类型" prop="msgPermType" align="center">
  152. <template slot-scope="scope">
  153. <el-select v-model="scope.row.msgPermType" placeholder="请选择">
  154. <el-option
  155. v-for="item in formBase"
  156. :key="item.listId"
  157. :label="item.listName"
  158. :value="item.listId"
  159. ></el-option>
  160. </el-select>
  161. </template>
  162. </el-table-column>
  163. <el-table-column label="权限内容" prop="msgPermId" align="center">
  164. <template slot-scope="scope">
  165. <el-input v-model="scope.row.msgPermId"></el-input>
  166. </template>
  167. </el-table-column>
  168. <el-table-column label="操作" align="center">
  169. <template slot-scope="scope">
  170. <el-button
  171. class="red"
  172. type="text"
  173. @click="handleDelete(scope.$index, form)"
  174. >删除</el-button
  175. >
  176. </template>
  177. </el-table-column>
  178. </el-table>
  179. <el-button
  180. type="primary"
  181. icon="el-icon-plus"
  182. class="lake-Blue Testbutton"
  183. @click="newAdd(formEcan)"
  184. >添加行</el-button
  185. >
  186. <el-table
  187. :data="formEcan"
  188. element-loading-text="加载中..."
  189. border
  190. fit
  191. highlight-current-row
  192. height="200"
  193. >
  194. <el-table-column
  195. label="占位符颜色"
  196. prop="msgColumnColor"
  197. align="center"
  198. >
  199. <template slot-scope="scope">
  200. <el-select
  201. v-model="scope.row.msgColumnColor"
  202. placeholder="请选择"
  203. >
  204. <el-option
  205. v-for="item in talSelectData"
  206. :key="item.value"
  207. :label="item.label"
  208. :value="item.value"
  209. ></el-option>
  210. </el-select>
  211. </template>
  212. </el-table-column>
  213. <el-table-column
  214. label="占位符路由"
  215. prop="msgRoutePath"
  216. align="center"
  217. >
  218. <template slot-scope="scope">
  219. <el-input v-model="scope.row.msgRoutePath"></el-input>
  220. </template>
  221. </el-table-column>
  222. <el-table-column label="URL" prop="url" align="center">
  223. <template slot-scope="scope">
  224. <el-input v-model="scope.row.url"></el-input>
  225. </template>
  226. </el-table-column>
  227. <el-table-column label="占位符" prop="msgHolder" align="center">
  228. <template slot-scope="scope">
  229. <el-input v-model="scope.row.msgHolder"></el-input>
  230. </template>
  231. </el-table-column>
  232. <el-table-column label="参数" prop="msgKey" align="center">
  233. <template slot-scope="scope">
  234. <el-input v-model="scope.row.msgKey"></el-input>
  235. </template>
  236. </el-table-column>
  237. <el-table-column label="操作" align="center">
  238. <template slot-scope="scope">
  239. <el-button
  240. class="red"
  241. type="text"
  242. @click="handleDelete(scope.$index, formEcan)"
  243. >删除</el-button
  244. >
  245. </template>
  246. </el-table-column>
  247. </el-table>
  248. </div>
  249. <span slot="footer" class="dialog-footer">
  250. <el-button type="primary" @click="saveData()">保存</el-button>
  251. </span>
  252. </el-dialog>
  253. <el-dialog
  254. title="新增消息"
  255. :visible.sync="dialogAddVisible"
  256. width="30%"
  257. :before-close="handleCloseAdd"
  258. >
  259. <el-form
  260. :model="formAdd"
  261. ref="queryAddForm"
  262. :inline="true"
  263. label-width="90px"
  264. label-position="left"
  265. :rules="rules"
  266. >
  267. <el-form-item label="消息标题" prop="msgTitle">
  268. <el-input
  269. v-model.trim="formAdd.msgTitle"
  270. placeholder="请输入消息标题"
  271. />
  272. </el-form-item>
  273. <el-form-item label="消息类型" prop="msgType">
  274. <template slot-scope="scope">
  275. <el-select v-model="formAdd.msgType" placeholder="请选择">
  276. <el-option
  277. v-for="item in formMsgType"
  278. :key="item.listId"
  279. :label="item.listName"
  280. :value="item.listId"
  281. ></el-option>
  282. </el-select>
  283. </template>
  284. </el-form-item>
  285. <el-form-item label="消息大类" prop="msgClass">
  286. <template slot-scope="scope">
  287. <el-select v-model="formAdd.msgClass" placeholder="请选择">
  288. <el-option
  289. v-for="item in formMsgClass"
  290. :key="item.listId"
  291. :label="item.listName"
  292. :value="item.listId"
  293. ></el-option>
  294. </el-select>
  295. </template>
  296. </el-form-item>
  297. </el-form>
  298. <span slot="footer" class="dialog-footer">
  299. <el-button type="primary" @click="saveDataAdd()">保存</el-button>
  300. </span>
  301. </el-dialog>
  302. </div>
  303. </template>
  304. <script>
  305. import {
  306. selectMsgDetl,
  307. selectListBase,
  308. saveMsgConfig,
  309. disabMsgConfig
  310. } from "@/api/system/configure-messages";
  311. export default {
  312. name: "tableView",
  313. props: {
  314. getTableData: {
  315. type: Object,
  316. default: {}
  317. },
  318. getsearchData: {
  319. type: Object,
  320. default: {}
  321. }
  322. },
  323. data() {
  324. return {
  325. loding: false, // 表格数据加载loding
  326. tableData: [], // 表格数据
  327. total: 0,
  328. pageSize: 10,
  329. crutPage: 1,
  330. searchData: {},
  331. dialogVisible: false,
  332. dialogAddVisible: false,
  333. talSelectData: [
  334. { value: "red", label: "红色" },
  335. { value: "yellow", label: "黄色" },
  336. { value: "blue", label: "蓝色" }
  337. ],
  338. formAdd: {
  339. msgTitle: "",
  340. msgType: "",
  341. msgClass: ""
  342. },
  343. formEcan: [],
  344. formBase: [], //消息配置下拉
  345. formList: [],
  346. formMsgClass: [],
  347. formMsgType: [],
  348. form: [],
  349. selectedItem: {}, //存储数据
  350. rules: {
  351. msgTitle: [
  352. {
  353. required: true,
  354. message: "标题消息不能为空",
  355. trigger: "blur"
  356. }
  357. ],
  358. msgType: [
  359. {
  360. required: true,
  361. message: "请选择",
  362. trigger: "change"
  363. }
  364. ],
  365. msgClass: [
  366. {
  367. required: true,
  368. message: "请选择",
  369. trigger: "change"
  370. }
  371. ]
  372. }
  373. };
  374. },
  375. created() {
  376. this.listBase();
  377. },
  378. methods: {
  379. saveDataAdd() {
  380. this.$refs["queryAddForm"].validate(async valid => {
  381. if (valid) {
  382. try {
  383. const res = await saveMsgConfig(this.formAdd);
  384. if (res.success === true) {
  385. this.$message({
  386. message: "保存成功",
  387. type: "success"
  388. });
  389. this.dialogAddVisible = false;
  390. this.$emit("refreshData");
  391. this.formAdd = {};
  392. this.$nextTick(() => {
  393. this.$refs["queryAddForm"].clearValidate();
  394. });
  395. }
  396. } catch (error) {
  397. console.error("保存数据时出错:", error);
  398. this.$message({
  399. message: "错误,请稍后再试",
  400. type: "error"
  401. });
  402. }
  403. } else {
  404. this.$message({
  405. message: "请检查表单填写是否正确",
  406. type: "warning"
  407. });
  408. }
  409. });
  410. },
  411. newAdd(rows) {
  412. const lastRow = rows[rows.length - 1] || {};
  413. const newRow = JSON.parse(JSON.stringify(lastRow));
  414. delete newRow.id;
  415. rows.push(newRow);
  416. },
  417. handleDelete(index, rows) {
  418. rows.splice(index, 1);
  419. },
  420. //编辑
  421. async editData(row) {
  422. this.selectedItem = { ...row };
  423. selectMsgDetl({ msgId: row.msgId }).then(res => {
  424. if (res.success === true) {
  425. this.form = res.data.permRespDTOS;
  426. this.formEcan = res.data.placeRespDTOS;
  427. }
  428. }),
  429. (this.dialogVisible = true);
  430. },
  431. // 下拉
  432. async listBase() {
  433. const [permRes, msgTypeRes, msgClassRes] = await Promise.all([
  434. selectListBase({ listType: "perm" }),
  435. selectListBase({ listType: "msgType " }),
  436. selectListBase({ listType: "msgClass " })
  437. ]);
  438. if (permRes.success) {
  439. this.formBase = permRes.data;
  440. }
  441. // if (routeRes.success) {
  442. // this.formList = routeRes.data;
  443. // }
  444. if (msgTypeRes.success) {
  445. this.formMsgType = msgTypeRes.data;
  446. }
  447. if (msgClassRes.success) {
  448. this.formMsgClass = msgClassRes.data;
  449. }
  450. },
  451. // 保存数据
  452. saveData() {
  453. // const permReqDTOS = this.form.map((item) => ({
  454. // id: item.id,
  455. // msgId: item.msgId,
  456. // msgPermType: item.msgPermType,
  457. // msgPermId: item.msgPermId,
  458. // }));
  459. // const placeReqDTOS = this.formEcan.map((item) => ({
  460. // id: item.id,
  461. // msgId: item.msgId,
  462. // msgColumnColor: item.msgColumnColor,
  463. // msgRoutePath: item.msgRoutePath,
  464. // msgHolder: item.msgHolder,
  465. // }));
  466. const data = {
  467. msgId: this.selectedItem.msgId,
  468. msgClass: this.selectedItem.msgClass,
  469. msgText: this.selectedItem.msgText,
  470. msgType: this.selectedItem.msgType,
  471. msgTitle: this.selectedItem.msgTitle,
  472. permReqDTOS: this.form,
  473. placeReqDTOS: this.formEcan
  474. };
  475. saveMsgConfig(data).then(res => {
  476. if (res.success == true) {
  477. this.$message({
  478. message: "保存成功",
  479. type: "success"
  480. });
  481. this.dialogVisible = false;
  482. }
  483. this.$emit("refreshData");
  484. });
  485. this.dialogVisible = false;
  486. },
  487. handleClose() {
  488. this.dialogVisible = false;
  489. if (this.$refs.create !== undefined) {
  490. this.$refs.create.resetFields();
  491. }
  492. },
  493. // 启用停用
  494. handleSwitch(row) {
  495. let data = {
  496. msgId: row.msgId,
  497. type: row.invdFlag == "1" ? "disab" : "enab"
  498. };
  499. disabMsgConfig(data)
  500. .then(res => {
  501. this.$message({
  502. message: "操作成功",
  503. type: "success"
  504. });
  505. this.$emit("refreshData");
  506. })
  507. .catch(err => {
  508. console.log(err);
  509. });
  510. },
  511. //每页几条数据
  512. handleSizeChange(val) {
  513. this.pageSize = val;
  514. this.crutPage = 1;
  515. let tablePam = { size: val, current: 1 };
  516. this.$emit("pageTruning", tablePam);
  517. },
  518. // 当前在第几页
  519. handleCurrentChange(val) {
  520. this.crutPage = val;
  521. let tablePam = { size: this.pageSize, current: val };
  522. this.$emit("pageTruning", tablePam);
  523. }
  524. },
  525. watch: {
  526. //表格数据发生改变时重新渲染
  527. getTableData(newData) {
  528. console.log("tableData", newData.current);
  529. let data = newData.records ? newData.records : [];
  530. this.tableData = data;
  531. this.total = newData.total ? newData.total : 0;
  532. this.pageSize = newData.size ? newData.size : 10;
  533. },
  534. getsearchData(newData) {
  535. this.searchData = newData;
  536. }
  537. }
  538. };
  539. </script>
  540. <style scoped lang="scss">
  541. .table-box {
  542. padding: 1px;
  543. position: relative;
  544. padding-bottom: 50px;
  545. .block {
  546. position: absolute;
  547. right: 10px;
  548. bottom: 10px;
  549. }
  550. .operate-btn {
  551. color: #3789ea;
  552. cursor: pointer;
  553. margin-left: 10px;
  554. }
  555. }
  556. .Listbutton {
  557. margin-bottom: 10px;
  558. }
  559. .Testbutton {
  560. margin: 10px 0 10px 0;
  561. }
  562. </style>