HW 4 éve%!(EXTRA string=óta)
szülő
commit
368cb59f92
33 módosított fájl, 6988 hozzáadás és 153 törlés
  1. 16 0
      js/admin/customerService.js
  2. 5 4
      js/component/common/imgList/index.js
  3. 24 0
      js/component/common/orderItemStatus/index.jsx
  4. 1 0
      js/component/dataDic.js
  5. 79 34
      js/component/manageCenter/customer/NEW/intentionCustomer/channel.jsx
  6. 2 2
      js/component/manageCenter/customer/NEW/intentionCustomer/intentionCustomer.jsx
  7. 3 2
      js/component/manageCenter/customer/NEW/intentionCustomer/transferRecords.jsx
  8. 57 0
      js/component/manageCenter/customerService/administration/correspondingDetails.jsx
  9. 473 0
      js/component/manageCenter/customerService/administration/customerServiceRecord.jsx
  10. 562 0
      js/component/manageCenter/customerService/administration/followUp.jsx
  11. 845 0
      js/component/manageCenter/customerService/administration/followUpDetails.jsx
  12. 4388 0
      js/component/manageCenter/customerService/administration/order.jsx
  13. 120 0
      js/component/manageCenter/customerService/administration/userMangagement.less
  14. 75 0
      js/component/manageCenter/customerService/content.jsx
  15. 8 1
      js/component/manageCenter/order/orderNew/contractJsjl.js
  16. 9 2
      js/component/manageCenter/order/orderNew/contractJsy.js
  17. 9 2
      js/component/manageCenter/project/project/outsourceTaskAssignment.jsx
  18. 1 1
      js/component/manageCenter/project/project/projectAssignment.jsx
  19. 0 25
      js/component/manageCenter/project/project/projectQuery.jsx
  20. 8 1
      js/component/manageCenter/project/summary/projectDetails.jsx
  21. 56 15
      js/component/manageCenter/project/task/myTask.jsx
  22. 12 2
      js/component/manageCenter/project/task/myTaskOutsource.jsx
  23. 32 4
      js/component/manageCenter/project/task/payApplyReject/detailsModal/index.js
  24. 119 0
      js/component/manageCenter/project/task/projectLog.jsx
  25. 9 2
      js/component/manageCenter/project/task/taskAssignment.jsx
  26. 9 1
      js/component/manageCenter/project/task/taskCount.jsx
  27. 14 29
      js/component/manageCenter/project/task/taskQuery.jsx
  28. 9 19
      js/component/manageCenter/publicComponent/assign.jsx
  29. 2 2
      js/component/manageCenter/set/userManagementS/roles.jsx
  30. 20 3
      js/component/zhuanjiaoDetail.jsx
  31. 1 1
      package.json
  32. 13 0
      webpack.config.js
  33. 7 1
      webpack/entry.config.js

+ 16 - 0
js/admin/customerService.js

@@ -0,0 +1,16 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import '../../css/base.less';
+
+import TopTab from '../component/manageCenter/topTab.jsx';
+import Footer from '../component/manageCenter/bottom.jsx';
+import Content from '../component/manageCenter/customerService/content.jsx';
+
+ReactDOM.render(
+    <div className="wrap clearfix">
+        <TopTab active={'customerService'}/>
+        <Content />
+        <Footer />
+    </div>,
+    document.getElementById('root')
+)

+ 5 - 4
js/component/common/imgList/index.js

