Browse Source

feat(): 停车卡订单整体布局以及相关部分逻辑功能编写

tags/PMS_Frontend_v1.0.6-develop
lisf 1 year ago
parent
commit
49eacb4fa9
  1. 128
      src/pages/OperationCenter/OtherBusiness/ParkingCard/ParkingCardMgm/loadable.jsx
  2. 137
      src/pages/OperationCenter/OtherBusiness/ParkingCard/ParkingCardOrder/index.scss
  3. 477
      src/pages/OperationCenter/OtherBusiness/ParkingCard/ParkingCardOrder/loadable.jsx
  4. 20
      src/services/OperationCenter/ParkingCardMgm/index.js

128
src/pages/OperationCenter/OtherBusiness/ParkingCard/ParkingCardMgm/loadable.jsx

@ -25,7 +25,7 @@ function ParkingCardMgm(props) {
})
const parameter = {
name: '',//
channel: '',//
channel_id: '',//
status: 0,//
operator_id: '',//
pn: 1,
@ -46,7 +46,7 @@ function ParkingCardMgm(props) {
}
//
const handleSaleChannel = (v) => {
setFormData({ ...formData, channel: v })
setFormData({ ...formData, channel_id: v })
}
//
const handleSaleType = (v) => {
@ -73,7 +73,7 @@ function ParkingCardMgm(props) {
let url = type == "下架" ? ajax.undercarriageGoods : ajax.putawayGoods;
url({ id }).then((res) => {
if (res.status === 20000) {
message.success(res.message || `${type}成功`);
message.success(`${type}成功`);
getData();
} else {
message.error(res.message);
@ -223,20 +223,30 @@ function ParkingCardMgm(props) {
uid: ''
})
const [getId, setGetId] = useState({})
//
const [actionType, setActionType] = useState(1) // 1 2
const scopeRef = useRef('')
const translateBtn = (record) => {
setGetId(record)
setEditVisible(true)
setGetEditData(Object.assign({}, getEditData, {
region_id: record.region_id,
operatorid: record.operatorid,
code: record.code,
name: record.goods_name,
brand_id: record.brand_id,
model_id: record.model_id,
status: record.status,
uid: record.use_name,
}))
}
// setGetId(record)
// setEditVisible(true)
// setGetEditData(Object.assign({}, getEditData, {
// region_id: record.region_id,
// operatorid: record.operatorid,
// code: record.code,
// name: record.goods_name,
// brand_id: record.brand_id,
// model_id: record.model_id,
// status: record.status,
// uid: record.use_name,
// }))
setActionType(2)
setAddVisible(true)
setCheckData({
...checkData,
...record
})
scopeRef.current = record.scope;
}
const editModal = () => {
setEditVisible(false)
}
@ -351,11 +361,13 @@ function ParkingCardMgm(props) {
}
//
const addData = () => {
setActionType(1)
setAddVisible(true)
}
const addModal = () => {
setCheckData(param)
setAddVisible(false)
setGetScope("1")
}
let param = {
operator: '',
@ -365,12 +377,13 @@ function ParkingCardMgm(props) {
effective_days: '',
operator_id: '',
scope: '',
channel: 0,
channel_id: 0,
uid: '',
sale_start:"",
sale_end:"",
card_num:0,
remark:""
remark:"",
days_value:1
}
//
@ -381,11 +394,11 @@ function ParkingCardMgm(props) {
);
};
//
const [value, setValue] = useState(1);
const [value, setValue] = useState(!checkData.days ? 2 : 1);
const onChangeTime = (e) => {
setCheckData({
...checkData,
days:''
days:'',
})
setValue(e.target.value);
};
@ -453,7 +466,7 @@ function ParkingCardMgm(props) {
const handleSales = (v) => {
setCheckData({
...checkData,
channel:v
channel_id:v
})
}
//
@ -500,7 +513,8 @@ function ParkingCardMgm(props) {
console.log(nextTargetKeys);
let str = nextTargetKeys.toString()
setEtcTargetKeys(nextTargetKeys);
setCheckData({ ...checkData, scope: str || "2" })
setCheckData({ ...checkData, scope: "2,"+str || "2" })
scopeRef.current = str
};
const onSelectEtcChange = (sourceSelectedKeys, targetSelectedKeys) => {
setSelectedEtcKeys([...sourceSelectedKeys, ...targetSelectedKeys]);
@ -533,7 +547,7 @@ function ParkingCardMgm(props) {
setGetInputNum(v)
setCheckData({ ...checkData, card_num: v })
}
const [getvalueNum, setGetvalueNum] = useState(1);
const [getvalueNum, setGetvalueNum] = useState(!checkData.card_num ? 2 : 1);
const onChangeValue = (e) => {
setGetvalueNum(e.target.value);
if (e.target.value === 1) {
@ -555,6 +569,7 @@ function ParkingCardMgm(props) {
setCheckData({ ...checkData, uid: v })
}
const placeSaveBtn = () => {
let url = actionType == 1 ? ajax.saveData : ajax.updataGoods
let data = {
...checkData,
}
@ -582,12 +597,12 @@ function ParkingCardMgm(props) {
message.error('请输入优惠金额')
}
else {
ajax.saveData(data).then((res) => {
url(data).then((res) => {
if (res.status === 20000) {
setAddVisible(false)
setCheckData(param)
getData(formData)
message.success(res.message)
message.success(actionType == 1 ? "保存成功" : "修改成功" )
}
}).catch(err => {
console.log(err);
@ -692,7 +707,7 @@ function ParkingCardMgm(props) {
<Select
style={{ width: 270 }}
placeholder="请选择"
value={formData.channel}
value={formData.channel_id}
options={sysConfig.saleChannel}
onChange={handleSaleChannel}
/>
@ -786,14 +801,42 @@ function ParkingCardMgm(props) {
<div className="carTitle">
<span className="font">销售信息</span>
</div>
<div className="detail-list">
<Descriptions
labelStyle={{wordBreak:"keep-all"}}
>
<Descriptions.Item label="销售日期" span={3}>
{cardItem?.name || '---'}
</Descriptions.Item>
<Descriptions.Item label="停车卡数量" span={2}>
{cardItem?.card_num || '---'}
</Descriptions.Item>
<Descriptions.Item label="销售渠道" span={1.5}>
{cardItem?.channel || '---'}
</Descriptions.Item>
<Descriptions.Item label="原价" span={1}>
{cardItem?.original_price || '---'}
</Descriptions.Item>
<Descriptions.Item label="优惠价格" span={1}>
{cardItem?.discount_amount || '---'}
</Descriptions.Item>
<Descriptions.Item label="销售价格" span={1}>
{cardItem?.selling_price || '---'}
</Descriptions.Item>
<Descriptions.Item label="备注" span={1.5}>
{cardItem?.remark || '---'}
</Descriptions.Item>
</Descriptions>
</div>
</Modal>
<Modal
visible={addVisible}
onCancel={addModal}
footer={null}
title='添加商品'
title={actionType == 1 ? '添加商品' : '修改商品' }
className="parkModal"
destroyOnClose={true}
style={{top:"30px"}}
>
<div className="carTitle">
<span className="font">基础信息</span>
@ -819,13 +862,19 @@ function ParkingCardMgm(props) {
<Space direction="vertical" size={12}>
<RangePicker
disabledDate={disabledDate}
// disabledTime={disabledRangeTime}
showTime={{
hideDisabledOptions: true,
defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('00:00:00', 'HH:mm:ss')],
}}
disabledTime={disabledRangeTime}
// showTime={{
// hideDisabledOptions: true,
// defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('00:00:00', 'HH:mm:ss')],
// }}
showTime
onChange={changeTime}
format="YYYY-MM-DD HH:mm:ss"
value={
checkData.effective_start == '' && checkData.effective_end == '' ?
[] :
[moment(checkData.effective_start),moment(checkData.effective_end)]
}
/>
</Space>
</Radio>
@ -848,7 +897,7 @@ function ParkingCardMgm(props) {
</Radio.Group>
</div>
{
value === 2 ?
checkData.days_value === 2 ?
<div className="yisa-search">
<em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
<label>有效天数</label>
@ -891,18 +940,20 @@ function ParkingCardMgm(props) {
label: '部分车场'
}
]}
value={checkData.scope.substring(0,1)}
/>
<em style={{marginRight:'5px',marginLeft:'5px'}}>*</em>
<label className="only">仅限商户下车场</label>
</div>
{
getScope == "2" ?
checkData.scope.substring(0,1) == "2" ?
<div className="yisa-search">
<Transfer
showSearch
dataSource={getEtcList}
titles={["未选择", "已选择"]}
targetKeys={EtctargetKeys}
// targetKeys={EtctargetKeys}
targetKeys={checkData.scope.split(",").filter((item,i) => i != 0)}
onChange={transferEtcChange}
selectedKeys={selectedEtcKeys}
onSelectChange={onSelectEtcChange}
@ -911,7 +962,7 @@ function ParkingCardMgm(props) {
</div> : ''
}
</div>
<div className="carTitle" style={{ marginTop: 10 }}>
<div className="carTitle" style={{ marginTop: 20 }}>
<span className="font">销售信息</span>
</div>
<div className="add">
@ -946,7 +997,9 @@ function ParkingCardMgm(props) {
controls={false}
style={{ width: 50,marginLeft:5,marginRight:5 }}
onChange={inputNum}
formatter={isNumber}>
formatter={isNumber}
value={checkData.card_num}
>
</InputNumber>
<label></label>
<label className="parkFont">根据合同签约的车位数量配置停车卡数量</label>
@ -971,6 +1024,7 @@ function ParkingCardMgm(props) {
label: '后台录入'
}
]}
value={checkData.channel_id}
/>
</div>
<div className="yisa-search extra-style">

137
src/pages/OperationCenter/OtherBusiness/ParkingCard/ParkingCardOrder/index.scss

@ -3,3 +3,140 @@ $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);
.paid-ParkingCardMgm {
display: flex;
padding: 15px;
width: 100%;
.paid-search {
.search {
font-size: 16px;
font-family:
Microsoft YaHei,
Microsoft YaHei-Bold;
font-weight: 700;
text-align: left;
color: #eeeff1;
}
label {
margin: 0 10px;
}
.yisa-search {
margin-top: 10px;
display: flex;
label {
line-height: 31px;
}
}
.exportBtn{
&:hover {
color: var(--color-text);
border-color: transparent;
// background: var(--button-default-bg-hover);
width: 90px;
height: 36px;
background: linear-gradient(180deg, #3aa9ff, #59b7ff);
border-radius: 4px;
}
}
.ant-select:not(.ant-select-customize-input) .ant-select-selector {
background-color: #50586c !important;
}
.ant-select-arrow .anticon {
background-color: #50586c !important;
}
.ant-input:placeholder-shown {
background-color: #50586c !important;
}
.timePicker {
width: 350px;
margin-top: 22px;
.btnBox {
display: flex;
margin-top: 20px;
.yisa-btn {
margin-left: 20px;
width: 85px;
}
.root_gfkk {
margin-left: 20px;
.export-content {
width: 130px;
height: 33px;
display: flex;
align-items: center;
justify-content: center;
background: #3b97ff;
border-radius: 3px;
cursor: pointer;
color: #fff;
margin-right: 10px;
}
}
}
}
}
.scheduleBtn {
background: #409eff;
border: none;
border-radius: 4px;
cursor: pointer;
}
.paid-result {
width: 100%;
height: 800px;
background: #505a6f;
border-radius: 20px;
margin-left: 17px;
.result {
padding: 25px;
.font {
font-family:
Microsoft YaHei,
Microsoft YaHei-Regular;
font-weight: 400;
text-align: left;
color: #eeeff1;
margin-bottom: 10px;
display: inline-block;
em {
color: #3aa8fe;
margin: 0 5px;
}
}
.yisa-table .ant-table-thead .ant-table-cell {
background-color: #616b83 !important;
color: #ffffff !important;
font-size: 14px;
font-family:
Microsoft YaHei,
Microsoft YaHei-Bold;
font-weight: 700;
text-align: center;
border-right: none !important;
border-top-color: #888f9d !important;
border-color: #888f9d !important;
}
.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table,
.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table {
border-top: none !important;
border-left: none !important;
}
.ant-table-tbody .ant-table-row .ant-table-cell {
background-color: #3e4557 !important;
color: #ffffff !important;
text-align: center;
font-size: 14px;
font-family:
Microsoft YaHei,
Microsoft YaHei-Regular;
font-weight: 400;
border-right: none !important;
border-left: none !important;
border-bottom-color: #626b7e !important;
}
}
}
}

477
src/pages/OperationCenter/OtherBusiness/ParkingCard/ParkingCardOrder/loadable.jsx

@ -1,15 +1,472 @@
import React, { useState, useRef, useEffect } from "react";
// import { message, Pagination, Table, Space, Modal, } 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";
import { Select, Input, Popconfirm,Button, Table, message, DatePicker, Pagination, Radio, Space, Cascader, Popover, Modal, InputNumber,Transfer, Descriptions } from 'antd'
import {
pageSizeOptions
} from '@/config/character.config.js'
import { ResultFlowResult } from "@/components"
import { SearchOutlined, PlusOutlined,VerticalAlignBottomOutlined } from '@ant-design/icons';
import moment from 'moment'
import { useSetState,} from 'ahooks';
import ajax from "@/services"
import "./index.scss";
const { RangePicker } = DatePicker;
function ParkingCardOrder() {
return <div>ParkingCardOrder</div>
//
const tableColumns = [
{
title: '车牌号',
dataIndex: 'plate',
key: 'plate',
},
{
title: '车牌颜色',
dataIndex: 'plate_type',
key: 'plate_type',
},
{
title: '手机号',
dataIndex: 'phone',
key: 'phone',
},
{
title: '商品名称',
dataIndex: 'name',
key: 'name',
},
{
title: '实付金额',
dataIndex: 'sale_amount',
key: 'sale_amount',
},
{
title: '支付渠道',
dataIndex: 'channel',
key: 'channel',
},
{
title: '支付设备',
dataIndex: 'equipment',
key: 'equipment',
},
{
title: '购买渠道',
dataIndex: 'purchase',
key: 'purchase',
},
{
title: '支付时间',
dataIndex: 'pay_time',
key: 'pay_time',
},
{
title: '订单状态',
dataIndex: 'status',
key: 'status',
},
{
title: '渠道流水号',
dataIndex: 'serial_number',
key: 'serial_number',
},
{
title: '操作',
render:(text,record) => {
return(
<>
<Popover content={
<div className="operateBtn">
<div onClick={() => { }}>查看</div>
<div onClick={() => { }}>修改</div>
</div>}>
<button className="scheduleBtn colorBtn">操作</button>
</Popover>
</>
)
}
}
]
const [formData, setFormData] = useSetState({
plate:'', //
phone:'', //
name:'', //
purchase:"0",//
status:'0',//
channel:'0',//
equipment:"0",//
serial_number:'',//
start_time: "",//
end_time: "",//
pn: 1,
page_size: Number(pageSizeOptions[0]), //
})
const [lastFormData, setLastFormData] = useState(formData)
const lastFormDataRef = useRef(formData)
const [resultData, setResultData] = useState({
data: [],
total: 0,
export_url: '',
process_url: ""
})
//
const disabledDate = (current) => {
return current && current < moment().startOf('day');
};
//
const getSearchData = (data = formData) => {
getData(data)
}
//
const [ajaxLoading, setAjaxLoading] = useState(false)
//
const getData = (data = formData) => {
setAjaxLoading(true)
ajax.getCardOrderList(data).then(res => {
setAjaxLoading(false)
if (res.status === 20000) {
let resDataArr = res.data.list.map((item) => {
item.key = item.id
return item
})
setResultData({
...resultData,
data: resDataArr,
total: res.data.total
})
}else {
setResultData({
data: [],
total: 0,
export_url: '',
process_url: ""
})
message.error(res.message)
}
}).catch(err => console.log(err))
}
//
const changePn = (pn, length) => {
if (lastFormData.page_size === length) {
setFormData(Object.assign({}, formData, { pn: pn, page_size: length }))
setLastFormData(Object.assign({}, lastFormData, { pn: pn }))
lastFormDataRef.current = Object.assign({}, lastFormData, { pn: pn })
getData(Object.assign({}, formData, { pn: pn, page_size: length }))
}
}
//
const changeLength = (pn, length) => {
setFormData(Object.assign({}, formData, { pn: 1, page_size: length }))
setLastFormData(Object.assign({}, lastFormData, { pn: 1, page_size: length }))
lastFormDataRef.current = Object.assign({}, lastFormData, { pn: 1, page_size: length })
getData(Object.assign({}, formData, { pn: 1, page_size: length }))
}
useEffect(() => {
getData()
}, [])
return (
<div className="paid-ParkingCardMgm">
<div className="paid-search">
<label className="search">查询条件</label>
<div className="yisa-search">
<label>车牌号</label>
<Input
placeholder="请输入内容"
value={formData.plate}
style={{ width: 270,marginLeft:15 }}
onChange={e => { setFormData({ plate: e.target.value }) } }
/>
</div>
<div className="yisa-search">
<label>手机号</label>
<Input
placeholder="请输入内容"
value={formData.phone}
style={{ width: 270,marginLeft:15 }}
onChange={e => { setFormData({ phone: e.target.value }) } }
/>
</div>
<div className="yisa-search">
<label>商品名称</label>
<Input
placeholder="请输入商品名称"
value={formData.name}
style={{ width: 270 }}
onChange={e => { setFormData({ name: e.target.value }) } }
/>
</div>
<div className="yisa-search">
<label>购买渠道</label>
<Select
style={{ width: 270}}
value={formData.purchase}
placeholder="请选择"
options={[
{
value: '0',
label: "全部"
},
{
value: '1',
label: '线上录入'
},
{
value: '2',
label: '后台录入'
}
]}
onChange={e=>{setFormData({purchase:e}) }}
/>
</div>
<div className="yisa-search">
<label>订单状态</label>
<Select
style={{ width: 270 }}
value={formData.status}
placeholder="请选择"
options={[
{
value: '0',
label: "全部"
},
{
value: '1',
label: '未生效'
},
{
value: '2',
label: '生效中'
},
{
value: '3',
label: '已失效'
}
]}
onChange={e=>{setFormData({status:e}) }}
/>
</div>
<div className="yisa-search">
<label>支付渠道</label>
<Select
style={{ width: 270}}
value={formData.channel}
placeholder="请选择"
options={[
{
value: '0',
label: "全部"
},
{
value: '1',
label: '系统自动扣款'
},
{
value: '2',
label: '微信公众号'
},
{
value: '3',
label: 'MS'
},
{
value: '4',
label: "PDA"
},
{
value: '5',
label: '开放平台支付'
},
{
value: '6',
label: '扫码抢'
},
{
value: '7',
label: '微信小程序'
},
{
value: '8',
label: '支付宝生活号'
},
{
value: '9',
label: '支付宝小程序'
},
{
value: '10',
label: '自主缴费机'
},
{
value: '11',
label: '后台录入'
},
{
value: '12',
label: 'H5'
},
{
value: '13',
label: 'ETC'
}
]}
onChange={e=>{setFormData({channel:e}) }}
/>
</div>
<div className="yisa-search">
<label>支付设备</label>
<Select
style={{ width: 270 }}
value={formData.equipment}
placeholder="请选择"
options={[
{
value: '0',
label: "全部"
},
{
value: '1',
label: '系统自动扣款'
},
{
value: '2',
label: '微信公众号'
},
{
value: '3',
label: 'MS'
},
{
value: '4',
label: "PDA"
},
{
value: '5',
label: '开放平台支付'
},
{
value: '6',
label: '扫码抢'
},
{
value: '7',
label: '微信小程序'
},
{
value: '8',
label: '支付宝生活号'
},
{
value: '9',
label: '支付宝小程序'
},
{
value: '10',
label: '自主缴费机'
},
{
value: '11',
label: '后台录入'
},
{
value: '12',
label: 'H5'
},
{
value: '13',
label: 'ETC'
}
]}
onChange={e=>{setFormData({equipment:e}) }}
/>
</div>
<div className="yisa-search">
<label>支付时间</label>
<RangePicker
style={{ width: 270 }}
disabledDate={disabledDate}
// disabledTime={disabledRangeTime}
showTime
onChange={(dates, dateStrings) => {
setFormData({start_time:dateStrings[0],end_time:dateStrings[1]})
}}
format="YYYY-MM-DD HH:mm:ss"
value={
formData.start_time == '' && formData.end_time == '' ?
[] :
[moment(formData.start_time),moment(formData.end_time)]
}
/>
</div>
<div className="yisa-search">
<label style={{marginLeft:"-5px"}}>渠道流水号</label>
<Input
placeholder="请输入渠道流水号"
value={formData.serial_number}
style={{ width: 270 }}
onChange={e => { setFormData({ serial_number: e.target.value }) } }
/>
</div>
<div className="timePicker yisa-search">
<div className="btnBox">
<Button
type="primary"
className="yisa-btn colorBtn"
icon={<SearchOutlined />}
onClick={()=>getSearchData()}>
搜索
</Button>
<Button
type="primary"
className="yisa-btn colorBtn"
icon={<PlusOutlined />}
onClick={() => { }}
style={{width:110}}>
添加订单
</Button>
<Button
type="primary"
className="yisa-btn exportBtn"
icon={<VerticalAlignBottomOutlined />}
onClick={() => { }}
style={{background:"#fff",color:'#59b7ff'}}
>
导出
</Button>
</div>
</div>
</div>
<div className="paid-result">
<div className="result">
<span className="font">共检索到<em>{resultData.total}</em>条结果</span>
<ResultFlowResult ajaxLoad={ajaxLoading} resultData={resultData.data ? resultData.data : []}>
<Table
bordered
// className='yisa-table'
dataSource={resultData.data}
columns={tableColumns}
pagination={false}
loading={ajaxLoading}
/>
<Pagination
className="pagination-common"
showSizeChanger
showQuickJumper
showTotal={() => `${resultData.total}`}
total={resultData.total}
current={lastFormData.pn}
pageSize={lastFormData.page_size}
pageSizeOptions={pageSizeOptions}
onChange={changePn}
onShowSizeChange={changeLength}
/>
</ResultFlowResult>
</div>
</div>
</div>
)
}
export default ParkingCardOrder;

20
src/services/OperationCenter/ParkingCardMgm/index.js

@ -30,9 +30,27 @@ const undercarriageGoods = (params) => {
data:params
})
}
// 修改商品
const updataGoods = (params) => {
return ajax({
url:'/api/ope/parkcard/edit',
type:'post',
data:params
})
}
// 获取卡片订单列表
const getCardOrderList = (params) => {
return ajax({
url:'/api/ope/parkcard/order_list',
type:'post',
data:params
})
}
export default {
getParkcardrList,
getParkList,
putawayGoods,
undercarriageGoods
undercarriageGoods,
updataGoods,
getCardOrderList
}
Loading…
Cancel
Save