index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. :model="queryParams"
  5. ref="queryForm"
  6. size="small"
  7. :inline="true"
  8. v-show="showSearch"
  9. label-width="100px"
  10. >
  11. <el-form-item label="渠道名称" prop="channelName">
  12. <el-input
  13. v-model="queryParams.channelName"
  14. placeholder="请输入渠道名称"
  15. clearable
  16. @keyup.enter.native="handleQuery"
  17. />
  18. </el-form-item>
  19. <el-form-item label="渠道编号" prop="channelCode">
  20. <el-input
  21. v-model="queryParams.channelCode"
  22. placeholder="请输入渠道编号"
  23. clearable
  24. @keyup.enter.native="handleQuery"
  25. />
  26. </el-form-item>
  27. <el-form-item label="渠道类别" prop="channelType">
  28. <el-select v-model="queryParams.channelType" placeholder="全部">
  29. <el-option
  30. v-for="dict in dict.type.channel_type"
  31. :key="dict.value"
  32. :label="dict.label"
  33. :value="dict.value"
  34. ></el-option>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="联系人" prop="contacts">
  38. <el-input
  39. v-model="queryParams.contacts"
  40. placeholder="请输入联系人"
  41. clearable
  42. @keyup.enter.native="handleQuery"
  43. />
  44. </el-form-item>
  45. <el-form-item label="联系电话" prop="telephone">
  46. <el-input
  47. v-model="queryParams.telephone"
  48. placeholder="请输入联系电话"
  49. clearable
  50. maxlength="11"
  51. @keyup.enter.native="handleQuery"
  52. />
  53. </el-form-item>
  54. <el-form-item label="渠道负责人" prop="channelHead">
  55. <el-input
  56. v-model="queryParams.channelHead"
  57. placeholder="请输入渠道负责人"
  58. clearable
  59. @keyup.enter.native="handleQuery"
  60. />
  61. </el-form-item>
  62. <el-form-item>
  63. <el-button
  64. type="primary"
  65. icon="el-icon-search"
  66. size="mini"
  67. @click="handleQuery"
  68. >搜索</el-button
  69. >
  70. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  71. >重置</el-button
  72. >
  73. </el-form-item>
  74. </el-form>
  75. <el-row :gutter="10" class="mb8">
  76. <el-col :span="1.5">
  77. <el-button
  78. type="primary"
  79. plain
  80. icon="el-icon-plus"
  81. size="mini"
  82. @click="handleAdd"
  83. v-hasPermi="['invest:channel:add']"
  84. >新增</el-button
  85. >
  86. </el-col>
  87. <el-col :span="1.5">
  88. <el-button
  89. type="success"
  90. plain
  91. icon="el-icon-edit"
  92. size="mini"
  93. :disabled="single"
  94. @click="handleUpdate"
  95. v-hasPermi="['invest:channel:edit']"
  96. >修改</el-button
  97. >
  98. </el-col>
  99. <el-col :span="1.5">
  100. <el-button
  101. type="danger"
  102. plain
  103. icon="el-icon-delete"
  104. size="mini"
  105. :disabled="multiple"
  106. @click="handleDelete"
  107. v-hasPermi="['invest:channel:remove']"
  108. >删除</el-button
  109. >
  110. </el-col>
  111. <el-col :span="1.5">
  112. <el-button
  113. type="warning"
  114. plain
  115. icon="el-icon-download"
  116. size="mini"
  117. @click="handleExport"
  118. v-hasPermi="['invest:channel:export']"
  119. >导出</el-button
  120. >
  121. </el-col>
  122. <right-toolbar
  123. :showSearch.sync="showSearch"
  124. @queryTable="getList"
  125. ></right-toolbar>
  126. </el-row>
  127. <el-table
  128. v-loading="loading"
  129. border
  130. :data="channelList"
  131. @selection-change="handleSelectionChange"
  132. >
  133. <el-table-column type="selection" width="55" align="center" />
  134. <!-- <el-table-column label="主键ID" align="center" prop="id" /> -->
  135. <el-table-column label="渠道名称" align="center" prop="channelName" />
  136. <el-table-column label="渠道编号" align="center" prop="channelCode" />
  137. <el-table-column label="渠道类别" align="center" prop="channelType">
  138. <template slot-scope="scope">
  139. <dict-tag
  140. :options="dict.type.channel_type"
  141. :value="scope.row.channelType"
  142. />
  143. </template>
  144. </el-table-column>
  145. <el-table-column label="联系人" align="center" prop="contacts" />
  146. <el-table-column label="联系电话" align="center" prop="telephone" />
  147. <el-table-column label="渠道负责人" align="center" prop="channelHead" />
  148. <el-table-column label="状态" align="center" prop="status">
  149. <template slot-scope="scope">
  150. <dict-tag
  151. :options="dict.type.channel_status"
  152. :value="scope.row.status"
  153. />
  154. </template>
  155. </el-table-column>
  156. <el-table-column label="创建人" align="center" prop="createBy" />
  157. <el-table-column
  158. label="创建时间"
  159. align="center"
  160. prop="createTime"
  161. width="150"
  162. />
  163. <el-table-column
  164. label="操作"
  165. align="center"
  166. class-name="small-padding fixed-width"
  167. >
  168. <template slot-scope="scope">
  169. <el-button
  170. size="mini"
  171. type="text"
  172. icon="el-icon-edit"
  173. @click="handleUpdate(scope.row)"
  174. v-hasPermi="['invest:channel:edit']"
  175. >修改</el-button
  176. >
  177. <el-button
  178. class="custom-red-color"
  179. size="mini"
  180. type="text"
  181. icon="el-icon-delete"
  182. @click="handleDelete(scope.row)"
  183. v-hasPermi="['invest:channel:remove']"
  184. >删除</el-button
  185. >
  186. </template>
  187. </el-table-column>
  188. </el-table>
  189. <pagination
  190. v-show="total > 0"
  191. :total="total"
  192. :page.sync="queryParams.pageNum"
  193. :limit.sync="queryParams.pageSize"
  194. @pagination="getList"
  195. />
  196. <!-- 添加或修改渠道信息对话框 -->
  197. <el-dialog
  198. :title="title"
  199. :visible.sync="open"
  200. width="1000px"
  201. append-to-body
  202. >
  203. <el-form
  204. class="special-el-form"
  205. ref="form"
  206. :model="form"
  207. :rules="rules"
  208. label-width="120px"
  209. >
  210. <el-form-item label="渠道名称" prop="channelName">
  211. <el-input v-model="form.channelName" placeholder="请输入渠道名称" />
  212. </el-form-item>
  213. <el-form-item label="组别" prop="channelGroup">
  214. <el-select v-model="form.channelGroup" placeholder="请选择组别">
  215. <el-option
  216. v-for="dict in dict.type.project_group"
  217. :key="dict.value"
  218. :label="dict.label"
  219. :value="dict.value"
  220. ></el-option>
  221. </el-select>
  222. </el-form-item>
  223. <el-form-item label="类别" prop="channelType">
  224. <el-select v-model="form.channelType" placeholder="请选择类别">
  225. <el-option
  226. v-for="dict in dict.type.channel_type"
  227. :key="dict.value"
  228. :label="dict.label"
  229. :value="dict.value"
  230. ></el-option>
  231. </el-select>
  232. </el-form-item>
  233. <el-form-item label="联系人" prop="contacts">
  234. <el-input v-model="form.contacts" placeholder="请输入联系人" />
  235. </el-form-item>
  236. <el-form-item label="联系电话" prop="telephone">
  237. <el-input v-model="form.telephone" placeholder="请输入联系电话" />
  238. </el-form-item>
  239. <el-form-item label="地址" prop="address">
  240. <el-input v-model="form.address" placeholder="请输入地址" />
  241. </el-form-item>
  242. <el-form-item label="渠道负责人" prop="channelHead">
  243. <div class="el-input__inner inputSimulation" @click="openSelectDept">
  244. {{ form.channelHead ? form.channelHead : "请选择渠道负责人" }}
  245. </div>
  246. <selecDept
  247. ref="selecDepts"
  248. @getDeptUserInfo="getDeptUserInfo"
  249. :deptId="deptId"
  250. ></selecDept>
  251. </el-form-item>
  252. <el-form-item label="状态" prop="status">
  253. <el-select v-model="form.status" placeholder="请选择状态">
  254. <el-option
  255. v-for="dict in dict.type.channel_status"
  256. :key="dict.value"
  257. :label="dict.label"
  258. :value="dict.value"
  259. ></el-option>
  260. </el-select>
  261. </el-form-item>
  262. <el-form-item label="附件" prop="file">
  263. <fileItem
  264. ref="fileItems"
  265. :id="form.id"
  266. @getFileList="getFileList"
  267. ></fileItem>
  268. </el-form-item>
  269. <el-form-item
  270. label="简介"
  271. prop="channelBlurb"
  272. class="special-el-form-item"
  273. >
  274. <el-input
  275. rows="4"
  276. type="textarea"
  277. v-model="form.channelBlurb"
  278. placeholder="请输入简介"
  279. />
  280. </el-form-item>
  281. <el-form-item label="备注" prop="mark" class="special-el-form-item">
  282. <el-input
  283. rows="4"
  284. type="textarea"
  285. v-model="form.mark"
  286. placeholder="请输入备注"
  287. />
  288. </el-form-item>
  289. </el-form>
  290. <div slot="footer" class="dialog-footer">
  291. <el-button type="primary" @click="submitForm">确 定</el-button>
  292. <el-button @click="cancel">取 消</el-button>
  293. </div>
  294. </el-dialog>
  295. </div>
  296. </template>
  297. <script>
  298. import {
  299. listChannel,
  300. getChannel,
  301. delChannel,
  302. addChannel,
  303. updateChannel,
  304. } from "@/api/invest/channel";
  305. import selecDept from "../components/selecDept";
  306. import fileItem from "../components/fileItem";
  307. export default {
  308. name: "Channel",
  309. components: { fileItem, selecDept },
  310. dicts: ["channel_type", "channel_status", "project_group"],
  311. data() {
  312. return {
  313. fileList: [],
  314. deptId: "",
  315. // 遮罩层
  316. loading: true,
  317. // 选中数组
  318. ids: [],
  319. // 非单个禁用
  320. single: true,
  321. // 非多个禁用
  322. multiple: true,
  323. // 显示搜索条件
  324. showSearch: true,
  325. // 总条数
  326. total: 0,
  327. // 渠道信息表格数据
  328. channelList: [],
  329. // 弹出层标题
  330. title: "",
  331. // 是否显示弹出层
  332. open: false,
  333. // 查询参数
  334. queryParams: {
  335. pageNum: 1,
  336. pageSize: 10,
  337. channelName: null,
  338. channelCode: null,
  339. channelType: null,
  340. channelBlurb: null,
  341. contacts: null,
  342. telephone: null,
  343. channelHead: null,
  344. status: null,
  345. channelGroup: null,
  346. orderByColumn: "createTime",
  347. isAsc: "desc",
  348. },
  349. // 表单参数
  350. form: {
  351. id: null,
  352. channelName: null,
  353. channelCode: null,
  354. channelType: null,
  355. channelBlurb: null,
  356. contacts: null,
  357. telephone: null,
  358. address: null,
  359. channelHead: null,
  360. status: null,
  361. mark: null,
  362. delFlag: null,
  363. createBy: null,
  364. createTime: null,
  365. updateBy: null,
  366. updateTime: null,
  367. listFile: null,
  368. channelGroup: null,
  369. },
  370. // 表单校验
  371. rules: {
  372. channelName: [{ required: true, trigger: "blur", message: "请输入" }],
  373. channelGroup: [
  374. { required: true, trigger: "change", message: "请选择" },
  375. ],
  376. channelType: [{ required: true, trigger: "change", message: "请选择" }],
  377. channelBlurb: [{ required: true, trigger: "blur", message: "请输入" }],
  378. contacts: [{ required: true, trigger: "blur", message: "请输入" }],
  379. telephone: [
  380. { required: true, trigger: "blur", message: "请输入" },
  381. {
  382. pattern: /^1[3456789]\d{9}$/,
  383. message: "请输入正确的手机号",
  384. trigger: "blur",
  385. },
  386. ],
  387. address: [{ required: true, trigger: "blur", message: "请输入" }],
  388. channelHead: [{ required: true, trigger: "change", message: "请选择" }],
  389. status: [{ required: true, trigger: "change", message: "请选择" }],
  390. },
  391. };
  392. },
  393. created() {
  394. this.getList();
  395. },
  396. methods: {
  397. // 选择部门人
  398. openSelectDept() {
  399. this.$refs.selecDepts.show();
  400. },
  401. getDeptUserInfo(info) {
  402. if (info.length > 0) {
  403. this.form.channelHead = info[0].nickName;
  404. this.$refs.form.clearValidate(["channelHead"]);
  405. }
  406. },
  407. // 获取fileList
  408. getFileList(fileList) {
  409. this.fileList = fileList;
  410. },
  411. /** 查询渠道信息列表 */
  412. getList() {
  413. this.loading = true;
  414. listChannel(this.queryParams).then((response) => {
  415. this.channelList = response.rows;
  416. this.total = response.total;
  417. this.loading = false;
  418. });
  419. },
  420. // 取消按钮
  421. cancel() {
  422. this.open = false;
  423. this.reset();
  424. },
  425. // 表单重置
  426. reset() {
  427. this.form = {
  428. id: null,
  429. channelName: null,
  430. channelCode: null,
  431. channelType: null,
  432. channelBlurb: null,
  433. contacts: null,
  434. telephone: null,
  435. address: null,
  436. channelHead: null,
  437. status: null,
  438. mark: null,
  439. delFlag: null,
  440. createBy: null,
  441. createTime: null,
  442. updateBy: null,
  443. updateTime: null,
  444. listFile: null,
  445. channelGroup: null,
  446. };
  447. this.resetForm("form");
  448. },
  449. /** 搜索按钮操作 */
  450. handleQuery() {
  451. this.queryParams.pageNum = 1;
  452. this.getList();
  453. },
  454. /** 重置按钮操作 */
  455. resetQuery() {
  456. this.resetForm("queryForm");
  457. this.queryParams.orderByColumn = "createTime";
  458. this.queryParams.isAsc = "desc";
  459. this.handleQuery();
  460. },
  461. // 多选框选中数据
  462. handleSelectionChange(selection) {
  463. this.ids = selection.map((item) => item.id);
  464. this.idsName = selection.map((item) => item.channelName);
  465. this.single = selection.length !== 1;
  466. this.multiple = !selection.length;
  467. },
  468. /** 新增按钮操作 */
  469. handleAdd() {
  470. let that = this;
  471. this.reset();
  472. this.open = true;
  473. this.title = "添加渠道信息";
  474. setTimeout(() => {
  475. that.$refs.fileItems.fileList = [];
  476. }, 200);
  477. },
  478. /** 修改按钮操作 */
  479. handleUpdate(row) {
  480. this.reset();
  481. const id = row.id || this.ids;
  482. getChannel(id).then((response) => {
  483. this.form = response.data;
  484. this.open = true;
  485. this.title = "修改渠道信息";
  486. setTimeout(() => {
  487. this.$refs.fileItems.getListFileBusinessId(id);
  488. }, 200);
  489. });
  490. },
  491. /** 提交按钮 */
  492. submitForm() {
  493. this.$refs["form"].validate((valid) => {
  494. if (valid) {
  495. this.form.listFile = this.fileList;
  496. if (this.form.id != null) {
  497. updateChannel(this.form).then((response) => {
  498. this.$modal.msgSuccess("修改成功");
  499. this.open = false;
  500. this.getList();
  501. });
  502. } else {
  503. addChannel(this.form).then((response) => {
  504. this.$modal.msgSuccess("新增成功");
  505. this.open = false;
  506. this.getList();
  507. });
  508. }
  509. }
  510. });
  511. },
  512. /** 删除按钮操作 */
  513. handleDelete(row) {
  514. const ids = row.id || this.ids;
  515. const idsName = row.channelName ? row.channelName : this.idsName;
  516. this.$modal
  517. .confirm('是否确认删除"' + idsName + '"?')
  518. .then(function () {
  519. return delChannel(ids);
  520. })
  521. .then(() => {
  522. this.getList();
  523. this.$modal.msgSuccess("删除成功");
  524. })
  525. .catch(() => {});
  526. },
  527. /** 导出按钮操作 */
  528. handleExport() {
  529. this.download(
  530. "invest/channel/export",
  531. {
  532. ...this.queryParams,
  533. },
  534. `channel_${new Date().getTime()}.xlsx`
  535. );
  536. },
  537. },
  538. };
  539. </script>