Browse Source

接管,变更处理人实现

RaoMeng 5 years ago
parent
commit
44b4f1425c
30 changed files with 940 additions and 543 deletions
  1. 49 0
      uas-office-web/wxuasapproval/src/components/employeeItem/EmployeeItem.jsx
  2. 30 0
      uas-office-web/wxuasapproval/src/components/employeeItem/employee.css
  3. 250 233
      uas-office-web/wxuasapproval/src/components/pointsItem/PointsItem.jsx
  4. 246 234
      uas-office-web/wxuasapproval/src/components/tableItem/TableItem.jsx
  5. 44 21
      uas-office-web/wxuasapproval/src/configs/Constants.js
  6. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/application.png
  7. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/businessTrip.png
  8. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/dailyreport.png
  9. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/meet.png
  10. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/monthlyReport.png
  11. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/outplans.png
  12. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/overtime.png
  13. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/prodInOut_PurcCheckin.png
  14. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/prodInOut_sale.png
  15. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/purchase.png
  16. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/reimbursement.png
  17. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/reissueCard.png
  18. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/sale.png
  19. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/saleForecast.png
  20. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/sealApplication.png
  21. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/sendNotify.png
  22. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/vacation.png
  23. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/verifyApply.png
  24. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/visit.png
  25. BIN
      uas-office-web/wxuasapproval/src/images/approvalNew/weeklyreport.png
  26. BIN
      uas-office-web/wxuasapproval/src/images/endapproved.png
  27. 20 0
      uas-office-web/wxuasapproval/src/model/EmployeeModel.js
  28. 269 47
      uas-office-web/wxuasapproval/src/pages/approval/Approval.jsx
  29. 14 5
      uas-office-web/wxuasapproval/src/pages/approval/ApprovalHome.jsx
  30. 18 3
      uas-office-web/wxuasapproval/src/pages/approval/approval.css

+ 49 - 0
uas-office-web/wxuasapproval/src/components/employeeItem/EmployeeItem.jsx

@@ -0,0 +1,49 @@
+/**
+ * Created by RaoMeng on 2020/2/27
+ * Desc: 人员组织架构
+ */
+
+import React, { Component } from 'react'
+import './employee.css'
+
+export default class EmployeeItem extends Component {
+
+  constructor () {
+    super()
+
+    this.state = {}
+  }
+
+  componentDidMount () {
+  }
+
+  componentWillUnmount () {
+
+  }
+
+  render () {
+    const { employee } = this.props
+    return (
+      <div className='employee-item-root'>
+        <div className='employee-item-line'>
+          <div className='employee-item-caption'>姓名:</div>
+          <div className='employee-item-value'>
+            {employee.EM_NAME}
+          </div>
+        </div>
+        <div className='employee-item-line'>
+          <div className='employee-item-caption'>岗位:</div>
+          <div className='employee-item-value'>
+            {employee.EM_POSITION}
+          </div>
+        </div>
+        <div className='employee-item-line'>
+          <div className='employee-item-caption'>组织:</div>
+          <div className='employee-item-value'>
+            {employee.EM_DEFAULTORNAME}
+          </div>
+        </div>
+      </div>
+    )
+  }
+}

+ 30 - 0
uas-office-web/wxuasapproval/src/components/employeeItem/employee.css

@@ -0,0 +1,30 @@
+.employee-item-root {
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    box-sizing: border-box;
+}
+
+.employee-item-line {
+    width: 100%;
+    display: flex;
+    padding: 2px 2px 2px 6x;
+    font-family: PingFangSC-Regular;
+    font-size: 12px;
+    align-items: center;
+    letter-spacing: 0;
+    flex-direction: row;
+}
+
+.employee-item-caption {
+    width: 60px;
+    color: #999999;
+}
+
+.employee-item-value {
+    flex: 1;
+    color: #666666;
+    overflow: hidden;
+    word-wrap: break-word;
+    padding-right: 10px;
+}

+ 250 - 233
uas-office-web/wxuasapproval/src/components/pointsItem/PointsItem.jsx

