From ea471bc4b911b8f8ee4177a9eaafe900935451bf Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 09 十二月 2022 15:26:07 +0800
Subject: [PATCH] Merge branch 'master' into positec

---
 src/views/systemproc/proc/index.jsx                                 |   77 +++++
 src/mob/components/topbar/normal-navbar/index.scss                  |    2 
 src/views/design/header/index.scss                                  |   46 --
 src/views/printTemplate/option.js                                   |   18 +
 src/views/design/header/index.jsx                                   |   86 +++--
 src/views/rolemanage/index.jsx                                      |   15 
 src/views/systemfunc/index.jsx                                      |    4 
 src/views/mobdesign/index.jsx                                       |   14 
 src/components/mk-icon/index.jsx                                    |    2 
 src/utils/utils.js                                                  |    2 
 src/components/normalform/modalform/mkSelect/index.jsx              |    2 
 src/views/systemproc/index.scss                                     |    9 
 src/templates/sharecomponent/actioncomponent/verifyprint/index.jsx  |  130 +++++++-
 src/views/pcdesign/index.jsx                                        |    8 
 src/views/printTemplate/mutilform/index.jsx                         |    2 
 src/mob/components/menubar/normal-menubar/menucomponent/options.jsx |    2 
 src/router/index.js                                                 |    2 
 src/menu/components/card/cardcomponent/index.jsx                    |    2 
 src/components/mkIcon/index.jsx                                     |   19 +
 src/tabviews/zshare/actionList/printbutton/index.jsx                |  295 ++++++++++++++++++--
 src/views/systemproc/proc/index.scss                                |   35 ++
 src/menu/components/share/actioncomponent/actionform/index.jsx      |    4 
 src/views/systemproc/index.jsx                                      |   24 +
 src/tabviews/custom/components/card/cardcellList/index.scss         |    3 
 src/views/systemfunc/sidemenu/config.jsx                            |    4 
 src/menu/components/card/cardcomponent/options.jsx                  |    4 
 src/views/login/index.jsx                                           |   15 +
 27 files changed, 658 insertions(+), 168 deletions(-)

diff --git a/src/components/mk-icon/index.jsx b/src/components/mk-icon/index.jsx
index bb8a2ee..939b7ff 100644
--- a/src/components/mk-icon/index.jsx
+++ b/src/components/mk-icon/index.jsx
@@ -471,7 +471,7 @@
         MkIcons[type](resProps)
       )
     } else {
-      return <span className={'anticon ' + (resProps.className || '')} style={resProps.style || null} dangerouslySetInnerHTML={{ __html: type }}></span>
+      return <span className={'anticon anticon-mk ' + (resProps.className || '')} style={resProps.style || null} dangerouslySetInnerHTML={{ __html: type }}></span>
     }
   }
 }
diff --git a/src/components/mkIcon/index.jsx b/src/components/mkIcon/index.jsx
index 0447f06..105f627 100644
--- a/src/components/mkIcon/index.jsx
+++ b/src/components/mkIcon/index.jsx
@@ -89,13 +89,26 @@
     })
   }
 
+  trigger = () => {
+    const { selectIcon, cusicons } = this.state
+
+    this.setState({visible: true})
+
+    if (cusicons.length > 0 && selectIcon && /<svg/.test(selectIcon)) {
+      setTimeout(() => {
+        let node = document.getElementById('mk-custom-tab')
+        node && node.click()
+      }, 200)
+    }
+  }
+
   render() {
     const { selectIcon, visible, icons, allowClear, cusicons } = this.state
 
     return (
       <div className="mk-icon-box">
         {selectIcon ? <MkIcon type={selectIcon}/> : <span style={{color: '#bcbcbc'}}>璇烽�夋嫨</span>}
-        <MkIcon className="trigger" onClick={() => this.setState({visible: true})} type="swap"/>
+        <MkIcon className="trigger" onClick={this.trigger} type="swap"/>
         {allowClear && selectIcon ? <CloseCircleFilled className="close" onClick={() => this.checkIcon('')}/> : null}
         <Modal
           wrapClassName="mk-pop-modal mk-icon-wrap"
@@ -118,13 +131,13 @@
               </Row>
             </TabPane>
             <TabPane tab={
-              <span className="tab-control">
+              <span className="tab-control" id="mk-custom-tab">
                 <RedoOutlined onClick={(e) => {this.getIcons()}}/>
                 鑷畾涔�
               </span>
             } key="scripts">
               <Row>
-                {cusicons.map(icon => <Col key={icon.id} span={4} onClick={() => this.checkIcon(icon.icon_svg)}>
+                {cusicons.map(icon => <Col className={icon.icon_svg === selectIcon ? 'active' : ''} key={icon.id} span={4} onClick={() => this.checkIcon(icon.icon_svg)}>
                   <MkIcon type={icon.icon_svg} />
                 </Col>)}
               </Row>
diff --git a/src/components/normalform/modalform/mkSelect/index.jsx b/src/components/normalform/modalform/mkSelect/index.jsx
index 660fea9..92784fe 100644
--- a/src/components/normalform/modalform/mkSelect/index.jsx
+++ b/src/components/normalform/modalform/mkSelect/index.jsx
@@ -119,7 +119,7 @@
             onChange={(val) => val === undefined && this.selectChange('')}
           >
             {options.map((option, i) =>
-              <Select.Option key={i} disabled={option.disabled} extend={option[config.extendName] || ''} value={option.value || option.field || ''}>{option.label || option.text}</Select.Option>
+              <Select.Option key={i} disabled={option.disabled} title={option.label || option.text} extend={option[config.extendName] || ''} value={option.value || option.field || ''}>{option.label || option.text}</Select.Option>
             )}
           </Select>
         )
diff --git a/src/menu/components/card/cardcomponent/index.jsx b/src/menu/components/card/cardcomponent/index.jsx
index c4bb5f3..f418268 100644
--- a/src/menu/components/card/cardcomponent/index.jsx
+++ b/src/menu/components/card/cardcomponent/index.jsx
@@ -320,7 +320,7 @@
               <div className="mk-popover-control">
                 <PlusOutlined className="plus" title="娣诲姞鍏冪礌" onClick={this.addElement} />
                 <PlusSquareOutlined className="plus" title="娣诲姞鎸夐挳" onClick={this.addButton} />
-                <NormalForm title="鍗$墖璁剧疆" width={800} update={this.updateSetting} getForms={this.getSettingForms}>
+                <NormalForm title="鍗$墖璁剧疆" width={950} update={this.updateSetting} getForms={this.getSettingForms}>
                   <EditOutlined className="edit" title="缂栬緫"/>
                 </NormalForm>
                 <CopyComponent type="cardcell" card={card}/>
diff --git a/src/menu/components/card/cardcomponent/options.jsx b/src/menu/components/card/cardcomponent/options.jsx
index a2faaf0..40d460f 100644
--- a/src/menu/components/card/cardcomponent/options.jsx
+++ b/src/menu/components/card/cardcomponent/options.jsx
@@ -242,7 +242,7 @@
           editable: true,
           unique: true,
           required: false,
-          width: '35%'
+          width: '30%'
         },
         {
           title: '鑿滃崟',
@@ -251,7 +251,7 @@
           editable: true,
           required: true,
           extends: !appType ? 'Menu' : [{key: 'label', value: 'label'}],
-          width: '35%',
+          width: '40%',
           render: (text, record) => record.label,
           options: menulist
         }
diff --git a/src/menu/components/share/actioncomponent/actionform/index.jsx b/src/menu/components/share/actioncomponent/actionform/index.jsx
index efe091f..ddbb440 100644
--- a/src/menu/components/share/actioncomponent/actionform/index.jsx
+++ b/src/menu/components/share/actioncomponent/actionform/index.jsx
@@ -807,7 +807,7 @@
             getPopupContainer={() => document.getElementById('winter')}
           >
             {item.options.map((option, index) =>
-              <Select.Option key={index} extend={option[item.extendName] || ''} value={(option.value || option.field)}>
+              <Select.Option key={index} title={option.text || option.label} extend={option[item.extendName] || ''} value={(option.value || option.field)}>
                 {(option.text || option.label)}
               </Select.Option>
             )}
@@ -821,7 +821,7 @@
             getPopupContainer={() => document.getElementById('winter')}
           >
             {item.options.map((option, index) =>
-              <Select.Option key={index} value={(option.value || option.field)}>
+              <Select.Option key={index} title={option.text || option.label} value={(option.value || option.field)}>
                 {(option.text || option.label)}
               </Select.Option>
             )}
diff --git a/src/mob/components/menubar/normal-menubar/menucomponent/options.jsx b/src/mob/components/menubar/normal-menubar/menucomponent/options.jsx
index 8e189c7..5ce1a43 100644
--- a/src/mob/components/menubar/normal-menubar/menucomponent/options.jsx
+++ b/src/mob/components/menubar/normal-menubar/menucomponent/options.jsx
@@ -204,7 +204,7 @@
       field: 'primaryId',
       label: '闈欐�佷富閿��',
       initval: setting.primaryId || '',
-      tooltip: '鍙綔涓築ID浼犲埌涓嬩竴椤甸潰銆�',
+      tooltip: '鍙綔涓築ID浼犲埌涓嬩竴椤甸潰銆傛敞锛欯userid@浼氭浛鎹负鐢ㄦ埛ID銆�',
       required: false
     }
   ]
