king
2023-08-09 613d7ada2c5a89d21fdaa4a92f914c27b06f171b
src/views/billprint/index.jsx
@@ -41,6 +41,7 @@
    config: null,
    urlParam: null,
    visible: false,
    rePos: false,
    auto: true
  }
@@ -691,20 +692,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
            item.dataArray = fromJS(res.data).toJS()
          } else if (res.componentId === 'union' && res[item.dataName]) {
            item.data = res[item.dataName]
            if (!Array.isArray(item.data)) {
              item.data = [item.data]
            let data = res[item.dataName]
            if (!Array.isArray(data)) {
              data = [data]
            }
            item.dataArray = fromJS(item.data).toJS()
            item.dataArray = fromJS(data).toJS()
          }
        })
        if (item.$page && !item.dataArray) {
          item.$page = false
        }
        return item
      })
@@ -729,97 +740,93 @@
        let page = []
        let count = 0
        let _pageover = false
        let pagesover = false
        comps.forEach((_item, index) => {
          let item = fromJS(_item).toJS()
        comps.forEach(comp => {
          let item = fromJS(comp).toJS()
          if (index + 1 >= length && !_pageover) {
            pagesover = true
          }
          if (item.wrap && item.wrap.printType === 'headerOrfooter') { // 页眉页脚
          if (item.wrap.printType === 'headerOrfooter') { // 页眉页脚
            item.data = item.dataArray || null
            setData(item)
            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
                    setData(item)
                    page.push(item)
                  }
                } else if (!item.added) {
                  _item.added = true
                  setData(item)
                  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
            comp.added = true
          }
                }
          if (_pageover) return
                setData(item)
                page.push(item)
              }
              _item.added = true
            } else if (!item.added) {
              _item.added = true
              setData(item)
              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
          if (item.$page && comp.dataArray.length > 0) {
            item.data = []
            while (count + 1 <= limit && comp.dataArray.length > 0) {
              item.data.push(comp.dataArray.shift())
              count++
            }
            count += item.wrap.printHeight
            if (count >= limit) {
            if (count >= limit || comp.dataArray.length > 0) {
              _pageover = true
            }
            if (count <= limit) {
              _item.added = true
              setData(item)
              page.push(item)
            if (comp.dataArray.length === 0) {
              comp.added = true
            }
          } else if (!item.added) {
            _item.added = true
            setData(item)
            page.push(item)
          }
          if (index + 1 >= length && !_pageover) {
            pagesover = true
          } 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 || pagesover) {
        if (pageIndex >= 2000 || comps.findIndex(comp => !comp.added) === -1) {
          over = true
        }
      }
      this.setState({loadingview: false, pages})
      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})
    })
  }
@@ -989,11 +996,17 @@
          </Col>
        )
      } else if (item.type === 'balcony') {
        return (
          <Col span={item.width} style={style} key={item.uuid}>
            <Balcony config={item}/>
          </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}>
@@ -1025,13 +1038,13 @@
  }
  render() {
    const { loadingview, viewlost, config, pages, auto } = this.state
    const { loadingview, viewlost, config, pages, auto, rePos } = this.state
    return (
      <div className="bill-print-wrap" >
        {loadingview && <Spin size="large" />}
        {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}