Parcourir la source

管理端专利管理

yee il y a 8 ans
Parent
commit
3dba4fde79
65 fichiers modifiés avec 3290 ajouts et 226 suppressions
  1. 1 0
      build/admin/index.css
  2. 1 1
      build/admin/index.html
  3. 19 1
      build/admin/index.js
  4. 1 0
      build/admin/login.css
  5. 1 1
      build/admin/login.html
  6. 18 1
      build/admin/login.js
  7. 1 1
      build/admin/servicesManage/patent.css
  8. 26 6
      build/admin/servicesManage/patent.js
  9. 1 1
      build/user/account/index.css
  10. 5 5
      build/user/account/index.js
  11. 1 1
      build/user/account/services.css
  12. 16 6
      build/user/account/services.js
  13. 1 1
      build/user/account/set.css
  14. 25 25
      build/user/account/set.js
  15. 1 0
      build/user/certify.css
  16. 32 0
      build/user/certify.html
  17. 6 0
      build/user/certify.js
  18. 1 1
      build/user/index.js
  19. 1 1
      build/user/login.css
  20. 6 6
      build/user/login.js
  21. 1 1
      build/user/signIn.css
  22. 8 8
      build/user/signIn.js
  23. 2 2
      build/vendors.js
  24. BIN
      image/fst.png
  25. BIN
      image/none.png
  26. BIN
      image/scd.png
  27. BIN
      image/trd.png
  28. 9 2
      js/admin/index.js
  29. 3 2
      js/admin/login.js
  30. 28 14
      js/component/account/services/patent.jsx
  31. 7 0
      js/component/account/services/patent.less
  32. 5 3
      js/component/account/services/patentAdd.jsx
  33. 13 7
      js/component/account/services/patentDesc.jsx
  34. 152 0
      js/component/certify/certify.less
  35. 59 0
      js/component/certify/content.jsx
  36. 15 0
      js/component/certify/footer.jsx
  37. 14 0
      js/component/certify/personal.jsx
  38. 29 0
      js/component/certify/top.jsx
  39. 30 8
      js/component/dataDic.js
  40. 93 0
      js/component/login/adminLogin.jsx
  41. 54 0
      js/component/login/adminLogin.less
  42. 138 0
      js/component/manageCenter/index/content.jsx
  43. 127 0
      js/component/manageCenter/index/content.less
  44. 44 0
      js/component/manageCenter/index/leftTab.jsx
  45. 25 0
      js/component/manageCenter/index/leftTab.less
  46. 29 9
      js/component/manageCenter/leftTab.less
  47. 30 0
      js/component/manageCenter/servicesManage/leftTab.jsx
  48. 274 0
      js/component/manageCenter/servicesManage/patent/comPatentAdd.jsx
  49. 202 0
      js/component/manageCenter/servicesManage/patent/comPatentDesc.jsx
  50. 352 8
      js/component/manageCenter/servicesManage/patent/comprehensive.jsx
  51. 179 0
      js/component/manageCenter/servicesManage/patent/comprehensive.less
  52. 9 11
      js/component/manageCenter/servicesManage/patent/content.jsx
  53. 350 8
      js/component/manageCenter/servicesManage/patent/correction.jsx
  54. 84 0
      js/component/manageCenter/servicesManage/patent/correctionDesc.jsx
  55. 148 8
      js/component/manageCenter/servicesManage/patent/express.jsx
  56. 183 0
      js/component/manageCenter/servicesManage/patent/expressDesc.jsx
  57. 178 8
      js/component/manageCenter/servicesManage/patent/payment.jsx
  58. 84 0
      js/component/manageCenter/servicesManage/patent/paymentDesc.jsx
  59. 1 1
      js/component/manageCenter/topTab.jsx
  60. 119 66
      js/component/tools.js
  61. 17 0
      js/user/certify.js
  62. 1 1
      js/user/login.js
  63. 1 1
      js/user/signIn.js
  64. 22 0
      webpack.config.js
  65. 7 0
      webpack.config.pro.js

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
build/admin/index.css


+ 1 - 1
build/admin/index.html

@@ -23,7 +23,7 @@
             uploadPrivatePath: "/data/upload"
         }
     </script>
-</head>
+<link href="../admin/index.css" rel="stylesheet"></head>
 
 <body>
     <div id="root"></div>

Fichier diff supprimé car celui-ci est trop grand
+ 19 - 1
build/admin/index.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
build/admin/login.css


+ 1 - 1
build/admin/login.html

@@ -23,7 +23,7 @@
             uploadPrivatePath: "/data/upload"
         }
     </script>
-</head>
+<link href="../admin/login.css" rel="stylesheet"></head>
 
 <body>
     <div id="root"></div>

Fichier diff supprimé car celui-ci est trop grand
+ 18 - 1
build/admin/login.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
build/admin/servicesManage/patent.css


Fichier diff supprimé car celui-ci est trop grand
+ 26 - 6
build/admin/servicesManage/patent.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
build/user/account/index.css


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 5
build/user/account/index.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
build/user/account/services.css


Fichier diff supprimé car celui-ci est trop grand
+ 16 - 6
build/user/account/services.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
build/user/account/set.css


Fichier diff supprimé car celui-ci est trop grand
+ 25 - 25
build/user/account/set.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
build/user/certify.css


+ 32 - 0
build/user/certify.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="../user/certify.css" rel="stylesheet"></head>
+
+<body>
+    <div id="root"></div>
+<script type="text/javascript" src="../vendors.js"></script><script type="text/javascript" src="../user/certify.js"></script></body>
+
+</html>

Fichier diff supprimé car celui-ci est trop grand
+ 6 - 0
build/user/certify.js


+ 1 - 1
build/user/index.js

