Browse Source

Merge branch 'develop' of http://120.27.195.166:3000/chenglb/PMS_Frontend_v1.0.0 into develop

tags/PMS_Frontend_v1.0.6-develop
chenqiang 1 year ago
parent
commit
8d6f20c764
  1. 10
      src/assets/css/base.scss
  2. 195
      src/components/ParkingRecordModal/RecordReviewModal.jsx
  3. 122
      src/components/ParkingRecordModal/VehicleInformation.jsx
  4. 183
      src/components/ParkingRecordModal/dataSource.js
  5. 260
      src/components/ParkingRecordModal/index.jsx
  6. 290
      src/components/ParkingRecordModal/index.scss
  7. 15
      src/components/QuickMenu/index.jsx
  8. 4
      src/components/index.jsx
  9. 4
      src/components/layout/Header/index.jsx
  10. 1
      src/config/character.config.js
  11. 367
      src/pages/FinancialMgm/ExceptionDeal/StartExceptionDeal/index.jsx
  12. 195
      src/pages/FinancialMgm/ExceptionDeal/StartExceptionDeal/index.scss
  13. 4
      src/pages/FinancialMgm/SettleBill/GeneralBusiness/loadable.jsx
  14. 102
      src/pages/MerchantMgm/InvoiceConf/loadable.jsx
  15. 14
      src/pages/MerchantMgm/MerchantInfo/loadable.jsx
  16. 1
      src/pages/SystemMgm/AdminMgm/index.scss
  17. 81
      src/pages/SystemMgm/AdminMgm/loadable.jsx
  18. 8
      src/pages/SystemMgm/AreaManage/ModalAreaAdd/index.jsx
  19. 30
      src/pages/SystemMgm/AreaManage/loadable.jsx
  20. 33
      src/pages/SystemMgm/BusinessConfig/BusinessConf/loadable.jsx
  21. 27
      src/pages/SystemMgm/RoleMgm/loadable.jsx
  22. 52
      src/services/FinancialMgm/exceptionDeal.js
  23. 2
      src/services/system.js

10
src/assets/css/base.scss

