Browse Source

fix(): 设备管理页面修改

tags/PMS_Frontend_v1.0.6-develop
fengxiang 2 years ago
parent
commit
e8c437ba07
  1. 226
      src/pages/OutRoadMgm/OutDeviceMgm/OutDevice/index.scss
  2. 56
      src/pages/OutRoadMgm/OutDeviceMgm/OutDevice/loadable.jsx
  3. 135
      src/pages/OutRoadMgm/OutDeviceMgm/OutMonitorMgm/index.scss
  4. 345
      src/pages/OutRoadMgm/OutDeviceMgm/OutMonitorMgm/loadable.jsx
  5. 121
      src/pages/OutRoadMgm/OutDeviceMgm/OutNvrMgm/index.scss
  6. 517
      src/pages/OutRoadMgm/OutDeviceMgm/OutNvrMgm/loadable.jsx
  7. 17
      src/services/OutRoadMgm/OutNVRMgm.js
  8. 2
      src/services/OutRoadMgm/index.js

226
src/pages/OutRoadMgm/OutDeviceMgm/OutDevice/index.scss

@ -195,232 +195,6 @@
}
}
}
.row-pic {
width: 100%;
display: flex;
align-items: center;
justify-content: flex-start;
.ant-image {
margin-right: 3px;
}
}
}
}
}
.full-group {
display: flex;
.ant-select-selector,
.ant-picker,
.ant-input {
border-color: var(--color-search-list-item-bd) !important;
}
.lt-box,
.rt-box {
width: 50%;
padding-right: 10px;
.row-line {
width: 100%;
display: flex;
margin-bottom: 30px;
.r-txt {
min-width: 100px;
text-align: right;
&.required::before {
margin-right: 4px;
color: #f56c6c;
font-family: SimSun, sans-serif;
content: "*";
}
}
.r-con {
flex: 1;
>.row-lg {
width: 100%;
}
>.row-sm {
width: 40%;
}
}
}
}
&.form-group {
.rt-box {
margin-left: 50px;
}
.r-txt {
padding-top: 5px;
}
.pic-box {
border-radius: 6px;
width: 148px;
height: 148px;
background-color: var(--color-container-bg);
border: 1px solid var(--color-search-list-item-bd);
overflow: hidden;
position: relative;
.delete-btn {
position: absolute;
top: 2px;
right: 2px;
font-size: 20px;
color: rgb(245, 76, 76);
display: none;
cursor: pointer;
}
&:hover {
.delete-btn {
display: block;
}
}
}
.upload-btn {
border-radius: 6px;
width: 148px;
height: 148px;
background-color: var(--color-container-bg);
border: 1px dashed var(--color-search-list-item-bd);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
cursor: pointer;
&:hover {
opacity: 0.9;
}
.anticon {
font-size: 28px;
color: #8c939d;
}
>div {
opacity: 0.65;
}
}
.tip-text {
margin-top: 20px;
}
.ant-radio-group {
padding: 5px 0;
}
.row-box+.row-box {
margin-top: 10px;
}
.row-box {
display: flex;
background-color: var(--color-container-bg);
padding: 6px;
width: fit-content;
.r-date {
width: 240px;
}
.r-time {
width: 190px;
margin-left: 10px;
}
.r-tool {
width: 65px;
display: flex;
align-items: center;
padding: 0 10px;
.anticon {
font-size: 18px;
cursor: pointer;
&.anticon-plus-circle {
color: #409eff;
}
&.anticon-minus-circle {
color: red;
margin-left: 10px;
}
}
}
}
}
.ul-list {
width: 300px;
margin: 10px auto 20px;
border: 1px solid var(--color-search-list-item-bd);
li {
width: 100%;
height: 40px;
border-bottom: 1px solid var(--color-search-list-item-bd);
display: flex;
align-items: center;
justify-content: space-between;
>span {
.anticon {
cursor: pointer;
margin-left: 10px;
&.anticon-edit,
&.anticon-plus-circle {
color: rgb(64, 158, 255);
}
&.anticon-minus-circle {
display: none;
color: rgb(245, 108, 108);
}
}
&:nth-last-child(3) {
width: 40px;
text-align: center;
}
&:nth-last-child(2) {
flex: 1;
text-align: center;
@include textEllipsis("one");
}
&:nth-last-child(1) {
width: 60px;
}
}
&:last-child {
border-bottom: unset;
cursor: pointer;
}
&:hover {
>span .anticon-minus-circle {
display: inline-block;
}
}
}
}
}

56
src/pages/OutRoadMgm/OutDeviceMgm/OutDevice/loadable.jsx

