5 Commits acabbeae10 ... 15d1c99fb6

Author SHA1 Message Date
  dev01 15d1c99fb6 外呼开发 2 days ago
  dev01 6d5968e612 入群接口替换 1 week ago
  dev01 588d1264cf 客户类型、客服入群 1 week ago
  dev01 71ecc4d4de 技术评分 1 month ago
  dev01 272a5e4d22 已注释 1 month ago
26 changed files with 3991 additions and 1002 deletions
  1. 6 0
      js/component/common/cascaders/index.jsx
  2. 232 218
      js/component/common/enterpriseNameChange/index.jsx
  3. 14 0
      js/component/common/enterpriseNameChange/inforChange.jsx
  4. 4 0
      js/component/dataDic.js
  5. 413 0
      js/component/manageCenter/customer/NEW/components/outbound/index.jsx
  6. 5 0
      js/component/manageCenter/customer/NEW/components/outbound/index.less
  7. 103 3
      js/component/manageCenter/customer/NEW/crm/customerProfile.jsx
  8. 746 723
      js/component/manageCenter/customer/NEW/intentionCustomer/addIntention.jsx
  9. 20 8
      js/component/manageCenter/customer/NEW/intentionCustomer/intentionCustomer.jsx
  10. 14 0
      js/component/manageCenter/customer/NEW/intentionCustomer/intentionDetail/detail/visit.jsx
  11. 16 1
      js/component/manageCenter/customer/NEW/intentionCustomer/intentionDetail/intentionDetail.jsx
  12. 13 1
      js/component/manageCenter/customer/NEW/publicCustomer/publicCustomer.jsx
  13. 18 1
      js/component/manageCenter/customer/NEW/signCustomer/intentionDetail/intentionDetail.jsx
  14. 87 0
      js/component/manageCenter/customer/statistics/departmentStatistics/index.jsx
  15. 131 8
      js/component/manageCenter/customerService/administration/followUp.jsx
  16. 7 0
      js/component/manageCenter/customerService/administration/index.less
  17. 1 1
      js/component/manageCenter/financialManage/account/accountlist.jsx
  18. 0 0
      js/component/manageCenter/financialManage/business/index.less
  19. 430 0
      js/component/manageCenter/financialManage/business/unlimited.jsx
  20. 785 10
      js/component/manageCenter/order/orderNew/addService.jsx
  21. 130 1
      js/component/manageCenter/order/orderNew/billing.jsx
  22. 10 0
      js/component/manageCenter/project/content.jsx
  23. 473 0
      js/component/manageCenter/project/project/score.jsx
  24. 197 18
      js/component/manageCenter/project/summary/highTech.jsx
  25. 135 8
      js/component/manageCenter/project/summary/highTechConfig.jsx
  26. 1 1
      package.json

+ 6 - 0
js/component/common/cascaders/index.jsx

@@ -120,6 +120,12 @@ class Cascaders extends Component {
       isFous: true,
     })
   }
+  // 设置默认选项
+  setDefault(list) {
+    this.setState({
+      checkedList: list
+    })
+  }
   // 代码二级联动
   itemHandle(iD, checked = true) {
     const { id = "id", children = "list" } = this.props

+ 232 - 218
js/component/common/enterpriseNameChange/index.jsx

@@ -6,236 +6,250 @@ import './index.less';
 import $ from "jquery/src/ajax";
 
 class EnterpriseNameChange extends Component {
-    constructor(props) {
-        super(props);
-        this.state = {
-            visible: false,
-            enterpriseName: '',
-            loading: false,
-            colunmn: [
-                {
-                    title: "操作人名称",
-                    dataIndex: "adminName",
-                    key: "adminName",
-                },
-                {
-                    title: "客户名称",
-                    dataIndex: "name",
-                    key: "name",
-                    render: (text) => {
-                        return (
-                            <Tooltip title={text}>
-                                <div 
-                                // style={{
-                                //     maxWidth: '150px',
-                                //     overflow: 'hidden',
-                                //     textOverflow: "ellipsis",
-                                //     whiteSpace: 'nowrap',
-                                // }}
-                                >{text}</div>
-                            </Tooltip>
-                        )
-                    }
-                },
-                {
-                    title: "操作时间",
-                    dataIndex: "createTimes",
-                    key: "createTimes",
-                },
-            ],
-            dataSource: []
-        }
-        this.onCancel = this.onCancel.bind(this);
-        this.onOk = this.onOk.bind(this);
+  constructor(props) {
+    super(props);
+    this.state = {
+      visible: false,
+      enterpriseName: '',
+      loading: false,
+      colunmn: [
+        {
+          title: "操作人名称",
+          dataIndex: "adminName",
+          key: "adminName",
+        },
+        {
+          title: "客户名称",
+          dataIndex: "name",
+          key: "name",
+          render: (text) => {
+            return (
+              <Tooltip title={text}>
+                <div
+                // style={{
+                //     maxWidth: '150px',
+                //     overflow: 'hidden',
+                //     textOverflow: "ellipsis",
+                //     whiteSpace: 'nowrap',
+                // }}
+                >{text}</div>
+              </Tooltip>
+            )
+          }
+        },
+        {
+          title: "操作时间",
+          dataIndex: "createTimes",
+          key: "createTimes",
+        },
+      ],
+      dataSource: []
     }
+    this.onCancel = this.onCancel.bind(this);
+    this.onOk = this.onOk.bind(this);
+  }
 
-    onCancel() {
-        this.setState({
-            visible: false,
-            loading: false,
-        })
-    }
+  onCancel() {
+    this.setState({
+      visible: false,
+      loading: false,
+    })
+  }
 
-    onOk() {
-        if (!this.state.enterpriseName) {
-            message.warning('请输入企业名称!');
-            return;
-        }
-        let re = new RegExp("^[\u4e00-\u9fa5]");
-        if (!re.test(this.state.enterpriseName)) {
-            message.warning('公司名称必须以汉字开头!')
-            return
-        }
-        if (!re.test(this.state.enterpriseName.charAt(this.state.enterpriseName.length - 1))) {
-            message.warning('公司名称必须以汉字结尾!')
-            return
-        }
-        if (this.state.enterpriseName.length > 64) {
-            message.warning('公司名称字数不超过64个!')
-            return;
-        };
-        let regu = /[`~!#$%^&*'_[\]+=<>?:"{}|~!#¥%……&*=-@-!{}|/《》?:“”【】、;;‘’,,.。、\s+]/g;
-        if (regu.test(this.state.enterpriseName)) {
-            message.warning('公司名称不能存在特殊符号或空格!')
-            return false;
-        }
+  onOk() {
+    if (!this.state.enterpriseName) {
+      message.warning('请输入企业名称!');
+      return;
+    }
+    let re = new RegExp("^[\u4e00-\u9fa5]");
+    if (!re.test(this.state.enterpriseName)) {
+      message.warning('公司名称必须以汉字开头!')
+      return
+    }
+    if (!re.test(this.state.enterpriseName.charAt(this.state.enterpriseName.length - 1))) {
+      message.warning('公司名称必须以汉字结尾!')
+      return
+    }
+    if (this.state.enterpriseName.length > 64) {
+      message.warning('公司名称字数不超过64个!')
+      return;
+    };
+    let regu = /[`~!#$%^&*'_[\]+=<>?:"{}|~!#¥%……&*=-@-!{}|/《》?:“”【】、;;‘’,,.。、\s+]/g;
+    if (regu.test(this.state.enterpriseName)) {
+      message.warning('公司名称不能存在特殊符号或空格!')
+      return false;
+    }
+    this.setState({
+      loading: true
+    });
+    $.ajax({
+      url: globalConfig.context + "/api/admin/customer/updateUserName",
+      method: "post",
+      data: {
+        uid: this.props.enterpriseId,
+        userName: this.state.enterpriseName
+      }
+    }).done(
+      function (data) {
         this.setState({
-            loading: true
+          loading: false
         });
-        $.ajax({
-            url: globalConfig.context + "/api/admin/customer/updateUserName",
-            method: "post",
-            data: {
-                uid: this.props.enterpriseId,
-                userName: this.state.enterpriseName
-            }
-        }).done(
-            function (data) {
-                this.setState({
-                    loading: false
-                });
-                if (data.error.length === 0) {
-                    message.success("恭喜您,更名成功!");
-                    this.setState({
-                        visible: false
-                    })
-                    this.props.onChangeSuccess(this.state.enterpriseName);
-                } else {
-                    message.warning(data.error[0].message);
-                }
-            }.bind(this)
-        )
-    }
+        if (data.error.length === 0) {
+          message.success("恭喜您,更名成功!");
+          this.setState({
+            visible: false
+          })
+          this.props.onChangeSuccess(this.state.enterpriseName);
+        } else {
+          message.warning(data.error[0].message);
+        }
+      }.bind(this)
+    )
+  }
 
-    loadData() {
+  loadData() {
+    this.setState({
+      loading: true
+    });
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/customer/listUserName",
+      data: {
+        uid: this.props.enterpriseId,
+      },
+      success: function (data) {
+        if (data.error.length || data.data.list == "") {
+          if (data.error && data.error.length) {
+            message.warning(data.error[0].message);
+          }
+        } else {
+          this.setState({
+            initialName: data.data[0] ? data.data[0].name : ''
+          })
+          data.data.splice(0, 1);
+          this.setState({
+            dataSource: data.data,
+          });
+        }
+      }.bind(this),
+    }).always(
+      function () {
         this.setState({
-            loading: true
+          loading: false,
         });
-        $.ajax({
-            method: "get",
-            dataType: "json",
-            crossDomain: false,
-            url: globalConfig.context + "/api/admin/customer/listUserName",
-            data: {
-                uid: this.props.enterpriseId,
-            },
-            success: function (data) {
-                if (data.error.length || data.data.list == "") {
-                    if (data.error && data.error.length) {
-                        message.warning(data.error[0].message);
-                    }
-                } else {
-                    this.setState({
-                        initialName: data.data[0] ? data.data[0].name : ''
-                    })
-                    data.data.splice(0, 1);
-                    this.setState({
-                        dataSource: data.data,
-                    });
-                }
-            }.bind(this),
-        }).always(
-            function () {
-                this.setState({
-                    loading: false,
-                });
-            }.bind(this)
-        );
+      }.bind(this)
+    );
 
-    }
+  }
 
-    render() {
-        return (
-            <span className='enterpriseNameChange'>
-                <Button
-                    type="primary"
-                    disabled={this.props.disabled}
-                    loading={this.state.loading}
-                    style={this.props.style}
-                    onClick={() => {
-                        if (this.props.type === 'journal') {
-                            this.loadData();
-                        }
+  render() {
+    return (
+      <span className='enterpriseNameChange'>
+        <Button
+          type="primary"
+          disabled={this.props.disabled}
+          loading={this.state.loading}
+          style={this.props.style}
+          onClick={() => {
+            if (!this.props.data.level && this.props.data.level != 0) {
+              Modal.warning({
+                title: '系统提示',
+                content: (
+                  <div>
+                    <p>请先设置客户类型。操作位置:</p>
+                    <p>1.勾选客户名称</p>
+                    <p>2.点击切换至“操作”项</p>
+                    <p>3.选择相应的客户类型即可。</p>
+                  </div>
+                ),
+              });
+              return
+            }
+            if (this.props.type === 'journal') {
+              this.loadData();
+            }
+            this.setState({
+              visible: true
+            })
+          }}>
+          {this.props.type === 'journal' ? '更改日志' : this.props.type === 'modify' ? '企业更名' : ''}
+        </Button>
+        {
+          this.props.changeOtherInfor ?
+            <InforChange
+              enterpriseId={this.props.enterpriseId}
+              type={this.props.type}
+              data={this.props.data}
+              onCancel={this.props.onCancel}
+            /> : null
+        }
+        <Modal
+          footer={null}
+          maskClosable={false}
+          width={this.props.type === 'journal' ? '900px' : this.props.type === 'modify' ? '300px' : ''}
+          title={this.props.type === 'journal' ? '更名日志' : this.props.type === 'modify' ? '企业更名' : ''}
+          visible={this.state.visible}
+          onCancel={this.onCancel}>
+          <div>
+            {this.props.type === 'modify' ?
+              <div className='enterpriseNameContent'>
+                <div className='enterpriseNameItem'>
+                  <div className='enterpriseNameTitle'>更名前:</div>
+                  <div className='enterpriseNameValue'>{this.props.enterpriseName}</div>
+                </div>
+                <div className='enterpriseNameItem'>
+                  <div className='enterpriseNameTitle'>更名后:</div>
+                  <div className='enterpriseNameValue'>
+                    <Input
+                      value={this.state.enterpriseName}
+                      onChange={(e) => {
                         this.setState({
-                            visible: true
+                          enterpriseName: e.target.value
                         })
-                    }}>
-                    {this.props.type === 'journal' ? '更改日志' : this.props.type === 'modify' ? '企业更名' : ''}
-                </Button>
-                {
-                    this.props.changeOtherInfor ?
-                        <InforChange
-                            enterpriseId={this.props.enterpriseId}
-                            type={this.props.type}
-                            data={this.props.data}
-                            onCancel={this.props.onCancel}
-                        /> : null
-                }
-                <Modal
-                    footer={null}
-                    maskClosable={false}
-                    width={this.props.type === 'journal' ? '900px' : this.props.type === 'modify' ? '300px' : ''}
-                    title={this.props.type === 'journal' ? '更名日志' : this.props.type === 'modify' ? '企业更名' : ''}
-                    visible={this.state.visible}
-                    onCancel={this.onCancel}>
-                    <div>
-                        {this.props.type === 'modify' ?
-                            <div className='enterpriseNameContent'>
-                                <div className='enterpriseNameItem'>
-                                    <div className='enterpriseNameTitle'>更名前:</div>
-                                    <div className='enterpriseNameValue'>{this.props.enterpriseName}</div>
-                                </div>
-                                <div className='enterpriseNameItem'>
-                                    <div className='enterpriseNameTitle'>更名后:</div>
-                                    <div className='enterpriseNameValue'>
-                                        <Input
-                                            value={this.state.enterpriseName}
-                                            onChange={(e) => {
-                                                this.setState({
-                                                    enterpriseName: e.target.value
-                                                })
-                                            }} />
-                                    </div>
-                                </div>
-                            </div> : this.props.type === 'journal' ?
-                                <div>
-                                    {this.state.initialName ? <div style={{ paddingBottom: '20px' }}>
-                                        初始客户名称:{this.state.initialName}
-                                    </div> : null}
-                                    <Spin spinning={this.state.loading} >
-                                        <Table
-                                            columns={this.state.colunmn}
-                                            dataSource={this.state.dataSource}
-                                            pagination={false}
-                                            scroll={{ x: "max-content", y: 0 }}
-                                            bordered
-                                            size="small"
-                                        />
-                                    </Spin>
-                                </div> : null
-                        }
-                        {
-                            this.props.type === 'modify' ?
-                                <Popconfirm
-                                    placement="top"
-                                    title="确定要修改吗?"
-                                    onConfirm={(e) => {
-                                        e.stopPropagation();
-                                        this.onOk();
-                                    }}
-                                    okText="确定"
-                                    cancelText="取消"
-                                >
-                                    <Button type='primary' onClick={this.handleCancel}>
-                                        确定修改
-                                    </Button>
-                                </Popconfirm> : null
-                        }
-                    </div>
-                </Modal>
-            </span>
-        )
-    }
+                      }} />
+                  </div>
+                </div>
+              </div> : this.props.type === 'journal' ?
+                <div>
+                  {this.state.initialName ? <div style={{ paddingBottom: '20px' }}>
+                    初始客户名称:{this.state.initialName}
+                  </div> : null}
+                  <Spin spinning={this.state.loading} >
+                    <Table
+                      columns={this.state.colunmn}
+                      dataSource={this.state.dataSource}
+                      pagination={false}
+                      scroll={{ x: "max-content", y: 0 }}
+                      bordered
+                      size="small"
+                    />
+                  </Spin>
+                </div> : null
+            }
+            {
+              this.props.type === 'modify' ?
+                <Popconfirm
+                  placement="top"
+                  title="确定要修改吗?"
+                  onConfirm={(e) => {
+                    e.stopPropagation();
+                    this.onOk();
+                  }}
+                  okText="确定"
+                  cancelText="取消"
+                >
+                  <Button type='primary' onClick={this.handleCancel}>
+                    确定修改
+                  </Button>
+                </Popconfirm> : null
+            }
+          </div>
+        </Modal>
+      </span>
+    )
+  }
 }
 
 export default EnterpriseNameChange;