@@ -67,10 +67,10 @@ class ImgList extends Component{
     }
 
     beforeUpload(file) {
-        const isJPG = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg';
-        if (!isJPG) {
+        const isJPG = file.type.split('/');
+        if (isJPG[0] !== 'image') {
             message.error('只能上传图片文件!');
-            return isJPG;
+            return false;
         }
         const isLt2M = file.size / 1024 / 1024 < 10;
         if (!isLt2M) {
@@ -102,6 +102,7 @@ class ImgList extends Component{
                     <Spin spinning={Object.keys(this.props.uploadConfig).length !== 0 ? false : (fileList.length === 0 ? false : this.state.loading)} tip="图片加载中...">
                         <Upload
                             {...this.props.uploadConfig}
+                            accept="image/*"
                             className={Object.keys(this.props.uploadConfig).length !== 0 ? "" : "demandDetailShow-upload" }
                             listType="picture-card"
                             fileList={
@@ -240,4 +241,4 @@ ImgList.defaultProps = {
     onChange:()=>{}
 }
 
-export default ImgList;
+export default ImgList;

+ 24 - 0
js/component/common/orderItemStatus/index.jsx

@@ -0,0 +1,24 @@
+import React,{Component} from "react";
+import {Tag} from "antd";
+
+class OrderItemStatus extends Component{
+    constructor(props) {
+        super(props);
+    }
+
+    render() {
+        return (
+            <span>
+                {/*0正常 1作废 2锁定 3变更中*/}
+                {
+                    this.props.deleteSign === 0 ? <Tag color="#87d068">正常</Tag> :
+                        this.props.deleteSign === 1 ? <Tag color="#f00">作废</Tag> :
+                            this.props.deleteSign === 2 ? <Tag color="#f50">锁定</Tag> :
+                                this.props.deleteSign === 3? <Tag color="#108ee9">变更中</Tag> : <Tag color="#000">未知</Tag>
+                }
+            </span>
+        )
+    }
+}
+
+export default OrderItemStatus

+ 1 - 0
js/component/dataDic.js

@@ -2297,6 +2297,7 @@ module.exports = {
   ],
   actives: [
     { value: "客户管理", key: "myClient" },
+    { value: "客服管理", key: "customerService" },
     { value: "科技服务项目", key: "services" },
     { value: "科技成果管理", key: "achievement" },
     { value: "科技需求管理", key: "demand" },

+ 79 - 34
js/component/manageCenter/customer/NEW/intentionCustomer/channel.jsx

@@ -12,7 +12,7 @@ import {
     Tabs,
     Tooltip,
     Upload,
-    Modal
+    Modal, Tag
 } from "antd";
 import {ChooseList} from "../../../order/orderNew/chooseList";
 import $ from "jquery/src/ajax";
@@ -142,41 +142,52 @@ class Channel extends Component{
             releaseDate:[],
 
             upLoad: {
-                name: "file",
-                action: globalConfig.context + "/api/user/channel/import",
-                headers: {
-                    authorization: "authorization-text"
-                },
-                onChange: info => {
-                    if (info.file.status === "done") {
-                        this.setState({
-                            upLoadFileLoading:false
-                        })
-                        if (info.file.response && info.file.response.error.length === 0) {
-                            if(info.file.response.data === 1){
-                                message.success("导入成功!");
+                customRequest: (options) => {
+                    this.setState({
+                        upLoadFileLoading: true,
+                    })
+                    let params = new FormData();
+                    params.append("file", options.file);
+                    $.ajax({
+                        method: "post",
+                        url: globalConfig.context + "/api/user/channel/import",
+                        async: true,
+                        cache: false,
+                        contentType: false,
+                        processData: false,
+                        data:params
+                    }).done(
+                        function (data) {
+                            this.setState({
+                                upLoadFileLoading: false,
+                            })
+                            if (data.error.length === 0) {
+                                if(data.data === 1){
+                                    message.success("导入成功!");
+                                }else if(data.data.list.length > 0){
+                                    message.warning('已成功导入!错误/重复客户无法导入,请查看错误渠道数据!');
+                                    this.setState({
+                                        duplicateData: [],
+                                        duplicateDataVisible: true
+                                    })
+                                }
+                                this.loadData();
+                            } else {
+                                message.warning(data.error[0].message);
                                 this.loadData();
-                            }else if(info.file.response.data.list.length > 0){
-                                message.warning('已成功导入!错误/重复客户无法导入,请查看错误渠道数据!');
-                                this.setState({
-                                    duplicateData: [],
-                                    duplicateDataVisible: true
-                                })
                             }
-                        } else {
-                            message.warning(info.file.response.error[0].message);
-                        }
-                    }else if(info.file.status === "uploading"){
-                        this.setState({
-                            upLoadFileLoading:true
-                        })
-                    }else{
-                        this.loadData(this.state.pageNo);
-                        this.setState({
-                            upLoadFileLoading:false
-                        })
-                    }
-                }
+                        }.bind(this)
+                    ).always(
+                        function () {
+                            this.loadData();
+                            this.setState({
+                                upLoadFileLoading: false,
+                            });
+                        }.bind(this)
+                    );
+                },
+                name: "file",
+                action: globalConfig.context + "/api/user/channel/import",
             },
 
             followData: '',
@@ -230,6 +241,22 @@ class Channel extends Component{
         this.loadData();
         this.category();
 
+        if(this.props.type === 0 || this.props.type === 3){
+            this.state.columns.push({
+                title: "分配时间",
+                dataIndex: "distributionTimes",
+                key: "distributionTimes",
+            });
+            this.state.columns.push({
+                title: "剩余签单(天)",
+                dataIndex: "days",
+                key: "days",
+                render: (text) => (
+                    <Tag color='#f00'>{text}天</Tag>
+                )
+            });
+        }
+
         if(this.props.followUp){
             this.state.columns.push({
                 title: "当前跟进人",
@@ -1012,6 +1039,24 @@ class Channel extends Component{
                             recoveryVisible:false
                         })
                     }}/> : ''}
+                {this.state.upLoadFileLoading ? <div style={{
+                    position:'fixed',
+                    display:'flex',
+                    flexFlow:'column',
+                    justifyContent:'center',
+                    alignItems:'center',
+                    top:0,
+                    bottom:0,
+                    left:0,
+                    right:0,
+                    background:'rgba(0,0,0,.7)',
+                    color:"#58a3ff",
+                    fontSize:'20px',
+                    zIndex:99999,
+                }}>
+                    <Spin spinning={this.state.upLoadFileLoading}/>
+                    <div style={{paddingTop:'10px'}}>客户名称匹配中...</div>
+                </div>: null}
             </div>
         )
     }

+ 2 - 2
js/component/manageCenter/customer/NEW/intentionCustomer/intentionCustomer.jsx

@@ -955,7 +955,7 @@ const IntentionCustomer = Form.create()(
                   type="primary"
                   disabled={!hasSelected || this.state.selectedRows.length > 1}
                 >
-                  转交记录
+                  客户日志
                 </Button>
                 <Button
                   style={{ marginLeft: 10 }}
@@ -1034,4 +1034,4 @@ const IntentionCustomer = Form.create()(
     },
   })
 );
-export default IntentionCustomer;
+export default IntentionCustomer;

+ 3 - 2
js/component/manageCenter/customer/NEW/intentionCustomer/transferRecords.jsx

@@ -26,7 +26,7 @@ const TransferRecords = React.createClass({
                     dataIndex: "newAName",
                     key: "newAName",
                 },
-                //  0录入 1 领取 2 转交私有客户 3转交业务 4 未跟进丢失(30) 5未签单丢失(270天)6释放  7转交签单客户  8渠道录入  9渠道客户分配  10 渠道客户转交 11渠道释放
+                //  0录入 1 领取 2 转交私有客户 3转交业务 4 未跟进丢失(30) 5未签单丢失(270天)6释放  7转交签单客户  8渠道录入  9渠道客户分配  10 渠道客户转交 11渠道释放 12 回收 13离职转交
                 {
                     title: "转交类型",
                     dataIndex: "type",
@@ -47,7 +47,8 @@ const TransferRecords = React.createClass({
                                                           text === 9 ? "渠道客户总监分配" :
                                                               text === 10 ? "渠道客户经理分配" :
                                                                   text === 11 ? "渠道释放" :
-                                                                      text === 12 ? '回收' : ""
+                                                                      text === 12 ? '回收' :
+                                                                          text === 13 ? '离职转交' :""
                   }
                 </span>
                         )

+ 57 - 0
js/component/manageCenter/customerService/administration/correspondingDetails.jsx

@@ -0,0 +1,57 @@
+import React,{Component} from "react";
+import {Modal, Table, Tooltip} from "antd";
+
+class CorrespondingDetails extends Component{
+    constructor(props) {
+        super(props);
+        this.state={
+            columns:[
+                {
+                    title: "申报项目",
+                    dataIndex: "project",
+                    key: "project",
+                },
+                {
+                    title: "咨询师",
+                    dataIndex: "consultant",
+                    key: "consultant",
+                },
+                {
+                    title: "申报批次",
+                    dataIndex: "declareBatch",
+                    key: "declareBatch",
+                },
+                {
+                    title: "证书编号",
+                    dataIndex: "certificationNo",
+                    key: "certificationNo",
+                },
+            ]
+        }
+    }
+
+    render() {
+        return (
+            <Modal
+                className="customeDetails"
+                footer=""
+                title='申报项目对应列表'
+                width="800px"
+                visible={this.props.visible}
+                onOk={this.props.onCancel}
+                onCancel={this.props.onCancel}
+                maskClosable={false}
+            >
+                <div>
+                    <Table
+                        columns={this.state.columns}
+                        dataSource={this.props.detailsInfor || []}
+                        pagination={null}
+                    />
+                </div>
+            </Modal>
+        )
+    }
+}
+
+export default CorrespondingDetails;

+ 473 - 0
js/component/manageCenter/customerService/administration/customerServiceRecord.jsx

@@ -0,0 +1,473 @@
+import React,{Component} from "react";
+import {DatePicker, Input, Radio, Select, Table, Checkbox, Button, message, Spin, Tooltip, Modal} from "antd";
+import $ from "jquery";
+import moment from "moment";
+
+const RadioGroup = Radio.Group;
+const confirm = Modal.confirm;
+
+class CustomerServiceRecord extends Component{
+    constructor(props) {
+        super(props);
+        this.state={
+            columns:[
+                {
+                    title: "跟进时间",
+                    dataIndex: "createTimes",
+                    key: "createTimes",
+                    width: 100,
+                },
+                {
+                    title: "跟进人",
+                    dataIndex: "adminName",
+                    key: "adminName",
+                    width: 100,
+                },
+                {
+                    title: "是否已添微信",
+                    dataIndex: "addWechat",
+                    key: "addWechat",
+                    width: 100,
+                    render: (text,record) => {
+                        let str = text === 1 ? '是('+record.wechat+')' : text === 0 ? '否' : '未知';
+                        return (
+                            <Tooltip placement="topLeft" title={str}>
+                                <div style={{
+                                    maxWidth:'100px',
+                                    overflow:'hidden',
+                                    textOverflow: "ellipsis",
+                                    whiteSpace:'nowrap',
+                                }}>{str}</div>
+                            </Tooltip>
+                        )
+                    }
+                },
+                {
+                    title: "续签情况",
+                    dataIndex: "renewal",
+                    key: "renewal",
+                    width: 150,
+                    render: (text,record) => {
+                        let str = text === 0 ? '其他' :
+                            text === 1 ? '否,企业已签其他机构' :
+                                text === 2 ? '否,企业自己申报' :
+                                    text === 3 ? '否,企业不打算申报/注销' :
+                                        text === 4 ? '否,客户考虑中,无报价' :
+                                            text === 5 ? '否,客户考虑中,已报价' :
+                                                text === 6 ? '是,已续签/复审,续签时间、续签项目('+record.renewalTimes+')' : '未知'
+                        return (
+                            <Tooltip placement="topLeft" title={str}>
+                                <div style={{
+                                    maxWidth:'150px',
+                                    overflow:'hidden',
+                                    textOverflow: "ellipsis",
+                                    whiteSpace:'nowrap',
+                                }}>{str}</div>
+                            </Tooltip>
+                        )
+                    }
+                },
+                {
+                    title: "已签项目",
+                    dataIndex: "signProject",
+                    key: "signProject",
+                    width: 150,
+                    render: (text) => {
+                        return (
+                            <Tooltip placement="topLeft" title={text}>
+                                <div style={{
+                                    maxWidth:'150px',
+                                    overflow:'hidden',
+                                    textOverflow: "ellipsis",
+                                    whiteSpace:'nowrap',
+                                }}>{text}</div>
+                            </Tooltip>)
+                    }
+                },
+                {
+                    title: "备注",
+                    dataIndex: "remarks",
+                    key: "remarks",
+                    width: 150,
+                    render: (text) => {
+                        return (
+                            <Tooltip placement="topLeft" title={text}>
+                                <div style={{
+                                    maxWidth:'150px',
+                                    overflow:'hidden',
+                                    textOverflow: "ellipsis",
+                                    whiteSpace:'nowrap',
+                                }}>{text}</div>
+                            </Tooltip>)
+                    }
+                },
+            ],
+            dataSource:[],
+            releaseDate:'',
+            addWechat:'',
+            wx:'',
+            situation:'',
+            comment:'',
+            selectUidByprojectList:[],
+            signProjectId:[],
+            signProject:[],
+            removeSelectList:[],
+        }
+        this.preservation = this.preservation.bind(this);
+        this.loadData = this.loadData.bind(this);
+        this.selectUidByprojectList = this.selectUidByprojectList.bind(this);
+        this.inquiry = this.inquiry.bind(this);
+    }
+
+    componentDidMount() {
+        this.loadData();
+    }
+
+    inquiry(){
+        let _this = this;
+        confirm({
+            title: '确定要保存提交吗?',
+            content: '请再次确定您填写的客服信息,客服信息提交后,不能修改或删除!',
+            okText: '确定',
+            okType: 'primary',
+            cancelText: '取消',
+            onOk() {
+                _this.preservation();
+            },
+        });
+    }
+
+    preservation(){
+        if(isNaN(parseInt(this.state.addWechat))){
+            message.warning('请选择是否添加客服微信');
+            return;
+        }
+        if(this.state.addWechat === 1 && !this.state.wx){
+            message.warning('请填写微信号');
+            return;
+        }
+        if(isNaN(parseInt(this.state.situation))){
+            message.warning('请选择续签情况');
+            return;
+        }
+        if(this.state.situation === 6 && !this.state.releaseDate){
+            message.warning('请选择续签时间');
+            return;
+        }
+        if(!this.state.comment){
+            message.warning('请填写备注');
+            return;
+        }
+        let hide = message.loading('提交中...',0);
+        this.setState({
+            preservationLoading: true
+        });
+        $.ajax({
+            url: globalConfig.context + '/api/admin/addUseService',
+            method: 'post',
+            data: {
+                uid:this.props.uid,
+                addWechat:this.state.addWechat,
+                wechat:this.state.wx,
+                renewal:this.state.situation,
+                renewalTimes:this.state.releaseDate,
+                remarks:this.state.comment,
+                signProjectId:this.state.signProjectId.join(','),
+                signProject:this.state.signProject.join(','),
+            }
+        }).done((res) => {
+            if (!res.error.length) {
+                message.success("提交成功");
+                this.loadData();
+            } else {
+                message.error(res.error[0].message);
+            }
+        }).always(() => {
+            hide();
+            this.setState({
+                preservationLoading: false
+            });
+        })
+    }
+
+    loadData() {
+        let _this = this;
+        this.setState({
+            listLoading: true,
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/listUseServiceFollow",
+            data: {
+                uid:this.props.uid
+            },
+            success: function (data) {
+                if (data.error && data.error.length) {
+                    message.warning(data.error[0].message);
+                }else {
+                    if(data.data.length !== 0){
+                        let info = data.data[0];
+                        let signProjectId = info.signProjectId ? info.signProjectId.split(',') : [];
+                        let signProject = info.signProject ? info.signProject.split(',') : [];
+                        this.setState({
+                            releaseDate:info.renewalTimes,
+                            addWechat:info.addWechat,
+                            wx:info.wechat,
+                            situation:info.renewal,
+                            comment:info.remarks,
+                            signProjectId:signProjectId,
+                            signProject:signProject,
+                        },()=>{
+                            _this.selectUidByprojectList(signProjectId,signProject);
+                        })
+                    }else{
+                        _this.selectUidByprojectList();
+                    }
+                    this.setState({
+                        dataSource: data.data,
+                    });
+                }
+            }.bind(this),
+        }).always(
+            function () {
+                this.setState({
+                    listLoading: false,
+                });
+            }.bind(this)
+        );
+    }
+
+    selectUidByprojectList(signProjectId = [],signProject=[]) {
+        this.setState({
+            selectLoading: true,
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/orderProject/selectUidByproject",
+            data: {
+                uid:this.props.uid
+            },
+            success: function (data) {
+                if (data.error && data.error.length) {
+                    message.warning(data.error[0].message);
+                }else{
+                    let removeArr = [];
+                    if(signProjectId.length > 0){
+                        let info = data.data;
+                        let arr = [];
+                        for(let i of info){
+                            for(let v of i.list){
+                                arr.push(v);
+                            }
+                        }
+                        for(let i of signProjectId){
+                            let arr1 = arr.filter(v=>{
+                                return i==v.id;
+                            });
+                            if(arr1.length < 1){
+                                let index = signProjectId.indexOf(i);
+                                removeArr.push(signProject[index])
+                            }
+                        }
+                    }
+
+                    this.setState({
+                        selectUidByprojectList:data.data,
+                        removeSelectList:removeArr
+                    })
+                }
+            }.bind(this),
+        }).always(
+            function () {
+                this.setState({
+                    selectLoading: false,
+                });
+            }.bind(this)
+        );
+    }
+
+    render() {
+        return (
+            <div style={{padding:"15px"}}>
+                <Spin spinning={this.state.listLoading}>
+                    <Table
+                        pagination={false}
+                        bordered
+                        size="small"
+                        columns={this.state.columns}
+                        dataSource={this.state.dataSource}
+                    />
+                </Spin>
+                <Spin spinning={this.state.listLoading}>
+                    <div style={{paddingTop:"20px"}}>
+                        <div style={{display:'flex',alignItems:"center",paddingBottom:"10px"}}>
+                            <div style={{fontWeight:"bolder",paddingRight:'10px'}}>添加客服微信:</div>
+                            <RadioGroup
+                                value={this.state.addWechat}
+                                onChange={(e) => {
+                                    this.setState({ addWechat: e.target.value });
+                                    if(e.target.value === 0){
+                                        this.setState({
+                                            wx:''
+                                        })
+                                    }
+                                }}
+                            >
+                                <Radio value={0}>否,暂未添加</Radio>
+                                <Radio value={1}>
+                                    <span>
+                                        是
+                                    </span>
+                                </Radio>
+                            </RadioGroup>
+                        </div>
+                        {this.state.addWechat === 1 ? <div style={{display:'flex',alignItems:"center",paddingBottom:"10px"}}>
+                            <div style={{fontWeight:"bolder",paddingRight:'10px'}}>微信号</div>
+                            <Input
+                                placeholder='请输入微信号'
+                                style={{ width: 150, marginRight: 10 }}
+                                value={this.state.wx}
+                                onChange={(e)=>{
+                                    this.setState({wx:e.target.value})
+                                }}/>
+                        </div> : null}
+                        <div style={{display:'flex',alignItems:"center",paddingBottom:"10px"}}>
+                            <div style={{fontWeight:"bolder",paddingRight:'10px'}}>续签情况:</div>
+                            <Select
+                                placeholder="续签情况"
+                                style={{ width: 250, marginRight: 10 }}
+                                value={this.state.situation}
+                                onChange={(e) => {
+                                    this.setState({ situation: e });
+                                    if(e !== 6){
+                                        this.setState({
+                                            releaseDate:'',
+                                            signProjectId:[],
+                                            signProject:[],
+                                        })
+                                    }
+                                }}
+                            >
+                                <Option value={6}>是,已续签/复审,续签时间、续签项目</Option>
+                                <Option value={5}>否,客户考虑中,已报价</Option>
+                                <Option value={4}>否,客户考虑中,无报价</Option>
+                                <Option value={3}>否,企业不打算申报/注销</Option>
+                                <Option value={2}>否,企业自己申报</Option>
+                                <Option value={1}>否,企业已签其他机构</Option>
+                                <Option value={0}>其他</Option>
+                            </Select>
+                        </div>
+                        {this.state.situation === 6 ? <div style={{display:'flex',alignItems:"center",paddingBottom:"10px"}}>
+                            <div style={{fontWeight:"bolder",paddingRight:'10px'}}>续签时间:</div>
+                            <DatePicker
+                                value={this.state.releaseDate ? moment(this.state.releaseDate) : null}
+                                onChange={(data, dataString) => {
+                                    this.setState({ releaseDate: dataString });
+                                }}
+                            />
+                        </div> : null}
+                        {this.state.situation === 6 ? <div style={{paddingBottom:"10px"}}>
+                            <div style={{fontWeight:"bolder",paddingRight:'10px',paddingBottom:'15px',whiteSpace:"nowrap"}}>已签项目:</div>
+                            <Spin spinning={this.state.selectLoading}>
+                                {
+                                    this.state.selectUidByprojectList.map((value,key)=>(
+                                        <div key={key} style={{
+                                            paddingBottom:'10px',
+                                            display:'flex',
+                                            flexFlow:"row nowrap",
+                                            alignItems:'flex-start',
+                                            padding:'10px 5px 0 5px',
+                                            background:key % 2 === 0 ? '#afacad' : '#fff',
+                                            color:key % 2 === 0 ? '#fff' : '#000',
+                                            borderRadius: '4px',
+                                        }}>
+                                            <div style={{whiteSpace:"nowrap",paddingBottom:'10px'}}>{value.orderNo+':'}</div>
+                                            <div style={{
+                                                flex:1,
+                                                display:'flex',
+                                                flexFlow:"row wrap",
+                                            }}>
+                                                {
+                                                    value.list.map((v,k)=>{
+                                                        let arr = this.state.signProjectId;
+                                                        let index = arr.indexOf(v.id+'');
+                                                        let lv =  index >= 0;
+                                                        return (
+                                                            <Checkbox checked={lv || v.checked}  style={{
+                                                                padding:"0 10px 10px 10px",
+                                                                marginLeft:'0px',
+                                                                whiteSpace: 'nowrap'
+                                                            }} key={k} onChange={(e)=>{
+                                                                if(e.target.checked){
+                                                                    this.state.signProjectId.push(v.id);
+                                                                    this.state.signProject.push(v.commodityName);
+                                                                    this.setState({
+                                                                        signProjectId:this.state.signProjectId,
+                                                                        signProject:this.state.signProject,
+                                                                    })
+                                                                }else{
+                                                                    let index = this.state.signProjectId.indexOf(v.id);
+                                                                    this.state.signProjectId.splice(index,1);
+                                                                    this.state.signProject.splice(index,1);
+                                                                    this.setState({
+                                                                        signProjectId:this.state.signProjectId,
+                                                                        signProject:this.state.signProject,
+                                                                    })
+                                                                }
+                                                                v.checked=e.target.checked
+                                                            }}>{v.commodityName}</Checkbox>
+                                                        )
+                                                    })
+                                                }
+                                            </div>
+                                        </div>
+                                    ))
+                                }
+                                {
+                                    this.state.removeSelectList.length !== 0 ? <div style={{marginTop:"15px",borderTop:'1px dashed #000'}}>
+                                        <div>已删项目(已签)</div>
+                                        {
+                                            this.state.removeSelectList.map((v,k)=>(
+                                                <Checkbox checked={true} disabled={true}  style={{paddingLeft:"10px"}} key={k}>{v}</Checkbox>
+                                            ))
+                                        }
+                                    </div> : ''
+                                }
+                            </Spin>
+                        </div> : null}
+                        <div style={{display:'flex',paddingBottom:"10px"}}>
+                            <div style={{fontWeight:"bolder",paddingRight:'10px'}}>备注:</div>
+                            <div style={{position:"relative"}}>
+                                <Input
+                                    placeholder={'请输入备注'}
+                                    type='textarea'
+                                    rows={3}
+                                    maxLength={64}
+                                    style={{
+                                        width:"400px"
+                                    }}
+                                    value={this.state.comment}
+                                    onChange={(e) => {
+                                        this.setState({ comment: e.target.value });
+                                    }}
+                                />
+                                <div style={{position:"absolute",zIndex:9999,color:'#a09f9f',bottom:'8px',right:'21px'}}>{this.state.comment.length+'/'+64}</div>
+                            </div>
+                        </div>
+                    </div>
+                </Spin>
+                <div style={{display:'flex',justifyContent:'center'}}>
+                    <Button type="primary" size={'large'} style={{marginTop:"10px"}} loading={this.state.preservationLoading || this.state.listLoading} onClick={this.inquiry}>
+                        提交保存
+                    </Button>
+                </div>
+            </div>
+        )
+    }
+}
+
+export default CustomerServiceRecord;

+ 562 - 0
js/component/manageCenter/customerService/administration/followUp.jsx

@@ -0,0 +1,562 @@
+import React,{Component} from "react";
+import {Button, DatePicker, Icon, Input, message, Select, Spin, Table, Tabs, Tag, Tooltip} from "antd";
+import {ChooseList} from "../../order/orderNew/chooseList";
+import FollowUpDetails from './followUpDetails';
+import CorrespondingDetails from './correspondingDetails';
+import $ from "jquery";
+
+import {ShowModal} from "@/tools";
+import ShowModalDiv from "@/showModal.jsx";
+import moment from "moment";
+
+const {TabPane} = Tabs;
+const { RangePicker } = DatePicker;
+
+class FollowUp extends Component{
+    constructor(props) {
+        super(props);
+        this.state={
+            columns:[
+                {
+                    title: "合同编号",
+                    dataIndex: "contractNo",
+                    key: "contractNo",
+                },
+                {
+                    title: "订单编号",
+                    dataIndex: "orderNo",
+                    key: "orderNo",
+                },
+                {
+                    title: "状态",
+                    dataIndex: "deleteSign",
+                    key: "deleteSign",
+                    width:90,
+                    render: (text) => {
+                        //0=正常, 1=作废, 2=锁定, 3=变更中
+                        return <Tag color="#f50">{
+                            text === 0 ? '正常' :
+                                text === 1 ? '作废' :
+                                    text === 2 ? '锁定' :
+                                        text === 3 ? '变更中' : '未知'
+                        }</Tag>
+                    }
+                },
+                {
+                    title: "订单部门",
+                    dataIndex: "depName",
+                    key: "depName",
+                },
+                {
+                    title: "合同签订时间",
+                    dataIndex: "signTimes",
+                    key: "signTimes",
+                },
+                {
+                    title: "下单时间",
+                    dataIndex: "orderTimes",
+                    key: "orderTimes",
+                },
+                {
+                    title: "客户名称",
+                    dataIndex: "userName",
+                    key: "userName",
+                },
+                {
+                    title: "申报项目",
+                    dataIndex: "projects",
+                    key: "projects",
+                    width: 80,
+                    render: (text) => {
+                        return (
+                            <Tooltip placement="topLeft" title={text}>
+                                <div style={{
+                                    maxWidth:'80px',
+                                    overflow:'hidden',
+                                    textOverflow: "ellipsis",
+                                    whiteSpace:'nowrap',
+                                }}>{text}</div>
+                            </Tooltip>
+                        )
+                    }
+                },
+                {
+                    title: "咨询师",
+                    dataIndex: "consultants",
+                    key: "consultants",
+                    width: 80,
+                    render: (text) => {
+                        return (
+                            <Tooltip placement="topLeft" title={text}>
+                                <div style={{
+                                    maxWidth:'80px',
+                                    overflow:'hidden',
+                                    textOverflow: "ellipsis",
+                                    whiteSpace:'nowrap',
+                                }}>{text}</div>
+                            </Tooltip>
+                        )
+                    }
+                },
+                {
+                    title: "申报批次",
+                    dataIndex: "declareBatchs",
+                    key: "declareBatchs",
+                    width: 80,
+                    render: (text) => {
+                        return (
+                            <Tooltip placement="topLeft" title={text}>
+                                <div style={{
+                                    maxWidth:'80px',
+                                    overflow:'hidden',
+                                    textOverflow: "ellipsis",
+                                    whiteSpace:'nowrap',
+                                }}>{text}</div>
+                            </Tooltip>
+                        )
+                    }
+                },
+                {
+                    title: "证书编号",
+                    dataIndex: "certificationNos",
+                    key: "certificationNos",
+                    width: 80,
+                    render: (text) => {
+                        return (
+                            <Tooltip placement="topLeft" title={text}>
+                                <div style={{
+                                    maxWidth:'80px',
+                                    overflow:'hidden',
+                                    textOverflow: "ellipsis",
+                                    whiteSpace:'nowrap',
+                                }}>{text}</div>
+                            </Tooltip>
+                        )
+                    }
+                },
+                {
+                    title: "客服最新跟进",
+                    dataIndex: "newTimes",
+                    key: "newTimes",
+                },
+                {
+                    title: "跟进客服",
+                    dataIndex: "adminName",
+                    key: "adminName",
+                },
+                {
+                    title: "是否已添微信",
+                    dataIndex: "addWechat",
+                    key: "addWechat",
+                    width: 100,
+                    render: (text,record) => {
+                        let str = text === 1 ? '是('+record.wechat+')' : text === 0 ? '否' : '未知';
+                        return (
+                            <Tooltip placement="topLeft" title={str}>
+                                <div style={{
+                                    maxWidth:'100px',
+                                    overflow:'hidden',
+                                    textOverflow: "ellipsis",
+                                    whiteSpace:'nowrap',
+                                }}>{str}</div>
+                            </Tooltip>
+                        )
+                    }
+                },
+                {
+                    title: "续签情况",
+                    dataIndex: "renewal",
+                    key: "renewal",
+                    width: 80,
+                    render: (text,record) => {
+                        let str = text === 0 ? '其他' :
+                            text === 1 ? '否,企业已签其他机构' :
+                                text === 2 ? '否,企业自己申报' :
+                                    text === 3 ? '否,企业不打算申报/注销' :
+                                        text === 4 ? '否,客户考虑中,无报价' :
+                                            text === 5 ? '否,客户考虑中,已报价' :
+                                                text === 6 ? '是,已续签/复审,续签时间、续签项目('+record.renewalTimes+')' : '未知'
+                        return (
+                            <Tooltip placement="topLeft" title={str}>
+                                <div style={{
+                                    maxWidth:'80px',
+                                    overflow:'hidden',
+                                    textOverflow: "ellipsis",
+                                    whiteSpace:'nowrap',
+                                }}>{str}</div>
+                            </Tooltip>
+                        )
+                    }
+                },
+                {
+                    title: "备注",
+                    dataIndex: "remarks",
+                    key: "remarks",
+                    width: 80,
+                    render: (text) => {
+                        return (
+                            <Tooltip placement="topLeft" title={text}>
+                                <div style={{
+                                    maxWidth:'80px',
+                                    overflow:'hidden',
+                                    textOverflow: "ellipsis",
+                                    whiteSpace:'nowrap',
+                                }}>{text}</div>
+                            </Tooltip>
+                        )
+                    }
+                },
+                {
+                    title: "操作",
+                    dataIndex: "a",
+                    key: "a",
+                    width: 100,
+                    render: (_,record) => {
+                        if(record.projects){
+                            let projectsArr = record.projects.split('/');
+                            let consultantsArr = record.consultants.split('/');
+                            let declareBatchsArr = record.declareBatchs.split('/');
+                            let certificationNosArr = record.certificationNos.split('/');
+                            let data = [];
+                            for (let i in projectsArr){
+                                data.push({
+                                    project:projectsArr[i],
+                                    consultant:consultantsArr[i],
+                                    declareBatch:declareBatchsArr[i],
+                                    certificationNo:certificationNosArr[i],
+                                })
+                            }
+                            return (
+                                <Button type="primary" onClick={(e)=>{
+                                    e.stopPropagation();
+                                    this.setState({
+                                        detailsVisible:true,
+                                        detailsInfor:data
+                                    })
+                                }}>查看项目</Button>
+                            )
+                        }
+
+                    }
+                },
+            ],
+            changeList:[],
+            listLoading:false,
+            page:1,
+            pagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.loadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return "共" + total + "条数据";
+                },
+            },
+            departmentArr:[],
+            customerName:'',
+            releaseDate:[],
+            signTimes:[],
+        }
+        this.changeList = this.changeList.bind(this);
+        this.loadData = this.loadData.bind(this);
+        this.search = this.search.bind(this);
+        this.reset = this.reset.bind(this);
+        this.departmentList = this.departmentList.bind(this);
+    }
+
+    componentDidMount() {
+        this.departmentList();
+        this.loadData();
+    }
+
+    search(){
+        this.loadData();
+    }
+
+    reset(){
+        this.setState({
+            customerName:undefined,
+            depId:undefined,
+            addWechat:undefined,
+            renewal:undefined,
+            releaseDate:[],
+            signTimes:[],
+        },()=>{
+            this.loadData();
+        })
+    }
+
+    loadData(pageNo) {
+        this.setState({
+            listLoading: true,
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/listOrderUseService",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                userName:this.state.customerName || undefined,
+                depId:this.state.depId || undefined,
+                addWechat:this.state.addWechat || undefined,
+                renewal:this.state.renewal || undefined,
+                startFollowTimes:this.state.releaseDate[0] || undefined,
+                endFollowTimes:this.state.releaseDate[1] || undefined,
+                startSignTimes:this.state.signTimes[0] || undefined,
+                endSignTimes:this.state.signTimes[1] || undefined,
+            },
+            success: function (data) {
+                ShowModal(this);
+                let theArr = [];
+                if (!data.data || !data.data.list) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    }
+                } else {
+                    for (let i = 0; i < data.data.list.length; i++) {
+                        let thisdata = data.data.list[i];
+                        theArr.push(thisdata);
+                    }
+                    this.state.pagination.current = data.data.pageNo;
+                    this.state.pagination.total = data.data.totalCount;
+                    if (data.data && data.data.list && !data.data.list.length) {
+                        this.state.pagination.current = 0;
+                        this.state.pagination.total = 0;
+                    }
+                    this.setState({
+                        dataSource: theArr,
+                        page: data.data.pageNo,
+                        pagination: this.state.pagination,
+                    });
+                }
+            }.bind(this),
+        }).always(
+            function () {
+                this.setState({
+                    listLoading: false,
+                });
+            }.bind(this)
+        );
+    }
+
+    changeList(arr) {
+        const newArr = [];
+        this.state.columns.forEach(item => {
+            arr.forEach(val => {
+                if (val === item.title) {
+                    newArr.push(item);
+                }
+            });
+        });
+        this.setState({
+            changeList: newArr
+        });
+    }
+
+    //部门
+    departmentList() {
+        $.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);
+                    }
+                } else {
+                    thedata.map(function (item, index) {
+                        theArr.push({
+                            key: index,
+                            name: item.name,
+                            id: item.id,
+                        });
+                    });
+                }
+                this.setState({
+                    departmentArr: theArr,
+                });
+            }.bind(this),
+        }).always(
+            function () {
+            }.bind(this)
+        );
+    }
+
+    download() {
+        window.location.href =
+            globalConfig.context +
+            "/api/admin/userServiceExport"
+    }
+
+    render() {
+        return (
+            <div className="user-content">
+                <ShowModalDiv ShowModal={this.state.showModal} />
+                <div className="content-title">
+                    <span>客服跟进详情</span>
+                </div>
+                <Tabs defaultActiveKey="1" className="test">
+                    <TabPane tab="搜索" key="1" style={{padding:'10px 0'}}>
+                        <Input
+                            placeholder="客户名称"
+                            style={{ width: "150px", marginRight: 10,marginBottom: "10px" }}
+                            value={this.state.customerName}
+                            onChange={(e) => {
+                                this.setState({ customerName: e.target.value });
+                            }}
+                        />
+                        <Select
+                            placeholder="订单部门"
+                            style={{ width: 150, marginRight: 10,marginBottom: "10px" }}
+                            value={this.state.depId}
+                            onChange={(e) => {
+                                this.setState({ depId: e });
+                            }}
+                        >
+                            {this.state.departmentArr.map(function (item) {
+                                return <Option key={item.id}>{item.name}</Option>;
+                            })}
+                        </Select>
+                        <Select
+                            placeholder="是否已添微信"
+                            style={{ width: 150, marginRight: 10,marginBottom: "10px" }}
+                            value={this.state.addWechat}
+                            onChange={(e) => {
+                                this.setState({ addWechat: e });
+                            }}
+                        >
+                            <Option value={0}>否</Option>
+                            <Option value={1}>是</Option>
+                        </Select>
+                        <Select
+                            placeholder="续签情况"
+                            style={{ width: 250, marginRight: 10,marginBottom: "10px" }}
+                            value={this.state.renewal}
+                            onChange={(e) => {
+                                this.setState({ renewal: e });
+                            }}
+                        >
+                            <Option value={6}>是,已续签/复审,续签时间、续签项目</Option>
+                            <Option value={5}>否,客户考虑中,已报价</Option>
+                            <Option value={4}>否,客户考虑中,无报价</Option>
+                            <Option value={3}>否,企业不打算申报/注销</Option>
+                            <Option value={2}>否,企业自己申报</Option>
+                            <Option value={1}>否,企业已签其他机构</Option>
+                            <Option value={0}>其他</Option>
+                        </Select>
+                        <span style={{ marginRight: "10px",marginBottom: "10px" }}>跟进时间 :</span>
+                        <RangePicker
+                            style={{marginBottom: "10px",width:'187px'}}
+                            value={[
+                                this.state.releaseDate[0]
+                                    ? moment(this.state.releaseDate[0])
+                                    : null,
+                                this.state.releaseDate[1]
+                                    ? moment(this.state.releaseDate[1])
+                                    : null,
+                            ]}
+                            onChange={(data, dataString) => {
+                                this.setState({ releaseDate: dataString });
+                            }}
+                        />
+                        <span style={{ marginRight: "10px",marginLeft: "10px",marginBottom: "10px" }}>下单时间 :</span>
+                        <RangePicker
+                            style={{marginBottom: "10px",width:'187px'}}
+                            value={[
+                                this.state.signTimes[0]
+                                    ? moment(this.state.signTimes[0])
+                                    : null,
+                                this.state.signTimes[1]
+                                    ? moment(this.state.signTimes[1])
+                                    : null,
+                            ]}
+                            onChange={(data, dataString) => {
+                                this.setState({ signTimes: dataString });
+                            }}
+                        />
+                        <Button
+                            type="primary"
+                            onClick={this.search}
+                            style={{ marginLeft: "10px",marginBottom: "10px" }}
+                        >
+                            搜索
+                            <Icon type="search" />
+                        </Button>
+                        <Button onClick={this.reset} style={{ marginLeft: "10px",marginBottom: "10px" }}>
+                            重置 <Icon type="reload" />
+                        </Button>
+                    </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="操作" key="3">
+                        <Button
+                            type="primary"
+                            style={{margin: '10px'}}
+                            onClick={this.download}
+                        >
+                            导出
+                        </Button>
+                    </TabPane>
+                </Tabs>
+                <div className="patent-table">
+                    <Spin spinning={this.state.listLoading}>
+                        <Table
+                            columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            onRowClick={(record)=>{
+                                this.setState({
+                                    visible:true,
+                                    orderNo:record.orderNo,
+                                    uid:record.uid,
+                                })
+                            }}
+                        />
+                    </Spin>
+                </div>
+                {this.state.visible ? <FollowUpDetails
+                    visible={this.state.visible}
+                    orderNo={this.state.orderNo}
+                    uid={this.state.uid}
+                    onCancel={()=>{
+                        this.setState({
+                            visible:false,
+                            orderNo:'',
+                            uid:'',
+                        })
+                    }}/> : ''}
+                {this.state.detailsVisible ?
+                    <CorrespondingDetails
+                        visible={this.state.detailsVisible}
+                        detailsInfor={this.state.detailsInfor}
+                        onCancel={()=>{
+                            this.setState({
+                                detailsVisible:false,
+                                detailsInfor:[],
+                            })
+                        }}/> : ''}
+            </div>
+        )
+    }
+}
+
+export default FollowUp;

