You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

681 lines
21 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. <template>
  2. <div class="mod-config">
  3. <!-- 收藏 -->
  4. <div>
  5. <span @click="favoriteFunction()">
  6. <icon-svg :name="favorite?'xiangqufill':'xiangqu'" class="sl-svg"></icon-svg>
  7. </span>
  8. </div>
  9. <!-- 条件查询 -->
  10. <el-form :inline="true" label-position="top" :model="searchData" @keyup.enter.native="getDataList()">
  11. <el-form-item :label="'方法编码:'">
  12. <el-input v-model="searchData.methodNo" clearable style="width: 120px"></el-input>
  13. </el-form-item>
  14. <el-form-item :label="'方法名称:'">
  15. <el-input v-model="searchData.methodName" clearable style="width: 120px"></el-input>
  16. </el-form-item>
  17. <el-form-item label="检验类型:">
  18. <el-select v-model="searchData.inspectionTypeNo" placeholder="请选择">
  19. <el-option label="全部" value=""></el-option>
  20. <el-option
  21. v-for = "i in options"
  22. :key = "i.inspectionTypeNo"
  23. :label = "i.inspectionTypeName"
  24. :value = "i.inspectionTypeNo">
  25. </el-option>
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item :label="' '">
  29. <el-button type="primary" @click="getDataList()">查询</el-button>
  30. <el-button type="primary" @click="addModal()">新增</el-button>
  31. <download-excel
  32. :fields="fields()"
  33. :data="exportData"
  34. type="xls"
  35. :name="exportName"
  36. :header="exportHeader"
  37. :footer="exportFooter"
  38. :fetch="createExportData"
  39. :before-generate="startDownload"
  40. :before-finish="finishDownload"
  41. worksheet="导出信息"
  42. class="el-button el-button--primary el-button--medium">
  43. {{ "导出" }}
  44. </download-excel>
  45. </el-form-item>
  46. </el-form>
  47. <!-- 展示列表 -->
  48. <el-table
  49. :height="height"
  50. :data="dataList"
  51. border
  52. v-loading="dataListLoading"
  53. style="width: 100%;">
  54. <!-- <el-table-column-->
  55. <!-- prop="methodNo"-->
  56. <!-- header-align="center"-->
  57. <!-- align="center"-->
  58. <!-- label="方法编码"-->
  59. <!-- width="100">-->
  60. <!-- </el-table-column>-->
  61. <!-- <el-table-column-->
  62. <!-- prop="methodName"-->
  63. <!-- header-align="center"-->
  64. <!-- align="left"-->
  65. <!-- label="方法名称"-->
  66. <!-- :width="flexColumnWidth('方法名称','methodName')">-->
  67. <!-- </el-table-column>-->
  68. <!-- <el-table-column-->
  69. <!-- prop="methodRemark"-->
  70. <!-- header-align="center"-->
  71. <!-- align="left"-->
  72. <!-- label="方法说明"-->
  73. <!-- :width="flexColumnWidth('方法说明','methodRemark')">-->
  74. <!-- </el-table-column>-->
  75. <el-table-column
  76. v-for="(item,index) in columnList" :key="index"
  77. :sortable="item.columnSortable"
  78. :prop="item.columnProp"
  79. :header-align="item.headerAlign"
  80. :show-overflow-tooltip="item.showOverflowTooltip"
  81. :align="item.align"
  82. :fixed="item.fixed==''?false:item.fixed"
  83. :width="item.columnWidth"
  84. :label="item.columnLabel">
  85. <template slot-scope="scope">
  86. <span v-if="!item.columnHidden"> {{ scope.row[item.columnProp] }}</span>
  87. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  88. </template>
  89. </el-table-column>
  90. <el-table-column
  91. fixed="right"
  92. header-align="center"
  93. align="center"
  94. width="160"
  95. label="操作">
  96. <template slot-scope="scope">
  97. <a type="text" size="small" @click="updateModal(scope.row)">修改</a>
  98. <a type="text" size="small" @click="deleteModal(scope.row)">删除</a>
  99. </template>
  100. </el-table-column>
  101. </el-table>
  102. <el-pagination
  103. @size-change="sizeChangeHandle"
  104. @current-change="currentChangeHandle"
  105. :current-page="pageIndex"
  106. :page-sizes="[20, 50, 100, 200, 500]"
  107. :page-size="pageSize"
  108. :total="totalPage"
  109. layout="total, sizes, prev, pager, next, jumper">
  110. </el-pagination>
  111. <!-- 新增和修改 -->
  112. <el-dialog title="检验方法" :close-on-click-modal="false" v-drag :visible.sync="modalFlag" width="500px">
  113. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;margin-top: -5px;">
  114. <el-form-item label="方法名称:" prop="methodName" :rules="rules.methodNameType">
  115. <el-input v-model="modalData.methodName" style="width: 221px"></el-input>
  116. </el-form-item>
  117. <el-form-item label="检验类型:" prop="inspectionTypeNo" :rules="rules.inspectionTypeNoType">
  118. <el-select v-model="modalData.inspectionTypeNo" placeholder="请选择" style="width: 221px">
  119. <el-option
  120. v-for = "i in options"
  121. :key = "i.inspectionTypeNo"
  122. :label = "i.inspectionTypeName"
  123. :value = "i.inspectionTypeNo">
  124. </el-option>
  125. </el-select>
  126. </el-form-item>
  127. </el-form>
  128. <el-form :inline="true" label-position="top" :model="modalData" style="margin-left: 7px;margin-top: -5px;">
  129. <el-form-item :label="'检验方法说明:'">
  130. <el-input v-model="modalData.methodRemark" style="width: 456px"></el-input>
  131. </el-form-item>
  132. </el-form>
  133. <el-footer style="height:40px;margin-top: 20px;text-align:center">
  134. <el-button type="primary" @click="saveData()">保存</el-button>
  135. <el-button type="primary" @click="modalFlag = false">关闭</el-button>
  136. </el-footer>
  137. </el-dialog>
  138. </div>
  139. </template>
  140. <script>
  141. import {
  142. qcMethodSearch, // 检验方法查询
  143. qcMethodSave, // 检验方法新增
  144. qcMethodUpdate, // 检验方法修改
  145. qcMethodDelete, // 检验方法删除
  146. inspectionTypeSearch, // 搜索所有检验类型
  147. } from "@/api/qc/qc.js"
  148. import {
  149. getTableDefaultListLanguage,
  150. getTableUserListLanguage,
  151. } from "@/api/table.js"
  152. import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js'
  153. export default {
  154. data () {
  155. return {
  156. // 是否收藏
  157. favorite: false,
  158. // 导出 start
  159. exportData: [],
  160. exportName: "检验方法" + this.dayjs().format('YYYYMMDDHHmmss'),
  161. exportHeader: ["检验方法"],
  162. exportFooter: [],
  163. exportList:[],
  164. // 导出 end
  165. searchData: {
  166. site: this.$store.state.user.site,
  167. methodNo: '',
  168. methodName: '',
  169. inspectionTypeNo: '',
  170. page: 1,
  171. limit: 10,
  172. },
  173. pageIndex: 1,
  174. pageSize: 50,
  175. totalPage: 0,
  176. height: 200,
  177. dataList: [],
  178. dataListLoading: false,
  179. modalFlag: false,
  180. modalDisableFlag: false,
  181. methodData: {
  182. methodNo: '',
  183. valueNo: '',
  184. availableValue: '',
  185. createBy: this.$store.state.user.name
  186. },
  187. modalData: {
  188. site: this.$store.state.user.site,
  189. flag: '',
  190. methodNo: '',
  191. methodName: '',
  192. createBy: this.$store.state.user.name,
  193. updateBy: this.$store.state.user.name,
  194. methodRemark: '',
  195. inspectionTypeNo: ''
  196. },
  197. // 标头展示
  198. columnList: [
  199. {
  200. userId: this.$store.state.user.name,
  201. functionId: 301001,
  202. serialNumber: '301001TableMethodNo',
  203. tableId: "301001Table",
  204. tableName: "检验方法维护表",
  205. columnWidth: 185,
  206. columnProp: 'methodNo',
  207. headerAlign: 'center',
  208. align: "center",
  209. columnLabel: '方法编码',
  210. columnHidden: false,
  211. columnImage: false,
  212. columnSortable: false,
  213. sortLv: 0,
  214. status: true,
  215. fixed: '',
  216. },
  217. {
  218. userId: this.$store.state.user.name,
  219. functionId: 301001,
  220. serialNumber: '301001TableMethodName',
  221. tableId: "301001Table",
  222. tableName: "检验方法维护表",
  223. columnWidth: 182,
  224. columnProp: 'methodName',
  225. headerAlign: 'center',
  226. align: "center",
  227. columnLabel: '方法名称',
  228. columnHidden: false,
  229. columnImage: false,
  230. columnSortable: false,
  231. sortLv: 0,
  232. status: true,
  233. fixed: '',
  234. },
  235. {
  236. userId: this.$store.state.user.name,
  237. functionId: 301001,
  238. serialNumber: '301001TableMethodRemark',
  239. tableId: "301001Table",
  240. tableName: "检验方法维护表",
  241. columnWidth: 182,
  242. columnProp: 'methodRemark',
  243. headerAlign: 'center',
  244. align: "center",
  245. columnLabel: '方法说明',
  246. columnHidden: false,
  247. columnImage: false,
  248. columnSortable: false,
  249. sortLv: 0,
  250. status: true,
  251. fixed: '',
  252. },
  253. {
  254. userId: this.$store.state.user.name,
  255. functionId: 301001,
  256. serialNumber: '301001TableInspectionTypeName',
  257. tableId: "301001Table",
  258. tableName: "检验方法维护表",
  259. columnWidth: 182,
  260. columnProp: 'inspectionTypeName',
  261. headerAlign: 'center',
  262. align: "center",
  263. columnLabel: '检验类型',
  264. columnHidden: false,
  265. columnImage: false,
  266. columnSortable: false,
  267. sortLv: 0,
  268. status: true,
  269. fixed: '',
  270. },
  271. {
  272. userId: this.$store.state.user.name,
  273. functionId: 301001,
  274. serialNumber: '301001TableCreateDate',
  275. tableId: "301001Table",
  276. tableName: "检验方法维护表",
  277. columnWidth: 182,
  278. columnProp: 'createDate',
  279. headerAlign: 'center',
  280. align: "center",
  281. columnLabel: '创建时间',
  282. columnHidden: false,
  283. columnImage: false,
  284. columnSortable: false,
  285. sortLv: 0,
  286. status: true,
  287. fixed: '',
  288. },
  289. {
  290. userId: this.$store.state.user.name,
  291. functionId: 301001,
  292. serialNumber: '301001TableCreateBy',
  293. tableId: "301001Table",
  294. tableName: "检验方法维护表",
  295. columnWidth: 182,
  296. columnProp: 'createBy',
  297. headerAlign: 'center',
  298. align: "center",
  299. columnLabel: '创建人',
  300. columnHidden: false,
  301. columnImage: false,
  302. columnSortable: false,
  303. sortLv: 0,
  304. status: true,
  305. fixed: '',
  306. },
  307. {
  308. userId: this.$store.state.user.name,
  309. functionId: 301001,
  310. serialNumber: '301001TableUpdateDate',
  311. tableId: "301001Table",
  312. tableName: "检验方法维护表",
  313. columnWidth: 182,
  314. columnProp: 'updateDate',
  315. headerAlign: 'center',
  316. align: "center",
  317. columnLabel: '更新时间',
  318. columnHidden: false,
  319. columnImage: false,
  320. columnSortable: false,
  321. sortLv: 0,
  322. status: true,
  323. fixed: '',
  324. },
  325. {
  326. userId: this.$store.state.user.name,
  327. functionId: 301001,
  328. serialNumber: '301001TableUpdateBy',
  329. tableId: "301001Table",
  330. tableName: "检验方法维护表",
  331. columnWidth: 182,
  332. columnProp: 'updateBy',
  333. headerAlign: 'center',
  334. align: "center",
  335. columnLabel: '更新人',
  336. columnHidden: false,
  337. columnImage: false,
  338. columnSortable: false,
  339. sortLv: 0,
  340. status: true,
  341. fixed: '',
  342. },
  343. ],
  344. rules:{
  345. methodNameType:[
  346. {
  347. required: true,
  348. message: ' ',
  349. trigger: 'change'
  350. }
  351. ],
  352. inspectionTypeNoType:[
  353. {
  354. required: true,
  355. message: ' ',
  356. trigger: 'change'
  357. }
  358. ]
  359. },
  360. options: [],
  361. }
  362. },
  363. mounted () {
  364. this.$nextTick(() => {
  365. this.height = window.innerHeight - 180
  366. })
  367. },
  368. created () {
  369. this.getDataList()
  370. this.favoriteIsOk()
  371. this.inspectionTypeSearch()
  372. // 动态列
  373. this.getTableUserColumn(this.$route.meta.menuId+'table',1)
  374. },
  375. methods: {
  376. /**
  377. * 自适应
  378. * @param label
  379. * @param prop
  380. * @returns {string}
  381. */
  382. flexColumnWidth (label, prop) {
  383. // 1.获取该列的所有数据
  384. const arr = this.dataList.map(x => x[prop])
  385. arr.push(label) // 把每列的表头也加进去算
  386. // 2.计算每列内容最大的宽度 + 表格的内间距(依据实际情况而定)
  387. return (this.getMaxLength(arr) + 25) + 'px'
  388. },
  389. getTextWidth (str) {
  390. let width = 0
  391. const html = document.createElement('span')
  392. html.innerText = str
  393. html.className = 'getTextWidth'
  394. document.querySelector('body').appendChild(html)
  395. width = document.querySelector('.getTextWidth').offsetWidth
  396. document.querySelector('.getTextWidth').remove()
  397. return width
  398. },
  399. getMaxLength (arr) {
  400. return arr.reduce((acc, item) => {
  401. if (item) {
  402. const calcLen = this.getTextWidth(item)
  403. if (acc < calcLen) {
  404. acc = calcLen
  405. }
  406. }
  407. return acc
  408. }, 0)
  409. },
  410. // 查询获取数据列表
  411. getDataList () {
  412. this.searchData.limit = this.pageSize
  413. this.searchData.page = this.pageIndex
  414. qcMethodSearch(this.searchData).then(({data}) => {
  415. if (data.code === 0) {
  416. this.dataList = data.page.list
  417. this.pageIndex = data.page.currPage
  418. this.pageSize = data.page.pageSize
  419. this.totalPage = data.page.totalCount
  420. }
  421. })
  422. },
  423. // 每页数
  424. sizeChangeHandle (val) {
  425. this.pageSize = val
  426. this.pageIndex = 1
  427. this.getDataList()
  428. },
  429. // 当前页
  430. currentChangeHandle (val) {
  431. this.pageIndex = val
  432. this.getDataList()
  433. },
  434. // 新增按钮
  435. addModal () {
  436. this.modalData = {
  437. flag: '1',
  438. site: this.$store.state.user.site,
  439. createBy: this.$store.state.user.name,
  440. updateBy: this.$store.state.user.name,
  441. methodNo: '',
  442. methodName: '',
  443. methodRemark: '',
  444. inspectionTypeNo: ''
  445. }
  446. this.modalDisableFlag = false
  447. this.modalFlag = true
  448. },
  449. // 修改按钮
  450. updateModal (row) {
  451. this.modalData = {
  452. flag: '2',
  453. site: this.$store.state.user.site,
  454. createBy: this.$store.state.user.name,
  455. updateBy: this.$store.state.user.name,
  456. methodNo: row.methodNo,
  457. methodName: row.methodName,
  458. methodRemark: row.methodRemark,
  459. inspectionTypeNo: row.inspectionTypeNo
  460. }
  461. this.modalDisableFlag = true
  462. this.modalFlag = true
  463. },
  464. // 删除方法
  465. deleteModal (row) {
  466. this.$confirm(`是否删除这个检验方法?`, '提示', {
  467. confirmButtonText: '确定',
  468. cancelButtonText: '取消',
  469. type: 'warning'
  470. }).then(() => {
  471. qcMethodDelete(row).then(({data}) => {
  472. if (data && data.code === 0) {
  473. this.getDataList()
  474. this.$message({
  475. message: '操作成功',
  476. type: 'success',
  477. duration: 1500,
  478. onClose: () => {
  479. }
  480. })
  481. } else {
  482. this.$alert(data.msg, '错误', {
  483. confirmButtonText: '确定'
  484. })
  485. }
  486. })
  487. }).catch(() => {
  488. })
  489. },
  490. // 新增/修改方法
  491. saveData () {
  492. if (this.modalData.methodName === '' || this.modalData.methodName == null) {
  493. this.$message.warning('请输入检验方法名称!')
  494. return
  495. }
  496. if(this.modalData.inspectionTypeNo === ''|| this.modalData.inspectionTypeNo == null){
  497. this.$message.warning('请选择检验类型!')
  498. return
  499. }
  500. if (this.modalData.flag === '1') { // 新增
  501. qcMethodSave(this.modalData).then(({data}) => {
  502. if (data && data.code === 0) {
  503. this.getDataList()
  504. this.modalFlag = false
  505. this.$message({
  506. message: '操作成功',
  507. type: 'success',
  508. duration: 1500,
  509. onClose: () => {}
  510. })
  511. } else {
  512. this.$alert(data.msg, '错误', {
  513. confirmButtonText: '确定'
  514. })
  515. }
  516. })
  517. } else { // 修改
  518. qcMethodUpdate(this.modalData).then(({data}) => {
  519. if (data && data.code === 0) {
  520. this.getDataList()
  521. this.modalFlag = false
  522. this.$message({
  523. message: '操作成功',
  524. type: 'success',
  525. duration: 1500,
  526. onClose: () => {}
  527. })
  528. } else {
  529. this.$alert(data.msg, '错误', {
  530. confirmButtonText: '确定'
  531. })
  532. }
  533. })
  534. }
  535. },
  536. // 查询检验类型
  537. inspectionTypeSearch(){
  538. let tempData = {
  539. site: this.$store.state.user.site
  540. }
  541. inspectionTypeSearch(tempData).then(({data}) => {
  542. if (data.code === 0) {
  543. this.options = data.rows
  544. }
  545. })
  546. },
  547. // 校验用户是否收藏
  548. favoriteIsOk() {
  549. let userFavorite = {
  550. userId: this.$store.state.user.id,
  551. languageCode: this.$i18n.locale
  552. }
  553. userFavoriteList(userFavorite).then(({data}) => {
  554. for (let i = 0; i < data.list.length; i++) {
  555. if(this.$route.meta.menuId == data.list[i].menuId){
  556. this.favorite = true
  557. }
  558. }
  559. })
  560. },
  561. // 收藏 OR 取消收藏
  562. favoriteFunction() {
  563. let userFavorite = {
  564. userId: this.$store.state.user.id,
  565. functionId: this.$route.meta.menuId,
  566. }
  567. if (this.favorite) {
  568. removeUserFavorite(userFavorite).then(({data}) => {
  569. this.$message.success(data.msg)
  570. this.favorite = false
  571. })
  572. } else {
  573. // 收藏
  574. saveUserFavorite(userFavorite).then(({data}) => {
  575. this.$message.success(data.msg)
  576. this.favorite = true
  577. })
  578. }
  579. },
  580. //导出excel
  581. async createExportData() {
  582. this.searchData.limit = -1
  583. this.searchData.page = 1
  584. await qcMethodSearch(this.searchData).then(({data}) => {
  585. this.exportList= data.rows;
  586. })
  587. return this.exportList;
  588. },
  589. startDownload() {
  590. },
  591. finishDownload() {
  592. },
  593. fields() {
  594. let json = "{"
  595. this.columnList.forEach((item, index) => {
  596. if (index == this.columnList.length - 1) {
  597. json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\""
  598. } else {
  599. json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\"" + ","
  600. }
  601. })
  602. json += "}"
  603. let s = eval("(" + json + ")")
  604. return s
  605. },
  606. // 动态列开始 获取 用户保存的 格式列
  607. async getTableUserColumn(tableId, columnId) {
  608. let queryTableUser = {
  609. userId: this.$store.state.user.name,
  610. functionId: this.$route.meta.menuId,
  611. tableId: tableId,
  612. status: true,
  613. languageCode: this.$i18n.locale
  614. }
  615. await getTableUserListLanguage(queryTableUser).then(({data}) => {
  616. if (data.rows.length > 0) {
  617. //this.columnList1 = []
  618. switch (columnId) {
  619. case 1:
  620. this.columnList = data.rows
  621. break;
  622. // case 2:
  623. // this.columnDetailList = data.rows
  624. // break;
  625. // case 3:
  626. // this.columnList2 = data.rows
  627. // break;
  628. // case 4:
  629. // this.columnList3 = data.rows
  630. // break;
  631. }
  632. } else {
  633. this.getColumnList(tableId, columnId)
  634. }
  635. })
  636. },
  637. // 获取 tableDefault 列
  638. async getColumnList(tableId, columnId) {
  639. this.queryTable.tableId = tableId
  640. let queryTable= {
  641. functionId: this.$route.meta.menuId,
  642. tableId: tableId,
  643. languageCode: this.$i18n.locale
  644. }
  645. await getTableDefaultListLanguage(queryTable).then(({data}) => {
  646. if (!data.rows.length == 0) {
  647. switch (columnId) {
  648. case 1:
  649. this.columnList = data.rows
  650. break;
  651. // case 2:
  652. // this.columnDetailList = data.rows
  653. // break;
  654. // case 3:
  655. // this.columnList2 = data.rows
  656. // break;
  657. // case 4:
  658. // this.columnList3 = data.rows
  659. // break;
  660. }
  661. } else {
  662. // this.showDefault = true.
  663. }
  664. })
  665. },
  666. //动态列结束
  667. }
  668. }
  669. </script>