king
2024-10-02 65da4dae29c621df1764cb5523c64e92be8b180a
2024-10-02
8个文件已修改
576 ■■■■■ 已修改文件
public/manifest.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/editor/braft-editor/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/verifycard/excelout/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/verifycard/index.jsx 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/verifycard/index.scss 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/billprint/index.jsx 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/menudesign/index.scss 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/menudesign/printmenuform/index.jsx 401 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/manifest.json
@@ -6,5 +6,5 @@
  "display": "standalone",
  "theme_color": "#000000",
  "background_color": "#ffffff",
  "mk_version": "20240910"
  "mk_version": "20241002"
}
src/menu/components/editor/braft-editor/index.jsx
@@ -109,8 +109,9 @@
    card.name = card.wrap.name
    card.errors = []
    card.$tables = []
    if (card.wrap.datatype !== 'static') {
    if (card.wrap.datatype === 'dynamic') {
      card.$c_ds = true
      card.errors = checkComponent(card)
src/menu/datasource/verifycard/excelout/index.jsx
@@ -69,7 +69,7 @@
  }
  render() {
    return (<DownloadOutlined className="columns-out" onClick={this.actionTrigger}/>)
    return (<DownloadOutlined className="columns-out" title="下载" onClick={this.actionTrigger}/>)
  }
}
src/menu/datasource/verifycard/index.jsx
@@ -1186,6 +1186,33 @@
    })
  }
  tolowercase = (type) => {
    const that = this
    confirm({
      content: type === 'sub' ? '确定将子表字段转为小写吗?' : '确定将字段转为小写吗?',
      onOk() {
        that.execlowercase(type)
      },
      onCancel() {}
    })
  }
  execlowercase = (type) => {
    const { subColumns, columns } = this.state
    if (type === 'sub') {
      this.setState({subColumns: fromJS(subColumns).toJS().map(col => {
        col.field = col.field.toLowerCase()
        return col
      })})
    } else {
      this.setState({columns: fromJS(columns).toJS().map(col => {
        col.field = col.field.toLowerCase()
        return col
      })})
    }
  }
  /**
   * @description 组件销毁,清除state更新
   */
@@ -1233,6 +1260,7 @@
              type="fields"
              updatefield={this.updatefields}
            />
            <SwapOutlined className="columns-lowercase" title="转小写" onClick={() => this.tolowercase()}/>
            <ExcelOut data={columns} setting={setting}/>
            <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} searchKey={searchKey} type="datasourcefield" wrappedComponentRef={(inst) => this.datasource = inst} data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/>
          </TabPane> : <TabPane tab={
@@ -1257,6 +1285,7 @@
              type="fields"
              updatefield={this.updateSubfields}
            />
            <SwapOutlined className="columns-lowercase" title="转小写" onClick={() => this.tolowercase('sub')}/>
            <ExcelOut data={subColumns} setting={setting}/>
            <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} searchKey={searchKey} type="datasourcefield" wrappedComponentRef={(inst) => this.subdatasource = inst} data={subColumns} columns={colColumns} onChange={(subColumns) => this.setState({subColumns})}/>
          </TabPane> : null}
src/menu/datasource/verifycard/index.scss
@@ -146,6 +146,16 @@
      margin-right: 5px;
      cursor: pointer;
    }
    .columns-lowercase {
      float: right;
      position: relative;
      z-index: 2;
      right: 30px;
      height: 0px;
      top: -15px;
      color: orange;
      cursor: pointer;
    }
    .columns-out {
      float: right;
      position: relative;
@@ -159,7 +169,7 @@
      .ant-table-thead {
        .copy-control {
          top: -18px;
          right: 30px;
          right: 55px;
          .anticon-copy {
            margin-right: 12px;
          }
src/views/billprint/index.jsx
@@ -1043,63 +1043,79 @@
        }
      }
      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) {
      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
            }
            setData(item)
            page.push(item)
          } else if (!comp.added) {
            if (item.wrap.printHeight) {
              count += item.wrap.printHeight
              if (count >= limit) {
                _pageover = true
                return
            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
            }
            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
          }
        })
        pages.push(page)
        pageIndex++
        if (pageIndex >= 2000 || comps.findIndex(comp => !comp.added) === -1) {
          over = true
        }
      }