@@ -1,233 +1,250 @@
-import React, {Component} from 'react'
-import './pointsItem.css'
-import {Icon, Modal} from 'semantic-ui-react'
-import {DatePicker} from 'antd'
-import locale from 'antd/lib/date-picker/locale/zh_CN'
-import {isObjEmpty} from "../../utils/common";
-import ApprovalBean from "../../model/ApprovalBean";
-import moment from 'moment'
-
-export default class PointsItem extends Component {
-
-    componentDidMount() {
-        let {mApproval} = this.state
-
-        this.setState({
-            mApproval: this.props.approval
-        })
-        let options = []
-        let datas = mApproval.datas
-        if (!isObjEmpty(datas)) {
-            for (let i = 0; i < datas.length; i++) {
-                options.push(datas[i].display)
-            }
-        }
-        this.setState({
-            selectList: options
-        })
-    }
-
-    componentWillReceiveProps() {
-        this.componentDidMount()
-    }
-
-    constructor() {
-        super()
-
-        this.state = {
-            modalOpen: false,
-            selectList: [],
-            inputValue: '',
-            mApproval: new ApprovalBean()
-        }
-    }
-
-    render() {
-        let valueItem = '';
-        const dateFormat = 'YYYY-MM-DD';
-        const {inputValue, selectList, mApproval} = this.state
-
-        if (mApproval.isSelect()) {
-            let placeHolder = ''
-            if (mApproval.mustInput) {
-                placeHolder = '请选择(必选)'
-            } else {
-                placeHolder = '请选择(非必选)'
-            }
-            if (mApproval.inputType() == 2) {
-                //日期选择框
-                let defaultDate = inputValue
-                if (!isObjEmpty(inputValue)) {
-                    defaultDate = ''
-                } else {
-                    defaultDate = moment(defaultDate, 'YYYY-MM-DD')
-                    if (!defaultDate._isValid) {
-                        defaultDate = ''
-                    }
-                }
-                valueItem = <div style={{display: 'flex'}}>
-                    <DatePicker locale={locale} className='date-input'
-                                defaultValue={defaultDate}
-                                format={dateFormat} size='small'
-                                placeholder={placeHolder}
-                                onChange={this.onDatePicker}
-                                suffixIcon=' '/>
-                    <Icon name='angle right' style={{margin: '0px', padding: '0px'}}/>
-                </div>
-            } else {
-                //弹框选择
-                const {modalOpen} = this.state
-                let modalItems = []
-                for (let i = 0; i < selectList.length; i++) {
-                    modalItems.push(<div className='selectItem' onClick={
-                        this.modalSelect.bind(this, i)
-                    }>{selectList[i]}</div>)
-                }
-                valueItem = <Modal trigger={<div style={{display: 'flex'}} onClick={this.onSelectClick}>
-                    <input placeholder={placeHolder} readOnly unselectable='on'
-                           className='value-input'
-                           value={inputValue}/>
-                    <Icon name='angle right' style={{margin: '0px', padding: '0px'}}/>
-                </div>}
-                                   open={modalOpen}
-                                   onClose={this.modalClose}
-                                   size='small'>
-                    <Modal.Content image>
-                        <Modal.Description>
-                            {modalItems}
-                        </Modal.Description>
-                    </Modal.Content>
-                </Modal>
-
-            }
-        } else {
-            let placeHolder = ''
-            if (mApproval.mustInput) {
-                placeHolder = '请输入(必填)'
-            } else {
-                placeHolder = '请输入(非必填)'
-            }
-            if (mApproval.dfType == 'N') {
-                //数字输入框
-                valueItem = <div style={{display: 'flex'}}>
-                    <input type='number' onKeyPress={this.numKeyPress}
-                           placeholder={placeHolder} className='value-input'
-                           value={inputValue} onChange={this.inputChange}/>
-                    <Icon name='angle right' style={{margin: '0px', padding: '0px', visibility: 'hidden'}}/>
-                </div>
-            } else {
-                //文本输入框
-                valueItem = <div style={{display: 'flex'}}>
-                    <input placeholder={placeHolder} className='value-input'
-                           value={inputValue} onChange={this.inputChange}/>
-                    <Icon name='angle right' style={{margin: '0px', padding: '0px', visibility: 'hidden'}}/>
-                </div>
-            }
-        }
-        /*switch (this.props.type) {
-            case '1':
-                //输入框
-                valueItem = <div style={{display: 'flex'}}>
-                    <input placeholder='请输入' className='value-input'
-                           value={inputValue} onChange={this.inputChange}/>
-                    <Icon name='angle right' style={{margin: '0px', padding: '0px', visibility: 'hidden'}}/>
-                </div>
-                break
-            case '2':
-                //日期选择框
-                valueItem = <div style={{display: 'flex'}}>
-                    <DatePicker locale={locale} className='date-input'
-                                defaultValue={inputValue}
-                                format={dateFormat} size='small'
-                                onChange={this.onDatePicker}
-                                suffixIcon=' '/>
-                    <Icon name='angle right' style={{margin: '0px', padding: '0px'}}/>
-                </div>
-                break
-            case '3':
-                //弹框选择
-                const {modalOpen, selectList} = this.state
-                let modalItems = []
-                for (let i = 0; i < selectList.length; i++) {
-                    modalItems.push(<div className='selectItem' onClick={
-                        this.modalSelect.bind(this, i)
-                    }>{selectList[i]}</div>)
-                }
-                valueItem = <Modal trigger={<div style={{display: 'flex'}} onClick={this.onSelectClick}>
-                    <input placeholder='请选择' readOnly unselectable='on'
-                           className='value-input'
-                           value={inputValue}/>
-                    <Icon name='angle right' style={{margin: '0px', padding: '0px'}}/>
-                </div>}
-                                   open={modalOpen}
-                                   onClose={this.modalClose}
-                                   size='small'>
-                    <Modal.Content image>
-                        <Modal.Description>
-                            {modalItems}
-                        </Modal.Description>
-                    </Modal.Content>
-                </Modal>
-
-                break
-            default:
-                valueItem = <div></div>
-                break
-        }*/
-
-        return <div style={{padding: '4px'}}>
-            <div className='points-parent'>
-                <div className='points-caption'>{mApproval.caption}</div>
-                <div className='points-value'>
-                    {valueItem}
-                </div>
-            </div>
-        </div>
-
-    }
-
-    numKeyPress = (event) => {
-        const invalidChars = ['-', '+', 'e', '.', 'E']
-        if (invalidChars.indexOf(event.key) !== -1) {
-            event.preventDefault()
-        }
-    }
-
-    modalClose = () => {
-        this.setState({
-            modalOpen: false
-        })
-    }
-
-    modalSelect = (index) => {
-        const {selectList} = this.state
-        this.setState({
-            inputValue: selectList[index],
-            modalOpen: false
-        }, () => {
-            this.props.valueListener(this.props.approval.type, this.props.index, this.state.inputValue, false)
-        })
-    }
-
-    inputChange = (e) => {
-        this.setState({
-            inputValue: e.target.value
-        }, () => {
-            this.props.valueListener(this.props.approval.type, this.props.index, this.state.inputValue, false)
-        })
-    }
-
-    onDatePicker = (e, dateString) => {
-        this.setState({
-            inputValue: dateString
-        }, () => {
-            this.props.valueListener(this.props.approval.type, this.props.index, this.state.inputValue, false)
-        })
-    }
-
-    onSelectClick = () => {
-        this.setState({
-            modalOpen: true
-        })
-    }
-}
+import React, { Component } from 'react'
+import './pointsItem.css'
+import { Icon, Modal } from 'semantic-ui-react'
+import { DatePicker } from 'antd'
+import locale from 'antd/lib/date-picker/locale/zh_CN'
+import { isObjEmpty } from '../../utils/common'
+import ApprovalBean from '../../model/ApprovalBean'
+import moment from 'moment'
+
+export default class PointsItem extends Component {
+
+  componentDidMount () {
+    let { mApproval } = this.state
+
+    this.setState({
+      mApproval: this.props.approval,
+      approvalStatus: this.props.approvalStatus,
+    })
+    let options = []
+    let datas = mApproval.datas
+    if (!isObjEmpty(datas)) {
+      for (let i = 0; i < datas.length; i++) {
+        options.push(datas[i].display)
+      }
+    }
+    this.setState({
+      selectList: options,
+      inputValue: mApproval.values,
+    })
+  }
+
+  componentWillReceiveProps () {
+    this.componentDidMount()
+  }
+
+  constructor () {
+    super()
+
+    this.state = {
+      modalOpen: false,
+      selectList: [],
+      inputValue: '',
+      mApproval: new ApprovalBean(),
+      approvalStatus: 0,
+    }
+  }
+
+  render () {
+    let valueItem = ''
+    const dateFormat = 'YYYY-MM-DD'
+    const { inputValue, selectList, mApproval, approvalStatus } = this.state
+
+    if (approvalStatus != 0) {
+      valueItem = <div className='value-input'>{mApproval.values}</div>
+    } else if (mApproval.isSelect()) {
+      let placeHolder = ''
+      if (mApproval.mustInput) {
+        placeHolder = '请选择(必选)'
+      } else {
+        placeHolder = '请选择(非必选)'
+      }
+      if (mApproval.inputType() == 2) {
+        //日期选择框
+        let defaultDate = inputValue
+        if (!isObjEmpty(inputValue)) {
+          defaultDate = ''
+        } else {
+          defaultDate = moment(defaultDate, 'YYYY-MM-DD')
+          if (!defaultDate._isValid) {
+            defaultDate = ''
+          }
+        }
+        valueItem = <div style={{ display: 'flex' }}>
+          <DatePicker locale={locale} className='date-input'
+                      defaultValue={defaultDate}
+                      format={dateFormat} size='small'
+                      placeholder={placeHolder}
+                      onChange={this.onDatePicker}
+                      suffixIcon=' '/>
+          <Icon name='angle right' style={{ margin: '0px', padding: '0px' }}/>
+        </div>
+      } else {
+        //弹框选择
+        const { modalOpen } = this.state
+        let modalItems = []
+        for (let i = 0; i < selectList.length; i++) {
+          modalItems.push(<div className='selectItem' onClick={
+            this.modalSelect.bind(this, i)
+          }>{selectList[i]}</div>)
+        }
+        valueItem = <Modal trigger={<div style={{ display: 'flex' }}
+                                         onClick={this.onSelectClick}>
+          <input placeholder={placeHolder} readOnly unselectable='on'
+                 className='value-input'
+                 value={inputValue}/>
+          <Icon name='angle right' style={{ margin: '0px', padding: '0px' }}/>
+        </div>}
+                           open={modalOpen}
+                           onClose={this.modalClose}
+                           size='small'>
+          <Modal.Content image>
+            <Modal.Description>
+              {modalItems}
+            </Modal.Description>
+          </Modal.Content>
+        </Modal>
+
+      }
+    } else {
+      let placeHolder = ''
+      if (mApproval.mustInput) {
+        placeHolder = '请输入(必填)'
+      } else {
+        placeHolder = '请输入(非必填)'
+      }
+      if (mApproval.dfType == 'N') {
+        //数字输入框
+        valueItem = <div style={{ display: 'flex' }}>
+          <input type='number' onKeyPress={this.numKeyPress}
+                 placeholder={placeHolder} className='value-input'
+                 value={inputValue} onChange={this.inputChange}/>
+          <Icon name='angle right' style={{
+            margin: '0px',
+            padding: '0px',
+            visibility: 'hidden',
+          }}/>
+        </div>
+      } else {
+        //文本输入框
+        valueItem = <div style={{ display: 'flex' }}>
+          <input placeholder={placeHolder} className='value-input'
+                 value={inputValue} onChange={this.inputChange}/>
+          <Icon name='angle right' style={{
+            margin: '0px',
+            padding: '0px',
+            visibility: 'hidden',
+          }}/>
+        </div>
+      }
+    }
+    /*switch (this.props.type) {
+        case '1':
+            //输入框
+            valueItem = <div style={{display: 'flex'}}>
+                <input placeholder='请输入' className='value-input'
+                       value={inputValue} onChange={this.inputChange}/>
+                <Icon name='angle right' style={{margin: '0px', padding: '0px', visibility: 'hidden'}}/>
+            </div>
+            break
+        case '2':
+            //日期选择框
+            valueItem = <div style={{display: 'flex'}}>
+                <DatePicker locale={locale} className='date-input'
+                            defaultValue={inputValue}
+                            format={dateFormat} size='small'
+                            onChange={this.onDatePicker}
+                            suffixIcon=' '/>
+                <Icon name='angle right' style={{margin: '0px', padding: '0px'}}/>
+            </div>
+            break
+        case '3':
+            //弹框选择
+            const {modalOpen, selectList} = this.state
+            let modalItems = []
+            for (let i = 0; i < selectList.length; i++) {
+                modalItems.push(<div className='selectItem' onClick={
+                    this.modalSelect.bind(this, i)
+                }>{selectList[i]}</div>)
+            }
+            valueItem = <Modal trigger={<div style={{display: 'flex'}} onClick={this.onSelectClick}>
+                <input placeholder='请选择' readOnly unselectable='on'
+                       className='value-input'
+                       value={inputValue}/>
+                <Icon name='angle right' style={{margin: '0px', padding: '0px'}}/>
+            </div>}
+                               open={modalOpen}
+                               onClose={this.modalClose}
+                               size='small'>
+                <Modal.Content image>
+                    <Modal.Description>
+                        {modalItems}
+                    </Modal.Description>
+                </Modal.Content>
+            </Modal>
+
+            break
+        default:
+            valueItem = <div></div>
+            break
+    }*/
+
+    return <div style={{ padding: '4px' }}>
+      <div className='points-parent'>
+        <div className='points-caption'>{mApproval.caption}</div>
+        <div className='points-value'>
+          {valueItem}
+        </div>
+      </div>
+    </div>
+
+  }
+
+  numKeyPress = (event) => {
+    const invalidChars = ['-', '+', 'e', '.', 'E']
+    if (invalidChars.indexOf(event.key) !== -1) {
+      event.preventDefault()
+    }
+  }
+
+  modalClose = () => {
+    this.setState({
+      modalOpen: false,
+    })
+  }
+
+  modalSelect = (index) => {
+    const { selectList } = this.state
+    this.setState({
+      inputValue: selectList[index],
+      modalOpen: false,
+    }, () => {
+      this.props.valueListener(this.props.approval.type, this.props.index,
+        this.state.inputValue, false)
+    })
+  }
+
+  inputChange = (e) => {
+    this.setState({
+      inputValue: e.target.value,
+    }, () => {
+      this.props.valueListener(this.props.approval.type, this.props.index,
+        this.state.inputValue, false)
+    })
+  }
+
+  onDatePicker = (e, dateString) => {
+    this.setState({
+      inputValue: dateString,
+    }, () => {
+      this.props.valueListener(this.props.approval.type, this.props.index,
+        this.state.inputValue, false)
+    })
+  }
+
+  onSelectClick = () => {
+    this.setState({
+      modalOpen: true,
+    })
+  }
+}

