From da0264d264f1c0d46edb5c87243117f0175c16f1 Mon Sep 17 00:00:00 2001 From: guoxin <guoxin@yisa.com> Date: Fri, 27 Oct 2023 10:25:24 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix():=E4=BF=AE=E6=94=B9=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=AE=A1=E7=90=86bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/css/base.scss | 7 +- src/components/layout/Header/index.jsx | 4 +- src/pages/SystemMgm/AdminMgm/index.scss | 1 + src/pages/SystemMgm/AdminMgm/loadable.jsx | 123 ++++++++++++++++----- .../SystemMgm/AreaManage/ModalAreaAdd/index.jsx | 9 +- src/pages/SystemMgm/AreaManage/loadable.jsx | 48 ++++---- .../BusinessConfig/BusinessConf/loadable.jsx | 63 +++++++---- src/pages/SystemMgm/RoleMgm/loadable.jsx | 59 ++++++---- src/services/system.js | 2 +- 9 files changed, 215 insertions(+), 101 deletions(-) diff --git a/src/assets/css/base.scss b/src/assets/css/base.scss index fd5707c..66a897a 100644 --- a/src/assets/css/base.scss +++ b/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 { diff --git a/src/components/layout/Header/index.jsx b/src/components/layout/Header/index.jsx index 51843ab..20b852a 100644 --- a/src/components/layout/Header/index.jsx +++ b/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> */} diff --git a/src/pages/SystemMgm/AdminMgm/index.scss b/src/pages/SystemMgm/AdminMgm/index.scss index 1da5b61..d159f5a 100644 --- a/src/pages/SystemMgm/AdminMgm/index.scss +++ b/src/pages/SystemMgm/AdminMgm/index.scss @@ -26,6 +26,7 @@ $color-primary: var(--color-primary); display: flex; label { line-height: 31px; + } } .yisa-time { diff --git a/src/pages/SystemMgm/AdminMgm/loadable.jsx b/src/pages/SystemMgm/AdminMgm/loadable.jsx index 042214d..ac3777e 100644 --- a/src/pages/SystemMgm/AdminMgm/loadable.jsx +++ b/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 }) @@ -131,7 +144,7 @@ function AdminMgm(props) { }; //添加移动端管辖区域 const handleMoveArea = (e) => { - setAddManage({ ...addManage, moveArea:e }) + setAddManage({ ...addManage, moveArea: e }) }; //添加失效时间 const onChangeTime = (date, dateString) => { @@ -143,23 +156,32 @@ function AdminMgm(props) { let data = { ...addManage } - ajax.addAdminDate(data).then(res => { - if (res.status === 20000) { - setImgVisible(false) - setAddManage({ - mobile: '', - userName: '', - account: '', - email: '', - deptName: '', - sex: 1, - car_type: 1, - messageRole: 0, - failure_time: '' - }) - getData(formData) - } - }) + 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) + setAddManage({ + mobile: '', + userName: '', + account: '', + email: '', + deptName: '', + sex: 1, + car_type: 1, + messageRole: 0, + failure_time: '' + }) + getData(formData) + } + }) + } + } //列表 const handleColumns = (tab) => { @@ -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> @@ -277,9 +299,9 @@ function AdminMgm(props) { messageRole: record.messageRole, failure_time: record.failure_time, role: record.role, - government_style:record.government_style, - government_area:record.government_area, - moveArea:record.moveArea + government_style: record.government_style, + government_area: record.government_area, + moveArea: record.moveArea })) } //管辖方式 @@ -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> diff --git a/src/pages/SystemMgm/AreaManage/ModalAreaAdd/index.jsx b/src/pages/SystemMgm/AreaManage/ModalAreaAdd/index.jsx index b447226..5bb07b0 100644 --- a/src/pages/SystemMgm/AreaManage/ModalAreaAdd/index.jsx +++ b/src/pages/SystemMgm/AreaManage/ModalAreaAdd/index.jsx @@ -16,7 +16,7 @@ function ModalAreaAdd (props) { level, onCancel } = props - + console.log(pid); const [form] = Form.useForm() const [areaType, setAreaType] = useState("1") @@ -100,16 +100,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> diff --git a/src/pages/SystemMgm/AreaManage/loadable.jsx b/src/pages/SystemMgm/AreaManage/loadable.jsx index f5eb16f..968da42 100644 --- a/src/pages/SystemMgm/AreaManage/loadable.jsx +++ b/src/pages/SystemMgm/AreaManage/loadable.jsx @@ -1,5 +1,5 @@ import React, { useState, useRef, useEffect } from "react"; -import { message, Pagination, Table, Input, Modal, Tree, Button } from "antd"; +import { message, Pagination, Table, Input, Modal, Tree, Button } from "antd"; import { DeleteOutlined, EditOutlined, PlusCircleOutlined } from '@ant-design/icons'; import ajax from "@/services" import { BaseMap } from "@/components" @@ -73,30 +73,31 @@ function AreaManage() { } }) } - const handleAreaAdd = ({level, pid, isCity}) => { + const handleAreaAdd = ({ level, id, isCity }) => { + let pid =id setIsCity(isCity) setPid(pid) - setLevel(Number(level)+1) + setLevel(Number(level) + 1) setEditStatus(false) setModalAreaVisible(true) } - const handleAreaEdit = ({name, id, virtually_code, code, lng_lat}) => { - setEditForm({name, id, virtually_code, code, lng_lat}) + const handleAreaEdit = ({ name, id, virtually_code, code, lng_lat }) => { + setEditForm({ name, id, virtually_code, code, lng_lat }) setEditStatus(true) setModalAreaVisible(true) } // 区域删除 - const handleAreaDel = ({name, id}) => { + const handleAreaDel = ({ name, id }) => { Modal.confirm({ title: '确认删除?', content: `是否确认删除区域: ${name}`, - icon: <DeleteOutlined style={{color: '#f40'}}/>, + icon: <DeleteOutlined style={{ color: '#f40' }} />, okText: '删除', cancelText: '取消', onOk: () => { - ajaxAreaDel({name, id}).then((msg) => { + ajaxAreaDel({ name, id }).then((msg) => { message.success(msg) getAreaTree() }).catch((err) => { @@ -112,12 +113,12 @@ function AreaManage() { setModalAreaVisible(false) setModalMapVisible(true) } - const handleMapClick = ({lat, lng}) => { + const handleMapClick = ({ lat, lng }) => { setLatlng([lat.toFixed(4), lng.toFixed(4)]) } // 区域新增 - const handleAreaConfirm = ({formData, editStatus}) => { + const handleAreaConfirm = ({ formData, editStatus }) => { if (editStatus) { // 编辑 ajaxAreaEdit(formData).then((msg) => { message.success(msg) @@ -146,19 +147,26 @@ function AreaManage() { setModalAreaVisible(true) } } - const treeTitleRender = ({name, children, level, pid, id, virtually_code, lng_lat, code}) => { + const treeTitleRender = ({ name, children, level, pid, id, virtually_code, lng_lat, code }) => { 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 })} /> + <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})} /> - <EditOutlined className="label-icon" onClick={() => handleAreaEdit({name, id, virtually_code, code, lng_lat})}/> + {/* <PlusCircleOutlined className='label-icon' onClick={() => handleAreaAdd({level, pid, isCity: false})} /> */} + <DeleteOutlined className="label-icon" onClick={() => handleAreaDel({ name, id })} /> + <EditOutlined className="label-icon" onClick={() => handleAreaEdit({ name, id, virtually_code, code, lng_lat })} /> </> : null } </> @@ -189,7 +197,7 @@ function AreaManage() { editForm={editForm} visible={modalAreaVisible} onMapSelect={modalMapSelct} - onOk={(formData, editStatus) => handleAreaConfirm({formData, editStatus})} + onOk={(formData, editStatus) => handleAreaConfirm({ formData, editStatus })} latlng={latlng} onCancel={() => handleModalClose()} /> @@ -202,12 +210,12 @@ function AreaManage() { <div className="modal-map-content"> <BaseMap id="map-select-container" - onClick={({latlng}) => handleMapClick(latlng)} + onClick={({ latlng }) => handleMapClick(latlng)} /> </div> <div className="modal-map-info"> - <Input value={latlng}></Input> - <Button type="primary" onClick={() => handleLatLngConfirm()}>确定</Button> + <Input value={latlng}></Input> + <Button type="primary" onClick={() => handleLatLngConfirm()}>确定</Button> </div> </Modal> </> diff --git a/src/pages/SystemMgm/BusinessConfig/BusinessConf/loadable.jsx b/src/pages/SystemMgm/BusinessConfig/BusinessConf/loadable.jsx index 34c0923..dd78a2e 100644 --- a/src/pages/SystemMgm/BusinessConfig/BusinessConf/loadable.jsx +++ b/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,20 +116,32 @@ function BusinessConf(props) { } //添加提交 const placeSaveBtn = () => { + console.log(addManage.parameter); let data = { ...addManage } - ajax.addBusiness(data).then(res => { - if (res.status === 20000) { - setImgVisible(false) - setAddManage({ - area_name: 0, - operator_name: 0, - item_name: '' - }) - getData(formData) - } - }) + 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", + item_name: '' + }) + getData(formData) + setGetConfiguration(0) + } + }) + } } //列表 const handleColumns = (tab) => { @@ -171,11 +186,11 @@ function BusinessConf(props) { title: '参数描述', dataIndex: 'parameter_dsc', key: 'parameter_dsc', - render:(text,record)=>{ - return<> + render: (text, record) => { + return <> <div dangerouslySetInnerHTML={{ __html: record.parameter_dsc }}> - {/* {getMessage.message} */} - </div> + {/* {getMessage.message} */} + </div> </> } }, @@ -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="请输入" @@ -871,7 +892,7 @@ function BusinessConf(props) { Object.assign({}, geteditData, { parameterValue: v.target.value }) ); }} - value={geteditData.parameterValue}> + value={geteditData.parameterValue}> <Radio value={1}>否</Radio> <Radio value={2}>是</Radio> </Radio.Group> diff --git a/src/pages/SystemMgm/RoleMgm/loadable.jsx b/src/pages/SystemMgm/RoleMgm/loadable.jsx index 9eab8af..44951bf 100644 --- a/src/pages/SystemMgm/RoleMgm/loadable.jsx +++ b/src/pages/SystemMgm/RoleMgm/loadable.jsx @@ -134,21 +134,31 @@ function RoleMgm(props) { let data = { ...addManage } - console.log(data); - ajax.addAdmin(data).then(res => { - if (res.status === 20000) { - setImgVisible(false) - setAddManage({ - remark: '', - name: '', - depart_id: '', - auth: '' - }) - getData(formData) - }else{ - message.error(res.message) - } - }) + 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) + setAddManage({ + remark: '', + name: '', + depart_id: '', + auth: '' + }) + getData(formData) + setGetGovernment(0) + } else { + message.error(res.message) + setGetGovernment(0) + } + }) + } + } //列表 const handleColumns = (tab) => { @@ -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,14 +378,17 @@ function RoleMgm(props) { }) } useEffect(() => { - console.log(getGovernment); if (getGovernment != 0) { let data = { id: getGovernment } ajax.getDepartId(data).then(res => { - if (res.status === 20000) { - setGetGovernmentArea(res.data) + if(res.status === 20000){ + if (res.status == []) { + message.error('部门没有配置对应菜单权限') + }else{ + setGetGovernmentArea(res.data) + } } }) } @@ -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} diff --git a/src/services/system.js b/src/services/system.js index b8dda41..e5bb306 100644 --- a/src/services/system.js +++ b/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 }) } From 84b2749c0754952a0f08e3df202c87b22ea6888d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=AE=87=E8=88=AA?= <740464440@qq.com> Date: Fri, 27 Oct 2023 13:36:12 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat():=20=E6=96=B0=E5=BB=BA=E5=8F=91?= =?UTF-8?q?=E8=B5=B7=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/css/base.scss | 3 + .../ParkingRecordModal/RecordReviewModal.jsx | 195 +++++++++++ .../ParkingRecordModal/VehicleInformation.jsx | 122 +++++++ src/components/ParkingRecordModal/dataSource.js | 183 ++++++++++ src/components/ParkingRecordModal/index.jsx | 260 +++++++++++++++ src/components/ParkingRecordModal/index.scss | 290 ++++++++++++++++ src/components/QuickMenu/index.jsx | 15 +- src/components/index.jsx | 4 +- src/config/character.config.js | 1 + .../ExceptionDeal/StartExceptionDeal/index.jsx | 369 +++++++++++++++++---- .../ExceptionDeal/StartExceptionDeal/index.scss | 195 +++++++++++ .../SettleBill/GeneralBusiness/loadable.jsx | 2 +- src/pages/MerchantMgm/InvoiceConf/loadable.jsx | 282 ++++++++++------ src/pages/MerchantMgm/MerchantInfo/loadable.jsx | 14 +- src/services/FinancialMgm/exceptionDeal.js | 52 +++ 15 files changed, 1795 insertions(+), 192 deletions(-) create mode 100644 src/components/ParkingRecordModal/RecordReviewModal.jsx create mode 100644 src/components/ParkingRecordModal/VehicleInformation.jsx create mode 100644 src/components/ParkingRecordModal/dataSource.js create mode 100644 src/components/ParkingRecordModal/index.jsx create mode 100644 src/components/ParkingRecordModal/index.scss diff --git a/src/assets/css/base.scss b/src/assets/css/base.scss index fd5707c..6d1262f 100644 --- a/src/assets/css/base.scss +++ b/src/assets/css/base.scss @@ -734,3 +734,6 @@ color:var(--color-text) !important; // .ant-checkbox{ // background-color: #454c5e; // } +.ant-table-tbody>tr.ant-table-placeholder:hover>td { + background: #3e4557 !important; +} diff --git a/src/components/ParkingRecordModal/RecordReviewModal.jsx b/src/components/ParkingRecordModal/RecordReviewModal.jsx new file mode 100644 index 0000000..f658f29 --- /dev/null +++ b/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; diff --git a/src/components/ParkingRecordModal/VehicleInformation.jsx b/src/components/ParkingRecordModal/VehicleInformation.jsx new file mode 100644 index 0000000..2363e47 --- /dev/null +++ b/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; diff --git a/src/components/ParkingRecordModal/dataSource.js b/src/components/ParkingRecordModal/dataSource.js new file mode 100644 index 0000000..3d8d5ef --- /dev/null +++ b/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", + }, +]; diff --git a/src/components/ParkingRecordModal/index.jsx b/src/components/ParkingRecordModal/index.jsx new file mode 100644 index 0000000..3191308 --- /dev/null +++ b/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; diff --git a/src/components/ParkingRecordModal/index.scss b/src/components/ParkingRecordModal/index.scss new file mode 100644 index 0000000..8432c8d --- /dev/null +++ b/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; + } + } + } + } + } + +} \ No newline at end of file diff --git a/src/components/QuickMenu/index.jsx b/src/components/QuickMenu/index.jsx index ce2cac1..3fdcae3 100644 --- a/src/components/QuickMenu/index.jsx +++ b/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) diff --git a/src/components/index.jsx b/src/components/index.jsx index 10f3cc4..c2269ba 100644 --- a/src/components/index.jsx +++ b/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 }; diff --git a/src/config/character.config.js b/src/config/character.config.js index 05223bc..d71a6f2 100644 --- a/src/config/character.config.js +++ b/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: [{ diff --git a/src/pages/FinancialMgm/ExceptionDeal/StartExceptionDeal/index.jsx b/src/pages/FinancialMgm/ExceptionDeal/StartExceptionDeal/index.jsx index e303eed..6d66c49 100644 --- a/src/pages/FinancialMgm/ExceptionDeal/StartExceptionDeal/index.jsx +++ b/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 + <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_time: v?.endDateTime || null, + start_time: v?.startDateTime || null, + }) + } else { + message.error('请正确输入车牌号') + return + } + } else { + if(value > 30) return message.warning("请输入您查询的车牌号!"); + } setFormData({ ...formData, - end_date: v?.endDateTime || null, - start_date: v?.startDateTime || null, + 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> ); } diff --git a/src/pages/FinancialMgm/ExceptionDeal/StartExceptionDeal/index.scss b/src/pages/FinancialMgm/ExceptionDeal/StartExceptionDeal/index.scss index cd20a32..115c54a 100644 --- a/src/pages/FinancialMgm/ExceptionDeal/StartExceptionDeal/index.scss +++ b/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); + } + } +} diff --git a/src/pages/FinancialMgm/SettleBill/GeneralBusiness/loadable.jsx b/src/pages/FinancialMgm/SettleBill/GeneralBusiness/loadable.jsx index e08cbb3..6735596 100644 --- a/src/pages/FinancialMgm/SettleBill/GeneralBusiness/loadable.jsx +++ b/src/pages/FinancialMgm/SettleBill/GeneralBusiness/loadable.jsx @@ -253,7 +253,7 @@ function GeneralBusiness() { (res) => { if (parseInt(res?.status) === 20000) { setData({ - data: res?.data.list || {}, + data: res?.data.list || [], total: res.data.total || 0, }); setLoading(true); diff --git a/src/pages/MerchantMgm/InvoiceConf/loadable.jsx b/src/pages/MerchantMgm/InvoiceConf/loadable.jsx index 46166a0..91afdb6 100644 --- a/src/pages/MerchantMgm/InvoiceConf/loadable.jsx +++ b/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,44 +898,95 @@ function InvoiceConf() { <Form form={editForm} > - <Form.Item - label="平台编码:" - labelAlign="left" - name="code" - required={true} - className="form-item" - validateTrigger="onBlur" - rules={[ - { required: true, message: "请输入平台编码!" }, - {min:0,max:30,message:"最大长度为30"} - ]} - > - <Input - placeholder="请输入平台编码" + {InvoicePlatform != 2 ? + <Form.Item + label="平台编码:" + labelAlign="left" + name="code" + required={true} className="form-item" - maxLength={30} - showCount - /> - </Form.Item> - <Form.Item - label="授权码:" - labelAlign="left" - name="auth_code" - required={true} - className="form-item" - validateTrigger="onBlur" - rules={[ - { required: true, message: "请输入授权码!" }, - {min:0,max:36,message:"最大长度为36"} - ]} - > - <Input - placeholder="请输入授权码" + validateTrigger="onBlur" + rules={[ + { required: true, message: "请输入平台编码!" }, + { min: 0, max: 30, message: "最大长度为30" } + ]} + > + <Input + placeholder="请输入平台编码" + className="form-item" + maxLength={30} + showCount + /> + </Form.Item> + : null + } + {InvoicePlatform != 2 ? + <Form.Item + label="授权码:" + labelAlign="left" + name="auth_code" + required={true} className="form-item" - maxLength={36} - showCount - /> - </Form.Item> + validateTrigger="onBlur" + rules={[ + { required: true, message: "请输入授权码!" }, + { min: 0, max: 36, message: "最大长度为36" } + ]} + > + <Input + placeholder="请输入授权码" + className="form-item" + maxLength={36} + 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,73 +1006,72 @@ function InvoiceConf() { showCount /> </Form.Item> - <Form.Item - label="请求码:" - labelAlign="left" - name="request_code" - required={true} - className="form-item" - validateTrigger="onBlur" - rules={[ - { required: true, message: "请输入请求码!" }, - {min:0,max:36,message:"最大长度为36"} - ]} - > - <Input - placeholder="请输入请求码" + {InvoicePlatform != 2 ? + <Form.Item + label="请求码:" + labelAlign="left" + name="request_code" + required={true} className="form-item" - maxLength={36} - showCount - /> - </Form.Item> - <Form.Item - label="请求函数:" - labelAlign="left" - name="request_func" - required={true} - className="form-item" - validateTrigger="onBlur" - rules={[ - { required: true, message: "请输入请求函数!" }, - {min:0,max:40,message:"最大长度为40"} - ]} - > - <Input - placeholder="请输入请求函数" + validateTrigger="onBlur" + rules={[ + { required: true, message: "请输入请求码!" }, + { min: 0, max: 36, message: "最大长度为36" } + ]} + > + <Input + placeholder="请输入请求码" + className="form-item" + maxLength={36} + showCount + /> + </Form.Item> + : null + } + {InvoicePlatform != 2 ? + <Form.Item + label="请求函数:" + labelAlign="left" + name="request_func" + required={true} className="form-item" - maxLength={40} - showCount - /> - </Form.Item> - <Form.Item - label="目标命名空间:" - labelAlign="left" - name="namespace" - required={true} - className="form-item" - validateTrigger="onBlur" - rules={[ - { required: true, message: "请输入目标命名空间!" }, - {min:0,max:200,message:"最大长度为200"} - ]} - > - <Input - placeholder="请输入目标命名空间" + validateTrigger="onBlur" + rules={[ + { required: true, message: "请输入请求函数!" }, + { min: 0, max: 40, message: "最大长度为40" } + ]} + > + <Input + placeholder="请输入请求函数" + className="form-item" + maxLength={40} + showCount + /> + </Form.Item> + : null + } + {InvoicePlatform != 2 ? + <Form.Item + label="目标命名空间:" + labelAlign="left" + name="namespace" + required={true} className="form-item" - maxLength={200} - showCount - /> - </Form.Item> - </Form> - - </div> - - </div> - <div className="right"> - <div className="right-wrap"> - <Form - form={editForm} - > + validateTrigger="onBlur" + rules={[ + { required: true, message: "请输入目标命名空间!" }, + { min: 0, max: 200, message: "最大长度为200" } + ]} + > + <Input + placeholder="请输入目标命名空间" + className="form-item" + maxLength={200} + showCount + /> + </Form.Item> + : 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" diff --git a/src/pages/MerchantMgm/MerchantInfo/loadable.jsx b/src/pages/MerchantMgm/MerchantInfo/loadable.jsx index 9e808d4..5dd59fa 100644 --- a/src/pages/MerchantMgm/MerchantInfo/loadable.jsx +++ b/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> diff --git a/src/services/FinancialMgm/exceptionDeal.js b/src/services/FinancialMgm/exceptionDeal.js index e69de29..12a87fc 100644 --- a/src/services/FinancialMgm/exceptionDeal.js +++ b/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, + }); + }, +} \ No newline at end of file From 71dfd84fdef84e48e9a2acca2f9e7482c8a0d4d1 Mon Sep 17 00:00:00 2001 From: guoxin <guoxin@yisa.com> Date: Fri, 27 Oct 2023 13:38:32 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix():=E4=BF=AE=E6=94=B9=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=AE=A1=E7=90=86bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/SystemMgm/AreaManage/ModalAreaAdd/index.jsx | 1 - src/pages/SystemMgm/AreaManage/loadable.jsx | 18 +++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/pages/SystemMgm/AreaManage/ModalAreaAdd/index.jsx b/src/pages/SystemMgm/AreaManage/ModalAreaAdd/index.jsx index 5bb07b0..c8d1966 100644 --- a/src/pages/SystemMgm/AreaManage/ModalAreaAdd/index.jsx +++ b/src/pages/SystemMgm/AreaManage/ModalAreaAdd/index.jsx @@ -16,7 +16,6 @@ function ModalAreaAdd (props) { level, onCancel } = props - console.log(pid); const [form] = Form.useForm() const [areaType, setAreaType] = useState("1") diff --git a/src/pages/SystemMgm/AreaManage/loadable.jsx b/src/pages/SystemMgm/AreaManage/loadable.jsx index 968da42..264afbb 100644 --- a/src/pages/SystemMgm/AreaManage/loadable.jsx +++ b/src/pages/SystemMgm/AreaManage/loadable.jsx @@ -74,7 +74,7 @@ function AreaManage() { }) } const handleAreaAdd = ({ level, id, isCity }) => { - let pid =id + let pid = id setIsCity(isCity) setPid(pid) setLevel(Number(level) + 1) @@ -89,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}`, @@ -97,7 +105,7 @@ function AreaManage() { okText: '删除', cancelText: '取消', onOk: () => { - ajaxAreaDel({ name, id }).then((msg) => { + ajaxAreaDel({ name, arr }).then((msg) => { message.success(msg) getAreaTree() }).catch((err) => { @@ -158,14 +166,14 @@ function AreaManage() { { level === 2 ? <> <PlusCircleOutlined className='label-icon' onClick={() => handleAreaAdd({ level, id, isCity: false })} /> - <DeleteOutlined className="label-icon" onClick={() => handleAreaDel({ name, id })} /> + <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 })} /> + <DeleteOutlined className="label-icon" onClick={() => handleAreaDel({ name, id, children })} /> <EditOutlined className="label-icon" onClick={() => handleAreaEdit({ name, id, virtually_code, code, lng_lat })} /> </> : null }