diff --git a/src/mob/components/topbar/normal-navbar/index.scss b/src/mob/components/topbar/normal-navbar/index.scss
index 80403dc..eb91cad 100644
--- a/src/mob/components/topbar/normal-navbar/index.scss
+++ b/src/mob/components/topbar/normal-navbar/index.scss
@@ -39,7 +39,7 @@
       .img {
         width: 30px;
         height: 30px;
-        border-radius: 4px;
+        border-radius: 30px;
         margin-top: 9px;
         margin-right: 5px;
         background-size: cover;
diff --git a/src/router/index.js b/src/router/index.js
index ab91632..b384ad4 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -25,6 +25,7 @@
 const Interface = asyncLoadComponent(() => import('@/views/interface'))
 const RoleManage = asyncLoadComponent(() => import('@/views/rolemanage'))
 const SystemFunc = asyncLoadComponent(() => import('@/views/systemfunc'))
+const SystemProc = asyncLoadComponent(() => import('@/views/systemproc'))
 
 const routers = [
   {path: '/login', name: 'login', component: Login, auth: false},
@@ -47,6 +48,7 @@
   {path: '/tab/:menuId', name: 'tab', component: MainParams, auth: false},
   {path: '/role/:param', name: 'role', component: RoleManage, auth: true},
   {path: '/hs', name: 'hs', component: SystemFunc, auth: true},
+  {path: '/proc', name: 'proc', component: SystemProc, auth: true},
   {path: '/interface', name: 'interface', component: Interface, auth: true}
 ]
 
diff --git a/src/tabviews/custom/components/card/cardcellList/index.scss b/src/tabviews/custom/components/card/cardcellList/index.scss
index fa2af83..587b487 100644
--- a/src/tabviews/custom/components/card/cardcellList/index.scss
+++ b/src/tabviews/custom/components/card/cardcellList/index.scss
@@ -33,6 +33,9 @@
     }
     span {
       text-indent: 0px;
+      font-style: inherit;
+      font-weight: inherit;
+      text-decoration: inherit;
     }
   }
   .ant-mk-text:not(.line1):not(.line) {
diff --git a/src/tabviews/zshare/actionList/printbutton/index.jsx b/src/tabviews/zshare/actionList/printbutton/index.jsx
index 0e665c5..988c039 100644
--- a/src/tabviews/zshare/actionList/printbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/printbutton/index.jsx
@@ -183,11 +183,7 @@
       // 鏁版嵁閫夋嫨绫诲瀷鏍¢獙
       this.actionSettingError()
       return
-    } else if (
-      !btn.verify ||
-      (btn.verify.printMode === 'normal' && (!btn.verify.Template || !btn.verify.linkUrl)) ||
-      (btn.verify.printMode === 'custom' && (!btn.verify.printFunc || !btn.verify.linkUrl))
-    ) {
+    } else if (!btn.verify || !btn.verify.printMode) {
       notification.warning({
         top: 92,
         message: '璇峰畬鍠勬墦鍗伴獙璇佷俊鎭紒',
@@ -232,10 +228,20 @@
     }
   }
 
+  triggerPrint = (data, formlist = []) => {
+    const { btn } = this.props
+
+    if (btn.verify.printMode === 'RFID') {
+      this.triggerRFIDPrint(data, formlist)
+    } else {
+      this.triggerNormalPrint(data, formlist)
+    }
+  }
+
   /**
    * @description 瑙﹀彂鎵撳嵃
    */
-  triggerPrint = (data, formlist = []) => {
+  triggerNormalPrint = (data, formlist) => {
     const { btn } = this.props
     let formdata = {}
     let baseCount = 1
@@ -378,7 +384,7 @@
             param.rduri = window.GLOB.mainSystemApi
           }
     
-          Api.genericInterface(param).then(result => {
+          Api.getSystemCacheConfig(param).then(result => {
             result.tempId = tempId
             resolve(result)
           })
@@ -448,6 +454,109 @@
         }
       } else {
         this.execError(errorMsg)
+      }
+    })
+  }
+
+  /**
+   * @description 瑙﹀彂RFID鎵撳嵃
+   */
+  triggerRFIDPrint = (data, formlist) => {
+    const { btn } = this.props
+    let formdata = {}
+    let list = []
+    
+    formlist.forEach(_data => {
+      formdata[_data.key] = _data.value
+    })
+
+    new Promise(resolve => {
+      if (btn.intertype === 'system') { // 浣跨敤绯荤粺鏃讹紝鐩存帴浠庤〃鏍兼垨琛ㄥ崟涓�夊彇鏁版嵁
+        if (btn.Ot === 'notRequired') {
+          if (formlist.length > 0) {
+            list = [formdata]
+          }
+        } else {
+          data.forEach(cell => {
+            let _cell = {...cell, ...formdata}
+            list.push(_cell)
+          })
+        }
+
+        resolve(true)
+      } else {
+        this.getprintdata(btn, data, formdata, formlist).then(result => {
+          if (result.next) {
+            result.list.forEach(cell => {
+              // 绯荤粺鎵撳嵃鏁版嵁锛屾牎楠宒ata瀛楁
+              if (!cell.data || cell.data.length === 0) return
+
+              cell.data.forEach(m => {
+                let _cell = {...m, ...formdata}
+                list.push(_cell)
+              })
+            })
+          }
+          
+          resolve(result.next)
+        })
+      }
+    }).then(res => {
+      // 鑾峰彇鎵撳嵃妯℃澘 getTemp
+      if (!res) return false
+
+      if (list.length === 0) {
+        notification.warning({
+          top: 92,
+          message: '鏈幏鍙栧埌鎵撳嵃鏁版嵁锛�',
+          duration: 5
+        })
+        return false
+      }
+
+      let param = {
+        func: 's_PrintTemplateMGetData',
+        Type: 'Y',
+        // ID: tempId, // 娣诲姞妯℃澘鏃讹紝淇濆瓨鍙婃煡璇娇鐢ㄦā鏉垮弬鏁�
+        PrintTempNO: btn.verify.Template
+      }
+
+      if (window.GLOB.mainSystemApi) { // 浠庡崟鐐圭櫥褰曟湇鍔″櫒鍙栨墦鍗伴厤缃俊鎭�
+        param.rduri = window.GLOB.mainSystemApi
+      }
+
+      return Api.getSystemCacheConfig(param)
+    }).then(result => {
+      if (!result) {
+        this.setState({ loading: false })
+        return
+      }
+
+      if (!result.ConfigParam) {
+        notification.warning({
+          top: 92,
+          message: '鏈幏鍙栧埌鎵撳嵃妯℃澘淇℃伅锛�',
+          duration: 5
+        })
+        this.setState({ loading: false })
+      } else {
+        let configParam = ''
+        try {
+          configParam = JSON.parse(window.decodeURIComponent(window.atob(result.ConfigParam)))
+        } catch (e) {
+          configParam = ''
+        }
+  
+        if (!configParam) {
+          notification.warning({
+            top: 92,
+            message: '鎵撳嵃妯℃澘瑙f瀽閿欒锛�',
+            duration: 5
+          })
+          this.setState({ loading: false })
+        } else {
+          this.execRfidPrint(list, configParam)
+        }
       }
     })
   }
@@ -1087,48 +1196,152 @@
     }
   }
 
-  // execRfidPrint = () => {
-  //   let type = 'HF'
-  //   let printparamsJsonArray = []
+  execRfidPrint = (list, template) => {
+    const { btn } = this.props
 
-  //   let mm = 12
-  //   if (type === 'HF') {
-  //     printparamsJsonArray.push({PTK_OpenUSBPort: 255}); // 鎵撳紑鎵撳嵃鏈篣SB绔彛
-  //     printparamsJsonArray.push({PTK_ClearBuffer: ''}); // 娓呯┖缂撳瓨
-  //     printparamsJsonArray.push({PTK_SetDarkness: 10}); // 璁剧疆鎵撳嵃榛戝害 鍙栧�艰寖鍥� 0-20
-  //     printparamsJsonArray.push({PTK_SetPrintSpeed: 4}); // 璁剧疆鎵撳嵃閫熷害
-  //     printparamsJsonArray.push({PTK_SetDirection: 'B'}); // 璁剧疆鎵撳嵃鏂瑰悜
-  //     printparamsJsonArray.push({PTK_SetLabelHeight: 25*mm + ","+ 10*mm +","+ 0 +","+ false}); // 璁剧疆鏍囩楂樺害銆侀棿闅欏強鍋忕Щ
-  //     printparamsJsonArray.push({PTK_SetLabelWidth: 60*mm}); // 璁剧疆鏍囩瀹藉害
-  //     printparamsJsonArray.push({PTK_SetRFID: 0+","+0+","+0+","+0+","+0}); // UHF RFID鎵撳嵃璁剧疆
-  //     printparamsJsonArray.push({PTK_RWRFIDLabel: 1+","+0+","+0+","+4+","+1+',EEBA99192945C746'});
-  //     printparamsJsonArray.push({PTK_DrawText_TrueType: "50,10,36,0,寰蒋闆呴粦,1,700,0,0,0,鍖椾含鏄庣鏈夐檺鍏徃"});
-  //     // printparamsJsonArray.push({PTK_DrawText_TrueType: x+","+y+","+FHeight+","+FWidth+","+FType+","+Fspin+","+FWeight+","+FItalic+","+FUnline+","+FStrikeOut+","+data});
-  //     // printparamsJsonArray.push({PTK_EncodeRFIDPC:'mkA040'});
-  //     printparamsJsonArray.push({PTK_PrintLabel:1+","+1});
-  //     printparamsJsonArray.push({PTK_CloseUSBPort: ""}); // 鍏抽棴USB閫氳绔彛
-  //   }
+    list = list.filter(item => !!item[btn.verify.valueField])
 
-  //   let data = {
-  //     reqParam: '1',
-  //     printparams: JSON.stringify(printparamsJsonArray)
-  //     // printparams: JSON.stringify([{PTK_OpenUSBPort: 255},{PTK_ErrorReport_USBInterrupt: 'status:'},{PTK_GetPrinterDPI: 'DPI:'},{PTK_CloseUSBPort: ''}])
-  //     // printparams: JSON.stringify([{PTK_OpenUSBPort: 255},{PTK_RFIDCalibrate: ''},{PTK_CloseUSBPort: ''}])
-  //   }
+    if (list.length === 0) {
+      notification.warning({
+        top: 92,
+        message: '鏈幏鍙栧埌鎵撳嵃鏁版嵁锛�',
+        duration: 5
+      })
+      this.setState({ loading: false })
+      return
+    }
 
-  //   Api.postekPrint(data).then(result => {
+    let width = template.width
+    let height = template.height
+    let gap = template.gap || 0
+    let mm = 12
 
-  //   })
-  // }
+    if (btn.verify.DPI === '203') {
+      mm = 8
+    } else if (btn.verify.DPI === '600') {
+      mm = 24
+    }
+
+    let items = []
+    template.elements.forEach(element => {
+      if (!['text', 'barcode', 'qrcode'].includes(element.type)) return
+
+      let _field = element.field
+
+      if (_field === 'other_field') {
+        _field = element.cusfield || ''
+      }
+
+      let item = {
+        type: element.type,
+        value: element.value || '',
+        field: _field
+      }
+
+      if (item.type === 'text') {
+        let size = Math.floor(4 * mm * (element.fontSize || 12) / 12)
+        let fontWeight = 400
+        if (element.fontWeight === 'bold') {
+          fontWeight = 600
+        } else if (element.fontWeight === 'bolder') {
+          fontWeight = 800
+        } else if (element.fontWeight === 'lighter') {
+          fontWeight = 300
+        }
+        item.draw = `${element.left * mm},${element.top * mm},${size},0,${element.fontFamily || '寰蒋闆呴粦'},${element.align === 'center' ? 5 : 1},${fontWeight},0,0,0,`
+      } else if (item.type === 'barcode') {
+        let codeType = 1
+        if (element.barcodeType === 'EAN13') {
+          codeType = 'E30'
+        }
+        let narrowWidth = element.narrowWidth || 2
+        let horizontal = element.narrowWidth || 2
+        let vertical = Math.ceil(element.barcodeHeight * mm)
+
+        item.draw = `${element.left * mm},${element.top * mm},0,${codeType},${narrowWidth},${horizontal},${vertical},${element.barcodeLabel === 'true' ? 'B' : 'N'},`
+      } else if (item.type === 'qrcode') {
+        let r = Math.ceil(element.qrcodeWidth / 2)
+
+        item.draw = `${element.left * mm},${element.top * mm},0,0,0,${r},0,0,8,`
+      }
+
+      items.push(item)
+    })
+
+    let ip = '192.168.1.2'
+    let params = list.map(cell => {
+      let array = []
+      let value = cell[btn.verify.valueField]
+
+      if (btn.verify.linkType !== 'USB') {
+        array.push({PTK_Connect_Timer: `${ip},${btn.verify.port},5`}); // 鎵撳紑鎵撳嵃鏈虹綉缁滅鍙�
+      } else {
+        array.push({PTK_OpenUSBPort: btn.verify.port}); // 鎵撳紑鎵撳嵃鏈篣SB绔彛
+      }
+
+      array.push({PTK_ClearBuffer: ''}); // 娓呯┖缂撳瓨
+      array.push({PTK_SetDirection: 'B'}); // 璁剧疆鎵撳嵃鏂瑰悜
+      array.push({PTK_SetLabelHeight: height * mm + ',' + gap * mm + ',' + 0 + ',' + false}); // 璁剧疆鏍囩楂樺害銆侀棿闅欏強鍋忕Щ
+      array.push({PTK_SetLabelWidth: width * mm}); // 璁剧疆鏍囩瀹藉害
+      array.push({PTK_SetRFID: '0,0,0,0,0'}); // UHF RFID鎵撳嵃璁剧疆
+      array.push({PTK_RWRFIDLabel: '1,0,0,4,1,' + value});
+
+      items.forEach(m => {
+        let val = ''
+        if (m.field) {
+          val = cell[m.field]
+        } else {
+          val = m.value
+        }
+
+        if (!val && val !== 0) return
+
+        if (m.type === 'text') {
+          array.push({PTK_DrawText_TrueType: m.draw + val});
+        } else if (m.type === 'barcode') {
+          array.push({PTK_DrawBarcode: m.draw + val});
+        } else if (m.type === 'qrcode') {
+          array.push({PTK_DrawBar2D_QR: m.draw + val});
+        }
+      })
+      
+      array.push({PTK_PrintLabel: '1,1'});
+      array.push({PTK_CloseUSBPort: ''}); // 鍏抽棴USB閫氳绔彛
+
+      return {
+        reqParam: '1',
+        printparams: JSON.stringify(array)
+      }
+    })
+
+    this.loopRFIDPrint(params)
+  }
+
+  loopRFIDPrint = (params) => {
+    let param = params.shift()
+
+    Api.postekPrint(param).then(res => {
+      if (res.retval === '0') {
+        if (params.length === 0) {
+          this.execSuccess({ ErrCode: 'S', message: '', ErrMesg: '鎵撳嵃璇锋眰宸插彂鍑恒��', status: true })
+        } else {
+          setTimeout(() => {
+            this.loopRFIDPrint(params)
+          }, 200)
+        }
+      } else {
+        if (res.retval === '30021') {
+          res.msg = res.msg.replace(/PTK_ClearBuffer[\s\S]*/, '')
+        }
+        
+        this.execError({ErrCode: 'N', message: res.msg})
+      }
+    })
+  }
 
   execPrint = (list, template, formdata) => {
     const { btn } = this.props
     let _errors = []
-    
-    // if (btn) {
-    //   this.execRfidPrint()
-    //   return
-    // }
 
     let defaultPrinter = btn.verify.defaultPrinter || 'lackprinter'
     let printers = {}
diff --git a/src/templates/sharecomponent/actioncomponent/verifyprint/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyprint/index.jsx
index 1c8b257..324f63b 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyprint/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyprint/index.jsx
@@ -213,6 +213,20 @@
   changePrintMode = (e) => {
     let value = e.target.value
 
+    if (value === 'RFID') {
+      this.setState({linkType: 'USB', port: 255}, () => {
+        this.props.form.setFieldsValue({
+          linkType: 'USB'
+        })
+      })
+    } else if (this.state.printMode === 'RFID') {
+      this.setState({linkType: 'system'}, () => {
+        this.props.form.setFieldsValue({
+          linkType: 'system'
+        })
+      })
+    }
+
     this.setState({
       printMode: value
     })
@@ -227,6 +241,14 @@
       if (value === 'system') {
         this.props.form.setFieldsValue({
           linkUrl: '127.0.0.1:13529'
+        })
+      } else if (value === 'USB') {
+        this.props.form.setFieldsValue({
+          port: '255'
+        })
+      } else if (value === 'network') {
+        this.props.form.setFieldsValue({
+          port: '9100'
         })
       }
     })