+ 246 - 234
uas-office-web/wxuasapproval/src/components/tableItem/TableItem.jsx

@@ -1,234 +1,246 @@
-import React, {Component} from 'react'
-import './tableItem.css'
-import {Input, Modal} from 'semantic-ui-react'
-import {DatePicker, Radio} from 'antd'
-import locale from 'antd/lib/date-picker/locale/zh_CN'
-import {isObjEmpty} from "../../utils/common";
-import ApprovalBean from "../../model/ApprovalBean";
-import moment from 'moment'
-
-const RadioGroup = Radio.Group;
-
-export default class TableItem extends Component {
-
-    componentDidMount() {
-        let {mApproval} = this.state
-
-        this.setState({
-            mApproval: this.props.approval
-        })
-        let options = []
-        let datas = mApproval.datas
-        if (!isObjEmpty(datas)) {
-            for (let i = 0; i < datas.length; i++) {
-                options.push(datas[i].display)
-            }
-        }
-        this.setState({
-            selectList: options,
-            inputValue: mApproval.values
-        })
-        let values = mApproval.values
-        if (values == ApprovalBean.VALUES_YES
-            || values == '0') {
-            this.setState({
-                radioValue: 1
-            })
-        } else if (values == ApprovalBean.VALUES_NO) {
-            this.setState({
-                radioValue: 2
-            })
-        }
-    }
-
-    componentWillReceiveProps() {
-        this.componentDidMount()
-    }
-
-    constructor() {
-        super()
-
-        this.state = {
-            modalOpen: false,
-            selectList: [],
-            inputValue: '',
-            radioValue: 1,
-            mApproval: new ApprovalBean()
-        }
-    }
-
-    render() {
-        let valueItem = '';
-        const dateFormat = 'YYYY-MM-DD';
-        const {inputValue, radioValue, selectList, mApproval} = this.state
-
-        if (mApproval.neerInput) {
-            let placeHolder = ''
-            if (mApproval.mustInput) {
-                if (mApproval.inputType() == 2 || mApproval.inputType() == 3 || mApproval.inputType() == 4) {
-                    placeHolder = '请选择(必选)'
-                } else {
-                    placeHolder = '请输入(必填)'
-                }
-            } else {
-                if (mApproval.inputType() == 2 || mApproval.inputType() == 3 || mApproval.inputType() == 4) {
-                    placeHolder = '请选择(非必选)'
-                } else {
-                    placeHolder = '请输入(非必填)'
-                }
-            }
-            switch (mApproval.inputType()) {
-                case 0:
-                    //字符输入
-                    valueItem = <Input className='value-input' placeholder={placeHolder}
-                                       value={inputValue} onChange={this.inputChange}/>
-                    break
-                case 1:
-                    //数字输入
-                    valueItem = <Input type='number' onKeyPress={this.numKeyPress}
-                                       className='value-input' placeholder={placeHolder}
-                                       value={inputValue} onChange={this.inputChange}/>
-                    break
-                case 2:
-                    //日期选择框
-                    let defaultDate = inputValue
-                    if (!isObjEmpty(inputValue)) {
-                        defaultDate = ''
-                    } else {
-                        defaultDate = moment(defaultDate, 'YYYY-MM-DD')
-                        if (!defaultDate._isValid) {
-                            defaultDate = ''
-                        }
-                    }
-                    valueItem = <DatePicker locale={locale} className='value-input'
-                                            defaultValue={defaultDate}
-                                            placeholder={placeHolder}
-                                            format={dateFormat} size='small'
-                                            onChange={this.onDatePicker}/>
-                    break
-                case 3:
-                    //弹框选择
-                    const {modalOpen} = this.state
-                    let modalItems = []
-                    for (let i = 0; i < selectList.length; i++) {
-                        modalItems.push(<div className='selectItem' onClick={
-                            this.modalSelect.bind(this, i)
-                        }>{selectList[i]}</div>)
-                    }
-                    valueItem = <Modal trigger={<Input className='value-input'
-                                                       readOnly unselectable='on'
-                                                       placeholder={placeHolder}
-                                                       onClick={this.onSelectClick}
-                                                       value={inputValue}/>}
-                                       open={modalOpen}
-                                       onClose={this.modalClose}
-                                       size='small'>
-                        <Modal.Content image>
-                            <Modal.Description>
-                                {modalItems}
-                            </Modal.Description>
-                        </Modal.Content>
-                    </Modal>
-
-                    break
-                case 4:
-                    //dbfind
-                    /*valueItem = <Input className='value-input'
-                                       readOnly unselectable='on'
-                                       placeholder={placeHolder}
-                                       onClick={this.onDbfindClick}
-                                       value={inputValue}/>*/
-                    valueItem = <div>{mApproval.values}</div>
-                    break
-                case 5:
-                    valueItem = <RadioGroup onChange={this.onRadioChange} value={radioValue}>
-                        <Radio value={1}>是</Radio>
-                        <Radio value={2}>否</Radio>
-                    </RadioGroup>
-                    break
-                default:
-                    valueItem = <div></div>
-                    break
-            }
-        } else {
-            let oldValues = mApproval.oldValues
-            if (!isObjEmpty(oldValues)) {
-                valueItem = <div className='oldNewLayout'>
-                    <span style={{textDecoration: 'line-through'}}>{oldValues}</span>
-                    <span style={{color: '#f10813'}}>{mApproval.values}</span>
-                </div>
-            } else {
-                valueItem = <div>{mApproval.values}</div>
-            }
-        }
-
-        return <div className='table-parent'>
-            <div className='table-caption'>{mApproval.caption}</div>
-            <div className='table-value'>
-                {valueItem}
-            </div>
-        </div>
-    }
-
-    onRadioChange = (e) => {
-        let value = e.target.value
-        this.setState({
-            radioValue: value
-        })
-        if (value == 1) {
-            this.props.valueListener(this.props.approval.type, this.props.index, ApprovalBean.VALUES_YES, false)
-        } else {
-            this.props.valueListener(this.props.approval.type, this.props.index, ApprovalBean.VALUES_NO, false)
-        }
-    }
-
-    numKeyPress = (event) => {
-        const invalidChars = ['-', '+', 'e', '.', 'E']
-        if (invalidChars.indexOf(event.key) !== -1) {
-            event.preventDefault()
-        }
-    }
-
-    modalClose = () => {
-        this.setState({
-            modalOpen: false
-        })
-    }
-
-    modalSelect = (index) => {
-        const {selectList} = this.state
-        this.setState({
-            inputValue: selectList[index],
-            modalOpen: false
-        }, () => {
-            this.props.valueListener(this.props.approval.type, this.props.index, this.state.inputValue, false)
-        })
-    }
-
-    inputChange = (e) => {
-        this.setState({
-            inputValue: e.target.value
-        }, () => {
-            this.props.valueListener(this.props.approval.type, this.props.index, this.state.inputValue, false)
-        })
-
-    }
-
-    onDatePicker = (e, dateString) => {
-        this.setState({
-            inputValue: dateString
-        }, () => {
-            this.props.valueListener(this.props.approval.type, this.props.index, this.state.inputValue, false)
-        })
-    }
-
-    onSelectClick = () => {
-        this.setState({
-            modalOpen: true
-        })
-    }
-
-    onDbfindClick = () => {
-        console.log('dbfind跳页面选择')
-    }
-}
+import React, { Component } from 'react'
+import './tableItem.css'
+import { Input, Modal } from 'semantic-ui-react'
+import { DatePicker, Radio } from 'antd'
+import locale from 'antd/lib/date-picker/locale/zh_CN'
+import { isObjEmpty } from '../../utils/common'
+import ApprovalBean from '../../model/ApprovalBean'
+import moment from 'moment'
+
+const RadioGroup = Radio.Group
+
+export default class TableItem extends Component {
+
+  componentDidMount () {
+    let { mApproval } = this.state
+
+    this.setState({
+      mApproval: this.props.approval,
+      approvalStatus: this.props.approvalStatus,
+    })
+    let options = []
+    let datas = mApproval.datas
+    if (!isObjEmpty(datas)) {
+      for (let i = 0; i < datas.length; i++) {
+        options.push(datas[i].display)
+      }
+    }
+    this.setState({
+      selectList: options,
+      inputValue: mApproval.values,
+    })
+    let values = mApproval.values
+    if (values == ApprovalBean.VALUES_YES
+      || values == '0') {
+      this.setState({
+        radioValue: 1,
+      })
+    } else if (values == ApprovalBean.VALUES_NO) {
+      this.setState({
+        radioValue: 2,
+      })
+    }
+  }
+
+  componentWillReceiveProps () {
+    this.componentDidMount()
+  }
+
+  constructor () {
+    super()
+
+    this.state = {
+      modalOpen: false,
+      selectList: [],
+      inputValue: '',
+      radioValue: 1,
+      mApproval: new ApprovalBean(),
+      approvalStatus: 0,//审批状态
+    }
+  }
+
+  render () {
+    let valueItem = ''
+    const dateFormat = 'YYYY-MM-DD'
+    const { inputValue, radioValue, selectList, mApproval, approvalStatus } = this.state
+
+    if (approvalStatus != 0) {
+      valueItem = <div>{mApproval.values}</div>
+    } else if (mApproval.neerInput) {
+      let placeHolder = ''
+      if (mApproval.mustInput) {
+        if (mApproval.inputType() == 2 || mApproval.inputType() == 3 ||
+          mApproval.inputType() == 4) {
+          placeHolder = '请选择(必选)'
+        } else {
+          placeHolder = '请输入(必填)'
+        }
+      } else {
+        if (mApproval.inputType() == 2 || mApproval.inputType() == 3 ||
+          mApproval.inputType() == 4) {
+          placeHolder = '请选择(非必选)'
+        } else {
+          placeHolder = '请输入(非必填)'
+        }
+      }
+      switch (mApproval.inputType()) {
+        case 0:
+          //字符输入
+          valueItem = <Input className='value-input' placeholder={placeHolder}
+                             value={inputValue} onChange={this.inputChange}/>
+          break
+        case 1:
+          //数字输入
+          valueItem = <Input type='number' onKeyPress={this.numKeyPress}
+                             className='value-input' placeholder={placeHolder}
+                             value={inputValue} onChange={this.inputChange}/>
+          break
+        case 2:
+          //日期选择框
+          let defaultDate = inputValue
+          if (!isObjEmpty(inputValue)) {
+            defaultDate = ''
+          } else {
+            defaultDate = moment(defaultDate, 'YYYY-MM-DD')
+            if (!defaultDate._isValid) {
+              defaultDate = ''
+            }
+          }
+          valueItem = <DatePicker locale={locale} className='value-input'
+                                  defaultValue={defaultDate}
+                                  placeholder={placeHolder}
+                                  format={dateFormat} size='small'
+                                  onChange={this.onDatePicker}/>
+          break
+        case 3:
+          //弹框选择
+          const { modalOpen } = this.state
+          let modalItems = []
+          for (let i = 0; i < selectList.length; i++) {
+            modalItems.push(<div className='selectItem' onClick={
+              this.modalSelect.bind(this, i)
+            }>{selectList[i]}</div>)
+          }
+          valueItem = <Modal trigger={<Input className='value-input'
+                                             readOnly unselectable='on'
+                                             placeholder={placeHolder}
+                                             onClick={this.onSelectClick}
+                                             value={inputValue}/>}
+                             open={modalOpen}
+                             onClose={this.modalClose}
+                             size='small'>
+            <Modal.Content image>
+              <Modal.Description>
+                {modalItems}
+              </Modal.Description>
+            </Modal.Content>
+          </Modal>
+
+          break
+        case 4:
+          //dbfind
+          /*valueItem = <Input className='value-input'
+                             readOnly unselectable='on'
+                             placeholder={placeHolder}
+                             onClick={this.onDbfindClick}
+                             value={inputValue}/>*/
+          valueItem = <div>{mApproval.values}</div>
+          break
+        case 5:
+          valueItem =
+            <RadioGroup onChange={this.onRadioChange} value={radioValue}>
+              <Radio value={1}>是</Radio>
+              <Radio value={2}>否</Radio>
+            </RadioGroup>
+          break
+        default:
+          valueItem = <div></div>
+          break
+      }
+    } else {
+      let oldValues = mApproval.oldValues
+      if (!isObjEmpty(oldValues)) {
+        valueItem = <div className='oldNewLayout'>
+          <span style={{ textDecoration: 'line-through' }}>{oldValues}</span>
+          <span style={{ color: '#f10813' }}>{mApproval.values}</span>
+        </div>
+      } else {
+        valueItem = <div>{mApproval.values}</div>
+      }
+    }
+
+    return <div className='table-parent'>
+      <div className='table-caption'>{mApproval.caption}</div>
+      <div className='table-value'>
+        {valueItem}
+      </div>
+    </div>
+  }
+
+  onRadioChange = (e) => {
+    let value = e.target.value
+    this.setState({
+      radioValue: value,
+    })
+    if (value == 1) {
+      this.props.valueListener(this.props.approval.type, this.props.index,
+        ApprovalBean.VALUES_YES, false)
+    } else {
+      this.props.valueListener(this.props.approval.type, this.props.index,
+        ApprovalBean.VALUES_NO, false)
+    }
+  }
+
+  numKeyPress = (event) => {
+    const invalidChars = ['-', '+', 'e', '.', 'E']
+    if (invalidChars.indexOf(event.key) !== -1) {
+      event.preventDefault()
+    }
+  }
+
+  modalClose = () => {
+    this.setState({
+      modalOpen: false,
+    })
+  }
+
+  modalSelect = (index) => {
+    const { selectList } = this.state
+    this.setState({
+      inputValue: selectList[index],
+      modalOpen: false,
+    }, () => {
+      this.props.valueListener(this.props.approval.type, this.props.index,
+        this.state.inputValue, false)
+    })
+  }
+
+  inputChange = (e) => {
+    this.setState({
+      inputValue: e.target.value,
+    }, () => {
+      this.props.valueListener(this.props.approval.type, this.props.index,
+        this.state.inputValue, false)
+    })
+
+  }
+
+  onDatePicker = (e, dateString) => {
+    this.setState({
+      inputValue: dateString,
+    }, () => {
+      this.props.valueListener(this.props.approval.type, this.props.index,
+        this.state.inputValue, false)
+    })
+  }
+
+  onSelectClick = () => {
+    this.setState({
+      modalOpen: true,
+    })
+  }
+
+  onDbfindClick = () => {
+    console.log('dbfind跳页面选择')
+  }
+}

