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.

942 lines
33 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. import util from "../js/util"
  2. import { mapGetters } from 'vuex'
  3. export const MdpTableMixin = {
  4. computed: {
  5. ...mapGetters([
  6. 'userInfo'
  7. ]),
  8. commonColumnConfigs:function(){
  9. var cols= this.columnConfigs.filter(c=>c.isCommon)
  10. if(cols.length==0){
  11. cols=this.columnConfigs.filter(c=>c.property);
  12. }
  13. var sliceNum=cols.length>this.commonQueryNum?this.commonQueryNum:cols.length
  14. cols=cols.slice(0,sliceNum)
  15. return cols;
  16. }
  17. },
  18. data(){
  19. return {
  20. filters:{//查询参数
  21. },
  22. defaultFilters:{//默认查询参数,第一次打开界面的时候用到,恢复默认值的时候用到
  23. },
  24. tableDatas:[],//表格列表数据
  25. pageInfo:{//分页数据
  26. total:0,//服务器端收到0时,会自动计算总记录数,如果上传>0的不自动计算。
  27. pageSize:10,//每页数据
  28. count:false,//是否需要重新计算总记录数
  29. pageNum:1,//当前页码、从1开始计算
  30. orderFields:[],//排序列 如 ['sex','student_id'],必须为数据库字段
  31. orderDirs:[]//升序 asc,降序desc 如 性别 升序、学生编号降序 ['asc','desc']
  32. },
  33. load:{ list: false, edit: false, del: false, add: false,batchAdd:false,batchDel:false,batchEdit:false,editSomeFields:false },//查询中...
  34. sels: [],//列表选中数据
  35. pkNames:[/** branchId1,branchId2 */],//表格主键的java属性名称,驼峰命名,默认为id,
  36. dataBak:null,//数据被修改前进行备份
  37. menuDefId:'',//menu_def.id 菜单表菜单编号,用于菜单权限判断,按钮权限判断
  38. menuDefName:'',//menu_def.name 功能名称,用于导出excel等文件名
  39. expandId:'',//智能表单定义编号,用于低代码,扩展表字段,自定义表单等
  40. refId:'',//引用编号,<table :ref="refId+'Table'"> <form :ref="refId+'Form'">
  41. columnConfigs:[],//列字段配置信息,根据表格头自动初始化
  42. hiQueryParams:{},//高级查询条件,需要转换为hiQueryParams="json字符串格式"提交到后台,树状结构,{cid:'',label:'',property:'',children:[]}
  43. checkedColumns:[],//选中的表格属性列表,如[id,branchName,xx,xxx,...]
  44. defaultCheckColumnNum:8,//默认展示的表格列数,前8列
  45. addForm:{},//新增页面的数据
  46. editForm:{},//编辑页面数据
  47. //增删改查(含批量)接口
  48. apis:{
  49. list:null,
  50. add:null,
  51. del:null,
  52. edit:null,
  53. editSomeFields:null,
  54. batchAdd:null,
  55. batchDel:null,
  56. batchEdit:null,
  57. },
  58. defaultDisabledRules:{
  59. addBtn:false,
  60. delBtn:false,
  61. detailBtn:false,
  62. searchBtn:false,
  63. exportBtn:false,
  64. importBtn:false,
  65. printBtn:false,
  66. selectBtn:false,
  67. selectConfirmBtn:false,
  68. },//判断是否可编辑
  69. disabledRules:{//初始化时会将defaultDisabledRules覆盖进 disabledRules
  70. },
  71. /**
  72. * 当前页面的currOpType,操作类型 list -列表detail-明细add-新增edit-修改mng-综合管理,select-查询并选择确认
  73. */
  74. currOpType: "mng",
  75. /**
  76. * 作废改成v-adaptive指令解决表格离底部距离问题
  77. */
  78. tableHeight:500,
  79. pageVisible:false,
  80. /**
  81. * 是否可编辑模式
  82. */
  83. editable:true,
  84. /**
  85. * 自定义表单编号用于加载表单配置信息
  86. */
  87. expandId: '',
  88. /**
  89. * 用于存储自定义表单的数据的字段名称驼峰命名后台自动转为下横线
  90. */
  91. expandFieldName: 'extInfos',
  92. /**
  93. * 是否显示 自定义表单信息
  94. */
  95. showExpand: false,
  96. formDef:{},
  97. formFields:[]
  98. }
  99. },
  100. watch:{
  101. visible(val){
  102. this.pageVisible=val;
  103. },
  104. pageVisible(val){
  105. this.$emit('update:visible',val)
  106. this.$emit(val?'open':'close',val)
  107. if(val==true){
  108. this.$nextTick(()=>{
  109. this.onOpen();
  110. })
  111. }else{
  112. this.onClose();
  113. }
  114. }
  115. },
  116. props: {
  117. /**
  118. * 弹框时显示或者关闭
  119. */
  120. visible:{
  121. type:Boolean,
  122. default:false
  123. },
  124. /**
  125. * 上级页面的currOpType用于多级权限判断参考currOpType
  126. */
  127. parentOpType:{//
  128. type:String,
  129. default:null
  130. },
  131. /**
  132. * 当前页面的currOpType,操作类型 list -列表detail-明细add-新增edit-修改mng-综合管理,select-查询并选择确认
  133. */
  134. subOpType:{
  135. type:String,
  136. default:null,
  137. },
  138. bottomOffset:{
  139. type:[String,Number],
  140. default:45
  141. },
  142. /**
  143. * subOpType='select' 时有效
  144. * 是否多选
  145. */
  146. multiple:{
  147. type:Boolean,
  148. default:false,
  149. },
  150. /**
  151. * 用于初始话高级查询常用查询等
  152. * {label:'列名',
  153. * property:'属性名',
  154. * sortNo:'排序从0-999,越小越靠前',
  155. * isCommon:'是否常用',
  156. * colType:'数据库字段类型 string/int/date/datatime/',
  157. * showHq:'是否显示在高级查询true/false',
  158. * showCol:'是否在表格中显示该列true/false',
  159. * sqlOper:'默认查询规则,默认eq gt/lt/ge/le/eq/ne/left_like/right_like/like/in/nin/bwtween/sql',
  160. * sqlVal:'默认值,多选的话逗号分隔'
  161. * beginVal:'如果sqlOper=between,值存于beginVal及envVal中',
  162. * endVal:'',
  163. * pk:'是否为主键,true/false',
  164. * itemCode:'字典表中itemCode字段,填写了该值将从字典表加载下拉列表'
  165. * colPrefix:'属性需要添加前缀是使用,比如res.id=xxxxx,此次填写res.',
  166. * disabledHq:'是否允许编辑查询条件',
  167. * }
  168. */
  169. columnCfgs:{
  170. type:Array,
  171. default: null,
  172. },
  173. /**
  174. * 需要从外部传入表格的参数由此进入
  175. * params={defaultFilters,filters,其它参数}
  176. */
  177. params:{
  178. type:Object,
  179. default:null,
  180. },
  181. /**
  182. * 显示风格
  183. * origin,tag,x
  184. */
  185. showStyle:{
  186. type:String,
  187. default:null
  188. }
  189. },
  190. mounted(){
  191. this.initTableColumnConfigs();
  192. this.getFormFields();
  193. this.initData();
  194. },
  195. methods: {
  196. onOpen(){
  197. this.initTableColumnConfigs();//有些情况下表格初始化未成功,在页面打开的时候,重新初始化未初始成功的表格配置信息
  198. this.initCurrData();
  199. },
  200. onClose(){
  201. },
  202. onFormClose(){
  203. var formDialog=this.$refs[this.refId+'FormDialog']
  204. if(formDialog){
  205. formDialog.close();
  206. }
  207. },
  208. /**
  209. * 页面初始话进行数据初始处理该函数由组件自行扩展添加一些需要的其它逻辑判断
  210. */
  211. initCurrData(){
  212. this.initDefaultFilters();
  213. Object.assign(this.filters,this.defaultFilters)
  214. this.disabledRulesInit(this.disabledRules)
  215. this.searchTableDatas();
  216. },
  217. /**
  218. * 此函数由组件扩展,给defaultFilters添加其它的额外默认参数
  219. */
  220. initDefaultFilters(){
  221. debugger
  222. if(this.params){
  223. Object.assign(this.defaultFilters,this.params)
  224. }
  225. },
  226. /**
  227. * 检查参数是否满足调用后台接口的条件
  228. *
  229. * @param params 提交给后台的参数池,map类型
  230. * @returns true / false
  231. */
  232. preQueryParamCheck(params){
  233. return true;
  234. },
  235. /**
  236. * 设置某个关键词按钮输入框禁用 disabledRules['addBtn']=false
  237. * 判断某个对象是否可编辑 this.disabledJudge('addBtn')==false
  238. */
  239. disabledRulesInit(disabledRules){
  240. },
  241. initData(){
  242. if(this.subOpType){
  243. this.currOpType=this.subOpType
  244. }
  245. this.disabledInit()
  246. this.$nextTick(()=>{
  247. this.initCurrData();
  248. })
  249. },
  250. handleSizeChange(pageSize) {
  251. this.pageInfo.pageSize=pageSize;
  252. this.loadTableDatas();
  253. },
  254. handleCurrentChange(pageNum) {
  255. this.pageInfo.pageNum = pageNum;
  256. this.loadTableDatas();
  257. },
  258. // 表格排序 obj.order=ascending/descending,需转化为 asc/desc ; obj.prop=表格中的排序字段,字段驼峰命名
  259. sortChange( obj ){
  260. if(obj.order==null){
  261. this.pageInfo.orderFields=[];
  262. this.pageInfo.orderDirs=[];
  263. }else{
  264. var dir='asc';
  265. if(obj.order=='ascending'){
  266. dir='asc'
  267. }else{
  268. dir='desc';
  269. }
  270. this.pageInfo.orderFields=[util.toLine(obj.prop)];
  271. this.pageInfo.orderDirs=[dir];
  272. }
  273. this.loadTableDatas();
  274. },
  275. //选择行
  276. selsChange: function (sels) {
  277. this.sels = sels;
  278. },
  279. searchTableDatas(){
  280. this.pageInfo.count=true;
  281. this.pageInfo.total=0;
  282. this.pageInfo.pageNum=1;
  283. this.loadTableDatas();
  284. },
  285. searchReset() {
  286. this.filters=Object.assign({},this.defaultFilters)
  287. this.hiQueryParams={}
  288. this.searchTableDatas();
  289. },
  290. /**
  291. * 根据表格头初始化columnConfigs
  292. * {label:'列名',
  293. * property:'属性名',
  294. * sortNo:'排序从0-999,越小越靠前',
  295. * isCommon:'是否常用',
  296. * colType:'数据库字段类型 string/int/date/datatime/',
  297. * showHq:'是否显示在高级查询true/false',
  298. * showCol:'是否在表格中显示该列true/false',
  299. * sqlOper:'默认查询规则,默认eq gt/lt/ge/le/eq/ne/left_like/right_like/like/in/nin/bwtween/sql',
  300. * sqlVal:'默认值,多选的话逗号分隔'
  301. * beginVal:'如果sqlOper=between,值存于beginVal及envVal中',
  302. * endVal:'',
  303. * pk:'是否为主键,true/false',
  304. * itemCode:'字典表中itemCode字段,填写了该值将从字典表加载下拉列表'
  305. * colPrefix:'属性需要添加前缀是使用,比如res.id=xxxxx,此次填写res.',
  306. * disabledHq:'是否允许编辑查询条件',
  307. * }
  308. * @returns
  309. */
  310. initTableColumnConfigs(){
  311. if(this.columnConfigs && this.columnConfigs.length>0){
  312. return;
  313. }
  314. var columnConfigs=[]
  315. if(this.columnCfgs && this.columnCfgs.length>0){
  316. columnConfigs.push(...this.columnCfgs)
  317. }else{
  318. var table=this.$refs[this.getRefId()+'Table'];
  319. if(!table){
  320. table=this.$refs['table']
  321. }
  322. if(!table){
  323. return;
  324. }
  325. table.$children.forEach(k=>{
  326. var column={}
  327. if(k.columnConfig){
  328. if(k.$attrs){
  329. Object.keys(k.$attrs).forEach(key=>column[util.toMCamel(key)]=k.$attrs[key])
  330. }
  331. column.property=k.columnConfig.property
  332. column.label=k.columnConfig.label
  333. column.showCol=true
  334. columnConfigs.push(column)
  335. }
  336. })
  337. }
  338. this.columnConfigs=columnConfigs
  339. if( !this.pkNames || this.pkNames.length<=0){
  340. this.pkNames=this.columnConfigs.filter(k=>k.pk==true).map(k=>k.property)
  341. }
  342. var colsIsCommon=this.columnConfigs.filter(c=>c.isCommon==true && c.property).map(c=>c.property)
  343. var colsUnCommon=this.columnConfigs.filter(c=>c.isCommon!=true && c.property).map(c=>c.property)
  344. var defNum=this.defaultCheckColumnNum;
  345. var checkNum=this.columnConfigs.length<defNum?this.columnConfigs.length:defNum
  346. if(colsIsCommon.length>0 && checkNum<=colsIsCommon.length){
  347. this.checkedColumns=colsIsCommon.splice(0,checkNum)
  348. }else{
  349. colsIsCommon.push(...colsUnCommon.splice(0,checkNum-colsIsCommon.length))
  350. this.checkedColumns=colsIsCommon
  351. }
  352. },
  353. getQueryParams(){
  354. let params = {
  355. pageSize: this.pageInfo.pageSize,
  356. pageNum: this.pageInfo.pageNum,
  357. total: this.pageInfo.total,
  358. count:this.pageInfo.count
  359. };
  360. if(this.pageInfo!=null){
  361. params = {
  362. pageSize: this.pageInfo.pageSize,
  363. pageNum: this.pageInfo.pageNum,
  364. total: this.pageInfo.total,
  365. count:this.pageInfo.count
  366. };
  367. }
  368. if(this.pageInfo.orderFields!=null && this.pageInfo.orderFields.length>0){
  369. let orderBys=[];
  370. for(var i=0;i<this.pageInfo.orderFields.length;i++){
  371. orderBys.push(this.pageInfo.orderFields[i]+" "+this.pageInfo.orderDirs[i])
  372. }
  373. params.$orderBy= orderBys.join(",")
  374. }
  375. if(this.params && this.params.filters){
  376. Object.assign(this.filters,this.params.filters)
  377. }
  378. Object.assign(params,this.filters)
  379. this.encodeHiQueryParams(params)
  380. return params;
  381. },
  382. /**
  383. * 对高级查询的参数进行编码加入到参数池中用于提交给后台接口
  384. * params.hiQueryParams=encodeURI(JSON.stringify(hiParams))
  385. * @param {*} params
  386. */
  387. encodeHiQueryParams(params){
  388. var hiQueryParams=this.filterHiQueryParams(this.hiQueryParams)
  389. if(hiQueryParams&&hiQueryParams.cid){
  390. params.hiQueryParams=encodeURI(JSON.stringify(hiQueryParams))
  391. }
  392. return params
  393. },
  394. /**
  395. * 对高级查询的条件进行过滤默认的无效条件减少提交后台接口的体积
  396. * @param {*} hi
  397. * @returns
  398. */
  399. filterHiQueryParams(hi){
  400. var that=this;
  401. var condition={};
  402. if(hi==null || !hi.cid){
  403. return null;
  404. }else{
  405. if(hi.children&&hi.children.length>0){
  406. if(hi.sqlLink=='AND'||hi.sqlLink=='OR'){
  407. condition={cid:hi.cid,sqlLink:hi.sqlLink,children:[]}
  408. hi.children.forEach(k=>{
  409. var child=that.filterHiQueryParams(k);
  410. if(child!=null && child.cid){
  411. condition.children.push(child);
  412. }
  413. })
  414. return condition;
  415. }else{
  416. return null;
  417. }
  418. }else{
  419. if(hi.sqlLink=='AND'||hi.sqlLink=='OR'){
  420. return null;
  421. }else{
  422. if(hi.sqlOper=='=' && !hi.sqlVal){
  423. return null;
  424. }else if(!hi.sqlOper){
  425. return null;
  426. }else if(hi.sqlOper!='$IS NULL' && hi.sqlOper!='$IS NOT NULL'){
  427. if(hi.sqlVal==null || hi.sqlVal==''){
  428. return null;
  429. }
  430. }
  431. condition={cid:hi.cid,property:hi.property,sqlOper:hi.sqlOper,colType:hi.colType,sqlVal:hi.sqlVal,endVal:hi.endVal,colPrefix:hi.colPrefix}
  432. return condition;
  433. }
  434. }
  435. }
  436. },
  437. getFormFields(){
  438. if(this.expandId){
  439. this.$mdp.listFormFieldCacheFirst({formId:this.expandId}).then(res=>{
  440. var tips=res.data.tips;
  441. var data=res.data.data;
  442. if(tips.isOk && data){
  443. this.formDef=data.formDef
  444. this.formFields=data.formFields
  445. }
  446. })
  447. }
  448. },
  449. //获取列表 Item 数据项定义
  450. loadTableDatas() {
  451. var apiName="apis.list"
  452. var params = this.getQueryParams();//查询条件
  453. if(!this.preQueryParamCheck(params)){
  454. return;
  455. }
  456. if(!this.apiCheck(this.apis.list,apiName)){
  457. return;
  458. }
  459. this.load.list = true;
  460. var func = this.apis.list;
  461. func(params).then((res) => {
  462. this.getResult(res,apiName)
  463. this.load.list = false;
  464. }).catch( err => {
  465. this.load.list = false
  466. }
  467. );
  468. },
  469. getResult(res,apiName){
  470. var tips=res.data.tips;
  471. if(tips.isOk){
  472. this.pageInfo.total = res.data.total;
  473. this.pageInfo.count=false;
  474. var tableDatas = res.data.data;
  475. this.tableDatas=tableDatas
  476. this.parseExpand(tableDatas,this.expandFieldName)
  477. this.afterList(res.data.data,tips.isOk,apiName)
  478. }else{
  479. this.$notify({ message: tips.msg, type: 'error' });
  480. }
  481. },
  482. parseExpand(tableDatas,expandFieldName){
  483. if(expandFieldName && tableDatas && tableDatas.length>0){
  484. tableDatas.forEach(d=>{
  485. if(d[expandFieldName] && d[expandFieldName] instanceof String){
  486. d[expandFieldName]=JSON.parse(d[expandFieldName])
  487. }
  488. if(d[expandFieldName] instanceof Array){
  489. d[expandFieldName].forEach(k=>{
  490. d[expandFieldName+"."+k.id]=k.value
  491. })
  492. }
  493. })
  494. }
  495. },
  496. //页面数据加载完后需要对数据进行加工处理的
  497. afterList(tableDatas,isOk,apiName){
  498. },
  499. apiCheck(func,apiName){
  500. if(!func){
  501. this.$notify({ message: apiName+"为空", type: 'error' });
  502. return false;
  503. }
  504. return true;
  505. },
  506. openForm(res){
  507. let {parentOpType,formRefId,subOpType,formData} = res
  508. if(!formRefId){
  509. formRefId=this.getRefId()+"FormDialog"
  510. }
  511. if(!parentOpType){
  512. parentOpType=this.currOpType
  513. }
  514. var form=this.$refs[formRefId]
  515. if(form){
  516. res.parentOpType=parentOpType
  517. res.formRefId=formRefId
  518. res.expandId=this.expandId
  519. res.showExpand=this.showExpand
  520. res.expandFieldName=this.expandFieldName
  521. form.open(res);
  522. }else{
  523. }
  524. },
  525. //表单新增/修改提交后的回调
  526. afterFormSubmit(res,isOk,currOpType){
  527. if(isOk){
  528. this.searchTableDatas();
  529. }
  530. this.$emit("form-submit",res,isOk,currOpType)
  531. },
  532. //表单新增/修改时取消或者关闭
  533. onFormCancel(currOpType){
  534. this.$emit("form-cancel",currOpType)
  535. },
  536. //单条新增/批量新增后回调此函数
  537. afterAddSubmit(res,isOk,apiName){
  538. if(isOk){
  539. this.searchTableDatas();
  540. }
  541. this.$emit("add-submit",res,isOk,apiName)
  542. },
  543. //单条修改/批量修改后回调此函数
  544. afterEditSubmit(res,isOk,apiName){
  545. if(isOk){
  546. this.searchTableDatas();
  547. }
  548. this.$emit("edit-submit",res,isOk,apiName)
  549. },
  550. //单条删除/批量删除后回调此函数
  551. afterDelSubmit(res,isOk,apiName){
  552. if(isOk){
  553. this.searchTableDatas();
  554. }
  555. this.$emit("del-submit",res,isOk,apiName)
  556. },
  557. //
  558. afterEditSomeFields(res,isOk,params,row){
  559. if(isOk){
  560. this.searchTableDatas();
  561. }
  562. this.$emit("fields-change",res,isOk,params,row)
  563. },
  564. //选择行
  565. selsChange: function (sels) {
  566. this.sels = sels;
  567. },
  568. //即将作废
  569. showAdd(){
  570. },
  571. //即将作废
  572. showEdit(){
  573. },
  574. //即将作废
  575. showDetail(){
  576. },
  577. //删除
  578. handleDel: function (row,index) {
  579. this.$confirm('确认删除该记录吗?', '提示', {
  580. type: 'warning'
  581. }).then(() => {
  582. var apiName="apis.del"
  583. if(!this.apiCheck(this.apis.del,apiName)){
  584. return;
  585. }
  586. this.load.del=true;
  587. this.load.batchDel=true;
  588. let params = {};
  589. this.getPkNames().forEach(k=>{
  590. params[k]=row[k]
  591. })
  592. var func = this.apis.del;
  593. func(params).then((res) => {
  594. this.load.del=false;
  595. this.load.batchDel=false;
  596. var tips=res.data.tips;
  597. if(tips.isOk){
  598. this.pageInfo.count=true;
  599. }
  600. this.$notify({ message: tips.msg, type: tips.isOk?'success':'error' });
  601. this.afterDelSubmit(res,tips.isOk,apiName)
  602. }).catch( err => {
  603. this.load.del=false
  604. this.load.batchDel=false;
  605. this.afterDelSubmit(err,false,apiName)
  606. }
  607. );
  608. });
  609. },
  610. //批量删除
  611. batchDel: function () {
  612. if(this.sels==null || this.sels.length==0){
  613. this.$notify({ message: "未选择待删除数据", type: 'error' });
  614. return;
  615. }
  616. this.$confirm('确认删除选中记录吗?', '提示', {
  617. type: 'warning'
  618. }).then(() => {
  619. var apiName="apis.batchDel"
  620. if(!this.apiCheck(this.apis.batchDel,apiName)){
  621. return;
  622. }
  623. this.load.batchDel=true;
  624. let params = this.getDelPks(this.sels);
  625. var func = this.apis.batchDel;
  626. func(params).then((res) => {
  627. this.load.batchDel=false;
  628. var tips=res.data.tips;
  629. if( tips.isOk ){
  630. this.pageInfo.count=true;
  631. }
  632. this.$notify({ message: tips.msg, type: tips.isOk?'success':'error'});
  633. this.afterDelSubmit(res,tips.isOk,apiName)
  634. }).catch( err => {
  635. this.load.batchDel=false
  636. this.afterDelSubmit(res,false,apiName);
  637. }
  638. );
  639. });
  640. },
  641. /**
  642. * 获取主键,填值到params中
  643. * @param {*} rows
  644. * @returns
  645. */
  646. setPks(rows,params){
  647. params.$pks=this.getPks(rows)
  648. },
  649. getPkNames(){
  650. var pkNames=this.pkNames&&this.pkNames.length>0?this.pkNames:['id']
  651. return pkNames;
  652. },
  653. /**
  654. * 获取主键列表
  655. * @param {} rows
  656. * @returns
  657. */
  658. getDelPks(rows){
  659. var pkNames=this.getPkNames();
  660. var pks=rows.map(k=>{
  661. var pk={}
  662. pkNames.forEach(name=>{
  663. pk[name]=k[name]
  664. })
  665. return pk;
  666. })
  667. return pks
  668. },
  669. /**
  670. * 获取主键列表
  671. * @param {} rows
  672. * @returns
  673. */
  674. getPks(rows){
  675. var pkNames=this.getPkNames();
  676. if(pkNames.length>1){
  677. var pks=rows.map(k=>{
  678. var pk={}
  679. pkNames.forEach(name=>{
  680. pk[name]=k[name]
  681. })
  682. return pk;
  683. })
  684. return pks
  685. }else if(pkNames.length==1){
  686. var pks=rows.map(k=>{
  687. var pk= k[pkNames[0]]
  688. return pk;
  689. })
  690. return pks
  691. }
  692. return null;
  693. },
  694. /**
  695. * 判断两个对象的主键及值是否相等
  696. * @param {*} from
  697. * @param {*} to
  698. * @returns
  699. */
  700. justPkIsMatch(from,to){
  701. var isMatch=true;
  702. for(var i=0;i++;i<that.pkNames.length){
  703. isMatch=k[pkNames[i]]==row[pkNames[i]]
  704. if(isMatch==false){
  705. break;
  706. }
  707. }
  708. return isMatch;
  709. },
  710. /**
  711. * 对修改的字段进行判断返回false ,将取消更新数据库
  712. * @param {*} row 当前选中的行
  713. * @param {*} fieldName 修改的字段名
  714. * @param {*} $event 修改后的值
  715. * @param {*} params 将要提交服务器的参数
  716. * @returns true/false 返回false ,将取消更新数据库
  717. */
  718. editSomeFieldsCheck(row,fieldName,$event,params){
  719. params[fieldName]=$event
  720. return true;
  721. },
  722. editSomeFields(row,fieldName,$event){
  723. var params={};
  724. var that=this;
  725. if(this.sels.length>0){
  726. if(!this.sels.some(k=>that.justPkIsMatch(k,row))){
  727. this.$notify({position:'bottom-left',showClose:true,message:'请操作选中的行或者取消选中的行再操作其它行',type:'warning'})
  728. return;
  729. }
  730. this.setPks(this.sels,params);
  731. }else{
  732. this.setPks([row],params)
  733. }
  734. if(!this.editSomeFieldsCheck(row,fieldName,$event,params)){
  735. if(this.dataBak){
  736. if(this.justPkIsMatch(this.dataBak,row)){//进行数据恢复
  737. Object.assign(row,this.dataBak)
  738. }
  739. }
  740. return;
  741. }
  742. var apiName="apis.editSomeFields"
  743. if(!this.apiCheck(this.apis.editSomeFields,apiName)){
  744. return;
  745. }
  746. this.load.editSomeFields=true;
  747. var func = this.apis.editSomeFields;
  748. func(params).then(res=>{
  749. var tips = res.data.tips;
  750. if(tips.isOk){
  751. this.afterEditSomeFields(res,tips.isOk,params,row)
  752. }else{
  753. if(this.dataBak && this.justPkIsMatch(row,this.dataBak)){
  754. Object.assign(row,this.dataBak)
  755. }
  756. this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
  757. }
  758. }).catch(err=>{
  759. this.load.editSomeFields=false;
  760. });
  761. },
  762. rowClick: function(row, event, column){
  763. this.dataBak=Object.assign({},row)
  764. this.$emit('row-click',row, event, column);// @row-click="rowClick"
  765. },
  766. selectConfirm:function(row){
  767. this.$emit('select',row)
  768. this.$emit('change',row)
  769. this.$emit('change2',row)
  770. },
  771. selectListConfirm:function(){
  772. this.$emit('select',this.sels)
  773. this.$emit('change',this.sels)
  774. this.$emit('change2',this.sels)
  775. },
  776. onCheckedColumnsChange(checkedColumns){
  777. this.checkedColumns=checkedColumns
  778. },
  779. getRefId(){
  780. if(this.refId){
  781. return this.refId
  782. }else{
  783. this.refId=util.createSeqNo('auto_ref_')
  784. return this.refId;
  785. }
  786. },
  787. /**
  788. * 检查按钮是否具有权限
  789. * btnId 按钮编号 来源于menu_def.id 按钮
  790. * menuDefId: 来源于menu_def.id 菜单
  791. */
  792. checkBtnQx(btnId,menuDefId){
  793. if(!menuDefId){
  794. if(this.menuDefId){
  795. menuDefId=this.menuDefId
  796. }else{
  797. return true;
  798. }
  799. }
  800. return this.$mdp.checkBtnQx(btnId,menuDefId)
  801. },
  802. /**
  803. * 判断当前列是否应该显示
  804. * @param {*} property
  805. * @returns
  806. */
  807. showCol(property){
  808. if(!this.checkedColumns || this.checkedColumns.length==0){
  809. return true;
  810. }
  811. return this.checkedColumns.some(k=>k==property)
  812. },
  813. /**
  814. * 监听高级查询参数编号
  815. */
  816. onHiQueryParamsChange(hiQueryParams){
  817. this.hiQueryParams=hiQueryParams
  818. this.searchTableDatas();
  819. },
  820. export2Excel(){
  821. var cols= this.columnConfigs.filter(k=>k.property)
  822. if(cols.length<=0){
  823. return;
  824. }
  825. import("@/vendor/Export2Excel").then(excel => {
  826. const tHeader = cols.map(c=>c.label);
  827. const filterVal = cols.map(c=>c.property);
  828. const list = this.tableDatas;
  829. const data = this.formatJson(filterVal, list);
  830. var fieldName=(this.menuDefName?this.menuDefName:this.getRefId())+"_"+util.formatDate(new Date(),'yyyyMMddHHmmss');
  831. excel.export_json_to_excel({
  832. header: tHeader,
  833. data,
  834. filename: fieldName,
  835. autoWidth: true,
  836. bookType: "xlsx"
  837. });
  838. });
  839. },
  840. formatJson(filterVal, jsonData) {
  841. return jsonData.map(v =>
  842. filterVal.map(j => {
  843. return v[j];
  844. })
  845. );
  846. },
  847. /**
  848. * 判断字段按钮等是否可编辑
  849. * @param {*} key
  850. */
  851. disabledJudge(key){
  852. if(key in this.disabledRules){
  853. return this.disabledRules[key]
  854. }else{
  855. return false;
  856. }
  857. },
  858. disabledInit(){
  859. var disabledRules=Object.assign(this.disabledRules,this.defaultDisabledRules);
  860. Object.keys(this.editForm).forEach(key=>disabledRules[key]=false)
  861. if( !this.currOpType || this.currOpType.indexOf('detail')>=0||this.currOpType.indexOf('list')>=0){
  862. Object.keys(disabledRules).forEach(key=>disabledRules[key]=true)
  863. }else if(this.currOpType.indexOf('select')>=0){
  864. Object.keys(disabledRules).forEach(key=>disabledRules[key]=true)
  865. disabledRules.selectBtn=false
  866. }else if(this.currOpType.indexOf('add')>=0){
  867. Object.keys(disabledRules).forEach(key=>disabledRules[key]=false)
  868. }else if(this.currOpType.indexOf('edit')>=0){
  869. Object.keys(disabledRules).forEach(key=>disabledRules[key]=false)
  870. }else if(this.currOpType.indexOf('mng')>=0){
  871. Object.keys(disabledRules).forEach(key=>disabledRules[key]=false)
  872. }
  873. this.disabledRules=disabledRules
  874. },
  875. /**
  876. * 拷贝一条除了主键不一样其它都一样的数据,如果存在多个主键只需要更改第一个主键数据即可
  877. * @param {*} row
  878. */
  879. copy(row){
  880. var params=Object.assign({},row)
  881. var pkNames=this.getPkNames();
  882. var firstPkName=pkNames[0]
  883. params[firstPkName]=row[firstPkName]+"_1"
  884. var func=this.apis.add
  885. func(params).then(res=>{
  886. var tips = res.data.tips
  887. if(tips.isOk){
  888. this.searchTableDatas();
  889. }else{
  890. this.$message.error(tips.msg)
  891. }
  892. })
  893. }
  894. /**end 自定义函数请在上面加**/
  895. },
  896. }