common.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. import api from '@/api'
  2. import router from '../router'
  3. import { Message } from 'element-ui'
  4. import Permission from '@/utils/permissions'
  5. import showPermissionDialog from "@/utils/model/noPermission/index";
  6. import { Base64 } from 'js-base64';
  7. import Config from '@/config'
  8. import moment from "moment";
  9. export default {
  10. /**
  11. * 防抖
  12. * @param {Function} func
  13. * @param {Number} duration
  14. * @returns
  15. */
  16. debounce(func, duration = 500) {
  17. let timer;
  18. return () => {
  19. clearTimeout(timer)
  20. timer = setTimeout(func, duration)
  21. }
  22. },
  23. /**
  24. * 节流
  25. * @param {Function} func
  26. * @param {Number} delay
  27. * @returns
  28. */
  29. throttle(func, delay = 2000) {
  30. let flag = true
  31. return () => {
  32. if (!flag) return;
  33. flag = false;
  34. setTimeout(() => {
  35. func()
  36. flag = true
  37. }, delay)
  38. }
  39. },
  40. //对象转数组
  41. objectToArray(val){
  42. var data = []
  43. if (Object.keys(val).length > 0) {
  44. Object.keys(val).forEach(item => {
  45. if(val[item]){
  46. data.push(
  47. {
  48. key: item,
  49. value: val[item]
  50. }
  51. )
  52. }
  53. })
  54. } else {
  55. return []
  56. }
  57. return data
  58. },
  59. //转简单数组
  60. ArrayToArray(data){
  61. var arr = []
  62. data.forEach(item => {
  63. if (item.type == 3) {
  64. arr.push({
  65. key:item.value,
  66. value:item.searchValue.map(itemValue => {
  67. return itemValue.value
  68. })
  69. })
  70. } else {
  71. arr.push({
  72. key:item.value,
  73. value:item.searchValue.label
  74. })
  75. }
  76. })
  77. return arr
  78. },
  79. /**
  80. * 获取uuid
  81. * @param {*} len 长度
  82. * @param {*} radix 进制
  83. * @returns
  84. */
  85. uuid(len, radix) {
  86. var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
  87. var uuid = [], i;
  88. radix = radix || chars.length;
  89. if (len) {
  90. for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
  91. } else {
  92. var r;
  93. uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
  94. uuid[14] = '4';
  95. for (i = 0; i < 36; i++) {
  96. if (!uuid[i]) {
  97. r = 0 | Math.random()*16;
  98. uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
  99. }
  100. }
  101. }
  102. return uuid.join('');
  103. },
  104. //object转字符串
  105. objectToString(val) {
  106. var data = []
  107. if (val.constructor == Object) {
  108. if (Object.keys(val).length > 0) {
  109. Object.keys(val).forEach(item => {
  110. data.push(
  111. {
  112. key: item,
  113. value: val[item]
  114. }
  115. )
  116. })
  117. } else {
  118. return ''
  119. }
  120. } else if (val.constructor == Array) {
  121. if (val.length > 0) {
  122. data = val
  123. } else {
  124. return ''
  125. }
  126. } else {
  127. return val
  128. }
  129. // 生成字符串
  130. var str = ''
  131. data.forEach(item => {
  132. var value = ''
  133. if (Array.isArray(item.value)) {
  134. value = '(' + item.value.join(' OR ') + ')'
  135. } else {
  136. if (item.value) {
  137. value = item.value
  138. } else {
  139. return
  140. }
  141. }
  142. if (str) {
  143. str = str + ' AND ' + item.key + '=' + value
  144. } else {
  145. str = str + item.key + '=' + value
  146. }
  147. })
  148. return str
  149. },
  150. /**
  151. * 导出Excel
  152. * @param {*} head excel头,可为空
  153. * @param {*} body excel体,可为空
  154. * @param {*} worksheetName excel的worksheet名,可为空
  155. * @param {*} ExcelName excel文件名,可为空
  156. */
  157. exportExcel(head, body, worksheetName='Sheet1', ExcelName){
  158. // Worksheet名
  159. const worksheet = worksheetName
  160. const uri = 'data:application/vnd.ms-excel;base64,'
  161. //文件名
  162. if(!ExcelName){
  163. ExcelName = moment().format('YYYYMMDDHHmmss')
  164. }
  165. // 下载的表格模板数据
  166. const template = `<html xmlns:o="urn:schemas-microsoft-com:office:office"
  167. xmlns:x="urn:schemas-microsoft-com:office:excel"
  168. xmlns="http://www.w3.org/TR/REC-html40">
  169. <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
  170. <x:Name>${worksheet}</x:Name>
  171. <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
  172. </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
  173. </head><body><table><tr>${head}</tr>${body}</table></body></html>`
  174. // 下载模板
  175. let link = document.createElement('a')
  176. link.setAttribute('href', uri + window.btoa(unescape(encodeURIComponent(template))))
  177. link.setAttribute('download', ExcelName + '.xls')
  178. link.click()
  179. link = null
  180. },
  181. /**
  182. * 获取字段列表
  183. * @param {Array} array
  184. * @param {Function} fun
  185. * @param {Object} props
  186. * @returns
  187. */
  188. getField(array, fun, props) {
  189. var type = {
  190. 'Array': '3',
  191. 'DateTime': '2',
  192. 'String': '1'
  193. }
  194. //获取规范数据
  195. var keys = []
  196. var arr = []
  197. if (props) {
  198. keys = Object.keys(props)
  199. }
  200. //获取所需要的数据
  201. var newArray = array.filter(item => {
  202. return fun(item)
  203. })
  204. if (keys.length > 0) {
  205. newArray.forEach(item => {
  206. var obj = {}
  207. keys.forEach(key => {
  208. if (key == 'type') {
  209. obj[key] = type[item[props[key]]] || item[props[key]]
  210. }else if(key == 'value' && props.value == 'value'){
  211. obj[key] = item.field
  212. }else{
  213. obj[key] = item[props[key]]
  214. }
  215. })
  216. // 过滤不需要的数据
  217. if (['id'].includes(obj.value) == false) {
  218. arr.push(obj)
  219. }
  220. })
  221. return arr;
  222. }
  223. return newArray
  224. },
  225. /**
  226. * 获取表格数据
  227. * @author zhuliu
  228. * @param {object} row 当前行数据
  229. * @param {object} field 对应的栏位
  230. * @param {String} prop 数据类型为数组对象时所需要使用的字段
  231. * @param {object} data 需要获取对应label值时的字典对象(包含数据以及配置及{data,prop})
  232. * @param {object} data.prop
  233. * @return {String} 返回值
  234. * @example
  235. * getColumnData({value:1},{type:'String',value:'value'}) //返回字符串1
  236. */
  237. getColumnData(row, field, prop, data) {
  238. if (field.type == 'Array') {
  239. if (row[field.value] && row[field.value].length > 0) {
  240. if (prop) {
  241. return row[field.value].map(item => {
  242. return item[prop]
  243. }).join('、')
  244. }
  245. return row[field.value].join('、')
  246. } else {
  247. return '--'
  248. }
  249. } else if (field.type == 'Object') {
  250. if (!row[field.value]) {
  251. return '--'
  252. }
  253. if (prop) {
  254. return row[field.value][prop]
  255. }
  256. return row[field.value].name
  257. }
  258. else {
  259. if (data) {
  260. if (data.data.constructor == Array) {
  261. var dataProp = data.prop || {
  262. label: 'label',
  263. value: 'value'
  264. }
  265. var obj = data.data.find(item => {
  266. return item[dataProp.value] == row[field.value]
  267. })
  268. if (obj) {
  269. return obj[dataProp.label]
  270. } else {
  271. return '--'
  272. }
  273. } else {
  274. return data.data[row[field.value]]
  275. }
  276. }
  277. if (row[field.value] == '0') {
  278. return '0'
  279. }
  280. return row[field.value] || '--'
  281. }
  282. },
  283. //查看图片1
  284. checkViewer(guid) {
  285. if(!guid){
  286. return ''
  287. }
  288. return `/api/fileManager/downloadFile?fileId=${guid}`
  289. },
  290. //查看图片2
  291. checkGuid(guid,type='pdf') {
  292. if(!guid){
  293. return ''
  294. }
  295. var src = this.checkViewer(guid)
  296. var previewUrl = src + '&fullfilename=test.'+type
  297. return `http://${Config.staticURL}:8012/onlinePreview?url=` + encodeURIComponent(Base64.encode(window.location.origin+previewUrl))
  298. },
  299. //跳转预览界面
  300. previewFile(data,guid,type='pdf'){
  301. var FileUrl = this.checkGuid(guid,type)
  302. const router1 = router.resolve({
  303. path: '/checkFile',
  304. query: {
  305. ...data,
  306. FileUrl: FileUrl,
  307. guid:guid
  308. }
  309. })
  310. window.open(router1.href, '_blank');
  311. },
  312. //查看专利详情
  313. checkPatentDetails(patentNo,projectId) {
  314. router.push(
  315. {
  316. path: '/patentDetails/' + patentNo,
  317. query: {
  318. projectId: projectId,
  319. }
  320. }
  321. )
  322. },
  323. //查看显示栏位管理
  324. async getCustomField(type, patentObj = {}) {
  325. var params = {
  326. tableName: type,
  327. ...patentObj,
  328. }
  329. let apiItem = Object.keys(patentObj).length > 0 ? 'getTableColumns':'getCustomField'
  330. var a = []
  331. await api[apiItem](params).then((response) => {
  332. if (response.code == 200) {
  333. a = response.data.data
  334. }
  335. }).catch(error => {
  336. return []
  337. });
  338. return a
  339. },
  340. /**
  341. * 获取排序字段(sortProp:{order})
  342. * @param {Object} param0 {sort,column, prop, order,sortProp,defaultValue,multiple}
  343. * @returns
  344. */
  345. getSortData({ sort, column, prop, order, sortProp, defaultValue, multiple }) {
  346. var sortProp1 = sortProp || {
  347. "orderBy": "orderBy",
  348. "orderType": 'orderType'
  349. }
  350. if (multiple) {
  351. var sortData = sort
  352. } else {
  353. var sortData = []
  354. }
  355. if (order == null) {
  356. if (defaultValue) {
  357. this.sort = [defaultValue]
  358. }
  359. this.sort = [
  360. {
  361. "orderBy": "createTime",
  362. "orderType": 1
  363. }
  364. ]
  365. } else {
  366. var orderType = {
  367. ascending: 0,
  368. descending: 1
  369. }
  370. var params = sortData.find(item => {
  371. return item[sortProp1.orderBy] == prop
  372. })
  373. if (params) {
  374. params[sortProp1.orderType] = orderType[order]
  375. } else {
  376. params = {}
  377. params[sortProp1.orderBy] = prop
  378. params[sortProp1.orderType] = orderType[order]
  379. sortData.push(params)
  380. }
  381. }
  382. return sortData
  383. },
  384. //显示表头数据
  385. renderHeaderMethods(h, { column }, message) {
  386. var message = '点击升序'
  387. switch (column.order) {
  388. case "":
  389. message = '点击升序'
  390. break;
  391. case "ascending":
  392. message = '点击降序'
  393. break;
  394. case 'descending':
  395. message = '点击取消排序'
  396. break
  397. }
  398. return [
  399. ,
  400. h(
  401. 'el-tooltip',
  402. {
  403. props: {
  404. content: message, // 鼠标悬停时要展示的文字提示
  405. placement: 'top' // 悬停内容展示的位置
  406. }
  407. },
  408. [h('span', column.label)] // 图标
  409. )
  410. ]
  411. },
  412. /**
  413. * 跳转到导入专利界面
  414. * @param {Object} data 参数
  415. * @param {*} type 导入类型
  416. */
  417. toImportParent(data, type) {
  418. if(!(Permission.FunPermissions('xiaoshi/patentImport'))){
  419. showPermissionDialog()
  420. return false
  421. }
  422. var types = {
  423. 1: '/import',
  424. 2: '/PatentNoImport',
  425. 4: '/conditionImport'
  426. }
  427. router.push(
  428. {
  429. path: types[type],
  430. query: {
  431. ...data
  432. }
  433. }
  434. )
  435. },
  436. // 校验文件是否全部上传并处理文件的guid
  437. allUploadFile(form) {
  438. var arr =[]
  439. let allUpload = this.validFile(form.systemFileList,arr)
  440. if (allUpload) {
  441. Message.warning('文件未全部上传,请耐心等待')
  442. return false
  443. }
  444. if(form.systemFileList && form.systemFileList.length>0){
  445. form.fileGuids = form.systemFileList.map(item => {
  446. return item.guid
  447. })
  448. }else{
  449. form.fileGuids = []
  450. }
  451. },
  452. //校验文件是否全部上传
  453. validFile(data,arr) {
  454. if (data && data.length > 0) {
  455. for(var i =0;i<data.length;i++){
  456. if(data[i] && data[i].guid){
  457. arr.push(data[i].guid)
  458. }else{
  459. return true
  460. }
  461. }
  462. return false
  463. } else {
  464. return false
  465. }
  466. },
  467. //校验是否全部上传
  468. checkUploadFile(data) {
  469. if(!data){
  470. return []
  471. }
  472. var arr = []
  473. let allUpload = this.validFile(data,arr)
  474. if (allUpload) {
  475. Message.warning('文件未全部上传,请耐心等待')
  476. return false
  477. }
  478. return arr
  479. },
  480. }