From fec6c24bc3fd902f8ced64bc2600c0b0836f7e52 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 10 一月 2025 11:34:58 +0800
Subject: [PATCH] 2025-01-10

---
 src/views/billprint/index.jsx |  881 ++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 674 insertions(+), 207 deletions(-)

diff --git a/src/views/billprint/index.jsx b/src/views/billprint/index.jsx
index a7be0ab..bb22cfb 100644
--- a/src/views/billprint/index.jsx
+++ b/src/views/billprint/index.jsx
@@ -1,13 +1,12 @@
 import React, { Component } from 'react'
 import { is, fromJS } from 'immutable'
-import { Col, Row, Spin, notification, Button } from 'antd'
+import { Col, Row, Spin, notification, Button, Modal } from 'antd'
 import moment from 'moment'
+import md5 from 'md5'
 
 import Api from '@/api'
 import Utils from '@/utils/utils.js'
-import options, { styles } from '@/store/options.js'
-import zhCN from '@/locales/zh-CN/main.js'
-import enUS from '@/locales/en-US/main.js'
+import { styles } from '@/store/options.js'
 import UtilsDM from '@/utils/utils-datamanage.js'
 import NotFount from '@/components/404'
 import asyncComponent from '@/utils/asyncComponent'
@@ -34,18 +33,23 @@
 
 class BillPrint extends Component {
   state = {
-    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
     loadingview: true,
     printing: false,
     pages: null,
     BID: '',
     data: '',
     tempId: '',
+    pageId: '',
     config: null,
     urlParam: null,
     visible: false,
-    auto: true
+    rePos: false,
+    loading: false,
+    auto: true,
+    ismob: /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i.test(navigator.userAgent)
   }
+
+  reloading = false
 
   UNSAFE_componentWillMount() {
     const { params } = this.props.match
@@ -62,10 +66,12 @@
         let param = JSON.parse(window.decodeURIComponent(window.atob(params.param)))
   
         sessionStorage.setItem('dataM', param.dataM || '')
+
         this.setState({
           BID: param.id || '',
           tempId: param.tempId,
-          urlParam: param
+          urlParam: param,
+          pageId: param.pageId || ''
         }, () => {
           setTimeout(() => {
             this.getMenuParam()
@@ -86,24 +92,50 @@
   }
 
   componentDidMount() {
-    const _this = this
+    const that = this
 
-    Object.defineProperty(window, 'debug', {
-      configurable: true,
-      enumerable: true,
-      set(value) {
-        if (value + '' === 'false') {
-          window.debugger = false
-          window.GLOB.breakpoint = false
-          sessionStorage.removeItem('breakpoint')
-        } else {
-          window.debugger = true
-          window.GLOB.breakpoint = value + ''
-          sessionStorage.setItem('breakpoint', value)
+    if (window.GLOB.sysType !== 'cloud') {
+      Object.defineProperty(window, 'debugger', {
+        configurable: true,
+        enumerable: true,
+        set(value) {
+          if (value === true) {
+            window.GLOB.debugger = true
+          } else if (value === 0) {
+            if (window.backend) {
+              sessionStorage.setItem('systemRun', 'front')
+              window.location.reload()
+            } else {
+              window.mkInfo('绯荤粺褰撳墠鏈娇鐢ㄥ悗绔剼鏈紒')
+            }
+          } else if (value === false) {
+            if (sessionStorage.getItem('systemRun') === 'front') {
+              sessionStorage.removeItem('systemRun')
+              window.location.reload()
+            } else {
+              window.GLOB.debugger = false
+            }
+          }
         }
-        _this.debugChange()
-      }
-    })
+      })
+
+      Object.defineProperty(window, 'debug', {
+        configurable: true,
+        enumerable: true,
+        set(value) {
+          if (value + '' === 'false') {
+            window.GLOB.debugger = false
+            window.GLOB.breakpoint = false
+            sessionStorage.removeItem('breakpoint')
+          } else {
+            window.GLOB.debugger = true
+            window.GLOB.breakpoint = value + ''
+            sessionStorage.setItem('breakpoint', value)
+          }
+          that.debugChange()
+        }
+      })
+    }
 
     document.onkeydown = (event) => {
       let e = event || window.event
@@ -123,11 +155,10 @@
       let _shortcut = `${preKey}+${keyCode}`
 
       if (window.GLOB.breakpoint && _shortcut === 'ctrl+67') {
-        window.debugger = false
         window.GLOB.breakpoint = false
         sessionStorage.removeItem('breakpoint')
         
-        _this.debugChange()
+        that.debugChange()
       }
     }
   }
@@ -152,13 +183,15 @@
         sessionStorage.setItem('LoginUID', result.LoginUID || '')
         sessionStorage.setItem('dataM', 'false')
 
-        this.getMenuParam()
-
         // 鑾峰彇绯荤粺淇℃伅
         let _param = {
           func: 's_Get_style',
           TypeCharOne: 'PC',
           LText: `select '${window.GLOB.appkey}'`,
+        }
+
+        if (window.GLOB.style_appkey) {
+          _param.style_appkey = window.GLOB.style_appkey
         }
 
         _param.userid = result.UserID
@@ -170,6 +203,7 @@
           if (res.status) {
             window.GLOB.style = res.CSS
             document.title = res.titleName
+            sessionStorage.setItem('appname', res.appname || '')
         
             if (window.GLOB.style && styles[window.GLOB.style]) {
               document.body.className = styles[window.GLOB.style] + ' ' + (res.split_line_show === 'false' ? 'hidden-split-line' : '')
@@ -183,6 +217,8 @@
               document.getElementsByTagName('head')[0].appendChild(link)
             }
           }
+
+          this.getMenuParam()
         })
       } else {
         notification.warning({
@@ -231,9 +267,13 @@
           this.setState({
             viewlost: true,
             loadingview: false,
-            lostmsg: this.state.dict['main.view.unenabled']
+            lostmsg: '鎶辨瓑锛屾偍璁块棶鐨勯〉闈㈡湭鍚敤锛岃鑱旂郴绠$悊鍛樸��'
           })
           return
+        }
+
+        if (config.webTitle) {
+          document.title = config.webTitle
         }
 
         config.style = config.style || {}
@@ -281,13 +321,24 @@
 
         config.components = config.components.filter(item => !['tabs', 'search'].includes(item.type))
 
+        if (window.backend && config.allSqls) {
+          let urlparam = urlParam || {}
+          let keys = Object.keys(urlparam)
+          config.allSqls.forEach(item => {
+            item.id = md5(window.GLOB.appkey + item.v_id)
+            if (item.type === 'datasource' || item.type === 'excelOut') {
+              item.urlkeys = keys
+              item.urlparam = urlparam
+              if (config.flow_code) {
+                item.works_flow_code = config.flow_code
+              }
+            }
+            window.GLOB.CacheData.set('sql_' + item.uuid, item)
+          })
+        }
+
         let userName = sessionStorage.getItem('User_Name') || ''
         let fullName = sessionStorage.getItem('Full_Name') || ''
-
-        if (sessionStorage.getItem('isEditState') === 'true') {
-          userName = sessionStorage.getItem('CloudUserName') || ''
-          fullName = sessionStorage.getItem('CloudFullName') || ''
-        }
 
         let regs = [
           { reg: /@userName@/ig, value: `'${userName}'` },
@@ -313,10 +364,26 @@
 
         window.GLOB.CacheData.set(tempId, {$BID: BID})
 
+        let initInters = []
+
+        this.formatInterSetting(config.interfaces, regs, initInters, params, BID, config.MenuName)
+
         config.components = config.components.map(component => {
-          if (component.action) component.action = []
-          if (component.search) component.search = []
+          if (component.action) {
+            component.action = component.action.filter(cell => {
+              cell = this.resetButton(component, cell)
+              cell.$toolbtn = true
+    
+              return !cell.hidden
+            })
+          }
+          if (component.search) {
+            component.search = []
+            component.$searches = []
+          }
           component.data = [] // 鍒濆鍖栨暟鎹负绌�
+
+          component.$menuname = (config.MenuName || '') + '-' + (component.name || '')
 
           if (component.subtype === 'tablecard') { // 鍏煎
             component.type = 'card'
@@ -335,23 +402,47 @@
           if (component.type === 'table') {
             let getColumns = (cols) => {
               return cols.filter(item => {
-                if (item.type === 'colspan') {
+                if (item.Hide === 'true') return false
+
+                item.IsSort = 'false'
+
+                if (item.type === 'number') {
+                  if (typeof(item.decimal) === 'number') {
+                    item.round = Math.pow(10, item.decimal)
+                    if (item.format === 'percent') {
+                      item.decimal = item.decimal > 2 ? item.decimal - 2 : 0
+                    }
+                  }
+                } else if (item.type === 'formula') {
+                  if (typeof(item.decimal) === 'number') {
+                    item.round = Math.pow(10, item.decimal)
+                  }
+                } else if (item.type === 'colspan') {
                   item.subcols = getColumns(item.subcols)
                   if (item.subcols.length === 0) {
                     return false
                   }
                 } else if (item.type === 'custom') {
                   item.elements = item.elements.filter(cell => {
-                    if (cell.eleType === 'button') return false
+                    if (cell.eleType === 'button') {
+                      cell = this.resetButton(component, cell)
+
+                      return !cell.hidden
+                    }
 
                     cell = this.resetElement(cell)
-                    return cell
+
+                    return true
                   })
                   if (item.elements.length === 0) {
                     return false
                   }
                 } else {
                   item.IsSort = 'false'
+                }
+
+                if (item.marks && item.marks.length === 0) {
+                  item.marks = null
                 }
           
                 return true
@@ -369,18 +460,26 @@
               }
     
               card.elements = card.elements.filter(cell => {
-                if (cell.eleType === 'button') return false
-   
+                if (cell.eleType === 'button') {
+                  cell = this.resetButton(component, cell)
+
+                  return !cell.hidden
+                }
+
                 cell = this.resetElement(cell)
-    
+   
                 return true
               })
     
               if (!card.backElements || card.backElements.length === 0) return
     
               card.backElements = card.backElements.filter(cell => {
-                if (cell.eleType === 'button') return false
-   
+                if (cell.eleType === 'button') {
+                  cell = this.resetButton(component, cell)
+
+                  return !cell.hidden
+                }
+
                 cell = this.resetElement(cell)
     
                 return true
@@ -388,8 +487,12 @@
             })
           } else if (component.type === 'balcony') {
             component.elements = component.elements.filter(cell => {
-              if (cell.eleType === 'button') return false
-                
+              if (cell.eleType === 'button') {
+                cell = this.resetButton(component, cell)
+
+                return !cell.hidden
+              }
+              
               cell = this.resetElement(cell)
     
               return true
@@ -398,19 +501,39 @@
 
           if (component.wrap && component.wrap.datatype === 'static') {
             component.format = ''
+          } else if (component.wrap && component.wrap.datatype === 'public') {
+            component.componentId = component.wrap.publicId
+            component.format = ''
           }
     
           if (!component.setting) return component // 涓嶄娇鐢ㄧ郴缁熷嚱鏁版椂
           if (!component.format) return component  // 娌℃湁鍔ㄦ�佹暟鎹�  鏁版嵁鏍煎紡 array 鎴� object
+
+          component.setting.arr_field = component.columns ? component.columns.map(col => col.field).join(',') : ''
+          component.setting.laypage = false   // 鏄惁鍒嗛〉锛岃浆涓篵oolean 缁熶竴鏍煎紡
+          component.setting.$name = component.$menuname
+
+          if (component.format === 'object') {
+            component.setting.$top = true
+          }
+
           if (component.setting.interType !== 'system') { // 涓嶄娇鐢ㄧ郴缁熷嚱鏁版椂
             component.setting.sync = 'false'
             return component
           }
+
+          component.setting.uuid = component.uuid
     
           let _customScript = ''
+          let _tailScript = ''
           component.scripts && component.scripts.forEach(script => {
-            if (script.status !== 'false') {
+            if (script.status === 'false') return
+            if (script.position !== 'back') {
               _customScript += `
+              ${script.sql}
+              `
+            } else {
+              _tailScript += `
               ${script.sql}
               `
             }
@@ -418,7 +541,6 @@
           delete component.scripts
     
           component.setting.execute = component.setting.execute !== 'false'  // 榛樿sql鏄惁鎵ц锛岃浆涓篵oolean 缁熶竴鏍煎紡
-          component.setting.laypage = false   // 鏄惁鍒嗛〉锛岃浆涓篵oolean 缁熶竴鏍煎紡
           component.setting.onload = 'true'   // 榛樿鍔犺浇
     
           if (!component.setting.execute) {
@@ -429,31 +551,38 @@
           }
       
           if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
-            component.setting.dataresource = component.setting.dataresource.replace(/\$@/ig, '/*')
-            component.setting.dataresource = component.setting.dataresource.replace(/@\$/ig, '*/')
-            _customScript = _customScript.replace(/\$@/ig, '/*')
-            _customScript = _customScript.replace(/@\$/ig, '*/')
+            component.setting.dataresource = component.setting.dataresource.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
+            _customScript = _customScript.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
+            _tailScript = _tailScript.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
           } else {
-            component.setting.dataresource = component.setting.dataresource.replace(/@\$|\$@/ig, '')
-            _customScript = _customScript.replace(/@\$|\$@/ig, '')
+            component.setting.dataresource = component.setting.dataresource.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
+            _customScript = _customScript.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
+            _tailScript = _tailScript.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
           }
 
           regs.forEach(cell => {
             component.setting.dataresource = component.setting.dataresource.replace(cell.reg, cell.value)
             _customScript = _customScript.replace(cell.reg, cell.value)
+            _tailScript = _tailScript.replace(cell.reg, cell.value)
           })
     
           component.setting.customScript = _customScript // 鏁寸悊鍚庤嚜瀹氫箟鑴氭湰
+          component.setting.tailScript = _tailScript     // 鍚庣疆鑷畾涔夎剼鏈�
+
+          if (window.backend && config.allSqls) {
+            component.setting.sync = 'false'
+          } else if (_tailScript) {
+            component.setting.sync = 'false'
+          }
+          component.dataName = 'mk' + component.uuid.slice(-18)
     
           // floor    缁勪欢鐨勫眰绾�
           // pageable 鏄惁鍒嗛〉锛岀粍浠跺睘鎬э紝涓嶅垎椤电殑缁勪欢鎵嶅彲浠ョ粺涓�鏌ヨ
           if (component.setting.sync === 'true') {
-            component.dataName = 'mk' + component.uuid.slice(-18)
             let param = this.getDefaultParam(component)
             _pars.push(param)
-          } else {
-            let arr_field = component.columns.map(col => col.field).join(',')
-            let param = UtilsDM.getQueryDataParams(component.setting, arr_field, [], component.setting.order || '', 1, 1000, BID)
+          } else if (component.subtype !== 'dualdatacard') {
+            let param = UtilsDM.getQueryDataParams(component.setting, [], component.setting.order || '', 1, 1000, BID)
             
             param.componentId = component.uuid
 
@@ -464,11 +593,32 @@
           return component
         })
 
-        _pars = this.getFormatParam(_pars)
+        _pars = this.getFormatParam(_pars, config.MenuName)
 
         if (_pars) {
-          _pars.componentId = 'union'
+          _pars.componentId = ''
           params.unshift(_pars)
+        } else if (window.backend && config.allSqls && params.length > 0) {
+          let data = []
+          params = params.filter(item => {
+            if (!item.$backend || item.public) return true
+
+            item.data[0].exps.forEach(cell => {
+              if (cell.key === 'mk_obj_name') {
+                cell.value = 'mk' + item.componentId.slice(-18)
+              }
+            })
+            data.push(item.data[0])
+            return false
+          })
+          if (data.length > 0) {
+            params.push({
+              $backend: true,
+              $type: 's_Get_TableData',
+              componentId: '',
+              data
+            })
+          }
         }
 
         if (config.everyPCount && !config.printPage) { // 鍏煎
@@ -487,8 +637,20 @@
           auto: config.printPage === 'auto',
           config
         }, () => {
-          if (params.length === 0) {
+          if (config.normalcss) {
+            let node = document.getElementById(config.uuid)
+            node && node.remove()
+      
+            let ele = document.createElement('style')
+            ele.id = config.uuid
+            ele.innerHTML = config.normalcss
+            document.getElementsByTagName('head')[0].appendChild(ele)
+          }
+          
+          if (params.length === 0 && initInters.length === 0) {
             this.setState({loadingview: false, pages: [config.components]})
+          } else if (initInters.length > 0) {
+            this.loadinit(initInters, params)
           } else {
             this.loadmaindata(params)
           }
@@ -503,8 +665,42 @@
     })
   }
 
+  resetButton = (item, cell) => {
+    cell.logLabel = item.$menuname + '-' + cell.label
+    cell.Ot = cell.Ot || 'requiredSgl'
+    cell.syncComponentId = ''
+    cell.$menuId = item.uuid
+
+    cell.hidden = cell.hidden === 'true'
+    if (!['pop', 'prompt', 'exec', 'innerpage', 'form'].includes(cell.OpenType)) {
+      cell.hidden = true
+    }
+
+    if (cell.controlField) {
+      if (/,/ig.test(cell.controlVal)) {
+        cell.controlVals = cell.controlVal.split(',')
+      } else {
+        cell.controlVals = [(cell.controlVal || '')]
+      }
+    }
+
+    return cell
+  }
+
   resetElement = (cell) => {
     cell.style = cell.style || {}
+
+    if (cell.style.display === 'inline-block') {
+      cell.style.verticalAlign = 'top'
+    }
+
+    if (cell.marks && cell.marks.length === 0) {
+      cell.marks = null
+    }
+    if (cell.anchors && cell.anchors.length === 0) {
+      cell.anchors = null
+    }
+    
     if (['text', 'number', 'formula'].includes(cell.eleType)) {
       cell.innerHeight = cell.innerHeight || 'auto'
       cell.alignItems = cell.height > 1 ? cell.alignItems : ''
@@ -514,10 +710,101 @@
         if (cell.format === 'percent') {
           cell.decimal = cell.decimal > 2 ? cell.decimal - 2 : 0
         }
+      } else if (cell.eleType === 'formula' && typeof(cell.decimal) === 'number') {
+        cell.round = Math.pow(10, cell.decimal)
       }
     }
 
     return cell
+  }
+
+  formatInterSetting = (inters, regs, initInters, params, BID, MenuName) => {
+    if (!inters) return []
+
+    let delay = 15
+    inters.forEach(inter => {
+      if (inter.status !== 'true') return
+
+      inter.setting.delay = delay
+      delay += 15
+
+      inter.setting.supModule = ''
+      inter.setting.arr_field = inter.columns.map(col => col.field).join(',')
+      inter.setting.$name = (MenuName || '') + '-鍏叡鏁版嵁婧�-' + inter.setting.name
+
+      if (inter.setting.interType !== 'system') {
+        let param = UtilsDM.getQueryDataParams(inter.setting, [], inter.setting.order || '', 1, 1000, BID)
+              
+        param.componentId = inter.uuid
+
+        if (inter.setting.loadlevel === 'init') {
+          initInters.push(param)
+        } else {
+          param.public = true
+          params.push(param)
+        }
+        return
+      }
+
+      inter.setting.uuid = inter.uuid
+
+      let _customScript = ''
+      let _tailScript = ''
+      inter.scripts.forEach(script => {
+        if (script.status === 'false') return
+        if (script.position !== 'back') {
+          _customScript += `
+          ${script.sql}
+          `
+        } else {
+          _tailScript += `
+          ${script.sql}
+          `
+        }
+      })
+      delete inter.scripts
+
+      inter.setting.execute = inter.setting.execute !== 'false'
+      inter.setting.laypage = false
+      inter.setting.$top = true
+
+      if (!inter.setting.execute) {
+        inter.setting.dataresource = ''
+      }
+      if (/\s/.test(inter.setting.dataresource)) {
+        inter.setting.dataresource = '(' + inter.setting.dataresource + ') tb'
+      }
+  
+      if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
+        inter.setting.dataresource = inter.setting.dataresource.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
+        _customScript = _customScript.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
+        _tailScript = _tailScript.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
+      } else {
+        inter.setting.dataresource = inter.setting.dataresource.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
+        _customScript = _customScript.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
+        _tailScript = _tailScript.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
+      }
+
+      regs.forEach(cell => {
+        inter.setting.dataresource = inter.setting.dataresource.replace(cell.reg, cell.value)
+        _customScript = _customScript.replace(cell.reg, cell.value)
+        _tailScript = _tailScript.replace(cell.reg, cell.value)
+      })
+
+      inter.setting.customScript = _customScript // 鏁寸悊鍚庤嚜瀹氫箟鑴氭湰
+      inter.setting.tailScript = _tailScript     // 鍚庣疆鑷畾涔夎剼鏈�
+
+      let param = UtilsDM.getQueryDataParams(inter.setting, [], inter.setting.order || '', 1, 1000, BID)
+            
+      param.componentId = inter.uuid
+
+      if (inter.setting.loadlevel === 'init') {
+        initInters.push(param)
+      } else {
+        param.public = true
+        params.push(param)
+      }
+    })
   }
 
   reload = () => {
@@ -533,11 +820,6 @@
       setTimeout(() => {
         this.getMenuParam()
       }, 50)
-      // Api.getAppVersion(tempId).then(() => {
-      //   this.getMenuParam()
-      // }, () => {
-      //   this.getMenuParam()
-      // })
     })
   }
 
@@ -547,26 +829,20 @@
   getDefaultParam = (component) => {
     const { columns, setting, dataName, format } = component
     
-    let arr_field = columns.map(col => col.field)
     let _dataresource = setting.dataresource
     let _customScript = setting.customScript
 
     if (setting.order && _dataresource) {
-      _dataresource = `select top 1000 ${arr_field.join(',')} from (select ${arr_field.join(',')} ,ROW_NUMBER() over(order by ${setting.order}) as rows from ${_dataresource}) tmptable order by tmptable.rows `
+      _dataresource = `select top 1000 ${setting.arr_field} from (select ${setting.arr_field} ,ROW_NUMBER() over(order by ${setting.order}) as rows from ${_dataresource}) tmptable order by tmptable.rows `
     } else if (_dataresource) {
-      _dataresource = `select top 1000 ${arr_field.join(',')} from ${_dataresource} `
-    }
-
-    // 娴嬭瘯绯荤粺鎵撳嵃鏌ヨ璇彞
-    if (window.GLOB.debugger === true || (window.debugger === true && options.sysType !== 'cloud')) {
-      _customScript &&  console.info(`${_dataresource ? '' : '/*涓嶆墽琛岄粯璁ql*/\n'}${_customScript}`)
-      _dataresource &&  console.info(_dataresource)
+      _dataresource = `select top 1000 ${setting.arr_field} from ${_dataresource} `
     }
 
     return {
       name: dataName,
       columns: columns,
       par_tablename: '',
+      order: setting.order || '',
       type: format === 'array' ? format : '',
       primaryKey: setting.primaryKey || '',
       foreign_key: '',
@@ -575,7 +851,7 @@
     }
   }
 
-  getFormatParam = (params) => {
+  getFormatParam = (params, MenuName) => {
     const { BID } = this.state
 
     if (!params || params.length === 0) return ''
@@ -592,11 +868,19 @@
     let city = sessionStorage.getItem('city') || ''
     let district = sessionStorage.getItem('district') || ''
     let address = sessionStorage.getItem('address') || ''
-  
-    if (sessionStorage.getItem('isEditState') === 'true') {
-      userName = sessionStorage.getItem('CloudUserName') || ''
-      fullName = sessionStorage.getItem('CloudFullName') || ''
-    }
+
+    let regoptions = [
+      { reg: /@pageSize@/ig, value: 9999 },
+      { reg: /@pageIndex@/ig, value: 1},
+      { reg: /@ID@/ig, value: `''`},
+      { reg: /@BID@/ig, value: `'${BID || ''}'`},
+      { reg: /@LoginUID@/ig, value: `'${sessionStorage.getItem('LoginUID') || ''}'`},
+      { reg: /@SessionUid@/ig, value: `'${localStorage.getItem('SessionUid') || ''}'`},
+      { reg: /@UserID@/ig, value: `'${sessionStorage.getItem('UserID') || ''}'`},
+      { reg: /@Appkey@/ig, value: `'${window.GLOB.appkey || ''}'`},
+      { reg: /@lang@/ig, value: `'${sessionStorage.getItem('lang')}'`},
+      { reg: /@typename@/ig, value: `'admin'`},
+    ]
 
     let LText = params.map((item, index) => {
       let _sql = item.sql
@@ -609,6 +893,20 @@
         `
       }
 
+      _sql = _sql.replace(/@orderBy@/ig, item.order)
+      _script = _script.replace(/@orderBy@/ig, item.order)
+      
+      regoptions.forEach(cell => {
+        _sql = _sql.replace(cell.reg, cell.value)
+        _script = _script.replace(cell.reg, cell.value)
+      })
+
+      // 娴嬭瘯绯荤粺鎵撳嵃鏌ヨ璇彞
+      if (window.GLOB.debugger === true) {
+        _script && window.mkInfo(`${_sql ? '' : '/*涓嶆墽琛岄粯璁ql*/\n'}${_script}`)
+        _sql && window.mkInfo(_sql)
+      }
+
       item.columns.forEach(cell => {
         LText_field.push(`Select '${item.name}' as tablename,'${cell.field}' as fieldname,'${cell.datatype}' as field_type`)
       })
@@ -617,17 +915,59 @@
 
     let param = {
       func: 'sPC_Get_structured_data',
-      LText: LText.join(' union all '),
-      LText_field: LText_field.join(' union all '),
-      BID: BID || ''
+      BID: BID || '',
+      username: userName,
+      fullName: fullName
     }
 
-    param.LText = Utils.formatOptions(param.LText)
-    param.LText_field = Utils.formatOptions(param.LText_field)
+    if (MenuName) {
+      param.menuname = MenuName
+    }
+
+    param.exec_type = window.GLOB.execType || 'y'
+    param.LText = Utils.formatOptions(LText.join(' union all '), param.exec_type)
+    param.custom_script = Utils.formatOptions(LText_field.join(' union all '), param.exec_type)
+
     param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-    param.secretkey = Utils.encrypt(param.LText, param.timestamp)
+    param.secretkey = Utils.encrypt('', param.timestamp)
 
     return param
+  }
+
+  loadinit = (initInters, params) => {
+    let deffers = initInters.map(item => {
+      let componentId = item.componentId
+      delete item.componentId
+      return new Promise(resolve => {
+        Api.genericInterface(item).then(res => {
+          if (!res.status) {
+            if (res.ErrCode !== '-2') {
+              notification.warning({
+                top: 92,
+                message: res.message,
+                duration: 5
+              })
+            }
+            resolve()
+          } else {
+            let _data = { $$empty: true }
+            if (res.data && res.data[0]) {
+              _data = res.data[0]
+            }
+            window.GLOB.CacheData.set(componentId, _data)
+          }
+          resolve()
+        })
+      })
+    })
+
+    Promise.all(deffers).then(() => {
+      if (params.length === 0) {
+        this.setState({loadingview: false, pages: [this.state.config.components]})
+      } else {
+        this.loadmaindata(params)
+      }
+    })
   }
 
   /**
@@ -639,17 +979,32 @@
     let deffers = params.map(item => {
       let componentId = item.componentId
       delete item.componentId
+      delete item.public
       return new Promise(resolve => {
         Api.genericInterface(item).then(res => {
           if (!res.status) {
-            notification.warning({
-              top: 92,
-              message: res.message,
-              duration: 5
-            })
+            if (item.func === 'sPC_Get_structured_data' && /灏嗘埅鏂瓧绗︿覆鎴栦簩杩涘埗鏁版嵁/ig.test(res.message)) {
+              res.message = res.message + '璇锋鏌ュ瓧娈甸泦'
+            }
+            if (res.ErrCode === 'version_up') {
+              this.reloadTabs()
+            } else if (res.ErrCode !== '-2') {
+              notification.warning({
+                top: 92,
+                message: res.message,
+                duration: 5
+              })
+            }
             resolve(false)
           } else {
             res.componentId = componentId
+
+            let _data = { $$empty: true }
+            if (res.data && res.data[0]) {
+              _data = res.data[0]
+            }
+            window.GLOB.CacheData.set(componentId, _data)
+
             resolve(res)
           }
         })
@@ -660,17 +1015,30 @@
       let _results = results.filter(Boolean)
 
       let comps = components.map(item => {
+        item.wrap = item.wrap || {}
+        item.data = null
+
         if (!item.format) return item
 
+        if ((item.subtype === 'datacard' && item.wrap.layout !== 'flex') || item.type === 'table') {
+          item.$page = true
+        }
+
         _results.forEach(res => {
-          if (res.componentId === item.uuid && res.data) {
-            item.data = res.data
+          if ((res.componentId === item.uuid || res.componentId === item.componentId) && res.data) {
             item.dataArray = fromJS(res.data).toJS()
-          } else if (res.componentId === 'union' && res[item.dataName]) {
-            item.data = res[item.dataName]
-            item.dataArray = fromJS(res[item.dataName]).toJS()
+          } else if (res[item.dataName]) {
+            let data = res[item.dataName]
+            if (!Array.isArray(data)) {
+              data = [data]
+            }
+            item.dataArray = fromJS(data).toJS()
           }
         })
+
+        if (item.$page && !item.dataArray) {
+          item.$page = false
+        }
 
         return item
       })
@@ -684,94 +1052,142 @@
         this.setState({loadingview: false, pages})
       }
 
-      while (!over) {
-        let page = []
-        let count = 0
-        let _pageover = false
-        let pagesover = false
-
-        comps.forEach((_item, index) => {
-          let item = fromJS(_item).toJS()
-
-          if (index + 1 >= length && !_pageover) {
-            pagesover = true
-          }
-
-          if (item.wrap && item.wrap.printType === 'headerOrfooter') { // 椤电湁椤佃剼
-            page.push(item)
-          } else if (_pageover) {
-            return
-          } else if (item.subtype === 'datacard' || item.type === 'table') {
-            if (_item.dataArray && _item.dataArray.length > 0) {
-              if (item.subtype === 'datacard' && item.wrap.layout === 'flex') {
-                if (!item.added && item.wrap.printHeight) {
-                  count += item.wrap.printHeight
-                  if (count >= limit) {
-                    _pageover = true
-                  }
-                  if (count <= limit) {
-                    _item.added = true
-                    page.push(item)
-                  }
-                } else if (!item.added) {
-                  _item.added = true
-                  page.push(item)
-                }
-              } else {
-                item.data = []
-  
-                while (count + 1 <= limit && _item.dataArray.length > 0) {
-                  item.data.push(_item.dataArray.shift())
-                  count++
-                }
-    
-                if (count >= limit) {
-                  _pageover = true
-                } else if (_item.dataArray.length > 0) {
-                  _pageover = true
-
-                }
-
-                page.push(item)
-              }
-              _item.added = true
-            } else if (!item.added) {
-              _item.added = true
-              page.push(item)
-            }
-          } else if (!item.added && item.wrap && item.wrap.printHeight) {
-            if (item.wrap.empty === 'hidden' && (!item.data || item.data.length === 0)) {
-              _item.added = true
-              return
-            }
-
-            count += item.wrap.printHeight
-            if (count >= limit) {
-              _pageover = true
-            }
-            if (count <= limit) {
-              _item.added = true
-              page.push(item)
-            }
-          } else if (!item.added) {
-            _item.added = true
-            page.push(item)
-          }
-          
-          if (index + 1 >= length && !_pageover) {
-            pagesover = true
-          }
-        })
-
-        pages.push(page)
-        pageIndex++
-
-        if (pageIndex >= 2000 || pagesover) {
-          over = true
+      let setData = (item) => {
+        if (item.setting && item.setting.sync === 'true' && item.data) {
+          item.dataName = Utils.getuuid()
+          window.GLOB.SyncData.set(item.dataName, item.data)
         }
       }
 
-      this.setState({loadingview: false, pages})
+      if (this.state.config.printPage === 'custom' && this.state.config.printScripts) {
+        try {
+          // eslint-disable-next-line
+          let func = new Function('components', 'pages', 'notification', this.state.config.printScripts)
+          func(comps, pages, notification)
+        } catch (e) {
+          console.warn(e)
+    
+          notification.warning({
+            top: 92,
+            message: '鑷畾涔夎剼鏈墽琛岄敊璇紒',
+            duration: 5
+          })
+        }
+      } else {
+        while (!over) {
+          let page = []
+          let count = 0
+          let _pageover = false
+  
+          comps.forEach(comp => {
+            let item = fromJS(comp).toJS()
+  
+            if (item.wrap.printType === 'headerOrfooter') { // 椤电湁椤佃剼
+              item.data = item.dataArray || null
+              setData(item)
+              page.push(item)
+              comp.added = true
+            }
+  
+            if (_pageover) return
+  
+            if (item.$page && comp.dataArray.length > 0) {
+              item.data = []
+  
+              while (count + 1 <= limit && comp.dataArray.length > 0) {
+                item.data.push(comp.dataArray.shift())
+                count++
+              }
+  
+              if (count >= limit || comp.dataArray.length > 0) {
+                _pageover = true
+              }
+  
+              if (comp.dataArray.length === 0) {
+                comp.added = true
+              }
+  
+              setData(item)
+              page.push(item)
+            } else if (!comp.added) {
+              if (item.wrap.printHeight) {
+                count += item.wrap.printHeight
+                if (count >= limit) {
+                  _pageover = true
+                  return
+                }
+              }
+  
+              item.data = item.dataArray || null
+  
+              setData(item)
+              page.push(item)
+              comp.added = true
+            }
+          })
+  
+          pages.push(page)
+          pageIndex++
+  
+          if (pageIndex >= 2000 || comps.findIndex(comp => !comp.added) === -1) {
+            over = true
+          }
+        }
+      }
+
+      let total = pages.length
+      let date = moment().format('YYYY-MM-DD')
+      let datetime = moment().format('YYYY-MM-DD HH:mm:ss')
+      let rePos = false
+
+      pages.forEach((page, index) => {
+        page.forEach(item => {
+          if (item.wrap.printType === 'headerOrfooter') { // 椤电湁椤佃剼
+            if (item.type === 'balcony') {
+              if (item.style.position === 'absolute') {
+                rePos = true
+              }
+              item.elements.forEach(cell => {
+                if (cell.eleType === 'text' && cell.datatype === 'static') {
+                  cell.value = cell.value.replace(/@total@/ig, total).replace(/@pageIndex@/ig, index + 1).replace(/@date@/ig, date).replace(/@datetime@/ig, datetime)
+                }
+              })
+            } else if (item.subtype === 'propcard') {
+              item.subcards.forEach(card => {
+                card.elements.forEach(cell => {
+                  if (cell.eleType === 'text' && cell.datatype === 'static') {
+                    cell.value = cell.value.replace(/@total@/ig, total).replace(/@pageIndex@/ig, index + 1).replace(/@date@/ig, date).replace(/@datetime@/ig, datetime)
+                  }
+                })
+              })
+            }
+          }
+        })
+      })
+
+      this.setState({loadingview: false, pages, rePos})
+    })
+  }
+
+  reloadTabs = () => {
+    if (this.reloading) return
+
+    let time = new Date().getTime()
+
+    let oldTime = sessionStorage.getItem('mk_reloadTabs')
+    
+    if (oldTime && time - oldTime < 180000) return
+
+    sessionStorage.setItem('mk_reloadTabs', time)
+
+    this.reloading = true
+
+    Api.getAppVersion(true).then(() => {
+      window.location.reload()
+    }, (message) => {
+      Modal.error({
+        title: message || '绯荤粺閰嶇疆鏇存柊澶辫触锛�',
+      })
     })
   }
 
@@ -790,9 +1206,54 @@
   }
 
   print = () => {
-    const { config, printing } = this.state
+    const { config, printing, BID, tempId, pageId } = this.state
     
     if (printing) return
+
+    this.setState({printing: true})
+    
+    if (config.callback === 'true') {
+      this.setState({loading: true})
+
+      Api.genericInterface({
+        func: 's_print_proc',
+        username: sessionStorage.getItem('User_Name') || '',
+        fullname: sessionStorage.getItem('Full_Name') || '',
+        BID: BID || '',
+        print_type: config.callNo || '',
+        MenuNo: config.MenuNo || '',
+        Menuid: tempId || ''
+      }).then(res => {
+        if (!res.status) {
+          notification.warning({
+            top: 92,
+            message: res.message || '鎵ц澶辫触锛�',
+            duration: 5
+          })
+
+          this.setState({printing: false, loading: false})
+          return
+        }
+
+        let refresh = !/@no_target_menu@/i.test(res.message)
+
+        this.setState({loading: false})
+
+        if (pageId && refresh) {
+          localStorage.setItem('menuUpdate', new Date().getTime() + ',' + pageId + ',menu')
+        }
+
+        setTimeout(() => {
+          this.execPrint()
+        }, 300)
+      })
+    } else {
+      this.execPrint()
+    }
+  }
+
+  execPrint = () => {
+    const { config } = this.state
 
     let qrcodes = document.getElementsByClassName('qrcode-box')
 
@@ -823,8 +1284,6 @@
     }
 
     let jubuData = document.getElementById('bill-print').innerHTML
-
-    this.setState({printing: true})
     
     try {
       let iframe = document.createElement('IFRAME')
@@ -876,90 +1335,98 @@
 
       if (item.style && item.style.clear === 'left') {
         style = {clear: 'left'}
+      } else if (item.style && item.style.clear === 'right') {
+        style = {float: 'right'}
       }
 
       if (item.type === 'bar' || item.type === 'line') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <AntvBarAndLine config={item} initdata={item.data} mainSearch={[]} />
+            <AntvBarAndLine config={item}/>
           </Col>
         )
       } else if (item.type === 'pie') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <AntvPie config={item} initdata={item.data} mainSearch={[]} />
+            <AntvPie config={item} />
           </Col>
         )
       } else if (item.type === 'scatter') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <AntvScatter config={item} initdata={item.data} mainSearch={[]}/>
+            <AntvScatter config={item}/>
           </Col>
         )
       } else if (item.type === 'dashboard') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <AntvDashboard config={item} initdata={item.data} mainSearch={[]}/>
+            <AntvDashboard config={item}/>
           </Col>
         )
       } else if (item.type === 'card' && item.subtype === 'datacard') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <DataCard config={item} initdata={item.data} mainSearch={[]} />
+            <DataCard config={item} />
           </Col>
         )
       } else if (item.type === 'card' && item.subtype === 'propcard') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <PropCard config={item} initdata={item.data} mainSearch={[]} />
+            <PropCard config={item} />
           </Col>
         )
       } else if (item.type === 'card' && item.subtype === 'dualdatacard') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <DoubleDataCard config={item} mainSearch={[]}/>
+            <DoubleDataCard config={item}/>
           </Col>
         )
       } else if (item.type === 'card' && item.subtype === 'tablecard') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <TableCard config={item} initdata={item.data} mainSearch={[]}/>
+            <TableCard config={item}/>
           </Col>
         )
       } else if (item.type === 'table' && item.subtype === 'normaltable') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <NormalTable config={item} initdata={item.data} mainSearch={[]}/>
+            <NormalTable config={item}/>
           </Col>
         )
       } else if (item.type === 'code') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <SandBox config={item} initdata={item.data} mainSearch={[]}/>
+            <SandBox config={item}/>
           </Col>
         )
       } else if (item.type === 'balcony') {
-        return (
-          <Col span={item.width} style={style} key={item.uuid}>
-            <Balcony config={item} initdata={item.data}/>
-          </Col>
-        )
+        if (item.wrap.printType === 'headerOrfooter' && item.style.position === 'absolute') {
+          return (
+            <Balcony key={item.uuid} config={item}/>
+          )
+        } else {
+          return (
+            <Col span={item.width} style={style} key={item.uuid}>
+              <Balcony config={item}/>
+            </Col>
+          )
+        }
       } else if (item.type === 'timeline') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <TimeLine config={item} initdata={item.data} mainSearch={[]}/>
+            <TimeLine config={item}/>
           </Col>
         )
       } else if (item.type === 'editor') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <BraftEditor config={item} initdata={item.data} mainSearch={[]}/>
+            <BraftEditor config={item}/>
           </Col>
         )
       } else if (item.type === 'antvG6') {
         return (
           <Col span={item.width} style={style} key={item.uuid}>
-            <AntvG6 config={item} initdata={item.data} mainSearch={[]}/>
+            <AntvG6 config={item}/>
           </Col>
         )
       } else if (item.type === 'antvX6') {
@@ -975,18 +1442,18 @@
   }
 
   render() {
-    const { loadingview, viewlost, config, pages, auto } = this.state
+    const { loadingview, viewlost, config, pages, auto, rePos, loading, ismob } = this.state
 
     return (
       <div className="bill-print-wrap" >
-        {loadingview && <Spin size="large" />}
+        {loadingview || loading ? <Spin size="large" /> : null}
         {pages ? <div id="bill-print">
-          {pages.map((components, index) => (<div className={'print-page' + (auto ? ' auto' : '')} key={index} style={{...config.style, overflow: 'hidden', boxSizing: 'border-box'}}><Row className="component-wrap">{this.getComponents(components)}</Row></div>))}
+          {pages.map((components, index) => (<div className={'print-page' + (auto ? ' auto' : '') + (rePos ? ' reset-position' : '')} key={index} style={{...config.style, overflow: 'hidden', boxSizing: 'border-box'}}><Row className="component-wrap">{this.getComponents(components)}</Row></div>))}
         </div> : null}
         {viewlost ? <NotFount msg={this.state.lostmsg} /> : null}
         {config && window.GLOB.breakpoint ? <DebugTable /> : null}
-        {pages && !loadingview && !viewlost ? <div className="print-button"><Button icon="printer" size="large" shape="circle" onClick={this.print}></Button></div> : null}
-        {!loadingview && !viewlost ? <div className="refresh-button"><Button icon="reload" size="large" shape="circle" onClick={this.reload}></Button></div> : null}
+        {pages && !loadingview && !viewlost && !ismob ? <div className="print-button"><Button icon="printer" size="large" shape="circle" onClick={this.print}></Button></div> : null}
+        {!loadingview && !viewlost && !ismob ? <div className="refresh-button"><Button icon="reload" size="large" shape="circle" onClick={this.reload}></Button></div> : null}
       </div>
     )
   }

--
Gitblit v1.8.0