@@ -1 +1 @@
-webpackJsonp([7],[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([8],[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"))}]);

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
build/user/login.css


Fichier diff supprimé car celui-ci est trop grand
+ 6 - 6
build/user/login.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
build/user/signIn.css


Fichier diff supprimé car celui-ci est trop grand
+ 8 - 8
build/user/signIn.js


Fichier diff supprimé car celui-ci est trop grand
+ 2 - 2
build/vendors.js


BIN
image/fst.png


BIN
image/none.png


BIN
image/scd.png


BIN
image/trd.png


+ 9 - 2
js/admin/index.js

@@ -1,9 +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/index/content.jsx';
 
 ReactDOM.render(
-    <div>
-        <span>this is admin_index</span>
+    <div className="wrap clearfix">
+        <TopTab/>
+        <Content />
+        <Footer />
     </div>,
     document.getElementById('root')
 )

+ 3 - 2
js/admin/login.js

@@ -1,9 +1,10 @@
 import React from 'react';
 import ReactDOM from 'react-dom';
+import Login from '../component/login/adminLogin.jsx';
 
 ReactDOM.render(
-    <div>
-        <span>this is admin_login</span>
+    <div className="wrap clearfix">
+        <Login />
     </div>,
     document.getElementById('root')
 )

+ 28 - 14
js/component/account/services/patent.jsx

@@ -1,6 +1,6 @@
 import React from 'react';
 import { Icon, Alert, Button, Input, Select, Spin, Table } from 'antd';
-import { patentType, patentState } from '../../dataDic.js';
+import { patentTypeList, patentStateList } from '../../dataDic.js';
 import ajax from 'jquery/src/ajax/xhr.js'
 import $ from 'jquery/src/ajax';
 import './patent.less';
@@ -21,10 +21,10 @@ const Patent = React.createClass({
             data: {
                 pageNo: pageNo || 1,
                 pageSize: this.state.pagination.pageSize,
-                patentNumber: this.state.patentNumber,
-                patentName: this.state.patentName,
-                patentCatagory: this.state.patentType,
-                patentState: this.state.patentState
+                patentNumber: this.state.searchNum,
+                patentName: this.state.searchName,
+                patentCatagory: this.state.searchType,
+                patentState: this.state.searchState
             },
             success: function (data) {
                 if (data.error.length || !data.data || !data.data.list) {
@@ -104,7 +104,7 @@ const Patent = React.createClass({
                     dataIndex: 'number',
                     key: 'number',
                 }, {
-                    title: '申请号专利号',
+                    title: '申请号/专利号',
                     dataIndex: 'patentNum',
                     key: 'patentNum',
                 }, {
@@ -134,12 +134,12 @@ const Patent = React.createClass({
     },
     componentWillMount() {
         let _me = this;
-        patentType.map(function (item) {
+        patentTypeList.map(function (item) {
             _me.state.patentTypeOption.push(
                 <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
             )
         });
-        patentState.map(function (item) {
+        patentStateList.map(function (item) {
             _me.state.patentStateOption.push(
                 <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
             )
@@ -158,6 +158,20 @@ const Patent = React.createClass({
     closeDesc(e){
             this.state.showDesc = e;
     },
+    search(){
+        this.state.searchNum;
+        this.state.searchName;
+        this.state.searchType;
+        this.state.searchState;
+        this.loadData();
+    },
+    reset(){
+        this.state.searchNum = "";
+        this.state.searchName = "";
+        this.state.searchType = "";
+        this.state.searchState = "";
+        this.loadData();
+    },
     render() {
         return (
             <div className="patent-content" >
@@ -172,12 +186,12 @@ const Patent = React.createClass({
                     onClose={this.alertClose}
                     />
                 <div className="patent-query">
-                    <Input placeholder="专利号" />
-                    <Input placeholder="专利名称" />
-                    <Select style={{ width: 200 }}>{this.state.patentTypeOption}</Select>
-                    <Select style={{ width: 200 }}>{this.state.patentStateOption}</Select>
-                    <Button type="primary">搜索</Button>
-                    <Button type="ghost">重置</Button>
+                    <Input placeholder="专利号" value={this.state.searchNum} onChange={(e)=>{ this.setState({searchNum : e.target.value});}}/>
+                    <Input placeholder="专利名称" value={this.state.searchName} onChange={(e)=>{this.setState({searchName : e.target.value});}}/>
+                    <Select placeholder="专利类型" value={this.state.searchType} style={{ width: 200 }} onChange={(e)=>{this.setState({searchType : e});}}>{this.state.patentTypeOption}</Select>
+                    <Select placeholder="专利状态" value={this.state.searchState} style={{ width: 200 }} onChange={(e)=>{this.setState({searchState : e});}}>{this.state.patentStateOption}</Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button type="ghost" onClick={this.reset}>重置</Button>
                 </div>
                 <div className="patent-table">
                     <Spin spinning={this.state.loading}>

+ 7 - 0
js/component/account/services/patent.less

@@ -106,4 +106,11 @@
             }
         }
     }
+}
+.ant-select-dropdown {
+    .ant-select-dropdown-menu {
+        li:first-child{
+            display: none;
+        }
+    }
 }

+ 5 - 3
js/component/account/services/patentAdd.jsx

@@ -97,6 +97,8 @@ const PatentAddFrom = Form.create()(React.createClass({
                     }
                 }.bind(this)).always(function () {
                     this.props.spinState(false);
+                    this.props.closeModal();
+                    this.props.form.resetFields();
                 }.bind(this));
             }
         });
@@ -144,7 +146,7 @@ const PatentAddFrom = Form.create()(React.createClass({
                         initialValue: this.state.intro || null
                     })(
                         <Input type="textarea"
-                            placeholder="多行"
+                            placeholder="多行输入"
                             rows={6} />
                         )}
                 </FormItem>
@@ -203,7 +205,7 @@ const PatentAddFrom = Form.create()(React.createClass({
                 </FormItem>
                 <FormItem>
                     <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
-                    <Button type="ghost" style={{marginLeft:'20px'}} onClick={this.props.closeBtn}>取消</Button>
+                    <Button type="ghost" style={{marginLeft:'20px'}} onClick={this.props.closeModal}>取消</Button>
                 </FormItem>
             </Form >
         );
@@ -248,7 +250,7 @@ const PatentAdd = React.createClass({
                         width='800px'
                         footer=''
                         >
-                        <PatentAddFrom spinState={this.spinChange} closeBtn={this.handleCancel}/>
+                        <PatentAddFrom spinState={this.spinChange} closeModal={this.handleCancel}/>
                     </Modal>
                 </Spin>
             </div>

+ 13 - 7
js/component/account/services/patentDesc.jsx

@@ -1,5 +1,5 @@
 import React from 'react';
-import { Icon, Modal, message, Spin, } from 'antd';
+import { Icon, Modal, message, Spin, Steps } from 'antd';
 import './patent.less';
 
 const PatentDesc = React.createClass({
@@ -30,7 +30,8 @@ const PatentDesc = React.createClass({
         this.props.closeDesc(false);
     },
     render() {
-        let theData = this.props.data;
+        const Step = Steps.Step;
+        const theData = this.props.data;
         if (this.props.data) {
             return (
                 <div className="patent-desc">
@@ -54,19 +55,19 @@ const PatentDesc = React.createClass({
                             </div>
                             <div>
                                 <span>简介:</span>{theData.patentDes}
-                        </div>
+                            </div>
                             <div>
                                 <span>专利相关材料:</span>{theData.number}
-                        </div>
+                            </div>
                             <div>
                                 <span>专利申请日:</span>{theData.number}
-                        </div>
+                            </div>
                             <div>
                                 <span>专利授权日:</span>{theData.number}
-                        </div>
+                            </div>
                             <div>
                                 <span>每年年费缴费截止日:</span>{theData.number}
-                        </div>
+                            </div>
                             <div>
                                 <p>第一发明人:</p>
                                 <p><span>姓名:</span>{theData.firstInventorName}</p>
@@ -80,6 +81,11 @@ const PatentDesc = React.createClass({
                                 <p>第三发明人:</p>
                                 <p><span>姓名:</span>{theData.thirdInventorName}</p>
                             </div>
+                            <Steps direction="vertical" size="small" current={1}>
+                                <Step title="Finished" description="This is a description." />
+                                <Step title="In Progress" description="This is a description." />
+                                <Step title="Waiting" description="This is a description." />
+                            </Steps>
                         </Modal>
                     </Spin>
                 </div>

+ 152 - 0
js/component/certify/certify.less

@@ -0,0 +1,152 @@
+        .wrap {
+            width: 100%;
+            margin: 0 auto;
+            background: #ffffff;
+            .certify-header {
+                background: #f8f8f8;
+                width: 100%;
+                .certify-logo {
+                    width: 100%;
+                    margin: 0 auto;
+                    padding: 10px 0;
+                    .logo {
+                        width: 12%;
+                        padding-top: 60px;
+                        float: left;
+                        margin-left: 40px;
+                        position: relative;
+                        overflow: hidden;
+                        img {
+                            position: absolute;
+                            top: 0;
+                            left: 0;
+                            height: 60px;
+                            width: 120px;
+                        }
+                    }
+                    .certify-text {
+                        width: 84%;
+                        float: left;
+                        line-height: 60px;
+                        font-size: 24px;
+                        .text {
+                            border-left: 1px solid #999999;
+                        }
+                        .alink {
+                            float: right;
+                            font-size: 14px;
+                            line-height: 60px;
+                            a {
+                                color: #333;
+                                padding: 0 8px;
+                                border-left: 1px solid #999999;
+                                &:first-child {
+                                    border: none;
+                                }
+                            }
+                        }
+                        span {
+                            padding-left: 10px;
+                        }
+                    }
+                }
+            }
+            .certify-content {
+                .certify-step {
+                    width: 1030px;
+                    height: 60px;
+                    margin: 40px auto;
+                    border-radius: 8px;
+                    background: #c1c1c1;
+                    overflow: hidden;
+                    >div {
+                        width: 150px;
+                        height: 60px;
+                        display: table;
+                        color: #fff;
+                        float: left;
+                        padding: 0 22px 0 10px;
+                        >div {
+                            vertical-align: middle;
+                            display: table-cell;
+                            font-size: 15px;
+                        }
+                        &:first-child {
+                            padding-left: 6px;
+                        }
+                        &:last-child {
+                            width: 130px;
+                            background-image: none;
+                        }
+                        >i {
+                            margin-top: 17px;
+                            display: inline-block;
+                            height: 26px;
+                            width: 26px;
+                            border-radius: 50%;
+                            background: #fff;
+                            overflow: hidden;
+                            text-align: center;
+                            line-height: 26px;
+                            font-size: 20px;
+                            font-style: normal;
+                        }
+                    }
+                    .step-done {
+                        background: #ff6500;
+                        background-image: url(../../../image/scd.png);
+                        background-repeat: no-repeat;
+                        background-position-x: right;
+                        background-size: 22px;
+                        >i {
+                            color: #ff6500;
+                        }
+                    }
+                    .step-doing {
+                        background: #ff8a33;
+                        background-image: url(../../../image/trd.png);
+                        background-repeat: no-repeat;
+                        background-position-x: right;
+                        background-size: 22px;
+                        >i {
+                            color: #ff8a33;
+                        }
+                    }
+                    .step-off {
+                        background: #ff6500;
+                        background-image: url(../../../image/fst.png);
+                        background-repeat: no-repeat;
+                        background-position-x: right;
+                        background-size: 22px;
+                        >i {
+                            color: #ff6500;
+                        }
+                    }
+                    .step-none {
+                        background: #c1c1c1;
+                        background-image: url(../../../image/none.png);
+                        background-repeat: no-repeat;
+                        background-position-x: right;
+                        background-size: 22px;
+                        >i {
+                            color: #c1c1c1;
+                        }
+                    }
+                    .step-last {
+                        background: #c1c1c1;
+                        width: 130px;
+                        >i {
+                            color: #c1c1c1;
+                        }
+                    }
+                }
+            }
+            .footer {
+                padding: 10px 0;
+                text-align: center;
+                background: #f0f0f0;
+                p {
+                    margin: 10px 0;
+                }
+            }
+        }

+ 59 - 0
js/component/certify/content.jsx

@@ -0,0 +1,59 @@
+import React from 'react';
+import { Icon } from 'antd';
+import './certify.less';
+
+import Personal from './personal.jsx';
+
+const Content = React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            theKey: 'personal',
+            stepNum: 1,
+            step0Class:'step-done',
+            step1Class:'step-doing',
+            step2Class:'step-none',
+            step3Class:'step-none',
+            step4Class:'step-none',
+            step5Class:'step-none',
+            step6Class:'step-none',
+        };
+    },
+    render() {
+        return (
+            <div className="certify-content">
+                <div className="certify-step clearfix">
+                    <div className={this.state.step0Class}><div>个人实名认证流程</div></div>
+                    <div className={this.state.step1Class}>
+                        {this.state.stepNum > 1 ? <Icon type="check" /> : <i>1</i>}<div><p>填写</p><p>个人信息</p></div>
+                    </div>
+                    <div className={this.state.step2Class}>
+                        {this.state.stepNum > 2 ? <Icon type="check" /> : <i>2</i>}<div><p>填写</p><p>银行卡信息</p></div>
+                    </div>
+                    <div className={this.state.step3Class}>
+                        {this.state.stepNum > 3 ? <Icon type="check" /> : <i>3</i>}<div>确认信息</div>
+                    </div>
+                    <div className={this.state.step4Class}>
+                        {this.state.stepNum > 4 ? <Icon type="check" /> : <i>4</i>}<div>信息审核</div>
+                    </div>
+                    <div className={this.state.step5Class}>
+                        {this.state.stepNum > 5 ? <Icon type="check" /> : <i>5</i>}<div><p>填写打入</p><p>卡内金额</p></div>
+                    </div>
+                    <div className={this.state.step6Class}>
+                        {this.state.stepNum > 6 ? <Icon type="check" /> : <i>6</i>}<div>认证结果</div>
+                    </div>
+                </div>
+                <div className="certify-form">
+                    {(() => {
+                        switch (this.state.leftKey) {
+                            case 'personal':
+                                return <Personal />;
+                        };
+                    })()}
+                </div>
+            </div>
+        )
+    }
+});
+
+export default Content;

+ 15 - 0
js/component/certify/footer.jsx

@@ -0,0 +1,15 @@
+import React from 'react';
+import './certify.less';
+
+const Footer = React.createClass({
+    render() {
+        return (
+            <div className="footer">
+                <p>公司地址   联系方式公司地址  公司地址   联系方式 公司地址 公司地址   联系方式 公司地址</p>
+                <p>公司地址   联系方式公司地址 公司地址   联系方式公司地址</p>
+            </div>
+        )
+    }
+});
+
+export default Footer;

+ 14 - 0
js/component/certify/personal.jsx

@@ -0,0 +1,14 @@
+import React from 'react';
+import {Input } from 'antd';
+
+const Content = React.createClass({
+    render() {
+        return (
+            <div>
+                <Input />
+            </div>
+        )
+    }
+});
+
+export default Content;

+ 29 - 0
js/component/certify/top.jsx

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

Fichier diff supprimé car celui-ci est trop grand
+ 30 - 8
js/component/dataDic.js


+ 93 - 0
js/component/login/adminLogin.jsx

@@ -0,0 +1,93 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { Input, Button, Checkbox, message, Spin, Icon } from 'antd';
+import './adminLogin.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+var Login = React.createClass({
+    getInitialState() {
+        return {
+            user: '',
+            password: '',
+            checked: '',
+            loading: false
+        };
+    },
+
+    handleSubmit() {
+        if (this.state.user === "" || this.state.password === "") {
+            this.tips('账号或者密码不能为空!');
+        } else {
+            this.setState({
+                loading: true
+            });
+            $.ajax({
+                method: "POST",
+                dataType: "json",
+                crossDomain: false,
+                url: globalConfig.context + "/managesignin",
+                data: {
+                    mobile: this.state.user,
+                    password: this.state.password,
+                    remeber: false
+                }
+            }).done(function (data) {
+                if (!data.error.length) {
+                    window.location.href = "index.html"
+                } else {
+                    this.tips(data.error[0].message);
+                }
+            }.bind(this)).always(function () {
+                this.setState({
+                    loading: false
+                });
+            }.bind(this));
+        };
+    },
+
+    keyboard(event) {
+        if (event.keyCode == 13) {
+            this.handleSubmit()
+        }
+    },
+
+    tips: function (text) {
+        message.warning(text);
+    },
+
+    getUser(event) {
+        this.setState({ user: event.target.value });
+    },
+
+    getPassword(event) {
+        this.setState({ password: event.target.value });
+    },
+
+    onChange(event) {
+        this.setState({ checked: event.target.checked });
+    },
+
+    render() {
+        return (
+            <div className="login-box">
+                <Spin spinning={this.state.loading} className='spin-box'>
+                    <div className="user-box">
+                        <Input onChange={this.getUser}
+                            onKeyDown={this.keyboard} placeholder="账号" value={this.state.user}
+                            addonBefore={<Icon type="user" />} />
+                    </div>
+                    <div className="pw-box">
+                        <Input onChange={this.getPassword}
+                            onKeyDown={this.keyboard} type="password" placeholder="密码" value={this.state.password}
+                            addonBefore={<Icon type="lock" />}
+                        />
+                    </div>
+                    <Button type="primary" onClick={this.handleSubmit}>登录</Button>
+                </Spin>
+            </div>
+        );
+    }
+});
+
+export default Login;

+ 54 - 0
js/component/login/adminLogin.less

@@ -0,0 +1,54 @@
+.login-box {
+    width: 400px;
+    height: 320px;
+    padding: 50px 50px 0 50px;
+    background: #fff;
+    margin: 0 auto;
+    input {
+        height: 36px;
+        border-radius: 0px;
+    }
+    button {
+        width: 300px;
+        height: 36px;
+    }
+    .ant-input-group-addon {
+        font-size: 17px;
+    }
+    .user-box {
+        margin-bottom: 20px;
+    }
+    .pw-box {
+        margin-bottom: 20px;
+    }
+}
+
+.ant-checkbox-wrapper {
+    margin-bottom: 20px;
+    font-size: 14px;
+    color: #878787;
+}
+
+.ant-btn {
+    font-size: 18px;
+}
+
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+    color: #333;
+}
+
+input:-moz-placeholder,
+textarea:-moz-placeholder {
+    color: #333;
+}
+
+input::-moz-placeholder,
+textarea::-moz-placeholder {
+    color: #333;
+}
+
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+    color: #333;
+}

+ 138 - 0
js/component/manageCenter/index/content.jsx

@@ -0,0 +1,138 @@
+import React from 'react';
+import { Spin, Button, Tabs } from 'antd';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+import '../content.less';
+import './content.less';
+import LeftTab from './leftTab.jsx';
+
+import weixin from '../../../../image/weixin-w.png';
+import qq from '../../../../image/qq-w.png';
+import weibo from '../../../../image/weibo-w.png';
+
+const TabPane = Tabs.TabPane;
+
+const Content = React.createClass({
+    getInitialState() {
+        return {
+            per: '24',
+            loading: false,
+            userlvl: '0',
+            userid: '1234567',
+            follow: '0',
+            chengguo: '0',
+            kaifa: '0',
+            fuwu: '0',
+            xuqiu: '0',
+            activityArr: [{ type: '成果对接会', title: '龙岗区在线科技成果对接会——智能制造业专场', time: '2017-01-10', link: '' },
+            { type: '成果对接会', title: '钛白粉行业技术在线对接会', time: '2017-01-11', link: '' }]
+        };
+    },
+    getData() {
+        this.setState({
+            loading: false
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/homePage",
+            success: function (data) {
+                if (data.data.personPortraitUrl && data.data.nickname) {
+                    this.setState({
+                        personPortraitUrl:data.data.personPortraitUrl,
+                        nickname: data.data.nickname,
+                        lvl:data.data.lvl,
+                        number:data.data.number
+                    })
+                };
+            }.bind(this),
+        }).done(function (data) {
+            if (data.error.length) {
+                message.warning(data.error[0].message);
+            }
+        }.bind(this)).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    componentDidMount() {
+        this.getData();
+    },
+    handlekey(key) {
+        this.setState({
+            leftKey: key,
+        });
+    },
+    tabChange(key) {
+
+    },
+    render() {
+        return (
+            <div className="acc-content">
+                <LeftTab handlekey={this.handlekey} />
+                <div className="content-right">
+                    <Spin spinning={this.state.loading} className='spin-box'>
+                        <div className="index-content">
+                            <div className="index-userdata clearfix">
+                                <p className="acc-title">{this.state.number}</p>
+                                <div className="userdata-img">
+                                    <img src={globalConfig.staticHost + "/upload" + this.state.personPortraitUrl} alt="" />
+                                </div>
+                                <div className="userdata-content">
+                                    {(() => {
+                                        switch ( userData.lvl || this.state.userlvl) {
+                                            case '0':
+                                                return <p className="userdata-lvl">等级:<span>LV1</span> 普通用户</p>;
+                                            case '1':
+                                                return <p className="userdata-lvl">等级:<span>LV2</span> 已认证用户</p>;
+                                        };
+                                    })()}
+                                    <p>完善资料 {this.state.per}% ,<a href="./set.html">继续完善</a>,有助于提高您的资信</p>
+                                    <p className="userdata-relate" style={{ 'display': 'none' }}>
+                                        <Button className="relateqq"><img src={qq} alt="" /> QQ账号登录</Button>
+                                        <Button className="relateweibo"><img src={weibo} alt="" />微博账号登录</Button>
+                                        <Button className="relateweixin"><img src={weixin} alt="" />微信账号登录</Button>
+                                    </p>
+                                    <div className="userdata-follow">已有<a href="">{this.state.follow}</a>人关注你</div>
+                                </div>
+                            </div>
+                            <div className="index-record">
+                                <p className="acc-title">我的轨迹</p>
+                                <ul className="record-list clearfix">
+                                    <li>技术成果:<a href="">{this.state.chengguo}</a>项</li>
+                                    <li>技术开发:<a href="">{this.state.kaifa}</a>项</li>
+                                    <li>科技服务:<a href="">{this.state.fuwu}</a>项</li>
+                                    <li>发布需求:<a href="">{this.state.xuqiu}</a>项</li>
+                                </ul>
+                            </div>
+                            <div className="index-activity">
+                                <Tabs defaultActiveKey="1" onChange={this.tabChange}>
+                                    <TabPane tab="活动" key="1">
+                                        <p className="acc-title">即将举办的活动</p>
+                                        <ul className="activity-list">
+                                            {
+                                                this.state.activityArr.map(function (item, i) {
+                                                    return <li key={i}>
+                                                        <span className="list-type">[{item.type}]</span>
+                                                        <span className="list-title">{item.title}</span>
+                                                        <a href={item.link}>报名</a>
+                                                        <span className="list-time">{item.time}</span>
+                                                    </li>;
+                                                })
+                                            }
+                                        </ul>
+                                    </TabPane>
+                                    <TabPane tab="其他" key="2">Content of Tab Pane 2</TabPane>
+                                </Tabs>
+                            </div>
+                        </div>
+                    </Spin>
+                </div>
+            </div>
+        )
+    }
+});
+
+export default Content;

+ 127 - 0
js/component/manageCenter/index/content.less

@@ -0,0 +1,127 @@
+    @a-color: #ea0862;
+    .index-content {
+        height: 100%;
+        .acc-title {
+            color: #333;
+            font-size: 16px;
+            margin-bottom: 10px;
+            span {
+                font-size: 12px;
+                color: #999;
+                margin-left: 10px;
+            }
+        }
+        .index-userdata {
+            background: #fff;
+            padding: 20px;
+            .userdata-img {
+                height: 120px;
+                width: 120px;
+                padding-top: 120px;
+                position: relative;
+                overflow: hidden;
+                border-radius: 50%;
+                float: left;
+                background: #eee;
+                img {
+                    height: 120px;
+                    width: 120px;
+                    position: absolute;
+                    top: 0;
+                    left: 0;
+                }
+            }
+            .userdata-content {
+                margin-left: 140px;
+                line-height: 30px;
+                position: relative;
+                a {
+                    color: @a-color;
+                }
+                .userdata-lvl {
+                    span {
+                        color: #fff;
+                        background: @a-color;
+                        border-radius: 2px;
+                        padding: 0 4px;
+                    }
+                }
+                .userdata-relate {
+                    button {
+                        border: none;
+                        border-radius: 4px;
+                        margin-top: 20px;
+                        margin-right: 20px;
+                        img {
+                            height: 20px;
+                            vertical-align: middle;
+                        }
+                        span {
+                            color: #fff;
+                        }
+                    }
+                    .relateweixin {
+                        background: #12d41e;
+                    }
+                    .relateqq {
+                        background: #3073c1;
+                    }
+                    .relateweibo {
+                        background: #cf331d;
+                    }
+                }
+                .userdata-follow {
+                    position: absolute;
+                    top: 0;
+                    right: 10px;
+                }
+            }
+        }
+        .index-record {
+            background: #fff;
+            padding: 20px;
+            margin-top: 1px;
+            .record-list {
+                li {
+                    float: left;
+                    width: 200px;
+                    margin-right: 100px;
+                    line-height: 30px;
+                    a {
+                        color: @a-color;
+                    }
+                }
+            }
+        }
+        .index-activity {
+            background: #fff;
+            padding: 20px;
+            margin-top: 20px;
+            min-height: 300px;
+            .activity-list {
+                li {
+                    border-bottom: 1px dashed #eee;
+                    padding:10px 0;
+                    .list-type {
+                        color: #666
+                    }
+                    .list-title {
+                        color: #333;
+                        margin-left: 10px;
+                    }
+                    a {
+                        padding: 0 4px;
+                        background: @a-color;
+                        color: #fff;
+                        border-radius: 2px;
+                        float: right;
+                        margin: 0 10px;
+                    }
+                    .list-time {
+                        color: #666;
+                        float: right;
+                    }
+                }
+            }
+        }
+    }

+ 44 - 0
js/component/manageCenter/index/leftTab.jsx

@@ -0,0 +1,44 @@
+import React from 'react';
+import { Menu, Icon } from 'antd';
+import './leftTab.less';
+const SubMenu = Menu.SubMenu;
+const MenuItemGroup = Menu.ItemGroup;
+
+
+const LeftTab = React.createClass({
+    getInitialState() {
+        return {
+            current: 'tongchang',
+        };
+    },
+    handleClick(e) {
+        this.props.handlekey(e.key);
+        this.setState({
+            current: e.key,
+        });
+    },
+    render() {
+        return (
+            <Menu onClick={this.handleClick}
+                selectedKeys={[this.state.current]}
+                mode="vertical"
+                className="account-left"
+                >
+                <Menu.Item key="tongchang">
+                    常用功能
+                </Menu.Item>
+                <Menu.Item key="in">
+                    供应发布
+                </Menu.Item>
+                <Menu.Item key="want">
+                    需求发布
+                </Menu.Item>
+                <Menu.Item key="my">
+                    我的收藏
+                </Menu.Item>
+            </Menu>
+        );
+    },
+});
+
+export default LeftTab;

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

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

+ 29 - 9
js/component/manageCenter/leftTab.less

@@ -6,20 +6,40 @@
         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: 18px;
+                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: 0;
-            margin: 0;
-            border-right: none;
-            text-align: center;
-            font-size: 16px;
-            color: #4466bf;
-            background: #d5e4f7;
-            border-top: 1px solid #f2f8fd;
+            padding-left: 100px!important;
+            text-align: left;
+            background: #fafafa;
+            font-size: 14px;
+            color: #333;
             border-bottom: 1px solid #c0d2e4;
         }
         .ant-menu-item-selected {
             background: #fff;
-            border-left: 3px solid #58a3ff;
+            color: #4466bf;
+            font-size: 16px;
         }
     }
 }

+ 30 - 0
js/component/manageCenter/servicesManage/leftTab.jsx

@@ -44,8 +44,38 @@ 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">
+                        专利综合管理
+                    </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>
                 </SubMenu>
                 <SubMenu key="sub4" title={<span>科技项目申报管理</span>}>
                 </SubMenu>

+ 274 - 0
js/component/manageCenter/servicesManage/patent/comPatentAdd.jsx

@@ -0,0 +1,274 @@
+import React from 'react';
+import { Icon, Modal, Button, Form, Upload, message, Input, Spin, Checkbox,Select } from 'antd';
+import './comprehensive.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+import { getBase64,beforeUpload } from '../../../tools.js';
+
+class Avatar extends React.Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            imageUrl: ''
+        }
+    }
+    handleChange(info) {
+        if (info.file.status === 'done') {
+            // Get this url from response in real world.
+            getBase64(info.file.originFileObj, imageUrl => this.setState({ imageUrl }));
+            this.props.urlData(info.file.response.data);
+        }
+    }
+    render() {
+        const imageUrl = this.state.imageUrl;
+        return (
+            <Upload
+                className="avatar-uploader"
+                name="avatar"
+                showUploadList={false}
+                action={globalConfig.context + "/api/user/patent/upload"}
+                data={{ 'sign': this.props.name }}
+                beforeUpload={beforeUpload}
+                onChange={this.handleChange.bind(this)}
+                >
+                {
+                    imageUrl ?
+                        <img src={imageUrl} role="presentation" className="avatar" /> :
+                        <Icon type="plus" className="avatar-uploader-trigger" />
+                }
+            </Upload>
+        );
+    }
+};
+
+const PatentAddFrom = Form.create()(React.createClass({
+    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 {
+            loading: false,
+            companyOption: [],
+            firstCheck:0,
+            secondCheck:0,
+            thirdCheck:0
+
+        };
+    },
+    componentWillMount(){
+        this.getCompanyList();
+    },
+    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/patent/clientApplyPatent",
+                    data: {
+                        'firstInventorIdNumber':values.firstInventorID,
+                        'firstInventorName':values.firstInventorName,
+                        'patentDes':values.intro,
+                        'secondInventorName':values.secondInventorName,
+                        'thirdInventorName':values.thirdInventorName,
+                        'firstInventorIsPublish':this.state.firstCheck,
+                        'secondInventorIsPublish':this.state.secondCheck,
+                        'thirdInventorIsPublish':this.state.thirdCheck,
+                        'patentProryStatementUrl':this.state.avatarUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this)).always(function () {
+                    this.props.spinState(false);
+                    this.props.closeModal();
+                    this.props.form.resetFields();
+                }.bind(this));
+            }
+        });
+    },
+    firstInventorCheck(e) {
+        if ( e.target.checked == true ) {
+            this.state.firstCheck = 1;
+        } else if ( e.target.checked == false ) {
+            this.state.firstCheck = 0;
+        }
+    },
+    secondInventorCheck(e) {
+        if ( e.target.checked == true ) {
+            this.state.secondCheck = 1;
+        } else if ( e.target.checked == false ) {
+            this.state.secondCheck = 0;
+        };
+    },
+    thirdInventorCheck(e) {
+        if ( e.target.checked == true ) {
+            this.state.thirdCheck = 1;
+        } else if ( e.target.checked == false ) {
+            this.state.thirdCheck = 0;
+        };
+    },
+    avatarUrl(e){
+        this.state.avatarUrl = e;
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 3 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Form horizontal onSubmit={this.handleSubmit} className="person-form">
+                <Select placeholder="选择公司" value={this.state.companyName} style={{ width: 200 }} onChange={(e) => { this.setState({ companyName: e }); } }>{this.state.companyOption}</Select>
+                <FormItem
+                    labelCol={{ span: 24 }}
+                    wrapperCol={{ span: 18 }}
+                    label="专利简要描述"
+                    >
+                    {getFieldDecorator('intro', {
+                        initialValue: this.state.intro || null
+                    })(
+                        <Input type="textarea"
+                            placeholder="多行输入"
+                            rows={6} />
+                        )}
+                </FormItem>
+                <p>第一发明人</p>
+                <FormItem
+                    {...formItemLayout}
+                    label="姓名"
+                    >
+                    {getFieldDecorator('firstInventorName', {
+                        rules: [{ required: true, message: 'Please input name!' }]
+                    })(
+                        <Input className="mini-input"/>
+                        )}
+                    <Checkbox onChange={this.firstInventorCheck}>是否公布</Checkbox>
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="身份证"
+                    >
+                    {getFieldDecorator('firstInventorID', {
+                        rules: [{ required: true, message: 'Please input ID!' }]
+                    })(
+                        <Input className="mini-input"/>
+                        )}
+                </FormItem>
+                <p>第二发明人</p>
+                <FormItem
+                    {...formItemLayout}
+                    label="姓名"
+                    >
+                    {getFieldDecorator('secondInventorName')(
+                        <Input className="mini-input"/>
+                        )}
+                    <Checkbox onChange={this.secondInventorCheck}>是否公布</Checkbox>
+                </FormItem>
+                <p>第三发明人</p>
+                <FormItem
+                    {...formItemLayout}
+                    label="姓名"
+                    >
+                    {getFieldDecorator('thirdInventorName')(
+                        <Input className="mini-input"/>
+                        )}
+                    <Checkbox onChange={this.thirdInventorCheck}>是否公布</Checkbox>
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="上传代理委托书"
+                    labelCol={{ span: 24 }}
+                    wrapperCol={{ span: 12 }}
+                    >
+                    {getFieldDecorator('avatar')(
+                        <Avatar urlData={this.avatarUrl} name='patent_prory_statement' />
+                    )}
+                    <span>请上传专利代理委托书</span><a href="">模板下载</a>
+                </FormItem>
+                <FormItem>
+                    <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
+                    <Button type="ghost" style={{marginLeft:'20px'}} onClick={this.props.closeModal}>取消</Button>
+                </FormItem>
+            </Form >
+        );
+    },
+}));
+
+
+const PatentAdd = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk() {
+        this.setState({
+            visible: false,
+        });
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+    },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
+    render() {
+        return (
+            <div className="patent-addNew">
+                <Button className="patent-addNew" type="primary" onClick={this.showModal}>申请新专利<Icon type="plus" /></Button>
+                <Spin spinning={this.state.loading} className='spin-box'>
+                    <Modal title="新专利申请" visible={this.state.visible}
+                        onOk={this.handleOk} onCancel={this.handleCancel}
+                        width='800px'
+                        footer=''
+                        >
+                        <PatentAddFrom spinState={this.spinChange} closeModal={this.handleCancel}/>
+                    </Modal>
+                </Spin>
+            </div>
+        );
+    },
+});
+export default PatentAdd;

+ 202 - 0
js/component/manageCenter/servicesManage/patent/comPatentDesc.jsx

@@ -0,0 +1,202 @@
+import React from 'react';
+import { Icon, Modal, message, Spin, Steps, Input, Select, Upload, DatePicker, Button } from 'antd';
+import './comprehensive.less';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import { patentTypeList, patentFieldList, patentStateList } from '../../../dataDic.js';
+import { getBase64, beforeUpload } from '../../../tools.js';
+
+class Avatar extends React.Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            imageUrl: ''
+        }
+    }
+    handleChange(info) {
+        if (info.file.status === 'done') {
+            // Get this url from response in real world.
+            getBase64(info.file.originFileObj, imageUrl => this.setState({ imageUrl }));
+            this.props.urlData(info.file.response.data);
+        }
+    }
+    render() {
+        const imageUrl = this.state.imageUrl;
+        return (
+            <Upload
+                className="avatar-uploader"
+                name="avatar"
+                showUploadList={false}
+                action={globalConfig.context + "/api/user/patent/upload"}
+                data={{ 'sign': this.props.name }}
+                beforeUpload={beforeUpload}
+                onChange={this.handleChange.bind(this)}
+                >
+                {
+                    imageUrl ?
+                        <img src={imageUrl} role="presentation" className="avatar" /> :
+                        <Icon type="plus" className="avatar-uploader-trigger" />
+                }
+            </Upload>
+        );
+    }
+};
+
+const PatentDesc = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            patentTypeOption: [],
+            patentFieldOption: [],
+            patentStateOption: []
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        patentTypeList.map(function (item) {
+            _me.state.patentTypeOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        patentFieldList.map(function (item) {
+            _me.state.patentFieldOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        patentStateList.map(function (item) {
+            _me.state.patentStateOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+    },
+    downloadPic(type) {
+        window.open(globalConfig.context + "/open/downLoadPicture?path=" + type)
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk() {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    getPatentWritingUrl(e){
+        this.state.patentWritingUrl = e;
+    },
+    getAuthorizationNoticeUrl(e){
+        this.state.authorizationNoticeUrl = e;
+    },
+    getPatentCertificateUrl(e){
+        this.state.patentCertificateUrl = e;
+    },
+    render() {
+        const Step = Steps.Step;
+        const theData = this.props.data;
+        if (this.props.data) {
+            return (
+                <div className="patent-desc">
+                    <Spin spinning={this.state.loading} className='spin-box'>
+                        <Modal title="专利详情" visible={this.state.visible}
+                            onOk={this.handleOk} onCancel={this.handleCancel}
+                            width='800px'
+                            footer={[
+                                <Button key="submit" type="primary" size="large" onClick={this.handleOk}>保存</Button>,
+                                <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>,
+                            ]}
+                            className="patent-desc-content">
+                            <div>
+                                <p className="widthHalf"><span>公司名称:</span>{theData.companyName}</p>
+                                <p className="widthHalf"><span>公司组织机构代码:</span>{theData.companyNum}</p>
+                            </div>
+                            <div>
+                                <p className="widthHalf"><span>公司地址:</span>{theData.companyAddress}</p>
+                                <p className="widthHalf"><span className="three2eight">联系人</span>:{theData.companyContacts}</p>
+                            </div>
+                            <div>
+                                <p className="widthHalf"><span className="two2four">编号</span>:{theData.number}</p>
+                                <p className="widthHalf"><span className="seven2eight">申请号/专利号</span>:<Input value={this.state.patentNum} onChange={(e) => { this.setState({ patentNum: e.target.value }); } } /></p>
+                            </div>
+                            <div>
+                                <p className="widthHalf"><span>专利名称:</span><Input value={this.state.patentName} onChange={(e) => { this.setState({ patentName: e.target.value }); } } /></p>
+                                <div className="widthHalf"><span className="four2eight">专利类型</span>:
+                                    <Select value={this.state.patentType} style={{ width: 200 }} onChange={(e) => { this.setState({ patentType: e }); } }>{this.state.patentTypeOption}</Select>
+                                </div>
+                            </div>
+                            <div>
+                                <p className="widthHalf"><span>专利状态:</span>{theData.patentState}</p>
+                                <div className="widthHalf"><span className="four2eight">专利领域</span>:
+                                    <Select value={this.state.patentField} style={{ width: 200 }} onChange={(e) => { this.setState({ patentField: e }); } }>{this.state.patentFieldOption}</Select>
+                                </div>
+                            </div>
+                            <div>
+                                <span>专利简介:</span>
+                                <Input type="textarea"
+                                    placeholder="多行输入"
+                                    value={this.state.patentDes}
+                                    onChange={(e) => { this.setState({ patentDes: e.target.value }); } }
+                                    rows={6} />
+                            </div>
+                            <div>
+                                <p>第一发明人:</p>
+                                <p className="widthThird"><span>姓名:</span>{theData.firstInventorName}</p>
+                                <p className="widthThird"><span>身份证:</span>{theData.firstInventorIdNumber}</p>
+                                <p className="widthThird"><span>国籍:</span>中国</p>
+                            </div>
+                            <div style={theData.secondInventorName === '' ? { display: 'none' } : {}}>
+                                <p>第二发明人:</p>
+                                <p className="widthThird"><span>姓名:</span>{theData.secondInventorName}</p>
+                                <p className="widthThird"><span>国籍:</span>中国</p>
+                            </div>
+                            <div style={theData.thirdInventorName === '' ? { display: 'none' } : {}}>
+                                <p>第三发明人:</p>
+                                <p className="widthThird"><span>姓名:</span>{theData.thirdInventorName}</p>
+                                <p className="widthThird"><span>国籍:</span>中国</p>
+                            </div>
+                            <div className="clearfix">
+                                <p>材料管理:
+                                    <span>{theData.patentProryStatementUrl !== null ? <a onClick={this.downloadPic.bind(this, theData.patentProryStatementUrl)}>专利代理委托书</a> : ""}</span>
+                                    <span>{theData.lastYearTaxReportUrl !== null ? <a onClick={this.downloadPic.bind(this, theData.lastYearTaxReportUrl)}>上年度纳税表</a> : ""}</span>
+                                </p>
+                                <Avatar urlData={this.getPatentWritingUrl} name='patentWritingUrl' />
+                                <Avatar urlData={this.getAuthorizationNoticeUrl} name='authorizationNoticeUrl' />
+                                <Avatar urlData={this.getPatentCertificateUrl} name='patentCertificateUrl' />
+                            </div>
+                            <div className="avatar-text"><span>专利稿件上传</span><span>授权通知书上传</span><span>专利证书上传</span></div>
+                            <div>
+                                <p>专利状态流转记录:</p>
+                                <div className="widthThird">
+                                    <span>状态流转:</span>
+                                    <Select value={this.state.patentStateAdd} style={{ width: 150 }} onChange={(e) => { this.setState({ patentStateAdd: e }); } }>{this.state.patentStateOption}</Select>
+                                </div>
+                                <p className="widthThird">
+                                    <span>处理时间:</span>
+                                    <DatePicker />
+                                </p>
+                                <div className="widthThird">
+                                    <span>负责人:</span>
+                                    <Select value={this.state.patentStateAdd} style={{ width: 150 }} onChange={(e) => { this.setState({ patentStateAdd: e }); } }>{this.state.patentStateOption}</Select>
+                                </div>
+                            </div>
+                        </Modal>
+                    </Spin>
+                </div>
+            );
+        } else {
+            return <div></div>
+        }
+    },
+});
+export default PatentDesc;

+ 352 - 8
js/component/manageCenter/servicesManage/patent/comprehensive.jsx

@@ -1,20 +1,364 @@
 import React from 'react';
+import { Icon, Button, Input, Select, Spin, Table, Switch, DatePicker, message } from 'antd';
+import { patentTypeList, patentStateList, provinceArr } from '../../../dataDic.js';
+import { getTime,getPatentState } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import './comprehensive.less';
+import PatentAdd from './comPatentAdd.jsx';
+import PatentDesc from './comPatentDesc.jsx';
 
-const Component = React.createClass({
+const Patent = 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,
+                serialNumber: this.state.number,
+                patentNumber: this.state.patentNumber,
+                patentName: this.state.patentName,
+                //office: 事务所,
+                locationProvince: this.state.province,
+                unitName: this.state.unitName,
+                patentCatagory: this.state.patentType,
+                patentState: this.state.patentState,
+                createTime: this.state.createTime,
+                patentApplicationDate: this.state.startTime,
+                authorizedDate: this.state.endTime,
+                author: this.state.author
+            },
+            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,
+                        number: thisdata.serialNumber,
+                        patentNumber: thisdata.patentNumber,
+                        unitName: thisdata.unitName,
+                        patentName: thisdata.patentName,
+                        patentType: thisdata.patentCatagory,
+                        patentState: thisdata.patentState,
+                        patentField: thisdata.patentField,
+                        patentDes: thisdata.patentDes,
+                        patentProryStatementUrl: thisdata.patentProryStatementUrl, //专利代理委托书
+                        patentWritingUrl: thisdata.patentWritingUrl, //专利稿件
+                        authorizationNoticeUrl: thisdata.authorizationNoticeUrl, //授权通知书
+                        patentCertificateUrl: thisdata.patentCertificateUrl, //专利证书
+                        lastYearTaxReportUrl: thisdata.lastYearTaxReportUrl, //上年度纳税表
+                        startTime: thisdata.patentApplicationDate,
+                        endTime: thisdata.authorizedDate,
+                        orgCode: thisdata.orgCode,
+                        companyAddress: thisdata.locationProvince + '/' + thisdata.locationCity + '/' + thisdata.locationArea,
+                        companyContacts: thisdata.contacts, //联系人
+                        firstInventorName: thisdata.firstInventorName,
+                        firstInventorNationality: thisdata.firstInventorNationality, //国籍
+                        firstInventorIdNumber: thisdata.firstInventorIdNumber,   //id
+                        firstInventorIsPublish: thisdata.firstInventorIsPublish, //是否公布
+                        secondInventorName: thisdata.secondInventorName,
+                        secondInventorNationality: thisdata.secondInventorNationality,
+                        secondInventorIsPublish: thisdata.secondInventorIsPublish,
+                        thirdInventorName: thisdata.thirdInventorName,
+                        thirdInventorNationality: thisdata.thirdInventorNationality,
+                        thirdInventorIsPublish: thisdata.thirdInventorIsPublish,
+                        createTime: thisdata.createTime,   //派单日
+                        author: thisdata.author, //撰写人
+                        office: thisdata.office, //事务所
+                        principal: thisdata.principal //负责人
+                    });
+                };
+                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/getUnitNames",
+            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 {
+            number: '',
+            patentNumber: '',
+            //office: 事务所,
+            province: '',
+            unitName: '',
+            patentType: '',
+            patentName: '',
+            patentState: '',
+            createTime: [],
+            endTime: [],
+            startTime: [],
+            author: '',
+            warningText: 'warning text! warning text! warning text!',
+            AlertDis: 'block',
+            patentTypeOption: [],
+            patentStateOption: [],
+            companyOption: [],
+            authorOption: [],
+            provinceOption: [],
+            searchMore: true,
+            data: [],
+            download: globalConfig.context + '/api/warningreports/download',
             loading: false,
-            leftKey: 'base',
-            userType: '0'
+            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: 'companyName',
+                    key: 'companyName',
+                }, {
+                    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;
+        patentTypeList.map(function (item) {
+            _me.state.patentTypeOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        patentStateList.map(function (item) {
+            _me.state.patentStateOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        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;
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.number = '';
+        this.state.patentNumber = '';
+        this.state.province = '';
+        this.state.unitName = '';
+        this.state.patentType = '';
+        this.state.patentName = '';
+        this.state.patentState = '';
+        this.state.createTime = [];
+        this.state.endTime = [];
+        this.state.startTime = [];
+        this.state.author = '';
+        this.loadData();
+    },
+    searchSwitch() {
+        this.setState({
+            searchMore: !this.state.searchMore
+        });
+    },
+    searchcreateTime(date, dateString) {
+        this.state.createTime = dateString;
+    },
+    searchstartTime(date, dateString) {
+        this.state.startTime = dateString;
+    },
+    searchSelect(e) {
+        let _me = this;
+        this.setState({
+            searchValue: e.target.value
+        });
+        switch (_me.state.searchKey) {
+            case "patentNumber":
+                _me.state.patentNumber = e.target.value;
+                _me.state.number = '';
+                _me.state.patentName = '';
+                break;
+            case "serialNumber":
+                _me.state.number = e.target.value;
+                _me.state.patentNumber = '';
+                _me.state.patentName = '';
+                break;
+            case "patentName":
+                _me.state.patentNumber = '';
+                _me.state.number = '';
+                _me.state.patentName = e.target.value;
+                break;
+        }
+    },
     render() {
+        const { MonthPicker, RangePicker } = DatePicker;
         return (
-            <div>
-                专利综合管理
-            </div>
-        )
+            <div className="patent-content" >
+                <div className="content-title">
+                    <span>专利综合管理</span>
+                    <PatentAdd />
+                </div>
+                <div className="patent-query">
+                    <Select placeholder="请选择" value={this.state.searchKey} style={{ width: 200 }} onChange={(e) => { this.setState({ searchKey: e, searchValue: '' }); } }>
+                        <Select.Option value="patentNumber">专利号</Select.Option>
+                        <Select.Option value="serialNumber">编号</Select.Option>
+                        <Select.Option value="patentName">专利名称</Select.Option>
+                    </Select>
+                    <Input value={this.state.searchValue} onChange={this.searchSelect} />
+                    <Select placeholder="专利状态" value={this.state.searchState} style={{ width: 200 }} onChange={(e) => { this.setState({ searchState: e }); } }>{this.state.patentStateOption}</Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <Button type="ghost">导出</Button>
+                    <span>更多搜索<Switch defaultChecked={false} onChange={this.searchSwitch} /></span>
+                    <div className="search-more" style={this.state.searchMore ? { display: 'none' } : {}}>
+                        <p>
+                            <span>派单日:</span><RangePicker onChange={this.searchcreateTime} />
+                            <span>申请日:</span><RangePicker onChange={this.searchstartTime} />
+                        </p>
+                        <div>
+                            <Select placeholder="选择省份" style={{ width: 200 }} onChange={(e) => { this.state.province = e } }>{this.state.provinceOption}</Select>
+                            <Select placeholder="选择撰写人" style={{ width: 200 }} onChange={(e) => { this.state.author = e } }>{this.state.authorOption}</Select>
+                            <Select placeholder="选择公司" style={{ width: 200 }} onChange={(e) => { this.state.companyName = e } }>{this.state.companyOption}</Select>
+                        </div>
+                    </div>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <PatentDesc data={this.state.RowData} showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
     }
 });
 
-export default Component;
+export default Patent;

+ 179 - 0
js/component/manageCenter/servicesManage/patent/comprehensive.less

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

+ 9 - 11
js/component/manageCenter/servicesManage/patent/content.jsx

@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import React from 'react';
 import '../../content.less';
 import LeftTab from '../leftTab.jsx';
 
@@ -9,20 +9,18 @@ import Express from './express.jsx';
 import ApplyFee from './applyFee.jsx';
 
 
-class Content extends Component {
-    constructor() {
-        super();
-        this.state = {
+const Content = React.createClass({
+    getInitialState() {
+        return {
             loading: false,
-            leftKey: <Comprehensive />,
+            leftKey: 'express',
         };
-    }
-
+    },
     handlekey(key) {
         this.setState({
             leftKey: key,
         });
-    }
+    },
     render() {
         return (
             <div className="acc-content">
@@ -46,6 +44,6 @@ class Content extends Component {
             </div>
         )
     }
-}
+});
 
-export default Content;
+export default Content;

+ 350 - 8
js/component/manageCenter/servicesManage/patent/correction.jsx

@@ -1,20 +1,362 @@
 import React from 'react';
+import { Icon, Button, Input, Select, Spin, Table, Switch, DatePicker, message } from 'antd';
+import { patentTypeList, patentStateList, provinceArr } from '../../../dataDic.js';
+import { getTime,getPatentState } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import './comprehensive.less';
+import CorrectionDesc from './correctionDesc.jsx';
 
-const Component = React.createClass({
+const Correction = 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,
+                serialNumber: this.state.number,
+                patentNumber: this.state.patentNumber,
+                patentName: this.state.patentName,
+                //office: 事务所,
+                locationProvince: this.state.province,
+                unitName: this.state.unitName,
+                patentCatagory: this.state.patentType,
+                patentState: this.state.patentState,
+                createTime: this.state.createTime,
+                patentApplicationDate: this.state.startTime,
+                authorizedDate: this.state.endTime,
+                author: this.state.author
+            },
+            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,
+                        number: thisdata.serialNumber,
+                        patentNumber: thisdata.patentNumber,
+                        unitName: thisdata.unitName,
+                        patentName: thisdata.patentName,
+                        patentType: thisdata.patentCatagory,
+                        patentState: thisdata.patentState,
+                        patentField: thisdata.patentField,
+                        patentDes: thisdata.patentDes,
+                        patentProryStatementUrl: thisdata.patentProryStatementUrl, //专利代理委托书
+                        patentWritingUrl: thisdata.patentWritingUrl, //专利稿件
+                        authorizationNoticeUrl: thisdata.authorizationNoticeUrl, //授权通知书
+                        patentCertificateUrl: thisdata.patentCertificateUrl, //专利证书
+                        lastYearTaxReportUrl: thisdata.lastYearTaxReportUrl, //上年度纳税表
+                        startTime: thisdata.patentApplicationDate,
+                        endTime: thisdata.authorizedDate,
+                        orgCode: thisdata.orgCode,
+                        companyAddress: thisdata.locationProvince + '/' + thisdata.locationCity + '/' + thisdata.locationArea,
+                        companyContacts: thisdata.contacts, //联系人
+                        firstInventorName: thisdata.firstInventorName,
+                        firstInventorNationality: thisdata.firstInventorNationality, //国籍
+                        firstInventorIdNumber: thisdata.firstInventorIdNumber,   //id
+                        firstInventorIsPublish: thisdata.firstInventorIsPublish, //是否公布
+                        secondInventorName: thisdata.secondInventorName,
+                        secondInventorNationality: thisdata.secondInventorNationality,
+                        secondInventorIsPublish: thisdata.secondInventorIsPublish,
+                        thirdInventorName: thisdata.thirdInventorName,
+                        thirdInventorNationality: thisdata.thirdInventorNationality,
+                        thirdInventorIsPublish: thisdata.thirdInventorIsPublish,
+                        createTime: thisdata.createTime,   //派单日
+                        author: thisdata.author, //撰写人
+                        office: thisdata.office, //事务所
+                        principal: thisdata.principal //负责人
+                    });
+                };
+                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/getUnitNames",
+            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 {
+            number: '',
+            patentNumber: '',
+            //office: 事务所,
+            province: '',
+            unitName: '',
+            patentType: '',
+            patentName: '',
+            patentState: '',
+            createTime: [],
+            endTime: [],
+            startTime: [],
+            author: '',
+            warningText: 'warning text! warning text! warning text!',
+            AlertDis: 'block',
+            patentTypeOption: [],
+            patentStateOption: [],
+            companyOption: [],
+            authorOption: [],
+            provinceOption: [],
+            searchMore: true,
+            data: [],
+            download: globalConfig.context + '/api/warningreports/download',
             loading: false,
-            leftKey: 'base',
-            userType: '0'
+            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: 'companyName',
+                    key: 'companyName',
+                }, {
+                    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;
+        patentTypeList.map(function (item) {
+            _me.state.patentTypeOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        patentStateList.map(function (item) {
+            _me.state.patentStateOption.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        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;
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.number = '';
+        this.state.patentNumber = '';
+        this.state.province = '';
+        this.state.unitName = '';
+        this.state.patentType = '';
+        this.state.patentName = '';
+        this.state.patentState = '';
+        this.state.createTime = [];
+        this.state.endTime = [];
+        this.state.startTime = [];
+        this.state.author = '';
+        this.loadData();
+    },
+    searchSwitch() {
+        this.setState({
+            searchMore: !this.state.searchMore
+        });
+    },
+    searchcreateTime(date, dateString) {
+        this.state.createTime = dateString;
+    },
+    searchstartTime(date, dateString) {
+        this.state.startTime = dateString;
+    },
+    searchSelect(e) {
+        let _me = this;
+        this.setState({
+            searchValue: e.target.value
+        });
+        switch (_me.state.searchKey) {
+            case "patentNumber":
+                _me.state.patentNumber = e.target.value;
+                _me.state.number = '';
+                _me.state.patentName = '';
+                break;
+            case "serialNumber":
+                _me.state.number = e.target.value;
+                _me.state.patentNumber = '';
+                _me.state.patentName = '';
+                break;
+            case "patentName":
+                _me.state.patentNumber = '';
+                _me.state.number = '';
+                _me.state.patentName = e.target.value;
+                break;
+        }
+    },
     render() {
+        const { MonthPicker, RangePicker } = DatePicker;
         return (
-            <div>
-                补正审查通知管理
-            </div>
-        )
+            <div className="patent-content" >
+                <div className="content-title">
+                    <span>专利综合管理</span>
+                </div>
+                <div className="patent-query">
+                    <Select placeholder="请选择" value={this.state.searchKey} style={{ width: 200 }} onChange={(e) => { this.setState({ searchKey: e, searchValue: '' }); } }>
+                        <Select.Option value="patentNumber">专利号</Select.Option>
+                        <Select.Option value="serialNumber">编号</Select.Option>
+                        <Select.Option value="patentName">专利名称</Select.Option>
+                    </Select>
+                    <Input value={this.state.searchValue} onChange={this.searchSelect} />
+                    <Select placeholder="专利状态" value={this.state.searchState} style={{ width: 200 }} onChange={(e) => { this.setState({ searchState: e }); } }>{this.state.patentStateOption}</Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <Button type="ghost">导出</Button>
+                    <span>更多搜索<Switch defaultChecked={false} onChange={this.searchSwitch} /></span>
+                    <div className="search-more" style={this.state.searchMore ? { display: 'none' } : {}}>
+                        <p>
+                            <span>派单日:</span><RangePicker onChange={this.searchcreateTime} />
+                            <span>申请日:</span><RangePicker onChange={this.searchstartTime} />
+                        </p>
+                        <div>
+                            <Select placeholder="选择省份" style={{ width: 200 }} onChange={(e) => { this.state.province = e } }>{this.state.provinceOption}</Select>
+                            <Select placeholder="选择撰写人" style={{ width: 200 }} onChange={(e) => { this.state.author = e } }>{this.state.authorOption}</Select>
+                            <Select placeholder="选择公司" style={{ width: 200 }} onChange={(e) => { this.state.companyName = e } }>{this.state.companyOption}</Select>
+                        </div>
+                    </div>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <CorrectionDesc data={this.state.RowData} showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
     }
 });
 
-export default Component;
+export default Correction;

+ 84 - 0
js/component/manageCenter/servicesManage/patent/correctionDesc.jsx

@@ -0,0 +1,84 @@
+import React from 'react';
+import { Icon, Modal, message, Spin, Button } from 'antd';
+import './comprehensive.less';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const CorrectionDesc = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/noticeOfCorrectionList",
+            data: {
+                cid : this.props.data.cid
+            },
+            success: function (data) {
+                if ( data.error.length ) {
+                    message.warning(data.error[0].message);
+                    return;
+                } else {
+                    message.success('保存成功!');
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false,
+                visible: false,
+            });
+        }.bind(this));
+        this.props.closeDesc(false);
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc
+    },
+    render() {
+        if (this.props.data) {
+            return (
+                <div className="payment-desc">
+                    <Spin spinning={this.state.loading} className='spin-box'>
+                        <Modal title="通知答复确认" visible={this.state.visible}
+                            onOk={this.handleOk} onCancel={this.handleCancel}
+                            width='500px'
+                            footer={[
+                                <Button key="submit" type="primary" size="large" onClick={this.handleOk}>确认缴费</Button>,
+                                <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>,
+                            ]}
+                            className="patent-desc-content">
+                            <div style={{ fontSize: '16px' }}>
+                                <p><span>公司:</span>{this.props.data.companyName}</p>
+                                <p><span>专利:</span>{this.props.data.patentName}</p>
+                                <p><span>专利号:</span><a href="">{this.props.data.patentNumber}</a></p>
+                                <p><span>审查意见/补正通知 确认已经答复?</span></p>
+                            </div>
+                        </Modal>
+                    </Spin>
+                </div>
+            );
+        } else {
+            return <div></div>
+        }
+    },
+});
+export default CorrectionDesc;

+ 148 - 8
js/component/manageCenter/servicesManage/patent/express.jsx

@@ -1,20 +1,160 @@
 import React from 'react';
+import { Icon, Spin, Table, message } from 'antd';
+import { getPatentType } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import './comprehensive.less';
+import ExpressDesc from './expressDesc.jsx';
 
-const Component = React.createClass({
+const Express = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/getRecieveSendList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+            },
+            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,
+                        number: thisdata.serialNumber,
+                        patentNumber: thisdata.patentNumber,
+                        unitName: thisdata.unitName,
+                        patentName: thisdata.patentName,
+                        patentType: thisdata.patentCatagory,
+                        acceptance:[thisdata.acceptanceReceiveTime,thisdata.acceptanceIssueTime],
+                        acceptanceTrackingNumber:thisdata.acceptanceTrackingNumber,
+                        authorization:[thisdata.authorizationReceiveTime,thisdata.authorizationIssueTime],
+                        authorizationTrackingNumber:thisdata.authorizationTrackingNumber,
+                        certificate:[thisdata.certificateReceiveTime,thisdata.certificateIssueTime],
+                        certificateTrackingNumber:thisdata.certificateTrackingNumber,
+                        rid:thisdata.rid
+                    });
+                };
+                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 {
+            number: '',
+            patentNumber: '',
+            province: '',
+            unitName: '',
+            patentType: '',
+            patentName: '',
+            data: [],
             loading: false,
-            leftKey: 'base',
-            userType: '0'
+            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: 'province',
+                    key: 'province',
+                }, {
+                    title: '公司名称',
+                    dataIndex: 'companyName',
+                    key: 'companyName',
+                }, {
+                    title: '专利类型',
+                    dataIndex: 'patentType',
+                    key: 'patentType',
+                    render: text => { return getPatentType(text) },
+                }, {
+                    title: '专利名称',
+                    dataIndex: 'patentName',
+                    key: 'patentName',
+                }, {
+                    title: '受理书',
+                    dataIndex: 'acceptance',
+                    key: 'acceptance',
+                    render: text => { return },
+                }, {
+                    title: '授权书',
+                    dataIndex: 'authorization',
+                    key: 'authorization',
+                    render: text => { return },
+                }, {
+                    title: '证书',
+                    dataIndex: 'certificate',
+                    key: 'certificate',
+                    render: text => { return },
+                }
+            ],
+            dataSource: []
         };
     },
+    componentWillMount() {
+        this.loadData();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true
+        });
+    },
+    closeDesc(e) {
+        this.state.showDesc = e;
+    },
     render() {
         return (
-            <div>
-                专利纸件收发登记
-            </div>
-        )
+            <div className="patent-content" >
+                <div className="content-title">
+                    <span>专利纸件收发登记</span>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <ExpressDesc data={this.state.RowData} showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
     }
 });
 