+ 845 - 0
js/component/manageCenter/customerService/administration/followUpDetails.jsx

@@ -0,0 +1,845 @@
+import React,{Component} from "react";
+import {Button, Col, Form, message, Modal, Spin, Table, Tabs, Tag} from "antd";
+import {
+    getApprovedState,
+    getCuikuan,
+    getjiedian,
+    getLiquidationStatus,
+    getProcessStatus,
+    splitUrl
+} from "../../../tools";
+import ImgList from "../../../common/imgList";
+import $ from "jquery/src/ajax";
+import OrderRiZi from "@/orderRiZi.jsx";
+import ProjectDetailsReadOnly from "../../../common/projectDetailsReadOnly";
+import CustomerServiceRecord from './customerServiceRecord';
+
+const FormItem = Form.Item;
+const { TabPane } = Tabs;
+const formItemLayout = {
+    labelCol: { span: 8 },
+    wrapperCol: { span: 14 },
+};
+
+class FollowUpDetails extends Component{
+    constructor(props) {
+        super(props);
+        this.state={
+            loading:false,
+            columnsX: [
+                {
+                    title: "业务项目名称",
+                    dataIndex: "commodityName",
+                    key: "commodityName",
+                    render: (text, record) => {
+                        return text + "-" + record.id
+                    }
+                },
+                {
+                    title: "项目类别",
+                    dataIndex: "cname",
+                    key: "cname",
+                },
+                {
+                    title: "项目数量",
+                    dataIndex: "commodityQuantity",
+                    key: "commodityQuantity",
+                    render: (text, record) => {
+                        if (record.splitStatus == 1) {
+                            return (
+                                <span>
+                    {text}{" "}
+                                    <Tag
+                                        color="#108ee9"
+                                        onClick={(e) => {
+                                            e.stopPropagation();
+                                            this.showRes(record);
+                                        }}
+                                    >
+                      已拆
+                    </Tag>
+                  </span>
+                            );
+                        } else {
+                            return text;
+                        }
+                    },
+                },
+                {
+                    title: "金额(万元)",
+                    dataIndex: "commodityPrice",
+                    key: "commodityPrice",
+                },
+                {
+                    title: "负责人",
+                    dataIndex: "contacts",
+                    key: "contacts",
+                },
+                {
+                    title: "负责人电话",
+                    dataIndex: "contactsMobile",
+                    key: "contactsMobile",
+                },
+                {
+                    title: "主要项目",
+                    dataIndex: "main",
+                    key: "main",
+                    render: (text) => {
+                        return text ? "是" : "否";
+                    },
+                },
+                {
+                    title: "项目说明",
+                    dataIndex: "taskComment",
+                    key: "taskComment",
+                    render: (text) => {
+                        return text && text.length > 8 ? text.substr(0, 8) + "…" : text;
+                    },
+                },
+            ],
+            dataSourceX:[],
+            contactList:[],
+            ContactsListsNew: [
+                {
+                    title: "项目名称",
+                    dataIndex: "commodityName",
+                    key: "commodityName",
+                    render: (text, record) => {
+                        return <span>{text + "-" + record.tid}</span>;
+                    },
+                },
+                {
+                    title: "项目分类",
+                    dataIndex: "projectType",
+                    key: "projectType",
+                    render: (text) => {
+                        let arr = this.state.dataSourceX || [];
+                        let str = "";
+                        for (let i = 0; i < arr.length; i++) {
+                            if (this.state.dataSourceX[i].sort == text) {
+                                str = this.state.dataSourceX[i].cname;
+                                return <span>{str}</span>;
+                            }
+                        }
+                    },
+                },
+                {
+                    title: "催款科目",
+                    dataIndex: "dunTypeName",
+                    key: "dunTypeName",
+                    render: (text, record) => {
+                        if (record.customizeName) {
+                            return text + record.customizeName;
+                        }
+                        return <span>{text}</span>;
+                    },
+                },
+                {
+                    title: "时间(天)",
+                    dataIndex: "waitDay",
+                    key: "waitDay",
+                    render: (text, record) => {
+                        if (record.dunTypeName) {
+                            if (record.customizeTimes) {
+                                return record.customizeTimes;
+                            }
+                            return <span>{text}</span>;
+                        }
+                    },
+                },
+                {
+                    title: "金额(万元)",
+                    dataIndex: "money",
+                    key: "money",
+                    render: (text, record) => {
+                        if (record.dunTypeName) {
+                            if (record.appropriationRatio && !record.money) {
+                                return <span>{record.appropriationRatio}(拨款比例)</span>;
+                            } else if (record.appropriationRatio && record.money) {
+                                return (
+                                    <span>
+                      {text}(比例:{record.appropriationRatio})
+                    </span>
+                                );
+                            } else {
+                                return <span>{text}</span>;
+                            }
+                        }
+                    },
+                },
+                {
+                    title: "服务年限",
+                    dataIndex: "startDate",
+                    key: "startDate",
+                    render: (text, record) => {
+                        if (record.dunTypeName) {
+                            return <span>{text}</span>;
+                        }
+                    },
+                },
+                {
+                    title: "催款状态",
+                    dataIndex: "status",
+                    key: "status",
+                    render: (text) => {
+                        return <span>{text == 1 ? "已启动" : "未启动"}</span>;
+                    },
+                },
+            ],
+            ContactsLists: [
+                {
+                    title: "催款科目",
+                    dataIndex: "dunSubject",
+                    key: "dunSubject",
+                    render: (text) => {
+                        return getjiedian(text);
+                    },
+                },
+                {
+                    title: "金额(万元)",
+                    dataIndex: "money",
+                    key: "money",
+                },
+                {
+                    title: "催款状态",
+                    dataIndex: "dunStatus",
+                    key: "dunStatus",
+                    render: (text) => {
+                        return getCuikuan(text);
+                    },
+                },
+            ],
+            tabsKey:'1',
+            dataSourcerizhi:[],
+        }
+        this.jiedian =this.jiedian.bind(this);
+        this.jiedianNew =this.jiedianNew.bind(this);
+        this.xiangqing =this.xiangqing.bind(this);
+        this.rizhi =this.rizhi.bind(this);
+        this.closeOrderLog =this.closeOrderLog.bind(this);
+        this.tableRowClickX =this.tableRowClickX.bind(this);
+        this.nextCancel =this.nextCancel.bind(this);
+        this.rizhi =this.rizhi.bind(this);
+        this.getOrderLog =this.getOrderLog.bind(this);
+        this.xiangmu =this.xiangmu.bind(this);
+    }
+
+    componentDidMount() {
+        this.xiangqing();
+        this.jiedian();
+        this.jiedianNew();
+        this.xiangmu();
+    }
+
+    getOrderLog() {
+        this.setState({
+            rizhivisible: true,
+        });
+        this.rizhi();
+    }
+
+    closeOrderLog() {
+        this.setState({
+            rizhivisible: false,
+            dataSourcerizhi:[],
+        });
+    }
+
+    tableRowClickX(record) {
+        this.setState({
+            addnextVisible: true,
+            dataInfor:record,
+        });
+    }
+
+    nextCancel() {
+        this.setState({
+            addnextVisible: false,
+            dataInfor:{}
+        });
+    }
+
+    rizhi() {
+        this.setState({
+            selectOrderLogLoading: true,
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: "/api/admin/newOrder/selectOrderLog",
+            data: {
+                orderNo: this.props.orderNo,
+            },
+            success: function (data) {
+                let theArr = [];
+                let thisData = data.data;
+                if (!thisData.length) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    }
+                } else {
+                    for (let i = 0; i < data.data.length; i++) {
+                        let thisdata = data.data[i];
+                        theArr.push({
+                            processName: thisdata.processName,
+                            adminName: thisdata.adminName,
+                            createDate: thisdata.createDate,
+                            remarks: thisdata.remarks,
+                        });
+                    }
+                }
+                this.setState({
+                    dataSourcerizhi: theArr,
+                });
+            }.bind(this),
+        }).always(
+            function () {
+                this.setState({
+                    selectOrderLogLoading: false,
+                });
+            }.bind(this)
+        );
+    }
+
+    jiedian() {
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/newOrder/selectOrderDun",
+            data: {
+                orderNo: this.props.orderNo,
+            },
+            success: function (data) {
+                let theArr = [];
+                let thisData = [];
+                if (data.error.length || data.data.list == "") {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    }
+                } else {
+                    for (let i = 0; i < data.data.length; i++) {
+                        thisData = data.data[i];
+                        theArr.push({
+                            key: i,
+                            dunSubject: thisData.dunSubject
+                                ? thisData.dunSubject.toString()
+                                : "", //催款科目
+                            id: thisData.id, //节点Id
+                            money: thisData.money, //催款金额
+                            dunStatus: thisData.dunStatus, //催款状态
+                        });
+                    }
+                    this.setState({
+                        contactList: theArr,
+                    });
+                }
+            }.bind(this),
+        }).always(
+            function () {
+
+            }.bind(this)
+        );
+    }
+
+    //查看催款节点
+    jiedianNew() {
+        this.setState({
+            newOrderDunLoading: true,
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url:
+                globalConfig.context + "/api/admin/newOrderDun/selectListNewOrderDun",
+            data: {
+                orderNo: this.props.orderNo,
+            },
+            success: function (data) {
+                if (data.error && data.error.length) {
+                    message.warning(data.error[0].message);
+                } else {
+                    let theArr = [];
+                    let thisData = [];
+                    let arr = data.data || [];
+                    let totalCui = 0;
+                    for (let i = 0; i < arr.length; i++) {
+                        thisData = arr[i];
+                        totalCui += +thisData.money;
+                        theArr.push({
+                            key: i,
+                            dunSubject: thisData.dunSubject
+                                ? thisData.dunSubject.toString()
+                                : "", //催款科目
+                            id: thisData.id, //节点Id
+                            money: thisData.money, //催款金额
+                            commodityName: thisData.commodityName,
+                            projectType: thisData.projectType,
+                            dunTypeName: thisData.dunTypeName,
+                            status: thisData.status,
+                            waitDay: thisData.waitDay,
+                            effectiveCount: thisData.effectiveCount,
+                            startDate: thisData.startDate,
+                            dunType: thisData.dunType,
+                            appropriationRatio: thisData.appropriationRatio,
+                            customizeName: thisData.customizeName,
+                            customizeTimes: thisData.customizeTimes,
+                            tid: thisData.tid,
+                        });
+                    }
+                    if (!totalCui) {
+                        totalCui = 0;
+                    }
+                    totalCui = (Math.round(totalCui * 1000000) / 1000000).toFixed(6);
+                    this.setState({
+                        contactListNew: theArr,
+                        totalCui,
+                    });
+                }
+            }.bind(this),
+        }).always(
+            function () {
+                this.setState({
+                    newOrderDunLoading: false,
+                });
+            }.bind(this)
+        );
+    }
+
+    xiangqing() {
+        this.setState({
+            loading: true,
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/newOrder/getOrderNewDetail",
+            data: {
+                orderNo: this.props.orderNo,
+            },
+            success: function (data) {
+                if (data.error.length || data.data.list == "") {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    }
+                } else {
+                    let thisdata = data.data;
+                    this.setState({
+                        orderNo: thisdata.orderNo, //订单编号
+                        contractNo: thisdata.contractNo, //合同编号
+                        userName: thisdata.userName, //客户名称
+                        signDate: thisdata.signDate, //签单时间
+                        processStatus: thisdata.processStatus, //流程状态
+                        liquidationStatus: thisdata.liquidationStatus, //结算状态
+                        contacts: thisdata.contacts, //企业联系人
+                        contactMobile: thisdata.contactMobile, //联系人电话
+                        legalPerson: thisdata.legalPerson, //法人
+                        legalPersonTel: thisdata.legalPersonTel, //法人电话
+                        firstAmount: thisdata.firstAmount, //签单金额
+                        totalAmount: thisdata.totalAmount, //首付金额
+                        approval: thisdata.approval, //特批状态
+                        settlementAmount: thisdata.settlementAmount, //已收款项
+                        orderRemarks: thisdata.orderRemarks, //订单留言
+                        orgCodeUrl: thisdata.contractPictureUrl
+                            ? splitUrl(
+                                thisdata.contractPictureUrl,
+                                ",",
+                                globalConfig.avatarHost + "/upload"
+                            )
+                            : [], //图片地址
+                        replenishUrl: thisdata.agreementUrl
+                            ? splitUrl(
+                                thisdata.agreementUrl,
+                                ",",
+                                globalConfig.avatarHost + "/upload"
+                            )
+                            : [], //图片地址
+                        salesmanName: thisdata.salesmanName, //营销员名称
+                        salesmanMobile: thisdata.salesmanMobile, //营销员电话
+                        oldSalesmanName: thisdata.oldSalesmanName, //营销员名称
+                        oldSalesmanMobile: thisdata.oldSalesmanMobile, //营销员电话
+                        financeName: thisdata.financeName, //财务名称
+                        financeMobile: thisdata.financeMobile, //财务电话
+                        nowFinance: thisdata.nowFinance, //财务名称
+                        nowFinanceMobile: thisdata.nowFinanceMobile, //财务电话
+                        depName: thisdata.depName,
+                        outsource: thisdata.outsource == 0 ? "否" : "是",
+                    });
+                }
+            }.bind(this),
+        }).always(
+            function () {
+                this.setState({
+                    loading: false,
+                });
+            }.bind(this)
+        );
+    }
+
+    xiangmu() {
+        this.setState({
+            orderTaskLoading:true
+        })
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/newOrder/getOrderTask",
+            data: {
+                orderNo: this.props.orderNo,
+            },
+            success: function (data) {
+                let theArr = [];
+
+                if (data.error.length || data.data.list == "") {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    }
+                } else {
+                    for (let i = 0; i < data.data.length; i++) {
+                        let thisdata = data.data[i];
+                        thisdata.key = i;
+                        theArr.push(thisdata);
+                    }
+                    this.setState({
+                        dataSourceX: theArr,
+                    });
+                }
+            }.bind(this),
+        }).always(
+            function () {
+                this.setState({
+                    orderTaskLoading: false,
+                });
+            }.bind(this)
+        );
+    }
+
+    render() {
+        return (
+            <Modal
+                className="customeDetails"
+                footer=""
+                title={null}
+                width="1200px"
+                maskClosable={false}
+                visible={this.props.visible}
+                onOk={this.props.onCancel}
+                onCancel={this.props.onCancel}
+            >
+                <div>
+                    <Tabs defaultActiveKey="1" className="test" activeKey={this.state.tabsKey} onChange={(e)=>{this.setState({tabsKey:e})}}>
+                        <TabPane tab="订单详情" key="1">
+                            <Form
+                                layout="horizontal"
+                                id="demand-form"
+                                style={{ paddingBottom: "40px" }}
+                            >
+                                <Spin spinning={this.state.loading}>
+                                    <div className="clearfix">
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="订单编号"
+                                        >
+                                            <span>{this.state.orderNo}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="合同编号"
+                                        >
+                                            <span>{this.state.contractNo}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="客户名称"
+                                        >
+                                            <span>{this.state.userName}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="下单时间"
+                                        >
+                                            <span>{this.state.signDate}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="流程状态"
+                                        >
+                                            <span>{getProcessStatus(this.state.processStatus)}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="结算状态"
+                                        >
+                                          <span>
+                                            {getLiquidationStatus(this.state.liquidationStatus)}
+                                          </span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="企业联系人"
+                                        >
+                                            <span>{this.state.contacts}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="联系人电话"
+                                        >
+                                            <span>{this.state.contactMobile}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="企业法人"
+                                        >
+                                            <span>{this.state.legalPerson}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="法人电话"
+                                        >
+                                            <span>{this.state.legalPersonTel}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="签单金额(万元)"
+                                        >
+                                            <span>{this.state.totalAmount}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="首付金额(万元)"
+                                        >
+                                            <span>{this.state.firstAmount}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="特批立项"
+                                        >
+                                            <span>{getApprovedState(this.state.approval)}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="已收款项(万元)"
+                                        >
+                                            <span>{this.state.settlementAmount}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="订单部门"
+                                        >
+                                            <span>{this.state.depName}</span>
+                                        </FormItem>
+                                        <FormItem
+                                            className="half-item"
+                                            {...formItemLayout}
+                                            label="是否外包"
+                                        >
+                                            {this.state.outsource}
+                                        </FormItem>
+                                        <div className="clearfix">
+                                            <FormItem
+                                                labelCol={{ span: 4 }}
+                                                wrapperCol={{ span: 16 }}
+                                                label="订单留言"
+                                            >
+                                                <span>{this.state.orderRemarks}</span>
+                                            </FormItem>
+                                        </div>
+                                        <div className="clearfix">
+                                            <FormItem
+                                                labelCol={{ span: 4 }}
+                                                wrapperCol={{ span: 18 }}
+                                                label={"合同扫描件"}
+                                            >
+                                                <div style={{paddingTop:'10px',paddingBottom:'10px'}}>
+                                                    {this.props.visible && this.state.orgCodeUrl ? <ImgList fileList={this.state.orgCodeUrl} ItemWidth={'96px'}/> : <div/>}
+                                                </div>
+                                                <Button
+                                                    style={{
+                                                        float: "right",
+                                                        marginRight: "140px",
+                                                        marginTop: "20px",
+                                                    }}
+                                                    onClick={this.getOrderLog}
+                                                >
+                                                    查看订单 日志
+                                                </Button>
+                                            </FormItem>
+                                            <FormItem
+                                                labelCol={{ span: 4 }}
+                                                wrapperCol={{ span: 18 }}
+                                                label="补充协议"
+                                            >
+                                                <div style={{paddingTop:'10px',paddingBottom:'10px'}}>
+                                                    {this.props.visible && this.state.replenishUrl ? <ImgList domId={'inquiry1'} fileList={this.state.replenishUrl} ItemWidth={'96px'}/> : <div/>}
+                                                </div>
+                                            </FormItem>
+                                        </div>
+                                        <div className="clearfix">
+                                            <FormItem
+                                                className="half-item"
+                                                {...formItemLayout}
+                                                label="订单负责人"
+                                            >
+                                                <span>{this.state.salesmanName}</span>
+                                            </FormItem>
+                                            <FormItem
+                                                className="half-item"
+                                                {...formItemLayout}
+                                                label="订单负责人电话"
+                                            >
+                                                <span>{this.state.salesmanMobile}</span>
+                                            </FormItem>
+                                        </div>
+                                        <div className="clearfix">
+                                            <FormItem
+                                                className="half-item"
+                                                {...formItemLayout}
+                                                label="当前财务负责人"
+                                            >
+                                                <span>{this.state.nowFinance}</span>
+                                            </FormItem>
+                                            <FormItem
+                                                className="half-item"
+                                                {...formItemLayout}
+                                                label="当前财务负责人电话"
+                                            >
+                                                <span>{this.state.nowFinanceMobile}</span>
+                                            </FormItem>
+                                        </div>
+                                        <div className="clearfix">
+                                            <FormItem
+                                                className="half-item"
+                                                {...formItemLayout}
+                                                style={{ opacity: ".5" }}
+                                                label="原订单负责人"
+                                            >
+                                                <span>{this.state.oldSalesmanName}</span>
+                                            </FormItem>
+                                            <FormItem
+                                                className="half-item"
+                                                {...formItemLayout}
+                                                style={{ opacity: ".5" }}
+                                                label="原订单负责人电话"
+                                            >
+                                                <span>{this.state.oldSalesmanMobile}</span>
+                                            </FormItem>
+                                        </div>
+                                        <div className="clearfix">
+                                            <FormItem
+                                                className="half-item"
+                                                style={{ opacity: ".5" }}
+                                                {...formItemLayout}
+                                                label="实际财务操作人"
+                                            >
+                                                <span>{this.state.financeName}</span>
+                                            </FormItem>
+                                            <FormItem
+                                                className="half-item"
+                                                {...formItemLayout}
+                                                style={{ opacity: ".5" }}
+                                                label="实际财务操作人电话"
+                                            >
+                                                <span>{this.state.financeMobile}</span>
+                                            </FormItem>
+                                        </div>
+                                        <div>
+                                          <span style={{ marginLeft: "50px", fontSize: "20px" }}>
+                                            项目业务
+                                          </span>
+                                        </div>
+                                        <div className="patent-table">
+                                            <Spin spinning={this.state.orderTaskLoading}>
+                                                <Table
+                                                    columns={this.state.columnsX}
+                                                    dataSource={this.state.dataSourceX}
+                                                    pagination={false}
+                                                    onRowClick={this.tableRowClickX}
+                                                    bordered
+                                                    size="small"
+                                                />
+                                            </Spin>
+                                        </div>
+                                        <div>
+                                          <span style={{ marginLeft: "50px", fontSize: "20px" }}>
+                                            催款节点
+                                          </span>
+                                          <span
+                                            style={{
+                                                display: this.state.contactList.length ? "none" : "inline-block",
+                                                marginLeft: 10,
+                                                color: "red",
+                                            }}
+                                          >
+                                            金额总计(万元): {this.state.totalCui}
+                                          </span>
+                                        </div>
+                                        <div className="clearfix">
+                                            <Spin spinning={this.state.newOrderDunLoading}>
+                                                <Form layout="horizontal" id="demand-form">
+                                                    <Table
+                                                        pagination={false}
+                                                        bordered
+                                                        size="small"
+                                                        columns={
+                                                            this.state.ContactsListsNew
+                                                        }
+                                                        dataSource={
+                                                            this.state.contactListNew
+                                                        }
+                                                    />
+                                                    <Col
+                                                        span={24}
+                                                        offset={9}
+                                                        style={{ marginTop: "15px" }}
+                                                    />
+                                                </Form>
+                                            </Spin>
+                                        </div>
+                                    </div>
+                                </Spin>
+                            </Form>
+                        </TabPane>
+                        <TabPane tab="客服跟进详情" key="2">
+                            {this.state.tabsKey === '2' ? <CustomerServiceRecord
+                                orderNo={this.props.orderNo}
+                                uid={this.props.uid}
+                            /> : ''}
+                        </TabPane>
+                    </Tabs>
+                    <OrderRiZi
+                        dataSourcerizhi={this.state.dataSourcerizhi}
+                        closeOrderLog={this.closeOrderLog}
+                        visible={this.state.rizhivisible}
+                        loading={this.state.selectOrderLogLoading}
+                    />
+                    {this.state.addnextVisible && <ProjectDetailsReadOnly
+                        infor={this.state.dataInfor}
+                        visible={this.state.addnextVisible}
+                        onCancel={this.nextCancel}
+                    />}
+                </div>
+            </Modal>
+        )
+    }
+}
+
+export default FollowUpDetails;

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 4388 - 0
js/component/manageCenter/customerService/administration/order.jsx