src/views/menudesign/index.scss
@@ -17,6 +17,13 @@
    top: calc(50vh - 70px);
    z-index: 10;
  }
  .mini-radio {
    white-space: nowrap;
    span.ant-radio + * {
      padding-right: 0px;
      padding-left: 4px;
    }
  }
  .mk-hidden {
    text-decoration: line-through!important;
    span {
src/views/menudesign/printmenuform/index.jsx
@@ -1,14 +1,20 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Row, Col, InputNumber, Select, Radio, Tooltip, Input } from 'antd'
import { Form, Row, Col, InputNumber, Select, Radio, Tooltip, Input, Modal } from 'antd'
import { QuestionCircleOutlined, EditOutlined } from '@ant-design/icons'
import CodeMirror from '@/templates/zshare/codemirror'
// import './index.scss'
class MainSearch extends Component {
  static propTpyes = {
    config: PropTypes.object,
    updateConfig: PropTypes.func
  }
  state = {
    visible: false,
    printScripts: ''
  }
  selectChange = (key, value) => {
@@ -76,9 +82,22 @@
    })
  }
  onScriptChange = (val) => {
    this.setState({printScripts: val})
  }
  submit = () => {
    const { config } = this.props
    const { printScripts } = this.state
    this.setState({visible: false})
    this.props.updateConfig({...config, printScripts})
  }
  render() {
    const { config } = this.props
    const { getFieldDecorator } = this.props.form
    const { visible, printScripts } = this.state
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
@@ -91,186 +110,206 @@
    }
    return (
      <Form {...formItemLayout}>
        <Row>
          <Col span={24}>
            <Form.Item label="菜单名称">
              <span style={{display: 'inline-block', wordBreak: 'break-all', lineHeight: 1.5}}>
                {config.MenuName}
              </span>
            </Form.Item>
          </Col>
          <Col span={24}>
            <Form.Item label="菜单参数">
              <span style={{display: 'inline-block', wordBreak: 'break-all', lineHeight: 1.5}}>
                {config.MenuNo}
              </span>
            </Form.Item>
          </Col>
          <Col span={24}>
            <Form.Item label="打印尺寸">
              {getFieldDecorator('pageSize', {
                initialValue: config.pageSize || 'A4',
                rules: [
                  {
                    required: true,
                    message: '请选择打印尺寸!'
                  }
                ]
              })(
                <Select onChange={(val) => this.selectChange('pageSize', val)}>
                  <Select.Option value="A3">A3</Select.Option>
                  <Select.Option value="A4">A4</Select.Option>
                  <Select.Option value="A5">A5</Select.Option>
                </Select>
              )}
            </Form.Item>
          </Col>
          <Col span={24}>
            <Form.Item label="打印布局">
              {getFieldDecorator('pageLayout', {
                initialValue: config.pageLayout || 'vertical',
                rules: [
                  {
                    required: true,
                    message: '请选择打印布局!'
                  }
                ]
              })(
                <Radio.Group onChange={(e) => this.selectChange('pageLayout', e.target.value)}>
                  <Radio value="vertical">纵向</Radio>
                  <Radio value="horizontal">横向</Radio>
                </Radio.Group>
              )}
            </Form.Item>
          </Col>
          <Col span={24}>
            <Form.Item label="打印边距">
              {getFieldDecorator('pagePadding', {
                initialValue: config.pagePadding || 'default',
                rules: [
                  {
                    required: true,
                    message: '请选择打印边距!'
                  }
                ]
              })(
                <Radio.Group onChange={(e) => this.selectChange('pagePadding', e.target.value)}>
                  <Radio value="default">默认</Radio>
                  <Radio value="without">无</Radio>
                </Radio.Group>
              )}
            </Form.Item>
          </Col>
          <Col span={24}>
            <Form.Item label="页面布局">
              {getFieldDecorator('printPage', {
                initialValue: config.printPage || 'auto'
              })(
                <Radio.Group onChange={(e) => this.selectChange('printPage', e.target.value)}>
                  <Radio value="auto">自适应</Radio>
                  <Radio value="page">分页</Radio>
                </Radio.Group>
              )}
            </Form.Item>
          </Col>
          {config.printPage === 'page' ? <Col span={24}>
            <Form.Item label="每页数(条)">
              {getFieldDecorator('everyPCount', {
                initialValue: config.everyPCount || 15,
                rules: [
                  {
                    required: true,
                    message: '请输入每页数!'
                  }
                ]
              })(<InputNumber min={1} max={1000} precision={1} onChange={(val) => this.selectChange('everyPCount', val)}/>)}
            </Form.Item>
          </Col> : null}
          <Col span={24}>
            <Form.Item label={
              <Tooltip placement="topLeft" title="针对不规则纸张,可自定义设置打印高度和宽度,注:同时设置打印宽度和高度后方可生效。">
                <QuestionCircleOutlined className="mk-form-tip" />
                自定义
              </Tooltip>
            }>
              {getFieldDecorator('printCustom', {
                initialValue: config.printCustom || 'false'
              })(
                <Radio.Group onChange={(e) => this.selectChange('printCustom', e.target.value)}>
                  <Radio value="false">不启用</Radio>
                  <Radio value="true">启用</Radio>
                </Radio.Group>
              )}
            </Form.Item>
          </Col>
          {config.printCustom === 'true' ? <Col span={24}>
            <Form.Item label="打印宽度">
              {getFieldDecorator('printWidth', {
                initialValue: config.printWidth || ''
              })(<InputNumber min={10} max={9999} precision={0} onChange={(val) => this.selectChange('printWidth', val)}/>)}
            </Form.Item>
          </Col> : null}
          {config.printCustom === 'true' ? <Col span={24}>
            <Form.Item label="打印高度">
              {getFieldDecorator('printHeight', {
                initialValue: config.printHeight || ''
              })(<InputNumber min={10} max={9999} precision={0} onChange={(val) => this.selectChange('printHeight', val)}/>)}
            </Form.Item>
          </Col> : null}
          <Col span={24}>
            <Form.Item label="回调">
              {getFieldDecorator('callback', {
                initialValue: config.callback || 'false'
              })(
                <Radio.Group onChange={(e) => this.selectChange('callback', e.target.value)}>
                  <Radio value="false">不启用</Radio>
                  <Radio value="true">启用</Radio>
                </Radio.Group>
              )}
            </Form.Item>
          </Col>
          {config.callback === 'true' ? <Col span={24}>
            <Form.Item label={
              <Tooltip placement="topLeft" title="回调函数执行成功后默认会刷新源菜单页,返回信息(@retmsg)中含有(@no_target_menu@)可阻止此项刷新。">
                <QuestionCircleOutlined className="mk-form-tip" />
                回调函数
              </Tooltip>
            }>
              s_print_proc <EditOutlined style={{cursor: 'pointer'}} onClick={() => {window.open('#/proc/s_print_proc')}}/>
            </Form.Item>
          </Col> : null}
          {config.callback === 'true' ? <Col span={24}>
            <Form.Item label="回调参数">
              {getFieldDecorator('callNo', {
                initialValue: config.callNo || '',
                rules: [
                  {
                    required: true,
                    message: '请填写回调参数!'
                  },
                  {
                    pattern: /^[a-zA-Z0-9_]+$/,
                    message: '回调参数只可使用字母、数字以及_'
                  }
                ]
              })(<Input onChange={(e) => this.selectChange('callNo', e.target.value)}/>)}
            </Form.Item>
          </Col> : null}
          <Col span={24}>
            <Form.Item label={
              <Tooltip placement="topLeft" title="可自定义在浏览器标题栏中显示的网页标题。">
                <QuestionCircleOutlined className="mk-form-tip" />
                网页标题
              </Tooltip>
            }>
              {getFieldDecorator('webTitle', {
                initialValue: config.webTitle || ''
              })(<Input onChange={(e) => this.selectChange('webTitle', e.target.value)}/>)}
            </Form.Item>
          </Col>
        </Row>
      </Form>
      <>
        <Form {...formItemLayout}>
          <Row>
            <Col span={24}>
              <Form.Item label="菜单名称">
                <span style={{display: 'inline-block', wordBreak: 'break-all', lineHeight: 1.5}}>
                  {config.MenuName}
                </span>
              </Form.Item>
            </Col>
            <Col span={24}>
              <Form.Item label="菜单参数">
                <span style={{display: 'inline-block', wordBreak: 'break-all', lineHeight: 1.5}}>
                  {config.MenuNo}
                </span>
              </Form.Item>
            </Col>
            <Col span={24}>
              <Form.Item label="打印尺寸">
                {getFieldDecorator('pageSize', {
                  initialValue: config.pageSize || 'A4',
                  rules: [
                    {
                      required: true,
                      message: '请选择打印尺寸!'
                    }
                  ]
                })(
                  <Select onChange={(val) => this.selectChange('pageSize', val)}>
                    <Select.Option value="A3">A3</Select.Option>
                    <Select.Option value="A4">A4</Select.Option>
                    <Select.Option value="A5">A5</Select.Option>
                  </Select>
                )}
              </Form.Item>
            </Col>
            <Col span={24}>
              <Form.Item label="打印布局">
                {getFieldDecorator('pageLayout', {
                  initialValue: config.pageLayout || 'vertical',
                  rules: [
                    {
                      required: true,
                      message: '请选择打印布局!'
                    }
                  ]
                })(
                  <Radio.Group onChange={(e) => this.selectChange('pageLayout', e.target.value)}>
                    <Radio value="vertical">纵向</Radio>
                    <Radio value="horizontal">横向</Radio>
                  </Radio.Group>
                )}
              </Form.Item>
            </Col>
            <Col span={24}>
              <Form.Item label="打印边距">
                {getFieldDecorator('pagePadding', {
                  initialValue: config.pagePadding || 'default',
                  rules: [
                    {
                      required: true,
                      message: '请选择打印边距!'
                    }
                  ]
                })(
                  <Radio.Group onChange={(e) => this.selectChange('pagePadding', e.target.value)}>
                    <Radio value="default">默认</Radio>
                    <Radio value="without">无</Radio>
                  </Radio.Group>
                )}
              </Form.Item>
            </Col>
            <Col span={24}>
              <Form.Item label="页面布局">
                {getFieldDecorator('printPage', {
                  initialValue: config.printPage || 'auto'
                })(
                  <Radio.Group className="mini-radio" onChange={(e) => this.selectChange('printPage', e.target.value)}>
                    <Radio value="auto">自适应</Radio>
                    <Radio value="page">分页</Radio>
                    <Radio value="custom">自定义</Radio>
                  </Radio.Group>
                )}
              </Form.Item>
            </Col>
            {config.printPage === 'custom' ? <Col span={24}>
              <Form.Item label="自定义脚本">
                <EditOutlined style={{color: '#1890ff'}} onClick={() => this.setState({visible: true, printScripts: config.printScripts || ''})} />
              </Form.Item>
            </Col> : null}
            {config.printPage === 'page' ? <Col span={24}>
              <Form.Item label="每页数(条)">
                {getFieldDecorator('everyPCount', {
                  initialValue: config.everyPCount || 15,
                  rules: [
                    {
                      required: true,
                      message: '请输入每页数!'
                    }
                  ]
                })(<InputNumber min={1} max={1000} precision={1} onChange={(val) => this.selectChange('everyPCount', val)}/>)}
              </Form.Item>
            </Col> : null}
            <Col span={24}>
              <Form.Item label={
                <Tooltip placement="topLeft" title="针对不规则纸张,可自定义设置打印高度和宽度,注:同时设置打印宽度和高度后方可生效。">
                  <QuestionCircleOutlined className="mk-form-tip" />
                  自定义
                </Tooltip>
              }>
                {getFieldDecorator('printCustom', {
                  initialValue: config.printCustom || 'false'
                })(
                  <Radio.Group onChange={(e) => this.selectChange('printCustom', e.target.value)}>
                    <Radio value="false">不启用</Radio>
                    <Radio value="true">启用</Radio>
                  </Radio.Group>
                )}
              </Form.Item>
            </Col>
            {config.printCustom === 'true' ? <Col span={24}>
              <Form.Item label="打印宽度">
                {getFieldDecorator('printWidth', {
                  initialValue: config.printWidth || ''
                })(<InputNumber min={10} max={9999} precision={0} onChange={(val) => this.selectChange('printWidth', val)}/>)}
              </Form.Item>
            </Col> : null}
            {config.printCustom === 'true' ? <Col span={24}>
              <Form.Item label="打印高度">
                {getFieldDecorator('printHeight', {
                  initialValue: config.printHeight || ''
                })(<InputNumber min={10} max={9999} precision={0} onChange={(val) => this.selectChange('printHeight', val)}/>)}
              </Form.Item>
            </Col> : null}
            <Col span={24}>
              <Form.Item label="回调">
                {getFieldDecorator('callback', {
                  initialValue: config.callback || 'false'
                })(
                  <Radio.Group onChange={(e) => this.selectChange('callback', e.target.value)}>
                    <Radio value="false">不启用</Radio>
                    <Radio value="true">启用</Radio>
                  </Radio.Group>
                )}
              </Form.Item>
            </Col>
            {config.callback === 'true' ? <Col span={24}>
              <Form.Item label={
                <Tooltip placement="topLeft" title="回调函数执行成功后默认会刷新源菜单页,返回信息(@retmsg)中含有(@no_target_menu@)可阻止此项刷新。">
                  <QuestionCircleOutlined className="mk-form-tip" />
                  回调函数
                </Tooltip>
              }>
                s_print_proc <EditOutlined style={{cursor: 'pointer'}} onClick={() => {window.open('#/proc/s_print_proc')}}/>
              </Form.Item>
            </Col> : null}
            {config.callback === 'true' ? <Col span={24}>
              <Form.Item label="回调参数">
                {getFieldDecorator('callNo', {
                  initialValue: config.callNo || '',
                  rules: [
                    {
                      required: true,
                      message: '请填写回调参数!'
                    },
                    {
                      pattern: /^[a-zA-Z0-9_]+$/,
                      message: '回调参数只可使用字母、数字以及_'
                    }
                  ]
                })(<Input onChange={(e) => this.selectChange('callNo', e.target.value)}/>)}
              </Form.Item>
            </Col> : null}
            <Col span={24}>
              <Form.Item label={
                <Tooltip placement="topLeft" title="可自定义在浏览器标题栏中显示的网页标题。">
                  <QuestionCircleOutlined className="mk-form-tip" />
                  网页标题
                </Tooltip>
              }>
                {getFieldDecorator('webTitle', {
                  initialValue: config.webTitle || ''
                })(<Input onChange={(e) => this.selectChange('webTitle', e.target.value)}/>)}
              </Form.Item>
            </Col>
          </Row>
        </Form>
        <Modal
          title="自定义脚本"
          wrapClassName="normal-css-modal"
          visible={visible}
          width={800}
          maskClosable={false}
          onOk={this.submit}
          onCancel={() => { this.setState({ visible: false })}}
          destroyOnClose
        >
          <CodeMirror mode="text/javascript" theme="cobalt" value={printScripts} onChange={this.onScriptChange} />
        </Modal>
      </>
    )
  }
}