+ 44 - 21
uas-office-web/wxuasapproval/src/configs/Constants.js

@@ -1,21 +1,44 @@
-import businessTrip from '@/images/approvalNew/businessTrip.png'
-import dailyreport from '@/images/approvalNew/dailyreport.png'
-import monthlyReport from '@/images/approvalNew/monthlyReport.png'
-import outplans from '@/images/approvalNew/outplans.png'
-import overtime from '@/images/approvalNew/overtime.png'
-import reissueCard from '@/images/approvalNew/reissueCard.png'
-import vacation from '@/images/approvalNew/vacation.png'
-import visit from '@/images/approvalNew/visit.png'
-import weeklyreport from '@/images/approvalNew/weeklyreport.png'
-
-export const LocalImgs = {
-  'businessTrip.png': businessTrip,
-  'dailyreport.png': dailyreport,
-  'monthlyReport.png': monthlyReport,
-  'outplans.png': outplans,
-  'overtime.png': overtime,
-  'reissueCard.png': reissueCard,
-  'vacation.png': vacation,
-  'visit.png': visit,
-  'weeklyreport.png': weeklyreport,
-}
+import businessTrip from '@/images/approvalNew/businessTrip.png'
+import dailyreport from '@/images/approvalNew/dailyreport.png'
+import monthlyReport from '@/images/approvalNew/monthlyReport.png'
+import outplans from '@/images/approvalNew/outplans.png'
+import overtime from '@/images/approvalNew/overtime.png'
+import reissueCard from '@/images/approvalNew/reissueCard.png'
+import vacation from '@/images/approvalNew/vacation.png'
+import visit from '@/images/approvalNew/visit.png'
+import weeklyreport from '@/images/approvalNew/weeklyreport.png'
+import application from '@/images/approvalNew/application.png'
+import meet from '@/images/approvalNew/meet.png'
+import prodInOut_PurcCheckin
+  from '@/images/approvalNew/prodInOut_PurcCheckin.png'
+import prodInOut_sale from '@/images/approvalNew/prodInOut_sale.png'
+import purchase from '@/images/approvalNew/purchase.png'
+import reimbursement from '@/images/approvalNew/reimbursement.png'
+import sale from '@/images/approvalNew/sale.png'
+import saleForecast from '@/images/approvalNew/saleForecast.png'
+import sealApplication from '@/images/approvalNew/sealApplication.png'
+import sendNotify from '@/images/approvalNew/sendNotify.png'
+import verifyApply from '@/images/approvalNew/verifyApply.png'
+
+export const LocalImgs = {
+  'businessTrip.png': businessTrip,
+  'dailyreport.png': dailyreport,
+  'monthlyReport.png': monthlyReport,
+  'outplans.png': outplans,
+  'overtime.png': overtime,
+  'reissueCard.png': reissueCard,
+  'vacation.png': vacation,
+  'visit.png': visit,
+  'application.png': application,
+  'meet.png': meet,
+  'weeklyreport.png': weeklyreport,
+  'prodInOut_PurcCheckin.png': prodInOut_PurcCheckin,
+  'prodInOut_sale.png': prodInOut_sale,
+  'purchase.png': purchase,
+  'reimbursement.png': reimbursement,
+  'sale.png': sale,
+  'saleForecast.png': saleForecast,
+  'sealApplication.png': sealApplication,
+  'sendNotify.png': sendNotify,
+  'verifyApply.png': verifyApply,
+}