-export default Component;
+export default Express;

+ 183 - 0
js/component/manageCenter/servicesManage/patent/expressDesc.jsx

@@ -0,0 +1,183 @@
+import React from 'react';
+import { Row, Col, DatePicker, Input, Select, Modal, message, Spin, Button } from 'antd';
+import moment from 'moment';
+import { expressArr } from '../../../dataDic.js';
+import './comprehensive.less';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const ExpressDesc = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            theBool: true
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/saveRecieveSend",
+            data: {
+                "rid": this.props.data.rid,
+                "acceptanceReceiveTime": this.state.acceptanceReceiveTime,
+                "acceptanceIssueTime": this.state.acceptanceIssueTime,
+                "acceptanceTrackingNumber": this.state.acceptanceTrackingNumber,
+                "acceptanceExpressCompany": "顺丰",
+                "authorizationReceiveTime": this.state.authorizationReceiveTime,
+                "authorizationIssueTime": this.state.authorizationIssueTime,
+                "authorizationTrackingNumber": this.state.authorizationTrackingNumber,
+                "authorizationExpressCompany": "顺丰",
+                "certificateRecieveTime": this.state.certificateRecieveTime,
+                "certificateIssueTime": this.state.certificateIssueTime,
+                "certificateTrackingNumber": this.state.certificateTrackingNumber,
+                "certificateExpressCompany": "顺丰"
+            },
+            success: function (data) {
+                if (data.error.length) {
+                    message.warning(data.error[0].message);
+                    return;
+                } else {
+                    message.success('保存成功!');
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false,
+                visible: false,
+            });
+        }.bind(this));
+        this.props.closeDesc(false);
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc;
+        if (this.state.theBool && nextProps.data) {
+            this.state.acceptanceReceiveTime = nextProps.data.acceptanceReceiveTime;
+            this.state.acceptanceIssueTime = nextProps.data.acceptanceIssueTime;
+            this.state.acceptanceTrackingNumber = nextProps.data.acceptanceTrackingNumber;
+            this.state.authorizationReceiveTime = nextProps.data.authorizationReceiveTime;
+            this.state.authorizationIssueTime = nextProps.data.authorizationIssueTime;
+            this.state.authorizationTrackingNumber = nextProps.data.authorizationTrackingNumber;
+            this.state.certificateRecieveTime = nextProps.data.certificateRecieveTime;
+            this.state.certificateIssueTime = nextProps.data.certificateIssueTime;
+            this.state.certificateTrackingNumber = nextProps.data.certificateTrackingNumber;
+            this.state.theBool = false;
+        }
+
+    },
+    render() {
+        let theData = this.props.data;
+        if (this.props.data) {
+            return (
+                <div className="payment-desc">
+                    <Spin spinning={this.state.loading} className='spin-box'>
+                        <Modal title="收发登记详情" visible={this.state.visible}
+                            onOk={this.handleOk} onCancel={this.handleCancel}
+                            width='800px'
+                            footer={[
+                                <Button key="submit" type="primary" size="large" onClick={this.handleOk}>确认</Button>,
+                                <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>,
+                            ]}
+                            className="patent-desc-content">
+                            <div>
+                                <p className="widthHalf"><span>专利号:</span>{theData.patentNumber}</p>
+                                <p className="widthHalf"><span>专利名:</span>{theData.patentName}</p>
+                            </div>
+                            <Row>
+                                <Col span={4}>收发内容</Col>
+                                <Col span={4}>收到时间</Col>
+                                <Col span={4}>发出时间</Col>
+                                <Col span={6}>发出快递单号</Col>
+                                <Col span={6}>发出快递公司</Col>
+                            </Row>
+                            <Row>
+                                <Col span={4}>受理通知书</Col>
+                                <Col span={4}>
+                                    <DatePicker
+                                        value={moment(this.state.acceptanceReceiveTime)}
+                                        onChange={(data, dataString) => { this.setState({ acceptanceReceiveTime: dataString }); }} />
+                                </Col>
+                                <Col span={4}>
+                                    <DatePicker
+                                        value={moment(this.state.acceptanceIssueTime)}
+                                        onChange={(data, dataString) => { this.setState({ acceptanceIssueTime: dataString }); }} />
+                                </Col>
+                                <Col span={6}>
+                                    <Input value={this.state.acceptanceTrackingNumber}
+                                        onChange={(e) => { this.setState({ acceptanceTrackingNumber: e.target.value }); }} />
+                                </Col>
+                                <Col span={6}>
+                                    <Select defaultValue="顺丰">
+                                        <Select.Option value="顺丰">顺丰</Select.Option>
+                                    </Select>
+                                </Col>
+                            </Row>
+                            <Row>
+                                <Col span={4}>授权通知书</Col>
+                                <Col span={4}>
+                                    <DatePicker
+                                        value={moment(this.state.authorizationReceiveTime)}
+                                        onChange={(data, dataString) => { this.setState({ authorizationReceiveTime: dataString }); }} />
+                                </Col>
+                                <Col span={4}>
+                                    <DatePicker
+                                        value={moment(this.state.authorizationIssueTime)}
+                                        onChange={(data, dataString) => { this.setState({ authorizationIssueTime: dataString }); }} />
+                                </Col>
+                                <Col span={6}>
+                                    <Input value={this.state.authorizationTrackingNumber}
+                                        onChange={(e) => { this.setState({ authorizationTrackingNumber: e.target.value }); }} />
+                                </Col>
+                                <Col span={6}>
+                                    <Select defaultValue="顺丰">
+                                        <Select.Option value="顺丰">顺丰</Select.Option>
+                                    </Select>
+                                </Col>
+                            </Row>
+                            <Row>
+                                <Col span={4}>专利证书</Col>
+                                <Col span={4}>
+                                    <DatePicker
+                                        value={moment(this.state.certificateRecieveTime)}
+                                        onChange={(data, dataString) => { this.setState({ certificateRecieveTime: dataString }); }} />
+                                </Col>
+                                <Col span={4}>
+                                    <DatePicker value={moment(this.state.certificateIssueTime)}
+                                        onChange={(data, dataString) => { this.setState({ certificateIssueTime: dataString }); }} />
+                                </Col>
+                                <Col span={6}>
+                                    <Input value={this.state.certificateTrackingNumber}
+                                        onChange={(e) => { this.setState({ certificateTrackingNumber: e.target.value }); }} />
+                                </Col>
+                                <Col span={6}>
+                                    <Select defaultValue="顺丰">
+                                        <Select.Option value="顺丰">顺丰</Select.Option>
+                                    </Select>
+                                </Col>
+                            </Row>
+                        </Modal>
+                    </Spin>
+                </div>
+            );
+        } else {
+            return <div></div>
+        }
+    },
+});
+export default ExpressDesc;

