Browse Source

Accept Merge Request #15 v1.0.9 merge : (master -> test)

Merge Request: v1.0.9 merge
Created By: @seirios
Accepted By: @seirios
URL: https://coding.net/t/aft/p/AFT-WEB/git/merge/15
seirios 8 years ago
parent
commit
f258f8111f
43 changed files with 4717 additions and 139 deletions
  1. 1 1
      .gitignore
  2. 6 1
      entry.js
  3. BIN
      image/bg.jpg
  4. 1 1
      js/admin/servicesManage/copyright.js
  5. 16 0
      js/admin/servicesManage/technology.js
  6. 8 18
      js/component/account/services/activity.jsx
  7. 5 2
      js/component/account/services/content.jsx
  8. 239 0
      js/component/account/services/copyright/comPatentAdd.jsx
  9. 362 0
      js/component/account/services/copyright/comPatentChange.jsx
  10. 42 0
      js/component/account/services/copyright/comprehensive.less
  11. 262 0
      js/component/account/services/copyright/copyright.jsx
  12. 287 0
      js/component/account/services/copyright/copyright.less
  13. 2 2
      js/component/account/services/leftTab.jsx
  14. 6 2
      js/component/account/set/hrSituation.jsx
  15. 48 0
      js/component/dataDic.js
  16. 16 16
      js/component/groupCertify/certify.less
  17. 3 3
      js/component/groupCertify/personal.jsx
  18. 2 2
      js/component/groupCertify/result.jsx
  19. 3 2
      js/component/groupCertify/top.jsx
  20. 239 0
      js/component/manageCenter/servicesManage/copyright/comPatentAdd.jsx
  21. 362 0
      js/component/manageCenter/servicesManage/copyright/comPatentChange.jsx
  22. 42 0
      js/component/manageCenter/servicesManage/copyright/comprehensive.less
  23. 37 0
      js/component/manageCenter/servicesManage/copyright/content.jsx
  24. 324 0
      js/component/manageCenter/servicesManage/copyright/copyright.jsx
  25. 287 0
      js/component/manageCenter/servicesManage/copyright/copyright.less
  26. 57 24
      js/component/manageCenter/servicesManage/highTech/HighTechApply.jsx
  27. 15 12
      js/component/manageCenter/servicesManage/highTech/fosterDesc/activity.jsx
  28. 27 23
      js/component/manageCenter/servicesManage/highTech/fosterDesc/activityCostList.jsx
  29. 8 7
      js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectualDesc.jsx
  30. 11 9
      js/component/manageCenter/servicesManage/highTech/fosterDesc/orgTechCenter.jsx
  31. 15 2
      js/component/manageCenter/servicesManage/leftTab.jsx
  32. 6 9
      js/component/manageCenter/servicesManage/patent/comPatentAdd.jsx
  33. 224 0
      js/component/manageCenter/servicesManage/technology/applyAdd.jsx
  34. 470 0
      js/component/manageCenter/servicesManage/technology/applyChange.jsx
  35. 337 0
      js/component/manageCenter/servicesManage/technology/applyManage.jsx
  36. 46 0
      js/component/manageCenter/servicesManage/technology/content.jsx
  37. 102 0
      js/component/manageCenter/servicesManage/technology/technology.less
  38. 132 0
      js/component/manageCenter/servicesManage/technology/websiteAdd.jsx
  39. 349 0
      js/component/manageCenter/servicesManage/technology/websiteChange.jsx
  40. 284 0
      js/component/manageCenter/servicesManage/technology/websiteManage.jsx
  41. 27 2
      js/component/tools.js
  42. 1 1
      package.json
  43. 6 0
      webpack.config.js

+ 1 - 1
.gitignore

@@ -27,5 +27,5 @@ build/Release
 node_modules
 clean.sh
 build
-
+.project
 .vscode

+ 6 - 1
entry.js

@@ -17,7 +17,8 @@ module.exports = {
     //admin-servicesManage
     'admin/servicesManage/patent': './js/admin/servicesManage/patent.js',
     'admin/servicesManage/copyright': './js/admin/servicesManage/copyright.js',
-    'admin/servicesManage/highTech': './js/admin/servicesManage/highTech.js'
+    'admin/servicesManage/highTech': './js/admin/servicesManage/highTech.js',
+    'admin/servicesManage/technology': './js/admin/servicesManage/technology.js'
   },
   watch: {
     'user/index': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
@@ -77,6 +78,10 @@ module.exports = {
     'admin/servicesManage/highTech': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
       'webpack/hot/only-dev-server',
       './js/admin/servicesManage/highTech.js'
+    ],
+    'admin/servicesManage/technology': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
+      'webpack/hot/only-dev-server',
+      './js/admin/servicesManage/technology.js'
     ]
   }
 }

BIN
image/bg.jpg


+ 1 - 1
js/admin/servicesManage/copyright.js

@@ -4,7 +4,7 @@ import '../../../css/base.less';
 
 import TopTab from '../../component/manageCenter/topTab.jsx';
 import Footer from '../../component/manageCenter/bottom.jsx';
-import Content from '../../component/manageCenter/servicesManage/highTech/content.jsx';
+import Content from '../../component/manageCenter/servicesManage/copyright/content.jsx';
 
 ReactDOM.render(
     <div className="wrap clearfix">

+ 16 - 0
js/admin/servicesManage/technology.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/servicesManage/technology/content.jsx';
+
+ReactDOM.render(
+    <div className="wrap clearfix">
+        <TopTab active={'services'}/>
+        <Content />
+        <Footer />
+    </div>,
+    document.getElementById('root')
+)

+ 8 - 18
js/component/account/services/activity.jsx

@@ -54,7 +54,7 @@ const ActivityDesc = React.createClass({
                     loading: false,
                     visible: false
                 });
-                this.props.closeDesc(false, true);
+                this.props.closeDesc(false);
             } else {
                 message.warning(data.error[0].message);
                 this.setState({
@@ -188,7 +188,6 @@ const ActivityDesc = React.createClass({
                                 <InputNumber value={
                                     this.state.firstYearExpenditure + this.state.secondYearExpenditure + this.state.thirdYearExpenditure || 0
                                 } />
-                                <span>(自动计算)</span>
                             </div>
                             <div className="half-div">
                                 <span>其中(第一年):</span>
@@ -274,7 +273,7 @@ const ActivityDesc = React.createClass({
                             >
                                 <Button><Icon type="upload" /> 上传立项证明材料 </Button>
                             </Upload>
-                            <p>{this.state.proofUrl ? <a onClick={downloadFile.bind(null, this.state.proofUrl, this.state.proofDownloadFileName)}>{this.state.proofDownloadFileName}</a> : <span><Icon type="exclamation-circle" style={{ color: '#ffbf00', marginRight: '6px' }} />未上传!</span>}</p>
+                            <p>{this.state.proofUrl ? <a onClick={downloadFile.bind(null, this.state.proofUrl, this.state.proofDownloadFileName)}>{this.state.proofDownloadFileName}</a> : <span>未上传!</span>}</p>
                         </div>
                     </Modal>
                 </div>
@@ -316,18 +315,12 @@ const Activity = React.createClass({
         })).done((data1, data2) => {
             let data = data1[0];
             let intellectualList = data2[0];
-            if (!data.data || !data.data.list) {
-                if (data.error && data.error.length) {
-                    message.warning(data.error[0].message);
-                    this.state.ButtonDisabled = true;
-                };
+            if (data.error.length || !data.data || !data.data.list) {
+                message.warning(data.error[0].message);
                 return;
             };
-            if (!intellectualList.data || !intellectualList.data.list) {
-                if (intellectualList.error && intellectualList.error.length) {
-                    message.warning(intellectualList.error[0].message);
-                    this.state.ButtonDisabled = true;
-                };
+            if (intellectualList.error.length || !intellectualList.data || !intellectualList.data.list) {
+                message.warning(intellectualList.error[0].message);
                 return;
             };
             let theArr = [];
@@ -490,11 +483,9 @@ const Activity = React.createClass({
             this.loadData();
         }.bind(this));
     },
-    closeDesc(e, s) {
+    closeDesc(e) {
         this.state.showDesc = e;
-        if (s) {
-            this.loadData();
-        };
+        this.loadData();
     },
     search() {
         this.loadData();
@@ -529,7 +520,6 @@ const Activity = React.createClass({
                     <Button onClick={this.reset}>重置</Button>
                     <p>
                         <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
-                            disabled={this.state.ButtonDisabled}
                             onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
                         <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
                             disabled={!hasSelected}

+ 5 - 2
js/component/account/services/content.jsx

@@ -15,6 +15,7 @@ import HonorList from './honorList';
 import OrgTechCenter from './orgTechCenter';
 import AnnualReport from './annualReport';
 import Cognizance from './cognizance';
+import Copyright from './copyright/copyright'
 
 const Content = React.createClass({
     getInitialState() {
@@ -65,9 +66,11 @@ const Content = React.createClass({
                             case 'orgTechCenter':
                                 return <OrgTechCenter />;
                             case 'annualReport':
-                                return <AnnualReport />
+                                return <AnnualReport />;
                             case 'cognizance':
-                                return <Cognizance />
+                                return <Cognizance />;
+                            case 'copyright':
+                                return <Copyright />;
                         };
                     })()}
                 </div>

+ 239 - 0
js/component/account/services/copyright/comPatentAdd.jsx

@@ -0,0 +1,239 @@
+import React from 'react';
+import { Icon, Modal, Button, Form, message, Input, Spin, Checkbox, Select, Row, Col } from 'antd';
+import './comprehensive.less';
+import { companySearch } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+const PatentAddFrom = Form.create()(React.createClass({
+    getContactsList(theUid) {
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/getContacts",
+            data: {
+                uid: theUid
+            },
+            success: function (data) {
+                let theOption = [];
+                if (data.error.length || !data.data) {
+                    return;
+                };
+                for (let item in data.data) {
+                    let theData = data.data[item];
+                    theOption.push(
+                        <Select.Option value={item} key={theData}>{theData}</Select.Option>
+                    );
+                };
+                this.setState({
+                    contactsOption: theOption
+                });
+            }.bind(this),
+        });
+    },
+    getInitialState() {
+        return {
+            loading: false,
+            companyOption: [],
+            firstCheck: 0,
+            secondCheck: 0,
+            thirdCheck: 0,
+            accelerated: 0,
+            acceleratedDate: 0,
+            visible: "visible"
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        if (!this.state.companyName || this.state.companyName === "") {
+            message.warning('请先选择公司!');
+            return;
+        };
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/patent/manageApplyPatent",
+                    data: {
+                        'uid': this.state.companyName,
+                        'firstInventorIdNumber': values.firstInventorID,
+                        'firstInventorName': values.firstInventorName,
+                        'patentDes': values.intro,
+                        'secondInventorName': values.secondInventorName,
+                        'thirdInventorName': values.thirdInventorName,
+                        'firstInventorIsPublish': this.state.firstCheck,
+                        'secondInventorIsPublish': this.state.secondCheck,
+                        'thirdInventorIsPublish': this.state.thirdCheck,
+                        'patentProryStatementUrl': this.state.avatarUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this)).always(function () {
+                    this.props.spinState(false);
+                    this.props.okClick();
+                    this.props.form.resetFields();
+                }.bind(this));
+            }
+        });
+    },
+    acceleratedCheck(e) {
+        if (e.target.checked == true) {
+            this.state.accelerated = 1;
+            this.setState({ visible: "show" });
+        } else if (e.target.checked == false) {
+            this.state.accelerated = 0;
+            this.setState({ visible: "visible" });
+        }
+    },
+    acceleratedSelect(value) {
+        this.state.acceleratedDate = value;
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 3 },
+            wrapperCol: { span: 14 },
+        };
+        const _me = this;
+        return (
+            <Form horizontal onSubmit={this.handleSubmit} className="person-form">
+                <FormItem
+                    wrapperCol={{ span: 24 }}
+                >
+                    <Row>
+                        <Col span={12}>
+                            <span>选择公司:  </span>
+                            <Select
+                                placeholder="请选择公司"
+                                notFoundContent="未找到公司"
+                                style={{ width: 200 }}
+                                showSearch
+                                filterOption={companySearch}
+                                value={this.state.uid}
+                                onSelect={(e, n) => { this.setState({ uid: e }); this.getContactsList(e); }}>
+                                {this.props.companyOption}
+                            </Select>
+                        </Col>
+                        <Col span={12}>
+                            <span>选择联系人:  </span>
+                            <Select placeholder="请选择联系人" style={{ width: 200 }}
+                                notFoundContent="未获取到联系人列表"
+                                value={this.state.contacts}
+                                onSelect={(e, n) => { this.setState({ contacts: e }); }}>
+                                {this.state.contactsOption}
+                            </Select>
+                        </Col>
+                    </Row>
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 24 }}
+                    wrapperCol={{ span: 18 }}
+                    label="派单信息"
+                >
+                    {getFieldDecorator('intro', {
+                        initialValue: this.state.intro || null
+                    })(
+                        <Input type="textarea"
+                            placeholder="多行输入"
+                            rows={6} />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 0 }}
+                    wrapperCol={{ span: 18 }}
+                >
+                    <span>是否加急:</span>
+                    <Checkbox onChange={this.acceleratedCheck}></Checkbox>
+                    <Select className={this.state.visible} placeholder="请选择加急时间" style={{ width: 120 }} onChange={this.acceleratedSelect}>
+                        <Select.Option value="3">3天</Select.Option>
+                        <Select.Option value="5">5天</Select.Option>
+                        <Select.Option value="10">10天</Select.Option>
+                        <Select.Option value="20">20天</Select.Option>
+                    </Select>
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="选择咨询师"
+                >
+                    <Select placeholder="请选择咨询师" style={{ width: 200 }}
+                        value={this.state.consultant}
+                        onSelect={(e, n) => { this.setState({ consultant: e }); }}>
+                        {this.props.authorOption}
+                    </Select>
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="外包公司"
+                >
+                    {getFieldDecorator('intro', {
+                        initialValue: this.state.intro || null
+                    })(
+                        <Input placeholder="输入外包公司" />
+                        )}
+                </FormItem>
+                <FormItem>
+                    <Button className="set-submit" type="primary" htmlType="submit">确认</Button>
+                    <Button type="ghost" style={{ marginLeft: '20px' }} onClick={this.props.closeModal}>取消</Button>
+                </FormItem>
+            </Form >
+        );
+    },
+}));
+
+
+
+const PatentAdd = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeAdd(false);
+    },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
+    render() {
+        return (
+            <div className="patent-addNew">
+                <Button className="patent-addNew" type="primary" onClick={this.showModal}>申请新软著<Icon type="plus" /></Button>
+                <Spin spinning={this.state.loading} className='spin-box'>
+                    <Modal title="申请新软著"
+                        visible={this.state.visible}
+                        onCancel={this.handleCancel}
+                        width='800px'
+                        footer=''
+                    >
+                        <PatentAddFrom
+                            spinState={this.spinChange}
+                            okClick={() => { this.props.closeAdd(false, true) }}
+                            companyOption={this.props.companyOption}
+                            authorOption={this.props.authorOption} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+export default PatentAdd;

+ 362 - 0
js/component/account/services/copyright/comPatentChange.jsx

@@ -0,0 +1,362 @@
+import React from 'react';
+import { Icon, Modal, message, Spin, Input, Select, DatePicker, Button, Row, Col, Table, Form } from 'antd';
+import './comprehensive.less';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import { copyrightStateList } from '../../../dataDic.js';
+import { getCopyrightState, getTime } from '../../../tools.js';
+
+const CopyrightDescForm = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            stateOption: [],
+            contactsOption: [],
+            stateColumns: [{
+                title: '申请状态',
+                dataIndex: 'state',
+                key: 'state',
+                render: (text) => { return getCopyrightState(text) }
+            }, {
+                title: '处理时间',
+                dataIndex: 'recordTimeFormattedDate',
+                key: 'recordTimeFormattedDate',
+            }, {
+                title: '负责人',
+                dataIndex: 'principal',
+                key: 'principal',
+            }, {
+                title: '操作人',
+                dataIndex: 'operator',
+                key: 'operator',
+            }, {
+                title: '备注',
+                dataIndex: 'comment',
+                key: 'comment',
+            }]
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        copyrightStateList.map(function (item) {
+            _me.state.stateOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+    },
+    loadData(uid, cid, year) {
+        this.setState({
+            loading: true
+        });
+        $.when($.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/cognizanceLog",
+            data: {
+                pid: this.state.xid
+            }
+        }), $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/getContacts"
+        }), $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/getContacts",
+        })).done((data1, data2, data3) => {
+            //状态流转table
+            if (data1[0].error.length) {
+                message.warning(data1[0].error[0].message);
+                return;
+            };
+            let _me = this;
+            this.state.stateTable = [];
+            data1[0].data.map(function (item) {
+                this.state.stateTable.push({
+                    key: i,
+                    recordTimeFormattedDate: item.recordTimeFormattedDate,
+                    state: item.state,
+                    principal: item.principal,
+                    operator: item.operator,
+                    comment: item.comment
+                });
+            });
+            //获取联系人
+            if (data2[0].error.length) {
+                message.warning(data2[0].error[0].message);
+                return;
+            };
+            this.state.contactsOption = [];
+            for (let item in data2[0].data) {
+                let theData = data2[0].data[item];
+                contactsOption.push(
+                    <Select.Option value={item} key={theData}>{theData}</Select.Option>
+                );
+            };
+            //获取详细数据
+            if (data3[0].error.length || !data3[0].data) {
+                return;
+            };
+            let thisdata = data3[0].data;
+            this.setState({
+
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    componentWillReceiveProps(nextProps) {
+        if (!this.state.visible && nextProps.showDesc) {
+            this.loadData();
+        };
+        this.state.visible = nextProps.showDesc;
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (values.state || values.principal || values.recordTime || values.comment) {
+                if (!values.state && !values.principal && !values.recordTime) {
+                    message.warning("请填写完整的状态流转信息!");
+                    return;
+                };
+            };
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/api/admin/disposeCognizanceDetail",
+                    data: {
+                        id: this.props.data.cid,
+                        uid: this.props.data.uid,
+                        technicalField1: values.technicalField[0],
+                        technicalField2: values.technicalField[1],
+                        technicalField3: values.technicalField[2],
+                        basicResearchCost: values.basicResearchCost,
+                        contacts: values.contacts,
+                        accident: values.accident,
+                        certificateNumber: values.certificateNumber,
+                        recordTimeFormattedDate: values.recordTime ? values.recordTime.format("YYYY-MM-DD") : undefined,
+                        state: values.state,
+                        principal: values.principal,
+                        comment: values.comment,
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.clickOk();
+                        this.props.form.resetFields();
+                        this.state.targetKeys = [];
+                        this.state.selectedKeys = [];
+                        this.props.spinState(false);
+                    } else {
+                        message.warning(data.error[0].message);
+                        this.props.spinState(false);
+                    }
+                }.bind(this));
+            }
+        });
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        //const theData = this.state.data;
+        const theData = {};
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} id="CopyrightDesc-form">
+                <Row className="express-desc-row">
+                    <Col span={4}>公司名称</Col>
+                    <Col span={4}>{theData.nuitName}</Col>
+                    <Col span={4}>公司组织机构代码</Col>
+                    <Col span={4}>{theData.unitNumber}</Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={4}>公司地址</Col>
+                    <Col span={4}>{theData.address}</Col>
+                    <Col span={4}>联系人</Col>
+                    <Col span={4}>
+                        {getFieldDecorator('contacts', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.contacts
+                        })(
+                            <Select
+                                style={{ display: 'inline-block', width: '200px' }}
+                                placeholder='选择一个联系人'>
+                                {this.state.contactsOption}
+                            </Select>
+                            )}
+                    </Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={4}>编号</Col>
+                    <Col span={4}>xxxxxx</Col>
+                    <Col span={4}>外包公司</Col>
+                    <Col span={4}>
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <Input placeholder="请输入外包公司" />
+                            )}
+                    </Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={3}>派单详情</Col>
+                    <Col span={16}>
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <Input type="textarea"
+                                placeholder="多行输入"
+                                rows={6} />
+                            )}
+                    </Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={3}>备注</Col>
+                    <Col span={16}>
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <Input type="textarea"
+                                placeholder="多行输入"
+                                rows={6} />
+                            )}
+                    </Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={3}>软著名称</Col>
+                    <Col span={6}>
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <Input placeholder="请输入软著名称" />
+                            )}
+                    </Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={3}>下证时间(预计)</Col>
+                    <Col span={6}>
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <DatePicker />
+                            )}
+                    </Col>
+                </Row>
+                <p>状态流转记录: </p>
+                <Table style={{ margin: '10px 0' }}
+                    pagination={false}
+                    dataSource={this.state.stateTable}
+                    columns={this.state.stateColumns} />
+                <div className="clearfix">
+                    <FormItem className="third-item"
+                        {...formItemLayout}
+                        label="状态流转"
+                    >
+                        {getFieldDecorator('state')(
+                            <Select placeholder="选择一个状态">{this.state.stateOption}</Select>
+                        )}
+                    </FormItem>
+                    <FormItem className="third-item"
+                        labelCol={{ span: 6 }}
+                        wrapperCol={{ span: 12 }}
+                        label="处理时间"
+                    >
+                        {getFieldDecorator('recordTime')(
+                            <DatePicker />
+                        )}
+                    </FormItem>
+                    <FormItem className="third-item"
+                        {...formItemLayout}
+                        label="负责人"
+                    >
+                        {getFieldDecorator('principal')(
+                            <Select placeholder="选择负责人">{this.props.authorOption}</Select>
+                        )}
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 2 }}
+                    wrapperCol={{ span: 12 }}
+                    label="备注"
+                >
+                    {getFieldDecorator('comment')(
+                        <Input />
+                    )}
+                </FormItem>
+                <FormItem style={{ marginTop: '20px' }}>
+                    <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
+                    <Button type="ghost" style={{ marginLeft: '20px' }} onClick={this.props.closeModal}>取消</Button>
+                </FormItem>
+            </Form>
+        );
+    }
+}));
+
+const CopyrightDesc = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk() {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false, true);
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
+    render() {
+        return (
+            <div className="patent-addNew">
+                <Spin spinning={this.state.loading} className='spin-box'>
+                    <Modal title="软著详情" visible={this.state.visible}
+                        onOk={this.handleOk} onCancel={this.handleCancel}
+                        width='800px'
+                        footer=''
+                    >
+                        <CopyrightDescForm
+                            visible={this.state.visible}
+                            authorOption={this.props.authorOption}
+                            data={this.props.data}
+                            spinState={this.spinChange}
+                            closeModal={this.handleCancel}
+                            clickOk={this.handleOk} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    }
+});
+export default CopyrightDesc;