+ 14 - 0
js/component/common/enterpriseNameChange/inforChange.jsx

@@ -82,6 +82,20 @@ class InforChange extends Component {
   }
 
   onChange(type) {
+    if (!this.props.data.level && this.props.data.level != 0) {
+      Modal.warning({
+        title: '系统提示',
+        content: (
+          <div>
+            <p>请先设置客户类型。操作位置:</p>
+            <p>1.勾选客户名称</p>
+            <p>2.点击切换至“操作”项</p>
+            <p>3.选择相应的客户类型即可。</p>
+          </div>
+        ),
+      });
+      return
+    }
     this.setState({
       visible: true,
       changeType: type,

+ 4 - 0
js/component/dataDic.js

@@ -1852,6 +1852,10 @@ module.exports = {
       value: "9",
       key: "内勤",
     },
+    {
+      value: "10",
+      key: "业务",
+    },
   ],
   //职务
   post: [

+ 413 - 0
js/component/manageCenter/customer/NEW/components/outbound/index.jsx

@@ -0,0 +1,413 @@
+import React, { Component } from "react";
+import { Table, Spin, Button, message, Select, Modal, Icon } from "antd";
+import $ from "jquery/src/ajax";
+import "./index.less";
+
+class Outbound extends Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      loading: false,
+      pVisible: false,
+      rVisible: false,
+      tVisible: false,
+      uList: [],
+      tList: [],
+      transAgent: "",
+      mobile: '',
+      info: {},
+      dataSource: [],
+      pagination: {
+        defaultCurrent: 1,
+        defaultPageSize: 10,
+        showQuickJumper: true,
+        pageSize: 10,
+        onChange: function (page) {
+          this.loadData(page);
+        }.bind(this),
+        showTotal: function (total) {
+          return '共' + total + '条数据';
+        }
+      },
+      columns: [
+        {
+          title: '通话人',
+          dataIndex: 'adminName',
+          key: 'adminName',
+        },
+        {
+          title: '联系人',
+          dataIndex: 'contacts',
+          key: 'contacts',
+        },
+        {
+          title: '电话(尾号)',
+          dataIndex: 'mobileLastDigits',
+          key: 'mobileLastDigits',
+          width: 100,
+        },
+        {
+          title: '时长(秒)',
+          dataIndex: 'duration',
+          key: 'duration',
+        },
+        {
+          title: '时间',
+          dataIndex: 'createTime',
+          key: 'createTime',
+        },
+      ],
+    };
+    this.onOk = this.onOk.bind(this);
+    this.onCancel = this.onCancel.bind(this);
+    this.blindTransferByAgent = this.blindTransferByAgent.bind(this);
+    this.webSocket = null;
+  }
+
+  componentDidMount() {
+    this.webSocket = new WebSocket('wss://uat.jishutao.com/webSocketServer');
+
+    // 处理WebSocket打开事件
+    this.webSocket.onopen = () => {
+      console.log('WebSocket connection opened');
+    };
+
+    // 处理收到消息的事件
+    this.webSocket.onmessage = (event) => {
+      const newMessage = event.data;
+      this.setState((prevState) => ({
+        messages: [...prevState.messages, newMessage],
+      }));
+    };
+
+    // 处理WebSocket关闭事件
+    this.webSocket.onclose = () => {
+      console.log('WebSocket connection closed');
+    };
+
+    // 处理WebSocket错误事件
+    this.webSocket.onerror = (error) => {
+      console.error('WebSocket error:', error);
+    };
+  }
+
+  componentWillUnmount() {
+    // 在组件卸载前关闭WebSocket连接
+    if (this.webSocket) {
+      this.webSocket.close();
+    }
+  }
+
+  onOk() {
+    this.callNumber()
+  }
+
+  onCancel() {
+    this.setState({
+      pVisible: false
+    })
+  }
+  // 公共库-默认联系人
+  getDefaultMobile() {
+    const { uid } = this.props
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/userOutbound/getDefaultMobile",
+      data: {
+        uid,
+      }
+    }).done(function (data) {
+      if (!data.error.length) {
+        if (data.data) {
+          let mobile = data.data.mobile
+          this.setState({
+            pVisible: true,
+            mobile,
+          })
+        } else {
+          message.warning("暂无查询到联系人号码~")
+        }
+      } else {
+        message.warning(data.error[0].message);
+      };
+
+    }.bind(this));
+  }
+  // 私有-客户联系方式列表
+  findCustomerContacts() {
+    const { uid } = this.props
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/customer/findCustomerContacts",
+      data: {
+        uid,
+      }
+    }).done(function (data) {
+      if (!data.error.length) {
+        let list = data.data || [];
+        let mobile = "";
+        if (list && list.length > 0) {
+          for (var i = 0; i < list.length; i++) {
+            if (list[i].major == 1) {
+              mobile = list[i].mobile
+            }
+          }
+        }
+        this.setState({
+          pVisible: true,
+          mobile: mobile,
+          uList: list,
+        })
+      } else {
+        message.warning(data.error[0].message);
+      };
+
+    }.bind(this));
+  }
+  // 转移列表
+  agentList() {
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/userOutbound/agentList",
+      data: {}
+    }).done(function (data) {
+      if (!data.error.length) {
+        let newList = data.data || []
+        this.setState({
+          transAgent: newList[0].callNo,
+          tList: newList
+        })
+      } else {
+        message.warning(data.error[0].message);
+      };
+
+    }.bind(this));
+  }
+  // 呼叫
+  callNumber() {
+    const { uid } = this.props
+    const { mobile } = this.state
+    $.ajax({
+      method: "post",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/userOutbound/callNumber",
+      data: {
+        uid,
+        callee: mobile,
+      }
+    }).done(function (data) {
+      if (!data.error.length) {
+        this.setState({
+          pVisible: false
+        })
+        message.success(data.data)
+      } else {
+        message.warning(data.error[0].message);
+      };
+
+    }.bind(this));
+  }
+  // 呼叫转移
+  blindTransferByAgent() {
+    const { transAgent } = this.state
+    $.ajax({
+      method: "post",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admblindTransferByAgentin/userOutbound",
+      data: {
+        transAgent,
+      }
+    }).done(function (data) {
+      if (!data.error.length) {
+        message.success(data.data)
+      } else {
+        message.warning(data.error[0].message);
+      };
+
+    }.bind(this));
+  }
+  // 通话记录
+  userCallList(pageNo) {
+    const { pagination } = this.state;
+    const { uid } = this.props
+    this.setState({
+      loading: true,
+    });
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/userOutbound/userCallList",
+      data: {
+        uid,
+        pageNo: pageNo || 1,
+        pageSize: pagination.pageSize,
+      },
+      success: function (data) {
+        this.setState({
+          loading: false,
+        });
+        if (data.error && data.error.length === 0) {
+          if (data.data.page.list) {
+            pagination.current = data.data.page.pageNo;
+            pagination.total = data.data.page.totalCount;
+            if (data.data.page && data.data.page.list && !data.data.page.list.length) {
+              pagination.current = 0;
+              pagination.total = 0;
+            }
+            this.setState({
+              dataSource: data.data.page.list,
+              pagination: this.state.pagination,
+              pageNo: data.data.pageNo,
+              info: data.data.sum
+            });
+          } else {
+            this.setState({
+              dataSource: data.data,
+              pagination: false,
+            });
+          }
+        } else {
+          message.warning(data.error[0].message);
+        }
+      }.bind(this),
+    }).always(
+      function () {
+        this.setState({
+          loading: false,
+        });
+      }.bind(this)
+    );
+  }
+
+  render() {
+    const { pVisible, rVisible, tVisible, transAgent, tList, mobile, uList } = this.state
+    const { type, } = this.props
+
+    return (
+      <span>
+        {type != "history" &&
+          <Button
+            style={{ background: !pVisible ? "green" : "red", border: 0 }}
+            type="primary"
+            loading={pVisible}
+            onClick={() => {
+              type == "public"
+                ? this.getDefaultMobile()
+                : this.findCustomerContacts()
+            }}
+          >{!pVisible && <Icon type="phone" />} {!pVisible ? '呼叫' : '正在通话中'}</Button>}
+        {type == "private" &&
+          <Button
+            style={{ background: "green", border: 0, marginLeft: 20 }}
+            type="primary"
+            onClick={() => {
+              this.agentList();
+              this.setState({ tVisible: true })
+            }}
+          ><Icon type="phone" /> 呼叫转移</Button>}
+        <Button
+          style={{ background: "green", border: 0, marginLeft: 20 }}
+          type="primary"
+          onClick={() => {
+            this.userCallList();
+            this.setState({ rVisible: true })
+          }}
+        ><Icon type="phone" /> 历史记录</Button>
+        <Modal
+          title="联系人电话"
+          width={420}
+          visible={pVisible}
+          maskClosable={false}
+          okText="呼叫"
+          onOk={this.onOk}
+          onCancel={this.onCancel}
+        >
+          <div className="contacts">
+            <Select
+              style={{ width: 200 }}
+              value={mobile}
+              onChange={e => {
+                this.setState({
+                  mobile: e
+                })
+              }}
+            >
+              {
+                uList.map(item =>
+                  <Select.Option value={item.mobile} key={item.id}>{item.mobile}</Select.Option>
+                )
+              }
+            </Select>
+          </div>
+        </Modal>
+        <Modal
+          title="呼叫转移"
+          width={420}
+          visible={tVisible}
+          maskClosable={false}
+          okText="呼叫转移"
+          onOk={this.blindTransferByAgent}
+          onCancel={() => {
+            this.setState({
+              tVisible: false
+            })
+          }}
+        >
+          <div className="contacts">
+            <Select
+              style={{ width: 200 }}
+              value={transAgent}
+              onChange={(e) => {
+                this.setState({
+                  transAgent: e
+                })
+              }}
+            >
+              {
+                tList.map(item =>
+                  <Select.Option value={item.callNo} key={item.id}>{item.name}</Select.Option>
+                )
+              }
+            </Select>
+          </div>
+        </Modal>
+        <Modal
+          title="历史记录"
+          width={600}
+          visible={rVisible}
+          maskClosable={false}
+          onCancel={() => {
+            this.setState({
+              rVisible: false
+            })
+          }}
+          footer={null}
+        >
+          <div>
+            <div style={{ marginBottom: 5 }}>公司名称:{this.state.info.name}</div>
+            <div style={{ marginBottom: 10 }}>累计通话次数:{this.state.info.callCount}次&nbsp;&nbsp;&nbsp;&nbsp;通话时长:{this.state.info.callDuration}秒</div>
+            <Spin spinning={this.state.loading}>
+              <Table
+                size="middle"
+                columns={this.state.columns}
+                dataSource={this.state.dataSource}
+                pagination={this.state.pagination}
+              />
+            </Spin>
+          </div>
+        </Modal>
+      </span>
+    );
+  }
+}
+
+export default Outbound;

+ 5 - 0
js/component/manageCenter/customer/NEW/components/outbound/index.less

@@ -0,0 +1,5 @@
+.contacts{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}

+ 103 - 3
js/component/manageCenter/customer/NEW/crm/customerProfile.jsx

@@ -10,6 +10,7 @@ import {
   message,
   Form,
   Tabs,
+  DatePicker,
 } from 'antd';
 import $ from 'jquery/src/ajax';
 import { ShowModal, } from "@/tools.js";
@@ -17,10 +18,12 @@ import { industry } from "@/dataDic.js"
 import ShowModalDiv from "@/showModal.jsx";
 import { ChooseList } from "../../../order/orderNew/chooseList";
 import MainBusinessLog from './mainBusinessLog';
+import moment from 'moment';
 
 import './customer.less';
 
 const TabPane = Tabs.TabPane;
