Browse Source

日常提交,进度到用户端-财务

yee 8 years ago
parent
commit
ff5e196df8

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


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


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


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


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


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


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


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


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


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


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


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


+ 12 - 1
css/base.less

@@ -35,4 +35,15 @@ body {
 
 .footer {
     border-top: 1px solid #d8d8d8;
-}
+}
+// .ant-modal-content {
+//     .ant-modal-body {
+//         .ant-form {
+//            .ant-form-item {
+//                .ant-form-item-control  {
+//                    text-align: center;
+//                }
+//            } 
+//         }
+//     }
+// }

+ 54 - 40
js/component/account/services/activity.jsx

@@ -24,16 +24,18 @@ const ActivityDesc = React.createClass({
             method: "POST",
             dataType: "json",
             crossDomain: false,
-            url: globalConfig.context + "/techservice/cognizance/disposeActivity",
+            url: globalConfig.context + "/techservice/cognizance/activity",
             data: {
                 id: this.props.data.id,
                 activityName: this.state.activityName,
                 activityNumber: this.state.activityNumber,
                 startDateFormattedDate: this.state.startDateFormattedDate,
                 endDateFormattedDate: this.state.endDateFormattedDate,
-                techField: this.state.techField,
+                technicalField1: this.state.techField[0],
+                technicalField2: this.state.techField[1],
+                technicalField3: this.state.techField[2],
                 technicalSource: this.state.technicalSource,
-                intellectualPropertyNumber: this.state.targetKeys,
+                intellectualPropertyNumber: this.state.targetKeys.join(","),
                 budget: this.state.budget,
                 firstYearExpenditure: this.state.firstYearExpenditure,
                 secondYearExpenditure: this.state.secondYearExpenditure,
@@ -72,10 +74,13 @@ const ActivityDesc = React.createClass({
                     loading: false,
                     visible: false
                 });
+                this.props.closeDesc(false);
             } else {
                 message.warning(data.error[0].message);
+                this.setState({
+                    loading: false
+                });
             };
-            this.props.closeDesc(false);
         }.bind(this));
     },
     handleCancel(e) {
@@ -101,34 +106,20 @@ const ActivityDesc = React.createClass({
             this.state.implement = nextProps.data.implement;
             this.state.technologyInnovation = nextProps.data.technologyInnovation;
             this.state.achievement = nextProps.data.achievement;
+            this.state.mockData = nextProps.data.mockData;
         };
     },
     intellectualChange(nextTargetKeys, direction, moveKeys) {
         this.setState({ targetKeys: nextTargetKeys });
-
-        console.log('targetKeys: ', this.state.targetKeys);
-        console.log('direction: ', this.state.direction);
-        console.log('moveKeys: ', this.state.moveKeys);
     },
     intellectualSelectChange(sourceSelectedKeys, targetSelectedKeys) {
         this.setState({ selectedKeys: [...sourceSelectedKeys, ...targetSelectedKeys] });
-
-        console.log('sourceSelectedKeys: ', this.state.sourceSelectedKeys);
-        console.log('targetSelectedKeys: ', this.state.targetSelectedKeys);
     },
     render() {
-        const mockData = [];
-        for (let i = 0; i < 20; i++) {
-            mockData.push({
-                key: 20000 + i.toString(),
-                title: `content${i + 1}`,
-                description: `description of content${i + 1}`,
-            });
-        };
         if (this.props.data) {
             return (
                 <div className="admin-desc">
-                    <Modal title="企业研究开发活动情况" visible={this.state.visible} onCancel={this.handleCancel}
+                    <Modal title="企业研究开发活动情况详情" visible={this.state.visible} onCancel={this.handleCancel}
                         width='800px' footer={[
                             <Button key="submit" type="primary" size="large" loading={this.state.loading} onClick={this.handleOk}>保存</Button>,
                             <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>
@@ -184,41 +175,46 @@ const ActivityDesc = React.createClass({
                         <div>
                             <p>知识产权编号:</p>
                             <Transfer
-                                dataSource={mockData}
-                                titles={['Source', 'Target']}
+                                dataSource={this.props.mockData}
+                                listStyle={{
+                                    width: 300,
+                                    height: 300,
+                                }}
+                                titles={['未选择', '已选择']}
                                 targetKeys={this.state.targetKeys}
                                 selectedKeys={this.state.selectedKeys}
                                 onChange={this.intellectualChange}
                                 onSelectChange={this.intellectualSelectChange}
-                                render={item => item.title}
+                                render={item => `${item.name}-${item.key}`}
                             />
                         </div>
                         <div>
                             <p>研发经费总预算(万元):</p>
-                            <InputNumber value={this.state.budget}
-                                onChange={(e) => { this.setState({ budget: e.target.value }); }} />
+                            <InputNumber value={this.state.budget || 0}
+                                onChange={(e) => { this.setState({ budget: e }); }} />
                         </div>
                         <div className="clearfix" >
                             <p>研发经费近三年总支出(万元):</p>
                             <div className="half-div">
                                 <span>总计(万元):</span>
-                                <InputNumber value={this.state.activityNumber}
-                                    onChange={(e) => { this.setState({ activityNumber: e.target.value }); }} />
+                                <InputNumber value={
+                                    this.state.firstYearExpenditure + this.state.secondYearExpenditure + this.state.thirdYearExpenditure || 0
+                                } />
                             </div>
                             <div className="half-div">
                                 <span>其中(第一年):</span>
                                 <InputNumber value={this.state.firstYearExpenditure}
-                                    onChange={(e) => { this.setState({ firstYearExpenditure: e.target.value }); }} />
+                                    onChange={(e) => { this.setState({ firstYearExpenditure: e }); }} />
                             </div>
                             <div className="half-div">
                                 <span>其中(第二年):</span>
                                 <InputNumber value={this.state.secondYearExpenditure}
-                                    onChange={(e) => { this.setState({ secondYearExpenditure: e.target.value }); }} />
+                                    onChange={(e) => { this.setState({ secondYearExpenditure: e }); }} />
                             </div>
                             <div className="half-div">
                                 <span>其中(第三年):</span>
                                 <InputNumber value={this.state.thirdYearExpenditure}
-                                    onChange={(e) => { this.setState({ thirdYearExpenditure: e.target.value }); }} />
+                                    onChange={(e) => { this.setState({ thirdYearExpenditure: e }); }} />
                             </div>
                         </div>
                         <div className="clearfix">
@@ -275,7 +271,7 @@ const Activity = React.createClass({
             method: "post",
             dataType: "json",
             crossDomain: false,
-            url: globalConfig.context + "/techservice/cognizance/activity",
+            url: globalConfig.context + "/techservice/cognizance/activityList",
             data: {
                 pageNo: pageNo || 1,
                 pageSize: this.state.pagination.pageSize,
@@ -284,7 +280,7 @@ const Activity = React.createClass({
                 startDate: this.state.startDate,
                 endDate: this.state.endDate
             }
-        }),$.ajax({
+        }), $.ajax({
             method: "get",
             dataType: "json",
             crossDomain: false,
@@ -293,14 +289,25 @@ const Activity = React.createClass({
                 pageNo: pageNo || 1,
                 pageSize: 99,
             }
-        })).done((data1,data2) => {
+        })).done((data1, data2) => {
             let data = data1[0];
             let intellectualList = data2[0];
-            debugger
             if (data.error.length || !data.data || !data.data.list) {
                 message.warning(data.error[0].message);
                 return;
-            }
+            };
+            if (intellectualList.error.length || !intellectualList.data || !intellectualList.data.list) {
+                message.warning(intellectualList.error[0].message);
+                return;
+            };
+            let theArr = [];
+            for (let i = 0; i < intellectualList.data.list.length; i++) {
+                theArr.push({
+                    key: intellectualList.data.list[i].intellectualPropertyNumber,
+                    name: intellectualList.data.list[i].intellectualPropertyName
+                });
+            };
+            this.state.mockData = theArr;
             for (let i = 0; i < data.data.list.length; i++) {
                 let thisdata = data.data.list[i];
                 this.state.data.push({
@@ -311,13 +318,16 @@ const Activity = React.createClass({
                     activityName: thisdata.activityName,
                     startDate: thisdata.startDate,
                     endDate: thisdata.endDate,
+
+                    mockData: this.state.mockData,
+
                     techField: [Number(thisdata.technicalField1), Number(thisdata.technicalField2), Number(thisdata.technicalField3)],
                     technicalField: getTechField(thisdata.technicalField1, thisdata.technicalField2, thisdata.technicalField3),
                     technicalField1: thisdata.technicalField1,
                     technicalField2: thisdata.technicalField2,
                     technicalField3: thisdata.technicalField3,
-                    technicalSource: getTechnicalSource(thisdata.technicalSource),
-                    intellectualPropertyNumber: thisdata.intellectualPropertyNumber.split(","),
+                    technicalSource: String(thisdata.technicalSource),
+                    intellectualPropertyNumber: thisdata.intellectualPropertyNumber ? thisdata.intellectualPropertyNumber.split(",") : [],
                     budget: thisdata.budget,
                     firstYearExpenditure: thisdata.firstYearExpenditure,
                     secondYearExpenditure: thisdata.secondYearExpenditure,
@@ -355,6 +365,7 @@ const Activity = React.createClass({
     },
     getInitialState() {
         return {
+            mockData: [],
             selectedRowKeys: [],
             selectedRows: [],
             loading: false,
@@ -386,7 +397,8 @@ const Activity = React.createClass({
                 }, {
                     title: '技术来源',
                     dataIndex: 'technicalSource',
-                    key: 'technicalSource'
+                    key: 'technicalSource',
+                    render: (text) => { return getTechnicalSource(text) }
                 }, {
                     title: '知识产权编号',
                     dataIndex: 'intellectualPropertyNumber',
@@ -471,7 +483,7 @@ const Activity = React.createClass({
         return (
             <div className="user-content" >
                 <div className="content-title">
-                    <span>标准制定情况汇总</span>
+                    <span>企业研究开发活动情况表</span>
                 </div>
                 <div className="user-search">
                     <Input placeholder="研发活动名称" value={this.state.activityName}
@@ -497,7 +509,9 @@ const Activity = React.createClass({
                             onRowClick={this.tableRowClick} />
                     </Spin>
                 </div>
-                <ActivityDesc data={this.state.RowData} showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
+                <ActivityDesc data={this.state.RowData}
+                    mockData={this.state.mockData}
+                    showDesc={this.state.showDesc} closeDesc={this.closeDesc} />
             </div >
         );
     }

+ 604 - 0
js/component/account/services/activityCostList.jsx

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

+ 16 - 0
js/component/account/services/activityCostList.less

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

+ 18 - 3
js/component/account/services/content.jsx

@@ -2,9 +2,14 @@ import React from 'react';
 import '../content.less';
 import LeftTab from './leftTab.jsx';
 
-import Patent from './patent.jsx';
-import Activity from './activity.jsx';
-import Standard from './standard.jsx';
+import Patent from './patent';
+import Intellectual from './intellectual';
+import Activity from './activity';
+import Standard from './standard';
+import ActivityCostList from './activityCostList';
+import TechProduct from './techProduct';
+import Ratepay from './ratepay';
+import Finance from './finance';
 
 const Content = React.createClass({
     getInitialState() {
@@ -34,10 +39,20 @@ const Content = React.createClass({
                         switch (this.state.leftKey) {
                             case 'patent':
                                 return <Patent />;
+                            case 'intellectual':
+                                return <Intellectual />;
                             case 'activity':
                                 return <Activity />;
                             case 'standard':
                                 return <Standard />;
+                            case 'activityCostList':
+                                return <ActivityCostList />;
+                            case 'techProduct':
+                                return <TechProduct />;
+                            case 'ratepay':
+                                return <Ratepay />;
+                            case 'finance':
+                                return <Finance />;
                         };
                     })()}
                 </div>

+ 436 - 0
js/component/account/services/finance.jsx

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

+ 218 - 0
js/component/account/services/intellectual.jsx

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

+ 57 - 0
js/component/account/services/intellectual.less

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

+ 58 - 47
js/component/account/services/clientInputPatent.jsx

@@ -1,27 +1,28 @@
 import React from 'react';
 import { Icon, Modal, Button, Form, message, Input, Spin, Select, DatePicker } from 'antd';
 import './patent.less';
-import { patentGetList, patentTypeList } from '../../dataDic.js';
+import { intellectualGetList, catagoryList } from '../../dataDic.js';
 import ajax from 'jquery/src/ajax/xhr.js'
 import $ from 'jquery/src/ajax';
+import moment from 'moment';
 
-const PatentAddFrom = Form.create()(React.createClass({
+const IntellectualDescFrom = Form.create()(React.createClass({
     getInitialState() {
         return {
             loading: false,
-            patentGetOption: [],
-            patentTypeOption: []
+            intellectualGetOption: [],
+            catagoryOption: []
         };
     },
     componentWillMount() {
         let _me = this;
-        patentGetList.map(function (item) {
-            _me.state.patentGetOption.push(
+        intellectualGetList.map(function (item) {
+            _me.state.intellectualGetOption.push(
                 <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
             )
         });
-        patentTypeList.map(function (item) {
-            _me.state.patentTypeOption.push(
+        catagoryList.map(function (item) {
+            _me.state.catagoryOption.push(
                 <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
             )
         });
@@ -35,15 +36,16 @@ const PatentAddFrom = Form.create()(React.createClass({
                     method: "POST",
                     dataType: "json",
                     crossDomain: false,
-                    url: globalConfig.context + "/techservice/patent/clientInputPatent",
+                    url: globalConfig.context + "/techservice/cognizance/intellectual",
                     data: {
-                        "patentNumber": values.patentNumber,
-                        "patentName": values.patentName,
-                        "patentCatagory": values.patentCatagory,
-                        "obtailWay": values.obtailWay,
-                        "sortNumber": values.sortNumber,
-                        "authorizationNumber": values.authorizationNumber,
-                        "authorizationDate": this.state.authorizationDate
+                        id:this.props.data.id,
+                        intellectualPropertyNumber: values.intellectualPropertyNumber,
+                        intellectualPropertyName: values.intellectualPropertyName,
+                        catagory: values.catagory,
+                        obtainWay: values.obtainWay,
+                        sortNumber: values.sortNumber,
+                        authorizationNumber: values.authorizationNumber,
+                        authorizationDateFormattedDate: values.authorizationDate._i || this.state.authorizationDateFormattedDate  
                     }
                 }).done(function (data) {
                     if (!data.error.length) {
@@ -70,30 +72,32 @@ const PatentAddFrom = Form.create()(React.createClass({
         const FormItem = Form.Item;
         const { getFieldDecorator } = this.props.form;
         const formItemLayout = {
-            labelCol: { span: 3 },
+            labelCol: { span: 6 },
             wrapperCol: { span: 12 },
         };
         const _me = this;
         return (
-            <Form horizontal onSubmit={this.handleSubmit} className="person-form">
+            <Form horizontal onSubmit={this.handleSubmit}>
                 <FormItem
                     {...formItemLayout}
-                    label="专利编号"
+                    label="知识产权编号"
                 >
-                    {getFieldDecorator('patentNumber', {
-                        rules: [{ required: true, message: '请输入,专利编号不能为空!' }]
+                    {getFieldDecorator('intellectualPropertyNumber', {
+                        rules: [{ required: true, message: '请输入,知识产权编号不能为空!' }],
+                        initialValue: this.props.data.intellectualPropertyNumber
                     })(
-                        <Input placeholder="请输入专利编号" />
+                        <Input placeholder="请输入知识产权编号" />
                         )}
                 </FormItem>
                 <FormItem
                     {...formItemLayout}
-                    label="专利名称"
+                    label="知识产权名称"
                 >
-                    {getFieldDecorator('patentName', {
-                        rules: [{ required: true, message: '请输入,专利名称不能为空!' }]
+                    {getFieldDecorator('intellectualPropertyName', {
+                        rules: [{ required: true, message: '请输入,知识产权名称不能为空!' }],
+                        initialValue: this.props.data.intellectualPropertyName
                     })(
-                        <Input placeholder="请输入专利名称" />
+                        <Input placeholder="请输入知识产权名称" />
                         )}
                 </FormItem>
                 <FormItem
@@ -101,21 +105,23 @@ const PatentAddFrom = Form.create()(React.createClass({
                     label="排序号"
                 >
                     {getFieldDecorator('sortNumber', {
-                        rules: [{ required: true, message: '请输入,排序号不能为空!' }]
+                        rules: [{ required: true, message: '请输入,排序号不能为空!' }],
+                        initialValue: this.props.data.sortNumber
                     })(
                         <Input placeholder="请输入排序号" />
                         )}
                 </FormItem>
                 <FormItem
                     {...formItemLayout}
-                    label="专利类型"
+                    label="知识产权类型"
                 >
-                    {getFieldDecorator('patentCatagory', {
-                        rules: [{ required: true, message: '请选择,专利类型不能为空!' }]
+                    {getFieldDecorator('catagory', {
+                        rules: [{ required: true, message: '请选择,知识产权类型不能为空!' }],
+                        initialValue: this.props.data.catagory
                     })(
-                        <Select placeholder="请选择专利类型" style={{ width: 200 }}
-                            onChange={(e) => { this.state.patentCatagory = e; }}>
-                            {this.state.patentTypeOption}
+                        <Select placeholder="请选择知识产权类型" style={{ width: 200 }}
+                            onChange={(e) => { this.state.catagory = e; }}>
+                            {this.state.catagoryOption}
                         </Select>
                         )}
                 </FormItem>
@@ -123,12 +129,13 @@ const PatentAddFrom = Form.create()(React.createClass({
                     {...formItemLayout}
                     label="获得方式"
                 >
-                    {getFieldDecorator('obtailWay', {
-                        rules: [{ required: true, message: '请选择,获得方式不能为空!' }]
+                    {getFieldDecorator('obtainWay', {
+                        rules: [{ required: true, message: '请选择,获得方式不能为空!' }],
+                        initialValue: this.props.data.obtainWay
                     })(
                         <Select placeholder="请选择获得方式" style={{ width: 200 }}
-                            onChange={(e) => { this.state.obtailWay = e; }}>
-                            {this.state.patentGetOption}
+                            onChange={(e) => { this.state.obtainWay = e; }}>
+                            {this.state.intellectualGetOption}
                         </Select>
                         )}
                 </FormItem>
@@ -137,7 +144,8 @@ const PatentAddFrom = Form.create()(React.createClass({
                     label="授权号"
                 >
                     {getFieldDecorator('authorizationNumber', {
-                        rules: [{ required: true, message: '请输入,授权号不能为空!' }]
+                        rules: [{ required: true, message: '请输入,授权号不能为空!' }],
+                        initialValue: this.props.data.authorizationNumber
                     })(
                         <Input placeholder="请输入授权号" />
                         )}
@@ -147,10 +155,11 @@ const PatentAddFrom = Form.create()(React.createClass({
                     label="授权日期"
                 >
                     {getFieldDecorator('authorizationDate', {
-                        rules: [{ required: true, message: '请选择,授权日期不能为空!' }]
+                        rules: [{ type: 'object', required: true, message: '请选择,授权日期不能为空!' }],
+                        initialValue: !this.props.data.authorizationDateFormattedDate ? null : moment(this.props.data.authorizationDateFormattedDate, 'YYYY/MM/DD')
                     })(
-                        <DatePicker style={{ width: 200 }} 
-                        onChange={(data,dataString)=>{ this.state.authorizationDate = dataString}}/>
+                        <DatePicker style={{ width: 200 }}
+                            onChange={(data, dataString) => { this.state.authorizationDateFormattedDate = dataString }} />
                         )}
                 </FormItem>
                 <FormItem>
@@ -163,13 +172,16 @@ const PatentAddFrom = Form.create()(React.createClass({
 }));
 
 
-const PatentAdd = React.createClass({
+const intellectualDesc = React.createClass({
     getInitialState() {
         return {
             visible: false,
             loading: false
         };
     },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc
+    },
     showModal() {
         this.setState({
             visible: true,
@@ -195,18 +207,17 @@ const PatentAdd = React.createClass({
     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}
+                    <Modal title="知识产权详情" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
-                        width='720px'
+                        width='600px'
                         footer=''
                     >
-                        <PatentAddFrom spinState={this.spinChange} closeModal={this.handleCancel} />
+                        <IntellectualDescFrom data={this.props.data} spinState={this.spinChange} closeModal={this.handleCancel} />
                     </Modal>
                 </Spin>
             </div>
         );
     },
 });
-export default PatentAdd;
+export default intellectualDesc;

+ 15 - 0
js/component/account/services/leftTab.jsx

@@ -38,6 +38,9 @@ const LeftTab = React.createClass({
                     <Menu.Item key="software">
                         软著申请
                     </Menu.Item>
+                    <Menu.Item key="intellectual">
+                        知识产权管理
+                    </Menu.Item>
                 </SubMenu>
                 <SubMenu key="sub2" title={<span>高企认定</span>}>
                     <Menu.Item key="standard">
@@ -46,6 +49,18 @@ const LeftTab = React.createClass({
                     <Menu.Item key="activity">
                         企业研究开发活动
                     </Menu.Item>
+                    <Menu.Item key="activityCostList">
+                        企业研发费用详情
+                    </Menu.Item>
+                    <Menu.Item key="techProduct">
+                        上年度高新技术产品(服务)情况
+                    </Menu.Item>
+                    <Menu.Item key="ratepay">
+                        纳税申报信息
+                    </Menu.Item>
+                    <Menu.Item key="finance">
+                        财务报表信息
+                    </Menu.Item>
                 </SubMenu>
                 <SubMenu key="sub3" title={<span>科技项目申报</span>}>
                 </SubMenu>

+ 0 - 2
js/component/account/services/patent.jsx

@@ -7,7 +7,6 @@ import $ from 'jquery/src/ajax';
 import './patent.less';
 import PatentAdd from './patentAdd.jsx';
 import PatentDesc from './patentDesc.jsx';
-import ClientInputPatent from './clientInputPatent.jsx';
 
 const Patent = React.createClass({
     loadData(pageNo) {
@@ -185,7 +184,6 @@ const Patent = React.createClass({
                 <div className="content-title">
                     <span>专利申请管理</span>
                     {userData.type == '0' ? <span></span> : <PatentAdd closeDesc={this.closeDesc}/>}
-                    {userData.type == '0' ? <span></span> : <ClientInputPatent closeDesc={this.closeDesc}/>}
                 </div>
                 <Alert style={{ display: this.state.AlertDis }} className="patent-alert" message={this.state.warningText}
                     type="info"

+ 436 - 0
js/component/account/services/ratepay.jsx

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

+ 518 - 0
js/component/account/services/techProduct.jsx

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

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


+ 65 - 5
js/component/account/set/hrSituation.jsx

@@ -1,10 +1,12 @@
 import React from 'react';
-import { Input, InputNumber, Button, Form, Icon, Spin, message } from 'antd';
+import { Input, InputNumber, Button, Form, Icon, Spin, message, Tabs, Upload } from 'antd';
+import { beforeUpload } from '../../tools.js';
 import './person.less';
 import './hrSituation.less'
 import ajax from 'jquery/src/ajax/xhr.js'
 import $ from 'jquery/src/ajax';
 
+
 const PersonFrom = Form.create()(React.createClass({
     getData() {
         this.props.spinState(true);
@@ -12,6 +14,9 @@ const PersonFrom = Form.create()(React.createClass({
             method: "get",
             dataType: "json",
             url: globalConfig.context + "/api/user/humanResource",
+            data: {
+                year: this.props.year
+            },
             success: function (data) {
                 if (data.data) {
                     this.setState({
@@ -50,13 +55,12 @@ const PersonFrom = Form.create()(React.createClass({
     },
     getInitialState() {
         return {
-            loading: false,
+            loading: false
         };
     },
     handleSubmit(e) {
         e.preventDefault();
         this.props.form.validateFields((err, values) => {
-            debugger
             if (values.firmTotal < values.firmInService + values.firmPartTime + values.firmTemporary) {
                 message.warning("总体情况的在职人员数、兼职人员数、临时聘用人员数相加小于等于企业职工总数!");
                 return;
@@ -86,6 +90,7 @@ const PersonFrom = Form.create()(React.createClass({
                     crossDomain: false,
                     url: globalConfig.context + "/api/user/SaveHumanResource",
                     data: {
+                        year: this.props.year,
                         aboveFifty: values.aboveFifty,
                         belowThirty: values.belowThirty,
                         college: values.college,
@@ -112,6 +117,8 @@ const PersonFrom = Form.create()(React.createClass({
                         techTotal: values.techTotal,
                         thirtyoneToThirtyfour: values.thirtyoneToThirtyfour,
                         undergraduate: values.undergraduate,
+                        rosterUrl:this.state.rosterUrl,
+                        socialSecurityUrl:this.state.socialSecurityUrl
                     }
                 }).done(function (data) {
                     if (!data.error.length) {
@@ -418,7 +425,49 @@ const PersonFrom = Form.create()(React.createClass({
                             )}
                     </FormItem>
                 </div>
-                <div style={{ marginLeft: "40px" }}>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="socialSecurity"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'socialSecurity' }}
+                        beforeUpload={beforeUpload}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.socialSecurityUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传社保文件 </Button>
+                    </Upload>
+                </div>
+                <div className="hrSituation-roster">
+                    <Upload
+                        name="roster"
+                        action={globalConfig.context + "/techservice/cognizance/upload"}
+                        data={{ 'sign': this.props.year + 'roster' }}
+                        beforeUpload={beforeUpload}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                message.success(`${info.file.name} 文件上传成功!`);
+                                this.state.rosterUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            }
+                        }}
+                    >
+                        <Button><Icon type="upload" /> 上传花名册文件 </Button>
+                    </Upload>
+                </div>
+                <div>
                     <span style={{ color: "red" }}>提示</span>
                     <p>1、总体情况的在职人员数、兼职人员数、临时聘用人员数相加小于等于企业职工总数。</p>
                     <p>2、科技人员数小于等于企业职工总数。</p>
@@ -444,11 +493,22 @@ const Person = React.createClass({
         });
     },
     render() {
+        const theYear = (new Date()).getFullYear() - 1;
         return (
             <Spin spinning={this.state.loading} className='spin-box'>
                 <div className="set-person">
                     <div className="acc-detail">
-                        <PersonFrom spinState={this.spinChange} />
+                        <Tabs defaultActiveKey={String(theYear)} >
+                            <Tabs.TabPane tab={theYear} key={theYear}>
+                                <PersonFrom year={theYear} spinState={this.spinChange} urlData={this.urlData}/>
+                            </Tabs.TabPane>
+                            <Tabs.TabPane tab={theYear - 1} key={theYear - 1}>
+                                <PersonFrom year={theYear - 1} spinState={this.spinChange} urlData={this.urlData}/>
+                            </Tabs.TabPane>
+                            <Tabs.TabPane tab={theYear - 2} key={theYear - 2}>
+                                <PersonFrom year={theYear - 2} spinState={this.spinChange} urlData={this.urlData}/>
+                            </Tabs.TabPane>
+                        </Tabs>
                     </div>
                 </div>
             </Spin>

+ 5 - 0
js/component/account/set/hrSituation.less

@@ -18,4 +18,9 @@
         width: 126px;
         text-align: right;
     }
+    .hrSituation-roster {
+        margin-top: 10px;
+        margin-bottom: 20px;
+        width: 400px;
+    }
 }

+ 41 - 27
js/component/dataDic.js

@@ -2850,36 +2850,12 @@ module.exports = {
             key: "其他"
         },{
             value: "1",
-            key: "已授权的专利"
-        }, {
-            value: "2",
             key: "实用新型专利"
         }, {
-            value: "3",
+            value: "2",
             key: "外观设计专利"
         }, {
-            value: "4",
-            key: "软件著作权"
-        }, {
-            value: "5",
-            key: "国防专利"
-        }, {
-            value: "6",
-            key: "植物新品种"
-        }, {
-            value: "7",
-            key: "国家级农作物品种"
-        }, {
-            value: "8",
-            key: "国家新药"
-        }, {
-            value: "9",
-            key: "国家一级中药保护品种"
-        }, {
-            value: "10",
-            key: "集成电路布图设计专有权"
-        }, {
-            value: "11",
+            value: "3",
             key: "发明专利"
         }
     ],
@@ -2929,7 +2905,45 @@ module.exports = {
             key: "电学"
         }
     ],
-    patentGetList:[
+    catagoryList: [{
+            value: "0",
+            key: "其他"
+        },{
+            value: "1",
+            key: "已授权的专利"
+        }, {
+            value: "2",
+            key: "实用新型专利"
+        }, {
+            value: "3",
+            key: "外观设计专利"
+        }, {
+            value: "4",
+            key: "软件著作权"
+        }, {
+            value: "5",
+            key: "国防专利"
+        }, {
+            value: "6",
+            key: "植物新品种"
+        }, {
+            value: "7",
+            key: "国家级农作物品种"
+        }, {
+            value: "8",
+            key: "国家新药"
+        }, {
+            value: "9",
+            key: "国家一级中药保护品种"
+        }, {
+            value: "10",
+            key: "集成电路布图设计专有权"
+        }, {
+            value: "11",
+            key: "发明专利"
+        }
+    ],
+    intellectualGetList:[
         {
             value: "0",
             key: "拥有五年以上的独占许可"

+ 1 - 1
js/component/login/forgetPw.jsx

@@ -53,7 +53,7 @@ const ChangePw = React.createClass({
                 method: "POST",
                 dataType: "json",
                 crossDomain: false,
-                url: globalConfig.context + "/api/user/pwd",
+                url: globalConfig.context + "/api/user/resetPwd",
                 data: {
                     "mobile": this.state.mobile,
                     "type": this.props.theType,

+ 0 - 1
js/component/manageCenter/servicesManage/patent/correction.jsx

@@ -1,6 +1,5 @@
 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,getPatentType } from '../../../tools.js';
 import ajax from 'jquery/src/ajax/xhr.js';
 import $ from 'jquery/src/ajax';

+ 25 - 1
js/component/tools.js

@@ -6,7 +6,9 @@ import {
     patentTypeList,
     patentStateList,
     techFieldList,
-    technicalSourceList
+    technicalSourceList,
+    catagoryList,
+    intellectualGetList
 } from './dataDic.js';
 
 module.exports = {
@@ -198,5 +200,27 @@ module.exports = {
             };
         });
         return fieldKey;
+    },
+    getCatagory: function (e) {
+        if (e) {
+            let theType = '';
+            catagoryList.map(function (item) {
+                if (item.value == e) {
+                    theType = item.key;
+                };
+            });
+            return theType;
+        }
+    },
+    getIntellectualObtainWay: function (e) {
+        if (e) {
+            let theType = '';
+            intellectualGetList.map(function (item) {
+                if (item.value == e) {
+                    theType = item.key;
+                };
+            });
+            return theType;
+        }
     }
 }