Commit c52926c0 authored by superman's avatar superman

报单审核列表页 下载审核成功的照片

parent 89f900c1
!function(e){function t(n){if(r[n])return r[n].exports;var a=r[n]={exports:{},id:n,loaded:!1};return e[n].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var n=window.webpackJsonp;window.webpackJsonp=function(c,o){for(var i,p,s=0,l=[];s<c.length;s++)p=c[s],a[p]&&l.push.apply(l,a[p]),a[p]=0;for(i in o){var u=o[i];switch(typeof u){case"object":e[i]=function(t){var n=t.slice(1),r=t[0];return function(t,a,c){e[r].apply(this,[t,a,c].concat(n))}}(u);break;case"function":e[i]=u;break;default:e[i]=e[u]}}for(n&&n(c,o);l.length;)l.shift().call(null,t);if(o[0])return r[0]=0,t(0)};var r={},a={0:0};t.e=function(e,n){if(0===a[e])return n.call(null,t);if(void 0!==a[e])a[e].push(n);else{a[e]=[n];var r=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.src=t.p+""+({1:"index"}[e]||e)+".js",r.appendChild(c)}},t.m=e,t.c=r,t.p=""}(function(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))switch(typeof e[t]){case"function":break;case"object":e[t]=function(t){var n=t.slice(1),r=e[t[0]];return function(e,t,a){r.apply(this,[e,t,a].concat(n))}}(e[t]);break;default:e[t]=e[e[t]]}return e}([])); !function(e){function t(n){if(r[n])return r[n].exports;var a=r[n]={exports:{},id:n,loaded:!1};return e[n].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var n=window.webpackJsonp;window.webpackJsonp=function(c,o){for(var i,p,s=0,l=[];s<c.length;s++)p=c[s],a[p]&&l.push.apply(l,a[p]),a[p]=0;for(i in o){var u=o[i];switch(typeof u){case"object":e[i]=function(t){var n=t.slice(1),r=t[0];return function(t,a,c){e[r].apply(this,[t,a,c].concat(n))}}(u);break;case"function":e[i]=u;break;default:e[i]=e[u]}}for(n&&n(c,o);l.length;)l.shift().call(null,t);if(o[0])return r[0]=0,t(0)};var r={},a={0:0};t.e=function(e,n){if(0===a[e])return n.call(null,t);if(void 0!==a[e])a[e].push(n);else{a[e]=[n];var r=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.src=t.p+""+({1:"index"}[e]||e)+".js",r.appendChild(c)}},t.m=e,t.c=r,t.p="/"}(function(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))switch(typeof e[t]){case"function":break;case"object":e[t]=function(t){var n=t.slice(1),r=e[t[0]];return function(e,t,a){r.apply(this,[e,t,a].concat(n))}}(e[t]);break;default:e[t]=e[e[t]]}return e}([]));
\ No newline at end of file \ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
"redux-actions": "0.9.x", "redux-actions": "0.9.x",
"redux-async-connect": "^1.0.0-rc4", "redux-async-connect": "^1.0.0-rc4",
"redux-saga": "^0.10.4", "redux-saga": "^0.10.4",
"socket.io-client": "^1.4.8",
"src": "^1.1.2" "src": "^1.1.2"
}, },
"devDependencies": { "devDependencies": {
......
...@@ -88,7 +88,7 @@ export default class HeaderOperation extends Component { ...@@ -88,7 +88,7 @@ export default class HeaderOperation extends Component {
delete props.icon; delete props.icon;
delete props.link; delete props.link;
return ( return (
<Tooltip title={title} key={props.key+'tooltip'}> <Tooltip title={title} key={props.key + 'tooltip'}>
<Button type="ghost" {...props} > <Button type="ghost" {...props} >
<Link to={link}> <Link to={link}>
<Icon type={icon}/> <Icon type={icon}/>
...@@ -98,7 +98,7 @@ export default class HeaderOperation extends Component { ...@@ -98,7 +98,7 @@ export default class HeaderOperation extends Component {
); );
} }
const btn = ( const btn = (
<Tooltip title={title} key={props.key+'tooltip'}> <Tooltip title={title} key={props.key + 'tooltip'}>
<Button type="ghost" {...props} /> <Button type="ghost" {...props} />
</Tooltip> </Tooltip>
); );
......
...@@ -151,7 +151,7 @@ export default class App extends Component { ...@@ -151,7 +151,7 @@ export default class App extends Component {
<div className={styles.content}> <div className={styles.content}>
<div className={styles.side}> <div className={styles.side}>
<header> <header>
<img className="page-logo" src={'/'+logo} title="枢纽科技" alt="枢纽科技"/> <img className="page-logo" src={logo} title="枢纽科技" alt="枢纽科技"/>
</header> </header>
<section> <section>
<Menu mode="inline" defaultOpenKeys={['sub1']}> <Menu mode="inline" defaultOpenKeys={['sub1']}>
......
...@@ -6,6 +6,10 @@ const Home = ({location}) => { ...@@ -6,6 +6,10 @@ const Home = ({location}) => {
<div style={{padding: '20px 50px 20px 100px'}}> <div style={{padding: '20px 50px 20px 100px'}}>
<h1 style={{marginBottom: 50}}>欢迎使用枢纽科技后台</h1> <h1 style={{marginBottom: 50}}>欢迎使用枢纽科技后台</h1>
<h3>2016-08-17 更新 1.3.2</h3>
<p>
1. 报单审核列表页 下载审核成功的照片
</p>
<h3>2016-08-15 更新 1.3.1</h3> <h3>2016-08-15 更新 1.3.1</h3>
<p> <p>
1. 增加身份认证审核 1. 增加身份认证审核
......
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Table, Icon} from 'antd'; import {Table, Icon, message} from 'antd';
import {Link} from 'react-router'; import {Link} from 'react-router';
import {serialize, formatDateTime, remittanceAuditStatusToString} from '../../utils'; import {serialize, formatDateTime, remittanceAuditStatusToString} from '../../utils';
import Layout from '../../components/Layout/Layout'; import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader/MainHeader'; import MainHeader from '../../components/MainHeader/MainHeader';
import HeaderOperation from '../../components/HeaderOperation/HeaderOperation'; import HeaderOperation from '../../components/HeaderOperation/HeaderOperation';
const columns = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
width: 70
}, {
title: '产品',
dataIndex: 'itemShortTitle',
key: 'itemShortTitle',
render: (shortTitle, record)=>(<span title={shortTitle}>{(shortTitle + '').substring(0, 20)}</span>)
}, {
title: '投资人',
dataIndex: 'buyerName',
key: 'buyerName',
width: 100,
className: 'tac',
}, {
title: '预约额度',
dataIndex: 'reservationAmount',
key: 'reservationAmount',
width: 80,
className: 'tac',
}, {
title: '报单时间',
dataIndex: 'submitReceiptTime',
key: 'submitReceiptTime',
width: 150,
className: 'tac',
render: (submitReceiptTime, record)=>(
<span>
{submitReceiptTime && formatDateTime(submitReceiptTime)}
</span>
)
}, {
title: '状态',
dataIndex: 'status',
key: 'status',
width: 120,
className: 'tac',
render: (status, record)=>(<span data-status={status}>{remittanceAuditStatusToString(status)}</span>)
}, {
title: '操作',
key: 'operation',
width: 60,
// fixed:'right',
className: 'tac',
render: (text, record)=>(
<span>
{
record.status == 1 &&
<Link to={'/remittance/audits/'+ record.id} onClick={e=>e.stopPropagation()}>审核</Link>
}
</span>
)
}
];
@connect(state=>({ @connect(state=>({
items: state.remittance.audits, items: state.remittance.audits,
...@@ -77,8 +18,10 @@ export default class List extends Component { ...@@ -77,8 +18,10 @@ export default class List extends Component {
constructor(props, context) { constructor(props, context) {
super(props, context); super(props, context);
this.state = { this.state = {
filterVisible: false filterVisible: false,
selectedRowKeys: []
} }
} }
componentDidMount() { componentDidMount() {
...@@ -96,9 +39,56 @@ export default class List extends Component { ...@@ -96,9 +39,56 @@ export default class List extends Component {
this.props.history.push('/remittance/audits/' + id); this.props.history.push('/remittance/audits/' + id);
} }
// packImages(id) {
// const {dispatch} = this.props;
// (new Promise((resolve)=> {
// require.ensure(['socket.io-client'], function (require) {
//
// const io = require('socket.io-client');
//
// const socket = io();
//
// socket.on('zip-start', function () {
// message.info('开始打包');
// });
//
// socket.on('zip-success', function (data) {
// console.log('zip-success', data);
// dispatch({
// type: 'ZIP_SUCCESS',
// data
// });
// });
//
// socket.on('zip-failed', function (err) {
// console.error('zip-failed', err);
// message.error(err && err.message || '未知错误!');
//
// });
//
// socket.on('zip-completed', function (data) {
// console.log('zip-completed', data);
// socket.close();
// if (data && data.length) {
// message.success('打包完成');
// }
// resolve();
// });
//
// socket.emit('zip', id);
//
// }, 'socket.io');
// })).then(()=> {
//
// });
// }
render() { render() {
console.log('render');
const {total, items, loading, history:{replace}, location:{pathname, query}} = this.props; const {total, items, loading, history:{replace}, location:{pathname, query}} = this.props;
const {selectedRowKeys} = this.state;
const pagination = { const pagination = {
total: total, total: total,
...@@ -106,7 +96,7 @@ export default class List extends Component { ...@@ -106,7 +96,7 @@ export default class List extends Component {
current: parseInt(query.p, 10) || 1, current: parseInt(query.p, 10) || 1,
showSizeChanger: true, showSizeChanger: true,
showTotal: total => `共 ${total} 条`, showTotal: total => `共 ${total} 条`,
pageSizeOptions:['10', '30', '50', '100'], pageSizeOptions: ['10', '30', '50', '100'],
onShowSizeChange: (current, pageSize)=> { onShowSizeChange: (current, pageSize)=> {
console.log('Current: ', current, '; PageSize: ', pageSize); console.log('Current: ', current, '; PageSize: ', pageSize);
query.p = current; query.p = current;
...@@ -124,15 +114,117 @@ export default class List extends Component { ...@@ -124,15 +114,117 @@ export default class List extends Component {
const operation = ( const operation = (
<HeaderOperation history={this.props.history} buttons={[{ <HeaderOperation history={this.props.history} buttons={[{
key:'filter', key: 'filter',
}, {
key: 'download',
title: '打包下载照片',
icon: 'cloud-download-o',
children: '下载照片',
onClick: (e)=> {
if (selectedRowKeys.length) {
let name = selectedRowKeys[0];
if (selectedRowKeys.length > 1) {
name += '--' + selectedRowKeys[selectedRowKeys.length - 1];
}
const iframe = document.createElement('iframe');
const ids = selectedRowKeys.join(',');
iframe.src = '/zip/' + name + '?id=' + ids;
document.body.appendChild(iframe);
setTimeout(()=> {
document.body.removeChild(iframe);
}, 1000);
}
}
}]}/> }]}/>
); );
const header = (<MainHeader breadcrumb={['审核管理', '报单审核']} const header = (<MainHeader breadcrumb={['审核管理', '报单审核']}
title="报单审核列表" title="报单审核列表"
operation={operation} operation={operation}
/>); />);
const columns = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
width: 70
}, {
title: '产品',
dataIndex: 'itemShortTitle',
key: 'itemShortTitle',
width: 200,
render: (shortTitle, record)=>(<span title={shortTitle}>{(shortTitle + '').substring(0, 20)}</span>)
}, {
title: '投资人',
dataIndex: 'buyerName',
key: 'buyerName',
width: 100,
className: 'tac',
}, {
title: '预约额度',
dataIndex: 'reservationAmount',
key: 'reservationAmount',
width: 80,
className: 'tac',
}, {
title: '报单时间',
dataIndex: 'submitReceiptTime',
key: 'submitReceiptTime',
width: 150,
className: 'tac',
render: (submitReceiptTime, record)=>(
<span>
{submitReceiptTime && formatDateTime(submitReceiptTime)}
</span>
)
}, {
title: '状态',
dataIndex: 'status',
key: 'status',
width: 120,
className: 'tac',
render: (status, record)=>(<span data-status={status}>{remittanceAuditStatusToString(status)}</span>)
}, {
title: '操作',
key: 'operation',
width: 60,
className: 'tac',
render: (text, record)=>(
<div>
{
record.status == 1 &&
<Link to={'/remittance/audits/' + record.id} onClick={e=>e.stopPropagation()}>审核</Link>
}
{
record.status == 9 &&
<a href="javascript:void('下载');" onClick={e=>{
e.stopPropagation();
const iframe = document.createElement('iframe');
iframe.src = '/zip/' + record.id + '?id=' + record.id;
document.body.appendChild(iframe);
setTimeout(()=> {
document.body.removeChild(iframe);
}, 1000);
}}>下载</a>
}
</div>
)
}
];
const rowSelection = {
selectedRowKeys,
onChange: (selectedRowKeys)=> {
this.setState({selectedRowKeys})
},
getCheckboxProps: record=>({
disabled: record.status !== 9
})
};
return ( return (
<Layout header={header}> <Layout header={header}>
...@@ -140,8 +232,10 @@ export default class List extends Component { ...@@ -140,8 +232,10 @@ export default class List extends Component {
dataSource={Array.isArray(items) ? items : []} dataSource={Array.isArray(items) ? items : []}
loading={loading} loading={loading}
pagination={pagination} pagination={pagination}
scroll={{ y: window.innerHeight-(this.state.filterVisible? 203 :150) }} scroll={{y: window.innerHeight - (this.state.filterVisible ? 203 : 150)}}
onRowClick={this.handleRowClick.bind(this)} onRowClick={this.handleRowClick.bind(this)}
rowSelection={rowSelection}
rowKey="id"
/> />
</Layout> </Layout>
); );
......
...@@ -28,6 +28,20 @@ const remittance = handleActions({ ...@@ -28,6 +28,20 @@ const remittance = handleActions({
}, },
['PASS_REMITTANCE_ITEM_FAILED'](state, action){ ['PASS_REMITTANCE_ITEM_FAILED'](state, action){
return {...state, loading: false, err: action.err}; return {...state, loading: false, err: action.err};
},
['ZIP_SUCCESS'](state, action){
const data = action.data;
console.log('ZIP_SUCCESS', data);
if (data && state.audits) {
for (let audit of state.audits) {
if (audit.id === data.id) {
audit.zip = data.url;
console.log('更新%s的zip%s', data.id, data.url);
break;
}
}
}
return {...state, zip: data};
} }
}, { }, {
drawMoneys: [], drawMoneys: [],
......
...@@ -12,6 +12,8 @@ module.exports = function (webpackConfig) { ...@@ -12,6 +12,8 @@ module.exports = function (webpackConfig) {
style: 'css', // if true, use less style: 'css', // if true, use less
}]); }]);
webpackConfig.output.publicPath = '/';
// Enable this if you have to support IE8. // Enable this if you have to support IE8.
// webpackConfig.module.loaders.unshift({ // webpackConfig.module.loaders.unshift({
// test: /\.jsx?$/, // test: /\.jsx?$/,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment