Browse Source

日常提交,到管理端高企培育

yee 8 years ago
parent
commit
b3b56bec77
82 changed files with 8371 additions and 402 deletions
  1. 1 1
      build/admin/index.css
  2. 1 0
      build/admin/servicesManage/copyright.css
  3. 32 0
      build/admin/servicesManage/copyright.html
  4. 44 0
      build/admin/servicesManage/copyright.js
  5. 1 0
      build/admin/servicesManage/highTech.css
  6. 32 0
      build/admin/servicesManage/highTech.html
  7. 44 0
      build/admin/servicesManage/highTech.js
  8. 1 1
      build/admin/servicesManage/patent.css
  9. 23 23
      build/admin/servicesManage/patent.js
  10. 1 1
      build/admin/userManage.css
  11. 21 21
      build/admin/userManage.js
  12. 1 1
      build/user/account/index.css
  13. 2 2
      build/user/account/index.js
  14. 1 1
      build/user/account/services.css
  15. 29 28
      build/user/account/services.js
  16. 1 1
      build/user/account/set.css
  17. 23 23
      build/user/account/set.js
  18. 6 6
      build/user/certify.js
  19. 10 10
      build/user/groupCertify.js
  20. 1 1
      build/user/index.js
  21. 1 1
      build/user/login.css
  22. 9 8
      build/user/login.js
  23. 1 1
      build/user/signIn.css
  24. 11 11
      build/user/signIn.js
  25. 7 7
      build/vendors.js
  26. BIN
      image/218894389504034269.jpg
  27. BIN
      image/logo.jpg
  28. 16 0
      js/admin/servicesManage/copyright.js
  29. 16 0
      js/admin/servicesManage/highTech.js
  30. 33 33
      js/component/account/leftTab.less
  31. 438 0
      js/component/account/services/achievement.jsx
  32. 41 6
      js/component/account/services/activity.jsx
  33. 4 2
      js/component/account/services/activity.less
  34. 25 3
      js/component/account/services/activityCostList.jsx
  35. 9 0
      js/component/account/services/content.jsx
  36. 102 45
      js/component/account/services/finance.jsx
  37. 352 0
      js/component/account/services/honorList.jsx
  38. 24 2
      js/component/account/services/intellectualDesc.jsx
  39. 26 2
      js/component/account/services/leftTab.jsx
  40. 458 0
      js/component/account/services/orgTechCenter.jsx
  41. 4 7
      js/component/account/services/ratepay.jsx
  42. 25 3
      js/component/account/services/techProduct.jsx
  43. 27 0
      js/component/account/services/techProduct.less
  44. 15 6
      js/component/account/set/hrSituation.jsx
  45. 21 0
      js/component/dataDic.js
  46. 4 5
      js/component/login/login.less
  47. 3 2
      js/component/login/loginTop.jsx
  48. 1 1
      js/component/manageCenter/index/leftTab.jsx
  49. 0 25
      js/component/manageCenter/index/leftTab.less
  50. 33 33
      js/component/manageCenter/leftTab.less
  51. 233 0
      js/component/manageCenter/servicesManage/highTech/HighTechApply.jsx
  52. 46 0
      js/component/manageCenter/servicesManage/highTech/content.jsx
  53. 129 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/ablt.jsx
  54. 39 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/ablt.less
  55. 438 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/achievement.jsx
  56. 555 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/activity.jsx
  57. 51 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/activity.less
  58. 626 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/activityCostList.jsx
  59. 16 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/activityCostList.less
  60. 98 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/content.jsx
  61. 53 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/content.less
  62. 493 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/finance.jsx
  63. 352 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/honorList.jsx
  64. 528 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/hrSituation.jsx
  65. 26 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/hrSituation.less
  66. 218 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectual.jsx
  67. 57 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectual.less
  68. 244 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectualDesc.jsx
  69. 458 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/orgTechCenter.jsx
  70. 433 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/ratepay.jsx
  71. 337 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/standard.jsx
  72. 32 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/standard.less
  73. 540 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/techProduct.jsx
  74. 27 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/techProduct.less
  75. 242 0
      js/component/manageCenter/servicesManage/highTech/highTechFoster.jsx
  76. 32 0
      js/component/manageCenter/servicesManage/highTech/highTechFoster.less
  77. 38 35
      js/component/manageCenter/servicesManage/leftTab.jsx
  78. 1 1
      js/component/manageCenter/userManage/content.jsx
  79. 0 41
      js/component/manageCenter/userManage/leftTab.less
  80. 13 1
      js/component/tools.js
  81. 20 0
      webpack.config.js
  82. 15 1
      webpack.config.pro.js

File diff suppressed because it is too large
+ 1 - 1
build/admin/index.css


File diff suppressed because it is too large
+ 1 - 0
build/admin/servicesManage/copyright.css


+ 32 - 0
build/admin/servicesManage/copyright.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <title>
+        管理员-科技服务管理-软著
+    </title>
+    <script>
+        // window.userData = {
+        //     mobile: "13600000000",
+        //     nickname: "Lina",
+        //     number: "80000",
+        //     type: "0",
+        //     email: "test@aft.com",
+        //     createTime: "123456789000",
+        //     lvl: "0"
+        // }
+        // window.globalConfig = {
+        //     context: "//aft.hnzhiming.com:8080/aft",
+        //     staticHost: "//aft.hnzhiming.com",
+        //     uploadPath: "/data/wwwroot/aft/upload",
+        //     uploadPrivatePath: "/data/upload"
+        // }
+    </script>
+<link href="../../admin/servicesManage/copyright.css" rel="stylesheet"></head>
+
+<body>
+    <div id="root"></div>
+<script type="text/javascript" src="../../vendors.js"></script><script type="text/javascript" src="../../admin/servicesManage/copyright.js"></script></body>
+
+</html>

File diff suppressed because it is too large
+ 44 - 0
build/admin/servicesManage/copyright.js


File diff suppressed because it is too large
+ 1 - 0
build/admin/servicesManage/highTech.css


+ 32 - 0
build/admin/servicesManage/highTech.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <title>
+        管理员-科技服务管理-高企
+    </title>
+    <script>
+        // window.userData = {
+        //     mobile: "13600000000",
+        //     nickname: "Lina",
+        //     number: "80000",
+        //     type: "0",
+        //     email: "test@aft.com",
+        //     createTime: "123456789000",
+        //     lvl: "0"
+        // }
+        // window.globalConfig = {
+        //     context: "//aft.hnzhiming.com:8080/aft",
+        //     staticHost: "//aft.hnzhiming.com",
+        //     uploadPath: "/data/wwwroot/aft/upload",
+        //     uploadPrivatePath: "/data/upload"
+        // }
+    </script>
+<link href="../../admin/servicesManage/highTech.css" rel="stylesheet"></head>
+
+<body>
+    <div id="root"></div>
+<script type="text/javascript" src="../../vendors.js"></script><script type="text/javascript" src="../../admin/servicesManage/highTech.js"></script></body>
+
+</html>

File diff suppressed because it is too large
+ 44 - 0
build/admin/servicesManage/highTech.js


File diff suppressed because it is too large
+ 1 - 1
build/admin/servicesManage/patent.css


File diff suppressed because it is too large
+ 23 - 23
build/admin/servicesManage/patent.js


File diff suppressed because it is too large
+ 1 - 1
build/admin/userManage.css


File diff suppressed because it is too large
+ 21 - 21
build/admin/userManage.js


File diff suppressed because it is too large
+ 1 - 1
build/user/account/index.css


File diff suppressed because it is too large
+ 2 - 2
build/user/account/index.js


File diff suppressed because it is too large
+ 1 - 1
build/user/account/services.css


File diff suppressed because it is too large
+ 29 - 28
build/user/account/services.js


File diff suppressed because it is too large
+ 1 - 1
build/user/account/set.css


File diff suppressed because it is too large
+ 23 - 23
build/user/account/set.js


File diff suppressed because it is too large
+ 6 - 6
build/user/certify.js


File diff suppressed because it is too large
+ 10 - 10
build/user/groupCertify.js


+ 1 - 1
build/user/index.js

@@ -1 +1 @@
-webpackJsonp([9],[function(e,t,n){"use strict";function u(e){return e&&e.__esModule?e:{default:e}}var l=n(1),d=u(l),r=n(28),a=u(r);a.default.render(d.default.createElement("div",null,d.default.createElement("span",null,"this is user-index")),document.getElementById("root"))}]);
+webpackJsonp([11],[function(e,t,n){"use strict";function u(e){return e&&e.__esModule?e:{default:e}}var l=n(1),d=u(l),r=n(28),a=u(r);a.default.render(d.default.createElement("div",null,d.default.createElement("span",null,"this is user-index")),document.getElementById("root"))}]);

File diff suppressed because it is too large
+ 1 - 1
build/user/login.css


File diff suppressed because it is too large
+ 9 - 8
build/user/login.js


File diff suppressed because it is too large
+ 1 - 1
build/user/signIn.css


File diff suppressed because it is too large
+ 11 - 11
build/user/signIn.js


File diff suppressed because it is too large
+ 7 - 7
build/vendors.js


BIN
image/218894389504034269.jpg


BIN
image/logo.jpg


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

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

+ 33 - 33
js/component/account/leftTab.less

@@ -5,42 +5,42 @@
         padding-top: 40px;
         float: left;
         border-right: none;
-        background: #e8f2fc;
+        //background: #e8f2fc;
         .ant-menu-submenu {
             .ant-menu-submenu-title {
-                padding: 0!important;
-                margin: 0;
-                border-right: none;
-                text-align: center;
-                font-size: 18px;
-                color: #4466bf;
-                background: #d5e4f7;
-                border-top: 1px solid #f2f8fd;
-                border-bottom: 1px solid #c0d2e4;
-                &:after {
-                    font-size: 24px;
-                } 
+                //         padding: 0!important;
+                //         margin: 0;
+                //         border-right: none;
+                //         text-align: center;
+                font-size: 16px;
+                //         color: #4466bf;
+                //         background: #d5e4f7;
+                //         border-top: 1px solid #f2f8fd;
+                //         border-bottom: 1px solid #c0d2e4;
+                //         &:after {
+                //             font-size: 24px;
+                //         } 
             }
         }
-        .ant-menu-submenu-selected {
-            .ant-menu-submenu-title {
-                background: #fff;
-            }
-        }
-        .ant-menu-item {
-            padding: 0!important;
-            text-align: center;
-            background: #fafafa;
-            font-size: 14px;
-            color: #333;
-            border-bottom: 1px solid #c0d2e4;
-        }
-        .ant-menu-item-selected {
-            background: #fff;
-            color: #4466bf;
-            font-size: 16px;
-            border-left: 3px solid #58a3ff;
-            border-right: none;
-        }
+        // .ant-menu-submenu-selected {
+        //     .ant-menu-submenu-title {
+        //         background: #fff;
+        //     }
+        // }
+        // .ant-menu-item {
+        //     padding: 0!important;
+        //     text-align: center;
+        //     background: #fafafa;
+        //     font-size: 14px;
+        //     color: #333;
+        //     border-bottom: 1px solid #c0d2e4;
+        // }
+        // .ant-menu-item-selected {
+        //     background: #fff;
+        //     color: #4466bf;
+        //     font-size: 16px;
+        //     border-left: 3px solid #58a3ff;
+        //     border-right: none;
+        //}
     }
 }

+ 438 - 0
js/component/account/services/achievement.jsx

