Commit 3a4f34ad authored by 单奇雲's avatar 单奇雲

1.新增检索功能 2.调试点详情界面

parent 3698e659
* {
margin: 0;
padding: 0;
list-style: none;
}
/*
KISSY CSS Reset
理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。
2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。
3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。
特色:1. 适应中文;2. 基于最新主流浏览器。
维护:玉伯<lifesinger@gmail.com>, 正淳<ragecarrier@gmail.com>
*/
/** 清除内外边距 **/
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */
dl, dt, dd, ul, ol, li, /* list elements 列表元素 */
pre, /* text formatting elements 文本格式元素 */
form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */
th, td /* table elements 表格元素 */ {
margin: 0;
padding: 0;
}
/** 设置默认字体 **/
body,
button, input, select, textarea /* for ie */ {
font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: 100%;
}
address,
cite,
dfn,
em,
var {
font-style: normal;
} /* 将斜体扶正 */
code,
kbd,
pre,
samp {
font-family: courier new, courier, monospace;
} /* 统一等宽字体 */
small {
font-size: 12px;
} /* 小于 12px 的中文很难阅读,让 small 正常化 */
/** 重置列表元素 **/
ul,
ol {
list-style: none;
}
/** 重置文本格式元素 **/
a {
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/** 重置表单元素 **/
legend {
color: #000;
} /* for ie6 */
fieldset,
img {
border: 0;
} /* img 搭车:让链接里的 img 无边框 */
button,
input,
select,
textarea {
font-size: 100%;
} /* 使得表单元素在 ie 下能继承字体大小 */
/* 注:optgroup 无法扶正 */
/** 重置表格元素 **/
table {
border-collapse: collapse;
border-spacing: 0;
}
/* 清除浮动 */
.ks-clear:after,
.clear:after {
content: '\20';
display: block;
height: 0;
clear: both;
}
.ks-clear,
.clear {
*zoom: 1;
}
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main h1 {
font-size: 36px;
color: #333;
text-align: left;
margin-bottom: 30px;
border-bottom: 1px solid #eee;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
}
.icon_lists li {
float: left;
width: 100px;
height: 180px;
text-align: center;
list-style: none !important;
}
.icon_lists .icon {
font-size: 42px;
line-height: 100px;
margin: 10px 0;
color: #333;
-webkit-transition: font-size 0.25s ease-out 0s;
-moz-transition: font-size 0.25s ease-out 0s;
transition: font-size 0.25s ease-out 0s;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p,
.markdown pre {
margin: 1em 0;
}
.markdown > p,
.markdown > blockquote,
.markdown > .highlight,
.markdown > ol,
.markdown > ul {
width: 80%;
}
.markdown ul > li {
list-style: circle;
}
.markdown > ul li,
.markdown blockquote ul > li {
margin-left: 20px;
padding-left: 4px;
}
.markdown > ul li p,
.markdown > ol li p {
margin: 0.6em 0;
}
.markdown ol > li {
list-style: decimal;
}
.markdown > ol li,
.markdown blockquote ol > li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown pre {
border-radius: 6px;
background: #f7f7f7;
padding: 20px;
}
.markdown pre code {
border: none;
background: #f7f7f7;
margin: 0;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown > table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown > table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown > table th,
.markdown > table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown > table th {
background: #f7f7f7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
font-style: italic;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown > br,
.markdown > p > br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
pre {
background: #fff;
}
This diff is collapsed.
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.
...@@ -6,7 +6,7 @@ const pluginURI = AmosConfig.httpURI.pluginURI; ...@@ -6,7 +6,7 @@ const pluginURI = AmosConfig.httpURI.pluginURI;
const convertorURI = AmosConfig.httpURI.convertorURI; const convertorURI = AmosConfig.httpURI.convertorURI;
// 三维视图 // 三维视图
const view3dURI = AmosConfig.httpURI.convertorURI; const view3dURI = AmosConfig.httpURI.convertorURI;
const patrolURI = AmosConfig.httpURI.convertorURI; const patrolURI = AmosConfig.httpURI.patrolURI;
const baseURI = AmosConfig.httpURI.convertorURI; const baseURI = AmosConfig.httpURI.convertorURI;
//规则 //规则
const ruleURI = AmosConfig.httpURI.rulesConfigURI; const ruleURI = AmosConfig.httpURI.rulesConfigURI;
...@@ -17,10 +17,10 @@ export const FscSerUrl = { ...@@ -17,10 +17,10 @@ export const FscSerUrl = {
//******************************************************************************* //*******************************************************************************
// 3D视图 // 3D视图
//******************************************************************************* //*******************************************************************************
view3dInitUrl: completePrefix(view3dURI, 'view3d/initViewNode?type={type}'), // 初始化三维视图 get view3dInitUrl: completePrefix(view3dURI, 'api/view3d/init3dViewNode?type={type}'), // 初始化三维视图 get
view3dInitLinkUrl: completePrefix(view3dURI, 'view3d/initViewLink'), // 初始化三维视图 获取link get view3dInitLinkUrl: completePrefix(view3dURI, 'view3d/initViewLink'), // 初始化三维视图 获取link get
searchRegionListUrl: completePrefix(patrolURI, 'api/group/queryDept'), //右侧菜单-检索-区域集合 searchRegionListUrl: completePrefix(patrolURI, 'api/group/queryDept'), //右侧菜单-检索-区域集合
searchViewUrl: completePrefix(view3dURI, 'view3d/3ddata/all?inputText={inputText}&dataLevel={dataLevel}&orgCode={orgCode}&nodeState={nodeState}&type={type}&current={page}&pageSize={pageSize}&routeName={routeName}&protectObjName={protectObjName}'), // 右侧菜单-检索 searchViewUrl: completePrefix(view3dURI, 'api/view3d/retrieve/all?inputText={inputText}&dataLevel={dataLevel}&orgCode={orgCode}&nodeState={nodeState}&type={type}&current={page}&pageSize={pageSize}&routeName={routeName}&protectObjName={protectObjName}'), // 右侧菜单-检索
searchLinkUrl: completePrefix(view3dURI, 'view3d/link/searchView?linkId={linkId}'), // 根据单条巡检线 检索节点与线路 get searchLinkUrl: completePrefix(view3dURI, 'view3d/link/searchView?linkId={linkId}'), // 根据单条巡检线 检索节点与线路 get
monitorRegionListUrl: completePrefix(view3dURI, 'monitorRegionListUrl'), //右侧菜单-监控-区域集合 monitorRegionListUrl: completePrefix(view3dURI, 'monitorRegionListUrl'), //右侧菜单-监控-区域集合
monitorUrl: completePrefix(view3dURI, 'monitorUrl?current={page}&pageSize={size}'), //右侧菜单-监控 monitorUrl: completePrefix(view3dURI, 'monitorUrl?current={page}&pageSize={size}'), //右侧菜单-监控
...@@ -53,6 +53,8 @@ export const FscSerUrl = { ...@@ -53,6 +53,8 @@ export const FscSerUrl = {
export const FasSerUrl = { export const FasSerUrl = {
selectedOrgInfoUrl: completePrefix(convertorURI, 'api/region/current'),//获取选择的公司
//******************************************************************************* //*******************************************************************************
// 换流站视图 // 换流站视图
//******************************************************************************* //*******************************************************************************
......
import { commonGet, commonPost, commonDelete } from './../utils/request';
import { FasSerUrl } from './../consts/urlConsts';
export const getSelectedOrgInfoAction = (id) => {
return commonGet(FasSerUrl.selectedOrgInfoUrl);
};
\ No newline at end of file
.side-pane-data {
bottom: 0;
.datapane-drawer {
height: 100%;
}
}
.datapane-container {
display: flex;
width: 100%;
height: 100%;
flex-direction: column;
font-size: 13px;
color: $biz-table-font-color;
.datapanel-search {
width: 100%;
height: 40px;
border-bottom: $content-border;
.search-input {
width: 100%;
height: 100%;
padding: 0 1rem;
line-height: 35px;
background: $component-bg-linear;
input {
width: calc(100% - 38px);
height: 24px;
padding: 0 11px;
color: $biz-table-font-color;
background: white;//transparent;
border-color: $datapane-border-color;
border-radius: 12px;
}
button {
height: auto;
padding: 0;
margin-left: 10px;
background: transparent;
border: 0;
img {
width: 23px;
}
}
.amos-group {
width: 100%;
.amos-select-dropdown {
width: 40% !important;
}
.amos-input {
width: 40% !important;
height: 30px !important;
padding: 0;
margin-left: 10px;
line-height: 28px;
}
}
}
}
.datapane-filter {
height: 45px;
border-bottom: $content-border;
.datapane-filter-content {
display: flex;
width: 100%;
height: 100%;
align-items: center;
padding: 0 15px;
background: $component-bg-linear;
.datapane-filter-item {
flex: 1;
width: 0;
height: 28px;
margin-right: 6px;
border-radius: 4px;
&:last-child {
margin-right: 0;
}
}
.datapane-filter-input {
text-align: center;
background: white;//transparent;
border: $content-border;
&::-webkit-input-placeholder {
color: red;//$content-color;
}
&::-moz-placeholder {
color: red;//$content-color;
}
&::-ms-input-placeholder {
color: red;//$content-color;
}
}
.datapane-filter-date {
input {
height: 28px;
font-size: 13px;
color: $core-color;//$content-color;
text-align: center;
background: white;//transparent;
border: $content-border;
-webkit-text-fill-color: $core-color;
&::-webkit-input-placeholder {
color: red;//$content-color;
}
&::-moz-placeholder {
color: red;//$content-color;
}
&::-ms-input-placeholder {
color: red;//$content-color;
}
}
.ant-calendar-picker-clear {
color: $content-color;
background: transparent;
}
}
.datapane-filter-select {
min-width: 70px;
padding-right: 18px;
font-size: 13px;
line-height: 26px;
color: $core-color;//$content-color;
text-align: center;
background: white;//transparent;
border: $content-border;
border-radius: 4px;
.amos-select-title {
padding-left: 5px;
}
.amos-select-dropdown-icon {
position: absolute;
right: 5px;
display: inline-block;
font-size: 12px;
}
}
}
}
.datapane-content {
flex: 1;
width: 100%;
background: $content-color;
.search-welcome {
display: flex;
width: 100%;
padding: 38px;
font-size: 13px;
color: $content-color;
flex-direction: column;
align-items: center;
.search-welcome-img {
width: 29px;
margin-bottom: 28px;
}
}
.datapane-list-content {
padding: 10px;
.datapane-item {
position: relative;
padding: 10px;
margin-bottom: 8px;
line-height: 2;
border: $content-border;
&:hover {
// color: red;
background-color: #e6f7ff;//$content-item-bg-active;
border: 1px solid $core-color;
}
}
}
}
.trajectory-play-btn {
position: absolute;
right: 0;
bottom: 0;
height: auto;
padding: 6px;
font-size: 12px;
cursor: pointer;
background-color: $content-color;
border: $content-border;
border-right: 0;
border-bottom: 0;
p {
color: $biz-table-font-color;
}
}
}
.amos-select-dropdown-popover {
> .amos-popover-content {
min-height: auto;
.datapane-select-option {
padding-right: 16px;
padding-left: 8px;
color: $biz-table-font-color;
background: $content-color;
&.amos-select-option-selected {
color: $selected-color;
.amos-select-option-icon-selected {
right: 3px;
font-size: 13px;
}
}
}
}
}
.list-paginate {
.list-paginate-more {
width: 100%;
background: $list-paginate-color;
height: auto;
padding: 6px;
border: 0;
}
.list-paginate-nomore {
display: block;
text-align: center;
margin-top: 8px;
img {
width: 35px;
position: relative;
vertical-align: middle;
top: -3px;
margin-right: 5px;
}
}
.list-paginate-loading {
display: block;
width: 100%;
text-align: center;
img {
width: 70px;
}
}
}
.list-group-item {
position: relative;
border-left: $content-border;
padding: 0px 5px;
padding-left: 10px;
font-size: 13px;
.broadcast-item {
line-height: 2;
padding: 10px;
&:hover {
border: $content-border;
background: $list-group-hover;
}
}
&.list-group-first-item {
padding-top: 18px;
margin-top: 8px;
.list-group-start {
position: absolute;
top: -6px;
left: 7px;
}
&::before {
content: "";
display: block;
width: 8px;
height: 8px;
border-radius: 4px;
background: $content-color;
position: absolute;
left: -5px;
top: 0;
}
}
}
.datapane-setting {
width: 100%;
height: 100%;
color: $content-color;
background: $content-color;
.datapane-setting-content {
padding: 5px;
}
.region-select {
height: 28px;
margin: 18px 0;
color: $core-color;
background: $list-group-hover;
border: $content-border;
border-radius: 18px;
}
.datapane-setting-collapse {
background: transparent;
border: 0;
.amos-collapse-item {
margin-bottom: 3px;
background: transparent;
border: 0;
.amos-collapse-header {
padding: 2px 5px 2px 15px;
color: $biz-table-font-color;
background: $content-header-bg;
i {
font-size: 13px;
position: absolute;
right: 0;
}
}
.amos-collapse-content {
padding: 5px;
overflow: hidden;
color: rgba(0, 0, 0, 0.65);
background-color: $content-color;//transparent;
.amos-collapse-content-box {
margin: 0;
color: $biz-table-font-color;
}
&::after {
height: 0px;
display: inline;
}
&::before {
height: 0px;
display: inline;
}
}
}
}
.datapane-setting-user {
display: flex;
padding: 20px 5px;
.user-info {
flex: 1;
padding-right: 5px;
padding-left: 12px;
font-size: 13px;
line-height: 2;
}
.user-img {
width: 94px;
img {
width: 94px;
height: 94px;
padding: 10px;
border: $content-border;
}
}
button {
height: 28px;
margin-top: 18px;
color: $core-color;
background: $list-group-hover;
border: $content-border;
border-radius: 18px;
}
}
.datapane-setting-shortcutkey {
padding: 5px;
.shortcutkey-table {
width: 100%;
font-size: 13px;
.shortcutkey-header {
text-align: center;
border: $content-border;
background: $shortcutkey-header-color;
td {
padding: 4px;
border: $content-border;
}
}
.shortcutkey-group {
td {
padding: 12px 5px;
}
}
.shortcutkey-item {
border: $content-border;
td {
padding: 7px 5px 7px 12px;
border: $content-border;
}
}
}
}
}
import './index.scss' import './index.scss'
import './../assets/bizFont/iconfont.js'; import './../assets/bizFont/iconfont.js';
\ No newline at end of file
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
@import './mask.scss'; @import './mask.scss';
@import './points.scss'; @import './points.scss';
@import './markers.scss'; @import './markers.scss';
@import './datapane.scss';
@import './pointsDetails.scss'; @import './pointsDetails.scss';
@import './rules.scss'; @import './rules.scss';
@import './screensaver.scss'; @import './screensaver.scss';
...@@ -11,6 +12,7 @@ ...@@ -11,6 +12,7 @@
@import './planDetail.scss'; @import './planDetail.scss';
@import './../assets/bizFont/iconfont.css'; @import './../assets/bizFont/iconfont.css';
@import './../assets/amosFont/iconfont.css';
......
...@@ -20,7 +20,8 @@ const defaultPageable = { ...@@ -20,7 +20,8 @@ const defaultPageable = {
const compleHeaders = () => { const compleHeaders = () => {
return { return {
// ...defaultHeaders, // ...defaultHeaders,
token: getToken(), // token: getToken(),
'X-Access-Token': getToken()
}; };
}; };
...@@ -28,8 +29,8 @@ const compleHeaders = () => { ...@@ -28,8 +29,8 @@ const compleHeaders = () => {
* 获取 token * 获取 token
*/ */
const getToken = () => { const getToken = () => {
// return lsTool.read(SysConsts.token); return lsTool.read(SysConsts.token);
return "0c0633a5-6e7d-4754-9909-30be49624d92"; // return "582ca8b2-e439-4ba2-a1dc-0206d752a7fa";
} }
/** /**
......
...@@ -4,6 +4,7 @@ import { Connect } from 'amos-framework'; ...@@ -4,6 +4,7 @@ import { Connect } from 'amos-framework';
import AmosWebSocket from 'amos-websocket'; import AmosWebSocket from 'amos-websocket';
import SysWsURL, { completeToken } from './../consts/wsUrlConsts'; import SysWsURL, { completeToken } from './../consts/wsUrlConsts';
import SideControl from './sideControl'; import SideControl from './sideControl';
import DataPane from './datapane';
import Explain from './explain'; import Explain from './explain';
import RulesLayer from './global/RulesLayer'; import RulesLayer from './global/RulesLayer';
import globalMsg from './pagefactory/msgFactory'; import globalMsg from './pagefactory/msgFactory';
...@@ -74,11 +75,11 @@ class MaskContent extends Component { ...@@ -74,11 +75,11 @@ class MaskContent extends Component {
<div className="mask-content"> <div className="mask-content">
<AmosWebSocket ref={node => this.aws = node} url={wsURL} onMessage={this.handleData} reconnect debug /> <AmosWebSocket ref={node => this.aws = node} url={wsURL} onMessage={this.handleData} reconnect debug />
<SideControl multiple={multiple} onItemClick={onItemClick} layerConfig={layerConfig} animationProps={controlAnimation} /> <SideControl multiple={multiple} onItemClick={onItemClick} layerConfig={layerConfig} animationProps={controlAnimation} />
{/* <DataPane animationProps={datapaneAnim} /> */} <DataPane animationProps={datapaneAnim} />
<TopMsg alarmStart={alarmStart} /> <TopMsg alarmStart={alarmStart} />
<RulesLayer /> {/* <RulesLayer />
{alarmStarted && <LayerPool animationProps={layerPoolAnimation} planStart={planStart} planQuit={planQuit} planStarted={planStarted} />} {alarmStarted && <LayerPool animationProps={layerPoolAnimation} planStart={planStart} planQuit={planQuit} planStarted={planStarted} />}
<Explain visible={showExplain} onExplainClose={onExplainClose} /> <Explain visible={showExplain} onExplainClose={onExplainClose} /> */}
</div> </div>
); );
} }
......
...@@ -101,10 +101,15 @@ class PointsPool extends Component { ...@@ -101,10 +101,15 @@ class PointsPool extends Component {
markers={markers.riskSource} markers={markers.riskSource}
onCreated={(val) => this.onMarkersCreated('riskSource', val)} onCreated={(val) => this.onMarkersCreated('riskSource', val)}
/> />
<PatrolPoint {/* <PatrolPoint
{...rest} {...rest}
markers={markers.risk} markers={markers.risk}
onCreated={(val) => this.onMarkersCreated('risk', val)} onCreated={(val) => this.onMarkersCreated('risk', val)}
/> */}
<PatrolPoint
{...rest}
markers={markers.patrol}
onCreated={(val) => this.onMarkersCreated('patrol', val)}
/> />
<PersonPoint3D <PersonPoint3D
{...rest} {...rest}
......
...@@ -370,11 +370,13 @@ class View3D extends Component { ...@@ -370,11 +370,13 @@ class View3D extends Component {
onCameraZoomChange = delta => { onCameraZoomChange = delta => {
let { totalDelta, markerType, showMap } = this.state; let { totalDelta, markerType, showMap } = this.state;
totalDelta = totalDelta + delta; totalDelta = totalDelta + delta;
if (totalDelta < mousewheelCount && showMap) { // if (totalDelta < mousewheelCount && showMap) {
if(showMap){
this.asyncLoadMarkerData(markerType); this.asyncLoadMarkerData(markerType);
} else if (totalDelta >= mousewheelCount && !showMap) {
this.loadMarkTypeStatistics(markerType);
} }
// } else if (totalDelta >= mousewheelCount && !showMap) {
// this.loadMarkTypeStatistics(markerType);
// }
this.setState({ totalDelta }); this.setState({ totalDelta });
} }
...@@ -489,11 +491,11 @@ class View3D extends Component { ...@@ -489,11 +491,11 @@ class View3D extends Component {
markers markers
}); });
} else { } else {
if (totalDelta < mousewheelCount) { // if (totalDelta < mousewheelCount) {
this.asyncLoadMarkerData(item.type); this.asyncLoadMarkerData(item.type);
} else if (totalDelta >= mousewheelCount) { // } else if (totalDelta >= mousewheelCount) {
this.loadMarkTypeStatistics(item.type); // this.loadMarkTypeStatistics(item.type);
} // }
} }
} }
}; };
...@@ -580,11 +582,11 @@ class View3D extends Component { ...@@ -580,11 +582,11 @@ class View3D extends Component {
} else { } else {
this.clearMarkers(); this.clearMarkers();
if (!isCancel) { if (!isCancel) {
if (totalDelta < mousewheelCount) { // if (totalDelta < mousewheelCount) {
this.asyncLoadMarkerData(item.type); this.asyncLoadMarkerData(item.type);
} else if (totalDelta >= mousewheelCount) { // } else if (totalDelta >= mousewheelCount) {
this.loadMarkTypeStatistics(item.type); // this.loadMarkTypeStatistics(item.type);
} // }
} else { } else {
this.setState({ markerType: null }); this.setState({ markerType: null });
} }
......
...@@ -86,32 +86,32 @@ export const bizControls = [ ...@@ -86,32 +86,32 @@ export const bizControls = [
{ key: 'level_4', label: '4级' }, { key: 'level_4', label: '4级' },
{ key: 'level_5', label: '5级' } { key: 'level_5', label: '5级' }
] }, ] },
{ key: 'risk-point', icon: 'dianwei-zhongdianshebei', type: 'risk', label: '巡检点',subs: [ { key: 'risk-point', icon: 'dianwei-zhongdianshebei', type: 'patrol', label: '巡检点',subs: [
{ key: 'level_3', label: '漏检' }, { key: 'level_3', label: '漏检' },
{ key: 'level_2', label: '不合格' }, { key: 'level_2', label: '不合格' },
{ key: 'level_1', label: '合格' }, { key: 'level_1', label: '合格' },
{ key: 'level_0', label: '未计划' } { key: 'level_0', label: '未计划' }
] }, ] },
{ key: 'impEquipment-point', icon: 'zhongdianshebeixiangqing', type: 'impEquipment', label: '重点设备' }, { key: 'impEquipment-point', icon: 'zhongdianshebeixiangqing', type: 'impEquipment', label: '重点设备' },
{ key: 'fireResource-point', icon: 'xiaofang', type: 'fireResource', label: '消防设备', subs: [ // { key: 'fireResource-point', icon: 'xiaofang', type: 'fireResource', label: '消防设备', subs: [
{ key: 'hydrant', label: '消防栓' }, // { key: 'hydrant', label: '消防栓' },
{ key: 'pool', label: '消防水池' }, // { key: 'pool', label: '消防水池' },
{ key: 'fireCar', label: '消防车' }, // { key: 'fireCar', label: '消防车' },
{ key: 'fireEquipment', label: '灭火器' }, // { key: 'fireEquipment', label: '灭火器' },
{ key: 'fireChamber', label: '消防室' }, // { key: 'fireChamber', label: '消防室' },
{ key: 'fireFoamRoom', label: '泡沫间' }, // { key: 'fireFoamRoom', label: '泡沫间' },
{ key: 'fireDetection', label: '火探' } // { key: 'fireDetection', label: '火探' }
] }, // ] },
{ key: 'monitorEquipment-point', icon: 'shujudian', type: 'monitorEquipment', label: '探测设备' }, // { key: 'monitorEquipment-point', icon: 'shujudian', type: 'monitorEquipment', label: '探测设备' },
{ key: 'monitor-point', icon: 'xunjiandian', type: 'video', label: '视频点' } // { key: 'monitor-point', icon: 'xunjiandian', type: 'video', label: '视频点' }
]; ];
export const bizControlsTypes = [ export const bizControlsTypes = [
{ key: 'riskSource', label: '风险点' }, { key: 'riskSource', label: '风险点' },
{ key: 'risk' , label: '巡检点' }, { key: 'patrol' , label: '巡检点' },
{ key: 'impEquipment', label: '重点设备' }, { key: 'impEquipment', label: '重点设备' },
{ key: 'fireResource', label: '消防设备' }, { key: 'fireEquipment', label: '消防设备' },
{ key: 'monitorEquipment', label: '探测设备' }, { key: 'monitorEquipment', label: '探测设备' },
{ key: 'video', label: '视频点' } { key: 'video', label: '视频点' }
]; ];
......
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Animate, Connect } from 'amos-framework';
import getContent from './getContent';
import DrawerContent from './DrawerContent';
import BizIcon from '../common/icon/BizIcon';
import { eventTopics } from './../consts';
const eventConnect = Connect.eventConnect;
const AnimateAddonBox = Animate.AnimateAddonBox;
/**
* 右侧 drawer
*
* @class Drawer
* @extends {Component}
*/
@eventConnect
class Drawer extends Component {
constructor(props) {
super(props);
this.state = {
activeBar: {},
activeKey: '',
content: null,
expanded: false,
// 数据列表状态,用于展示小红点
dataStutas: {
msg: true
},
showLabel: {
search: false,
msg: false,
record: false,
broadcast: false,
setting: false
} // 是否显示提示
};
}
componentDidMount(){
this.props.subscribe(eventTopics.base3d_view, (topic, data) => {//view3d调用
const { activeBar } = this.state;
if (topic === eventTopics.plan_step && activeBar.key !== 'broadcast') {
this.onBarItemClick(data);
} else if (topic === eventTopics.plan_step && activeBar.key === 'broadcast') {
this.props.trigger(eventTopics.broadcast_fresh, { batchNo: data.batchNo } );
}
});
this.props.subscribe(eventTopics.view3d_init, (topic, data) => {
this.closeDrawer();
});
}
onBarItemClick = (item) => {
const { dataStutas } = this.state;
dataStutas[item.key] = false;
this.setState({
expanded: true,
activeBar: item,
content: getContent(item.key),
dataStutas
});
}
closeDrawer = () => {
this.setState({
expanded: false,
activeBar: {}
});
}
changeLabelState(e, type, key) {
let { showLabel } = this.state;
if (type === 'over') {// mouse over
showLabel[key] = true;
} else if (type === 'out') {// mouse out
showLabel[key] = false;
}
this.setState({ showLabel });
}
renderDrawerBar = () => {
const { activeBar, dataStutas, showLabel } = this.state;
const { barList } = this.props;
return (
<ul className="drawer-bar-list">
{
barList.map(bl => {
// const imgPath = imgStatic.datapane[bl.icon];
const cls = activeBar && activeBar.key === bl.key ? 'drawer-bar-item drawer-bar-item-active' : 'drawer-bar-item';
const showDot = dataStutas[bl.key];
return (
<li key={bl.key} className={cls} onClick={() => this.onBarItemClick(bl)} onMouseOver={(e) => this.changeLabelState(e, 'over', bl.key)} onMouseOut={(e) => this.changeLabelState(e, 'out', bl.key)} >
{showDot && <span className="bar-status-dot" />}
<div className="bar-info">
<BizIcon icon={bl.icon} />
{/*<p>{bl.label}</p>*/}
<div className="marker-icon-title" style={{ visibility: showLabel[bl.key] ? 'inherit' : 'hidden' }}>
<div className="title-text">{bl.label}</div>
</div>
</div>
</li>
);
})
}
</ul>
);
}
render() {
const { content: DrawerComponent, activeBar, expanded } = this.state;
return (
<Animate key="drawer-panel" transitionName="slide-right" showProp="toggle" transitionLeave={false}>
<AnimateAddonBox toggle={expanded}>
<div className="datapane-drawer">
<div className="drawer-bar">
<div className="bar-top" />
{this.renderDrawerBar()}
<div className="bar-bottom" />
</div>
{
expanded &&
<DrawerContent
onClose={this.closeDrawer}
header={activeBar.title}
body={<DrawerComponent batchNo={activeBar.batchNo || ''} />}
// footer={<PlanStepFooter activeKey={activeBar.key} />}
/>
}
</div>
</AnimateAddonBox>
</Animate>
);
}
}
Drawer.propTypes = {
barList: PropTypes.arrayOf(PropTypes.shape({
key: PropTypes.string,
icon: PropTypes.string,
label: PropTypes.string,
title: PropTypes.string
}))
};
export default Drawer;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import Icon from 'amos-icon';
class DrawerContent extends Component {
render() {
const { header, onClose, body } = this.props;
return (
<div className="drawer-content">
<div className="drawer-content-header">
<div className="drawer-content-header-title">
<span>{header}</span>
</div>
<div className="drawer-content-header-close" onClick={onClose}>
<Icon icon="close" />
</div>
</div>
<div className="drawer-content-body">{body}</div>
</div>
);
}
}
DrawerContent.propTypes = {
header: PropTypes.string,
onClose: PropTypes.func,
body: PropTypes.node
};
export default DrawerContent;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Select } from 'amos-framework';
import { SingleQueryEnum } from 'amos-processor/lib/config/queryEnum';
import { DatePicker } from 'amos-antd';
import { getImpEquipmentAction } from './../../../services/3dService';
const Option = Select.Option;
/**
* 检索-过滤栏
*
* @class Filter
* @extends {Component}
*/
class Filter extends Component {
static propTypes = {
onFilterChange: PropTypes.func,
typeList: PropTypes.array
};
static defaultProps = {
typeList: []
};
constructor(props) {
super(props);
this.state = {
typeList: []
};
}
componentDidMount() {
getImpEquipmentAction().then(d => this.setState({ typeList: d || [] }));
}
render() {
const { onFilterChange } = this.props;
const { typeList } = this.state;
return (
<div className="datapane-filter-content">
<Select
className="datapane-filter-item datapane-filter-select"
data={typeList}
renderOption={item => <Option className="datapane-select-option" value={item.id}>{item.name}</Option>}
defaultOption={<Option className="datapane-select-option">重点设备</Option>}
onChange={(e) => onFilterChange('equipmentId', e, SingleQueryEnum.EQUAL)}
/>
<DatePicker
className="datapane-filter-item datapane-filter-date"
placeholder="时间"
format="YYYY/MM/DD"
onChange={(e) => onFilterChange('createTime', e._d.getTime(), SingleQueryEnum.EQUAL)}
/>
</div>
);
}
}
export default Filter;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Button, Modal, Connect } from 'amos-framework';
import { CONSTS } from './../../../consts/storageConsts';
import BizIcon from '../../common/icon/BizIcon';
import FireStrength3dSimpleView from './../../equipmentLedger/FireResources/FireStrength/FireStrength3dSimpleView';
import FireResourceView from './../../equipmentLedger/FireResources/3dSimpleViewIndex';
import { eventTopics } from './../../consts';
import { tirggerTransTopic } from './../../dataProcessor';
const initFooterBtns = [
{ key: 'contact', icon: 'tongxunlu', label: '通讯录', color: '#33cc00', disabled: false },
{ key: 'equipment', icon: 'zhongdianshebeixiangqing', label: '重点设备详情', color: '#cccccc', disabled: true }, // color: '#0099ff'
{ key: 'powerload', icon: 'dianyuanfuhetu', label: '电源负荷图', color: '#cccccc', disabled: true }, // color: '#ff9900'
{ key: 'blockage', icon: 'dianlangoufengdutu', label: '电缆沟封堵图', color: '#cccccc', disabled: true }, // color: '#6b6b6b'
{ key: 'route', icon: 'xiaofangchejinzhanhangcheluxiantu', label: '消防车进站行车路线图', color: '#cccccc', disabled: true }, // color: '#ff0000'
{ key: 'waterintake', icon: 'xiaofangqushuitu', label: '消防取水图', color: '#cccccc', disabled: true }, // color: '#ff0000'
{ key: 'resource', icon: 'ziyuanliebiao', label: '资源列表', color: '#ff6600', disabled: false } // color: '#ff6600'
];
const eventConnect = Connect.eventConnect;
@eventConnect
class PlanStepFooter extends Component {
constructor(props) {
super(props);
this.state = {
show: false,
btnKey: '',
equipmentId: '',
isInit: false,
footerBtns: [],
offSet: 0,
showLabel: {
contact: false,
equipment: false,
powerload: false,
blockage: false,
route: false,
waterintake: false,
resource: false
} // 是否显示提示
};
}
componentDidMount() {
let { footerBtns } = this.state;
// Object.assign(footerBtns, initFooterBtns);
footerBtns = JSON.parse(JSON.stringify(initFooterBtns));
this.setState({ footerBtns });
this.props.subscribe(eventTopics.plan_step, (topic, data) => {
let { type, equipmentId } = data;
let { footerBtns } = this.state;
// Object.assign(footerBtns, initFooterBtns);
if (topic === eventTopics.plan_step){
footerBtns.map(btn => {
if (type === 'equipment' && btn.key === type) {
btn.color = '#0099ff';
btn.disabled = false;
} else if (type === 'powerload' && btn.key === type) {
btn.color = '#ff9900';
btn.disabled = false;
} else if (type === 'blockage' && btn.key === type) {
btn.color = '#6b6b6b';
btn.disabled = false;
} else if (type === 'route' && btn.key === type) {
btn.color = '#ff0000';
btn.disabled = false;
} else if (type === 'waterintake' && btn.key === type) {
btn.color = '#ff0000';
btn.disabled = false;
} else if (type === 'resource' && btn.key === type) {
btn.color = '#ff6600';
btn.disabled = false;
}
return btn;
});
this.setState({ equipmentId });
}
});
this.props.subscribe(eventTopics.view3d_init, (topic, data) => {
this.setState({ isInit: true });
});
}
onBtnClick = (button) => {
console.log(button);
let { equipmentId } = this.state;
switch (button.key) {
case 'contact': this.setState({ show: true, btnKey: button.key }); break;
case 'equipment':
tirggerTransTopic(CONSTS.forward, { details: { dialogId: equipmentId, type: 'impEquipment' }, dateTime: Date.now() });
break;
case 'powerload':
tirggerTransTopic(CONSTS.forward, { details: { type: 'impEquipment', dialogId: equipmentId, show: 'picture1' }, dateTime: Date.now() });
break;
case 'blockage':
tirggerTransTopic(CONSTS.forward, { details: { type: 'impEquipment', dialogId: equipmentId, show: 'picture2' }, dateTime: Date.now() });
break;
case 'route':
tirggerTransTopic(CONSTS.forward, { details: { type: 'impEquipment', dialogId: equipmentId, show: 'picture3' }, dateTime: Date.now() });
break;
case 'waterintake':
tirggerTransTopic(CONSTS.forward, { details: { type: 'impEquipment', dialogId: equipmentId, show: 'picture4' }, dateTime: Date.now() });
break;
case 'resource': this.setState({ show: true, btnKey: button.key }); break;
}
}
getHead = () => {
const { btnKey } = this.state;
if (btnKey === 'contact') {
return '常用通讯录';
} else if (btnKey === 'resource') {
return '消防资源列表';
}
}
getContext = () => {
const { btnKey } = this.state;
if (btnKey === 'contact') {
return <FireStrength3dSimpleView />;
} else if (btnKey === 'resource') {
return <FireResourceView />;
}
}
getFooter = () => {
return (<Button onClick={() => this.cancel()}>取消</Button>);
}
cancel() {
this.setState({
show: false
});
}
changeLabelState(e, type, key) {
let { showLabel } = this.state;
let offSet = 0;
if (type === 'over') {// mouse over
showLabel[key] = true;
} else if (type === 'out') {// mouse out
showLabel[key] = false;
}
if (key === 'resource') {
offSet = -20;
} else {
offSet = -(e.currentTarget.children[1].clientWidth - e.currentTarget.children[0].clientWidth) / 2;
}
this.setState({ showLabel, offSet });
}
render() {
let { show, footerBtns, isInit, showLabel, offSet } = this.state;
let _true_ = true;
if (isInit) {
footerBtns = JSON.parse(JSON.stringify(initFooterBtns));
}
return (
<div className='plan-step-footer' >
<tr>
{
footerBtns.map(btn => {
return (
<td key={btn.key} onMouseOver={(e) => this.changeLabelState(e, 'over', btn.key)} onMouseOut={(e) => this.changeLabelState(e, 'out', btn.key)} >
<Button icon={<BizIcon icon={btn.icon} color={btn.color} />} transparent onClick={() => this.onBtnClick(btn)} disabled={btn.disabled} />
<div className="marker-icon-title" style={{ visibility: showLabel[btn.key] ? 'inherit' : 'hidden', marginLeft: offSet }}>
<div className="title-text" >{btn.label}</div>
</div>
</td>
);
})
}
</tr>
<Modal
className='plan-step-view-modal'
header={this.getHead()}
footer={this.getFooter()}
width='55%'
visible={show}
destroyContent
onCancel={() => this.cancel()}
onOk={() => {}}
content={this.getContext()}
outterClosable={_true_}
/>
</div>
);
}
}
PlanStepFooter.propTypes = {
activeKey: PropTypes.string,
subscribe: PropTypes.fun
};
export default PlanStepFooter;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
const defaultCicle = 5;//默认到计时
/**
*
* 倒计时
* @class TimerTool
* @extends {Component}
*/
class TimerTool extends Component {
constructor(props) {
super(props);
this.state = {
time: defaultCicle,
timeContent: defaultCicle + 's',
showContent: true
};
}
componentWillMount(){
const { delayed } = this.props;
delayed && this.setState({ time: delayed, timeContent: delayed + 's' });
}
componentDidMount() {
this.count();
}
componentWillUnmount(){
clearInterval(this.timer);
}
count = () => {
clearInterval(this.timer);
let { time: ti } = this.state;
const { delayed } = this.props;
let delayTime = delayed ? delayed : defaultCicle;
this.timer = setInterval(() => {
if (ti > 0) {
ti = ti - 1;
this.setState({ time: ti, timeContent: ti + 's' });
} else {
clearInterval(this.timer);
this.setState({ time: delayTime, timeContent: delayTime + 's',showContent: false });
const { autoClick } = this.props;
autoClick && autoClick();
}
}, 1000);
}
initTime =()=>{
clearInterval(this.timer);
const { delayed } = this.props;
let delayTime = delayed ? delayed : defaultCicle;
this.setState({ time: delayTime, timeContent: delayTime + 's',showContent: false });
}
render() {
let { timeContent,showContent } = this.state;
return (
<span style={{ color: 'red' }}>{showContent ? timeContent : ''}</span>
);
}
}
TimerTool.propTypes = {
delayed: PropTypes.Object,
autoClick: PropTypes.func
};
export default TimerTool;
import React from 'react';
import moment from 'moment';
import { broadcastAction, exeRecordAction } from './../../../services/3dService';
import { Connect, Timeline, Button, message, CardPane,Modal } from 'amos-framework';
import DataPaneBasic from './../common/DataPaneBasic';
import DataPaneContent from './../common/DataPaneContent';
import Filter from './Filter';
import PaneItem from './../common/PaneItem';
import ListPaginate from './../common/ListPaginate';
import { eventTopics } from './../../consts';
import SymIcon from './../../common/icon/SymIcon';
import { ruleAction, ruleRePlayAction } from './../../../services/ruleService';
import PlanStepFooter from './PlanStepFooter';
import './../../../styles/broadcast.scss';
import TimerTool from './TimerTool';
const eventConnect = Connect.eventConnect;
/**
* 预案-步骤
* @class Broadcast
* @extends {DataPaneBasic}
*/
@eventConnect
class Broadcast extends DataPaneBasic {
constructor(props) {
super(props);
this.state = {
data: [],
filter: [],
visible: false,
content: {},
showFireConfirm: false,
page: 0,
pageSize: 10,
showTimeLine: false
};
}
componentDidMount(){
const { batchNo } = this.props;
batchNo ? this.getPlanExeRecord(batchNo) : this.onSearch();
this.props.subscribe(eventTopics.broadcast_fresh, (topic, data) => {
if (topic === eventTopics.broadcast_fresh){
this.onHandleMsg(data.batchNo);
}
});
}
onHandleMsg = (batchNo) => {
this.getPlanExeRecord(batchNo);
}
/**
* 点击记录中的一个
*/
onClick = (item) => {
this.init3dView(item).then(e=>{
this.getPlanExeRecord(item.batch_No);
this.ruleRePlay(item.batch_No);
});
}
init3dView = async () =>{
await this.props.trigger(eventTopics.view_fresh, {});
}
ruleRePlay =(batchNo)=>{
ruleRePlayAction(batchNo).then(data=>{
message.success('预案回播开始');
},error => {
message.danger('预案回播失败');
});
}
/**
* 查询预案执行明细
* @memberof Broadcast
*/
getPlanExeRecord =(batchNo)=>{
batchNo && this.refshTimeLine(batchNo);
}
refshTimeLine =(batchNo)=>{
broadcastAction(batchNo).then(data => {
const { showTimeLine } = this.state;
showTimeLine ? '' : this.setState({ showTimeLine: true });//显示执行明细
this.setState({ data });
});
}
/**
* 查询预案执行记录
* @memberof Broadcast
*/
onSearch = (page) => {
const { filter, pageSize, showTimeLine } = this.state;
exeRecordAction(filter, page || 0, pageSize).then(d => {
showTimeLine ? this.setState({ showTimeLine: false }) : '';//不显示执行明细
this.list.setData(d, this);
});
}
renderItem = (data) => {
return (
data.map(item=>{
return (<Timeline.Item>
<CardPane className='card-pane-front' extra={<SymIcon icon={item.icon} style={{ width: '16px' ,height: '16px' }} />} title={item.name} />
{(item.subCategoryList || []).map(e=>{
return (e.name === 'DEFAULT' ? this.renderDetItem(e) : <Timeline>{this.renderTimeLineItem(e)}</Timeline>);
})
}
</Timeline.Item>);
})
);
}
renderDetItem = (e)=>{
return (e.contentList || []).map((item,index) =>{
return this.getDetailContentByRecordType(item,index);
});
}
renderTimeLineItem = (e)=>{
return (e.contentList || []).map((item,index) =>{
return <Timeline.Item><p>{item.name}</p>{this.getDetailContentByRecordType(item,index)}</Timeline.Item>;
});
}
onButtonClick =(content)=>{
if (content.code === 'all_Resource') {
this.props.trigger(eventTopics.show_fire_equip,content);
} else if (content.confirm && content.code !== 'all_Resource') {//触发view3d,弹出框
this.open(content);
} else {//调用后台接口
(this[content.code] || {}).initTime ? this[content.code].initTime() : '';
ruleAction(content.requestUrl,content).then(e=>{
message.success('操作成功');
},error=>{
message.danger('操作失败');
});
}
}
getDetailContentByRecordType = (item,index)=>{
let styles = { marginTop: '8px' };
let cardStyle = { marginTop: '15px' };
if (item.recordType === 'MESSAGE') {
return (
<CardPane className='card-pane-front' style={index > 0 ? cardStyle : {}} title={item.name}>
<div className='broadcast-detail-message'>
<span>{ item.createDate ? moment(item.createDate).format('YYYY-MM-DD HH:mm:ss') : ''}</span>
<p style={styles}>{item.content}</p>
</div>
</CardPane>
);
} else if (item.recordType === 'OPERATE') {
let content = JSON.parse(item.content);
return (
<CardPane className='card-pane-front'>
<div className='broadcast-detail-operate'>
{(content.operate || []).map(e=>{
e.batchNo = item.batchNo;
e.id = item.id;
let disable = (e.state === 'wait' || !e.state) ? false : true;
let style = e.state === 'executed' ? { backgroundColor: '#c8f1c8',borderColor: '#009900' } : {};
return (<Button
disabled={disable}
className="broadcast-button"
style={style}
icon={<SymIcon icon={e.icon} style={{ width: '16px' ,height: '16px' }} />}
onClick={()=>this.onButtonClick(e)}>
{e.title}{(e.state === 'wait' && (e.delayed || 0) > 0) ? <TimerTool ref={timer =>this[e.code] = timer} autoClick={() => this.onButtonClick(e)} delayed={e.delayed} /> : '' } </Button>);
})}
</div>
</CardPane>
);
}
}
renderPaneItem =(item)=>{
return [
{ name: '名称', value: 'name' },
{ name: '时间', value: 'create_time' },
{ name: '重点设备', value: 'equipment_Name' }
];
}
open = (content) => {
this.setState({
showFireConfirm: true,
content
});
}
cancel = () => {
this.setState({
showFireConfirm: false,
content: {}
});
}
onModalOk =(content)=>{
this.cancel();
ruleAction(content.requestUrl,content).then(e=>{
message.success('确认成功');
},error=>{
message.danger('确认失败');
});
}
render() {
const { data, showTimeLine, pageSize, showFireConfirm, content } = this.state;
let timelineStyle = { marginTop: '15px', marginLeft: '8px', marginBottom: '45px' };
return (
<DataPaneContent
onFilterChange={this.onFilterChange}
filter={Filter}
searchName='contingencyName'
>
{!showTimeLine ? <ListPaginate
ref={node => this.list = node}
data={data}
pageSize={pageSize}
onChangePage={this.onSearch}
renderItem={e => <PaneItem renderItem={this.renderPaneItem} key={e.id} data={e} onClick={this.onClick} />}
/> :
<Timeline style={timelineStyle}>
{this.renderItem(data)}
</Timeline>
}
<PlanStepFooter />
<Modal
header={content.title || ''}
visible={showFireConfirm}
className='fire-confirm-modal'
destroyContent
content={content.content || ''}
onCancel={this.cancel}
onOk={()=>this.onModalOk(content)}
okText='是'
cancelText='否'
/>
</DataPaneContent>
);
}
}
export default Broadcast;
import { Component } from 'react';
class DataPaneBasic extends Component {
constructor(props) {
super(props);
this.state = {
data: [],
filter: [],
page: 0,
pageSize: 10
};
}
/**
* 搜索条件改变
* @memberof Search
*/
onFilterChange = (name, value, type) => {
let { filter } = this.state;
if (value) {
const flag = filter.some(e => {
if (e.name === name) {
e.value = value;
return true;
}
});
!flag && filter.push({ name, value, type });
} else {
filter = filter.filter(e => e.name !== name);
}
this.setState({ filter }, this.onSearch);
}
onSearch = () => {
}
}
export default DataPaneBasic;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { SingleQueryEnum } from 'amos-processor/lib/config/queryEnum';
import Search from './../../common/Search';
/**
* 右侧菜单内容容器
*
* @class DataPanelContent
* @extends {Component}
*/
class DataPanelContent extends Component {
static propTypes = {
filter: PropTypes.any,
searchName: PropTypes.string,
children: PropTypes.any,
onFilterChange: PropTypes.func,
showSearch: PropTypes.bool,
dataList: PropTypes.array,
searchType: PropTypes.string,
searchTextName: PropTypes.string,
type: PropTypes.string
};
static defaultProps = {
showSearch: true,
searchName: 'searchValue',
searchTextName: 'inputText',
searchType: 'input',
dataList: [],
onFilterChange(){}
};
constructor(props) {
super(props);
this.state = {
type: ''
};
}
onSearch = (value) => {
const { searchName, onFilterChange, searchType, searchTextName } = this.props;
if (searchType === 'selectAndInput') {
onFilterChange(searchTextName, value, SingleQueryEnum.LIKE);
} else {
onFilterChange(searchName, value, SingleQueryEnum.LIKE);
}
}
searchOnChange = (value) => {
const { searchName, onFilterChange } = this.props;
this.setState({ type: value });
onFilterChange(searchName, value, SingleQueryEnum.LIKE);
}
render() {
const { filter, children, showSearch, onFilterChange , searchType, dataList } = this.props;
const { type } = this.state;
const Filter = filter ? filter : null;
return (
<div className="datapane-container">
{
showSearch && <div className="datapanel-search">
<Search searchOnChange={this.searchOnChange} onSearch={this.onSearch} searchType={searchType} dataList={dataList} />
</div>
}
{
Filter ?
<div className="datapane-filter">
<Filter {...this.props} type={type} onFilterChange={onFilterChange} />
</div> : null
}
<div className="datapane-content">
{
children
}
</div>
</div>
);
}
}
export default DataPanelContent;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Button, Scrollbars } from 'amos-framework';
import imgStatic from './../../../consts/imgStatic';
class GroupListPaginate extends Component {
static propTypes = {
pageSize: PropTypes.number,
onChangePage: PropTypes.func,
groupBy: PropTypes.func,
renderItem: PropTypes.func,
data: PropTypes.array
};
static defaultProps = {
pageSize: 10,
renderItem(){},
data: [],
onChangePage(){},
groupBy(){}
};
constructor(props) {
super(props);
this.state = {
pageSize: props.pageSize,
page: 0,
tip: undefined
};
}
onChangePage = () => {
const { page } = this.state;
this.setState({ tip: 'running' }, () => this.props.onChangePage(page + 1));
}
onScrollFrame = (e) => {
if (e && e.top === 1) {
!this.state.tip && this.state.tip !== 'running' && this.onChangePage();
}
}
setData = (d, parent) => {
let { data } = this.props;
let { tip } = this.state;
const { content, totalPages, number } = d || {};
if (number === 0) {
data = content;
} else {
if (content.length > 0) {
data.push(...content);
}
}
if (totalPages === (number + 1)) {
tip = 'finsh';
} else {
tip = undefined;
}
this.setState({ tip, page: number });
if (number === 0) {
this.scroll.scrollToTop();
}
parent.setState({ data });
}
setPage = (page) => {
this.setState({ page });
}
render() {
const { renderItem, data, groupBy } = this.props;
const { tip } = this.state;
let flag = '';
data.map(e => {
const data = groupBy(e);
if (flag !== data) {
e.groupByValue = data;
flag = data;
} else {
e.groupByValue = undefined;
}
});
return (
<Scrollbars
ref={node => this.scroll = node}
onScrollFrame={this.onScrollFrame}
>
<div className="list-paginate datapane-list-content" ref={node => this.node = node}>
{
data.map(e => renderItem(e))
}
{
!tip && data.lengt > 0 && <Button className="list-paginate-more" onClick={this.onChangePage}>
加载更多
</Button>
}
{
tip === 'finsh' && <span className="list-paginate-nomore" ><img src={imgStatic.datapane.noMore} alt="" />没有更多了</span>
}
{
tip === 'running' && <span className="list-paginate-loading" >
<img src={imgStatic.datapane.loading} alt="" />
<p>加载中</p>
</span>
}
</div>
</Scrollbars>
);
}
}
export default GroupListPaginate;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Button, Scrollbars } from 'amos-framework';
import imgStatic from './../../../consts/imgStatic';
class ListPaginate extends Component {
static propTypes = {
pageSize: PropTypes.number,
onChangePage: PropTypes.func,
renderItem: PropTypes.func,
data: PropTypes.array
};
static defaultProps = {
pageSize: 10,
renderItem(){},
data: [],
onChangePage(){}
};
constructor(props) {
super(props);
this.state = {
pageSize: props.pageSize,
page: 0,
tip: undefined
};
}
onChangePage = () => {
const { page } = this.state;
this.setState({ tip: 'running' }, () => this.props.onChangePage(page + 1));
}
onScrollFrame = (e) => {
if (e && e.top === 1) {
!this.state.tip && this.state.tip !== 'running' && this.onChangePage();
}
}
setData = (d, parent) => {
let { data } = this.props;
let { tip } = this.state;
const { content, totalPages, number } = d || {};
if (number === 0) {
data = content;
} else {
if (content.length > 0) {
data.push(...content);
}
}
if (totalPages === (number + 1)) {
tip = 'finsh';
} else {
tip = undefined;
}
if (number === 0) {
this.scroll && this.scroll.scrollToTop();
}
this.setState({ tip, page: number });
parent.setState({ data });
}
setPage = (page) => {
this.setState({ page });
}
render() {
const { renderItem, data } = this.props;
const { tip } = this.state;
return (
<Scrollbars
ref={node => this.scroll = node}
onScrollFrame={this.onScrollFrame}
>
<div className="list-paginate datapane-list-content" ref={node => this.node = node}>
{
data.map(e => renderItem(e))
}
{
!tip && data.length > 0 && <Button className="list-paginate-more" onClick={this.onChangePage}>
加载更多
</Button>
}
{
tip === 'finsh' && <span className="list-paginate-nomore" ><img src={imgStatic.datapane.noMore} alt="" />没有更多了</span>
}
{
tip === 'running' && <span className="list-paginate-loading" >
<img src={imgStatic.datapane.loading} alt="" />
<p>加载中</p>
</span>
}
</div>
</Scrollbars>
);
}
}
export default ListPaginate;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
class PaneItem extends Component {
static propTypes = {
data: PropTypes.object,
onClick: PropTypes.func,
renderItem: PropTypes.func
};
static defaultProps = {
data: {},
onClick(){}
};
constructor(props) {
super(props);
}
render() {
const { data, onClick, renderItem } = this.props;
return (
<div className="datapane-item">
{
renderItem(data).map(e => {
return (<p key={e.name} className="datapane-prop" onClick={() => onClick(data)}>
<span className="datapane-prop-name">{e.name}</span>
{
e.render ? e.render(data) : <span className="datapane-prop-value">{data[e.value] || ''}</span>
}
</p>);
})
}
</div>
);
}
}
export default PaneItem;
import React from 'react';
import Search from './search';
// import Monitor from './monitor';
import Record from './record';
import Trajectory from './trajectory';
import Msg from './msg';
import Broadcast from './broadcast';
import Setting from './setting';
const mapping = {
search: Search,
msg: Msg,
trajectory: Trajectory,
record: Record,
broadcast: Broadcast,
// monitor: Monitor,
setting: Setting
};
const Unkown = props => <div>暂未定义</div>;
export default function getContent(key){
return mapping[key] || Unkown;
}
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { SidePane } from 'amos-framework';
import Drawer from './Drawer';
const dataPanes = [
{ key: 'search', icon: 'sousuo', label: '检索', title: '信息检索' },
{ key: 'msg', icon: 'xiaoxi', label: '消息', title: '消息提醒' },
// { key: 'trajectory', icon: 'trajectory', label: '轨迹', title: '巡检轨迹' },
{ key: 'record', icon: 'yuan1', label: '轨迹', title: '巡检轨迹' },
// { key: 'job', icon: 'job', label: '工单', title: '工单查看' },
{ key: 'broadcast', icon: 'buzhou7', label: '步骤', title: '步骤' },
// { key: 'statistics', icon: 'statistics', label: '统计', title: '统计信息' },
// { key: 'monitor', icon: 'monitor', label: '监控', title: '视频监控' },
{ key: 'setting', icon: 'shezhi', label: '设置', title: '系统设置' }
];
class DataPane extends Component {
render() {
const { animationProps } = this.props;
return (
<SidePane className="side-pane-data" left={false} right={0} top={40} {...animationProps}>
<Drawer barList={dataPanes} />
</SidePane>
);
}
}
DataPane.propTypes = {
animationProps: PropTypes.object
};
export default DataPane;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { trim } from 'amos-tool';
import { Select, Input } from 'amos-framework';
import { SingleQueryEnum } from 'amos-processor/lib/config/queryEnum';
import {
monitorRegionListAction
} from './../../../services/3dService';
const Option = Select.Option;
/**
* 检索-过滤栏
*
* @class Filter
* @extends {Component}
*/
class Filter extends Component {
static propTypes = {
onFilterChange: PropTypes.func
};
constructor(props) {
super(props);
this.state = {
regionList: []
};
}
componentDidMount() {
monitorRegionListAction().then(d => this.setState({ regionList: d || [] }));
}
render() {
const { onFilterChange } = this.props;
const { regionList } = this.state;
return (
<div className="datapane-filter-content">
<Select
className="datapane-filter-item datapane-filter-select"
data={regionList}
renderOption={item => <Option className="datapane-select-option" value={item.id}>{item.name}</Option>}
defaultOption={<Option className="datapane-select-option">区域</Option>}
onChange={(e) => onFilterChange('category', e, SingleQueryEnum.EQUAL)}
/>
<Input
className="datapane-filter-item datapane-filter-input"
placeholder="编号"
onBlur={(e) => onFilterChange('code', trim(e.target.value), SingleQueryEnum.LIKE)}
/>
</div>
);
}
}
export default Filter;
import React from 'react';
import {
monitorAction
} from './../../../services/3dService';
import DataPaneBasic from './../common/DataPaneBasic';
import DataPaneContent from './../common/DataPaneContent';
import Filter from './Filter';
import PaneItem from './../common/PaneItem';
import ListPaginate from './../common/ListPaginate';
/**
* 监控
* @class Monitor
* @extends {DataPaneBasic}
*/
class Monitor extends DataPaneBasic {
constructor(props) {
super(props);
this.state = {
data: [],
filter: [],
page: 0,
pageSize: 10
};
}
componentDidMount(){
this.onSearch();
}
/**
* 点击监控中的一个
*/
onClick = (item) => {
}
onSearch = (page) => {
const { filter, pageSize } = this.state;
monitorAction(filter, page || 0, pageSize).then(d => {
this.list.setData(d, this);
});
}
renderItem = (item) => {
return [
{ name: '视频点', value: 'name' },
{ name: '编号', value: 'code' }
];
}
render() {
const { data, pageSize } = this.state;
return (
<DataPaneContent
onFilterChange={this.onFilterChange}
filter={Filter}
>
<ListPaginate
ref={node => this.list = node}
data={data}
pageSize={pageSize}
onChangePage={this.onSearch}
renderItem={e => <PaneItem renderItem={this.renderItem} key={e.id} data={e} onClick={this.onClick} />}
/>
</DataPaneContent>
);
}
}
export default Monitor;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { SingleQueryEnum } from 'amos-processor/lib/config/queryEnum';
import { Select } from 'amos-framework';
import { DatePicker } from 'amos-antd';
const Option = Select.Option;
const typeList = [
{ id: '01', name: '未读' },
{ id: '02', name: '已读' }
];
const MsgTypeEnum = [{ id: 'protal', name: '巡检' }, { id: 'equiment', name: '设备' }, { id: 'risk', name: '风险' }];
/**
* 检索-过滤栏
*
* @class Filter
* @extends {Component}
*/
class Filter extends Component {
static propTypes = {
onFilterChange: PropTypes.func
};
constructor(props) {
super(props);
this.state = {
categoryList: []
};
}
componentDidMount() {
// msgCategoryListAction().then(d => this.setState({ categoryList: d || [] }));
}
onFilterChange = (date, dateString) => {
let searchDate = dateString.split('/').join('-');
this.props.onFilterChange('time', searchDate, SingleQueryEnum.EQUAL);
}
render() {
const { onFilterChange } = this.props;
const { categoryList } = this.state;
return (
<div className="datapane-filter-content">
<Select
className="datapane-filter-item datapane-filter-select"
data={MsgTypeEnum}
renderOption={item => <Option className="datapane-select-option" value={item.id}>{item.name}</Option>}
defaultOption={<Option className="datapane-select-option">类别</Option>}
onChange={(e) => onFilterChange('category', e, SingleQueryEnum.EQUAL)}
/>
{/*<Select
className="datapane-filter-item datapane-filter-select"
data={typeList}
renderOption={item => <Option className="datapane-select-option" value={item.id}>{item.name}</Option>}
defaultOption={<Option className="datapane-select-option">所有</Option>}
onChange={(e) => onFilterChange('type', e, SingleQueryEnum.EQUAL)}
/>*/}
<DatePicker
className="datapane-filter-item datapane-filter-date"
placeholder="时间"
format="YYYY/MM/DD"
onChange={this.onFilterChange}
/>
</div>
);
}
}
export default Filter;
import React from 'react';
import {
msgAction
} from './../../../services/3dService';
import { Connect } from 'amos-framework';
import DataPaneBasic from './../common/DataPaneBasic';
import DataPaneContent from './../common/DataPaneContent';
import Filter from './Filter';
import PaneItem from './../common/PaneItem';
import ListPaginate from './../common/ListPaginate';
import { eventTopics } from './../../consts';
const eventConnect = Connect.eventConnect;
/**
* 消息
* @class Msg
* @extends {Component}
*/
@eventConnect
class Msg extends DataPaneBasic {
constructor(props) {
super(props);
this.state = {
searchName: 'title',
data: [],
filter: [],
page: 0,
pageSize: 10
};
}
componentDidMount(){
this.onSearch();
this.props.subscribe(eventTopics.datapane_msg, (topic, data) => {
console.log('datapane_msg****', data);
this.onHandleMsg(data);
});
}
/**
* 点击监控中的一个
*/
onClick = (item) => {
}
onHandleMsg = (data) => {
this.onSearch();
}
onSearch = (page) => {
const { filter, pageSize } = this.state;
let searchParam = {};
filter.map(item => {
searchParam[item.name] = item.value;
});
msgAction(searchParam, page || 0, pageSize).then(d => {
this.list && this.list.setData(d, this);
});
}
renderItem = (item) => {
return [
{ name: '标题', value: 'title' },
{ name: '类型', value: 'type' },
{ name: '时间', value: 'timeStr' },
{ name: '内容',
value: 'content',
render: text => {
return item.content.slice(0,item.content.lastIndexOf('<'));
}
}
];
}
render() {
const { searchName, data, pageSize } = this.state;
return (
<DataPaneContent
onFilterChange={this.onFilterChange}
filter={Filter}
searchName={searchName}
>
<ListPaginate
ref={node => this.list = node}
data={data}
pageSize={pageSize}
onChangePage={this.onSearch}
renderItem={e => <PaneItem renderItem={this.renderItem} key={e.id} data={e} onClick={this.onClick} />}
/>
</DataPaneContent>
);
}
}
export default Msg;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Select } from 'amos-framework';
import { SingleQueryEnum } from 'amos-processor/lib/config/queryEnum';
import { DatePicker } from 'amos-antd';
const Option = Select.Option;
/**
* 检索-过滤栏
*
* @class Filter
* @extends {Component}
*/
class Filter extends Component {
static propTypes = {
onFilterChange: PropTypes.func,
statusList: PropTypes.array
};
static defaultProps = {
statusList: []
};
constructor(props) {
super(props);
this.state = {
};
}
render() {
const { onFilterChange, statusList } = this.props;
return (
<div className="datapane-filter-content">
<Select
className="datapane-filter-item datapane-filter-select"
data={statusList}
renderOption={item => <Option className="datapane-select-option" value={item.code}>{item.name}</Option>}
defaultOption={<Option className="datapane-select-option">全部</Option>}
onChange={(e) => onFilterChange('isOK', e, SingleQueryEnum.EQUAL)}
/>
<DatePicker
className="datapane-filter-item datapane-filter-date"
placeholder="时间"
format="YYYY-MM-DD"
onChange={(e, s) => onFilterChange('beginDate', s, SingleQueryEnum.EQUAL)}
/>
</div>
);
}
}
export default Filter;
import React from 'react';
import {
recordAction,
recordStatusListAction
} from './../../../services/3dService';
import Icon from 'amos-icon';
import DataPaneBasic from './../common/DataPaneBasic';
import DataPaneContent from './../common/DataPaneContent';
import Filter from './Filter';
import PaneItem from './../common/PaneItem';
import ListPaginate from './../common/ListPaginate';
/**
* 预案
* @class Plan
* @extends {DataPaneBasic}
*/
class Plan extends DataPaneBasic {
constructor(props) {
super(props);
this.state = {
searchName: 'pointName',
data: [],
filter: [],
statusList: [],
page: 0,
pageSize: 10
};
}
componentDidMount(){
this.onSearch();
recordStatusListAction().then(d => this.setState({ statusList: d || [] }));
}
/**
* 点击记录中的一个
*/
onClick = (item) => {
}
onSearch = (page) => {
const { filter, pageSize } = this.state;
recordAction(filter, page || 0, pageSize).then(d => {
this.list.setData(d, this);
});
}
renderItem = (item) => {
return [
{ name: '名称', value: 'pointName' },
{ name: '类型', value: 'checkTime' },
{ name: '重点设备', value: 'status' }
];
}
render() {
const { searchName, data, statusList, pageSize } = this.state;
return (
<DataPaneContent
onFilterChange={this.onFilterChange}
statusList={statusList}
filter={Filter}
searchName={searchName}
>
<ListPaginate
ref={node => this.list = node}
data={data}
pageSize={pageSize}
onChangePage={this.onSearch}
renderItem={e => <PaneItem renderItem={this.renderItem} key={e.id} data={e} onClick={this.onClick} />}
/>
</DataPaneContent>
);
}
}
export default Plan;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Select } from 'amos-framework';
import { SingleQueryEnum } from 'amos-processor/lib/config/queryEnum';
import { DatePicker } from 'amos-antd';
const Option = Select.Option;
/**
* 检索-过滤栏
*
* @class Filter
* @extends {Component}
*/
class Filter extends Component {
static propTypes = {
onFilterChange: PropTypes.func,
statusList: PropTypes.array
};
static defaultProps = {
statusList: []
};
constructor(props) {
super(props);
this.state = {
};
}
render() {
const { onFilterChange, statusList } = this.props;
return (
<div className="datapane-filter-content">
<Select
className="datapane-filter-item datapane-filter-select"
data={statusList}
renderOption={item => <Option className="datapane-select-option" value={item.code}>{item.name}</Option>}
defaultOption={<Option className="datapane-select-option">全部</Option>}
onChange={(e) => onFilterChange('isOK', e, SingleQueryEnum.EQUAL)}
/>
<DatePicker
className="datapane-filter-item datapane-filter-date"
placeholder="时间"
format="YYYY-MM-DD"
onChange={(e, s) => onFilterChange('beginDate', s, SingleQueryEnum.EQUAL)}
/>
</div>
);
}
}
export default Filter;
import React from 'react';
import {
recordAction,
recordStatusListAction
} from './../../../services/3dService';
import Icon from 'amos-icon';
import DataPaneBasic from './../common/DataPaneBasic';
import DataPaneContent from './../common/DataPaneContent';
import Filter from './Filter';
import PaneItem from './../common/PaneItem';
import ListPaginate from './../common/ListPaginate';
/**
* 记录
* @class Record
* @extends {DataPaneBasic}
*/
class Record extends DataPaneBasic {
constructor(props) {
super(props);
this.state = {
searchName: 'pointName',
data: [],
filter: [],
statusList: [],
page: 0,
pageSize: 10
};
}
componentDidMount(){
this.onSearch();
recordStatusListAction().then(d => this.setState({ statusList: d || [] }));
}
/**
* 点击记录中的一个
*/
onClick = (item) => {
}
onSearch = (page) => {
const { filter, pageSize } = this.state;
recordAction(filter, page || 0, pageSize).then(d => {
this.list.setData(d, this);
});
}
renderItem = (item) => {
const status = this.state.statusList.find(e => e.code === item.isOk) || {};
return [
{ name: '巡检点', value: 'pointName' },
{ name: '时间', value: 'checkTime' },
{ name: '状态', value: 'status', render: () => (
<span className="datapane-prop-value" style={{ color: status.color }}>
{status.name}&nbsp;{ status.color && <Icon icon="warning" style={{ color: status.color }} /> }
</span>
) }
];
}
render() {
const { searchName, data, statusList, pageSize } = this.state;
return (
<DataPaneContent
onFilterChange={this.onFilterChange}
statusList={statusList}
filter={Filter}
searchName={searchName}
>
<ListPaginate
ref={node => this.list = node}
data={data}
pageSize={pageSize}
onChangePage={this.onSearch}
renderItem={e => <PaneItem renderItem={this.renderItem} key={e.checkID} data={e} onClick={this.onClick} />}
/>
</DataPaneContent>
);
}
}
export default Record;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { MultiSelect, Select } from 'amos-framework';
import { SingleQueryEnum } from 'amos-processor/lib/config/queryEnum';
import {
searchRegionListAction,
initView3DLinkAction,
getImpEquipmentAction
} from './../../../services/3dService';
import { riskSourceLevel ,riskSourceStatus, fireResource } from '../../conf';
const Option = Select .Option;
/**
* 检索-过滤栏
*
* @class Filter
* @extends {Component}
*/
class Filter extends Component {
static propTypes = {
onFilterChange: PropTypes.func,
type: PropTypes.string
};
constructor(props) {
super(props);
this.state = {
regionList: [],
routeList: [],
impEquiList: [],
type: ''
};
}
componentDidMount() {
const { type } = this.props;
searchRegionListAction().then(d => this.setState({ regionList: d || [], type }));
initView3DLinkAction().then(d => this.setState({ routeList: d || [] , type }));
getImpEquipmentAction().then(d => this.setState({ impEquiList: d || [] , type }));
}
componentWillReceiveProps = (nextProps) => {
const { type } = nextProps;
this.setState({ type });
}
getRiskSourceReander = () => {
const { onFilterChange } = this.props;
return (
<div className="datapane-filter-content">
<Select
className="datapane-filter-item datapane-filter-select"
data={riskSourceLevel}
renderOption={item => <Option className="datapane-select-option" value={item.key}>{item.label}</Option>}
defaultOption={<Option className="datapane-select-option">全部</Option>}
onChange={(e) => onFilterChange('dataLevel', e, SingleQueryEnum.EQUAL)}
/>
</div>
);
}
getRiskReander = () => {
const { onFilterChange } = this.props;
const { routeList } = this.state;
return (
<div className="datapane-filter-content">
<Select
className="datapane-filter-item datapane-filter-select"
data={routeList}
renderOption={item => <Option className="datapane-select-option" value={item.name}>{item.name}</Option>}
defaultOption={<Option className="datapane-select-option">全部路线</Option>}
onChange={(e) => onFilterChange('route', e, SingleQueryEnum.EQUAL)}
/>
<Select
className="datapane-filter-item datapane-filter-select"
data={riskSourceStatus}
renderOption={item => <Option className="datapane-select-option" value={item.key}>{item.label}</Option>}
defaultOption={<Option className="datapane-select-option">全部</Option>}
onChange={(e) => onFilterChange('nodeState', e, SingleQueryEnum.EQUAL)}
/>
</div>
);
}
getFireResourceRender = () => {
const { onFilterChange } = this.props;
return (
<div className="datapane-filter-content">
<Select
className="datapane-filter-item datapane-filter-select"
data={fireResource}
renderOption={item => <Option className="datapane-select-option" value={item.key}>{item.label}</Option>}
defaultOption={<Option className="datapane-select-option">全部</Option>}
onChange={(e) => onFilterChange('fireResource', e, SingleQueryEnum.EQUAL)}
/>
</div>
);
}
getVideoRender = () => {
const { onFilterChange } = this.props;
const { impEquiList } = this.state;
return (
<div className="datapane-filter-content">
<Select
className="datapane-filter-item datapane-filter-select"
data={impEquiList}
renderOption={item => <Option className="datapane-select-option" value={item.name}>{item.name}</Option>}
defaultOption={<Option className="datapane-select-option">全部</Option>}
onChange={(e) => onFilterChange('impEquipment', e, SingleQueryEnum.EQUAL)}
/>
</div>
);
}
getFilterRender = () => {
const { type } = this.state;
if (type === 'riskSource') {
return this.getRiskSourceReander();
} else if (type === 'risk') {
return this.getRiskReander();
} else if (type === 'fireResource') {
return this.getFireResourceRender();
} else if (type === 'monitorEquipment') {
return this.getVideoRender();
} else if (type === 'video') {
return this.getVideoRender();
} else {
return '';
}
}
render() {
return this.getFilterRender();
}
}
export default Filter;
import React, { Component } from 'react';
import imgStatic from './../../../consts/imgStatic';
/**
* 检索条件为空时提示组件
*
* @class SearchWelCome
* @extends {Component}
*/
class SearchWelCome extends Component {
render() {
return (
<div className="search-welcome">
<img className="search-welcome-img" src={imgStatic.datapane.smilingFace} alt="" />
<p className="search-welcome-text" style={{ color: 'grey' }}>HI!您好,我可以帮助您检索您想要的信息!</p>
</div>
);
}
}
export default SearchWelCome;
import React from 'react';
import { Connect } from 'amos-framework';
import {
searchAction
} from './../../../services/3dService';
import DataPaneBasic from './../common/DataPaneBasic';
import DataPaneContent from './../common/DataPaneContent';
import Filter from './Filter';
import PaneItem from './../common/PaneItem';
import SearchWelCome from './SearchWelCome';
import ListPaginate from './../common/ListPaginate';
import { eventTopics, operateTypes } from './../../consts';
import { updateViewData, update3DViewData } from './../../dataProcessor';
import { bizControlsTypes } from './../../conf';
const eventConnect = Connect.eventConnect;
/**
* 检索
* @class Search
* @extends {DataPaneBasic}
*/
@eventConnect
class Search extends DataPaneBasic {
constructor(props) {
super(props);
this.state = {
searchName: 'type',
data: [],
filter: [],
page: 0,
pageSize: 10,
isStart: true
};
}
componentDidMount(){
this.onSearch(0);
}
/**
* 点击检索结果中的一个
*/
onClick = (item) => {
// 更新视图数据
// let views = new Array();
// views.push(item);
// let args = {
// target: views,
// operateType: operateTypes.POINT_SEARCH
// };
// update3DViewData(args);
}
onSearch = (page) => {
const { filter, pageSize, isStart } = this.state;
if (isStart) {
this.setState({ isStart: false });
}
let inputText = '';
let dataLevel = '';
let orgCode = '';
let nodeState = '';
let type = '';
let routeName = '';
let protectObjName = '';
( filter || [] ).forEach((item, i) => {
if (item.name === 'type') {
type = item.value;
} else if (item.name === 'dataLevel') {
dataLevel = item.value;
} else if (item.name === 'nodeState') {
nodeState = item.value;
} else if (item.name === 'inputText'){
inputText = item.value;
} else if (item.name === 'route'){
routeName = item.value;
} else if (item.name === 'impEquipment'){
protectObjName = item.value;
}
});
searchAction(inputText, dataLevel, orgCode, nodeState, protectObjName, routeName, type, page || 0, pageSize).then(d => {
// 填充列表数据
this.listRef.setData(d, this);
});
}
renderItem = (item) => {
if ('riskSource' === item.type) {
return [
{ name: '编号', value: 'code' },
{ name: '名称', value: 'label' },
{ name: '等级', value: 'level' },
{ name: '类别', value: 'typeName' }
];
} else if ('patrol' === item.type) {
return [
{ name: '编号', value: 'code' },
{ name: '名称', value: 'label' },
{ name: '路线', value: 'routeName' },
{ name: '状态', value: 'title' },
{ name: '责任人', value: 'person' },
{ name: '类别', value: 'typeName' }
];
} else if ('monitorEquipment' === item.type) {
return [
{ name: '编号', value: 'code' },
{ name: '名称', value: 'label' },
{ name: '监控对象', value: 'protectObjName' },
{ name: '类别', value: 'typeName' }
];
} else if ('video' === item.type) {
return [
{ name: '编号', value: 'code' },
{ name: '名称', value: 'label' },
{ name: '监控对象', value: 'protectObjName' },
{ name: '类别', value: 'typeName' }
];
} else {
return [
{ name: '编号', value: 'code' },
{ name: '名称', value: 'label' },
{ name: '类别', value: 'typeName' }
];
}
}
render() {
const { searchName, data, pageSize, isStart, filter } = this.state;
let type = '';
( filter || [] ).forEach((item, i) => {
if (item.name === 'type') {
type = item.value;
}
});
return (
<DataPaneContent
onFilterChange={this.onFilterChange}
filter={Filter}
type={type}
dataList={bizControlsTypes}
searchType={'selectAndInput'}
searchName={searchName}
>
{
!isStart ?
<ListPaginate
ref={node => this.listRef = node}
data={data}
pageSize={pageSize}
onChangePage={this.onSearch}
renderItem={e => <PaneItem renderItem={this.renderItem} key={e.id} data={e} onClick={this.onClick} />}
/>
: <SearchWelCome />
}
</DataPaneContent>
);
}
}
export default Search;
import React, { Component } from 'react';
import { shortcutKeys } from './../../conf';
/**
* 设置-快捷键
* @class ShortcutKey
* @extends {Component}
*/
class ShortcutKey extends Component {
constructor(props) {
super(props);
this.state = {
};
}
renderItem = () => {
let res = [];
(shortcutKeys || []).map(e => {
res.push(<tr key={e.category} className="shortcutkey-group"><td colSpan={3}>{e.category}:</td></tr>);
e.keys.map(item => {
res.push(<tr key={e.name} className="shortcutkey-item"><td>{item.name}</td><td>{item.key}</td><td>{item.status}</td></tr>);
})
})
return res;
}
render() {
return (
<div className="datapane-setting-shortcutkey">
<table className="shortcutkey-table">
<tr className="shortcutkey-header"><td>功能</td><td>热键</td><td>状态</td></tr>
{
this.renderItem()
}
</table>
</div>
);
}
}
export default ShortcutKey;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { browserHistory } from 'amos-react-router';
import imgStatic from './../../../consts/imgStatic';
import { CONSTS } from './../../../consts/storageConsts';
import { SecurityUrl } from './../../../consts/urlConsts';
import { tirggerTransTopic } from './../../dataProcessor';
import { getSelectedOrgInfoAction } from './../../../services/securityService';
import { Store } from 'amos-tool';
const lsTool = Store.lsTool;
/**
* 设置-账户设置
* @class UserSetting
* @extends {Component}
*/
class UserSetting extends Component {
static propTypes = {
logout: PropTypes.func,
sweepReducers: PropTypes.func,
write: PropTypes.func,
toStr: PropTypes.func,
isLoginout: PropTypes.bool
};
static propTypes = {
logout(){},
sweepReducers(){},
write(){},
toStr(){}
};
constructor(props) {
super(props);
this.state = {
user: {}
};
}
componentDidMount() {
this.onInit();
this.getSelectedOrgInfo();
}
componentWillReceiveProps(nextProps) {
if (nextProps.isLoginout) {
browserHistory.push('/login');
}
}
getSelectedOrgInfo =()=>{
getSelectedOrgInfoAction().then(data=>{
// const { user } = this.state;
// user.company = data.company;
// user.department = data.department;
this.setState( { user:data } );
});
}
onInit = function() {
//let userInfo = currentUsercurrentUser() || {};
// let userId = (userInfo || {}).userId;
// getCurrentUser().then(data => {
// let userName = data.realName;
// let departmentInfo = {};
// let companyInfo = {};
// this.setState( { user: { nickName: userName, company: companyInfo, department: departmentInfo } } );
// });
}
/**
* 注销
*/
onLogOut = () => {
const { logout, sweepReducers } = this.props;
//const user = currentUser();
tirggerTransTopic(CONSTS.control, { control: { logOut: true } });
logout && logout(SecurityUrl.loginOutUrl);
sweepReducers && sweepReducers();
}
render() {
let { user } = this.state;
// const user = currentUser() || {};
console.log(user);
return (
<div className="datapane-setting-user">
<div className="user-info">
<p>用户名:{user.nickName}</p>
<p>公司:{(user.company || {}).companyName}</p>
<p>部门:{(user.department || {}).departmentName}</p>
{/* <Button onClick={this.onLogOut}>注销</Button> */}
</div>
<div className="user-img">
<img src={imgStatic.datapane.user} alt="" />
{/* <Button>修改图像</Button> */}
</div>
</div>
);
}
}
export default UserSetting;
import React, { Component } from 'react';
import { browserHistory } from 'amos-react-router';
import { Collapse, Scrollbars, Button } from 'amos-framework';
import UserSetting from './UserSetting';
import ShortcutKey from './ShortcutKey';
const Panel = Collapse.Panel;
/**
* 设置
* @class Setting
* @extends {Component}
*/
class Setting extends Component {
constructor(props) {
super(props);
this.state = {
};
}
changeRegion = () => {
browserHistory.push({
pathname: '/region',
state: 'changeRegion'
});
}
render() {
return (
<div className="datapane-setting">
<Scrollbars>
<div className="datapane-setting-content">
<Collapse className="datapane-setting-collapse" activeKey={['1', '2', '3']} onChange={key=>console.log(key)}>
<Panel header="厂区选择" key="1">
<Button className="region-select" onClick={this.changeRegion}>切换厂区</Button>
</Panel>
<Panel header="账户设置" key="2">
<UserSetting />
</Panel>
<Panel header="快捷键" key="3">
<ShortcutKey />
</Panel>
</Collapse>
</div>
</Scrollbars>
</div>
);
}
}
export default Setting;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { SingleQueryEnum } from 'amos-processor/lib/config/queryEnum';
import { Select } from 'amos-framework';
import { DatePicker } from 'amos-antd';
const Option = Select.Option;
/**
* 检索-过滤栏
*
* @class Filter
* @extends {Component}
*/
class Filter extends Component {
static propTypes = {
onFilterChange: PropTypes.func,
personList: PropTypes.array
};
static defaultProps = {
personList: []
};
constructor(props) {
super(props);
this.state = {
};
}
render() {
const { onFilterChange, personList } = this.props;
return (
<div className="datapane-filter-content">
<Select
className="datapane-filter-item datapane-filter-select"
data={personList}
renderOption={item => <Option className="datapane-select-option" value={item.id}>{item.name}</Option>}
defaultOption={<Option className="datapane-select-option">人员</Option>}
onChange={(e) => onFilterChange('userId', e, SingleQueryEnum.EQUAL)}
/>
<DatePicker
className="datapane-filter-item datapane-filter-date"
placeholder="时间"
format="YYYYMMDD"
onChange={(e, s) => onFilterChange('checkDate', s, SingleQueryEnum.EQUAL)}
/>
</div>
);
}
}
export default Filter;
import React from 'react';
import {
trajectoryAction,
trajectoryPersonListAction
} from './../../../services/3dService';
import imgStatic from './../../../consts/imgStatic';
import { Button } from 'amos-framework';
import DataPaneBasic from './../common/DataPaneBasic';
import DataPaneContent from './../common/DataPaneContent';
import Filter from './Filter';
import PaneItem from './../common/PaneItem';
import ListPaginate from './../common/ListPaginate';
/**
* 轨迹
* @class Trajectory
* @extends {DataPaneBasic}
*/
class Trajectory extends DataPaneBasic {
constructor(props) {
super(props);
this.state = {
data: [],
filter: [],
personList: [],
page: 0,
pageSize: 10
};
}
componentDidMount(){
this.onSearch();
trajectoryPersonListAction('user').then(d => this.setState({ personList: (d || {}).users || [] }));
}
/**
* 点击记录中的一个
*/
onClick = (item) => {
window.alert(JSON.stringify(item));
}
onSearch = (page) => {
const { filter, pageSize } = this.state;
trajectoryAction(filter, page || 0, pageSize).then(d => {
this.list.setData(d, this);
});
}
renderItem = (item) => {
return [
{ name: '巡检人', value: 'userName' },
{ name: '时间', value: 'checkTime' },
{ name: '轨迹', value: 'traName', render: () => (
<span className="datapane-prop-value">
{
item.traName
}
<Button className="trajectory-play-btn" onClick={()=>this.onClick(item)}>
<img src={imgStatic.datapane.play} alt="" />
<p>播放</p>
</Button>
</span>
) }
];
}
render() {
const { data, personList, pageSize } = this.state;
return (
<DataPaneContent
onFilterChange={this.onFilterChange}
personList={personList}
filter={Filter}
>
<ListPaginate
ref={node => this.list = node}
data={data}
pageSize={pageSize}
onChangePage={this.onSearch}
renderItem={e => <PaneItem renderItem={this.renderItem} key={e.checkId} data={e} />}
/>
</DataPaneContent>
);
}
}
export default Trajectory;
...@@ -43,7 +43,8 @@ class PointDialog extends Component { ...@@ -43,7 +43,8 @@ class PointDialog extends Component {
onOpenClick = marker => { onOpenClick = marker => {
const { id, type } = marker.extData || {}; const { id, type } = marker.extData || {};
if (type === 'risk') { // if (type === 'risk') {
if (type === 'patrol') {
this.setState( this.setState(
{ {
open: true open: true
......
...@@ -96,7 +96,8 @@ class ControlItem extends Component { ...@@ -96,7 +96,8 @@ class ControlItem extends Component {
renderSubContent = () => { renderSubContent = () => {
const { subs = [], type } = this.props; const { subs = [], type } = this.props;
if (type === 'risk') { // if (type === 'risk') {
if (type === 'patrol') {
return ( return (
<ul> <ul>
{ {
......
...@@ -68,7 +68,7 @@ class SideControl extends Component { ...@@ -68,7 +68,7 @@ class SideControl extends Component {
return ( return (
<SidePane className="side-control-pane" {...animationProps}> <SidePane className="side-control-pane" {...animationProps}>
<BizControlPane controls={_bizControls} isActive={this.isActive} onItemClick={this.onBizItemClick} /> <BizControlPane controls={_bizControls} isActive={this.isActive} onItemClick={this.onBizItemClick} />
<InnateControlPane controls={viewController} layerConfig={layerConfig} /> {/* <InnateControlPane controls={viewController} layerConfig={layerConfig} /> */}
</SidePane> </SidePane>
); );
} }
......
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