@@ -66,7 +66,6 @@ const Gate = () => { | |||
// 及时销毁 editor ,重要! | |||
useEffect(() => { | |||
if (editor == null) return; | |||
console.log('销毁'); | |||
editor.destroy() | |||
setEditor(null) | |||
setHtml(''); | |||
@@ -237,7 +236,7 @@ const Gate = () => { | |||
onChange: (page) => setCurrent(page), | |||
}} | |||
dateFormatter="string" | |||
headerTitle="储值卡账户管理" | |||
headerTitle="档口管理" | |||
toolBarRender={() => [ | |||
<div className={styles.table_search_item}> | |||
<div> | |||
@@ -89,6 +89,11 @@ const Machine = () => { | |||
</div> | |||
} | |||
}, | |||
{ | |||
title: '设备地址', | |||
dataIndex: 'address', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '状态', | |||
dataIndex: 'status', | |||
@@ -192,7 +197,7 @@ const Machine = () => { | |||
onChange: (page) => setCurrent(page) | |||
}} | |||
dateFormatter="string" | |||
headerTitle="储值卡账户管理" | |||
headerTitle="刷卡机管理" | |||
toolBarRender={() => [ | |||
<div className={styles.table_search_item}> | |||
<div> | |||
@@ -245,6 +250,7 @@ const Machine = () => { | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="设备名称" | |||
name="name" | |||
@@ -311,6 +317,23 @@ const Machine = () => { | |||
<Input defaultValue={10} /> | |||
</Form.Item> | |||
<Form.Item | |||
label="设备地址" | |||
name="address" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入档口名称!', | |||
}, | |||
{ | |||
pattern: new RegExp(/[0-9A-Fa-f]{2}/, 'g'), | |||
message: '请输入16进制!' | |||
} | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
确定 | |||
@@ -1,4 +1,4 @@ | |||
import React, { useRef, useState } from "react"; | |||
import React, { useRef, useState, useEffect } from "react"; | |||
import styles from "./index.less"; | |||
import { PageContainer } from '@ant-design/pro-layout'; | |||
import { PlusOutlined, UserOutlined } from '@ant-design/icons'; | |||
@@ -13,7 +13,11 @@ import cardAPI from "../service"; | |||
const memberAccount = () => { | |||
const actionRef = useRef(); | |||
const [isModalOpen, setIsModalOpen] = useState(false); | |||
const [currentOption, setCurrentOption] = useState(); | |||
const [currentOption, setCurrentOption] = useState({ | |||
functionName: '', | |||
record: {}, | |||
type: 0 | |||
}); | |||
const [current, setCurrent] = useState(1); | |||
const [pageSize, setPageSize] = useState(10); | |||
const [total, setTotal] = useState(0); | |||
@@ -37,6 +41,11 @@ const memberAccount = () => { | |||
"type": type | |||
} | |||
const response = await cardAPI.GetMemberAccountCardConsRecord(jsonData); | |||
setCurrentOption({ | |||
functionName: 'onFetchAccountConsRecord', | |||
record: JSON.parse(JSON.stringify(record)), | |||
type | |||
}); | |||
if (response.statusCode === 200) { | |||
setConsList(response.data.data); | |||
setConsTotal(response.data.total); | |||
@@ -59,6 +68,11 @@ const memberAccount = () => { | |||
"type": type | |||
} | |||
const response = await cardAPI.GetMemberAccountCardConsRecord(jsonData); | |||
setCurrentOption({ | |||
functionName: 'onFetchCardConsRecord', | |||
record: JSON.parse(JSON.stringify(record)), | |||
type | |||
}); | |||
if (response.statusCode === 200) { | |||
setConsList(response.data.data); | |||
setConsTotal(response.data.total); | |||
@@ -141,15 +155,15 @@ const memberAccount = () => { | |||
dataIndex: 'type', | |||
valueType: 'select', | |||
valueEnum: { | |||
0: { | |||
1: { | |||
text: '人脸', | |||
status: 'Success', | |||
}, | |||
1: { | |||
2: { | |||
text: '实体卡', | |||
status: 'Success', | |||
}, | |||
2: { | |||
3: { | |||
text: '指纹', | |||
status: 'Success', | |||
} | |||
@@ -170,6 +184,11 @@ const memberAccount = () => { | |||
//消费列表 | |||
const consColumns = [ | |||
{ | |||
title: '时间', | |||
dataIndex: 'createAt', | |||
width: 200 | |||
}, | |||
{ | |||
title: '类型', | |||
dataIndex: 'type', | |||
@@ -182,21 +201,43 @@ const memberAccount = () => { | |||
</div> | |||
} | |||
}, | |||
{ | |||
title: '消费金额', | |||
dataIndex: 'money', | |||
}, | |||
{ | |||
title: '之前余额', | |||
dataIndex: 'beforeMoney', | |||
render: (_, record) => { | |||
return <div style={{ color: 'green' }}> | |||
{record.beforeMoney} | |||
</div> | |||
} | |||
}, | |||
{ | |||
title: '消费金额', | |||
dataIndex: 'money', | |||
render: (_, record) => { | |||
return <div style={{ color: 'red' }}> | |||
{record.money} | |||
</div> | |||
} | |||
}, | |||
{ | |||
title: '之后余额', | |||
dataIndex: 'afterMoney', | |||
render: (_, record) => { | |||
return <div style={{ color: 'blue' }}> | |||
{record.afterMoney} | |||
</div> | |||
} | |||
} | |||
]; | |||
useEffect(() => { | |||
if (consCurrent === 1) return; | |||
if (currentOption.functionName === 'onFetchAccountConsRecord') { | |||
onFetchAccountConsRecord(currentOption.record, currentOption.type); | |||
} else if (currentOption.functionName === 'onFetchCardConsRecord') { | |||
onFetchCardConsRecord(currentOption.record, currentOption.type); | |||
} | |||
}, [consCurrent]) | |||
return ( | |||
<PageContainer> | |||
@@ -239,7 +280,7 @@ const memberAccount = () => { | |||
dateFormatter="string" | |||
headerTitle="储值卡账户管理" | |||
/> | |||
<Modal width={800} title='消费记录' visible={isModalOpen} footer={false} onCancel={() => setIsModalOpen(false)}> | |||
<Modal width={800} title='消费记录' visible={isModalOpen} footer={false} onCancel={() => {setIsModalOpen(false); setConsCurrent(1)}}> | |||
<Table columns={consColumns} dataSource={consList} pagination={{ | |||
current: consCurrent, | |||
pageSize: consPageSize, | |||
@@ -70,7 +70,7 @@ const storedValueCard = () => { | |||
"memberCardId": currentOption.id | |||
}); | |||
if (response.data === true) { | |||
message.error('绑定成功'); | |||
message.success('绑定成功'); | |||
actionRef.current.reload(); | |||
setBindMemberDrawer(false); | |||
} else { | |||
@@ -172,15 +172,15 @@ const storedValueCard = () => { | |||
dataIndex: 'type', | |||
valueType: 'select', | |||
valueEnum: { | |||
0: { | |||
1: { | |||
text: '人脸', | |||
status: 'Success', | |||
}, | |||
1: { | |||
2: { | |||
text: '实体卡', | |||
status: 'Success', | |||
}, | |||
2: { | |||
3: { | |||
text: '指纹', | |||
status: 'Success', | |||
} | |||
@@ -265,7 +265,7 @@ const storedValueCard = () => { | |||
onChange: (page) => setCurrent(page), | |||
}} | |||
dateFormatter="string" | |||
headerTitle="储值卡账户管理" | |||
headerTitle="储值卡管理" | |||
toolBarRender={() => [ | |||
<Button key="button" icon={<PlusOutlined />} type="primary" onClick={onCreateTableRow}> | |||
新建 | |||
@@ -324,9 +324,9 @@ const storedValueCard = () => { | |||
]} | |||
> | |||
<Select> | |||
<Select.Option value={0}>人脸</Select.Option> | |||
<Select.Option value={1}>实体卡</Select.Option> | |||
<Select.Option value={2}>指纹</Select.Option> | |||
<Select.Option value={1}>人脸</Select.Option> | |||
<Select.Option value={2}>实体卡</Select.Option> | |||
<Select.Option value={3}>指纹</Select.Option> | |||
</Select> | |||
</Form.Item> | |||
@@ -0,0 +1,208 @@ | |||
import React, { useState, useEffect, useRef } from 'react'; | |||
import quickAPI from "../../service"; | |||
import indexStyles from "../../index.less"; | |||
import StepsButton from "../StepsButton"; | |||
import { message } from 'antd'; | |||
/** | |||
* 确认配置 | |||
* @returns | |||
*/ | |||
const ConfirmConfig = (props) => { | |||
/** | |||
* 1.组织配置 | |||
*/ | |||
//组织树 | |||
const [orgTree, setOrgTree] = useState([]); | |||
//支付方式列表 | |||
const [payTypeList, setPayTypeList] = useState([]); | |||
//获取组织树 | |||
const onFetchOrgTree = async () => { | |||
const response = await await quickAPI.getpage({ | |||
current: 1, | |||
pageSize: 1000 | |||
}); | |||
if (response.data.success) { | |||
setOrgTree(response.data.data); | |||
} else { | |||
message.error(response.errors || '获取组织架构出错'); | |||
} | |||
} | |||
//获取支付配置 | |||
const getPayTemplateList = async () => { | |||
const response = await quickAPI.getPayTemplateList(); | |||
if (response.statusCode === 200) { | |||
setPayTypeList(response.data.data); | |||
} else { | |||
message.error(response.errors || '获取获取支付方式出错'); | |||
} | |||
} | |||
useEffect(() => { | |||
onFetchOrgTree(); | |||
getPayTemplateList(); | |||
}, []); | |||
return <> | |||
{/* 1.组织配置 */} | |||
<table style={{ width: '50%', marginBottom: '10px' }}> | |||
<tbody> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_title}> | |||
组织配置 | |||
</th> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
ID | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.storeConfig.id} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
编码 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.storeConfig.code} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
名称 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.storeConfig.name} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
上级组织 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{(() => { | |||
const pid = props.quickStartObj.storeConfig.pid; | |||
const find = orgTree.find(item => item.id === pid); | |||
if (find) { | |||
return find.name; | |||
} else { | |||
return "无上级组织" | |||
} | |||
})()} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
组织类型 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.storeConfig.type} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
支付方式 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{(() => { | |||
const payTemplateId = props.quickStartObj.storeConfig.payTemplateId; | |||
const find = payTypeList.find(item => item.id === payTemplateId); | |||
if (find) { | |||
return find.name; | |||
} else { | |||
return "无支付方式" | |||
} | |||
})()} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
店铺地址 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.storeConfig.store_Addr} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
店铺坐标 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.storeConfig.store_Loc} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
联系电话 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.storeConfig.tel} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
门店排序 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.storeConfig.sort} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
备注 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.storeConfig.remark} | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
{/* 2.设备配置 */} | |||
<table style={{ width: '50%', marginBottom: '10px' }}> | |||
<tbody> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_title}> | |||
设备配置 | |||
</th> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
ID | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.deviceConfig.id} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
设备名称 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.deviceConfig.deviceName} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
设备类型 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.deviceConfig.deviceTypeKey} | |||
</td> | |||
</tr> | |||
<tr className={indexStyles.ant_descriptions_row}> | |||
<th className={indexStyles.ant_descriptions_item_label}> | |||
设备类型 | |||
</th> | |||
<td className={indexStyles.ant_descriptions_item_content}> | |||
{props.quickStartObj.deviceConfig.deviceTypeKey} | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
<StepsButton current={props.current} steps={props.steps} prev={props.prev}></StepsButton> | |||
</> | |||
} | |||
export default ConfirmConfig; |
@@ -130,6 +130,9 @@ const DeviceConfig = (props) => { | |||
} | |||
]; | |||
const [currentPage, setCurrentPage] = useState(0); | |||
const [pageSize, setPageSize] = useState(5); | |||
const optionsWithDisabled = [ | |||
{ | |||
label: '新建设备', | |||
@@ -285,6 +288,14 @@ const DeviceConfig = (props) => { | |||
search={{ | |||
labelWidth: 120, | |||
}} | |||
pagination={{ | |||
current: currentPage, | |||
pageSize: pageSize, | |||
onChange: (page, pageSize) => { | |||
setCurrentPage(page); | |||
setPageSize(pageSize); | |||
} | |||
}} | |||
request={async (params) => { | |||
let data = []; | |||
let total = 0; | |||
@@ -67,6 +67,9 @@ const FoodMenuConfig = (props) => { | |||
} | |||
] | |||
const [currentPage, setCurrentPage] = useState(0); | |||
const [pageSize, setPageSize] = useState(5); | |||
return <> | |||
<div className={indexStyles.choose_change_state}> | |||
<Radio.Group | |||
@@ -108,6 +111,14 @@ const FoodMenuConfig = (props) => { | |||
search={{ | |||
labelWidth: 120, | |||
}} | |||
pagination={{ | |||
current: currentPage, | |||
pageSize: pageSize, | |||
onChange: (page, pageSize) => { | |||
setCurrentPage(page); | |||
setPageSize(pageSize); | |||
} | |||
}} | |||
request={async (params) => { | |||
let data = []; | |||
let total = 0; | |||
@@ -7,6 +7,9 @@ import styles from "./index.less"; | |||
const StoreConfig = (props) => { | |||
const [currentPage, setCurrentPage] = useState(0); | |||
const [pageSize, setPageSize] = useState(5); | |||
const { TextArea } = Input; | |||
const { Option, OptGroup } = Select; | |||
const [storeForm] = Form.useForm(); | |||
@@ -288,6 +291,14 @@ const StoreConfig = (props) => { | |||
}; | |||
}} | |||
columns={columns} | |||
pagination={{ | |||
current: currentPage, | |||
pageSize: pageSize, | |||
onChange: (page, pageSize) => { | |||
setCurrentPage(page); | |||
setPageSize(pageSize); | |||
} | |||
}} | |||
/> | |||
} | |||
</div> | |||
@@ -8,6 +8,7 @@ import FoodMenuConfig from './components/FoodMenuConfig'; | |||
import GoodsConfig from './components/GoodsConfig'; | |||
import BomConfig from './components/BomConfig'; | |||
import MaterialConfig from './components/MaterialConfig'; | |||
import ConfirmConfig from './components/ConfirmConfig'; | |||
const { Step } = Steps; | |||
@@ -112,11 +113,11 @@ const QuickStart = () => { | |||
<GoodsConfig goodsConfig={quickStartObj.goodsConfig} current={current} steps={stepsText} onFinishForm={onFinishForm} prev={prev}></GoodsConfig>, | |||
<BomConfig bomConfig={quickStartObj.bomConfig} current={current} steps={stepsText} onFinishForm={onFinishForm} prev={prev}></BomConfig>, | |||
<MaterialConfig materialConfig={quickStartObj.materialConfig} current={current} steps={stepsText} onFinishForm={onFinishForm} prev={prev}></MaterialConfig>, | |||
<h1>确认配置</h1> | |||
<ConfirmConfig quickStartObj={quickStartObj} current={current} steps={stepsText} onFinishForm={onFinishForm} prev={prev}></ConfirmConfig> | |||
]; | |||
useEffect(() => { | |||
console.log('对象更新啦', quickStartObj); | |||
console.log('对象更新啦', quickStartObj, JSON.stringify(quickStartObj)); | |||
}, [quickStartObj]); | |||
return <PageContainer> | |||
@@ -25,4 +25,50 @@ | |||
top: 50%; | |||
transform: translateY(-50%); | |||
right: 0px | |||
} | |||
.ant_descriptions_row { | |||
display: flex; | |||
border-bottom: 1px solid rgba(0,0,0,.06); | |||
} | |||
.ant_descriptions_row:first-child { | |||
border-top: 1px solid rgba(0,0,0,.06); | |||
border-right: 1px solid rgba(0,0,0,.06); | |||
} | |||
.ant_descriptions_item_title { | |||
color: rgba(0,0,0,.85); | |||
font-weight: 600; | |||
font-size: 18px; | |||
line-height: 1.5715; | |||
text-align: start; | |||
padding: 16px 24px; | |||
border-left: 1px solid rgba(0,0,0,.06); | |||
} | |||
.ant_descriptions_item_label { | |||
flex-shrink: 0; | |||
width: 20%; | |||
color: rgba(0,0,0,.85); | |||
font-weight: 400; | |||
font-size: 14px; | |||
line-height: 1.5715; | |||
text-align: start; | |||
background-color: #fafafa; | |||
padding: 16px 24px; | |||
border-left: 1px solid rgba(0,0,0,.06); | |||
border-right: 1px solid rgba(0,0,0,.06); | |||
} | |||
.ant_descriptions_item_content { | |||
border-right: 1px solid rgba(0,0,0,.06); | |||
padding: 16px 24px; | |||
display: table-cell; | |||
flex: 1 1; | |||
color: rgba(0,0,0,.85); | |||
font-size: 14px; | |||
line-height: 1.5715; | |||
word-break: break-word; | |||
overflow-wrap: break-word; | |||
} |