@@ -0,0 +1,438 @@
+import React from 'react';
+import { Icon, Form, Button, Input, Spin, Table, message, Select, Modal, InputNumber, Upload } from 'antd';
+import './techProduct.less';
+import { getConversionForm, beforeUploadFile } from '../../tools.js';
+import { conversionFormList, technicalSourceList } from '../../dataDic.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const AchievementDescFrom = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            yearOption: [],
+            conversionFormOption: [],
+            technicalSourceOption: []
+        };
+    },
+    componentWillMount() {
+        let d = new Date();
+        let _me = this;
+        d = d.getFullYear();
+        for (let i = d; i > d - 20; i--) {
+            _me.state.yearOption.push(
+                <Select.Option value={i.toString()} key={i}>{i}</Select.Option>
+            )
+        };
+        conversionFormList.map(function (item) {
+            _me.state.conversionFormOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        technicalSourceList.map(function (item) {
+            _me.state.technicalSourceOption.push(
+                <Select.Option value={item.key} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        if (this.props.activityNumberList && this.props.activityNumberList.length) {
+            for (let i = 0; i < this.props.activityNumberList.length; i++) {
+                _me.state.technicalSourceOption.push(
+                    <Select.Option value={this.props.activityNumberList[i].activityNumber}
+                        key={this.props.activityNumberList[i].uid}>
+                        {this.props.activityNumberList[i].activityName}-{this.props.activityNumberList[i].activityNumber}
+                    </Select.Option>
+                )
+            };
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/cognizance/disposeAchievement",
+                    data: {
+                        id: this.props.data.id,
+                        achievementName: values.achievementName,
+                        source: values.source,
+                        conversionForm: values.conversionForm,
+                        conversionResult: values.conversionResult,
+                        year: this.state.year,
+                        enclosureUrl: this.state.enclosureUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.closeModal();
+                        this.props.spinState(false);
+                        this.props.form.resetFields();
+                    } 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.props.data;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 16 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} className="activityCost-form">
+                <div className="activityCost-title"><span>年份: </span>
+                    {
+                        theData.year ? <span>{theData.year}</span> :
+                            <Select placeholder="请选择年份" style={{ width: 200 }}
+                                onSelect={(e, n) => { this.state.year = e }}>
+                                {this.state.yearOption}
+                            </Select>
+                    }
+                </div>
+                <div className="clearfix">
+                    <FormItem
+                        {...formItemLayout}
+                        label="成果名称"
+                    >
+                        {getFieldDecorator('achievementName', {
+                            rules: [{ type: 'string', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.achievementName
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="成果来源"
+                    >
+                        {getFieldDecorator('source', {
+                            rules: [{ type: 'string', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.source
+                        })(
+                            <Select placeholder="请选择成果来源" style={{ width: 200 }}>
+                                {this.state.technicalSourceOption}
+                            </Select>
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="转化形式"
+                    >
+                        {getFieldDecorator('conversionForm', {
+                            rules: [{ type: 'string', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.conversionForm
+                        })(
+                            <Select placeholder="请选择转化形式" style={{ width: 200 }}>
+                                {this.state.conversionFormOption}
+                            </Select>
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="转化结果"
+                    >
+                        {getFieldDecorator('conversionResult', {
+                            rules: [{ type: 'string', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.conversionResult
+                        })(
+                            <Input type="textarea" rows={6} />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'enclosure' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.enclosureUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传文件 </Button>
+                    </Upload>
+                </div>
+                <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 AchievementDesc = 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=''
+                    >
+                        <AchievementDescFrom
+                            data={this.props.data}
+                            activityNumberList={this.props.activityNumberList}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+
+const Achievement = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.when($.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/achievementList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+            }
+        }), $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/activityNumber",
+        })).done((data1, data2) => {
+            let data = data1[0];
+            let activityNumber = data2[0];
+            if (data.error.length || !data.data || !data.data.list) {
+                message.warning(data.error[0].message);
+                return;
+            };
+            if (activityNumber.error.length || !activityNumber.data) {
+                message.warning(activityNumber.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,
+                    id:thisdata.id,
+                    uid: thisdata.uid,
+                    achievementName: thisdata.achievementName,
+                    source: thisdata.source,
+                    conversionForm: thisdata.conversionForm,
+                    conversionResult: thisdata.conversionResult,
+                    year: thisdata.year,
+                    enclosureUrl: thisdata.enclosureUrl,
+                });
+            };
+            this.state.activityNumberList = activityNumber.data;
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'year',
+                    key: 'year'
+                }, {
+                    title: '成果名称',
+                    dataIndex: 'achievementName',
+                    key: 'achievementName'
+                }, {
+                    title: '成果来源',
+                    dataIndex: 'source',
+                    key: 'source',
+                }, {
+                    title: '转化形式',
+                    dataIndex: 'conversionForm',
+                    key: 'conversionForm',
+                    render: (text) => { return getConversionForm(text) }
+                }, {
+                    title: '转化结果',
+                    dataIndex: 'conversionResult',
+                    key: 'conversionResult',
+                }, {
+                    title: '相关附件',
+                    dataIndex: 'enclosureUrl',
+                    key: 'enclosureUrl',
+                    render: (text) => {
+                        <a href="" onClick={() => {
+                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + text + "&sign=" + "type")
+                        }}></a>
+                    }
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteAchievement",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        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="user-content" >
+                <div className="content-title">
+                    <span>科技成果转化</span>
+                </div>
+                <div className="user-search">
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <AchievementDesc
+                    data={this.state.RowData}
+                    activityNumberList={this.state.activityNumberList}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default Achievement;

+ 41 - 6
js/component/account/services/activity.jsx

@@ -1,7 +1,7 @@
 import React from 'react';
-import { Icon, Button, Input, Spin, Table, message, Select, Modal, DatePicker, Cascader, Transfer, InputNumber } from 'antd';
+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 } from '../../tools.js';
+import { getTechField, getTechnicalSource, beforeUploadFile } from '../../tools.js';
 import './activity.less';
 import moment from 'moment';
 import ajax from 'jquery/src/ajax/xhr.js';
@@ -42,7 +42,9 @@ const ActivityDesc = React.createClass({
                 thirdYearExpenditure: this.state.thirdYearExpenditure,
                 implement: this.state.implement,
                 technologyInnovation: this.state.technologyInnovation,
-                achievement: this.state.achievement
+                achievement: this.state.achievement,
+                participant: this.state.participant,
+                proofUrl: this.state.proofUrl
             },
             success: function (data) {
                 if (data.data) {
@@ -160,9 +162,9 @@ const ActivityDesc = React.createClass({
                                 showSearch
                             />,
                         </div>
-                        <div>
+                        <div className="half-div">
                             <p>技术来源:</p>
-                            <Select placeholder="选择技术来源" style={{ width: 240 }}
+                            <Select placeholder="选择技术来源" style={{ width: 230 }}
                                 value={this.state.technicalSource}
                                 onChange={(e) => { this.setState({ technicalSource: e }) }}>
                                 {
@@ -172,7 +174,12 @@ const ActivityDesc = React.createClass({
                                 }
                             </Select>
                         </div>
-                        <div>
+                        <div className="half-div">
+                            <p>参与人员:</p>
+                            <InputNumber value={this.state.participant}
+                                onChange={(e) => { this.setState({ participant: e.target.value }); }} />
+                        </div>
+                        <div style={{ marginTop: '10px' }}>
                             <p>知识产权编号:</p>
                             <Transfer
                                 dataSource={this.props.mockData}
@@ -252,6 +259,34 @@ const ActivityDesc = React.createClass({
                                     }} />
                             </div>
                         </div>
+                        <Select style={{ width: 120 }}
+                        placeholder='请选择立项类型'
+                        value={this.state.lixiang}
+                        onChange={(e)=>{this.setState({lixiang:e});}}>
+                            <Select.Option value='0'>内部立项</Select.Option>
+                            <Select.Option value='1'>外部立项</Select.Option>
+                        </Select>
+                        <div style={{ width: '50%' }}>
+                            <Upload
+                                name="ratepay"
+                                action={globalConfig.context + "/techservice/cognizance/upload"}
+                                data={{ 'sign': this.props.year + 'proof' }}
+                                beforeUpload={beforeUploadFile}
+                                onChange={(info) => {
+                                    if (info.file.status !== 'uploading') {
+                                        console.log(info.file, info.fileList);
+                                    }
+                                    if (info.file.status === 'done') {
+                                        message.success(`${info.file.name} 文件上传成功!`);
+                                        this.state.proofUrl = info.file.response.data;
+                                    } else if (info.file.status === 'error') {
+                                        message.error(`${info.file.name} 文件上传失败。`);
+                                    }
+                                }}
+                            >
+                                <Button><Icon type="upload" /> 上传立项证明材料 </Button>
+                            </Upload>
+                        </div>
                     </Modal>
                 </div>
             );

+ 4 - 2
js/component/account/services/activity.less

@@ -25,7 +25,8 @@
 .admin-desc-content {
     .ant-modal-body {
         >div {
-            margin-top: 10px;
+            margin-top: 0px;
+            margin-bottom: 10px;
             p {
                 margin: 6px 0;
             }
@@ -34,7 +35,8 @@
     .half-div {
         width: 50%;
         float: left;
-        margin-top: 10px;
+        margin-top: 0px;
+        margin-bottom: 10px;
         >span {
             display: inline-block;
             width: 100px;

+ 25 - 3
js/component/account/services/activityCostList.jsx

@@ -1,6 +1,7 @@
 import React from 'react';
-import { Icon, Form, Button, Input, Spin, Table, message, Select, Modal, DatePicker, InputNumber } from 'antd';
+import { Icon, Form, Upload, Button, Input, Spin, Table, message, Select, Modal, DatePicker, InputNumber } from 'antd';
 import './activityCostList.less';
+import { beforeUploadFile } from '../../tools.js';
 import moment from 'moment';
 import ajax from 'jquery/src/ajax/xhr.js';
 import $ from 'jquery/src/ajax';
@@ -30,10 +31,10 @@ 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(){
+    componentDidMount() {
         this.allCostCount();
         this.setState({
-            loading:false
+            loading: false
         });
     },
     componentWillReceiveProps() {
@@ -262,6 +263,27 @@ const ActivityDescFrom = Form.create()(React.createClass({
                             )}
                     </FormItem>
                 </div>
+                <div style={{ marginTop:'20px',width: '50%' }}>
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'proof' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.proofUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传台账 </Button>
+                    </Upload>
+                </div>
                 <FormItem style={{ marginTop: '20px' }}>
                     <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
                     <Button type="ghost" style={{ marginLeft: '20px' }} onClick={this.props.closeModal}>取消</Button>

+ 9 - 0
js/component/account/services/content.jsx

@@ -10,6 +10,9 @@ import ActivityCostList from './activityCostList';
 import TechProduct from './techProduct';
 import Ratepay from './ratepay';
 import Finance from './finance';
+import Achievement from './achievement';
+import HonorList from './honorList';
+import OrgTechCenter from './orgTechCenter';
 
 const Content = React.createClass({
     getInitialState() {
@@ -53,6 +56,12 @@ const Content = React.createClass({
                                 return <Ratepay />;
                             case 'finance':
                                 return <Finance />;
+                            case 'achievement':
+                                return <Achievement />;
+                            case 'honorList':
+                                return <HonorList />;
+                            case 'orgTechCenter':
+                                return <OrgTechCenter />
                         };
                     })()}
                 </div>

+ 102 - 45
js/component/account/services/finance.jsx

@@ -34,18 +34,22 @@ const FinanceDescFrom = Form.create()(React.createClass({
                     method: "POST",
                     dataType: "json",
                     crossDomain: false,
-                    url: globalConfig.context + "/techservice/cognizance/disposeRatepay",
+                    url: globalConfig.context + "/techservice/cognizance/disposeFinance",
                     data: {
                         id: this.props.data.id,
-                        operatingIncome: values.operatingIncome,
-                        managementCost: values.managementCost,
-                        operatingProfit: values.operatingProfit,
-                        nonOperatingIncome: values.nonOperatingIncome,
-                        nonTaxableIncome: values.nonTaxableIncome,
-                        taxExemptIncome: values.taxExemptIncome,
-                        subsidyIncome: values.subsidyIncome,
-                        year: this.state.year,
-                        taxReturnUrl: this.state.ratepayUrl,
+                        mainBusinessIncome: values.mainBusinessIncome,
+                        managementCost:values.managementCost,
+                        operatingProfit:values.operatingProfit,
+                        variousTax:values.variousTax,
+                        currentAsset:values.currentAsset,
+                        netFixedAsset:values.netFixedAsset,
+                        totalAsset:values.totalAsset,
+                        netAsset:values.netAsset,
+                        grossProfit:values.grossProfit,
+                        netProfit:values.netProfit,
+                        salesRevenue:values.salesRevenue,
+                        year:this.state.year,
+                        financeUrl: this.state.financeUrl
                     }
                 }).done(function (data) {
                     if (!data.error.length) {
@@ -84,11 +88,11 @@ const FinanceDescFrom = Form.create()(React.createClass({
                 <div className="clearfix">
                     <FormItem className="half-item"
                         {...formItemLayout}
-                        label="营业收入(万元)"
+                        label="营业收入(万元)"
                     >
-                        {getFieldDecorator('operatingIncome', {
+                        {getFieldDecorator('mainBusinessIncome', {
                             rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
-                            initialValue: theData.operatingIncome
+                            initialValue: theData.mainBusinessIncome
                         })(
                             <InputNumber />
                             )}
@@ -117,44 +121,85 @@ const FinanceDescFrom = Form.create()(React.createClass({
                     </FormItem>
                     <FormItem className="half-item"
                         {...formItemLayout}
-                        label="营业外收入(万元)"
+                        label="支付的各项税费(万元)"
                     >
-                        {getFieldDecorator('nonOperatingIncome', {
+                        {getFieldDecorator('variousTax', {
                             rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
-                            initialValue: theData.nonOperatingIncome
+                            initialValue: theData.variousTax
                         })(
                             <InputNumber />
                             )}
                     </FormItem>
                     <FormItem className="half-item"
                         {...formItemLayout}
-                        label="不征税收入(万元)"
+                        label="流动资产(万元)"
                     >
-                        {getFieldDecorator('nonTaxableIncome', {
+                        {getFieldDecorator('currentAsset', {
                             rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
-                            initialValue: theData.nonTaxableIncome
+                            initialValue: theData.currentAsset
                         })(
                             <InputNumber />
                             )}
                     </FormItem>
                     <FormItem className="half-item"
                         {...formItemLayout}
-                        label="免税收入(万元)"
+                        label="固定资产净额(万元)"
                     >
-                        {getFieldDecorator('taxExemptIncome', {
+                        {getFieldDecorator('netFixedAsset', {
                             rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
-                            initialValue: theData.taxExemptIncome
+                            initialValue: theData.netFixedAsset
                         })(
                             <InputNumber />
                             )}
                     </FormItem>
                     <FormItem className="half-item"
                         {...formItemLayout}
-                        label="政府补助收入(万元)"
+                        label="资产总额(万元)"
                     >
-                        {getFieldDecorator('subsidyIncome', {
+                        {getFieldDecorator('totalAsset', {
                             rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
-                            initialValue: theData.subsidyIncome
+                            initialValue: theData.totalAsset
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有者权益合计(万元)"
+                    >
+                        {getFieldDecorator('netAsset', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.netAsset
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem><FormItem className="half-item"
+                        {...formItemLayout}
+                        label="利润总额(万元)"
+                    >
+                        {getFieldDecorator('grossProfit', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.grossProfit
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem><FormItem className="half-item"
+                        {...formItemLayout}
+                        label="净利润(万元)"
+                    >
+                        {getFieldDecorator('netProfit', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.netProfit
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem><FormItem className="half-item"
+                        {...formItemLayout}
+                        label="销售收入(万元)"
+                    >
+                        {getFieldDecorator('salesRevenue', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.salesRevenue
                         })(
                             <InputNumber />
                             )}
@@ -164,7 +209,7 @@ const FinanceDescFrom = Form.create()(React.createClass({
                     <Upload
                         name="ratepay"
                         action={globalConfig.context + "/techservice/cognizance/upload"}
-                        data={{ 'sign': this.props.year + 'ratepay' }}
+                        data={{ 'sign': this.props.year + 'finance' }}
                         beforeUpload={beforeUpload}
                         onChange={(info) => {
                             if (info.file.status !== 'uploading') {
@@ -172,7 +217,7 @@ const FinanceDescFrom = Form.create()(React.createClass({
                             }
                             if (info.file.status === 'done') {
                                 message.success(`${info.file.name} 文件上传成功!`);
-                                this.state.ratepayUrl = info.file.response.data;
+                                this.state.financeUrl = info.file.response.data;
                             } else if (info.file.status === 'error') {
                                 message.error(`${info.file.name} 文件上传失败。`);
                             }
@@ -250,7 +295,7 @@ const Finance = React.createClass({
             method: "get",
             dataType: "json",
             crossDomain: false,
-            url: globalConfig.context + "/techservice/cognizance/ratepay",
+            url: globalConfig.context + "/techservice/cognizance/finance",
             data: {
                 pageNo: pageNo || 1,
                 pageSize: this.state.pagination.pageSize
@@ -266,15 +311,19 @@ const Finance = React.createClass({
                     key: i,
                     id: thisdata.id,
                     uid: thisdata.uid,
-                    operatingIncome: thisdata.operatingIncome,
+                    mainBusinessIncome: thisdata.mainBusinessIncome,
                     managementCost: thisdata.managementCost,
                     operatingProfit: thisdata.operatingProfit,
-                    nonOperatingIncome: thisdata.nonOperatingIncome,
-                    nonTaxableIncome: thisdata.nonTaxableIncome,
-                    taxExemptIncome: thisdata.taxExemptIncome,
-                    subsidyIncome: thisdata.subsidyIncome,
+                    variousTax: thisdata.variousTax,
+                    currentAsset: thisdata.currentAsset,
+                    netFixedAsset: thisdata.netFixedAsset,
+                    totalAsset: thisdata.totalAsset,
+                    netAsset: thisdata.netAsset,
+                    grossProfit: thisdata.grossProfit,
+                    netProfit: thisdata.netProfit,
+                    salesRevenue: thisdata.salesRevenue,
                     year: thisdata.year,
-                    taxReturnUrl: thisdata.taxReturnUrl
+                    financeUrl: thisdata.financeUrl
                 });
             };
             this.state.pagination.current = data.data.pageNo;
@@ -312,9 +361,9 @@ const Finance = React.createClass({
                     dataIndex: 'year',
                     key: 'year'
                 }, {
-                    title: '营业收入(万元)',
-                    dataIndex: 'operatingIncome',
-                    key: 'operatingIncome'
+                    title: '营业收入(万元)',
+                    dataIndex: 'mainBusinessIncome',
+                    key: 'mainBusinessIncome'
                 }, {
                     title: '管理费用(万元)',
                     dataIndex: 'managementCost',
@@ -324,16 +373,24 @@ const Finance = React.createClass({
                     dataIndex: 'operatingProfit',
                     key: 'operatingProfit',
                 }, {
-                    title: '营业外收入(万元)',
-                    dataIndex: 'nonOperatingIncome',
-                    key: 'nonOperatingIncome',
+                    title: '支付的各项税费(万元)',
+                    dataIndex: 'variousTax',
+                    key: 'variousTax',
+                }, {
+                    title: '资产总额(万元)',
+                    dataIndex: 'totalAsset',
+                    key: 'totalAsset',
+                }, {
+                    title: '所有者权益(净资产)(万元)',
+                    dataIndex: 'netAsset',
+                    key: 'netAsset',
                 }, {
                     title: '相关附件',
-                    dataIndex: 'other',
-                    key: 'other',
+                    dataIndex: 'financeUrl',
+                    key: 'financeUrl',
                     render: (text) => {
-                        <a href="" onClick={()=>{
-                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + "url" + "&sign=" + "type")
+                        <a href="" onClick={() => {
+                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + text + "&sign=" + "type")
                         }}></a>
                     }
                 }
@@ -366,7 +423,7 @@ const Finance = React.createClass({
             method: "POST",
             dataType: "json",
             crossDomain: false,
-            url: globalConfig.context + "/techservice/cognizance/deleteTechProduct",
+            url: globalConfig.context + "/techservice/cognizance/deleteFinance",
             data: {
                 ids: deletedIds
             }

+ 352 - 0
js/component/account/services/honorList.jsx

@@ -0,0 +1,352 @@
+import React from 'react';
+import { Icon, Form, Button, Input, Spin, Table, message, Modal, Upload, DatePicker } from 'antd';
+import './techProduct.less';
+import { beforeUploadFile } from '../../tools.js';
+import moment from 'moment';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const HonorListDescFrom = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/cognizance/disposeHonor",
+                    data: {
+                        id: this.props.data.id,
+                        name: values.name,
+                        issuingTimeFormattedDate: values.issuingTimeFormattedDate.format("YYYY-MM-DD"),
+                        enclosureUrl: this.state.enclosureUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.closeModal();
+                        this.props.spinState(false);
+                        this.props.form.resetFields();
+                    } 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.props.data;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} className="activityCost-form">
+                <div className="clearfix">
+                    <FormItem
+                        {...formItemLayout}
+                        label="名称"
+                    >
+                        {getFieldDecorator('name', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.name
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="获取时间"
+                    >
+                        {getFieldDecorator('issuingTimeFormattedDate', {
+                            rules: [{ type: 'object', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.issuingTimeFormattedDate ? moment(theData.issuingTimeFormattedDate) : null
+                        })(
+                            <DatePicker />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="发证机构"
+                    >
+                        {getFieldDecorator('fazhengjigou', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.fazhengjigou
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'enclosure' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.enclosureUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传文件 </Button>
+                    </Upload>
+                </div>
+                <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 HonorListDesc = 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=''
+                    >
+                        <HonorListDescFrom data={this.props.data}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+
+const HonorList = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/honorList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize
+            }
+        }).done((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,
+                    id: thisdata.id,
+                    uid: thisdata.uid,
+                    name: thisdata.name,
+                    issuingTime: thisdata.issuingTime,
+                    enclosureUrl: thisdata.enclosureUrl,
+                    issuingTimeFormattedDate: thisdata.issuingTimeFormattedDate,
+                    fazhengjigou: thisdata.fazhengjigou
+                });
+            };
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'name',
+                    key: 'name'
+                }, {
+                    title: '获取时间',
+                    dataIndex: 'issuingTimeFormattedDate',
+                    key: 'issuingTimeFormattedDate'
+                }, {
+                    title: '发证机构',
+                    dataIndex: 'fazhengjigou',
+                    key: 'fazhengjigou'
+                }, {
+                    title: '相关附件',
+                    dataIndex: 'enclosureUrl',
+                    key: 'enclosureUrl',
+                    render: (text) => {
+                        <a href="" onClick={() => {
+                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + text + "&sign=" + "type")
+                        }}></a>
+                    }
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteHonor",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        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="user-content" >
+                <div className="content-title">
+                    <span>企业荣誉及其他证明材料</span>
+                </div>
+                <div className="user-search">
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <HonorListDesc data={this.state.RowData}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default HonorList;

+ 24 - 2
js/component/account/services/intellectualDesc.jsx

@@ -38,14 +38,15 @@ const IntellectualDescFrom = Form.create()(React.createClass({
                     crossDomain: false,
                     url: globalConfig.context + "/techservice/cognizance/intellectual",
                     data: {
-                        id:this.props.data.id,
+                        id: this.props.data.id,
                         intellectualPropertyNumber: values.intellectualPropertyNumber,
                         intellectualPropertyName: values.intellectualPropertyName,
                         catagory: values.catagory,
                         obtainWay: values.obtainWay,
                         sortNumber: values.sortNumber,
                         authorizationNumber: values.authorizationNumber,
-                        authorizationDateFormattedDate: values.authorizationDate._i || this.state.authorizationDateFormattedDate  
+                        authorizationDateFormattedDate: values.authorizationDate._i || this.state.authorizationDateFormattedDate,
+                        propertyRightUrl: this.state.propertyRightUrl
                     }
                 }).done(function (data) {
                     if (!data.error.length) {
@@ -162,6 +163,27 @@ const IntellectualDescFrom = Form.create()(React.createClass({
                             onChange={(data, dataString) => { this.state.authorizationDateFormattedDate = dataString }} />
                         )}
                 </FormItem>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'propertyRight' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.propertyRightUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传知识产权证书 </Button>
+                    </Upload>
+                </div>
                 <FormItem>
                     <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
                     <Button type="ghost" style={{ marginLeft: '20px' }} onClick={this.props.closeModal}>取消</Button>

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

@@ -9,6 +9,12 @@ const LeftTab = React.createClass({
     getInitialState() {
         return {
             current: 'patent',
+            subKey: 'sub1',
+            keyList: [
+                { key: 'sub1', value: ['patent', 'software', 'intellectual'] },
+                { key: 'sub2', value: ['standard', 'activity', 'activityCostList', 'orgTechCenter', 'techProduct', 'ratepay', 'finance', 'achievement', 'honorList'] },
+                { key: 'sub3', value: [] }
+            ]
         };
     },
     handleClick(e) {
@@ -18,15 +24,24 @@ const LeftTab = React.createClass({
         });
     },
     componentWillMount() {
+        const _me = this;
         if (window.location.hash) {
-            this.state.current = window.location.hash.substr(1);
+            let theKey = window.location.hash.substr(1);
+            this.state.keyList.map(function (item1) {
+                item1.value.map(function (item2) {
+                    if (theKey == item2) {
+                        _me.state.subKey = item1.key
+                    }
+                });
+            });
+            this.state.current = theKey;
         };
     },
     render() {
         return (
             <Menu onClick={this.handleClick}
                 selectedKeys={[this.state.current]}
-                defaultOpenKeys={["sub1", "sub2", "sub3"]}
+                defaultOpenKeys={[this.state.subKey]}
                 mode="vertical"
                 className="account-left"
                 mode="inline"
@@ -52,6 +67,9 @@ const LeftTab = React.createClass({
                     <Menu.Item key="activityCostList">
                         企业研发费用详情
                     </Menu.Item>
+                    <Menu.Item key="orgTechCenter">
+                        技术中心
+                    </Menu.Item>
                     <Menu.Item key="techProduct">
                         上年度高新技术产品(服务)情况
                     </Menu.Item>
@@ -61,6 +79,12 @@ const LeftTab = React.createClass({
                     <Menu.Item key="finance">
                         财务报表信息
                     </Menu.Item>
+                    <Menu.Item key="achievement">
+                        科技成果转化
+                    </Menu.Item>
+                    <Menu.Item key="honorList">
+                        企业荣誉及其他证明材料
+                    </Menu.Item>
                 </SubMenu>
                 <SubMenu key="sub3" title={<span>科技项目申报</span>}>
                 </SubMenu>

+ 458 - 0
js/component/account/services/orgTechCenter.jsx

@@ -0,0 +1,458 @@
+import React from 'react';
+import { Icon, Form, Button, Input, Spin, Table, message, Modal, Upload, DatePicker } from 'antd';
+import './techProduct.less';
+import { beforeUploadFile } from '../../tools.js';
+import moment from 'moment';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const CenterListDescFrom = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/cognizance/disposeHonor",
+                    data: {
+                        id: this.props.data.id,
+                        projectName: values.projectName,
+                        projectTime: values.projectTime.format("YYYY-MM-DD"),
+                        institution: values.institution,
+                        termTime: values.termTime.format("YYYY-MM-DD"),
+                        protocolUrl: this.state.protocolUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.closeModal();
+                        this.props.spinState(false);
+                        this.props.form.resetFields();
+                    } 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.props.data;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} className="activityCost-form">
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="时间"
+                    >
+                        {getFieldDecorator('projectTimeFormattedDate', {
+                            rules: [{ type: 'object', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.projectTimeFormattedDate ? moment(theData.projectTimeFormattedDate) : null
+                        })(
+                            <DatePicker />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="名称"
+                    >
+                        {getFieldDecorator('projectName', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.projectName
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="期限"
+                    >
+                        {getFieldDecorator('termTimeFormattedDate', {
+                            rules: [{ type: 'object', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.termTimeFormattedDate ? moment(theData.termTimeFormattedDate) : null
+                        })(
+                            <DatePicker />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="大学机构"
+                    >
+                        {getFieldDecorator('institution', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.institution
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'protocol' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.protocolUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传文件 </Button>
+                    </Upload>
+                </div>
+                <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 CenterListDesc = 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=''
+                    >
+                        <CenterListDescFrom data={this.props.data}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+
+const CenterList = React.createClass({
+    loadOrgTechCenterDetail() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/center",
+            data: {
+            }
+        }).done((data) => {
+            if (data.error.length || !data.data) {
+                message.warning(data.error[0].message);
+                return;
+            };
+            this.state.cid = data.data.id;
+            this.state.foundingTime = data.data.foundingTime;
+            this.state.principal = data.data.principal;
+            this.state.systemCatalog = data.data.systemCatalog;
+            this.state.systemUrl = data.data.systemUrl;
+            this.state.centerName = data.data.centerName;
+            this.state.beizhu = data.data.beizhu;
+            this.loadData();
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/centerDetail",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                cid: this.state.cid
+            }
+        }).done((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,
+                    id: thisdata.id,
+                    cid: thisdata.cid,
+                    projectTimeFormattedDate: thisdata.projectTimeFormattedDate,
+                    projectName: thisdata.projectName,
+                    protocolUrl: thisdata.protocolUrl,
+                    institution: thisdata.institution,
+                    termTimeFormattedDate: thisdata.termTimeFormattedDate
+                });
+            };
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'projectTimeFormattedDate',
+                    key: 'projectTimeFormattedDate'
+                }, {
+                    title: '名称',
+                    dataIndex: 'projectName',
+                    key: 'projectName'
+                }, {
+                    title: '期限',
+                    dataIndex: 'termTimeFormattedDate',
+                    key: 'termTimeFormattedDate'
+                }, {
+                    title: '大学机构',
+                    dataIndex: 'institution',
+                    key: 'institution'
+                }, {
+                    title: '协议附件',
+                    dataIndex: 'protocolUrl',
+                    key: 'protocolUrl',
+                    render: (text) => {
+                        <a href="" onClick={() => {
+                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + text + "&sign=" + "type")
+                        }}></a>
+                    }
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadOrgTechCenterDetail();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteHonor",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        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="user-content" >
+                <div className="content-title">
+                    <span>技术中心</span>
+                </div>
+                <div className="clearfix">
+                    <div className="orgTech-item">
+                        <span>中心名称: </span>
+                        <Input
+                            value={this.state.centerName}
+                            onChange={(e) => { this.setState({ centerName: e.target.value }); }}
+                        />
+                        <span>成立时间: </span>
+                        <DatePicker
+                            value={moment(this.state.foundingTime)}
+                            onChange={(date, dateString) => { this.setState({ foundingTime: dateString }); }}
+                        />
+                        <span>负责人: </span>
+                        <Input
+                            value={this.state.principal}
+                            onChange={(e) => { this.setState({ principal: e.target.value }); }}
+                        />
+                    </div>
+                    <div className="orgTech-item">
+                        <span>制度目录: </span>
+                        <Input type='textarea' rows={6}
+                            value={this.state.systemCatalog}
+                            onChange={(e) => { this.setState({ systemCatalog: e.target.value }); }}
+                        />
+                    </div>
+                    <div className="orgTech-item">
+                        <span>备注: </span>
+                        <Input type='textarea' rows={3}
+                            value={this.state.beizhu}
+                            onChange={(e) => { this.setState({ beizhu: e.target.value }); }}
+                        />
+                    </div>
+                </div>
+                <div className="half-item">
+                    <p>制度上传: (上传 zip 或者 rar 文件)</p>
+                    <Upload className="upload-box"
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'institution' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.systemUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传文件 </Button>
+                    </Upload>
+                </div>
+                <div className="content-title">
+                    <span>产学研情况</span>
+                </div>
+                <div className="user-search">
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <CenterListDesc data={this.state.RowData}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default CenterList;

+ 4 - 7
js/component/account/services/ratepay.jsx

@@ -2,7 +2,6 @@ import React from 'react';
 import { Icon, Form, Button, Input, Spin, Table, message, Select, Modal, InputNumber, Upload } from 'antd';
 import './techProduct.less';
 import { beforeUpload } from '../../tools.js';
-import moment from 'moment';
 import ajax from 'jquery/src/ajax/xhr.js';
 import $ from 'jquery/src/ajax';
 
@@ -10,8 +9,6 @@ const RatepayDescFrom = Form.create()(React.createClass({
     getInitialState() {
         return {
             loading: false,
-            targetKeys: [],
-            selectedKeys: [],
             yearOption: [],
         };
     },
@@ -329,11 +326,11 @@ const Ratepay = React.createClass({
                     key: 'nonOperatingIncome',
                 }, {
                     title: '相关附件',
-                    dataIndex: 'other',
-                    key: 'other',
+                    dataIndex: 'taxReturnUrl',
+                    key: 'taxReturnUrl',
                     render: (text) => {
                         <a href="" onClick={()=>{
-                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + "url" + "&sign=" + "type")
+                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + text + "&sign=" + "type")
                         }}></a>
                     }
                 }
@@ -366,7 +363,7 @@ const Ratepay = React.createClass({
             method: "POST",
             dataType: "json",
             crossDomain: false,
-            url: globalConfig.context + "/techservice/cognizance/deleteTechProduct",
+            url: globalConfig.context + "/techservice/cognizance/deleteRatepay",
             data: {
                 ids: deletedIds
             }

+ 25 - 3
js/component/account/services/techProduct.jsx

@@ -1,7 +1,7 @@
 import React from 'react';
-import { Icon, Form, Button, Radio, Input, Spin, Table, message, Select, Modal, DatePicker, Cascader, Transfer, InputNumber } from 'antd';
+import { Icon, Upload, Form, Button, Radio, Input, Spin, Table, message, Select, Modal, DatePicker, Cascader, Transfer, InputNumber } from 'antd';
 import { techFieldList, technicalSourceList } from '../../dataDic.js';
-import { getTechField, getTechnicalSource } from '../../tools.js';
+import { getTechField, getTechnicalSource, beforeUploadFile } from '../../tools.js';
 import './techProduct.less';
 import moment from 'moment';
 import ajax from 'jquery/src/ajax/xhr.js';
@@ -62,6 +62,7 @@ const TechProductDescFrom = Form.create()(React.createClass({
                         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);
@@ -223,6 +224,27 @@ const TechProductDescFrom = Form.create()(React.createClass({
                             )}
                     </FormItem>
                 </div>
+                <div style={{ width: '50%' }}>
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'proof' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.proofUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传台账 </Button>
+                    </Upload>
+                </div>
                 <FormItem style={{ marginTop: '20px' }}>
                     <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
                     <Button type="ghost" style={{ marginLeft: '20px' }} onClick={this.props.closeModal}>取消</Button>
@@ -347,7 +369,7 @@ const TechProduct = React.createClass({
                     lastYearRevenue: thisdata.lastYearRevenue,
                     mainProduct: thisdata.mainProduct,
 
-                    PropertyNumber:thisdata.intellectualPropertyNumber,
+                    PropertyNumber: thisdata.intellectualPropertyNumber,
                     intellectualPropertyNumber: thisdata.intellectualPropertyNumber ? thisdata.intellectualPropertyNumber.split(",") : [],
 
                     keyTechnology: thisdata.keyTechnology,

+ 27 - 0
js/component/account/services/techProduct.less

@@ -0,0 +1,27 @@
+.user-content {
+    .clearfix {
+        >.orgTech-item {
+            width: 60%;
+            display: inline-block;
+            >span {
+                margin-right: 10px;
+            }
+            >input {
+                width: 200px;
+                margin-right: 10px;
+            }
+            >textarea {
+                margin-top: 6px;
+            }
+        }
+        >div {
+            margin-bottom: 10px;
+        }
+    }
+}
+
+.upload-box {
+    display: inline-block;
+    margin-top: 10px;
+    margin-bottom: 20px;
+}

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

@@ -117,8 +117,8 @@ const PersonFrom = Form.create()(React.createClass({
                         techTotal: values.techTotal,
                         thirtyoneToThirtyfour: values.thirtyoneToThirtyfour,
                         undergraduate: values.undergraduate,
-                        rosterUrl:this.state.rosterUrl,
-                        socialSecurityUrl:this.state.socialSecurityUrl
+                        rosterUrl: this.state.rosterUrl,
+                        socialSecurityUrl: this.state.socialSecurityUrl
                     }
                 }).done(function (data) {
                     if (!data.error.length) {
@@ -158,7 +158,6 @@ const PersonFrom = Form.create()(React.createClass({
                             )}
                     </FormItem>
                     <FormItem className="half-item"
-                        style={{ marginRight: "50%" }}
                         {...formItemLayout}
                         label="科技人员"
                     >
@@ -168,6 +167,16 @@ const PersonFrom = Form.create()(React.createClass({
                             <InputNumber />
                             )}
                     </FormItem>
+                    <FormItem className="half-item" style={{ width: '50%' }}>
+                        <span>其中科技人员占比
+                        {(() => {
+                                if (!this.props.form.getFieldValue('techTotal') || !this.props.form.getFieldValue('firmTotal')) {
+                                    return 0
+                                }
+                                return (this.props.form.getFieldValue('techTotal') / this.props.form.getFieldValue('firmTotal') * 100).toFixed(2)
+                            })()}
+                            %</span>
+                    </FormItem>
                     <span className="hrSituation-span">在职人员(人)</span>
                     <FormItem className="half-item"
                         {...formItemLayout}
@@ -500,13 +509,13 @@ const Person = React.createClass({
                     <div className="acc-detail">
                         <Tabs defaultActiveKey={String(theYear)} >
                             <Tabs.TabPane tab={theYear} key={theYear}>
-                                <PersonFrom year={theYear} spinState={this.spinChange} urlData={this.urlData}/>
+                                <PersonFrom year={theYear} spinState={this.spinChange} urlData={this.urlData} />
                             </Tabs.TabPane>
                             <Tabs.TabPane tab={theYear - 1} key={theYear - 1}>
-                                <PersonFrom year={theYear - 1} spinState={this.spinChange} urlData={this.urlData}/>
+                                <PersonFrom year={theYear - 1} spinState={this.spinChange} urlData={this.urlData} />
                             </Tabs.TabPane>
                             <Tabs.TabPane tab={theYear - 2} key={theYear - 2}>
-                                <PersonFrom year={theYear - 2} spinState={this.spinChange} urlData={this.urlData}/>
+                                <PersonFrom year={theYear - 2} spinState={this.spinChange} urlData={this.urlData} />
                             </Tabs.TabPane>
                         </Tabs>
                     </div>

+ 21 - 0
js/component/dataDic.js

@@ -4124,5 +4124,26 @@ module.exports = {
             value: "6",
             key: "中央属科研院所"
         }
+    ],
+    conversionFormList:[
+        {
+            value: "0",
+            key: "自行投资"
+        },{
+            value: "1",
+            key: "向他人转让"
+        },{
+            value: "2",
+            key: "许可他人使用"
+        },{
+            value: "3",
+            key: "共同实施(合作)"
+        },{
+            value: "4",
+            key: "共同实施(投资、合资、入股)"
+        },{
+            value: "5",
+            key: "其他方式"
+        }
     ]
 };

+ 4 - 5
js/component/login/login.less

@@ -7,10 +7,9 @@
             width: 960px;
             margin: 20px auto;
             .logo {
-                width: 160px;
+                width: 80px;
                 padding-top: 60px;
                 float: left;
-                margin-left: 40px;
                 border-right: 1px solid #eee;
                 position: relative;
                 overflow: hidden;
@@ -19,11 +18,11 @@
                     top: 0;
                     left: 0;
                     height: 60px;
-                    width: 120px;
+                    width: 60px;
                 }
             }
             .logo-text {
-                width: 760px;
+                width: 835px;
                 float: left;
                 line-height: 60px;
                 font-size: 24px;
@@ -36,7 +35,7 @@
                     }
                 }
                 span {
-                    margin-left: 10px;
+                    margin-left: 24px;
                 }
             }
         }

+ 3 - 2
js/component/login/loginTop.jsx

@@ -1,5 +1,6 @@
 import React from 'react';
 import './login.less';
+import logo from '../../../image/logo.jpg';
 
 const LoginTop = React.createClass({
     render() {
@@ -7,10 +8,10 @@ const LoginTop = React.createClass({
             <div className="header">
                 <div className="login-logo">
                     <div className="logo">
-                        <img src="" alt="" />
+                        <img src={logo} alt="" />
                     </div>
                     <div className="logo-text">
-                        <span>logo-text</span>
+                        <span>科技交易认知计算平台</span>
                         <span className="back"><a href="./index.html">返回首页</a></span>
                     </div>
                 </div>

+ 1 - 1
js/component/manageCenter/index/leftTab.jsx

@@ -1,6 +1,6 @@
 import React from 'react';
 import { Menu, Icon } from 'antd';
-import './leftTab.less';
+import '../leftTab.less';
 const SubMenu = Menu.SubMenu;
 const MenuItemGroup = Menu.ItemGroup;
 

+ 0 - 25
js/component/manageCenter/index/leftTab.less

@@ -1,25 +0,0 @@
-.acc-content {
-    .account-left {
-        width: 16%;
-        height: 100%;
-        padding-top: 40px;
-        float: left;
-        border-right: none;
-        background: #e8f2fc;
-        .ant-menu-item {
-            padding: 0;
-            margin: 0;
-            border-right: none;
-            text-align: center;
-            font-size: 16px;
-            color: #4466bf;
-            background: #d5e4f7;
-            border-top: 1px solid #f2f8fd;
-            border-bottom: 1px solid #c0d2e4;
-        }
-        .ant-menu-item-selected {
-            background: #fff;
-            border-left: 3px solid #58a3ff;
-        }
-    }
-}

+ 33 - 33
js/component/manageCenter/leftTab.less

@@ -5,42 +5,42 @@
         padding-top: 40px;
         float: left;
         border-right: none;
-        background: #e8f2fc;
+        //background: #e8f2fc;
         .ant-menu-submenu {
             .ant-menu-submenu-title {
-                padding: 0!important;
-                margin: 0;
-                border-right: none;
-                text-align: center;
-                font-size: 18px;
-                color: #4466bf;
-                background: #d5e4f7;
-                border-top: 1px solid #f2f8fd;
-                border-bottom: 1px solid #c0d2e4;
-                &:after {
-                    font-size: 24px;
-                } 
+                //         padding: 0!important;
+                //         margin: 0;
+                //         border-right: none;
+                //         text-align: center;
+                font-size: 16px;
+                //         color: #4466bf;
+                //         background: #d5e4f7;
+                //         border-top: 1px solid #f2f8fd;
+                //         border-bottom: 1px solid #c0d2e4;
+                //         &:after {
+                //             font-size: 24px;
+                //         } 
             }
         }
-        .ant-menu-submenu-selected {
-            .ant-menu-submenu-title {
-                background: #fff;
-                border-left: 3px solid #58a3ff;
-            }
-        }
-        .ant-menu-item {
-            padding-left: 0!important;
-            text-align: center;
-            background: #fafafa;
-            font-size: 14px;
-            color: #333;
-            border-bottom: 1px solid #c0d2e4;
-        }
-        .ant-menu-item-selected {
-            background: #fff;
-            color: #4466bf;
-            font-size: 16px;
-            border-right: none;
-        }
+        //.ant-menu-submenu-selected {
+        //     .ant-menu-submenu-title {
+        //         background: #fff;
+        //border-left: 3px solid #58a3ff;
+        //     }
+        //}
+        // .ant-menu-item {
+        //     padding-left: 0!important;
+        //     text-align: center;
+        //     background: #fafafa;
+        //     font-size: 14px;
+        //     color: #333;
+        //     border-bottom: 1px solid #c0d2e4;
+        // }
+        // .ant-menu-item-selected {
+        //     background: #fff;
+        //     color: #4466bf;
+        //     font-size: 16px;
+        //     border-right: none;
+        // }
     }
 }

+ 233 - 0
js/component/manageCenter/servicesManage/highTech/HighTechApply.jsx

@@ -0,0 +1,233 @@
+import React from 'react';
+import { Icon, Button, Input, Select, Spin, Table, DatePicker, message, Cascader } from 'antd';
+import { techFieldList, provinceArr } from '../../../dataDic.js';
+import { getTime, getPatentState } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import './highTechFoster.less';
+
+const HighTechApply = 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;
+                }
+                for (let i = 0; i < data.data.list.length; i++) {
+                    let thisdata = data.data.list[i];
+                    this.state.data.push({
+                        key: i,
+
+                    });
+                };
+                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:[],
+            province: '',
+            unitName: '',
+            data: [],
+            loading: 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: 'patentNumber',
+                    key: 'patentNumber',
+                }, {
+                    title: '事务所',
+                    dataIndex: 'office',
+                    key: 'office',
+                }, {
+                    title: '省份',
+                    dataIndex: 'province',
+                    key: 'province',
+                }, {
+                    title: '公司名称',
+                    dataIndex: 'unitName',
+                    key: 'unitName',
+                }, {
+                    title: '专利名称',
+                    dataIndex: 'patentName',
+                    key: 'patentName',
+                }, {
+                    title: '专利状态',
+                    dataIndex: 'patentState',
+                    key: 'patentState',
+                    render: text => { return getPatentState(text) },
+                }, {
+                    title: '派单日',
+                    dataIndex: 'createTime',
+                    key: 'createTime',
+                    render: text => { return getTime(text) },
+                }, {
+                    title: '申请日',
+                    dataIndex: 'startTime',
+                    key: 'startTime',
+                    render: text => { return getTime(text) },
+                }, {
+                    title: '授权日',
+                    dataIndex: 'endTime',
+                    key: 'endTime',
+                    render: text => { return getTime(text) },
+                }, {
+                    title: '资料撰写人',
+                    dataIndex: 'author',
+                    key: 'author',
+                }
+            ],
+            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();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true
+        });
+    },
+    closeDesc(e) {
+        this.state.showDesc = e;
+        this.loadData();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.province = undefined;
+        this.state.unitName = undefined;
+        this.loadData();
+    },
+    render() {
+        const { MonthPicker, RangePicker } = DatePicker;
+        return (
+            <div className="foster-content" >
+                <div className="content-title">
+                    <span>高企认定申请</span>
+                </div>
+                <div className="foster-query">
+                    <Select placeholder="选择省份" style={{ width: 200 }} onChange={(e) => { this.state.province = e }}>{this.state.provinceOption}</Select>
+                    <Select placeholder="选择公司" style={{ width: 200 }} onChange={(e) => { this.state.unitName = e }}>{this.state.companyOption}</Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                </div>
+                <div className="foster-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+            </div >
+        );
+    }
+});
+
+export default HighTechApply;

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

@@ -0,0 +1,46 @@
+import React from 'react';
+import '../../content.less';
+import LeftTab from '../leftTab.jsx';
+
+import HighTechApply from './highTechApply.jsx';
+import HighTechFoster from './highTechFoster.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 'highTechApply':
+                                return <HighTechApply />;
+                            case 'highTechFoster':
+                                return <HighTechFoster />;
+                        };
+                    })()}
+                </div>
+            </div>
+        )
+    }
+});
+
+export default Content;

+ 129 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/ablt.jsx

@@ -0,0 +1,129 @@
+import React from 'react';
+import './ablt.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+import { Input, Button, Spin, message } from 'antd';
+
+const Base = React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            tags: []
+        };
+    },
+    componentWillMount() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/ability",
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        intellectRight: data.data.intellectRight,
+                        scienceAchievement: data.data.scienceAchievement,
+                        researchInnovation: data.data.researchInnovation,
+                        personnel: data.data.personnel
+                    });
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    submit() {
+        let theTags = this.state.tags.join(",");
+        this.setState({
+            loading: true
+        })
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/userAbility",
+            data: {
+                "intellectRight": this.state.intellectRight,
+                "scienceAchievement": this.state.scienceAchievement,
+                "researchInnovation": this.state.researchInnovation,
+                "personnel": this.state.personnel
+
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+            } else {
+                message.warning(data.error[0].message);
+            }
+        }.bind(this)).always(function () {
+            this.setState({
+                loading: false
+            })
+        }.bind(this));
+    },
+    render() {
+        return (
+            <Spin spinning={this.state.loading} className='spin-box'>
+                <div className="set-ablt">
+                    <div className="acc-detail clearfix">
+                        <p className="acc-title">能力标签</p>
+                        <div className="acc-area">
+                            <p>知识产权对企业竞争力的作用 (限400字) </p>
+                            <Input type="textarea" rows={6}
+                                value={this.state.intellectRight}
+                                onChange={(e) => {
+                                    if (e.target.value.length > 400) {
+                                        message.warning("长度超过400字!");
+                                        return;
+                                    };
+                                    this.setState({ intellectRight: e.target.value });
+                                }} />
+                        </div>
+                        <div className="acc-area">
+                            <p>科技成果转化情况 (限400字) </p>
+                            <Input type="textarea" rows={6}
+                                value={this.state.scienceAchievement}
+                                onChange={(e) => {
+                                    if (e.target.value.length > 400) {
+                                        message.warning("长度超过400字!");
+                                        return;
+                                    };
+                                    this.setState({ scienceAchievement: e.target.value })
+                                }} />
+                        </div>
+                        <div className="acc-area">
+                            <p>研究开发与技术创新组织管理情况 (限400字) </p>
+                            <Input type="textarea" rows={6}
+                                value={this.state.researchInnovation}
+                                onChange={(e) => {
+                                    if (e.target.value.length > 400) {
+                                        message.warning("长度超过400字!");
+                                        return;
+                                    };
+                                    this.setState({ researchInnovation: e.target.value })
+                                }} />
+                        </div>
+                        <div className="acc-area">
+                            <p>管理与科技人员情况 (限400字) </p>
+                            <Input type="textarea" rows={6}
+                                value={this.state.personnel}
+                                onChange={(e) => {
+                                    if (e.target.value.length > 400) {
+                                        message.warning("长度超过400字!");
+                                        return;
+                                    };
+                                    this.setState({ personnel: e.target.value })
+                                }} />
+                        </div>
+                    </div>
+                    <Button className="set-submit" type="primary" onClick={this.submit}>保存</Button>
+                </div>
+            </Spin>
+        )
+    }
+});
+
+export default Base;

+ 39 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/ablt.less

@@ -0,0 +1,39 @@
+.set-ablt {
+    background: #fff;
+    height: 100%;
+    padding: 20px;
+    .acc-title {
+        color: #333;
+        font-size: 16px;
+        margin-bottom: 10px;
+        span {
+            font-size: 12px;
+            color: #999;
+            margin-left: 10px;
+        }
+    }
+    .tips-title {
+        margin-bottom: 10px;
+    }
+    .ablt-tips {
+        div:first-child {
+            border: none;
+            background: #fff;
+            padding: 0;
+        }
+        margin: 20px 0;
+    }
+    .set-submit {
+        width: 120px;
+        border-radius: 4px;
+    }
+    .acc-area {
+        width: 40%;
+        float: left;
+        margin-bottom: 20px;
+        margin-right: 20px;
+        .ant-input {
+            margin-top: 10px;
+        }
+    }
+}

+ 438 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/achievement.jsx

@@ -0,0 +1,438 @@
+import React from 'react';
+import { Icon, Form, Button, Input, Spin, Table, message, Select, Modal, InputNumber, Upload } from 'antd';
+import './techProduct.less';
+import { getConversionForm, beforeUploadFile } from '../../../../tools.js';
+import { conversionFormList, technicalSourceList } from '../../../../dataDic.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const AchievementDescFrom = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            yearOption: [],
+            conversionFormOption: [],
+            technicalSourceOption: []
+        };
+    },
+    componentWillMount() {
+        let d = new Date();
+        let _me = this;
+        d = d.getFullYear();
+        for (let i = d; i > d - 20; i--) {
+            _me.state.yearOption.push(
+                <Select.Option value={i.toString()} key={i}>{i}</Select.Option>
+            )
+        };
+        conversionFormList.map(function (item) {
+            _me.state.conversionFormOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        technicalSourceList.map(function (item) {
+            _me.state.technicalSourceOption.push(
+                <Select.Option value={item.key} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        if (this.props.activityNumberList && this.props.activityNumberList.length) {
+            for (let i = 0; i < this.props.activityNumberList.length; i++) {
+                _me.state.technicalSourceOption.push(
+                    <Select.Option value={this.props.activityNumberList[i].activityNumber}
+                        key={this.props.activityNumberList[i].uid}>
+                        {this.props.activityNumberList[i].activityName}-{this.props.activityNumberList[i].activityNumber}
+                    </Select.Option>
+                )
+            };
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/cognizance/disposeAchievement",
+                    data: {
+                        id: this.props.data.id,
+                        achievementName: values.achievementName,
+                        source: values.source,
+                        conversionForm: values.conversionForm,
+                        conversionResult: values.conversionResult,
+                        year: this.state.year,
+                        enclosureUrl: this.state.enclosureUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.closeModal();
+                        this.props.spinState(false);
+                        this.props.form.resetFields();
+                    } 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.props.data;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 16 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} className="activityCost-form">
+                <div className="activityCost-title"><span>年份: </span>
+                    {
+                        theData.year ? <span>{theData.year}</span> :
+                            <Select placeholder="请选择年份" style={{ width: 200 }}
+                                onSelect={(e, n) => { this.state.year = e }}>
+                                {this.state.yearOption}
+                            </Select>
+                    }
+                </div>
+                <div className="clearfix">
+                    <FormItem
+                        {...formItemLayout}
+                        label="成果名称"
+                    >
+                        {getFieldDecorator('achievementName', {
+                            rules: [{ type: 'string', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.achievementName
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="成果来源"
+                    >
+                        {getFieldDecorator('source', {
+                            rules: [{ type: 'string', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.source
+                        })(
+                            <Select placeholder="请选择成果来源" style={{ width: 200 }}>
+                                {this.state.technicalSourceOption}
+                            </Select>
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="转化形式"
+                    >
+                        {getFieldDecorator('conversionForm', {
+                            rules: [{ type: 'string', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.conversionForm
+                        })(
+                            <Select placeholder="请选择转化形式" style={{ width: 200 }}>
+                                {this.state.conversionFormOption}
+                            </Select>
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="转化结果"
+                    >
+                        {getFieldDecorator('conversionResult', {
+                            rules: [{ type: 'string', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.conversionResult
+                        })(
+                            <Input type="textarea" rows={6} />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'enclosure' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.enclosureUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传文件 </Button>
+                    </Upload>
+                </div>
+                <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 AchievementDesc = 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=''
+                    >
+                        <AchievementDescFrom
+                            data={this.props.data}
+                            activityNumberList={this.props.activityNumberList}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+
+const Achievement = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.when($.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/achievementList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+            }
+        }), $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/activityNumber",
+        })).done((data1, data2) => {
+            let data = data1[0];
+            let activityNumber = data2[0];
+            if (data.error.length || !data.data || !data.data.list) {
+                message.warning(data.error[0].message);
+                return;
+            };
+            if (activityNumber.error.length || !activityNumber.data) {
+                message.warning(activityNumber.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,
+                    id:thisdata.id,
+                    uid: thisdata.uid,
+                    achievementName: thisdata.achievementName,
+                    source: thisdata.source,
+                    conversionForm: thisdata.conversionForm,
+                    conversionResult: thisdata.conversionResult,
+                    year: thisdata.year,
+                    enclosureUrl: thisdata.enclosureUrl,
+                });
+            };
+            this.state.activityNumberList = activityNumber.data;
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'year',
+                    key: 'year'
+                }, {
+                    title: '成果名称',
+                    dataIndex: 'achievementName',
+                    key: 'achievementName'
+                }, {
+                    title: '成果来源',
+                    dataIndex: 'source',
+                    key: 'source',
+                }, {
+                    title: '转化形式',
+                    dataIndex: 'conversionForm',
+                    key: 'conversionForm',
+                    render: (text) => { return getConversionForm(text) }
+                }, {
+                    title: '转化结果',
+                    dataIndex: 'conversionResult',
+                    key: 'conversionResult',
+                }, {
+                    title: '相关附件',
+                    dataIndex: 'enclosureUrl',
+                    key: 'enclosureUrl',
+                    render: (text) => {
+                        <a href="" onClick={() => {
+                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + text + "&sign=" + "type")
+                        }}></a>
+                    }
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteAchievement",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        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="user-content" >
+                <div className="content-title">
+                    <span>科技成果转化</span>
+                </div>
+                <div className="user-search">
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <AchievementDesc
+                    data={this.state.RowData}
+                    activityNumberList={this.state.activityNumberList}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default Achievement;

+ 555 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/activity.jsx

@@ -0,0 +1,555 @@
+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 './activity.less';
+import moment from 'moment';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const ActivityDesc = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            targetKeys: [],
+            selectedKeys: []
+        };
+    },
+    handleOk() {
+        this.setState({
+            loading: true,
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/activity",
+            data: {
+                id: this.props.data.id,
+                activityName: this.state.activityName,
+                activityNumber: this.state.activityNumber,
+                startDateFormattedDate: this.state.startDateFormattedDate,
+                endDateFormattedDate: this.state.endDateFormattedDate,
+                technicalField1: this.state.techField[0],
+                technicalField2: this.state.techField[1],
+                technicalField3: this.state.techField[2],
+                technicalSource: this.state.technicalSource,
+                intellectualPropertyNumber: this.state.targetKeys.join(","),
+                budget: this.state.budget,
+                firstYearExpenditure: this.state.firstYearExpenditure,
+                secondYearExpenditure: this.state.secondYearExpenditure,
+                thirdYearExpenditure: this.state.thirdYearExpenditure,
+                implement: this.state.implement,
+                technologyInnovation: this.state.technologyInnovation,
+                achievement: this.state.achievement,
+                participant: this.state.participant,
+                proofUrl: this.state.proofUrl
+            },
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        id: this.props.data.id,
+                        activityName: this.state.activityName,
+                        activityNumber: this.state.activityNumber,
+                        startDateFormattedDate: this.state.startDateFormattedDate,
+                        endDateFormattedDate: this.state.endDateFormattedDate,
+                        techField: this.state.techField,
+                        technicalSource: this.state.technicalSource,
+                        intellectualPropertyNumber: this.state.targetKeys,
+                        budget: this.state.budget,
+                        firstYearExpenditure: this.state.firstYearExpenditure,
+                        secondYearExpenditure: this.state.secondYearExpenditure,
+                        thirdYearExpenditure: this.state.thirdYearExpenditure,
+                        implement: this.state.implement,
+                        technologyInnovation: this.state.technologyInnovation,
+                        achievement: this.state.achievement
+                    });
+                } else if (data.error.length && data.error[0].message) {
+                    message.warning(data.error[0].message);
+                }
+            }.bind(this),
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.setState({
+                    loading: false,
+                    visible: false
+                });
+                this.props.closeDesc(false);
+            } else {
+                message.warning(data.error[0].message);
+                this.setState({
+                    loading: false
+                });
+            };
+        }.bind(this));
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc;
+        if (nextProps.data) {
+            this.state.activityName = nextProps.data.activityName;
+            this.state.activityNumber = nextProps.data.activityNumber;
+            this.state.startDateFormattedDate = nextProps.data.startDateFormattedDate;
+            this.state.endDateFormattedDate = nextProps.data.endDateFormattedDate;
+            this.state.techField = nextProps.data.techField;
+            this.state.technicalSource = nextProps.data.technicalSource;
+            this.state.targetKeys = nextProps.data.intellectualPropertyNumber;
+            this.state.budget = nextProps.data.budget;
+            this.state.firstYearExpenditure = nextProps.data.firstYearExpenditure;
+            this.state.secondYearExpenditure = nextProps.data.secondYearExpenditure;
+            this.state.thirdYearExpenditure = nextProps.data.thirdYearExpenditure;
+            this.state.implement = nextProps.data.implement;
+            this.state.technologyInnovation = nextProps.data.technologyInnovation;
+            this.state.achievement = nextProps.data.achievement;
+            this.state.mockData = nextProps.data.mockData;
+        };
+    },
+    intellectualChange(nextTargetKeys, direction, moveKeys) {
+        this.setState({ targetKeys: nextTargetKeys });
+    },
+    intellectualSelectChange(sourceSelectedKeys, targetSelectedKeys) {
+        this.setState({ selectedKeys: [...sourceSelectedKeys, ...targetSelectedKeys] });
+    },
+    render() {
+        if (this.props.data) {
+            return (
+                <div className="admin-desc">
+                    <Modal title="企业研究开发活动情况详情" visible={this.state.visible} onCancel={this.handleCancel}
+                        width='800px' footer={[
+                            <Button key="submit" type="primary" size="large" loading={this.state.loading} onClick={this.handleOk}>保存</Button>,
+                            <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>
+                        ]}
+                        className="admin-desc-content">
+                        <div className="clearfix">
+                            <div className="half-div">
+                                <p>研发活动编号:</p>
+                                <Input value={this.state.activityNumber}
+                                    onChange={(e) => { this.setState({ activityNumber: e.target.value }); }} />
+                            </div>
+                            <div className="half-div">
+                                <p>研发活动名称:</p>
+                                <Input value={this.state.activityName}
+                                    onChange={(e) => { this.setState({ activityName: e.target.value }); }} />
+                            </div>
+                            <div className="half-div">
+                                <p>开始日期:</p>
+                                <DatePicker
+                                    value={this.state.startDateFormattedDate ? moment(this.state.startDateFormattedDate) : null}
+                                    onChange={(data, dataString) => { this.setState({ startDateFormattedDate: dataString }); }} />
+                            </div>
+                            <div className="half-div">
+                                <p>结束日期:</p>
+                                <DatePicker
+                                    value={this.state.endDateFormattedDate ? moment(this.state.endDateFormattedDate) : null}
+                                    onChange={(data, dataString) => { this.setState({ endDateFormattedDate: dataString }); }} />
+                            </div>
+                        </div>
+                        <div>
+                            <p>技术领域:</p>
+                            <Cascader
+                                style={{ width: 500 }}
+                                options={techFieldList}
+                                value={this.state.techField}
+                                onChange={(value, selectedOptions) => { this.setState({ techField: value }); console.log(value) }}
+                                placeholder="Please select"
+                                showSearch
+                            />,
+                        </div>
+                        <div className="half-div">
+                            <p>技术来源:</p>
+                            <Select placeholder="选择技术来源" style={{ width: 230 }}
+                                value={this.state.technicalSource}
+                                onChange={(e) => { this.setState({ technicalSource: e }) }}>
+                                {
+                                    technicalSourceList.map(function (item, i) {
+                                        return <Select.Option key={1000 + i} value={item.value} >{item.key}</Select.Option>
+                                    })
+                                }
+                            </Select>
+                        </div>
+                        <div className="half-div">
+                            <p>参与人员:</p>
+                            <InputNumber value={this.state.participant}
+                                onChange={(e) => { this.setState({ participant: e.target.value }); }} />
+                        </div>
+                        <div style={{ marginTop: '10px' }}>
+                            <p>知识产权编号:</p>
+                            <Transfer
+                                dataSource={this.props.mockData}
+                                listStyle={{
+                                    width: 300,
+                                    height: 300,
+                                }}
+                                titles={['未选择', '已选择']}
+                                targetKeys={this.state.targetKeys}
+                                selectedKeys={this.state.selectedKeys}
+                                onChange={this.intellectualChange}
+                                onSelectChange={this.intellectualSelectChange}
+                                render={item => `${item.name}-${item.key}`}
+                            />
+                        </div>
+                        <div>
+                            <p>研发经费总预算(万元):</p>
+                            <InputNumber value={this.state.budget || 0}
+                                onChange={(e) => { this.setState({ budget: e }); }} />
+                        </div>
+                        <div className="clearfix" >
+                            <p>研发经费近三年总支出(万元):</p>
+                            <div className="half-div">
+                                <span>总计(万元):</span>
+                                <InputNumber value={
+                                    this.state.firstYearExpenditure + this.state.secondYearExpenditure + this.state.thirdYearExpenditure || 0
+                                } />
+                            </div>
+                            <div className="half-div">
+                                <span>其中(第一年):</span>
+                                <InputNumber value={this.state.firstYearExpenditure}
+                                    onChange={(e) => { this.setState({ firstYearExpenditure: e }); }} />
+                            </div>
+                            <div className="half-div">
+                                <span>其中(第二年):</span>
+                                <InputNumber value={this.state.secondYearExpenditure}
+                                    onChange={(e) => { this.setState({ secondYearExpenditure: e }); }} />
+                            </div>
+                            <div className="half-div">
+                                <span>其中(第三年):</span>
+                                <InputNumber value={this.state.thirdYearExpenditure}
+                                    onChange={(e) => { this.setState({ thirdYearExpenditure: e }); }} />
+                            </div>
+                        </div>
+                        <div className="clearfix">
+                            <div className="half-div">
+                                <p>目的及组织实施方式(限400字):</p>
+                                <Input type="textarea" rows={6}
+                                    value={this.state.implement}
+                                    onChange={(e) => {
+                                        if (e.target.value.length > 400) {
+                                            return;
+                                        }
+                                        this.setState({ implement: e.target.value });
+                                    }} />
+                            </div>
+                            <div className="half-div">
+                                <p>核心技术及创新点(限400字):</p>
+                                <Input type="textarea" rows={6}
+                                    value={this.state.technologyInnovation}
+                                    onChange={(e) => {
+                                        if (e.target.value.length > 400) {
+                                            return;
+                                        }
+                                        this.setState({ technologyInnovation: e.target.value });
+                                    }} />
+                            </div>
+                            <div className="half-div">
+                                <p>取得的阶段性成果(限400字):</p>
+                                <Input type="textarea" rows={6}
+                                    value={this.state.achievement}
+                                    onChange={(e) => {
+                                        if (e.target.value.length > 400) {
+                                            return;
+                                        }
+                                        this.setState({ achievement: e.target.value });
+                                    }} />
+                            </div>
+                        </div>
+                        <Select style={{ width: 120 }}
+                        placeholder='请选择立项类型'
+                        value={this.state.lixiang}
+                        onChange={(e)=>{this.setState({lixiang:e});}}>
+                            <Select.Option value='0'>内部立项</Select.Option>
+                            <Select.Option value='1'>外部立项</Select.Option>
+                        </Select>
+                        <div style={{ width: '50%' }}>
+                            <Upload
+                                name="ratepay"
+                                action={globalConfig.context + "/techservice/cognizance/upload"}
+                                data={{ 'sign': this.props.year + 'proof' }}
+                                beforeUpload={beforeUploadFile}
+                                onChange={(info) => {
+                                    if (info.file.status !== 'uploading') {
+                                        console.log(info.file, info.fileList);
+                                    }
+                                    if (info.file.status === 'done') {
+                                        message.success(`${info.file.name} 文件上传成功!`);
+                                        this.state.proofUrl = info.file.response.data;
+                                    } else if (info.file.status === 'error') {
+                                        message.error(`${info.file.name} 文件上传失败。`);
+                                    }
+                                }}
+                            >
+                                <Button><Icon type="upload" /> 上传立项证明材料 </Button>
+                            </Upload>
+                        </div>
+                    </Modal>
+                </div>
+            );
+        } else {
+            return <div></div>
+        }
+    },
+});
+
+const Activity = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.when($.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/activityList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                activityNumber: this.state.activityNumber,
+                activityName: this.state.activityName,
+                startDate: this.state.startDate,
+                endDate: this.state.endDate
+            }
+        }), $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/intellectualList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: 99,
+            }
+        })).done((data1, data2) => {
+            let data = data1[0];
+            let intellectualList = data2[0];
+            if (data.error.length || !data.data || !data.data.list) {
+                message.warning(data.error[0].message);
+                return;
+            };
+            if (intellectualList.error.length || !intellectualList.data || !intellectualList.data.list) {
+                message.warning(intellectualList.error[0].message);
+                return;
+            };
+            let theArr = [];
+            for (let i = 0; i < intellectualList.data.list.length; i++) {
+                theArr.push({
+                    key: intellectualList.data.list[i].intellectualPropertyNumber,
+                    name: intellectualList.data.list[i].intellectualPropertyName
+                });
+            };
+            this.state.mockData = theArr;
+            for (let i = 0; i < data.data.list.length; i++) {
+                let thisdata = data.data.list[i];
+                this.state.data.push({
+                    key: i,
+                    id: thisdata.id,
+                    uid: thisdata.uid,
+                    activityNumber: thisdata.activityNumber,
+                    activityName: thisdata.activityName,
+                    startDate: thisdata.startDate,
+                    endDate: thisdata.endDate,
+
+                    mockData: this.state.mockData,
+
+                    techField: [Number(thisdata.technicalField1), Number(thisdata.technicalField2), Number(thisdata.technicalField3)],
+                    technicalField: getTechField(thisdata.technicalField1, thisdata.technicalField2, thisdata.technicalField3),
+                    technicalField1: thisdata.technicalField1,
+                    technicalField2: thisdata.technicalField2,
+                    technicalField3: thisdata.technicalField3,
+                    technicalSource: String(thisdata.technicalSource),
+                    intellectualPropertyNumber: thisdata.intellectualPropertyNumber ? thisdata.intellectualPropertyNumber.split(",") : [],
+                    budget: thisdata.budget,
+                    firstYearExpenditure: thisdata.firstYearExpenditure,
+                    secondYearExpenditure: thisdata.secondYearExpenditure,
+                    thirdYearExpenditure: thisdata.thirdYearExpenditure,
+                    implement: thisdata.implement,
+                    technologyInnovation: thisdata.technologyInnovation,
+                    achievement: thisdata.achievement,
+                    internalLaborCost: thisdata.internalLaborCost,
+                    internalDirectCost: thisdata.internalDirectCost,
+                    internalDepreciationCost: thisdata.internalDepreciationCost,
+                    internalAmortizationCost: thisdata.internalAmortizationCost,
+                    internalDesignCost: thisdata.internalDesignCost,
+                    internalEquipmentCost: thisdata.internalEquipmentCost,
+                    internalOtherCost: thisdata.internalOtherCost,
+                    externalTotalCost: thisdata.externalTotalCost,
+                    externalAbroadCost: thisdata.externalAbroadCost,
+                    enterpriseFiller: thisdata.enterpriseFiller,
+                    signDate: thisdata.signDate,
+                    sortNumber: thisdata.sortNumber,
+                    startDateFormattedDate: thisdata.startDateFormattedDate,
+                    endDateFormattedDate: thisdata.endDateFormattedDate
+                });
+            };
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            mockData: [],
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'activityNumber',
+                    key: 'activityNumber'
+                }, {
+                    title: '研发活动名称',
+                    dataIndex: 'activityName',
+                    key: 'activityName'
+                }, {
+                    title: '技术领域',
+                    dataIndex: 'technicalField',
+                    key: 'technicalField'
+                }, {
+                    title: '技术来源',
+                    dataIndex: 'technicalSource',
+                    key: 'technicalSource',
+                    render: (text) => { return getTechnicalSource(text) }
+                }, {
+                    title: '知识产权编号',
+                    dataIndex: 'intellectualPropertyNumber',
+                    key: 'intellectualPropertyNumber'
+                }, {
+                    title: '开始时间',
+                    dataIndex: 'startDateFormattedDate',
+                    key: 'startDateFormattedDate'
+                }, {
+                    title: '结束时间',
+                    dataIndex: 'endDateFormattedDate',
+                    key: 'endDateFormattedDate'
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteActivity",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.activityName = undefined;
+        this.state.activityNumber = 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="user-content" >
+                <div className="content-title">
+                    <span>企业研究开发活动情况表</span>
+                </div>
+                <div className="user-search">
+                    <Input placeholder="研发活动名称" value={this.state.activityName}
+                        onChange={(e) => { this.setState({ activityName: e.target.value }); }} />
+                    <Input placeholder="研发活动编号" value={this.state.activityNumber}
+                        onChange={(e) => { this.setState({ activityNumber: e.target.value }); }} />
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <ActivityDesc data={this.state.RowData}
+                    mockData={this.state.mockData}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default Activity;

+ 51 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/activity.less

@@ -0,0 +1,51 @@
+.user-content {
+    background: #fff;
+    padding: 20px;
+    .content-title {
+        font-size: 16px;
+        color: #333;
+    }
+    .user-search {
+        margin: 20px 0;
+        input {
+            width: 200px;
+        }
+        >* {
+            margin-right: 20px;
+        }
+        p {
+            margin-top: 20px;
+            button {
+                margin-right: 20px;
+            }
+        }
+    }
+}
+
+.admin-desc-content {
+    .ant-modal-body {
+        >div {
+            margin-top: 0px;
+            margin-bottom: 10px;
+            p {
+                margin: 6px 0;
+            }
+        }
+    }
+    .half-div {
+        width: 50%;
+        float: left;
+        margin-top: 0px;
+        margin-bottom: 10px;
+        >span {
+            display: inline-block;
+            width: 100px;
+        }
+        >input {
+            width: 60%;
+        }
+        >textarea {
+            width: 94%;
+        }
+    }
+}

+ 626 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/activityCostList.jsx

@@ -0,0 +1,626 @@
+import React from 'react';
+import { Icon, Form, Upload, Button, Input, Spin, Table, message, Select, Modal, DatePicker, InputNumber } from 'antd';
+import './activityCostList.less';
+import { beforeUploadFile } from '../../../../tools.js';
+import moment from 'moment';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const ActivityDescFrom = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            activityNumberOption: [],
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        this.props.activityNumberList.map(function (item) {
+            _me.state.activityNumberOption.push(
+                <Select.Option value={item.aid} key={item.uid}>{item.activityNumber}</Select.Option>
+            )
+        });
+    },
+    allCostCount() {
+        this.state.internalAllCost = this.props.form.getFieldValue('internalLaborCost') + this.props.form.getFieldValue('internalDirectCost') +
+            this.props.form.getFieldValue('internalDepreciationCost') + this.props.form.getFieldValue('internalAmortizationCost') +
+            this.props.form.getFieldValue('internalDesignCost') + this.props.form.getFieldValue('internalEquipmentCost') +
+            this.props.form.getFieldValue('internalOtherCost');
+        this.state.allCost = this.props.form.getFieldValue('internalLaborCost') + this.props.form.getFieldValue('internalDirectCost') +
+            this.props.form.getFieldValue('internalDepreciationCost') + this.props.form.getFieldValue('internalAmortizationCost') +
+            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();
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/cognizance/activityCost",
+                    data: {
+                        id: this.props.data.id,
+                        aid: this.state.aid,
+                        activityNumber: this.state.activityNumber,
+
+                        internalLaborCost: values.internalLaborCost,
+                        internalDirectCost: values.internalDirectCost,
+                        internalDepreciationCost: values.internalDepreciationCost,
+                        internalAmortizationCost: values.internalAmortizationCost,
+                        internalDesignCost: values.internalDesignCost,
+                        internalEquipmentCost: values.internalEquipmentCost,
+                        internalOtherCost: values.internalOtherCost,
+
+                        externalTotalCost: values.externalTotalCost,
+                        externalAbroadCost: values.externalAbroadCost,
+                        enterpriseFiller: values.enterpriseFiller,
+                        signDateFormattedDate: values.signDate.format('YYYY-MM-DD'),
+                        sortNumber: values.sortNumber
+                    }
+                }).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.closeModal();
+                    this.props.form.resetFields();
+                }.bind(this));
+            }
+        });
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const theData = this.props.data;
+        const formItemLayout = {
+            labelCol: { span: 14 },
+            wrapperCol: { span: 8 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} className="activityCost-form">
+                <p className="activityCost-title">项目编号</p>
+                {
+                    theData.activityNumber ? <span>{theData.activityNumber}</span> :
+                        <Select placeholder="请选择项目编号" style={{ width: 200 }}
+                            onSelect={(e, n) => { this.state.aid = e; this.state.activityNumber = n.props.children }}>
+                            {this.state.activityNumberOption}
+                        </Select>
+                }
+                <p className="activityCost-title">内部研究开发费用(万元)</p>
+                <div className="clearfix activityCost-box">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="共计(万元)"
+                    >
+                        {getFieldDecorator('internalAllCost')(
+                            <span className="number-box">
+                                {this.state.internalAllCost}
+                            </span>
+                        )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="人员人工费用(万元)"
+                    >
+                        {getFieldDecorator('internalLaborCost', {
+                            rules: [{ type: "number", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.internalLaborCost
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="直接投入费用(万元)"
+                    >
+                        {getFieldDecorator('internalDirectCost', {
+                            rules: [{ type: "number", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.internalDirectCost
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="折旧费用与长期待摊费用(万元)"
+                    >
+                        {getFieldDecorator('internalDepreciationCost', {
+                            rules: [{ type: "number", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.internalDepreciationCost
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="无形资产摊销费用(万元)"
+                    >
+                        {getFieldDecorator('internalAmortizationCost', {
+                            rules: [{ type: "number", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.internalAmortizationCost
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="设计费用(万元)"
+                    >
+                        {getFieldDecorator('internalDesignCost', {
+                            rules: [{ type: "number", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.internalDesignCost
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="装备调试费用与实验费用(万元)"
+                    >
+                        {getFieldDecorator('internalEquipmentCost', {
+                            rules: [{ type: "number", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.internalEquipmentCost
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="其他费用(万元)"
+                    >
+                        {getFieldDecorator('internalOtherCost', {
+                            rules: [{ type: "number", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.internalOtherCost
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                </div>
+                <p className="activityCost-title">委托外部研究开发费用(万元)</p>
+                <div className="clearfix activityCost-box">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="共计(万元)"
+                    >
+                        {getFieldDecorator('externalTotalCost', {
+                            rules: [{ type: "number", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.externalTotalCost
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="境内的外部研发费用"
+                    >
+                        {getFieldDecorator('externalAbroadCost', {
+                            rules: [{ type: "number", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.externalAbroadCost
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                </div>
+                <p className="activityCost-title">研发开发费用(内、外部)小计(万元)</p>
+                <div className="clearfix activityCost-box">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="共计(万元)"
+                    >
+                        {getFieldDecorator('allCost')(
+                            <span className="number-box">
+                                {this.state.allCost}
+                            </span>
+                        )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="企业填报人"
+                    >
+                        {getFieldDecorator('enterpriseFiller', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.enterpriseFiller
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="企业填报人签字日期"
+                    >
+                        {getFieldDecorator('signDate', {
+                            rules: [{ type: "object", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.signDate ? moment(theData.signDate) : null
+                        })(
+                            <DatePicker onChange={(date, dateString) => { this.state.signDateFormattedDate = dateString }} />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="排序号"
+                    >
+                        {getFieldDecorator('sortNumber', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.sortNumber
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                </div>
+                <div style={{ marginTop:'20px',width: '50%' }}>
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'proof' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.proofUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传台账 </Button>
+                    </Upload>
+                </div>
+                <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 ActivityDesc = 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=''
+                    >
+                        <ActivityDescFrom data={this.props.data} activityNumberList={this.props.activityNumberList}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+
+const Activity = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.when($.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/activityCostList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                activityNumber: this.state.activityNumber,
+                startDate: this.state.startDate,
+                endDate: this.state.endDate
+            }
+        }), $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/activityNumber",
+        })).done((data1, data2) => {
+            let data = data1[0];
+            let activityNumber = data2[0];
+            if (data.error.length || !data.data || !data.data.list) {
+                message.warning(data.error[0].message);
+                return;
+            };
+            if (activityNumber.error.length || !activityNumber.data) {
+                message.warning(activityNumber.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,
+                    id: thisdata.id,
+                    uid: thisdata.uid,
+                    aid: thisdata.aid,
+                    activityNumber: thisdata.activityNumber,
+                    startDate: thisdata.startDate,
+                    endDate: thisdata.endDate,
+
+                    internalAllCost:
+                    thisdata.internalLaborCost + thisdata.internalDirectCost + thisdata.internalDepreciationCost +
+                    thisdata.internalAmortizationCost + thisdata.internalAmortizationCost + thisdata.internalDesignCost +
+                    thisdata.internalEquipmentCost + thisdata.internalOtherCost,
+
+                    internalLaborCost: thisdata.internalLaborCost,
+                    internalDirectCost: thisdata.internalDirectCost,
+                    internalDepreciationCost: thisdata.internalDepreciationCost,
+                    internalAmortizationCost: thisdata.internalAmortizationCost,
+                    internalDesignCost: thisdata.internalDesignCost,
+                    internalEquipmentCost: thisdata.internalEquipmentCost,
+                    internalOtherCost: thisdata.internalOtherCost,
+
+                    externalTotalCost: thisdata.externalTotalCost,
+                    externalAbroadCost: thisdata.externalAbroadCost,
+
+                    allCost:
+                    thisdata.internalLaborCost + thisdata.internalDirectCost + thisdata.internalDepreciationCost +
+                    thisdata.internalAmortizationCost + thisdata.internalAmortizationCost + thisdata.internalDesignCost +
+                    thisdata.internalEquipmentCost + thisdata.internalOtherCost + thisdata.externalTotalCost,
+
+                    enterpriseFiller: thisdata.enterpriseFiller,
+                    signDate: thisdata.signDate,
+                    signDateFormattedDate: thisdata.signDateFormattedDate,
+
+                    sortNumber: thisdata.sortNumber,
+
+                    startDateFormattedDate: thisdata.startDateFormattedDate,
+                    endDateFormattedDate: thisdata.endDateFormattedDate
+                });
+            };
+            this.state.activityNumberList = activityNumber.data;
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'activityNumber',
+                    key: 'activityNumber'
+                }, {
+                    title: '内部研究开发费用',
+                    dataIndex: 'internalAllCost',
+                    key: 'internalAllCost'
+                }, {
+                    title: '人员人工费用',
+                    dataIndex: 'internalLaborCost',
+                    key: 'internalLaborCost'
+                }, {
+                    title: '直接投入费用',
+                    dataIndex: 'internalDirectCost',
+                    key: 'internalDirectCost'
+                }, {
+                    title: '折旧费用与长期待摊费用',
+                    dataIndex: 'internalDepreciationCost',
+                    key: 'internalDepreciationCost'
+                }, {
+                    title: '设计费用',
+                    dataIndex: 'internalDesignCost',
+                    key: 'internalDesignCost'
+                }, {
+                    title: '装备调试费用与试验费用',
+                    dataIndex: 'internalEquipmentCost',
+                    key: 'internalEquipmentCost'
+                }, {
+                    title: '无形资产摊销费用',
+                    dataIndex: 'internalAmortizationCost',
+                    key: 'internalAmortizationCost'
+                }, {
+                    title: '其他费用',
+                    dataIndex: 'internalOtherCost',
+                    key: 'internalOtherCost'
+                }, {
+                    title: '委托外部研究开发费用',
+                    dataIndex: 'externalTotalCost',
+                    key: 'externalTotalCost'
+                }, {
+                    title: '境内外部研发费用',
+                    dataIndex: 'externalAbroadCost',
+                    key: 'externalAbroadCost'
+                }, {
+                    title: '研发费用合计',
+                    dataIndex: 'allCost',
+                    key: 'allCost'
+                }, {
+                    title: '企业填报人',
+                    dataIndex: 'enterpriseFiller',
+                    key: 'enterpriseFiller'
+                }, {
+                    title: '企业填报人签字日期',
+                    dataIndex: 'signDateFormattedDate',
+                    key: 'signDateFormattedDate'
+                }, {
+                    title: '排序号',
+                    dataIndex: 'sortNumber',
+                    key: 'sortNumber'
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteActivityCost",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.startDateFormattedDate = undefined;
+        this.state.endDateFormattedDate = undefined;
+        this.state.activityNumber = 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="user-content" >
+                <div className="content-title">
+                    <span>企业研究开发活动情况表</span>
+                </div>
+                <div className="user-search">
+                    <Input placeholder="研发活动编号" value={this.state.activityNumber}
+                        onChange={(e) => { this.setState({ activityNumber: e.target.value }); }} />
+                    <span>开始日期:</span>
+                    <DatePicker
+                        value={this.state.startDateFormattedDate ? moment(this.state.startDateFormattedDate) : null}
+                        onChange={(data, dataString) => { this.setState({ startDateFormattedDate: dataString }); }} />
+                    <span>结束日期:</span>
+                    <DatePicker
+                        value={this.state.endDateFormattedDate ? moment(this.state.endDateFormattedDate) : null}
+                        onChange={(data, dataString) => { this.setState({ endDateFormattedDate: dataString }); }} />
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <ActivityDesc data={this.state.RowData}
+                    activityNumberList={this.state.activityNumberList}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default Activity;

+ 16 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/activityCostList.less

@@ -0,0 +1,16 @@
+.ant-form ,.activityCost-form {
+    .activityCost-title {
+        font-size: 16px;
+        line-height: 30px;
+        margin-top: 10px;
+        margin-bottom: 10px;
+    }
+    .half-item {
+        width: 50%;
+        float: left;
+    }
+    .activityCost-box {
+        background: #eee;
+        padding: 10px 0 ;
+    }
+}

+ 98 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/content.jsx

@@ -0,0 +1,98 @@
+import React from 'react';
+import { Button, Radio } from 'antd';
+import './content.less';
+
+import Intellectual from './intellectual';
+import Activity from './activity';
+import Standard from './standard';
+import ActivityCostList from './activityCostList';
+import TechProduct from './techProduct';
+import Ratepay from './ratepay';
+import Finance from './finance';
+import Achievement from './achievement';
+import HonorList from './honorList';
+import OrgTechCenter from './orgTechCenter';
+import InnovationAbility from './ablt';
+import HrSituation from './hrSituation';
+
+
+const Content = React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            radioKey: 'hrSituation',
+        };
+    },
+    componentWillMount() {
+    },
+    returnFoster() {
+        this.props.returnBtn();
+    },
+    onChange(e) {
+        this.setState({
+            radioKey: e.target.value
+        });
+    },
+    render() {
+        return (
+            <div className="foster-desc" style={{ display: this.props.style }}>
+                <div className="content-tabs">
+                    <div className="foster-title">
+                        <span className="company-name">某某省某某市某某某公司</span>
+                        <span className="company-number">GF201712345678</span>
+                        <span className="company-time">有效期2014-10-02至2017-10-02</span>
+                        <Button className="foster-return" type="primary" onClick={this.returnFoster}>返回高企培育列表</Button>
+                    </div>
+                    <div className="clearfix foster-component">
+                        <Radio.Group onChange={this.onChange} defaultValue="orgTechCenter">
+                            <Radio.Button value="orgTechCenter">技术中心</Radio.Button>
+                            <Radio.Button value="activity">研发活动</Radio.Button>
+                            <Radio.Button value="activityCostList">研发活动费用详情</Radio.Button>
+                            <Radio.Button value="techProduct">高新技术产品</Radio.Button>
+                            <Radio.Button value="intellectual">知识产权</Radio.Button>
+                            <Radio.Button value="achievement">科技成果转化</Radio.Button>
+                            <Radio.Button value="ratepay">企业纳税申报</Radio.Button>
+                            <Radio.Button value="finance">财务报表</Radio.Button>
+                            <Radio.Button value="hrSituation">企业人员情况</Radio.Button>
+                            <Radio.Button value="honorList">企业荣誉及其他证明材料</Radio.Button>
+                            <Radio.Button value="standard">标准制定情况</Radio.Button>
+                            <Radio.Button value="innovationAbility">企业创新能力</Radio.Button>
+                        </Radio.Group>
+                    </div>
+                </div>
+                <div className="content-desc">
+                    {(() => {
+                        switch (this.state.radioKey) {
+                            case 'orgTechCenter':
+                                return <OrgTechCenter />;
+                            case 'activity':
+                                return <Activity />;
+                            case 'activityCostList':
+                                return <ActivityCostList />;
+                            case 'techProduct':
+                                return <TechProduct />;
+                            case 'intellectual':
+                                return <Intellectual />;
+                            case 'achievement':
+                                return <Achievement />;
+                            case 'ratepay':
+                                return <Ratepay />;
+                            case 'finance':
+                                return <Finance />;
+                            case 'hrSituation':
+                                return <HrSituation />;
+                            case 'honorList':
+                                return <HonorList />;
+                            case 'standard':
+                                return <Standard />;
+                            case 'innovationAbility':
+                                return <InnovationAbility />;
+                        };
+                    })()}
+                </div>
+            </div>
+        )
+    }
+});
+
+export default Content;

+ 53 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/content.less

@@ -0,0 +1,53 @@
+.foster-desc {
+    .content-tabs {
+        background: #fff;
+        padding: 20px;
+        .foster-title {
+            line-height: 28px;
+            vertical-align: middle;
+            >span {
+                margin-right: 20px;
+            }
+            .company-name {
+                font-size: 18px;
+                color: #58a3ff;
+            }
+            .company-number {
+                font-size: 16px;
+                color: #000;
+            }
+            .company-time {
+                color: #333;
+            }
+        }
+        .foster-component {
+            margin-top: 10px;
+            .ant-radio-group {
+                >label {
+                    border-radius: 0px;
+                    border: 1px solid #d9d9d9;
+                    margin-right: 10px;
+                    margin-bottom: 10px;
+                }
+                .ant-radio-button-wrapper-checked {
+                    border: 1px solid #58a3ff;
+                    box-shadow: none;
+                }
+            }
+        }
+        .foster-return {
+            float: right;
+            margin-left: 20px;
+            background: #ea0862;
+            color: #fff;
+            border: none;
+            border-radius: 4px;
+            padding: 6px 10px;
+        }
+    }
+    .content-desc {
+        background: #fff;
+        margin-top: 20px;
+        padding: 20px;
+    }
+}

+ 493 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/finance.jsx

@@ -0,0 +1,493 @@
+import React from 'react';
+import { Icon, Form, Button, Input, Spin, Table, message, Select, Modal, InputNumber, Upload } from 'antd';
+import './techProduct.less';
+import { beforeUpload } from '../../../../tools.js';
+import moment from 'moment';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const FinanceDescFrom = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            targetKeys: [],
+            selectedKeys: [],
+            yearOption: [],
+        };
+    },
+    componentWillMount() {
+        let d = new Date();
+        let _me = this;
+        d = d.getFullYear();
+        for (let i = d; i > d - 20; i--) {
+            _me.state.yearOption.push(
+                <Select.Option value={i.toString()} key={i}>{i}</Select.Option>
+            )
+        }
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/cognizance/disposeFinance",
+                    data: {
+                        id: this.props.data.id,
+                        mainBusinessIncome: values.mainBusinessIncome,
+                        managementCost:values.managementCost,
+                        operatingProfit:values.operatingProfit,
+                        variousTax:values.variousTax,
+                        currentAsset:values.currentAsset,
+                        netFixedAsset:values.netFixedAsset,
+                        totalAsset:values.totalAsset,
+                        netAsset:values.netAsset,
+                        grossProfit:values.grossProfit,
+                        netProfit:values.netProfit,
+                        salesRevenue:values.salesRevenue,
+                        year:this.state.year,
+                        financeUrl: this.state.financeUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.closeModal();
+                        this.props.spinState(false);
+                        this.props.form.resetFields();
+                    } 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.props.data;
+        const formItemLayout = {
+            labelCol: { span: 10 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} className="activityCost-form">
+                <div className="activityCost-title"><span>年份: </span>
+                    {
+                        theData.year ? <span>{theData.year}</span> :
+                            <Select placeholder="请选择年份" style={{ width: 200 }}
+                                onSelect={(e, n) => { this.state.year = e }}>
+                                {this.state.yearOption}
+                            </Select>
+                    }
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="主营业务收入(万元)"
+                    >
+                        {getFieldDecorator('mainBusinessIncome', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.mainBusinessIncome
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="管理费用(万元)"
+                    >
+                        {getFieldDecorator('managementCost', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.managementCost
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="营业利润(万元)"
+                    >
+                        {getFieldDecorator('operatingProfit', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.operatingProfit
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="支付的各项税费(万元)"
+                    >
+                        {getFieldDecorator('variousTax', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.variousTax
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="流动资产(万元)"
+                    >
+                        {getFieldDecorator('currentAsset', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.currentAsset
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="固定资产净额(万元)"
+                    >
+                        {getFieldDecorator('netFixedAsset', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.netFixedAsset
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="资产总额(万元)"
+                    >
+                        {getFieldDecorator('totalAsset', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.totalAsset
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有者权益合计(万元)"
+                    >
+                        {getFieldDecorator('netAsset', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.netAsset
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem><FormItem className="half-item"
+                        {...formItemLayout}
+                        label="利润总额(万元)"
+                    >
+                        {getFieldDecorator('grossProfit', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.grossProfit
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem><FormItem className="half-item"
+                        {...formItemLayout}
+                        label="净利润(万元)"
+                    >
+                        {getFieldDecorator('netProfit', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.netProfit
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem><FormItem className="half-item"
+                        {...formItemLayout}
+                        label="销售收入(万元)"
+                    >
+                        {getFieldDecorator('salesRevenue', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.salesRevenue
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'finance' }}
+                        beforeUpload={beforeUpload}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.financeUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传文件 </Button>
+                    </Upload>
+                </div>
+                <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 FinanceDesc = 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=''
+                    >
+                        <FinanceDescFrom data={this.props.data}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+
+const Finance = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/finance",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize
+            }
+        }).done((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,
+                    id: thisdata.id,
+                    uid: thisdata.uid,
+                    mainBusinessIncome: thisdata.mainBusinessIncome,
+                    managementCost: thisdata.managementCost,
+                    operatingProfit: thisdata.operatingProfit,
+                    variousTax: thisdata.variousTax,
+                    currentAsset: thisdata.currentAsset,
+                    netFixedAsset: thisdata.netFixedAsset,
+                    totalAsset: thisdata.totalAsset,
+                    netAsset: thisdata.netAsset,
+                    grossProfit: thisdata.grossProfit,
+                    netProfit: thisdata.netProfit,
+                    salesRevenue: thisdata.salesRevenue,
+                    year: thisdata.year,
+                    financeUrl: thisdata.financeUrl
+                });
+            };
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'year',
+                    key: 'year'
+                }, {
+                    title: '主营业务收入(万元)',
+                    dataIndex: 'mainBusinessIncome',
+                    key: 'mainBusinessIncome'
+                }, {
+                    title: '管理费用(万元)',
+                    dataIndex: 'managementCost',
+                    key: 'managementCost'
+                }, {
+                    title: '营业利润(万元)',
+                    dataIndex: 'operatingProfit',
+                    key: 'operatingProfit',
+                }, {
+                    title: '支付的各项税费(万元)',
+                    dataIndex: 'variousTax',
+                    key: 'variousTax',
+                }, {
+                    title: '资产总额(万元)',
+                    dataIndex: 'totalAsset',
+                    key: 'totalAsset',
+                }, {
+                    title: '所有者权益(净资产)(万元)',
+                    dataIndex: 'netAsset',
+                    key: 'netAsset',
+                }, {
+                    title: '相关附件',
+                    dataIndex: 'financeUrl',
+                    key: 'financeUrl',
+                    render: (text) => {
+                        <a href="" onClick={() => {
+                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + text + "&sign=" + "type")
+                        }}></a>
+                    }
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteFinance",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        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="user-content" >
+                <div className="content-title">
+                    <span>财务报表信息</span>
+                </div>
+                <div className="user-search">
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <FinanceDesc data={this.state.RowData}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default Finance;

+ 352 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/honorList.jsx

@@ -0,0 +1,352 @@
+import React from 'react';
+import { Icon, Form, Button, Input, Spin, Table, message, Modal, Upload, DatePicker } from 'antd';
+import './techProduct.less';
+import { beforeUploadFile } from '../../../../tools.js';
+import moment from 'moment';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const HonorListDescFrom = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/cognizance/disposeHonor",
+                    data: {
+                        id: this.props.data.id,
+                        name: values.name,
+                        issuingTimeFormattedDate: values.issuingTimeFormattedDate.format("YYYY-MM-DD"),
+                        enclosureUrl: this.state.enclosureUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.closeModal();
+                        this.props.spinState(false);
+                        this.props.form.resetFields();
+                    } 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.props.data;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} className="activityCost-form">
+                <div className="clearfix">
+                    <FormItem
+                        {...formItemLayout}
+                        label="名称"
+                    >
+                        {getFieldDecorator('name', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.name
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="获取时间"
+                    >
+                        {getFieldDecorator('issuingTimeFormattedDate', {
+                            rules: [{ type: 'object', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.issuingTimeFormattedDate ? moment(theData.issuingTimeFormattedDate) : null
+                        })(
+                            <DatePicker />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="发证机构"
+                    >
+                        {getFieldDecorator('fazhengjigou', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.fazhengjigou
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'enclosure' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.enclosureUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传文件 </Button>
+                    </Upload>
+                </div>
+                <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 HonorListDesc = 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=''
+                    >
+                        <HonorListDescFrom data={this.props.data}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+
+const HonorList = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/honorList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize
+            }
+        }).done((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,
+                    id: thisdata.id,
+                    uid: thisdata.uid,
+                    name: thisdata.name,
+                    issuingTime: thisdata.issuingTime,
+                    enclosureUrl: thisdata.enclosureUrl,
+                    issuingTimeFormattedDate: thisdata.issuingTimeFormattedDate,
+                    fazhengjigou: thisdata.fazhengjigou
+                });
+            };
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'name',
+                    key: 'name'
+                }, {
+                    title: '获取时间',
+                    dataIndex: 'issuingTimeFormattedDate',
+                    key: 'issuingTimeFormattedDate'
+                }, {
+                    title: '发证机构',
+                    dataIndex: 'fazhengjigou',
+                    key: 'fazhengjigou'
+                }, {
+                    title: '相关附件',
+                    dataIndex: 'enclosureUrl',
+                    key: 'enclosureUrl',
+                    render: (text) => {
+                        <a href="" onClick={() => {
+                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + text + "&sign=" + "type")
+                        }}></a>
+                    }
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteHonor",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        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="user-content" >
+                <div className="content-title">
+                    <span>企业荣誉及其他证明材料</span>
+                </div>
+                <div className="user-search">
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <HonorListDesc data={this.state.RowData}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default HonorList;

+ 528 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/hrSituation.jsx

@@ -0,0 +1,528 @@
+import React from 'react';
+import { Input, InputNumber, Button, Form, Icon, Spin, message, Tabs, Upload } from 'antd';
+import { beforeUpload } from '../../../../tools.js';
+import './hrSituation.less'
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+
+const PersonFrom = Form.create()(React.createClass({
+    getData() {
+        this.props.spinState(true);
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/humanResource",
+            data: {
+                uid:this.props.uid,
+                year: this.props.year
+            },
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        aboveFifty: data.data.aboveFifty,
+                        belowThirty: data.data.belowThirty,
+                        college: data.data.college,
+                        doctor: data.data.doctor,
+                        firmAbroad: data.data.firmAbroad,
+                        firmCore: data.data.firmCore,
+                        firmForeign: data.data.firmForeign,
+                        firmInService: data.data.firmInService,
+                        firmPartTime: data.data.firmPartTime,
+                        firmTemporary: data.data.firmTemporary,
+                        firmTotal: data.data.firmTotal,
+                        fortyoneToFifty: data.data.fortyoneToFifty,
+                        intermediateTitle: data.data.intermediateTitle,
+                        juniorTitle: data.data.juniorTitle,
+                        master: data.data.master,
+                        seniorMechanic: data.data.seniorMechanic,
+                        seniorTitle: data.data.seniorTitle,
+                        techAbroad: data.data.techAbroad,
+                        techCore: data.data.techCore,
+                        techForeign: data.data.techForeign,
+                        techInService: data.data.techInService,
+                        techPartTime: data.data.techPartTime,
+                        techTemporary: data.data.techTemporary,
+                        techTotal: data.data.techTotal,
+                        thirtyoneToThirtyfour: data.data.thirtyoneToThirtyfour,
+                        undergraduate: data.data.undergraduate
+                    });
+                }
+            }.bind(this),
+        }).always(function () {
+            this.props.spinState(false);
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (values.firmTotal < values.firmInService + values.firmPartTime + values.firmTemporary) {
+                message.warning("总体情况的在职人员数、兼职人员数、临时聘用人员数相加小于等于企业职工总数!");
+                return;
+            };
+            if (values.firmTotal < values.techTotal) {
+                message.warning("科技人员数小于等于企业职工总数!");
+                return;
+            };
+            if (values.firmInService < values.techInService || values.firmPartTime < values.techPartTime || values.firmTemporary < values.techTemporary ||
+                values.firmForeign < values.techForeign || values.firmAbroad < values.techAbroad || values.firmCore < values.techCore) {
+                message.warning("科技人员各项人数小于等于企业职工各项人数!");
+                return;
+            };
+            if (values.firmTotal < values.doctor + values.master + values.undergraduate + values.college) {
+                message.warning("全体人员结构中学历一栏人数总和小于等于职工人数!");
+                return;
+            };
+            if (values.firmTotal < values.belowThirty + values.thirtyoneToThirtyfour + values.fortyoneToFifty + values.aboveFifty) {
+                message.warning("全体人员结构中年龄一栏人数总和小于等于职工人数!");
+                return;
+            };
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/api/user/SaveHumanResource",
+                    data: {
+                        year: this.props.year,
+                        aboveFifty: values.aboveFifty,
+                        belowThirty: values.belowThirty,
+                        college: values.college,
+                        doctor: values.doctor,
+                        firmAbroad: values.firmAbroad,
+                        firmCore: values.firmCore,
+                        firmForeign: values.firmForeign,
+                        firmInService: values.firmInService,
+                        firmPartTime: values.firmPartTime,
+                        firmTemporary: values.firmTemporary,
+                        firmTotal: values.firmTotal,
+                        fortyoneToFifty: values.fortyoneToFifty,
+                        intermediateTitle: values.intermediateTitle,
+                        juniorTitle: values.juniorTitle,
+                        master: values.master,
+                        seniorMechanic: values.seniorMechanic,
+                        seniorTitle: values.seniorTitle,
+                        techAbroad: values.techAbroad,
+                        techCore: values.techCore,
+                        techForeign: values.techForeign,
+                        techInService: values.techInService,
+                        techPartTime: values.techPartTime,
+                        techTemporary: values.techTemporary,
+                        techTotal: values.techTotal,
+                        thirtyoneToThirtyfour: values.thirtyoneToThirtyfour,
+                        undergraduate: values.undergraduate,
+                        rosterUrl: this.state.rosterUrl,
+                        socialSecurityUrl: this.state.socialSecurityUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this)).always(function () {
+                    this.props.spinState(false);
+                }.bind(this));
+            }
+        });
+    },
+    componentWillMount() {
+        this.getData();
+    },
+    render() {
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 8 },
+            wrapperCol: { span: 16 },
+        };
+        const FormItem = Form.Item;
+        return (
+            <Form onSubmit={this.handleSubmit} className="hrSituation-form">
+                <p className="hrSituation-title">总体情况</p>
+                <div className="clearfix">
+                    <span className="hrSituation-span">总数(人)</span>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="企业职工"
+                    >
+                        {getFieldDecorator('firmTotal', {
+                            initialValue: this.state.firmTotal || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="科技人员"
+                    >
+                        {getFieldDecorator('techTotal', {
+                            initialValue: this.state.techTotal || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item" style={{ width: '50%' }}>
+                        <span>其中科技人员占比
+                        {(() => {
+                                if (!this.props.form.getFieldValue('techTotal') || !this.props.form.getFieldValue('firmTotal')) {
+                                    return 0
+                                }
+                                return (this.props.form.getFieldValue('techTotal') / this.props.form.getFieldValue('firmTotal') * 100).toFixed(2)
+                            })()}
+                            %</span>
+                    </FormItem>
+                    <span className="hrSituation-span">在职人员(人)</span>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="企业职工"
+                    >
+                        {getFieldDecorator('firmInService', {
+                            initialValue: this.state.firmInService || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="科技人员"
+                    >
+                        {getFieldDecorator('techInService', {
+                            initialValue: this.state.techInService || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <span className="hrSituation-span">兼职人员(人)</span>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="企业职工"
+                    >
+                        {getFieldDecorator('firmPartTime', {
+                            initialValue: this.state.firmPartTime || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="科技人员"
+                    >
+                        {getFieldDecorator('techPartTime', {
+                            initialValue: this.state.techPartTime || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <span className="hrSituation-span">临时聘用人员(人)</span>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="企业职工"
+                    >
+                        {getFieldDecorator('firmTemporary', {
+                            initialValue: this.state.firmTemporary || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="科技人员"
+                    >
+                        {getFieldDecorator('techTemporary', {
+                            initialValue: this.state.techTemporary || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <span className="hrSituation-span">外籍人员(人)</span>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="企业职工"
+                    >
+                        {getFieldDecorator('firmForeign', {
+                            initialValue: this.state.firmForeign || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="科技人员"
+                    >
+                        {getFieldDecorator('techForeign', {
+                            initialValue: this.state.techForeign || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <span className="hrSituation-span">留学归国人员(人)</span>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="企业职工"
+                    >
+                        {getFieldDecorator('firmAbroad', {
+                            initialValue: this.state.firmAbroad || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="科技人员"
+                    >
+                        {getFieldDecorator('techAbroad', {
+                            initialValue: this.state.techAbroad || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <span className="hrSituation-span">干人计划人员(人)</span>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="企业职工"
+                    >
+                        {getFieldDecorator('firmCore', {
+                            initialValue: this.state.firmCore || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="科技人员"
+                    >
+                        {getFieldDecorator('techCore', {
+                            initialValue: this.state.techCore || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                </div>
+                <p className="hrSituation-title">全体人员结构</p>
+                <div className="clearfix">
+                    <span className="hrSituation-span">学历人数</span>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="博士"
+                    >
+                        {getFieldDecorator('doctor', {
+                            initialValue: this.state.doctor || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="硕士"
+                    >
+                        {getFieldDecorator('master', {
+                            initialValue: this.state.master || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="本科"
+                    >
+                        {getFieldDecorator('undergraduate', {
+                            initialValue: this.state.undergraduate || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="大专及以下"
+                    >
+                        {getFieldDecorator('college', {
+                            initialValue: this.state.college || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <span className="hrSituation-span">职称人数</span>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="高级职称"
+                    >
+                        {getFieldDecorator('seniorTitle', {
+                            initialValue: this.state.seniorTitle || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="中级职称"
+                    >
+                        {getFieldDecorator('intermediateTitle', {
+                            initialValue: this.state.intermediateTitle || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="初级职称"
+                    >
+                        {getFieldDecorator('juniorTitle', {
+                            initialValue: this.state.juniorTitle || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="高级技工"
+                    >
+                        {getFieldDecorator('seniorMechanic', {
+                            initialValue: this.state.seniorMechanic || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <span className="hrSituation-span">年龄人数</span>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="30及以下"
+                    >
+                        {getFieldDecorator('belowThirty', {
+                            initialValue: this.state.belowThirty || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="31-34"
+                    >
+                        {getFieldDecorator('thirtyoneToThirtyfour', {
+                            initialValue: this.state.thirtyoneToThirtyfour || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="41-50"
+                    >
+                        {getFieldDecorator('fortyoneToFifty', {
+                            initialValue: this.state.fortyoneToFifty || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="50以上"
+                    >
+                        {getFieldDecorator('aboveFifty', {
+                            initialValue: this.state.aboveFifty || null
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="socialSecurity"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'socialSecurity' }}
+                        beforeUpload={beforeUpload}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.socialSecurityUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传社保文件 </Button>
+                    </Upload>
+                </div>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="roster"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'roster' }}
+                        beforeUpload={beforeUpload}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.rosterUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传花名册文件 </Button>
+                    </Upload>
+                </div>
+                <div>
+                    <span style={{ color: "red" }}>提示</span>
+                    <p>1、总体情况的在职人员数、兼职人员数、临时聘用人员数相加小于等于企业职工总数。</p>
+                    <p>2、科技人员数小于等于企业职工总数。</p>
+                    <p>3、科技人员各项人数小于等于企业职工各项人数。</p>
+                    <p>4、全体人员结构中学历一栏人数总和小于等于职工人数。</p>
+                    <p>5、全体人员结构中年龄一栏人数总和小于等于职工人数。</p>
+                    <Button style={{ marginTop: "20px" }} className="set-submit" type="primary" htmlType="submit">保存</Button>
+                </div>
+            </Form >
+        );
+    },
+}));
+
+const Person = React.createClass({
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
+    render() {
+        const theYear = (new Date()).getFullYear() - 1;
+        return (
+            <Spin spinning={this.state.loading} className='spin-box'>
+                <div className="set-person">
+                    <div className="acc-detail">
+                        <Tabs defaultActiveKey={String(theYear)} >
+                            <Tabs.TabPane tab={theYear} key={theYear}>
+                                <PersonFrom year={theYear} spinState={this.spinChange} urlData={this.urlData} />
+                            </Tabs.TabPane>
+                            <Tabs.TabPane tab={theYear - 1} key={theYear - 1}>
+                                <PersonFrom year={theYear - 1} spinState={this.spinChange} urlData={this.urlData} />
+                            </Tabs.TabPane>
+                            <Tabs.TabPane tab={theYear - 2} key={theYear - 2}>
+                                <PersonFrom year={theYear - 2} spinState={this.spinChange} urlData={this.urlData} />
+                            </Tabs.TabPane>
+                        </Tabs>
+                    </div>
+                </div>
+            </Spin>
+        )
+    }
+});
+
+export default Person;

+ 26 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/hrSituation.less

@@ -0,0 +1,26 @@
+.hrSituation-form {
+    width: 100%;
+    .ant-form-item {
+        float: left;
+        .ant-input-number {
+            width: 80%;
+        }
+    }
+    .half-item {
+        width: 19%;
+    }
+    .hrSituation-title {
+        font-size: 16px;
+    }
+    .hrSituation-span {
+        float: left;
+        line-height: 32px;
+        width: 126px;
+        text-align: right;
+    }
+    .hrSituation-roster {
+        margin-top: 10px;
+        margin-bottom: 20px;
+        width: 400px;
+    }
+}

+ 218 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectual.jsx

@@ -0,0 +1,218 @@
+import React from 'react';
+import { Icon, Button, Input, Spin, Table, message, Select, Modal, DatePicker } from 'antd';
+import { techFieldList, technicalSourceList } from '../../../../dataDic.js';
+import { getCatagory, getIntellectualObtainWay } from '../../../../tools.js';
+import './intellectual.less';
+import moment from 'moment';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import IntellectualDesc from './intellectualDesc.jsx';
+
+const Intellectual = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/intellectualList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                startDate: this.state.startDateFormattedDate,
+                endDate: this.state.endDateFormattedDate
+            }
+        }).done((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,
+                    id: thisdata.id,
+                    uid: thisdata.uid,
+                    intellectualPropertyNumber: thisdata.intellectualPropertyNumber,
+                    intellectualPropertyName: thisdata.intellectualPropertyName,
+                    sortNumber: thisdata.sortNumber,
+                    catagory: thisdata.catagory,
+                    obtainWay: thisdata.obtainWay,
+                    authorizationNumber: thisdata.authorizationNumber,
+                    authorizationDate: thisdata.authorizationDate,
+                    evaluationCategory: thisdata.evaluationCategory,
+                    authorizationDateFormattedDate: thisdata.authorizationDateFormattedDate,
+                });
+            };
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'intellectualPropertyNumber',
+                    key: 'intellectualPropertyNumber'
+                }, {
+                    title: '知识产权名称',
+                    dataIndex: 'intellectualPropertyName',
+                    key: 'intellectualPropertyName'
+                }, {
+                    title: '排序号',
+                    dataIndex: 'sortNumber',
+                    key: 'sortNumber'
+                }, {
+                    title: '知识产权类型',
+                    dataIndex: 'catagory',
+                    key: 'catagory',
+                    render: text => { return getCatagory(text) }
+                }, {
+                    title: '获取方式',
+                    dataIndex: 'obtainWay',
+                    key: 'obtainWay',
+                    render: text => { return getIntellectualObtainWay(text) }
+                }, {
+                    title: '授权号',
+                    dataIndex: 'authorizationNumber',
+                    key: 'authorizationNumber'
+                }, {
+                    title: '授权时间',
+                    dataIndex: 'authorizationDateFormattedDate',
+                    key: 'authorizationDateFormattedDate'
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteIntellectual",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.startDateFormattedDate = undefined;
+        this.state.endDateFormattedDate = 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="user-content" >
+                <div className="content-title">
+                    <span>知识产权列表</span>
+                </div>
+                <div className="user-search">
+                    <span>开始日期:</span>
+                    <DatePicker
+                        value={this.state.startDateFormattedDate ? moment(this.state.startDateFormattedDate) : null}
+                        onChange={(data, dataString) => { this.setState({ startDateFormattedDate: dataString }); }} />
+                    <span>结束日期:</span>
+                    <DatePicker
+                        value={this.state.endDateFormattedDate ? moment(this.state.endDateFormattedDate) : null}
+                        onChange={(data, dataString) => { this.setState({ endDateFormattedDate: dataString }); }} />
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <IntellectualDesc data={this.state.RowData} showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default Intellectual;

+ 57 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectual.less

@@ -0,0 +1,57 @@
+.user-content {
+    background: #fff;
+    padding: 20px;
+    .content-title {
+        font-size: 16px;
+        color: #333;
+    }
+    .user-search {
+        margin: 20px 0;
+        input {
+            width: 200px;
+        }
+        >* {
+            margin-right: 20px;
+        }
+        p {
+            margin-top: 20px;
+            button {
+                margin-right: 20px;
+            }
+        }
+    }
+}
+
+.admin-desc-content {
+    .ant-modal-body {
+        >div {
+            margin-top: 10px;
+            p {
+                margin: 6px 0;
+            }
+        }
+    }
+    .half-div {
+        width: 50%;
+        float: left;
+        margin-top: 10px;
+        >span {
+            display: inline-block;
+            width: 100px;
+        }
+        >input {
+            width: 60%;
+        }
+        >textarea {
+            width: 94%;
+        }
+    }
+}
+
+.ant-form {
+    .ant-form-item {
+        .ant-form-item-label {
+            text-align: right;
+        }
+    }
+}

+ 244 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectualDesc.jsx

@@ -0,0 +1,244 @@
+import React from 'react';
+import { Icon, Modal, Button, Form, message, Input, Spin, Select, DatePicker } from 'antd';
+import { intellectualGetList, catagoryList } from '../../../../dataDic.js';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+import moment from 'moment';
+
+const IntellectualDescFrom = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            intellectualGetOption: [],
+            catagoryOption: []
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        intellectualGetList.map(function (item) {
+            _me.state.intellectualGetOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        catagoryList.map(function (item) {
+            _me.state.catagoryOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/cognizance/intellectual",
+                    data: {
+                        id: this.props.data.id,
+                        intellectualPropertyNumber: values.intellectualPropertyNumber,
+                        intellectualPropertyName: values.intellectualPropertyName,
+                        catagory: values.catagory,
+                        obtainWay: values.obtainWay,
+                        sortNumber: values.sortNumber,
+                        authorizationNumber: values.authorizationNumber,
+                        authorizationDateFormattedDate: values.authorizationDate._i || this.state.authorizationDateFormattedDate,
+                        propertyRightUrl: this.state.propertyRightUrl
+                    }
+                }).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.closeModal();
+                    this.props.form.resetFields();
+                }.bind(this));
+            }
+        });
+    },
+    checkIdcardnum(rule, value, callback) {
+        if (!/(^\d{15}$)|(^\d{17}(\d|X)$)/.test(value)) {
+            callback('请输入正确的身份证号!');
+        } else {
+            callback();
+        }
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Form horizontal onSubmit={this.handleSubmit}>
+                <FormItem
+                    {...formItemLayout}
+                    label="知识产权编号"
+                >
+                    {getFieldDecorator('intellectualPropertyNumber', {
+                        rules: [{ required: true, message: '请输入,知识产权编号不能为空!' }],
+                        initialValue: this.props.data.intellectualPropertyNumber
+                    })(
+                        <Input placeholder="请输入知识产权编号" />
+                        )}
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="知识产权名称"
+                >
+                    {getFieldDecorator('intellectualPropertyName', {
+                        rules: [{ required: true, message: '请输入,知识产权名称不能为空!' }],
+                        initialValue: this.props.data.intellectualPropertyName
+                    })(
+                        <Input placeholder="请输入知识产权名称" />
+                        )}
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="排序号"
+                >
+                    {getFieldDecorator('sortNumber', {
+                        rules: [{ required: true, message: '请输入,排序号不能为空!' }],
+                        initialValue: this.props.data.sortNumber
+                    })(
+                        <Input placeholder="请输入排序号" />
+                        )}
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="知识产权类型"
+                >
+                    {getFieldDecorator('catagory', {
+                        rules: [{ required: true, message: '请选择,知识产权类型不能为空!' }],
+                        initialValue: this.props.data.catagory
+                    })(
+                        <Select placeholder="请选择知识产权类型" style={{ width: 200 }}
+                            onChange={(e) => { this.state.catagory = e; }}>
+                            {this.state.catagoryOption}
+                        </Select>
+                        )}
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="获得方式"
+                >
+                    {getFieldDecorator('obtainWay', {
+                        rules: [{ required: true, message: '请选择,获得方式不能为空!' }],
+                        initialValue: this.props.data.obtainWay
+                    })(
+                        <Select placeholder="请选择获得方式" style={{ width: 200 }}
+                            onChange={(e) => { this.state.obtainWay = e; }}>
+                            {this.state.intellectualGetOption}
+                        </Select>
+                        )}
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="授权号"
+                >
+                    {getFieldDecorator('authorizationNumber', {
+                        rules: [{ required: true, message: '请输入,授权号不能为空!' }],
+                        initialValue: this.props.data.authorizationNumber
+                    })(
+                        <Input placeholder="请输入授权号" />
+                        )}
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="授权日期"
+                >
+                    {getFieldDecorator('authorizationDate', {
+                        rules: [{ type: 'object', required: true, message: '请选择,授权日期不能为空!' }],
+                        initialValue: !this.props.data.authorizationDateFormattedDate ? null : moment(this.props.data.authorizationDateFormattedDate, 'YYYY/MM/DD')
+                    })(
+                        <DatePicker style={{ width: 200 }}
+                            onChange={(data, dataString) => { this.state.authorizationDateFormattedDate = dataString }} />
+                        )}
+                </FormItem>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'propertyRight' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.propertyRightUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传知识产权证书 </Button>
+                    </Upload>
+                </div>
+                <FormItem>
+                    <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
+                    <Button type="ghost" style={{ marginLeft: '20px' }} onClick={this.props.closeModal}>取消</Button>
+                </FormItem>
+            </Form >
+        );
+    },
+}));
+
+
+const intellectualDesc = 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='600px'
+                        footer=''
+                    >
+                        <IntellectualDescFrom data={this.props.data} spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+export default intellectualDesc;

+ 458 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/orgTechCenter.jsx

@@ -0,0 +1,458 @@
+import React from 'react';
+import { Icon, Form, Button, Input, Spin, Table, message, Modal, Upload, DatePicker } from 'antd';
+import './techProduct.less';
+import { beforeUploadFile } from '../../../../tools.js';
+import moment from 'moment';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const CenterListDescFrom = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/cognizance/disposeHonor",
+                    data: {
+                        id: this.props.data.id,
+                        projectName: values.projectName,
+                        projectTime: values.projectTime.format("YYYY-MM-DD"),
+                        institution: values.institution,
+                        termTime: values.termTime.format("YYYY-MM-DD"),
+                        protocolUrl: this.state.protocolUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.closeModal();
+                        this.props.spinState(false);
+                        this.props.form.resetFields();
+                    } 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.props.data;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} className="activityCost-form">
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="时间"
+                    >
+                        {getFieldDecorator('projectTimeFormattedDate', {
+                            rules: [{ type: 'object', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.projectTimeFormattedDate ? moment(theData.projectTimeFormattedDate) : null
+                        })(
+                            <DatePicker />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="名称"
+                    >
+                        {getFieldDecorator('projectName', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.projectName
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="期限"
+                    >
+                        {getFieldDecorator('termTimeFormattedDate', {
+                            rules: [{ type: 'object', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.termTimeFormattedDate ? moment(theData.termTimeFormattedDate) : null
+                        })(
+                            <DatePicker />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="大学机构"
+                    >
+                        {getFieldDecorator('institution', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.institution
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'protocol' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.protocolUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传文件 </Button>
+                    </Upload>
+                </div>
+                <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 CenterListDesc = 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=''
+                    >
+                        <CenterListDescFrom data={this.props.data}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+
+const CenterList = React.createClass({
+    loadOrgTechCenterDetail() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/center",
+            data: {
+            }
+        }).done((data) => {
+            if (data.error.length || !data.data) {
+                message.warning(data.error[0].message);
+                return;
+            };
+            this.state.cid = data.data.id;
+            this.state.foundingTime = data.data.foundingTime;
+            this.state.principal = data.data.principal;
+            this.state.systemCatalog = data.data.systemCatalog;
+            this.state.systemUrl = data.data.systemUrl;
+            this.state.centerName = data.data.centerName;
+            this.state.beizhu = data.data.beizhu;
+            this.loadData();
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/centerDetail",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                cid: this.state.cid
+            }
+        }).done((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,
+                    id: thisdata.id,
+                    cid: thisdata.cid,
+                    projectTimeFormattedDate: thisdata.projectTimeFormattedDate,
+                    projectName: thisdata.projectName,
+                    protocolUrl: thisdata.protocolUrl,
+                    institution: thisdata.institution,
+                    termTimeFormattedDate: thisdata.termTimeFormattedDate
+                });
+            };
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'projectTimeFormattedDate',
+                    key: 'projectTimeFormattedDate'
+                }, {
+                    title: '名称',
+                    dataIndex: 'projectName',
+                    key: 'projectName'
+                }, {
+                    title: '期限',
+                    dataIndex: 'termTimeFormattedDate',
+                    key: 'termTimeFormattedDate'
+                }, {
+                    title: '大学机构',
+                    dataIndex: 'institution',
+                    key: 'institution'
+                }, {
+                    title: '协议附件',
+                    dataIndex: 'protocolUrl',
+                    key: 'protocolUrl',
+                    render: (text) => {
+                        <a href="" onClick={() => {
+                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + text + "&sign=" + "type")
+                        }}></a>
+                    }
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadOrgTechCenterDetail();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteHonor",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        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="user-content" >
+                <div className="content-title">
+                    <span>技术中心</span>
+                </div>
+                <div className="clearfix">
+                    <div className="orgTech-item">
+                        <span>中心名称: </span>
+                        <Input
+                            value={this.state.centerName}
+                            onChange={(e) => { this.setState({ centerName: e.target.value }); }}
+                        />
+                        <span>成立时间: </span>
+                        <DatePicker
+                            value={moment(this.state.foundingTime)}
+                            onChange={(date, dateString) => { this.setState({ foundingTime: dateString }); }}
+                        />
+                        <span>负责人: </span>
+                        <Input
+                            value={this.state.principal}
+                            onChange={(e) => { this.setState({ principal: e.target.value }); }}
+                        />
+                    </div>
+                    <div className="orgTech-item">
+                        <span>制度目录: </span>
+                        <Input type='textarea' rows={6}
+                            value={this.state.systemCatalog}
+                            onChange={(e) => { this.setState({ systemCatalog: e.target.value }); }}
+                        />
+                    </div>
+                    <div className="orgTech-item">
+                        <span>备注: </span>
+                        <Input type='textarea' rows={3}
+                            value={this.state.beizhu}
+                            onChange={(e) => { this.setState({ beizhu: e.target.value }); }}
+                        />
+                    </div>
+                </div>
+                <div className="half-item">
+                    <p>制度上传: (上传 zip 或者 rar 文件)</p>
+                    <Upload className="upload-box"
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'institution' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.systemUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传文件 </Button>
+                    </Upload>
+                </div>
+                <div className="content-title">
+                    <span>产学研情况</span>
+                </div>
+                <div className="user-search">
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <CenterListDesc data={this.state.RowData}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default CenterList;

+ 433 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/ratepay.jsx

@@ -0,0 +1,433 @@
+import React from 'react';
+import { Icon, Form, Button, Input, Spin, Table, message, Select, Modal, InputNumber, Upload } from 'antd';
+import './techProduct.less';
+import { beforeUpload } from '../../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const RatepayDescFrom = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            yearOption: [],
+        };
+    },
+    componentWillMount() {
+        let d = new Date();
+        let _me = this;
+        d = d.getFullYear();
+        for (let i = d; i > d - 20; i--) {
+            _me.state.yearOption.push(
+                <Select.Option value={i.toString()} key={i}>{i}</Select.Option>
+            )
+        }
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/cognizance/disposeRatepay",
+                    data: {
+                        id: this.props.data.id,
+                        operatingIncome: values.operatingIncome,
+                        managementCost: values.managementCost,
+                        operatingProfit: values.operatingProfit,
+                        nonOperatingIncome: values.nonOperatingIncome,
+                        nonTaxableIncome: values.nonTaxableIncome,
+                        taxExemptIncome: values.taxExemptIncome,
+                        subsidyIncome: values.subsidyIncome,
+                        year: this.state.year,
+                        taxReturnUrl: this.state.ratepayUrl,
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.closeModal();
+                        this.props.spinState(false);
+                        this.props.form.resetFields();
+                    } 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.props.data;
+        const formItemLayout = {
+            labelCol: { span: 10 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} className="activityCost-form">
+                <div className="activityCost-title"><span>年份: </span>
+                    {
+                        theData.year ? <span>{theData.year}</span> :
+                            <Select placeholder="请选择年份" style={{ width: 200 }}
+                                onSelect={(e, n) => { this.state.year = e }}>
+                                {this.state.yearOption}
+                            </Select>
+                    }
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="营业收入(万元)"
+                    >
+                        {getFieldDecorator('operatingIncome', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.operatingIncome
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="管理费用(万元)"
+                    >
+                        {getFieldDecorator('managementCost', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.managementCost
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="营业利润(万元)"
+                    >
+                        {getFieldDecorator('operatingProfit', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.operatingProfit
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="营业外收入(万元)"
+                    >
+                        {getFieldDecorator('nonOperatingIncome', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.nonOperatingIncome
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="不征税收入(万元)"
+                    >
+                        {getFieldDecorator('nonTaxableIncome', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.nonTaxableIncome
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="免税收入(万元)"
+                    >
+                        {getFieldDecorator('taxExemptIncome', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.taxExemptIncome
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="政府补助收入(万元)"
+                    >
+                        {getFieldDecorator('subsidyIncome', {
+                            rules: [{ type: 'number', required: true, message: '此项为必填项!' }],
+                            initialValue: theData.subsidyIncome
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'ratepay' }}
+                        beforeUpload={beforeUpload}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.ratepayUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传文件 </Button>
+                    </Upload>
+                </div>
+                <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 RatepayDesc = 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=''
+                    >
+                        <RatepayDescFrom data={this.props.data}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+
+const Ratepay = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/ratepay",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize
+            }
+        }).done((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,
+                    id: thisdata.id,
+                    uid: thisdata.uid,
+                    operatingIncome: thisdata.operatingIncome,
+                    managementCost: thisdata.managementCost,
+                    operatingProfit: thisdata.operatingProfit,
+                    nonOperatingIncome: thisdata.nonOperatingIncome,
+                    nonTaxableIncome: thisdata.nonTaxableIncome,
+                    taxExemptIncome: thisdata.taxExemptIncome,
+                    subsidyIncome: thisdata.subsidyIncome,
+                    year: thisdata.year,
+                    taxReturnUrl: thisdata.taxReturnUrl
+                });
+            };
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'year',
+                    key: 'year'
+                }, {
+                    title: '营业收入(万元)',
+                    dataIndex: 'operatingIncome',
+                    key: 'operatingIncome'
+                }, {
+                    title: '管理费用(万元)',
+                    dataIndex: 'managementCost',
+                    key: 'managementCost'
+                }, {
+                    title: '营业利润(万元)',
+                    dataIndex: 'operatingProfit',
+                    key: 'operatingProfit',
+                }, {
+                    title: '营业外收入(万元)',
+                    dataIndex: 'nonOperatingIncome',
+                    key: 'nonOperatingIncome',
+                }, {
+                    title: '相关附件',
+                    dataIndex: 'taxReturnUrl',
+                    key: 'taxReturnUrl',
+                    render: (text) => {
+                        <a href="" onClick={()=>{
+                            window.open(globalConfig.context + "/techservice/patent/downloadFile?path=" + text + "&sign=" + "type")
+                        }}></a>
+                    }
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteRatepay",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        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="user-content" >
+                <div className="content-title">
+                    <span>纳税申报信息</span>
+                </div>
+                <div className="user-search">
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <RatepayDesc data={this.state.RowData}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default Ratepay;

+ 337 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/standard.jsx

@@ -0,0 +1,337 @@
+import React from 'react';
+import { Icon, Button, Input, Spin, Table, message, Radio, Select, Modal } from 'antd';
+import './standard.less';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const StandardDesc = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false
+        };
+    },
+    handleOk() {
+        this.setState({
+            loading: true,
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/developStandard",
+            data: {
+                id: this.props.data.id,
+                standardName: this.state.standardName,
+                standardNumber: this.state.standardNumber,
+                standardLevel: this.state.standardLevel,
+                participateWay: this.state.participateWay
+            },
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        id: data.data.id,
+                        standardName: data.data.standardName,
+                        standardNumber: data.data.standardNumber,
+                        standardLevel: data.data.standardLevel,
+                        participateWay: data.data.participateWay
+                    });
+                } else if (data.error.length && data.error[0].message) {
+                    message.warning(data.error[0].message);
+                }
+            }.bind(this),
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.setState({
+                    loading: false,
+                    visible: false
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.props.closeDesc(false);
+        }.bind(this));
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc;
+        if (nextProps.data) {
+            this.state.standardName = nextProps.data.standardName;
+            this.state.standardNumber = nextProps.data.standardNumber;
+            this.state.standardLevel = nextProps.data.standardLevel;
+            this.state.participateWay = nextProps.data.participateWay;
+        };
+    },
+    render() {
+        if (this.props.data) {
+            return (
+                <div className="admin-desc">
+                    <Modal title="企业参与国家标准或行业标准制定情况明细" visible={this.state.visible} onCancel={this.handleCancel}
+                        width='400px' footer={[
+                            <Button key="submit" type="primary" size="large" loading={this.state.loading} onClick={this.handleOk}>确认</Button>,
+                            <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>
+                        ]}
+                        className="admin-desc-content">
+                        <div>
+                            <p>标准名称:</p>
+                            <Input defaultValue={this.props.data.standardName} value={this.state.standardName}
+                                onChange={(e) => { this.setState({ standardName: e.target.value }); }} />
+                        </div>
+                        <div>
+                            <p>标准编号:</p>
+                            <Input value={this.state.standardNumber}
+                                onChange={(e) => { this.setState({ standardNumber: e.target.value }); }} />
+                        </div>
+                        <div>
+                            <p>标准级别:</p>
+                            <Radio.Group value={this.state.standardLevel} onChange={(e) => { this.setState({ standardLevel: e.target.value }) }}>
+                                <Radio value="0">国家</Radio>
+                                <Radio value="1">行业</Radio>
+                            </Radio.Group>
+                        </div>
+                        <div>
+                            <p>参与方式:</p>
+                            <Radio.Group value={this.state.participateWay} onChange={(e) => { this.setState({ participateWay: e.target.value }) }}>
+                                <Radio value="0">主持</Radio>
+                                <Radio value="1">参与</Radio>
+                            </Radio.Group>
+                        </div>
+                    </Modal>
+                </div>
+            );
+        } else {
+            return <div></div>
+        }
+    },
+});
+
+const Standard = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/standard",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                standardName: this.state.standardName,
+                standardNumber: this.state.standardNumber,
+                standardLevel: this.state.standardLevel,
+                participateWay: this.state.participateWay
+            },
+            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 + 1,
+                        id: thisdata.id,
+                        uid: thisdata.uid,
+                        standardName: thisdata.standardName,
+                        standardNumber: thisdata.standardNumber,
+                        standardLevel: String(thisdata.standardLevel),
+                        participateWay: String(thisdata.participateWay),
+                        createTime: thisdata.createTime,
+                        createTimeFormattedDate: thisdata.createTimeFormattedDate
+                    });
+                };
+                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));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'key',
+                    key: 'key'
+                }, {
+                    title: '标准名称',
+                    dataIndex: 'standardName',
+                    key: 'standardName'
+                }, {
+                    title: '标准编号',
+                    dataIndex: 'standardNumber',
+                    key: 'standardNumber'
+                }, {
+                    title: '标准级别',
+                    dataIndex: 'standardLevel',
+                    key: 'standardLevel',
+                    render: text => {
+                        switch (String(text)) {
+                            case "0":
+                                return "国家";
+                            case "1":
+                                return "行业";
+                        }
+                    }
+                }, {
+                    title: '参与方式',
+                    dataIndex: 'participateWay',
+                    key: 'participateWay',
+                    render: text => {
+                        switch (String(text)) {
+                            case "0":
+                                return "主持";
+                            case "1":
+                                return "参与";
+                        }
+                    }
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteStandard",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.standardName = undefined;
+        this.state.standardNumber = undefined;
+        this.state.standardLevel = undefined;
+        this.state.participateWay = 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="user-content" >
+                <div className="content-title">
+                    <span>标准制定情况汇总</span>
+                </div>
+                <div className="user-search">
+                    <Input placeholder="标准名称" value={this.state.standardName}
+                        onChange={(e) => { this.setState({ standardName: e.target.value }); }} />
+                    <Input placeholder="标准编号" value={this.state.standardNumber}
+                        onChange={(e) => { this.setState({ standardNumber: e.target.value }); }} />
+                    <Select placeholder="标准级别" style={{ width: 200 }}
+                        value={this.state.standardLevel}
+                        onChange={(e) => { this.setState({ standardLevel: e }) }}>
+                        <Select.Option value="0" >国家</Select.Option>
+                        <Select.Option value="1" >行业</Select.Option>
+                    </Select>
+                    <Select placeholder="参与方式" style={{ width: 200 }}
+                        value={this.state.participateWay}
+                        onChange={(e) => { this.setState({ participateWay: e }) }}>
+                        <Select.Option value="0" >主持</Select.Option>
+                        <Select.Option value="1" >参与</Select.Option>
+                    </Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <StandardDesc data={this.state.RowData} showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default Standard;

+ 32 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/standard.less

@@ -0,0 +1,32 @@
+.user-content {
+    background: #fff;
+    padding: 20px;
+    .content-title {
+        font-size: 16px;
+        color: #333;
+    }
+    .user-search {
+        margin: 20px 0 ;
+        input {
+            width: 200px;
+        }
+        >* {
+            margin-right: 20px;
+        }
+        p {
+            margin-top:20px; 
+            button {
+                margin-right: 20px;
+            }
+        }
+    }
+}
+.admin-desc-content {
+    .ant-modal-body {
+        >div {
+            p {
+                margin: 6px 0;
+            }
+        }
+    }
+}

+ 540 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/techProduct.jsx

@@ -0,0 +1,540 @@
+import React from 'react';
+import { Icon, Upload, Form, Button, Radio, 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 './techProduct.less';
+import moment from 'moment';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const TechProductDescFrom = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            targetKeys: [],
+            selectedKeys: [],
+            technicalSourceOption: [],
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        technicalSourceList.map(function (item) {
+            _me.state.technicalSourceOption.push(
+                <Select.Option value={item.value} key={10000 + item.value}>{item.key}</Select.Option>
+            )
+        });
+        this.state.targetKeys = this.props.data.intellectualPropertyNumber;
+    },
+    componentWillReceiveProps(nextProps) {
+        if (nextProps.data) {
+            this.state.targetKeys = nextProps.data.intellectualPropertyNumber;
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.props.spinState(true);
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/techservice/cognizance/techProduct",
+                    data: {
+                        id: this.props.data.id,
+                        serialNumber: values.serialNumber,
+                        productName: values.productName,
+                        technicalField1: values.techField[0],
+                        technicalField2: values.techField[1],
+                        technicalField3: values.techField[2],
+                        technicalSource: values.technicalSource,
+                        lastYearRevenue: values.lastYearRevenue,
+                        mainProduct: values.mainProduct,
+                        intellectualPropertyNumber: this.state.targetKeys.join(","),
+                        keyTechnology: values.keyTechnology,
+                        competitiveEdge: values.competitiveEdge,
+                        conditionEffect: values.conditionEffect
+                    }
+                }).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));
+            }
+        });
+    },
+    intellectualChange(nextTargetKeys, direction, moveKeys) {
+        this.setState({ targetKeys: nextTargetKeys });
+    },
+    intellectualSelectChange(sourceSelectedKeys, targetSelectedKeys) {
+        this.setState({ selectedKeys: [...sourceSelectedKeys, ...targetSelectedKeys] });
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const theData = this.props.data;
+        const formItemLayout = {
+            labelCol: { span: 10 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Form onSubmit={this.handleSubmit} className="activityCost-form">
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="编号:ps"
+                    >
+                        {getFieldDecorator('serialNumber', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.serialNumber
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="产品(服务)名称"
+                    >
+                        {getFieldDecorator('productName', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.productName
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="技术来源"
+                    >
+                        {getFieldDecorator('technicalSource', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.technicalSource
+                        })(
+                            <Select placeholder="选择技术来源"
+                                onChange={(e) => { this.setState({ technicalSource: e }) }}>
+                                {this.state.technicalSourceOption}
+                            </Select>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        labelCol={{ span: 10 }}
+                        label="上年度销售收入(万元)"
+                    >
+                        {getFieldDecorator('lastYearRevenue', {
+                            rules: [{ type: "number", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.lastYearRevenue ? Number(theData.lastYearRevenue) : 0
+                        })(
+                            <InputNumber />
+                            )}
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 5 }}
+                    wrapperCol={{ span: 16 }}
+                    label="技术领域"
+                >
+                    {getFieldDecorator('techField', {
+                        rules: [{ type: "array", required: true, message: '此项为必填项!' }],
+                        initialValue: theData.techField
+                    })(
+                        <Cascader
+                            options={techFieldList}
+                            onChange={(value, selectedOptions) => { this.setState({ techField: value }); console.log(value) }}
+                            placeholder="请选择"
+                            showSearch
+                        />
+                        )}
+                </FormItem>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="是否主要产品(服务)"
+                    >
+                        {getFieldDecorator('mainProduct', {
+                            rules: [{ type: "number", required: true, message: '此项为必填项!' }],
+                            initialValue: theData.mainProduct
+                        })(
+                            <Radio.Group>
+                                <Radio value={1}>是</Radio>
+                                <Radio value={0}>否</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                </div>
+                <p>知识产权编号:</p>
+                <Transfer
+                    dataSource={this.props.mockData}
+                    listStyle={{
+                        width: 200,
+                        height: 200,
+                    }}
+                    titles={['未选择', '已选择']}
+                    targetKeys={this.state.targetKeys}
+                    selectedKeys={this.state.selectedKeys}
+                    onChange={this.intellectualChange}
+                    onSelectChange={this.intellectualSelectChange}
+                    render={item => `${item.name}-${item.key}`}
+                />
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        labelCol={{ span: 0 }}
+                        wrapperCol={{ span: 22 }}
+                    >
+                        <p>关键技术及主要技术指标(限400字)</p>
+                        {getFieldDecorator('keyTechnology', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.keyTechnology
+                        })(
+                            <Input type='textarea' rows={6} onChange={(e) => { if (e.target.value.length > 400) { return; } }} />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        labelCol={{ span: 0 }}
+                        wrapperCol={{ span: 22 }}
+                    >
+                        <p>与同类产品(服务)的竞争优势(限400字)</p>
+                        {getFieldDecorator('competitiveEdge', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.competitiveEdge
+                        })(
+                            <Input type='textarea' rows={6} onChange={(e) => { if (e.target.value.length > 400) { return; } }} />
+                            )}
+                    </FormItem>
+                    <p style={{ lineHeight: "32px" }}>知识产权获得情况及其对产品(服务)在技术上发挥的支持作用(限400字)*</p>
+                    <FormItem className="half-item"
+                        labelCol={{ span: 0 }}
+                        wrapperCol={{ span: 22 }}
+                    >
+                        {getFieldDecorator('conditionEffect', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.conditionEffect
+                        })(
+                            <Input type='textarea' rows={6} onChange={(e) => { if (e.target.value.length > 400) { return; } }} />
+                            )}
+                    </FormItem>
+                </div>
+                <div style={{ width: '50%' }}>
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'proof' }}
+                        beforeUpload={beforeUploadFile}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.proofUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传台账 </Button>
+                    </Upload>
+                </div>
+                <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 TechProductDesc = 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=''
+                    >
+                        <TechProductDescFrom data={this.props.data} mockData={this.props.mockData}
+                            spinState={this.spinChange} closeModal={this.handleCancel} />
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+
+const TechProduct = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.when($.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/techProductList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize
+            }
+        }), $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/intellectualList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: 99,
+            }
+        })).done((data1, data2) => {
+            let data = data1[0];
+            let intellectualList = data2[0];
+            if (data.error.length || !data.data || !data.data.list) {
+                message.warning(data.error[0].message);
+                return;
+            };
+            if (intellectualList.error.length || !intellectualList.data || !intellectualList.data.list) {
+                message.warning(intellectualList.error[0].message);
+                return;
+            };
+            let theArr = [];
+            for (let i = 0; i < intellectualList.data.list.length; i++) {
+                theArr.push({
+                    key: intellectualList.data.list[i].intellectualPropertyNumber,
+                    name: intellectualList.data.list[i].intellectualPropertyName
+                });
+            };
+            this.state.mockData = theArr;
+            for (let i = 0; i < data.data.list.length; i++) {
+                let thisdata = data.data.list[i];
+                this.state.data.push({
+                    key: i,
+                    id: thisdata.id,
+                    uid: thisdata.uid,
+
+                    mockData: this.state.mockData,
+
+                    serialNumber: thisdata.serialNumber,
+                    productName: thisdata.productName,
+
+                    techField: [Number(thisdata.technicalField1), Number(thisdata.technicalField2), Number(thisdata.technicalField3)],
+                    technicalField: getTechField(thisdata.technicalField1, thisdata.technicalField2, thisdata.technicalField3),
+                    technicalField1: thisdata.technicalField1,
+                    technicalField2: thisdata.technicalField2,
+                    technicalField3: thisdata.technicalField3,
+
+                    technicalSource: String(thisdata.technicalSource),
+                    lastYearRevenue: thisdata.lastYearRevenue,
+                    mainProduct: thisdata.mainProduct,
+
+                    PropertyNumber: thisdata.intellectualPropertyNumber,
+                    intellectualPropertyNumber: thisdata.intellectualPropertyNumber ? thisdata.intellectualPropertyNumber.split(",") : [],
+
+                    keyTechnology: thisdata.keyTechnology,
+                    competitiveEdge: thisdata.competitiveEdge,
+                    conditionEffect: thisdata.conditionEffect,
+                    year: thisdata.year,
+                    createTime: thisdata.createTime,
+                });
+            };
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+            this.setState({
+                dataSource: this.state.data,
+                pagination: this.state.pagination
+            });
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: 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: 'productName',
+                    key: 'productName'
+                }, {
+                    title: '技术领域',
+                    dataIndex: 'technicalField',
+                    key: 'technicalField'
+                }, {
+                    title: '技术来源',
+                    dataIndex: 'technicalSource',
+                    key: 'technicalSource',
+                    render: (text) => { return getTechnicalSource(text) }
+                }, {
+                    title: '上年度销售收入(万元)',
+                    dataIndex: 'lastYearRevenue',
+                    key: 'lastYearRevenue'
+                }, {
+                    title: '是否主要产品(服务)',
+                    dataIndex: 'mainProduct',
+                    key: 'mainProduct',
+                    render: (text) => { if (text == "1") { return '是' } else { return '否' } }
+                }, {
+                    title: '知识产权编号',
+                    dataIndex: 'PropertyNumber',
+                    key: 'PropertyNumber'
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    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.id) {
+                deletedIds.push(rowItem.id)
+            }
+        }
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/cognizance/deleteTechProduct",
+            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();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        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="user-content" >
+                <div className="content-title">
+                    <span>上年度高新技术产品(服务)情况表</span>
+                </div>
+                <div className="user-search">
+                    <p>
+                        <Button style={{ background: "#ea0862", border: "none", color: "#fff" }}
+                            onClick={this.tableRowClick}>添加<Icon type="plus" /></Button>
+                        <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                            disabled={!hasSelected}
+                            onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    </p>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            rowSelection={rowSelection}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <TechProductDesc data={this.state.RowData}
+                    mockData={this.state.mockData}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default TechProduct;

+ 27 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/techProduct.less

@@ -0,0 +1,27 @@
+.user-content {
+    .clearfix {
+        >.orgTech-item {
+            width: 60%;
+            display: inline-block;
+            >span {
+                margin-right: 10px;
+            }
+            >input {
+                width: 200px;
+                margin-right: 10px;
+            }
+            >textarea {
+                margin-top: 6px;
+            }
+        }
+        >div {
+            margin-bottom: 10px;
+        }
+    }
+}
+
+.upload-box {
+    display: inline-block;
+    margin-top: 10px;
+    margin-bottom: 20px;
+}

+ 242 - 0
js/component/manageCenter/servicesManage/highTech/highTechFoster.jsx

@@ -0,0 +1,242 @@
+import React from 'react';
+import { Icon, Button, Input, Select, Spin, Table, DatePicker, message, Cascader } from 'antd';
+import { techFieldList, provinceArr } from '../../../dataDic.js';
+import { getTime, getPatentState } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import './highTechFoster.less';
+import FosterDesc from './fosterDesc/content.jsx';
+
+const Patent = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/listCognizance",
+            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;
+                }
+                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,
+                        cid: thisdata.cid,
+                        serialNumber: thisdata.serialNumber,
+                        locationProvince: thisdata.locationProvince,
+                        unitName: thisdata.unitName,
+                        contacts: thisdata.contacts,
+                        createTime: thisdata.createTime,
+                        comment: thisdata.comment,
+                        state: thisdata.state,
+                        certificateNumber: thisdata.certificateNumber,
+                        issuingDate: thisdata.issuingDate,
+                        consultant: thisdata.consultant,
+                        createTimeFormattedDate: thisdata.createTimeFormattedDate,
+                        issuingDateFormattedDate: thisdata.issuingDateFormattedDate,
+                        endtime: getTime(thisdata.issuingDateFormattedDate, 36)
+                    });
+                };
+                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: [],
+            fosterDescDisplay: 'none',
+            fosterDisplay: 'block',
+            province: '',
+            unitName: '',
+            data: [],
+            loading: 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: 'locationProvince',
+                    key: 'locationProvince',
+                }, {
+                    title: '公司名称',
+                    dataIndex: 'unitName',
+                    key: 'unitName',
+                }, {
+                    title: '联系方式',
+                    dataIndex: 'contacts',
+                    key: 'contacts',
+                }, {
+                    title: '状态',
+                    dataIndex: 'state',
+                    key: 'state',
+                    render: text => { return getPatentState(text) }
+                }, {
+                    title: '证书编号',
+                    dataIndex: 'certificateNumber',
+                    key: 'certificateNumber',
+                }, {
+                    title: '发证日期',
+                    dataIndex: 'issuingDateFormattedDate',
+                    key: 'issuingDateFormattedDate',
+                }, {
+                    title: '到期日期',
+                    dataIndex: 'endtime',
+                    key: 'endtime'
+                }, {
+                    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();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            fosterDisplay: 'none',
+            fosterDescDisplay: 'block'
+        });
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.province = undefined;
+        this.state.unitName = undefined;
+        this.loadData();
+    },
+    returnBtn() {
+        this.setState({
+            fosterDisplay: 'block',
+            fosterDescDisplay: 'none'
+        });
+    },
+    render() {
+        return (
+            <div className="foster-box">
+                <div className="foster-content" style={{ display: this.state.fosterDisplay }}>
+                    <div className="content-title">
+                        <span>高企认定培育</span>
+                    </div>
+                    <div className="foster-query">
+                        <Select placeholder="选择省份" style={{ width: 200 }} onChange={(e) => { this.state.province = e }}>{this.state.provinceOption}</Select>
+                        <Select placeholder="选择公司" style={{ width: 200 }} onChange={(e) => { this.state.unitName = e }}>{this.state.companyOption}</Select>
+                        <Button type="primary" onClick={this.search}>搜索</Button>
+                        <Button onClick={this.reset}>重置</Button>
+                    </div>
+                    <div className="foster-table">
+                        <Spin spinning={this.state.loading}>
+                            <Table columns={this.state.columns}
+                                dataSource={this.state.dataSource}
+                                pagination={this.state.pagination}
+                                onRowClick={this.tableRowClick} />
+                        </Spin>
+                    </div>
+                </div >
+                <FosterDesc style={this.state.fosterDescDisplay}
+                    companyId={this.state.companyId}
+                    returnBtn={this.returnBtn} />
+            </div>
+        );
+    }
+});
+
+export default Patent;

+ 32 - 0
js/component/manageCenter/servicesManage/highTech/highTechFoster.less

@@ -0,0 +1,32 @@
+.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;
+            }
+        }
+    }
+}

+ 38 - 35
js/component/manageCenter/servicesManage/leftTab.jsx

@@ -9,29 +9,55 @@ const LeftTab = React.createClass({
     getInitialState() {
         return {
             current: 'comprehensive',
+            subKey: 'sub1',
+            keyList: [
+                { key: 'sub1', value: ['comprehensive', 'payment', 'correction', 'express', 'applyFee'] },
+                { key: 'sub2', value: [] },
+                { key: 'sub3', value: ['highTechApply', 'highTechFoster'] }
+            ]
         };
     },
     handleClick(e) {
+        if (this.state.subKey !== e.keyPath[1]) {
+            switch (e.keyPath[1]) {
+                case 'sub1':
+                    location.href = globalConfig.context + '/admin/servicesManage/patent.html#' + e.key;
+                case 'sub2':
+                    return;
+                case 'sub3':
+                    location.href = globalConfig.context + '/admin/servicesManage/highTech.html#' + e.key;
+            }
+        };
         this.props.handlekey(e.key);
         this.setState({
             current: e.key,
         });
     },
-    componentWillMount(){
-        if ( window.location.hash ) {
-            this.state.current = window.location.hash.substr(1);
+    componentWillMount() {
+        const _me = this;
+        if (window.location.hash) {
+            let theKey = window.location.hash.substr(1);
+            this.state.keyList.map(function (item1) {
+                item1.value.map(function (item2) {
+                    if (theKey == item2) {
+                        _me.state.subKey = item1.key
+                    }
+                });
+            });
+            this.state.current = theKey;
         };
     },
     render() {
         return (
             <Menu onClick={this.handleClick}
                 selectedKeys={[this.state.current]}
-                defaultOpenKeys={['sub1']}
+                defaultOpenKeys={[this.state.subKey]}
                 mode="vertical"
                 className="account-left"
                 mode="inline"
-                >
-                <SubMenu key="sub1" title={<span>专利申请管理</span>}>
+            >
+                <SubMenu key="sub1"
+                    title={<div>专利申请管理</div>}>
                     <Menu.Item key="comprehensive">
                         专利综合管理
                     </Menu.Item>
@@ -49,37 +75,14 @@ const LeftTab = React.createClass({
                     </Menu.Item>
                 </SubMenu>
                 <SubMenu key="sub2" title={<span>软著申请管理</span>}>
-                    <Menu.Item key="1">
-                        专利综合管理
-                    </Menu.Item>
-                    <Menu.Item key="2">
-                        待缴费专利管理
-                    </Menu.Item>
-                    <Menu.Item key="3">
-                        补正审查通知管理
-                    </Menu.Item>
-                    <Menu.Item key="4">
-                        专利纸件收发登记
-                    </Menu.Item>
-                    <Menu.Item key="5">
-                        专利申请费用管理
-                    </Menu.Item>
                 </SubMenu>
-                <SubMenu key="sub3" title={<span>高企认定管理</span>}>
-                    <Menu.Item key="11">
-                        专利综合管理
+                <SubMenu key="sub3"
+                    title={<div>高企认定管理</div>}>
+                    <Menu.Item key="highTechApply">
+                        高企认定申请
                     </Menu.Item>
-                    <Menu.Item key="12">
-                        待缴费专利管理
-                    </Menu.Item>
-                    <Menu.Item key="13">
-                        补正审查通知管理
-                    </Menu.Item>
-                    <Menu.Item key="14">
-                        专利纸件收发登记
-                    </Menu.Item>
-                    <Menu.Item key="15">
-                        专利申请费用管理
+                    <Menu.Item key="highTechFoster">
+                        高企认定培育
                     </Menu.Item>
                 </SubMenu>
                 <SubMenu key="sub4" title={<span>科技项目申报管理</span>}>

+ 1 - 1
js/component/manageCenter/userManage/content.jsx

@@ -9,7 +9,7 @@ class Content extends Component {
         super();
         this.state = {
             loading: false,
-            leftKey: 'orgList',
+            leftKey: 'userList',
         };
     }
 

+ 0 - 41
js/component/manageCenter/userManage/leftTab.less

@@ -1,41 +0,0 @@
-.acc-content {
-    .account-left {
-        width: 16%;
-        height: 100%;
-        padding-top: 40px;
-        float: left;
-        border-right: none;
-        background: #e8f2fc;
-        .ant-menu-submenu {
-            .ant-menu-submenu-title {
-                padding: 0!important;
-                margin: 0;
-                border-right: none;
-                text-align: center;
-                font-size: 16px;
-                color: #4466bf;
-                background: #d5e4f7;
-                border-top: 1px solid #f2f8fd;
-                border-bottom: 1px solid #c0d2e4;
-                &:after {
-                    font-size: 24px;
-                } 
-            }
-        }
-        .ant-menu-item { 
-            padding: 0;
-            margin: 0;
-            border-right: none;
-            text-align: center;
-            font-size: 16px;
-            color: #4466bf;
-            background: #d5e4f7;
-            border-top: 1px solid #f2f8fd;
-            border-bottom: 1px solid #c0d2e4;
-        }
-        .ant-menu-item-selected {
-            background: #fff;
-            border-left: 3px solid #58a3ff;
-        }
-    }
-}

+ 13 - 1
js/component/tools.js

@@ -8,7 +8,8 @@ import {
     techFieldList,
     technicalSourceList,
     catagoryList,
-    intellectualGetList
+    intellectualGetList,
+    conversionFormList
 } from './dataDic.js';
 
 module.exports = {
@@ -222,5 +223,16 @@ module.exports = {
             });
             return theType;
         }
+    },
+    getConversionForm: function (e) {
+        if (e) {
+            let theType = '';
+            conversionFormList.map(function (item) {
+                if (item.value == e) {
+                    theType = item.key;
+                };
+            });
+            return theType;
+        }
     }
 }

+ 20 - 0
webpack.config.js

@@ -63,6 +63,14 @@ module.exports = {
         'admin/servicesManage/patent': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
             'webpack/hot/only-dev-server',
             './js/admin/servicesManage/patent.js'
+        ],
+        'admin/servicesManage/copyright': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
+            'webpack/hot/only-dev-server',
+            './js/admin/servicesManage/copyright.js'
+        ],
+        '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'
         ]
         //vendors: ['jquery','antd']
         //path.resolve(__dirname, './js/index.js'),
@@ -189,6 +197,18 @@ module.exports = {
             template: './template/template.html',
             chunks: ['admin/servicesManage/patent', 'vendors']
         }),
+        new HtmlWebpackPlugin({
+            title: '管理员-科技服务管理-软著',
+            filename: 'admin/servicesManage/copyright.html',
+            template: './template/template.html',
+            chunks: ['admin/servicesManage/copyright', 'vendors']
+        }),
+        new HtmlWebpackPlugin({
+            title: '管理员-科技服务管理-高企',
+            filename: 'admin/servicesManage/highTech.html',
+            template: './template/template.html',
+            chunks: ['admin/servicesManage/highTech', 'vendors']
+        }),
 
 
 

+ 15 - 1
webpack.config.pro.js

@@ -27,6 +27,8 @@ module.exports = {
         'admin/userManage': './js/admin/userManage.js',
         //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',
 
         vendors: ['jquery']
     },
@@ -158,6 +160,18 @@ module.exports = {
             filename: 'admin/servicesManage/patent.html',
             template: './template/template.html',
             chunks: ['admin/servicesManage/patent', 'vendors']
-        })
+        }),
+        new HtmlWebpackPlugin({
+            title: '管理员-科技服务管理-软著',
+            filename: 'admin/servicesManage/copyright.html',
+            template: './template/template.html',
+            chunks: ['admin/servicesManage/copyright', 'vendors']
+        }),
+        new HtmlWebpackPlugin({
+            title: '管理员-科技服务管理-高企',
+            filename: 'admin/servicesManage/highTech.html',
+            template: './template/template.html',
+            chunks: ['admin/servicesManage/highTech', 'vendors']
+        }),
     ]
 };