BIN
uas-office-web/wxuasapproval/src/images/approvalNew/application.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/businessTrip.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/dailyreport.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/meet.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/monthlyReport.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/outplans.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/overtime.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/prodInOut_PurcCheckin.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/prodInOut_sale.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/purchase.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/reimbursement.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/reissueCard.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/sale.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/saleForecast.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/sealApplication.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/sendNotify.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/vacation.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/verifyApply.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/visit.png


BIN
uas-office-web/wxuasapproval/src/images/approvalNew/weeklyreport.png


BIN
uas-office-web/wxuasapproval/src/images/endapproved.png


+ 20 - 0
uas-office-web/wxuasapproval/src/model/EmployeeModel.js

@@ -0,0 +1,20 @@
+/**
+ * Created by RaoMeng on 2020/2/27
+ * Desc: 组织架构
+ */
+
+export default function EmployeeModel () {
+  this.EM_ID = 0
+  this.Em_IMID = ''
+  this.EM_CODE = ''
+  this.EM_NAME = ''
+  this.EM_POSITION = ''
+  this.EM_DEFAULTORNAME = ''
+  this.EM_DEPART = ''
+  this.EM_MOBILE = ''
+  this.EM_EMAIL = ''
+  this.EM_UU = ''
+  this.COMPANY = ''
+  this.WHICHSYS = ''
+  this.Em_defaultorid = ''
+}