+ 42 - 0
js/component/account/services/copyright/comprehensive.less

@@ -0,0 +1,42 @@
+#CopyrightDesc-form {
+    font-size: 12px;
+    .express-desc-row {
+        line-height: 30px;
+        margin-bottom: 10px;
+    }
+}
+
+.ant-modal-body {
+    .half-item {
+        float: left;
+        width: 50%;
+        height: 36px;
+        margin-bottom: 10px;
+    }
+    .third-item {
+        float: left;
+        width: 33%;
+        height: 36px;
+        margin-bottom: 10px;
+        >p {
+            line-height: 30px;
+        }
+    }
+    .item-title {
+        line-height: 30px;
+        font-size: 14px;
+        color: #666;
+    }
+    .form-title {
+        font-size: 16px;
+        color: #333;
+    }
+}
+
+.show {
+    display: inline-block;
+}
+
+.visible {
+    display: none;
+}

+ 262 - 0
js/component/account/services/copyright/copyright.jsx

@@ -0,0 +1,262 @@
+import React from 'react';
+import { Icon, Button, Input, Select, Spin, Table, DatePicker, message } from 'antd';
+import { copyrightStateList } from '../../../dataDic.js';
+import { getTime, getCopyrightState } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import PatentAdd from './comPatentAdd.jsx';
+import PatentChange from './comPatentChange.jsx';
+
+import './copyright.less';
+
+const copyright = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/managePatentList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                locationProvince: this.state.province,
+                unitName: this.state.unitName,
+            },
+            success: function (data) {
+                if (data.error.length || !data.data || !data.data.list) {
+                    message.warning(data.error[0].message);
+                    return;
+                }
+
+                this.state.pagination.defaultCurrent = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                this.setState({
+                    dataSource: data.data.list,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getAuthorList() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/getContacts",
+            success: function (data) {
+                if (data.error.length || !data.data) {
+                    return;
+                };
+                this.state.contactsOption = [];
+                for (let item in data2[0].data) {
+                    let theData = data2[0].data[item];
+                    contactsOption.push(
+                        <Select.Option value={item} key={theData}>{theData}</Select.Option>
+                    );
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            visible: false,
+            stateOption: [],
+            data: [],
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: false,
+            showAdd: false,
+            showDesc: false,
+            pagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.loadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return '共' + total + '条数据';
+                }
+            },
+            columns: [
+                {
+                    title: '编号',
+                    dataIndex: 'number',
+                    key: 'number',
+                }, {
+                    title: '软著名称',
+                    dataIndex: 'copyrightName',
+                    key: 'copyrightName',
+                }, {
+                    title: '加急',
+                    dataIndex: 'urgent',
+                    key: 'urgent',
+                }, {
+                    title: '咨询师',
+                    dataIndex: 'consultant',
+                    key: 'consultant',
+                }, {
+                    title: '派单日',
+                    dataIndex: 'createTime',
+                    key: 'createTime',
+                }, {
+                    title: '受理日',
+                    dataIndex: 'acceptanceTime',
+                    key: 'acceptanceTime',
+                }, {
+                    title: '(预计)下证时间',
+                    dataIndex: 'endTime',
+                    key: 'endTime',
+                }, {
+                    title: '派单信息',
+                    dataIndex: 'createInfo',
+                    key: 'createInfo',
+                }, {
+                    title: '备注',
+                    dataIndex: 'explain',
+                    key: 'explain',
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        copyrightStateList.map(function (item) {
+            _me.state.stateOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        this.loadData();
+        this.getAuthorList();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true
+        });
+    },
+    delectRow() {
+        let deletedIds = [];
+        for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
+            let rowItem = this.state.selectedRows[idx];
+            if (rowItem.cid) {
+                deletedIds.push(rowItem.cid)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/deleteCognizance",
+            data: {
+                ids: deletedIds
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.setState({
+                    loading: false,
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.loadData();
+        }.bind(this));
+    },
+    closeDesc(e, s) {
+        this.state.showDesc = e;
+        if (s) {
+            this.loadData();
+        };
+    },
+    addClick() {
+        this.setState({
+            showAdd: true
+        });
+    },
+    closeAdd(e, s) {
+        this.state.showAdd = e;
+        if (s) {
+            this.loadData();
+        };
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.searchNumber = undefined;
+        this.state.searchName = undefined;
+        this.state.searchState = undefined;
+        this.loadData();
+    },
+    render() {
+        const rowSelection = {
+            selectedRowKeys: this.state.selectedRowKeys,
+            onChange: (selectedRowKeys, selectedRows) => {
+                this.setState({
+                    selectedRows: selectedRows,
+                    selectedRowKeys: selectedRowKeys
+                });
+            }
+        };
+        const hasSelected = this.state.selectedRowKeys.length > 0;
+        return (
+            <div className="foster-box">
+                <div className="foster-content">
+                    <div className="content-title">
+                        <span>软著申请管理</span>
+                        <PatentAdd
+                            onClick={this.addClick}
+                            closeAdd={this.closeAdd} />
+                    </div>
+                    <div className="foster-query">
+                        <Input placeholder="软著编号" value={this.state.searchNumber} onChange={(e) => { this.setState({ searchNumber: e.target.value }); }} />
+                        <Input placeholder="软著名称" value={this.state.searchName} onChange={(e) => { this.setState({ searchName: e.target.value }); }} />
+                        <Select placeholder="软著状态" value={this.state.searchState} style={{ width: 200 }} onChange={(e) => { this.setState({ searchState: e }); }}>{this.state.stateOption}</Select>
+                        <Button type="primary" onClick={this.search}>搜索</Button>
+                        <Button onClick={this.reset}>重置</Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff", display: 'none' }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </div>
+                    <div className="foster-table">
+                        <Spin spinning={this.state.loading}>
+                            <Table columns={this.state.columns}
+                                //rowSelection={rowSelection}
+                                dataSource={this.state.dataSource}
+                                pagination={this.state.pagination}
+                                onRowClick={this.tableRowClick} />
+                        </Spin>
+                    </div>
+                    <PatentChange
+                        data={this.state.RowData}
+                        showDesc={this.state.showDesc}
+                        closeDesc={this.closeDesc} />
+                </div >
+            </div>
+        );
+    }
+});
+
+export default copyright;

+ 287 - 0
js/component/account/services/copyright/copyright.less

@@ -0,0 +1,287 @@
+.foster-content {
+    padding: 20px;
+    background: #fff;
+    .content-title {
+        height: 32px;
+        margin-bottom: 10px;
+        >span {
+            color: #333;
+            font-size: 16px;
+            margin-bottom: 10px;
+        }
+    }
+    .foster-query {
+        margin-bottom: 10px;
+        >input {
+            width: 180px;
+            margin-right: 20px;
+        }
+        >div {
+            margin-right: 20px;
+        }
+        button {
+            margin-left: 20px;
+        }
+        >span {
+            margin-left: 20px;
+            >span {
+                margin-left: 10px;
+            }
+        }
+    }
+}
+.patent-addNew {
+    float: right;
+    margin-left: 20px;
+    button {
+        background: #ea0862;
+        color: #fff;
+        border: none;
+        border-radius: 4px;
+        padding: 6px 10px;
+        margin-left: 20px;
+    }
+    button:hover{
+        background: #ea0862;
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+.patent-content {
+    padding: 20px;
+    background: #fff;
+    .content-title {
+        height: 32px;
+        margin-bottom: 10px;
+        >span {
+            color: #333;
+            font-size: 16px;
+            margin-bottom: 10px;
+        }
+        .patent-addNew {
+            float: right;
+            margin-left: 20px;
+            button {
+                background: #ea0862;
+                color: #fff;
+                border: none;
+                border-radius: 4px;
+                padding: 6px 10px;
+            }
+        }
+    }
+    .patent-alert {
+        font-size: 14px;
+        padding: 8px 48px;
+        >i {
+            font-size: 19px;
+            top: 8px;
+        }
+    }
+    .patent-query {
+        margin-bottom: 10px;
+        >input {
+            width: 180px;
+            margin-right: 20px;
+        }
+        >div {
+            margin-right: 20px;
+        }
+        button {
+            margin-left: 20px;
+        }
+        >span {
+            margin-left: 20px;
+            >span {
+                margin-left: 10px;
+            }
+        }
+        .search-more {
+            >p {
+                margin-top: 10px;
+                >span {
+                    margin-right: 10px;
+                }
+            }
+            >div {
+                margin-top: 10px;
+                >div {
+                    margin-right: 20px;
+                }
+            }
+        }
+    }
+}
+
+.ant-modal-content {
+    .ant-modal-header {
+        padding: 10px 16px;
+        background: #2d2d2d;
+        .ant-modal-title {
+            color: #fff;
+            font-size: 16px;
+            font-weight: 400;
+        }
+    }
+    .ant-modal-body {
+        padding: 16px 26px;
+        .ant-form-item-label {
+            text-align: left;
+        }
+        .ant-form-item-control {
+            .mini-input {
+                width: 50%;
+            }
+            .ant-checkbox-wrapper {
+                margin-left: 60px;
+                span {
+                    vertical-align: middle;
+                }
+            }
+        }
+        .ant-form-item {
+            margin-bottom: 12px;
+        }
+    }
+    .avatar-uploader,
+    .avatar-uploader-trigger,
+    .avatar {
+        width: 150px;
+        height: 150px;
+    }
+    .avatar-uploader {
+        display: block;
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+    }
+    .avatar-uploader-trigger {
+        display: table-cell;
+        vertical-align: middle;
+        font-size: 28px;
+        color: #999;
+    }
+}
+
+.patent-desc-content {
+    .ant-modal-body {
+        .express-desc-row {
+            margin-bottom: 16px;
+            >div {
+                line-height: 28px;
+            }
+            .ant-col-4 {
+                margin-right: 10px;
+            }
+            .ant-col-5 {
+                margin-right: 10px;
+            }
+        }
+        .patent-process-list {
+            span {
+                width: 180px;
+                display: inline-block;
+            }
+        }
+        >div {
+            color: #333;
+            margin-bottom: 10px;
+            >p {
+                margin-bottom: 10px;
+            }
+            >textarea {
+                margin-top: 10px;
+            }
+            .widthHalf {
+                display: inline-block;
+                width: 50%;
+                input {
+                    width: 200px;
+                }
+                .two2four {
+                    letter-spacing: 2em;
+                    margin-right: -2em;
+                }
+                .four2eight {
+                    letter-spacing: 4/3em;
+                    margin-right: -4/3em;
+                }
+                .seven2eight {
+                    letter-spacing: 3/11em;
+                    margin-right: -3/11em;
+                }
+                .three2eight {
+                    letter-spacing: 2.5em;
+                    margin-right: -2.5em;
+                }
+            }
+            .widthThird {
+                display: inline-block;
+                width: 33%;
+            }
+            span {
+                color: #666;
+            }
+            .avatar-uploader {
+                float: left;
+                margin-right: 40px;
+            }
+        }
+        .avatar-text {
+            span {
+                margin-right: 40px;
+                display: inline-block;
+                width: 150px;
+                text-align: center;
+            }
+        }
+    }
+}
+
+.applyFee-desc-content {
+    .ant-modal-body {
+        >p {
+            margin-bottom: 10px;
+        }
+        .applyFee-title {
+            span {
+                margin-right: 20px;
+                font-size: 16px;
+            }
+        }
+        .applyFee-fee {
+            margin-bottom: 10px;
+            >span {
+                margin-right: 10px;
+            }
+            >input {
+                width: 150px;
+            }
+        }
+        div.applyFee-fee {
+            span {
+                line-height: 22px;
+                vertical-align: middle;
+            }
+        }
+    }
+}

+ 2 - 2
js/component/account/services/leftTab.jsx

@@ -11,7 +11,7 @@ const LeftTab = React.createClass({
             current: 'patent',
             subKey: 'sub1',
             keyList: [
-                { key: 'sub1', value: ['patent', 'software', 'intellectual'] },
+                { key: 'sub1', value: ['patent', 'copyright', 'intellectual'] },
                 { key: 'sub2', value: ['standard', 'activity', 'activityCostList', 'orgTechCenter', 'techProduct', 'ratepay', 'finance', 'achievement', 'honorList','annualReport','cognizance'] },
                 { key: 'sub3', value: [] }
             ]
@@ -50,7 +50,7 @@ const LeftTab = React.createClass({
                     <Menu.Item key="patent">
                         专利申请
                     </Menu.Item>
-                    <Menu.Item key="software">
+                    <Menu.Item key="copyright">
                         软著申请
                     </Menu.Item>
                     <Menu.Item key="intellectual">

+ 6 - 2
js/component/account/set/hrSituation.jsx

@@ -586,8 +586,11 @@ const HrSituation = React.createClass({
                 pageSize: this.state.pagination.pageSize
             }
         }).done((data) => {
-            if (data.error.length || !data.data || !data.data.list) {
-                message.warning(data.error[0].message);
+            if (!data.data) {
+                if (data.error && data.error.length) {
+                    message.warning(data.error[0].message);
+                    this.state.ButtonDisabled = true;
+                }
                 return;
             };
             for (let i = 0; i < data.data.list.length; i++) {
@@ -769,6 +772,7 @@ const HrSituation = React.createClass({
                 <div className="user-search">
                     <p>
                         <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            disabled={this.state.ButtonDisabled}
                             onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
                         <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
                             disabled={!hasSelected}

+ 48 - 0
js/component/dataDic.js

@@ -4206,5 +4206,53 @@ module.exports = {
             value: "8",
             key: "撤销"
         }
+    ],
+    technologyStateList:[
+        {
+            value: "0",
+            key: "申请"
+        },{
+            value: "1",
+            key: "派单"
+        },{
+            value: "2",
+            key: "受理"
+        },{
+            value: "3",
+            key: "审批通过"
+        },{
+            value: "4",
+            key: "审批不通过"
+        },{
+            value: "5",
+            key: "项目批复"
+        }
+    ],
+    copyrightStateList:[
+        {
+            value: "0",
+            key: "创建"
+        },{
+            value: "1",
+            key: "派单"
+        },{
+            value: "2",
+            key: "材料提交"
+        },{
+            value: "3",
+            key: "受理"
+        },{
+            value: "4",
+            key: "补正"
+        },{
+            value: "5",
+            key: "驳回"
+        },{
+            value: "6",
+            key: "已下证"
+        },{
+            value: "5",
+            key: "撤销"
+        }
     ]
 };

+ 16 - 16
js/component/groupCertify/certify.less

@@ -10,10 +10,10 @@
                     margin: 0 auto;
                     padding: 10px 0;
                     .logo {
-                        width: 12%;
+                        width: 6%;
                         padding-top: 60px;
                         float: left;
-                        margin-left: 40px;
+                        margin-left: 100px;
                         position: relative;
                         overflow: hidden;
                         img {
@@ -21,7 +21,7 @@
                             top: 0;
                             left: 0;
                             height: 60px;
-                            width: 120px;
+                            width: 60px;
                         }
                     }
                     .certify-text {
@@ -159,7 +159,7 @@
                             }
                         }
                         .ant-form-extra {
-                            width:560px;
+                            width: 560px;
                         }
                         .idCard-text {
                             display: inline-block;
@@ -168,19 +168,19 @@
                             text-align: center;
                         }
                         .idcard-img {
-                                >.idcard-imgbox {
+                            >.idcard-imgbox {
+                                height: 120px;
+                                padding-top: 120px;
+                                position: relative;
+                                img {
                                     height: 120px;
-                                    padding-top: 120px;
-                                    position: relative;
-                                    img {
-                                        height: 120px;
-                                        position: absolute;
-                                        top: 0;
-                                        left: 0;
-                                        border: 1px solid #c9c9c9;
-                                        border-radius: 6px;
-                                    }
+                                    position: absolute;
+                                    top: 0;
+                                    left: 0;
+                                    border: 1px solid #c9c9c9;
+                                    border-radius: 6px;
                                 }
+                            }
                         }
                         .getVcode {
                             height: 32px;
@@ -248,7 +248,7 @@
                                 line-height: 24px;
                             }
                             button {
-                                margin-top:10px; 
+                                margin-top: 10px;
                             }
                         }
                     }

+ 3 - 3
js/component/groupCertify/personal.jsx

@@ -137,7 +137,7 @@ const Content = Form.create()(React.createClass({
                     data: {
                         contacts: values.contacts,
                         contactMobile: values.contactMobile,
-                        aftUsername: values.aft,
+                        aftUsername: values.aftUsername,
                         unitName: values.unitName,
                         registeredCapital: values.registeredCapital,
                         licenceNumber: values.licenceNumber,
@@ -152,7 +152,7 @@ const Content = Form.create()(React.createClass({
                         legalPersonIdCard: values.legalPersonIdCard,
                         verificationCode: values.captcha,
                         listed: values.listed,
-                        listedDateFormattedDate: values.listedDate.format("YYYY-MM-DD"),
+                        listedDateFormattedDate: values.listedDate ? values.listedDate.format("YYYY-MM-DD") : null,
                         listedType: values.listedType,
                         stockCode: values.stockCode,
                         auditStatus: this.state.auditStatus,
@@ -196,7 +196,7 @@ const Content = Form.create()(React.createClass({
         }
     },
     checkNumber(rule, value, callback) {
-        if (!/(^\d{15}$)/.test(value)) {
+        if (!/(^[a-zA-Z0-9]{0,18}$)/.test(value)) {
             callback('请输入正确的营业执照注册号!');
         } else {
             callback();

+ 2 - 2
js/component/groupCertify/result.jsx

@@ -62,7 +62,7 @@ const Content = Form.create()(React.createClass({
             <Spin spinning={this.state.loading} className="certify-spin">
                 {(() => {
                     switch (this.state.auditStatus) {
-                        case 5:
+                        case "5":
                             return <div className="certify-result-box">
                                 <p className="certify-title"
                                     style={{ 'textAlign': 'center' }}
@@ -73,7 +73,7 @@ const Content = Form.create()(React.createClass({
                                     <p>建议您下载数字证书,保障您的支付安全。</p>
                                 </div>
                             </div>;
-                        case 4:
+                        case "4":
                             return <div className="certify-result-box">
                                 <p className="certify-title"
                                     style={{ 'textAlign': 'center' }}

+ 3 - 2
js/component/groupCertify/top.jsx

@@ -1,5 +1,6 @@
 import React from 'react';
 import './certify.less';
+import logo from '../../../image/logo.jpg';
 
 const LoginTop = React.createClass({
     render() {
@@ -7,13 +8,13 @@ const LoginTop = React.createClass({
             <div className="certify-header">
                 <div className="certify-logo clearfix">
                     <div className="logo">
-                        <img src="" alt="" />
+                        <img src={logo} alt="" />
                     </div>
                     <div className="certify-text">
                         <span className="text">实名认证</span>
                         <span className="alink">
                             <a href="./index.html">返回首页</a>
-                            <a href="./account/index.html">尊敬的{ userData.nickname || userData.number || this.state.username}</a>
+                            <a href="./account/index.html">尊敬的{userData.nickname || userData.number || this.state.username}</a>
                             <a href="./login.html">退出</a>
                             <a href="./index.html">交易管理中心</a>
                             <a href="./index.html">消息</a>

+ 239 - 0
js/component/manageCenter/servicesManage/copyright/comPatentAdd.jsx

@@ -0,0 +1,239 @@
+import React from 'react';
+import { Icon, Modal, Button, Form, message, Input, Spin, Checkbox, Select, Row, Col } from 'antd';
+import './comprehensive.less';
+import { companySearch } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+const PatentAddFrom = Form.create()(React.createClass({
+    getContactsList(theUid) {
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/getContacts",
+            data: {
+                uid: theUid
+            },
+            success: function (data) {
+                let theOption = [];
+                if (data.error.length || !data.data) {
+                    return;
+                };
+                for (let item in data.data) {
+                    let theData = data.data[item];
+                    theOption.push(
+                        <Select.Option value={item} key={theData}>{theData}</Select.Option>
+                    );
+                };
+                this.setState({
+                    contactsOption: theOption
+                });
+            }.bind(this),
+        });
+    },
+    getInitialState() {
+        return {
+            loading: false,
+            companyOption: [],
+            firstCheck: 0,
+            secondCheck: 0,
+            thirdCheck: 0,
+            accelerated: 0,
+            acceleratedDate: 0,
+            visible: "visible"
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        if (!this.state.companyName || this.state.companyName === "") {
+            message.warning('请先选择公司!');
+            return;
+        };
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/patent/manageApplyPatent",
+                    data: {
+                        'uid': this.state.companyName,
+                        'firstInventorIdNumber': values.firstInventorID,
+                        'firstInventorName': values.firstInventorName,
+                        'patentDes': values.intro,
+                        'secondInventorName': values.secondInventorName,
+                        'thirdInventorName': values.thirdInventorName,
+                        'firstInventorIsPublish': this.state.firstCheck,
+                        'secondInventorIsPublish': this.state.secondCheck,
+                        'thirdInventorIsPublish': this.state.thirdCheck,
+                        'patentProryStatementUrl': this.state.avatarUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this)).always(function () {
+                    this.props.spinState(false);
+                    this.props.okClick();
+                    this.props.form.resetFields();
+                }.bind(this));
+            }
+        });
+    },
+    acceleratedCheck(e) {
+        if (e.target.checked == true) {
+            this.state.accelerated = 1;
+            this.setState({ visible: "show" });
+        } else if (e.target.checked == false) {
+            this.state.accelerated = 0;
+            this.setState({ visible: "visible" });
+        }
+    },
+    acceleratedSelect(value) {
+        this.state.acceleratedDate = value;
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 3 },
+            wrapperCol: { span: 14 },
+        };
+        const _me = this;
+        return (
+            <Form horizontal onSubmit={this.handleSubmit} className="person-form">
+                <FormItem
+                    wrapperCol={{ span: 24 }}
+                >
+                    <Row>
+                        <Col span={12}>
+                            <span>选择公司:  </span>
+                            <Select
+                                placeholder="请选择公司"
+                                notFoundContent="未找到公司"
+                                style={{ width: 200 }}
+                                showSearch
+                                filterOption={companySearch}
+                                value={this.state.uid}
+                                onSelect={(e, n) => { this.setState({ uid: e }); this.getContactsList(e); }}>
+                                {this.props.companyOption}
+                            </Select>
+                        </Col>
+                        <Col span={12}>
+                            <span>选择联系人:  </span>
+                            <Select placeholder="请选择联系人" style={{ width: 200 }}
+                                notFoundContent="未获取到联系人列表"
+                                value={this.state.contacts}
+                                onSelect={(e, n) => { this.setState({ contacts: e }); }}>
+                                {this.state.contactsOption}
+                            </Select>
+                        </Col>
+                    </Row>
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 24 }}
+                    wrapperCol={{ span: 18 }}
+                    label="派单信息"
+                >
+                    {getFieldDecorator('intro', {
+                        initialValue: this.state.intro || null
+                    })(
+                        <Input type="textarea"
+                            placeholder="多行输入"
+                            rows={6} />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 0 }}
+                    wrapperCol={{ span: 18 }}
+                >
+                    <span>是否加急:</span>
+                    <Checkbox onChange={this.acceleratedCheck}></Checkbox>
+                    <Select className={this.state.visible} placeholder="请选择加急时间" style={{ width: 120 }} onChange={this.acceleratedSelect}>
+                        <Select.Option value="3">3天</Select.Option>
+                        <Select.Option value="5">5天</Select.Option>
+                        <Select.Option value="10">10天</Select.Option>
+                        <Select.Option value="20">20天</Select.Option>
+                    </Select>
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="选择咨询师"
+                >
+                    <Select placeholder="请选择咨询师" style={{ width: 200 }}
+                        value={this.state.consultant}
+                        onSelect={(e, n) => { this.setState({ consultant: e }); }}>
+                        {this.props.authorOption}
+                    </Select>
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="外包公司"
+                >
+                    {getFieldDecorator('intro', {
+                        initialValue: this.state.intro || null
+                    })(
+                        <Input placeholder="输入外包公司" />
+                        )}
+                </FormItem>
+                <FormItem>
+                    <Button className="set-submit" type="primary" htmlType="submit">确认</Button>
+                    <Button type="ghost" style={{ marginLeft: '20px' }} onClick={this.props.closeModal}>取消</Button>
+                </FormItem>
+            </Form >
+        );
+    },
+}));
+
+
+
+const PatentAdd = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeAdd(false);
+    },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
+    render() {
+        return (
+            <div className="patent-addNew">
+                <Button className="patent-addNew" type="primary" onClick={this.showModal}>申请新软著<Icon type="plus" /></Button>
+                <Spin spinning={this.state.loading} className='spin-box'>
+                    <Modal title="申请新软著"
+                        visible={this.state.visible}
+                        onCancel={this.handleCancel}
+                        width='800px'
+                        footer=''
+                    >
+                        <PatentAddFrom
+                            spinState={this.spinChange}
+                            okClick={() => { this.props.closeAdd(false, true) }}
+                            companyOption={this.props.companyOption}
+                            authorOption={this.props.authorOption} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+export default PatentAdd;

+ 362 - 0
js/component/manageCenter/servicesManage/copyright/comPatentChange.jsx

@@ -0,0 +1,362 @@
+import React from 'react';
+import { Icon, Modal, message, Spin, Input, Select, DatePicker, Button, Row, Col, Table, Form } from 'antd';
+import './comprehensive.less';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import { copyrightStateList } from '../../../dataDic.js';
+import { getCopyrightState, getTime } from '../../../tools.js';
+
+const CopyrightDescForm = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            stateOption: [],
+            contactsOption: [],
+            stateColumns: [{
+                title: '申请状态',
+                dataIndex: 'state',
+                key: 'state',
+                render: (text) => { return getCopyrightState(text) }
+            }, {
+                title: '处理时间',
+                dataIndex: 'recordTimeFormattedDate',
+                key: 'recordTimeFormattedDate',
+            }, {
+                title: '负责人',
+                dataIndex: 'principal',
+                key: 'principal',
+            }, {
+                title: '操作人',
+                dataIndex: 'operator',
+                key: 'operator',
+            }, {
+                title: '备注',
+                dataIndex: 'comment',
+                key: 'comment',
+            }]
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        copyrightStateList.map(function (item) {
+            _me.state.stateOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+    },
+    loadData(uid, cid, year) {
+        this.setState({
+            loading: true
+        });
+        $.when($.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/cognizanceLog",
+            data: {
+                pid: this.state.xid
+            }
+        }), $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/getContacts"
+        }), $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/getContacts",
+        })).done((data1, data2, data3) => {
+            //状态流转table
+            if (data1[0].error.length) {
+                message.warning(data1[0].error[0].message);
+                return;
+            };
+            let _me = this;
+            this.state.stateTable = [];
+            data1[0].data.map(function (item) {
+                this.state.stateTable.push({
+                    key: i,
+                    recordTimeFormattedDate: item.recordTimeFormattedDate,
+                    state: item.state,
+                    principal: item.principal,
+                    operator: item.operator,
+                    comment: item.comment
+                });
+            });
+            //获取联系人
+            if (data2[0].error.length) {
+                message.warning(data2[0].error[0].message);
+                return;
+            };
+            this.state.contactsOption = [];
+            for (let item in data2[0].data) {
+                let theData = data2[0].data[item];
+                contactsOption.push(
+                    <Select.Option value={item} key={theData}>{theData}</Select.Option>
+                );
+            };
+            //获取详细数据
+            if (data3[0].error.length || !data3[0].data) {
+                return;
+            };
+            let thisdata = data3[0].data;
+            this.setState({
+
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    componentWillReceiveProps(nextProps) {
+        if (!this.state.visible && nextProps.showDesc) {
+            this.loadData();
+        };
+        this.state.visible = nextProps.showDesc;
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (values.state || values.principal || values.recordTime || values.comment) {
+                if (!values.state && !values.principal && !values.recordTime) {
+                    message.warning("请填写完整的状态流转信息!");
+                    return;
+                };
+            };
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/api/admin/disposeCognizanceDetail",
+                    data: {
+                        id: this.props.data.cid,
+                        uid: this.props.data.uid,
+                        technicalField1: values.technicalField[0],
+                        technicalField2: values.technicalField[1],
+                        technicalField3: values.technicalField[2],
+                        basicResearchCost: values.basicResearchCost,
+                        contacts: values.contacts,
+                        accident: values.accident,
+                        certificateNumber: values.certificateNumber,
+                        recordTimeFormattedDate: values.recordTime ? values.recordTime.format("YYYY-MM-DD") : undefined,
+                        state: values.state,
+                        principal: values.principal,
+                        comment: values.comment,
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.clickOk();
+                        this.props.form.resetFields();
+                        this.state.targetKeys = [];
+                        this.state.selectedKeys = [];
+                        this.props.spinState(false);
+                    } else {
+                        message.warning(data.error[0].message);
+                        this.props.spinState(false);
+                    }
+                }.bind(this));
+            }
+        });
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        //const theData = this.state.data;
+        const theData = {};
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} id="CopyrightDesc-form">
+                <Row className="express-desc-row">
+                    <Col span={4}>公司名称</Col>
+                    <Col span={4}>{theData.nuitName}</Col>
+                    <Col span={4}>公司组织机构代码</Col>
+                    <Col span={4}>{theData.unitNumber}</Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={4}>公司地址</Col>
+                    <Col span={4}>{theData.address}</Col>
+                    <Col span={4}>联系人</Col>
+                    <Col span={4}>
+                        {getFieldDecorator('contacts', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.contacts
+                        })(
+                            <Select
+                                style={{ display: 'inline-block', width: '200px' }}
+                                placeholder='选择一个联系人'>
+                                {this.state.contactsOption}
+                            </Select>
+                            )}
+                    </Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={4}>编号</Col>
+                    <Col span={4}>xxxxxx</Col>
+                    <Col span={4}>外包公司</Col>
+                    <Col span={4}>
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <Input placeholder="请输入外包公司" />
+                            )}
+                    </Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={3}>派单详情</Col>
+                    <Col span={16}>
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <Input type="textarea"
+                                placeholder="多行输入"
+                                rows={6} />
+                            )}
+                    </Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={3}>备注</Col>
+                    <Col span={16}>
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <Input type="textarea"
+                                placeholder="多行输入"
+                                rows={6} />
+                            )}
+                    </Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={3}>软著名称</Col>
+                    <Col span={6}>
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <Input placeholder="请输入软著名称" />
+                            )}
+                    </Col>
+                </Row>
+                <Row className="express-desc-row">
+                    <Col span={3}>下证时间(预计)</Col>
+                    <Col span={6}>
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <DatePicker />
+                            )}
+                    </Col>
+                </Row>
+                <p>状态流转记录: </p>
+                <Table style={{ margin: '10px 0' }}
+                    pagination={false}
+                    dataSource={this.state.stateTable}
+                    columns={this.state.stateColumns} />
+                <div className="clearfix">
+                    <FormItem className="third-item"
+                        {...formItemLayout}
+                        label="状态流转"
+                    >
+                        {getFieldDecorator('state')(
+                            <Select placeholder="选择一个状态">{this.state.stateOption}</Select>
+                        )}
+                    </FormItem>
+                    <FormItem className="third-item"
+                        labelCol={{ span: 6 }}
+                        wrapperCol={{ span: 12 }}
+                        label="处理时间"
+                    >
+                        {getFieldDecorator('recordTime')(
+                            <DatePicker />
+                        )}
+                    </FormItem>
+                    <FormItem className="third-item"
+                        {...formItemLayout}
+                        label="负责人"
+                    >
+                        {getFieldDecorator('principal')(
+                            <Select placeholder="选择负责人">{this.props.authorOption}</Select>
+                        )}
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 2 }}
+                    wrapperCol={{ span: 12 }}
+                    label="备注"
+                >
+                    {getFieldDecorator('comment')(
+                        <Input />
+                    )}
+                </FormItem>
+                <FormItem style={{ marginTop: '20px' }}>
+                    <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
+                    <Button type="ghost" style={{ marginLeft: '20px' }} onClick={this.props.closeModal}>取消</Button>
+                </FormItem>
+            </Form>
+        );
+    }
+}));
+
+const CopyrightDesc = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk() {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false, true);
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
+    render() {
+        return (
+            <div className="patent-addNew">
+                <Spin spinning={this.state.loading} className='spin-box'>
+                    <Modal title="软著详情" visible={this.state.visible}
+                        onOk={this.handleOk} onCancel={this.handleCancel}
+                        width='800px'
+                        footer=''
+                    >
+                        <CopyrightDescForm
+                            visible={this.state.visible}
+                            authorOption={this.props.authorOption}
+                            data={this.props.data}
+                            spinState={this.spinChange}
+                            closeModal={this.handleCancel}
+                            clickOk={this.handleOk} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    }
+});
+export default CopyrightDesc;

+ 42 - 0
js/component/manageCenter/servicesManage/copyright/comprehensive.less

@@ -0,0 +1,42 @@
+#CopyrightDesc-form {
+    font-size: 12px;
+    .express-desc-row {
+        line-height: 30px;
+        margin-bottom: 10px;
+    }
+}
+
+.ant-modal-body {
+    .half-item {
+        float: left;
+        width: 50%;
+        height: 36px;
+        margin-bottom: 10px;
+    }
+    .third-item {
+        float: left;
+        width: 33%;
+        height: 36px;
+        margin-bottom: 10px;
+        >p {
+            line-height: 30px;
+        }
+    }
+    .item-title {
+        line-height: 30px;
+        font-size: 14px;
+        color: #666;
+    }
+    .form-title {
+        font-size: 16px;
+        color: #333;
+    }
+}
+
+.show {
+    display: inline-block;
+}
+
+.visible {
+    display: none;
+}

+ 37 - 0
js/component/manageCenter/servicesManage/copyright/content.jsx

@@ -0,0 +1,37 @@
+import React from 'react';
+import '../../content.less';
+import LeftTab from '../leftTab.jsx';
+
+import Copyright from './copyright.jsx';
+
+const Content = React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            leftKey: 'comprehensive',
+        };
+    },
+    handlekey(key) {
+        this.setState({
+            leftKey: key,
+        });
+        window.location.hash = key;
+    },
+    componentWillMount(){
+        if ( window.location.hash ) {
+            this.handlekey(window.location.hash.substr(1));
+        };
+    },
+    render() {
+        return (
+            <div className="manage-content">
+                <LeftTab handlekey={this.handlekey} />
+                <div className="content-right">
+                    <Copyright />
+                </div>
+            </div>
+        )
+    }
+});
+
+export default Content;

