index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. <template>
  2. <div id="equipmentData">
  3. <div v-if="isList">
  4. <el-card
  5. v-loading="loading"
  6. style="position: relative;"
  7. >
  8. <!-- <span>设备产品数据库</span> -->
  9. <el-form class="search_area" label-width="auto">
  10. <el-row :gutter="10">
  11. <el-col :span="1.5">
  12. <el-form-item label="通用名称">
  13. <el-input
  14. v-model.trim="params.commonName"
  15. size="mini"
  16. clearable
  17. style="width: 200px"
  18. />
  19. </el-form-item>
  20. </el-col>
  21. <el-col :span="1.5">
  22. <el-form-item label="注册名">
  23. <el-input
  24. v-model.trim="params.registrationName"
  25. size="mini"
  26. clearable
  27. style="width: 200px"
  28. />
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="1.5">
  32. <el-form-item label="厂家名称">
  33. <el-input
  34. v-model.trim="params.factoryName"
  35. size="mini"
  36. clearable
  37. style="width: 200px"
  38. />
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="1.5">
  42. <el-form-item label="型号">
  43. <el-input
  44. v-model.trim="params.model"
  45. size="mini"
  46. clearable
  47. style="width: 200px"
  48. />
  49. </el-form-item>
  50. </el-col>
  51. <el-col :span="1.5">
  52. <el-form-item label="参考价格">
  53. <el-input
  54. v-model.trim="params.referencePrice"
  55. size="mini"
  56. clearable
  57. style="width: 200px"
  58. />
  59. </el-form-item>
  60. </el-col>
  61. <el-col :span="1.5">
  62. <el-form-item label="设备类别">
  63. <el-input
  64. v-model.trim="params.deviceCategory"
  65. size="mini"
  66. clearable
  67. style="width: 200px"
  68. />
  69. </el-form-item>
  70. </el-col>
  71. <el-col :span="1.5">
  72. <el-form-item label="是否项目/厂家年度授权">
  73. <el-select clearable v-model="params.isProjectOrFactoryEmpower" size="mini" style="width: 200px">
  74. <el-option v-for="dict in dict.type.sys_equipment_type" :key="dict.value" :label="dict.label" :value="dict.value">
  75. </el-option>
  76. </el-select>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="1.5">
  80. <el-form-item label="参数">
  81. <el-input
  82. v-model.trim="params.parameters"
  83. size="mini"
  84. clearable
  85. style="width: 200px"
  86. />
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="1.5">
  90. <el-form-item label="备注">
  91. <el-input
  92. v-model.trim="params.remark"
  93. size="mini"
  94. clearable
  95. style="width: 200px"
  96. />
  97. </el-form-item>
  98. </el-col>
  99. </el-row>
  100. <div style="position: absolute;top: 18px;right: 10px;">
  101. <el-button type="primary" size="mini" @click="searchList">搜索</el-button>
  102. <el-button size="mini" plain @click="resetList">重置</el-button>
  103. </div>
  104. </el-form>
  105. <div class="btn_grooup">
  106. <el-button type="primary" size="mini" @click="addDivision">新增</el-button>
  107. <el-button type="primary" size="mini" @click="delItems">删除</el-button>
  108. <el-button type="primary" size="mini" @click="downLoadMb">下载模板</el-button>
  109. <el-button type="primary" size="mini" @click="upload.open = true">导入数据</el-button>
  110. <el-button type="primary" size="mini" @click="exportData">导出数据</el-button>
  111. </div>
  112. <el-super-ux-table
  113. id="data-table"
  114. v-model="tableData"
  115. index
  116. checkbox
  117. :size="size"
  118. :dict="dict"
  119. :page="pageInfo"
  120. :height=500
  121. :columns="TableColumns"
  122. pagination
  123. convenitentOperation
  124. storage-key="equipmentDataSuperTable"
  125. @row-dblclick="useSee"
  126. @row-select="useSelect"
  127. @selection-change="handleSelectionChange"
  128. @row-click="rowSelect"
  129. @pagination="useQuery(params, pageInfo)"
  130. ref="tables"
  131. >
  132. <ux-table-column
  133. fixed="right"
  134. title="操作"
  135. align="center"
  136. width="100"
  137. >
  138. <template slot-scope="scope">
  139. <!-- <el-button type="text" size="mini" v-if="scope.row.status == '1' && scope.row.flowId" @click="reback(scope.row)">收回</el-button> -->
  140. <el-button type="text" size="mini" @click="check(scope.row)">查看</el-button>
  141. <el-button type="text" size="mini" @click="delItem(scope.row)">删除</el-button>
  142. </template>
  143. </ux-table-column>
  144. </el-super-ux-table>
  145. </el-card>
  146. </div>
  147. <Add v-model="isList" v-if="!isList" :pageStu="page" :disable="disable" :row="rowDetail" @refresh="searchList"/>
  148. <!-- 用户导入对话框 -->
  149. <el-dialog title="数据导入" :visible.sync="upload.open" width="400px">
  150. <el-upload
  151. ref="upload"
  152. :limit="1"
  153. accept=".xlsx, .xls"
  154. :headers="upload.headers"
  155. :action="upload.url + '?updateSupport=' + upload.updateSupport"
  156. :disabled="upload.isUploading"
  157. :on-progress="handleFileUploadProgress"
  158. :on-success="handleFileSuccess"
  159. :on-error="errorFile"
  160. :auto-upload="false"
  161. drag
  162. >
  163. <i class="el-icon-upload"></i>
  164. <div class="el-upload__text">
  165. 将文件拖到此处,或
  166. <em>点击上传</em>
  167. </div>
  168. <!-- <div class="el-upload__tip" slot="tip">
  169. <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
  170. </div> -->
  171. <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
  172. </el-upload>
  173. <div slot="footer">
  174. <el-button size="mini" type="primary" @click="submitFileForm">确 定</el-button>
  175. <el-button size="mini" @click="upload.open = false">取 消</el-button>
  176. </div>
  177. </el-dialog>
  178. </div>
  179. </template>
  180. <script>
  181. // 导入的token
  182. import { getToken } from "@/utils/auth";
  183. import { getEquipmentDataList, downLoadMb, deleteEquipments, exportEquipments} from '@/api/purchase/equipmentData.js'
  184. export default {
  185. name: "equipmentData",
  186. dicts: ['sys_equipment_type'],
  187. components: {
  188. Add: () => import("./add.vue"),
  189. ElSuperUxTable: () => import("@/components/super-ux-table/index.vue"),
  190. },
  191. data() {
  192. return {
  193. // 导入参数
  194. upload: {
  195. // 是否显示弹出层(导入)
  196. open: false,
  197. // 弹出层标题(导入)
  198. title: "数据导入",
  199. // 是否禁用上传
  200. isUploading: false,
  201. // 是否更新已经存在的用户数据
  202. updateSupport: 1,
  203. // 设置上传的请求头部
  204. headers: { Authorization: "Bearer " + getToken() },
  205. // 上传的地址
  206. url: process.env.VUE_APP_BASE_API + "/device/origin/importData"
  207. },
  208. // 页面配置
  209. isList: true,
  210. // 页面状态
  211. page: '',
  212. disable: false,
  213. rowDetail: {},
  214. size: "mini",
  215. loading: false,
  216. params: {
  217. commonName: '',
  218. registrationName: '',
  219. deviceCategory: '',
  220. factoryName: '',
  221. model: '',
  222. referencePrice: '',
  223. parameters: '',
  224. isDeleteFile: '',
  225. isProjectOrFactoryEmpower: '',
  226. remark: ''
  227. },
  228. pageInfo: {
  229. pageNum: 1,
  230. pageSize: 20,
  231. total: 0
  232. },
  233. tableData: [],
  234. selectData: [],
  235. // SearchColumns: SearchColumns,
  236. TableColumns: [
  237. { item: { key: "commonName", title: "通用名称" }, attr: {} },
  238. { item: { key: "registrationName", title: "注册名" }, attr: {} },
  239. { item: { key: "deviceCategory", title: "设备类别" }, attr: {} },
  240. { item: { key: "factoryName", title: "厂家名称" }, attr: {} },
  241. { item: { key: "model", title: "型号"}, attr: {} },
  242. { item: { key: "referencePrice", title: "参考价格" }, attr: {} },
  243. { item: { key: "isProjectOrFactoryEmpower", title: "是否项目/厂家年度授权" }, attr: {is: "el-dict-tag", dictName: "sys_equipment_type"} },
  244. { item: { key: "parameters", title: "参数" }, attr: {} },
  245. { item: { key: "remark", title: "备注"}, attr: {} },
  246. ].map(({ item, attr }) => ({
  247. attr,
  248. item: {
  249. ...item,
  250. sortabled: true,
  251. fixedabled: true,
  252. filterabled: true,
  253. hiddenabled: true,
  254. },
  255. })),
  256. ids: []
  257. }
  258. },
  259. created() {
  260. this.useQuery(this.params, this.pageInfo)
  261. },
  262. methods: {
  263. useSee() {},
  264. useSelect() {},
  265. handleSelectionChange(selection) {
  266. console.log('选中', selection)
  267. this.ids = selection.map(item => item.id)
  268. console.log('选中数组', this.ids)
  269. },
  270. rowSelect(row) {
  271. this.$refs.tables.toggleRowSelection([{row: row}]);
  272. },
  273. // 加载列表
  274. async useQuery(prop, page) {
  275. let params = {...prop, ...page}
  276. await getEquipmentDataList(params).then(res => {
  277. if( res.code === 200 ) {
  278. this.tableData = res.rows
  279. this.pageInfo.total = res.total
  280. }
  281. })
  282. // 获取搜索框和表格元素
  283. const searchInput = this.params.parameters;
  284. const table = document.querySelector('#data-table');
  285. // 监听搜索框输入事件
  286. // searchInput.addEventListener('input', () => {
  287. // 获取搜索关键字
  288. const keyword = searchInput;
  289. // 如果搜索关键字为空,移除所有高亮样式
  290. if (!keyword) {
  291. table.querySelectorAll('.highlight').forEach(el => {
  292. el.classList.remove('highlight');
  293. });
  294. return;
  295. }
  296. // 遍历表格中的每个单元格
  297. table.querySelectorAll('td').forEach(td => {
  298. console.log('td',td)
  299. // 获取单元格文本内容
  300. const cellText = td.innerHTML.trim().toLowerCase();
  301. // 如果单元格内容包含搜索关键字,添加高亮样式
  302. if (cellText.includes(keyword)) {
  303. // 将匹配到的关键字替换为带有高亮样式的文本
  304. const highlightedText = cellText.replace(new RegExp(keyword, 'gi'), match => `<span class="highlight">${match}</span>`);
  305. td.innerHTML = highlightedText;
  306. } else {
  307. // 移除高亮样式
  308. td.innerHTML = cellText;
  309. }
  310. });
  311. // });
  312. },
  313. // 新增
  314. addDivision() {
  315. this.isList = false
  316. this.page = 'add'
  317. this.disable = false
  318. },
  319. delItems() {
  320. if (this.ids.length <= 0) {
  321. this.$modal.notifyWarning("至少勾选一条数据");
  322. } else {
  323. deleteEquipments(this.ids).then(res => {
  324. if(res.code === 200) {
  325. this.$modal.notifySuccess("删除成功");
  326. this.useQuery(this.params, this.pageInfo)
  327. }
  328. })
  329. }
  330. },
  331. // 下载模板
  332. async downLoadMb() {
  333. this.$modal.loading("正在下载模板,请稍后...");
  334. downLoadMb().then(res => {
  335. this.$modal.closeLoading();
  336. const blob = new Blob([res], {
  337. type: "application/vnd.ms-excel;charset=UTF-8",
  338. });// 创建一个类文件对象:Blob对象表示一个不可变的、原始数据的类文件对象
  339. const downloadElement = document.createElement("a"); //创建a标签
  340. const href = window.URL.createObjectURL(blob); // 创建下载的链接
  341. // var temp = res.headers["content-disposition"];
  342. // var fileName = decodeURIComponent(temp.split("filename=")[1]); // 中文需要转码 (前端乱码)
  343. // var name = fileName.split(";")[0]; //切割成文件名
  344. downloadElement.href = href; //下载地址
  345. downloadElement.download = '设备产品数据库模板'+ this.parseTime(new Date().getTime()) + ".xlsx"; // 下载后文件名
  346. document.body.appendChild(downloadElement);
  347. downloadElement.click(); // 点击下载
  348. document.body.removeChild(downloadElement); // 下载完成移除元素
  349. window.URL.revokeObjectURL(href); // 释放blob对象
  350. this.download.open = false
  351. }).catch(err => {
  352. this.$modal.closeLoading();
  353. })
  354. },
  355. // 文件上传中处理
  356. handleFileUploadProgress(event, file, fileList) {
  357. this.upload.isUploading = true;
  358. this.$modal.loading("正在导入数据,请稍后...");
  359. },
  360. // 文件上传成功处理
  361. handleFileSuccess(response, file, fileList) {
  362. this.$modal.closeLoading();
  363. this.upload.open = false;
  364. this.upload.isUploading = false;
  365. this.$refs.upload.clearFiles();
  366. this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
  367. this.useQuery(this.params, this.pageInfo)
  368. },
  369. errorFile(err) {
  370. this.$modal.closeLoading();
  371. this.$modal.notifyError("文件已变动,请重新上传");
  372. },
  373. // 提交上传文件
  374. submitFileForm() {
  375. this.$refs.upload.submit();
  376. },
  377. searchList() {
  378. this.useQuery(this.params, this.pageInfo)
  379. },
  380. resetList() {
  381. this.params = {
  382. commonName: '',
  383. registrationName: '',
  384. deviceCategory: '',
  385. factoryName: '',
  386. model: '',
  387. referencePrice: '',
  388. parameters: '',
  389. isDeleteFile: '',
  390. isProjectOrFactoryEmpower: '',
  391. remark: ''
  392. }
  393. this.useQuery(this.params, this.pageInfo)
  394. },
  395. check(row) {
  396. this.isList = false
  397. this.page = 'check'
  398. this.rowDetail = row
  399. this.disable = true
  400. },
  401. delItem(row) {
  402. console.log(row)
  403. const param = [row.id]
  404. deleteEquipments(param).then(res => {
  405. if(res.code === 200) {
  406. this.$modal.notifySuccess("删除成功");
  407. this.useQuery(this.params, this.pageInfo)
  408. }
  409. })
  410. },
  411. // 导出
  412. exportData() {
  413. this.$modal.loading("正在导出数据,请稍后...");
  414. exportEquipments(this.params).then(res => {
  415. this.$modal.closeLoading();
  416. const blob = new Blob([res], {
  417. type: "application/vnd.ms-excel;charset=UTF-8",
  418. });// 创建一个类文件对象:Blob对象表示一个不可变的、原始数据的类文件对象
  419. const downloadElement = document.createElement("a"); //创建a标签
  420. const href = window.URL.createObjectURL(blob); // 创建下载的链接
  421. // var temp = res.headers["content-disposition"];
  422. // var fileName = decodeURIComponent(temp.split("filename=")[1]); // 中文需要转码 (前端乱码)
  423. // var name = fileName.split(";")[0]; //切割成文件名
  424. downloadElement.href = href; //下载地址
  425. downloadElement.download = '设备产品数据导出' + this.parseTime(new Date().getTime()) + ".xlsx"; // 下载后文件名
  426. document.body.appendChild(downloadElement);
  427. downloadElement.click(); // 点击下载
  428. document.body.removeChild(downloadElement); // 下载完成移除元素
  429. window.URL.revokeObjectURL(href); // 释放blob对象
  430. }).catch(err => {
  431. this.$modal.closeLoading();
  432. })
  433. },
  434. }
  435. }
  436. </script>
  437. <style lang="scss" scoped>
  438. #equipmentData {
  439. padding: 12px;
  440. box-sizing: border-box;
  441. overflow-y: scroll;
  442. }
  443. .btn_grooup {
  444. margin-bottom: 10px;
  445. display: flex;
  446. justify-content: flex-end;
  447. }
  448. ::v-deep .highlight {
  449. background: yellow !important;
  450. }
  451. </style>