+ 269 - 47
uas-office-web/wxuasapproval/src/pages/approval/Approval.jsx

@@ -1,26 +1,35 @@
 import React, { Component } from 'react'
 import './approval.css'
 import '../../index.css'
-import { TextArea, Icon, Loader } from 'semantic-ui-react'
+import { Icon, TextArea } from 'semantic-ui-react'
 import PointsItem from '@/components/pointsItem/PointsItem'
 import TableItem from '@/components/tableItem/TableItem'
 import ApprovalNode from '@/components/approvalNode/ApprovalNode'
-import { Popover, Spin, Avatar, message } from 'antd'
+import { Avatar, message, Popover, Spin } from 'antd'
 import ApprovalBean from '../../model/ApprovalBean'
 import ApprovalRecordBean from '@/model/ApprovalRecordBean'
-import { Toast } from 'antd-mobile'
-import { fetchPost, fetchGet } from '../../utils/fetchRequest'
+import { ListView, Modal, SearchBar, Toast, List } from 'antd-mobile'
+import { fetchGet, fetchPost } from '../../utils/fetchRequest'
 import { connect } from 'react-redux'
 import {
-  isObjNull, strContain, isObjEmpty, isEmptyObject, getStrValue,
-  getIntValue, getArrayValue, getObjValue, getBracketStr, MapToJson,
-  getParenthesesStr, getTimeValue, getSessionId,
+  getArrayValue,
+  getBracketStr,
+  getIntValue,
+  getObjValue,
+  getParenthesesStr,
+  getStrValue,
+  getTimeValue,
+  isEmptyObject,
+  isObjEmpty,
+  isObjNull,
+  MapToJson,
+  strContain,
 } from '@/utils/common'
-
 // import FileViewer from 'react-file-viewer'
 // import Cookies from 'js-cookie'
 import EnclosureItem from '../../components/enclosureItem/EnclosureItem'
 import { saveReceiveState } from '../../redux/actions/homeState'
+import EmployeeItem from '../../components/employeeItem/EmployeeItem'
 
 //==============================================================================================
 let mMaster, mSessionId, mEmcode, mNodeId, mType, mCachePoints
@@ -39,6 +48,8 @@ let mEnclosureList = []//附件
 let mNodeList = []//审批节点
 let mPointsList = []//要点
 
