Browse Source

feat: 业务配置相关四个页面, 运营中心应用配置两个页面

tags/PMS_Frontend_v1.0.6-develop
chenglb 1 year ago
parent
commit
ef056a5e3a
  1. 305
      src/assets/fonts/font_pda/demo_index.html
  2. 54
      src/assets/fonts/font_pda/iconfont.css
  3. 2
      src/assets/fonts/font_pda/iconfont.js
  4. 84
      src/assets/fonts/font_pda/iconfont.json
  5. BIN
      src/assets/fonts/font_pda/iconfont.ttf
  6. BIN
      src/assets/fonts/font_pda/iconfont.woff
  7. BIN
      src/assets/fonts/font_pda/iconfont.woff2
  8. 37
      src/pages/InRoadMgm/InRoadOverview/loadable.jsx
  9. 6
      src/pages/OperationCenter/AppMgm/MobileDeviceMgm/index.jsx
  10. 27
      src/pages/OperationCenter/AppMgm/MobileDeviceMgm/index.scss
  11. 61
      src/pages/OperationCenter/AppMgm/MobileDeviceMgm/loadable.jsx
  12. 101
      src/pages/OperationCenter/AppMgm/WechatMenuMgm/index.scss
  13. 356
      src/pages/OperationCenter/AppMgm/WechatMenuMgm/loadable.jsx
  14. 7
      src/pages/OperationCenter/AppMgm/index.jsx
  15. 15
      src/pages/OperationCenter/OperationSales/CouponMgm/CouponRules/loadable.jsx
  16. 35
      src/pages/OutRoadMgm/OutRoadOverview/loadable.jsx
  17. 25
      src/pages/SystemMgm/BusinessConfig/HotCbdConf/index.scss
  18. 254
      src/pages/SystemMgm/BusinessConfig/HotCbdConf/loadable.jsx
  19. 11
      src/pages/SystemMgm/BusinessConfig/PageConf/index.scss
  20. 8
      src/pages/SystemMgm/BusinessConfig/PageConf/loadable.jsx
  21. 7
      src/pages/SystemMgm/BusinessConfig/PdaArrearConf/loadable.jsx
  22. 97
      src/pages/SystemMgm/BusinessConfig/VacationConf/loadable.jsx
  23. 12
      src/router/router.config.js
  24. 43
      src/services/OperationCenter/AppMgm/index.js
  25. 4
      src/services/OperationCenter/index.js
  26. 14
      src/services/SystemMgm/BusinessConf/index.js

305
src/assets/fonts/font_pda/demo_index.html
File diff suppressed because it is too large
View File

54
src/assets/fonts/font_pda/iconfont.css
File diff suppressed because it is too large
View File

2
src/assets/fonts/font_pda/iconfont.js
File diff suppressed because it is too large
View File

84
src/assets/fonts/font_pda/iconfont.json