@ -25,9 +25,9 @@ function OutDevice() {
const [pageType, setPageType] = useState("1");
//
const defaultData = {
areaId: "", //
operator: "", //
park_name: "", //
area_id: "", //
operator_id: "", //
road_id: "", //
park_type: "", //
is_fail: "", //
};
@ -55,6 +55,7 @@ function OutDevice() {
const [rowData, setRowData] = useState({});
//
const [storeData, setStoreData] = useState([]);
const [roadData, setRoadData] = useState([]);
//
const [areaList, setAreaList] = useState([]);
//
@ -212,10 +213,15 @@ function OutDevice() {
setIsAjax(!isAjax);
};
//
const getStatusText = (val) => {
const obj = statusArr.filter((v, i) => v.value == val);
return obj?.length ? obj[0].label : "-";
const getAllRoad = (id, setData) => {
ajaxCom.getAllRoadByOperatort({ operator_id: id }).then(
(res) => {
setData(res?.data || []);
},
(err) => {
console.log(err);
}
);
};
//
@ -246,6 +252,19 @@ function OutDevice() {
console.log(err);
}
);
//
ajaxCom.getOperator().then(
(res) => {
if (parseInt(res?.status) === 20000) {
setParkList(res?.data || []);
} else {
message.error(res?.message);
}
},
(err) => {
console.log(err);
}
);
};
//
@ -272,8 +291,8 @@ function OutDevice() {
}}
options={areaList || []}
placeholder="全部"
value={formData?.areaId || undefined}
onChange={(e) => setFormData({ ...formData, areaId: e })}
value={formData?.area_id || undefined}
onChange={(e) => setFormData({ ...formData, area_id: e })}
/>
</div>
<div className="form-box">
@ -283,8 +302,15 @@ function OutDevice() {
allowClear
placeholder="全部"
options={storeData || []}
value={formData?.operator || undefined}
onChange={(e) => setFormData({ ...formData, operator: e })}
value={formData?.operator_id || undefined}
onChange={(v) => {
setFormData({ ...formData, operator_id: v, road_id: "" });
if (v) {
getAllRoad(v, setRoadData);
} else {
setRoadData([]);
}
}}
/>
</div>
<div className="form-box">
@ -293,9 +319,11 @@ function OutDevice() {
className="form-con"
allowClear
placeholder="全部"
options={storeData || []}
value={formData?.park_name || undefined}
onChange={(e) => setFormData({ ...formData, park_name: e })}
showSearch
optionFilterProp="label"
options={roadData || []}
value={formData?.road_id || undefined}
onChange={(e) => setFormData({ ...formData, road_id: e })}
/>
</div>
<div className="form-box">

135
src/pages/OutRoadMgm/OutDeviceMgm/OutMonitorMgm/index.scss

@ -184,148 +184,65 @@ $color-primary : var(--color-primary);
}
.fence {
width: 660px !important;
.modal-monitor {
.fenceModal {
.selectSearch {
margin: 10px 0 0 10px;
}
}
.row-line {
width: 100%;
display: flex;
.submitBtn {
text-align: center;
margin-top: 20px;
>.ant-form-item {
width: 50%;
.submit {
width: 80px;
height: 35px;
background: #409eff;
border: none;
border-radius: 4px;
cursor: pointer;
color: #fff;
}
.cancel {
width: 80px;
height: 35px;
background: #fff;
border: none;
border-radius: 4px;
color: #3e4557;
cursor: pointer;
margin-left: 20px;
.ant-form-item-label {
min-width: 110px;
}
}
.attend {
display: flex;
.yisaSearch {
margin-left: 20px;
margin-top: 8px;
label .required::before {
margin-right: 4px;
color: #a61d24;
font-family: SimSun, sans-serif;
content: "*";
}
}
}
.fenceMap {
.berth-container {
>.ant-form-item {
width: 100%;
}
width: 900px !important;
// .ant-form-item-label {
// flex: 0 0 129px !important;
// }
.editFenceMap {
margin-top: 20px;
height: 400px;
.ant-transfer-list-content {
@include scrollBar(#616b83, #bebebe);
}
.attend {
display: flex;
}
.submitBtn {
text-align: center;
margin-top: 20px;
.submit {
width: 80px;
height: 35px;
background: #409eff;
border: none;
border-radius: 4px;
cursor: pointer;
color: #fff;
}
.cancel {
.ant-btn {
width: 80px;
height: 35px;
background: #fff;
border: none;
border-radius: 4px;
color: #3e4557;
cursor: pointer;
margin-left: 20px;
}
}
}
.berth-container {
.ant-form-item-label {
flex: 0 0 129px !important;
span {
color: #ffffff;
}
.ant-transfer-list-content {
@include scrollBar(#616b83, #bebebe);
}
}
.placeModal {
.yisaSearch {
margin-left: 109px;
}
.submitBtn {
text-align: center;
margin-top: 20px;
.submit {
width: 80px;
height: 35px;
background: #409eff;
border: none;
border-radius: 4px;
cursor: pointer;
color: #fff;
}
.cancel {
width: 80px;
height: 35px;
background: #fff;
border: none;
border-radius: 4px;
color: #3e4557;
cursor: pointer;
background: var(--button-default-bg);
margin-left: 20px;
}
}
.tip {
margin: 20px 0 0 100px;
div {
color: #878787;
}
}
}
.action-wrapper {
>button {
margin-right: 2px;
&:last-child {
margin: 0;
}
}
}

345
src/pages/OutRoadMgm/OutDeviceMgm/OutMonitorMgm/loadable.jsx

@ -7,15 +7,12 @@ import {
Table,
message,
Pagination,
Cascader,
Modal,
Dropdown,
Form,
Row,
Col,
Transfer,
} from "antd";
import { pageSizeOptions } from "@/config/character.config.js";
import { dictionary } from "@/config/common";
import moment from "moment";
import "./index.scss";
import { DeleteOutlined } from "@ant-design/icons";
@ -25,15 +22,14 @@ function OutMonitorMgm(props) {
//
const defaultData = {
address: "",
device_code: "",
road_name: "", //
operator: -1, //
device_code: "", //
operator_id: "", //
road_id: "", //
};
//
const [pageInfo, setPageInfo] = useState({
pageNum: 1,
pageSize: 15,
pn: 1,
page_size: 15,
});
//
const [formData, setFormData] = useState(defaultData);
@ -50,15 +46,23 @@ function OutMonitorMgm(props) {
total: 0,
list: [],
});
const [visible, setVisible] = useState(false);
const [storeData, setStoreData] = useState([]); //
const [roadData, setRoadData] = useState([]);
const [nvrData, setNvrData] = useState([]);
const [berthData, setBerthData] = useState([]);
const [berthSelectData, setBerthSelectData] = useState([]);
const [selectedKeys, setSelectedKeys] = useState([]);
const [editModalVisible, setEditModalVisible] = useState(false);
const [editStatus, setEditStatus] = useState(false);
const [storeData, setStoreData] = useState([{ label: "全部", value: -1 }]); //
const [editId, setEditId] = useState("");
const defRowData = {
device_name: "",
nvr_id: "",
device_code: "",
berth_ids: "",
};
//
const [rowData, setRowData] = useState(defRowData);
useEffect(() => {
getNvrList();
@ -81,6 +85,17 @@ function OutMonitorMgm(props) {
);
};
const getAllRoad = (id, setData) => {
ajax.getAllRoadByOperatort({ operator_id: id }).then(
(res) => {
setData(res?.data || []);
},
(err) => {
console.log(err);
}
);
};
//
const getData = () => {
let postData = { ...formData };
@ -110,7 +125,7 @@ function OutMonitorMgm(props) {
//
const handleSearch = () => {
setLoading(true);
setPageInfo({ ...pageInfo, ...{ pageNum: 1 } });
setPageInfo({ ...pageInfo, ...{ pn: 1 } });
setHoldData(formData);
setIsAjax(!isAjax);
};
@ -121,15 +136,17 @@ function OutMonitorMgm(props) {
// position: ["bottomCenter"],
showQuickJumper: true,
showSizeChanger: true,
current: pageInfo.pageNum,
current: pageInfo.pn,
total: resultData?.total,
// showTotal: () => ` ${resultData.total || 0} `,
pageSize: pageInfo.pageSize,
pageSizeOptions: Array.from(new Set([...[15], ...(pageSizeOptions || [])])),
pageSize: pageInfo.page_size,
pageSizeOptions: Array.from(
new Set([...[15], ...(dictionary?.pageSizeOptions || [])])
),
onChange: (current, size) => {
setPageInfo({
...pageInfo,
...{ pageNum: pageInfo.pageSize == size ? current : 1, pageSize: size },
...{ pn: pageInfo.page_size == size ? current : 1, page_size: size },
});
setIsAjax(!isAjax);
},
@ -138,28 +155,31 @@ function OutMonitorMgm(props) {
const handlePlay = (item) => {
message.error(`播放数据暂未对接`);
};
const handleDel = (item) => {
Modal.confirm({
title: "确认删除?",
content: `是否确认删除监控设备:${item.device_name}`,
icon: <DeleteOutlined />,
onOk: () => {
handleDelToServer(item.id)
.then((msg) => {
message.success(msg || "删除成功");
})
.catch((err) => {
message.error(err);
});
handleDelToServer(item.id);
},
});
};
const getNvrList = () => {
ajax.getAllNvrList().then((e) => {
if (e.status == 20000) {
setNvrData(e.data);
ajax.getAllNvrList().then(
(res) => {
if (res.status == 20000) {
setNvrData(res?.data || []);
} else {
message.error(res.message);
}
});
},
(err) => {
console.log(err);
message.error("服务器异常");
}
);
};
const getBerthDataByNvr = (nvr) => {
ajax
@ -167,50 +187,61 @@ function OutMonitorMgm(props) {
Object.assign(
{},
{ nvr_id: nvr },
editStatus ? {} : { is_bind_monitor_device: 1 }
rowData?.id ? {} : { is_bind_monitor_device: 1 }
)
)
.then((e) => {
if (e.status == 20000) {
.then(
(res) => {
if (res?.status == 20000) {
const newData = res?.data || [];
if (newData?.length) {
setBerthData(
e.data.map((item) => ({ key: item.value, title: item.label }))
newData.map((item) => ({ key: item.value, title: item.label }))
);
} else {
setBerthData([]);
}
});
} else {
message.error(res.message);
}
},
(err) => {
console.log(err);
message.error("服务器异常");
}
);
};
const handleDelToServer = (id) => {
return new Promise((resolved, rejected) => {
ajax
.monitorDel({ id: id })
.then((e) => {
if (e.status == 20000) {
resolved(e.message);
ajax.monitorDel({ id: id }).then(
(res) => {
if (res.status == 20000) {
message.success(res.message || "删除成功");
} else {
message.error(res.message);
}
})
.catch((err) => {
rejected(err);
});
});
},
(err) => {
console.log(err);
message.error("服务器异常");
}
);
};
const handleEdit = (item) => {
setEditStatus(true);
form.setFieldsValue({
...item,
});
setEditId(item.id);
setRowData(item);
form.setFieldsValue(item);
getBerthDataByNvr(item.nvr_id);
setBerthSelectData(
item.berth_ids ? item.berth_ids.split(",").map((v) => Number(v)) : []
item?.berth_ids ? item.berth_ids.split(",").map((v) => Number(v)) : []
);
setEditModalVisible(true);
setVisible(true);
};
const editModalCancel = () => {
setEditModalVisible(false);
form.resetFields();
//
const onCancel = () => {
setVisible(false);
};
const onTransferChange = (nextTargetKeys, direction, moveKeys) => {
setBerthSelectData(nextTargetKeys);
form.setFieldValue("berth_ids", nextTargetKeys.join(","));
setRowData({ ...rowData, berth_ids: nextTargetKeys.join(",") });
};
const onTransferSelectChange = (sourceSelectedKeys, targetSelectedKeys) => {
setSelectedKeys([...sourceSelectedKeys, ...targetSelectedKeys]);
@ -230,7 +261,7 @@ function OutMonitorMgm(props) {
width: 60,
align: "center",
render: (val, row, index) => {
return <>{index + 1 + pageInfo.pageSize * (pageInfo.pageNum - 1)}</>;
return <>{index + 1 + pageInfo.page_size * (pageInfo.pn - 1)}</>;
},
},
{
@ -290,7 +321,7 @@ function OutMonitorMgm(props) {
//
const clickDropDown = (param, record) => {
// console.log(param.key, record);
// setRowData(record);
setRowData(record);
if (param.key == "1") {
//
handlePlay(record);
@ -303,59 +334,60 @@ function OutMonitorMgm(props) {
}
};
const handleEditFinish = () => {
console.log("form finish");
};
const monitorEdit = (params) => {
return new Promise((resolved, rejected) => {
ajax
.monitorEdit(params)
.then((e) => {
if (e.status == 20000) {
resolved(e.message);
//
const handleForm = async (changedValues, allValues) => {
// console.log(changedValues, allValues);
let obj = {};
let key = Object.keys(changedValues)[0];
let val = Object.values(changedValues)[0];
switch (key) {
case "nvr_id":
obj[key] = val;
getBerthDataByNvr(val);
break;
default:
obj[key] = val;
break;
}
})
.catch((err) => {
rejected(err);
});
});
form.setFieldsValue({ ...allValues, ...obj });
};
const monitorAdd = (params) => {
return new Promise((resolved, rejected) => {
ajax
.monitorAdd(params)
.then((e) => {
if (e.status == 20000) {
resolved(e.message);
//
const onFinish = (values) => {
// console.log(values);
if (!rowData?.berth_ids) {
message.error("请选择泊位");
return;
}
})
.catch((err) => {
rejected(err);
});
});
ajax[values?.id ? "monitorEdit" : "monitorAdd"]({
...values,
berth_ids: rowData?.berth_ids,
}).then(
(res) => {
if (res?.status == 20000) {
message.success(res.message);
// setPageInfo({ ...pageInfo, ...{ pn: 1 } });
setVisible(false);
setIsAjax(!isAjax);
} else {
message.error(res.message);
}
},
(err) => {
console.log(err);
}
);
};
//
const handleAdd = () => {
setEditStatus(false);
form.resetFields();
setRowData(defRowData);
form.setFieldsValue(defRowData);
setSelectedKeys([]);
setBerthSelectData([]);
setEditModalVisible(true);
};
const handleSubmit = () => {
if (editStatus) {
//
monitorEdit({ ...form.getFieldsValue(), id: editId }).then((msg) => {
message.success(msg || "监控设备更新成功");
setEditModalVisible(false);
getData();
});
} else {
//
monitorAdd(form.getFieldsValue()).then((msg) => {
message.success(msg || "监控设备添加成功");
setEditModalVisible(false);
getData();
});
}
// form.resetFields();
setVisible(true);
};
return (
@ -380,9 +412,17 @@ function OutMonitorMgm(props) {
<Select
className="form-con"
placeholder="请选择"
allowClear
options={storeData || []}
value={formData.operator}
onChange={(e) => setFormData({ ...formData, operator: e })}
value={formData.operator_id || undefined}
onChange={(v) => {
setFormData({ ...formData, operator_id: v, road_id: "" });
if (v) {
getAllRoad(v, setRoadData);
} else {
setRoadData([]);
}
}}
/>
</div>
<div className="yisa-search">
@ -390,9 +430,12 @@ function OutMonitorMgm(props) {
<Select
className="form-con"
placeholder="请选择"
options={storeData || []}
value={formData.road_name}
onChange={(e) => setFormData({ ...formData, road_name: e })}
allowClear
showSearch
optionFilterProp="label"
options={roadData || []}
value={formData.road_id || undefined}
onChange={(v) => setFormData({ ...formData, road_id: v })}
/>
</div>
<div className="form-btn">
@ -418,9 +461,7 @@ function OutMonitorMgm(props) {
<div className="row-head">
<span className="number-wrapper">
<span className="letter">共查询到</span>
<span className="total-number">
{resultData.total_records || 0}{" "}
</span>
<span className="total-number">{resultData.total || 0} </span>
<span className="letter">条结果</span>
</span>
<div>
@ -450,22 +491,24 @@ function OutMonitorMgm(props) {
</div>
</div>
<Modal
open={editModalVisible}
onCancel={editModalCancel}
open={visible}
width={720}
onCancel={onCancel}
footer={null}
className="fence"
title={editStatus ? "监控设备编辑" : "新增监控设备"}
className="modal-monitor"
title={rowData?.id ? "编辑监控设备" : "新增监控设备"}
>
<div className="fenceModal">
<div className="form-container">
<Form
form={form}
labelCol={{ span: 10 }}
name="edit-form"
onFinish={handleEditFinish}
initialValues={rowData}
onValuesChange={handleForm}
onFinish={onFinish}
>
<Row>
<Col span={12}>
<Form.Item name="id" hidden>
<Input />
</Form.Item>
<div className="row-line">
<Form.Item
label={"设备名称"}
name={"device_name"}
@ -473,40 +516,25 @@ function OutMonitorMgm(props) {
>
<Input />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label={"所属NVR"}
name={"nvr_id"}
rules={[{ required: true, message: "所属NVR不能为空" }]}
>
<Select
placeholder="请选择"
value={form.nvr_id}
options={nvrData}
onChange={(v) => getBerthDataByNvr(v)}
/>
<Select placeholder="请选择" allowClear options={nvrData} />
</Form.Item>
</Col>
</Row>
<Row>
<Col span={12}>
</div>
<div className="row-line">
<Form.Item
label={"设备号"}
name={"device_code"}
rules={[{ required: true, message: "设备号不能为空" }]}
>
<Input></Input>
<Input autoComplete="off" />
</Form.Item>
</Col>
</Row>
<Row>
<Col span={24} className="berth-container">
<Form.Item
label={"泊位"}
name={"berth_ids"}
rules={[{ required: true, message: "" }]}
>
</div>
<div className="row-line berth-container">
<Form.Item label={<span className="required">泊位</span>}>
<Transfer
dataSource={berthData}
titles={["未选择", "已选择"]}
@ -517,27 +545,16 @@ function OutMonitorMgm(props) {
render={(item) => item.title}
/>
</Form.Item>
</Col>
</Row>
</Form>
</div>
<div className="submitBtn">
<button
type="primary"
className="submit"
onClick={() => handleSubmit()}
>
<Form.Item className="submitBtn">
<Button type="primary" className="submit" htmlType="submit">
确定
</button>
<button
type="primary"
className="cancel"
onClick={() => editModalCancel()}
>
</Button>
<Button className="cancel" onClick={onCancel}>
取消
</button>
</div>
</Button>
</Form.Item>
</Form>
</div>
</Modal>
</div>

121
src/pages/OutRoadMgm/OutDeviceMgm/OutNvrMgm/index.scss

@ -185,138 +185,51 @@ $color-primary : var(--color-primary);
}
.fence {
width: 660px !important;
.modal-nvr {
.fenceModal {
.selectSearch {
margin: 10px 0 0 10px;
}
}
.submitBtn {
text-align: center;
margin-top: 20px;
.submit {
width: 80px;
height: 35px;
background: #409eff;
border: none;
border-radius: 4px;
cursor: pointer;
color: #fff;
}
.cancel {
width: 80px;
height: 35px;
background: #fff;
border: none;
border-radius: 4px;
color: #3e4557;
cursor: pointer;
margin-left: 20px;
}
}
.attend {
.row-line {
width: 100%;
display: flex;
.yisaSearch {
margin-left: 20px;
margin-top: 8px;
>.ant-form-item {
width: 50%;
.ant-form-item-label {
min-width: 110px;
}
}
}
.fenceMap {
width: 900px !important;
.editFenceMap {
margin-top: 20px;
height: 400px;
label .required::before {
margin-right: 4px;
color: #a61d24;
font-family: SimSun, sans-serif;
content: "*";
}
.attend {
display: flex;
}
.submitBtn {
text-align: center;
margin-top: 20px;
.submit {
.ant-btn {
width: 80px;
height: 35px;
background: #409eff;
border: none;
border-radius: 4px;
cursor: pointer;
color: #fff;
}
.cancel {
width: 80px;
height: 35px;
background: #fff;
border: none;
border-radius: 4px;
color: #3e4557;
cursor: pointer;
margin-left: 20px;
}
span {
color: #ffffff;
}
}
.placeModal {
.yisaSearch {
margin-left: 109px;
}
.submitBtn {
text-align: center;
margin-top: 20px;
.submit {
width: 80px;
height: 35px;
background: #409eff;
border: none;
border-radius: 4px;
cursor: pointer;
color: #fff;
}
.cancel {
width: 80px;
height: 35px;
background: #fff;
border: none;
border-radius: 4px;
color: #3e4557;
cursor: pointer;
background: var(--button-default-bg);
margin-left: 20px;
}
}
.tip {
margin: 20px 0 0 100px;
div {
color: #878787;
}
}
}
.action-wrapper {
>button {
margin-right: 2px;
&:last-child {
margin: 0;
}
}
}

517
src/pages/OutRoadMgm/OutDeviceMgm/OutNvrMgm/loadable.jsx

@ -7,14 +7,11 @@ import {
Table,
message,
Pagination,
Cascader,
Modal,
Dropdown,
Form,
Row,
Col,
} from "antd";
import { pageSizeOptions } from "@/config/character.config.js";
import { dictionary } from "@/config/common";
import moment from "moment";
import "./index.scss";
import { DeleteOutlined } from "@ant-design/icons";
@ -24,15 +21,14 @@ function OutNvrMgm(props) {
//
const defaultData = {
address: "",
device_name: "",
road_name: "", //
operator: -1, //
name: "", //
operator_id: "", //
road_id: "", //
};
//
const [pageInfo, setPageInfo] = useState({
pageNum: 1,
pageSize: 15,
pn: 1,
page_size: 15,
});
//
const [formData, setFormData] = useState(defaultData);
@ -50,32 +46,30 @@ function OutNvrMgm(props) {
list: [],
});
const roadSelectRef = useRef();
const [editModalVisible, setEditModalVisible] = useState(false);
const [editStatus, setEditStatus] = useState(false);
const [storeData, setStoreData] = useState([{ label: "全部", value: -1 }]); //
const [visible, setVisible] = useState(false);
const [storeData, setStoreData] = useState([]); //
const [roadData, setRoadData] = useState([]);
const [deviceTypeData, setDeviceTypeData] = useState([]);
const [roadData1, setRoadData1] = useState([]);
const [formSubmitData, setFormSubmitData] = useState({
const defRowData = {
address: "",
create_time: "",
device_name: "",
name: "",
operator_id: "",
road_id: "",
ip_address: "",
network_mode: "",
operator: "",
id: "",
password: "",
port: "",
road_name: "",
type: "",
user_name: "",
video_port: "",
});
network_mode: "",
user_name: "",
password: "",
lng_lat: "",
address: "",
};
//
const [rowData, setRowData] = useState(defRowData);
useEffect(() => {
getSelectList();
getDeviceType();
}, []);
// 访
@ -86,7 +80,7 @@ function OutNvrMgm(props) {
const getSelectList = () => {
ajax.getOperator().then(
(res) => {
setStoreData([...storeData, ...res.data]);
setStoreData(res?.data || []);
},
(err) => {
console.log(err);
@ -94,6 +88,31 @@ function OutNvrMgm(props) {
);
};
const getAllRoad = (id, setData) => {
ajax.getAllRoadByOperatort({ operator_id: id }).then(
(res) => {
setData(res?.data || []);
},
(err) => {
console.log(err);
}
);
};
//
async function getRoadInfo(id, callback) {
await ajax.getOrpRoadInfo({ id }).then(
(res) => {
// console.log(res?.data);
callback(res?.data || {});
},
(err) => {
console.log(err);
callback({});
}
);
}
//
const getData = () => {
let postData = { ...formData };
@ -102,7 +121,7 @@ function OutNvrMgm(props) {
}
// console.log(postData);
setTabLoading(true);
ajax.getNVRListData({ ...postData, ...pageInfo }).then(
ajax.getOutNvrList({ ...postData, ...pageInfo }).then(
(res) => {
if (parseInt(res?.status) === 20000) {
setResultData(res?.data || {});
@ -123,7 +142,7 @@ function OutNvrMgm(props) {
//
const handleSearch = () => {
setLoading(true);
setPageInfo({ ...pageInfo, ...{ pageNum: 1 } });
setPageInfo({ ...pageInfo, ...{ pn: 1 } });
setHoldData(formData);
setIsAjax(!isAjax);
};
@ -134,15 +153,17 @@ function OutNvrMgm(props) {
// position: ["bottomCenter"],
showQuickJumper: true,
showSizeChanger: true,
current: pageInfo.pageNum,
current: pageInfo.pn,
total: resultData?.total,
// showTotal: () => ` ${resultData.total || 0} `,
pageSize: pageInfo.pageSize,
pageSizeOptions: Array.from(new Set([...[15], ...(pageSizeOptions || [])])),
pageSize: pageInfo.page_size,
pageSizeOptions: Array.from(
new Set([...[15], ...(dictionary?.pageSizeOptions || [])])
),
onChange: (current, size) => {
setPageInfo({
...pageInfo,
...{ pageNum: pageInfo.pageSize == size ? current : 1, pageSize: size },
...{ pn: pageInfo.page_size == size ? current : 1, page_size: size },
});
setIsAjax(!isAjax);
},
@ -155,60 +176,40 @@ function OutNvrMgm(props) {
const handleDel = (item) => {
Modal.confirm({
title: "确认删除?",
content: `是否确认删除设备:${item.device_name}`,
content: `是否确认删除设备:${item.name}`,
icon: <DeleteOutlined />,
onOk: () => {
handleDelToServer(item.id)
.then((msg) => {
message.success(msg || "删除成功");
})
.catch((err) => {
message.error(err);
});
handleDelToServer(item.id);
},
});
};
const getRoadById = (id) => {
return new Promise((resolved, rejected) => {
ajax
.getAllRoad({ operator_id: id })
.then((e) => {
if (e.status == 20000) {
resolved(e.data);
}
})
.catch((err) => {
console.error(err);
rejected(err);
});
});
};
const handleDelToServer = (id) => {
return new Promise((resolved, rejected) => {
ajax
.nvrDel({ id: id })
.then((e) => {
if (e.status == 20000) {
resolved(e.message);
ajax.nvrDel({ id: id }).then(
(res) => {
if (res.status == 20000) {
message.success(res.message || "删除成功");
} else {
message.error(res.message);
}
})
.catch((err) => {
rejected(err);
});
});
},
(err) => {
console.log(err);
message.error("服务器异常");
}
);
};
//
const handleEdit = (item) => {
setEditStatus(true);
form.setFieldsValue({
...item,
});
setEditModalVisible(true);
setRowData(item);
form.setFieldsValue(item);
setVisible(true);
};
const editModalCancel = () => {
setEditModalVisible(false);
form.resetFields();
//
const onCancel = () => {
setVisible(false);
};
// -
@ -224,22 +225,22 @@ function OutNvrMgm(props) {
width: 60,
align: "center",
render: (val, row, index) => {
return <>{index + 1 + pageInfo.pageSize * (pageInfo.pageNum - 1)}</>;
return <>{index + 1 + pageInfo.page_size * (pageInfo.pn - 1)}</>;
},
},
{
title: "设备名称",
dataIndex: "device_name",
dataIndex: "name",
align: "center",
},
{
title: "区域",
dataIndex: "road_name",
dataIndex: "area_name",
align: "center",
},
{
title: "所属车场",
dataIndex: "operqator",
dataIndex: "road_name",
align: "center",
},
{
@ -270,7 +271,7 @@ function OutNvrMgm(props) {
},
{
title: "更新时间",
dataIndex: "create_time",
dataIndex: "update_time",
align: "center",
width: 110,
},
@ -313,93 +314,71 @@ function OutNvrMgm(props) {
}
};
const getDeviceType = () => {
ajax.getDeviceTypeList().then((e) => {
setDeviceTypeData([...deviceTypeData, ...e.data]);
});
};
const handleEditFinish = () => {
console.log("form finish");
};
const nvrUpdate = (params) => {
return new Promise((resolved, rejected) => {
ajax
.nvrUpdate(params)
.then((e) => {
if (e.status == 20000) {
resolved(e.message);
//
const handleForm = async (changedValues, allValues) => {
// console.log(changedValues, allValues);
let obj = {};
let key = Object.keys(changedValues)[0];
let val = Object.values(changedValues)[0];
switch (key) {
case "operator_id":
obj[key] = val;
obj["road_id"] = "";
obj["lng_lat"] = "";
obj["address"] = "";
if (val) {
getAllRoad(val, setRoadData1);
} else {
setRoadData1([]);
}
})
.catch((err) => {
rejected(err);
break;
case "road_id":
obj[key] = val;
if (val) {
await getRoadInfo(val, (e) => {
obj["lng_lat"] = e?.lng_lat || "";
obj["address"] = e?.address || "";
});
});
};
const nvrAdd = (params) => {
return new Promise((resolved, rejected) => {
ajax
.nvrAdd(params)
.then((e) => {
if (e.status == 20000) {
resolved(e.message);
} else {
obj["lng_lat"] = "";
obj["address"] = "";
}
})
.catch((err) => {
rejected(err);
});
});
};
break;
const handleAdd = () => {
setEditStatus(false);
form.resetFields();
setEditModalVisible(true);
};
const handleRoadChange = (v) => {
ajax.getRoadInfo({ road_id: v }).then((e) => {
if (e.status == 20000) {
form.setFieldValue("address", e.data.address);
form.setFieldValue("lng_lat", e.data.lng_lat);
default:
obj[key] = val;
break;
}
});
};
const handleOperaChange = (id) => {
// let roadSelect = document.querySelectorAll('.fenceModal .road-selector .ant-select-selection-item')
// if (roadSelect.length) {
// roadSelect[0].innerText = ''
// }
setFormSubmitData({
...formSubmitData,
road_name: undefined,
});
form.setFieldValue("road_name", "");
getRoadById(id).then((data) => {
setRoadData(data);
});
form.setFieldsValue({ ...allValues, ...obj });
};
const handleSubmit = () => {
if (editStatus) {
//
nvrUpdate(form.getFieldsValue()).then((msg) => {
message.success(msg || "设备更新成功");
setEditModalVisible(false);
getData();
});
//
const onFinish = (values) => {
// console.log(values);
ajax[values?.id ? "doEditOutNvr" : "doAddOutNvr"](values).then(
(res) => {
if (res?.status == 20000) {
message.success(res.message);
// setPageInfo({ ...pageInfo, ...{ pn: 1 } });
setVisible(false);
setIsAjax(!isAjax);
} else {
//
nvrAdd(form.getFieldsValue()).then((msg) => {
message.success(msg || "设备添加成功");
setEditModalVisible(false);
getData();
});
message.error(res.message);
}
},
(err) => {
console.log(err);
}
);
};
//
const handleAdd = () => {
setRowData(defRowData);
form.setFieldsValue(defRowData);
// form.resetFields();
setVisible(true);
};
return (
<>
<div className="out-nvr-mgm">
@ -411,9 +390,9 @@ function OutNvrMgm(props) {
<Input
className="form-con"
placeholder="请输入设备名称"
value={formData.device_name}
value={formData.name}
onChange={(e) =>
setFormData({ ...formData, device_name: e.target.value })
setFormData({ ...formData, name: e.target.value })
}
/>
</div>
@ -422,9 +401,17 @@ function OutNvrMgm(props) {
<Select
className="form-con"
placeholder="请选择"
allowClear
options={storeData || []}
value={formData.operator}
onChange={(v) => setFormData({ ...formData, operator: v })}
value={formData.operator_id || undefined}
onChange={(v) => {
setFormData({ ...formData, operator_id: v, road_id: "" });
if (v) {
getAllRoad(v, setRoadData);
} else {
setRoadData([]);
}
}}
/>
</div>
<div className="yisa-search">
@ -432,9 +419,12 @@ function OutNvrMgm(props) {
<Select
className="form-con"
placeholder="请选择"
options={storeData || []}
value={formData.road_name}
onChange={(v) => setFormData({ ...formData, road_name: v })}
allowClear
showSearch
optionFilterProp="label"
options={roadData || []}
value={formData.road_id || undefined}
onChange={(v) => setFormData({ ...formData, road_id: v })}
/>
</div>
<div className="form-btn">
@ -460,9 +450,7 @@ function OutNvrMgm(props) {
<div className="row-head">
<span className="number-wrapper">
<span className="letter">共查询到</span>
<span className="total-number">
{resultData.total_records || 0}{" "}
</span>
<span className="total-number">{resultData.total || 0} </span>
<span className="letter">条结果</span>
</span>
<div>
@ -492,208 +480,117 @@ function OutNvrMgm(props) {
</div>
</div>
<Modal
open={editModalVisible}
onCancel={editModalCancel}
open={visible}
width={720}
onCancel={onCancel}
footer={null}
className="fence"
title={editStatus ? "设备编辑" : "新增设备"}
className="modal-nvr"
title={rowData?.id ? "编辑设备" : "新增设备"}
>
<div className="fenceModal">
<div className="form-container">
<Form
form={form}
labelCol={{ span: 10 }}
name="edit-form"
onFinish={handleEditFinish}
>
<Row>
<Col span={12}>
<Form.Item
label={"设备名称"}
name={"device_name"}
rules={[{ required: true, message: "设备名称不能为空" }]}
initialValues={rowData}
onValuesChange={handleForm}
onFinish={onFinish}
>
<Form.Item name="id" hidden>
<Input />
</Form.Item>
</Col>
<Col span={12}>
{/* <Form.Item
label={"所属商户"}
name={"operator"}
rules={[{ required: true, message: '所属商户不能为空' }]}
>
<Input/>
</Form.Item> */}
<div className="row-line">
<Form.Item
label={"设备类型"}
name={"id"}
rules={[{ required: true, message: "设备类型不能为空" }]}
label={"设备名称"}
name={"name"}
rules={[{ required: true, message: "设备名称不能为空" }]}
>
<Select
ref={roadSelectRef}
placeholder="请选择"
value={form.device_id}
onChange={(v) => console.log(v)}
options={deviceTypeData}
/>
<Input autoComplete="off" />
</Form.Item>
</Col>
</Row>
<Row>
<Col span={12}>
{/* <Form.Item
label={"所属路段"}
name={"road_name"}
rules={[{ required: true, message: '所属路段不能为空' }]}
>
<Input/>
</Form.Item> */}
<Form.Item
label={"所属商户"}
name={"operator_id"}
rules={[{ required: true, message: "所属商户不能为空" }]}
>
<Select
placeholder="请选择"
value={form.operator_id}
onChange={handleOperaChange}
options={storeData.filter(
(item) => item.label != "全部"
)}
/>
<Select placeholder="请选择" options={storeData} />
</Form.Item>
</Col>
<Col span={12}>
</div>
<div className="row-line">
<Form.Item
label={"所属路段"}
name={"road_name"}
rules={[{ required: true, message: "所属路段不能为空" }]}
label={"所属车场"}
name={"road_id"}
rules={[{ required: true, message: "所属商户不能为空" }]}
>
<Select
ref={roadSelectRef}
placeholder="请选择"
className="road-selector"
value={form.road_name}
onChange={handleRoadChange}
options={roadData}
showSearch
optionFilterProp="label"
options={roadData1}
/>
</Form.Item>
</Col>
</Row>
<Row>
<Col span={12}>
<Form.Item
label={"经纬度"}
label={<span className="required">经纬度</span>}
name={"lng_lat"}
rules={[{ required: true, message: "经纬度不能为空" }]}
>
<Input disabled />
</Form.Item>
</Col>
<Col span={12}>
</div>
<div className="row-line">
<Form.Item
label={"地址"}
label={<span className="required">地址</span>}
name={"address"}
rules={[{ required: true, message: "地址不能为空" }]}
>
<Input disabled />
</Form.Item>
</Col>
</Row>
<Row>
<Col span={12}>
<Form.Item
label={"网络模式"}
name={"network_mode"}
rules={[{ required: true, message: "网络模式不能为空" }]}
>
<Select
placeholder="请选择"
value={form.network_mode}
options={[
{
value: "固网",
label: "固网",
},
{
value: "无线网络",
label: "无线网络",
},
]}
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label={"视频端口号"}
name={"video_port"}
rules={[
{ required: true, message: "视频端口号不能为空" },
]}
>
<Input />
</Form.Item>
</Col>
</Row>
<Row>
<Col span={12}>
<Form.Item
label={"IP地址"}
name={"ip_address"}
rules={[{ required: true, message: "ip地址不能为空" }]}
>
<Input />
<Input autoComplete="off" />
</Form.Item>
</Col>
<Col span={12}>
</div>
<div className="row-line">
<Form.Item
label={"端口号"}
name={"port"}
rules={[{ required: true, message: "端口号不能为空" }]}
>
<Input />
<Input autoComplete="off" />
</Form.Item>
<Form.Item
label={"视频端口号"}
name={"video_port"}
rules={[{ required: true, message: "视频端口号不能为空" }]}
>
<Input autoComplete="off" />
</Form.Item>
</Col>
</Row>
<Row>
<Col span={12}>
</div>
<div className="row-line">
<Form.Item
label={"用户名"}
name={"user_name"}
rules={[{ required: true, message: "用户名不能为空" }]}
>
<Input />
<Input autoComplete="off" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label={"密码"}
name={"password"}
rules={[{ required: true, message: "密码不能为空" }]}
>
<Input />
<Input autoComplete="off" />
</Form.Item>
</Col>
</Row>
</Form>
</div>
<div className="submitBtn">
<button
type="primary"
className="submit"
onClick={() => handleSubmit()}
>
<Form.Item className="submitBtn">
<Button type="primary" className="submit" htmlType="submit">
确定
</button>
<button
type="primary"
className="cancel"
onClick={() => editModalCancel()}
>
</Button>
<Button className="cancel" onClick={onCancel}>
取消
</button>
</div>
</Button>
</Form.Item>
</Form>
</div>
</Modal>
</div>

17
src/services/OutRoadMgm/OutNVRMgm.js

@ -0,0 +1,17 @@
import ajax from "@/config/ajax";
// --NVR管理--
export default {
// 获取商户对应的所有的路段
getAllRoadByOperatort: (data) =>
ajax({
url: "/api/orp/road/get_all_road_by_operator",
type: "post",
data,
}),
// 列表
getOutNvrList: (data) =>
ajax({ url: "/api/orp/nvr/nvr_list", type: "post", data }),
// 新增
doAddOutNvr: (data) =>
ajax({ url: "/api/orp/nvr/add_nvr", type: "post", data }),
};

2
src/services/OutRoadMgm/index.js

@ -1,8 +1,10 @@
import OutSegment from "./OutSegment";
import ZombieCarMgm from "./ZombieCarMgm";
import OutParkingRecordInquiry from "./OutParkingRecordInquiry";
import OutNVRMgm from "./OutNVRMgm";
export default {
...OutSegment,
...ZombieCarMgm,
...OutParkingRecordInquiry,
...OutNVRMgm,
};
Loading…
Cancel
Save