+let mEmployeeList = []//组织架构
+
 let mBaseUrl
 
 class Approval extends Component {
@@ -61,13 +72,15 @@ class Approval extends Component {
       finished: false,
       finishSuccess: true,
       finishMsg: '审批流程结束',
+
       disagreeAble: true,//不同意按钮是否显示
       agreeAble: true,//同意按钮是否显示
       takeoverAble: false,//接管按钮是否显示
+      changeAble: false,//变更处理人按钮是否显示
       optionAble: false,//底部审批操作布局是否显示
       nodesTagAble: false,//审批节点切换是否显示
 
-      approvalStatus: 0,
+      approvalStatus: 0,//审批状态 0:待审批;1:审批通过;2:审批不通过:3:异常结束
 
       titleApproval: {
         caption: '',
@@ -79,6 +92,11 @@ class Approval extends Component {
       enclosureList: [],//附件
       nodeList: [],//审批节点
       pointsList: [],//要点
+
+      changeModalOpen: false,//变更处理人弹框是否显示
+      changeDataSource: new ListView.DataSource({
+        rowHasChanged: (row1, row2) => row1 !== row2,
+      }),//变更处理人列表
     }
   }
 
@@ -103,7 +121,7 @@ class Approval extends Component {
         mNodeId = paramsJson.nodeId
         mType = paramsJson.type
         this.setState({
-          approvalStatus: (mType === undefined || mType == 0) ? 0 : 3,
+          approvalStatus: (mType === undefined || mType == 0) ? 0 : 4,
         })
 
         // mSessionId = window.sessionId
@@ -144,6 +162,7 @@ class Approval extends Component {
     mEnclosureList = []//附件
     mNodeList = []//审批节点
     mPointsList = []//要点
+    mEmployeeList = []
   }
 
   getSessionId () {
@@ -174,6 +193,7 @@ class Approval extends Component {
       disagreeAble,//不同意按钮是否显示
       agreeAble,//同意按钮是否显示
       takeoverAble,//接管按钮是否显示
+      changeAble,//变更处理人按钮是否显示
       optionAble,
       titleApproval,
       nodesTagAble,
@@ -185,6 +205,9 @@ class Approval extends Component {
       nodeList,//审批节点
       pointsList,//要点
       approvalStatus,//审批状态
+
+      changeModalOpen,//变更处理人弹框是否显示
+      changeDataSource,//变更处理人列表
     } = this.state
 
     //审批常用语
@@ -200,6 +223,7 @@ class Approval extends Component {
     for (let i = 0; i < mainList.length; i++) {
       tableItems.push(<TableItem key={'main' + i} approval={mainList[i]}
                                  index={i}
+                                 approvalStatus={approvalStatus}
                                  valueListener={this.childStateListener.bind(
                                    this)}></TableItem>)
     }
@@ -216,6 +240,7 @@ class Approval extends Component {
         } else {
           tableItems.push(<TableItem key={'detail' + i} approval={detailList[i]}
                                      index={i}
+                                     approvalStatus={approvalStatus}
                                      valueListener={this.childStateListener.bind(
                                        this)}></TableItem>)
         }
@@ -234,6 +259,7 @@ class Approval extends Component {
         } else {
           tableItems.push(<TableItem key={'setup' + i}
                                      approval={setuptasList[i]} index={i}
+                                     approvalStatus={approvalStatus}
                                      valueListener={this.childStateListener.bind(
                                        this)}></TableItem>)
         }
@@ -269,6 +295,7 @@ class Approval extends Component {
       } else {
         pointItems.push(<PointsItem key={'points' + i} approval={pointsList[i]}
                                     index={i}
+                                    approvalStatus={approvalStatus}
                                     valueListener={this.childStateListener.bind(
                                       this)}></PointsItem>)
       }
@@ -334,27 +361,26 @@ class Approval extends Component {
             tip='数据请求中...'>
       </Spin>
 
-      <div className='root'
+      <div className='approval-detail-root'
            style={{ display: finished ? 'none' : (loading ? 'none' : 'flex') }}>
         <div className='content'>
-          {/*<FileViewer
-            fileType={'png'}
-            filePath={'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png'}
-            // onError={}
-            // errorComponent={}
-            // unsupportComponent={}
-          />*/}
-
           <div className='headerLayout'>
             <Avatar size={42} src={require('@/images/default_header.png')}/>
             <div className='headerText'>{titleApproval.caption}</div>
             {
-              approvalStatus === 0 ? null : approvalStatus == 1 ? <Avatar
-                size={54} style={{ marginRight: 10 }}
-                src={require('@/images/approved.png')}/> : approvalStatus == 2 ?
+              approvalStatus === 0 ? null
+                : approvalStatus == 1 ?
                 <Avatar
                   size={54} style={{ marginRight: 10 }}
-                  src={require('@/images/unapproved.png')}/> : null
+                  src={require('@/images/approved.png')}/>
+                : approvalStatus == 2 ?
+                  <Avatar
+                    size={54} style={{ marginRight: 10 }}
+                    src={require('@/images/unapproved.png')}/>
+                  : approvalStatus == 3 ?
+                    <Avatar
+                      size={54} style={{ marginRight: 10 }}
+                      src={require('@/images/endapproved.png')}/> : null
             }
           </div>
           <div className='gray-line' style={{ height: '1px' }}></div>
@@ -370,7 +396,6 @@ class Approval extends Component {
           <div className='gray-line' style={{ height: '6px' }}></div>
           {approvalPoint}
         </div>
-
         {
           approvalStatus === 0 &&
           <div className={optionAble ? 'bottomMenu' : 'displayNone'}>
@@ -381,16 +406,6 @@ class Approval extends Component {
                         value={approvalContent}
                         placeholder='请输入审批意见...'
                         onChange={this.approvalEdit}/>
-              {/*<Modal trigger={<div className='fastWords' onClick={this.fastClick}>常</div>}
-                                   open={fastModalOpen}
-                                   onClose={this.fastModalClose}
-                                   size='small'>
-                                <Modal.Content image>
-                                    <Modal.Description>
-                                        {fastItems}
-                                    </Modal.Description>
-                                </Modal.Content>
-                            </Modal>*/}
               <Popover title='常用语' trigger='click'
                        content={fastItems}
                        visible={fastModalOpen}
@@ -401,8 +416,6 @@ class Approval extends Component {
             <div className='gray-line' style={{ height: '6px' }}></div>
             <div className='menuParent'>
               <div className={takeoverAble ? 'menuItem' : 'displayNone'}
-                // 接管逻辑暂未实现
-                // <div className={takeoverAble ? 'displayNone' : 'displayNone'}
                    onClick={this.approvalTakeover}>接管
               </div>
               <div className={takeoverAble ? '' : 'displayNone'}
@@ -412,6 +425,20 @@ class Approval extends Component {
                      height: '24px',
                    }}></div>
 
+              <div className={(approvalStatus === 0 && !takeoverAble)
+                ? 'menuItem'
+                : 'displayNone'}
+                   onClick={this.approvalChange}>变更
+              </div>
+              <div className={(approvalStatus === 0 && !takeoverAble)
+                ? ''
+                : 'displayNone'}
+                   style={{
+                     background: '#cccccc',
+                     width: '1px',
+                     height: '24px',
+                   }}></div>
+
               <div className={agreeAble ? 'menuItem' : 'displayNone'}
                    onClick={this.approvalAgree}>同意
               </div>
@@ -428,10 +455,103 @@ class Approval extends Component {
             </div>
           </div>
         }
+        {/*变更处理人弹出框*/}
+        {this.getChangeModal()}
       </div>
     </div>
   }
 
+  getChangeModal () {
+    const {
+      changeModalOpen,//变更处理人弹框是否显示
+      changeDataSource,//变更处理人列表
+    } = this.state
+    return <Modal visible={changeModalOpen}
+                  animationType={'slide-up'}
+                  onClose={() => {
+                    this.setState({
+                      changeModalOpen: false,
+                    })
+                  }}
+                  style={{
+                    height: '80vh',
+                  }}
+                  title={'变更处理人'}
+                  popup
+    >
+      <SearchBar
+        placeholder={'搜索人员'}
+        maxLength={12}
+        onChange={value => {
+          if (isObjEmpty(value)) {
+            this.setState({
+              changeDataSource: changeDataSource.cloneWithRows(
+                mEmployeeList),
+            })
+          } else {
+            let searchList = []
+            if (!isObjEmpty(mEmployeeList)) {
+              mEmployeeList.forEach(item => {
+                if (!isObjNull(item)
+                  && (
+                    strContain(item.EM_CODE, value)
+                    || strContain(item.EM_NAME, value)
+                    || strContain(item.EM_POSITION, value)
+                    || strContain(item.EM_DEFAULTORNAME, value)
+                    || strContain(item.EM_DEPART, value)
+                    || strContain(item.EM_MOBILE, value)
+                    || strContain(item.EM_EMAIL, value)
+                    || strContain(item.COMPANY, value)
+                  )) {
+                  searchList.push(item)
+                }
+              })
+            }
+            this.setState({
+              changeDataSource: changeDataSource.cloneWithRows(
+                searchList),
+            })
+          }
+        }}
+        onClear={value => {
+          this.setState({
+            changeDataSource: changeDataSource.cloneWithRows(
+              mEmployeeList),
+          })
+        }}
+        onCancel={() => {
+          this.setState({
+            changeDataSource: changeDataSource.cloneWithRows(
+              mEmployeeList),
+          })
+        }}
+      />
+      <ListView
+        dataSource={this.state.changeDataSource}
+        renderRow={(rowData, sectionID, rowID) => {
+          // console.log('raomeng', rowData)
+          // console.log('raomeng', sectionID)
+          // console.log('raomeng', rowID)
+          return <List.Item
+            key={rowID}
+            wrap
+            onClick={this.onChangeSelect.bind(this,
+              rowData)}>
+            <EmployeeItem employee={rowData}/>
+          </List.Item>
+        }}
+        style={{
+          height: '80vh',
+          overflow: 'auto',
+        }}
+        pageSize={4}
+        onScroll={() => {}}
+        scrollRenderAheadDistance={500}
+        onEndReachedThreshold={10}
+      />
+    </Modal>
+  }
+
   initPageState = () => {
     this.initData()
     this.setState({
@@ -445,6 +565,7 @@ class Approval extends Component {
         disagreeAble: true,//不同意按钮是否显示
         agreeAble: true,//同意按钮是否显示
         takeoverAble: false,//接管按钮是否显示
+        changeAble: false,//变更处理人按钮是否显示
         optionAble: false,//底部审批操作布局是否显示
         nodesTagAble: false,//审批节点切换是否显示
 
@@ -458,6 +579,11 @@ class Approval extends Component {
         enclosureList: [],//附件
         nodeList: [],//审批节点
         pointsList: [],//要点
+
+        changeModalOpen: false,//变更处理人弹框是否显示
+        changeDataSource: new ListView.DataSource({
+          rowHasChanged: (row1, row2) => row1 !== row2,
+        }),//变更处理人列表
       },
     )
   }
@@ -583,6 +709,7 @@ class Approval extends Component {
           })
           return
         }
+        mEmcode = infoObject.dealmancode
         mApprovalRecord.processInstanceId = infoObject.InstanceId
         mApprovalRecord.isForknode = (getIntValue(infoObject, 'forknode') ===
           0)
@@ -591,7 +718,7 @@ class Approval extends Component {
           let recordName = getStrValue(currentnode, 'jp_launcherName')
           let jp_nodeDealMan = getStrValue(currentnode, 'jp_nodeDealMan')
           mApprovalRecord.currentNodeMan = jp_nodeDealMan
-          if (isObjNull(jp_nodeDealMan)) {
+          if (isObjEmpty(jp_nodeDealMan)) {
             this.setState({
               disagreeAble: false,
               agreeAble: false,
@@ -627,7 +754,7 @@ class Approval extends Component {
               })
             } else {
               this.setState({
-                approvalStatus: (mType === undefined || mType == 0) ? 0 : 3,
+                approvalStatus: (mType === undefined || mType == 0) ? 0 : 4,
               })
             }
           }
@@ -1624,11 +1751,42 @@ class Approval extends Component {
     })
   }
 
+  /**
+   * 变更处理人
+   */
+  approvalChange = () => {
+    if (!isObjEmpty(mEmployeeList)) {
+      this.setState({
+        changeModalOpen: true,
+        changeDataSource: this.state.changeDataSource.cloneWithRows(
+          mEmployeeList),
+      })
+    } else {
+      Toast.loading('人员资料获取中', 0)
+      fetchGet(mBaseUrl + '/mobile/getAllHrorgEmps.action', {
+        master: mMaster,
+      }).then(response => {
+        Toast.hide()
+        mEmployeeList = response.employees
+        this.setState({
+          changeModalOpen: true,
+          changeDataSource: this.state.changeDataSource.cloneWithRows(
+            mEmployeeList),
+        })
+      }).catch(error => {
+        Toast.hide()
+        if (typeof error === 'string') {
+          message.error(error)
+        } else {
+          message.error('组织架构获取失败')
+        }
+      })
+    }
+  }
+
   //接管单据
   approvalTakeover = () => {
-    console.log('接管')
-    // common/takeOverTask.action
-    Toast.loading('正在接管单据...', 0)
+    Toast.loading('正在接管单据', 0)
     fetchPost(mBaseUrl + '/common/takeOverTask.action', {
       em_code: mEmcode,
       nodeId: mNodeId,
@@ -1685,9 +1843,10 @@ class Approval extends Component {
       Toast.hide()
       this.setState({
         loading: false,
-        finished: true,
-        finishMsg: '单据不同意成功',
-        finishSuccess: true,
+        // finished: true,
+        // finishMsg: '单据不同意成功',
+        // finishSuccess: true,
+        approvalStatus: 2,
       })
       if (mType == 0) {
         let { homeState: { receiveState: { tabIndex, itemIndex, listData } } } = this.props
@@ -1793,9 +1952,10 @@ class Approval extends Component {
       message.success('单据审批成功')
       this.setState({
         loading: false,
-        finished: true,
-        finishMsg: '单据审批成功',
-        finishSuccess: true,
+        // finished: true,
+        // finishMsg: '单据审批成功',
+        // finishSuccess: true,
+        approvalStatus: 1,
       })
       if (mType == 0) {
         let { homeState: { receiveState: { tabIndex, itemIndex, listData } } } = this.props
@@ -1821,6 +1981,68 @@ class Approval extends Component {
     })
   }
 
+  /**
+   * 变更处理人
+   * @param rowData
+   */
+  onChangeSelect = rowData => {
+    if (!isObjNull(rowData)) {
+      let selectChange = rowData
+
+      Toast.loading('处理人变更中', 0)
+      fetchPost(mBaseUrl + '/common/setAssignee.action', {
+        taskId: mNodeId,
+        master: mMaster,
+        assigneeId: selectChange.EM_CODE,
+        processInstanceId: mApprovalRecord.processInstanceId,
+        description: this.state.approvalContent,
+        _center: 0,
+        _noc: 1,
+      }).then(response => {
+        if (response.result == true) {
+          let nextnode = response.nextnode
+          // if (!isObjEmpty(nextnode)) {
+          //   mNodeId = nextnode
+          //   message.success('处理人变更成功')
+          //   message.success('正在自动跳转下一条')
+          //   this.initPageState()
+          //   this.getCurrentNode()
+          // } else {
+          Toast.hide()
+          message.success('处理人变更成功')
+          if (mType == 0) {
+            let { homeState: { receiveState: { tabIndex, itemIndex, listData } } } = this.props
+            if (tabIndex == 0 && !isObjEmpty(listData) && listData.length >
+              itemIndex) {
+              listData.splice(itemIndex, 1)
+              saveReceiveState({ listData })()
+            }
+          }
+          // message.warn('没有下一条数据')
+          this.props.history.goBack()
+          // }
+        } else {
+          Toast.hide()
+          message.error('变更处理人失败')
+        }
+      }).catch(error => {
+        Toast.hide()
+        if (typeof error === 'string') {
+          message.error(error)
+        } else {
+          message.error('处理人变更异常')
+        }
+      })
+    }
+
+    this.setState({
+      changeDataSource: new ListView.DataSource({
+        rowHasChanged: (row1, row2) => row1 !== row2,
+      }),
+      changeModalOpen: false,
+    })
+  }
+
   inputAllInput = () => {
     const { mainList, detailList } = this.state
 

+ 14 - 5
uas-office-web/wxuasapproval/src/pages/approval/ApprovalHome.jsx

@@ -114,6 +114,7 @@ class ApprovalHome extends Component {
     switch (selectedTab) {
       case 0: {
         this.initNew(newState)
+        this.initReceive(receiveState)
         break
       }
       case 1: {
@@ -338,6 +339,9 @@ class ApprovalHome extends Component {
     if (selectedTab === 1) {
       // 刷新页面
       clearReceiveState()()
+      this.setState({
+        receiveKey: '',
+      })
       this.mySwiper.slideTo(0, 0, false)
       if (!isReceiveTodoLoading) {
         this.setState({
@@ -394,6 +398,9 @@ class ApprovalHome extends Component {
     if (selectedTab === 2) {
       // 刷新页面
       clearSendState()()
+      this.setState({
+        sendKey: '',
+      })
       if (!isSendLoading) {
         this.setState({
           isSendLoading: true,
@@ -445,7 +452,7 @@ class ApprovalHome extends Component {
       <div className='receive-root'>
         <SearchBar
           value={this.state.receiveKey}
-          placeholder={'搜索单据'}
+          placeholder={'搜索'}
           maxLength={16}
           onChange={value => {
             this.setState({
@@ -571,7 +578,7 @@ class ApprovalHome extends Component {
         {/*</RefreshLayout>*/}
         <SearchBar
           value={this.state.sendKey}
-          placeholder={'搜索单据'}
+          placeholder={'搜索'}
           maxLength={16}
           onChange={value => {
             this.setState({
@@ -732,10 +739,12 @@ class ApprovalHome extends Component {
 
           const funcList = groupItem.serves
           if (!isObjEmpty(funcList)) {
+            let newFuncs = []
             funcList.forEach((funcItem, funcIndex) => {
-              newMenu.push(<FuncItem funcObj={funcItem}
-                                     onFuncClick={this.onFuncClick}/>)
+              newFuncs.push(<FuncItem funcObj={funcItem}
+                                      onFuncClick={this.onFuncClick}/>)
             })
+            newMenu.push(<div style={{ background: 'white' }}>{newFuncs}</div>)
           }
         })
     }
@@ -993,7 +1002,7 @@ class ApprovalHome extends Component {
       if (typeof error === 'string') {
         message.error(error)
       } else {
-        message.error('审批列表请求异常')
+        message.error('审批列表请求异常')
       }
     })
   }

+ 18 - 3
uas-office-web/wxuasapproval/src/pages/approval/approval.css

@@ -159,8 +159,7 @@
 }
 
 .newMenu-group-layout {
-    padding: 8px 6px 4px 6px;
-    margin: 4px;
+    padding: 8px;
     display: flex;
     flex-direction: row;
     align-items: center;
@@ -185,7 +184,7 @@
 .newMenu-func-root {
     width: 25%;
     display: inline-block;
-    padding: 8px;
+    padding: 14px 4px 8px;
 }
 
 .newMenu-func-layout {
@@ -294,6 +293,22 @@
     display: none;
 }
 
+.approval-detail-root {
+    width: 100%;
+    height: 100%;
+    background: white;
+    display: flex;
+    flex-direction: column;
+}
+
+.approval-detail-root .am-modal-body {
+    overflow: hidden !important;
+}
+
+.approval-detail-root .am-modal-body::-webkit-scrollbar {
+    display: none !important;
+}
+
 
 /************************************************************************/