@ -26,7 +26,10 @@ body {
& { overflow: -moz-scrollbars-none; }
}
.redLogo{
color: red;
margin-right: 10px;
}
.full-loading {
height: 100%;
width: 100%;
@ -54,7 +57,7 @@ a {
background-color: #3e4557 !important;
}
.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content {
max-height: 715px;
max-height: 680px;
overflow: auto;
}
.ant-table-content::-webkit-scrollbar {
@ -734,3 +737,6 @@ color:var(--color-text) !important;
// .ant-checkbox{
// background-color: #454c5e;
// }
.ant-table-tbody>tr.ant-table-placeholder:hover>td {
background: #3e4557 !important;
}

195
src/components/ParkingRecordModal/RecordReviewModal.jsx

@ -0,0 +1,195 @@
import React, { useState, useRef, useEffect } from "react";
import { Modal, Tabs, Table, message, Button, Input, Select } from "antd";
import { RightOutlined, DownOutlined } from "@ant-design/icons";
import { dictionary, utils } from "@/config/common";
import VehicleInformation from "./VehicleInformation";
import { payRecordColumns, refundRecordColumns, operatorRecordColumns } from "./dataSource";
import moment from "moment";
import ajax from "@/services";
import "./index.scss";
const { TextArea } = Input;
const RecordReviewModal = (props) => {
const {
className = "",
title = null, //
open = false,
data = [],
disabledModal = false, //
onCancel,
} = props;
//
const columns = [
{
title: "停车订单ID",
dataIndex: "park_id",
key: "park_id",
width: 200,
align: "center",
fixed: 'left',
render: (text) => (
<>
<a onClick={() => {
navigator.clipboard.writeText(`${text}`).then(() => { message.success("已复制到剪切板") });
}}>{text}</a>
</>
),
},
{
title: "车牌号",
dataIndex: "plateNumber",
key: "plateNumber",
align: "center",
},
{
title: "停车场名称",
dataIndex: "parkName",
key: "parkName",
align: "center",
},
{
title: "入场时间",
dataIndex: "strEntryTime",
key: "strEntryTime",
align: "center",
},
{
title: "出场时间",
dataIndex: "strExitTime",
key: "strExitTime",
align: "center",
},
];
const [modalVisible, setModalVisible] = useState(false); //
const [resultData, setResultData] = useState([]); //
const [expandedRowKeys, setExpandedRowKeys] = useState([0]); //
//
const $onCancelModal = () => {
if (onCancel) onCancel(false);
setResultData([]);
setExpandedRowKeys([0]);
}
useEffect(() => {
setModalVisible(open)
}, [open]);
useEffect(() => {
if (data?.length) {
let _data = [];
data.map((item, index) => {
let value = {
...item,
key: index,
road: item?.parkName || "",
region: item?.areaName || "",
operator: item?.operationName || "",
berth_id: item?.berthCode,
road_type: item?.parkTypeName || "",
}
_data.push({
...value,
description: <VehicleInformation className="abnormal-order--table-content" data={value} type="2" />
})
});
setResultData(_data);
};
}, [data])
return (
<Modal
className={`parking-record-modal ${className}`}
title={title}
open={modalVisible}
onCancel={$onCancelModal}
destroyOnClose={true}
footer={null}
>
<div className="item-title">停车订单详情</div>
<Table
className="table"
columns={columns}
dataSource={resultData}
scroll={{ y: 400 }}
pagination={false}
expandable={{
expandedRowRender: (record) => <>{record.description}</>,
expandedRowKeys,
expandIcon: ({ expanded, onExpand, record }) =>
expanded ? (
<DownOutlined onClick={e => { onExpand(record, e); setExpandedRowKeys([]) }} />
) : (
<RightOutlined onClick={e => { onExpand(record, e); setExpandedRowKeys([record?.key]) }} />
)
}}
/>
{disabledModal ?
<div className="process-view">
<div className="item-title">流程查看 <span>查看全部</span></div>
<div className="item-content">
<div className="start">
<span className="num">1</span>
<span>发起处理</span>
<span>哈哈哈 2023-10-26 18:08:48</span>
</div>
<div className="centre">已完成</div>
<div className="end">
<span className="num">2</span>
<span>发起处理</span>
<span>哈哈哈 2023-10-26 18:08:48</span>
</div>
</div>
</div>
: null
}
<div className="order-text">
<div className="item-title">异常订单处理</div>
<span><em>*</em>处理理由</span>
<TextArea
maxLength={100}
showCount
placeholder="请输入处理理由"
defaultValue={disabledModal ? resultData?.[0]?.deal_reason : null}
disabled={disabledModal}
onChange={(e) => { console.log(e.target.value); }}
/>
</div>
<div className="process-mode">
<div className="item-title">处理方式</div>
<div className="yisa-search">
<label><em>*</em>更改项</label>
<Select
style={{ width: 200 }}
placeholder="请选择更改项"
// value={submitDeploy.adviseType}
options={[
{
value: 1,
label: '调整出场时间'
},
{
value: 2,
label: '变更车牌号'
},
{
value: 3,
label: '变更订单金额'
},
{
value: 4,
label: '免费该订单'
},
{
value: 5,
label: '作废该订单'
}
]}
onChange={() => {}}
/>
</div>
</div>
</Modal>
);
}
export default RecordReviewModal;

122
src/components/ParkingRecordModal/VehicleInformation.jsx

@ -0,0 +1,122 @@
import React, { useState, useRef, useEffect } from "react";
import { dictionary, utils } from "@/config/common";
import { Image } from 'antd';
import { ImgError } from "@/components"
import errorImg from '@/assets/images/layout/error.png'
import "./index.scss";
const VehicleInformation = (props) => {
const {
className = "",
data = {},
type = "1", // "1": "2":
} = props
const [carImgPreview, setCarImgPreview] = useState(true); //
const [plateImgPreview, setPlateImgPreview] = useState(true); //
return (
<div className={`vehicle-information-modal ${className}`}>
<div className="park">
<div className="title"><span>{type == "1" ? "停车场信息" : "车场详情"}</span><span className="line"></span></div>
{<div className="content">
<div className="item"><span>停车场名称</span><span title={data?.road || "--"}>{data?.road || "--"}</span></div>
<div className="item"><span>泊位号</span><span title={data?.berth_id}>{data?.berth_id || "--"}</span></div>
<div className="item"><span>区域</span><span title={data?.region}>{data?.region || "--"}</span></div>
<div className="item"><span>{type == "1" ? "商户" : "商户名称"}</span><span title={data?.operator}>{data?.operator || "--"}</span></div>
<div className="item"><span>车场类型</span><span title={data?.road_type}>{data?.road_type || "--"}</span></div>
</div>}
</div>
{type == "1" ?
<div className="car">
<div className="title"><span>停车信息</span><span className="line"></span></div>
<div className="content">
<div className="item"><span>车牌号</span><span title={data?.plate || "--"}>{data?.plate || "--"}</span></div>
<div className="item"><span>会员手机</span><span title={data?.phone || "--"}>{data?.phone || "--"}</span></div>
<div className="item"><span>入场时间</span><span title={data?.in_time || "--"}>{data?.in_time || "--"}</span></div>
<div className="item"><span>出场时间</span><span title={data?.out_time || "--"}>{data?.out_time || "--"}</span></div>
<div className="item"><span>停车时长</span><span title={data?.admission_time || "--"}>{data?.admission_time || "--"}</span></div>
<div className="item"><span>订单金额</span><span title={data?.order_amount || "--"}>{data?.order_amount || "--"}</span></div>
<div className="item"><span>停车卡抵扣</span><span title={data?.parking_card_discount || "--"}>{data?.parking_card_discount || "--"}</span></div>
<div className="item"><span>车场折扣</span><span title={data?.road_discount || "--"}>{data?.road_discount || "--"}</span></div>
<div className="item"><span>应收金额</span><span title={data?.receivable_amount || "--"}>{data?.receivable_amount || "--"}</span></div>
<div className="item"><span>优惠券</span><span title={data?.preferential_amount || "--"}>{data?.preferential_amount || "--"}</span></div>
<div className="item"><span>优惠总计</span><span title={data?.preferential_total || "--"}>{data?.preferential_total || "--"}</span></div>
<div className="item"><span>实付金额</span><span title={data?.actual_amount || "--"}>{data?.actual_amount || "--"}</span></div>
<div className="item"><span>优惠退款</span><span title={data?.refund_discount || "--"}>{data?.refund_discount || "--"}</span></div>
<div className="item"><span>实付退款</span><span title={data?.actual_refund || "--"}>{data?.actual_refund || "--"}</span></div>
<div className="item"><span>退款总计</span><span title={data?.refund_total || "--"}>{data?.refund_total || "--"}</span></div>
<div className="item"><span>入场收费员</span><span title={data?.in_person || "--"}>{data?.in_person || "--"}</span></div>
<div className="item"><span>出场收费员</span><span title={data?.out_person || "--"}>{data?.out_person || "--"}</span></div>
</div>
</div>
: null
}
{type == "2" ?
<div className="car">
<div className="title"><span>车辆详情</span><span className="line"></span></div>
<div className="content">
<div className="item"><span>车牌号</span><span title={data?.plateNumber || "--"}>{data?.plateNumber || "--"}</span></div>
<div className="item"><span>停车时长</span><span title={data?.parkTime || "--"}>{data?.parkTime || "--"}</span></div>
<div className="item"><span>入场时间</span><span title={data?.strEntryTime || "--"}>{data?.strEntryTime || "--"}</span></div>
<div className="item"><span>出场时间</span><span title={data?.strExitTime || "--"}>{data?.strExitTime || "--"}</span></div>
<div className="item"><span>入场记录来源</span><span title={data?.entryDataSourceName || "--"}>{data?.entryDataSourceName || "--"}</span></div>
<div className="item"><span>出场记录来源</span><span title={data?.exitDataSourceName || "--"}>{data?.exitDataSourceName || "--"}</span></div>
<div className="item"><span>出入场图像</span><span>查看</span></div>
</div>
</div>
: null
}
{type == "2" ?
<div className="car">
<div className="title"><span>订单详情</span><span className="line"></span></div>
<div className="content">
<div className="item"><span>订单金额</span><span title={data?.shouldPayMoney || "--"}>{data?.shouldPayMoney || "--"}</span></div>
<div className="item"><span>优惠总计</span><span title={data?.totalCoupon || "--"}>{data?.totalCoupon || "--"}</span></div>
<div className="item"><span>实付总计</span><span title={data?.totalPreMoney || "--"}>{data?.totalPreMoney || "--"}</span></div>
<div className="item"><span>欠费总计</span><span title={data?.sumActualPay || "--"}>{data?.sumActualPay || "--"}</span></div>
</div>
</div>
: null
}
{type == "abnormalOrder" ?
<div className="car-img">
<div className="title"><span>入场照片</span><span className="line"></span></div>
<div className="img-box">
<div className="img-left">
{data?.in_veh_pic ?
<div className="img-null">
<Image
src={data?.in_veh_pic}
fallback={errorImg}
preview={carImgPreview}
onError={() => { setCarImgPreview(false) }}
/>
</div>
:
<div className="img-null">暂无车辆照片</div>
}
<span>车辆照片</span>
</div>
<div className="img-right">
{data?.in_plate_pic ?
<div className="img-null">
<Image
src={data?.in_plate_pic}
fallback={errorImg}
preview={plateImgPreview}
onError={() => { setPlateImgPreview(false) }}
/>
</div>
:
<div className="img-null">暂无车牌照片</div>
}
<span>车牌照片</span>
</div>
</div>
</div>
: null
}
</div>
);
}
export default VehicleInformation;

183
src/components/ParkingRecordModal/dataSource.js

@ -0,0 +1,183 @@
//用来存储表头的js文件
import React from "react";
import { Button } from "antd";
//支付记录的表头
export const payRecordColumns = [
{
title: "序号",
dataIndex: "id",
key: "id",
align: "center",
render: (text, record, index) => index + 1,
},
{
title: "订单ID",
dataIndex: "order_id",
key: "order_id",
align: "center",
},
{
title: "入场时间",
dataIndex: "admission_time",
key: "admission_time",
align: "center",
},
{
title: "计费时间",
dataIndex: "charging_time",
key: "charging_time",
align: "center",
},
{
title: "支付时间",
dataIndex: "pay_time",
key: "pay_time",
align: "center",
},
{
title: "应收金额",
dataIndex: "receivable_amount",
key: "receivable_amount",
align: "center",
},
{
title: "优惠金额",
dataIndex: "discount_amount",
key: "discount_amount",
align: "center",
},
{
title: "实付金额",
dataIndex: "paid_in_money",
key: "paid_in_money",
align: "center",
},
{
title: "支付类型",
dataIndex: "paymentType",
key: "paymentType",
align: "center",
},
{
title: "支付渠道",
dataIndex: "payment_channels",
key: "payment_channels",
align: "center",
},
{
title: "支付设备",
dataIndex: "payment_equipment",
key: "payment_equipment",
align: "center",
},
{
title: "支付人",
dataIndex: "pay_person",
key: "pay_person",
align: "center",
},
{
title: "付款路段",
dataIndex: "pay_road",
key: "pay_road",
align: "center",
},
{
title: "第三方流水ID",
dataIndex: "third_party_flow_id",
key: "third_party_flow_id",
align: "center",
},
];
//退款订单的表头
export const refundRecordColumns = [
{
title: "序号",
dataIndex: "id",
key: "id",
align: "center",
render: (text, record, index) => index + 1,
},
{
title: "退款方式",
dataIndex: "refund_type",
key: "refund_type",
align: "center",
},
{
title: "支付渠道",
dataIndex: "pay_road",
key: "pay_road",
align: "center",
},
{
title: "支付设备",
dataIndex: "pay_time",
key: "pay_time",
align: "center",
},
{
title: "退款原因",
dataIndex: "reason",
key: "reason",
align: "center",
},
{
title: "退款金额",
dataIndex: "refund_amonut",
key: "refund_amonut",
align: "center",
},
{
title: "申请人",
dataIndex: "application_person",
key: "application_person",
align: "center",
},
{
title: "申请时间",
dataIndex: "application_time",
key: "application_time",
align: "center",
},
{
title: "退款时间",
dataIndex: "refund_time",
key: "refund_time",
align: "center",
},
];
//操作记录
export const operatorRecordColumns = [
{
title: "序号",
dataIndex: "id",
key: "id",
align: "center",
render: (text, record, index) => index + 1,
},
{
title: "操作类型",
dataIndex: "type",
key: "type",
align: "center",
},
{
title: "操作来源",
dataIndex: "source",
key: "source",
align: "center",
},
{
title: "操作人/设备",
dataIndex: "object",
key: "object",
align: "center",
},
{
title: "操作时间",
dataIndex: "time",
key: "time",
align: "center",
},
];

260
src/components/ParkingRecordModal/index.jsx

@ -0,0 +1,260 @@
import React, { useState, useRef, useEffect } from "react";
import { Modal, Tabs, Table, message, Button } from "antd";
import { dictionary, utils } from "@/config/common";
import VehicleInformation from "./VehicleInformation";
import RecordReviewModal from "./RecordReviewModal";
import { payRecordColumns, refundRecordColumns, operatorRecordColumns } from "./dataSource";
import moment from "moment";
import ajax from "@/services";
import "./index.scss";
const ParkingRecordModal = (props) => {
const {
className = "",
title = null,
open = false,
tableData = {},
tabsTitle = [
{text: "停车记录信息", value: "1"},
{text: "支付记录", value: "2"},
{text: "退款订单", value: "3"},
{text: "操作记录", value: "4"},
{text: "历史处理", value: "5"},
],
onCancel,
} = props;
const [modalVisible, setModalVisible] = useState(false); //
const [tabKey, setTabKey] = useState("1"); // tab
const [loading, setLoading] = useState(false); //
const [payRecord, setPayRecord] = useState([]); //
const [recordReviewModal, setRecordReviewModal] = useState({open: false, data: []}); //
//
const historyProgressColumns = [
{
title: "序号",
dataIndex: "id",
key: "id",
align: "center",
render: (text, record, index) => index + 1,
},
{
title: "状态",
dataIndex: "status",
key: "status",
align: "center",
render: (text) => {
return text == 1
? "待审核"
: text == 2
? "已完成"
: text == 3
? "已驳回"
: "--"
}
},
{
title: "处理记录ID",
dataIndex: "deal_record_id",
key: "deal_record_id",
align: "center",
render: (text) => (
<>
<a onClick={() => {
navigator.clipboard.writeText(`${text}`).then(() => { message.success("已复制到剪切板") });
}}>{text}</a>
</>
),
},
{
title: "处理时间",
dataIndex: "deal_time",
key: "deal_time",
align: "center",
},
{
title: "处理人",
dataIndex: "dealer",
key: "dealer",
align: "center",
},
{
title: "业务订单类型",
dataIndex: "business_type",
key: "business_type",
align: "center",
},
{
title: "更改项",
dataIndex: "change_content",
key: "change_content",
align: "center",
// render: (text) => {
// return text == 1
// ? ""
// : text == 2
// ? ""
// : text == 3
// ? ""
// : text == 4
// ? ""
// : ""
// }
},
{
title: "更改初始值",
dataIndex: "initial_value",
key: "initial_value",
align: "center",
},
{
title: "更改更新值",
dataIndex: "update_value",
key: "update_value",
align: "center",
},
{
title: "操作",
dataIndex: "operation",
key: "operation",
align: "center",
fixed: "right",
render: (_, record) => {
return (
<Button
type="primary"
onClick={() => {$historyOperation(record?.deal_record_id)}}
>
操作
</Button>
);
},
},
];
//
const $handleCancel = () => {
setModalVisible(false);
setTabKey("1");
setPayRecord([]);
if(onCancel) {
onCancel(false);
};
};
// tab
const $changeKey = (key) => {
setTabKey(key);
setPayRecord([]);
if(key == 1) return;
if(!tableData?.park_id) return message.error("未获取到停车订单ID,请重新选择!")
setLoading(true);
let url =
key == "2" ? ajax.getStartExceptionPaymentList : //
key == "3" ? ajax.getStartExceptionRefundList : // 退
key == "4" ? ajax.getStartExceptionHandleList : //
key == "5" ? ajax.getStartExceptionHistoryList : null; //
url({park_record_id: tableData?.park_id}).then((res) => {
setLoading(false);
if (res.status === 20000 || res.status == 0) {
setPayRecord(res?.data?.list || []);
} else {
message.error(res.message);
}
}).catch((error) => {
setLoading(false);
message.error(error.message);
});
};
//
const $renderModalTable = (columns, dataSource) => {
return (
<Table
className="table"
rowKey={(row) => row?.order_id || row?.id || row?.deal_record_id || Math.random()*10000 }
columns={columns}
dataSource={dataSource}
scroll={{ y: 670 }}
loading={loading}
pagination={false}
/>
);
};
//
const $historyOperation = (id) => {
ajax.getStartExceptionParkingRecordsInfo({id}).then((res) => {
if (res.status === 20000 || res.status == 0) {
setRecordReviewModal({open: true, data: res?.data || []})
} else {
message.error(res.message);
}
}).catch((error) => {
message.error(error.message);
});
};
useEffect(() => {
setModalVisible(open)
}, [open]);
return (
<>
<Modal
className={`parking-record-modal ${className}`}
title={title}
open={modalVisible}
onCancel={$handleCancel}
destroyOnClose={true}
footer={null}
>
<Tabs
activeKey={tabKey}
onChange={$changeKey}
items={
tabsTitle.map((item) => {
let tem;
switch (tabKey) {
case "1":
tem = <VehicleInformation data={tableData} type="1" />;
break;
case "2":
//
tem = $renderModalTable(payRecordColumns, payRecord)
break;
case "3":
// 退
tem = $renderModalTable(refundRecordColumns, payRecord)
break;
case "4":
//
tem = $renderModalTable(operatorRecordColumns, payRecord)
break;
case "5":
//
tem = $renderModalTable(historyProgressColumns, payRecord)
break;
default:
break;
}
return{
label: item.text,
key: item.value,
children: tem
}
})
}
/>
</Modal>
<RecordReviewModal
title="异常订单处理记录审核"
{...recordReviewModal}
disabledModal={true}
onCancel={() => {setRecordReviewModal({open: false, data: []})}}
/>
</>
);
}
export default ParkingRecordModal;

290
src/components/ParkingRecordModal/index.scss

@ -0,0 +1,290 @@
@import "@/assets/css/mixin.scss";
.parking-record-modal {
width: 1500px !important;
top: 20px !important;
.ant-modal-header {
padding: 16px;
}
.ant-modal-content {
.ant-modal-body {
padding-top: 0;
.ant-tabs .ant-tabs-nav-wrap .ant-tabs-nav-list {
width: 50%;
}
}
}
.item-title {
display: flex;
align-items: center;
margin-bottom: 15px;
color: #fff;
font-weight: 700;
&::before {
content: "";
display: inline-block;
width: 5px;
height: 14px;
margin-right: 10px;
background-color: #177ddc;
}
}
.table {
width: 100%;
margin-top: 20px;
.ant-table-body {
@include scrollBar(var(--color-user-list-bg), #3B97FF);
}
.ant-table-thead {
th {
// padding: 0px 16px;
height: 50px;
}
.ant-table-cell {
background: var(--color-table-header-bg) !important;
font-weight: 700;
&::before {
display: none;
}
}
}
.ant-table-tbody {
tr {
&:nth-child(2n) {
td {
background: #3E4557 !important;
}
}
&:hover {
td {
background: #3E4557 !important;
}
}
td {
background: #3E4557 !important;
// border-bottom-color: #f2f2f2;
}
}
}
.ant-pagination-options {
.ant-select {
&:hover {
.ant-select-selector {
border-color: #f5f6f9;
box-shadow: none;
}
}
}
.ant-select-selector {
border-color: #f5f6f9;
}
.ant-select-focused {
.ant-select-selector {
box-shadow: none !important;
border-color: #f5f6f9 !important;
}
}
.ant-pagination-options-quick-jumper {
input {
background: #3E4557;
border-color: #f5f6f9;
&:focus {
box-shadow: none;
}
}
}
}
.ant-table-cell-fix-left, .ant-table-cell-fix-right {
z-index: 2;
}
}
.process-view {
margin-top: 16px;
.item-content {
display: flex;
justify-content: center;
// align-items: center;
.start,
.end {
display: flex;
flex-direction: column;
width: 40%;
align-items: center;
overflow: hidden;
.num {
position: relative;
width: 30px;
height: 30px;
text-align: center;
line-height: 30px;
border: 1px solid #fff;
border-radius: 50%;
}
}
.start .num::after {
content: "";
position: absolute;
left: 100%;
width: 1000px;
height: 2px;
background-color: #fff;
margin-top: 14px;
margin-left: 10px;
}
.end .num::before {
content: "";
position: absolute;
right: 100%;
width: 1000px;
height: 2px;
background-color: #fff;
margin-top: 14px;
margin-right: 10px
}
.centre {
margin: 7px 10px 0;
}
}
}
.order-text,
.process-mode {
em {
margin-right: 5px;
color: #a61d24;
}
}
.order-text {
margin-top: 15px;
>span {
display: block;
margin-bottom: 10px;
}
}
.process-mode {
margin-top: 15px;
.yisa-search {
>label {
margin-right: 5px;
}
}
}
}
.vehicle-information-modal {
.park,
.car,
.car-img {
margin-top: 20px;
.title {
display: flex;
align-items: center;
font-size: 14px;
.line {
flex: 1;
border: 1px dotted #607092;
padding-left: 10px;
}
>span {
&:first-child {
margin-right: 10px;
}
}
}
.content {
display: flex;
flex-wrap: wrap;
padding: 20px 20px 0;
font-size: 14px;
>.item {
display: flex;
align-items: center;
width: calc(100% / 3 - 10px);
margin-top: 10px;
&:nth-child(3n - 1) {
margin-left: 15px;
margin-right: 15px;
}
&:nth-child(-n + 3) {
margin-top: 0;
}
>span {
display: inline-block;
width: 120px;
height: 32px;
line-height: 32px;
background: rgba(150, 161, 192, 0.24);
text-align: center;
&:last-child {
width: 320px;
height: 32px;
padding: 0 20px;
text-align: center;
background: #3E4557;
box-shadow: 0px 3px 8px 0px rgba(0, 0, 0, 0.12);
@include textEllipsis()
}
}
}
}
}
.img-box {
display: flex;
padding: 20px 20px 0;
.img-left,
.img-right {
width: 400px;
.img-null {
border: 1px solid #607092;
width: 100%;
height: 200px;
line-height: 200px;
text-align: center;
.ant-image {
width: 100%;
height: 100%;
.ant-image-img {
height: 100%;
object-fit: contain;
}
}
}
>span {
display: block;
text-align: center;
margin-top: 10px;
}
}
.img-right {
margin-left: 50px;
}
}
}
.abnormal-order--table-content {
padding: 0 50px;
.park {
margin-top: 0;
}
.park,
.car,
.car-img {
.content {
>.item {
>span {
&:last-child {
width: 270px;
}
}
}
}
}
}

15
src/components/QuickMenu/index.jsx

@ -55,7 +55,8 @@ function QuickMenu(props) {
h: endMoment.format('HH'),
m: endMoment.format('mm'),
s: endMoment.format('ss')
}
},
value: periodId
}, '')
} else if (periodId < 0) {
@ -71,7 +72,8 @@ function QuickMenu(props) {
h: endMoment.format('HH'),
m: endMoment.format('mm'),
s: endMoment.format('ss')
}
},
value: periodId
}, "2")
} else {
$yisaOnChange({
@ -86,7 +88,8 @@ function QuickMenu(props) {
h: nowMoment.format('HH'),
m: nowMoment.format('mm'),
s: nowMoment.format('ss')
}
},
value: periodId
}, '')
}
@ -103,13 +106,15 @@ function QuickMenu(props) {
_v = {
time: v.time,
startDateTime: v.startDateTime && `${(v.startDateTime).format(dateArr[picker])} ${_bTime}`,
endDateTime: v.endDateTime && `${(v.endDateTime).format(dateArr[picker])} ${_eTime}`
endDateTime: v.endDateTime && `${(v.endDateTime).format(dateArr[picker])} ${_eTime}`,
value: v?.value || ""
}
} else {
_v = {
time: v.time,
startDateTime: v.startDateTime && (v.startDateTime).format(dateArr[picker]),
endDateTime: v.endDateTime && (v.endDateTime).format(dateArr[picker])
endDateTime: v.endDateTime && (v.endDateTime).format(dateArr[picker]),
value: v?.value || ""
}
}
onChange(_v)