+ 120 - 0
js/component/manageCenter/customerService/administration/userMangagement.less

@@ -0,0 +1,120 @@
+.user-content {
+    background: #fff;
+    padding: 20px;
+    .content-title {
+        color: #333;
+        font-size: 16px;
+        overflow: hidden;
+    }
+    .user-search {
+        margin-bottom: 10px;
+        > input {
+            width: 140px;
+        }
+         > button,
+        .ant-select,
+        > input {
+            margin-right: 10px;
+            margin-top: 10px;
+        }
+        .ant-switch {
+            margin-left: 10px;
+        }
+        .search-more {
+            margin: 10px 0;
+            > span {
+                margin-right: 10px;
+            }
+        }
+    }
+    .addButton {
+        float: right;
+        margin-right: 50px!important;
+    }
+}
+.half-item {
+    float: left;
+    width: 50%;
+    min-height: 36px;
+    margin-bottom: 10px;
+    button {
+        margin-left: 20px;
+    }
+}
+.half-middle {
+    width: 80%;
+    margin: 10px auto;
+    height: 36px;
+    button {
+        margin-left: 20px;
+    }
+}
+.patent-table {
+    clear: both;
+}
+.set-submit {
+    margin-right: 20px;
+    font-size: 16px;
+    width: 80px;
+    height: 30px;
+    line-height: 30px;
+}
+.deletButton {
+    float: right;
+    margin-bottom: 15px;
+}
+.clearfix {
+    clear: both;
+}
+.mandatory {
+    color: red;
+    margin-left: 8px;
+}
+.search-more .ant-select-auto-complete.ant-select-lg .ant-input{
+    height:28px
+}
+.rolesCol{width: 90%;}
+.setSave,.operations,.cancel{
+    float: left;
+}
+.setSave{margin-right: 10px;margin-left: 188px;}
+.toVoid{float: left;margin-right: 10px;}
+.btnSave{text-align: center;margin-top: 10px;overflow: hidden;}
+.ant-calendar-picker-input{height: 27px;}
+/*变更说明*/
+.changeBorder .half-item{
+    margin-bottom: 0;
+}
+.changeRemark {
+    border-bottom: 1px solid #ccc;
+}
+.changeRemark div{
+     margin-bottom: 0px;
+}
+.changeStatusTxt label{
+    color: red;
+}
+
+.single{
+	display: block;
+	cursor: pointer;
+}
+
+.single:hover{
+	background: skyblue;
+}
+.ant-tabs-bar {
+    margin-bottom: 0;
+}
+.user-content .user-search {
+    margin-top: 0 !important;
+}
+.ant-tabs-tab {
+    font-weight: 900;
+}
+.ant-table-small .ant-table-thead > tr > th {
+    background: #f5f5f5;
+}
+.half-item>.ant-col-14>.ant-form-item-control {
+    width: 254px !important;
+}