+ 324 - 0
js/component/manageCenter/servicesManage/copyright/copyright.jsx

@@ -0,0 +1,324 @@
+import React from 'react';
+import { Icon, Button, Input, Select, Spin, Table, DatePicker, message, Cascader } from 'antd';
+import { provinceArr } from '../../../dataDic.js';
+import { getTime, getPatentState, companySearch } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import PatentAdd from './comPatentAdd.jsx';
+import PatentChange from './comPatentChange.jsx';
+
+//import PatentDesc from '../patent/comPatentDesc.jsx';
+
+import './copyright.less';
+
+const copyright = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/managePatentList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                locationProvince: this.state.province,
+                unitName: this.state.unitName,
+            },
+            success: function (data) {
+                if (data.error.length || !data.data || !data.data.list) {
+                    message.warning(data.error[0].message);
+                    return;
+                }
+
+                this.state.pagination.defaultCurrent = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                this.setState({
+                    dataSource: data.data.list,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getAuthorList() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/getAdmin",
+            success: function (data) {
+                if (data.error.length || !data.data) {
+                    return;
+                };
+                let _me = this;
+                for (var item in data.data) {
+                    _me.state.authorOption.push(
+                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                    )
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getCompanyList() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/getUnitNames",
+            success: function (data) {
+                if (data.error.length || !data.data) {
+                    return;
+                };
+                let _me = this;
+                for (var item in data.data) {
+                    _me.state.companyOption.push(
+                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                    )
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            visible: false,
+            provinceOption: [],
+            companyOption: [],
+            authorOption: [],
+            data: [],
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: false,
+            showAdd: false,
+            showDesc: false,
+            pagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.loadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return '共' + total + '条数据';
+                }
+            },
+            columns: [
+                {
+                    title: '编号',
+                    dataIndex: 'number',
+                    key: 'number',
+                }, {
+                    title: '省份',
+                    dataIndex: 'province',
+                    key: 'province',
+                }, {
+                    title: '外包公司',
+                    dataIndex: 'outsource',
+                    key: 'outsource',
+                }, {
+                    title: '公司名称',
+                    dataIndex: 'unitName',
+                    key: 'unitName',
+                }, {
+                    title: '联系方式',
+                    dataIndex: 'contacts',
+                    key: 'contacts',
+                }, {
+                    title: '派单信息',
+                    dataIndex: 'createInfo',
+                    key: 'createInfo',
+                }, {
+                    title: '软著名称',
+                    dataIndex: 'copyrightName',
+                    key: 'copyrightName',
+                }, {
+                    title: '加急',
+                    dataIndex: 'urgent',
+                    key: 'urgent',
+                }, {
+                    title: '咨询师',
+                    dataIndex: 'consultant',
+                    key: 'consultant',
+                }, {
+                    title: '派单日',
+                    dataIndex: 'createTime',
+                    key: 'createTime',
+                }, {
+                    title: '受理日',
+                    dataIndex: 'acceptanceTime',
+                    key: 'acceptanceTime',
+                }, {
+                    title: '(预计)下证时间',
+                    dataIndex: 'endTime',
+                    key: 'endTime',
+                }, {
+                    title: '备注',
+                    dataIndex: 'explain',
+                    key: 'explain',
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        provinceArr.map(function (item) {
+            _me.state.provinceOption.push(
+                <Select.Option value={item} key={item}>{item}</Select.Option>
+            )
+        });
+        //console.log(this.state.pagination.total);
+        this.loadData();
+        this.getAuthorList();
+        this.getCompanyList();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true
+        });
+    },
+    delectRow() {
+        let deletedIds = [];
+        for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
+            let rowItem = this.state.selectedRows[idx];
+            if (rowItem.cid) {
+                deletedIds.push(rowItem.cid)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/deleteCognizance",
+            data: {
+                ids: deletedIds
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.setState({
+                    loading: false,
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.loadData();
+        }.bind(this));
+    },
+    closeDesc(e, s) {
+        this.state.showDesc = e;
+        if (s) {
+            this.loadData();
+        };
+    },
+    addClick() {
+        this.setState({
+            showAdd: true
+        });
+    },
+    closeAdd(e, s) {
+        this.state.showAdd = e;
+        if (s) {
+            this.loadData();
+        };
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.province = undefined;
+        this.state.unitName = undefined;
+        this.loadData();
+    },
+    render() {
+        const rowSelection = {
+            selectedRowKeys: this.state.selectedRowKeys,
+            onChange: (selectedRowKeys, selectedRows) => {
+                this.setState({
+                    selectedRows: selectedRows,
+                    selectedRowKeys: selectedRowKeys
+                });
+            }
+        };
+        const hasSelected = this.state.selectedRowKeys.length > 0;
+        return (
+            <div className="foster-box">
+                <div className="foster-content">
+                    <div className="content-title">
+                        <span>软著申请管理</span>
+                        <PatentAdd
+                            companyOption={this.state.companyOption}
+                            authorOption={this.state.authorOption}
+                            onClick={this.addClick}
+                            closeAdd={this.closeAdd} />
+                    </div>
+                    <div className="foster-query">
+                        <Select placeholder="选择省份"
+                            style={{ width: 200 }}
+                            value={this.state.province}
+                            showSearch
+                            filterOption={companySearch}
+                            onChange={(e) => { this.setState({ province: e }) }}>
+                            {this.state.provinceOption}
+                        </Select>
+                        <Select placeholder="选择公司"
+                            style={{ width: 200 }}
+                            value={this.state.unitName}
+                            showSearch
+                            filterOption={companySearch}
+                            onChange={(e) => { this.setState({ unitName: e }) }}>
+                            {this.state.companyOption}
+                        </Select>
+                        <Button type="primary" onClick={this.search}>搜索</Button>
+                        <Button onClick={this.reset}>重置</Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </div>
+                    <div className="foster-table">
+                        <Spin spinning={this.state.loading}>
+                            <Table columns={this.state.columns}
+                                rowSelection={rowSelection}
+                                dataSource={this.state.dataSource}
+                                pagination={this.state.pagination}
+                                onRowClick={this.tableRowClick} />
+                        </Spin>
+                    </div>
+                    <PatentChange
+                        data={this.state.RowData}
+                        authorOption={this.state.authorOption}
+                        showDesc={this.state.showDesc}
+                        closeDesc={this.closeDesc} />
+                </div >
+            </div>
+        );
+    }
+});
+
+export default copyright;

+ 287 - 0
js/component/manageCenter/servicesManage/copyright/copyright.less

@@ -0,0 +1,287 @@
+.foster-content {
+    padding: 20px;
+    background: #fff;
+    .content-title {
+        height: 32px;
+        margin-bottom: 10px;
+        >span {
+            color: #333;
+            font-size: 16px;
+            margin-bottom: 10px;
+        }
+    }
+    .foster-query {
+        margin-bottom: 10px;
+        >input {
+            width: 180px;
+            margin-right: 20px;
+        }
+        >div {
+            margin-right: 20px;
+        }
+        button {
+            margin-left: 20px;
+        }
+        >span {
+            margin-left: 20px;
+            >span {
+                margin-left: 10px;
+            }
+        }
+    }
+}
+.patent-addNew {
+    float: right;
+    margin-left: 20px;
+    button {
+        background: #ea0862;
+        color: #fff;
+        border: none;
+        border-radius: 4px;
+        padding: 6px 10px;
+        margin-left: 20px;
+    }
+    button:hover{
+        background: #ea0862;
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+.patent-content {
+    padding: 20px;
+    background: #fff;
+    .content-title {
+        height: 32px;
+        margin-bottom: 10px;
+        >span {
+            color: #333;
+            font-size: 16px;
+            margin-bottom: 10px;
+        }
+        .patent-addNew {
+            float: right;
+            margin-left: 20px;
+            button {
+                background: #ea0862;
+                color: #fff;
+                border: none;
+                border-radius: 4px;
+                padding: 6px 10px;
+            }
+        }
+    }
+    .patent-alert {
+        font-size: 14px;
+        padding: 8px 48px;
+        >i {
+            font-size: 19px;
+            top: 8px;
+        }
+    }
+    .patent-query {
+        margin-bottom: 10px;
+        >input {
+            width: 180px;
+            margin-right: 20px;
+        }
+        >div {
+            margin-right: 20px;
+        }
+        button {
+            margin-left: 20px;
+        }
+        >span {
+            margin-left: 20px;
+            >span {
+                margin-left: 10px;
+            }
+        }
+        .search-more {
+            >p {
+                margin-top: 10px;
+                >span {
+                    margin-right: 10px;
+                }
+            }
+            >div {
+                margin-top: 10px;
+                >div {
+                    margin-right: 20px;
+                }
+            }
+        }
+    }
+}
+
+.ant-modal-content {
+    .ant-modal-header {
+        padding: 10px 16px;
+        background: #2d2d2d;
+        .ant-modal-title {
+            color: #fff;
+            font-size: 16px;
+            font-weight: 400;
+        }
+    }
+    .ant-modal-body {
+        padding: 16px 26px;
+        .ant-form-item-label {
+            text-align: left;
+        }
+        .ant-form-item-control {
+            .mini-input {
+                width: 50%;
+            }
+            .ant-checkbox-wrapper {
+                margin-left: 60px;
+                span {
+                    vertical-align: middle;
+                }
+            }
+        }
+        .ant-form-item {
+            margin-bottom: 12px;
+        }
+    }
+    .avatar-uploader,
+    .avatar-uploader-trigger,
+    .avatar {
+        width: 150px;
+        height: 150px;
+    }
+    .avatar-uploader {
+        display: block;
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+    }
+    .avatar-uploader-trigger {
+        display: table-cell;
+        vertical-align: middle;
+        font-size: 28px;
+        color: #999;
+    }
+}
+
+.patent-desc-content {
+    .ant-modal-body {
+        .express-desc-row {
+            margin-bottom: 16px;
+            >div {
+                line-height: 28px;
+            }
+            .ant-col-4 {
+                margin-right: 10px;
+            }
+            .ant-col-5 {
+                margin-right: 10px;
+            }
+        }
+        .patent-process-list {
+            span {
+                width: 180px;
+                display: inline-block;
+            }
+        }
+        >div {
+            color: #333;
+            margin-bottom: 10px;
+            >p {
+                margin-bottom: 10px;
+            }
+            >textarea {
+                margin-top: 10px;
+            }
+            .widthHalf {
+                display: inline-block;
+                width: 50%;
+                input {
+                    width: 200px;
+                }
+                .two2four {
+                    letter-spacing: 2em;
+                    margin-right: -2em;
+                }
+                .four2eight {
+                    letter-spacing: 4/3em;
+                    margin-right: -4/3em;
+                }
+                .seven2eight {
+                    letter-spacing: 3/11em;
+                    margin-right: -3/11em;
+                }
+                .three2eight {
+                    letter-spacing: 2.5em;
+                    margin-right: -2.5em;
+                }
+            }
+            .widthThird {
+                display: inline-block;
+                width: 33%;
+            }
+            span {
+                color: #666;
+            }
+            .avatar-uploader {
+                float: left;
+                margin-right: 40px;
+            }
+        }
+        .avatar-text {
+            span {
+                margin-right: 40px;
+                display: inline-block;
+                width: 150px;
+                text-align: center;
+            }
+        }
+    }
+}
+
+.applyFee-desc-content {
+    .ant-modal-body {
+        >p {
+            margin-bottom: 10px;
+        }
+        .applyFee-title {
+            span {
+                margin-right: 20px;
+                font-size: 16px;
+            }
+        }
+        .applyFee-fee {
+            margin-bottom: 10px;
+            >span {
+                margin-right: 10px;
+            }
+            >input {
+                width: 150px;
+            }
+        }
+        div.applyFee-fee {
+            span {
+                line-height: 22px;
+                vertical-align: middle;
+            }
+        }
+    }
+}

+ 57 - 24
js/component/manageCenter/servicesManage/highTech/HighTechApply.jsx

@@ -8,7 +8,7 @@ import moment from 'moment';
 import './highTechFoster.less';
 
 const CognizanceDescFrom = Form.create()(React.createClass({
-    loadData() {
+    loadData(uid, cid, year) {
         this.setState({
             loading: true
         });
@@ -18,9 +18,9 @@ const CognizanceDescFrom = Form.create()(React.createClass({
             crossDomain: false,
             url: globalConfig.context + "/api/admin/cognizanceDetail",
             data: {
-                cid: this.props.data.cid,
-                uid: this.props.data.uid,
-                year: this.props.data.year
+                cid: cid || this.props.data.cid,
+                uid: uid || this.props.data.uid,
+                year: year || this.props.data.year
             },
             success: function (data) {
                 if (data.error.length || !data.data) {
@@ -55,7 +55,7 @@ const CognizanceDescFrom = Form.create()(React.createClass({
             });
         }.bind(this));
     },
-    getStateData() {
+    getStateData(cid) {
         this.setState({
             loading: true
         });
@@ -65,7 +65,7 @@ const CognizanceDescFrom = Form.create()(React.createClass({
             crossDomain: false,
             url: globalConfig.context + "/api/admin/cognizanceLog",
             data: {
-                cid: this.props.data.cid
+                cid: cid || this.props.data.cid
             },
             success: function (data) {
                 if (data.error.length || !data.data) {
@@ -90,14 +90,14 @@ const CognizanceDescFrom = Form.create()(React.createClass({
             });
         }.bind(this));
     },
-    getContactsList() {
+    getContactsList(uid) {
         $.ajax({
             method: "post",
             dataType: "json",
             crossDomain: false,
             url: globalConfig.context + "/api/admin/getContacts",
             data: {
-                uid: this.props.data.uid
+                uid: uid || this.props.data.uid
             },
             success: function (data) {
                 let theOption = [];
@@ -138,7 +138,7 @@ const CognizanceDescFrom = Form.create()(React.createClass({
                 key: 'grossProfit',
             }],
             stateColumns: [{
-                title: '专利状态',
+                title: '认证状态',
                 dataIndex: 'state',
                 key: 'state',
                 render: (text) => { return getCognizanceState(text) }
@@ -190,12 +190,14 @@ const CognizanceDescFrom = Form.create()(React.createClass({
                     url: globalConfig.context + "/api/admin/disposeCognizanceDetail",
                     data: {
                         id: this.props.data.cid,
+                        uid: this.props.data.uid,
                         technicalField1: values.technicalField[0],
                         technicalField2: values.technicalField[1],
                         technicalField3: values.technicalField[2],
                         basicResearchCost: values.basicResearchCost,
+                        contacts: values.contacts,
                         accident: values.accident,
-
+                        certificateNumber: values.certificateNumber,
                         recordTimeFormattedDate: values.recordTime ? values.recordTime.format("YYYY-MM-DD") : undefined,
                         state: values.state,
                         principal: values.principal,
@@ -219,8 +221,9 @@ const CognizanceDescFrom = Form.create()(React.createClass({
     },
     componentWillReceiveProps(nextProps) {
         if (!this.props.visible && nextProps.visible) {
-            this.getStateData();
-            this.loadData();
+            this.getStateData(nextProps.data.cid);
+            this.loadData(nextProps.data.uid, nextProps.data.cid, nextProps.data.year);
+            this.getContactsList(nextProps.data.uid);
         };
     },
     render() {
@@ -249,14 +252,30 @@ const CognizanceDescFrom = Form.create()(React.createClass({
                             <span>{theData.postalAddress}</span>
                         </div>
                         <FormItem className="half-item"
-                            labelCol={{ span: 6 }}
+                            labelCol={{ span: 3 }}
                             wrapperCol={{ span: 14 }}
                         >
+                            <span className="item-title">联系人: </span>
                             {getFieldDecorator('contacts', {
                                 rules: [{ required: true, message: '此项为必填项!' }],
                                 initialValue: theData.contacts
                             })(
-                                <Select placeholder='选择一个联系人'>{this.state.contactsOption}</Select>
+                                <Select
+                                    style={{ display: 'inline-block', width: '200px' }}
+                                    placeholder='选择一个联系人'>
+                                    {this.state.contactsOption}
+                                </Select>
+                                )}
+                        </FormItem>
+                        <FormItem className="half-item"
+                            labelCol={{ span: 3 }}
+                            wrapperCol={{ span: 14 }}
+                        >
+                            <span className="item-title">证书编号: </span>
+                            {getFieldDecorator('certificateNumber', {
+                                initialValue: this.props.data.certificateNumber
+                            })(
+                                <Input style={{ width: '200px' }} placeholder='高企证书编号' />
                                 )}
                         </FormItem>
                     </div>
@@ -490,7 +509,14 @@ const CognizanceAdd = React.createClass({
         });
     },
     componentWillReceiveProps(nextProps) {
-        this.state.visible = nextProps.showAdd
+        if (!this.props.showAdd && nextProps.showAdd) {
+            this.state.year = undefined;
+            this.state.contacts = undefined;
+            this.state.comment = undefined;
+            this.state.consultant = undefined;
+            this.state.uid = undefined;
+        };
+        this.state.visible = nextProps.showAdd;
     },
     componentWillMount() {
         let d = new Date();
@@ -543,7 +569,8 @@ const CognizanceAdd = React.createClass({
             if (!data.error.length) {
                 message.success('保存成功!');
                 this.setState({
-                    visible: false
+                    visible: false,
+                    loading: false
                 });
                 this.props.closeAdd(false, true);
             } else {
@@ -588,14 +615,16 @@ const CognizanceAdd = React.createClass({
                                 style={{ width: 200 }}
                                 showSearch
                                 filterOption={companySearch}
-                                onSelect={(e, n) => { this.state.uid = e; this.getContactsList(e); }}>
+                                value={this.state.uid}
+                                onSelect={(e, n) => { this.setState({ uid: e }); this.getContactsList(e); }}>
                                 {this.props.companyOption}
                             </Select>
                         </div>
                         <div className="half-item">
                             <span>选择咨询师:  </span>
                             <Select placeholder="请选择咨询师" style={{ width: 200 }}
-                                onSelect={(e, n) => { this.state.consultant = e }}>
+                                value={this.state.consultant}
+                                onSelect={(e, n) => { this.setState({ consultant: e }); }}>
                                 {this.props.authorOption}
                             </Select>
                         </div>
@@ -604,21 +633,25 @@ const CognizanceAdd = React.createClass({
                         <div className="half-item">
                             <span>选择申请年份:  </span>
                             <Select placeholder="请选择年份" style={{ width: 200 }}
-                                onSelect={(e, n) => { this.state.year = e }}>
+                                value={this.state.year}
+                                onSelect={(e, n) => { this.setState({ year: e }); }}>
                                 {this.state.yearOption}
                             </Select>
                         </div>
                         <div className="half-item">
                             <span>选择联系人:  </span>
                             <Select placeholder="请选择联系人" style={{ width: 200 }}
-                                onSelect={(e, n) => { this.state.contacts = e }}>
+                                value={this.state.contacts}
+                                onSelect={(e, n) => { this.setState({ contacts: e }); }}>
                                 {this.state.contactsOption}
                             </Select>
                         </div>
                     </div>
                     <div>
                         <div>
-                            <Input type="textarea" rows={6} onChange={(e) => { this.state.comment = e.target.value; }} />
+                            <Input type="textarea" rows={6}
+                                value={this.state.comment}
+                                onChange={(e) => { this.setState({ comment: e.target.value }); }} />
                         </div>
                     </div>
                 </Modal>
@@ -843,8 +876,8 @@ const Cognizance = React.createClass({
         let deletedIds = [];
         for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
             let rowItem = this.state.selectedRows[idx];
-            if (rowItem.id) {
-                deletedIds.push(rowItem.id)
+            if (rowItem.cid) {
+                deletedIds.push(rowItem.cid)
             }
         }
         this.setState({
@@ -855,7 +888,7 @@ const Cognizance = React.createClass({
             method: "POST",
             dataType: "json",
             crossDomain: false,
-            url: globalConfig.context + "/techservice/cognizance/deleteCognizance",
+            url: globalConfig.context + "/api/admin/deleteCognizance",
             data: {
                 ids: deletedIds
             }

+ 15 - 12
js/component/manageCenter/servicesManage/highTech/fosterDesc/activity.jsx

@@ -1,7 +1,7 @@
 import React from 'react';
 import { Icon, Button, Upload, Input, Spin, Table, message, Select, Modal, DatePicker, Cascader, Transfer, InputNumber } from 'antd';
 import { techFieldList, technicalSourceList } from '../../../../dataDic.js';
-import { getTechField, getTechnicalSource, beforeUploadFile } from '../../../../tools.js';
+import { getTechField, getTechnicalSource, beforeUploadFile, downloadFile } from '../../../../tools.js';
 import moment from 'moment';
 import ajax from 'jquery/src/ajax/xhr.js';
 import $ from 'jquery/src/ajax';
@@ -23,7 +23,7 @@ const ActivityDesc = React.createClass({
             method: "POST",
             dataType: "json",
             crossDomain: false,
-            url: globalConfig.context + "/techservice/cognizance/activity",
+            url: globalConfig.context + "/api/admin/activity",
             data: {
                 id: this.props.data.id,
                 uid: this.props.uid,
@@ -93,8 +93,7 @@ const ActivityDesc = React.createClass({
         this.props.closeDesc(false);
     },
     componentWillReceiveProps(nextProps) {
-        this.state.visible = nextProps.showDesc;
-        if (!this.props.showDesc && nextProps.showDesc) {
+        if (!this.state.showDesc && nextProps.showDesc) {
             this.state.activityName = nextProps.data.activityName;
             this.state.activityNumber = nextProps.data.activityNumber;
             this.state.startDateFormattedDate = nextProps.data.startDateFormattedDate;
@@ -114,6 +113,7 @@ const ActivityDesc = React.createClass({
             this.state.proofDownloadFileName = nextProps.data.proofDownloadFileName;
             this.state.mockData = nextProps.data.mockData;
         };
+        this.state.visible = nextProps.showDesc;
     },
     intellectualChange(nextTargetKeys, direction, moveKeys) {
         this.setState({ targetKeys: nextTargetKeys });
@@ -209,23 +209,26 @@ const ActivityDesc = React.createClass({
                             <div className="half-div">
                                 <span>总计(万元):</span>
                                 <InputNumber value={
-                                    this.state.firstYearExpenditure + this.state.secondYearExpenditure + this.state.thirdYearExpenditure || 0
+                                    (this.state.firstYearExpenditure || 0) +
+                                    (this.state.secondYearExpenditure || 0) +
+                                    (this.state.thirdYearExpenditure || 0)
                                 } />
+                                <span>(自动计算)</span>
                             </div>
                             <div className="half-div">
                                 <span>其中(第一年):</span>
-                                <InputNumber value={this.state.firstYearExpenditure}
-                                    onChange={(e) => { this.setState({ firstYearExpenditure: e }); }} />
+                                <InputNumber value={this.state.firstYearExpenditure || 0}
+                                    onChange={(e) => { this.setState({ firstYearExpenditure: e || 0 }); }} />
                             </div>
                             <div className="half-div">
                                 <span>其中(第二年):</span>
-                                <InputNumber value={this.state.secondYearExpenditure}
-                                    onChange={(e) => { this.setState({ secondYearExpenditure: e }); }} />
+                                <InputNumber value={this.state.secondYearExpenditure || 0}
+                                    onChange={(e) => { this.setState({ secondYearExpenditure: e || 0 }); }} />
                             </div>
                             <div className="half-div">
                                 <span>其中(第三年):</span>
-                                <InputNumber value={this.state.thirdYearExpenditure}
-                                    onChange={(e) => { this.setState({ thirdYearExpenditure: e }); }} />
+                                <InputNumber value={this.state.thirdYearExpenditure || 0}
+                                    onChange={(e) => { this.setState({ thirdYearExpenditure: e || 0 }); }} />
                             </div>
                         </div>
                         <div className="clearfix">
@@ -374,7 +377,7 @@ const Activity = React.createClass({
                     technicalField1: thisdata.technicalField1,
                     technicalField2: thisdata.technicalField2,
                     technicalField3: thisdata.technicalField3,
-                    technicalSource: String(thisdata.technicalSource),
+                    technicalSource: thisdata.technicalSource ? String(thisdata.technicalSource) : undefined,
                     intellectualPropertyNumber: thisdata.intellectualPropertyNumber ? thisdata.intellectualPropertyNumber.split(",") : [],
                     budget: thisdata.budget,
                     firstYearExpenditure: thisdata.firstYearExpenditure,

+ 27 - 23
js/component/manageCenter/servicesManage/highTech/fosterDesc/activityCostList.jsx

@@ -15,6 +15,8 @@ const ActivityDescFrom = Form.create()(React.createClass({
     },
     componentWillMount() {
         let _me = this;
+        this.state.internalAllCost = this.props.data.internalAllCost;
+        this.state.allCost = this.props.data.allCost;
         this.props.activityNumberList.map(function (item) {
             _me.state.activityNumberOption.push(
                 <Select.Option value={item.aid} key={item.uid}>{item.activityNumber}</Select.Option>
@@ -31,14 +33,14 @@ const ActivityDescFrom = Form.create()(React.createClass({
             this.props.form.getFieldValue('internalDesignCost') + this.props.form.getFieldValue('internalEquipmentCost') +
             this.props.form.getFieldValue('internalOtherCost') + this.props.form.getFieldValue('externalTotalCost');
     },
-    componentDidMount() {
-        this.allCostCount();
-        this.setState({
-            loading: false
-        });
-    },
-    componentWillReceiveProps() {
-        this.allCostCount();
+    componentWillReceiveProps(nextProps) {
+        if (!this.props.visible && nextProps.visible) {
+            this.state.internalAllCost = nextProps.data.internalAllCost;
+            this.state.allCost = nextProps.data.allCost;
+            nextProps.form.resetFields();
+        } else {
+            this.allCostCount();
+        };
     },
     handleSubmit(e) {
         e.preventDefault();
@@ -99,7 +101,10 @@ const ActivityDescFrom = Form.create()(React.createClass({
                 <p className="activityCost-title">项目编号</p>
                 {
                     theData.activityNumber ? <span>{theData.activityNumber}</span> :
-                        <Select placeholder="请选择项目编号" style={{ width: 200 }}
+                        <Select
+                            notFoundContent="无项目可选"
+                            placeholder="请选择项目编号"
+                            style={{ width: 200 }}
                             onSelect={(e, n) => { this.state.aid = e; this.state.activityNumber = n.props.children }}>
                             {this.state.activityNumberOption}
                         </Select>
@@ -110,11 +115,9 @@ const ActivityDescFrom = Form.create()(React.createClass({
                         {...formItemLayout}
                         label="共计(万元)"
                     >
-                        {getFieldDecorator('internalAllCost')(
-                            <span className="number-box">
-                                {this.state.internalAllCost}
-                            </span>
-                        )}
+                        <span className="number-box">
+                            {this.state.internalAllCost}
+                        </span>
                     </FormItem>
                     <FormItem className="half-item"
                         {...formItemLayout}
@@ -122,7 +125,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
                     >
                         {getFieldDecorator('internalLaborCost', {
                             rules: [{ type: "number", required: true, message: '此项为必填项!' }],
-                            initialValue: theData.internalLaborCost
+                            initialValue: theData.internalLaborCost || 0
                         })(
                             <InputNumber />
                             )}
@@ -133,7 +136,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
                     >
                         {getFieldDecorator('internalDirectCost', {
                             rules: [{ type: "number", required: true, message: '此项为必填项!' }],
-                            initialValue: theData.internalDirectCost
+                            initialValue: theData.internalDirectCost || 0
                         })(
                             <InputNumber />
                             )}
@@ -144,7 +147,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
                     >
                         {getFieldDecorator('internalDepreciationCost', {
                             rules: [{ type: "number", required: true, message: '此项为必填项!' }],
-                            initialValue: theData.internalDepreciationCost
+                            initialValue: theData.internalDepreciationCost || 0
                         })(
                             <InputNumber />
                             )}
@@ -155,7 +158,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
                     >
                         {getFieldDecorator('internalAmortizationCost', {
                             rules: [{ type: "number", required: true, message: '此项为必填项!' }],
-                            initialValue: theData.internalAmortizationCost
+                            initialValue: theData.internalAmortizationCost || 0
                         })(
                             <InputNumber />
                             )}
@@ -166,7 +169,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
                     >
                         {getFieldDecorator('internalDesignCost', {
                             rules: [{ type: "number", required: true, message: '此项为必填项!' }],
-                            initialValue: theData.internalDesignCost
+                            initialValue: theData.internalDesignCost || 0
                         })(
                             <InputNumber />
                             )}
@@ -177,7 +180,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
                     >
                         {getFieldDecorator('internalEquipmentCost', {
                             rules: [{ type: "number", required: true, message: '此项为必填项!' }],
-                            initialValue: theData.internalEquipmentCost
+                            initialValue: theData.internalEquipmentCost || 0
                         })(
                             <InputNumber />
                             )}
@@ -188,7 +191,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
                     >
                         {getFieldDecorator('internalOtherCost', {
                             rules: [{ type: "number", required: true, message: '此项为必填项!' }],
-                            initialValue: theData.internalOtherCost
+                            initialValue: theData.internalOtherCost || 0
                         })(
                             <InputNumber />
                             )}
@@ -202,7 +205,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
                     >
                         {getFieldDecorator('externalTotalCost', {
                             rules: [{ type: "number", required: true, message: '此项为必填项!' }],
-                            initialValue: theData.externalTotalCost
+                            initialValue: theData.externalTotalCost || 0
                         })(
                             <InputNumber />
                             )}
@@ -213,7 +216,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
                     >
                         {getFieldDecorator('externalAbroadCost', {
                             rules: [{ type: "number", required: true, message: '此项为必填项!' }],
-                            initialValue: theData.externalAbroadCost
+                            initialValue: theData.externalAbroadCost || 0
                         })(
                             <InputNumber />
                             )}
@@ -345,6 +348,7 @@ const ActivityDesc = React.createClass({
                     >
                         <ActivityDescFrom
                             uid={this.props.uid}
+                            visible={this.state.visible}
                             data={this.props.data}
                             activityNumberList={this.props.activityNumberList}
                             spinState={this.spinChange} closeModal={this.handleCancel} clickOk={this.handleOk} />

+ 8 - 7
js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectualDesc.jsx

@@ -83,6 +83,7 @@ const IntellectualDescFrom = Form.create()(React.createClass({
             wrapperCol: { span: 12 },
         };
         const _me = this;
+        const theData = this.props.data;
         return (
             <Form horizontal onSubmit={this.handleSubmit}>
                 <FormItem
@@ -91,7 +92,7 @@ const IntellectualDescFrom = Form.create()(React.createClass({
                 >
                     {getFieldDecorator('intellectualPropertyNumber', {
                         rules: [{ required: true, message: '请输入,知识产权编号不能为空!' }],
-                        initialValue: this.props.data.intellectualPropertyNumber
+                        initialValue: theData.intellectualPropertyNumber
                     })(
                         <Input placeholder="请输入知识产权编号" />
                         )}
@@ -102,7 +103,7 @@ const IntellectualDescFrom = Form.create()(React.createClass({
                 >
                     {getFieldDecorator('intellectualPropertyName', {
                         rules: [{ required: true, message: '请输入,知识产权名称不能为空!' }],
-                        initialValue: this.props.data.intellectualPropertyName
+                        initialValue: theData.intellectualPropertyName
                     })(
                         <Input placeholder="请输入知识产权名称" />
                         )}
@@ -113,7 +114,7 @@ const IntellectualDescFrom = Form.create()(React.createClass({
                 >
                     {getFieldDecorator('sortNumber', {
                         rules: [{ required: true, message: '请输入,排序号不能为空!' }],
-                        initialValue: this.props.data.sortNumber
+                        initialValue: theData.sortNumber
                     })(
                         <Input placeholder="请输入排序号" />
                         )}
@@ -124,7 +125,7 @@ const IntellectualDescFrom = Form.create()(React.createClass({
                 >
                     {getFieldDecorator('catagory', {
                         rules: [{ required: true, message: '请选择,知识产权类型不能为空!' }],
-                        initialValue: this.props.data.catagory
+                        initialValue: theData.catagory
                     })(
                         <Select placeholder="请选择知识产权类型" style={{ width: 200 }}
                             onChange={(e) => { this.state.catagory = e; }}>
@@ -138,7 +139,7 @@ const IntellectualDescFrom = Form.create()(React.createClass({
                 >
                     {getFieldDecorator('obtainWay', {
                         rules: [{ required: true, message: '请选择,获得方式不能为空!' }],
-                        initialValue: this.props.data.obtainWay
+                        initialValue: theData.obtainWay
                     })(
                         <Select placeholder="请选择获得方式" style={{ width: 200 }}
                             onChange={(e) => { this.state.obtainWay = e; }}>
@@ -152,7 +153,7 @@ const IntellectualDescFrom = Form.create()(React.createClass({
                 >
                     {getFieldDecorator('authorizationNumber', {
                         rules: [{ required: true, message: '请输入,授权号不能为空!' }],
-                        initialValue: this.props.data.authorizationNumber
+                        initialValue: theData.authorizationNumber
                     })(
                         <Input placeholder="请输入授权号" />
                         )}
@@ -163,7 +164,7 @@ const IntellectualDescFrom = Form.create()(React.createClass({
                 >
                     {getFieldDecorator('authorizationDate', {
                         rules: [{ type: 'object', required: true, message: '请选择,授权日期不能为空!' }],
-                        initialValue: !this.props.data.authorizationDateFormattedDate ? null : moment(this.props.data.authorizationDateFormattedDate, 'YYYY/MM/DD')
+                        initialValue: !theData.authorizationDateFormattedDate ? null : moment(theData.authorizationDateFormattedDate, 'YYYY/MM/DD')
                     })(
                         <DatePicker style={{ width: 200 }}
                             onChange={(data, dataString) => { this.state.authorizationDateFormattedDate = dataString }} />

+ 11 - 9
js/component/manageCenter/servicesManage/highTech/fosterDesc/orgTechCenter.jsx

@@ -26,9 +26,9 @@ const CenterListDescFrom = Form.create()(React.createClass({
                         id: this.props.data.id,
                         uid: this.props.uid,
                         projectName: values.projectName,
-                        projectTime: values.projectTime.format("YYYY-MM-DD"),
+                        projectTimeFormattedDate: values.projectTime.format("YYYY-MM-DD"),
                         institution: values.institution,
-                        termTime: values.termTime.format("YYYY-MM-DD"),
+                        termTimeFormattedDate: values.termTime.format("YYYY-MM-DD"),
                         protocolUrl: this.state.protocolUrl
                     }
                 }).done(function (data) {
@@ -211,7 +211,7 @@ const CenterList = React.createClass({
                 theData = {};
             };
             this.state.cid = theData.id;
-            this.state.foundingTime = theData.foundingTime;
+            this.state.foundingTime = theData.foundingTimeFormattedDate;
             this.state.principal = theData.principal;
             this.state.systemCatalog = theData.systemCatalog;
             this.state.systemUrl = theData.systemUrl;
@@ -310,8 +310,8 @@ const CenterList = React.createClass({
                     key: 'institution'
                 }, {
                     title: '协议附件',
-                    dataIndex: 'protocolUrl',
-                    key: 'protocolUrl',
+                    dataIndex: 'protocol',
+                    key: 'protocol',
                     render: (text) => {
                         return <a onClick={downloadFile.bind(null, text[0], text[1])}>{text[1]}</a>
                     }
@@ -324,9 +324,10 @@ const CenterList = React.createClass({
         this.loadOrgTechCenterDetail();
     },
     componentWillReceiveProps(nextProps) {
-        debugger
-        this.props.data.uid;
-        nextProps.data.uid;
+        if (this.props.data.uid !== nextProps.data.uid) {
+            this.props.data.uid = nextProps.data.uid;
+            this.loadOrgTechCenterDetail();
+        };
     },
     tableRowClick(record, index) {
         this.state.RowData = record;
@@ -383,6 +384,7 @@ const CenterList = React.createClass({
             url: globalConfig.context + "/api/admin/disposeCenter",
             data: {
                 uid: this.props.data.uid,
+                id: this.state.cid,
                 principal: this.state.principal,
                 systemUrl: this.state.systemUrl,
                 systemCatalog: this.state.systemCatalog,
@@ -478,7 +480,7 @@ const CenterList = React.createClass({
                                 }
                             }}
                         >
-                            <Button><Icon type="upload" /> 上传研发费用台账 </Button>
+                            <Button><Icon type="upload" /> 上传研发部门制度 </Button>
                         </Upload>
                         <p style={{ marginTop: '10px' }}>{this.state.systemUrl ? <a onClick={downloadFile.bind(null, this.state.systemUrl, this.state.systemDownloadFileName)}>{this.state.systemDownloadFileName}</a> : <span><Icon type="exclamation-circle" style={{ color: '#ffbf00', marginRight: '6px' }} />未上传!</span>}</p>
                     </div>

+ 15 - 2
js/component/manageCenter/servicesManage/leftTab.jsx

@@ -12,8 +12,9 @@ const LeftTab = React.createClass({
             subKey: 'sub1',
             keyList: [
                 { key: 'sub1', value: ['comprehensive', 'payment', 'correction', 'express', 'applyFee'] },
-                { key: 'sub2', value: [] },
-                { key: 'sub3', value: ['highTechApply', 'highTechFoster'] }
+                { key: 'sub2', value: ['copyright'] },
+                { key: 'sub3', value: ['highTechApply', 'highTechFoster'] },
+                { key: 'sub4', value: ['applyManage', 'websiteManage'] }
             ]
         };
     },
@@ -29,6 +30,9 @@ const LeftTab = React.createClass({
                 case 'sub3':
                     location.href = globalConfig.context + '/admin/servicesManage/highTech.html#' + e.key;
                     break;
+                case 'sub4':
+                    location.href = globalConfig.context + '/admin/servicesManage/technology.html#' + e.key;
+                    break;
             }
         };
         this.props.handlekey(e.key);
@@ -78,6 +82,9 @@ const LeftTab = React.createClass({
                     </Menu.Item>
                 </SubMenu>
                 <SubMenu key="sub2" title={<span>软著申请管理</span>}>
+                	<Menu.Item key="copyright">
+                        软著申请管理
+                    </Menu.Item>
                 </SubMenu>
                 <SubMenu key="sub3"
                     title={<div>高企认定管理</div>}>
@@ -89,6 +96,12 @@ const LeftTab = React.createClass({
                     </Menu.Item>
                 </SubMenu>
                 <SubMenu key="sub4" title={<span>科技项目申报管理</span>}>
+                	<Menu.Item key="applyManage">
+                        申报管理
+                    </Menu.Item>
+                    <Menu.Item key="websiteManage">
+                        科技部门网址管理
+                    </Menu.Item>
                 </SubMenu>
             </Menu>
         );

+ 6 - 9
js/component/manageCenter/servicesManage/patent/comPatentAdd.jsx

@@ -3,7 +3,7 @@ import { Icon, Modal, Button, Form, Upload, message, Input, Spin, Checkbox, Sele
 import './comprehensive.less';
 import ajax from 'jquery/src/ajax/xhr.js'
 import $ from 'jquery/src/ajax';
-import { getBase64, beforeUpload ,companySearch} from '../../../tools.js';
+import { getBase64, beforeUpload, companySearch } from '../../../tools.js';
 
 class Avatar extends React.Component {
     constructor(props) {
@@ -24,7 +24,6 @@ class Avatar extends React.Component {
         }
     }
     render() {
-        const imageUrl = this.state.imageUrl;
         return (
             <Upload
                 className="avatar-uploader"
@@ -35,11 +34,7 @@ class Avatar extends React.Component {
                 beforeUpload={beforeUpload}
                 onChange={this.handleChange.bind(this)}
             >
-                {
-                    imageUrl ?
-                        <img src={imageUrl} role="presentation" className="avatar" /> :
-                        <Icon type="plus" className="avatar-uploader-trigger" />
-                }
+                <Button><Icon type="upload" />上传专利代理委托书</Button>
             </Upload>
         );
     }
@@ -228,7 +223,9 @@ const PatentAddFrom = Form.create()(React.createClass({
                     {getFieldDecorator('avatar')(
                         <Avatar urlData={this.avatarUrl} name='patent_prory_statement' oid={this.state.companyName} />
                     )}
-                    <span>请上传专利代理委托书</span><a onClick={() => { window.open(globalConfig.context + "/open/downloadTemplateFile?sign=patent_prory_statement") }}>模板下载</a>
+                    <p>
+                        <a onClick={() => { window.open(globalConfig.context + "/open/downloadTemplateFile?sign=patent_prory_statement") }}>模板下载</a>
+                    </p>
                 </FormItem>
                 <FormItem>
                     <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
@@ -278,7 +275,7 @@ const PatentAdd = React.createClass({
                         width='800px'
                         footer=''
                     >
-                        <PatentAddFrom spinState={this.spinChange} closeModal={this.handleCancel}  clickOk={this.handleOk} />
+                        <PatentAddFrom spinState={this.spinChange} closeModal={this.handleCancel} clickOk={this.handleOk} />
                     </Modal>
                 </Spin>
             </div>

+ 224 - 0
js/component/manageCenter/servicesManage/technology/applyAdd.jsx

@@ -0,0 +1,224 @@
+import React from 'react';
+import { Button, Input, Select, message, Modal, Checkbox } from 'antd';
+import { companySearch } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const ApplyAdd = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            yearOption: []
+        };
+    },
+    getContactsList(theUid) {
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/getContacts",
+            data: {
+                uid: theUid
+            },
+            success: function (data) {
+                let theOption = [];
+                if (data.error.length || !data.data) {
+                    return;
+                };
+                for (let item in data.data) {
+                    let theData = data.data[item];
+                    theOption.push(
+                        <Select.Option value={theData} key={theData}>{theData}</Select.Option>
+                    );
+                };
+                this.setState({
+                    contactsOption: theOption
+                });
+            }.bind(this),
+        });
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showAdd
+    },
+    componentWillMount() {
+        let d = new Date();
+        let _me = this;
+        d = d.getFullYear() - 1;
+        this.state.thisYear = d;
+        for (let i = d; i < d + 20; i++) {
+            _me.state.yearOption.push(
+                <Select.Option value={i.toString()} key={i}>{i}</Select.Option>
+            )
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk() {
+        this.setState({
+            loading: true
+        });
+        if (!this.state.year) {
+            message.warning('请选择年份!');
+            this.setState({
+                loading: false
+            });
+            return;
+        };
+        if (!this.state.contacts) {
+            message.warning('请选择一个联系人!');
+            this.setState({
+                loading: false
+            });
+            return;
+        };
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/applyCognizance",
+            data: {
+                year: this.state.year,
+                contacts: this.state.contacts,
+                comment: this.state.comment,
+                consultant: this.state.consultant,
+                uid: this.state.uid,
+                state: this.state.year == this.state.thisYear ? 0 : 7
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.setState({
+                    visible: false
+                });
+                this.props.closeAdd(false);
+            } else {
+                message.warning(data.error[0].message);
+                this.setState({
+                    loading: false
+                });
+            }
+        }.bind(this));
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeAdd(false);
+    },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
+    render() {
+        return (
+            <div className="cognizance-add">
+                <Modal title="新科技项目申请" visible={this.state.visible}
+                    onOk={this.handleOk} onCancel={this.handleCancel}
+                    width='800px'
+                    footer={[
+                        <Button key="submit" type="primary" loading={this.state.loading} onClick={this.handleOk}>
+                            确认
+                            </Button>,
+                        <Button key="back" onClick={this.handleCancel}>
+                            取消
+                            </Button>,
+                    ]}
+                >
+                    <div className="clearfix" style={{ marginBottom: '10px' }}>
+                        <div className="half-item">
+                            <span className="item-title">选择公司:  </span>
+                            <Select
+                                placeholder="请选择公司"
+                                style={{ width: 200 }}
+                                showSearch
+                                filterOption={companySearch}
+                                onSelect={(e, n) => { this.state.uid = e; this.getContactsList(e); }}>
+                                {this.props.companyOption}
+                            </Select>
+                        </div>
+                        <div className="half-item">
+                            <span className="item-title">选择联系人:  </span>
+                            <Select placeholder="请选择联系人" style={{ width: 200 }}
+                                onSelect={(e, n) => { this.state.contacts = e }}>
+                                {this.state.contactsOption}
+                            </Select>
+                        </div>
+                        
+                    </div>
+                    <div className="clearfix">
+                        <div className="half-item">
+                            <span className="item-title">选择申报科技部门:  </span>
+                            <Select placeholder="请选择年份" style={{ width: 200 }}
+                                onSelect={(e, n) => { this.state.year = e }}>
+                                {this.state.yearOption}
+                            </Select>
+                        </div>
+                    </div>
+                    <div className="clearfix">
+                    	<div>
+                            <span className="item-title">派单信息:  </span>
+                        </div>
+                        <Input type="textarea" rows={6} onChange={(e) => { this.state.comment = e.target.value; }} />
+                    </div>
+                    <div className="clearfix">
+	                 	<div className="half-item">
+	                   		<span className="item-title">项目名称:  </span>
+	                     	<Input  style={{ width: 200 }} />
+	                	</div>
+                    </div>
+                    <div className="clearfix">
+                    	<div className="half-item">
+	                   		<span className="item-title">项目类型:  </span>
+	                     	<Input  style={{ width: 200 }} />
+	                	</div>
+	                </div>
+	                <div className="clearfix">
+                    	<div className="half-item">
+	                   		<span className="item-title">技术领域:  </span>
+	                     	<Input  style={{ width: 200 }} />
+	                	</div>
+	                </div>
+	                <div className="clearfix">
+                    	<div>
+                            <span className="item-title">项目介绍:  </span>
+                        </div>
+                        <Input type="textarea" rows={6} />
+                    </div>
+                    
+                    <div className="clearfix">
+                        <div className="half-item">
+                            <span className="item-title">是否立项: </span>
+                            <Checkbox ></Checkbox>
+                        </div>
+                        <div className="half-item">
+                        	<span className="item-title">立项金额: </span>
+                            <Input style={{ width: 200 }}  />
+                        </div>
+                    </div>
+                    <div className="clearfix">
+                        <div className="half-item">
+                            <span className="item-title">是否后补助: </span>
+                            <Checkbox onChange={this.subsidyCheck}></Checkbox>
+                        </div>
+                    </div>
+                    <div className="clearfix">
+                    	<div className="half-item">
+                            <span className="item-title">选择咨询师:  </span>
+                            <Select placeholder="请选择咨询师" style={{ width: 200 }}
+                                onSelect={(e, n) => { this.state.consultant = e }}>
+                                {this.props.authorOption}
+                            </Select>
+                        </div>
+                    </div>
+                </Modal>
+            </div>
+        );
+    }
+});
+
+export default ApplyAdd;

+ 470 - 0
js/component/manageCenter/servicesManage/technology/applyChange.jsx

@@ -0,0 +1,470 @@
+import React from 'react';
+import { Icon, Form, Button, Input, Select, Spin, Table, DatePicker, message, Modal, Checkbox, Upload } from 'antd';
+import { cognizanceStateList } from '../../../dataDic.js';
+import { getCognizanceState, beforeUpload, getBase64 } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+class Avatar extends React.Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            imageUrl: ''
+        }
+    }
+    handleChange(info) {
+        if (!this.props.oid || this.props.oid === "") {
+            message.warning('请先选择公司!');
+            return;
+        };
+        if (info.file.status === 'done') {
+            // Get this url from response in real world.
+            getBase64(info.file.originFileObj, imageUrl => this.setState({ imageUrl }));
+            this.props.urlData(info.file.response.data);
+        }
+    }
+    render() {
+        const imageUrl = this.state.imageUrl;
+        return (
+            <Upload
+                className="avatar-uploader"
+                name="avatar"
+                showUploadList={false}
+                action={globalConfig.context + "/techservice/patent/patentFile"}
+                data={{ 'sign': this.props.name, 'oid': this.props.oid }}
+                beforeUpload={beforeUpload}
+                onChange={this.handleChange.bind(this)}
+            >
+                {
+                    imageUrl ?
+                        <img src={imageUrl} role="presentation" className="avatar" /> :
+                        <Icon type="plus" className="avatar-uploader-trigger" />
+                }
+            </Upload>
+        );
+    }
+};
+
+
+const ApplyChangeFrom = Form.create()(React.createClass({
+    loadData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/cognizanceDetail",
+            data: {
+                cid: this.props.data.cid,
+                uid: this.props.data.uid,
+                year: this.props.data.year
+            },
+            success: function (data) {
+                if (data.error.length || !data.data) {
+                    message.warning(data.error[0].message);
+                    return;
+                };
+                this.state.data = data.data;
+                this.state.cid = this.props.data.cid;
+                this.state.moneyTable = [{
+                    key: 1,
+                    year: '第一年',
+                    netAsset: data.data.netAsset1,
+                    salesRevenue: data.data.salesRevenue1,
+                    grossProfit: data.data.grossProfit1
+                }, {
+                    key: 2,
+                    year: '第二年',
+                    netAsset: data.data.netAsset2,
+                    salesRevenue: data.data.salesRevenue2,
+                    grossProfit: data.data.grossProfit2
+                }, {
+                    key: 3,
+                    year: '第三年',
+                    netAsset: data.data.netAsset3,
+                    salesRevenue: data.data.salesRevenue3,
+                    grossProfit: data.data.grossProfit3
+                }];
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getStateData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/cognizanceLog",
+            data: {
+                cid: this.props.data.cid
+            },
+            success: function (data) {
+                if (data.error.length || !data.data) {
+                    message.warning(data.error[0].message);
+                    return;
+                };
+                this.state.stateTable = [];
+                for (let i = 0; i < data.data.length; i++) {
+                    this.state.stateTable.push({
+                        key: i,
+                        recordTimeFormattedDate: data.data[i].recordTimeFormattedDate,
+                        state: data.data[i].state,
+                        principal: data.data[i].principal,
+                        comment: data.data[i].comment
+                    });
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false,
+            stateOption: [],
+            introduce:'',
+            projectCheck: 0,
+            subsidy: 0,
+            stateColumns: [{
+                title: '专利状态',
+                dataIndex: 'state',
+                key: 'state',
+                render: (text) => { return getCognizanceState(text) }
+            }, {
+                title: '处理时间',
+                dataIndex: 'recordTimeFormattedDate',
+                key: 'recordTimeFormattedDate',
+            }, {
+                title: '负责人',
+                dataIndex: 'principal',
+                key: 'principal',
+            }, {
+                title: '备注',
+                dataIndex: 'comment',
+                key: 'comment',
+            }],
+            stateTable: []
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        cognizanceStateList.map(function (item) {
+            _me.state.stateOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        this.loadData();
+        this.getStateData();
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (values.state || values.principal || values.recordTime || values.comment) {
+                if (!values.state && !values.principal && !values.recordTime) {
+                    message.warning("请填写完整的状态流转信息!");
+                    return;
+                };
+            };
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/api/admin/disposeCognizanceDetail",
+                    data: {
+                        id: this.props.data.cid,
+                        technicalField: values.technicalField,
+                        basicResearchCost: values.basicResearchCost,
+                        accident: values.accident,
+
+                        recordTimeFormattedDate: values.recordTime ? values.recordTime.format("YYYY-MM-DD") : undefined,
+                        state: values.state,
+                        principal: values.principal,
+                        comment: values.comment,
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.closeModal();
+                        this.props.form.resetFields();
+                        this.state.targetKeys = [];
+                        this.state.selectedKeys = [];
+                        this.props.spinState(false);
+                    } else {
+                        message.warning(data.error[0].message);
+                        this.props.spinState(false);
+                    }
+                }.bind(this));
+            }
+        });
+    },
+    componentWillReceiveProps(nextProps) {
+        if (!this.props.visible && nextProps.visible) {
+            this.getStateData();
+            this.loadData();
+        };
+        if (nextProps.data) {
+            this.state.xid = nextProps.data.pid;
+        }
+    },
+    projectEstablishmentCheck(e) {
+        if (e.target.checked == true) {
+            this.state.projectCheck = 1;
+        } else if (e.target.checked == false) {
+            this.state.projectCheck = 0;
+        };
+    },
+    subsidyCheck(e) {
+        if (e.target.checked == true) {
+            this.state.subsidy = 1;
+        } else if (e.target.checked == false) {
+            this.state.subsidy = 0;
+        };
+    },
+    avatarUrl(e) {
+        this.state.avatarUrl = e;
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const theData = this.state.data;
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        if (this.state.data) {
+            return (
+                <Form onSubmit={this.handleSubmit} id="highTechApply-form">
+                    <div className="clearfix">
+                        <div className="half-item">
+                            <span className="item-title">公司名称: </span>
+                            <span>{theData.unitName}</span>
+                        </div>
+                        <div className="half-item">
+                            <span className="item-title">公司组织机构代码: </span>
+                            <span>{theData.orgCode}</span>
+                        </div>
+                        <div className="half-item">
+                            <span className="item-title">公司地址: </span>
+                            <span>{theData.postalAddress}</span>
+                        </div>
+                        <div className="half-item">
+                            <span className="item-title">联系人: </span>
+                            <span>{theData.contacts}</span>
+                        </div>
+                    </div>
+
+                    <div className="clearfix">
+                        <FormItem className="third-item"
+                            {...formItemLayout}
+	                            label="科技部门"
+	                        >
+	                            {getFieldDecorator('technicalDepartment')(
+	                                <Select placeholder="选择科技部门">{this.props.authorOption}</Select>
+	                            )}
+	                 	</FormItem>
+                    </div>
+                    <div className="clearfix">
+                        <div className="half-item">
+                            <span className="item-title">派单信息: </span>
+                            <span>{theData.firmTotal}</span>
+                        </div>
+                    </div>
+                    <div className="clearfix">
+                    	<div className="half-item">
+	                        <FormItem
+		                        labelCol={{ span: 4 }}
+                        		wrapperCol={{ span: 12 }}
+		                        label="项目名称"
+		                    >
+		                        {getFieldDecorator('projectName')(
+		                            <Input />
+		                        )}
+		                    </FormItem>
+	                    </div>
+                    </div>
+                    <div className="clearfix">
+                    	<div className="half-item">
+	                        <FormItem
+		                        labelCol={{ span: 4 }}
+	                        	wrapperCol={{ span: 12 }}
+		                        label="项目类型"
+		                    >
+		                        {getFieldDecorator('projectType')(
+		                            <Input />
+		                        )}
+		                    </FormItem>
+	                    </div>
+                    </div>
+                    <div className="clearfix">
+                    	<div className="half-item">
+	                        <FormItem
+		                        labelCol={{ span: 4 }}
+	                        	wrapperCol={{ span: 12 }}
+		                        label="技术领域"
+		                    >
+		                        {getFieldDecorator('technicalField')(
+		                            <Input />
+		                        )}
+		                    </FormItem>
+		                </div>
+                    </div>
+                    <div className="clearfix">
+                     	<span className="item-title">项目简介: </span>
+                      	<Input type="textarea"
+                          	placeholder="多行输入"
+                         	value={this.state.introduce}
+                          	onChange={(e) => { this.setState({ introduce: e.target.value }); } }
+                          	rows={6} />
+                    </div>
+                    <div className="clearfix">
+                        <div className="half-item">
+                            <span className="item-title">是否立项: </span>
+                            <Checkbox onChange={this.projectEstablishmentCheck}></Checkbox>
+                        </div>
+                        <div className="half-item">
+                            <FormItem
+			                    {...formItemLayout}
+			                    label="立项金额"
+			                >
+			                    {getFieldDecorator('projectAmounts')(
+			                        <Input className="mini-input" />
+			                    )}
+			                </FormItem>
+                        </div>
+                    </div>
+                    <div className="clearfix">
+                        <div className="half-item">
+                            <span className="item-title">是否后补助: </span>
+                            <Checkbox onChange={this.subsidyCheck}></Checkbox>
+                        </div>
+                    </div>
+                    <div>
+                    	<FormItem
+			             	{...formItemLayout}
+			              	label="项目材料上传"
+			             	labelCol={{ span: 24 }}
+			           		wrapperCol={{ span: 12 }}
+			          	>
+			           		{getFieldDecorator('avatar')(
+			                 	<Avatar urlData={this.avatarUrl} name='patent_prory_statement' oid={theData.unitName} />
+			            	)}
+			          	</FormItem>
+                    </div>
+
+                    <div className="form-title">状态流转记录: </div>
+                    <Table pagination={false} dataSource={this.state.stateTable} columns={this.state.stateColumns} />
+                    <div className="clearfix">
+                        <FormItem className="third-item"
+                            {...formItemLayout}
+                            label="状态流转"
+                        >
+                            {getFieldDecorator('state')(
+                                <Select placeholder="选择一个状态">{this.state.stateOption}</Select>
+                            )}
+                        </FormItem>
+                        <FormItem className="third-item"
+                            labelCol={{ span: 6 }}
+                            wrapperCol={{ span: 12 }}
+                            label="处理时间"
+                        >
+                            {getFieldDecorator('recordTime')(
+                                <DatePicker />
+                            )}
+                        </FormItem>
+                        <FormItem className="third-item"
+                            {...formItemLayout}
+                            label="负责人"
+                        >
+                            {getFieldDecorator('principal')(
+                                <Select placeholder="选择负责人">{this.props.authorOption}</Select>
+                            )}
+                        </FormItem>
+                    </div>
+                    <FormItem
+                        labelCol={{ span: 2 }}
+                        wrapperCol={{ span: 12 }}
+                        label="备注"
+                    >
+                        {getFieldDecorator('comment')(
+                            <Input />
+                        )}
+                    </FormItem>
+                    <FormItem style={{ marginTop: '20px' }}>
+                        <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
+                        <Button type="ghost" style={{ marginLeft: '20px' }} onClick={this.props.closeModal}>取消</Button>
+                    </FormItem>
+                </Form >
+            );
+        } else {
+            return (<div></div>)
+        };
+    },
+}));
+
+const ApplyChange = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk() {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
+    render() {
+        return (
+            <div className="patent-addNew">
+                <Spin spinning={this.state.loading} className='spin-box'>
+                    <Modal title="编辑科技项目" visible={this.state.visible}
+                        onOk={this.handleOk} onCancel={this.handleCancel}
+                        width='1000px'
+                        footer=''
+                    >
+                        <ApplyChangeFrom
+                            visible={this.state.visible}
+                            authorOption={this.props.authorOption}
+                            data={this.props.data}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    }
+});
+
+export default ApplyChange;

+ 337 - 0
js/component/manageCenter/servicesManage/technology/applyManage.jsx

@@ -0,0 +1,337 @@
+import React from 'react';
+import { Icon, Button, Select, Spin, Table, message } from 'antd';
+import { provinceArr } from '../../../dataDic.js';
+import { companySearch, getTechnologyState } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import './technology.less';
+
+import ApplyAdd from './applyAdd.jsx';
+import ApplyChange from './applyChange.jsx';
+
+
+const ApplyManage = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admintechproject/listTechProject",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                province: this.state.province,
+                uid: this.state.unitName,
+            },
+            success: function (data) {
+                if (data.error.length || !data.data || !data.data.list) {
+                    message.warning(data.error[0].message);
+                    return;
+                }
+                for (let i = 0; i < data.data.list.length; i++) {
+                    let thisdata = data.data.list[i];
+                    switch (thisdata.contacts){
+                    	case 1:
+                    		thisdata.contacts = thisdata.firstContacts;
+                    		break;
+                    	case 2:
+                    		thisdata.contacts = thisdata.secondContacts;
+                    		break;
+                    	case 3:
+                    		thisdata.contacts = thisdata.thirdContacts;
+                    		break;
+                    }
+                    console.log(thisdata.contacts);
+                    this.state.data.push({
+                        key: i,
+                        uid: thisdata.uid,
+                        serialNumber: thisdata.serialNumber,
+                        province: thisdata.province,
+                        unitName: thisdata.unitName,
+                        contacts: thisdata.contacts,
+                        projectName: thisdata.projectName,
+                        projectCatagory: thisdata.projectCatagory,
+                        techField: thisdata.techField,
+                        state: thisdata.state,
+                        createTime: thisdata.createTimeFormattedDate,
+                        website: thisdata.website,
+                        accountNumber: thisdata.accountNumber,
+                        password: thisdata.password,
+                        consultant: thisdata.consultant
+                    });
+                };
+                this.state.pagination.current = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                this.setState({
+                    dataSource: this.state.data,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getAuthorList() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/getAdmin",
+            success: function (data) {
+                if (data.error.length || !data.data) {
+                    return;
+                };
+                let _me = this;
+                for (var item in data.data) {
+                    _me.state.authorOption.push(
+                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                    )
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getCompanyList() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/getUnitNames",
+            success: function (data) {
+                if (data.error.length || !data.data) {
+                    return;
+                };
+                let _me = this;
+                for (var item in data.data) {
+                    _me.state.companyOption.push(
+                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                    )
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            provinceOption: [],
+            companyOption: [],
+            authorOption: [],
+            selectedRows: [],
+            loading: false,
+            showAdd: false,
+            showDesc: false,
+            pagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.loadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return '共' + total + '条数据';
+                }
+            },
+            columns: [
+                {
+                    title: '编号',
+                    dataIndex: 'serialNumber',
+                    key: 'serialNumber'
+                }, {
+                    title: '省份',
+                    dataIndex: 'province',
+                    key: 'province'
+                }, {
+                    title: '公司',
+                    dataIndex: 'unitName',
+                    key: 'unitName'
+                }, {
+                    title: '联系方式',
+                    dataIndex: 'contacts',
+                    key: 'contacts'
+                }, {
+                    title: '项目名称',
+                    dataIndex: 'projectName',
+                    key: 'projectName'
+                }, {
+                    title: '项目类型',
+                    dataIndex: 'projectCatagory',
+                    key: 'projectCatagory'
+                },{
+                    title: '技术领域',
+                    dataIndex: 'techField',
+                    key: 'techField'
+                }, {
+                    title: '项目情况',
+                    dataIndex: 'state',
+                    key: 'state',
+                    render: text => { return getTechnologyState(text) },
+                },{
+                    title: '派单日',
+                    dataIndex: 'createTime',
+                    key: 'createTime'
+                }, {
+                    title: '网址',
+                    dataIndex: 'website',
+                    key: 'website'
+                }, {
+                    title: '用户名',
+                    dataIndex: 'accountNumber',
+                    key: 'accountNumber'
+                }, {
+                    title: '密码',
+                    dataIndex: 'password',
+                    key: 'password'
+                }, {
+                    title: '咨询师',
+                    dataIndex: 'consultant',
+                    key: 'consultant'
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        provinceArr.map(function (item) {
+            _me.state.provinceOption.push(
+                <Select.Option value={item} key={item}>{item}</Select.Option>
+            )
+        });
+        this.loadData();
+        this.getAuthorList();
+        this.getCompanyList();
+        //        this.getContactsList();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true
+        });
+    },
+    addClick() {
+        this.setState({
+            showAdd: true
+        });
+    },
+    delectRow() {
+        let deletedIds = [];
+        for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
+            let rowItem = this.state.selectedRows[idx];
+            if (rowItem.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteCognizance",
+            data: {
+                ids: deletedIds
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.setState({
+                    loading: false,
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.loadData();
+        }.bind(this));
+    },
+    closeDesc(e) {
+        this.state.showDesc = e;
+        this.loadData();
+    },
+    closeAdd(e) {
+        this.state.showAdd = e;
+        this.loadData();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.province = undefined;
+        this.state.unitName = undefined;
+        this.loadData();
+    },
+    render() {
+        return (
+            <div className="foster-content" >
+                <div className="content-title">
+                    <span>科技项目申报管理</span>
+                    <div className="foster-query" style={{ float: "right" }}>
+	                    <div>
+	                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+	                            onClick={this.addClick}>申请新科技项目<Icon type="plus" /></Button>
+	                    </div>
+	                </div>
+                </div>
+                
+                <div className="foster-query">
+                    <Select placeholder="选择省份"
+                        style={{ width: 200 }}
+                        value={this.state.province}
+                        showSearch
+                        filterOption={companySearch}
+                        onChange={(e) => { this.setState({ province: e }) }}>
+                        {this.state.provinceOption}
+                    </Select>
+                    <Select placeholder="选择公司"
+                        style={{ width: 200 }}
+                        value={this.state.unitName}
+                        showSearch
+                        filterOption={companySearch}
+                        onChange={(e) => { this.setState({ unitName: e }) }}>
+                        {this.state.companyOption}
+                    </Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                </div>
+                
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <ApplyChange
+                    data={this.state.RowData}
+                    authorOption={this.state.authorOption}
+                    showDesc={this.state.showDesc}
+                    closeDesc={this.closeDesc} />
+                <ApplyAdd
+                    authorOption={this.state.authorOption}
+                    companyOption={this.state.companyOption}
+                    showAdd={this.state.showAdd}
+                    closeAdd={this.closeAdd} />
+            </div >
+        );
+    }
+});
+
+export default ApplyManage;

+ 46 - 0
js/component/manageCenter/servicesManage/technology/content.jsx

@@ -0,0 +1,46 @@
+import React from 'react';
+import '../../content.less';
+import LeftTab from '../leftTab.jsx';
+
+import ApplyManage from './applyManage.jsx';
+import WebsiteManage from './websiteManage.jsx';
+
+
+const Content = React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            leftKey: 'comprehensive',
+        };
+    },
+    handlekey(key) {
+        this.setState({
+            leftKey: key,
+        });
+        window.location.hash = key;
+    },
+    componentWillMount(){
+        if ( window.location.hash ) {
+            this.handlekey(window.location.hash.substr(1));
+        };
+    },
+    render() {
+        return (
+            <div className="manage-content">
+                <LeftTab handlekey={this.handlekey} />
+                <div className="content-right">
+                    {(() => {
+                        switch (this.state.leftKey) {
+                            case 'applyManage':
+                                return <ApplyManage />;
+                            case 'websiteManage':
+                                return <WebsiteManage />;
+                        };
+                    })()}
+                </div>
+            </div>
+        )
+    }
+});
+
+export default Content;

+ 102 - 0
js/component/manageCenter/servicesManage/technology/technology.less

@@ -0,0 +1,102 @@
+.foster-content {
+    padding: 20px;
+    background: #fff;
+    .content-title {
+        height: 32px;
+        margin-bottom: 10px;
+        >span {
+            color: #333;
+            font-size: 16px;
+            margin-bottom: 10px;
+        }
+    }
+    .foster-query {
+        margin-bottom: 10px;
+        >input {
+            width: 180px;
+            margin-right: 20px;
+        }
+        >div {
+            margin-right: 20px;
+        }
+        button {
+            margin-right: 20px;
+        }
+        >span {
+            margin-left: 20px;
+            >span {
+                margin-left: 10px;
+            }
+        }
+    }
+}
+
+.ant-modal-body {
+    .half-item {
+        float: left;
+        width: 50%;
+        height: 36px;
+        margin-bottom: 10px;
+    }
+    .third-item {
+        float: left;
+        width: 33%;
+        height: 36px;
+        margin-bottom: 10px;
+        >p {
+            line-height: 30px;
+        }
+    }
+    .item-title {
+        line-height: 30px;
+        font-size: 14px;
+        color: #666;
+        min-width: 100px;
+        display: inline-block;
+    }
+    .form-title {
+        font-size: 16px;
+        color: #333;
+    }
+}
+
+#highTechApply-form {
+    >div {
+        margin-bottom: 10px;
+    }
+    .ant-form-item {
+        .ant-form-item-label {
+            text-align: left;
+            >label {
+                font-size: 14px;
+                color: #666;
+            }
+        }
+    }
+    .ant-form-item-required {
+        &:before {
+            display: none;
+        }
+    }
+}
+
+.avatar-uploader,
+    .avatar-uploader-trigger,
+    .avatar {
+        width: 150px;
+        height: 150px;
+    }
+    .avatar-uploader {
+        display: block;
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+    }
+    .avatar-uploader-trigger {
+        display: table-cell;
+        vertical-align: middle;
+        font-size: 28px;
+        color: #999;
+    }
+    
+textarea{margin-bottom: 10px;}

+ 132 - 0
js/component/manageCenter/servicesManage/technology/websiteAdd.jsx

@@ -0,0 +1,132 @@
+import React from 'react';
+import { Button, Input, Select, message, Modal } from 'antd';
+import { companySearch } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const WebsiteAdd = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showAdd
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk() {
+        this.setState({
+            loading: true
+        });
+        if (!this.state.unitName) {
+            message.warning('请选择一个公司!');
+            this.setState({
+                loading: false
+            });
+            return;
+        };
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admintechproject/disposeTechWebsite",
+            data: {
+                uid: this.state.unitName,
+                department: this.state.department,
+                website: this.state.website,
+                accountNumber: this.state.accountNumber,
+                password: this.state.password
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.setState({
+                    visible: false
+                });
+                this.props.closeAdd(false);
+            } else {
+                message.warning(data.error[0].message);
+                this.setState({
+                    loading: false
+                });
+            }
+        }.bind(this));
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeAdd(false);
+    },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
+    render() {
+        return (
+            <div className="cognizance-add">
+                <Modal title="添加科技部门网址" visible={this.state.visible}
+                    onOk={this.handleOk} onCancel={this.handleCancel}
+                    width='800px'
+                    footer={[
+                        <Button key="submit" type="primary" loading={this.state.loading} onClick={this.handleOk}>
+                            确认
+                            </Button>,
+                        <Button key="back" onClick={this.handleCancel}>
+                            取消
+                            </Button>,
+                    ]}
+                >
+                    <div className="clearfix" style={{ marginBottom: '10px' }}>
+                        <div className="half-item">
+                            <span className="item-title">选择公司:  </span>
+                            <Select
+                                placeholder="请选择公司"
+                                style={{ width: 200 }}
+                                showSearch
+                                filterOption={companySearch}
+                                onChange={(e)=>{ this.state.unitName = e;}}>
+                                {this.props.companyOption}
+                            </Select>
+                        </div>
+                    </div>
+                    <div className="clearfix">
+                    	<div className="half-item">
+                            <span className="item-title">科技部门名称:  </span>
+                            <Input value={this.state.department} onChange={(e) => { this.setState({ department: e.target.value }); }} style={{ width: 200 }} />
+                        </div>
+                    </div>
+
+                    <div className="clearfix">
+	                 	<div className="half-item">
+	                   		<span className="item-title">网址:  </span>
+	                     	<Input value={this.state.website} onChange={(e) => { this.setState({ website: e.target.value }); }} style={{ width: 200 }} />
+	                	</div>
+                    </div>
+                    <div className="clearfix">
+                    	<div className="half-item">
+	                   		<span className="item-title">账号:  </span>
+	                     	<Input value={this.state.accountNumber} onChange={(e) => { this.setState({ accountNumber: e.target.value }); }} style={{ width: 200 }} />
+	                	</div>
+	                </div>
+	                <div className="clearfix">
+                    	<div className="half-item">
+	                   		<span className="item-title">密码:  </span>
+	                     	<Input value={this.state.password} onChange={(e) => { this.setState({ password: e.target.value }); }} style={{ width: 200 }} />
+	                	</div>
+	                </div>
+                </Modal>
+            </div>
+        );
+    }
+});
+
+export default WebsiteAdd;
+
+

+ 349 - 0
js/component/manageCenter/servicesManage/technology/websiteChange.jsx

@@ -0,0 +1,349 @@
+import React from 'react';
+import { Icon, Form, Button, Input, Select, Spin, Table, DatePicker, message, Modal, Checkbox, Upload } from 'antd';
+import { cognizanceStateList } from '../../../dataDic.js';
+import { getCognizanceState, beforeUpload, getBase64 } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+class Avatar extends React.Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            imageUrl: ''
+        }
+    }
+    handleChange(info) {
+        if (!this.props.oid || this.props.oid === "") {
+            message.warning('请先选择公司!');
+            return;
+        };
+        if (info.file.status === 'done') {
+            // Get this url from response in real world.
+            getBase64(info.file.originFileObj, imageUrl => this.setState({ imageUrl }));
+            this.props.urlData(info.file.response.data);
+        }
+    }
+    render() {
+        const imageUrl = this.state.imageUrl;
+        return (
+            <Upload
+                className="avatar-uploader"
+                name="avatar"
+                showUploadList={false}
+                action={globalConfig.context + "/techservice/patent/patentFile"}
+                data={{ 'sign': this.props.name, 'oid': this.props.oid }}
+                beforeUpload={beforeUpload}
+                onChange={this.handleChange.bind(this)}
+            >
+                {
+                    imageUrl ?
+                        <img src={imageUrl} role="presentation" className="avatar" /> :
+                        <Icon type="plus" className="avatar-uploader-trigger" />
+                }
+            </Upload>
+        );
+    }
+};
+
+
+const WebsiteChangeFrom = Form.create()(React.createClass({
+    loadData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admintechproject/",
+            data: {
+                cid: this.props.data.cid,
+                uid: this.props.data.uid,
+                year: this.props.data.year
+            },
+            success: function (data) {
+                if (data.error.length || !data.data) {
+                    message.warning(data.error[0].message);
+                    return;
+                };
+                this.state.data = data.data;
+                this.state.cid = this.props.data.cid;
+                this.state.moneyTable = [{
+                    key: 1,
+                    year: '第一年',
+                    netAsset: data.data.netAsset1,
+                    salesRevenue: data.data.salesRevenue1,
+                    grossProfit: data.data.grossProfit1
+                }, {
+                    key: 2,
+                    year: '第二年',
+                    netAsset: data.data.netAsset2,
+                    salesRevenue: data.data.salesRevenue2,
+                    grossProfit: data.data.grossProfit2
+                }, {
+                    key: 3,
+                    year: '第三年',
+                    netAsset: data.data.netAsset3,
+                    salesRevenue: data.data.salesRevenue3,
+                    grossProfit: data.data.grossProfit3
+                }];
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getStateData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/cognizanceLog",
+            data: {
+                cid: this.props.data
+            },
+            success: function (data) {
+                if (data.error.length || !data.data) {
+                    message.warning(data.error[0].message);
+                    return;
+                };
+                this.state.stateTable = [];
+                for (let i = 0; i < data.data.length; i++) {
+                    this.state.stateTable.push({
+                        key: i,
+                        recordTimeFormattedDate: data.data[i].recordTimeFormattedDate,
+                        state: data.data[i].state,
+                        principal: data.data[i].principal,
+                        comment: data.data[i].comment
+                    });
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false,
+            stateOption: [],
+            introduce:'',
+            projectCheck: 0,
+            subsidy: 0,
+            stateColumns: [{
+                title: '专利状态',
+                dataIndex: 'state',
+                key: 'state',
+                render: (text) => { return getCognizanceState(text) }
+            }, {
+                title: '处理时间',
+                dataIndex: 'recordTimeFormattedDate',
+                key: 'recordTimeFormattedDate',
+            }, {
+                title: '负责人',
+                dataIndex: 'principal',
+                key: 'principal',
+            }, {
+                title: '备注',
+                dataIndex: 'comment',
+                key: 'comment',
+            }],
+            stateTable: []
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        cognizanceStateList.map(function (item) {
+            _me.state.stateOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        this.loadData();
+        this.getStateData();
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (values.state || values.principal || values.recordTime || values.comment) {
+                if (!values.state && !values.principal && !values.recordTime) {
+                    message.warning("请填写完整的状态流转信息!");
+                    return;
+                };
+            };
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/api/admin/disposeCognizanceDetail",
+                    data: {
+                        id: this.props.data.cid,
+                        technicalField: values.technicalField,
+                        basicResearchCost: values.basicResearchCost,
+                        accident: values.accident,
+
+                        recordTimeFormattedDate: values.recordTime ? values.recordTime.format("YYYY-MM-DD") : undefined,
+                        state: values.state,
+                        principal: values.principal,
+                        comment: values.comment,
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.closeModal();
+                        this.props.form.resetFields();
+                        this.state.targetKeys = [];
+                        this.state.selectedKeys = [];
+                        this.props.spinState(false);
+                    } else {
+                        message.warning(data.error[0].message);
+                        this.props.spinState(false);
+                    }
+                }.bind(this));
+            }
+        });
+    },
+    componentWillReceiveProps(nextProps) {
+        if (!this.props.visible && nextProps.visible) {
+            this.getStateData();
+            this.loadData();
+        };
+    },
+    projectEstablishmentCheck(e) {
+        if (e.target.checked == true) {
+            this.state.projectCheck = 1;
+        } else if (e.target.checked == false) {
+            this.state.projectCheck = 0;
+        };
+    },
+    subsidyCheck(e) {
+        if (e.target.checked == true) {
+            this.state.subsidy = 1;
+        } else if (e.target.checked == false) {
+            this.state.subsidy = 0;
+        };
+    },
+    avatarUrl(e) {
+        this.state.avatarUrl = e;
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const theData = this.state.data;
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        if (this.state.data) {
+            return (
+                <Form onSubmit={this.handleSubmit} id="highTechApply-form">
+                
+                	<div className="clearfix">
+                        <div className="half-item">
+                            <span className="item-title">选择公司:  </span>
+                            <Select
+                                placeholder="请选择公司"
+                                style={{ width: 200 }}
+                                showSearch
+                                onChange={(e)=>{ this.state.unitName = e;}}>
+                                {this.props.companyOption}
+                            </Select>
+                        </div>
+                    </div>
+                    <div className="clearfix">
+                    	<div className="half-item">
+                            <span className="item-title">科技部门名称:  </span>
+                            <Input value={this.state.department} onChange={(e) => { this.setState({ department: e.target.value }); }} style={{ width: 200 }} />
+                        </div>
+                    </div>
+
+                    <div className="clearfix">
+	                 	<div className="half-item">
+	                   		<span className="item-title">网址:  </span>
+	                     	<Input value={this.state.website} onChange={(e) => { this.setState({ website: e.target.value }); }} style={{ width: 200 }} />
+	                	</div>
+                    </div>
+                    <div className="clearfix">
+                    	<div className="half-item">
+	                   		<span className="item-title">账号:  </span>
+	                     	<Input value={this.state.accountNumber} onChange={(e) => { this.setState({ accountNumber: e.target.value }); }} style={{ width: 200 }} />
+	                	</div>
+	                </div>
+	                <div className="clearfix">
+                    	<div className="half-item">
+	                   		<span className="item-title">密码:  </span>
+	                     	<Input value={this.state.password} onChange={(e) => { this.setState({ password: e.target.value }); }} style={{ width: 200 }} />
+	                	</div>
+	                </div>
+	                
+	                
+                    
+                </Form >
+            );
+        } else {
+            return (<div></div>)
+        };
+    },
+}));
+
+const WebsiteChange = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk() {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
+    render() {
+        return (
+            <div className="patent-addNew">
+                <Spin spinning={this.state.loading} className='spin-box'>
+                    <Modal title="编辑科技部门网址" visible={this.state.visible}
+                        onOk={this.handleOk} onCancel={this.handleCancel}
+                        width='800px'
+                        footer=''
+                    >
+                        <WebsiteChangeFrom
+                            visible={this.state.visible}
+                            authorOption={this.props.authorOption}
+                            data={this.props.data}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    }
+});
+
+export default WebsiteChange;

+ 284 - 0
js/component/manageCenter/servicesManage/technology/websiteManage.jsx

@@ -0,0 +1,284 @@
+import React from 'react';
+import { Icon, Button, Select, Spin, Table, message } from 'antd';
+import { provinceArr } from '../../../dataDic.js';
+import { companySearch } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import './technology.less';
+
+import WebsiteAdd from './websiteAdd.jsx';
+import WebsiteChange from './websiteChange.jsx';
+
+const Cognizance = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admintechproject/listTechWebsite",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                province: this.state.province,
+                uid: this.state.unitName,
+            },
+            success: function (data) {
+                if (data.error.length || !data.data || !data.data.list) {
+                    message.warning(data.error[0].message);
+                    return;
+                }
+                for (let i = 0; i < data.data.list.length; i++) {
+                    let thisdata = data.data.list[i];
+                    this.state.data.push({
+                        key: i,
+                        uid: thisdata.uid,
+                        unitName: thisdata.unitName,
+						department: thisdata.department,
+						webSite: thisdata.website,
+						userName: thisdata.accountNumber,
+						password: thisdata.password
+                    });
+                };
+                this.state.pagination.current = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                this.setState({
+                    dataSource: this.state.data,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getAuthorList() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/getAdmin",
+            success: function (data) {
+                if (data.error.length || !data.data) {
+                    return;
+                };
+                let _me = this;
+                for (var item in data.data) {
+                    _me.state.authorOption.push(
+                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                    )
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getCompanyList() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/getUnitNames",
+            success: function (data) {
+                if (data.error.length || !data.data) {
+                    return;
+                };
+                let _me = this;
+                for (var item in data.data) {
+                    _me.state.companyOption.push(
+                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                    )
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            provinceOption: [],
+            companyOption: [],
+            authorOption: [],
+            selectedRows: [],
+            loading: false,
+            showAdd: false,
+            showDesc: false,
+            pagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.loadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return '共' + total + '条数据';
+                }
+            },
+            columns: [
+                {
+                    title: '公司',
+                    dataIndex: 'unitName',
+                    key: 'unitName'
+                }, {
+                    title: '科技单位',
+                    dataIndex: 'department',
+                    key: 'department'
+                }, {
+                    title: '网址',
+                    dataIndex: 'webSite',
+                    key: 'webSite'
+                }, {
+                    title: '用户名',
+                    dataIndex: 'userName',
+                    key: 'userName'
+                }, {
+                    title: '密码',
+                    dataIndex: 'password',
+                    key: 'password'
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        provinceArr.map(function (item) {
+            _me.state.provinceOption.push(
+                <Select.Option value={item} key={item}>{item}</Select.Option>
+            )
+        });
+        this.loadData();
+        this.getAuthorList();
+        this.getCompanyList();
+        //        this.getContactsList();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true
+        });
+    },
+    addClick() {
+        this.setState({
+            showAdd: true
+        });
+    },
+    delectRow() {
+        let deletedIds = [];
+        for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
+            let rowItem = this.state.selectedRows[idx];
+            if (rowItem.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteCognizance",
+            data: {
+                ids: deletedIds
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.setState({
+                    loading: false,
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.loadData();
+        }.bind(this));
+    },
+    closeDesc(e) {
+        this.state.showDesc = e;
+        this.loadData();
+    },
+    closeAdd(e) {
+        this.state.showAdd = e;
+        this.loadData();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.province = undefined;
+        this.state.unitName = undefined;
+        this.loadData();
+    },
+    render() {
+        return (
+            <div className="foster-content" >
+                <div className="content-title">
+                    <span>科技单位网址管理</span>
+                    <div className="foster-query" style={{ float: "right" }}>
+	                    <div>
+	                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+	                            onClick={this.addClick}>创建新单位网址<Icon type="plus" /></Button>
+	                    </div>
+	                </div>
+                </div>
+                
+                <div className="foster-query">
+                    <Select placeholder="选择省份"
+                        style={{ width: 200 }}
+                        value={this.state.province}
+                        showSearch
+                        filterOption={companySearch}
+                        onChange={(e) => { this.setState({ province: e }) }}>
+                        {this.state.provinceOption}
+                    </Select>
+                    <Select placeholder="选择公司"
+                        style={{ width: 200 }}
+                        value={this.state.unitName}
+                        showSearch
+                        filterOption={companySearch}
+                        onChange={(e) => { this.setState({ unitName: e }) }}>
+                        {this.state.companyOption}
+                    </Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                </div>
+                
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <WebsiteChange
+                    data={this.state.RowData}
+                    authorOption={this.state.authorOption}
+                    companyOption={this.state.companyOption}
+                    showDesc={this.state.showDesc}
+                    closeDesc={this.closeDesc} />
+                <WebsiteAdd
+                    authorOption={this.state.authorOption}
+                    companyOption={this.state.companyOption}
+                    showAdd={this.state.showAdd}
+                    closeAdd={this.closeAdd} />
+            </div >
+        );
+    }
+});
+
+export default Cognizance;

+ 27 - 2
js/component/tools.js

@@ -12,7 +12,9 @@ import {
     intellectualGetList,
     conversionFormList,
     annualReportStateList,
-    cognizanceStateList
+    cognizanceStateList,
+    technologyStateList,
+    copyrightStateList
 } from './dataDic.js';
 
 module.exports = {
@@ -275,10 +277,33 @@ module.exports = {
             return theType;
         }
     },
+    getTechnologyState: function (e) {
+        if (e) {
+            let theType = '';
+            technologyStateList.map(function (item) {
+                if (item.value == e) {
+                    theType = item.key;
+                };
+            });
+            return theType;
+        }
+    },
+    getCopyrightState: function (e) {
+        if (e) {
+            let theType = '';
+            copyrightStateList.map(function (item) {
+                if (item.value == e) {
+                    theType = item.key;
+                };
+            });
+            return theType;
+        }
+    },
     downloadFile: function (path, fileName) {
         window.open(globalConfig.context + '/open/downloadFile?path=' + path + '&fileName=' + fileName)
     },
     companySearch(input, option) {
         return option.props.children.indexOf(input) >= 0
-    }
+    },
+
 }

+ 1 - 1
package.json

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

+ 6 - 0
webpack.config.js

@@ -114,6 +114,12 @@ module.exports = (function () {
             filename: 'admin/servicesManage/highTech.html',
             template: './template/template.html',
             chunks: ['admin/servicesManage/highTech', 'vendors']
+        }),
+        new HtmlWebpackPlugin({
+            title: '管理员-科技服务管理-科技',
+            filename: 'admin/servicesManage/technology.html',
+            template: './template/template.html',
+            chunks: ['admin/servicesManage/technology', 'vendors']
         })
     ];
     if (!isDev) {