@@ -262,11 +284,12 @@
                       <Radio.Group onChange={this.changePrintMode}>
                         <Radio value="normal">鏍囧噯</Radio>
                         <Radio value="custom">鑷畾涔�</Radio>
+                        <Radio value="RFID">RFID</Radio>
                       </Radio.Group>
                     )}
                   </Form.Item>
                 </Col>
-                <Col span={8}>
+                {printMode !== 'RFID' ? <Col span={8}>
                   <Form.Item label="閾炬帴绫诲瀷">
                     {getFieldDecorator('linkType', {
                       initialValue: linkType || 'system'
@@ -277,9 +300,21 @@
                       </Radio.Group>
                     )}
                   </Form.Item>
-                </Col>
+                </Col> :
                 <Col span={8}>
-                  <Form.Item label={'閾炬帴鍦板潃'}>
+                  <Form.Item label="閾炬帴绫诲瀷">
+                    {getFieldDecorator('linkType', {
+                      initialValue: linkType || 'USB'
+                    })(
+                      <Radio.Group onChange={this.changeLinkType}>
+                        <Radio value="USB">USB</Radio>
+                        <Radio value="network">缃戠粶绔彛</Radio>
+                      </Radio.Group>
+                    )}
+                  </Form.Item>
+                </Col>}
+                {printMode !== 'RFID' ? <Col span={8}>
+                  <Form.Item label="閾炬帴鍦板潃">
                     {getFieldDecorator('linkUrl', {
                       initialValue: verify.linkUrl || '127.0.0.1:13529',
                       rules: [
@@ -290,7 +325,20 @@
                       ]
                     })(<Input placeholder="" autoComplete="off" disabled={linkType === 'system'} />)}
                   </Form.Item>
-                </Col>
+                </Col> :
+                <Col span={8}>
+                  <Form.Item label={'绔彛'}>
+                    {getFieldDecorator('port', {
+                      initialValue: verify.port || '255',
+                      rules: [
+                        {
+                          required: true,
+                          message: '璇疯緭鍏ョ鍙�!'
+                        }
+                      ]
+                    })(<Input placeholder="" autoComplete="off" />)}
+                  </Form.Item>
+                </Col>}
                 {printMode === 'custom' ? <Col span={24}>
                   <Form.Item label={'澶勭悊鍑芥暟'} className="printFunc">
                     {getFieldDecorator('printFunc', {
@@ -306,7 +354,60 @@
                     )} 
                   </Form.Item>
                 </Col> : null}
+                {printMode === 'RFID' ? <Col span={8}>
+                  <Form.Item label={
+                    <Tooltip placement="topLeft" title="鐢ㄤ簬鍗曚綅鎹㈢畻銆�">
+                      <QuestionCircleOutlined className="mk-form-tip" />
+                      鍒嗚鲸鐜�
+                    </Tooltip>
+                  }>
+                    {getFieldDecorator('DPI', {
+                      initialValue: verify.DPI || '300'
+                    })(
+                      <Radio.Group>
+                        <Radio value="203">203</Radio>
+                        <Radio value="300">300</Radio>
+                        <Radio value="600">600</Radio>
+                      </Radio.Group>
+                    )}
+                  </Form.Item>
+                </Col> : null}
+                {printMode === 'RFID' ? <Col span={8}>
+                  <Form.Item label={
+                    <Tooltip placement="topLeft" title="闇�瑕佸瓨璐嚦鑺墖涓殑鍊硷紝璇峰~鍐欏搴旂殑瀛楁鍚嶏紝娉ㄦ剰澶у皬鍐欍��">
+                      <QuestionCircleOutlined className="mk-form-tip" />
+                      鎵撳嵃鍊�
+                    </Tooltip>
+                  }>
+                    {getFieldDecorator('valueField', {
+                      initialValue: verify.valueField || '',
+                      rules: [
+                        {
+                          required: true,
+                          message: '璇疯緭鍏ュ瓧娈靛悕!'
+                        }
+                      ]
+                    })(<Input placeholder="" autoComplete="off" disabled={linkType === 'system'} />)}
+                  </Form.Item>
+                </Col> : null}
                 {printMode === 'normal' ? <Col span={8}>
+                  <Form.Item label={
+                    <Tooltip placement="topLeft" title="鎵撳嵃鍒楄〃涓虹┖鏃讹紝鏄惁鎻愮ず鐢ㄦ埛銆�">
+                      <QuestionCircleOutlined className="mk-form-tip" />
+                      绌哄�兼彁绀�
+                    </Tooltip>
+                  }>
+                    {getFieldDecorator('emptyTip', {
+                      initialValue: verify.emptyTip || 'true'
+                    })(
+                      <Radio.Group>
+                        <Radio value="true">鏄�</Radio>
+                        <Radio value="false">鍚�</Radio>
+                      </Radio.Group>
+                    )}
+                  </Form.Item>
+                </Col> : null}
+                {printMode !== 'custom' ? <Col span={8}>
                   <Form.Item label="鎵撳嵃妯℃澘">
                     {getFieldDecorator('Template', {
                       initialValue: verify.Template || '',
@@ -331,25 +432,8 @@
                       </Select>
                     )}
                   </Form.Item>
-                </Col> : null }
-                {printMode === 'normal' ? <Col span={8}>
-                  <Form.Item label={
-                    <Tooltip placement="topLeft" title="鎵撳嵃鍒楄〃涓虹┖鏃讹紝鏄惁鎻愮ず鐢ㄦ埛銆�">
-                      <QuestionCircleOutlined className="mk-form-tip" />
-                      绌哄�兼彁绀�
-                    </Tooltip>
-                  }>
-                    {getFieldDecorator('emptyTip', {
-                      initialValue: verify.emptyTip || 'true'
-                    })(
-                      <Radio.Group>
-                        <Radio value="true">鏄�</Radio>
-                        <Radio value="false">鍚�</Radio>
-                      </Radio.Group>
-                    )}
-                  </Form.Item>
                 </Col> : null}
-                {printMode === 'normal' ? <Col span={8}>
+                {printMode !== 'custom' ? <Col span={8} offset={printMode === 'RFID' ? 16 : 0}>
                   <img className="legend" src={this.state.selectimg} alt=""/>
                 </Col> : null }
               </Row>
@@ -360,7 +444,7 @@
               鎵撳嵃绫诲瀷
               {verify.printerTypeList.length ? <span className="count-tip">{verify.printerTypeList.length}</span> : null}
             </span>
-          } key="2">
+          } disabled={printMode === 'RFID'} key="2">
             <Form {...formItemLayout}>
               <Row gutter={24}>
                 <Col span={24} className="print-tip">
diff --git a/src/utils/utils.js b/src/utils/utils.js
index 434200c..e92cda2 100644
--- a/src/utils/utils.js
+++ b/src/utils/utils.js
@@ -2185,7 +2185,7 @@
       style.color = mark.color
       innerStyle = {color: mark.color}
     } else if (type === 'background') {
-      style.background = mark.color
+      style.backgroundColor = mark.color
       if (mark.fontColor) {
         style.color = mark.fontColor
         innerStyle = {color: mark.fontColor}
diff --git a/src/views/design/header/index.jsx b/src/views/design/header/index.jsx
index 01a85fd..eb9e26a 100644
--- a/src/views/design/header/index.jsx
+++ b/src/views/design/header/index.jsx
@@ -2,7 +2,7 @@
 import { withRouter } from 'react-router-dom'
 import {connect} from 'react-redux'
 import { Dropdown, Menu, Modal, notification, Switch, Button, Popover } from 'antd'
-import { MenuFoldOutlined, SettingOutlined, AppstoreOutlined, DownOutlined, HomeOutlined, ApiOutlined, PlusOutlined, EditOutlined, MenuOutlined } from '@ant-design/icons'
+import { MenuFoldOutlined, SettingOutlined, AppstoreOutlined, DownOutlined, HomeOutlined, ApiOutlined, PlusOutlined, EditOutlined, MenuOutlined, DatabaseOutlined } from '@ant-design/icons'
 import moment from 'moment'
 
 import asyncComponent from '@/utils/asyncComponent'
@@ -452,45 +452,55 @@
           <SettingOutlined className="edit-check"/>
         </Popover> : null}
         {/* window.btoa(window.encodeURIComponent(JSON.stringify({ MenuType: 'home', MenuId: 'home_page_id', MenuName: '棣栭〉' }))) */}
-        {window.GLOB.systemType !== 'production' ?
-          <div className="home-entrance entrance">
-            <div className="icon"><HomeOutlined /></div>
-            <div className="title">棣栭〉</div>
-            <div className="detail">鍩轰簬鑷畾涔夐〉闈㈢殑棣栭〉璁捐锛屽彲瀹炵幇鐏垫椿鐨勫厓绱犻厤缃強鏍峰紡璋冩暣锛屽睍鐜板綋鍓嶇郴缁熺殑椋庢牸銆�</div>
-            <Button type="primary" disabled={!(memberLevel >= 20)} title={memberLevel >= 20 ? '' : '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'} onClick={() => {window.open('#/menudesign/JTdCJTIyTWVudVR5cGUlMjIlM0ElMjJob21lJTIyJTJDJTIyTWVudUlkJTIyJTNBJTIyaG9tZV9wYWdlX2lkJTIyJTJDJTIyTWVudU5hbWUlMjIlM0ElMjIlRTklQTYlOTYlRTklQTElQjUlMjIlN0Q=')}}>
-              缂栬緫
-            </Button>
-          </div> : null
-        }
-        <div className="api-entrance entrance">
-          <div className="icon"><ApiOutlined /></div>
-          <div className="title">鎺ュ彛璋冭瘯</div>
-          <div className="detail">鍙嚜鍔ㄥ鐞嗙櫥褰曟帴鍙g殑鍙傛暟鍔犲瘑锛屼互鍙婁笟鍔℃帴鍙g殑绛惧悕璁$畻锛屾柟渚垮紑鍙戜汉鍛樼殑鎺ュ彛娴嬭瘯宸ヤ綔銆�</div>
-          <Button type="primary" disabled={!(memberLevel >= 20)} title={memberLevel >= 20 ? '' : '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'} onClick={() => {window.open('#/interface')}}>
-            缂栬緫
-          </Button>
-        </div>
-        <div className="app-entrance entrance">
-          <div className="icon"><AppstoreOutlined /></div>
-          <div className="title">搴旂敤绠$悊</div>
-          <div className="detail">鍙垱寤哄強绠$悊PC銆乸ad鍙婄Щ鍔ㄧ绛変笉鍚岃澶囩殑搴旂敤锛屽疄鐜版槑绉戜簯APP銆佸井淇″叕浼楀彿銆佸皬绋嬪簭绛夊骞冲彴鐨勫簲鐢ㄥ叡浜��</div>
-          {window.GLOB.systemType !== 'production' ? 
-            <Button type="primary" disabled={!(memberLevel >= 20)} title={memberLevel >= 20 ? '' : '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'} onClick={() => {window.open('#/appmanage')}}>
-              缂栬緫
-            </Button> :
-            <Button type="primary" disabled={!(memberLevel >= 20)} title={memberLevel >= 20 ? '' : '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'} onClick={() => {window.open('#/appcheck')}}>
-              鏌ョ湅
-            </Button>
+        <div className="entrance-wrap">
+          {window.GLOB.systemType !== 'production' ?
+            <div className="entrance">
+              <div className="icon"><HomeOutlined /></div>
+              <div className="title">棣栭〉</div>
+              <div className="detail">鍩轰簬鑷畾涔夐〉闈㈢殑棣栭〉璁捐锛屽彲瀹炵幇鐏垫椿鐨勫厓绱犻厤缃強鏍峰紡璋冩暣锛屽睍鐜板綋鍓嶇郴缁熺殑椋庢牸銆�</div>
+              <Button type="primary" disabled={!(memberLevel >= 20)} title={memberLevel >= 20 ? '' : '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'} onClick={() => {window.open('#/menudesign/JTdCJTIyTWVudVR5cGUlMjIlM0ElMjJob21lJTIyJTJDJTIyTWVudUlkJTIyJTNBJTIyaG9tZV9wYWdlX2lkJTIyJTJDJTIyTWVudU5hbWUlMjIlM0ElMjIlRTklQTYlOTYlRTklQTElQjUlMjIlN0Q=')}}>
+                缂栬緫
+              </Button>
+            </div> : null
           }
+          <div className="entrance">
+            <div className="icon"><ApiOutlined /></div>
+            <div className="title">鎺ュ彛璋冭瘯</div>
+            <div className="detail">鍙嚜鍔ㄥ鐞嗙櫥褰曟帴鍙g殑鍙傛暟鍔犲瘑锛屼互鍙婁笟鍔℃帴鍙g殑绛惧悕璁$畻锛屾柟渚垮紑鍙戜汉鍛樼殑鎺ュ彛娴嬭瘯宸ヤ綔銆�</div>
+            <Button type="primary" disabled={!(memberLevel >= 20)} title={memberLevel >= 20 ? '' : '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'} onClick={() => {window.open('#/interface')}}>
+              缂栬緫
+            </Button>
+          </div>
+          <div className="entrance">
+            <div className="icon"><AppstoreOutlined /></div>
+            <div className="title">搴旂敤绠$悊</div>
+            <div className="detail">鍙垱寤哄強绠$悊PC銆乸ad鍙婄Щ鍔ㄧ绛変笉鍚岃澶囩殑搴旂敤锛屽疄鐜版槑绉戜簯APP銆佸井淇″叕浼楀彿銆佸皬绋嬪簭绛夊骞冲彴鐨勫簲鐢ㄥ叡浜��</div>
+            {window.GLOB.systemType !== 'production' ? 
+              <Button type="primary" disabled={!(memberLevel >= 20)} title={memberLevel >= 20 ? '' : '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'} onClick={() => {window.open('#/appmanage')}}>
+                缂栬緫
+              </Button> :
+              <Button type="primary" disabled={!(memberLevel >= 20)} title={memberLevel >= 20 ? '' : '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'} onClick={() => {window.open('#/appcheck')}}>
+                鏌ョ湅
+              </Button>
+            }
+          </div>
+          {window.GLOB.systemType !== 'production' ? <div className="entrance">
+            <div className="icon"><MenuOutlined /></div>
+            <div className="title">鑿滃崟鎿嶄綔璇存槑</div>
+            <div className="detail">榧犳爣鎮仠 <SettingOutlined style={{color: '#1890ff'}}/> 鍙樉绀鸿彍鍗曠殑娣诲姞銆佹帓搴忥紙鍖呮嫭缂栬緫銆佸垹闄わ級涓庤В鍐诲姛鑳斤紝鍙屽嚮涓夌骇鑿滃崟鍙繘鍏ョ紪杈戠獥鍙c��</div>
+            <Button type="primary" onClick={() => {window.open('#/main')}}>
+              鏂扮獥鍙�
+            </Button>
+          </div> : null}
+          {window.GLOB.systemType !== 'production' ? <div className="entrance">
+            <div className="icon"><DatabaseOutlined /></div>
+            <div className="title">瀛樺偍杩囩▼</div>
+            <div className="detail">鍙湪椤甸潰涓煡鐪嬫垨缂栬緫鏈湴瀛樺偍杩囩▼銆�</div>
+            <Button type="primary" onClick={() => {window.open('#/proc')}}>
+              缂栬緫
+            </Button>
+          </div> : null}
         </div>
-        {window.GLOB.systemType !== 'production' ? <div className="menu-entrance entrance">
-          <div className="icon"><MenuOutlined /></div>
-          <div className="title">鑿滃崟鎿嶄綔璇存槑</div>
-          <div className="detail">榧犳爣鎮仠 <SettingOutlined style={{color: '#1890ff'}}/> 鍙樉绀鸿彍鍗曠殑娣诲姞銆佹帓搴忥紙鍖呮嫭缂栬緫銆佸垹闄わ級涓庤В鍐诲姛鑳斤紝鍙屽嚮涓夌骇鑿滃崟鍙繘鍏ョ紪杈戠獥鍙c��</div>
-          <Button type="primary" onClick={() => {window.open('#/main')}}>
-            鏂扮獥鍙�
-          </Button>
-        </div> : null}
         {/* 缂栬緫鑿滃崟 */}
         {editLevel === 'level1' ? <EditMenu menulist={this.state.menulist} reload={this.reload} exitEdit={this.exitEdit}/> : null}
         {/* 澶村儚銆佺敤鎴峰悕 */}
diff --git a/src/views/design/header/index.scss b/src/views/design/header/index.scss
index 587ca14..aef0f9b 100644
--- a/src/views/design/header/index.scss
+++ b/src/views/design/header/index.scss
@@ -113,43 +113,16 @@
     margin-left: 10px;
     cursor: pointer;
   }
-  .level4-close {
-    position: relative;
-    top: 13px;
-    left: 20px;
-    height: 26px;
-    padding: 0 10px;
-    z-index: 2;
-  }
-  .mobile {
-    position: absolute;
-    top: 135px;
-    right: 50px;
-    color: #1890ff;
-    cursor: pointer;
-  }
-  .interface {
-    position: absolute;
-    top: 170px;
-    right: 50px;
-    color: #1890ff;
-    cursor: pointer;
-  }
-  .home-entrance {
-    left: 260px;
-  }
-  .api-entrance {
-    left: 540px;
-  }
-  .app-entrance {
-    left: 820px;
-  }
-  .menu-entrance {
-    left: 1100px;
-  }
-  .entrance {
+
+  .entrance-wrap {
     position: absolute;
     top: 100px;
+    left: 240px;
+    width: calc(100vw - 270px);
+  }
+  .entrance {
+    margin-left: 30px;
+    margin-bottom: 30px;
     background: #ffffff;
     box-shadow: 0 0 5px #d9d9d9;
     border-radius: 5px;
@@ -157,6 +130,8 @@
     height: 250px;
     color: rgba(0, 0, 0, 0.85);
     text-align: center;
+    display: inline-block;
+    vertical-align: top;
     .icon {
       text-align: center;
       padding: 15px 0px;
@@ -180,6 +155,7 @@
       color: rgba(0, 0, 0, 0.65);
       text-align: center;
       padding: 0 10px;
+      min-height: 60px;
     }
     .ant-btn {
       margin-top: 15px;
diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx
index 45f558f..381ae5d 100644
--- a/src/views/login/index.jsx
+++ b/src/views/login/index.jsx
@@ -75,6 +75,21 @@
     // 鐧诲綍鎻愪氦
     let res = await Api.getusermsg(param.username, param.password, false, ipAddress, city)
     if (res.status) {
+      if (res.check_mob) {
+        let loginWays = this.state.loginWays.filter(item => item.type === 'sms_vcode')
+
+        if (loginWays.length > 0) {
+          this.setState({loginWays: null, isDisabled: false}, () => {
+            this.setState({loginWays: loginWays})
+          })
+          Modal.warning({
+            title: '涓虹‘璁ゆ槸鎮ㄦ湰浜烘搷浣滐紝璇蜂娇鐢ㄦ墜鏈虹煭淇¢獙璇佺爜杩涜韬唤璁よ瘉',
+            okText: '鐭ラ亾浜�'
+          })
+          return
+        }
+      }
+      
       sessionStorage.setItem('UserID', res.UserID)
       sessionStorage.setItem('LoginUID', res.LoginUID)
       sessionStorage.setItem('User_Name', res.UserName)
diff --git a/src/views/mobdesign/index.jsx b/src/views/mobdesign/index.jsx
index 1eed346..b2df487 100644
--- a/src/views/mobdesign/index.jsx
+++ b/src/views/mobdesign/index.jsx
@@ -631,11 +631,11 @@
 
       let appIndeList = sessionStorage.getItem('appViewList')
       appIndeList = JSON.parse(appIndeList)
-      appIndeList = appIndeList.map(item => (item.keys_type !== 'index' ? item.keys_id : '')).join(',')
+      appIndeList = appIndeList.map(item => (item.keys_type === 'navbar' ? item.keys_id : '')).join(',')
 
-      if (sessionStorage.getItem('userbind')) {
-        appIndeList = appIndeList + ',' + sessionStorage.getItem('userbind')
-      }
+      // if (sessionStorage.getItem('userbind')) {
+      //   appIndeList = appIndeList + ',' + sessionStorage.getItem('userbind')
+      // }
       if (sessionStorage.getItem('instantMessage')) {
         appIndeList = appIndeList + ',' + sessionStorage.getItem('instantMessage')
       }
@@ -643,7 +643,11 @@
       let menus = res.menus.filter(item => appIndeList.indexOf(item.MenuID) === -1)
       menus = menus.map(item => {
         item.value = item.MenuID
-        item.label = item.MenuName
+        if (item.MenuNo) {
+          item.label = item.MenuName + '锛�' + item.MenuNo + '锛�'
+        } else {
+          item.label = item.MenuName
+        }
         return item
       })
       sessionStorage.setItem('appMenus', JSON.stringify(menus))
diff --git a/src/views/pcdesign/index.jsx b/src/views/pcdesign/index.jsx
index fa764b8..400aee2 100644
--- a/src/views/pcdesign/index.jsx
+++ b/src/views/pcdesign/index.jsx
@@ -711,12 +711,16 @@
 
       let appIndeList = sessionStorage.getItem('appViewList')
       appIndeList = JSON.parse(appIndeList)
-      appIndeList = appIndeList.map(item => (item.keys_type !== 'index' ? item.keys_id : '')).join(',')
+      appIndeList = appIndeList.map(item => (item.keys_type === 'navbar' ? item.keys_id : '')).join(',')
 
       let menus = res.menus.filter(item => appIndeList.indexOf(item.MenuID) === -1)
       menus = menus.map(item => {
         item.value = item.MenuID
-        item.label = item.MenuName
+        if (item.MenuNo) {
+          item.label = item.MenuName + '锛�' + item.MenuNo + '锛�'
+        } else {
+          item.label = item.MenuName
+        }
         return item
       })
       sessionStorage.setItem('appMenus', JSON.stringify(menus))
diff --git a/src/views/printTemplate/mutilform/index.jsx b/src/views/printTemplate/mutilform/index.jsx
index d9d7a0e..ba52c7b 100644
--- a/src/views/printTemplate/mutilform/index.jsx
+++ b/src/views/printTemplate/mutilform/index.jsx
@@ -196,7 +196,7 @@
                 initialValue: item.initval,
                 rules: [
                   {
-                    required: true,
+                    required: item.required,
                     message: '璇疯緭鍏�' + item.label + '!'
                   }
                 ]
diff --git a/src/views/printTemplate/option.js b/src/views/printTemplate/option.js
index 24e4b88..f634781 100644
--- a/src/views/printTemplate/option.js
+++ b/src/views/printTemplate/option.js
@@ -268,6 +268,15 @@
       initval: config.rotate || 0,
       required: false,
       options: Rotate
+    },
+    {
+      type: 'number',
+      key: 'gap',
+      label: '闂撮殭',
+      initval: config.gap || '',
+      tooltip: 'RFID鏍囩闂撮殭銆�',
+      min: 0,
+      required: false
     }
   ]
 }
@@ -637,6 +646,15 @@
       required: true
     },
     {
+      type: 'number',
+      key: 'narrowWidth',
+      label: '鍗曞厓瀹藉害',
+      initval: item.narrowWidth,
+      tooltip: '娉細RFID鏉$爜鍗曞厓瀹藉害锛岄粯璁ゅ�间负2銆�',
+      precision: 0,
+      required: false
+    },
+    {
       type: 'select',
       key: 'background',
       label: '鑳屾櫙鑹�',
diff --git a/src/views/rolemanage/index.jsx b/src/views/rolemanage/index.jsx
index f51b6dc..5c5a369 100644
--- a/src/views/rolemanage/index.jsx
+++ b/src/views/rolemanage/index.jsx
@@ -27,12 +27,17 @@
     loading: false,
     menulist: [],
     columns: [
-      { title: '鑿滃崟鍚嶇О', dataIndex: 'MenuName', key: 'MenuName', align: 'center', render: (text, record) => {
-        if (record.extra) {
-          return <span style={{color: '#1890ff'}}>{text}</span>
+      {
+        title: '鑿滃崟鍚嶇О', dataIndex: 'MenuName', key: 'MenuName', align: 'center', render: (text, record) => {
+          if (record.extra) {
+            return <span style={{color: '#1890ff'}}>{text}</span>
+          }
+          return text
         }
-        return text
-      } },
+      },
+      {
+        title: '鑿滃崟鍙傛暟', dataIndex: 'MenuNo', key: 'MenuNo', align: 'center'
+      },
       {
         title: '鎿嶄綔',
         key: 'action',
diff --git a/src/views/systemfunc/index.jsx b/src/views/systemfunc/index.jsx
index 6fd02fb..26ae9c0 100644
--- a/src/views/systemfunc/index.jsx
+++ b/src/views/systemfunc/index.jsx
@@ -1,6 +1,5 @@
 import React, {Component} from 'react'
 import { ConfigProvider } from 'antd'
-import enUS from 'antd/es/locale/en_US'
 import zhCN from 'antd/es/locale/zh_CN'
 
 import asyncComponent from '@/utils/asyncComponent'
@@ -10,7 +9,6 @@
 import './index.scss'
 
 const Tabview = asyncComponent(() => import('@/components/tabview'))
-const _locale = sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS
 
 class Design extends Component {
   UNSAFE_componentWillMount() {
@@ -30,7 +28,7 @@
   render () {
     return (
       <div className="mk-hs-view">
-        <ConfigProvider locale={_locale}>
+        <ConfigProvider locale={zhCN}>
           <Sidemenu key="sidemenu"/>
           <Tabview key="tabview"/>
           <Header key="header"/>
diff --git a/src/views/systemfunc/sidemenu/config.jsx b/src/views/systemfunc/sidemenu/config.jsx
index 6726114..1e5c708 100644
--- a/src/views/systemfunc/sidemenu/config.jsx
+++ b/src/views/systemfunc/sidemenu/config.jsx
@@ -41,8 +41,8 @@
     MenuName: '鏍囩椤电鐞�',
   }, {
     src: '',
-    PageParam: {OpenType: 'newtab', Template: 'CommonTable'},
-    type: 'CommonTable',
+    PageParam: {OpenType: 'newtab', Template: 'BaseTable'},
+    type: 'BaseTable',
     MenuID: '1578900109100np8aqd0a77q3na46oas',
     MenuNo: 'sPrintTemplateM',
     MenuName: '鏍囩鎵撳嵃妯℃澘',
diff --git a/src/views/systemproc/index.jsx b/src/views/systemproc/index.jsx
new file mode 100644
index 0000000..7aab3b5
--- /dev/null
+++ b/src/views/systemproc/index.jsx
@@ -0,0 +1,24 @@
+import React, {Component} from 'react'
+import { ConfigProvider } from 'antd'
+import zhCN from 'antd/es/locale/zh_CN'
+
+// import Api from '@/api'
+// import Utils from '@/utils/utils.js' 
+import Header from '../systemfunc/header'
+import Proc from './proc'
+import './index.scss'
+
+class SysProc extends Component {
+  render () {
+    return (
+      <div className="mk-proc-view">
+        <ConfigProvider locale={zhCN}>
+          <Header key="header"/>
+          <Proc />
+        </ConfigProvider>
+      </div>
+    )
+  }
+}
+
+export default SysProc
\ No newline at end of file
diff --git a/src/views/systemproc/index.scss b/src/views/systemproc/index.scss
new file mode 100644
index 0000000..567e4ef
--- /dev/null
+++ b/src/views/systemproc/index.scss
@@ -0,0 +1,9 @@
+.mk-proc-view {
+  .sys-header-container {
+    color: rgba(255, 255, 255, 0.65);
+    background: #001529;
+    .title {
+      display: none;
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/views/systemproc/proc/index.jsx b/src/views/systemproc/proc/index.jsx
new file mode 100644
index 0000000..56bc51f
--- /dev/null
+++ b/src/views/systemproc/proc/index.jsx
@@ -0,0 +1,77 @@
+import React, {Component} from 'react'
+import { Input, notification } from 'antd'
+import moment from 'moment'
+
+import Utils from '@/utils/utils.js'
+import Api from '@/api'
+import CodeMirror from '@/templates/zshare/codemirror'
+import './index.scss'
+
+const { Search } = Input
+
+class ProcControl extends Component {
+  state = {
+    procName: '',
+    content: null,
+    loading: false
+  }
+
+  componentDidMount () {
+    
+  }
+
+  search = (value) => {
+    let proc = value.replace(/^(\s*)|(\s*)$/ig, '')
+
+    if (!proc) {
+      this.setState({content: '', procName: ''})
+      return
+    }
+
+    let _param = {
+      func: 's_get_userproc',
+      LText: proc
+    }
+
+    _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    _param.secretkey = Utils.encrypt(_param.LText, _param.timestamp)
+
+    this.setState({loading: true})
+    
+    Api.genericInterface(_param).then(res => {
+      if (!res.status) {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
+        })
+        this.setState({content: '', procName: '', loading: false})
+        return
+      }
+
+      this.setState({content: res.Ltext.replace(/mchr13k/ig, '\n'), procName: proc, loading: false})
+    })
+  }
+
+  render () {
+    const { loading, content } = this.state
+
+    return (
+      <div className="mk-proc-wrap">
+        <div className="control-wrap">
+          <div className="search-wrap">
+            <Search placeholder="璇疯緭鍏ュ瓨鍌ㄨ繃绋嬪悕绉�" disabled={loading} enterButton="纭畾" onSearch={this.search}/>
+          </div>
+          <div className="action-wrap">
+
+          </div>
+        </div>
+        <div className="edit-wrap">
+          <CodeMirror value={content} onChange={(val) => this.setState({content: val})}/>
+        </div>
+      </div>
+    )
+  }
+}
+
+export default ProcControl
\ No newline at end of file
diff --git a/src/views/systemproc/proc/index.scss b/src/views/systemproc/proc/index.scss
new file mode 100644
index 0000000..d8d5749
--- /dev/null
+++ b/src/views/systemproc/proc/index.scss
@@ -0,0 +1,35 @@
+.mk-proc-wrap {
+  position: relative;
+  padding: 65px 20px 0px;
+  
+  .control-wrap {
+    display: flex;
+
+    .search-wrap {
+      width: 300px;
+
+      .ant-btn[disabled] {
+        background-color: #1890ff!important;
+        border-color: #1890ff!important;
+        color: #ffffff!important;
+        opacity: 0.5;
+      }
+    }
+  }
+
+  .edit-wrap {
+    margin-top: 10px;
+    .CodeMirror {
+      height: calc(100vh - 130px);
+    }
+    .anticon-fullscreen {
+      display: none;
+    }
+    .anticon-format-painter {
+      top: 10px;
+    }
+    .CodeMirror-gutters {
+      background-color: #ffffff;
+    }
+  }
+}

--
Gitblit v1.8.0