+ 75 - 0
js/component/manageCenter/customerService/content.jsx

@@ -0,0 +1,75 @@
+import React, { Component } from 'react';
+import '../content.less';
+import LeftTab from '../leftTab';
+import {getMenu} from '../publicMenu.js'
+
+class Content extends Component {
+    constructor() {
+        super();
+        this.state = {
+            loading: false,
+            component: <div></div>,
+        };
+    }
+    componentWillMount() {
+        var ids=window.location.href.indexOf('rid=');
+        var idk=window.location.href.substr(ids+4);
+        var rid=idk.split('#');
+        let menu=getMenu(rid);
+        let curry;
+        if(menu[0].subMenus.length>0){
+        	curry=menu[0].subMenus[0].url.split('#');
+        }else{
+        	curry=menu[0].url.split('#');
+        };
+        if (window.location.hash) {
+            this.getKey(window.location.hash.substr(1));
+        } else {
+         this.getKey(curry[1]);
+        };
+    }
+    getKey(key) {
+        switch (key) {
+          //客服订单查询
+          case "order":
+            require.ensure([], () => {
+              const Order = require("./administration/order")
+                .default;
+              this.setState({
+                component: <Order/>
+              });
+            });
+            break;
+            //客服订单详情查询
+            case "followUp":
+                require.ensure([], () => {
+                    const FollowUp = require("./administration/FollowUp")
+                        .default;
+                    this.setState({
+                        component: <FollowUp/>
+                    });
+                });
+                break;
+          default:
+            require.ensure([], () => {
+              const Module = require("../module").default;
+              this.setState({
+                component: <Module ApiUrl={""} />
+              });
+            });
+        };
+        window.location.hash = key;
+    }
+    render() {
+        return (
+            <div className="manage-content">
+                <LeftTab handlekey={this.getKey.bind(this)} />
+                <div className="content-right">
+                   {this.state.component}
+                </div>
+            </div>
+        )
+    }
+}
+
+export default Content;