@ -6,6 +6,90 @@
"description": "", "description": "",
"glyphs": [ "glyphs": [
{ {
"icon_id": "577357",
"name": "删除",
"font_class": "shanchu",
"unicode": "e74b",
"unicode_decimal": 59211
},
{
"icon_id": "788021",
"name": "删除",
"font_class": "shanchu1",
"unicode": "e643",
"unicode_decimal": 58947
},
{
"icon_id": "781786",
"name": "信号-01",
"font_class": "xinhao01",
"unicode": "e71f",
"unicode_decimal": 59167
},
{
"icon_id": "1256479",
"name": "信号",
"font_class": "xinhao",
"unicode": "e60a",
"unicode_decimal": 58890
},
{
"icon_id": "3734442",
"name": "46键盘",
"font_class": "jianpan1",
"unicode": "e633",
"unicode_decimal": 58931
},
{
"icon_id": "3930491",
"name": "键盘",
"font_class": "jianpan2",
"unicode": "e618",
"unicode_decimal": 58904
},
{
"icon_id": "579741",
"name": "用户",
"font_class": "yonghu1",
"unicode": "e793",
"unicode_decimal": 59283
},
{
"icon_id": "1304889",
"name": "添加",
"font_class": "tianjia",
"unicode": "e622",
"unicode_decimal": 58914
},
{
"icon_id": "2423300",
"name": "无数据",
"font_class": "wushuju",
"unicode": "e642",
"unicode_decimal": 58946
},
{
"icon_id": "8106293",
"name": "wifi",
"font_class": "wifi",
"unicode": "e6a4",
"unicode_decimal": 59044
},
{
"icon_id": "26847628",
"name": "键盘",
"font_class": "jianpan",
"unicode": "e661",
"unicode_decimal": 58977
},
{
"icon_id": "28606930",
"name": "电量",
"font_class": "dianliang",
"unicode": "e6bd",
"unicode_decimal": 59069
},
{
"icon_id": "33762460", "icon_id": "33762460",
"name": "应用管理及商店", "name": "应用管理及商店",
"font_class": "yingyongguanli", "font_class": "yingyongguanli",

BIN
src/assets/fonts/font_pda/iconfont.ttf

BIN
src/assets/fonts/font_pda/iconfont.woff

BIN
src/assets/fonts/font_pda/iconfont.woff2

37
src/pages/InRoadMgm/InRoadOverview/loadable.jsx

@ -38,6 +38,8 @@ const InRoadOverview = () => {
const [revenueData, setRevenueData] = useState({}); const [revenueData, setRevenueData] = useState({});
// //
const [recordData, setRecordData] = useState({}); const [recordData, setRecordData] = useState({});
//
const [displayMapping, setDisplayMapping] = useState({})
// //
const getRevenueOption = (data) => { const getRevenueOption = (data) => {
// //
@ -347,19 +349,36 @@ const InRoadOverview = () => {
<p>停车记录概览:按入场时间统计每个地区最近7天停车记录数</p> <p>停车记录概览:按入场时间统计每个地区最近7天停车记录数</p>
</div> </div>
) )
const getPageConfig = ()=>{
ajax.getOverviewConfigList({type: '1'}).then((res)=>{
if(res.status == 20000){
let temp = {}
res.data.map(item=>{
temp[item.id] = item.status == '1' ? true : false
})
setDisplayMapping(temp)
}else{
message.error(res.message)
}
}).catch(err=>{
})
}
useEffect(() => { useEffect(() => {
getBaseNumber(); getBaseNumber();
getIncomeTop5(); getIncomeTop5();
getParkingRecordTop5(); getParkingRecordTop5();
getParkingIncome(); getParkingIncome();
getParkingRecord(); getParkingRecord();
getPageConfig()
}, []); }, []);
return ( return (
<div className="InRoadOverview"> <div className="InRoadOverview">
<div id="header"> <div id="header">
<div className="header-card">
<div className="card-part">
<div className="header-card" style={{ visibility: displayMapping['1'] ? '' : 'hidden' }}>
<div className="card-part" >
<p>路段总数 <p>路段总数
<Popover content={roadContent} > <Popover content={roadContent} >
<QuestionCircleOutlined style={{ marginLeft: 5 }} /> <QuestionCircleOutlined style={{ marginLeft: 5 }} />
@ -369,7 +388,7 @@ const InRoadOverview = () => {
<p>泊位总数:{headerNums.berth_num}</p> <p>泊位总数:{headerNums.berth_num}</p>
</div> </div>
</div> </div>
<div className="header-card">
<div className="header-card" style={{ visibility: displayMapping['2'] ? '' : 'hidden' }}>
<div className="card-part"> <div className="card-part">
<p>今日停车记录数 <p>今日停车记录数
<Popover content={todayContent} > <Popover content={todayContent} >
@ -380,7 +399,7 @@ const InRoadOverview = () => {
<p>日均停车记录数:{headerNums.average_park}</p> <p>日均停车记录数:{headerNums.average_park}</p>
</div> </div>
</div> </div>
<div className="header-card">
<div className="header-card" style={{ visibility: displayMapping['3'] ? '' : 'hidden' }}>
<div className="card-part"> <div className="card-part">
<p>今日收入总额 <Popover content={moneyContent} > <p>今日收入总额 <Popover content={moneyContent} >
<QuestionCircleOutlined style={{ marginLeft: 5 }} /> <QuestionCircleOutlined style={{ marginLeft: 5 }} />
@ -389,7 +408,7 @@ const InRoadOverview = () => {
<p>日均收入总额:{headerNums.average_money}</p> <p>日均收入总额:{headerNums.average_money}</p>
</div> </div>
</div> </div>
<div className="header-card">
<div className="header-card" style={{ visibility: displayMapping['4'] ? '' : 'hidden' }}>
<div className="card-part"> <div className="card-part">
<p>日均时长泊位利用率 <p>日均时长泊位利用率
<Popover content={averageContent} placement="leftTop"> <Popover content={averageContent} placement="leftTop">
@ -403,7 +422,7 @@ const InRoadOverview = () => {
</div> </div>
<div id="body"> <div id="body">
<div className="left"> <div className="left">
<div className="revenue-left card labelTop">
<div className="revenue-left card labelTop" style={{ visibility: displayMapping['5'] ? '' : 'hidden' }}>
<Popover content={partSend} placement="rightTop" className="iconSize"> <Popover content={partSend} placement="rightTop" className="iconSize">
<QuestionCircleOutlined style={{ marginLeft: 5 }} /> <QuestionCircleOutlined style={{ marginLeft: 5 }} />
</Popover> </Popover>
@ -412,7 +431,7 @@ const InRoadOverview = () => {
style={{ height: "100%", width: "100%", overflow: "hidden" }} style={{ height: "100%", width: "100%", overflow: "hidden" }}
/> />
</div> </div>
<div className="record-left card labelTop">
<div className="record-left card labelTop" style={{ visibility: displayMapping['6'] ? '' : 'hidden' }}>
<Popover content={partMessage} placement="rightTop" className="iconSize"> <Popover content={partMessage} placement="rightTop" className="iconSize">
<QuestionCircleOutlined style={{ marginLeft: 5 }} /> <QuestionCircleOutlined style={{ marginLeft: 5 }} />
</Popover> </Popover>
@ -436,7 +455,7 @@ const InRoadOverview = () => {
</div> </div>
</div> </div>
<div className="right"> <div className="right">
<div className="record-right card">
<div className="record-right card" style={{ visibility: displayMapping['7'] ? '' : 'hidden' }}>
<label>停车记录top5 <label>停车记录top5
<Popover content={carParkContent} placement="leftTop"> <Popover content={carParkContent} placement="leftTop">
<QuestionCircleOutlined style={{ marginLeft: 5 }} /> <QuestionCircleOutlined style={{ marginLeft: 5 }} />
@ -456,7 +475,7 @@ const InRoadOverview = () => {
})} })}
</ul> </ul>
</div> </div>
<div className="revenue-right card">
<div className="revenue-right card" style={{ visibility: displayMapping['8'] ? '' : 'hidden' }}>
<label>停车收入top5 <label>停车收入top5
<Popover content={carContent} placement="leftTop"> <Popover content={carContent} placement="leftTop">
<QuestionCircleOutlined style={{ marginLeft: 5 }} /> <QuestionCircleOutlined style={{ marginLeft: 5 }} />

6
src/pages/OperationCenter/AppMgm/MobileDeviceMgm/index.jsx

@ -0,0 +1,6 @@
import React from "react"
import loadable from "@loadable/component"
import { LoadingImg } from "@/components"
const WechatMenuMgmLoadable = loadable(() => import("./loadable"))
export default (pros) => <WechatMenuMgmLoadable {...pros} fallback={<LoadingImg />} />

27
src/pages/OperationCenter/AppMgm/MobileDeviceMgm/index.scss

@ -0,0 +1,27 @@
@import "@/assets/css/mixin.scss";
$color-container-bg : var(--color-container-bg);
$color-user-list-bg : var(--color-user-list-bg);
$color-text : var(--color-text);
$color-primary : var(--color-primary);
.mobile-device-mgm{
padding: 20px;
.content{
width: 800px;
background-color: #4f5a6e;
border-radius: 10px;
padding: 20px;
}
.title{
font-size: 18px;
font-weight: bold;
margin-bottom: 20px;
}
.row{
display: flex;
margin-bottom: 20px;
}
.name{
margin-right: 10px;
}
}

61
src/pages/OperationCenter/AppMgm/MobileDeviceMgm/loadable.jsx

@ -0,0 +1,61 @@
import React, { useState, useRef, useEffect } from "react";
import { message, Pagination, Table, Space, Modal,TextArea ,Input , Button } from "antd";
import { dictionary, utils } from "@/config/common";
// import moment from 'moment'
import { useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks';
import ajax from "@/services"
import { FormInput, FormSelect, OptionPanel, ResultPanel, FormSliderPicker, AreaCascader, ImgResize, ImgZoom, } from "@/components"
import "./index.scss";
// import errorImg from "@/assets/images/layout/error.png"
// import { useLocation } from "react-router-dom";
function WechatMenuMgm() {
const [resultData, setResultData] = useState({})
const getData = ()=>{
ajax.getAboutUsInfo().then(res=>{
if(res.status == 20000){
setResultData(res.data)
}else{
}
})
.catch(err=>{
console.log(err)
})
}
const editData = ()=>{
ajax.editAboutUsInfo(resultData).then(res=>{
if(res.status == 20000){
message.success(res.message)
}else{
message.error(res.message)
}
})
.catch(err=>{
console.log(err)
})
}
useEffect(()=>{
getData()
}, [])
return <div className="mobile-device-mgm">
<div className="content">
<div className="title">青岛收费管理端APP</div>
<div className="row">
<span className="name">关于我们</span>
<Input.TextArea value={resultData.description} onChange={(e)=>{setResultData({...resultData, description: e.target.value})}} rows={5} showCount={true} maxLength={300} style={{width: "600px"}}></Input.TextArea>
</div>
<div className="row">
<span className="name">客服电话</span>
<Input value={resultData.tel} onChange={(e)=>{setResultData({...resultData, tel: e.target.value})}} style={{width: "600px"}}></Input>
</div>
<div>
<Button type="primary" onClick={editData}>保存</Button>
</div>
</div>
</div>
}
export default WechatMenuMgm;

101
src/pages/OperationCenter/AppMgm/WechatMenuMgm/index.scss

@ -3,3 +3,104 @@ $color-container-bg : var(--color-container-bg);
$color-user-list-bg : var(--color-user-list-bg); $color-user-list-bg : var(--color-user-list-bg);
$color-text : var(--color-text); $color-text : var(--color-text);
$color-primary : var(--color-primary); $color-primary : var(--color-primary);
.wechat-menu-mgm{
padding: 20px;
display: flex;
.left-wrapper{
width: 400px;
height: 600px;
margin-right: 20px;
.left-inner{
width: 100%;
height: 550px;
background-color: #f5f5f5;
border-radius: 10px;
position: relative;
}
.top{
padding-left: 10px;
display: flex;
justify-content: space-between;
align-items: center;
color: #000
}
.bottom{
position: absolute;
width: 100%;
bottom: 0;
height: 62px;
display: flex;
border-top: 1px solid #e0e0e0;
}
.menu-name{
margin-right: 10px;
border: 1px solid #e0e0e0;
cursor: pointer;
width: 100px;
height: 60px;
text-align: center;
line-height: 60px;
border-radius: 5px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
user-select: none;
color: #45adff;
&.active{
border: 1px solid #45adff;
}
}
.add-btn{
border: 1px solid #45adff;
height: 60px;
line-height: 60px;
width: 60px;
border-radius: 5px;
text-align: center;
color: #45adff;
}
.delete-btn-wrapper{
color: #fff;
font-size: 20px;
text-align: center;
cursor: pointer;
}
}
.right-wrapper{
flex:1;
.content{
background-color: #4e586c;
padding: 20px;
border-radius: 10px;
margin-bottom: 10px;
}
.content-row{
margin-bottom: 5px;
}
.big-title{
font-weight: 700;
font-size: 18px;
margin-bottom: 10px;
}
.desc{
text-indent: 80px;
margin-bottom: 10px;
}
.delete-link{
color: #0c9fde;
cursor: pointer;
width: 100px;
}
.btn-wrapper{
display: flex;
justify-content: center;
}
}
}
.wechat-sub-menu, .add-btn{
cursor: pointer;
user-select: none;
}

356
src/pages/OperationCenter/AppMgm/WechatMenuMgm/loadable.jsx

@ -1,15 +1,353 @@
import React, { useState, useRef, useEffect } from "react"; import React, { useState, useRef, useEffect } from "react";
// import { message, Pagination, Table, Space, Modal, } from "antd";
// import { dictionary, utils } from "@/config/common";
import { message, Space, Modal, Popover ,Button,Input ,Radio } from "antd";
import { dictionary, utils } from "@/config/common";
// import moment from 'moment' // import moment from 'moment'
// import { useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks';
// import ajax from "@/services"
// import { FormInput, FormSelect, OptionPanel, ResultPanel, FormSliderPicker, AreaCascader, ImgResize, ImgZoom, } from "@/components"
// import "./index.scss";
// import errorImg from "@/assets/images/layout/error.png"
// import { useLocation } from "react-router-dom";
import { useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks';
import ajax from "@/services"
import { FormInput, FormSelect, OptionPanel, ResultPanel, FormSliderPicker, AreaCascader, ImgResize, ImgZoom, } from "@/components"
import "./index.scss";
import errorImg from "@/assets/images/layout/error.png"
import { useLocation } from "react-router-dom";
import { IconPda } from '@/components'
import { ExclamationCircleOutlined} from '@ant-design/icons';
function WechatMenuMgm() { function WechatMenuMgm() {
return <div>WechatMenuMgm</div>
const [configArray, setConfigArray] = useState([])
const [rightData, setRightData] = useState({})
const [activeMenuIndex, setActiveMenuIndex] = useState(-1)
const [activeSubmenuIndex, setActiveSubmenuIndex] = useState(-1)
const [isEdit, setIsEdit] = useState(false)
const getWechatMenuList = ()=>{
ajax.getWechatMenuList().then(res=>{
if(res.status == 20000){
// console.log(res.data)
setConfigArray(res.data)
}else{
}
})
.catch(err=>{
console.log(err)
})
}
const choseOneMenu = (index, idx)=>{
setActiveMenuIndex(index)
setActiveSubmenuIndex(idx)
let temp = configArray[index].children[idx]
setRightData(temp)
setIsEdit(true)
}
const deleteMenu = ()=>{
if(configArray[activeMenuIndex].children){
Modal.confirm({
title: '删除',
icon: <ExclamationCircleOutlined />,
content: '该菜单已配置子菜单,请确认是否删除?',
onOk() {
confirmDeleteMenu()
},
onCancel() {
console.log('取消');
},
});
}else{
confirmDeleteMenu()
}
}
const confirmDeleteMenu = ()=>{
let temp = [...configArray]
if(activeMenuIndex > -1){
temp.splice(activeMenuIndex, 1)
setConfigArray(temp)
}
setActiveMenuIndex(-1)
setActiveSubmenuIndex(-1)
message.success('一级菜单删除成功')
}
const deleteSubMenu = ()=>{
let temp = [...configArray];
let temp_children = [...temp[activeMenuIndex].children]
temp_children.splice(activeSubmenuIndex, 1)
temp[activeMenuIndex].children = temp_children
setConfigArray(temp)
setActiveMenuIndex(-1)
setActiveSubmenuIndex(-1)
message.success('子菜单删除成功')
}
const clickMenu = (index)=>{
setActiveMenuIndex(index)
setActiveSubmenuIndex(-1)
setRightData({
name: configArray[index].name,
type: configArray[index].type,
url: configArray[index].url
})
setIsEdit(true)
}
const addOneMenu = (index)=>{
// let temp = [...configArray]
// if(temp[index].children){
// let tempchildren = [...temp[index].children]
// tempchildren.push({name: '' , type: 1, url: ""})
// temp[index].children = tempchildren
// }else{
// temp[index].children = [{name: '', type: 1, url: ""}]
// }
// setConfigArray(temp)
setRightData({name: '子菜单', type: 1, url: ""})
setActiveMenuIndex(index)
if(configArray[index].children?.length){
setActiveSubmenuIndex(configArray[index].children?.length)
}else{
setActiveSubmenuIndex(0)
}
setIsEdit(false)
}
const addFirstMenu = ()=>{
setRightData({name: '一级菜单', type: 1, url: ""})
if(configArray.length < 3){
setActiveMenuIndex(configArray.length)
}
setActiveSubmenuIndex(-1)
setIsEdit(false)
}
const onChange = (type, e)=>{
let value = e.target.value, temp = {...rightData}
temp[type] = value
setRightData(temp)
// let temp_config = [...configArray]
// if(activeSubmenuIndex > -1 && activeMenuIndex > -1){
// temp_config[activeMenuIndex].children[activeSubmenuIndex][type] = value
// }else{
// temp_config[activeMenuIndex][type] = value
// }
// setConfigArray(temp_config)
}
const publish = ()=>{
ajax.publishMenu(configArray).then(res=>{
if(res.status == 20000){
message.success(res.message)
}else{
message.error(res.message)
}
})
.catch(err=>{
console.log(err)
})
}
const save = ()=>{
if(!/^[\u4e00-\u9fa5]{1,4}$/.test(rightData.name) && !/^[a-zA-Z]{1,8}$/.test(rightData.name) ){
message.error('名称不符合规范, 请重新输入')
return
}
if(!rightData.url){
message.error('网络地址不能为空')
return
}
if(activeMenuIndex > -1 && activeSubmenuIndex == -1){
//
// if(configArray.length){
// let lastMenu = configArray[configArray.length - 1]
// if(lastMenu.children?.length){ //, ,
// let flag = true;
// for(let i = 0; i < lastMenu.children.length ;i++){
// if(!lastMenu.children[i].url){
// message.error('')
// flag = false
// break
// }
// }
// if(!flag){
// return
// }
// }else{
// if(!/^[\u4e00-\u9fa5]{1,4}$/.test(lastMenu.name) && !/^[a-zA-Z]{1,8}$/.test(lastMenu.name) ){
// message.error(', ')
// return
// }
// if(!lastMenu.url){
// message.error('')
// return
// }
// }
// }
// let temp = [...configArray]
// temp.push({name: '', type: 1, url: ""})
// setConfigArray(temp)
// setActiveMenuIndex(configArray.length - 1)
// setRightData({name: '', type: 1, url: ""})
if(isEdit){
let temp = [...configArray]
temp[activeMenuIndex].name = rightData.name
temp[activeMenuIndex].type = rightData.type
temp[activeMenuIndex].url = rightData.url
setConfigArray(temp)
message.success('一级菜单编辑成功')
}else{
let temp = [...configArray]
temp.push(rightData)
setConfigArray(temp)
message.success('一级菜单添加成功')
setIsEdit(true)
}
}else{
if(isEdit){
let temp_arr = [...configArray];
console.log(temp_arr[activeMenuIndex])
// if(temp_arr[activeMenuIndex]?.children[activeSubmenuIndex]){
// temp_arr[activeMenuIndex]?.children[activeSubmenuIndex] = rightData
// }
temp_arr[activeMenuIndex].children[activeSubmenuIndex] = rightData
setConfigArray(temp_arr)
message.success('子菜单编辑成功')
}else{
let temp = [...configArray]
if(temp[activeMenuIndex].children){
let tempchildren = [...temp[activeMenuIndex].children]
tempchildren.push(rightData)
temp[activeMenuIndex].children = tempchildren
}else{
temp[activeMenuIndex].children = [rightData]
}
setConfigArray(temp)
message.success('子菜单添加成功')
setIsEdit(true)
}
}
}
useEffect(()=>{
getWechatMenuList()
}, [])
return <div className="wechat-menu-mgm">
<div className="left-wrapper">
<div className="left-inner">
<div className="top">
<div style={{color: '#000'}}>12:00</div>
<div style={{color: '#000',textAlign: 'right',fontSize: '20px',marginRight: '20px'}}>
<IconPda type="xinhao01" ></IconPda>&emsp;
<IconPda type="wifi"></IconPda>&emsp;
<IconPda type="dianliang"></IconPda>
</div>
</div>
<div className="bottom">
<div style={{fontSize: '24px',width: '40px',textAlign:"center",color: "#fff"}}>
<IconPda type="jianpan1"></IconPda>
</div>
{
configArray.map((item,index)=>{
return (
<Popover placement="top" overlayClassName="wechat-config-popover"
content={
<>
{
item.children && item.children.map((one,idx)=>{
return <div className="wechat-sub-menu" key={idx} onClick={()=>{choseOneMenu(index, idx)}}>{one.name}</div>
})
}
{
!item.children || item.children.length < 5 ?
<div onClick={()=>{addOneMenu(index)}} className="add-btn"> + 添加</div>
: null
}
</>
} trigger="hover">
<div key={index} className={`menu-name ${activeMenuIndex == index ? 'active' : ''}`} onClick={()=>{clickMenu(index)}}>{item.name}</div>
</Popover>
)
})
}
{
configArray.length < 3 ?
<div onClick={addFirstMenu} className="add-btn">+添加</div>
:null
}
</div>
</div>
{
activeMenuIndex > -1 ? <div onClick={deleteMenu} className="delete-btn-wrapper"><IconPda type="shanchu1"></IconPda></div> : null
}
</div>
<div className="right-wrapper">
{
activeMenuIndex > -1 ?
<div className="content">
{
activeSubmenuIndex > -1 && activeMenuIndex > -1 ? <div className="big-title">{configArray[activeMenuIndex]?.name}</div> : <div className="big-title">菜单信息</div>
}
<div className="content-row">
{
activeSubmenuIndex > -1 ?
<span>子菜单名称</span>:
<span>名称&emsp;&emsp;&emsp;</span>
}
<Input style={{width: '400px',marginLeft:"10px"}} value={rightData.name} onChange={(e)=>{onChange('name',e)}}></Input>
</div>
<div className=" desc">
仅支持中英文和数字, 字数不超过4个汉字或8个字母
</div>
<div className="content-row">
{
activeSubmenuIndex > -1 ?
<span>子菜单内容</span>:
<span>消息类型&emsp;</span>
}
<Radio.Group style={{marginLeft:"10px"}} onChange={(e)=>{onChange("type",e)}} value={rightData.type}>
<Radio value={1}>跳转网页</Radio>
<Radio value={2}>跳转小程序</Radio>
</Radio.Group>
</div>
<div className="content-row">
<span>网页地址&emsp;</span>
<Input style={{width: '400px',marginLeft:"10px"}} value={rightData.url} onChange={(e)=>{onChange("url",e)}}></Input>
</div>
</div> : null
}
<div className="btn-wrapper">
{
activeMenuIndex > -1 ?
<>
{
activeSubmenuIndex > -1 ?
<Button type="default" onClick={deleteSubMenu}>删除子菜单</Button>
:
<Button type="default" onClick={deleteMenu}>删除菜单</Button>
}
&emsp;<Button type="primary" onClick={save}>保存</Button>&emsp;
</> : null
}
<Button type="primary" onClick={publish}>发布</Button>
</div>
</div>
</div>
} }
export default WechatMenuMgm; export default WechatMenuMgm;

7
src/pages/OperationCenter/AppMgm/index.jsx

@ -0,0 +1,7 @@
import WechatMenuMgm from "./WechatMenuMgm"
import MobileDeviceMgm from "./MobileDeviceMgm"
export default {
WechatMenuMgm,
MobileDeviceMgm
}

15
src/pages/OperationCenter/OperationSales/CouponMgm/CouponRules/loadable.jsx

@ -293,6 +293,13 @@ function CouponRules() {
submitData.effctive_value2 = str submitData.effctive_value2 = str
} }
} }
// if(submitData.type == 1){
// if(submitData.discount_limit == null){
// submitData.discount_limit = 0
// }
// }
if(currentCouponId){ // if(currentCouponId){ //
ajax.handleCouponEdit({...submitData ,id: currentCouponId }).then(res => { ajax.handleCouponEdit({...submitData ,id: currentCouponId }).then(res => {
@ -381,7 +388,7 @@ function CouponRules() {
message.error('打折比例不能为空') message.error('打折比例不能为空')
return false return false
} }
if(!currentCouponInfo.discount_limit){
if(currentCouponInfo.discount_limit == null){
message.error('折扣金额上限不能为空') message.error('折扣金额上限不能为空')
return false return false
} }
@ -489,9 +496,9 @@ function CouponRules() {
}, [currentCouponInfo.use_scope]) }, [currentCouponInfo.use_scope])
useEffect(()=>{
console.log(formData, 'formData')
}, [formData])
// useEffect(()=>{
// console.log(formData, 'formData')
// }, [formData])
useEffect(() => { useEffect(() => {
let obj = formData let obj = formData

35
src/pages/OutRoadMgm/OutRoadOverview/loadable.jsx

@ -30,6 +30,8 @@ const OutRoadOverview = () => {
const [revenueData, setRevenueData] = useState({}); const [revenueData, setRevenueData] = useState({});
// //
const [recordData, setRecordData] = useState({}); const [recordData, setRecordData] = useState({});
//
const [displayMapping, setDisplayMapping] = useState({})
// //
const getRevenueOption = (data) => { const getRevenueOption = (data) => {
// //
@ -302,39 +304,56 @@ const OutRoadOverview = () => {
.catch((err) => console.error(err)); .catch((err) => console.error(err));
} }
const getPageConfig = ()=>{
ajax.getOverviewConfigList({type: '1'}).then((res)=>{
if(res.status == 20000){
let temp = {}
res.data.map(item=>{
temp[item.id] = item.status == '1' ? true : false
})
setDisplayMapping(temp)
}else{
message.error(res.message)
}
}).catch(err=>{
})
}
useEffect(() => { useEffect(() => {
getBaseNumber(); getBaseNumber();
getIncomeTop5(); getIncomeTop5();
getParkingRecordTop5(); getParkingRecordTop5();
getParkingIncome(); getParkingIncome();
getParkingRecord(); getParkingRecord();
getPageConfig();
}, []); }, []);
return ( return (
<div className="OutRoadOverview"> <div className="OutRoadOverview">
<div id="header"> <div id="header">
<div className="header-card">
<div className="header-card" style={{ visibility: displayMapping['9'] ? '' : 'hidden' }}>
<div className="card-part"> <div className="card-part">
<p>路段总数</p> <p>路段总数</p>
<p className="count">{headerNums.park_num}</p> <p className="count">{headerNums.park_num}</p>
<p>泊位总数:{headerNums.bowei_num}</p> <p>泊位总数:{headerNums.bowei_num}</p>
</div> </div>
</div> </div>
<div className="header-card">
<div className="header-card" style={{ visibility: displayMapping['10'] ? '' : 'hidden' }}>
<div className="card-part"> <div className="card-part">
<p>今日停车记录数</p> <p>今日停车记录数</p>
<p className="count">{headerNums.today_park_total}</p> <p className="count">{headerNums.today_park_total}</p>
<p>日均停车记录数:{headerNums.today_park_total}</p> <p>日均停车记录数:{headerNums.today_park_total}</p>
</div> </div>
</div> </div>
<div className="header-card">
<div className="header-card" style={{ visibility: displayMapping['11'] ? '' : 'hidden' }}>
<div className="card-part"> <div className="card-part">
<p>今日收入总额</p> <p>今日收入总额</p>
<p className="count">{headerNums.today_yf_money}</p> <p className="count">{headerNums.today_yf_money}</p>
<p>日均收入总额:{headerNums.seven_yf_money}</p> <p>日均收入总额:{headerNums.seven_yf_money}</p>
</div> </div>
</div> </div>
<div className="header-card">
<div className="header-card" style={{ visibility: displayMapping['12'] ? '' : 'hidden' }}>
<div className="card-part"> <div className="card-part">
<p>日均时长泊位利用率</p> <p>日均时长泊位利用率</p>
<p className="count">{headerNums.total_park_time}</p> <p className="count">{headerNums.total_park_time}</p>
@ -344,13 +363,13 @@ const OutRoadOverview = () => {
</div> </div>
<div id="body"> <div id="body">
<div className="left"> <div className="left">
<div className="revenue-left card">
<div className="revenue-left card" style={{ visibility: displayMapping['13'] ? '' : 'hidden' }}>
<ReactEcharts <ReactEcharts
option={revenueData} option={revenueData}
style={{ height: "100%", width: "100%", overflow: "hidden" }} style={{ height: "100%", width: "100%", overflow: "hidden" }}
/> />
</div> </div>
<div className="record-left card">
<div className="record-left card" style={{ visibility: displayMapping['14'] ? '' : 'hidden' }}>
<ReactEcharts <ReactEcharts
option={recordData} option={recordData}
style={{ height: "100%", width: "100%", overflow: "hidden" }} style={{ height: "100%", width: "100%", overflow: "hidden" }}
@ -371,7 +390,7 @@ const OutRoadOverview = () => {
</div> </div>
</div> </div>
<div className="right"> <div className="right">
<div className="record-right card">
<div className="record-right card" style={{ visibility: displayMapping['15'] ? '' : 'hidden' }}>
<label>停车记录top5</label> <label>停车记录top5</label>
<ul className="record-list"> <ul className="record-list">
{recordTop.map((item, index) => { {recordTop.map((item, index) => {
@ -387,7 +406,7 @@ const OutRoadOverview = () => {
})} })}
</ul> </ul>
</div> </div>
<div className="revenue-right card">
<div className="revenue-right card" style={{ visibility: displayMapping['16'] ? '' : 'hidden' }}>
<label>停车收入top5</label> <label>停车收入top5</label>
<ul className="revenue-list"> <ul className="revenue-list">
{incomeTop.map((item, index) => { {incomeTop.map((item, index) => {

25
src/pages/SystemMgm/BusinessConfig/HotCbdConf/index.scss

@ -6,4 +6,29 @@ $color-primary : var(--color-primary);
.hot-cbd-conf{ .hot-cbd-conf{
display: flex; display: flex;
.conf-form-item{
margin-bottom: 20px;
}
}
.hot-cbd-modal{
.ltc-item{
display: flex;
margin-bottom: 20px;
}
.new-item{
width: 130px;
span{
color: red
}
}
.ant-input-affix-wrapper, .ant-select{
width: 600px !important;
}
.ant-input-affix-wrapper input{
background-color: transparent;
}
}
.popover-item{
cursor: pointer;
} }

254
src/pages/SystemMgm/BusinessConfig/HotCbdConf/loadable.jsx

@ -11,13 +11,14 @@ import {
Tabs, Tabs,
Descriptions, Descriptions,
Timeline, Timeline,
Popover
Popover,
TreeSelect
} from "antd"; } from "antd";
import { useSetState , useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks'; import { useSetState , useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks';
import { FormInput, FormSelect, ResultFlow ,FormSliderPicker} from "@/components" import { FormInput, FormSelect, ResultFlow ,FormSliderPicker} from "@/components"
import moment from "moment"; import moment from "moment";
import ajax from '@/services' import ajax from '@/services'
// import { TableModule } from "@/components";
import { ExclamationCircleOutlined} from '@ant-design/icons';
import { dictionary } from "@/config/common.js"; import { dictionary } from "@/config/common.js";
import "./index.scss"; import "./index.scss";
@ -27,13 +28,22 @@ function HotCbdConf() {
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const [detailVisible, setDetailVisible] = useState(false); const [detailVisible, setDetailVisible] = useState(false);
// const [tabKey, setTabKey] = useState("1"); // const [tabKey, setTabKey] = useState("1");
const [treeData, setTreeData] = useState([])
const [defaultParams, setDefaultParams] = useSessionStorageState('hotCbdConf_formData',{ const [defaultParams, setDefaultParams] = useSessionStorageState('hotCbdConf_formData',{
defaultValue:{} defaultValue:{}
}) })
const [formData, setFormData] = useSetState({ const [formData, setFormData] = useSetState({
area: defaultParams.formParams?.area ? defaultParams.formParams.area : '',
area: defaultParams.formParams?.area ? defaultParams.formParams.area : '0',
name: defaultParams.formParams?.name ? defaultParams.formParams.name : '', name: defaultParams.formParams?.name ? defaultParams.formParams.name : '',
}) })
const [modalFormData, setModalFormData] = useState({
name: '',
area: "",
center_name: ""
})
const [currentRecord, setCurrentRecord] = useState({})
const columns = [ const columns = [
{ {
title: "序号", title: "序号",
@ -67,7 +77,7 @@ function HotCbdConf() {
align: "center", align: "center",
render: (_, record) => { render: (_, record) => {
return ( return (
<Popover placement="topRight" content={<><div>重新配置</div><div>删除</div></>}>
<Popover placement="topRight" content={<><div className="popover-item" onClick={()=>{reconfig(record)}}>重新配置</div><div className="popover-item" onClick={()=>{deleteOne(record)}}>删除</div></>}>
<Button type="primary">操作</Button> <Button type="primary">操作</Button>
</Popover> </Popover>
); );
@ -107,9 +117,22 @@ function HotCbdConf() {
}, },
]; ];
const excuteSearch=()=>{
setPageData({...pageData, pn: 1})
search({pn: 1, size:pageData.size})
}
// //
function search(e) {
ajax.getHotCbdList(e).then((res) => {
function search(params) {
let obj = params;
if(!params.pn){
obj.pn = pageData.pn
obj.size = pageData.size
}else if(!params.area){
obj.name = formData.name
obj.area = formData.area
}
ajax.getHotCbdList(obj).then((res) => {
let { status, data, total } = res let { status, data, total } = res
if (status == 20000) { if (status == 20000) {
setResultData(data) setResultData(data)
@ -121,12 +144,97 @@ function HotCbdConf() {
}) })
} }
const saveModal = ()=>{
if(!modalFormData.name){
message.error('商圈名称不能为空')
return
}
if(!modalFormData.center_name){
message.error('商圈中心点位名称不能为空')
return
}
if(currentRecord.id){
ajax.editHotCbdConfig(Object.assign({}, modalFormData, {id: currentRecord.id}) ).then((res) => {
if (res.status == 20000) {
setDetailVisible(false)
setModalFormData({
name: '',
area: '0',
center_name: ''
})
message.success('编辑商圈成功')
search(Object.assign({},formData, pageData))
} else {
message.error(res.message)
}
})
}else{
ajax.addCbdConfig(modalFormData).then((res) => {
if (res.status == 20000) {
setDetailVisible(false)
setModalFormData({
name: '',
area: '0',
center_name: ''
})
search(Object.assign({},formData, pageData))
message.success('新增商圈成功')
} else {
message.error(res.message)
}
})
}
}
const reset = ()=>{
const reconfig = (record)=>{
setCurrentRecord(record)
setModalFormData({
name: record.name,
area: parseInt(record.area) ? record.area : '0' ,
center_name: record.center_name
})
setDetailVisible(true)
}
const deleteOne = (record)=>{
setCurrentRecord(record)
Modal.confirm({
title: '删除',
icon: <ExclamationCircleOutlined />,
content: '确认删除当前商圈?',
onOk() {
confirmDelete()
},
onCancel() {
console.log('取消');
},
});
}
const confirmDelete = ()=>{
ajax.deleteHotCbd({id: currentRecord.id}).then((res) => {
if (res.status == 20000) {
search(Object.assign({},formData, pageData))
message.success(res.message)
} else {
message.error(res.message)
}
})
}
const reset = ()=>{
setFormData({
name: '',
area: '0'
})
setPageData({...pageData, pn: 1})
search({name: '', area: '0', pn: 1, size: pageData.size})
} }
const addConfig = ()=>{ const addConfig = ()=>{
setCurrentRecord({})
setDetailVisible(true) setDetailVisible(true)
} }
@ -141,38 +249,93 @@ function HotCbdConf() {
pn: pn, pn: pn,
size: pageSize, size: pageSize,
}) })
search({pn: pn, size: pageSize})
}
//
const tranverseTreeData = (data)=>{
data.map(item=>{
item.value = item.id
item.label = item.name
if(item.children){
tranverseTreeData(item.children)
}
})
} }
useEffect(()=>{
const getAreaTree = ()=>{
ajax.getAreaTree()
.then(res=>{
if(res.status == 20000){
tranverseTreeData(res.data)
setTreeData(res.data)
}else{
message.error(res.message)
}
})
.catch(err=>{
message.error('请求区域数据异常')
})
}
const onTreeSelectChange=(e)=>{
setFormData({...formData, area: e})
}
}, [pageData])
const onModalTreeSelectChange = (e)=>{
setModalFormData({...modalFormData, area: e})
}
// useEffect(()=>{
// search(pageData)
// }, [pageData])
useEffect(()=>{ useEffect(()=>{
search(formData) search(formData)
getAreaTree()
},[]) },[])
return ( return (
<> <>
<div className="hot-cbd-conf"> <div className="hot-cbd-conf">
<div className="left-search"> <div className="left-search">
<FormSelect
yisaLabel="所属区域"
yisaData={sysConfig.coupon}
defaultValue={ formData.type }
placeholder=""
hasUnlimited={ false }
showClose={false}
onChange={ e=>{setFormData({type:e})} }
/>
<FormInput
yisaLabel="商圈名称"
placeholder="请输入商圈名称"
value={formData.user }
showClose={true}
onChange={ e=>{setFormData({user:e.target.value})} }
/>
<div className="conf-form-item">
<div className="cc-form-input form-input-top">
<div className="cc-form-name"><label>所属区域</label></div>
<div className="cc-form-content">
<TreeSelect
showSearch
style={{
width: '100%',
}}
value={formData.area}
dropdownStyle={{
maxHeight: 400,
overflow: 'auto',
}}
placeholder="请选择所属区域"
allowClear={false}
treeDefaultExpandAll
onChange={onTreeSelectChange}
treeData={treeData}
/>
</div>
</div>
</div>
<div className="conf-form-item">
<FormInput
yisaLabel="商圈名称"
placeholder="请输入商圈名称"
value={formData.name }
showClose={true}
onChange={ e=>{setFormData({...formData, name:e.target.value})} }
/>
</div>
<div className="bottomBox"> <div className="bottomBox">
<Button type="primary" loading={loading} onClick={search}>查询</Button>&emsp;
<Button type="primary" loading={loading} onClick={()=>{excuteSearch()}}>查询</Button>&emsp;
<Button onClick={reset}>重置</Button>&emsp; <Button onClick={reset}>重置</Button>&emsp;
<Button type="primary" onClick={addConfig} >商圈配置</Button> <Button type="primary" onClick={addConfig} >商圈配置</Button>
</div> </div>
@ -180,6 +343,7 @@ function HotCbdConf() {
<div className="right-list"> <div className="right-list">
<div className="table-wrap"> <div className="table-wrap">
<Table <Table
rowKey="id"
dataSource={resultData} dataSource={resultData}
columns={columns} columns={columns}
loading={loading} loading={loading}
@ -210,33 +374,51 @@ function HotCbdConf() {
onCancel={() => { onCancel={() => {
setDetailVisible(false); setDetailVisible(false);
}} }}
footer={[
<Button key="back" onClick={() => {
setDetailVisible(false);
}}>
关闭窗口
</Button>]}
onOk={saveModal}
// footer={[
// <Button key="back" onClick={() => {
// setDetailVisible(false);
// }}>
//
// </Button>]}
> >
<div className="ltc-box">
<div className="ltc-box hot-cbd-modal">
<div className="ltc-content"> <div className="ltc-content">
<div className="ltc-item"> <div className="ltc-item">
<div className="new-item"><span>*</span>商圈名称:</div> <div className="new-item"><span>*</span>商圈名称:</div>
<div className="new-value"> <div className="new-value">
<Input onChange={(e) => { console.log(e.target.value) }} />
<Input value={modalFormData.name} showCount={true} maxLength={50} onChange={(e) => { setModalFormData({...modalFormData, name: e.target.value}) }} />
</div> </div>
</div> </div>
</div> </div>
<div className="ltc-content"> <div className="ltc-content">
<div className="ltc-item"> <div className="ltc-item">
<div className="new-item"><span>*</span>所属区域:</div> <div className="new-item"><span>*</span>所属区域:</div>
<div className="new-value"></div>
<div className="new-value">
<TreeSelect
showSearch
style={{
width: '100%',
}}
value={modalFormData.area}
dropdownStyle={{
maxHeight: 400,
overflow: 'auto',
}}
placeholder="请选择所属区域"
allowClear={false}
treeDefaultExpandAll
onChange={onModalTreeSelectChange}
treeData={treeData}
/>
</div>
</div> </div>
</div> </div>
<div className="ltc-content"> <div className="ltc-content">
<div className="ltc-item"> <div className="ltc-item">
<div className="new-item"><span>*</span>商圈中心点位名称:</div> <div className="new-item"><span>*</span>商圈中心点位名称:</div>
<div className="new-value"> <div className="new-value">
<Input onChange={(e) => { console.log(e.target.value) }} />
<Input value={modalFormData.center_name} showCount={true} maxLength={50} onChange={(e) => { setModalFormData({...modalFormData, center_name: e.target.value}) }} />
</div> </div>
</div> </div>
</div> </div>

11
src/pages/SystemMgm/BusinessConfig/PageConf/index.scss

@ -16,4 +16,15 @@ $color-primary : var(--color-primary);
} }
} }
.ant-table-body{
&::-webkit-scrollbar{
background-color: #3e4557;
width: 5px;
}
&::-webkit-scrollbar-thumb{
background-color: #616b83;
}
}
} }

8
src/pages/SystemMgm/BusinessConfig/PageConf/loadable.jsx

@ -53,18 +53,22 @@ function PageConf() {
if(res.status == 20000){ if(res.status == 20000){
message.success('设置成功') message.success('设置成功')
getOverviewConfigList() getOverviewConfigList()
}else{
message.error(res.message)
} }
}).catch(err=>{ }).catch(err=>{
}) })
} }
const getOverviewConfigList = (value)=>{ const getOverviewConfigList = (value)=>{
ajax.getOverviewConfigList({type: value ? value: type}).then((res)=>{
ajax.getOverviewConfigList({type: value ? value: type, pn: 1, page_size: 20, size: 20}).then((res)=>{
if(res.status == 20000){ if(res.status == 20000){
setList(res.data) setList(res.data)
}else{
message.error(res.message)
} }
}).catch(err=>{ }).catch(err=>{
}) })
} }

7
src/pages/SystemMgm/BusinessConfig/PdaArrearConf/loadable.jsx

@ -25,11 +25,14 @@ function PdaArrearConf() {
const save = ()=>{ const save = ()=>{
ajax.editPdaArrearConfig({data: limit}).then((res)=>{ ajax.editPdaArrearConfig({data: limit}).then((res)=>{
if(res.status == 20000){ if(res.status == 20000){
setLimit(res.data)
// setLimit(res.data)
setEdit(false) setEdit(false)
message.success(res.message)
}else{
message.error(res.message)
} }
}).catch(err=>{ }).catch(err=>{
message.error('服务器响应失败')
}) })
} }

97
src/pages/SystemMgm/BusinessConfig/VacationConf/loadable.jsx

@ -6,8 +6,8 @@ import { useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'a
import ajax from "@/services" import ajax from "@/services"
import { FormInput, FormSelect, OptionPanel, ResultPanel, FormSliderPicker, AreaCascader, ImgResize, ImgZoom, } from "@/components" import { FormInput, FormSelect, OptionPanel, ResultPanel, FormSliderPicker, AreaCascader, ImgResize, ImgZoom, } from "@/components"
import "./index.scss"; import "./index.scss";
// import errorImg from "@/assets/images/layout/error.png"
// import { useLocation } from "react-router-dom";
import { ExclamationCircleOutlined} from '@ant-design/icons';
function VacationConf() { function VacationConf() {
const [vacationData, setVacationData] = useState([]) const [vacationData, setVacationData] = useState([])
const [rightDetailData, setRightDetailData] = useState({}) const [rightDetailData, setRightDetailData] = useState({})
@ -16,8 +16,12 @@ function VacationConf() {
const [startDate, setStartDate] = useState(moment(utils.createDateStr(), 'YYYY-MM-DD')) const [startDate, setStartDate] = useState(moment(utils.createDateStr(), 'YYYY-MM-DD'))
const [endDate, setEndDate] = useState(moment(utils.createDateStr(), 'YYYY-MM-DD')) const [endDate, setEndDate] = useState(moment(utils.createDateStr(), 'YYYY-MM-DD'))
const [mode, setMode] = useState('0') // 0 1 const [mode, setMode] = useState('0') // 0 1
const getVacationData = ()=>{
ajax.getVacationData().then((res)=>{
const [currentDateData, setCurrentDateData] = useState({
month: new Date().getMonth() + 1 + '',
year: new Date().getFullYear() + ''
})
const getVacationData = (p)=>{
ajax.getVacationData(p ? p : currentDateData).then((res)=>{
if(res.status == 20000){ if(res.status == 20000){
setVacationData(res.data) setVacationData(res.data)
} }
@ -26,6 +30,34 @@ function VacationConf() {
}) })
} }
const deleteVacation = ()=>{
Modal.confirm({
title: '删除',
icon: <ExclamationCircleOutlined />,
content: '确认删除当前节假日配置?',
onOk() {
confirmDelete()
},
onCancel() {
console.log('取消');
},
});
}
const confirmDelete = ()=>{
ajax.deleteVacationConfig({
id: rightDetailData.id
})
.then((res)=>{
if(res.status == 20000){
message.success('删除成功')
getVacationData()
}
}).catch(err=>{
})
}
const resetVacation = ()=>{ const resetVacation = ()=>{
setVacationName(rightDetailData.vacation_name) setVacationName(rightDetailData.vacation_name)
setStartDate(moment(rightDetailData.vacation_start_date, 'YYYY-MM-DD')) setStartDate(moment(rightDetailData.vacation_start_date, 'YYYY-MM-DD'))
@ -35,10 +67,45 @@ function VacationConf() {
} }
const save = ()=>{ const save = ()=>{
if(!vacationName){
message.error('节假日名称不能为空')
return
}
if(startDate.format('YYYY-MM-DD') > endDate.format('YYYY-MM-DD')){
message.error('开始日期不能晚于结束日期')
return
}
if(mode == '0'){ if(mode == '0'){
message.success('新增成功')
ajax.addVacationConfig({
vacation_name: vacationName,
vacation_start_date: startDate.format('YYYY-MM-DD'),
vacation_end_date: endDate.format('YYYY-MM-DD')
}).then((res)=>{
if(res.status == 20000){
message.success('新增成功')
setModalVisible(false)
getVacationData()
}
}).catch(err=>{
})
}else{ }else{
message.success('修改成功')
ajax.editVacationConfig({
vacation_name: vacationName,
vacation_start_date: startDate.format('YYYY-MM-DD'),
vacation_end_date: endDate.format('YYYY-MM-DD'),
id: rightDetailData.id
}).then((res)=>{
if(res.status == 20000){
message.success('修改成功')
setModalVisible(false)
getVacationData()
}
}).catch(err=>{
})
} }
} }
@ -62,6 +129,16 @@ function VacationConf() {
} }
}; };
const onPanelChange = (e,a)=>{
console.log(e,a , 'aaaa',e.years(), e.months())
let tempdate = {
year: e.years() + '',
month: e.months() + 1 + ''
}
setCurrentDateData(tempdate)
getVacationData(tempdate)
}
const dateFullCellRender = (date)=>{ const dateFullCellRender = (date)=>{
let temp = date.format('MM-DD'),highlight = false,temp_vc_name = ''; let temp = date.format('MM-DD'),highlight = false,temp_vc_name = '';
if(vacationData.length){ if(vacationData.length){
@ -87,7 +164,7 @@ function VacationConf() {
<div className="left"> <div className="left">
<div className="title"><span className="title-name">节假日展示</span><Button type="primary" onClick={addConfig}>新增节假日配置</Button></div> <div className="title"><span className="title-name">节假日展示</span><Button type="primary" onClick={addConfig}>新增节假日配置</Button></div>
<Calendar onChange={onChange} dateFullCellRender={dateFullCellRender} />
<Calendar onChange={onChange} onPanelChange={onPanelChange} dateFullCellRender={dateFullCellRender} />
</div> </div>
<div className="right"> <div className="right">
<div className="right-row title-name">节假日详情</div> <div className="right-row title-name">节假日详情</div>
@ -97,7 +174,7 @@ function VacationConf() {
rightDetailData.vacation_name ? rightDetailData.vacation_name ?
<div> <div>
<Button type="primary" onClick={resetVacation}>重新配置</Button>&emsp; <Button type="primary" onClick={resetVacation}>重新配置</Button>&emsp;
<Button >删除</Button>
<Button onClick={deleteVacation}>删除</Button>
</div> </div>
: null : null
} }
@ -110,11 +187,11 @@ function VacationConf() {
</div> </div>
<div className="modal-row vacation"> <div className="modal-row vacation">
<span className="title"><span className="red-star">*</span>节假日区间&emsp;</span> <span className="title"><span className="red-star">*</span>节假日区间&emsp;</span>
<DatePicker value={startDate} onChange={e=>{setStartDate(e)}} format={'YYYY-MM-DD'} />
<DatePicker value={startDate} onChange={e=>{setStartDate(e)}} allowClear={false} format={'YYYY-MM-DD'} />
</div> </div>
<div className="modal-row vacation"> <div className="modal-row vacation">
<span className="title">&emsp;</span> <span className="title">&emsp;</span>
<DatePicker value={endDate} onChange={e=>{setEndDate(e)}} format={'YYYY-MM-DD'} />
<DatePicker value={endDate} onChange={e=>{setEndDate(e)}} allowClear={false} format={'YYYY-MM-DD'} />
</div> </div>
</Modal> </Modal>
</div> </div>

12
src/router/router.config.js

@ -850,6 +850,18 @@ let routes = [
component: pages.GeoSignalIgnoreConf, component: pages.GeoSignalIgnoreConf,
}, },
{ {
path: "/operationCenter/wechatMenuMgm",
text: "公众号菜单配置",
name: "wechatMenuMgm",
component: pages.WechatMenuMgm,
},
{
path: "/operationCenter/mobileDeviceMgm",
text: "移动端管理配置",
name: "mobileDeviceMgm",
component: pages.MobileDeviceMgm,
},
{
// -------------------------------财务管理 - 电子发票 // -------------------------------财务管理 - 电子发票
path: "/financialMgm/createInvoiceRecord", path: "/financialMgm/createInvoiceRecord",
text: "开票记录", text: "开票记录",

43
src/services/OperationCenter/AppMgm/index.js

@ -0,0 +1,43 @@
import ajax from "@/config/ajax"
//公众号菜单配置-获取菜单
const getWechatMenuList = (params) => {
return ajax({
url: "/api/ope/app_manage/get_menu_list",
type: "post",
data: params,
});
};
// 公众号菜单配置-发布菜单
const publishMenu = (params) => {
return ajax({
url: "/api/ope/app_manage/publish_menu",
type: "post",
data: params,
});
};
// 移动端管理配置 获取移动端管理数据
const getAboutUsInfo = (params) => {
return ajax({
url: "/api/ope/app_manage/get_about_us_info",
type: "post",
data: params,
});
};
// 移动端管理配置 编辑保存移动端管理数据
const editAboutUsInfo = (params) => {
return ajax({
url: "/api/ope/app_manage/edit_about_us_info",
type: "post",
data: params,
});
};
export default{
getWechatMenuList,
publishMenu,
getAboutUsInfo,
editAboutUsInfo
}

4
src/services/OperationCenter/index.js

@ -4,10 +4,12 @@ import OperationSales from "./OperationSales";
import CustomerManage from "./CustomerManage"; import CustomerManage from "./CustomerManage";
import ParkingCardMgm from "./ParkingCardMgm"; import ParkingCardMgm from "./ParkingCardMgm";
import StaggeredMgm from "./StaggeredMgm"; import StaggeredMgm from "./StaggeredMgm";
import AppMgm from "./AppMgm";
export default { export default {
...CustomerServieMgm, ...CustomerServieMgm,
...OperationSales, ...OperationSales,
...CustomerManage, ...CustomerManage,
...ParkingCardMgm, ...ParkingCardMgm,
...StaggeredMgm
...StaggeredMgm,
...AppMgm
}; };

14
src/services/SystemMgm/BusinessConf/index.js

@ -74,6 +74,17 @@ const getHotCbdList = (params) => {
}); });
}; };
// 热门商圈配置- 新增配置
const addCbdConfig = (params) => {
return ajax({
url: "/api/manage/business/add_cbd_config",
type: "post",
data: params,
});
};
// 热门商圈配置-重新配置 // 热门商圈配置-重新配置
const editHotCbdConfig = (params) => { const editHotCbdConfig = (params) => {
return ajax({ return ajax({
@ -123,7 +134,7 @@ const editVacationConfig = (params) => {
const deleteVacationConfig = (params) => { const deleteVacationConfig = (params) => {
return ajax({ return ajax({
url: "/api/manage/business/delete_vacation_config", url: "/api/manage/business/delete_vacation_config",
type: "post",
type: "get",
data: params, data: params,
}); });
}; };
@ -173,6 +184,7 @@ export default {
editBusiness, editBusiness,
delBusiness, delBusiness,
getHotCbdList, getHotCbdList,
addCbdConfig,
editHotCbdConfig, editHotCbdConfig,
deleteHotCbd, deleteHotCbd,
getVacationData, getVacationData,

Loading…
Cancel
Save