4
src/components/index.jsx

@ -33,6 +33,7 @@ import TreeSelectGroup from "./TreeSelectGroup";
import SelectLntLat from "./SelectLngLat";
import ImportBtn from './ImportBtn';
import QuickMenu from './QuickMenu';
import ParkingRecordModal from './ParkingRecordModal';
export * from "./layout";
export * from "./MapComponets";
@ -74,5 +75,6 @@ export {
TreeSelectGroup,
SelectLntLat,
ImportBtn,
QuickMenu
QuickMenu,
ParkingRecordModal
};

4
src/components/layout/Header/index.jsx

@ -237,9 +237,9 @@ export default function Header(props) {
<Icon type="sanjibumen" />
</li>
</Popover>
<li title="换肤" className="skin-icon icon-color" onClick={changeSkin}>
{/* <li title="" className="skin-icon icon-color" onClick={changeSkin}>
<Icon type="pifu" />
</li>
</li> */}
{/* <li title="" className="shouye">
<UserInfo />
</li> */}

1
src/config/character.config.js

@ -1,5 +1,6 @@
export default {
pageSizeOptions: [20, 40, 60, 100, 200], // 页码
pageSizeOptions1: [15, 30, 60, 100, 200], // 页码
maxDate: 365, // 时间组件最大选择范围
//事件状态
eventStateList: [{

367
src/pages/FinancialMgm/ExceptionDeal/StartExceptionDeal/index.jsx

@ -1,35 +1,10 @@
import React, { useState, useRef, useEffect } from "react";
import {
message,
Pagination,
Table,
Space,
Modal,
Select,
Input,
Cascader,
DatePicker,
Button
} from "antd";
import { message, Pagination, Table, Select, Input, Cascader, DatePicker, Button, Popover } from "antd";
import { dictionary, utils } from "@/config/common";
import moment from "moment";
import {
useSessionStorageState,
useUpdateEffect,
useSize,
useUpdate,
} from "ahooks";
import { useSessionStorageState, useUpdateEffect } from "ahooks";
import ajax from "@/services";
import {
QuickMenu,
FormSelect,
OptionPanel,
ResultPanel,
FormSliderPicker,
AreaCascader,
ImgResize,
ImgZoom,
} from "@/components";
import { QuickMenu, ParkingRecordModal} from "@/components";
import "./index.scss";
import errorImg from "@/assets/images/layout/error.png";
import { useLocation } from "react-router-dom";
@ -37,31 +12,184 @@ function StartExceptionDeal() {
//
const defaultData = {
park_id: "", // ID
operator_id: 0, //
area: [0], //
road_id: "", //
operator: 0, //
region: [0], //
road: "", //
road_type: 0, //
plate: "", //
exit_gate: 2, //
start_date: moment().subtract(7, "days").startOf("day").format("YYYY-MM-DD HH:mm:ss"), //
end_date: moment().format("YYYY-MM-DD HH:mm:ss"), //
type: 1, // 1: 2:
start_time: moment().subtract(7, "days").startOf("day").format("YYYY-MM-DD HH:mm:ss"), //
end_time: moment().format("YYYY-MM-DD HH:mm:ss"), //
pn: 1,
page_size: dictionary?.pageSizeOptions1[0]
};
// session
// const [defaultParams, setDefaultParams] = useSessionStorageState(
// "formData_editOrderInquiry",
// { defaultValue: null }
// );
//
const [formData, setFormData] = useState({
...defaultData,
});
const [operatorList, setOperatorList] = useState([
{ value: 0, label: "全部" },
]); //
const [formData, setFormData] = useState(defaultData); //
const [operatorList, setOperatorList] = useState([{ value: 0, label: "全部" }]); //
const [areaList, setAreaList] = useState([]); //
const [loading, setLoading] = useState(false); //
const [tableSelectCheck, setTableSelectCheck] = useState([]); // id
const [parkingRecordModal, setParkingRecordModal] = useState({open: false, tableData: {}}); //
//
const [resultData, setResultData] = useState({
total: 0,
list: [],
});
//
const tableColumns = [
{
title: "序号",
width: 60,
align: "center",
fixed: 'left',
render: (text, record, index) => index + 1,
},
{
title: "停车订单ID",
dataIndex: "park_id",
key: "park_id",
width: 200,
align: "center",
fixed: 'left',
render: (text) => (
<>
<a onClick={() => {
navigator.clipboard.writeText(`${text}`).then(() => { message.success("已复制到剪切板") });
}}>{text}</a>
</>
),
},
{
title: "停车时长",
dataIndex: "admission_time",
key: "admission_time",
align: "center",
width: 150,
},
{
title: "区域",
dataIndex: "region",
key: "region",
align: "center",
width: 150,
},
{
title: "运营商名称",
dataIndex: "operator",
key: "operator",
align: "center",
width: 150,
},
{
title: "停车场名称",
dataIndex: "road",
key: "road",
align: "center",
width: 150,
},
{
title: "车场类型",
dataIndex: "road_type",
key: "road_type",
align: "center",
width: 150,
},
{
title: " 车牌号",
dataIndex: "plate",
key: "plate",
align: "center",
width: 150,
},
{
title: "泊位号",
dataIndex: "berth_id",
key: "berth_id",
align: "center",
width: 150,
},
{
title: "入场时间",
dataIndex: "in_time",
key: "in_time",
align: "center",
width: 150,
},
{
title: "计费时间",
dataIndex: "out_time",
key: "out_time",
align: "center",
width: 150,
},
{
title: "订单金额(元)",
dataIndex: "order_amount",
key: "order_amount",
align: "center",
width: 150,
},
{
title: "欠费总计(元)",
dataIndex: "arrears_mount",
key: "arrears_mount",
align: "center",
width: 150,
},
{
title: '操作',
key: 'operation',
dataIndex: 'operation',
align: "center",
fixed: 'right',
width: 100,
render: (text, record, index) => {
return <>
<Popover
overlayClassName="start-exception-deal-operate"
content={
<div className="operateBtn operate-btn" style={{ cursor: "pointer" }} trigger="hover">
<div className="hover" onClick={() => {setParkingRecordModal({open: true, tableData: record || {}})}}>查看</div>
{ record?.status_now == 2 ?
<div className="disabled">处理中</div> :
<div className="hover" onClick={() => {console.log("处理");}}>处理</div>
}
</div>
}
>
<Button type="primary">操作</Button>
</Popover>
</>
},
},
];
//
const $batchProcessing = () => {
if(!tableSelectCheck?.length) return message.error("请选择需要处理的数据!");
console.log(tableSelectCheck);
};
//
const $changePn = (pn, page_size) => {
let temFormData = {};
if(formData.page_size == page_size) {
temFormData = {
...formData,
pn
};
} else {
temFormData = {
...formData,
pn: 1,
page_size,
};
};
setFormData(temFormData);
$getTableList(temFormData);
};
//
const $getAllOperator = () => {
@ -97,12 +225,34 @@ function StartExceptionDeal() {
});
};
//
const $getTableList = (value = {}) => {
setTableSelectCheck([]); //
let _data = {
...formData,
...value
};
setLoading(true);
ajax.getStartExceptionTableData(_data).then((res) => {
setLoading(false);
if (res.status === 20000 || res.status == 0) {
setResultData(res?.data || {});
} else {
message.error(res.message);
}
}).catch((error) => {
setLoading(false);
message.error(error.message);
});
};
useEffect(() => {
$getAllOperator();
$getAreaList();
$getTableList();
}, []);
return (
<div className="start-exception-deal edit-order-inquiry">
<div className="start-exception-deal">
<div className="paid-search">
<div className="title">查询条件</div>
<div className="form-Wrap">
@ -132,9 +282,9 @@ function StartExceptionDeal() {
value: "id",
children: "children",
}}
value={formData.area}
value={formData.region}
onChange={(v, option) => {
setFormData({ ...formData, area: v ? v : [0] });
setFormData({ ...formData, region: v ? v : [0] });
}}
/>
</div>
@ -145,8 +295,8 @@ function StartExceptionDeal() {
placeholder="请选择"
options={operatorList}
allowClear
value={formData.operator_id}
onChange={(v) => setFormData({ ...formData, operator_id: v || 0})}
value={formData.operator}
onChange={(v) => setFormData({ ...formData, operator: v || 0})}
/>
</div>
<div className="yisa-search">
@ -155,9 +305,9 @@ function StartExceptionDeal() {
className="form-con"
placeholder="请输入车场名称"
allowClear
value={formData?.road_id}
value={formData?.road}
onChange={(e) =>
setFormData({ ...formData, road_id: e.target.value || "" })
setFormData({ ...formData, road: e.target.value || "" })
}
/>
</div>
@ -192,15 +342,15 @@ function StartExceptionDeal() {
options={[
{
label: "出场",
value: 1,
value: 2,
},
{
label: "入场",
value: 2,
value: 1,
},
]}
value={formData.exit_gate}
onChange={(v) => setFormData({ ...formData, exit_gate: v})}
value={formData.type}
onChange={(v) => setFormData({ ...formData, type: v})}
/>
</div>
<div className="yisa-search">
@ -209,10 +359,10 @@ function StartExceptionDeal() {
className="form-con"
showTime
format={"YYYY-MM-DD HH:mm:ss"}
value={moment(formData.start_date)}
disabledDate={(current) => current > moment(formData.end_date)}
value={moment(formData.start_time)}
disabledDate={(current) => current > moment(formData.end_time)}
onChange={(date, time) => {
setFormData({ ...formData, start_date: time || null })
setFormData({ ...formData, start_time: time || null })
}}
/>
</div>
@ -222,22 +372,44 @@ function StartExceptionDeal() {
className="form-con"
showTime
format={"YYYY-MM-DD HH:mm:ss"}
value={moment(formData.end_date)}
disabledDate={(current) => current < moment(formData.start_date)}
value={moment(formData.end_time)}
disabledDate={(current) => current < moment(formData.start_time)}
onChange={(date, time) => {
setFormData({ ...formData, end_date: time || null })
setFormData({ ...formData, end_time: time || null })
}}
/>
</div>
<div className="yisa-search">
<label></label>
<QuickMenu
dropdownData = {[
{ text: '昨日', value: 1 },
{ text: '近30天', value: 30 },
{ text: '近90天', value: 90 },
{ text: '近180天', value: 180 }
]}
onChange={(v) => {
console.log(v);
let plate = formData?.plateNumber || "";
let value = v?.value || 0;
if (plate) {
console.log(utils?.validationPlate(plate))
if (utils?.validationPlate(plate)) {
setFormData({
...formData,
end_date: v?.endDateTime || null,
start_date: v?.startDateTime || null,
end_time: v?.endDateTime || null,
start_time: v?.startDateTime || null,
})
} else {
message.error('请正确输入车牌号')
return
}
} else {
if(value > 30) return message.warning("请输入您查询的车牌号!");
}
setFormData({
...formData,
end_time: v?.endDateTime || null,
start_time: v?.startDateTime || null,
})
}}
/>
@ -245,14 +417,22 @@ function StartExceptionDeal() {
<div className="form-btn">
<Button
className="reset"
onClick={() => setFormData(defaultData)}
onClick={() => setFormData({...defaultData, pn: formData?.pn || 1, page_size: formData?.page_size || dictionary?.pageSizeOptions1[0]})}
>
重置
</Button>
<Button
className="submit"
type="primary"
// onClick={handleSearch}
onClick={() => {
let _data = {
...formData,
pn: 1,
page_size: dictionary?.pageSizeOptions1[0]
}
setFormData(_data)
$getTableList(_data)
}}
loading={loading}
>
查询
@ -260,6 +440,55 @@ function StartExceptionDeal() {
</div>
</div>
</div>
<div className="paid-result">
<div className="result">
<div className="row-head">
<span className="number-wrapper">申诉记录列表</span>
<div onClick={$batchProcessing}>
<Button type="primary">
批量处理
</Button>
</div>
</div>
<div className="result-data">
<Table
rowKey={(row) => row.park_id}
className="table"
dataSource={resultData?.list || []}
columns={tableColumns}
pagination={false}
loading={loading}
rowSelection={{
selectedRowKeys: tableSelectCheck,
onChange: (selectedRowKeys, selectedRows) => {
console.log(selectedRowKeys, selectedRows);
setTableSelectCheck(selectedRowKeys)
},
getCheckboxProps: (record) => ({
disabled: record?.status_now == 2
})
}}
scroll={{ x: "1500", y: "calc(100vh - 310px)" }}
/>
<Pagination
className="pagination-common"
showSizeChanger={true}
showQuickJumper= {true}
showTotal={() => `${resultData.total|| 0}`}
total={resultData.total}
current={formData.pn}
pageSize={formData.page_size}
pageSizeOptions={dictionary?.pageSizeOptions1}
onChange={$changePn}
/>
</div>
</div>
</div>
<ParkingRecordModal
title = {parkingRecordModal?.tableData?.road || null}
{...parkingRecordModal}
onCancel={() => {setParkingRecordModal({open: false, tableData: {}})}}
/>
</div>
);
}

195
src/pages/FinancialMgm/ExceptionDeal/StartExceptionDeal/index.scss

@ -5,6 +5,180 @@ $color-text: var(--color-text);
$color-primary: var(--color-primary);
.start-exception-deal {
display: flex;
padding-top: 10px;
width: 100%;
height: 100%;
.paid-search {
display: block;
width: 375px;
padding: 10px 10px 20px 20px;
.title {
width: 100%;
font-size: 16px;
font-family: Microsoft YaHei, Microsoft YaHei-Bold;
font-weight: 700;
text-align: left;
color: var(--color-text);
margin-bottom: 20px;
}
.form-Wrap {
height: calc(100% - 45px);
overflow-y: auto;
scrollbar-width: none;
-ms-overflow-style: none;
&::-webkit-scrollbar {
display: none;
}
}
.yisa-search {
width: 100%;
display: flex;
align-items: center;
margin-bottom: 24px;
label {
color: var(--color-search-list-item-text);
flex: 0 0 25%;
max-width: 25%;
text-align: right;
padding-right: 8px;
}
.form-con {
flex: 1;
width: 220px;
}
}
.form-btn {
display: flex;
flex-flow: row nowrap;
padding: 0 10px;
justify-content: space-between;
.reset {
width: 90px;
height: 36px;
border-radius: 4px;
}
.submit {
width: calc(100% - 100px);
height: 36px;
border-radius: 4px;
}
}
.ant-select-selector,
.ant-picker,
.ant-input {
background-color: var(--color-search-list-item-bg) !important;
box-shadow: none !important;
color: var(--color-search-list-item-value);
border-color: var(--color-search-list-item-bd) !important;
}
}
.paid-result {
width: calc(100% - 375px);
padding-bottom: 15px;
padding: 20px;
background: var(--color-user-list-bg);
border-top-left-radius: 20px;
box-shadow: 0px 3px 8px 0px rgba(0, 0, 0, 0.08);
.result {
height: 100%;
display: flex;
flex-direction: column;
.row-head {
height: 32px;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 13px;
}
.result-data {
width: 100%;
height: calc(100% - 45px - 60px);
.table {
width: 100%;
.ant-table-body {
@include scrollBar(var(--color-user-list-bg), #3B97FF);
}
.ant-table-thead {
th {
// padding: 0px 16px;
height: 50px;
}
.ant-table-cell {
background: var(--color-table-header-bg) !important;
font-weight: 700;
&::before {
display: none;
}
}
}
.ant-table-tbody {
tr {
&:nth-child(2n) {
td {
background: #3E4557 !important;
}
}
&:hover {
td {
background: #3E4557 !important;
}
}
td {
background: #3E4557 !important;
// border-bottom-color: #f2f2f2;
}
}
}
.ant-pagination-options {
.ant-select {
&:hover {
.ant-select-selector {
border-color: #f5f6f9;
box-shadow: none;
}
}
}
.ant-select-selector {
border-color: #f5f6f9;
}
.ant-select-focused {
.ant-select-selector {
box-shadow: none !important;
border-color: #f5f6f9 !important;
}
}
.ant-pagination-options-quick-jumper {
input {
background: #3E4557;
border-color: #f5f6f9;
&:focus {
box-shadow: none;
}
}
}
}
.ant-table-cell-fix-left, .ant-table-cell-fix-right {
z-index: 2;
}
}
}
}
}
}
.start-exception-deal-cascader {
@ -12,3 +186,24 @@ $color-primary: var(--color-primary);
background-color: var(--color-tag-bg) !important;
}
}
.start-exception-deal-operate {
.ant-popover-inner-content {
padding: 5px 5px;
width: 100%;
.hover,
.disabled {
padding: 5px 12px;
text-align: center;
}
.hover {
&:hover {
background-color: #414960;
}
}
.disabled {
cursor: no-drop;
color: rgba(255, 255, 255, .3);
}
}
}

4
src/pages/FinancialMgm/SettleBill/GeneralBusiness/loadable.jsx

@ -254,8 +254,8 @@ function GeneralBusiness() {
(res) => {
if (parseInt(res?.status) === 20000) {
setData({
data: res?.data || {},
total: res.total || 0,
data: res?.data.list || [],
total: res.data.total || 0,
});
setLoading(true);
} else {

102
src/pages/MerchantMgm/InvoiceConf/loadable.jsx

@ -61,6 +61,8 @@ function InvoiceConf() {
const [taxTypeStatus,setTaxTypeStatus]=useState()
//
const [rateStatus,setRateStatus]=useState()
//
const [InvoicePlatform, setInvoicePlatform] = useState(2);
//
//
const tenantOption = [
@ -463,6 +465,8 @@ function InvoiceConf() {
tax_type,
code,
auth_code,
appkey,
appsecret,
request_url,
request_code,
request_func,
@ -477,6 +481,7 @@ function InvoiceConf() {
sell_bank_num,
pay_name,
check_name,
drawer_name,
mini_amount,
max_amount,
} = value
@ -490,6 +495,8 @@ function InvoiceConf() {
tax_type,
code,
auth_code,
appkey,
appsecret,
request_url,
request_code,
request_func,
@ -504,6 +511,7 @@ function InvoiceConf() {
sell_bank_num,
pay_name,
check_name,
drawer_name,
mini_amount,
max_amount,
}
@ -540,11 +548,10 @@ function InvoiceConf() {
type: 1,
receipt_type: 0,
status: 0,
last_time: [moment(defaultData.start), moment(defaultData.end)]
};
setFormData(defaultData)
searchForm.setFieldsValue(value)
getTable({ ...value, pn: 1 })
searchForm.setFieldsValue({...value, last_time: [moment(defaultData.start), moment(defaultData.end)]})
// getTable({ ...value, pn: 1, start: defaultData.start , end: defaultData.end})
}
useEffect(
() => {
@ -556,7 +563,6 @@ function InvoiceConf() {
// getTable()
}, []
)
useEffect(() => {
if (sessionInvoiceConf && Object.values(sessionInvoiceConf).length > 0) {
// console.log(4333, sessionInvoiceConf)
@ -582,7 +588,6 @@ function InvoiceConf() {
setSessionInvoiceConf(formData)
}
}, [formData])
return (
<div className="invoiceConf">
@ -693,7 +698,7 @@ function InvoiceConf() {
条件重置
</Button>
<Button type="primary" onClick={() => { createData() }}>
创建用户
创建配置
</Button>
</Form.Item>
</Form>
@ -748,6 +753,9 @@ function InvoiceConf() {
initialValues={{
receipt_type: 2,
}}
// onValuesChange={(v,allValue) => {
// console.log(v,allValue, 123);
// }}
>
<Form.Item
label="发票平台"
@ -759,7 +767,7 @@ function InvoiceConf() {
{ required: true, message: "请选择发票平台!" }
]}
>
<Radio.Group>
<Radio.Group onChange={(e) => {setInvoicePlatform(e.target.value)}}>
<Radio value={1}>航信</Radio>
<Radio value={2}>航信诺诺</Radio>
<Radio value={3}>百旺</Radio>
@ -890,6 +898,7 @@ function InvoiceConf() {
<Form
form={editForm}
>
{InvoicePlatform != 2 ?
<Form.Item
label="平台编码:"
labelAlign="left"
@ -909,6 +918,9 @@ function InvoiceConf() {
showCount
/>
</Form.Item>
: null
}
{InvoicePlatform != 2 ?
<Form.Item
label="授权码:"
labelAlign="left"
@ -928,6 +940,53 @@ function InvoiceConf() {
showCount
/>
</Form.Item>
: null
}
{InvoicePlatform == 2 ?
<Form.Item
label="APPKEY:"
labelAlign="left"
name="appkey"
required={true}
className="form-item"
validateTrigger="onBlur"
rules={[
{ required: true, message: "请输入APPKEY!" },
{ min: 0, max: 36, message: "最大长度为36" }
]}
>
<Input
placeholder="请输入授权码"
className="form-item"
maxLength={36}
showCount
/>
</Form.Item>
: null
}
{InvoicePlatform == 2 ?
<Form.Item
label="APPSECRET:"
labelAlign="left"
name="appsecret"
required={true}
className="form-item"
validateTrigger="onBlur"
rules={[
{ required: true, message: "请输入APPSECRET!" },
{ min: 0, max: 36, message: "最大长度为36" }
]}
>
<Input
placeholder="请输入授权码"
className="form-item"
maxLength={36}
showCount
/>
</Form.Item>
: null
}
<Form.Item
label="请求地址:"
labelAlign="left"
@ -947,6 +1006,7 @@ function InvoiceConf() {
showCount
/>
</Form.Item>
{InvoicePlatform != 2 ?
<Form.Item
label="请求码:"
labelAlign="left"
@ -966,6 +1026,9 @@ function InvoiceConf() {
showCount
/>
</Form.Item>
: null
}
{InvoicePlatform != 2 ?
<Form.Item
label="请求函数:"
labelAlign="left"
@ -985,6 +1048,9 @@ function InvoiceConf() {
showCount
/>
</Form.Item>
: null
}
{InvoicePlatform != 2 ?
<Form.Item
label="目标命名空间:"
labelAlign="left"
@ -1004,16 +1070,8 @@ function InvoiceConf() {
showCount
/>
</Form.Item>
</Form>
</div>
</div>
<div className="right">
<div className="right-wrap">
<Form
form={editForm}
>
: null
}
<Form.Item
label="纳税人名称:"
labelAlign="left"
@ -1052,6 +1110,16 @@ function InvoiceConf() {
showCount
/>
</Form.Item>
</Form>
</div>
</div>
<div className="right">
<div className="right-wrap">
<Form
form={editForm}
>
<Form.Item
label="销贷方名称:"
labelAlign="left"

14
src/pages/MerchantMgm/MerchantInfo/loadable.jsx

@ -382,12 +382,10 @@ function MerchantInfo() {
type: '',
businessType: '',
status: '',
last_time: [moment(defaultData.start), moment(defaultData.end)]
};
setFormData(defaultData)
searchForm.setFieldsValue(value)
getTable({ ...value, pn: 1 })
searchForm.setFieldsValue({...value, last_time: [moment(defaultData.start), moment(defaultData.end)]})
// getTable({ ...value, pn: 1, start: defaultData.start , end: defaultData.end})
}
//
const changePn = (pn, length) => {
@ -1221,7 +1219,7 @@ function MerchantInfo() {
</Form>
</div>
</div>
<div className="clearinformation">
{/* <div className="clearinformation">
<div className="title"><span>清结算信息</span></div>
<div className="clear">
<Form
@ -1371,7 +1369,7 @@ function MerchantInfo() {
</div>
</div>
</div> */}
</div>
</div>
</div>
@ -1977,7 +1975,7 @@ function MerchantInfo() {
</div>
</div>
</div>
<div className="clearInformation">
{/* <div className="clearInformation">
<div className="title"><span>清结算信息</span></div>
<div className="clear">
<div className="clear-wrap">
@ -1991,7 +1989,7 @@ function MerchantInfo() {
</div>
</div>
</div> */}
<div className="operationInformation">
<div className="title"><span>操作信息</span></div>

1
src/pages/SystemMgm/AdminMgm/index.scss

@ -26,6 +26,7 @@ $color-primary: var(--color-primary);
display: flex;
label {
line-height: 31px;
}
}
.yisa-time {

81
src/pages/SystemMgm/AdminMgm/loadable.jsx

@ -99,6 +99,19 @@ function AdminMgm(props) {
const handleDeptName = (v) => {
setAddManage({ ...addManage, deptName: v })
};
//
const handleRole = (v) => {
setAddManage({ ...addManage, role: v })
};
//
const handleGovernmentType = (v) => {
setGetGovernment(v)
setAddManage({ ...addManage, government_style: v })
}
//
const handleArea = (v) => {
setAddManage({ ...addManage, government_area: v })
}
//
const onChangeCarType = (e) => {
setAddManage({ ...addManage, car_type: e.target.value })
@ -143,6 +156,13 @@ function AdminMgm(props) {
let data = {
...addManage
}
if (addManage.account == '') {
message.error('请输入登录名')
} else if (addManage.userName == '') {
message.error('请输入姓名')
} else if (addManage.deptName == '') {
message.error('请输入所属部门')
} else {
ajax.addAdminDate(data).then(res => {
if (res.status === 20000) {
setImgVisible(false)
@ -161,6 +181,8 @@ function AdminMgm(props) {
}
})
}
}
//
const handleColumns = (tab) => {
let result = [...deployListColumns];
@ -220,7 +242,7 @@ function AdminMgm(props) {
title: '状态',
render: (text, record) => {
return <>
{record.workState === 1 ? '离职' : '在职'}
{record.workState === 1 ? '在职' : '离职'}
</>
}
},
@ -231,7 +253,7 @@ function AdminMgm(props) {
<Popover content={
<div className="SpecialRecordBtnAdmin">
<div onClick={() => { CheckApplyBtn(record) }}>编辑</div>
<div onClick={() => { deleteApplyBtn(record) }}>{record.workState === 1 ? '在职' : '离职'}</div>
<div onClick={() => { deleteApplyBtn(record) }}>{record.workState === 1 ? '离职' : '在职'}</div>
<div onClick={() => { applyBtn(record) }}>重置密码</div>
</div>}>
<button className="SpecialAdmin">操作</button>
@ -584,7 +606,7 @@ function AdminMgm(props) {
>
<div className="addAdmin">
<div className="yisa-search">
<label>手机号</label>
<label style={{ marginLeft: 15 }}>手机号</label>
<Input
placeholder="请输入手机号"
value={addManage.mobile}
@ -594,6 +616,7 @@ function AdminMgm(props) {
/>
</div>
<div className="yisa-search">
<div className="redLogo">*</div>
<label>登录名</label>
<Input
placeholder="请输入用户名"
@ -603,11 +626,12 @@ function AdminMgm(props) {
/>
</div>
<div className="yisa-search">
<label>姓名</label>
<div className="redLogo">*</div>
<label style={{ marginLeft: 15 }}>姓名</label>
<Input
placeholder="请输入姓名"
value={addManage.userName}
style={{ width: 260, marginLeft: 42 }}
style={{ width: 260, marginLeft: 26 }}
onChange={handleAddUserName}
/>
</div>
@ -619,7 +643,7 @@ function AdminMgm(props) {
</Radio.Group>
</div>
<div className="yisa-search">
<label>邮箱</label>
<label style={{ marginLeft: 15 }}>邮箱</label>
<Input
placeholder="请输入邮箱"
value={addManage.email}
@ -628,6 +652,7 @@ function AdminMgm(props) {
/>
</div>
<div className="yisa-search">
<div className="redLogo">*</div>
<label>所属部门</label>
<Cascader
style={{ width: 260, marginLeft: 14 }}
@ -644,6 +669,50 @@ function AdminMgm(props) {
/>
</div>
<div className="yisa-search">
<label>角色</label>
<Select
style={{ width: 260, marginLeft: 42 }}
placeholder="请选择"
value={addManage.role}
options={getRoleData}
onChange={handleRole}
/>
</div>
<div className="yisa-search">
<label>管辖方式</label>
<Select
style={{ width: 260, marginLeft: 14 }}
placeholder="请选择"
value={addManage.government_style}
options={[{
value: 2,
label: '按街管理'
},
{
value: 3,
label: '按区管理'
},]}
onChange={handleGovernmentType}
/>
</div>
<div className="yisa-search">
<label>管辖区域</label>
<Tree
checkable
style={{ width: 260, marginLeft: 14 }}
onCheck={handleArea}
checkedKeys={addManage.government_area}
// onSelect={onSelect}
treeData={getGovernmentArea}
fieldNames={{
title: 'name',
key: 'id',
children: 'children'
}}
/>
</div>
<div className="yisa-search">
<label>管辖车场接入方式</label>
<Radio.Group onChange={onChangeCarType} value={addManage.car_type}>
<Radio value={1}>全部</Radio>

8
src/pages/SystemMgm/AreaManage/ModalAreaAdd/index.jsx

@ -16,7 +16,6 @@ function ModalAreaAdd (props) {
level,
onCancel
} = props
const [form] = Form.useForm()
const [areaType, setAreaType] = useState("1")
@ -100,16 +99,11 @@ function ModalAreaAdd (props) {
</Form.Item>
) : null
}
<Form.Item label="中心点坐标" rules={[{required: true}]}>
<Form.Item label="中心点坐标" >
<Row gutter={8}>
<Col span={18}>
<Form.Item
name="latlng"
rules={[
{
required: true,
},
]}
>
<Input />
</Form.Item>

30
src/pages/SystemMgm/AreaManage/loadable.jsx

@ -73,7 +73,8 @@ function AreaManage() {
}
})
}
const handleAreaAdd = ({level, pid, isCity}) => {
const handleAreaAdd = ({ level, id, isCity }) => {
let pid = id
setIsCity(isCity)
setPid(pid)
setLevel(Number(level) + 1)
@ -88,7 +89,15 @@ function AreaManage() {
}
//
const handleAreaDel = ({name, id}) => {
const handleAreaDel = ({ name, id, children }) => {
let arr = []
arr.push(id)
console.log(children, id);
if (children != undefined) {
children.map(res => {
arr.push(res.id)
})
}
Modal.confirm({
title: '确认删除?',
content: `是否确认删除区域: ${name}`,
@ -96,7 +105,7 @@ function AreaManage() {
okText: '删除',
cancelText: '取消',
onOk: () => {
ajaxAreaDel({name, id}).then((msg) => {
ajaxAreaDel({ name, arr }).then((msg) => {
message.success(msg)
getAreaTree()
}).catch((err) => {
@ -150,14 +159,21 @@ function AreaManage() {
return <>
<span className='label-text'>{name}</span>
{
children ? (
<PlusCircleOutlined className='label-icon' onClick={() => handleAreaAdd({level, pid, isCity: true})} />
level === 1 ? (
<PlusCircleOutlined className='label-icon' onClick={() => handleAreaAdd({ level, id, isCity: true })} />
) : null
}
{
level === 2 ? <>
<PlusCircleOutlined className='label-icon' onClick={() => handleAreaAdd({ level, id, isCity: false })} />
<DeleteOutlined className="label-icon" onClick={() => handleAreaDel({ name, id, children })} />
<EditOutlined className="label-icon" onClick={() => handleAreaEdit({ name, id, virtually_code, code, lng_lat })} />
</> : null
}
{
level > 2 ? <>
<PlusCircleOutlined className='label-icon' onClick={() => handleAreaAdd({level, pid, isCity: false})} />
<DeleteOutlined className="label-icon" onClick={() => handleAreaDel({name, id})} />
{/* <PlusCircleOutlined className='label-icon' onClick={() => handleAreaAdd({level, pid, isCity: false})} /> */}
<DeleteOutlined className="label-icon" onClick={() => handleAreaDel({ name, id, children })} />
<EditOutlined className="label-icon" onClick={() => handleAreaEdit({ name, id, virtually_code, code, lng_lat })} />
</> : null
}

33
src/pages/SystemMgm/BusinessConfig/BusinessConf/loadable.jsx

@ -45,7 +45,7 @@ function BusinessConf(props) {
//
const [addManage, setAddManage] = useState({
area_name: 0,
operator_name: 0,
operator_name: "0",
item_name: ''
})
const addAdmin = () => {
@ -66,8 +66,11 @@ function BusinessConf(props) {
const handleConfiguration = (v, option) => {
setGetMessage(option);
setGetConfiguration(v)
setAddManage({ ...addManage, item_name: v })
setAddManage({
...addManage, item_name: v ,
area_name: 0,
operator_name: "0",
})
}
//
const onChangeAdd = (e) => {
@ -113,21 +116,33 @@ function BusinessConf(props) {
}
//
const placeSaveBtn = () => {
console.log(addManage.parameter);
let data = {
...addManage
}
if (addManage.area_name === '') {
message.error('请选择城市')
} else if (addManage.operator_name === '') {
message.error('请选择商户名称')
} else if (addManage.item_name === '') {
message.error('请选择配置项')
} else if (addManage.parameter === undefined && addManage.parameterValue === undefined) {
message.error('请选择参数项')
} else {
ajax.addBusiness(data).then(res => {
if (res.status === 20000) {
setImgVisible(false)
setAddManage({
area_name: 0,
operator_name: 0,
operator_name: "0",
item_name: ''
})
getData(formData)
setGetConfiguration(0)
}
})
}
}
//
const handleColumns = (tab) => {
let result = [...deployListColumns];
@ -219,9 +234,10 @@ function BusinessConf(props) {
setImgVisible(false)
setAddManage({
area_name: 0,
operator_name: 0,
operator_name: '0',
item_name: ''
})
setGetConfiguration(0)
setGetMessage({})
}
//
@ -274,7 +290,7 @@ function BusinessConf(props) {
setImgVisible(false)
setAddManage({
area_name: 0,
operator_name: 0,
operator_name: '0',
item_name: ''
})
setGetMessage({})
@ -346,6 +362,7 @@ function BusinessConf(props) {
if (res.status === 20000) {
setEditVisible(false)
getData(formData)
setGetConfiguration(0)
}
})
}
@ -448,6 +465,7 @@ function BusinessConf(props) {
>
<div className="addAdmin">
<div className="yisa-search">
<div className="redLogo">*</div>
<label>城市</label>
<Select
style={{ width: 260, marginLeft: 50 }}
@ -459,6 +477,7 @@ function BusinessConf(props) {
/>
</div>
<div className="yisa-search">
<div className="redLogo">*</div>
<label>商户名称</label>
<Select
style={{ width: 260, marginLeft: 22 }}
@ -470,6 +489,7 @@ function BusinessConf(props) {
/>
</div>
<div className="yisa-search">
<div className="redLogo">*</div>
<label>配置项</label>
<Select
style={{ width: 260, marginLeft: 35 }}
@ -490,6 +510,7 @@ function BusinessConf(props) {
?
<>
<div className="yisa-search">
<div className="redLogo">*</div>
<label>参数</label>
<Input
placeholder="请输入"

27
src/pages/SystemMgm/RoleMgm/loadable.jsx

@ -134,7 +134,13 @@ function RoleMgm(props) {
let data = {
...addManage
}
console.log(data);
if(addManage.name===''){
message.error('请输入角色名称')
}else if(addManage.depart_id===''){
message.error('请选择所属部门')
}else if (addManage.auth === '') {
message.error('必须选择权限')
} else {
ajax.addAdmin(data).then(res => {
if (res.status === 20000) {
setImgVisible(false)
@ -145,11 +151,15 @@ function RoleMgm(props) {
auth: ''
})
getData(formData)
setGetGovernment(0)
} else {
message.error(res.message)
setGetGovernment(0)
}
})
}
}
//
const handleColumns = (tab) => {
let result = [...deployListColumns];
@ -281,13 +291,15 @@ function RoleMgm(props) {
setAddManage({
remark: '',
name: '',
depart_id: [],
depart_id: null,
})
setCheckedKeys([])
setGetGovernment(0)
}
const delcancelImg = () => {
setEditVisible(false)
setCheckedKeys([])
setGetGovernment(0)
}
//
const getData = (data = formData) => {
@ -366,15 +378,18 @@ function RoleMgm(props) {
})
}
useEffect(() => {
console.log(getGovernment);
if (getGovernment != 0) {
let data = {
id: getGovernment
}
ajax.getDepartId(data).then(res => {
if(res.status === 20000){
if (res.status == []) {
message.error('部门没有配置对应菜单权限')
}else{
setGetGovernmentArea(res.data)
}
}
})
}
}, [getGovernment])
@ -450,6 +465,7 @@ function RoleMgm(props) {
>
<div className="addAdmin">
<div className="yisa-search">
<div className="redLogo">*</div>
<label>角色名称</label>
<Input
placeholder="请输入"
@ -459,7 +475,7 @@ function RoleMgm(props) {
/>
</div>
<div className="yisa-search">
<label>备注</label>
<label style={{marginLeft:15}}>备注</label>
<Input
placeholder="请输入用户名"
value={addManage.remark}
@ -468,11 +484,12 @@ function RoleMgm(props) {
/>
</div>
<div className="yisa-search">
<div className="redLogo">*</div>
<label>所属部门</label>
<Cascader
style={{ width: 260, marginLeft: 50 }}
placeholder="请选择"
value={addManage.depart_id}
// value={addManage.depart_id}
options={getPlateColor}
changeOnSelect
onChange={handleDeptName}

52
src/services/FinancialMgm/exceptionDeal.js

@ -0,0 +1,52 @@
import ajax from "@/config/ajax";
export default {
// 发起异常处理 表格数据
getStartExceptionTableData: (params) => {
return ajax({
url: "/api/fin/abnormal_action/abnormal_list",
type: "post",
data: params,
});
},
// 发起异常处理 -- 详情支付记录
getStartExceptionPaymentList: (params) => {
return ajax({
url: "/api/fin/abnormal_action/abnormal_payment",
type: "post",
data: params,
});
},
// 发起异常处理 -- 详情退款记录
getStartExceptionRefundList: (params) => {
return ajax({
url: "/api/fin/abnormal_action/abnormal_refund",
type: "post",
data: params,
});
},
// 发起异常处理 -- 详情操作记录
getStartExceptionHandleList: (params) => {
return ajax({
url: "/api/fin/abnormal_action/abnormal_operate",
type: "post",
data: params,
});
},
// 发起异常处理 -- 详情历史处理
getStartExceptionHistoryList: (params) => {
return ajax({
url: "/api/fin/abnormal_action/abnormal_history",
type: "post",
data: params,
});
},
// 发起异常处理 -- 详情历史处理详情
getStartExceptionParkingRecordsInfo: (params) => {
return ajax({
url: "/api/fin/abnormal_action/parkingRecordsInfo",
type: "post",
data: params,
});
},
}

2
src/services/system.js

@ -276,7 +276,7 @@ const orgDetailEdit = (params) => {
const getOrgTree = (params) => {
return ajax({
url: '/api/manage/com/depart_tree',
type: 'post',
type: 'get',
data: params
})
}

Loading…
Cancel
Save