appendix.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. <template>
  2. <div style="display: flex; justify-content: space-between">
  3. <fullscreen :fullscreen.sync="fullscreen" class="container" style="margin: 0;width: 100%;">
  4. <div class="container-box" style="padding: 0 20px 0 0;">
  5. <toolList @iconCli='iconCli' :tooltit='tooltit'></toolList>
  6. <div style="overflow: hidden;">
  7. <div class="search" style="float: left;">
  8. <mySearch :searchList="searchList" @searchInfo="searchInfo"></mySearch>
  9. </div>
  10. <div style="margin-top: 20px;float: right;" class="bigbtns">
  11. </div>
  12. </div>
  13. <div class="tabbox">
  14. <el-table height="calc(100% - 40px)" class="com-table" ref="multipleTable" :data="tableData"
  15. tooltip-effect="dark" size="small" border style="width: 100%" v-loading="loading">
  16. <el-table-column prop="name" label="模板名称">
  17. </el-table-column>
  18. <el-table-column prop="opTime" label="创建时间">
  19. </el-table-column>
  20. <el-table-column label="操作" width="180px" align="center" fixed="right">
  21. <template slot-scope="scope">
  22. <el-button size="mini" type="primary" @click="appendixInfo(1,scope.row)">查看</el-button>
  23. <el-button size="mini" v-if="scope.row.finishStatus == 0" type="primary"
  24. @click="appendixInfoAdd(1,scope.row)">处理
  25. </el-button>
  26. <el-button size="mini" v-if="scope.row.finishStatus == 0 && advInfo.isAdmin"
  27. type="danger" @click="delLine(scope.row)">办结
  28. </el-button>
  29. </template>
  30. </el-table-column>
  31. </el-table>
  32. <el-pagination class="pageBox" @current-change="currchange" layout="prev, pager, next" background
  33. :total="total">
  34. </el-pagination>
  35. </div>
  36. <el-dialog title="查看" :visible.sync="appendixInfoStatus" width="70%" :close-on-press-escape="false"
  37. :show-close="true" :before-close="closeAppendixInfoList" :destroy-on-close="true"
  38. :modal-append-to-body="false"
  39. :close-on-click-modal="false" :fullscreen="false">
  40. <div class="tabbox" style="height: 500px">
  41. <el-table height="calc(100% - 50px)" class="com-table" ref="multipleTable"
  42. :data="appendixInfoData"
  43. tooltip-effect="dark" size="small" border style="width: 100%" v-loading="loading">
  44. <el-table-column prop="appendixName" label="模板名称">
  45. </el-table-column>
  46. <el-table-column prop="cityName" label="地市">
  47. </el-table-column>
  48. <el-table-column prop="townName" label="区县">
  49. </el-table-column>
  50. <el-table-column prop="opName" label="上报人">
  51. </el-table-column>
  52. <el-table-column prop="opTime" label="创建时间">
  53. </el-table-column>
  54. <el-table-column label="操作" width="180px" align="center" fixed="right" v-if="appendixInfoFinishStatus == 0">
  55. <template slot-scope="scope">
  56. <el-button size="mini" type="primary" @click="appendixInfoEdit(1,scope.row)">编辑
  57. </el-button>
  58. <el-button size="mini" type="danger" @click="appendixInfoDel(scope.row)">删除
  59. </el-button>
  60. </template>
  61. </el-table-column>
  62. </el-table>
  63. <el-pagination class="pageBox" @current-change="appendixInfoListChange"
  64. layout="prev, pager, next" background
  65. :total="appendixInfoTotal">
  66. </el-pagination>
  67. </div>
  68. <div class="dialog-footer myfooter">
  69. <el-button v-if="advInfo.isAdmin" @click="exportZip()" type="primary">导 出</el-button>
  70. <el-button @click="appendixInfoStatus = false">关 闭</el-button>
  71. </div>
  72. </el-dialog>
  73. <el-dialog title="附件处理" :visible.sync="appendixInfoAddStatus" width="50%" :destroy-on-close="true"
  74. :modal-append-to-body="false" :close-on-click-modal="false">
  75. <div v-loading="loading">
  76. <el-form :model="appendixInfoList" ref="appendixInfoList" :rules="appendixInfoRules">
  77. <div class="info-line">
  78. <el-form-item prop="cityName">
  79. <span>地市</span>
  80. <el-input v-model="appendixInfoList.cityName" placeholder="地市"
  81. :disabled="disableStatus"></el-input>
  82. </el-form-item>
  83. <el-form-item prop="townName">
  84. <span>区县</span>
  85. <el-input v-model="appendixInfoList.townName" placeholder="区县"
  86. :disabled="disableStatus"></el-input>
  87. </el-form-item>
  88. </div>
  89. <div class="info-line">
  90. <el-form-item prop="agentName">
  91. <span>渠道名称</span>
  92. <el-input v-model="appendixInfoList.agentName" placeholder="渠道名称"
  93. :disabled="disableStatus"></el-input>
  94. </el-form-item>
  95. <el-form-item prop="uploadUserName">
  96. <span>上报人</span>
  97. <el-input v-model="appendixInfoList.uploadUserName" placeholder="上报人"
  98. :disabled="disableStatus"></el-input>
  99. </el-form-item>
  100. </div>
  101. <div style="padding-left: 80px" v-if="!disableStatus">
  102. <myUpload @uploadBack="uploadBack" :fileInfo="fileInfo"
  103. :fileList="fileInfo.fileList"></myUpload>
  104. </div>
  105. <div style="padding:0 20px 0 100px" v-if="disableStatus">
  106. <uploadDown :datalist="datalist" :dialogStatus="uploadstatus"></uploadDown>
  107. </div>
  108. <div class="info-line">
  109. 注:上传附件请以渠道名称命名
  110. </div>
  111. </el-form>
  112. <div slot="footer" class="dialog-footer myfooter">
  113. <el-button @click="saveAppendixInfo(1)" type="primary">保 存</el-button>
  114. <el-button @click="appendixInfoAddStatus = false">取 消</el-button>
  115. </div>
  116. </div>
  117. </el-dialog>
  118. </div>
  119. <myMessage :messTit='messTit' @closeMessage="closeMessage" :centerDialogVisible="centerDialogVisible"
  120. v-if="centerDialogVisible"></myMessage>
  121. <myMessage :messTit='appendixInfoDelTit' @closeMessage="appendixInfoDelCloseMessage"
  122. :centerDialogVisible="appendixInfoDelStatus" v-if="appendixInfoDelStatus"></myMessage>
  123. </fullscreen>
  124. </div>
  125. </template>
  126. <script>
  127. import mySearch from "../../../components/search.vue";
  128. import myUpload from "../../../components/upload";
  129. import toolList from "../../../components/toolList";
  130. import myMessage from "../../../components/myMessage.vue"
  131. export default {
  132. components: {
  133. myUpload,
  134. mySearch,
  135. toolList,
  136. myMessage
  137. },
  138. data() {
  139. const cityName = (rule, value, callback) => {
  140. if (!this.appendixInfoList.cityName) {
  141. callback(new Error('不能为空'))
  142. } else {
  143. callback()
  144. }
  145. }
  146. const townName = (rule, value, callback) => {
  147. if (!this.appendixInfoList.townName) {
  148. callback(new Error('不能为空'))
  149. } else {
  150. callback()
  151. }
  152. }
  153. const agentName = (rule, value, callback) => {
  154. if (!this.appendixInfoList.agentName) {
  155. callback(new Error('不能为空'))
  156. } else {
  157. callback()
  158. }
  159. }
  160. const uploadUserName = (rule, value, callback) => {
  161. if (!this.appendixInfoList.uploadUserName) {
  162. callback(new Error('不能为空'))
  163. } else {
  164. callback()
  165. }
  166. }
  167. return {
  168. appendixInfoRules: {
  169. cityName: [{
  170. required: true,
  171. trigger: 'change',
  172. validator: cityName
  173. }],
  174. townName: [{
  175. required: true,
  176. trigger: 'change',
  177. validator: townName
  178. }],
  179. agentName: [{
  180. required: true,
  181. trigger: 'change',
  182. validator: agentName
  183. }],
  184. uploadUserName: [{
  185. required: true,
  186. trigger: 'change',
  187. validator: uploadUserName
  188. }],
  189. },
  190. tooltit: '重点攻坚渠道合作率-附件统计',
  191. searchList: [{
  192. type: 'input',
  193. tit: '名称',
  194. value: '',
  195. width: '100%',
  196. },],
  197. fullscreen: false,
  198. total: 0,
  199. pageSize: 1,
  200. tableData: [{}],
  201. dialogStatus: false,
  202. disableStatus: false,
  203. titname: '终端',
  204. infolist: {},
  205. typeOptions: [{
  206. dataCode: 1,
  207. dataName: 111,
  208. }],
  209. userInfo: {},
  210. params: {},
  211. termOption: [],
  212. centerDialogVisible: false,
  213. messTit: '',
  214. delid: '',
  215. loading: false,
  216. attList: [],
  217. uploadstatus: false,
  218. fileInfo: {
  219. limit: 50,
  220. url: '/sysmgr/noticeatt/upload',
  221. fileList: []
  222. },
  223. datalist: {
  224. url: '/sysmgr/noticeatt/downfile',
  225. type: 2,
  226. attList: []
  227. },
  228. appendixInfoStatus: false,
  229. appendixId: '',
  230. appendixName:'',
  231. appendixInfoData: [{}],
  232. appendixInfoTotal: 0,
  233. appendixInfoListPageSize: 1,
  234. appendixInfoDelTit: '',
  235. appendixInfoDelStatus: false,
  236. appendixInfoDelId: '',
  237. appendixInfoAddStatus: false,
  238. appendixInfoList: {},
  239. appendixInfoFinishStatus:'',
  240. advInfo: {},
  241. }
  242. },
  243. methods: {
  244. //搜索数据
  245. searchInfo(v) {
  246. this.params = {};
  247. v[0] ? this.params.name = v[0] : '';
  248. this.getList(this.params, this.pageSize);
  249. },
  250. //获取列表
  251. getList(v, n) {
  252. this.pageSize = n;
  253. this.loading = true;
  254. this.tableData = [];
  255. let _this = this;
  256. this.$http({
  257. url: "/market/keyChannelCoopAppendix/queryPage",
  258. method: "post",
  259. headers: {
  260. "Content-Type": "application/json",
  261. "page": '{"pageNo":"' + n + '","pageSize":"10"}'
  262. },
  263. data: v,
  264. }).then((res) => {
  265. this.tableData = res.data.data;
  266. this.total = res.data.totalRecord;
  267. this.loading = false;
  268. });
  269. },
  270. //获取列表
  271. getAppendixInfoList(v, n) {
  272. this.appendixInfoListPageSize = n;
  273. this.loading = true;
  274. this.appendixInfoData = [];
  275. let _this = this;
  276. this.$http({
  277. url: "/market/cKeyChannelCoopAppendix/queryAppendixInfoPage",
  278. method: "post",
  279. headers: {
  280. "Content-Type": "application/json",
  281. "page": '{"pageNo":"' + n + '","pageSize":"10"}'
  282. },
  283. data: {
  284. appendixId: this.appendixId
  285. },
  286. }).then((res) => {
  287. this.appendixInfoData = res.data.data;
  288. this.appendixInfoTotal = res.data.totalRecord;
  289. this.loading = false;
  290. });
  291. },
  292. // 分页
  293. currchange(v) {
  294. this.pageSize = v;
  295. this.getList(this.params, this.pageSize);
  296. },
  297. appendixInfoListChange(v) {
  298. this.pageSize = v;
  299. this.getAppendixInfoList(null, this.appendixInfoListPageSize)
  300. },
  301. //查看
  302. appendixInfo(v, n) {
  303. this.appendixId = n.id;
  304. this.appendixName = n.name;
  305. this.appendixInfoFinishStatus = n.finishStatus;
  306. //获取列表数据
  307. this.getAppendixInfoList(1, this.appendixInfoListPageSize)
  308. this.appendixInfoStatus = true;
  309. },
  310. //删除
  311. delLine(v) {
  312. this.centerDialogVisible = true;
  313. this.messTit = '是否确认办结?';
  314. this.delid = v.id;
  315. },
  316. closeMessage(v) {
  317. this.centerDialogVisible = false;
  318. let _this = this;
  319. if (v === 1) {
  320. this.$http({
  321. url: "/market/cKeyChannelCoopAppendix/finishAppendix",
  322. method: "post",
  323. headers: {
  324. "Content-Type": "application/json",
  325. },
  326. data: {
  327. id: this.delid
  328. },
  329. }).then((res) => {
  330. if (res.data.result === 1) {
  331. _this.$message({
  332. message: res.data.desc,
  333. type: 'error'
  334. });
  335. } else {
  336. _this.$message({
  337. message: '办结成功',
  338. type: 'success'
  339. });
  340. _this.getList(this.params, this.pageSize);
  341. }
  342. });
  343. }
  344. },
  345. appendixInfoDel(v) {
  346. this.appendixInfoDelStatus = true;
  347. this.appendixInfoDelTit = '是否确认删除?';
  348. this.appendixInfoDelId = v.id;
  349. },
  350. appendixInfoDelCloseMessage(v) {
  351. this.appendixInfoDelStatus = false;
  352. let _this = this;
  353. if (v === 1) {
  354. this.$http({
  355. url: "/market/cKeyChannelCoopAppendix/delAppendixInfo",
  356. method: "post",
  357. headers: {
  358. "Content-Type": "application/json",
  359. },
  360. data: {
  361. id: this.appendixInfoDelId
  362. },
  363. }).then((res) => {
  364. if (res.data.result === 1) {
  365. _this.$message({
  366. message: res.data.desc,
  367. type: 'error'
  368. });
  369. } else {
  370. _this.$message({
  371. message: '删除成功',
  372. type: 'success'
  373. });
  374. _this.getAppendixInfoList(null, this.pageSize);
  375. }
  376. });
  377. }
  378. },
  379. //查看
  380. appendixInfoAdd(v, n) {
  381. this.appendixInfoList = {
  382. cityName: "",
  383. uploadUserName: "",
  384. agentName: "",
  385. townName: "",
  386. appendixId: n.id,
  387. appendixName: n.name
  388. };
  389. this.disableStatus = false;
  390. var adv = this.advInfo;
  391. this.appendixInfoList.cityName = adv.cityName;
  392. this.appendixInfoList.uploadUserName = adv.userName;
  393. this.appendixInfoAddStatus = true;
  394. },
  395. appendixInfoEdit(v, n) {
  396. var _this = this;
  397. //获取文件列表
  398. this.$http({
  399. url: '/market/cKeyChannelCoopAppendix/queryAppendixFilesList',
  400. method: "post",
  401. headers: {
  402. "Content-Type": "application/json",
  403. },
  404. data: {
  405. appendixInfoId: n.id,
  406. },
  407. }).then((res) => {
  408. if (res.data.result === 1) {
  409. _this.$message({
  410. message: res.data.desc,
  411. type: 'error'
  412. });
  413. } else {
  414. console.log(res.data);
  415. //显示文件列表
  416. this.datalist.attList = res.data;
  417. this.attList = [];
  418. this.fileInfo.fileList = [];
  419. res.data.forEach(item => {
  420. this.fileInfo.fileList.push({
  421. name: item.fileName,
  422. id: item.id,
  423. fileName: item.fileName,
  424. fileCode: item.fileCode,
  425. opName:item.opName,
  426. opNo: item.opNo,
  427. opTime: item.opTime
  428. });
  429. this.attList.push({
  430. name: item.fileName,
  431. id: item.id,
  432. fileName: item.fileName,
  433. fileCode: item.fileCode,
  434. opName:item.opName,
  435. opNo: item.opNo,
  436. opTime: item.opTime
  437. });
  438. })
  439. this.appendixInfoList = Object.assign({}, n); //拷贝
  440. this.appendixInfoAddStatus = true;
  441. }
  442. });
  443. },
  444. saveAppendixInfo(v) {
  445. let _this = this;
  446. _this.appendixInfoList.opNo = _this.userInfo.loginNo;
  447. _this.appendixInfoList.opName = _this.userInfo.loginName;
  448. _this.appendixInfoList.opTime = _this.$formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss');
  449. if (v === 1) {
  450. this.submitAppendixInfo("/market/cKeyChannelCoopAppendix/addAppendixInfo");
  451. }
  452. },
  453. submitAppendixInfo(u) {
  454. let _this = this;
  455. this.$refs.appendixInfoList.validate(valid => {
  456. if (valid) {
  457. this.$http({
  458. url: u,
  459. method: "post",
  460. headers: {
  461. "Content-Type": "application/json",
  462. },
  463. data: {
  464. appendixInfo: _this.appendixInfoList,
  465. filesList: _this.attList
  466. },
  467. }).then((res) => {
  468. if (res.data.result === 1) {
  469. _this.$message({
  470. message: res.data.desc,
  471. type: 'error'
  472. });
  473. } else {
  474. _this.$message({
  475. message: '成功',
  476. type: 'success'
  477. });
  478. _this.fileInfo.fileList = [];
  479. _this.attList = [];
  480. _this.appendixInfoAddStatus = false;
  481. }
  482. });
  483. }
  484. })
  485. },
  486. //功能栏
  487. iconCli(v) {
  488. if (v === 1) {
  489. this.getList(this.params, this.pageSize);
  490. }
  491. if (v === 2) {
  492. this.fullscreen = !this.fullscreen
  493. }
  494. },
  495. getUser() {
  496. this.userInfo = JSON.parse(window.sessionStorage.userInfo);
  497. this.infolist = {
  498. opNo: '',
  499. opName: '',
  500. };
  501. this.infolist.opNo = this.userInfo.loginNo;
  502. this.infolist.opName = this.userInfo.loginName;
  503. },
  504. closeAppendixInfoList() {
  505. this.appendixInfoStatus = false;
  506. },
  507. //文件返回值
  508. uploadBack(v) {
  509. this.attList = v;
  510. },
  511. getAdvUserInfo() {
  512. this.$http({
  513. url: "/market/cKeyChannelCoopExcel/getUserInfo",
  514. method: "post",
  515. headers: {
  516. "Content-Type": "application/json",
  517. },
  518. }).then((res) => {
  519. if (res.data.result !== 1) {
  520. this.advInfo = res.data.body;
  521. }
  522. });
  523. },
  524. exportZip() {
  525. let _this = this;
  526. let param = new FormData();
  527. param.append("id",_this.appendixId);
  528. _this.$http({
  529. url: '/market/cKeyChannelCoopAppendix/downloadAppendixZip',
  530. method: "post",
  531. responseType: 'blob',
  532. headers: {
  533. "Content-Type": "application/json",
  534. },
  535. data: {
  536. id:_this.appendixId
  537. },
  538. }).then(res => {
  539. if (window.navigator && window.navigator.msSaveOrOpenBlob) {
  540. let blob = new Blob([res.data], {
  541. type: "application/x-msdownload"
  542. });
  543. window.navigator.msSaveOrOpenBlob(
  544. blob,
  545. // this.wo.bizName + ".xlsx"
  546. this.appendixName + ".zip"
  547. );
  548. } else {
  549. /* 火狐谷歌的文件下载方式 */
  550. var blob = new Blob([res.data]);
  551. var downloadElement = document.createElement("a");
  552. var href = window.URL.createObjectURL(blob);
  553. downloadElement.href = href;
  554. downloadElement.download = this.appendixName + ".zip";
  555. document.body.appendChild(downloadElement);
  556. downloadElement.click();
  557. document.body.removeChild(downloadElement);
  558. window.URL.revokeObjectURL(href);
  559. }
  560. });
  561. }
  562. },
  563. mounted() {
  564. this.getAdvUserInfo();
  565. this.getList({}, 1);
  566. this.getUser();
  567. },
  568. created() {
  569. }
  570. }
  571. </script>
  572. <style scoped lang="scss">
  573. .titbox {
  574. div {
  575. float: right;
  576. i {
  577. font-size: 22px;
  578. margin-left: 20px;
  579. cursor: pointer;
  580. }
  581. }
  582. }
  583. .tabbox {
  584. margin-top: 16px;
  585. }
  586. .pageBox {
  587. text-align: right;
  588. margin-top: 10px;
  589. }
  590. .info-line {
  591. width: 100%;
  592. display: block;
  593. padding-left: 20px;
  594. div {
  595. width: 50%;
  596. display: inline-block;
  597. }
  598. span {
  599. width: 80px;
  600. display: inline-block;
  601. text-align: left;
  602. i {
  603. color: red;
  604. display: inline-block;
  605. padding-right: 5px;
  606. }
  607. }
  608. .el-select,
  609. .el-input {
  610. width: calc(100% - 100px);
  611. }
  612. }
  613. .online {
  614. width: 100%;
  615. .el-select {
  616. width: calc(100% - 100px);
  617. }
  618. span {
  619. vertical-align: top;
  620. }
  621. .el-textarea {
  622. width: calc(100% - 100px);
  623. }
  624. }
  625. </style>