+ 178 - 8
js/component/manageCenter/servicesManage/patent/payment.jsx

@@ -1,20 +1,190 @@
 import React from 'react';
+import { Icon, Button, Select, Spin, Table, message } from 'antd';
+import { provinceArr } from '../../../dataDic.js';
+import { getTime, getPatentType, getPatentState } from '../../../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import './comprehensive.less';
+import PaymentDesc from './paymentDesc.jsx';
 
-const Component = React.createClass({
+const Payment = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/managePendingPaymentList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                locationProvince: this.state.province,
+            },
+            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,
+                        cid: thisdata.cid,
+                        number: thisdata.serialNumber,
+                        province: thisdata.locationProvince,
+                        patentNumber: thisdata.patentNumber,
+                        unitName: thisdata.unitName,
+                        patentName: thisdata.patentName,
+                        patentType: thisdata.patentCatagory,
+                        patentState: thisdata.patentState,
+                        endTime: thisdata.authorizedDate,
+                        annualFeeState: thisdata.annualFeeState
+                    });
+                };
+                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 {
+            number: '',
+            patentNumber: '',
+            //office: 事务所,
+            province: '',
+            unitName: '',
+            patentType: '',
+            patentName: '',
+            patentState: '',
+            provinceOption: [],
+            data: [],
+            download: globalConfig.context + '/api/warningreports/download',
             loading: false,
-            leftKey: 'base',
-            userType: '0'
+            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: 'province',
+                    key: 'province',
+                }, {
+                    title: '公司名称',
+                    dataIndex: 'companyName',
+                    key: 'companyName',
+                }, {
+                    title: '专利类型',
+                    dataIndex: 'patentType',
+                    key: 'patentType',
+                    render: text => { return getPatentType(text) },
+                }, {
+                    title: '专利名称',
+                    dataIndex: 'patentName',
+                    key: 'patentName',
+                }, {
+                    title: '专利状态',
+                    dataIndex: 'patentState',
+                    key: 'patentState',
+                    render: text => { return getPatentState(text) },
+                }, {
+                    title: '缴费状态',
+                    dataIndex: 'annualFeeState',
+                    key: 'annualFeeState',
+                    render: text => {
+                        if (text === '0') {
+                            return '未缴费'
+                        }
+                    },
+                }, {
+                    title: '缴费截止时间',
+                    dataIndex: 'endTime',
+                    key: 'endTime',
+                    render: text => { return getTime(text, 2) },
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        let _me = this;
+        provinceArr.map(function (item) {
+            _me.state.provinceOption.push(
+                <Select.Option value={item} key={item}>{item}</Select.Option>
+            )
+        });
+        this.loadData();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        if (record.annualFeeState !== '1') {
+            this.setState({
+                showDesc: true
+            });
         };
     },