+const { RangePicker } = DatePicker;
 
 const IntentionCustomer = Form.create()(React.createClass({
 
@@ -79,6 +82,16 @@ const IntentionCustomer = Form.create()(React.createClass({
         }
       },
       {
+        title: '是否签单',
+        dataIndex: 'signBills',
+        key: 'signBills',
+        render: text => {
+          return (
+            <div>{["否", "是"][text]}</div>
+          )
+        }
+      },
+      {
         title: '主营产品',
         dataIndex: 'businessScope',
         key: 'businessScope',
@@ -102,7 +115,8 @@ const IntentionCustomer = Form.create()(React.createClass({
       {
         title: '意向合作项目',
         dataIndex: 'intendedProject',
-        key: 'intendedProject'
+        key: 'intendedProject',
+        width: 220,
       },
       {
         title: '知产情况',
@@ -141,6 +155,12 @@ const IntentionCustomer = Form.create()(React.createClass({
         width: 200,
       },
       {
+        title: '更新时间',
+        dataIndex: 'updateTime',
+        key: 'updateTime',
+        width: 80,
+      },
+      {
         title: '所属部门',
         dataIndex: 'depName',
         key: 'depName',
@@ -406,6 +426,44 @@ const IntentionCustomer = Form.create()(React.createClass({
     });
   },
 
+  exportAll() {
+    message.config({
+      duration: 20,
+    });
+    let loading = message.loading("下载中...");
+    this.setState({
+      exportPendingLoading: true,
+    });
+    let data = JSON.parse(JSON.stringify(this.state.searchInfor));
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: "/api/admin/userArchives/selectUserArchives/export",
+      data,
+      success: function (data) {
+        if (data.error.length === 0) {
+          this.download(data.data);
+        } else {
+          message.warning(data.error[0].message);
+        }
+      }.bind(this),
+    }).always(
+      function () {
+        loading();
+        this.setState({
+          exportPendingLoading: false,
+        });
+      }.bind(this)
+    );
+  },
+
+  download(fileName) {
+    window.location.href =
+      globalConfig.context + "/open/download?fileName=" + fileName;
+  },
+
+
   search() {
     this.loadData();
   },
@@ -504,7 +562,7 @@ const IntentionCustomer = Form.create()(React.createClass({
                 <Select
                   mode="multiple"
                   placeholder={"请选择行业"}
-                  style={{ width: 200 }}
+                  style={{ width: 150 }}
                   value={searchInfor.industry ? searchInfor.industry.split(",") : undefined}
                   onChange={(e) => {
                     this.setState({
@@ -535,7 +593,39 @@ const IntentionCustomer = Form.create()(React.createClass({
                 <Option value="1">公共客户</Option>
                 <Option value="2">签单客户</Option>
                 <Option value="3">外联客户</Option>
+                <Option value="4">私有&签单</Option>
+              </Select>
+              <Select
+                placeholder={"是否签单"}
+                style={{ width: 100 }}
+                value={searchInfor.signBills}
+                onChange={(e) => {
+                  this.setState({
+                    searchInfor: Object.assign(searchInfor, {
+                      signBills: e,
+                    }),
+                  });
+                }}
+              >
+                <Option value="0">否</Option>
+                <Option value="1">是</Option>
               </Select>
+              <span>更新时间: </span>
+              <RangePicker
+                style={{ width: 300 }}
+                value={[
+                  searchInfor.startTime ? moment(searchInfor.startTime) : null,
+                  searchInfor.endTime ? moment(searchInfor.endTime) : null,
+                ]}
+                onChange={(data, dataString) => {
+                  this.setState({
+                    searchInfor: Object.assign(searchInfor, {
+                      startTime: dataString[0],
+                      endTime: dataString[1],
+                    }),
+                  });
+                }}
+              />
               <Button type="primary" onClick={this.search} style={{ marginRight: 10 }}>
                 搜索
               </Button>
@@ -552,6 +642,16 @@ const IntentionCustomer = Form.create()(React.createClass({
                 />
               </div>
             </TabPane>
+            <TabPane tab="导出EXCEL" key="3">
+              <Button
+                type="primary"
+                loading={this.state.exportPendingLoading}
+                onClick={this.exportAll}
+                style={{ margin: 10 }}
+              >
+                导出excel
+              </Button>
+            </TabPane>
           </Tabs>
         </div>
         <div className="patent-table">
@@ -565,7 +665,7 @@ const IntentionCustomer = Form.create()(React.createClass({
               dataSource={this.state.dataSource}
               pagination={this.state.pagination}
               bordered
-              scroll={{ x: newChannel == 0 ? "130%" : "120%" }}
+              scroll={{ x: newChannel == 0 ? "140%" : "130%" }}
             />
           </Spin>
         </div>

File diff suppressed because it is too large
+ 746 - 723
js/component/manageCenter/customer/NEW/intentionCustomer/addIntention.jsx


+ 20 - 8
js/component/manageCenter/customer/NEW/intentionCustomer/intentionCustomer.jsx

@@ -276,13 +276,13 @@ const IntentionCustomer = Form.create()(
             title: "客户等级",
             dataIndex: "level",
             key: "level",
-            render: (text) => {
+            render: (text, record) => {
               if (text == 0) {
-                return <Tag color="#87d068">一般客户</Tag>;
+                return <Tag color="#87d068">一般客户(一年以上预签)</Tag>;
               } else if (text == 1) {
-                return <Tag color="#D2691E">意向客户</Tag>;
+                return <Tag color="#D2691E">意向客户(半年内预签)</Tag>;
               } else if (text == 2) {
-                return <Tag color="#FF0000">重点客户</Tag>;
+                return <Tag color="#FF0000">重点客户(一个月内预签)</Tag>;
               } else {
                 return "";
               }
@@ -316,6 +316,18 @@ const IntentionCustomer = Form.create()(
                           },
                           onCancel() { },
                         });
+                      } else if (!record.level && record.level != 0) {
+                        Modal.warning({
+                          title: '系统提示',
+                          content: (
+                            <div>
+                              <p>请先设置客户类型。操作位置:</p>
+                              <p>1.勾选客户名称</p>
+                              <p>2.点击切换至“操作”项</p>
+                              <p>3.选择相应的客户类型即可。</p>
+                            </div>
+                          ),
+                        });
                       } else {
                         this.visit(record);
                       }
@@ -1005,16 +1017,16 @@ const IntentionCustomer = Form.create()(
                   />
                 </span>
                 <Select
-                  style={{ width: 120 }}
+                  style={{ width: 180 }}
                   value={this.state.level}
                   onChange={(e) => {
                     this.setState({ level: e });
                   }}
                   placeholder="请选择客户等级"
                 >
-                  <Select.Option value="0">一般客户</Select.Option>
-                  <Select.Option value="1">意向客户</Select.Option>
-                  <Select.Option value="2">重点客户</Select.Option>
+                  <Select.Option value="0">一般客户(一年以上预签)</Select.Option>
+                  <Select.Option value="1">意向客户(半年内预签)</Select.Option>
+                  <Select.Option value="2">重点客户(一个月内预签)</Select.Option>
                 </Select>
                 <RangePicker
                   value={[

+ 14 - 0
js/component/manageCenter/customer/NEW/intentionCustomer/intentionDetail/detail/visit.jsx

@@ -449,6 +449,20 @@ const Visit = React.createClass({
           <Button
             onClick={(e) => {
               e.stopPropagation();
+              if(!this.props.data.level && this.props.data.level != 0){
+                Modal.warning({
+                  title: '系统提示',
+                  content: (
+                    <div>
+                      <p>请先设置客户类型。操作位置:</p>
+                      <p>1.勾选客户名称</p>
+                      <p>2.点击切换至“操作”项</p>
+                      <p>3.选择相应的客户类型即可。</p>
+                    </div>
+                  ),
+                });
+                return
+              }
               // 是限定项目
               if (!isLimit) {
                 if (!this.props.data.orgCode) {

+ 16 - 1
js/component/manageCenter/customer/NEW/intentionCustomer/intentionDetail/intentionDetail.jsx

@@ -9,6 +9,7 @@ import Account from './detail/account.jsx';  //账户信息
 import Visit from './detail/visit.jsx';
 import Business from './detail/business.jsx';
 import BasicPerson from './detail/basicPerson.jsx';
+import Outbound from '../../components/outbound';
 
 const IntentionDetail = React.createClass({
   getInitialState() {
@@ -114,7 +115,21 @@ const IntentionDetail = React.createClass({
       <div>
         {this.state.modalVisible ? <Modal
           className="customeDetails"
-          title="意向客户详情"
+          title={<div
+            style={{
+              display: "flex",
+              flexDirection: "row",
+              justifyContent: "space-between",
+            }}
+          >
+            <span>意向客户详情</span>
+            <span style={{ marginRight: 100 }}>
+              <Outbound
+                type="private"
+                uid={this.props.IntentionData.id}
+              />
+            </span>
+          </div>}
           width='92%'
           visible={this.state.modalVisible}
           onOk={this.detailsModal}

+ 13 - 1
js/component/manageCenter/customer/NEW/publicCustomer/publicCustomer.jsx

@@ -1,9 +1,10 @@
 import React from 'react';
-import { Button, Cascader, Input, Select, Spin, Table, message, Form, Tabs, Modal } from 'antd';
+import { Button, Cascader, Input, Select, Spin, Table, message, Form, Tabs, Modal, Icon } from 'antd';
 import ajax from 'jquery/src/ajax/xhr.js';
 import $ from 'jquery/src/ajax';
 import { citySelect, provinceList } from '@/NewDicProvinceList';
 import { ShowModal, onReplace } from '../../../../tools.js'
+import Outbound from '../../NEW/components/outbound';
 import ShowModalDiv from "@/showModal.jsx";
 import { ChooseList } from "../../../order/orderNew/chooseList";
 
@@ -133,6 +134,17 @@ const QueryCustomer = React.createClass({
         title: '转换时间',
         dataIndex: 'transferTime',
         key: 'transferTime',
+        width: 500,
+        render: (text, record) => {
+          return <div>
+            <span style={{ marginRight: 20 }}>{text}</span>
+            {!this.props.intentionState &&
+              <Outbound
+                type="public"
+                uid={record.id}
+              />}
+          </div>
+        }
       },
       {
         title: '操作',

+ 18 - 1
js/component/manageCenter/customer/NEW/signCustomer/intentionDetail/intentionDetail.jsx

@@ -10,6 +10,7 @@ import Visit from './detail/visit.jsx';
 import Business from './detail/business.jsx';
 import LockBusiness from './detail/lockBusiness.jsx';
 import BasicPerson from './detail/basicPerson.jsx';//基本信息
+import Outbound from '../../components/outbound';
 
 const IntentionDetail = React.createClass({
   getInitialState() {
@@ -117,7 +118,23 @@ const IntentionDetail = React.createClass({
       <div>
         {this.state.modalVisible ? <Modal
           className="customeDetails"
-          title="签单客户详情"
+          title={
+            <div
+              style={{
+                display: "flex",
+                flexDirection: "row",
+                justifyContent: "space-between",
+              }}
+            >
+              <span>签单客户详情</span>
+              <span style={{ marginRight: 100 }}>
+                <Outbound
+                  type="history"
+                  uid={this.props.IntentionData.id}
+                />
+              </span>
+            </div>
+          }
           width="1300px"
           maskClosable={false}
           visible={this.state.modalVisible}

+ 87 - 0
js/component/manageCenter/customer/statistics/departmentStatistics/index.jsx

@@ -264,6 +264,36 @@ class DepartmentStatistics extends Component {
             );
           },
         },
+        {
+          title: <div style={{ color: 'red' }}>
+            <div>重点客户</div>
+            <div>(一个月内预签)</div>
+          </div>,
+          dataIndex: "keynoteCount",
+          key: "keynoteCount",
+          className: 'tableRowStyle',
+          width: 120,
+        },
+        {
+          title: <div style={{ color: 'orange' }}>
+            <div>意向客户</div>
+            <div>(半年内预签)</div>
+          </div>,
+          dataIndex: "intentionCount",
+          key: "intentionCount",
+          className: 'tableRowStyle',
+          width: 120,
+        },
+        {
+          title: <div style={{ color: 'green' }}>
+            <div>一般客户</div>
+            <div>(一年以上预签)</div>
+          </div>,
+          dataIndex: "generalCount",
+          key: "generalCount",
+          className: 'tableRowStyle',
+          width: 120,
+        },
       ],
       contactsOption: null,
       loading: false,
@@ -271,11 +301,13 @@ class DepartmentStatistics extends Component {
       aid: '',
       type: '',
       visible: false,
+      exportPendingLoading: false,
     };
     this.loadData = this.loadData.bind(this);
     this.reset = this.reset.bind(this);
     this.selectSuperId = this.selectSuperId.bind(this);
     this.changeList = this.changeList.bind(this);
+    this.exportExec = this.exportExec.bind(this);
   }
 
   componentDidMount() {
@@ -336,6 +368,49 @@ class DepartmentStatistics extends Component {
     );
   };
 
+  exportExec() {
+    message.config({
+      duration: 20,
+    });
+    let loading = message.loading("下载中...");
+    this.setState({
+      exportPendingLoading: true,
+    });
+
+    let data = {
+      depId: this.state.superId,
+      aName: this.state.nameSearch,
+      startTime: this.state.releaseDate[0],
+      endTime: this.state.releaseDate[1],
+    }
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: '/api/admin/customer/selectAllUser/export',
+      data,
+      success: function (data) {
+        if (data.error.length === 0) {
+          this.download(data.data);
+        } else {
+          message.warning(data.error[0].message);
+        }
+      }.bind(this),
+    }).always(
+      function () {
+        loading();
+        this.setState({
+          exportPendingLoading: false,
+        });
+      }.bind(this)
+    );
+  }
+
+  download(fileName) {
+    window.location.href =
+      globalConfig.context + "/open/download?fileName=" + fileName;
+  }
+
   //表格数据处理
   handleTabsInfor(infor) {
     for (let i = 0; i < infor.length; i++) {
@@ -512,6 +587,18 @@ class DepartmentStatistics extends Component {
               />
             </div>
           </TabPane>
+          <TabPane tab="导出" key="3">
+            <div style={{ float: "left" }}>
+              <Button
+                type='primary'
+                loading={this.state.exportPendingLoading}
+                onClick={this.exportExec}
+                style={{ margin: 10 }}
+              >
+                导出excel
+              </Button>
+            </div>
+          </TabPane>
         </Tabs>
         <div className="patent-table">
           <Spin spinning={this.state.loading}>

+ 131 - 8
js/component/manageCenter/customerService/administration/followUp.jsx

@@ -1,5 +1,5 @@
 import React, { Component } from "react";
-import { Button, DatePicker, Icon, Input, message, Select, Spin, Table, Tabs, Tag, Tooltip } from "antd";
+import { Button, DatePicker, Icon, Input, message, Select, Spin, Table, Tabs, Tag, Tooltip, Switch } from "antd";
 import { ChooseList } from "../../order/orderNew/chooseList";
 import FollowUpDetails from './followUpDetails';
 import CorrespondingDetails from './correspondingDetails';
@@ -7,6 +7,7 @@ import OrderItemStatus from '../../../../component/common/orderItemStatus';
 import $ from "jquery";
 import { ShowModal } from "@/tools";
 import ShowModalDiv from "@/showModal.jsx";
+import './index.less';
 import moment from "moment";
 import Cascaders from "../../../../component/common/cascaders";
 
@@ -166,6 +167,26 @@ class FollowUp extends Component {
           key: "adminName",
         },
         {
+          title: "是否入群",
+          dataIndex: "addGroupChat",
+          key: "addGroupChat",
+          onCellClick: (record, e) => {
+            e.stopPropagation()
+          },
+          render: (text, record) => {
+            return (
+              <div>
+                <Switch checked={text == 1}
+                  onChange={() => {
+                    this.upAddGroupChat(record.orderNo, text == 0 ? 1 : 0)
+                  }}
+                />
+                <div>{text == 1 && record.addGroupChatTime}</div>
+              </div>
+            )
+          }
+        },
+        {
           title: "是否已添微信",
           dataIndex: "addWechat",
           key: "addWechat",
@@ -298,6 +319,7 @@ class FollowUp extends Component {
       customerName: '',
       releaseDate: [],
       signTimes: [],
+      addGroupChatTimes: [],
     }
     this.changeList = this.changeList.bind(this);
     this.loadData = this.loadData.bind(this);
@@ -308,7 +330,8 @@ class FollowUp extends Component {
   }
 
   componentDidMount() {
-    this.loadData();
+    this.selectSuperId();
+    // this.loadData();
   }
 
   search() {
@@ -317,6 +340,7 @@ class FollowUp extends Component {
 
   reset() {
     this.setState({
+      addGroupChat: undefined,
       customerName: undefined,
       contractNo: undefined,
       depId: undefined,
@@ -324,6 +348,7 @@ class FollowUp extends Component {
       renewal: undefined,
       releaseDate: [],
       signTimes: [],
+      addGroupChatTimes: [],
     }, () => {
       this.Cascaders.empty();
       this.loadData();
@@ -351,6 +376,9 @@ class FollowUp extends Component {
         startSignTimes: this.state.signTimes[0] || undefined,
         endSignTimes: this.state.signTimes[1] || undefined,
         contractNo: this.state.contractNo || undefined,
+        addGroupChat: this.state.addGroupChat,
+        addGroupChatTimeStart: this.state.addGroupChatTimes[0] || undefined,
+        addGroupChatTimeEnd: this.state.addGroupChatTimes[1] || undefined,
       },
       success: function (data) {
         ShowModal(this);
@@ -445,6 +473,73 @@ class FollowUp extends Component {
     window.location.href =
       globalConfig.context + "/open/download?fileName=" + fileName;
   }
+  // 入群
+  upAddGroupChat(orderNo, addGroupChat) {
+    this.setState({
+      listLoading: true,
+    });
+    $.ajax({
+      method: "post",
+      dataType: "json",
+      crossDomain: false,
+      url: "/api/admin/newOrder/updateAddGroupChat",
+      data: {
+        orderNo,
+        addGroupChat
+      },
+      success: function (data) {
+        if (data.error.length === 0) {
+          this.loadData(this.state.page)
+          this.setState({
+            listLoading: false,
+          });
+        } else {
+          message.warning(data.error[0].message);
+        }
+      }.bind(this),
+    }).always(
+      function () {
+        this.setState({
+          listLoading: false,
+        });
+      }.bind(this)
+    );
+  }
+  // 获取部门数据
+  selectSuperId() {
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      url: globalConfig.context + "/api/admin/organization/getAllDep",
+      data: {},
+      success: function (data) {
+        if (data.error && data.error.length === 0) {
+          let list = data.data || []
+          let ids = []
+          for (var i = 0; i < list.length; i++) {
+            if (list[i].name.includes("湖南") || list[i].name.includes("内蒙古")) {
+              ids.push(list[i].id)
+              if (list[i].list.length > 0) {
+                for (var j = 0; j < list[i].list.length; j++) {
+                  ids.push(list[i].list[j].id)
+                }
+              }
+            }
+          }
+          this.Cascaders.setDefault(ids)
+          this.setState({
+            depId: ids.length == 0 ? undefined : JSON.stringify(ids)
+          }, () => {
+            this.loadData();
+          })
+        } else {
+          // message.warning(data.error[0].message);
+        }
+      }.bind(this),
+    }).always(
+
+    );
+  }
 
   render() {
     return (
@@ -457,7 +552,7 @@ class FollowUp extends Component {
           <TabPane tab="搜索" key="1" style={{ padding: '10px 0' }}>
             <Input
               placeholder="客户名称"
-              style={{ width: "150px", marginRight: 10, marginBottom: "10px" }}
+              style={{ width: "160px", marginRight: 10, marginBottom: "10px" }}
               value={this.state.customerName}
               onChange={(e) => {
                 this.setState({ customerName: e.target.value });
@@ -465,7 +560,7 @@ class FollowUp extends Component {
             />
             <Input
               placeholder="合同编号"
-              style={{ width: "150px", marginRight: 10, marginBottom: "10px" }}
+              style={{ width: "160px", marginRight: 10, marginBottom: "10px" }}
               value={this.state.contractNo}
               onChange={(e) => {
                 this.setState({ contractNo: e.target.value });
@@ -483,7 +578,7 @@ class FollowUp extends Component {
             />
             <Select
               placeholder="是否已添微信"
-              style={{ width: 120, marginRight: 10, marginBottom: "10px" }}
+              style={{ width: 150, marginRight: 10, marginBottom: "10px" }}
               value={this.state.addWechat}
               onChange={(e) => {
                 this.setState({ addWechat: e });
@@ -494,7 +589,7 @@ class FollowUp extends Component {
             </Select>
             <Select
               placeholder="续签情况"
-              style={{ width: 220, marginRight: 10, marginBottom: "10px" }}
+              style={{ width: 210, marginRight: 10, marginBottom: "10px" }}
               value={this.state.renewal}
               onChange={(e) => {
                 this.setState({ renewal: e });
@@ -510,7 +605,7 @@ class FollowUp extends Component {
             </Select>
             <span style={{ marginRight: "10px", marginBottom: "10px" }}>跟进时间 :</span>
             <RangePicker
-              style={{ marginBottom: "10px", width: '187px' }}
+              style={{ marginBottom: "10px", width: '200px' }}
               value={[
                 this.state.releaseDate[0]
                   ? moment(this.state.releaseDate[0])
@@ -525,7 +620,7 @@ class FollowUp extends Component {
             />
             <span style={{ marginRight: "10px", marginLeft: "10px", marginBottom: "10px" }}>下单时间 :</span>
             <RangePicker
-              style={{ marginBottom: "10px", width: '187px' }}
+              style={{ marginBottom: "10px", width: '200px' }}
               value={[
                 this.state.signTimes[0]
                   ? moment(this.state.signTimes[0])
@@ -538,6 +633,34 @@ class FollowUp extends Component {
                 this.setState({ signTimes: dataString });
               }}
             />
+            <span style={{ marginRight: "10px", marginLeft: "10px", marginBottom: "10px" }}>入群 :</span>
+            <Select
+              placeholder="是否入群"
+              style={{ width: 120, marginBottom: "10px" }}
+              value={this.state.addGroupChat}
+              onChange={(e) => {
+                this.setState({ addGroupChat: e });
+              }}
+            >
+              <Option value={null}>全部</Option>
+              <Option value={0}>未入群</Option>
+              <Option value={1}>已入群</Option>
+            </Select>
+            <span style={{ marginRight: "10px", marginLeft: "10px", marginBottom: "10px" }}>入群时间 :</span>
+            <RangePicker
+              style={{ marginBottom: "10px", width: '200px' }}
+              value={[
+                this.state.addGroupChatTimes[0]
+                  ? moment(this.state.addGroupChatTimes[0])
+                  : null,
+                this.state.addGroupChatTimes[1]
+                  ? moment(this.state.addGroupChatTimes[1])
+                  : null,
+              ]}
+              onChange={(data, dataString) => {
+                this.setState({ addGroupChatTimes: dataString });
+              }}
+            />
             <Button
               type="primary"
               onClick={this.search}

+ 7 - 0
js/component/manageCenter/customerService/administration/index.less

@@ -0,0 +1,7 @@
+.ant-switch {
+  background-color: red
+}
+
+.ant-switch-checked {
+  background-color: #87D068;
+}

+ 1 - 1
js/component/manageCenter/financialManage/account/accountlist.jsx

@@ -253,7 +253,7 @@ const AccountList = React.createClass({
       pageNo: pageNo || 1,
       pageSize: pagination.pageSize,
       expenseMain: 0,
-      processStatus: this.props.isOperate ? 1 : 2,
+      // processStatus: this.props.isOperate ? 1 : 2,
     });
     $.ajax({
       method: "get",

+ 0 - 0
js/component/manageCenter/financialManage/business/index.less


+ 430 - 0
js/component/manageCenter/financialManage/business/unlimited.jsx

@@ -0,0 +1,430 @@
+import React from 'react';
+import {
+  DatePicker,
+  Tooltip,
+  Button,
+  AutoComplete,
+  Input,
+  Select,
+  Spin,
+  Table,
+  message,
+  Form,
+  Tabs,
+  Switch
+} from 'antd';
+import $ from 'jquery/src/ajax';
+import moment from 'moment';
+import { ShowModal, getApprovedType } from "@/tools.js";
+import { } from "@/dataDic";
+import ShowModalDiv from "@/showModal.jsx";
+import { ChooseList } from "../../order/orderNew/chooseList";
+
+import './index.less';
+
+const TabPane = Tabs.TabPane;
+const { RangePicker, } = DatePicker;
+
+const Unlimited = Form.create()(React.createClass({
+
+  getInitialState() {
+    return {
+      searchValues: {},
+      loading: false,
+      exportPendingLoading: false,
+      changeList: undefined,
+      dataSource: [],
+      pagination: {
+        defaultCurrent: 1,
+        defaultPageSize: 10,
+        showQuickJumper: true,
+        pageSize: 10,
+        onChange: function (page) {
+          this.loadData(page);
+        }.bind(this),
+        showTotal: function (total) {
+          return '共' + total + '条数据';
+        }
+      },
+      columns: [
+        {
+          title: "特批类型",
+          dataIndex: "type",
+          key: "type",
+          width: 110,
+          render: (text, record) => {
+            return (
+              <span>
+                {getApprovedType(text ? text.split(",").map(Number) : [], record.typeExplain)}
+              </span>
+            );
+          },
+        },
+        {
+          title: "合同编号",
+          dataIndex: "contractNo",
+          key: "contractNo",
+        },
+        {
+          title: '客户名称',
+          dataIndex: 'userName',
+          key: 'userName',
+          render: (text, record) => {
+            return (
+              <Tooltip title={text}>
+                <div style={{ maxWidth: 200 }}>{text}</div>
+              </Tooltip>
+            );
+          }
+        },
+        {
+          title: "订单部门",
+          dataIndex: "depName",
+          key: "depName",
+          width: 100,
+        },
+        {
+          title: "订单负责人",
+          dataIndex: "salesmanName",
+          key: "salesmanName"
+        },
+        {
+          title: "签单日期",
+          dataIndex: "time",
+          key: "time",
+        },
+        {
+          title: "下单时间",
+          dataIndex: "createDate",
+          key: "createTime",
+          width: 80,
+          render: (text) => {
+            return <div style={{ textAlign: "center" }}>{text}</div>
+          },
+        },
+        {
+          title: "签单金额(万元)",
+          dataIndex: "totalAmount",
+          key: "totalAmount",
+          render: (text) => {
+            return <div style={{ textAlign: "center" }}>{text}</div>
+          },
+        },
+        {
+          title: "开票金额(万元)",
+          dataIndex: "invoiceAmount",
+          key: "invoiceAmount",
+          render: (text) => {
+            return <div style={{ textAlign: "center" }}>{text}</div>
+          },
+        },
+        {
+          title: "已收款(万元)",
+          dataIndex: "settlementAmount",
+          key: "settlementAmount",
+          render: (text) => {
+            return <div style={{ textAlign: "center" }}>{text}</div>
+          },
+        },
+        {
+          title: "应收款(万元)",
+          dataIndex: "orderReceivables",
+          key: "orderReceivables",
+          render: (text) => {
+            return <div style={{ textAlign: "center" }}>{text}</div>
+          },
+        },
+        {
+          title: "欠款(万元)",
+          dataIndex: "orderArrears",
+          key: "orderArrears",
+          render: (text) => {
+            return <div style={{ textAlign: "center" }}>{text}</div>
+          },
+        },
+        {
+          title: "总成本/实付",
+          dataIndex: "costAmount",
+          key: "costAmount",
+          render: (text) => {
+            return <div style={{ textAlign: "center" }}>{text}</div>
+          },
+        },
+        {
+          title: "公出时长(时)",
+          dataIndex: "duration",
+          key: "duration",
+        },
+      ],
+      dataSource: [],
+      departmentArr: [],
+    };
+  },
+
+  componentWillMount() {
+    // this.departmentList();
+    // this.selectSuperId();
+    this.loadData();
+  },
+
+  loadData(pageNo) {
+    const { searchValues, pagination } = this.state;
+    this.setState({
+      loading: true,
+    });
+    let datas = Object.assign(searchValues, {
+      pageNo: pageNo || 1,
+      pageSize: pagination.pageSize,
+    });
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/statistis/orderProject",
+      data: datas,
+      success: function (data) {
+        ShowModal(this);
+        this.setState({
+          loading: false,
+        });
+        if (data.error && data.error.length === 0) {
+          if (data.data.list) {
+            pagination.current = data.data.pageNo;
+            pagination.total = data.data.totalCount;
+            if (data.data && data.data.list && !data.data.list.length) {
+              pagination.current = 0;
+              pagination.total = 0;
+            }
+            this.setState({
+              dataSource: data.data.list,
+              pagination: this.state.pagination,
+              pageNo: data.data.pageNo,
+            });
+          } else {
+            this.setState({
+              dataSource: data.data,
+              pagination: false,
+            });
+          }
+        } else {
+          message.warning(data.error[0].message);
+        }
+      }.bind(this),
+    }).always(
+      function () {
+        this.setState({
+          loading: false,
+        });
+      }.bind(this)
+    );
+  },
+
+  // 部门
+  departmentList() {
+    this.setState({
+      loading: true,
+    });
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/organization/selectSuperId",
+      data: {},
+      success: function (data) {
+        let thedata = data.data;
+        let theArr = [];
+        if (!thedata) {
+          if (data.error && data.error.length) {
+            message.warning(data.error[0].message);
+          }
+          thedata = {};
+        } else {
+          thedata.map(function (item, index) {
+            theArr.push({
+              key: index,
+              name: item.name,
+              id: item.id,
+            });
+          });
+        }
+        this.setState({
+          departmentArr: theArr,
+        });
+      }.bind(this),
+    }).always(
+      function () {
+        this.setState({
+          loading: false,
+        });
+      }.bind(this)
+    );
+  },
+
+  // 项目类别
+  selectSuperId() {
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/ProjectSize/getAllCname",
+      data: {
+        flag: 0
+      },
+      success: function (data) {
+        let theArr = [];
+        let thedata = data.data;
+        if (!thedata) {
+          if (data.error && data.error.length) {
+            message.warning(data.error[0].message);
+          }
+        }
+        for (let i = 0; i < data.data.length; i++) {
+          let theData = data.data[i];
+          theArr.push(
+            <Select.Option value={theData.id} key={theData.cname}>
+              {theData.cname}
+            </Select.Option>
+          );
+        }
+        this.setState({
+          contactsOption: theArr,
+          contactsOptionData: data.data,
+        });
+      }.bind(this)
+    }).always(
+
+    );
+  },
+
+  changeList(arr) {
+    const newArr = [];
+    let list = this.state.columns
+    list.forEach((item) => {
+      arr.forEach((val) => {
+        if (val === item.title) {
+          newArr.push(item);
+        }
+      });
+    });
+    this.setState({
+      changeList: newArr,
+    });
+  },
+
+  search() {
+    this.loadData();
+  },
+
+  reset() {
+    this.setState({
+
+      searchValues: JSON.parse(JSON.stringify({})),
+    }, () => {
+      this.loadData();
+    })
+  },
+
+  render() {
+    const { searchValues } = this.state
+    let departmentArr = this.state.departmentArr || [];
+    return (
+      <div className="user-content">
+        <ShowModalDiv ShowModal={this.state.showModal} onClose={() => { this.setState({ showModal: false }) }} />
+        <div className="content-title" style={{ marginBottom: 10 }}>
+          <span style={{ fontWeight: 900, fontSize: 16 }}>无限制公出管理</span>
+        </div>
+        <div className="user-search">
+          <Tabs
+            defaultActiveKey="1"
+            className="test">
+            <TabPane tab="搜索" key="1">
+              <div
+                className="user-search"
+                style={{
+                  marginTop: "10px",
+                  marginLeft: "10px",
+                  marginRight: "10px",
+                }}
+              >
+                <Input
+                  placeholder="合同编号"
+                  style={{
+                    width: 220,
+                    marginRight: "10px",
+                  }}
+                  value={searchValues["contractNo"]
+                    ? searchValues["contractNo"]
+                    : ""}
+                  onChange={(e) => {
+                    searchValues["contractNo"] = e.target.value;
+                    this.setState({
+                      searchValues: searchValues,
+                    });
+                  }}
+                />
+                <Input
+                  placeholder="客户名称"
+                  style={{
+                    width: 220,
+                    marginRight: "10px",
+                  }}
+                  value={searchValues["userName"]
+                    ? searchValues["userName"]
+                    : ""}
+                  onChange={(e) => {
+                    searchValues["userName"] = e.target.value;
+                    this.setState({
+                      searchValues: searchValues,
+                    });
+                  }}
+                />
+                <Input
+                  placeholder="项目名称"
+                  value={searchValues["projectName"]
+                    ? searchValues["projectName"]
+                    : ""}
+                  style={{ width: 220, marginRight: 10 }}
+                  onChange={e => {
+                    searchValues["projectName"] = e.target.value
+                    this.setState({
+                      searchValues: searchValues,
+                    });
+                  }}
+                />
+
+                <Button type="primary" onClick={this.search} style={{ marginRight: 10 }}>
+                  搜索
+                </Button>
+                <Button onClick={this.reset}>重置</Button>
+              </div>
+            </TabPane>
+            <TabPane tab="更改表格显示数据" key="2">
+              <div style={{ marginLeft: 10 }}>
+                <ChooseList
+                  columns={this.state.columns}
+                  changeFn={this.changeList}
+                  changeList={this.state.changeList}
+                  top={55}
+                  margin={11}
+                />
+              </div>
+            </TabPane>
+          </Tabs>
+        </div>
+        <div className="patent-table">
+          <Spin spinning={this.state.loading}>
+            <Table
+              columns={this.state.changeList
+                ? this.state.changeList
+                : this.state.columns}
+              dataSource={this.state.dataSource}
+              pagination={this.state.pagination}
+              bordered
+            />
+          </Spin>
+        </div>
+      </div >
+    );
+  }
+}));
+export default Unlimited;

+ 785 - 10
js/component/manageCenter/order/orderNew/addService.jsx

@@ -186,6 +186,8 @@ const NewService = Form.create()(
     },
     getInitialState() {
       return {
+        marks: "",
+        score: "",
         type: "",
         approvaType: [],
         typeExplain: "",
@@ -399,7 +401,7 @@ const NewService = Form.create()(
             title: "项目状态",
             dataIndex: "projectStatus",
             key: "projectStatus",
-            width: 80,
+            width: 70, textAlign: "center",
             render: (text) => {
               return getProjectName(text);
             },
@@ -466,7 +468,7 @@ const NewService = Form.create()(
             title: "操作",
             dataIndex: "ABC",
             key: "ABC",
-            width: 80,
+            width: 110,
             render: (text, record) => {
               return (
                 <div>
@@ -500,6 +502,43 @@ const NewService = Form.create()(
                       </Button>
                     </div>
                   }
+                  {
+                    record.scoreStatus == 1 &&
+                    <div>
+                      <Button
+                        type="primary"
+                        onClick={(e) => {
+                          e.stopPropagation();
+                          this.setState({
+                            tid: record.id,
+                            score: "add",
+                            cSort: record.sort,
+                            cname: record.commodityName,
+                            tname: record.name,
+                          })
+                        }}
+                      >
+                        待评分
+                      </Button>
+                    </div>
+                  }
+                  {
+                    !!record.scoreNumber &&
+                    <Button
+                      type="primary"
+                      onClick={(e) => {
+                        e.stopPropagation();
+                        this.setState({
+                          cSort: record.sort,
+                          cname: record.commodityName,
+                          tname: record.name,
+                        })
+                        this.queryByTid(record.id)
+                      }}
+                    >
+                      已评{record.scoreNumber}分
+                    </Button>
+                  }
                 </div>
               );
             },
@@ -510,7 +549,7 @@ const NewService = Form.create()(
             title: "变更状态",
             dataIndex: "type",
             key: "type",
-            width: 70,
+            width: 70, textAlign: "center",
             render: (text, record) => {
               let str = "";
               let color = "";
@@ -645,7 +684,7 @@ const NewService = Form.create()(
             title: "操作",
             dataIndex: "ABC",
             key: "ABC",
-            width: 80,
+            width: 70, textAlign: "center",
             render: (text, record) => {
               return (
                 <div>
@@ -1349,7 +1388,7 @@ const NewService = Form.create()(
               }
               return (
                 <div>
-                  <div style={{ width: 70, float: "left", marginRight: 5 }}>
+                  <div style={{ width: 70, textAlign: "center", float: "left", marginRight: 5 }}>
                     <Select
                       placeholder="选择"
                       defaultValue={"金额"}
@@ -1382,7 +1421,7 @@ const NewService = Form.create()(
               // if (this.state.boFlag) {
               //   return (
               //     <div>
-              //       <div style={{ width: 70, float: "left", marginRight: 5 }}>
+              //       <div style={{ width: 70, textAlign: "center", float: "left", marginRight: 5 }}>
               //         <Select
               //           placeholder="选择"
               //           defaultValue={"金额"}
@@ -1820,7 +1859,7 @@ const NewService = Form.create()(
 
               return (
                 <div>
-                  <div style={{ width: 70, float: "left", marginRight: 5 }}>
+                  <div style={{ width: 70, textAlign: "center", float: "left", marginRight: 5 }}>
                     <Select
                       placeholder="选择"
                       defaultValue={"金额"}
@@ -1853,7 +1892,7 @@ const NewService = Form.create()(
               // if (this.state.boFlag) {
               //   return (
               //     <div>
-              //       <div style={{ width: 70, float: "left", marginRight: 5 }}>
+              //       <div style={{ width: 70, textAlign: "center", float: "left", marginRight: 5 }}>
               //         <Select
               //           placeholder="选择"
               //           defaultValue={"金额"}
@@ -5178,6 +5217,215 @@ const NewService = Form.create()(
       });
     },
 
+    getRadioList(val, cSort, name) {
+      let array = []
+      let list = []
+      let vlist1 = [30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20]
+      let vlist2 = [20, 19, 18, 17, 16, 15, 14, 13]
+      let vlist3 = [15, 14, 13, 12, 11]
+      let vlist4 = [10, 9, 8, 7]
+
+      let mlist1 = [19, 18, 17, 16, 15, 14, 13, 12, 11, 10]
+      let mlist2 = [12, 11, 10, 9, 8, 7]
+      let mlist3 = [10, 9, 8, 7, 6]
+      let mlist4 = [6, 5, 4]
+
+      let clist1 = [9, 8, 7, 6, 5, 4, 3, 2, , 1]
+      let clist2 = [6, 5, 4, 3, 2, 1]
+      let clist3 = [5, 4, 3, 2, 1]
+      let clist4 = [3, 2, 1]
+
+      if (cSort == 6) {
+        if (name == "zyd" || name == "gtl" || name == "ydhb") {
+          list = [
+            { value: 1, list: vlist2 },
+            { value: 2, list: mlist2 },
+            { value: 3, list: clist2 },
+            { value: 4, list: [0] }
+          ]
+        } else if (name == "xyd" || name == "gcxx" || name == "fwtd" || name == "ndhb") {
+          list = [
+            { value: 1, list: vlist4 },
+            { value: 2, list: mlist4 },
+            { value: 3, list: clist4 },
+            { value: 4, list: [0] }
+          ]
+        }
+      } else {
+        if (name == "zyd" || name == "gtl") {
+          list = [
+            { value: 1, list: vlist1 },
+            { value: 2, list: mlist1 },
+            { value: 3, list: clist1 },
+            { value: 4, list: [0] }
+          ]
+        } else if (name == "gcxx" || name == "fwtd") {
+          list = [
+            { value: 1, list: vlist3 },
+            { value: 2, list: mlist3 },
+            { value: 3, list: clist3 },
+            { value: 4, list: [0] }
+          ]
+        } else if (name == "xyd") {
+          list = [
+            { value: 1, list: vlist4 },
+            { value: 2, list: mlist4 },
+            { value: 3, list: clist4 },
+            { value: 4, list: [0] }
+          ]
+        }
+      }
+      list.map(function (item) {
+        if (item.value == val) {
+          array = item.list
+        }
+      })
+      return array
+    },
+
+    getPaddingLeft(val) {
+      let num = 7
+      let arr = [
+        { value: 1, key: 7 },
+        { value: 2, key: 7 },
+        { value: 3, key: 7 },
+        { value: 4, key: 7 }
+      ]
+      arr.map(function (item) {
+        if (item.value == val) {
+          num = item.key
+        }
+      })
+      return num
+    },
+
+    getScore(name, cSort, val) {
+      let data = ""
+      let list = []
+      if (cSort == 6) {
+        if (name == "zyd" || name == "gtl" || name == "ydhb") {
+          list = [
+            { title: name == "zyd" ? "很专业" : "很满意", list: [20, 19, 18, 17, 16, 15, 14, 13] },
+            { title: name == "zyd" ? "专业" : "满意", list: [12, 11, 10, 9, 8, 7] },
+            { title: "一般", list: [6, 5, 4, 3, 2, 1] },
+            { title: name == "zyd" ? "不专业" : "不满意", list: [0] },
+          ]
+        } else if (name == "xyd" || name == "gcxx" || name == "fwtd" || name == "ndhb") {
+          list = [
+            { title: name == "xyd" ? "很速度" : "很满意", list: [10, 9, 8, 7] },
+            { title: name == "xyd" ? "速度" : "满意", list: [6, 5, 4] },
+            { title: "一般", list: [3, 2, 1] },
+            { title: name == "xyd" ? "很慢" : "不满意", list: [0] },
+          ]
+        }
+      } else {
+        if (name == "zyd" || name == "gtl") {
+          list = [
+            { title: name == "zyd" ? "很专业" : "很满意", list: [30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20] },
+            { title: name == "zyd" ? "专业" : "满意", list: [19, 18, 17, 16, 15, 14, 13, 12, 11, 10] },
+            { title: "一般", list: [9, 8, 7, 6, 5, 4, 3, 2, 1] },
+            { title: name == "zyd" ? "不专业" : "不满意", list: [0] },
+          ]
+        } else if (name == "gcxx" || name == "fwtd") {
+          list = [
+            { title: "很满意", list: [15, 14, 13, 12, 11] },
+            { title: "满意", list: [10, 9, 8, 7, 6] },
+            { title: "一般", list: [5, 4, 3, 2, 1] },
+            { title: "不满意", list: [0] },
+          ]
+        } else if (name == "xyd") {
+          list = [
+            { title: "很速度", list: [10, 9, 8, 7] },
+            { title: "速度", list: [6, 5, 4] },
+            { title: "一般", list: [3, 2, 1] },
+            { title: "很慢", list: [0] },
+          ]
+        }
+      }
+      list.map(function (item) {
+        if (item.list.includes(val)) {
+          data = item.title + "(" + val + "分)"
+        }
+      })
+      return data
+    },
+
+    updateByTid() {
+      $.ajax({
+        method: "POST",
+        dataType: "json",
+        crossDomain: false,
+        url: globalConfig.context + "/api/admin/taskScore/updateByTid",
+        data: {
+          tid: this.state.tid,
+          professionalism: this.state.professionalism,
+          communicationSkills: this.state.communicationSkills,
+          responsiveness: this.state.responsiveness,
+          publicImage: this.state.publicImage,
+          serviceAttitude: this.state.serviceAttitude,
+          monthlyReport: this.state.cSort == 6 ? this.state.monthlyReport : undefined,
+          yearReport: this.state.cSort == 6 ? this.state.yearReport : undefined,
+          remarks: this.state.marks,
+        },
+        success: function (data) {
+          if (data.error.length) {
+            this.setState({
+              loading: false,
+            });
+            message.error(data.error[0].message);
+          } else {
+            this.setState({
+              score: "",
+              cSort: "",
+              cname: "",
+              tname: "",
+            })
+            message.success("操作成功");
+            this.loadData();
+          }
+        }.bind(this),
+      }).always(
+        function () {
+          this.setState({
+            loading: false,
+          });
+        }.bind(this)
+      );
+    },
+
+    queryByTid(value) {
+      this.setState({
+        loading: true,
+      })
+      $.ajax({
+        method: "get",
+        dataType: "json",
+        crossDomain: false,
+        url: globalConfig.context + "/api/admin/taskScore/queryByTid",
+        data: {
+          tid: value,
+        },
+        success: function (data) {
+          if (data.error.length) {
+            this.setState({
+              loading: false,
+            });
+            message.warning(data.error[0].message);
+          } else {
+            this.setState({
+              score: "selcet",
+              dataScore: data.data,
+            });
+          }
+        }.bind(this),
+      }).always(
+        function () {
+          this.setState({
+            loading: false,
+          });
+        }.bind(this)
+      );
+    },
 
     render() {
       const expandedRowRender = (e) => {
@@ -5716,6 +5964,53 @@ const NewService = Form.create()(
                   )
                 },
               },
+              {
+                title: "操作",
+                dataIndex: "op",
+                key: "op",
+                width: 110,
+                render: (text, record) => {
+                  return (
+                    <div>
+                      {
+                        record.scoreStatus == 1 &&
+                        <Button
+                          type="primary"
+                          onClick={(e) => {
+                            e.stopPropagation();
+                            this.setState({
+                              tid: record.id,
+                              score: "add",
+                              cSort: 6,
+                              cname: record.taskName,
+                              tname: record.receiverName,
+                            })
+                          }}
+                        >
+                          待评分
+                        </Button>
+                      }
+                      {
+                        !!record.scoreNumber &&
+                        <Button
+                          type="primary"
+                          onClick={(e) => {
+                            e.stopPropagation();
+                            this.setState({
+                              cSort: 6,
+                              cname: record.taskName,
+                              tname: record.receiverName,
+                            })
+                            this.queryByTid(record.id)
+                          }}
+                        >
+                          已评{record.scoreNumber}分
+                        </Button>
+                      }
+                    </div >
+                  )
+                },
+              }
             ];
           } else {
             columns = [
@@ -8765,8 +9060,488 @@ const NewService = Form.create()(
               onCancel={() => { this.setState({ infoVisible: false }) }}
             />
           }
-        </div >
-      );
+
+          <Modal
+            maskClosable={false}
+            visible={this.state.score != ""}
+            footer=""
+            title="项目评分"
+            width={this.state.score == "selcet" ? 400 : 740}
+            onCancel={() => {
+              this.setState({
+                score: "",
+                tid: "",
+                cSort: "",
+                cname: "",
+                tname: "",
+              })
+            }}
+          >
+            {
+              this.state.score == "add" &&
+              <div>
+                <div style={{ marginBottom: 10 }}>项目名称:{this.state.cname}</div>
+                <div style={{ marginBottom: 10 }}>项目咨询:{this.state.tname}</div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block" }}>专&nbsp;业&nbsp;度</span>:
+                  <RadioGroup
+                    onChange={e => {
+                      this.setState({
+                        zyd: e.target.value,
+                        zydList: this.getRadioList(e.target.value, this.state.cSort, "zyd"),
+                        professionalism: e.target.value == 4 ? 0 : undefined,
+                      })
+                    }}
+                    value={this.state.zyd}>
+                    {
+                      [
+                        { key: "很专业", value: 1, },
+                        { key: "专业", value: 2, },
+                        { key: "一般", value: 3, },
+                        { key: "不专业", value: 4, },
+                      ].map(item =>
+                        <RadioButton style={{ width: 80, textAlign: "center" }} value={item.value} key={item.value}>{item.key}</RadioButton>
+                      )
+                    }
+                  </RadioGroup>
+                </div>
+                <div
+                  style={{
+                    padding: "5px 0 10px 0",
+                    paddingLeft: this.getPaddingLeft(this.state.zyd),
+                    margin: "5px 0 10px 55px",
+                    borderBottom: "1px dotted black"
+                  }}
+                >
+                  <RadioGroup
+                    onChange={e => {
+                      this.setState({
+                        professionalism: e.target.value
+                      })
+                    }}
+                    value={this.state.professionalism}>
+                    {
+                      !!this.state.zydList && this.state.zydList.map(item =>
+                        <RadioButton style={{ textAlign: "center" }} value={item} key={item}>{item}分</RadioButton>
+                      )
+                    }
+                  </RadioGroup>
+                </div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block" }}>沟&nbsp;通&nbsp;力</span>:
+                  <RadioGroup
+                    onChange={e => {
+                      this.setState({
+                        gtl: e.target.value,
+                        gtlList: this.getRadioList(e.target.value, this.state.cSort, "gtl"),
+                        communicationSkills: e.target.value == 4 ? 0 : undefined,
+                      })
+                    }}
+                    value={this.state.gtl}>
+                    {
+                      [
+                        { key: "很满意", value: 1, },
+                        { key: "满意", value: 2, },
+                        { key: "一般", value: 3, },
+                        { key: "不满意", value: 4, },
+                      ].map(item =>
+                        <RadioButton style={{ width: 80, textAlign: "center" }} value={item.value} key={item.value}>{item.key}</RadioButton>
+                      )
+                    }
+                  </RadioGroup>
+                </div>
+                <div
+                  style={{
+                    padding: "5px 0 10px 0",
+                    paddingLeft: this.getPaddingLeft(this.state.gtl),
+                    margin: "5px 0 10px 55px",
+                    borderBottom: "1px dotted black"
+                  }}
+                >
+                  <RadioGroup
+                    onChange={e => {
+                      this.setState({
+                        communicationSkills: e.target.value
+                      })
+                    }}
+                    value={this.state.communicationSkills}>
+                    {
+                      !!this.state.gtlList && this.state.gtlList.map(item =>
+                        <RadioButton style={{ textAlign: "center" }} value={item} key={item}>{item}分</RadioButton>
+                      )
+                    }
+                  </RadioGroup>
+                </div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block" }}>响&nbsp;应&nbsp;度</span>:
+                  <RadioGroup
+                    onChange={e => {
+                      this.setState({
+                        xyd: e.target.value,
+                        yxdList: this.getRadioList(e.target.value, this.state.cSort, "xyd"),
+                        responsiveness: e.target.value == 4 ? 0 : undefined,
+                      })
+                    }}
+                    value={this.state.xyd}>
+                    {
+                      [
+                        { key: "很速度", value: 1, },
+                        { key: "速度", value: 2, },
+                        { key: "一般", value: 3, },
+                        { key: "很慢", value: 4, },
+                      ].map(item =>
+                        <RadioButton style={{ width: 80, textAlign: "center" }} value={item.value} key={item.value}>{item.key}</RadioButton>
+                      )
+                    }
+                  </RadioGroup>
+                </div>
+                <div
+                  style={{
+                    padding: "5px 0 10px 0",
+                    paddingLeft: this.getPaddingLeft(this.state.xyd),
+                    margin: "5px 0 10px 55px",
+                    borderBottom: "1px dotted black"
+                  }}
+                >
+                  <RadioGroup
+                    onChange={e => {
+                      this.setState({
+                        responsiveness: e.target.value
+                      })
+                    }}
+                    value={this.state.responsiveness}>
+                    {
+                      !!this.state.yxdList && this.state.yxdList.map(item =>
+                        <RadioButton style={{ textAlign: "center" }} value={item} key={item}>{item}分</RadioButton>
+                      )
+                    }
+                  </RadioGroup>
+                </div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block" }}>公出形象</span>:
+                  <RadioGroup
+                    onChange={e => {
+                      this.setState({
+                        gcxx: e.target.value,
+                        gcxxList: this.getRadioList(e.target.value, this.state.cSort, "gcxx"),
+                        publicImage: e.target.value == 4 ? 0 : undefined,
+                      })
+                    }}
+                    value={this.state.gcxx}>
+                    {
+                      [
+                        { key: "很满意", value: 1, },
+                        { key: "满意", value: 2, },
+                        { key: "一般", value: 3, },
+                        { key: "不满意", value: 4, },
+                      ].map(item =>
+                        <RadioButton style={{ width: 80, textAlign: "center" }} value={item.value} key={item.value}>{item.key}</RadioButton>
+                      )
+                    }
+                  </RadioGroup>
+                </div>
+                <div
+                  style={{
+                    padding: "5px 0 10px 0",
+                    paddingLeft: this.getPaddingLeft(this.state.gcxx),
+                    margin: "5px 0 10px 55px",
+                    borderBottom: "1px dotted black"
+                  }}
+                >
+                  <RadioGroup
+                    onChange={e => {
+                      this.setState({
+                        publicImage: e.target.value
+                      })
+                    }}
+                    value={this.state.publicImage}>
+                    {
+                      !!this.state.gcxxList && this.state.gcxxList.map(item =>
+                        <RadioButton style={{ textAlign: "center" }} value={item} key={item}>{item}分</RadioButton>
+                      )
+                    }
+                  </RadioGroup>
+                </div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block" }}>服务态度</span>:
+                  <RadioGroup
+                    onChange={e => {
+                      this.setState({
+                        fwtd: e.target.value,
+                        fwtdList: this.getRadioList(e.target.value, this.state.cSort, "fwtd"),
+                        serviceAttitude: e.target.value == 4 ? 0 : undefined,
+                      })
+                    }}
+                    value={this.state.fwtd}>
+                    {
+                      [
+                        { key: "很满意", value: 1, },
+                        { key: "满意", value: 2, },
+                        { key: "一般", value: 3, },
+                        { key: "不满意", value: 4, },
+                      ].map(item =>
+                        <RadioButton style={{ width: 80, textAlign: "center" }} value={item.value} key={item.value}>{item.key}</RadioButton>
+                      )
+                    }
+                  </RadioGroup>
+                </div>
+                <div
+                  style={{
+                    padding: "5px 0 10px 0",
+                    paddingLeft: this.getPaddingLeft(this.state.fwtd),
+                    margin: "5px 0 10px 55px",
+                    borderBottom: this.state.cSort == 6 ? "1px dotted black" : 0
+                  }}
+                >
+                  <RadioGroup
+                    onChange={e => {
+                      this.setState({
+                        serviceAttitude: e.target.value
+                      })
+                    }}
+                    value={this.state.serviceAttitude}>
+                    {
+                      !!this.state.fwtdList && this.state.fwtdList.map(item =>
+                        <RadioButton style={{ textAlign: "center" }} value={item} key={item}>{item}分</RadioButton>
+                      )
+                    }
+                  </RadioGroup>
+                </div>
+                {
+                  this.state.cSort == 6 &&
+                  <div>
+                    <span style={{ width: 50, display: "inline-block" }}>月度汇报</span>:
+                    <RadioGroup
+                      onChange={e => {
+                        this.setState({
+                          ydhb: e.target.value,
+                          ydhbList: this.getRadioList(e.target.value, this.state.cSort, "ydhb"),
+                          monthlyReport: e.target.value == 4 ? 0 : undefined,
+                        })
+                      }}
+                      value={this.state.ydhb}>
+                      {
+                        [
+                          { key: "很满意", value: 1, },
+                          { key: "满意", value: 2, },
+                          { key: "一般", value: 3, },
+                          { key: "不满意", value: 4, },
+                        ].map(item =>
+                          <RadioButton style={{ width: 80, textAlign: "center" }} value={item.value} key={item.value}>{item.key}</RadioButton>
+                        )
+                      }
+                    </RadioGroup>
+                  </div>
+                }
+                {
+                  this.state.cSort == 6 &&
+                  <div
+                    style={{
+                      padding: "5px 0 10px 0",
+                      paddingLeft: this.getPaddingLeft(this.state.ydhb),
+                      margin: "5px 0 10px 55px",
+                      borderBottom: "1px dotted black"
+                    }}
+                  >
+                    <RadioGroup
+                      onChange={e => {
+                        this.setState({
+                          monthlyReport: e.target.value
+                        })
+                      }}
+                      value={this.state.monthlyReport}>
+                      {
+                        !!this.state.ydhbList && this.state.ydhbList.map(item =>
+                          <RadioButton style={{ textAlign: "center" }} value={item} key={item}>{item}分</RadioButton>
+                        )
+                      }
+                    </RadioGroup>
+                  </div>
+                }
+                {
+                  this.state.cSort == 6 &&
+                  <div>
+                    <span style={{ width: 50, display: "inline-block" }}>年度汇报</span>:
+                    <RadioGroup
+                      onChange={e => {
+                        this.setState({
+                          ndhb: e.target.value,
+                          ndhbList: this.getRadioList(e.target.value, this.state.cSort, "ndhb"),
+                          yearReport: e.target.value == 4 ? 0 : undefined,
+                        })
+                      }}
+                      value={this.state.ndhb}>
+                      {
+                        [
+                          { key: "很满意", value: 1, },
+                          { key: "满意", value: 2, },
+                          { key: "一般", value: 3, },
+                          { key: "不满意", value: 4, },
+                        ].map(item =>
+                          <RadioButton style={{ width: 80, textAlign: "center" }} value={item.value} key={item.value}>{item.key}</RadioButton>
+                        )
+                      }
+                    </RadioGroup>
+                  </div>
+                }
+                {
+                  this.state.cSort == 6 &&
+                  <div
+                    style={{
+                      padding: "5px 0 10px 0",
+                      paddingLeft: this.getPaddingLeft(this.state.ndhb),
+                      margin: "5px 0 10px 55px",
+                    }}
+                  >
+                    <RadioGroup
+                      onChange={e => {
+                        this.setState({
+                          yearReport: e.target.value
+                        })
+                      }}
+                      value={this.state.yearReport}>
+                      {
+                        !!this.state.ndhbList && this.state.ndhbList.map(item =>
+                          <RadioButton style={{ textAlign: "center" }} value={item} key={item}>{item}分</RadioButton>
+                        )
+                      }
+                    </RadioGroup>
+                  </div>
+                }
+
+                <div style={{ marginBottom: 5, display: "flex", flexDirection: "row" }}>
+                  <span style={{ width: 50, display: "inline-block" }}>评分理由</span>:
+                  <TextArea
+                    style={{ width: 600 }}
+                    rows={3}
+                    value={this.state.marks}
+                    onChange={(e) => {
+                      this.setState({
+                        marks: e.target.value,
+                      })
+                    }}
+                    placeholder="请填写本次评分的判断依据,至少10字以上"
+                  />
+                </div>
+                <div style={{ marginTop: 10, textAlign: "center" }}>
+                  <Button
+                    type="primary"
+                    onClick={() => {
+                      if (!this.state.professionalism && this.state.professionalism != 0) {
+                        message.warning("专业度未打分")
+                        return
+                      }
+                      if (!this.state.communicationSkills && this.state.communicationSkills != 0) {
+                        message.warning("沟通力未打分")
+                        return
+                      }
+                      if (!this.state.responsiveness && this.state.responsiveness != 0) {
+                        message.warning("响应度未打分")
+                        return
+                      }
+                      if (!this.state.publicImage && this.state.publicImage != 0) {
+                        message.warning("公出形象未打分")
+                        return
+                      }
+                      if (!this.state.serviceAttitude && this.state.serviceAttitude != 0) {
+                        message.warning("服务态度未打分")
+                        return
+                      }
+                      if (this.state.cSort == 6 && !this.state.monthlyReport && this.state.monthlyReport != 0) {
+                        message.warning("月度汇报未打分")
+                        return
+                      }
+                      if (this.state.cSort == 6 && !this.state.yearReport && this.state.yearReport != 0) {
+                        message.warning("年度汇报未打分")
+                        return
+                      }
+                      if (this.state.marks.length < 10) {
+                        message.warning("请填写10字以上的评分依据")
+                        return
+                      }
+                      const _this = this
+                      confirm({
+                        title: '您确定提交本次评分吗?',
+                        content: '',
+                        onOk() {
+                          _this.updateByTid()
+                        },
+                      });
+                    }}
+                  >
+                    确定
+                  </Button>
+                </div>
+                <div style={{ textAlign: "center", marginBottom: 10, color: "red" }}>注:请公平公正为本项目咨询老师评分!评分后不可修改</div>
+              </div>
+            }
+
+            {
+              this.state.score == "selcet" &&
+              <div style={{ position: "relative" }}>
+                <div
+                  style={{
+                    position: "absolute",
+                    right: 100,
+                    top: 50,
+                    fontSize: "40px",
+                    color: "red"
+                  }}
+                >{this.state.dataScore.professionalism + this.state.dataScore.communicationSkills + this.state.dataScore.responsiveness + this.state.dataScore.publicImage + this.state.dataScore.serviceAttitude + this.state.dataScore.monthlyReport + this.state.dataScore.yearReport}分</div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>项目名称</span>:{this.state.cname}
+                </div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>项目咨询</span>:{this.state.tname}
+                </div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>专&nbsp;业&nbsp;度</span>:{this.getScore("zyd", this.state.cSort, this.state.dataScore.professionalism)}
+                </div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>沟&nbsp;通&nbsp;力</span>:{this.getScore("gtl", this.state.cSort, this.state.dataScore.communicationSkills)}
+                </div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>响&nbsp;应&nbsp;度</span>:{this.getScore("xyd", this.state.cSort, this.state.dataScore.responsiveness)}
+                </div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>公出形象</span>:{this.getScore("gcxx", this.state.cSort, this.state.dataScore.publicImage)}
+                </div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>服务态度</span>:{this.getScore("fwtd", this.state.cSort, this.state.dataScore.serviceAttitude)}
+                </div>
+                {this.state.cSort == 6 &&
+                  <div>
+                    <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>月度汇报</span>:{this.getScore("ydhb", this.state.cSort, this.state.dataScore.monthlyReport)}
+                  </div>}
+                {this.state.cSort == 6 &&
+                  <div>
+                    <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>年度汇报</span>:{this.getScore("ndhb", this.state.cSort, this.state.dataScore.yearReport)}
+                  </div>}
+                <div>
+                  <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>评分理由</span>:{this.state.dataScore.remarks}
+                </div>
+                <div>
+                  <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>评分时间</span>:{moment(this.state.dataScore.createTime).format('YYYY-MM-DD HH:mm:ss')}
+                </div>
+                <div style={{ marginTop: 10, textAlign: "center" }}>
+                  <Button
+                    type="primary"
+                    onClick={() => {
+                      this.setState({
+                        score: ""
+                      })
+                    }}
+                  >
+                    关闭
+                  </Button>
+                </div>
+              </div>
+            }
+
+          </Modal>
+
+
+        </div >);
     },
   })
 );

+ 130 - 1
js/component/manageCenter/order/orderNew/billing.jsx

@@ -605,6 +605,29 @@ const MyService = Form.create()(
             dataIndex: "financeName",
             key: "financeName",
           },
+          // {
+          //   title: "应公出/已公出",
+          //   dataIndex: "a",
+          //   key: "a",
+          //   width: 100,
+          //   render: (text) => {
+          //     return (
+          //       <div>
+          //         {text}
+          //         <Button
+          //           type="primary"
+          //           onClick={(e) => {
+          //             this.setState({
+          //               upRelease: true
+          //             })
+          //           }}
+          //         >
+          //           设置公出
+          //         </Button>
+          //       </div>
+          //     );
+          //   },
+          // },
           {
             title: "操作",
             dataIndex: "abc",
@@ -671,6 +694,24 @@ const MyService = Form.create()(
                   ) : (
                     ""
                   )}
+                  {
+
+                    (record.scoreStatus == 1 || record.scoreStatus == 2) &&
+                    <Button
+                      style={{
+                        margin: "5px",
+                        background: "#87D068",
+                        color: "#ffffff",
+                        border: "none",
+                      }}
+                      onClick={(e) => {
+                        e.stopPropagation();
+                        this.tableRowClick(record)
+                      }}
+                    >
+                      评分
+                    </Button>
+                  }
                 </div>
               );
             },
@@ -754,6 +795,7 @@ const MyService = Form.create()(
           pageNo: pageNo || 1,
           pageSize: this.state.pagination.pageSize,
           specially: 0,
+          scoreStatus: this.state.scoreStatus,
           name: this.state.customerName,
           orderNo: this.state.searchOrderNo,
           depId: this.state.departmenttSearch,
@@ -804,6 +846,7 @@ const MyService = Form.create()(
                 stopProject: thisdata.stopProject, //暂停项目  0无 1有
                 type: thisdata.type || "", // 特批类型
                 typeExplain: thisdata.typeExplain,
+                scoreStatus: thisdata.scoreStatus,
               });
             }
             this.state.pagination.current = data.data.pageNo;
@@ -1628,6 +1671,7 @@ const MyService = Form.create()(
       this.setState({
         signBillVisible: false,
       });
+      this.state.scoreStatus = undefined;
       this.state.searchOrderNo = undefined;
       this.state.orderNo = undefined;
       this.state.customerName = undefined;
@@ -1866,6 +1910,23 @@ const MyService = Form.create()(
         record,
       });
     },
+    getRadioList(val) {
+      let array = []
+      let list = [
+        { value: 1, list: [6, 7, 8, 9, 10] },
+        { value: 2, list: [3, 4, 5] },
+        { value: 3, list: [1, 2] },
+        { value: 4, list: [0] }
+      ]
+      list.map(function (item) {
+        if (item.value == val) {
+          array = item.list
+        }
+      })
+      return array
+    },
+
+
     render() {
       const FormItem = Form.Item;
       const formItemLayout = {
@@ -2087,7 +2148,7 @@ const MyService = Form.create()(
                     </Select>
                     <span style={{ marginRight: "10px" }}>下单时间 :</span>
                     <RangePicker
-                      style={{ width: 200 }}
+                      style={{ width: 200, marginRight: 10 }}
                       value={[
                         this.state.releaseDate[0]
                           ? moment(this.state.releaseDate[0])
@@ -2100,6 +2161,43 @@ const MyService = Form.create()(
                         this.setState({ releaseDate: dataString });
                       }}
                     />
+                    <span style={{ marginRight: "10px" }}>项目评分 :</span>
+                    <Select
+                      style={{ width: 150 }}
+                      placeholder="项目评分"
+                      value={this.state.scoreStatus}
+                      onChange={(e) => {
+                        this.setState({
+                          scoreStatus: e,
+                        });
+                      }}
+                    >
+                      <Option value="0">全部</Option>
+                      <Option value="1">待评分</Option>
+                      <Option value="2">部分已评分</Option>
+                      <Option value="3">全部已评分</Option>
+                    </Select>
+                    {/* <Input
+                      placeholder="请输入营销员名字"
+                      style={{ width: 150, marginRight: 10 }}
+                      value={this.state.name}
+                      onChange={(e) => {
+                        this.setState({ name: e.target.value });
+                      }}
+                    />
+                    <Select
+                      style={{ width: 150 }}
+                      placeholder="无限制公出"
+                      value={this.state.ss}
+                      onChange={(e) => {
+                        this.setState({
+                          ss: e,
+                        });
+                      }}
+                    >
+                      <Option value="0">无限制公出(未设置)</Option>
+                      <Option value="1">无限制公出(已设置)</Option>
+                    </Select> */}
                   </Row>
                 </div>
               </TabPane>
@@ -3683,6 +3781,37 @@ const MyService = Form.create()(
                 content={() => this.refs.all}
               />
             </Modal>
+
+            <Modal
+              maskClosable={false}
+              visible={this.state.upRelease}
+              footer=""
+              title="设置公出"
+              width={400}
+              onCancel={() => {
+                this.setState({
+                  upRelease: false
+                })
+              }}
+            >
+              <div style={{ color: "red" }}>
+                <div style={{ textAlign: "center" }}>合同XXXXXXXXXXXXXX,属于“无限制”公出合同!</div>
+                <div style={{ textAlign: "center" }}>请预计所有技术老师,总计公出本合同的时长</div>
+                <div style={{ marginTop: 10, textAlign: "center" }}>
+                  预估公出时间 <Input style={{ width: 50, textAlign: "center" }} />(小时)
+                </div>
+                <div style={{ marginTop: 10, textAlign: "center" }}>
+                  <Button
+                    type="primary"
+                    onClick={() => { }}
+                  >
+                    确定
+                  </Button>
+                </div>
+                <div style={{ textAlign: "center", marginBottom: 10 }}>审核后生效,如需修改,需重新审核</div>
+              </div>
+            </Modal>
+
           </div>
         </div>
       );

+ 10 - 0
js/component/manageCenter/project/content.jsx

@@ -50,6 +50,16 @@ class Content extends Component {
           });
         });
         break;
+      //人员评分表
+      case "score":
+        require.ensure([], () => {
+          const ProjectScore= require("./project/score")
+            .default;
+          this.setState({
+            component: <ProjectScore ApiUrl={""} />
+          });
+        });
+        break;
       //项目汇总表
       case "highTech":
         require.ensure([], () => {

+ 473 - 0
js/component/manageCenter/project/project/score.jsx

@@ -0,0 +1,473 @@
+import React from 'react';
+import {
+  DatePicker,
+  Tooltip,
+  Button,
+  Input,
+  Select,
+  Spin,
+  Table,
+  message,
+  Form,
+  Tabs,
+} from 'antd';
+import $ from 'jquery/src/ajax';
+import moment from 'moment';
+import { ShowModal, } from "@/tools.js";
+import { station } from "@/dataDic";
+import ShowModalDiv from "@/showModal.jsx";
+import { ChooseList } from "../../order/orderNew/chooseList";
+
+const TabPane = Tabs.TabPane;
+
+const ProjecScore = Form.create()(React.createClass({
+
+  getInitialState() {
+    return {
+      searchValues: {},
+      loading: false,
+      exportPendingLoading: false,
+      changeList: undefined,
+      dataSource: [],
+      pagination: {
+        defaultCurrent: 1,
+        defaultPageSize: 10,
+        showQuickJumper: true,
+        pageSize: 10,
+        onChange: function (page) {
+          this.loadData(page);
+        }.bind(this),
+        showTotal: function (total) {
+          return '共' + total + '条数据';
+        }
+      },
+      columns: [
+        {
+          title: "用户姓名",
+          dataIndex: "name",
+          key: "name",
+        },
+        {
+          title: "高新&科技评分",
+          dataIndex: "htSatScoreAverage",
+          key: "htSatScoreAverage",
+          render: (text, record) => {
+            return (
+              <div>{text}分</div>
+            )
+          },
+        },
+        {
+          title: '会员评分',
+          dataIndex: 'memberScoreAverage',
+          key: 'memberScoreAverage',
+          render: (text, record) => {
+            return (
+              <div>{text}分</div>
+            )
+          },
+        },
+        {
+          title: "高新&科技总数/待评/已评",
+          dataIndex: "htSatCount",
+          key: "htSatCount",
+          render: (text, record) => {
+            return (
+              <div>{text + " / " + record.htSatNotScoreCount + " / " + record.htSatScoreCount}</div>
+            )
+          },
+        },
+        {
+          title: "会员总数/待评/已评",
+          dataIndex: "memberCount",
+          key: "memberCount",
+          render: (text, record) => {
+            return (
+              <div>{text + " / " + record.memberNotScoreCount + " / " + record.memberScoreCount}</div>
+            )
+          },
+        },
+        {
+          title: '部门',
+          dataIndex: 'depName',
+          key: 'depName',
+        },
+        {
+          title: "上级主管姓名",
+          dataIndex: "superName",
+          key: "superName",
+        },
+        {
+          title: "状态",
+          dataIndex: "status",
+          key: "status",
+          render: (text, record) => {
+            return (
+              <div style={{ color: ["green", "red"][text] }}>{["正常", "锁定"][text]}</div>
+            )
+          }
+        },
+        {
+          title: '最后登录时间',
+          dataIndex: 'lastLoginTime',
+          key: 'lastLoginTime',
+        },
+
+      ],
+      dataSource: [],
+      departmentArr: [],
+      roleArr: [],
+    };
+  },
+
+  componentWillMount() {
+    this.departmentList();
+    this.rolesList();
+  },
+
+  loadData(pageNo) {
+    const { searchValues, pagination } = this.state;
+    this.setState({
+      loading: true,
+    });
+    let datas = Object.assign(searchValues, {
+      pageNo: pageNo || 1,
+      pageSize: pagination.pageSize,
+    });
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/taskScore/list",
+      data: datas,
+      success: function (data) {
+        ShowModal(this);
+        this.setState({
+          loading: false,
+        });
+        if (data.error && data.error.length === 0) {
+          if (data.data.list) {
+            pagination.current = data.data.pageNo;
+            pagination.total = data.data.totalCount;
+            if (data.data && data.data.list && !data.data.list.length) {
+              pagination.current = 0;
+              pagination.total = 0;
+            }
+            this.setState({
+              dataSource: data.data.list,
+              pagination: this.state.pagination,
+              pageNo: data.data.pageNo,
+            });
+          } else {
+            this.setState({
+              dataSource: data.data,
+              pagination: false,
+            });
+          }
+        } else {
+          message.warning(data.error[0].message);
+        }
+      }.bind(this),
+    }).always(
+      function () {
+        this.setState({
+          loading: false,
+        });
+      }.bind(this)
+    );
+  },
+
+  // 部门
+  departmentList() {
+    const { searchValues } = this.state
+    this.setState({
+      loading: true,
+    });
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/organization/selectSuperId",
+      data: {},
+      success: function (data) {
+        let thedata = data.data;
+        let theArr = [];
+        if (!thedata) {
+          if (data.error && data.error.length) {
+            message.warning(data.error[0].message);
+          }
+          thedata = {};
+        } else {
+          thedata.map(function (item, index) {
+            theArr.push({
+              key: index,
+              name: item.name,
+              id: item.id,
+            });
+            if (item.name == "科德-研发服务事业部") {
+              searchValues["depId"] = item.id
+            }
+          });
+        }
+        this.setState({
+          departmentArr: theArr,
+          searchValues: searchValues,
+        }, () => {
+          this.loadData();
+        });
+      }.bind(this),
+    }).always(
+      function () {
+        this.setState({
+          loading: false,
+        });
+      }.bind(this)
+    );
+  },
+
+  //角色
+  rolesList() {
+    this.setState({
+      loading: true
+    });
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/roles",
+      data: {
+
+      },
+      success: function (data) {
+        let thedata = data.data;
+        let theArr = [];
+        if (!thedata) {
+          if (data.error && data.error.length) {
+            message.warning(data.error[0].message);
+          };
+          thedata = {};
+        } else {
+          thedata.map(function (item, index) {
+            theArr.push({
+              key: index,
+              roleName: item.roleName,
+              id: item.id,
+            })
+          })
+        }
+        this.setState({
+          roleArr: theArr,
+        })
+      }.bind(this),
+    }).always(function () {
+      this.setState({
+        loading: false
+      });
+    }.bind(this));
+  },
+
+  changeList(arr) {
+    const newArr = [];
+    let list = this.state.columns
+    list.forEach((item) => {
+      arr.forEach((val) => {
+        if (val === item.title) {
+          newArr.push(item);
+        }
+      });
+    });
+    this.setState({
+      changeList: newArr,
+    });
+  },
+
+  exportAll() {
+    message.config({
+      duration: 20,
+    });
+    let loading = message.loading("下载中...");
+    this.setState({
+      exportPendingLoading: true,
+    });
+    let data = JSON.parse(JSON.stringify(this.state.searchValues));
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: "/api/admin/taskScore/list/export",
+      data,
+      success: function (data) {
+        if (data.error.length === 0) {
+          this.download(data.data);
+        } else {
+          message.warning(data.error[0].message);
+        }
+      }.bind(this),
+    }).always(
+      function () {
+        loading();
+        this.setState({
+          exportPendingLoading: false,
+        });
+      }.bind(this)
+    );
+  },
+
+  download(fileName) {
+    window.location.href =
+      globalConfig.context + "/open/download?fileName=" + fileName;
+  },
+
+  search() {
+    this.loadData();
+  },
+
+  reset() {
+    this.setState({
+      searchValues: JSON.parse(JSON.stringify({})),
+    }, () => {
+      this.loadData();
+    })
+  },
+
+  render() {
+    const { searchValues, roleArr } = this.state
+    let departmentArr = this.state.departmentArr || [];
+    return (
+      <div className="user-content">
+        <ShowModalDiv ShowModal={this.state.showModal} onClose={() => { this.setState({ showModal: false }) }} />
+        <div className="content-title" style={{ marginBottom: 10 }}>
+          <span style={{ fontWeight: 900, fontSize: 16 }}>科德研发服务评价系统</span>
+        </div>
+        <div className="user-search">
+          <Tabs
+            defaultActiveKey="1"
+            className="test">
+            <TabPane tab="搜索" key="1">
+              <div
+                className="user-search"
+                style={{
+                  marginTop: "10px",
+                  marginLeft: "10px",
+                  marginRight: "10px",
+                }}
+              >
+                <Input
+                  placeholder="用户名称"
+                  style={{
+                    width: 220,
+                    marginRight: "10px",
+                  }}
+                  value={searchValues["name"]
+                    ? searchValues["name"]
+                    : ""}
+                  onChange={(e) => {
+                    searchValues["name"] = e.target.value;
+                    this.setState({
+                      searchValues: searchValues,
+                    });
+                  }}
+                />
+                <Select
+                  placeholder="选择负责部门"
+                  style={{ width: 170, }}
+                  value={searchValues["depId"]
+                    ? searchValues["depId"]
+                    : undefined}
+                  onChange={(e) => {
+                    searchValues["depId"] = e
+                    this.setState({
+                      searchValues: searchValues,
+                    });
+                  }}
+                >
+                  {departmentArr.map(function (item) {
+                    return (
+                      <Select.Option key={item.id}>{item.name}</Select.Option>
+                    );
+                  })}
+                </Select>
+                <Select
+                  placeholder="角色"
+                  style={{ width: 180 }}
+                  value={this.state.rolesSearch}
+                  onChange={e => {
+                    this.setState({ rolesSearch: e });
+                  }}
+                >
+                  {roleArr.map(function (item) {
+                    return (
+                      <Select.Option key={item.id}>
+                        {item.roleName}
+                      </Select.Option>
+                    );
+                  })}
+                </Select>
+                <Select
+                  placeholder="岗位"
+                  style={{ width: 100 }}
+                  value={searchValues["position"]
+                    ? searchValues["position"]
+                    : undefined}
+                  onChange={e => {
+                    searchValues["position"] = e
+                    this.setState({
+                      searchValues: searchValues,
+                    });
+                  }}
+                >
+                  {station.map(function (item) {
+                    return (
+                      <Select.Option key={item.value}>
+                        {item.key}
+                      </Select.Option>
+                    );
+                  })}
+                </Select>
+                <Button type="primary" onClick={this.search} style={{ marginRight: 10 }}>
+                  搜索
+                </Button>
+                <Button onClick={this.reset}>重置</Button>
+              </div>
+            </TabPane>
+            <TabPane tab="更改表格显示数据" key="2">
+              <div style={{ marginLeft: 10 }}>
+                <ChooseList
+                  columns={this.state.columns}
+                  changeFn={this.changeList}
+                  changeList={this.state.changeList}
+                  top={55}
+                  margin={11}
+                />
+              </div>
+            </TabPane>
+            <TabPane tab="导出EXCEL" key="3">
+              <Button
+                type="primary"
+                loading={this.state.exportPendingLoading}
+                onClick={this.exportAll}
+                style={{ margin: 10 }}
+              >
+                导出excel
+              </Button>
+            </TabPane>
+          </Tabs>
+        </div>
+        <div className="patent-table">
+          <Spin spinning={this.state.loading}>
+            <Table
+              columns={this.state.changeList
+                ? this.state.changeList
+                : this.state.columns}
+              dataSource={this.state.dataSource}
+              pagination={this.state.pagination}
+              bordered
+            />
+          </Spin>
+        </div>
+      </div >
+    );
+  }
+}));
+
+export default ProjecScore;

+ 197 - 18
js/component/manageCenter/project/summary/highTech.jsx

@@ -10,6 +10,7 @@ import {
   Tabs,
   Cascader,
   AutoComplete,
+  Modal,
 } from "antd";
 import { ShowModal, getApprovedType } from "@/tools";
 import { ChooseList } from "../../order/orderNew/chooseList";
@@ -36,11 +37,13 @@ class HighTech extends Component {
   constructor(props) {
     super(props);
     this.state = {
+      dataScore: {},
+      score: "",
       approvaType: [],
       tbaindex: 1,
       loading: false,
       changeList: undefined,
-      columns: currency,
+      columns: currency(this.showD.bind(this)),
       status: 0,
       page: 1,
       pagination: {
@@ -82,6 +85,56 @@ class HighTech extends Component {
     this.selectAuto = this.selectAuto.bind(this);
     this.blurChange = this.blurChange.bind(this);
 
+    this.hidD = this.hidD.bind(this);
+  }
+
+  showD(record) {
+    this.setState({
+      loading: true,
+    })
+    $.ajax({
+      method: "get",
+      dataType: "json",
+      crossDomain: false,
+      url: globalConfig.context + "/api/admin/taskScore/queryByTid",
+      data: {
+        tid: record.id,
+      },
+      success: function (data) {
+        if (data.error.length) {
+          this.setState({
+            loading: false,
+          });
+          message.warning(data.error[0].message);
+        } else {
+          if (!data.data) {
+            this.setState({
+              score: "",
+            })
+          } else {
+            this.setState({
+              score: "selcet",
+              cSort: record.cSort,
+              cname: record.pname,
+              tname: record.techName,
+              dataScore: data.data,
+            });
+          }
+        }
+      }.bind(this),
+    }).always(
+      function () {
+        this.setState({
+          loading: false,
+        });
+      }.bind(this)
+    );
+  }
+
+  hidD() {
+    this.setState({
+      score: ""
+    });
   }
 
   changeList(arr) {
@@ -196,7 +249,7 @@ class HighTech extends Component {
         deps: "",
         thchDeps: "",
         projectStatus: "",
-        columns: currency,
+        columns: currency(this.showD.bind(this)),
         status: 0,
         thchId: "",
         auto: "",
@@ -415,14 +468,14 @@ class HighTech extends Component {
       this.setState({
         columns:
           e == "0"
-            ? currency : e == "1"
-              ? patent : e == "2"
-                ? softWriting : e == "3"
-                  ? audit : e == "4"
-                    ? doubleSoft : e == "5"
-                      ? highTechColumns : e == "6"
-                        ? currency : e == "7"
-                          ? member : currency,
+            ? currency(this.showD.bind(this)) : e == "1"
+              ? patent(this.showD.bind(this)) : e == "2"
+                ? softWriting(this.showD.bind(this)) : e == "3"
+                  ? audit(this.showD.bind(this)) : e == "4"
+                    ? doubleSoft(this.showD.bind(this)) : e == "5"
+                      ? highTechColumns(this.showD.bind(this)) : e == "6"
+                        ? currency(this.showD.bind(this)) : e == "7"
+                          ? member(this.showD.bind(this)) : currency(this.showD.bind(this)),
       }, () => {
         this.defaultcolumns();
       });
@@ -438,6 +491,57 @@ class HighTech extends Component {
     }
   }
 
+  getScore(name, cSort, val) {
+    let data = ""
+    let list = []
+    if (cSort == 6) {
+      if (name == "zyd" || name == "gtl" || name == "ydhb") {
+        list = [
+          { title: name == "zyd" ? "很专业" : "很满意", list: [20, 19, 18, 17, 16, 15, 14, 13] },
+          { title: name == "zyd" ? "专业" : "满意", list: [12, 11, 10, 9, 8, 7] },
+          { title: "一般", list: [6, 5, 4, 3, 2, 1] },
+          { title: name == "zyd" ? "不专业" : "不满意", list: [0] },
+        ]
+      } else if (name == "xyd" || name == "gcxx" || name == "fwtd" || name == "ndhb") {
+        list = [
+          { title: name == "xyd" ? "很速度" : "很满意", list: [10, 9, 8, 7] },
+          { title: name == "xyd" ? "速度" : "满意", list: [6, 5, 4] },
+          { title: "一般", list: [3, 2, 1] },
+          { title: name == "xyd" ? "很慢" : "不满意", list: [0] },
+        ]
+      }
+    } else {
+      if (name == "zyd" || name == "gtl") {
+        list = [
+          { title: name == "zyd" ? "很专业" : "很满意", list: [30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20] },
+          { title: name == "zyd" ? "专业" : "满意", list: [19, 18, 17, 16, 15, 14, 13, 12, 11, 10] },
+          { title: "一般", list: [9, 8, 7, 6, 5, 4, 3, 2, 1] },
+          { title: name == "zyd" ? "不专业" : "不满意", list: [0] },
+        ]
+      } else if (name == "gcxx" || name == "fwtd") {
+        list = [
+          { title: "很满意", list: [15, 14, 13, 12, 11] },
+          { title: "满意", list: [10, 9, 8, 7, 6] },
+          { title: "一般", list: [5, 4, 3, 2, 1] },
+          { title: "不满意", list: [0] },
+        ]
+      } else if (name == "xyd") {
+        list = [
+          { title: "很速度", list: [10, 9, 8, 7] },
+          { title: "速度", list: [6, 5, 4] },
+          { title: "一般", list: [3, 2, 1] },
+          { title: "很慢", list: [0] },
+        ]
+      }
+    }
+    list.map(function (item) {
+      if (item.list.includes(val)) {
+        data = item.title + "(" + val + "分)"
+      }
+    })
+    return data
+  }
+
   render() {
     const dataSources = this.state.customerArr || [];
     const options = dataSources.map((group) => (
@@ -542,14 +646,14 @@ class HighTech extends Component {
                                         ? 5 : 0,
                           columns:
                             two == "0"
-                              ? currency : two == "1"
-                                ? patent : two == "2"
-                                  ? softWriting : two == "3"
-                                    ? audit : two == "4"
-                                      ? doubleSoft : two == "5"
-                                        ? highTechColumns : two == "6"
-                                          ? currency : two == "7"
-                                            ? member : currency,
+                              ? currency(this.showD.bind(this)) : two == "1"
+                                ? patent(this.showD.bind(this)) : two == "2"
+                                  ? softWriting(this.showD.bind(this)) : two == "3"
+                                    ? audit(this.showD.bind(this)) : two == "4"
+                                      ? doubleSoft(this.showD.bind(this)) : two == "5"
+                                        ? highTechColumns(this.showD.bind(this)) : two == "6"
+                                          ? currency(this.showD.bind(this)) : two == "7"
+                                            ? member(this.showD.bind(this)) : currency(this.showD.bind(this)),
                         }, () => {
                           this.defaultcolumns()
                         })
@@ -967,6 +1071,81 @@ class HighTech extends Component {
             }}
           />
         ) : null}
+
+        <Modal
+          maskClosable={false}
+          visible={this.state.score != ""}
+          footer=""
+          title="项目评分"
+          width={400}
+          onCancel={() => {
+            this.setState({
+              score: "",
+              cSort: "",
+              cname: "",
+              tname: "",
+            })
+          }}
+        >
+          <div style={{ position: "relative" }}>
+            <div
+              style={{
+                position: "absolute",
+                right: 100,
+                top: 50,
+                fontSize: "40px",
+                color: "red"
+              }}
+            >{this.state.dataScore.professionalism + this.state.dataScore.communicationSkills + this.state.dataScore.responsiveness + this.state.dataScore.publicImage + this.state.dataScore.serviceAttitude + this.state.dataScore.monthlyReport + this.state.dataScore.yearReport}分</div>
+            <div>
+              <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>项目名称</span>:{this.state.cname}
+            </div>
+            <div>
+              <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>项目咨询</span>:{this.state.tname}
+            </div>
+            <div>
+              <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>专&nbsp;业&nbsp;度</span>:{this.getScore("zyd", this.state.cSort, this.state.dataScore.professionalism)}
+            </div>
+            <div>
+              <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>沟&nbsp;通&nbsp;力</span>:{this.getScore("gtl", this.state.cSort, this.state.dataScore.communicationSkills)}
+            </div>
+            <div>
+              <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>响&nbsp;应&nbsp;度</span>:{this.getScore("xyd", this.state.cSort, this.state.dataScore.responsiveness)}
+            </div>
+            <div>
+              <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>公出形象</span>:{this.getScore("gcxx", this.state.cSort, this.state.dataScore.publicImage)}
+            </div>
+            <div>
+              <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>服务态度</span>:{this.getScore("fwtd", this.state.cSort, this.state.dataScore.serviceAttitude)}
+            </div>
+            {this.state.cSort == 6 &&
+              <div>
+                <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>月度汇报</span>:{this.getScore("ydhb", this.state.cSort, this.state.dataScore.monthlyReport)}
+              </div>}
+            {this.state.cSort == 6 &&
+              <div>
+                <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>年度汇报</span>:{this.getScore("ndhb", this.state.cSort, this.state.dataScore.yearReport)}
+              </div>}
+            <div>
+              <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>评分理由</span>:{this.state.dataScore.remarks}
+            </div>
+            <div>
+              <span style={{ width: 50, display: "inline-block", margin: "5px 0" }}>评分时间</span>:{moment(this.state.dataScore.createTime).format('YYYY-MM-DD HH:mm:ss')}
+            </div>
+            <div style={{ marginTop: 10, textAlign: "center" }}>
+              <Button
+                type="primary"
+                onClick={() => {
+                  this.setState({
+                    score: ""
+                  })
+                }}
+              >
+                关闭
+              </Button>
+            </div>
+          </div>
+        </Modal>
       </div>
     );
   }

+ 135 - 8
js/component/manageCenter/project/summary/highTechConfig.jsx

@@ -1,11 +1,11 @@
 import { Tooltip } from 'antd';
 import React from 'react';
 import { getProjectName, getFormRetrieves, getApprovedType } from '@/tools';
-import { Button } from 'antd';
+import { Button, Modal } from 'antd';
 
 
 // 高新会员服务
-const member = [
+const member = (onCellClick) => [
   {
     title: "序号",
     dataIndex: "key",
@@ -183,6 +183,24 @@ const member = [
     isNoD: true,
   },
   {
+    title: "评分及时间",
+    dataIndex: "scoreNumber",
+    key: "scoreNumber",
+    width: 80,
+    onCellClick: (record, e) => {
+      e.stopPropagation();
+      onCellClick(record)
+    },
+    render: (value, record) => {
+      return (
+        <div>
+          <div>{value}分</div>
+          <div>{record.scoreTime}</div>
+        </div>
+      );
+    }
+  },
+  {
     title: "满意度调查表",
     dataIndex: "formRetrieve",
     key: "formRetrieve",
@@ -198,7 +216,7 @@ const member = [
 ];
 
 // 高新
-const highTechColumns = [
+const highTechColumns = (onCellClick) => [
   {
     title: "序号",
     dataIndex: "key",
@@ -381,6 +399,24 @@ const highTechColumns = [
     isNoD: true,
   },
   {
+    title: "评分及时间",
+    dataIndex: "scoreNumber",
+    key: "scoreNumber",
+    width: 80,
+    onCellClick: (record, e) => {
+      e.stopPropagation();
+      onCellClick(record)
+    },
+    render: (value, record) => {
+      return (
+        <div>
+          <div>{value}分</div>
+          <div>{record.scoreTime}</div>
+        </div>
+      );
+    }
+  },
+  {
     title: "满意度调查表",
     dataIndex: "formRetrieve",
     key: "formRetrieve",
@@ -396,7 +432,7 @@ const highTechColumns = [
 ];
 
 // 双软
-const doubleSoft = [
+const doubleSoft = (onCellClick) => [
   {
     title: "序号",
     dataIndex: "key",
@@ -546,6 +582,24 @@ const doubleSoft = [
     isNoD: true,
   },
   {
+    title: "评分及时间",
+    dataIndex: "scoreNumber",
+    key: "scoreNumber",
+    width: 80,
+    onCellClick: (record, e) => {
+      e.stopPropagation();
+      onCellClick(record)
+    },
+    render: (value, record) => {
+      return (
+        <div>
+          <div>{value}分</div>
+          <div>{record.scoreTime}</div>
+        </div>
+      );
+    }
+  },
+  {
     title: "满意度调查表",
     dataIndex: "formRetrieve",
     key: "formRetrieve",
@@ -561,7 +615,7 @@ const doubleSoft = [
 ];
 
 // 软著
-const softWriting = [
+const softWriting = (onCellClick) => [
   {
     title: "序号",
     dataIndex: "key",
@@ -750,6 +804,24 @@ const softWriting = [
     isNoD: true,
   },
   {
+    title: "评分及时间",
+    dataIndex: "scoreNumber",
+    key: "scoreNumber",
+    width: 80,
+    onCellClick: (record, e) => {
+      e.stopPropagation();
+      onCellClick(record)
+    },
+    render: (value, record) => {
+      return (
+        <div>
+          <div>{value}分</div>
+          <div>{record.scoreTime}</div>
+        </div>
+      );
+    }
+  },
+  {
     title: "满意度调查表",
     dataIndex: "formRetrieve",
     key: "formRetrieve",
@@ -765,7 +837,7 @@ const softWriting = [
 ];
 
 // 专利
-const patent = [
+const patent = (onCellClick) => [
   {
     title: "序号",
     dataIndex: "key",
@@ -966,6 +1038,24 @@ const patent = [
     isNoD: true,
   },
   {
+    title: "评分及时间",
+    dataIndex: "scoreNumber",
+    key: "scoreNumber",
+    width: 80,
+    onCellClick: (record, e) => {
+      e.stopPropagation();
+      onCellClick(record)
+    },
+    render: (value, record) => {
+      return (
+        <div>
+          <div>{value}分</div>
+          <div>{record.scoreTime}</div>
+        </div>
+      );
+    }
+  },
+  {
     title: "满意度调查表",
     dataIndex: "formRetrieve",
     key: "formRetrieve",
@@ -981,7 +1071,7 @@ const patent = [
 ];
 
 // 审计
-const audit = [
+const audit = (onCellClick) => [
   {
     title: "序号",
     dataIndex: "key",
@@ -1162,6 +1252,24 @@ const audit = [
     isNoD: true,
   },
   {
+    title: "评分及时间",
+    dataIndex: "scoreNumber",
+    key: "scoreNumber",
+    width: 80,
+    onCellClick: (record, e) => {
+      e.stopPropagation();
+      onCellClick(record)
+    },
+    render: (value, record) => {
+      return (
+        <div>
+          <div>{value}分</div>
+          <div>{record.scoreTime}</div>
+        </div>
+      );
+    }
+  },
+  {
     title: "满意度调查表",
     dataIndex: "formRetrieve",
     key: "formRetrieve",
@@ -1177,7 +1285,7 @@ const audit = [
 ];
 
 // 通用表
-const currency = [
+const currency = (onCellClick) => [
   {
     title: "序号",
     dataIndex: "key",
@@ -1330,6 +1438,24 @@ const currency = [
     isNoD: true,
   },
   {
+    title: "评分及时间",
+    dataIndex: "scoreNumber",
+    key: "scoreNumber",
+    width: 80,
+    onCellClick: (record, e) => {
+      e.stopPropagation();
+      onCellClick(record)
+    },
+    render: (value, record) => {
+      return (
+        <div>
+          <div>{value}分</div>
+          <div>{record.scoreTime}</div>
+        </div>
+      );
+    }
+  },
+  {
     title: "满意度调查表",
     dataIndex: "formRetrieve",
     key: "formRetrieve",
@@ -1344,6 +1470,7 @@ const currency = [
   },
 ];
 
+
 export {
   member,
   highTechColumns,

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "afanti",
-  "version": "1.3.25",
+  "version": "1.3.28",
   "description": "",
   "main": "index.js",
   "scripts": {