From 9ed9a0363f9f1ef22d143ab9f529ae161cc1afc4 Mon Sep 17 00:00:00 2001 From: LAPTOP-RI7D261L\Mr Ke <545800322@qq.com> Date: Mon, 09 Mar 2020 17:02:31 +0800 Subject: [PATCH] 未检举报列表、详情、以及回复 --- SunshineIns/src/fetch/getTipoffDetail.js | 9 SunshineIns/src/fetch/index.js | 8 SunshineIns/src/page/NoInspectionReportList.jsx | 41 +++ SunshineIns/src/index.jsx | 9 SunshineIns/src/page/NoInspectionReportTableList.jsx | 267 ++++++++++++++++++++++++ SunshineIns/src/fetch/tipoffQuery.js | 6 SunshineIns/src/fetch/tipoffReply.js | 11 + SunshineIns/src/data/menu.js | 7 SunshineIns/src/page/NoInspectionReportDetail.jsx | 252 ++++++++++++++++++++++ 9 files changed, 609 insertions(+), 1 deletions(-) diff --git a/SunshineIns/src/data/menu.js b/SunshineIns/src/data/menu.js index 4c09b32..6288e0b 100644 --- a/SunshineIns/src/data/menu.js +++ b/SunshineIns/src/data/menu.js @@ -105,6 +105,13 @@ path: '/underAgeList' }, { + id: 'noInspectionReportList', + name: '未检举报', + icon: active, + iconCheck: activeCheck, + path: '/noInspectionReportList' +}, +{ id: 'questionnaire', name: '问卷管理部分', icon: msgManage, diff --git a/SunshineIns/src/fetch/getTipoffDetail.js b/SunshineIns/src/fetch/getTipoffDetail.js new file mode 100644 index 0000000..edb79e5 --- /dev/null +++ b/SunshineIns/src/fetch/getTipoffDetail.js @@ -0,0 +1,9 @@ +import fetch from './_fetch'; +import { message } from 'antd'; +export default (id) => fetch(`api/tipoff/find?id=${id}`) + .then( + json => json + ) + .catch( + error => message.error('信息加载失败,请联系管理员', 2) + ); \ No newline at end of file diff --git a/SunshineIns/src/fetch/index.js b/SunshineIns/src/fetch/index.js index 8f5026e..89a0774 100644 --- a/SunshineIns/src/fetch/index.js +++ b/SunshineIns/src/fetch/index.js @@ -90,6 +90,9 @@ import socialCompanySave from './socialCompanySave'; import socialCompanyDetail from './socialCompanyDetail'; import socialCompanydelete from './socialCompanydelete'; +import tipoffQuery from './tipoffQuery'; +import getTipoffDetail from './getTipoffDetail'; +import tipoffReply from './tipoffReply'; export default { domain, @@ -183,5 +186,8 @@ socialCompany, socialCompanySave, socialCompanyDetail, - socialCompanydelete + socialCompanydelete, + tipoffQuery, + getTipoffDetail, + tipoffReply }; \ No newline at end of file diff --git a/SunshineIns/src/fetch/tipoffQuery.js b/SunshineIns/src/fetch/tipoffQuery.js new file mode 100644 index 0000000..c1ba0a8 --- /dev/null +++ b/SunshineIns/src/fetch/tipoffQuery.js @@ -0,0 +1,6 @@ +import fetch from './_fetch'; +import { message } from 'antd'; +export default ({ page, size }) => + fetch(`api/tipoff/query?rows=${size}&page=${page}`) + .then(json => json) + .catch(error => message.error('详情加载失败,请联系管理员', 2)); diff --git a/SunshineIns/src/fetch/tipoffReply.js b/SunshineIns/src/fetch/tipoffReply.js new file mode 100644 index 0000000..13645c0 --- /dev/null +++ b/SunshineIns/src/fetch/tipoffReply.js @@ -0,0 +1,11 @@ +import fetch from './_fetch'; +export default data => + fetch( + `api/tipoff/reply` + + '?' + + Object.entries(data) + .map(([k, v]) => `${k}=${v}`) + .join('&') + ) + .then(json => json) + .catch(error => message.error('信息加载失败,请联系管理员', 2)); diff --git a/SunshineIns/src/index.jsx b/SunshineIns/src/index.jsx index 73d63ab..e664773 100644 --- a/SunshineIns/src/index.jsx +++ b/SunshineIns/src/index.jsx @@ -44,6 +44,9 @@ import SignIn from './page/SignIn'; import QuestionDetail from './page/QuestionDetail'; +import NoInspectionReportList from './page/NoInspectionReportList'; +import NoInspectionReportDetail from './page/NoInspectionReportDetail'; + import PoliceSecurity from './page/PoliceSecurity'; import policeSecurityEdit from './page/policeSecurityEdit'; @@ -111,6 +114,12 @@ {/* 签到墙 */} <Route path='/signIn/:id' component={SignIn} /> + + {/* 未检举报(列表、详情) */} + <Route path='/noInspectionReportList' component={NoInspectionReportList} /> + <Route path='/noInspectionReportDetail/:id/:flag' component={NoInspectionReportDetail} /> + + <Route path='/' component={Index} /> </Switch> diff --git a/SunshineIns/src/page/NoInspectionReportDetail.jsx b/SunshineIns/src/page/NoInspectionReportDetail.jsx new file mode 100644 index 0000000..753673c --- /dev/null +++ b/SunshineIns/src/page/NoInspectionReportDetail.jsx @@ -0,0 +1,252 @@ +/** + * 柯礼钦<kelq@hugeinfo.com.cn> + * 2018年9月4日 16:00 + * + */ + +import React from "react"; +import { Input, Button, message, Breadcrumb } from "antd"; +import moment from "moment"; +import BusDetailView from "../view/BusDetailView"; +import LineView from "../view/LineView"; +import HeadView from "../view/HeadView"; +import Fetch from "../fetch"; +const { TextArea } = Input; +const replyAdmin = { + display: 'block', + float: 'left', + color: 'green', +} + +const replyUser = { + display: 'block', + float: 'left', + color: '#1790ff' +} + +const timeUser = { + display: 'block', + color: '#1790ff' +} + +const timeAdmin = { + display: 'block', + color: 'green' +} + +export default class BusDetail extends React.Component { + constructor(props) { + super(props); + this.state = { + savedate: {}, + detail: {}, + data: {} + }; + } + + componentDidMount() { + const { id } = this.props.match.params; + Fetch.getTipoffDetail(id).then(data => { + console.log('data', data); + this.setState({ + detail: data, + savedate: { + id: id + } + }) + }) + } + + goBack = () => { + this.props.history.goBack(); + }; + + + onInputChange = ({ target: { value, name } }) => { + this.setState(({ savedate }) => ({ + savedate: { + ...savedate, + [name]: value + } + })) + } + + submitAudit = () => { + + const { savedate } = this.state; + console.log(savedate); + if (!savedate.result) { + message.warning("请填写回复内容"); + return; + } + + Fetch.tipoffReply(savedate).then(res => { + if (res.code === 0) { + message.success("回复成功", 2, () => { + this.props.history.goBack(); + }); + } else { + message.error("回复失败,请联系管理员", 2); + } + }); + }; + + render() { + + // 居中样式 + const center = { + display: "flex", + alignItems: "center", + justifyContent: "center" + }; + const { detail, data } = this.state; + const { flag } = this.props.match.params; + return ( + <div className="app-page"> + <HeadView history={this.props.history} /> + <Breadcrumb style={{ padding: '20px' }}> + <Breadcrumb.Item><a href="">后台中心</a></Breadcrumb.Item> + <Breadcrumb.Item>未检举报</Breadcrumb.Item> + </Breadcrumb> + <BusDetailView> + <div> + <LineView title="举报信息" style="14vh" lineHeight="34px"> + <table> + <tbody> + <tr> + <td className="table-vaule1">举报对象</td> + <td className="table-vaule2">{detail.tipoffObject}</td> + <td className="table-vaule3">举报行为</td> + <td className="table-vaule4">{detail.tipoffAction}</td> + </tr> + <tr> + <td className="table-vaule1">发生地</td> + <td className="table-vaule2">{detail.tipoffAddress}</td> + <td className="table-vaule3">举报类型</td> + <td className="table-vaule4">{businessType(detail.tipoffType)}</td> + </tr> + + <tr> + <td className="table-vaule1">具体事项</td> + <td className="table-vaule2">{detail.tipoffContent}</td> + </tr> + </tbody> + </table> + </LineView> + + <LineView title="举报人信息" style="14vh" lineHeight="34px"> + <table> + <tbody> + <tr> + <td className="table-vaule1">姓名</td> + <td className="table-vaule2">{detail.createrName}</td> + <td className="table-vaule3">手机号码</td> + <td className="table-vaule4">{detail.createrMobile}</td> + </tr> + <tr> + <td className="table-vaule1">联系地址</td> + <td className="table-vaule2">{detail.createrAddress}</td> + </tr> + </tbody> + </table> + </LineView> + + </div> + <LineView title="相关材料" style="14vh"> + <div className="apply-img-div"> + {detail.attachmentList + ? detail.attachmentList.map((data, key) => ( + ( + data.type != 21 ? + < div style={{ marginRight: "10px" }} key={key}> + <a href={data.path} target='_black'> <img src={data.path} width='70' height='70' /></a> + </div> + : < div style={{ marginRight: "10px" }} key={key}> + <a href={data.path} target='_black'><video src={data.path} width='70' height='70'></video></a> + </div> + ) + )) + : null} + </div> + </LineView> + { + data.ReplyLogs ? + <LineView title="回复记录" style="15vh"> + {data.ReplyLogs.map((contacts, key) => ( + <div style={{ width: '100%', height: '70px' }} key={key}> + {contacts.userType === 1 ? + <React.Fragment> + <div style={timeUser} >{contacts.replyerName}:{moment(contacts.createTime).format('YYYY/MM/DD HH:mm:ss')}</div> + <div style={replyUser}>{contacts.content}</div> + </React.Fragment> + : + <React.Fragment> + <div style={timeAdmin} > {contacts.replyerName}:{moment(contacts.createTime).format('YYYY/MM/DD HH:mm:ss')}</div> + <div style={replyAdmin}>{contacts.content}</div> + </React.Fragment> + } + + </div> + ))} + </LineView> + : null} + { + flag == "do" ? + (detail.status == 1 ? ( + <LineView title="回复" lineHeight="50px"> + <table> + <tbody> + <tr> + <td>回复内容</td> + <td> + <TextArea + placeholder="请输入回复内容" + autosize={{ minRows: 2, maxRows: 6 }} + onChange={({ target: { value } }) => this.onInputChange({ target: { name: 'result', value } })} + /> + </td> + </tr> + </tbody> + </table> + <div> + <Button + type="primary" + className="app-btn" + onClick={this.submitAudit} + > + 提交回复 + </Button> + <Button className="app-btn" onClick={this.goBack}> + 返回 + </Button> + </div> + </LineView> + ) : <div style={{ textAlign: 'center' }}><Button className="app-btn" onClick={this.goBack}>返回</Button></div> + ) : <div style={{ textAlign: 'center' }}><Button className="app-btn" onClick={this.goBack}>返回</Button></div>} + </BusDetailView> + </div> + ); + } +} + +function renderStatus(status) { + switch (status) { + case 1: + return <Badge count={'待处理'} style={{ background: '#f50' }} /> + case 2: + return <Badge count={'已完成'} style={{ background: '#87d068' }} /> + default: + return '暂无' + } +} + +function businessType(type) { + switch (type) { + case 1: + return '未检举报'; + case 2: + return '知识产权举报'; + case 3: + return '暂无'; + } +} diff --git a/SunshineIns/src/page/NoInspectionReportList.jsx b/SunshineIns/src/page/NoInspectionReportList.jsx new file mode 100644 index 0000000..35344fd --- /dev/null +++ b/SunshineIns/src/page/NoInspectionReportList.jsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { Input, Button, DatePicker, Divider, message, Popconfirm, Select, Badge } from 'antd'; +import HeadView from '../view/HeadView'; +import LinkView from '../view/LinkView'; +import NoInspectionReportTableList from './NoInspectionReportTableList'; + + + +export default class NewlyList extends React.Component { + constructor(props) { + super(props); + this.state = { + data: [], + + }; + } + + componentDidMount() { + + document.title = '未检举报'; + // this.getData(); + } + + getData = () => { + + } + + render() { + + const { data, loading, resetKey } = this.state; + return ( + <div className="app-page"> + <HeadView history={this.props.history} /> + <LinkView sed="未检举报" local="未检举报" /> + <NoInspectionReportTableList history={this.props.history} /> + + </div> + ); + } + +} diff --git a/SunshineIns/src/page/NoInspectionReportTableList.jsx b/SunshineIns/src/page/NoInspectionReportTableList.jsx new file mode 100644 index 0000000..a623d4d --- /dev/null +++ b/SunshineIns/src/page/NoInspectionReportTableList.jsx @@ -0,0 +1,267 @@ +/** + * 徐祥健<xuxj@hugeinfo.com.cn> + * 2018年8月28日 10:41 + * + */ + + +import React from 'react'; + +import HeadView from '../view/HeadView'; +import TableBtnView from '../view/TableBtnView'; +import LinkView from '../view/LinkView'; +import { Input, Button, DatePicker, Divider, Row, Col, message, Modal, Popconfirm, Badge, Tabs, Form, Table } from 'antd'; +import moment from 'moment'; +import Fetch from '../fetch'; +import TableView from '../view/TableView'; + +const { TabPane } = Tabs; +class NoInspectionReportTable extends React.Component { + constructor(props) { + super(props); + this.state = { + loading: false, + formdata: {}, + userId: "", + tableData: [], + totalElements: 1, + pageSize: 10, + page: 1, + currItem: {}, + auditVisible: false //审核弹窗 + }; + } + + componentDidMount() { + document.title = '问卷管理'; + this.loadData(1, this.state.pageSize); + } + + loadData = (page, pageSize) => { + let _this = this; + _this.setState({ + loading: true + }) + _this.props.form.validateFields((err, values) => { + _this.setState({ formdata: values }); + Fetch.tipoffQuery({ + ...values, + page: page, + size: pageSize, + }) + .then(res => { + console.log('res', res); + this.setState({ + loading: false + }) + if (res.code == 0) { + for (var i = 0; i < res.data.rows.length; i++) { + res.data.rows[i]['index'] = i + 1; + res.data.rows[i]['key'] = i; + } + this.setState({ + tableData: res.data.rows, + loading: false, + totalElements: res.data.total, + page + }); + + } + }); + }) + } + + onShowSizeChange = (current, pageSize) => { + this.setState({ pageSize, page: 1 }) + this.loadData(1, pageSize); + } + pageChange = (page, pageSize) => { + this.loadData(page, pageSize); + } + + audit = (data) => { + Fetch.questionAudit({ + id: this.state.currItem.id, + ...data, + }).then(res => { + console.log('res', res); + if (res) { + message.success('操作完成'); + } else { + message.warn('操作失败,请稍后重试!') + } + this.setState({ + auditVisible: false, + }, () => { + this.loadData(this.state.page, this.state.pageSize) + }) + }) + } + + callback(key) { + console.log(key); + } + + render() { + const columns = [{ + title: '举报对象', + dataIndex: 'tipoffObject', + key: 'tipoffObject', + render: (cur, item) => { + return cur || '暂无' + } + }, { + title: '举报内容', + dataIndex: 'tipoffContent', + key: 'tipoffContent', + ellipsis: true, + render: (cur, item) => { + return cur || '暂无' + } + }, { + title: '举报类型', + dataIndex: 'businessType', + key: 'businessType', + ellipsis: true, + render: (cur, item) => { + return businessType(cur) + } + }, { + title: '举报状态', + dataIndex: 'status', + key: 'status', + ellipsis: true, + render: (cur, item) => { + return renderStatus(cur) + } + }, { + title: '举报时间', + dataIndex: 'createTime', + key: 'createTime', + render: (cur, item) => { + return cur ? moment(cur).format("YYYY-MM-DD HH:mm") : '暂无' + } + }, { + title: '操作', + key: 'action', + render: (cur, item) => { + return <React.Fragment> + { + item.status == 1 && + <React.Fragment> + <a onClick={() => { + this.props.history.push(`/noInspectionReportDetail/${item.id}/do`) + }}>回复</a> + <Divider type="vertical" /> + </React.Fragment> + } + <a onClick={() => { + console.log(item.id); + this.props.history.push(`/noInspectionReportDetail/${item.id}/detail`) + }}>查看</a> + </React.Fragment> + + }, + }]; + const { data, loading, auditVisible } = this.state; + const { title, local, type, total, notRead, contact, sed } = this.props; + return ( + <div className="app-page"> + {/* <div style={{ background: '#fff', margin: '0 20px' }} > + <Tabs type="card" style={{ margin: 0 }} onChange={this.callback}> + <TabPane tab="全部" key="1"> + </TabPane> + <TabPane tab="派送中" key="2"> + </TabPane> + <TabPane tab="已回收" key="3"> + </TabPane> + </Tabs> + </div> */} + {/* <TableView columns={columns} data={data} pageSize='10' size='default' loading={loading} /> */} + <div style={{ + padding: '8px', + margin: '0px 20px', + backgroundColor: '#fff' + }}> + <Table + size="middle" + dataSource={this.state.tableData} + loading={{ spinning: this.state.loading }} + columns={columns} + pagination={{ + pageSize: this.state.pageSize, + onChange: this.pageChange, + total: this.state.totalElements, + showSizeChanger: true, + onShowSizeChange: this.onShowSizeChange, + showTotal: (total, range) => `共${total}条记录 `, + // itemRender: this.itemRender, + showQuickJumper: true, + defaultCurrent: 1, + current: this.state.page + }} + /> + </div> + + <Modal + title="调查问卷审核" + visible={this.state.auditVisible} + footer={null} + onCancel={() => { + this.setState({ + auditVisible: false + }) + }} + > + <Row type="flex" justify="end" gutter={20}> + <Col> + <Button onClick={() => { + this.setState({ + auditVisible: false + }) + }}>取消</Button> + </Col> + <Col> + <Button onClick={() => { + this.audit({ + status: 99 + }); + }}>不通过</Button> + </Col> + <Col> + <Button type="primary" onClick={() => { + this.audit({ + status: 2 + }); + }}>通过</Button> + </Col> + </Row> + </Modal> + </div> + ); + } +} +const NoInspectionReportTableList = Form.create()(NoInspectionReportTable); +export default NoInspectionReportTableList; + +function renderStatus(status) { + switch (status) { + case 1: + return <Badge count={'待处理'} style={{ background: '#f50' }} /> + case 2: + return <Badge count={'已完成'} style={{ background: '#87d068' }} /> + default: + return '暂无' + } +} + +function businessType(type) { + switch (type) { + case 1: + return '未检举报'; + case 2: + return '知识产权举报'; + case 3: + return '暂无'; + } +} -- Gitblit v1.8.0