+    closeDesc(e) {
+        this.state.showDesc = e;
+        this.loadData();
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.province = '';
+        this.loadData();
+    },
     render() {
         return (
-            <div>
-                待缴费专利管理
-            </div>
-        )
+            <div className="patent-content" >
+                <div className="content-title">
+                    <span>代缴年登印费专利管理</span>
+                </div>
+                <div className="patent-query">
+                    <Select placeholder="选择省份" style={{ width: 200 }} onChange={(e) => { this.state.province = e } }>{this.state.provinceOption}</Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <Button type="ghost">导出</Button>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <PaymentDesc data={this.state.RowData} showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+            </div >
+        );
     }
 });
 
-export default Component;
+export default Payment;

+ 84 - 0
js/component/manageCenter/servicesManage/patent/paymentDesc.jsx

@@ -0,0 +1,84 @@
+import React from 'react';
+import { Icon, Modal, message, Spin, Button } from 'antd';
+import './comprehensive.less';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const PatentDesc = React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "post",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/techservice/patent/confirmPayment",
+            data: {
+                cid : this.props.data.cid
+            },
+            success: function (data) {
+                if ( data.error.length ) {
+                    message.warning(data.error[0].message);
+                    return;
+                } else {
+                    message.success('保存成功!');
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false,
+                visible: false,
+            });
+        }.bind(this));
+        this.props.closeDesc(false);
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc
+    },
+    render() {
+        if (this.props.data) {
+            return (
+                <div className="payment-desc">
+                    <Spin spinning={this.state.loading} className='spin-box'>
+                        <Modal title="缴费确认" visible={this.state.visible}
+                            onOk={this.handleOk} onCancel={this.handleCancel}
+                            width='500px'
+                            footer={[
+                                <Button key="submit" type="primary" size="large" onClick={this.handleOk}>确认缴费</Button>,
+                                <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>,
+                            ]}
+                            className="patent-desc-content">
+                            <p style={{ fontSize: '16px' }}>
+                                <span>确认已经缴纳</span>{this.props.data.companyName}
+                                <span>公司专利</span>{this.props.data.patentName}
+                                <span>专利号</span><a href="">{this.props.data.patentNumber}</a>
+                                <span>的年登印费用?</span>
+                            </p>
+                        </Modal>
+                    </Spin>
+                </div>
+            );
+        } else {
+            return <div></div>
+        }
+    },
+});
+export default PatentDesc;

+ 1 - 1
js/component/manageCenter/topTab.jsx

@@ -19,7 +19,7 @@ const TopTab = React.createClass({
             dataType: "json",
             url: globalConfig.context + "/login",
         }).done(function (data) {
-                window.location.href = "./login.html"
+                window.location.href = "../login.html"
         });
     },
     render() {

+ 119 - 66
js/component/tools.js

@@ -1,81 +1,134 @@
-import {provinceList} from './dataDic.js';
+import {
+    provinceList,
+    patentTypeList,
+    patentStateList
+} from './dataDic.js';
 
 module.exports = {
-    addressInit : function(_cmbProvince, _cmbCity, _cmbArea, defaultProvince, defaultCity, defaultArea)  
-    {  
-        var cmbProvince = document.getElementById(_cmbProvince);  
-        var cmbCity = document.getElementById(_cmbCity);  
-        var cmbArea = document.getElementById(_cmbArea);  
-        
-        function cmbSelect(cmb, str)  
-        {  
-            for(var i=0; i<cmb.options.length; i++)  
-            {  
-                if(cmb.options[i].value == str)  
-                {  
-                    cmb.selectedIndex = i;  
-                    return;  
-                }  
-            }  
-        }  
-        function cmbAddOption(cmb, str, obj)  
-        {  
-            var option = document.createElement("OPTION");  
-            cmb.options.add(option);  
-            option.innerText = str;  
-            option.value = str;  
-            option.obj = obj;  
-        }  
-        
-        function changeCity()  
-        {  
-            cmbArea.options.length = 0;  
-            if(cmbCity.selectedIndex == -1)return;  
-            var item = cmbCity.options[cmbCity.selectedIndex].obj;  
-            for(var i=0; i<item.areaList.length; i++)  
-            {  
-                cmbAddOption(cmbArea, item.areaList[i], null);  
-            }  
-            cmbSelect(cmbArea, defaultArea);  
-        }  
-        function changeProvince()  
-        {  
-            cmbCity.options.length = 0;  
-            cmbCity.onchange = null;  
-            if(cmbProvince.selectedIndex == -1)return;  
-            var item = cmbProvince.options[cmbProvince.selectedIndex].obj;  
-            for(var i=0; i<item.cityList.length; i++)  
-            {  
-                cmbAddOption(cmbCity, item.cityList[i].name, item.cityList[i]);  
-            }  
-            cmbSelect(cmbCity, defaultCity);  
-            changeCity();  
-            cmbCity.onchange = changeCity;  
-        }  
-        
-        for(var i=0; i<provinceList.length; i++)  
-        {  
-            cmbAddOption(cmbProvince, provinceList[i].name, provinceList[i]);  
-        }  
-        cmbSelect(cmbProvince, defaultProvince);  
-        changeProvince();  
-        cmbProvince.onchange = changeProvince;  
+    addressInit: function (_cmbProvince, _cmbCity, _cmbArea, defaultProvince, defaultCity, defaultArea) {
+        var cmbProvince = document.getElementById(_cmbProvince);
+        var cmbCity = document.getElementById(_cmbCity);
+        var cmbArea = document.getElementById(_cmbArea);
+
+        function cmbSelect(cmb, str) {
+            for (var i = 0; i < cmb.options.length; i++) {
+                if (cmb.options[i].value == str) {
+                    cmb.selectedIndex = i;
+                    return;
+                }
+            }
+        }
+
+        function cmbAddOption(cmb, str, obj) {
+            var option = document.createElement("OPTION");
+            cmb.options.add(option);
+            option.innerText = str;
+            option.value = str;
+            option.obj = obj;
+        }
+
+        function changeCity() {
+            cmbArea.options.length = 0;
+            if (cmbCity.selectedIndex == -1) return;
+            var item = cmbCity.options[cmbCity.selectedIndex].obj;
+            for (var i = 0; i < item.areaList.length; i++) {
+                cmbAddOption(cmbArea, item.areaList[i], null);
+            }
+            cmbSelect(cmbArea, defaultArea);
+        }
+
+        function changeProvince() {
+            cmbCity.options.length = 0;
+            cmbCity.onchange = null;
+            if (cmbProvince.selectedIndex == -1) return;
+            var item = cmbProvince.options[cmbProvince.selectedIndex].obj;
+            for (var i = 0; i < item.cityList.length; i++) {
+                cmbAddOption(cmbCity, item.cityList[i].name, item.cityList[i]);
+            }
+            cmbSelect(cmbCity, defaultCity);
+            changeCity();
+            cmbCity.onchange = changeCity;
+        }
+
+        for (var i = 0; i < provinceList.length; i++) {
+            cmbAddOption(cmbProvince, provinceList[i].name, provinceList[i]);
+        }
+        cmbSelect(cmbProvince, defaultProvince);
+        changeProvince();
+        cmbProvince.onchange = changeProvince;
     },
-    splitUrl:function(string,i,url){
+    splitUrl: function (string, i, url) {
         let theList = [];
         let theArr = [];
-        if ( string ) {
+        if (string) {
             theArr = string.split(i);
-            theArr.map(function(item,i){
+            theArr.map(function (item, i) {
                 theList.push({
-                    uid:-i,
+                    uid: -i,
                     url: url + item,
-                    response:{
-                    data:item 
+                    response: {
+                        data: item
                     }
                 });
             });
         }
         return theList;
+    },
+    getBase64: function (img, callback) {
+        const reader = new FileReader();
+        reader.addEventListener('load', () => callback(reader.result));
+        reader.readAsDataURL(img);
+    },
+    beforeUpload: function (file) {
+        const isJPG = file.type === 'image/jpeg';
+        if (!isJPG) {
+            message.error('You can only upload JPG file!');
+        }
+        const isLt2M = file.size / 1024 / 1024 < 2;
+        if (!isLt2M) {
+            message.error('Image must smaller than 2MB!');
+        }
+        return isJPG && isLt2M;
+    },
+    getTime: function (e, t) {
+        if (e && !t) {
+            var d = new Date(e);
+            d = d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate() + " ";
+            // + (d.getHours() < 10 ? "0" + d.getHours() : d.getHours()) + ":" +
+            // (d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes()) + ":" +
+            // (d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds());
+            return d;
+        } else if (e && t) {
+            var d1 = new Date(e);
+            var d2 = new Date(e);
+            d2 = d2.setMonth(d1.getMonth() + t);
+            d2 = new Date(d2)
+            d2 = d2.getFullYear() + "/" + (d2.getMonth() + 1) + "/" + d2.getDate() + " ";
+            return d2;
+        } else {
+            return '';
+        }
+    },
+    getPatentType: function (e) {
+        if (e) {
+            let theType = '';
+            patentTypeList.map(function (item) {
+                if (item.value === e) {
+                    theType = item.key;
+                };
+            });
+            return theType;
+        }
+    },
+    getPatentState: function (e) {
+        if (e) {
+            let theState = '';
+            patentStateList.map(function (item) {
+                if (item.value === e) {
+                    theState = item.key;
+                };
+            });
+            return theState;
+        }
     }
 }

+ 17 - 0
js/user/certify.js

@@ -0,0 +1,17 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import '../../css/base.less';
+import '../../css/login.less';
+
+import Top from '../component/certify/top.jsx';
+import Content from '../component/certify/content.jsx';
+import Footer from '../component/certify/footer.jsx';
+
+ReactDOM.render(
+    <div className="wrap">
+        <Top />
+        <Content />
+        <Footer />
+    </div>,
+    document.getElementById('root')
+)

+ 1 - 1
js/user/login.js

@@ -3,7 +3,7 @@ import ReactDOM from 'react-dom';
 import '../../css/base.less';
 import '../../css/login.less';
 
-import LoginTop from '../component/login/loginTOp.jsx';
+import LoginTop from '../component/login/loginTop.jsx';
 import LoginContent from '../component/login/loginContent.jsx';
 import LoginFooter from '../component/login/loginFooter.jsx';
 

+ 1 - 1
js/user/signIn.js

@@ -4,7 +4,7 @@ import { Icon, Tabs } from 'antd';
 import '../../css/base.less';
 import '../../css/sign.less';
 
-import LoginTop from '../component/login/loginTOp.jsx';
+import LoginTop from '../component/login/loginTop.jsx';
 import Account from '../component/sign/account.jsx';
 import GroupAccount from '../component/sign/groupAccount.jsx';
 import LoginFooter from '../component/login/loginFooter.jsx';

+ 22 - 0
webpack.config.js

@@ -24,6 +24,10 @@ module.exports = {
             'webpack/hot/only-dev-server',
             './js/user/signIn.js'
         ],
+        'user/certify': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
+            'webpack/hot/only-dev-server',
+            './js/user/certify.js'
+        ],
         //user-account
         'user/account/index': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
             'webpack/hot/only-dev-server',
@@ -43,6 +47,18 @@ module.exports = {
         'admin/index': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
             'webpack/hot/only-dev-server',
             './js/admin/index.js'
+        ],
+        'admin/login': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
+            'webpack/hot/only-dev-server',
+            './js/admin/login.js'
+        ],
+        'admin/userManage': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
+            'webpack/hot/only-dev-server',
+            './js/admin/userManage.js'
+        ],
+        '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'
         ]
         //vendors: ['jquery','antd']
         //path.resolve(__dirname, './js/index.js'),
@@ -110,6 +126,12 @@ module.exports = {
             template: './template/template.html',
             chunks: ['user/signIn', 'vendors']
         }),
+        new HtmlWebpackPlugin({
+            title: '用户认证',
+            filename: 'user/certify.html',
+            template: './template/template.html',
+            chunks: ['user/certify', 'vendors']
+        }),
         //user-account
         new HtmlWebpackPlugin({
             title: '用户中心-首页',

+ 7 - 0
webpack.config.pro.js

@@ -14,6 +14,7 @@ module.exports = {
         'user/index': './js/user/index.js',
         'user/login': './js/user/login.js',
         'user/signIn': './js/user/signIn.js',
+        'user/certify': './js/user/certify.js',
         //user-account
         'user/account/index': './js/user/account/index.js',
         'user/account/set': './js/user/account/set.js',
@@ -98,6 +99,12 @@ module.exports = {
             template: './template/template.html',
             chunks: ['user/signIn', 'vendors']
         }),
+        new HtmlWebpackPlugin({
+            title: '用户认证',
+            filename: 'user/certify.html',
+            template: './template/template.html',
+            chunks: ['user/certify', 'vendors']
+        }),
         //user-account
         new HtmlWebpackPlugin({
             title: '用户中心-首页',