+ 8 - 1
js/component/manageCenter/order/orderNew/contractJsjl.js

@@ -21,6 +21,7 @@ import OrderRiZi from "@/orderRiZi.jsx";
 import {ChooseList} from "./chooseList";
 import {getProjectName} from "../../../tools";
 import ProjectDetailsReadOnly from "../../../common/projectDetailsReadOnly";
+import OrderItemStatus from "../../../common/orderItemStatus";
 
 const contractChange = Form.create()(
   React.createClass({
@@ -481,7 +482,8 @@ const contractChange = Form.create()(
               contractNo: thisdata.contractNo,
               // arrears: thisdata.arrears,
               orderData: thisdata,
-              isAddition: thisdata.additionalOrder ? true : false
+              isAddition: thisdata.additionalOrder ? true : false,
+              deleteSign:thisdata.deleteSign,
             });
           }
         }.bind(this)
@@ -1169,6 +1171,11 @@ const contractChange = Form.create()(
                 activeKey={this.state.activeKey}
                 onChange={this.callback}
                 type="card"
+                tabBarExtraContent={
+                  <div style={{fontWeight:'bold',paddingRight:'15px'}}>
+                    <OrderItemStatus deleteSign={this.state.deleteSign}/>
+                  </div>
+                }
               >
                 <TabPane tab="订单详情" key="a">
                   <Form

+ 9 - 2
js/component/manageCenter/order/orderNew/contractJsy.js

@@ -1,5 +1,5 @@
 import React from "react";
-import { Button, Input, Spin, Table, message, Form, Modal, Tabs } from "antd";
+import { Button, Input, Spin, Table, message, Form, Modal, Tabs,Tag } from "antd";
 import $ from "jquery/src/ajax";
 import {
   getNewOrderStatus,
@@ -21,6 +21,7 @@ import OrderRiZi from "@/orderRiZi.jsx";
 import {ChooseList} from "./chooseList";
 import {getProjectName} from "../../../tools";
 import ProjectDetailsReadOnly from "../../../common/projectDetailsReadOnly";
+import OrderItemStatus from '../../../../component/common/orderItemStatus';
 const contractChange = Form.create()(
   React.createClass({
     loadData(pageNo) {
@@ -445,7 +446,8 @@ const contractChange = Form.create()(
               contractNo: thisdata.contractNo,
               // arrears: thisdata.arrears,
               orderData: thisdata,
-              isAddition: thisdata.additionalOrder ? true : false
+              isAddition: thisdata.additionalOrder ? true : false,
+              deleteSign:thisdata.deleteSign,
             });
           }
         }.bind(this)
@@ -1112,6 +1114,11 @@ const contractChange = Form.create()(
                 activeKey={this.state.activeKey}
                 onChange={this.callback}
                 type="card"
+                tabBarExtraContent={
+                  <div style={{fontWeight:'bold',paddingRight:'15px'}}>
+                    <OrderItemStatus deleteSign={this.state.deleteSign}/>
+                  </div>
+                }
               >
                 <TabPane tab="订单详情" key="a">
                   <Form

+ 9 - 2
js/component/manageCenter/project/project/outsourceTaskAssignment.jsx

@@ -19,6 +19,7 @@ import ShowModalDiv from "@/showModal.jsx";
 import ResolutionPro from "../task/resolutionPro";
 import {ChooseList} from "../../order/orderNew/chooseList";
 import ProjectDetailsReadOnly from "../../../common/projectDetailsReadOnly";
+import OrderItemStatus from "../../../common/orderItemStatus";
 const FormItem = Form.Item;
 const {TabPane} = Tabs
 const OutsourceTaskAssignment = React.createClass({
@@ -408,6 +409,7 @@ const OutsourceTaskAssignment = React.createClass({
             nowFinance: thisdata.nowFinance, //财务名称
             nowFinanceMobile: thisdata.nowFinanceMobile, //财务电话
             depName: thisdata.depName, //订单部门
+            deleteSign:thisdata.deleteSign,
           });
         }
       }.bind(this),
@@ -777,6 +779,7 @@ const OutsourceTaskAssignment = React.createClass({
                   globalConfig.avatarHost + "/upload"
                 )
               : [],
+            deleteSign:thisdata.deleteSign,
           });
         }
       }.bind(this),
@@ -1049,7 +1052,7 @@ const OutsourceTaskAssignment = React.createClass({
           showDesc={this.state.assignVisible}
           closeDesc={this.closeAssign.bind(this)}
           fenpaiData={8}
-          specially={this.state.nub == "咨询师经理" ? 1 : 0}
+          type={this.state.nub == "咨询师经理" ? 1 : 2}
           roleName={this.state.nub}
           requestMethod={"post"}
         />
@@ -1063,7 +1066,11 @@ const OutsourceTaskAssignment = React.createClass({
           onOk={this.visitOk}
           onCancel={this.visitCancel}
         >
-          <Tabs activeKey={this.state.activeKey} onChange={this.orderChange}>
+          <Tabs activeKey={this.state.activeKey} onChange={this.orderChange} tabBarExtraContent={
+            <div style={{fontWeight:'bold',paddingRight:'15px'}}>
+              <OrderItemStatus deleteSign={this.state.deleteSign}/>
+            </div>
+          }>
             <TabPane tab="任务详情" key="1">
               <Form
                 layout="horizontal"

+ 1 - 1
js/component/manageCenter/project/project/projectAssignment.jsx

@@ -1162,12 +1162,12 @@ const PaiDan = React.createClass({
         </div>
         <Assign
           title="项目"
+          type={0}
           selApi="/api/admin/orderProject/projectDistribution"
           data={this.state.assignData}
           showDesc={this.state.assignVisible}
           closeDesc={this.closeAssign.bind(this)}
           fenpaiData={8}
-          specially={1}
           roleName={"咨询师经理"}
           requestMethod={"post"}
           reset={this.reset}

+ 0 - 25
js/component/manageCenter/project/project/projectQuery.jsx

@@ -98,7 +98,6 @@ const PaiDan = React.createClass({
     return {
       rotateDeg: 0,
       searchMore: true,
-      assignVisible: false,
       releaseDate: [],
       boHuivisible: false,
       selectedRowKeys: [],
@@ -273,13 +272,6 @@ const PaiDan = React.createClass({
       dataSourceX: []
     };
   },
-  /* 分派 */
-  evaluate(record) {
-    this.state.assignData = record;
-    this.setState({
-      assignVisible: true
-    });
-  },
 
   componentWillMount() {
     this.departmentList();
@@ -419,13 +411,6 @@ const PaiDan = React.createClass({
       this.loadData(this.state.page);
     }
   },
-  closeAssign(e, s) {
-    this.state.assignVisible = e;
-    if (s) {
-      this.loadData(this.state.page);
-      this.xiangmu(this.state.orderNo);
-    }
-  },
   search() {
     this.loadData();
   },
@@ -819,16 +804,6 @@ const PaiDan = React.createClass({
             />
           </Spin>
         </div>
-        <Assign
-          title="项目"
-          selApi="/api/admin/orderProject/projectDistribution"
-          data={this.state.assignData}
-          showDesc={this.state.assignVisible}
-          closeDesc={this.closeAssign.bind(this)}
-          fenpaiData={8}
-          specially={1}
-          roleName={"咨询师经理"}
-        />
         {this.state.visible ? <Modal
           className="customeDetails"
           footer=""

+ 8 - 1
js/component/manageCenter/project/summary/projectDetails.jsx

@@ -18,6 +18,7 @@ import {
 import OrderRiZi from "@/orderRiZi.jsx";
 import $ from "jquery";
 import DeclarationProgress from "../../../common/declarationProgress";
+import OrderItemStatus from "../../../common/orderItemStatus";
 
 const FormItem =Form.Item;
 const {TabPane} = Tabs;
@@ -555,6 +556,7 @@ class ProjectDetails extends Component{
                         ProvinceCity: ProvinceCityArr,
                         postalAddress: thisdata.postalAddress, //详细地址
                         outsource: thisdata.outsource,
+                        deleteSign:thisdata.deleteSign,
                     });
                 }
             }.bind(this),
@@ -694,6 +696,7 @@ class ProjectDetails extends Component{
                                 globalConfig.avatarHost + "/upload"
                             )
                             : [],
+                        deleteSign:thisdata.deleteSign,
                     });
                 }
             }.bind(this),
@@ -822,7 +825,11 @@ class ProjectDetails extends Component{
                         this.props.visitCancel && this.props.visitCancel();
                     }}
                 >
-                    <Tabs activeKey={this.state.activeKey} onChange={this.orderChange}>
+                    <Tabs activeKey={this.state.activeKey} onChange={this.orderChange} tabBarExtraContent={
+                        <div style={{fontWeight:'bold',paddingRight:'15px'}}>
+                            <OrderItemStatus deleteSign={this.state.deleteSign}/>
+                        </div>
+                    }>
                         <TabPane tab="项目概况" key="1">
                             {this.state.activeKey === "1" ? <Form
                                 layout="horizontal"

+ 56 - 15
js/component/manageCenter/project/task/myTask.jsx

@@ -52,6 +52,8 @@ import ImgList from "../../../common/imgList";
 import OperationPayNode from "./operationPayNode";
 import PatentSchedule from './patentSchedule';
 import ProjectDetailsReadOnly from "../../../common/projectDetailsReadOnly";
+import ProjectLog from './projectLog';
+import OrderItemStatus from "../../../common/orderItemStatus";
 const confirm = Modal.confirm
 const FormItem = Form.Item
 const { TabPane } = Tabs
@@ -259,6 +261,8 @@ const Task = React.createClass({
           title: '项目编号',
           dataIndex: 'id',
           key: 'id',
+          fixed: 'left',
+          width: 50,
           render: (text, record) => {
             if (record.splitStatus == 2) {
               return <span>{record.splitSuper + '-' + record.splitId}</span>
@@ -271,6 +275,8 @@ const Task = React.createClass({
           title: '项目名称',
           dataIndex: 'taskName',
           key: 'taskName',
+          fixed: 'left',
+          width: 100,
           render: (text) => {
             return text && text.length > 8 ? text.substr(0, 8) + '…' : text
           },
@@ -279,27 +285,35 @@ const Task = React.createClass({
           title: '项目数量',
           dataIndex: 'commodityQuantity',
           key: 'commodityQuantity',
+          fixed: 'left',
+          width: 50,
         },
         {
           title: '订单编号',
           dataIndex: 'orderNo',
           key: 'orderNo',
+          fixed: 'left',
+          width: 150,
         },
         {
           title: '合同编号',
           dataIndex: 'contractNo',
           key: 'contractNo',
-        },
-        {
-          title: '业务类别',
-          dataIndex: 'cname',
-          key: 'cname',
+          fixed: 'left',
+          width: 120,
         },
         {
           title: '客户名称',
           dataIndex: 'userName',
           key: 'userName',
           className: 'userName',
+          fixed: 'left',
+          width: 150,
+        },
+        {
+          title: '业务类别',
+          dataIndex: 'cname',
+          key: 'cname',
         },
         {
           title: '分配状态',
@@ -392,7 +406,7 @@ const Task = React.createClass({
                 <Button
                   type="primary"
                   onClick={(e) => {
-                    e.stopPropagation(), this.evaluate(record, '咨询师')
+                    e.stopPropagation(), this.evaluate(record, this.props.isZxs ? '咨询师' : '咨询师经理')
                   }}
                 >
                   转交
@@ -429,6 +443,19 @@ const Task = React.createClass({
                 >
                   工时记录
                 </Button>
+                <Button
+                    type="primary"
+                    style={{ marginLeft: '10px' }}
+                    onClick={(e) => {
+                      e.stopPropagation()
+                      this.setState({
+                        projectLogVisible: true,
+                        projectLogId : record.id
+                      })
+                    }}
+                >
+                  项目日志
+                </Button>
               </div>
             )
           },
@@ -1686,6 +1713,7 @@ const Task = React.createClass({
             depName: thisdata.depName, //订单部门
             ProvinceCity: ProvinceCityArr[0] === null ? [] : ProvinceCityArr,
             postalAddress: thisdata.postalAddress, //详细地址
+            deleteSign:thisdata.deleteSign,
           })
         }
       }.bind(this),
@@ -2060,6 +2088,7 @@ const Task = React.createClass({
 
       id : '', //项目编号
       projectStatus : undefined, //项目状态
+      deleteSign:undefined,
       taskStatuSearch : undefined, //项目状态
       startDate : '', //启动日期
       endDate : '', //结束日期
@@ -3529,7 +3558,7 @@ const Task = React.createClass({
           showDesc={this.state.assignVisible}
           closeDesc={this.closeAssign.bind(this)}
           fenpaiData={8}
-          specially={0}
+          type={this.state.flag ? 4 : 3}
           roleName={this.state.nub}
           requestMethod={'post'}
           flag={this.state.flag}
@@ -3585,17 +3614,18 @@ const Task = React.createClass({
                 <div style={{fontWeight:'bold',paddingRight:'15px'}}>
                   <span>
                     项目名称:
-                  <span style={{color:'#F00',paddingRight:'5px'}}>{this.state.taskName}</span>
+                    <span style={{color:'#F00',paddingRight:'5px'}}>{this.state.taskName}</span>
                   </span>
                   <span style={{marginLeft:'15px'}}>
-                    项目编号:
-                  <span style={{color:'#F00',paddingRight:'5px'}}>
-                    {this.state.id}
-                    {
-                      this.state.splitStatus === 2 ? '('+this.state.splitSuper+'-'+this.state.splitId+')' : ''
-                    }
-                  </span>
+                      项目编号:
+                    <span style={{color:'#F00',paddingRight:'5px'}}>
+                      {this.state.id}
+                      {
+                        this.state.splitStatus === 2 ? '('+this.state.splitSuper+'-'+this.state.splitId+')' : ''
+                      }
+                    </span>
                   </span>
+                  <OrderItemStatus deleteSign={this.state.deleteSign}/>
                 </div>
               }
             activeKey={this.state.activeKey}
@@ -5168,6 +5198,7 @@ const Task = React.createClass({
                     }
                   </span>
                   </span>
+                  <OrderItemStatus deleteSign={this.state.deleteSign}/>
                 </div>
               }
               activeKey={this.state.activeKey}
@@ -6445,6 +6476,16 @@ const Task = React.createClass({
             visible={this.state.addnextVisible}
             onCancel={this.nextCancel}
         />}
+        {this.state.projectLogVisible && <ProjectLog
+            projectLogId={this.state.projectLogId}
+            visible={this.state.projectLogVisible}
+            onCancel={()=>{
+              this.setState({
+                projectLogId: '',
+                projectLogVisible: false,
+              })
+            }}
+        />}
       </div>
     )
   },

+ 12 - 2
js/component/manageCenter/project/task/myTaskOutsource.jsx

@@ -54,6 +54,7 @@ import NewSupplier from "./newSupplier";
 import NowProjectStatus from '../../../common/nowProjectStatus';
 import OperationPayNode from "./operationPayNode";
 import DeclarationProgress from "../../../common/declarationProgress";
+import OrderItemStatus from "../../../common/orderItemStatus";
 const FormItem = Form.Item;
 const { Option } = Select;
 const { TextArea } = Input;
@@ -462,7 +463,7 @@ const MyTaskOutsource = React.createClass({
                 >
                   转交
                 </Button>
-                <Button
+                {this.props.isZxs ? <Button
                   type="primary"
                   style={{ marginLeft: 10 }}
                   onClick={(e) => {
@@ -471,7 +472,7 @@ const MyTaskOutsource = React.createClass({
                   }}
                 >
                   回退
-                </Button>
+                </Button> : null}
                 <Button
                   type="primary"
                   style={{ margin: "0 10px" }}
@@ -1130,6 +1131,7 @@ const MyTaskOutsource = React.createClass({
             depName: thisdata.depName, //订单部门
             ProvinceCity: ProvinceCityArr[0] === null ? [] : ProvinceCityArr,
             postalAddress: thisdata.postalAddress, //详细地址
+            deleteSign:thisdata.deleteSign,
           });
         }
       }.bind(this),
@@ -3130,6 +3132,7 @@ const MyTaskOutsource = React.createClass({
             contractNo: thisdata.contractNo,
             orderData: thisdata,
             isAddition: thisdata.additionalOrder ? true : false,
+            deleteSign:thisdata.deleteSign,
             contractPictureUrl: thisdata.contractPictureUrl
               ? splitUrl(
                   thisdata.contractPictureUrl,
@@ -3313,6 +3316,7 @@ const MyTaskOutsource = React.createClass({
           closeDesc={this.closeAssign.bind(this)}
           fenpaiData={8}
           specially={0}
+          type={this.props.isZxs ? (this.state.flag ? 4 : 3) :1}
           roleName={this.state.nub}
           requestMethod={"post"}
           flag={this.state.flag}
@@ -3384,6 +3388,7 @@ const MyTaskOutsource = React.createClass({
                       }
                     </span>
                   </span>
+                  <OrderItemStatus deleteSign={this.state.deleteSign}/>
                 </div>
               }
           >
@@ -4841,6 +4846,11 @@ const MyTaskOutsource = React.createClass({
             activeKey={this.state.modKey}
             onChange={this.callBack}
             type="card"
+            tabBarExtraContent={
+              <div style={{fontWeight:'bold',paddingRight:'15px'}}>
+                <OrderItemStatus deleteSign={this.state.deleteSign}/>
+              </div>
+            }
           >
             <TabPane tab="项目概况" key="1">
               <div className="clearfix">

+ 32 - 4
js/component/manageCenter/project/task/payApplyReject/detailsModal/index.js

@@ -5,6 +5,7 @@ import ProjectOverview from './projectOverview'
 import {splitUrl} from '@/tools'
 import CheckProject from "../../../../components/checkProject";
 import $ from "jquery";
+import OrderItemStatus from "../../../../../common/orderItemStatus";
 
 const { TabPane } = Tabs
 
@@ -26,9 +27,11 @@ class DetailsModal extends Component{
         if(this.props.tid){
             this.waiDetail();
             this.thirdTable(this.props.tid);
+            this.getOrderNewDetail();
             await this.xiangqing(this.props.tid);
             await this.getCsortData(this.state.sort)
             await this.payNodeTable(this.props.tid);
+
         }
     }
 
@@ -282,6 +285,30 @@ class DetailsModal extends Component{
         )
     }
 
+    getOrderNewDetail() {
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/newOrder/getOrderNewDetail",
+            data: {
+                orderNo: this.props.orderNo
+            },
+            success: function (data) {
+                if (data.error.length || data.data.list == "") {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    }
+                } else {
+                    let thisdata = data.data;
+                    this.setState({
+                        deleteSign:thisdata.deleteSign,
+                    });
+                }
+            }.bind(this)
+        });
+    }
+
     render() {
         return(
             <Modal
@@ -312,14 +339,15 @@ class DetailsModal extends Component{
                         <div style={{fontWeight:'bold',paddingRight:'15px'}}>
                           <span>
                             项目名称:
-                          <span style={{color:'#F00',paddingRight:'5px'}}>{this.props.taskName}</span>
+                            <span style={{color:'#F00',paddingRight:'5px'}}>{this.props.taskName}</span>
                           </span>
                           <span style={{marginLeft:'15px'}}>
                             项目编号:
-                          <span style={{color:'#F00',paddingRight:'5px'}}>
-                              {this.props.taskID}
-                          </span>
+                              <span style={{color:'#F00',paddingRight:'5px'}}>
+                                  {this.props.taskID}
+                              </span>
                           </span>
+                            <OrderItemStatus deleteSign={this.state.deleteSign}/>
                         </div>
                     }
                 >

+ 119 - 0
js/component/manageCenter/project/task/projectLog.jsx

@@ -0,0 +1,119 @@
+import React,{Component} from "react";
+import {message, Modal, Spin, Table} from "antd";
+import $ from "jquery/src/ajax";
+
+class ProjectLog extends Component{
+    constructor(props) {
+        super(props);
+        this.state={
+            loading:false,
+            dataSource:[],
+            colunmn:[
+                {
+                    title: "序号",
+                    dataIndex: "key",
+                    key: "key",
+                },
+                // {
+                //     title: "客户姓名",
+                //     dataIndex: "key",
+                //     key: "key",
+                // },
+                // {
+                //     title: "项目名称",
+                //     dataIndex: "key",
+                //     key: "key",
+                // },
+                {
+                    title: "原咨询师/咨询经理",
+                    dataIndex: "key",
+                    key: "key",
+                },
+                {
+                    title: "现咨询师/咨询经理",
+                    dataIndex: "key",
+                    key: "key",
+                },
+                {
+                    title: "操作类型",
+                    dataIndex: "key",
+                    key: "key",
+                },
+                {
+                    title: "操作时间",
+                    dataIndex: "key",
+                    key: "key",
+                },
+            ]
+        }
+        this.loadData = this.loadData.bind(this);
+    }
+
+    loadData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/orderProject/taskAttributionLog",
+            data: {
+                tid: this.props.projectLogId,
+            },
+            success: function (data) {
+                if (data.error && data.error.length) {
+                    message.warning(data.error[0].message);
+                }else{
+                    let theArr = [];
+                    for (let i = 0; i < data.data.length; i++) {
+                        let thisdata = data.data[i];
+                        thisdata.key = i+1 ;
+                        theArr.push(thisdata)
+                    }
+                    this.setState({
+                        dataSource: theArr,
+                    })
+                }
+            }.bind(this),
+        }).always(
+            function () {
+                this.setState({
+                    loading: false,
+                });
+            }.bind(this)
+        );
+
+    }
+
+    componentDidMount() {
+        this.loadData();
+    }
+
+    render() {
+        return (
+            <Modal
+                style={{ position: "relative" }}
+                title="项目日志"
+                visible={this.props.visible}
+                onCancel={this.props.onCancel}
+                footer={null}
+                width={800}
+                destroyOnClose={true}
+            >
+                <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>
+            </Modal>
+        )
+    }
+}
+
+export default ProjectLog;

+ 9 - 2
js/component/manageCenter/project/task/taskAssignment.jsx

@@ -19,6 +19,7 @@ import ShowModalDiv from "@/showModal.jsx";
 import ResolutionPro from "./resolutionPro"
 import {ChooseList} from "../../order/orderNew/chooseList";
 import ProjectDetailsReadOnly from "../../../common/projectDetailsReadOnly";
+import OrderItemStatus from "../../../common/orderItemStatus";
 const FormItem = Form.Item;
 const {TabPane} = Tabs
 const Task = React.createClass({
@@ -404,6 +405,7 @@ const Task = React.createClass({
             nowFinance: thisdata.nowFinance, //财务名称
             nowFinanceMobile: thisdata.nowFinanceMobile, //财务电话
             depName: thisdata.depName, //订单部门
+            deleteSign:thisdata.deleteSign,
           });
         }
       }.bind(this),
@@ -773,6 +775,7 @@ const Task = React.createClass({
                   globalConfig.avatarHost + "/upload"
                 )
               : [],
+            deleteSign:thisdata.deleteSign,
           });
         }
       }.bind(this),
@@ -1040,7 +1043,7 @@ const Task = React.createClass({
           showDesc={this.state.assignVisible}
           closeDesc={this.closeAssign.bind(this)}
           fenpaiData={8}
-          specially={this.state.nub == "咨询师经理" ? 1 : 0}
+          type={this.state.nub == "咨询师经理" ? 1 : 2}
           // 判断是转交按钮还是分配任务按钮
           // chooseBtn={this.state.nub == "咨询师经理" ? true : false}
           roleName={this.state.nub}
@@ -1055,7 +1058,11 @@ const Task = React.createClass({
           onOk={this.visitOk}
           onCancel={this.visitCancel}
         >
-          <Tabs activeKey={this.state.activeKey} onChange={this.orderChange}>
+          <Tabs activeKey={this.state.activeKey} onChange={this.orderChange} tabBarExtraContent={
+            <div style={{fontWeight:'bold',paddingRight:'15px'}}>
+              <OrderItemStatus deleteSign={this.state.deleteSign}/>
+            </div>
+          }>
             <TabPane tab="任务详情" key="1">
               <Form
                 layout="horizontal"

+ 9 - 1
js/component/manageCenter/project/task/taskCount.jsx

@@ -21,6 +21,7 @@ import {ChooseList} from "../../order/orderNew/chooseList";
 import PatentSchedule from './patentSchedule';
 import DeclarationProgress from "../../../common/declarationProgress";
 import ProjectDetailsReadOnly from "../../../common/projectDetailsReadOnly";
+import OrderItemStatus from "../../../common/orderItemStatus";
 
 const {TabPane} = Tabs
 
@@ -637,7 +638,8 @@ const IntentionCustomer = Form.create()(
               locationArea: thisdata.locationArea,
               ProvinceCity: ProvinceCityArr,
               postalAddress: thisdata.postalAddress, //详细地址
-              outsource: thisdata.outsource
+              outsource: thisdata.outsource,
+              deleteSign:thisdata.deleteSign,
             });
           }
         }.bind(this)
@@ -1259,6 +1261,9 @@ const IntentionCustomer = Form.create()(
             >
               <Spin spinning={this.state.loading}>
                 <div className="clearfix">
+                  <div style={{position:"absolute",top:'-52px',left:'81px',zIndex:10000}}>
+                    <OrderItemStatus deleteSign={this.state.deleteSign}/>
+                  </div>
                   <div className="clearfix">
                     <FormItem
                         className="half-item"
@@ -1839,6 +1844,9 @@ const IntentionCustomer = Form.create()(
             className="admin-desc-content"
           >
             <div className="clearfix">
+              <div style={{position:"absolute",top:'-52px',left:'81px',zIndex:10000}}>
+                <OrderItemStatus deleteSign={this.state.deleteSign}/>
+              </div>
               <FormItem
                   className="half-item"
                   {...formItemLayout}

+ 14 - 29
js/component/manageCenter/project/task/taskQuery.jsx

@@ -14,7 +14,6 @@ import {
   Tabs,
   Tag, DatePicker
 } from "antd";
-import Assign from '@/manageCenter/publicComponent/assign';
 import ResolutionDetail from "@/resolutionDetail";
 import OrderDetail from "../../order/orderNew/changeComponent/orderDetail";
 import OrderRiZi from "@/orderRiZi.jsx";
@@ -40,6 +39,7 @@ import {ChooseList} from "../../order/orderNew/chooseList";
 import moment from "moment";
 import DeclarationProgress from "../../../common/declarationProgress";
 import ProjectDetailsReadOnly from "../../../common/projectDetailsReadOnly";
+import OrderItemStatus from "../../../common/orderItemStatus";
 
 const Task = React.createClass({
   loadData(pageNo) {
@@ -131,7 +131,6 @@ const Task = React.createClass({
       timeRecordparse:{},
       activeKey: "1",
       searchMore: true,
-      assignVisible: false,
       releaseDate: [],
       roleName: "",
       testFlag: true,
@@ -352,14 +351,7 @@ const Task = React.createClass({
       officialCost: '',
     };
   },
-  /* 分派 */
-  evaluate(record, nub) {
-    this.state.assignData = record;
-    this.setState({
-      nub,
-      assignVisible: true,
-    });
-  },
+
   componentDidMount() {
     this.setColor();
   },
@@ -549,6 +541,7 @@ const Task = React.createClass({
             ProvinceCity: ProvinceCityArr,
             postalAddress: thisdata.postalAddress, //详细地址
             outsource: thisdata.outsource,
+            deleteSign:thisdata.deleteSign,
           });
         }
       }.bind(this),
@@ -719,13 +712,6 @@ const Task = React.createClass({
       this.loadData(this.state.page);
     }
   },
-  closeAssign(e, s) {
-    this.state.roleName = "";
-    this.state.assignVisible = e;
-    if (s) {
-      this.loadData(this.state.page);
-    }
-  },
   nextCancel() {
     this.setState({
       addnextVisible: false,
@@ -886,6 +872,7 @@ const Task = React.createClass({
             contractNo: thisdata.contractNo,
             orderData: thisdata,
             isAddition: thisdata.additionalOrder ? true : false,
+            deleteSign:thisdata.deleteSign,
             contractPictureUrl: thisdata.contractPictureUrl
               ? splitUrl(
                   thisdata.contractPictureUrl,
@@ -1146,16 +1133,6 @@ const Task = React.createClass({
             />
           </Spin>
         </div>
-        <Assign
-          title="任务"
-          selApi={"/api/admin/orderProject/projectDistribution"}
-          data={this.state.assignData}
-          showDesc={this.state.assignVisible}
-          closeDesc={this.closeAssign.bind(this)}
-          fenpaiData={8}
-          specially={0}
-          roleName={this.state.nub}
-        />
         {this.state.visible ? <Modal
           className="customeDetails"
           footer=""
@@ -1166,7 +1143,11 @@ const Task = React.createClass({
           onOk={this.visitOk}
           onCancel={this.visitCancel}
         >
-          <Tabs activeKey={this.state.activeKey} onChange={this.orderChange}>
+          <Tabs activeKey={this.state.activeKey} onChange={this.orderChange} tabBarExtraContent={
+            <div style={{fontWeight:'bold',paddingRight:'15px'}}>
+              <OrderItemStatus deleteSign={this.state.deleteSign}/>
+            </div>
+          }>
             <TabPane tab="项目概况" key="1">
               {this.state.activeKey === "1" ? <Form
                 layout="horizontal"
@@ -1792,7 +1773,11 @@ const Task = React.createClass({
           footer=""
           className="admin-desc-content"
         >
-          <Tabs activeKey={this.state.activeKey} onChange={this.orderChange}>
+          <Tabs activeKey={this.state.activeKey} onChange={this.orderChange} tabBarExtraContent={
+            <div style={{fontWeight:'bold',paddingRight:'15px'}}>
+              <OrderItemStatus deleteSign={this.state.deleteSign}/>
+            </div>
+          }>
             <TabPane tab="项目概况" key="1">
               {this.state.activeKey === "1" ?
                   <div>

+ 9 - 19
js/component/manageCenter/publicComponent/assign.jsx

@@ -97,7 +97,7 @@ const Assign = React.createClass({
                         if (this.props.data.length) {
                             return (
                                 // <Popconfirm title={'您确认将所选订单分配给【'+record.departmentName+'-'+record.name+'】?'} onConfirm={(e)=>{this.confirmSelect1(record)}} okText="确认" cancelText="取消">
-                                //     <Button style={{marginRight:'5px'}} type="primary">选定</Button>                 
+                                //     <Button style={{marginRight:'5px'}} type="primary">选定</Button>
                                 // </Popconfirm>
                                 <Popconfirm title={'您确认将所选订单分配给【' + record.departmentName + '-' + record.name + '】?'} onConfirm={(e) => { this.setState({ remarksVisible: true, remarks: "", fn: this.confirmSelect1, record }) }} okText="确认" cancelText="取消">
                                     <Button style={{ marginRight: '5px' }} type="primary">选定</Button>
@@ -210,7 +210,7 @@ const Assign = React.createClass({
             // 				financeId: this.state.contact?record.id:record.contactId,    //分配人物id
             // 				approval:this.props.data.approval,   //是否特批
             // 				newFinance:this.state.contact?record.id:record.contactId
-            // 				
+            //
             // 			}
             data: this.judge(this.props, record)
         }).done(function (data) {
@@ -285,21 +285,11 @@ const Assign = React.createClass({
     /* 区分分派和两种转交 */
     judge(props, record) {
         if (props.fenpaiData === 8) {
-            if (props.flag === true) {
-                return {
-                    taskId: props.data.id, //任务ID
-                    taskReceiverId: this.state.contact
-                        ? record.id
-                        : record.contactId, //分配人物ID
-                    specially: 2, //退给咨询师经理
-                    remarks: this.state.remarks
-                };
-            }
             return {
                 taskId: props.data.id,//任务ID
                 taskReceiverId: this.state.contact ? record.id : record.contactId,//分配人物ID
-                specially: props.specially,//是否是咨询师管理员
-                remarks: this.state.remarks
+                remarks: this.state.remarks,
+                type: this.props.type,
             };
         } else if (props.fenpaiData === 4) {
             return {
@@ -351,7 +341,7 @@ const Assign = React.createClass({
         let departmentArr = this.state.departmentArr || [];
         return (
             <div className="user-content" >
-                <Modal maskClosable={false} visible={this.state.visible}
+                {this.state.visible ? <Modal maskClosable={false} visible={this.state.visible}
                     onOk={this.onShow} onCancel={this.onCancel}
                     width='800px'
                     title='选择'
@@ -392,8 +382,8 @@ const Assign = React.createClass({
                             </div>
                         </Spin>
                     </Form>
-                </Modal>
-                <Modal
+                </Modal> : null}
+                {this.state.remarksVisible ? <Modal
                     maskClosable={false}
                     visible={this.state.remarksVisible}
                     onOk={e => {
@@ -458,10 +448,10 @@ const Assign = React.createClass({
                             </div>
                         </Spin>
                     </Form>
-                </Modal>
+                </Modal> : null}
             </div>
         );
     }
 });
 
-export default Assign;
+export default Assign;

+ 2 - 2
js/component/manageCenter/set/userManagementS/roles.jsx

@@ -307,8 +307,8 @@ const Roles=Form.create()(React.createClass({
 
                     </div>
                     </TabPane>
-                        <TabPane tab="新增用户" key="2">
-                            <Button type="primary" className="addButton" style={{float:"left",marginBottom:10,marginLeft:10}} onClick={this.addClick} >新增用户<Icon type="user" /></Button>
+                        <TabPane tab="新增角色" key="2">
+                            <Button type="primary" className="addButton" style={{float:"left",marginBottom:10,marginLeft:10}} onClick={this.addClick} >新增角色<Icon type="user" /></Button>
                     </TabPane>
                         <TabPane tab="更改表格显示数据" key="3">
                             <div style={{ marginLeft: 10 }}>

+ 20 - 3
js/component/zhuanjiaoDetail.jsx

@@ -1,5 +1,5 @@
 import React from "react";
-import { Spin, Button, Tabs, Table, message, Modal } from "antd";
+import {Spin, Button, Tabs, Table, message, Modal, Tooltip} from "antd";
 import $ from "jquery/src/ajax";
 const ZhuanjiaoDetail = React.createClass({
   getInitialState() {
@@ -26,7 +26,7 @@ const ZhuanjiaoDetail = React.createClass({
           dataIndex: "newAName",
           key: "newAName",
         },
-        //  0录入 1 领取 2 转交私有客户 3转交业务 4 未跟进丢失(30) 5未签单丢失(270天)6释放  7转交签单客户  8渠道录入  9渠道客户分配  10 渠道客户转交 11渠道释放
+        //  0录入 1 领取 2 转交私有客户 3转交业务 4 未跟进丢失(30) 5未签单丢失(270天)6释放  7转交签单客户  8渠道录入  9渠道客户分配  10 渠道客户转交 11渠道释放 12 回收 13离职转交
         {
           title: "转交类型",
           dataIndex: "type",
@@ -47,7 +47,8 @@ const ZhuanjiaoDetail = React.createClass({
                                                         text === 9 ? "渠道客户总监分配" :
                                                             text === 10 ? "渠道客户经理分配" :
                                                                 text === 11 ? "渠道释放" :
-                                                                    text === 12 ? '回收' :""
+                                                                    text === 12 ? '回收' :
+                                                                        text === 13 ? '离职转交' :""
 
                   }
                 </span>
@@ -64,6 +65,22 @@ const ZhuanjiaoDetail = React.createClass({
           dataIndex: "createDate",
           key: "createDate",
         },
+        {
+          title: "备注",
+          dataIndex: "remarks",
+          key: "remarks",
+          render: (text) => {
+            return (
+                <Tooltip placement="topLeft" title={text}>
+                  <div style={{
+                    maxWidth:'150px',
+                    overflow:'hidden',
+                    textOverflow: "ellipsis",
+                    whiteSpace:'nowrap',
+                  }}>{text}</div>
+                </Tooltip>)
+          }
+        },
       ]
     };
   },

+ 1 - 1
package.json

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

+ 13 - 0
webpack.config.js

@@ -118,6 +118,19 @@ module.exports = (function () {
             chunks: ['user/account/set', 'vendors'],
         }),
         new HtmlWebpackPlugin({
+            title: '管理员-客服管理',
+            filename: 'admin/customerService.html',
+            template: './template/template.html',
+            chunks: ['admin/customerService', 'vendors'],
+        }),
+        //admin-set
+        new HtmlWebpackPlugin({
+            title: '管理员-用户管理',
+            filename: 'admin/set.html',
+            template: './template/template.html',
+            chunks: ['admin/set', 'vendors'],
+        }),
+        new HtmlWebpackPlugin({
             title: '用户中心-科技服务',
             filename: 'user/account/services.html',
             template: './template/template.html',

+ 7 - 1
webpack/entry.config.js

@@ -33,6 +33,7 @@ module.exports = {
       "./js/admin/servicesManage/projectOrder.js",
     //admin/demand
     "admin/demand": "./js/admin/demand.js",
+    "admin/customerService": "./js/admin/customerService.js",
     "admin/achievement": "./js/admin/achievement.js",
     "admin/customer": "./js/admin/customer.js",
     //admin/userOrder
@@ -131,6 +132,11 @@ module.exports = {
       "webpack/hot/only-dev-server",
       "./js/admin/demand.js",
     ],
+    "admin/customerService": [
+      "webpack-dev-server/client?http://127.0.0.1:80", // WebpackDevServer host and port
+      "webpack/hot/only-dev-server",
+      "./js/admin/customerService.js",
+    ],
     "admin/achievement": [
       "webpack-dev-server/client?http://127.0.0.1:80", // WebpackDevServer host and port
       "webpack/hot/only-dev-server",
@@ -240,4 +246,4 @@ module.exports = {
     //   './js/portal/search/subscriberOrg.js'
     // ]
   },
-};
+};