@@ -6,7 +6,7 @@ | |||
* For details, please see | |||
* https://pro.ant.design/docs/deploy | |||
*/ | |||
export default { | |||
export default { | |||
dev: { | |||
'/kitchen/': { | |||
target: 'https://localhost:5001/', | |||
@@ -33,6 +33,13 @@ export default [ | |||
component: './sys/company', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '支付配置', | |||
icon: 'smile', | |||
path: '/sys/paytemplate', | |||
component: './sys/paytemplate', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '组织管理', | |||
icon: 'smile', | |||
@@ -98,6 +105,69 @@ export default [ | |||
}, | |||
], | |||
}, | |||
{ | |||
name: '小程序管理', | |||
icon: 'BankFilled', | |||
path: '/applet', | |||
routes: [ | |||
{ | |||
name: '页面管理', | |||
icon: 'smile', | |||
path: '/applet/pageManage', | |||
component: './applet/pageManage', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '素材管理', | |||
icon: 'smile', | |||
path: '/applet/material', | |||
component: './applet/material', | |||
access: 'k2', | |||
}, | |||
] | |||
}, | |||
{ | |||
name: '一卡通管理', | |||
icon: 'BankFilled', | |||
path: '/card', | |||
routes: [ | |||
{ | |||
name: '会员管理', | |||
icon: 'smile', | |||
path: '/card/memberCard', | |||
component: './card/memberCard', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '账户管理', | |||
icon: 'smile', | |||
path: '/card/memberAccount', | |||
component: './card/memberAccount', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '储值卡管理', | |||
icon: 'smile', | |||
path: '/card/storedValueCard', | |||
component: './card/storedValueCard', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '档口管理', | |||
icon: 'smile', | |||
path: '/card/gate', | |||
component: './card/gate', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '刷卡机管理', | |||
icon: 'smile', | |||
path: '/card/machine', | |||
component: './card/machine', | |||
access: 'k2', | |||
}, | |||
] | |||
}, | |||
{ | |||
name: '物料管理', | |||
icon: 'DropboxSquareFilled', | |||
@@ -166,10 +236,17 @@ export default [ | |||
access: 'k7', | |||
}, | |||
{ | |||
name: '配方下发', | |||
name: '小炒工序', | |||
icon: 'smile', | |||
path: '/bom/push', | |||
component: './bom/push', | |||
path: '/bom/cookingwork', | |||
component: './bom/cookingwork', | |||
access: 'k8', | |||
}, | |||
{ | |||
name: '机械臂,炒锅配置', | |||
icon: 'smile', | |||
path: '/bom/cookingentry', | |||
component: './bom/cookingentry', | |||
access: 'k8', | |||
}, | |||
], | |||
@@ -266,6 +343,13 @@ export default [ | |||
component: './store/storeType', | |||
access: 'k12', | |||
}, | |||
{ | |||
name: '店铺员工', | |||
icon: 'smile', | |||
path: '/store/storeStaff', | |||
component: './store/storeStaff', | |||
access: 'k12', | |||
}, | |||
{ | |||
name: '店铺小票打印机', | |||
icon: 'smile', | |||
@@ -351,6 +435,13 @@ export default [ | |||
component: './device/deviceFood', | |||
access: 'k14', | |||
}, | |||
{ | |||
name: '小炒', | |||
icon: 'smile', | |||
path: '/device/deviceStirFryTime', | |||
component: './device/deviceStirFryTime', | |||
access: 'k14', | |||
}, | |||
{ | |||
code: 'deviceBOM', | |||
name: '设备配方管理', | |||
@@ -58,6 +58,8 @@ | |||
"@ant-design/pro-table": "^2.57.0", | |||
"@ant-design/pro-utils": "^1.28.0", | |||
"@umijs/route-utils": "^2.0.3", | |||
"@wangeditor/editor": "^5.1.15", | |||
"@wangeditor/editor-for-react": "^1.0.5", | |||
"antd": "^4.17.0", | |||
"axios": "^0.26.1", | |||
"braft-editor": "^2.3.9", | |||
@@ -74,6 +76,7 @@ | |||
"react-dev-inspector": "^1.1.1", | |||
"react-dom": "^17.0.0", | |||
"react-helmet-async": "^1.0.4", | |||
"swagger-ui-react": "^4.14.0", | |||
"umi": "^3.5.0", | |||
"umi-serve": "^1.9.10" | |||
}, | |||
@@ -70,6 +70,14 @@ export async function getInitialState() { | |||
component: './device/deviceFood', | |||
access: 'k14', | |||
}, | |||
{ | |||
code: 'deviceStirFryTime', | |||
name: '小炒', | |||
icon: 'smile', | |||
path: '/device/deviceStirFryTime', | |||
component: './device/deviceStirFryTime', | |||
access: 'k14', | |||
}, | |||
{ | |||
code: 'deviceBOM', | |||
name: '设备配方管理', | |||
@@ -216,6 +224,69 @@ export async function getInitialState() { | |||
}, | |||
], | |||
}, | |||
{ | |||
name: '小程序管理', | |||
icon: 'BankFilled', | |||
path: '/applet', | |||
routes: [ | |||
{ | |||
name: '页面管理', | |||
icon: 'smile', | |||
path: '/applet/pageManage', | |||
component: './applet/pageManage', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '素材管理', | |||
icon: 'smile', | |||
path: '/applet/material', | |||
component: './applet/material', | |||
access: 'k2', | |||
}, | |||
] | |||
}, | |||
{ | |||
name: '一卡通管理', | |||
icon: 'BankFilled', | |||
path: '/card', | |||
routes: [ | |||
{ | |||
name: '会员管理', | |||
icon: 'smile', | |||
path: '/card/memberCard', | |||
component: './card/memberCard', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '账户管理', | |||
icon: 'smile', | |||
path: '/card/memberAccount', | |||
component: './card/memberAccount', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '储值卡管理', | |||
icon: 'smile', | |||
path: '/card/storedValueCard', | |||
component: './card/storedValueCard', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '档口管理', | |||
icon: 'smile', | |||
path: '/card/gate', | |||
component: './card/gate', | |||
access: 'k2', | |||
}, | |||
{ | |||
name: '刷卡机管理', | |||
icon: 'smile', | |||
path: '/card/machine', | |||
component: './card/machine', | |||
access: 'k2', | |||
} | |||
] | |||
}, | |||
{ | |||
code: 'bom', | |||
name: '配方管理', | |||
@@ -238,6 +309,14 @@ export async function getInitialState() { | |||
component: './bom/bomtype', | |||
access: 'k7', | |||
}, | |||
{ | |||
code: 'cookingwork', | |||
name: '小炒工序', | |||
icon: 'smile', | |||
path: '/bom/cookingwork', | |||
component: './bom/cookingwork', | |||
access: 'k7', | |||
}, | |||
], | |||
}, | |||
{ | |||
@@ -351,6 +430,13 @@ export async function getInitialState() { | |||
component: './store/storeDesktopNumber', | |||
access: 'k12', | |||
}, | |||
{ | |||
name: '店铺员工', | |||
icon: 'smile', | |||
path: '/store/storeStaff', | |||
component: './store/storeStaff', | |||
access: 'k12', | |||
}, | |||
{ | |||
code: 'Printer', | |||
name: '店铺小票打印机', | |||
@@ -679,7 +765,7 @@ export async function getInitialState() { | |||
var tempMenu = await queryMenuData(); | |||
//创建菜单 | |||
//await syncMenus(tempMenu); | |||
if (!isDev) { | |||
if (isDev) { | |||
var data = await dymicMenus(currentUser.data.id); | |||
tempMenu = data.data; | |||
} | |||
@@ -0,0 +1,480 @@ | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import { PageContainer } from '@ant-design/pro-layout'; | |||
import { Button, Card, Image, Select, message, Modal, Input, Upload, Popconfirm } from 'antd'; | |||
import React, { useRef, useState } from 'react'; | |||
import appletAPI from "../service"; | |||
import { useEffect } from 'react'; | |||
import styles from "./index.less"; | |||
import axios from 'axios'; | |||
const getBase64 = (file) => | |||
new Promise((resolve, reject) => { | |||
const reader = new FileReader(); | |||
reader.readAsDataURL(file); | |||
reader.onload = () => resolve(reader.result); | |||
reader.onerror = (error) => reject(error); | |||
}); | |||
const Material = () => { | |||
const actionRef = useRef(); | |||
const [selectedStore, setSelectedStore] = useState(''); | |||
const [storeList, setStoreList] = useState([]); | |||
const [isModalVisible, setIsModalVisible] = useState(false); | |||
const [currentImage, setCurrentImage] = useState({ | |||
id: '', | |||
pageId: '', | |||
materialName: '', | |||
materialCode: '', | |||
materialPath: [], | |||
materialType: 0 | |||
}); | |||
const [previewVisible, setPreviewVisible] = useState(false); | |||
const [previewImage, setPreviewImage] = useState(''); | |||
const [previewTitle, setPreviewTitle] = useState(''); | |||
const [fileList, setFileList] = useState([]); | |||
const [miniPageList, setMiniPageList] = useState([]); | |||
const [currentPage, setCurrentPage] = useState(1); | |||
const [pageSize, setPageSize] = useState(10); | |||
const [total, setTotal] = useState(0); | |||
const handleCancel = () => setPreviewVisible(false); | |||
const handlePreview = async (file) => { | |||
if (!file.url && !file.preview) { | |||
file.preview = await getBase64(file.originFileObj); | |||
} | |||
setPreviewImage(file.url || file.preview); | |||
setPreviewVisible(true); | |||
setPreviewTitle(file.name || file.url.substring(file.url.lastIndexOf('/') + 1)); | |||
}; | |||
const handleChange = ({ fileList: newFileList }) => { | |||
newFileList.forEach(item => { | |||
item.status = 'done' | |||
}); | |||
setFileList(newFileList) | |||
}; | |||
const columns = [ | |||
{ | |||
title: '素材名称', | |||
dataIndex: 'materialName', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '素材编码', | |||
dataIndex: 'materialCode', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '素材图片', | |||
dataIndex: 'materialPath', | |||
render: (_, record) => ( | |||
<Image | |||
style={{width: '50%', height: '50%'}} | |||
src={JSON.parse(record.materialPath)[0]} | |||
fallback="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg=="> | |||
</Image> | |||
) | |||
}, | |||
{ | |||
title: '操作', | |||
valueType: 'option', | |||
key: 'option', | |||
render: (_, record) => [ | |||
<a onClick={() => onEditMaterial(record)}> | |||
编辑 | |||
</a>, | |||
<Popconfirm | |||
title="确定要删除此素材吗?" | |||
onConfirm={() => onDeleteMaterial(record)} | |||
okText="确定" | |||
cancelText="取消" | |||
> | |||
<a href="#">删除</a> | |||
</Popconfirm> | |||
] | |||
}, | |||
]; | |||
const uploadButton = ( | |||
<div> | |||
<PlusOutlined /> | |||
<div | |||
style={{ | |||
marginTop: 8, | |||
}} | |||
> | |||
Upload | |||
</div> | |||
</div> | |||
); | |||
/** | |||
* 获取店铺列表 | |||
*/ | |||
const onFetchStoreList = async () => { | |||
const response = await appletAPI.GetAllStore(); | |||
if (response.isSuccess) { | |||
setStoreList(response.data); | |||
setSelectedStore(response.data[0].id); | |||
} else { | |||
message.error(response.msg || '获取店铺列表失败'); | |||
} | |||
} | |||
const uploadProp = { | |||
name: 'file', | |||
showUploadList: true, | |||
multiple: false, | |||
accept: '.png, .jpg, .jpeg, .gif', | |||
// 这里需要指定文件上传的content-type | |||
headers: { | |||
'Content-Type': 'application/octet-stream', | |||
}, | |||
customRequest({ | |||
action, | |||
file, | |||
headers, | |||
onError, | |||
onProgress, | |||
withCredentials, | |||
}) { | |||
//覆盖action 上传之前获取上传地址 | |||
var index = file.name.lastIndexOf("."); | |||
var ext = file.name.substr(index + 1); | |||
let fileData = null; | |||
appletAPI.GetCosRequestURL({ directory: "applet", fileExtension: ext, method: "PUT" }).then((r) => { | |||
action = r.allUrl; | |||
const reader = new FileReader(); | |||
reader.readAsArrayBuffer(file); | |||
reader.onload = (e) => { | |||
fileData = e.target.result; | |||
axios.put(action, fileData, { | |||
withCredentials, | |||
headers, | |||
onUploadProgress: ({ total, loaded }) => { | |||
onProgress({ percent: Math.round(loaded / total * 100).toFixed(2) }, file); | |||
}, | |||
}).then(response => { | |||
if (response.status == 200 || response.statusText == 'OK') { | |||
const tempUploadImage = JSON.parse(JSON.stringify(currentImage)); | |||
tempUploadImage.materialPath.push(r.seeUrl); | |||
setCurrentImage(tempUploadImage); | |||
message.success('上传成功!'); | |||
} | |||
}).catch(onError); | |||
}; | |||
}); | |||
return { | |||
abort() { | |||
console.log('upload progress is aborted.'); | |||
}, | |||
}; | |||
}, | |||
}; | |||
/** | |||
* 添加、更新页面素材 | |||
*/ | |||
const onAddPageMaterial = async () => { | |||
if (!currentImage.pageId) { | |||
message.info('请选择所属页面'); | |||
return; | |||
} else if (!currentImage.materialName) { | |||
message.info('请填写素材名称'); | |||
return; | |||
} else if (!currentImage.materialCode) { | |||
message.info('请填写素材编码'); | |||
return; | |||
} else if (currentImage.materialPath.length === 0) { | |||
message.info('请选择至少上传一张素材图片'); | |||
return; | |||
} | |||
const jsonData = { | |||
pageId: currentImage.pageId, | |||
materialName: currentImage.materialName, | |||
materialCode: currentImage.materialCode, | |||
materialPath: JSON.stringify(currentImage.materialPath), | |||
materialType: currentImage.materialType | |||
} | |||
if (currentImage.id) { | |||
jsonData.id = currentImage.id; | |||
const response = await appletAPI.UpdateMiniMaterial(jsonData); | |||
if (response.statusCode === 200) { | |||
message.success('更新成功'); | |||
setIsModalVisible(false); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error('更新失败') | |||
} | |||
} else { | |||
const response = await appletAPI.AddMinimaterial(jsonData); | |||
if (response.statusCode === 200) { | |||
message.success('添加成功'); | |||
setIsModalVisible(false); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error('添加失败') | |||
} | |||
} | |||
} | |||
/** | |||
* 编辑素材 | |||
* @param {*} record | |||
*/ | |||
const onEditMaterial = (record) => { | |||
const materialPath = JSON.parse(record.materialPath); | |||
const material = { | |||
id: record.id, | |||
pageId: record.pageId, | |||
materialName: record.materialName, | |||
materialCode: record.materialCode, | |||
materialPath: materialPath | |||
} | |||
if (materialPath.length > 1) { | |||
material.materialType = 1; | |||
} else { | |||
material.materialType = 0; | |||
} | |||
const fileList = []; | |||
materialPath.forEach((item, index) => { | |||
fileList.push({ | |||
uid: index, | |||
name: item.split('/applet/')[1] || "图片.jpg", | |||
status: 'done', | |||
url: item, | |||
}); | |||
}); | |||
setFileList(fileList); | |||
setCurrentImage(material); | |||
setIsModalVisible(true); | |||
} | |||
/** | |||
* 删除素材 | |||
* @param {*} record | |||
*/ | |||
const onDeleteMaterial = async (record) => { | |||
const response = await appletAPI.DeleteMiniMaterial(record.id); | |||
if (response.statusCode === 200) { | |||
actionRef.current.reload(); | |||
message.success('删除成功'); | |||
} else { | |||
message.error(response.errors || '删除失败'); | |||
} | |||
} | |||
/** | |||
* 获取小程序页面 | |||
*/ | |||
const onFetchMiniPageList = async () => { | |||
const response = await appletAPI.MiniPageList({ | |||
current: 1, | |||
pageSize: 999, | |||
storeId: selectedStore | |||
}); | |||
if (response.statusCode === 200) { | |||
setMiniPageList(response.data.items); | |||
} else { | |||
message.error(response.errors || '获取页面列表失败') | |||
} | |||
} | |||
const onBeforeCreate = () => { | |||
setFileList([]); | |||
setCurrentImage({ | |||
pageId: '', | |||
materialName: '', | |||
materialCode: '', | |||
materialPath: [], | |||
materialType: 0 | |||
}); | |||
} | |||
useEffect(() => { | |||
onFetchStoreList(); | |||
}, []); | |||
useEffect(() => { | |||
if (!selectedStore) return; | |||
onFetchMiniPageList(); | |||
actionRef.current.reload(); | |||
}, [selectedStore]); | |||
return <PageContainer> | |||
<Card style={{ marginBottom: '10px' }}> | |||
<div className={styles.table_search_item}> | |||
<div> | |||
当前门店: | |||
</div> | |||
<Select style={{ width: 300 }} value={selectedStore} onChange={(value) => { | |||
setSelectedStore(value); | |||
}}> | |||
{ | |||
storeList.map(item => { | |||
return <Option value={item.id} key={item.id}>{item.store_Name}</Option> | |||
}) | |||
} | |||
</Select> | |||
</div> | |||
</Card> | |||
<ProTable | |||
search={false} | |||
columns={columns} | |||
actionRef={actionRef} | |||
cardBordered | |||
editable={{ | |||
type: 'multiple', | |||
}} | |||
request={async () => { | |||
if (!selectedStore) return; | |||
const jsonData = { | |||
"current": currentPage, | |||
"pageSize": pageSize, | |||
"storeId": selectedStore | |||
} | |||
const response = await appletAPI.MinimaterialListByStore(jsonData); | |||
const pageList = []; | |||
response.data.forEach(item => { | |||
pageList.push(...item.list); | |||
}); | |||
return { | |||
data: pageList, | |||
success: true, | |||
total: 10, | |||
} | |||
}} | |||
columnsState={{ | |||
persistenceKey: 'pro-table-singe-demos', | |||
persistenceType: 'localStorage', | |||
onChange(value) { | |||
console.log('value: ', value); | |||
}, | |||
}} | |||
rowKey="id" | |||
options={{ | |||
setting: { | |||
listsHeight: 400, | |||
}, | |||
}} | |||
pagination={{ | |||
pageSize: 5, | |||
onChange: (page) => console.log(page), | |||
}} | |||
dateFormatter="string" | |||
headerTitle="图片管理" | |||
toolBarRender={() => [ | |||
<Button key="button" icon={<PlusOutlined />} type="primary" onClick={() => { setIsModalVisible(true); onBeforeCreate() }}> | |||
新建 | |||
</Button> | |||
]} | |||
/> | |||
<Modal title="编辑素材" visible={isModalVisible} onOk={onAddPageMaterial} onCancel={() => setIsModalVisible(false)}> | |||
<div className={styles.edit_image_card}> | |||
<div className={styles.edit_image_item}> | |||
<div className={styles.edit_image_prev}> | |||
素材名称: | |||
</div> | |||
<div className={styles.edit_image_suffix}> | |||
<Input placeholder='请输入素材名称' value={currentImage.materialName} onChange={value => { | |||
const tempImg = JSON.parse(JSON.stringify(currentImage)); | |||
tempImg.materialName = value.target.value; | |||
setCurrentImage(tempImg); | |||
}}></Input> | |||
</div> | |||
</div> | |||
<div className={styles.edit_image_item}> | |||
<div className={styles.edit_image_prev}> | |||
素材编码: | |||
</div> | |||
<div className={styles.edit_image_suffix}> | |||
<Input placeholder='请输入素材编码' value={currentImage.materialCode} onChange={value => { | |||
const tempImg = JSON.parse(JSON.stringify(currentImage)); | |||
tempImg.materialCode = value.target.value; | |||
setCurrentImage(tempImg); | |||
}}></Input> | |||
</div> | |||
</div> | |||
<div className={styles.edit_image_item}> | |||
<div className={styles.edit_image_prev}> | |||
所属页面: | |||
</div> | |||
<div className={styles.edit_image_suffix}> | |||
<Select placeholder="请选择所在页面" style={{ width: '100%' }} value={currentImage.pageId} onChange={(value) => { | |||
const tempImg = JSON.parse(JSON.stringify(currentImage)); | |||
tempImg.pageId = value; | |||
setCurrentImage(tempImg); | |||
}}> | |||
{ | |||
miniPageList.map(item => { | |||
return <Option value={item.id} key={item.id}>{item.pageName}</Option> | |||
}) | |||
} | |||
</Select> | |||
</div> | |||
</div> | |||
<div className={styles.edit_image_item}> | |||
<div className={styles.edit_image_prev}> | |||
数量: | |||
</div> | |||
<div className={styles.edit_image_suffix}> | |||
<Select placeholder="请选择素材数量" style={{ width: '100%' }} value={currentImage.materialType} onChange={(value) => { | |||
const tempImg = JSON.parse(JSON.stringify(currentImage)); | |||
tempImg.materialType = value; | |||
setCurrentImage(tempImg); | |||
}}> | |||
<Option value={0} key={0}>单张</Option> | |||
<Option value={1} key={1}>多张</Option> | |||
</Select> | |||
</div> | |||
</div> | |||
<Upload | |||
listType="picture-card" | |||
fileList={fileList} | |||
onPreview={handlePreview} | |||
onChange={handleChange} | |||
onRemove={(remove) => { | |||
const findIndex = fileList.findIndex(item => item.uid === remove.uid); | |||
if (findIndex > -1) { | |||
const tempUpload = JSON.parse(JSON.stringify(currentImage)); | |||
tempUpload.materialPath.splice(findIndex, 1); | |||
setCurrentImage(tempUpload); | |||
} | |||
}} | |||
{...uploadProp} | |||
> | |||
{ | |||
(() => { | |||
if (currentImage.materialType === 0) { | |||
if (fileList.length >= 1) { | |||
return null; | |||
} else { | |||
return uploadButton | |||
} | |||
} else { | |||
return <>{fileList.length >= 9 ? null : uploadButton}</> | |||
} | |||
})() | |||
} | |||
</Upload> | |||
</div> | |||
</Modal> | |||
<Modal visible={previewVisible} title={previewTitle} footer={null} onCancel={handleCancel}> | |||
<img | |||
alt="example" | |||
style={{ | |||
width: '100%', | |||
}} | |||
src={previewImage} | |||
/> | |||
</Modal> | |||
</PageContainer > | |||
} | |||
export default Material; |
@@ -0,0 +1,12 @@ | |||
.table_search_item { | |||
display: flex; | |||
align-items: center; | |||
} | |||
.edit_image_item { | |||
margin-bottom: 10px; | |||
} | |||
.edit_image_prev { | |||
margin-bottom: 5px; | |||
} |
@@ -0,0 +1,242 @@ | |||
import ProTable from '@ant-design/pro-table'; | |||
import { PageContainer } from '@ant-design/pro-layout'; | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import { Button, Modal, Form, Input, Select, Card, message, Popconfirm } from 'antd'; | |||
import React, { useRef, useState, useEffect } from 'react'; | |||
import appletAPI from "../service"; | |||
import styles from "./index.less"; | |||
const pageManage = () => { | |||
const actionRef = useRef(); | |||
const [isModalVisible, setIsModalVisible] = useState(false); | |||
const [pageForm] = Form.useForm(); | |||
const [storeList, setStoreList] = useState([]); | |||
const [currentPage, setCurrentPage] = useState(1); | |||
const [pageSize, setPageSize] = useState(10); | |||
const [total, setTotal] = useState(0); | |||
const [selectedStore, setSelectedStore] = useState(''); | |||
const columns = [ | |||
{ | |||
title: '页面名称', | |||
dataIndex: 'pageName', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '页面路径', | |||
dataIndex: 'pageRoute', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '所属门店', | |||
dataIndex: 'storeId', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '操作', | |||
valueType: 'option', | |||
key: 'option', | |||
render: (_, record) => [ | |||
<a onClick={() => { | |||
pageForm.setFieldsValue(record); | |||
setIsModalVisible(true); | |||
}}> | |||
编辑 | |||
</a>, | |||
<Popconfirm | |||
title="确定要删除此页面吗?" | |||
onConfirm={() => onDeletePage(record)} | |||
okText="确定" | |||
cancelText="取消" | |||
> | |||
<a href="#">删除</a> | |||
</Popconfirm> | |||
], | |||
} | |||
]; | |||
const onBeforeCreate = () => { | |||
setIsModalVisible(true); | |||
pageForm.resetFields(); | |||
} | |||
/** | |||
* 添加/修改页面信息 | |||
*/ | |||
const onFinishPage = async (values) => { | |||
if (values.id) { | |||
const response = await appletAPI.MiniPageUpdate(values); | |||
if (response.statusCode === 200) { | |||
message.success('修改成功'); | |||
setIsModalVisible(false); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error(response.errors); | |||
} | |||
} else { | |||
const response = await appletAPI.MiniPageAdd(values); | |||
if (response.statusCode === 200) { | |||
message.success('添加成功'); | |||
setIsModalVisible(false); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error(response.errors); | |||
} | |||
} | |||
} | |||
/** | |||
* 删除页面 | |||
* @param {*} record | |||
*/ | |||
const onDeletePage = async (record) => { | |||
const response = await appletAPI.MiniPageDelete(record.id); | |||
if (response.statusCode === 200) { | |||
message.success('删除成功'); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error(response.errors); | |||
} | |||
} | |||
/** | |||
* 获取店铺列表 | |||
*/ | |||
const onFetchStoreList = async () => { | |||
const response = await appletAPI.GetAllStore(); | |||
if (response.isSuccess) { | |||
setStoreList(response.data); | |||
setSelectedStore(response.data[0].id); | |||
} else { | |||
message.error(response.msg || '获取店铺列表失败'); | |||
} | |||
} | |||
useEffect(() => { | |||
onFetchStoreList(); | |||
}, []); | |||
useEffect(() => { | |||
actionRef.current.reload(); | |||
}, [selectedStore]); | |||
return <PageContainer> | |||
<Card style={{ marginBottom: '10px' }}> | |||
<div className={styles.table_search_item}> | |||
<div> | |||
当前门店: | |||
</div> | |||
<Select style={{ width: 300 }} value={selectedStore} onChange={(value) => { | |||
setSelectedStore(value); | |||
}}> | |||
{ | |||
storeList.map(item => { | |||
return <Option value={item.id} key={item.id}>{item.store_Name}</Option> | |||
}) | |||
} | |||
</Select> | |||
</div> | |||
</Card> | |||
<ProTable | |||
columns={columns} | |||
actionRef={actionRef} | |||
cardBordered | |||
editable={{ | |||
type: 'multiple', | |||
}} | |||
request={async () => { | |||
if (!selectedStore) return; | |||
const jsonData = { | |||
"current": currentPage, | |||
"pageSize": pageSize, | |||
"storeId": selectedStore | |||
} | |||
const response = await appletAPI.MiniPageList(jsonData); | |||
return { | |||
data: response.data.items, | |||
success: true, | |||
total: response.data.totalCount, | |||
} | |||
}} | |||
rowKey="id" | |||
search={false} | |||
pagination={{ | |||
pageSize: 5, | |||
onChange: (page) => console.log(page), | |||
}} | |||
dateFormatter="string" | |||
headerTitle="页面管理" | |||
toolBarRender={() => [ | |||
<Button key="button" icon={<PlusOutlined />} type="primary" onClick={onBeforeCreate}> | |||
新建 | |||
</Button> | |||
]} | |||
/> | |||
<Modal title="编辑页面" footer={false} visible={isModalVisible} onOk={() => setIsModalVisible(false)} onCancel={() => setIsModalVisible(false)}> | |||
<Form | |||
name="basic" | |||
form={pageForm} | |||
onFinish={onFinishPage} | |||
> | |||
<Form.Item | |||
name="id" | |||
hidden={true} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="页面名称" | |||
name="pageName" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入页面名称!', | |||
}, | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="页面路径" | |||
name="pageRoute" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入页面路径!', | |||
}, | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="所属门店" | |||
name="storeId" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请选择门店!', | |||
}, | |||
]} | |||
> | |||
<Select allowClear placeholder="请选择门店" style={{ width: '100%' }}> | |||
{ | |||
storeList.map(item => { | |||
return <Option value={item.id} key={item.id}>{item.store_Name}</Option> | |||
}) | |||
} | |||
</Select> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
确定 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Modal> | |||
</PageContainer> | |||
} | |||
export default pageManage; |
@@ -0,0 +1,12 @@ | |||
.table_search_item { | |||
display: flex; | |||
align-items: center; | |||
} | |||
.edit_image_item { | |||
margin-bottom: 10px; | |||
} | |||
.edit_image_prev { | |||
margin-bottom: 5px; | |||
} |
@@ -0,0 +1,115 @@ | |||
import { request } from 'umi'; | |||
export default { | |||
GetAllStore() { | |||
return request('/kitchen/api/StoreHelper/GetAllStore', { | |||
method: 'GET' | |||
}); | |||
}, | |||
GetCosRequestURL(data) { | |||
return request(`/kitchen/api/systemconfig/GetCosRequestSignURL`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
}, | |||
/** | |||
* 添加素材 | |||
* @param {*} params | |||
* @returns | |||
*/ | |||
AddMinimaterial(params) { | |||
return request(`/kitchen/api/minimaterial/add`, { | |||
method: 'POST', | |||
data: params, | |||
}); | |||
}, | |||
/** | |||
* 更新素材 | |||
* @param {*} params | |||
*/ | |||
UpdateMiniMaterial(params) { | |||
return request(`/kitchen/api/minimaterial/update`, { | |||
method: 'POST', | |||
data: params, | |||
}); | |||
}, | |||
/** | |||
* 根据店铺id查询素材 | |||
*/ | |||
MinimaterialListByStore(params) { | |||
return request(`/kitchen/api/minimaterial/store`, { | |||
method: 'POST', | |||
data: params, | |||
}); | |||
}, | |||
/** | |||
* 删除素材 | |||
*/ | |||
DeleteMiniMaterial(id) { | |||
return request(`/kitchen/api/minimaterial/del`, { | |||
method: 'POST', | |||
data: { | |||
id | |||
}, | |||
}); | |||
}, | |||
/** | |||
* 添加页面 | |||
* @param {*} params | |||
* @returns | |||
*/ | |||
MiniPageAdd(params) { | |||
return request('/kitchen/api/minipage/add', { | |||
method: 'POST', | |||
data: { | |||
...params | |||
} | |||
}); | |||
}, | |||
/** | |||
* 删除 | |||
* @param {*} id | |||
* @returns | |||
*/ | |||
MiniPageDelete(id) { | |||
return request('/kitchen/api/minipage/del', { | |||
method: 'POST', | |||
data: { | |||
id | |||
} | |||
}); | |||
}, | |||
/** | |||
* 更新页面 | |||
* @param {*} params | |||
*/ | |||
MiniPageUpdate(params) { | |||
return request('/kitchen/api/minipage/update', { | |||
method: 'POST', | |||
data: { | |||
...params | |||
} | |||
}); | |||
}, | |||
/** | |||
* 分页查询 | |||
*/ | |||
MiniPageList(params) { | |||
return request('/kitchen/api/minipage/page', { | |||
method: 'POST', | |||
data: { | |||
...params | |||
} | |||
}); | |||
} | |||
} |
@@ -9,7 +9,7 @@ const CreateForm = (props) => { | |||
visible={props?.createModalVisible} | |||
bodyStyle={{ padding: '32px 40px 48px' }} | |||
footer={null} | |||
onCancel={() => { | |||
onCancel={() => { | |||
props?.onCancel(); | |||
}} | |||
destroyOnClose | |||
@@ -31,8 +31,8 @@ const CreateForm = (props) => { | |||
name="pertain" | |||
label="归属" | |||
defaultValue={props?.values?.pertain} | |||
rules={[{ required: true, message: '请选择类型归宿' }]} > | |||
<Select placeholder="请选择类型归宿"> | |||
rules={[{ required: true, message: '请选择类型归属' }]} > | |||
<Select placeholder="请选择类型归属"> | |||
<Option value="1">无</Option> | |||
<Option value="2">TMC </Option> | |||
</Select> | |||
@@ -0,0 +1,77 @@ | |||
import React, { useState, useEffect } from 'react'; | |||
import { Modal, Form, Input, Button, Select, InputNumber } from 'antd'; | |||
import api from '../services'; | |||
const CreateForm = (props) => { | |||
const { Option, OptGroup } = Select; | |||
const [options, setoptions] = useState(); | |||
//每次触发 | |||
useEffect(() => { | |||
const initoptions = async (value) => { | |||
var data = await api.getStirFryArray("stirfrytime"); | |||
if (data != undefined) { | |||
setoptions(data.data); | |||
} | |||
}; | |||
initoptions(); | |||
}, []); | |||
return ( | |||
<Modal | |||
title={props.values.id ? '编辑' : '新建'} | |||
width={640} | |||
visible={props.createModalVisible} | |||
bodyStyle={{ padding: '32px 40px 48px' }} | |||
footer={null} | |||
onCancel={() => { | |||
props.onCancel(); | |||
}} | |||
destroyOnClose | |||
> | |||
<Form | |||
layout="vertical" | |||
preserve={false} | |||
initialValues={props.values} | |||
onFinish={props.onFinish} | |||
> | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="status" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="fryTime" label="步骤名称" rules={[{ required: true, max: 64, whitespace: true }]}> | |||
<Select style={{ width: 200 }} | |||
showSearch | |||
optionFilterProp="children" | |||
filterOption={(input, option) => | |||
option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 | |||
} > | |||
{options?.map((item, index) => { | |||
return ( | |||
<Option | |||
index={item} | |||
value={item} | |||
key={index} | |||
> | |||
{item} | |||
</Option> | |||
); | |||
})} | |||
</Select> | |||
</Form.Item> | |||
<Form.Item name="during" label="持续时间" rules={[{ required: true }]}> | |||
<InputNumber min={0} /> | |||
</Form.Item> | |||
<span style={{ color: '#FFCC52' }}> | |||
注: 持续时间(s),若为0,则等待该流程走完结束 | |||
</span> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
保存 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Modal> | |||
); | |||
}; | |||
export default CreateForm; |
@@ -0,0 +1,137 @@ | |||
import React, { useState, useEffect } from 'react'; | |||
import { | |||
InputNumber, | |||
Row, | |||
Col, | |||
Switch, | |||
Checkbox, | |||
Space, | |||
Steps, | |||
message, | |||
Modal, | |||
Form, | |||
Input, | |||
Button, | |||
Select, | |||
DatePicker, | |||
Upload | |||
} from 'antd'; | |||
import { MinusCircleOutlined, PlusOutlined, UploadOutlined } from '@ant-design/icons'; | |||
import api from '../services'; | |||
const PotActions = (props) => { | |||
const { Option, OptGroup } = Select; | |||
const [options, setoptions] = useState(); | |||
const [options11, setoptions11] = useState({potActions:[]}); | |||
//每次触发 | |||
useEffect(() => { | |||
const initoptions = async (value) => { | |||
var data = await api.getStirFryArray("stirfrypotaction"); | |||
if (data != undefined) { | |||
setoptions(data.data); | |||
} | |||
}; | |||
initoptions(); | |||
}, []); | |||
return ( | |||
<Modal | |||
title={'炒锅配置'} | |||
width={500} | |||
visible={props.createModalVisible} | |||
footer={null} //底部内容 | |||
onCancel={() => { | |||
props.onCancel(); | |||
}} | |||
//关闭时销毁 Modal 里的子元素 | |||
destroyOnClose={true} | |||
> | |||
<Form | |||
preserve={false} | |||
form={props.form} | |||
labelCol={{ span: 4 }} | |||
layout="Horizontal" | |||
// initialValues={props.values} | |||
onFinish={props.onFinish} | |||
initialValues={props.values} | |||
> | |||
<span> | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
noStyle | |||
shouldUpdate={(prevValues, currentValues) => | |||
prevValues.activityType !== currentValues.activityType | |||
} > | |||
{({ getFieldValue }) => | |||
(<Form.Item > | |||
<Form.List name="potActions"> | |||
{(fields, { add, remove }) => ( | |||
<> | |||
{fields?.map(({ key, name, fieldKey, ...restField }, index) => ( | |||
<Space | |||
key={index} | |||
style={{ display: 'flex', marginBottom: 8 }} | |||
align="baseline" | |||
> | |||
<Form.Item | |||
{...restField} | |||
label={"炒锅动作"} | |||
name={[name, 'value']} | |||
fieldKey={[fieldKey, 'value']} | |||
rules={[{ required: true, message: '请选择' }]} > | |||
{ | |||
<Select style={{ width: 200 }} | |||
showSearch | |||
optionFilterProp="children" | |||
filterOption={(input, option) => | |||
option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 | |||
} > | |||
{options.map((item, index) => { | |||
return ( | |||
<Option | |||
index={item} | |||
value={item} | |||
key={index} | |||
> | |||
{item} | |||
</Option> | |||
); | |||
})} | |||
</Select> | |||
} | |||
</Form.Item> | |||
<MinusCircleOutlined onClick={() => remove(name)} /> | |||
</Space > | |||
)) | |||
} | |||
<Form.Item> | |||
<Button type="dashed" onClick={() => add()} block icon={<PlusOutlined />}> | |||
添加 | |||
</Button> | |||
</Form.Item> | |||
</> | |||
)} | |||
</Form.List > | |||
</Form.Item > | |||
) | |||
} | |||
</Form.Item > | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit" style={{ float: 'right' }}> | |||
保存 | |||
</Button> | |||
</Form.Item> | |||
</span > | |||
</Form > | |||
</Modal > | |||
); | |||
}; | |||
export default PotActions; |
@@ -0,0 +1,138 @@ | |||
import React, { useState, useEffect } from 'react'; | |||
import { | |||
InputNumber, | |||
Row, | |||
Col, | |||
Switch, | |||
Checkbox, | |||
Space, | |||
Steps, | |||
message, | |||
Modal, | |||
Form, | |||
Input, | |||
Button, | |||
Select, | |||
DatePicker, | |||
Upload | |||
} from 'antd'; | |||
import { MinusCircleOutlined, PlusOutlined, UploadOutlined } from '@ant-design/icons'; | |||
import api from '../services'; | |||
const RobotActions = (props) => { | |||
const { Option, OptGroup } = Select; | |||
const [options, setoptions] = useState(); | |||
//每次触发 | |||
useEffect(() => { | |||
const initoptions = async (value) => { | |||
var data = await api.getStirFryArray("sirfryrobotaction"); | |||
if (data != undefined) { | |||
setoptions(data.data); | |||
} | |||
}; | |||
initoptions(); | |||
}, []); | |||
return ( | |||
<Modal | |||
title={'机械臂配置'} | |||
width={500} | |||
visible={props.createModalVisible} | |||
//visible={options11} | |||
footer={null} //底部内容 | |||
onCancel={() => { | |||
props.onCancel(); | |||
}} | |||
//关闭时销毁 Modal 里的子元素 | |||
destroyOnClose={true} | |||
> | |||
<Form | |||
preserve={false} | |||
form={props.form} | |||
labelCol={{ span: 4 }} | |||
layout="Horizontal" | |||
onFinish={props.onFinish} | |||
initialValues={props.values} | |||
> | |||
<span > | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
noStyle | |||
shouldUpdate={(prevValues, currentValues) => | |||
prevValues.activityType !== currentValues.activityType | |||
} > | |||
{({ getFieldValue }) => | |||
(<Form.Item> | |||
<Form.List name="robotActions"> | |||
{(fields, { add, remove }) => ( | |||
<> | |||
{fields?.map(({ key, name, fieldKey, ...restField },index) => ( | |||
<Space | |||
key={index} | |||
style={{ display: 'flex', marginBottom: 8 }} | |||
align="baseline" | |||
> | |||
<Form.Item | |||
{...restField} | |||
label={"机械臂动作"} | |||
name={[name, 'value']} | |||
fieldKey={[fieldKey, 'value']} | |||
rules={[{ required: true, message: '请选择' }]} > | |||
{ | |||
<Select style={{ width: 200 }} | |||
showSearch | |||
optionFilterProp="children" | |||
filterOption={(input, option) => | |||
option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 | |||
} > | |||
{options?.map((item, index) => { | |||
return ( | |||
<Option | |||
index={item} | |||
value={item} | |||
key={index} | |||
> | |||
{item} | |||
</Option> | |||
); | |||
})} | |||
</Select> | |||
} | |||
</Form.Item> | |||
<MinusCircleOutlined onClick={() => remove(name)} /> | |||
</Space > | |||
)) | |||
} | |||
<Form.Item> | |||
<Button type="dashed" onClick={() => add()} block icon={<PlusOutlined />}> | |||
添加 | |||
</Button> | |||
</Form.Item> | |||
</> | |||
)} | |||
</Form.List > | |||
</Form.Item > | |||
) | |||
} | |||
</Form.Item > | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit" style={{ float: 'right' }}> | |||
保存 | |||
</Button> | |||
</Form.Item> | |||
</span > | |||
</Form > | |||
</Modal > | |||
); | |||
}; | |||
export default RobotActions; |
@@ -0,0 +1,330 @@ | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import { Button, message, Input, Drawer, Modal, Popconfirm } from 'antd'; | |||
import React, { useState, useRef, useEffect } from 'react'; | |||
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import ProDescriptions from '@ant-design/pro-descriptions'; | |||
import CreateForm from './components/CreateForm'; | |||
import PotActions from './components/PotActions'; | |||
import RobotActions from './components/RobotActions'; | |||
import api from './services'; | |||
//页面 相当于 class | |||
/** | |||
* 添加节点 | |||
* | |||
* @param fields | |||
*/ | |||
const handleAdd = async (fields) => { | |||
try { | |||
api.addupdate(JSON.stringify(fields)).then((r) => { | |||
if (r.data) { | |||
message.success('添加成功'); | |||
} else { | |||
message.error('添加失败请重试!'); | |||
} | |||
}); | |||
return true; | |||
} catch (error) { | |||
message.error('添加失败请重试!'); | |||
return false; | |||
} | |||
} | |||
/** | |||
* 批量删除节点 | |||
* | |||
* @param selectedRows | |||
*/ | |||
const handleRemove = async (fields) => { | |||
try { | |||
api.delete(fields.id).then((r) => { | |||
if (r.data) { | |||
message.success('删除成功,即将刷新'); | |||
} else { | |||
message.error('删除失败,请重试'); | |||
} | |||
}); | |||
return true; | |||
} catch (error) { | |||
message.error('删除失败,请重试'); | |||
} | |||
} | |||
/** | |||
* 更新节点 | |||
* | |||
* @param fields | |||
*/ | |||
const handlePotUpdate = async (fields) => { | |||
try { | |||
api.UpdatePot(fields).then((r) => { | |||
if (r.data) { | |||
message.success('修改成功'); | |||
} else { | |||
message.error('修改失败请重试!'); | |||
} | |||
}); | |||
return true; | |||
} catch (error) { | |||
message.error('修改失败请重试!'); | |||
return false; | |||
} | |||
} | |||
const handleRobotUpdate = async (fields) => { | |||
try { | |||
api.UpdateRobot(fields).then((r) => { | |||
if (r.data) { | |||
message.success('修改成功'); | |||
} else { | |||
message.error('修改失败请重试!'); | |||
} | |||
}); | |||
return true; | |||
} catch (error) { | |||
message.error('修改失败请重试!'); | |||
return false; | |||
} | |||
} | |||
const handleUpdate = async (fields) => { | |||
try { | |||
api.addupdate(fields).then((r) => { | |||
if (r.data) { | |||
message.success('修改成功'); | |||
} else { | |||
message.error('修改失败请重试!'); | |||
} | |||
}); | |||
return true; | |||
} catch (error) { | |||
message.error('修改失败请重试!'); | |||
return false; | |||
} | |||
} | |||
const cookingwork = (props) => { | |||
const [values, setUrl] = useState(props.location.query.values ? props.location.query.values : null); | |||
/** 新建/更新窗口的弹窗 */ | |||
const [createModalVisible, handleModalVisible] = useState(false); | |||
/** 分布更新窗口的弹窗 */ | |||
const [createPotActionsModalVisible, handlePotActionsModalVisible] = useState(false); | |||
const [createRobotActionsModalVisible, handleRobotActionsModalVisible] = useState(false); | |||
//绑定 | |||
const actionRef = useRef(); | |||
const [currentRow, setCurrentRow] = useState(); | |||
const [selectedRowsState, setSelectedRows] = useState([]); | |||
// 监控数据变化 | |||
useEffect(() => { | |||
}, []); | |||
/** 国际化配置 */ | |||
const columns = [ | |||
{ | |||
title: '主键', | |||
dataIndex: 'id', | |||
hideInTable: true, | |||
hideInSearch: true, | |||
}, | |||
{ | |||
title: '步骤名称', | |||
dataIndex: 'fryTime', | |||
hideInForm: true, | |||
hideInSearch: true, | |||
}, | |||
{ | |||
title: '持续时间(秒)', | |||
dataIndex: 'during', | |||
hideInForm: true, | |||
hideInSearch: true, | |||
}, | |||
{ | |||
title: '操作', | |||
dataIndex: 'option', | |||
valueType: 'option', | |||
render: (_, record) => [ | |||
<a | |||
key="config" | |||
onClick={() => { | |||
handleModalVisible(true); | |||
setCurrentRow(record); | |||
}} | |||
> | |||
修改 | |||
</a>, | |||
<a | |||
key="config" | |||
onClick={() => { | |||
handleRobotActionsModalVisible(true); | |||
if (typeof (record.robotActions) == 'string') { | |||
record.robotActions = JSON.parse(record.robotActions) | |||
} | |||
setCurrentRow(record); | |||
}} | |||
> | |||
机器人配置 | |||
</a>, | |||
<a | |||
key="config" | |||
onClick={() => { | |||
handlePotActionsModalVisible(true); | |||
if (typeof (record.potActions) == 'string') { | |||
record.potActions = JSON.parse(record.potActions) | |||
} | |||
setCurrentRow(record); | |||
}} | |||
> | |||
炒锅配置 | |||
</a>, | |||
<Popconfirm | |||
type="primary" | |||
key="primary" | |||
title="确认删除吗?" | |||
okText="是" | |||
cancelText="否" | |||
onConfirm={() => { | |||
handleRemove(record); | |||
actionRef.current?.reloadAndRest(); | |||
}} | |||
onCancel={() => { }} | |||
> | |||
<a href="#">删除</a> | |||
</Popconfirm>, | |||
], | |||
}, | |||
]; | |||
return ( | |||
<PageContainer> | |||
<ProTable | |||
pagination={{ defaultPageSize: 50 }} | |||
headerTitle="小炒步骤设置" | |||
actionRef={actionRef} | |||
rowKey="id" | |||
search={false} | |||
columns={columns} | |||
toolBarRender={() => [ | |||
<Button | |||
type="primary" | |||
key="primary" | |||
onClick={() => { | |||
handleModalVisible(true); | |||
setCurrentRow({}); | |||
}} | |||
> | |||
<PlusOutlined /> 新建 | |||
</Button>, | |||
]} | |||
//数据绑定 | |||
request={async (params) => { | |||
params.CookingWorkId = props.location.query.values.id; | |||
var data = []; | |||
var total = 0; | |||
await api.getpage(params).then((r) => { | |||
data = r.data.data; | |||
total = r.data.total; | |||
}); | |||
return { | |||
data: data, | |||
success: true, | |||
total: total, | |||
}; | |||
}} | |||
// 每行选择点击事件 | |||
rowSelection={{ | |||
onChange: (_, selectedRows) => { | |||
setSelectedRows(selectedRows); | |||
}, | |||
}} | |||
></ProTable> | |||
{selectedRowsState?.length > 0 && ( | |||
<FooterToolbar | |||
extra={ | |||
<div> | |||
已选择{' '} | |||
<a | |||
style={{ | |||
fontWeight: 600, | |||
}} | |||
> | |||
{selectedRowsState.length} | |||
</a>{' '} | |||
项 | |||
</div> | |||
} | |||
> | |||
<Button | |||
onClick={async () => { | |||
await handleRemove(selectedRowsState); | |||
setSelectedRows([]); | |||
actionRef.current?.reloadAndRest?.(); | |||
}} | |||
> | |||
批量删除 | |||
</Button> | |||
</FooterToolbar> | |||
)} | |||
<PotActions | |||
onFinish={async (value) => { | |||
var success = false; | |||
success = await handlePotUpdate(value); | |||
if (success) { | |||
handlePotActionsModalVisible(false); | |||
if (actionRef.current) { | |||
actionRef.current.reload(); | |||
} | |||
} | |||
}} | |||
onCancel={() => { | |||
setCurrentRow(undefined); | |||
handlePotActionsModalVisible(false); | |||
}} | |||
createModalVisible={createPotActionsModalVisible} | |||
values={currentRow || {}} | |||
/> | |||
<RobotActions | |||
onFinish={async (value) => { | |||
var success = false; | |||
success = await handleRobotUpdate(value); | |||
if (success) { | |||
handleRobotActionsModalVisible(false); | |||
if (actionRef.current) { | |||
actionRef.current.reload(); | |||
} | |||
} | |||
}} | |||
onCancel={() => { | |||
setCurrentRow(undefined); | |||
handleRobotActionsModalVisible(false); | |||
}} | |||
createModalVisible={createRobotActionsModalVisible} | |||
values={currentRow || {}} | |||
/> | |||
<CreateForm | |||
onFinish={async (value) => { | |||
var success = false; | |||
if (value.id) { | |||
success = await handleUpdate(value); | |||
} else { | |||
success = await handleAdd(value); | |||
} | |||
if (success) { | |||
handleModalVisible(false); | |||
if (actionRef.current) { | |||
actionRef.current.reload(); | |||
} | |||
} | |||
}} | |||
onCancel={() => { | |||
setCurrentRow(undefined); | |||
handleModalVisible(false); | |||
}} | |||
createModalVisible={createModalVisible} | |||
values={currentRow || {}} | |||
/> | |||
</PageContainer> | |||
); | |||
}; | |||
export default cookingwork; |
@@ -0,0 +1,42 @@ | |||
// @ts-ignore | |||
/* eslint-disable */ | |||
import { request } from 'umi'; | |||
export default { | |||
getpage(data) { | |||
return request(`/kitchen/api/stirFryTime/getpage`, { | |||
method: 'Post', | |||
data: data, | |||
}); | |||
}, | |||
getStirFryArray(data) { | |||
return request(`/kitchen/api/stirFryTime/getStirFryArray?type=`+data, { | |||
method: 'GET', | |||
}); | |||
}, | |||
addupdate(data) { | |||
return request('/kitchen/api/stirFryTime/AddUpdate', { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
}, | |||
UpdatePot(data) { | |||
return request('/kitchen/api/stirFryTime/UpdatePot', { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
}, | |||
UpdateRobot(data) { | |||
return request('/kitchen/api/stirFryTime/UpdateRobot', { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
}, | |||
delete(data) { | |||
return request('/kitchen/api/stirFryTime/delete?id='+data, { | |||
method: 'GET', | |||
}); | |||
}, | |||
}; |
@@ -0,0 +1,45 @@ | |||
import React, { useState, useEffect } from 'react'; | |||
import { Modal, Form, Input, Button, Switch,InputNumber } from 'antd'; | |||
const CreateForm = (props) => { | |||
return ( | |||
<Modal | |||
title={props.values.id ? '编辑' : '新建'} | |||
width={640} | |||
visible={props.createModalVisible} | |||
bodyStyle={{ padding: '32px 40px 48px' }} | |||
footer={null} | |||
onCancel={() => { | |||
props.onCancel(); | |||
}} | |||
destroyOnClose | |||
> | |||
<Form | |||
layout="vertical" | |||
preserve={false} | |||
initialValues={props.values} | |||
onFinish={props.onFinish} | |||
> | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="status" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="name" label="工序名称" rules={[{ required: true, max: 64, whitespace: true }]}> | |||
<Input placeholder="请输入工序名称" /> | |||
</Form.Item> | |||
<Form.Item name="remark" label="工序描述" rules={[{ required: true, max: 64, whitespace: true }]}> | |||
<Input placeholder="请输入工序描述" /> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
保存 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Modal> | |||
); | |||
}; | |||
export default CreateForm; |
@@ -0,0 +1,280 @@ | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import { Button, message, Input, Drawer, Modal,Popconfirm } from 'antd'; | |||
import React, { useState, useRef, useEffect } from 'react'; | |||
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import ProDescriptions from '@ant-design/pro-descriptions'; | |||
import CreateForm from './components/CreateForm'; | |||
import { history } from 'umi'; | |||
import api from './services'; | |||
//页面 相当于 class | |||
/** | |||
* 添加节点 | |||
* | |||
* @param fields | |||
*/ | |||
const handleAdd = async (fields) => { | |||
try { | |||
api.addupdate(JSON.stringify(fields)).then((r) => { | |||
if (r.data) { | |||
message.success('添加成功'); | |||
} else { | |||
message.error('添加失败请重试!'); | |||
} | |||
}); | |||
return true; | |||
} catch (error) { | |||
message.error('添加失败请重试!'); | |||
return false; | |||
} | |||
} | |||
/** | |||
* 批量删除节点 | |||
* | |||
* @param selectedRows | |||
*/ | |||
const handleRemove = async (ids) => { | |||
console.log(ids); | |||
try { | |||
// api.delete(ids).then((r) => { | |||
// if (r.data) { | |||
// message.success('删除成功,即将刷新'); | |||
// } else { | |||
// message.error('删除失败,请重试'); | |||
// } | |||
// }); | |||
return true; | |||
} catch (error) { | |||
message.error('删除失败,请重试'); | |||
} | |||
} | |||
/** | |||
* 更新节点 | |||
* | |||
* @param fields | |||
*/ | |||
const handleUpdate = async (fields) => { | |||
try { | |||
api.addupdate(fields).then((r) => { | |||
if (r.data) { | |||
message.success('修改成功'); | |||
} else { | |||
message.error('修改失败请重试!'); | |||
} | |||
}); | |||
return true; | |||
} catch (error) { | |||
message.error('修改失败请重试!'); | |||
return false; | |||
} | |||
} | |||
const cookingwork = (props) => { | |||
/** 新建/更新窗口的弹窗 */ | |||
const [createModalVisible, handleModalVisible] = useState(false); | |||
/** 分布更新窗口的弹窗 */ | |||
//绑定 | |||
const actionRef = useRef(); | |||
const [currentRow, setCurrentRow] = useState(); | |||
const [selectedRowsState, setSelectedRows] = useState([]); | |||
// 监控数据变化 | |||
useEffect(() => { | |||
}, []); | |||
/** 国际化配置 */ | |||
const columns = [ | |||
{ | |||
title: '主键', | |||
dataIndex: 'id', | |||
hideInTable: true, | |||
hideInSearch: true, | |||
}, | |||
{ | |||
title: '工序名称', | |||
dataIndex: 'name', | |||
hideInForm: true, | |||
}, | |||
{ | |||
title: '状态', | |||
dataIndex: 'status', | |||
hideInForm: true, | |||
search: false, | |||
valueEnum: { | |||
0: { | |||
text: '正常', | |||
status: 'Processing', | |||
}, | |||
1: { | |||
text: '停用', | |||
status: 'Success', | |||
}, | |||
}, | |||
}, | |||
{ | |||
title: '工序描述', | |||
dataIndex: 'remark', | |||
hideInForm: true, | |||
hideInSearch: true, | |||
}, | |||
{ | |||
title: '操作', | |||
dataIndex: 'option', | |||
valueType: 'option', | |||
render: (_, record) => [ | |||
<a | |||
key="config" | |||
onClick={() => { | |||
history.push({ | |||
pathname: '/bom/cookingentry', | |||
query: { | |||
isAdd: false, | |||
values:record | |||
}, | |||
}); | |||
}} | |||
> | |||
配置 | |||
</a>, | |||
<a | |||
key="config" | |||
onClick={() => { | |||
handleModalVisible(true); | |||
setCurrentRow(record); | |||
}} | |||
> | |||
更新 | |||
</a>, | |||
<Popconfirm | |||
type="primary" | |||
key="primary" | |||
title={record.status == 0 ? '确认停用吗?' : '确认启用吗?'} | |||
okText="是" | |||
cancelText="否" | |||
onConfirm={() => { | |||
record.status = record.status == 0 ? 1 : 0; | |||
handleUpdate(record); | |||
actionRef.current?.reloadAndRest(); | |||
}} | |||
onCancel={() => { }} | |||
><a>{record.status == 1 ? '启用' : '停用'}</a> | |||
</Popconfirm>, | |||
<Popconfirm | |||
type="primary" | |||
key="primary" | |||
title="确认删除吗?" | |||
okText="是" | |||
cancelText="否" | |||
onConfirm={() => { | |||
handleRemove(record); | |||
actionRef.current?.reloadAndRest(); | |||
}} | |||
onCancel={() => { }} | |||
> | |||
<a href="#">删除</a> | |||
</Popconfirm>, | |||
], | |||
}, | |||
]; | |||
return ( | |||
<PageContainer> | |||
<ProTable | |||
headerTitle="小炒工序" | |||
actionRef={actionRef} | |||
rowKey="id" | |||
search={{ | |||
labelWidth: 120, | |||
}} | |||
columns={columns} | |||
toolBarRender={() => [ | |||
<Button | |||
type="primary" | |||
key="primary" | |||
onClick={() => { | |||
handleModalVisible(true); | |||
setCurrentRow({}); | |||
}} | |||
> | |||
<PlusOutlined /> 新建 | |||
</Button>, | |||
]} | |||
//数据绑定 | |||
request={async (params) => { | |||
var data = []; | |||
var total = 0; | |||
await api.getpage(params).then((r) => { | |||
data = r.data.data; | |||
total = r.data.total; | |||
}); | |||
return { | |||
data: data, | |||
success: true, | |||
total: total, | |||
}; | |||
}} | |||
// 每行选择点击事件 | |||
rowSelection={{ | |||
onChange: (_, selectedRows) => { | |||
setSelectedRows(selectedRows); | |||
}, | |||
}} | |||
></ProTable> | |||
{selectedRowsState?.length > 0 && ( | |||
<FooterToolbar | |||
extra={ | |||
<div> | |||
已选择{' '} | |||
<a | |||
style={{ | |||
fontWeight: 600, | |||
}} | |||
> | |||
{selectedRowsState.length} | |||
</a>{' '} | |||
项 | |||
</div> | |||
} | |||
> | |||
<Button | |||
onClick={async () => { | |||
await handleRemove(selectedRowsState); | |||
setSelectedRows([]); | |||
actionRef.current?.reloadAndRest?.(); | |||
}} | |||
> | |||
批量删除 | |||
</Button> | |||
</FooterToolbar> | |||
)} | |||
<CreateForm | |||
onFinish={async (value) => { | |||
var success = false; | |||
if (value.id) { | |||
success = await handleUpdate(value); | |||
} else { | |||
success = await handleAdd(value); | |||
} | |||
if (success) { | |||
handleModalVisible(false); | |||
if (actionRef.current) { | |||
actionRef.current.reload(); | |||
} | |||
} | |||
}} | |||
onCancel={() => { | |||
setCurrentRow(undefined); | |||
handleModalVisible(false); | |||
}} | |||
createModalVisible={createModalVisible} | |||
values={currentRow || {}} | |||
/> | |||
</PageContainer> | |||
); | |||
}; | |||
export default cookingwork; |
@@ -0,0 +1,25 @@ | |||
// @ts-ignore | |||
/* eslint-disable */ | |||
import { request } from 'umi'; | |||
export default { | |||
getpage(data) { | |||
return request(`/kitchen/api/cookingwork/getpage`, { | |||
method: 'Post', | |||
data: data, | |||
}); | |||
}, | |||
addupdate(data) { | |||
return request('/kitchen/api/cookingwork/addupdate', { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
}, | |||
delete(data) { | |||
return request('/kitchen/api/cookingwork/delete', { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
}, | |||
}; |
@@ -1,7 +1,7 @@ | |||
import React, { useState, useEffect } from 'react'; | |||
import { Modal, Form, Input, Button, Select, Space, Card } from 'antd' | |||
import { EditableProTable, ProForm, ProFormText } from '@ant-design/pro-form'; | |||
import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons'; | |||
import { DeleteOutlined } from '@ant-design/icons'; | |||
import '../index.css' | |||
const BomConsumption = (props) => { | |||
@@ -13,7 +13,7 @@ const BomConsumption = (props) => { | |||
} | |||
const deleteFormula = (index) => { | |||
if (props.values.length <= 1) return; | |||
// if (props.values.length <= 1) return; | |||
const tempColums = JSON.parse(JSON.stringify(props.values)); | |||
tempColums.splice(index, 1); | |||
props.onUpdateBom(tempColums); | |||
@@ -24,6 +24,7 @@ const BomConsumption = (props) => { | |||
// console.log('表单值为', props.values); | |||
}; | |||
return ( | |||
<Modal | |||
@@ -72,6 +73,7 @@ const BomConsumption = (props) => { | |||
props.onUpdateBom(tempColums); | |||
}} /> | |||
</div> | |||
<Button onClick={() => props.onDeleteMate(itemList, index)} type='link' danger icon={<DeleteOutlined />} style={{marginLeft: '10px'}}></Button> | |||
</div> | |||
</div> | |||
}) | |||
@@ -31,7 +31,7 @@ const CreateForm = (props) => { | |||
<Input placeholder="配方名称" /> | |||
</Form.Item> | |||
<Form.Item name="bomTypeList" label="配方类型" > | |||
<Select | |||
<Select | |||
mode="multiple" | |||
allowClear > | |||
{props?.bomtype?.map((item, index) => { | |||
@@ -46,6 +46,9 @@ const CreateForm = (props) => { | |||
<Form.Item name="isMain" label="配方类型" > | |||
<Switch checkedChildren="主料" unCheckedChildren="辅料" /> | |||
</Form.Item> | |||
<Form.Item name="sort" label="排序" > | |||
<InputNumber placeholder="排序" min={1} /> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
保存 | |||
@@ -161,6 +161,12 @@ const GoodsBomsManage = (props) => { | |||
hideInForm: true, | |||
hideInSearch: true, | |||
}, | |||
{ | |||
title: '排序', | |||
dataIndex: 'sort', | |||
hideInForm: true, | |||
hideInSearch: true, | |||
}, | |||
{ | |||
title: '配方分类', | |||
dataIndex: 'bomTypeList', | |||
@@ -258,6 +264,17 @@ const GoodsBomsManage = (props) => { | |||
setBomConsumptionInfo(data); | |||
} | |||
/** | |||
* 删除物料 | |||
* @param {*} itemList | |||
*/ | |||
const onDeleteMate = (itemList, index) => { | |||
const tempBom = JSON.parse(JSON.stringify(bomConsumptionInfo)); | |||
const findIndex = tempBom[index].bomMaterials.findIndex(item => itemList.id === item.id); | |||
tempBom[index].bomMaterials.splice(findIndex, 1); | |||
setBomConsumptionInfo(tempBom); | |||
} | |||
return ( | |||
<PageContainer> | |||
<ProTable | |||
@@ -371,6 +388,7 @@ const GoodsBomsManage = (props) => { | |||
onCancel={() => { | |||
SetBomConsumptionModalVisible(false); | |||
}} | |||
onDeleteMate={onDeleteMate} | |||
/> | |||
</PageContainer> | |||
); | |||
@@ -1,61 +0,0 @@ | |||
import React, { useState, useEffect } from 'react'; | |||
import { Modal, Form, Input, Button, Select, Switch,InputNumber } from 'antd'; | |||
const CreateForm = (props) => { | |||
const { Option, OptGroup } = Select; | |||
return ( | |||
<Modal | |||
title={props.values.id ? '编辑' : '新建'} | |||
width={640} | |||
visible={props.createModalVisible} | |||
bodyStyle={{ padding: '32px 40px 48px' }} | |||
footer={null} | |||
onCancel={() => { | |||
props.onCancel(); | |||
}} | |||
destroyOnClose | |||
> | |||
<Form | |||
layout="vertical" | |||
preserve={false} | |||
initialValues={props.values} | |||
onFinish={props.onFinish} | |||
> | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
name="stockGoodsCode" | |||
label="原料名称" | |||
rules={[{ required: true, message: '请选择原料名称' }]} | |||
> | |||
<Select placeholder="请选择原料名称"> | |||
{props.stockGoodsData.map((item, index) => { | |||
return ( | |||
<Select.Option index={index} value={item.id} key={item.id}> | |||
{item.name} | |||
</Select.Option> | |||
); | |||
})} | |||
</Select> | |||
</Form.Item> | |||
<Form.Item name="bomQty" label="配方用量" defaultValue={props.values.bomQty}> | |||
<InputNumber placeholder="配方用量" min={0} /> | |||
</Form.Item> | |||
<Form.Item name="isMain" label="主要原料" > | |||
<Switch checkedChildren="否" unCheckedChildren="是" defaultChecked /> | |||
</Form.Item> | |||
<Form.Item name="isReplace" label="是否可以替换" > | |||
<Switch checkedChildren="否" unCheckedChildren="是" defaultChecked /> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
保存 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Modal> | |||
); | |||
}; | |||
export default CreateForm; |
@@ -1,437 +0,0 @@ | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import { Button, message, Input, Drawer, Modal } from 'antd'; | |||
import React, { useState, useRef, useEffect } from 'react'; | |||
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import ProDescriptions from '@ant-design/pro-descriptions'; | |||
import CreateForm from './components/CreateForm'; | |||
import api from './services'; | |||
const GoodsBomsManage = (props) => { | |||
/** 新建/更新窗口的弹窗 */ | |||
const [createModalVisible, handleModalVisible] = useState(false); | |||
const [BomReplaclVisible, BomReplacVisible] = useState(false); | |||
/** 分布更新窗口的弹窗 */ | |||
const [dicData, setDicData] = useState([]); | |||
const [dicDataAny, setDicDataAny] = useState([]); | |||
const [showDetail, setShowDetail] = useState(false); | |||
const actionRef = useRef(); | |||
const [currentRow, setCurrentRow] = useState(); | |||
const [selectedRowsState, setSelectedRows] = useState([]); | |||
// //获取商品数据 | |||
const [goods, setgoods] = useState([]); | |||
//获取原料名称 | |||
const [stockGoods, setstockGoods] = useState([]); | |||
// 监控数据变化 | |||
useEffect(() => { | |||
function initgoods() { | |||
api.goodList({ current: 1, pageSize: 20, status: '0' }).then((r) => { | |||
var arr = r.data.data; | |||
arr.forEach((element) => { | |||
element.text = element.name; | |||
element.goodsId = element.id; | |||
}); | |||
setgoods(arr); | |||
}); | |||
} | |||
initgoods(); | |||
/** 获取原料名称*/ | |||
function initStockGoods() { | |||
api.postStockGoods().then((r) => { | |||
var arr = r.data; | |||
arr.forEach((element) => { | |||
element.text = element.name; | |||
element.stockGoodsId = element.value; | |||
}); | |||
setstockGoods(arr); | |||
}); | |||
} | |||
initStockGoods(); //回调原料信息 | |||
function intDicData() { | |||
api.GetDicList('BatchingType').then((r) => { | |||
var arr = r.data; | |||
// arr.forEach((element) => { | |||
// //element.text = element.remark; | |||
// // element.batchingTypeId = element.value; | |||
// }); | |||
let data = {}; | |||
if (r.succeeded) { | |||
arr.forEach((item) => { | |||
data[item.value] = { text: item.remark }; | |||
}); | |||
} | |||
setDicDataAny(data); | |||
console.log(arr); | |||
setDicData(arr); | |||
}); | |||
} | |||
intDicData(); | |||
}, []); | |||
/** | |||
* 添加节点 | |||
* | |||
* @param fields | |||
*/ | |||
function handleAdd(fields) { | |||
try { | |||
api.addGoodsBom(JSON.stringify(fields)).then((r) => { | |||
if (r.data) { | |||
message.success('添加成功'); | |||
//刷新数据 | |||
actionRef.current.reload(); | |||
} else { | |||
message.error('添加失败请重试!'); | |||
} | |||
}); | |||
return true; | |||
} catch (error) { | |||
message.error('添加失败请重试!'); | |||
return false; | |||
} | |||
} | |||
/** | |||
* 更新节点 | |||
* | |||
* @param fields | |||
*/ | |||
function handleUpdate(fields) { | |||
console.log(fields); | |||
try { | |||
api | |||
.updateGoodsBom({ | |||
id: fields.id, | |||
goodsID: fields.goods_Id, | |||
stockGoodsCode: fields.stockGoodsCode, | |||
remark: fields.remark, | |||
status: fields.status, | |||
batchingType: fields.batchingType, | |||
isReplace: fields.isReplace, | |||
isMain: fields.isMain, | |||
bomQty: fields.bomQty | |||
}) | |||
.then((r) => { | |||
if (r.data) { | |||
message.success('配置成功'); | |||
} else { | |||
message.error('配置失败请重试!'); | |||
} | |||
//刷新数据 | |||
actionRef.current.reload(); | |||
}); | |||
return true; | |||
} catch (error) { | |||
message.error('配置失败请重试!'); | |||
return false; | |||
} | |||
} | |||
/** | |||
* 删除节点 | |||
* | |||
* | |||
*/ | |||
function handleRemove() { | |||
if (!selectedRowsState) return true; | |||
try { | |||
api.removeGoodsBom(selectedRowsState.map((row) => row.id)).then((r) => { | |||
if (r.data) { | |||
message.success('删除成功,即将刷新'); | |||
} else { | |||
message.error('删除失败,请重试'); | |||
} | |||
//刷新数据 | |||
actionRef.current.reload(); | |||
}); | |||
return true; | |||
} catch (error) { | |||
message.error('删除失败,请重试'); | |||
return false; | |||
} | |||
} | |||
/** 国际化配置 */ | |||
const columns = [ | |||
{ | |||
title: '主键', | |||
dataIndex: 'id', | |||
hideInTable: true, | |||
hideInSearch: true, | |||
tip: '规则名称是唯一的 key', | |||
render: (dom, entity) => { | |||
return ( | |||
<a | |||
onClick={() => { | |||
setCurrentRow(entity); | |||
setShowDetail(true); | |||
}} | |||
> | |||
{dom} | |||
</a> | |||
); | |||
}, | |||
}, | |||
{ | |||
title: '原料名称', | |||
dataIndex: 'stockGoodsName', | |||
hideInForm: true, | |||
hideInSearch: true, | |||
}, | |||
{ | |||
title: '原料名称', | |||
dataIndex: 'stockGoodsCode', | |||
hideInForm: true, | |||
hideInTable: true, | |||
valueType: 'select', | |||
valueEnum: stockGoods, | |||
}, | |||
{ | |||
title: '配料类型', | |||
dataIndex: 'batchingType', | |||
hideInForm: true, | |||
valueEnum: dicDataAny, | |||
}, | |||
{ | |||
title: '状态', | |||
dataIndex: 'status', | |||
hideInForm: true, | |||
valueEnum: { | |||
0: { | |||
text: '正常', | |||
status: 'Processing', | |||
}, | |||
1: { | |||
text: '停用', | |||
status: 'Error', | |||
}, | |||
2: { | |||
text: '删除', | |||
status: 'Error', | |||
}, | |||
}, | |||
}, | |||
{ | |||
title: '主要原料', | |||
dataIndex: 'isMain', | |||
hideInForm: true, | |||
valueEnum: { | |||
false: { | |||
text: '辅料', | |||
status: 'Processing', | |||
}, | |||
true: { | |||
text: '主料', | |||
status: 'Success', | |||
}, | |||
}, | |||
}, | |||
{ | |||
title: '配方用量', | |||
dataIndex: 'bomQty', | |||
hideInSearch: true, | |||
width: 120, | |||
}, | |||
{ | |||
title: '是否可以替换', | |||
dataIndex: 'isReplace', | |||
hideInForm: true, | |||
valueEnum: { | |||
false: { | |||
text: '不可替换', | |||
status: 'Processing', | |||
}, | |||
true: { | |||
text: '可替换', | |||
status: 'Success', | |||
}, | |||
}, | |||
}, | |||
{ | |||
title: '创建时间', | |||
dataIndex: 'createAt', | |||
valueType: 'date', | |||
}, | |||
{ | |||
title: '操作', | |||
dataIndex: 'option', | |||
valueType: 'option', | |||
render: (_, record) => [ | |||
record.status === '0' && ( | |||
<a | |||
key="link" | |||
onClick={() => { | |||
record.status = '1'; | |||
handleUpdate(record); | |||
}} | |||
> | |||
停用 | |||
</a> | |||
), | |||
(record.status === '1' || record.status === '2') && ( | |||
<a | |||
key="warn" | |||
onClick={() => { | |||
record.status = '0'; | |||
handleUpdate(record); | |||
}} | |||
> | |||
启用 | |||
</a> | |||
), | |||
record.status === '0' && record.isReplace && ( | |||
<a | |||
key="link" | |||
onClick={() => { | |||
record.isReplace = false; | |||
handleUpdate(record); | |||
}} | |||
> | |||
不启用 | |||
</a> | |||
), | |||
record.status === '0' && !record.isReplace && ( | |||
<a | |||
key="warn" | |||
onClick={() => { | |||
record.isReplace = true; | |||
handleUpdate(record); | |||
}} | |||
> | |||
启用替换 | |||
</a> | |||
), | |||
record.status === '0' && record.isReplace && ( | |||
<a | |||
key="link" | |||
onClick={() => { | |||
BomReplacVisible(true); | |||
setCurrentRow(record); | |||
}} | |||
> | |||
替换物料 | |||
</a> | |||
), | |||
<a | |||
key="link" | |||
onClick={() => { | |||
handleModalVisible(true); | |||
setCurrentRow(record); | |||
}} | |||
> | |||
修改 | |||
</a>, | |||
], | |||
}, | |||
]; | |||
return ( | |||
<Modal | |||
width={1200} | |||
bodyStyle={{ padding: '32px 40px 48px' }} | |||
destroyOnClose | |||
title="商品配方" | |||
visible={props.setGoodsBomModalVisible} | |||
footer={false} | |||
onCancel={() => props.onCancel()} | |||
maskClosable={false} | |||
> | |||
<ProTable | |||
headerTitle="商品配方信息查询" | |||
actionRef={actionRef} | |||
rowKey="id" | |||
pagination={{ defaultPageSize: 20 }} | |||
search={false} | |||
toolBarRender={() => [ | |||
<Button type="primary" key="create" onClick={() => handleModalVisible(true)}> | |||
<PlusOutlined /> 新增商品配方 | |||
</Button>, | |||
]} | |||
//数据绑定 | |||
request={async (params) => { | |||
var goodsBomsData = []; | |||
var total = 0; | |||
//商品编号 | |||
if (props.values.id != undefined) { | |||
params['goodsId'] = props.values.id; | |||
} | |||
await api.goodsBoms(params).then((r) => { | |||
goodsBomsData = r.data.data; | |||
total = r.data.total; | |||
}); | |||
return { | |||
data: goodsBomsData, | |||
success: true, | |||
total: total, | |||
}; | |||
}} | |||
columns={columns} | |||
/> | |||
{/*商品配方(新增,修改) */} | |||
<CreateForm | |||
dicData={dicData} | |||
stockGoodsData={stockGoods} | |||
onFinish={async (value) => { | |||
var success = false; | |||
value['goodsId'] = props.values.id; | |||
value['goods_Id'] = props.values.id; | |||
if (value.id) { | |||
success = await handleUpdate(value); | |||
} else { | |||
success = await handleAdd(value); | |||
} | |||
if (success) { | |||
handleModalVisible(false); | |||
setCurrentRow(undefined); | |||
if (actionRef.current) { | |||
actionRef.current.reload(); | |||
} | |||
} | |||
}} | |||
onCancel={() => { | |||
handleModalVisible(false); | |||
setCurrentRow(undefined); | |||
}} | |||
createModalVisible={createModalVisible} | |||
values={currentRow || {}} | |||
/> | |||
{/**物料替换 */} | |||
<GoodsBomReplace | |||
stockGoodsData={stockGoods} | |||
onFinish={async (value) => { | |||
var success = false; | |||
value['goodsId'] = props.values.id; | |||
if (value.id) { | |||
success = await handleUpdate(value); | |||
} else { | |||
success = await handleAdd(value); | |||
} | |||
if (success) { | |||
BomReplacVisible(false); | |||
setCurrentRow(undefined); | |||
if (actionRef.current) { | |||
actionRef.current.reload(); | |||
} | |||
} | |||
}} | |||
onCancel={() => { | |||
BomReplacVisible(false); | |||
setCurrentRow(undefined); | |||
}} | |||
createModalVisible={BomReplaclVisible} | |||
values={currentRow || {}} | |||
/> | |||
</Modal> | |||
); | |||
}; | |||
export default GoodsBomsManage; |
@@ -1,65 +0,0 @@ | |||
// @ts-ignore | |||
/* eslint-disable */ | |||
import { request } from 'umi'; | |||
export default { | |||
/** 获取商品物料 sdsa GET /kitchen/api/rule */ | |||
goodsBoms(data) { | |||
return request(`/kitchen/api/goods-bom/goods-boms`, { | |||
method: 'Post', | |||
data: data, | |||
// params: { ...params }, | |||
// ...(options || {}), | |||
}); | |||
}, | |||
GetDicList(TypeCode) { | |||
return request(`/kitchen/api/dict-data/dic-list/${TypeCode}`, { | |||
method: 'Get', | |||
}); | |||
}, | |||
/** 更新商品物料 PUT /kitchen/api/rule */ | |||
updateGoodsBom(data) { | |||
return request('/kitchen/api/goods-bom', { | |||
method: 'PUT', | |||
data: data, | |||
// ...(options || {}), | |||
}); | |||
}, | |||
/** 新建商品物料清单 POST /kitchen/api/rule */ | |||
addGoodsBom(data) { | |||
// http://localhost:7002 | |||
return request('/kitchen/api/goods-bom', { | |||
method: 'POST', | |||
// type:'json', | |||
data: data, | |||
// ...(options || {}), | |||
}); | |||
}, | |||
/** 删除商品物料 DELETE /kitchen/api/rule */ | |||
removeGoodsBom(data) { | |||
return request(`/kitchen/api/goods-bom`, { | |||
method: 'DELETE', | |||
data: data, | |||
// ...(options || {}), | |||
}); | |||
}, | |||
/** 获取商品商品 sdsa GET /kitchen/api/rule */ | |||
goodList(data) { | |||
return request(`/kitchen/api/goods/goodss`, { | |||
method: 'Post', | |||
data: data, | |||
// params: { ...params }, | |||
// ...(options || {}), | |||
}); | |||
}, | |||
/** 获取原料信息 POST /kitchen/api/rule */ | |||
postStockGoods() { | |||
return request(`/kitchen/api/frachisee-stock-adjust/product-list`, { | |||
method: 'Get', | |||
// ...(options || {}), | |||
}); | |||
}, | |||
}; |
@@ -0,0 +1,390 @@ | |||
import React, { useRef, useState, useEffect } from "react"; | |||
import { PageContainer } from '@ant-design/pro-layout'; | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import { Button, Form, Input, Select, Drawer, message, Col, Row } from 'antd'; | |||
import styles from "./index.less"; | |||
import '@wangeditor/editor/dist/css/style.css' | |||
import { Editor, Toolbar } from '@wangeditor/editor-for-react' | |||
import axios from 'axios'; | |||
import cardAPI from "../service"; | |||
/** | |||
* 档口管理 | |||
* @returns | |||
*/ | |||
const Gate = () => { | |||
const actionRef = useRef(); | |||
const [modalForm] = Form.useForm(); | |||
const [isModalOpen, setIsModalOpen] = useState(false); | |||
const [currentOption, setCurrentOption] = useState({ id: '' }); | |||
const [storeList, setStoreList] = useState([]); | |||
const [selectedStore, setSelectedStore] = useState(''); | |||
const [current, setCurrent] = useState(1); | |||
const [pageSize, setPageSize] = useState(10); | |||
// editor 实例 | |||
const [editor, setEditor] = useState(null); | |||
// 编辑器内容 | |||
const [html, setHtml] = useState(''); | |||
// 工具栏配置 | |||
const toolbarConfig = {}; | |||
// 编辑器配置 | |||
const editorConfig = { | |||
placeholder: '请输入大屏横幅...', | |||
MENU_CONF: { | |||
uploadImage: { | |||
async customUpload(file, insertFn) { | |||
// file 即选中的文件 | |||
// 自己实现上传,并得到图片 url alt href | |||
//覆盖action 上传之前获取上传地址 | |||
let index = file.name.lastIndexOf("."); | |||
let ext = file.name.substr(index + 1); | |||
let fileData = null; | |||
cardAPI.GetCosRequestURL({ directory: "kitchen", fileExtension: ext, method: "PUT" }).then((r) => { | |||
const action = r.allUrl; | |||
const reader = new FileReader(); | |||
reader.readAsArrayBuffer(file); | |||
reader.onload = (e) => { | |||
fileData = e.target.result; | |||
axios.put(action, fileData).then(response => { | |||
if (response.status == 200 || response.statusText == 'OK') { | |||
// 最后插入图片 | |||
insertFn(r.seeUrl, r.seeUrl, r.seeUrl); | |||
message.success('上传成功!'); | |||
} | |||
}); | |||
}; | |||
}); | |||
} | |||
} | |||
} | |||
} | |||
// 及时销毁 editor ,重要! | |||
useEffect(() => { | |||
if (editor == null) return | |||
editor.destroy() | |||
setEditor(null) | |||
}, [isModalOpen]) | |||
/** | |||
* 点击编辑按钮 | |||
* @param {*} record | |||
*/ | |||
const onEditTableRow = (record) => { | |||
setCurrentOption(record); | |||
setIsModalOpen(true); | |||
setHtml(record.remaek); | |||
modalForm.setFieldsValue(record); | |||
} | |||
/** | |||
* 点击新建 | |||
*/ | |||
const onCreateTableRow = () => { | |||
setIsModalOpen(true); | |||
modalForm.resetFields(); | |||
} | |||
/** | |||
* 提交表单 | |||
*/ | |||
const onFinish = async (values) => { | |||
if (values.id) { | |||
values.remaek = html; | |||
const response = await cardAPI.UpdateGateInfo(values); | |||
if (response.statusCode === 200) { | |||
message.success('更新档口成功!'); | |||
setIsModalOpen(false); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error(response.errors || '更新档口失败'); | |||
} | |||
} else { | |||
values.remaek = html; | |||
const response = await cardAPI.AddGate(values); | |||
if (response.statusCode === 200) { | |||
message.success('新增档口成功!'); | |||
setIsModalOpen(false); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error(response.errors || '新增档口失败'); | |||
} | |||
} | |||
} | |||
const columns = [ | |||
{ | |||
title: '档口名称', | |||
dataIndex: 'name', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '归属门店', | |||
dataIndex: 'storeId', | |||
render: (_, record) => { | |||
const find = storeList.find(item => item.id === record.storeId); | |||
if (find) { | |||
return <div>{find.store_Name}</div> | |||
} | |||
} | |||
}, | |||
{ | |||
title: '属性', | |||
dataIndex: 'mode', | |||
valueType: 'select', | |||
valueEnum: { | |||
1: { | |||
text: '固定', | |||
status: 'Success', | |||
}, | |||
2: { | |||
text: '自由设定', | |||
status: 'Success', | |||
} | |||
}, | |||
}, | |||
{ | |||
title: '金额', | |||
dataIndex: 'price', | |||
}, | |||
{ | |||
title: '状态', | |||
dataIndex: 'status', | |||
valueType: 'select', | |||
valueEnum: { | |||
0: { | |||
text: '正常', | |||
status: 'Success', | |||
}, | |||
1: { | |||
text: '禁用', | |||
status: 'Error', | |||
}, | |||
2: { | |||
text: '删除', | |||
status: 'Error', | |||
} | |||
}, | |||
}, | |||
{ | |||
title: '操作', | |||
valueType: 'option', | |||
key: 'option', | |||
render: (text, record, _, action) => [ | |||
<a onClick={() => onEditTableRow(record)}>编辑</a> | |||
], | |||
}, | |||
]; | |||
/** | |||
* 获取店铺列表 | |||
*/ | |||
const onFetchStoreList = async () => { | |||
const response = await cardAPI.GetAllStore(); | |||
if (response.isSuccess) { | |||
setStoreList(response.data); | |||
setSelectedStore(response.data[0].id); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error(response.msg || '获取店铺列表失败'); | |||
} | |||
} | |||
useEffect(() => { | |||
onFetchStoreList(); | |||
}, []); | |||
return ( | |||
<PageContainer> | |||
<div className={styles.member_card_container}> | |||
<ProTable | |||
columns={columns} | |||
actionRef={actionRef} | |||
request={ | |||
async () => { | |||
if (selectedStore) { | |||
const response = await cardAPI.GetGateListByStorePage(selectedStore, current, pageSize); | |||
if (response.statusCode === 200) { | |||
return { | |||
data: response.data.data, | |||
success: true, | |||
total: response.data.total | |||
} | |||
} | |||
} | |||
} | |||
} | |||
cardBordered | |||
editable={{ | |||
type: 'multiple', | |||
}} | |||
rowKey="id" | |||
search={false} | |||
options={{ | |||
setting: { | |||
listsHeight: 400, | |||
}, | |||
}} | |||
pagination={{ | |||
pageSize: pageSize, | |||
onChange: (page) => setCurrent(page), | |||
}} | |||
dateFormatter="string" | |||
headerTitle="储值卡账户管理" | |||
toolBarRender={() => [ | |||
<div className={styles.table_search_item}> | |||
<div> | |||
当前门店: | |||
</div> | |||
<Select style={{ width: 300 }} value={selectedStore} onChange={(value) => { | |||
setSelectedStore(value); | |||
actionRef.current.reload(); | |||
}}> | |||
{ | |||
storeList.map(item => { | |||
return <Option value={item.id} key={item.id}>{item.store_Name}</Option> | |||
}) | |||
} | |||
</Select> | |||
</div>, | |||
<Button key="button" icon={<PlusOutlined />} type="primary" onClick={onCreateTableRow}> | |||
新建 | |||
</Button> | |||
]} | |||
/> | |||
<Drawer width={1500} title={currentOption.id ? '编辑档口' : '添加档口'} visible={isModalOpen} onClose={() => setIsModalOpen(false)}> | |||
<Form | |||
name="basic" | |||
onFinish={onFinish} | |||
form={modalForm} | |||
labelCol={{ span: 4 }} | |||
> | |||
<Form.Item | |||
label="id" | |||
name="id" | |||
hidden={true} | |||
> | |||
<Input size="large" /> | |||
</Form.Item> | |||
<Row> | |||
<Col xs={12} sm={12} md={12} lg={12} xl={12}> | |||
<Form.Item | |||
label="档口名称" | |||
name="name" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入档口名称!', | |||
}, | |||
]} | |||
> | |||
<Input size="large" /> | |||
</Form.Item> | |||
</Col> | |||
<Col xs={12} sm={12} md={12} lg={12} xl={12}> | |||
<Form.Item | |||
label="归属门店" | |||
name="storeId" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入归属门店!', | |||
}, | |||
]} | |||
> | |||
<Select size="large"> | |||
{ | |||
storeList.map(store => { | |||
return ( | |||
<Select.Option key={store.id} value={store.id}>{store.store_Name}</Select.Option> | |||
) | |||
}) | |||
} | |||
</Select> | |||
</Form.Item> | |||
</Col> | |||
<Col xs={12} sm={12} md={12} lg={12} xl={12}> | |||
<Form.Item | |||
label="属性" | |||
name="mode" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入选择属性!', | |||
}, | |||
]} | |||
> | |||
<Select size="large"> | |||
<Select.Option value={1}>固定金额</Select.Option> | |||
<Select.Option value={2}>自由设定</Select.Option> | |||
</Select> | |||
</Form.Item> | |||
</Col> | |||
<Col xs={12} sm={12} md={12} lg={12} xl={12}> | |||
<Form.Item | |||
label="金额" | |||
name="price" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入金额!', | |||
}, | |||
]} | |||
> | |||
<Input size="large" /> | |||
</Form.Item> | |||
</Col> | |||
<Col xs={12} sm={12} md={12} lg={12} xl={12}> | |||
<Form.Item | |||
label="状态" | |||
name="status" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入类型!', | |||
} | |||
]} | |||
> | |||
<Select size="large"> | |||
<Select.Option value={0}>正常</Select.Option> | |||
<Select.Option value={1}>禁用</Select.Option> | |||
<Select.Option value={2}>删除</Select.Option> | |||
</Select> | |||
</Form.Item> | |||
</Col> | |||
</Row> | |||
<div style={{ border: '1px solid #ccc', zIndex: 100 }}> | |||
<Toolbar | |||
editor={editor} | |||
defaultConfig={toolbarConfig} | |||
mode="default" | |||
style={{ borderBottom: '1px solid #ccc' }} | |||
/> | |||
<Editor | |||
defaultConfig={editorConfig} | |||
value={html} | |||
onCreated={setEditor} | |||
onChange={editor => setHtml(editor.getHtml())} | |||
mode="default" | |||
style={{ height: '500px', overflowY: 'hidden' }} | |||
/> | |||
</div> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit" style={{ marginTop: '10px' }}> | |||
确定 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Drawer> | |||
</div> | |||
</PageContainer> | |||
) | |||
} | |||
export default Gate; |
@@ -0,0 +1,4 @@ | |||
.table_search_item { | |||
display: flex; | |||
align-items: center; | |||
} |
@@ -0,0 +1,324 @@ | |||
import React, { useRef, useState, useEffect } from "react"; | |||
import styles from "./index.less"; | |||
import { PageContainer } from '@ant-design/pro-layout'; | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import { Button, Form, Input, Modal, Select, Popconfirm, message } from 'antd'; | |||
import cardAPI from "../service"; | |||
/** | |||
* 刷卡机管理 | |||
* @returns | |||
*/ | |||
const Machine = () => { | |||
const actionRef = useRef(); | |||
const [modalForm] = Form.useForm(); | |||
const [isModalOpen, setIsModalOpen] = useState(false); | |||
const [currentOption, setCurrentOption] = useState({ id: '' }); | |||
const [storeList, setStoreList] = useState([]); | |||
const [selectedStore, setSelectedStore] = useState(''); | |||
const [gateList, setGateList] = useState([]); | |||
const [selectedGate, setSelectedGate] = useState(''); | |||
const [current, setCurrent] = useState(1); | |||
const [pageSize, setPageSize] = useState(10); | |||
/** | |||
* 点击编辑按钮 | |||
* @param {*} record | |||
*/ | |||
const onEditTableRow = (record) => { | |||
setCurrentOption(record); | |||
setIsModalOpen(true); | |||
modalForm.setFieldsValue(record); | |||
} | |||
/** | |||
* 点击新建 | |||
*/ | |||
const onCreateTableRow = () => { | |||
setIsModalOpen(true); | |||
modalForm.resetFields(); | |||
} | |||
/** | |||
* 删除数据 | |||
* @param {*} record | |||
*/ | |||
const onDeleteTableRow = (record) => { | |||
console.log('删除', record) | |||
} | |||
/** | |||
* 提交表单 | |||
*/ | |||
const onFinish = async (values) => { | |||
if (values.id) { | |||
const response = await cardAPI.UpdatePayCardInfo(values); | |||
if (response.statusCode === 200) { | |||
setIsModalOpen(false); | |||
message.success('更新成功!'); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error(response.error || '更新设备失败'); | |||
} | |||
} else { | |||
const response = await cardAPI.PayCardAdd(values); | |||
if (response.statusCode === 200) { | |||
setIsModalOpen(false); | |||
message.success('新增成功!'); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error(response.error || '新增设备失败'); | |||
} | |||
} | |||
} | |||
const columns = [ | |||
{ | |||
title: 'ID', | |||
dataIndex: 'id', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '设备名称', | |||
dataIndex: 'name', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '归属档口', | |||
dataIndex: 'gateId', | |||
}, | |||
{ | |||
title: '状态', | |||
dataIndex: 'status', | |||
valueType: 'select', | |||
valueEnum: { | |||
0: { | |||
text: '正常', | |||
status: 'Success', | |||
}, | |||
1: { | |||
text: '禁用', | |||
status: 'Error', | |||
}, | |||
2: { | |||
text: '删除', | |||
status: 'Error', | |||
} | |||
}, | |||
}, | |||
{ | |||
title: '间隔时间', | |||
dataIndex: 'sleepTime', | |||
}, | |||
{ | |||
title: '操作', | |||
valueType: 'option', | |||
key: 'option', | |||
render: (text, record, _, action) => [ | |||
<a onClick={() => onEditTableRow(record)}>编辑</a> | |||
], | |||
}, | |||
]; | |||
/** | |||
* 获取店铺列表 | |||
*/ | |||
const onFetchStoreList = async () => { | |||
const response = await cardAPI.GetAllStore(); | |||
if (response.isSuccess) { | |||
setStoreList(response.data); | |||
setSelectedStore(response.data[0].id); | |||
onFetchGateList(response.data[0].id); | |||
} else { | |||
message.error(response.msg || '获取店铺列表失败'); | |||
} | |||
} | |||
/** | |||
* 根据门店ID获取档口列表 | |||
*/ | |||
const onFetchGateList = async (storeId) => { | |||
const response = await cardAPI.GetGateListByStoreList(storeId); | |||
if (response.statusCode === 200) { | |||
setGateList(response.data); | |||
setSelectedGate(response.data[0].id); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error(response.error || '获取档口列表失败'); | |||
} | |||
} | |||
useEffect(() => { | |||
onFetchStoreList(); | |||
}, []); | |||
return ( | |||
<PageContainer> | |||
<div className={styles.member_card_container}> | |||
<ProTable | |||
columns={columns} | |||
actionRef={actionRef} | |||
request={ | |||
async () => { | |||
console.log('selectedGate', selectedGate); | |||
if (selectedGate) { | |||
const response = await cardAPI.PayCardByGateId(selectedGate, current, pageSize); | |||
if (response.statusCode === 200) { | |||
return { | |||
data: response.data.data, | |||
success: true, | |||
total: response.data.total, | |||
} | |||
} | |||
} | |||
} | |||
} | |||
cardBordered | |||
editable={{ | |||
type: 'multiple', | |||
}} | |||
rowKey="id" | |||
search={false} | |||
options={{ | |||
setting: { | |||
listsHeight: 400, | |||
}, | |||
}} | |||
pagination={{ | |||
pageSize: pageSize, | |||
onChange: (page) => setCurrent(page) | |||
}} | |||
dateFormatter="string" | |||
headerTitle="储值卡账户管理" | |||
toolBarRender={() => [ | |||
<div className={styles.table_search_item}> | |||
<div> | |||
当前门店: | |||
</div> | |||
<Select style={{ width: 300 }} value={selectedStore} onChange={(value) => { | |||
setSelectedStore(value); | |||
onFetchGateList(value); | |||
}}> | |||
{ | |||
storeList.map(item => { | |||
return <Option value={item.id} key={item.id}>{item.store_Name}</Option> | |||
}) | |||
} | |||
</Select> | |||
</div>, | |||
<div className={styles.table_search_item}> | |||
<div> | |||
当前档口: | |||
</div> | |||
<Select style={{ width: 300 }} value={selectedGate} onChange={(value) => { | |||
setSelectedGate(value); | |||
actionRef.current.reload(); | |||
}}> | |||
{ | |||
gateList.map(item => { | |||
return <Option value={item.id} key={item.id}>{item.name}</Option> | |||
}) | |||
} | |||
</Select> | |||
</div>, | |||
<Button key="button" icon={<PlusOutlined />} type="primary" onClick={onCreateTableRow}> | |||
新建 | |||
</Button> | |||
]} | |||
/> | |||
<Modal width={600} title={currentOption.id ? '编辑刷卡机' : '添加刷卡机'} visible={isModalOpen} footer={false} onCancel={() => setIsModalOpen(false)}> | |||
<Form | |||
name="basic" | |||
onFinish={onFinish} | |||
form={modalForm} | |||
> | |||
<Form.Item | |||
label="id" | |||
name="id" | |||
hidden={true} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="设备名称" | |||
name="name" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入档口名称!', | |||
}, | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="归属档口" | |||
name="gateId" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入归属门店!', | |||
}, | |||
]} | |||
> | |||
<Select> | |||
{ | |||
gateList.map(item => { | |||
return ( | |||
<Select.Option key={item.id} value={item.id}> | |||
{item.name} | |||
</Select.Option> | |||
) | |||
}) | |||
} | |||
</Select> | |||
</Form.Item> | |||
<Form.Item | |||
label="状态" | |||
name="status" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入选择状态!', | |||
}, | |||
]} | |||
> | |||
<Select> | |||
<Select.Option value={0}>正常</Select.Option> | |||
<Select.Option value={1}>禁用</Select.Option> | |||
<Select.Option value={2}>删除</Select.Option> | |||
</Select> | |||
</Form.Item> | |||
<Form.Item | |||
label="保护间隔时间" | |||
name="sleepTime" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入保护间隔时间!', | |||
}, | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
确定 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Modal> | |||
</div> | |||
</PageContainer> | |||
) | |||
} | |||
export default Machine; |
@@ -0,0 +1,4 @@ | |||
.table_search_item { | |||
display: flex; | |||
align-items: center; | |||
} |
@@ -0,0 +1,249 @@ | |||
import React, { useRef, useState } from "react"; | |||
import styles from "./index.less"; | |||
import { PageContainer } from '@ant-design/pro-layout'; | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import { Button, Form, Input, DatePicker, Modal, Select, Popconfirm } from 'antd'; | |||
import cardAPI from "../service"; | |||
/** | |||
* 储值卡账户管理 | |||
* @returns | |||
*/ | |||
const memberAccount = () => { | |||
const actionRef = useRef(); | |||
const [modalForm] = Form.useForm(); | |||
const [isModalOpen, setIsModalOpen] = useState(false); | |||
const [currentOption, setCurrentOption] = useState({ id: '' }); | |||
const [current, setCurrent] = useState(1); | |||
const [pageSize, setPageSize] = useState(10); | |||
const [total, setTotal] = useState(0); | |||
/** | |||
* 点击编辑按钮 | |||
* @param {*} record | |||
*/ | |||
const onEditTableRow = (record) => { | |||
setCurrentOption(record); | |||
setIsModalOpen(true); | |||
modalForm.setFieldsValue(record); | |||
} | |||
/** | |||
* 点击新建 | |||
*/ | |||
const onCreateTableRow = () => { | |||
setIsModalOpen(true); | |||
} | |||
/** | |||
* 删除数据 | |||
* @param {*} record | |||
*/ | |||
const onDeleteTableRow = (record) => { | |||
console.log('删除', record) | |||
} | |||
/** | |||
* 提交表单 | |||
*/ | |||
const onFinish = (values) => { | |||
console.log('value', values); | |||
if (values.id) { | |||
console.log('更新') | |||
} else { | |||
console.log('创建') | |||
} | |||
} | |||
const columns = [ | |||
{ | |||
title: 'ID', | |||
dataIndex: 'id', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '姓名', | |||
dataIndex: 'name', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '会员ID', | |||
dataIndex: 'memberInfoId', | |||
ellipsis: true, | |||
}, | |||
// { | |||
// disable: true, | |||
// title: '状态', | |||
// dataIndex: 'status', | |||
// valueType: 'select', | |||
// valueEnum: { | |||
// 0: { | |||
// text: '禁用', | |||
// status: 'Error', | |||
// }, | |||
// 1: { | |||
// text: '正常', | |||
// status: 'Success', | |||
// }, | |||
// 2: { | |||
// text: '挂失', | |||
// status: 'Error', | |||
// }, | |||
// 3: { | |||
// text: '作废', | |||
// status: 'Error', | |||
// }, | |||
// }, | |||
// }, | |||
{ | |||
title: '余额', | |||
dataIndex: 'money', | |||
}, | |||
{ | |||
title: '操作', | |||
valueType: 'option', | |||
key: 'option', | |||
render: (text, record, _, action) => [ | |||
<a onClick={() => onEditTableRow(record)}>编辑</a>, | |||
<Popconfirm | |||
title="你确定要删除此条数据吗?" | |||
onConfirm={() => onDeleteTableRow(record)} | |||
okText="确定" | |||
cancelText="取消" | |||
> | |||
<a href="#">删除</a> | |||
</Popconfirm> | |||
], | |||
}, | |||
]; | |||
return ( | |||
<PageContainer> | |||
<div className={styles.member_card_container}> | |||
<ProTable | |||
columns={columns} | |||
actionRef={actionRef} | |||
request={ | |||
async () => { | |||
const response = await cardAPI.GetMemberAccountPageList({ | |||
current, | |||
pageSize | |||
}); | |||
setTotal(response.data.data); | |||
return { | |||
data: response.data.data, | |||
success: true, | |||
total: response.data.total, | |||
} | |||
} | |||
} | |||
cardBordered | |||
editable={{ | |||
type: 'multiple', | |||
}} | |||
rowKey="id" | |||
search={false} | |||
options={{ | |||
setting: { | |||
listsHeight: 400, | |||
}, | |||
}} | |||
pagination={{ | |||
pageSize: pageSize, | |||
onChange: (page) => setCurrent(page) | |||
}} | |||
dateFormatter="string" | |||
headerTitle="储值卡账户管理" | |||
toolBarRender={() => [ | |||
<Button key="button" icon={<PlusOutlined />} type="primary" onClick={onCreateTableRow}> | |||
新建 | |||
</Button> | |||
]} | |||
/> | |||
<Modal width={600} title={currentOption.id ? '编辑会员' : '添加会员'} visible={isModalOpen} footer={false} onCancel={() => setIsModalOpen(false)}> | |||
<Form | |||
name="basic" | |||
onFinish={onFinish} | |||
form={modalForm} | |||
> | |||
<Form.Item | |||
label="id" | |||
name="id" | |||
hidden={true} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="姓名" | |||
name="name" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入姓名!', | |||
}, | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="会员ID" | |||
name="cardId" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入会员ID!', | |||
}, | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="状态" | |||
name="status" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入选择状态!', | |||
}, | |||
]} | |||
> | |||
<Select> | |||
<Select.Option value={0}>禁用</Select.Option> | |||
<Select.Option value={1}>正常</Select.Option> | |||
<Select.Option value={2}>挂失</Select.Option> | |||
<Select.Option value={3}>作废</Select.Option> | |||
</Select> | |||
</Form.Item> | |||
<Form.Item | |||
label="余额" | |||
name="money" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入余额!', | |||
}, | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
确定 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Modal> | |||
</div> | |||
</PageContainer> | |||
) | |||
} | |||
export default memberAccount; |
@@ -0,0 +1,318 @@ | |||
import React, { useRef, useState } from "react"; | |||
import styles from "./index.less"; | |||
import { PageContainer } from '@ant-design/pro-layout'; | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import { Button, Form, Input, DatePicker, Modal, Select, Popconfirm } from 'antd'; | |||
/** | |||
* 储值卡会员管理页面 | |||
* @returns | |||
*/ | |||
const memberCard = () => { | |||
const actionRef = useRef(); | |||
const modalForm = Form.useForm(); | |||
const [isModalOpen, setIsModalOpen] = useState(false); | |||
const [currentOption, setCurrentOption] = useState({ id: '' }); | |||
/** | |||
* 点击编辑按钮 | |||
* @param {*} record | |||
*/ | |||
const onEditTableRow = (record) => { | |||
setCurrentOption(record); | |||
setIsModalOpen(true); | |||
modalForm.setFieldsValue(record); | |||
} | |||
/** | |||
* 点击新建 | |||
*/ | |||
const onCreateTableRow = () => { | |||
setIsModalOpen(true); | |||
} | |||
/** | |||
* 删除数据 | |||
* @param {*} record | |||
*/ | |||
const onDeleteTableRow = (record) => { | |||
console.log('删除', record) | |||
} | |||
/** | |||
* 提交表单 | |||
*/ | |||
const onFinish = (values) => { | |||
console.log('value', values); | |||
if (values.id) { | |||
console.log('更新') | |||
} else { | |||
console.log('创建') | |||
} | |||
} | |||
const columns = [ | |||
{ | |||
title: 'ID', | |||
dataIndex: 'id', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '姓名', | |||
dataIndex: 'name', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '会员ID', | |||
dataIndex: 'cardId', | |||
ellipsis: true, | |||
}, | |||
{ | |||
disable: true, | |||
title: '状态', | |||
dataIndex: 'status', | |||
valueType: 'select', | |||
valueEnum: { | |||
false: { | |||
text: '停用', | |||
status: 'Error', | |||
}, | |||
true: { | |||
text: '启用', | |||
status: 'Success', | |||
}, | |||
}, | |||
}, | |||
{ | |||
title: '电话', | |||
dataIndex: 'phone', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '性别', | |||
dataIndex: 'sex', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '身份证', | |||
dataIndex: 'identityCard', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '生日', | |||
dataIndex: 'birthday', | |||
valueType: 'date', | |||
}, | |||
{ | |||
title: '备注', | |||
dataIndex: 'remark', | |||
ellipsis: true | |||
}, | |||
{ | |||
title: '操作', | |||
valueType: 'option', | |||
key: 'option', | |||
render: (text, record, _, action) => [ | |||
<a onClick={() => onEditTableRow(record)}>编辑</a>, | |||
<Popconfirm | |||
title="你确定要删除此条数据吗?" | |||
onConfirm={() => onDeleteTableRow(record)} | |||
okText="确定" | |||
cancelText="取消" | |||
> | |||
<a href="#">删除</a> | |||
</Popconfirm> | |||
], | |||
}, | |||
]; | |||
return ( | |||
<PageContainer> | |||
<div className={styles.member_card_container}> | |||
<ProTable | |||
columns={columns} | |||
actionRef={actionRef} | |||
request={ | |||
() => { | |||
const data = [ | |||
{ | |||
id: '1008611', | |||
name: '彭于晏', | |||
cardId: '1008611-100111', | |||
status: true, | |||
phone: '18208260000', | |||
sex: 1, | |||
identityCard: '511522111222226655', | |||
birthday: '2022-9-8', | |||
remark: '备注' | |||
}, | |||
{ | |||
id: '10086112', | |||
name: '彭于晏2', | |||
cardId: '21008611-100111', | |||
status: false, | |||
phone: '18208260000', | |||
sex: 0, | |||
identityCard: '511522111222226655', | |||
birthday: '2022-9-8', | |||
remark: '备注' | |||
}, | |||
] | |||
return { | |||
data: data, | |||
success: true, | |||
total: 2, | |||
} | |||
} | |||
} | |||
cardBordered | |||
editable={{ | |||
type: 'multiple', | |||
}} | |||
rowKey="id" | |||
search={{ | |||
labelWidth: 'auto', | |||
}} | |||
options={{ | |||
setting: { | |||
listsHeight: 400, | |||
}, | |||
}} | |||
pagination={{ | |||
pageSize: 5, | |||
onChange: (page) => console.log(page), | |||
}} | |||
dateFormatter="string" | |||
headerTitle="储值卡会员管理" | |||
toolBarRender={() => [ | |||
<Button key="button" icon={<PlusOutlined />} type="primary" onClick={onCreateTableRow}> | |||
新建 | |||
</Button> | |||
]} | |||
/> | |||
<Modal width={600} title={currentOption.id ? '编辑会员' : '添加会员'} visible={isModalOpen} footer={false} onCancel={() => setIsModalOpen(false)}> | |||
<Form | |||
name="basic" | |||
onFinish={onFinish} | |||
> | |||
<Form.Item | |||
label="id" | |||
name="id" | |||
hidden={true} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="姓名" | |||
name="name" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入姓名!', | |||
}, | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="会员ID" | |||
name="cardId" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入会员ID!', | |||
}, | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="状态" | |||
name="status" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入选择状态!', | |||
}, | |||
]} | |||
> | |||
<Select> | |||
<Select.Option value={true}>启用</Select.Option> | |||
<Select.Option value={false}>停用</Select.Option> | |||
</Select> | |||
</Form.Item> | |||
<Form.Item | |||
label="电话" | |||
name="phone" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入电话!', | |||
}, | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="性别" | |||
name="sex" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入选择性别!', | |||
}, | |||
]} | |||
> | |||
<Select> | |||
<Select.Option value={1}>男性</Select.Option> | |||
<Select.Option value={0}>女性</Select.Option> | |||
</Select> | |||
</Form.Item> | |||
<Form.Item | |||
label="身份证" | |||
name="identityCard" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入身份证!', | |||
}, | |||
]} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="生日" | |||
name="birthday" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入选择生日!', | |||
}, | |||
]} | |||
> | |||
<DatePicker style={{width: '100%'}} /> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
确定 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Modal> | |||
</div> | |||
</PageContainer> | |||
) | |||
} | |||
export default memberCard; |
@@ -0,0 +1,136 @@ | |||
import { request } from 'umi'; | |||
export default { | |||
//获取所有门店 | |||
GetAllStore() { | |||
return request('/kitchen/api/StoreHelper/GetAllStore', { | |||
method: 'GET' | |||
}); | |||
}, | |||
/** 档口管理:Start */ | |||
// 新增档口 | |||
AddGate(data) { | |||
return request(`/kitchen/api/GateInfo/add`, { | |||
method: 'POST', | |||
data | |||
}); | |||
}, | |||
//档口状态修改 | |||
EnableGate(data) { | |||
return request(`/kitchen/api/GateInfo/Enable`, { | |||
method: 'POST', | |||
data | |||
}); | |||
}, | |||
//根据门店ID查询 档口分页列表 | |||
GetGateListByStorePage(StoreId, Current, PageSize) { | |||
return request(`/kitchen/api/GateInfo/gatelist?StoreId=${StoreId}&Current=${Current}&PageSize=${PageSize}`, { | |||
method: 'GET' | |||
}); | |||
}, | |||
//根据门店ID查询 档口列表 | |||
GetGateListByStoreList(StoreId) { | |||
return request(`/kitchen/api/GateInfo/gatealllist?StoreId=${StoreId}`, { | |||
method: 'GET' | |||
}); | |||
}, | |||
//更新档口信息 | |||
UpdateGateInfo(data) { | |||
return request(`/kitchen/api/GateInfo/Update`, { | |||
method: 'POST', | |||
data | |||
}); | |||
}, | |||
/** 档口管理:End */ | |||
/** 刷卡机管理:Start */ | |||
// 新增刷卡机 | |||
PayCardAdd(data) { | |||
return request(`/kitchen/api/PayCard/add`, { | |||
method: 'POST', | |||
data | |||
}); | |||
}, | |||
//刷卡机状态更改 | |||
PayCardEnable(data) { | |||
return request(`/kitchenapi/PayCard/enable`, { | |||
method: 'POST', | |||
data | |||
}); | |||
}, | |||
//根据档口信息查询刷卡机列表 | |||
PayCardByGateId(GateId, Current, PageSize) { | |||
return request(`/kitchen/api/PayCard/gateList?GateId=${GateId}&Current=${Current}&PageSize=${PageSize}`, { | |||
method: 'GET' | |||
}); | |||
}, | |||
//更新刷卡机信息 | |||
UpdatePayCardInfo(data) { | |||
return request(`/kitchen/api/PayCard/update`, { | |||
method: 'POST', | |||
data | |||
}); | |||
}, | |||
/** 刷卡机管理:End */ | |||
GetCosRequestURL(data) { | |||
return request(`/kitchen/api/systemconfig/GetCosRequestSignURL`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
}, | |||
/** 会员账户管理: Start */ | |||
//获取会员账户列表 | |||
GetMemberAccountPageList(data) { | |||
return request(`/kitchen/api/member/member-account-page-list`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
}, | |||
//更新会员账户状态 | |||
UpdateMemberAccountStatus(data) { | |||
return request(`/kitchen/api/member/member-account-status`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
}, | |||
/** 会员账户管理: End */ | |||
//获取会员储值卡列表 | |||
GetMemberCardPageList(data) { | |||
return request(`/kitchen/api/member/mmenber-card-page`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
}, | |||
//添加会员储值卡 | |||
AddMemberCard(data) { | |||
return request(`/kitchen/api/member/mmenber-card`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
}, | |||
//修改会员卡状态 | |||
UpdateMemberCardState(data) { | |||
return request(`/kitchen/api/member/mmenber-card-state`, { | |||
method: 'PUT', | |||
data: data, | |||
}); | |||
}, | |||
} |
@@ -0,0 +1,258 @@ | |||
import React, { useRef, useState } from "react"; | |||
import styles from "./index.less"; | |||
import { PageContainer } from '@ant-design/pro-layout'; | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import { Button, Form, Input, message, Modal, Select, Popconfirm } from 'antd'; | |||
import cardAPI from "../service"; | |||
/** | |||
* 储值卡管理 | |||
* @returns | |||
*/ | |||
const storedValueCard = () => { | |||
const actionRef = useRef(); | |||
const [modalForm] = Form.useForm(); | |||
const [isModalOpen, setIsModalOpen] = useState(false); | |||
const [currentOption, setCurrentOption] = useState({ id: '' }); | |||
const [current, setCurrent] = useState(1); | |||
const [pageSize, setPageSize] = useState(10); | |||
const [total, setTotal] = useState(0); | |||
/** | |||
* 点击编辑按钮 | |||
* @param {*} record | |||
*/ | |||
const onEditTableRow = (record) => { | |||
modalForm.setFieldsValue(record); | |||
setCurrentOption(record); | |||
setIsModalOpen(true); | |||
} | |||
/** | |||
* 点击新建 | |||
*/ | |||
const onCreateTableRow = () => { | |||
modalForm.resetFields(); | |||
setCurrentOption({id: ''}) | |||
setIsModalOpen(true); | |||
} | |||
/** | |||
* 删除数据 | |||
* @param {*} record | |||
*/ | |||
const onDeleteTableRow = (record) => { | |||
console.log('删除', record) | |||
} | |||
/** | |||
* 提交表单 | |||
*/ | |||
const onFinish = async (values) => { | |||
if (values.id) { | |||
const response = await cardAPI.UpdateMemberCardState({ | |||
id: values.id, | |||
type: values.type, | |||
state: values.state | |||
}); | |||
if (response.statusCode === 200) { | |||
message.success('更新成功'); | |||
setIsModalOpen(false); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error(response.errors || '更新储值卡失败'); | |||
} | |||
} else { | |||
const response = await cardAPI.AddMemberCard({ | |||
type: values.type, | |||
state: values.state | |||
}); | |||
if (response.statusCode === 200) { | |||
message.success('添加成功'); | |||
setIsModalOpen(false); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error(response.errors || '添加储值卡失败'); | |||
} | |||
} | |||
} | |||
const columns = [ | |||
{ | |||
title: 'ID', | |||
dataIndex: 'id', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '卡号', | |||
dataIndex: 'cardNum', | |||
ellipsis: true, | |||
}, | |||
{ | |||
title: '状态', | |||
dataIndex: 'state', | |||
valueType: 'select', | |||
valueEnum: { | |||
0: { | |||
text: '禁用', | |||
status: 'Error', | |||
}, | |||
1: { | |||
text: '正常', | |||
status: 'Success', | |||
}, | |||
2: { | |||
text: '挂失', | |||
status: 'Error', | |||
}, | |||
3: { | |||
text: '作废', | |||
status: 'Error', | |||
}, | |||
}, | |||
}, | |||
{ | |||
title: '类型', | |||
dataIndex: 'type', | |||
valueType: 'select', | |||
valueEnum: { | |||
0: { | |||
text: '人脸', | |||
status: 'Success', | |||
}, | |||
1: { | |||
text: '实体卡', | |||
status: 'Success', | |||
}, | |||
2: { | |||
text: '指纹', | |||
status: 'Success', | |||
} | |||
}, | |||
}, | |||
{ | |||
title: '操作', | |||
valueType: 'option', | |||
key: 'option', | |||
render: (text, record, _, action) => [ | |||
<a onClick={() => onEditTableRow(record)}>编辑</a>, | |||
], | |||
}, | |||
]; | |||
return ( | |||
<PageContainer> | |||
<div className={styles.member_card_container}> | |||
<ProTable | |||
columns={columns} | |||
actionRef={actionRef} | |||
request={ | |||
async () => { | |||
const response = await cardAPI.GetMemberCardPageList({ | |||
current, | |||
pageSize | |||
}); | |||
return { | |||
data: response.data.data, | |||
success: true, | |||
total: response.data.total, | |||
} | |||
} | |||
} | |||
cardBordered | |||
editable={{ | |||
type: 'multiple', | |||
}} | |||
rowKey="id" | |||
search={false} | |||
options={{ | |||
setting: { | |||
listsHeight: 400, | |||
}, | |||
}} | |||
pagination={{ | |||
pageSize: pageSize, | |||
onChange: (page) => setCurrent(page), | |||
}} | |||
dateFormatter="string" | |||
headerTitle="储值卡账户管理" | |||
toolBarRender={() => [ | |||
<Button key="button" icon={<PlusOutlined />} type="primary" onClick={onCreateTableRow}> | |||
新建 | |||
</Button> | |||
]} | |||
/> | |||
<Modal width={600} title={currentOption.id ? '编辑储值卡' : '添加储值卡'} visible={isModalOpen} footer={false} onCancel={() => setIsModalOpen(false)}> | |||
<Form | |||
name="basic" | |||
onFinish={onFinish} | |||
form={modalForm} | |||
labelCol={{span: 4}} | |||
> | |||
<Form.Item | |||
label="id" | |||
name="id" | |||
hidden={true} | |||
> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
label="卡号" | |||
name="cardNum" | |||
> | |||
<Input disabled={true} /> | |||
</Form.Item> | |||
<Form.Item | |||
label="状态" | |||
name="state" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入选择状态!', | |||
}, | |||
]} | |||
> | |||
<Select> | |||
<Select.Option value={0}>禁用</Select.Option> | |||
<Select.Option value={1}>正常</Select.Option> | |||
<Select.Option value={2}>挂失</Select.Option> | |||
<Select.Option value={3}>作废</Select.Option> | |||
</Select> | |||
</Form.Item> | |||
<Form.Item | |||
label="类型" | |||
name="type" | |||
rules={[ | |||
{ | |||
required: true, | |||
message: '请输入类型!', | |||
}, | |||
]} | |||
> | |||
<Select> | |||
<Select.Option value={0}>人脸</Select.Option> | |||
<Select.Option value={1}>实体卡</Select.Option> | |||
<Select.Option value={2}>指纹</Select.Option> | |||
</Select> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
确定 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Modal> | |||
</div> | |||
</PageContainer> | |||
) | |||
} | |||
export default storedValueCard; |
@@ -1,5 +1,5 @@ | |||
import React, { useState, useEffect } from 'react'; | |||
import { Modal, Form, Input, Button, Select, TreeSelect } from 'antd'; | |||
import { Modal, Form, Input, Button, Select, TreeSelect,InputNumber } from 'antd'; | |||
const CreateForm = (props) => { | |||
const { Option, OptGroup } = Select; | |||
@@ -82,6 +82,9 @@ const CreateForm = (props) => { | |||
) : null | |||
} | |||
</Form.Item> | |||
<Form.Item label={'设备坐标'} name="deviceLoc"> | |||
<Input placeholder="104.070734,30.575041" /> | |||
</Form.Item> | |||
<Form.Item label={'状态'} name="status" rules={[{ required: true }]}> | |||
<Select placeholder="请选择状态"> | |||
<OptGroup> | |||
@@ -90,8 +93,8 @@ const CreateForm = (props) => { | |||
</OptGroup> | |||
</Select> | |||
</Form.Item> | |||
<Form.Item label={'设备坐标'} name="deviceLoc"> | |||
<Input placeholder="104.070734,30.575041" /> | |||
<Form.Item label={'设备物料数量'} name="materialQuantity"> | |||
<InputNumber /> | |||
</Form.Item> | |||
<Form.Item label={'设备详细地址'} name="deviceAddr"> | |||
<Input placeholder="成都市武侯区桂溪街道环球中心N5-9111C" /> | |||
@@ -1,5 +1,5 @@ | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import { Modal, Button, message} from 'antd'; | |||
import { Modal, Button, message } from 'antd'; | |||
import React, { useState, useRef, useEffect } from 'react'; | |||
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; | |||
import ProTable from '@ant-design/pro-table'; | |||
@@ -12,6 +12,7 @@ import { | |||
DelDeviceInfo, | |||
GetDeviceType, | |||
GetDeviceVersions, | |||
CopyDevice | |||
} from './services'; | |||
import { gettree } from '../../sys/org/service'; | |||
const key = 'message'; | |||
@@ -110,12 +111,12 @@ const GoodsTypeManage = () => { | |||
inittree(r.data); | |||
function inittree(datas) { | |||
for (var i in datas) { | |||
if( datas[i]['type']==2|| datas[i]['type']==3){ | |||
datas[i]['disabled']=false; | |||
}else{ | |||
datas[i]['disabled']=true; | |||
if (datas[i]['type'] == 2 || datas[i]['type'] == 3) { | |||
datas[i]['disabled'] = false; | |||
} else { | |||
datas[i]['disabled'] = true; | |||
} | |||
if (datas[i].children) { | |||
inittree(datas[i].children); | |||
} | |||
@@ -126,7 +127,7 @@ const GoodsTypeManage = () => { | |||
formateData(r.data); | |||
function formateData(datas) { | |||
for (var i in datas) { | |||
list[datas[i]['disabled']]=true; | |||
list[datas[i]['disabled']] = true; | |||
list[datas[i]['value']] = { text: datas[i]['title'] }; | |||
if (datas[i].children) { | |||
formateData(datas[i].children); | |||
@@ -161,13 +162,13 @@ const GoodsTypeManage = () => { | |||
}, []); | |||
const initDeviceVersion = async () => { | |||
const response = await GetDeviceVersions(); | |||
if (response.statusCode == 200) { | |||
setDeviceVersion(response.data); | |||
} else { | |||
message.error('获取设备版本失败'); | |||
} | |||
} | |||
const response = await GetDeviceVersions(); | |||
if (response.statusCode == 200) { | |||
setDeviceVersion(response.data); | |||
} else { | |||
message.error('获取设备版本失败'); | |||
} | |||
} | |||
/** 新建/更新窗口的弹窗 */ | |||
const [createModalVisible, handleModalVisible] = useState(false); | |||
@@ -229,8 +230,14 @@ const GoodsTypeManage = () => { | |||
valueType: 'textarea', | |||
search: false, | |||
}, | |||
{ | |||
title: '设备物料数量', | |||
dataIndex: 'materialQuantity', | |||
valueType: 'textarea', | |||
search: false, | |||
}, | |||
{ | |||
{ | |||
title: '设备唯一key', | |||
dataIndex: 'autoKey', | |||
search: false, | |||
@@ -267,9 +274,21 @@ const GoodsTypeManage = () => { | |||
}} | |||
> | |||
{' '} | |||
{record.store_Status == 0 ? '正常' :'停用'} | |||
{record.status == 0 ? '停用' : '正常'} | |||
</a>, | |||
<a | |||
key="primary" | |||
onClick={() => { | |||
CopyDevice({ id: record.id }).then((r) => { | |||
if (r.data) { | |||
actionRef.current.reload(); | |||
} | |||
}); | |||
}} | |||
> | |||
{' '} | |||
复制 | |||
</a>, | |||
], | |||
}, | |||
]; | |||
@@ -294,6 +313,15 @@ const GoodsTypeManage = () => { | |||
> | |||
<PlusOutlined /> 新建 | |||
</Button>, | |||
<Button | |||
onClick={async () => { | |||
await handleRemove(selectedRowsState); | |||
setSelectedRows([]); | |||
actionRef.current?.reloadAndRest?.(); | |||
}} | |||
> | |||
删除 | |||
</Button> | |||
]} | |||
request={async (params) => { | |||
var data = []; | |||
@@ -334,15 +362,7 @@ const GoodsTypeManage = () => { | |||
</div> | |||
} | |||
> | |||
<Button | |||
onClick={async () => { | |||
await handleRemove(selectedRowsState); | |||
setSelectedRows([]); | |||
actionRef.current?.reloadAndRest?.(); | |||
}} | |||
> | |||
删除 | |||
</Button> | |||
{/* <Button type="primary">批量审批</Button> */} | |||
</FooterToolbar> | |||
)} | |||
@@ -21,13 +21,20 @@ export async function AddDeviceInfo(data) { | |||
}); | |||
} | |||
/** 修改 */ | |||
/** 修改 */ | |||
export async function UpdateDeviceInfo(data) { | |||
return request(`/kitchen/api/Device/UpdateDeviceInfo`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
} | |||
/** 修改 */ | |||
export async function CopyDevice(data) { | |||
return request(`/kitchen/api/Device/CopyDevice`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
} | |||
/** 删除 */ | |||
export async function DelDeviceInfo(data) { | |||
return request(`/kitchen/api/Device/DelDeviceInfo`, { | |||
@@ -48,4 +55,4 @@ export async function DelDeviceInfo(data) { | |||
method: 'post', | |||
}); | |||
} | |||
@@ -0,0 +1,64 @@ | |||
import {Modal } from 'antd'; | |||
import React, { useState} from 'react'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import { GetGoods } from '../service'; | |||
const CreateForm = (props) => { | |||
const [selectedRowsState, setSelectedRows] = useState([]); | |||
const columns = [ | |||
{ | |||
title: '商品id', | |||
dataIndex: 'goodsId', | |||
tip: '规则名称是唯一的 key', | |||
hideInSearch: true, | |||
hideInTable: true, | |||
}, | |||
{ | |||
title: '商品名称', | |||
dataIndex: 'goodsName', | |||
}, | |||
]; | |||
return ( | |||
<Modal | |||
width={700} | |||
bodyStyle={{ padding: '32px 40px 48px' }} | |||
destroyOnClose | |||
title="选择商品" | |||
visible={props.modalVisible} | |||
onCancel={() => props.onCancel()} | |||
onOk={() => props.onSubmit(selectedRowsState)} | |||
maskClosable={false} | |||
> | |||
<ProTable | |||
headerTitle="商品信息" | |||
rowKey="goodsId" | |||
pagination={{ defaultPageSize: 5000 }} | |||
search={false} | |||
toolBarRender={false} | |||
params={{ | |||
DeviceId:props.values, | |||
}} | |||
//数据绑定 | |||
request={async (params) => { | |||
var Data = []; | |||
var total = 0; | |||
await GetGoods(params).then((r) => { | |||
Data = r.data; | |||
total = 1; | |||
}); | |||
return { | |||
data: Data, | |||
success: true, | |||
total: total, | |||
}; | |||
}} | |||
columns={columns} | |||
rowSelection={{ | |||
onChange: (_, selectedRows) => setSelectedRows(selectedRows), | |||
}} | |||
/> | |||
</Modal> | |||
); | |||
}; | |||
export default CreateForm; |
@@ -0,0 +1,237 @@ | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import { Card, Tree, Button, message, Input, Drawer, Divider } from 'antd'; | |||
import React, { useState, useRef, useEffect } from 'react'; | |||
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import ProDescriptions from '@ant-design/pro-descriptions'; | |||
import CreateForm from './components/CreateForm'; | |||
import { add, getpage, gettree, DelDeviceGood } from './service'; | |||
import DeviceStock from '../deviceStirFryTimeStock'; | |||
/** | |||
* 添加节点 | |||
* | |||
* @param fields | |||
*/ | |||
const handleAdd = async (fields) => { | |||
const hide = message.loading('正在添加'); | |||
try { | |||
await add({ ...fields }).then((r) => { | |||
if (!r.succeeded) { | |||
message.error(r.errors); | |||
return false; | |||
} | |||
}); | |||
hide(); | |||
message.success('添加成功'); | |||
return true; | |||
} catch (error) { | |||
hide(); | |||
message.error('添加失败请重试!'); | |||
return false; | |||
} | |||
}; | |||
/** | |||
* 删除节点 | |||
* | |||
* @param selectedRows | |||
*/ | |||
const handleRemove = async (selectedRows) => { | |||
try { | |||
message.loading('正在删除'); | |||
let ids = []; | |||
selectedRows.forEach((item) => { | |||
ids.push(item.id); | |||
}); | |||
await DelDeviceGood(ids).then((r) => { | |||
if (r.data) { | |||
message.success('删除成功'); | |||
return true; | |||
} else { | |||
message.success('删除失败'); | |||
return false; | |||
} | |||
}); | |||
} catch (error) { | |||
message.error('删除失败请重试!'); | |||
return false; | |||
} | |||
}; | |||
const TableList = () => { | |||
/** 新建窗口的弹窗 */ | |||
const [createModalVisible, handleModalVisible] = useState(); | |||
/*绑定数据 */ | |||
const actionRef = useRef(); | |||
const [treeData, setTreeData] = useState(); | |||
/*选中*/ | |||
const [selectedRowsState, setSelectedRows] = useState(); | |||
const [stockModalVisible, setStockModalVisible] = useState(false); | |||
const [DeviceInfo, setDeviceInfo] = useState(); | |||
const [DeviceId, setKey] = useState(); | |||
/** 国际化配置 */ | |||
useEffect(() => { | |||
function initfranchiseeType() { | |||
gettree().then((r) => { | |||
setTreeData(r.data); | |||
}); | |||
} | |||
initfranchiseeType(); | |||
}, []); | |||
const columns = [ | |||
{ | |||
title: '商品名称', | |||
dataIndex: 'goods_Name', | |||
} | |||
]; | |||
return ( | |||
<PageContainer> | |||
<ProTable | |||
headerTitle="商品列表" | |||
actionRef={actionRef} | |||
rowKey="id" | |||
search={{ | |||
labelWidth: 120, | |||
}} | |||
tableRender={(_, dom) => ( | |||
<div | |||
style={{ | |||
display: 'flex', | |||
width: '100%', | |||
}} | |||
> | |||
<Card title="店铺设备列表"> | |||
<Tree defaultExpandAll={true} onSelect={(e, info) => [ | |||
setKey(e[0]), | |||
setDeviceInfo(info.node) | |||
] | |||
} treeData={treeData} /> | |||
</Card> | |||
<div | |||
style={{ | |||
flex: 1, | |||
}} | |||
> | |||
{dom} | |||
</div> | |||
</div> | |||
)} | |||
toolBarRender={() => [ | |||
<Button | |||
type="primary" | |||
key="primary" | |||
onClick={() => { | |||
handleModalVisible(true); | |||
}} | |||
> | |||
<PlusOutlined /> 上架菜品商品 | |||
</Button>, | |||
<Button | |||
type="primary" | |||
key="primary" | |||
onClick={() => { | |||
if (DeviceId == undefined) { | |||
message.error('请选择设备'); | |||
return; | |||
} | |||
if (DeviceInfo.parentId != "0") { setStockModalVisible(true); } | |||
}} | |||
> | |||
设备库存管理 | |||
</Button>, | |||
]} | |||
params={{ | |||
DeviceId, | |||
}} | |||
request={async (params) => { | |||
let UserData = []; | |||
var total = 0; | |||
await getpage(params).then((r) => { | |||
UserData = r.data.data; | |||
total = r.data.total; | |||
}); | |||
return { | |||
data: UserData, | |||
success: true, | |||
total: total, | |||
}; | |||
}} | |||
columns={columns} | |||
rowSelection={{ | |||
onChange: (_, selectedRows) => { | |||
setSelectedRows(selectedRows); | |||
}, | |||
}} | |||
/> | |||
{selectedRowsState?.length > 0 && ( | |||
<FooterToolbar | |||
extra={ | |||
<div> | |||
已选择{' '} | |||
<a | |||
style={{ | |||
fontWeight: 600, | |||
}} | |||
> | |||
{selectedRowsState.length} | |||
</a>{' '} | |||
项 | |||
</div> | |||
} | |||
> | |||
<Button | |||
onClick={async () => { | |||
await handleRemove(selectedRowsState); | |||
setSelectedRows([]); | |||
actionRef.current?.reloadAndRest?.(); | |||
}} | |||
> | |||
批量删除 | |||
</Button> | |||
</FooterToolbar> | |||
)} | |||
<CreateForm | |||
onSubmit={async (value) => { | |||
if (DeviceId == undefined) { | |||
message.error('请选择设备'); | |||
handleModalVisible(false); | |||
} else { | |||
const defaultData = []; | |||
value.map((data) => { | |||
defaultData.push({ FoodId: data.goodsId }); | |||
}); | |||
const valuejson = { DeviceId: DeviceId, Foodss: defaultData } | |||
var success = false; | |||
success = await handleAdd(valuejson); | |||
if (success) { | |||
handleModalVisible(false); | |||
if (actionRef.current) { | |||
actionRef.current.reload(); | |||
} | |||
} | |||
} | |||
}} | |||
onCancel={() => { | |||
handleModalVisible(false); | |||
}} | |||
modalVisible={createModalVisible} | |||
values={DeviceId} | |||
/> | |||
{/* 库存调拨 */} | |||
<DeviceStock | |||
onCancel={() => { | |||
setStockModalVisible(false); | |||
}} | |||
stockModalVisible={stockModalVisible} | |||
values={DeviceInfo} | |||
/> | |||
</PageContainer> | |||
); | |||
}; | |||
export default TableList; |
@@ -0,0 +1,40 @@ | |||
import { request } from 'umi'; | |||
export async function getpage(params, options) { | |||
return request('/kitchen/api/Device/GetDeviceGoods', { | |||
method: 'POST', | |||
data: { | |||
...params, | |||
}, | |||
}); | |||
} | |||
export async function add(params) { | |||
return request('/kitchen/api/Device/AddDeviceGood', { | |||
method: 'POST', | |||
data: { | |||
...params, | |||
}, | |||
}); | |||
} | |||
export async function DelDeviceGood(data) { | |||
return request(`/kitchen/api/Device/DelDeviceGood`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
} | |||
export async function gettree(params) { | |||
return request('/kitchen/api/Device/StoreDeviceTree?isTMC=false', { | |||
data: { | |||
...params, | |||
}, | |||
}); | |||
} | |||
export async function GetGoods(params) { | |||
return request('/kitchen/api/Device/GetGoods', { | |||
method: 'POST', | |||
data: { | |||
...params, | |||
}, | |||
}); | |||
} |
@@ -0,0 +1,94 @@ | |||
import React, { useState, useEffect } from 'react'; | |||
import { InputNumber, Modal, Form, Input, Button, Select } from 'antd'; | |||
import { GetBatchingAsync,GetProductListByBom } from '../services'; | |||
const CreateForm = (props) => { | |||
const { Option, OptGroup } = Select; | |||
const [batchingList, setBatchingList] = useState([]); | |||
//原料 | |||
//初始化数据 | |||
useEffect(() => { | |||
const initBatching = () => { | |||
if(props.isbom){ | |||
GetProductListByBom({ DeviceId: props.DeviceId,BomIds:props.bomIds }).then((data) => { | |||
setBatchingList(data.data); | |||
}); | |||
}else { | |||
GetBatchingAsync({ DeviceId: props.DeviceId }).then((data) => { | |||
setBatchingList(data.data); | |||
}); | |||
} | |||
}; | |||
initBatching(); | |||
}, []); | |||
return ( | |||
<Modal | |||
title={props.values.id ? '编辑' : '新建'} | |||
width={640} | |||
visible={props.createModalVisible} | |||
bodyStyle={{ padding: '32px 40px 48px' }} | |||
footer={null} | |||
onCancel={() => { | |||
props.onCancel(); | |||
}} | |||
destroyOnClose | |||
> | |||
<Form | |||
layout="vertical" | |||
preserve={false} | |||
initialValues={props.values} | |||
onFinish={props.onFinish} | |||
> | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item | |||
name="batching_Id" | |||
label="原料名称" | |||
rules={[{ required: true, message: '请选择原料名称' }]} | |||
> | |||
<Select placeholder="请选择原料名称" showSearch | |||
optionFilterProp="children" | |||
filterOption={(input, option) => | |||
option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 | |||
}> | |||
{batchingList.map((item, index) => { | |||
return ( | |||
<Select.Option index={index} value={item.id} key={item.id}> | |||
{item.name} | |||
</Select.Option> | |||
); | |||
})} | |||
</Select> | |||
</Form.Item> | |||
<Form.Item | |||
name="batching_Loc" | |||
label="库存位置" | |||
rules={[{ required: true }]} | |||
defaultValue="0" | |||
> | |||
<Input placeholder="输入库存位置编码" /> | |||
</Form.Item> | |||
<Form.Item | |||
name="batching_Count" | |||
label="原料数量" | |||
rules={[{ required: true }]} | |||
defaultValue="0" | |||
> | |||
<InputNumber min={0} placeholder="请输入原料数量" /> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
保存 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Modal> | |||
); | |||
}; | |||
export default CreateForm; |
@@ -0,0 +1,349 @@ | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import { Popconfirm, Modal, Button, message, Input, Drawer } from 'antd'; | |||
import React, { useEffect, useState, useRef } from 'react'; | |||
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import ProDescriptions from '@ant-design/pro-descriptions'; | |||
import CreateForm from './components/CreateForm'; | |||
import { | |||
GetStoreBatchingStockPageAsync, | |||
AddStoreBatchingStocAsync, | |||
UpdateStoreBatchingStocAsync, | |||
PushStockAsync, | |||
CheckStockAdjust, | |||
removeSingleStockAdjust, | |||
PushDeviceTMC, | |||
CheckStockTMCAdjust | |||
} from './services'; | |||
const key = 'message'; | |||
const DeviceStockManager = (props) => { | |||
/** 新建/更新窗口的弹窗 */ | |||
const [createModalVisible, handleModalVisible] = useState(false); | |||
const actionRef = useRef(); | |||
const [currentRow, setCurrentRow] = useState(); | |||
const [selectedRowsState, setSelectedRows] = useState([]); | |||
const [total, setTotal] = useState(0); | |||
//添加 | |||
const handleAdd = async (fields) => { | |||
try { | |||
fields.DeviceId = props.values.key; | |||
message.loading('正在添加', key); | |||
await AddStoreBatchingStocAsync(JSON.stringify(fields)).then((r) => { | |||
message.destroy(key); | |||
if (r.data) { | |||
message.success('添加成功'); | |||
actionRef.current.reload(); | |||
return true; | |||
} else { | |||
message.error('添加失败' + r.errors); | |||
actionRef.current.reload(); | |||
return false; | |||
} | |||
}); | |||
} catch (error) { | |||
message.error('添加失败请重试!'); | |||
actionRef.current.reload(); | |||
return false; | |||
} | |||
}; | |||
//同步 | |||
const pushStock = async (id) => { | |||
try { | |||
message.loading('正在同步', key); | |||
if (props.isbom) { | |||
await PushDeviceTMC(id).then((r) => { | |||
message.destroy(key); | |||
if (r.data) { | |||
setSelectedRows([]); | |||
message.success('同步成功'); | |||
actionRef.current.reload(); | |||
return true; | |||
} else { | |||
message.success('同步失败'); | |||
actionRef.current.reload(); | |||
return false; | |||
} | |||
}); | |||
} else { | |||
await PushStockAsync(id).then((r) => { | |||
message.destroy(key); | |||
if (r.data) { | |||
setSelectedRows([]); | |||
message.success('同步成功'); | |||
actionRef.current.reload(); | |||
return true; | |||
} else { | |||
message.success('同步失败'); | |||
actionRef.current.reload(); | |||
return false; | |||
} | |||
}); | |||
} | |||
} catch (error) { | |||
message.error('同步失败请重试!'); | |||
actionRef.current.reload(); | |||
return false; | |||
} | |||
}; | |||
//获取实时库存 | |||
const handleCheckStockAdjust = async (id) => { | |||
console.log("fdsfds"); | |||
try { | |||
if (props.isbom) { | |||
await CheckStockTMCAdjust(id).then((r) => { | |||
message.destroy(key); | |||
if (r.data) { | |||
message.success('获取成功'); | |||
actionRef.current.reload(); | |||
return true; | |||
} else { | |||
message.error('获取失败' + r.errors); | |||
actionRef.current.reload(); | |||
return false; | |||
} | |||
}); | |||
} else { | |||
await CheckStockAdjust(id).then((r) => { | |||
message.destroy(key); | |||
if (r.data) { | |||
message.success('获取成功'); | |||
actionRef.current.reload(); | |||
return true; | |||
} else { | |||
message.error('获取失败' + r.errors); | |||
actionRef.current.reload(); | |||
return false; | |||
} | |||
}); | |||
} | |||
} catch (error) { | |||
message.error("获取失败!"); | |||
actionRef.current.reload(); | |||
return false; | |||
} | |||
}; | |||
const handleRemoveSingle = async (value) => { | |||
try { | |||
await removeSingleStockAdjust(value).then((r) => { | |||
if (r.data) { | |||
message.success('删除成功,即将刷新'); | |||
//刷新数据 | |||
actionRef.current.reload(); | |||
} else { | |||
message.error('删除失败,请重试'); | |||
actionRef.current.reload(); | |||
} | |||
}); | |||
return true; | |||
} catch (error) { | |||
message.error('删除失败,请重试'); | |||
actionRef.current.reload(); | |||
} | |||
}; | |||
//修改 | |||
const handleUpdate = async (fields) => { | |||
try { | |||
message.loading('正在修改', key); | |||
message.destroy(key); | |||
fields.DeviceId = props.values.key; | |||
await UpdateStoreBatchingStocAsync(JSON.stringify(fields)).then((r) => { | |||
message.destroy(key); | |||
if (r.data) { | |||
message.success('修改成功'); | |||
return true; | |||
} else { | |||
message.error('修改失败' + r.errors); | |||
return false; | |||
} | |||
}); | |||
} catch (error) { | |||
message.error('修改失败请重试!'); | |||
return false; | |||
} | |||
}; | |||
const columns = [ | |||
{ | |||
title: '主键', | |||
dataIndex: 'id', | |||
hideInSearch: true, | |||
hideInTable: true, | |||
tip: '规则名称是唯一的 key', | |||
}, | |||
{ | |||
title: '物料', | |||
dataIndex: 'batching_Name', | |||
valueType: 'textarea', | |||
}, | |||
{ | |||
title: '数量', | |||
dataIndex: 'batching_Count', | |||
valueType: 'textarea', | |||
}, | |||
{ | |||
title: '库位', | |||
dataIndex: 'batching_Loc', | |||
}, | |||
{ | |||
title: '操作', | |||
dataIndex: 'option', | |||
valueType: 'option', | |||
render: (_, record) => [ | |||
<a | |||
key="config" | |||
onClick={() => { | |||
handleModalVisible(true); | |||
setCurrentRow(record); | |||
}} | |||
> | |||
{' '} | |||
修改 | |||
</a>, | |||
<Popconfirm | |||
type="primary" | |||
key="primary" | |||
title="确认删除吗?" | |||
okText="是" | |||
cancelText="否" | |||
onConfirm={() => { | |||
handleRemoveSingle(record.id); | |||
}} | |||
onCancel={() => { }} | |||
> | |||
<a href="#">删除</a> | |||
</Popconfirm>, | |||
], | |||
}, | |||
]; | |||
return ( | |||
<Modal | |||
width={1200} | |||
bodyStyle={{ padding: '32px 40px 48px' }} | |||
destroyOnClose | |||
//(props.values == undefined ? '' : props.values.store_Name) + | |||
title={(props.values == undefined ? '' : props.values.title) + '库存原料调整'} | |||
search={false} | |||
visible={props.stockModalVisible} | |||
footer={false} | |||
onCancel={() => props.onCancel()} | |||
maskClosable={false} | |||
> | |||
<PageContainer | |||
header={{ | |||
title: '', | |||
breadcrumb: {}, | |||
}} | |||
> | |||
<ProTable | |||
headerTitle="" | |||
actionRef={actionRef} | |||
rowKey="id" | |||
search={false} | |||
toolBarRender={() => [ | |||
<Popconfirm | |||
type="primary" | |||
key="primary" | |||
title="获取实时库存会覆盖本次补货数据" | |||
okText="是" | |||
cancelText="否" | |||
onConfirm={() => { | |||
handleCheckStockAdjust(props.values.key); | |||
}} | |||
onCancel={() => { }} | |||
> | |||
<Button type="primary" key="primary"> | |||
获取实时库存 | |||
</Button> | |||
</Popconfirm>, | |||
<Button | |||
type="primary" | |||
key="primary" | |||
onClick={() => { | |||
if (selectedRowsState.length == 0) { | |||
message.error('请选择需要同步的数据!!'); | |||
} | |||
// else if (selectedRowsState.length < 6) { | |||
// message.error('必须同步6个库存位置的数据,现在条件不满足不能同步!!'); | |||
// } | |||
else { | |||
pushStock(props.values.key); | |||
actionRef.current?.reloadAndRest?.(); | |||
} | |||
}} | |||
> | |||
同步库存原料 | |||
</Button>, | |||
<Button | |||
disabled={props.isbom && total > 14} | |||
type="primary" | |||
key="primary" | |||
onClick={() => { | |||
handleModalVisible(true); | |||
}} | |||
> | |||
<PlusOutlined /> 新增库存原料 | |||
</Button>, | |||
]} | |||
request={async (params) => { | |||
var data = []; | |||
var total = 0; | |||
//params.DeviceId ='263971c3-38d6-43a2-a2df-bb5be147d05e'; //props.values.key; | |||
params.DeviceId = props.values.key; | |||
await GetStoreBatchingStockPageAsync(params).then((r) => { | |||
data = r.data.data; | |||
total = r.data.total; | |||
setTotal(total); | |||
}); | |||
return { | |||
data: data, | |||
success: true, | |||
total: total, | |||
}; | |||
}} | |||
columns={columns} | |||
rowSelection={{ | |||
onChange: (_, selectedRows) => { | |||
setSelectedRows(selectedRows); | |||
}, | |||
}} | |||
/> | |||
<CreateForm | |||
isbom={props.isbom} | |||
bomIds={props.bomIds} | |||
DeviceId={props.values == undefined ? '' : props.values.key} | |||
onFinish={async (value) => { | |||
var success = false; | |||
if (value.id) { | |||
success = handleUpdate(value); | |||
} else { | |||
success = handleAdd(value); | |||
} | |||
if (success) { | |||
handleModalVisible(false); | |||
setCurrentRow(undefined); | |||
actionRef.current.reload(); | |||
} | |||
}} | |||
onCancel={() => { | |||
handleModalVisible(false); | |||
setCurrentRow(undefined); | |||
}} | |||
createModalVisible={createModalVisible} | |||
values={currentRow || {}} | |||
/> | |||
</PageContainer> | |||
</Modal> | |||
); | |||
}; | |||
export default DeviceStockManager; |
@@ -0,0 +1,79 @@ | |||
import { request } from 'umi'; | |||
/** 获取商品物料库存 */ | |||
export async function GetStoreBatchingStockPageAsync(data) { | |||
return request(`/kitchen/api/Device/GetDeviceStorePage`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
} | |||
/** 同步库存 */ | |||
export async function PushDeviceTMC(data) { | |||
return request(`/kitchen/api/Device/PushDeviceTMC?DeviceId=${data}`, { | |||
method: 'post', | |||
}); | |||
} | |||
/** 同步库存 */ | |||
export async function PushStockAsync(data) { | |||
return request(`/kitchen/api/Device/PushStirFryTimeAsync?DeviceId=${data}`, { | |||
method: 'post', | |||
}); | |||
} | |||
/** 获取实时库存 */ | |||
export async function CheckStockAdjust(data) { | |||
return request(`/kitchen/api/Device/CheckStockAdjust?DeviceId=${data}`, { | |||
method: 'POST', | |||
}); | |||
} | |||
/** 获取实时库存 */ | |||
export async function CheckStockTMCAdjust(data) { | |||
return request(`/kitchen/api/Device/CheckStockTMCAdjust?DeviceId=${data}`, { | |||
method: 'POST', | |||
}); | |||
} | |||
/** 添加商品物料库存 */ | |||
export async function AddStoreBatchingStocAsync(data) { | |||
return request(`/kitchen/api/Device/AddUpdateDeviceStocAsync`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
} | |||
/** 获取原料 */ | |||
export async function GetProductListByBom(data) { | |||
return request(`/kitchen/api/Device/GetProductListByBom`, { | |||
method: 'post', | |||
data: data, | |||
}); | |||
} | |||
/** 获取原料 */ | |||
export async function GetBatchingAsync(data) { | |||
return request(`/kitchen/api/Device/GetProductList`, { | |||
method: 'post', | |||
data: data, | |||
}); | |||
} | |||
/** 修改商品物料库存 */ | |||
export async function UpdateStoreBatchingStocAsync(data) { | |||
return request(`/kitchen/api/Device/AddUpdateDeviceStocAsync`, { | |||
method: 'put', | |||
data: data, | |||
}); | |||
} | |||
export async function removeSingleStockAdjust(data) { | |||
return request(`/kitchen/api/Device/DelStockAdjust?Id=${data}`, { | |||
method: 'DELETE', | |||
// data: data, | |||
// ...(options || {}), | |||
}); | |||
} | |||
@@ -64,7 +64,7 @@ const DeviceStockManager = (props) => { | |||
actionRef.current.reload(); | |||
return true; | |||
} else { | |||
message.success('同步失败'); | |||
message.error('同步失败' + r.errors); | |||
actionRef.current.reload(); | |||
return false; | |||
} | |||
@@ -80,7 +80,7 @@ const DeviceStockManager = (props) => { | |||
actionRef.current.reload(); | |||
return true; | |||
} else { | |||
message.success('同步失败'); | |||
message.error('同步失败' + r.errors); | |||
actionRef.current.reload(); | |||
return false; | |||
} | |||
@@ -94,7 +94,7 @@ const DeviceStockManager = (props) => { | |||
actionRef.current.reload(); | |||
return true; | |||
} else { | |||
message.success('同步失败'); | |||
message.error('同步失败' + r.errors); | |||
actionRef.current.reload(); | |||
return false; | |||
} | |||
@@ -24,7 +24,7 @@ const CreateForm = (props) => { | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="code" label="商品编码" rules={[{ required: true }]}> | |||
<Form.Item name="code" hidden={true} label="商品编码" rules={[{ required: true }]}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="name" label="商品名称" rules={[{ required: true }]}> | |||
@@ -212,8 +212,8 @@ const Advanced = (props) => { | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="code" label="商品编码" rules={[{ required: true }]}> | |||
<Input /> | |||
<Form.Item name="code" label="商品编码" hidden={true} > | |||
<Input disabled/> | |||
</Form.Item> | |||
<Form.Item name="name" label="商品名称" rules={[{ required: true }]}> | |||
<Input /> | |||
@@ -317,7 +317,9 @@ const Advanced = (props) => { | |||
<Form.Item label="是否称重" name="isWeigh" valuePropName="checked" initialValue='false' > | |||
<Switch checkedChildren="是" unCheckedChildren="否" defaultChecked='false' /> | |||
</Form.Item> | |||
<Form.Item name="cooKingTime" label="制作时间(秒)"> | |||
<InputNumber placeholder="制作时间" min={0} /> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
保存 | |||
@@ -45,7 +45,14 @@ const CreateRecordForm = (props) => { | |||
<Input disabled={props.values.code}></Input> | |||
</Form.Item> | |||
<Form.Item label='加价' name={'raise'} initialValue={props.values.raise || 0}> | |||
<Input></Input> | |||
<Select style={{ width: '300px' }}> | |||
<Select.Option value={0} key={0} index={0} > | |||
0 | |||
</Select.Option> | |||
<Select.Option value={1} key={1} index={1} > | |||
1 | |||
</Select.Option> | |||
</Select> | |||
</Form.Item> | |||
<Form.Item label='加价方式' name={'raiseType'} initialValue={props.values.raiseType}> | |||
<Select style={{ width: '300px' }}> | |||
@@ -4,6 +4,7 @@ import { Modal, Form, Input, Button } from 'antd'; | |||
const CreateTypeForm = (props) => { | |||
const [form] = Form.useForm(); | |||
form.setFieldsValue(props.values) | |||
return ( | |||
<Modal | |||
width={350} | |||
@@ -13,12 +14,11 @@ const CreateTypeForm = (props) => { | |||
onCancel={() => { | |||
props.onCancel(); | |||
}} | |||
destroyOnClose | |||
destroyOnClose={true} | |||
> | |||
<Form | |||
layout="Vertical" | |||
labelCol={{ span: 6 }} | |||
initialValues={props.values} | |||
onFinish={props.onFinish} | |||
onCancel={props.onCancel} | |||
form={form} | |||
@@ -10,6 +10,7 @@ import { | |||
addPracticeType, | |||
getPracticeType, | |||
editPracticeType, | |||
removePracticeType | |||
} from './service'; | |||
import CreateTypeForm from './components/createTypeForm'; | |||
@@ -17,8 +18,31 @@ import CreateTypeForm from './components/createTypeForm'; | |||
const PageIndex = (props) => { | |||
const actionRef = useRef(); | |||
const [createTypeModalVisible, handleTypeModalVisible] = useState() | |||
const [TypecurrentRow, setTypecurrentRow] = useState(); | |||
const [selectedRowsState, setSelectedRows] = useState([]); | |||
//删除 | |||
const handleRemove = async () => { | |||
try { | |||
message.loading('正在删除'); | |||
let ids = []; | |||
selectedRowsState.forEach((item) => { | |||
ids.push(item.id); | |||
}); | |||
await removePracticeType(ids).then((r) => { | |||
if (r.data) { | |||
message.success('删除成功'); | |||
setSelectedRows([]); | |||
return true; | |||
} else { | |||
message.success('删除失败'); | |||
return false; | |||
} | |||
}); | |||
} catch (error) { | |||
message.error('删除失败请重试!'); | |||
return false; | |||
} | |||
}; | |||
function handleTypeAdd(fields) { | |||
try { | |||
@@ -92,9 +116,9 @@ const PageIndex = (props) => { | |||
</a>, | |||
<a | |||
key="primary" | |||
onClick={() => { | |||
onClick={async () => { | |||
record.status = record.status == 0 ? 1 : 0; | |||
editPracticeType(record); | |||
await handleTypeUpdate(record); | |||
}} | |||
> | |||
{' '} | |||
@@ -106,49 +130,63 @@ const PageIndex = (props) => { | |||
]; | |||
return ( | |||
<PageContainer> | |||
<ProTable | |||
actionRef={actionRef} | |||
rowKey="id" | |||
search={{ | |||
labelWidth: 120, | |||
}} | |||
toolBarRender={() => [ | |||
<Button | |||
type="primary" | |||
key="primary" | |||
onClick={() => { | |||
handleTypeModalVisible(true); | |||
}} | |||
> | |||
<PlusOutlined /> 添加 | |||
</Button> | |||
]} | |||
request={async (params) => { | |||
var datas = []; | |||
var total = 0; | |||
await getPracticeType(params).then((r) => { | |||
// setAllTypeList(r.data.data); | |||
datas = r.data.data; | |||
total = r.data.total; | |||
}); | |||
return { | |||
data: datas, | |||
success: true, | |||
total: total, | |||
}; | |||
}} | |||
modalVisible={createTypeModalVisible} | |||
columns={PracticeTypecolumns} | |||
rowSelection={{ | |||
onChange: (_, selectedRows) => { | |||
setTypecurrentRow(selectedRows); | |||
}, | |||
}} | |||
/> | |||
<CreateTypeForm | |||
<PageContainer> | |||
<ProTable | |||
actionRef={actionRef} | |||
rowKey="id" | |||
search={{ | |||
labelWidth: 120, | |||
}} | |||
toolBarRender={() => [ | |||
<Button | |||
type="primary" | |||
key="primary" | |||
onClick={() => { | |||
setTypecurrentRow({ | |||
id: '', | |||
typeName: '' | |||
}); | |||
handleTypeModalVisible(true); | |||
}} | |||
> | |||
<PlusOutlined /> 添加 | |||
</Button>, | |||
<Button | |||
type="primary" | |||
key="primary" | |||
onClick={ async () => { | |||
await handleRemove(); | |||
actionRef.current.reload(); | |||
}} | |||
> | |||
删除 | |||
</Button>, | |||
]} | |||
request={async (params) => { | |||
var datas = []; | |||
var total = 0; | |||
await getPracticeType(params).then((r) => { | |||
// setAllTypeList(r.data.data); | |||
datas = r.data.data; | |||
total = r.data.total; | |||
}); | |||
return { | |||
data: datas, | |||
success: true, | |||
total: total, | |||
}; | |||
}} | |||
modalVisible={createTypeModalVisible} | |||
columns={PracticeTypecolumns} | |||
rowSelection={{ | |||
onChange: (_, selectedRows) => { | |||
setSelectedRows(selectedRows); | |||
}, | |||
}} | |||
/> | |||
<CreateTypeForm | |||
onFinish={async (value) => { | |||
debugger; | |||
var success = false; | |||
if (value.id) { | |||
success = handleTypeUpdate(value); | |||
@@ -173,7 +211,7 @@ const PageIndex = (props) => { | |||
> | |||
</CreateTypeForm> | |||
</PageContainer> | |||
</PageContainer> | |||
); | |||
}; | |||
@@ -12,6 +12,13 @@ export async function addPracticeType(data) { | |||
}); | |||
} | |||
export async function removePracticeType(ids) { | |||
return request(`/kitchen/api/goodspracticetype/remove`, { | |||
method: 'POST', | |||
data: ids, | |||
}); | |||
} | |||
/** | |||
@@ -24,7 +24,7 @@ const CreateForm = (props) => { | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="code" label="商品编码" rules={[{ required: true }]}> | |||
<Form.Item name="code" label="商品编码" hidden={true} rules={[{ required: true }]}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="name" label="商品名称" rules={[{ required: true }]}> | |||
@@ -6,11 +6,11 @@ const CreateForm = (props) => { | |||
const [options, setoptions] = useState(); | |||
const couponType = async () => {}; | |||
const couponType = async () => { }; | |||
//初始化数据 | |||
useEffect(() => { | |||
const initcouponType = async (value) => {}; | |||
const initcouponType = async (value) => { }; | |||
initcouponType(); | |||
}, []); | |||
@@ -27,7 +27,7 @@ const CreateForm = (props) => { | |||
}, | |||
}, | |||
}; | |||
const onTimeTypeChange = (value) => {}; | |||
const onTimeTypeChange = (value) => { }; | |||
return ( | |||
<Modal | |||
@@ -65,13 +65,33 @@ const CreateForm = (props) => { | |||
<Input placeholder="请输入会员昵称" /> | |||
</Form.Item> | |||
<Form.Item name="phone" label="电话号码" | |||
rules= {[ { pattern: '^1[0-9]{10}$', message: '请输入正确的电话号码'} ]} | |||
rules={[{ required: true, pattern: '^1[0-9]{10}$', message: '请输入正确的电话号码' }]} | |||
> | |||
<Input placeholder="" disabled={props.platformType == 0 ? true : false} /> | |||
</Form.Item> | |||
<Form.Item | |||
noStyle | |||
shouldUpdate={(prevValues, currentValues) => prevValues.platformType !== currentValues.platformType} | |||
> | |||
{({ getFieldValue }) => | |||
!getFieldValue('id') ? ( | |||
<Form.Item name="platformType" disabled={true} label="平台" rules={[{ required: true }]} > | |||
<Select style={{ width: 120 }} > | |||
<Option value="1" disabled>微信</Option> | |||
<Option value="2" disabled>支付宝</Option> | |||
<Option value="3">POS</Option> | |||
<Option value="4">储值卡</Option> | |||
</Select> | |||
</Form.Item> | |||
) : null | |||
} | |||
</Form.Item> | |||
<Form.Item name="headImgUrl" label="头像" rules={[{ max: 500 }]}> | |||
<Input placeholder="请输入会员昵称" /> | |||
</Form.Item> | |||
<Form.Item style={{ height: 32 }}> | |||
<Form.Item name="birthday" label="出生日期" style={{ float: 'left', marginLeft: 40 }}> | |||
<DatePicker /> | |||
@@ -99,14 +119,14 @@ const CreateForm = (props) => { | |||
</Form.Item> | |||
<Form.Item label="地区" style={{ height: 32 }}> | |||
<Form.Item name="province" style={{ float: 'left' }}> | |||
<Input style={{width:'150px'}} placeholder="请输入省" /> | |||
<Input style={{ width: '150px' }} placeholder="请输入省" /> | |||
</Form.Item> | |||
<Form.Item name="city" style={{ float: 'left', marginLeft: 10 }}> | |||
<Input style={{width:'150px'}} placeholder="请输入市" /> | |||
<Input style={{ width: '150px' }} placeholder="请输入市" /> | |||
</Form.Item> | |||
<Form.Item name="county" style={{ float: 'left', marginLeft: 10 }}> | |||
<Input style={{width:'150px'}} placeholder="请输入县(区)" /> | |||
<Input style={{ width: '150px' }} placeholder="请输入县(区)" /> | |||
</Form.Item> | |||
</Form.Item> | |||
@@ -125,7 +145,7 @@ const CreateForm = (props) => { | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit" style={{ float: 'right' }}> | |||
<Button disabled={props.isLook} type="primary" htmlType="submit" style={{ float: 'right' }}> | |||
保存 | |||
</Button> | |||
</Form.Item> | |||
@@ -13,7 +13,9 @@ import { | |||
GetMemberTagAndInfo, | |||
UpdateMemberTag, | |||
SyncMember, | |||
GetPlatformMemberList | |||
GetPlatformMemberList, | |||
post, | |||
CreateMemberInfo | |||
} from './service'; | |||
import { get, set } from 'lodash-es'; | |||
@@ -39,7 +41,7 @@ const MemberManage = () => { | |||
const [memberTagAndInfo, SetMemberTagAndInfo] = useState([]); | |||
//选中的标签 | |||
const [checkedTagList, setCheckedTagList] = React.useState(); | |||
const [isLook, setIsLook] = useState(false); | |||
const PlatformMemberList = async (memberId) => { | |||
@@ -48,6 +50,27 @@ const MemberManage = () => { | |||
}); | |||
} | |||
//添加会员信息 | |||
const AddMemberInfo = async (fields) => { | |||
message.loading('正在添加...', key); | |||
try { | |||
await CreateMemberInfo(JSON.stringify(fields)).then((r) => { | |||
message.destroy(key); | |||
if (r.data) { | |||
message.success('添加成功'); | |||
} else { | |||
message.error('添加失败'); | |||
} | |||
}); | |||
//刷新数据 | |||
actionRef.current.reload(); | |||
return true; | |||
} catch (error) { | |||
message.destroy(key); | |||
message.error('添加失败请重试!'); | |||
return false; | |||
} | |||
}; | |||
//修改会员信息 | |||
const updateMemberInfo = async (fields) => { | |||
@@ -220,6 +243,20 @@ const MemberManage = () => { | |||
valueType: 'option', | |||
render: (_, record) => { | |||
let template = [ | |||
<a | |||
key="primary" | |||
type="primary" | |||
onClick={() => { | |||
SetCreateModalVisible(true); | |||
setCurrentRow(() => { | |||
record.birthday = moment(record.birthday); | |||
setIsLook(true); | |||
return record; | |||
}); | |||
}} | |||
> | |||
详情 | |||
</a>, | |||
<a | |||
key="primary" | |||
type="primary" | |||
@@ -227,6 +264,7 @@ const MemberManage = () => { | |||
SetCreateModalVisible(true); | |||
setCurrentRow(() => { | |||
record.birthday = moment(record.birthday); | |||
setIsLook(false); | |||
return record; | |||
}); | |||
}} | |||
@@ -292,6 +330,8 @@ const MemberManage = () => { | |||
valueEnum: { | |||
1: { text: '微信' }, | |||
2: { text: '支付宝' }, | |||
3: { text: 'POS' }, | |||
4: { text: '储值卡' }, | |||
}, | |||
}, | |||
{ | |||
@@ -418,12 +458,15 @@ const MemberManage = () => { | |||
type="primary" | |||
key="primary" | |||
onClick={() => { | |||
SyncMember(1).then((r) => { | |||
message.success('启动同步,稍后请刷新页面'); | |||
}); | |||
// SyncMember(1).then((r) => { | |||
// message.success('启动同步,稍后请刷新页面'); | |||
// }); | |||
setIsLook(false); | |||
setCurrentRow({}); | |||
SetCreateModalVisible(true); | |||
}} | |||
> | |||
<PlusOutlined /> 同步会员 | |||
<PlusOutlined /> 添加会员 | |||
</Button>, | |||
]} | |||
expandable={{ expandedRowRender }} | |||
@@ -445,14 +488,14 @@ const MemberManage = () => { | |||
{/* 修改会员 */} | |||
<CreateForm | |||
isLook={isLook} | |||
onFinish={async (value) => { | |||
var success = false; | |||
value.MemberInfo_Id = value.id; | |||
if (value.id) { | |||
if (value.platformType == 0) { | |||
value.MemberInfo_Id = value.id; | |||
} | |||
success = updateMemberInfo(value); | |||
} else { | |||
success = AddMemberInfo(value); | |||
} | |||
if (success) { | |||
SetCreateModalVisible(false); | |||
@@ -22,6 +22,7 @@ export function UpdateMemberStatus(data) { | |||
}); | |||
} | |||
//获取会员标签 和绑定详情 | |||
export function GetMemberTagAndInfo(memberinfoid, platformtype) { | |||
return request(`/kitchen/api/member/member-tag-and-info/${memberinfoid}/${platformtype}`, { | |||
@@ -37,6 +38,14 @@ export function UpdateMemberInfo(data) { | |||
}); | |||
} | |||
//添加会员 | |||
export function CreateMemberInfo(data) { | |||
return request(`/kitchen/api/member/member`, { | |||
method: 'post', | |||
data: data, | |||
}); | |||
} | |||
//修改会员标签 | |||
export function UpdateMemberTag(data) { | |||
return request(`/kitchen/api/member/member-tag`, { | |||
@@ -25,8 +25,6 @@ const handlerefund = async (value) => { | |||
const Manage = () => { | |||
const [row, setRow] = useState(); | |||
const [createModalVisible, handleModalVisible] = useState(false); | |||
//获取店铺分类(店铺类型) | |||
const [srdTypeList, setsrdTypeList] = useState([]); | |||
//获取店铺(店铺信息) | |||
const [srdList, setsrdList] = useState([]); | |||
const [dataList, setdataList] = useState([]); | |||
@@ -35,28 +33,6 @@ const Manage = () => { | |||
const [Selectparams, setparams] = useState([]); | |||
// 获取店铺分类、商品名称信息 | |||
useEffect(() => { | |||
// //加盟商 | |||
// function initfranchList() { | |||
// api.franchList({ current: 1, pageSize: 20, status: '0' }).then((r) => { | |||
// var arr2 = r.data.data; | |||
// arr2.forEach((element) => { | |||
// element.text = element.name; | |||
// element.franchiseeId = element.id; | |||
// }); | |||
// setfranchList(arr2); | |||
// }); | |||
// } | |||
//店铺分类(店铺类型) | |||
function initsrdTypeList() { | |||
api.srdTypeList().then((r) => { | |||
var arr = r.data; | |||
arr?.forEach((element) => { | |||
element.storeTypeId = element.id; | |||
element.text = element.name; | |||
}); | |||
setsrdTypeList(arr); | |||
}); | |||
} | |||
//店铺名称(店铺信息) | |||
function initsrdList() { | |||
api.srdList().then((r) => { | |||
@@ -68,35 +44,8 @@ const Manage = () => { | |||
setsrdList(arr); | |||
}); | |||
} | |||
//商品信息 | |||
function initgoodsList() { | |||
api.goodsList().then((r) => { | |||
var arr1 = r.data; | |||
arr1.forEach((element) => { | |||
element.label = element.name; | |||
element.value = element.id; | |||
}); | |||
console.log('获取下拉数据', arr1); | |||
setgoodList(arr1); | |||
}); | |||
} | |||
//查询商品类型 | |||
function initgoodsTypeList() { | |||
api.goodsTypeList().then((r) => { | |||
var arr2 = r.data; | |||
arr2.forEach((element) => { | |||
element.label = element.name; | |||
element.value = element.id; | |||
}); | |||
setgoodsTypeList(arr2); | |||
}); | |||
} | |||
//initfranchList(); | |||
initsrdList(); | |||
initsrdTypeList(); | |||
// initgoodsList(); | |||
// initgoodsTypeList(); | |||
}, []); | |||
/**导出 */ | |||
function handleExport() { | |||
@@ -139,13 +88,6 @@ const Manage = () => { | |||
dataIndex: 'Customer_Tel', | |||
hideInTable: true, | |||
}, | |||
{ | |||
title: '店铺分类', | |||
dataIndex: 'storeTypeId', | |||
hideInTable: true, | |||
valueType: 'select', | |||
valueEnum: srdTypeList, | |||
}, | |||
{ | |||
title: '店铺名称', | |||
dataIndex: 'storeId', | |||
@@ -162,43 +104,10 @@ const Manage = () => { | |||
/> | |||
), | |||
}, | |||
{ | |||
title: '订单状态', | |||
dataIndex: 'status', | |||
hideInTable: true, | |||
valueType: 'select', | |||
renderFormItem: () => ( | |||
<Select mode="multiple" showArrow placeholder="订单状态" style={{ width: '100%' }}> | |||
<Option key={2}>支付成功</Option> | |||
<Option key={3}>等待制作</Option> | |||
<Option key={4}>制作中</Option> | |||
<Option key={5}>制作完成待取餐</Option> | |||
<Option key={6}>取餐完成</Option> | |||
<Option key={7}>受保护订单</Option> | |||
<Option key={8}>无主状态</Option> | |||
<Option key={9}>立即吃面</Option> | |||
<Option key={10}>无效订单</Option> | |||
<Option key={11}>废弃订单</Option> | |||
<Option key={20}>退款订单</Option> | |||
<Option key={21}>订单不可做</Option> | |||
</Select> | |||
), | |||
}, | |||
{ | |||
title: '交易单号', | |||
dataIndex: 'order_Number', | |||
hideInSearch: true, | |||
// renderText: (dom, entity) => { | |||
// return <a onClick={() => | |||
// setRow(entity), | |||
// handleModalVisible(true) | |||
// }>{dom}</a>; | |||
// }, | |||
}, | |||
{ | |||
title: '店铺分类', | |||
dataIndex: 'storeTypeName', | |||
hideInSearch: true, | |||
}, | |||
{ | |||
@@ -323,7 +232,7 @@ const Manage = () => { | |||
<ProTable | |||
headerTitle="订单流水" | |||
actionRef={actionRef} | |||
rowKey="id" | |||
rowKey="orderFlowId" | |||
search={{ | |||
labelWidth: 120, | |||
}} | |||
@@ -123,16 +123,6 @@ const OrderflowDetail = (props) => { | |||
}; | |||
}} | |||
columns={[ | |||
{ | |||
title: '店铺分类', | |||
key: 'storeTypeName', | |||
dataIndex: 'storeTypeName', | |||
}, | |||
{ | |||
title: '店铺名称', | |||
key: 'storeName', | |||
dataIndex: 'storeName', | |||
}, | |||
{ | |||
title: '商品分类', | |||
key: 'goodsTypeName', | |||
@@ -160,38 +150,6 @@ const OrderflowDetail = (props) => { | |||
moneySymbol: '¥', | |||
}, | |||
}, | |||
{ | |||
title: '子订单状态', | |||
dataIndex: 'cookingStatus', | |||
key: 'cookingStatus', | |||
hideInSearch: true, | |||
valueEnum: { | |||
0: { | |||
text: '等待制作', | |||
status: 'Success', | |||
}, | |||
1: { | |||
text: '制作中', | |||
status: 'Success', | |||
}, | |||
2: { | |||
text: '等待取餐', | |||
status: 'Success', | |||
}, | |||
3: { | |||
text: '取餐完成', | |||
status: 'Processing', | |||
}, | |||
99998: { | |||
text: '正常订单', | |||
status: 'Default', | |||
}, | |||
99999: { | |||
text: '异常订单', | |||
status: 'Default', | |||
}, | |||
}, | |||
}, | |||
{ | |||
title: '操作', | |||
dataIndex: 'option', | |||
@@ -115,7 +115,11 @@ export default function Index() { | |||
//获取营销报表列表 | |||
const onQueryMarketing = async () => { | |||
setShowLoading(true); | |||
const response = await reportAPI.getReportStatisticsMarketing(); | |||
const response = await reportAPI.getReportStatisticsMarketing({ | |||
sTime: timeRange[0]._i, | |||
eTime: timeRange[1]._i, | |||
key: [currentOrg.key || ""] | |||
}); | |||
setShowLoading(false); | |||
if (response.statusCode === 200) { | |||
setReportActivity(response.data.activity); | |||
@@ -126,7 +130,7 @@ export default function Index() { | |||
} | |||
//生成营销报表活动信息柱状图 | |||
const initActivityEcharts = () => { | |||
const initActivityEcharts = () => { | |||
const chartDom = document.getElementById('activity-echarts'); | |||
activityEcharts = echarts.init(chartDom); | |||
const xAxisData = []; | |||
@@ -9,9 +9,12 @@ export default { | |||
}, | |||
//获取营销报表 | |||
getReportStatisticsMarketing() { | |||
getReportStatisticsMarketing(params) { | |||
return request(`/kitchen/api/report-statistics/marketing`, { | |||
method: 'POST', | |||
data: { | |||
...params | |||
} | |||
}); | |||
} | |||
}; |
@@ -1,12 +1,13 @@ | |||
import { DropboxOutlined, PlusOutlined, DownloadOutlined } from '@ant-design/icons'; | |||
import { Button, message, Select, Input, Drawer } from 'antd'; | |||
import { Button, message, Select, Input, Drawer,TreeSelect } from 'antd'; | |||
import React, { useState, useRef, useEffect } from 'react'; | |||
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import ProDescriptions from '@ant-design/pro-descriptions'; | |||
import ExportJsonExcel from 'js-export-excel'; | |||
import api from './service'; | |||
import { gettree } from '../../sys/org/service'; | |||
import moment from 'moment'; | |||
//页面 相当于 class | |||
const Manage = () => { | |||
//获取店铺类型(店铺类型) | |||
@@ -22,19 +23,44 @@ const Manage = () => { | |||
const [dataList, setdataList] = useState([]); | |||
//绑定 | |||
const actionRef = useRef(); | |||
const [OrgList, setOrgList] = useState([]); | |||
const [OrgListArray, setOrgListArray] = useState([]); | |||
// 获取店铺分类、商品名称信息 | |||
useEffect(() => { | |||
// //加盟商 | |||
// function initfranchList() { | |||
// api.franchList({ current: 1, pageSize: 20, status: '0' }).then((r) => { | |||
// var arr2 = r.data.data; | |||
// arr2.forEach((element) => { | |||
// element.text = element.name; | |||
// element.franchiseeId = element.id; | |||
// }); | |||
// setfranchList(arr2); | |||
// }); | |||
// } | |||
function initOrgList() { | |||
gettree().then((r) => { | |||
inittree(r.data); | |||
function inittree(datas) { | |||
for (var i in datas) { | |||
if( datas[i]['type']==2|| datas[i]['type']==3){ | |||
datas[i]['disabled']=false; | |||
}else{ | |||
datas[i]['disabled']=true; | |||
} | |||
if (datas[i].children) { | |||
inittree(datas[i].children); | |||
} | |||
} | |||
} | |||
setOrgList(r.data); | |||
let list = {}; | |||
formateData(r.data); | |||
function formateData(datas) { | |||
for (var i in datas) { | |||
list[datas[i]['disabled']]=true; | |||
list[datas[i]['value']] = { text: datas[i]['title'] }; | |||
if (datas[i].children) { | |||
formateData(datas[i].children); | |||
} | |||
} | |||
} | |||
setOrgListArray(list); | |||
}); | |||
} | |||
//店铺分类(店铺类型) | |||
function initsrdTypeList() { | |||
api.srdTypeList().then((r) => { | |||
@@ -85,13 +111,15 @@ const Manage = () => { | |||
initsrdTypeList(); | |||
initgoodsList(); | |||
initgoodsTypeList(); | |||
initOrgList(); | |||
}, []); | |||
function handleExport() { | |||
const { ReqDetailList } = dataList; // 网络请求命名空间 | |||
const option = {}; | |||
var Excelcolumns = []; | |||
//debugger | |||
columns.map((item, index) => { | |||
if (index > 5) { | |||
if (index > 2) { | |||
Excelcolumns.push(item); | |||
} | |||
}); | |||
@@ -101,7 +129,7 @@ const Manage = () => { | |||
sheetData: dataList.map((item) => { | |||
const result = {}; | |||
columns.forEach((c, index) => { | |||
if (index > 5) { | |||
if (index > 2) { | |||
result[c.dataIndex] = item[c.dataIndex]; | |||
} | |||
}); | |||
@@ -110,7 +138,7 @@ const Manage = () => { | |||
sheetName: '订单汇总', // Excel文件名称 | |||
sheetFilter: Excelcolumns.map((item) => item.dataIndex), | |||
sheetHeader: Excelcolumns.map((item) => item.title), | |||
columnWidths: Excelcolumns.map(() => 10), | |||
columnWidths: Excelcolumns.map(() => 9), | |||
}, | |||
]; | |||
@@ -127,203 +155,70 @@ const Manage = () => { | |||
hideInSearch: true, | |||
hideInTable: true, | |||
}, | |||
// { | |||
// title: '加盟商', | |||
// dataIndex: 'franchiseeId', | |||
// hideInTable: true, | |||
// valueType: 'select', | |||
// valueEnum: franchList, | |||
// }, | |||
// { | |||
// title: '加盟商', | |||
// dataIndex: 'franchiseeName', | |||
// hideInSearch: true, | |||
// }, | |||
{ | |||
title: '店铺分类', | |||
dataIndex: 'storeTypeId', | |||
hideInTable: true, | |||
valueType: 'select', | |||
valueEnum: srdTypeList, | |||
fixed: 'left', | |||
width: 120, | |||
}, | |||
{ | |||
title: '订单时间', | |||
dataIndex: 'order_CreateTime', | |||
valueType: 'dateRange', | |||
width: 120, | |||
hideInTable: true, | |||
search: { | |||
transform: (value) => { | |||
return { | |||
order_CreateTime: value[0], | |||
order_EndTime: value[1], | |||
}; | |||
}, | |||
}, | |||
}, | |||
{ | |||
title: '店铺名称', | |||
dataIndex: 'storeId', | |||
hideInTable: true, | |||
fixed: 'left', | |||
width: 120, | |||
renderFormItem: () => ( | |||
<Select | |||
mode="multiple" | |||
showArrow | |||
placeholder="请选择店铺" | |||
style={{ width: '100%' }} | |||
options={srdList} | |||
/> | |||
), | |||
}, | |||
{ | |||
title: '商品类型', | |||
dataIndex: 'goodsTypeId', | |||
hideInTable: true, | |||
valueType: 'select', | |||
fixed: 'left', | |||
width: 120, | |||
renderFormItem: () => ( | |||
<Select | |||
mode="multiple" | |||
showArrow | |||
placeholder="请选择商品类型" | |||
style={{ width: '100%' }} | |||
options={goodsTypeList} | |||
/> | |||
<TreeSelect | |||
style={{ width: '100%' }} | |||
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }} | |||
treeData={OrgList} | |||
placeholder="归属门店" | |||
treeDefaultExpandAll | |||
/> | |||
), | |||
}, | |||
{ | |||
title: '商品名称', | |||
dataIndex: 'goodsId', | |||
title: '日期范围', | |||
dataIndex: 'startTime', | |||
valueType: 'dateRange', | |||
hideInTable: true, | |||
valueType: 'select', | |||
fixed: 'left', | |||
width: 120, | |||
renderFormItem: () => ( | |||
<Select | |||
mode="multiple" | |||
showArrow | |||
optionFilterProp="label" | |||
placeholder="请选择商品" | |||
style={{ width: '100%' }} | |||
options={goodList} | |||
/> | |||
), | |||
initialValue: [], | |||
}, | |||
{ | |||
title: '店铺分类', | |||
dataIndex: 'storeTypeName', | |||
hideInSearch: true, | |||
fixed: 'left', | |||
width: 120, | |||
}, | |||
{ | |||
title: '店铺名称', | |||
dataIndex: 'storeName', | |||
hideInSearch: true, | |||
fixed: 'left', | |||
width: 120, | |||
}, | |||
{ | |||
title: '商品类型', | |||
dataIndex: 'goodsTypeName', | |||
hideInSearch: true, | |||
fixed: 'left', | |||
width: 120, | |||
}, | |||
{ | |||
title: '商品名称', | |||
dataIndex: 'goodsName', | |||
hideInSearch: true, | |||
fixed: 'left', | |||
width: 120, | |||
}, | |||
{ | |||
title: '应付款金额', | |||
dataIndex: 'order_OriginalMoney', | |||
dataIndex: 'orderOriginalMoney', | |||
renderText: (val) => `${val}¥`, | |||
hideInSearch: true, | |||
fixed: 'left', | |||
width: 160, | |||
}, | |||
{ | |||
title: '实际付款金额', | |||
dataIndex: 'order_RealMoney', | |||
dataIndex: 'orderRealMoney', | |||
hideInSearch: true, | |||
renderText: (val) => `${val}¥`, | |||
fixed: 'left', | |||
width: 160, | |||
}, | |||
{ | |||
title: '退款金额', | |||
dataIndex: 'refundMoney', | |||
dataIndex: 'refundRealMoney', | |||
hideInSearch: true, | |||
renderText: (val) => `${val}¥`, | |||
fixed: 'left', | |||
width: 120, | |||
}, | |||
{ | |||
title: '总订单', | |||
dataIndex: 'sumOrder', | |||
hideInSearch: true, | |||
fixed: 'left', | |||
width: 120, | |||
}, | |||
{ | |||
title: '下单总碗数(碗)', | |||
dataIndex: 'countDetail', | |||
hideInSearch: true, | |||
fixed: 'left', | |||
width: 160, | |||
}, | |||
{ | |||
title: '退款订单', | |||
dataIndex: 'refund', | |||
hideInSearch: true, | |||
fixed: 'left', | |||
width: 120, | |||
}, | |||
{ | |||
title: '退款碗数(碗)', | |||
dataIndex: 'refundNum', | |||
title: '正常订单', | |||
dataIndex: 'successfulCount', | |||
hideInSearch: true, | |||
fixed: 'left', | |||
width: 120, | |||
}, | |||
{ | |||
title: '正常订单(碗)', | |||
dataIndex: 'orderNum', | |||
hideInSearch: true, | |||
width: 120, | |||
}, | |||
{ | |||
title: '盲盒订单(碗)', | |||
dataIndex: 'boxNum', | |||
hideInSearch: true, | |||
width: 120, | |||
}, | |||
{ | |||
title: '立即吃面订单(碗)', | |||
dataIndex: 'nowNum', | |||
hideInSearch: true, | |||
width: 160, | |||
}, | |||
{ | |||
title: '废弃订单(碗)', | |||
dataIndex: 'abandoned', | |||
hideInSearch: true, | |||
width: 120, | |||
}, | |||
{ | |||
title: '下单总人数', | |||
dataIndex: 'customer', | |||
title: '退款订单', | |||
dataIndex: 'refundCount', | |||
hideInSearch: true, | |||
width: 120, | |||
}, | |||
@@ -349,29 +244,20 @@ const Manage = () => { | |||
request={async (params, sorter, filter) => { | |||
var orderSummayData = []; | |||
var total = 0; | |||
// if (params.franchiseeId != null) { | |||
// //加盟商 | |||
// params.franchiseeId = franchList[params.franchiseeId].franchiseeId; | |||
// } | |||
if (params.storeTypeId != undefined) { | |||
//店铺分类 | |||
params.storeTypeId = srdTypeList[params.storeTypeId].storeTypeId; | |||
} | |||
// if (params.storeId != undefined) { | |||
// //店铺名称 | |||
// params.storeId = srdList[params.storeId].storeId; | |||
// } | |||
// if (params.goodsId != undefined) { | |||
// //商品名称 | |||
// params.goodsId = goodList[params.goodsId].goodsId; | |||
// } | |||
// if (params.goodsTypeId) { | |||
// //商品类型 | |||
// params.goodsTypeId = goodsTypeList[params.goodsTypeId].goodsTypeId; | |||
// } | |||
// 表单搜索项会从 params 传入,传递给后端接口。 | |||
//const msg = await api.orderSummaryList(params); | |||
await api.orderSummaryList(params).then((r) => { | |||
var obj= | |||
{ | |||
current:params.current, | |||
pageSize:params.pageSize, | |||
storeId:[params.storeId], | |||
Order_CreateTime:params.startTime[0], | |||
Order_EndTime:params.startTime[1] | |||
} | |||
await api.orderSummaryList(obj).then((r) => { | |||
orderSummayData = r.data.data; | |||
total = r.data.total; | |||
setdataList(r.data.data); | |||
@@ -38,12 +38,13 @@ const CreateForm = (props) => { | |||
<ProForm | |||
layout="Horizontal" | |||
onValuesChange={(_, values) => { | |||
}} | |||
onFinish={async (value) => props.onFinish(value)}> | |||
<ProFormGroup > | |||
<ProFormDigitRange label="桌号范围" placeholder="请输入桌号范围" name="numbers" min={1} rules={[{ required: true }]}/> | |||
<ProFormSelect label="排除桌号" mode="tags" placeholder="请输入排除的桌号" name="excludeNumber" width="md" /> | |||
<ProFormText name="code" label="桌台码前缀" placeholder="请输入桌台码前缀" rules={[{ max: 2 }]} /> | |||
<ProFormSelect label="适用店铺" mode="multiple" placeholder="请选择店铺" name="storeIds" width="md" valueEnum={props.storeInfoList}/> | |||
</ProFormGroup> | |||
</ProForm> | |||
@@ -31,13 +31,13 @@ const storeDesktopNumber = () => { | |||
}, []) | |||
const showQRCode = (record, store) => { | |||
const showQRCode = (record) => { | |||
var config = { | |||
title: `${store.name} ${record.number}号桌`, | |||
title: `${record.storeName} ${record.desktopNumber}号桌`, | |||
okText: '下载', | |||
cancelText: '取消', | |||
onOk() { | |||
changeCanvasToPic(`${store.name} ${record.number}号桌`); | |||
changeCanvasToPic(`${record.storeName} ${record.desktopNumber}号桌`); | |||
}, | |||
content: ( | |||
// <QRCode | |||
@@ -50,13 +50,13 @@ const storeDesktopNumber = () => { | |||
<Card | |||
style={{ width: 300, height: 450, backgroundImage: 'url(http://bpic.588ku.com/back_pic/05/42/90/125a6c515c035ab.jpg%21r650/fw/800)', backgroundSize: 'cover' }} | |||
title={(<h2 style={{ fontWeight: 600 }}>{`${store.name}`}</h2>)} | |||
title={(<h2 style={{ fontWeight: 600 }}>{`${record.storeName}`}</h2>)} | |||
headStyle={{ border: '0px', textAlign: 'center' }} | |||
cover={ | |||
<QRCode | |||
id="qrCode" | |||
// value={`https://www.black-pa.com:5500?number=${number}`} | |||
value={`${record.host}?storeId=${store.id}&number=${record.number}`} | |||
value={`${record.host}?storeId=${record.storeId}&number=${record.desktopNumber}`} | |||
size={174} // 二维码的大小 | |||
fgColor="#000000" // 二维码的颜色 | |||
style={{ margin: 'auto', marginTop: '60px' }} | |||
@@ -64,7 +64,7 @@ const storeDesktopNumber = () => { | |||
/> | |||
}> | |||
<div style={{ textAlign: 'center' }}> | |||
<h2 style={{ fontWeight: 600 }}>{`${record.number}号桌`}</h2> | |||
<h2 style={{ fontWeight: 600 }}>{`${record.desktopNumber}号桌`}</h2> | |||
</div> | |||
</Card> | |||
), | |||
@@ -96,7 +96,7 @@ const storeDesktopNumber = () => { | |||
}, | |||
{ | |||
title: '桌号', | |||
dataIndex: 'number', | |||
dataIndex: 'desktopNumber', | |||
align: 'center', | |||
search: false, | |||
render: item => ( | |||
@@ -110,19 +110,16 @@ const storeDesktopNumber = () => { | |||
{ | |||
title: '适用店铺', | |||
align: 'center', | |||
dataIndex: 'storeList', | |||
search: false, | |||
render: tags => ( | |||
<> | |||
{tags.map(tag => { | |||
return ( | |||
<Tag color={'green'} key={tag.id}> | |||
{tag.name} | |||
</Tag> | |||
); | |||
})} | |||
</> | |||
), | |||
dataIndex: 'storeName', | |||
// render: tags => ( | |||
// <> | |||
// {return ( | |||
// <Tag color={'green'} key={tag.storeId}> | |||
// {tag.storeName} | |||
// </Tag> | |||
// );} | |||
// </> | |||
// ), | |||
}, { | |||
title: '创建时间', | |||
dataIndex: 'createAt', | |||
@@ -133,9 +130,8 @@ const storeDesktopNumber = () => { | |||
dataIndex: 'option', | |||
valueType: 'option', | |||
render: (_, record) => [ | |||
record.storeList.map(item => { | |||
return (<a onClick={() => { showQRCode(record, item) }} type="link">{item.name}</a>); | |||
}), <a onClick={() => { | |||
<a onClick={() => { showQRCode(record) }} type="link">{record.storeName}</a>, | |||
<a onClick={() => { | |||
DeleteDesktopNumber([record.id]).then((r) => { | |||
if (r.data) { | |||
message.success('删除成功'); | |||
@@ -1,25 +1,24 @@ | |||
import React, { useState, useEffect } from 'react'; | |||
import { Modal, Form, Input, Button, Select, InputNumber,message } from 'antd'; | |||
import { getGoods } from '../services'; | |||
import { Modal, Form, Input, Button, Select, InputNumber, message } from 'antd'; | |||
import { getGoods, GetCokingWorkList } from '../services'; | |||
const CreateForm = (props) => { | |||
const { Option, OptGroup } = Select; | |||
const [CokingWorks, setCokingWorks] = useState([]); | |||
const [goods, setGoods] = useState([]); | |||
//初始化数据 | |||
useEffect(() => { | |||
const initGoods = () => { | |||
getGoods().then((data) => { | |||
let list = []; | |||
data.data?.data?.forEach((item) => { | |||
list.push({ | |||
text: item.name, | |||
id: item.id, | |||
}); | |||
}); | |||
setGoods(list); | |||
}); | |||
const initCokingWorks = () => { | |||
GetCokingWorkList().then(r => { | |||
var arr = []; | |||
for (var key in r.data) { | |||
arr.push(<Select.Option value={key}>{r.data[key]}</Select.Option>) | |||
} | |||
setCokingWorks(arr); | |||
}) | |||
}; | |||
initGoods(); | |||
initCokingWorks(); | |||
}, []); | |||
return ( | |||
@@ -43,23 +42,20 @@ const CreateForm = (props) => { | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
{/* <Form.Item label={'商品'} name="goods_Id" rules={[{ required: true }]}> | |||
<Select> | |||
{goods.map((item, index) => { | |||
return ( | |||
<Select.Option index={index} value={item.id} key={item.id}> | |||
{item.text} | |||
</Select.Option> | |||
); | |||
})} | |||
</Select> | |||
</Form.Item> */} | |||
<Form.Item label={'价格'} name="price" rules={[{ required: true }]}> | |||
<InputNumber placeholder="价格" min={0} /> | |||
</Form.Item> | |||
<Form.Item label={'价格'} name="vipPrice" rules={[{ required: true }]}> | |||
<Form.Item label={'会员价格'} name="vipPrice" rules={[{ required: true }]}> | |||
<InputNumber placeholder="价格" min={0} /> | |||
</Form.Item> | |||
<Form.Item label={'小炒工序'} name="cookingWorkId"> | |||
<Select | |||
style={{ width: '100%' }} | |||
placeholder="请选择小炒工序"> | |||
{CokingWorks} | |||
</Select> | |||
</Form.Item> | |||
<Form.Item label={'状态'} name="status" rules={[{ required: true }]}> | |||
<Select placeholder="状态"> | |||
<Option value={1}>下架</Option> | |||
@@ -3,7 +3,7 @@ import { Tabs, Card, Pagination, Table, message, Button, Popconfirm, Modal } fro | |||
const { TabPane } = Tabs; | |||
import React, { useState, useRef, useEffect } from 'react'; | |||
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; | |||
import { GetStoreInfoPage, GetStoreGoods, AddStoreGood, UpdateStoreGoods, DelStoreGoods, UpdateStoreGoodsStatusAsync, stopgoods,StoreGoodsAllUpdate } from "./services" | |||
import { GetStoreInfoPage, GetStoreGoods, GetCokingWorkList, AddStoreGood, UpdateStoreGoods, DelStoreGoods, UpdateStoreGoodsStatusAsync, stopgoods,StoreGoodsAllUpdate } from "./services" | |||
import ProTable from '@ant-design/pro-table'; | |||
import CreateForm from './components/CreateForm'; | |||
import LogForm from './components/Logs'; | |||
@@ -68,12 +68,23 @@ const storeGoodsInfo = (props) => { | |||
const [currentTabRow, setCurrentTabRow] = useState(); | |||
const actionRef = useRef(); | |||
const [logVisible, SetLogVisible] = useState(false); | |||
const [CokingWorks, setCokingWorks] = useState([]); | |||
useEffect(() => { | |||
getStoreInfoPageInfo(1); | |||
}, []) | |||
const [goods, setGoods] = useState([]); | |||
//初始化数据 | |||
useEffect(() => { | |||
const initCokingWorks = () => { | |||
GetCokingWorkList().then(r => { | |||
var arr = r.data; | |||
setCokingWorks(arr); | |||
}) | |||
}; | |||
initCokingWorks(); | |||
}, []); | |||
//添加 | |||
const handleAdd = async (fields) => { | |||
try { | |||
@@ -134,6 +145,11 @@ const storeGoodsInfo = (props) => { | |||
valueType: 'money', | |||
}, | |||
{ | |||
title: '小炒工序', | |||
dataIndex: 'cookingWorkId', | |||
valueEnum: CokingWorks, | |||
}, | |||
{ | |||
title: '是否设备制作', | |||
@@ -9,7 +9,9 @@ export async function GetStoreInfoPage(data) { | |||
// ...(options || {}), | |||
}); | |||
} | |||
export async function GetCokingWorkList(data) { | |||
return request(`/kitchen/api/select/GetCokingWorkList`); | |||
} | |||
/** 获取店铺上架商品 */ | |||
export async function GetStoreGoods(data) { | |||
return request(`/kitchen/api/Store/GetStoreGoods`, { | |||
@@ -0,0 +1,64 @@ | |||
import React, { useState, useEffect } from 'react'; | |||
import { Modal, Form, Input, Button, Select,TreeSelect } from 'antd'; | |||
const CreateForm = (props) => { | |||
const { Option, OptGroup } = Select; | |||
return ( | |||
<Modal | |||
title={props.values.id ? '编辑' : '新建'} | |||
width={640} | |||
visible={props.createModalVisible} | |||
bodyStyle={{ padding: '32px 40px 48px' }} | |||
footer={null} | |||
onCancel={() => { | |||
props.onCancel(); | |||
}} | |||
destroyOnClose | |||
> | |||
<Form | |||
preserve={false} | |||
initialValues={props.values} | |||
onFinish={props.onFinish} > | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item label={"名称"} name="name" rules={[{ required: true}]} > | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item label={"电话"} name="phone" rules={[{ required: true}]} > | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item label={"工号"} name="number" rules={[{ required: true}]} > | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="shopId" label="门店" rules={[{ required: true }]}> | |||
<TreeSelect | |||
style={{ width: '100%' }} | |||
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }} | |||
treeData={props.OrgData} | |||
placeholder="门店" | |||
treeDefaultExpandAll | |||
/> | |||
</Form.Item> | |||
<Form.Item name="status" label="状态" | |||
rules={[{ required: true, message: '请选择状态' }]} > | |||
<Select placeholder="请选择状态"> | |||
<OptGroup> | |||
<Select.Option value={0}>正常</Select.Option> | |||
<Select.Option value={1}>停用</Select.Option> | |||
<Select.Option value={2}>删除</Select.Option> | |||
</OptGroup> | |||
</Select> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
保存 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Modal> | |||
); | |||
}; | |||
export default CreateForm; |
@@ -0,0 +1,292 @@ | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import { Modal,Button, message, Input, Drawer } from 'antd'; | |||
import React, { useState, useRef,useEffect } from 'react'; | |||
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import QRCode from 'qrcode.react'; | |||
import ProDescriptions from '@ant-design/pro-descriptions'; | |||
import CreateForm from './components/CreateForm'; | |||
import { Getstorestaffpage, Addstorestaff, Updatestorestaff, Delstorestaff, } from "./services" | |||
import { gettree } from '../../sys/org/service'; | |||
const key = 'message'; | |||
//添加 | |||
const handleAdd = async (fields) => { | |||
try { | |||
message.loading('正在添加', key); | |||
await Addstorestaff(JSON.stringify(fields)).then((r) => { | |||
message.destroy(key); | |||
if (r.data) { | |||
message.success('添加成功'); | |||
return true; | |||
} else { | |||
message.error('添加失败'); | |||
return false; | |||
} | |||
}); | |||
} catch (error) { | |||
message.error('添加失败请重试!'); | |||
return false; | |||
} | |||
}; | |||
//修改 | |||
const handleUpdate = async (fields) => { | |||
try { | |||
message.loading('正在修改', key); | |||
message.destroy(key); | |||
await Updatestorestaff(JSON.stringify(fields)).then((r) => { | |||
message.destroy(key); | |||
if (r.data) { | |||
message.success('修改成功',); | |||
return true; | |||
} else { | |||
message.error('修改失败'); | |||
return false; | |||
} | |||
}); | |||
} catch (error) { | |||
message.error('修改失败请重试!'); | |||
return false; | |||
} | |||
}; | |||
//删除 | |||
const handleRemove = async (selectedRows) => { | |||
try { | |||
message.loading('正在删除'); | |||
let ids = []; | |||
selectedRows.forEach((item) => { | |||
ids.push(item.id); | |||
}); | |||
await Delstorestaff(ids).then((r) => { | |||
if (r.data) { | |||
message.success('删除成功'); | |||
return true; | |||
} else { | |||
message.error('删除失败'); | |||
return false; | |||
} | |||
}); | |||
} catch (error) { | |||
message.error('删除失败请重试!'); | |||
return false; | |||
} | |||
}; | |||
const GoodsTypeManage = () => { | |||
/** 新建/更新窗口的弹窗 */ | |||
const [createModalVisible, handleModalVisible] = useState(false); | |||
/** 分布更新窗口的弹窗 */ | |||
const [showDetail, setShowDetail] = useState(false); | |||
const actionRef = useRef(); | |||
const [currentRow, setCurrentRow] = useState(); | |||
const [selectedRowsState, setSelectedRows] = useState([]); | |||
const [OrgList, setOrgList] = useState([]); | |||
const [OrgListArray, setOrgListArray] = useState([]); | |||
/** 国际化配置 */ | |||
//初始化数据 | |||
useEffect(() => { | |||
function initOrgList() { | |||
gettree().then((r) => { | |||
inittree(r.data); | |||
function inittree(datas) { | |||
for (var i in datas) { | |||
if( datas[i]['type']==2|| datas[i]['type']==3){ | |||
datas[i]['disabled']=false; | |||
}else{ | |||
datas[i]['disabled']=true; | |||
} | |||
if (datas[i].children) { | |||
inittree(datas[i].children); | |||
} | |||
} | |||
} | |||
setOrgList(r.data); | |||
let list = {}; | |||
formateData(r.data); | |||
function formateData(datas) { | |||
for (var i in datas) { | |||
list[datas[i]['disabled']]=true; | |||
list[datas[i]['value']] = { text: datas[i]['title'] }; | |||
if (datas[i].children) { | |||
formateData(datas[i].children); | |||
} | |||
} | |||
} | |||
setOrgListArray(list); | |||
}); | |||
} | |||
initOrgList(); | |||
}, []); | |||
const columns = [ | |||
{ | |||
title: '主键', | |||
dataIndex: 'id', | |||
hideInSearch: true, | |||
hideInTable: true, | |||
tip: '规则名称是唯一的 key' | |||
}, | |||
{ | |||
title: '名称', | |||
dataIndex: 'name', | |||
valueType: 'textarea', | |||
search: false, | |||
}, | |||
{ | |||
title: '电话', | |||
dataIndex: 'phone', | |||
valueType: 'textarea', | |||
search: false, | |||
}, | |||
{ | |||
title: '职工编号', | |||
dataIndex: 'number', | |||
valueType: 'textarea', | |||
search: false, | |||
}, | |||
{ | |||
title: '归属门店', | |||
dataIndex: 'shopId', | |||
search: false, | |||
valueEnum: OrgListArray, | |||
}, | |||
{ | |||
title: '状态', | |||
dataIndex: 'status', | |||
hideInForm: true, | |||
search: false, | |||
valueEnum: { | |||
0: { text: '正常', status: 'Processing' }, | |||
1: { text: '停用', status: 'Success' }, | |||
2: { text: '删除', status: 'Error' }, | |||
}, | |||
}, | |||
{ | |||
title: '创建时间', | |||
dataIndex: 'createAt', | |||
hideInForm: true, | |||
search: false, | |||
}, | |||
{ | |||
title: '操作', | |||
dataIndex: 'option', | |||
valueType: 'option', | |||
render: (_, record) => [ | |||
<a | |||
key="config" | |||
onClick={() => { | |||
handleModalVisible(true); | |||
setCurrentRow(record); | |||
}} > 更新</a> | |||
], | |||
}, | |||
]; | |||
return ( | |||
<PageContainer> | |||
<ProTable | |||
headerTitle="店铺类型" | |||
actionRef={actionRef} | |||
rowKey="id" | |||
search={{ | |||
labelWidth: 120, | |||
}} | |||
toolBarRender={() => [ | |||
<Button | |||
type="primary" | |||
key="primary" | |||
onClick={() => { | |||
handleModalVisible(true); | |||
}} > | |||
<PlusOutlined /> 新建 | |||
</Button>, | |||
]} | |||
request={async (params) => { | |||
var data = []; | |||
var total = 0; | |||
await Getstorestaffpage(params).then((r) => { | |||
data = r.data.data; | |||
total = r.data.total; | |||
}); | |||
return { | |||
data: data, | |||
success: true, | |||
total: total, | |||
}; | |||
}} | |||
columns={columns} | |||
rowSelection={{ | |||
onChange: (_, selectedRows) => { | |||
setSelectedRows(selectedRows); | |||
}, | |||
}} | |||
/> | |||
{selectedRowsState?.length > 0 && ( | |||
<FooterToolbar | |||
extra={ | |||
<div> | |||
已选择{' '} | |||
<a | |||
style={{ | |||
fontWeight: 600, | |||
}} | |||
> | |||
{selectedRowsState.length} | |||
</a>{' '} | |||
项 | |||
{/* <span> | |||
服务调用次数总计 {selectedRowsState.reduce((pre, item) => pre + item.id, 0)} 万 | |||
</span> */} | |||
</div> | |||
} | |||
> | |||
<Button | |||
onClick={async () => { | |||
await handleRemove(selectedRowsState); | |||
setSelectedRows([]); | |||
actionRef.current?.reloadAndRest?.(); | |||
}} | |||
> | |||
删除 | |||
</Button> | |||
{/* <Button type="primary">批量审批</Button> */} | |||
</FooterToolbar> | |||
)} | |||
<CreateForm | |||
onFinish={async (value) => { | |||
var success = false; | |||
if (value.id) { | |||
success = handleUpdate(value); | |||
} else { | |||
success = handleAdd(value); | |||
} | |||
if (success) { | |||
handleModalVisible(false); | |||
setCurrentRow(undefined); | |||
actionRef.current.reload(); | |||
} | |||
}} | |||
onCancel={() => { | |||
handleModalVisible(false); | |||
setCurrentRow(undefined); | |||
}} | |||
createModalVisible={createModalVisible} | |||
OrgData={OrgList} | |||
values={currentRow || {}} | |||
/> | |||
</PageContainer> | |||
); | |||
}; | |||
export default GoodsTypeManage; |
@@ -0,0 +1,38 @@ | |||
import { request } from 'umi'; | |||
/** 获取 */ | |||
export async function Getstorestaffpage(data) { | |||
return request(`/kitchen/api/store-staff/store-staff-page`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
} | |||
/** 新增 */ | |||
export async function Addstorestaff(data) { | |||
return request(`/kitchen/api/store-staff/store-staff`, { | |||
method: 'POST', | |||
data: data, | |||
}); | |||
} | |||
/** 修改 */ | |||
export async function Updatestorestaff(data) { | |||
return request(`/kitchen/api/store-staff/store-staff`, { | |||
method: 'put', | |||
data: data, | |||
// params: { ...params }, | |||
// ...(options || {}), | |||
}); | |||
} | |||
/** 删除 */ | |||
export async function Delstorestaff(data) { | |||
return request(`/kitchen/api/store-staff/del-store-staff`, { | |||
method: 'POST', | |||
data: data, | |||
// params: { ...params }, | |||
// ...(options || {}), | |||
}); | |||
} |
@@ -59,23 +59,38 @@ const CreateForm = (props) => { | |||
</OptGroup> | |||
</Select> | |||
</Form.Item> | |||
<Form.Item label={'店铺地址'} name="store_Addr" rules={[{ required: true,max:100 }]}> | |||
<Form.Item | |||
name="payTemplateId" | |||
label="支付方式" | |||
defaultValue={props.values.payTemplateId} | |||
> | |||
<Select placeholder="请选择支付方式"> | |||
{ | |||
props.payTemplateList?.map(item => { | |||
return <Option value={item.id} key={item.id}>{item.name}</Option> | |||
}) | |||
} | |||
</Select> | |||
</Form.Item> | |||
<Form.Item label={'店铺地址'} name="store_Addr" rules={[{ required: true, max: 100 }]}> | |||
<Input placeholder="成都市武侯区桂溪街道环球中心N5-9111C" /> | |||
</Form.Item> | |||
{/* ,pattern: /^[-\+]?\d+(\.\d+)\,[-\+]?\d+(\.\d+)$/, | |||
message: '经纬度格式不对'} */} | |||
<Form.Item label={'店铺坐标'} name="store_Loc" rules={[{ required: true,max:100,pattern: /^[-\+]?\d+(\.\d+)\,[-\+]?\d+(\.\d+)$/, | |||
message: '经纬度格式不对'} ]}> | |||
<Form.Item label={'店铺坐标'} name="store_Loc" rules={[{ | |||
required: true, max: 100, pattern: /^[-\+]?\d+(\.\d+)\,[-\+]?\d+(\.\d+)$/, | |||
message: '经纬度格式不对' | |||
}]}> | |||
<Input placeholder="104.070734,30.575041" /> | |||
</Form.Item> | |||
<Form.Item name="tel" label="电话" rules={[{ max: 20 }]}> | |||
<Input placeholder="请输入联系电话" /> | |||
<Input placeholder="请输入联系电话" /> | |||
</Form.Item> | |||
<Form.Item name="sort" label="排序"> | |||
<InputNumber min={1} step={1} precision={0} /> | |||
</Form.Item> | |||
<Form.Item name="remark" label="备注"> | |||
<TextArea rows={4} rules={[{ max: 500 }]}/> | |||
<TextArea rows={4} rules={[{ max: 500 }]} /> | |||
</Form.Item> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
@@ -5,7 +5,7 @@ import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import ProDescriptions from '@ant-design/pro-descriptions'; | |||
import CreateForm from './components/CreateForm'; | |||
import { add, edit, getdetail, getlist, getpage, gettree, orgdelete } from './service'; | |||
import { add, edit, getdetail, getlist, getpage, gettree, orgdelete,getPayTemplateList } from './service'; | |||
import { history } from 'umi'; | |||
/** | |||
* 添加节点 | |||
@@ -96,6 +96,11 @@ const TableList = () => { | |||
const [treeData, setTreeData] = useState(); | |||
const [Pid, setKey] = useState(); | |||
const [payTemplateList, setPayTemplateList] = useState(); | |||
/** 国际化配置 */ | |||
const columns = [ | |||
@@ -199,6 +204,12 @@ const TableList = () => { | |||
setTreeData(r.data); | |||
}); | |||
} | |||
function initgetPayTemplateList() { | |||
getPayTemplateList().then((r) => { | |||
setPayTemplateList(r.data.data); | |||
}); | |||
} | |||
initgetPayTemplateList(); | |||
initfranchiseeType(); | |||
}, []); | |||
return ( | |||
@@ -296,6 +307,7 @@ const TableList = () => { | |||
</FooterToolbar> | |||
)} | |||
<CreateForm | |||
payTemplateList={payTemplateList} | |||
treeDatas={ | |||
[ | |||
{ | |||
@@ -76,3 +76,11 @@ export async function gettree(params) { | |||
}, | |||
}); | |||
} | |||
//获取支付配置 | |||
export function getPayTemplateList() { | |||
return request(`/kitchen/api/paytemplate/getPayTemplatePageList`, { | |||
method: 'post', | |||
data: {current: 1, pageSize: 100}, | |||
}); | |||
} |
@@ -0,0 +1,241 @@ | |||
import React, { useState, useRef } from 'react'; | |||
import { PlusOutlined } from '@ant-design/icons'; | |||
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; | |||
import { Drawer, Row, Col, Modal, Form, Input, Button, InputNumber, TreeSelect, Select, message } from 'antd'; | |||
import ProTable from '@ant-design/pro-table'; | |||
import Field from '@ant-design/pro-field'; | |||
import { CopyOutlined } from '@ant-design/icons'; | |||
import { useIntl, FormattedMessage } from 'umi'; | |||
import { getPayTemplatePageList, add, deletepaytemplate, update } from './service'; | |||
const PayTemplate = () => { | |||
const actionRef = useRef(); | |||
const [currentRow, setCurrentRow] = useState({}); | |||
//drawer 显示控制 | |||
const [drawerVisible, setDrawerVisible] = useState(false); | |||
//请求详情 | |||
const requestPayTemplate = async (fields) => { | |||
var data = { | |||
name: fields.name, | |||
id: fields.id | |||
}; | |||
var list = []; | |||
fields.payTemplateOutDtoInfo.forEach(element => { | |||
if (element.payType == 1) { | |||
data.wxappId = element.appId; | |||
data.wxid = element.id; | |||
data.wxKey = element.key; | |||
data.wxpId = element.pId; | |||
data.wxpayType = 1; | |||
data.wxprivateKey = element.privateKey; | |||
data.wxpubLicKey = element.pubLicKey; | |||
} else { | |||
data.zfbappId = element.appId; | |||
data.zfbid = element.id; | |||
data.zfbKey = element.key; | |||
data.zfbpId = element.pId; | |||
data.zfbpayType = 2; | |||
data.zfbprivateKey = element.privateKey; | |||
data.zfbpubLicKey = element.pubLicKey; | |||
} | |||
}); | |||
return data; | |||
}; | |||
const columns = [ | |||
{ | |||
title: '主键', | |||
dataIndex: 'id', | |||
tip: '规则名称是唯一的key', | |||
hideInSearch: true, | |||
hideInTable: true, | |||
}, | |||
{ | |||
title: '名称', | |||
dataIndex: 'name', | |||
valueType: 'textarea', | |||
}, | |||
{ | |||
title: '操作', | |||
dataIndex: 'option', | |||
valueType: 'option', | |||
render: (_, record) => [ | |||
<a | |||
key={record.id} | |||
onClick={async () => { | |||
var data = await requestPayTemplate(record); | |||
setCurrentRow(data); | |||
setDrawerVisible(true); | |||
}} > | |||
修改 | |||
</a>, | |||
<a | |||
key={record.id} | |||
onClick={async () => { | |||
var input=[record.id]; | |||
deletepaytemplate(input).then((re) => { | |||
if (re.data) { | |||
message.success('删除成功'); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error('删除失败'); | |||
} | |||
}); | |||
}} > | |||
删除 | |||
</a> | |||
], | |||
}, | |||
]; | |||
const intl = useIntl(); | |||
return ( | |||
<PageContainer> | |||
<ProTable | |||
toolBarRender={() => { | |||
return <Button | |||
type="primary" | |||
key="primary1" | |||
onClick={() => { | |||
setCurrentRow({}); | |||
setDrawerVisible(true); | |||
}} | |||
> | |||
<PlusOutlined /> 新建 | |||
</Button> | |||
}} | |||
headerTitle="支付配置" | |||
actionRef={actionRef} | |||
rowKey="id" | |||
search={{ | |||
labelWidth: 120, | |||
}} | |||
request={async (params) => { | |||
var queryData = []; | |||
var total = 0; | |||
await getPayTemplatePageList(JSON.stringify(params)).then((re) => { | |||
queryData = re.data.data; | |||
total = re.data.total; | |||
}); | |||
return { | |||
data: queryData, | |||
success: true, | |||
total: total, | |||
}; | |||
}} | |||
columns={columns} | |||
pagination={{ defaultPageSize: 10 }} | |||
/> | |||
{/* ------------------------ */} | |||
<Drawer | |||
title="支付配置" | |||
key="1" | |||
placement="right" | |||
size="large" | |||
width="900" | |||
onClose={() => { | |||
setDrawerVisible(false); | |||
}} | |||
visible={drawerVisible} | |||
destroyOnClose | |||
> | |||
<Form | |||
preserve={false} | |||
layout="horizontal" | |||
initialValues={currentRow} | |||
labelCol={{ | |||
span: 4, | |||
}} | |||
onFinish={async (value) => { | |||
if (value.id) { | |||
update(value).then((re) => { | |||
if (re.data) { | |||
message.success('修改成功'); | |||
setDrawerVisible(false); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error('修改失败'); | |||
} | |||
}); | |||
} else { | |||
add(value).then((re) => { | |||
if (re.data) { | |||
message.success('添加成功'); | |||
setDrawerVisible(false); | |||
actionRef.current.reload(); | |||
} else { | |||
message.error('添加失败'); | |||
} | |||
}); | |||
} | |||
}} | |||
> | |||
<Form.Item name="id" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="name" label="名称" rules={[{ required: true, max: 20 }]}> | |||
<Input placeholder="请输入名称" /> | |||
</Form.Item> | |||
<Row> | |||
<Col span={11} > | |||
<h3>微信</h3> | |||
<Form.Item name="wxid" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="wxappId" label="AppId" rules={[{ required: true, max: 255 }]}> | |||
<Input placeholder="请输入appId" /> | |||
</Form.Item> | |||
<Form.Item name="wxpId" tooltip="微信的MCHid" label="MchId" rules={[{ required: true, max: 255 }]}> | |||
<Input placeholder="请输入MchId" /> | |||
</Form.Item> | |||
<Form.Item name="wxKey" tooltip="微信的aAppKey" label="AppKey" rules={[{ required: true, max: 255 }]}> | |||
<Input placeholder="请输入AppKey" /> | |||
</Form.Item> | |||
<Form.Item name="wxpubLicKey" tooltip="证书 " label="证书" rules={[{ required: true, max: 255 }]}> | |||
<Input placeholder="请输入证书" /> | |||
</Form.Item> | |||
<Form.Item name="wxprivateKey" tooltip="密码" label="密码" rules={[{ required: true, max: 255 }]}> | |||
<Input placeholder="请输入密码" /> | |||
</Form.Item> | |||
</Col> | |||
<Col span={2} ></Col> | |||
<Col span={11} > | |||
<h3>支付宝</h3> | |||
<Form.Item name="zfbid" hidden={true}> | |||
<Input /> | |||
</Form.Item> | |||
<Form.Item name="zfbappId" label="AppId" rules={[{ required: true, max: 255 }]}> | |||
<Input placeholder="请输入appId" /> | |||
</Form.Item> | |||
<Form.Item name="zfbpId" tooltip="支付宝的Pid" label="PId" rules={[{ required: true, max: 255 }]}> | |||
<Input placeholder="请输入PId" /> | |||
</Form.Item> | |||
<Form.Item name="zfbKey" tooltip="支付宝的pk" label="PK" rules={[{ required: true, max: 255 }]}> | |||
<Input placeholder="请输入PK" /> | |||
</Form.Item> | |||
<Form.Item name="zfbpubLicKey" tooltip="公钥 " label="公钥" rules={[{ required: true, max: 255 }]}> | |||
<Input placeholder="请输入公钥" /> | |||
</Form.Item> | |||
<Form.Item name="zfbprivateKey" tooltip="私钥" label="私钥" rules={[{ required: true, max: 255 }]}> | |||
<Input placeholder="请输入私钥" /> | |||
</Form.Item> | |||
</Col> | |||
</Row> | |||
<Form.Item> | |||
<Button type="primary" htmlType="submit"> | |||
保存 | |||
</Button> | |||
</Form.Item> | |||
</Form> | |||
</Drawer> | |||
</PageContainer> | |||
); | |||
}; | |||
export default PayTemplate; |
@@ -0,0 +1,30 @@ | |||
import { request } from 'umi'; | |||
export function getPayTemplatePageList(data) { | |||
return request(`/kitchen/api/paytemplate/getPayTemplatePageList`, { | |||
method: 'post', | |||
data: data, | |||
}); | |||
} | |||
export function add(data) { | |||
return request(`/kitchen/api/paytemplate/add`, { | |||
method: 'post', | |||
data: data, | |||
}); | |||
} | |||
export function deletepaytemplate(data) { | |||
return request(`/kitchen/api/paytemplate/delete`, { | |||
method: 'post', | |||
data: data, | |||
}); | |||
} | |||
export function update(data) { | |||
return request(`/kitchen/api/paytemplate/update`, { | |||
method: 'post', | |||
data: data, | |||
}); | |||
} | |||
@@ -29,7 +29,7 @@ const CreateForm = (props) => { | |||
<Row> | |||
<Col span={12}> | |||
<Form.Item name="code" label="角色编码" rules={[{ required: true, max: 20 }]}> | |||
<Input placeholder="请输入角色编码" /> | |||
<Input disabled={props.values.id ? true : false} placeholder="请输入角色编码" /> | |||
</Form.Item> | |||
</Col> | |||
<Col span={12}> | |||
@@ -23,10 +23,10 @@ const AvatarView = ({ avatar, url, uploadProp }) => ( | |||
</> | |||
); | |||
const EnterpriseLog = () => { | |||
const { data: CompanyInfo, loading } = useRequest(() => { | |||
return GetCompanyInfo(); | |||
}); | |||
const EnterpriseLog = (props) => { | |||
// const { data: CompanyInfo, loading } = useRequest(() => { | |||
// return GetCompanyInfo(); | |||
// }); | |||
const [url, setUrl] = useState(); | |||
const [cosInfo, SetCosInfo] = useState({ | |||
domain: '', | |||
@@ -35,6 +35,7 @@ const EnterpriseLog = () => { | |||
allUrl: '', | |||
seeUrl: '', | |||
}); | |||
const uploadProps = { | |||
name: 'file', | |||
showUploadList: false, | |||
@@ -44,15 +45,23 @@ const EnterpriseLog = () => { | |||
headers: { | |||
'Content-Type': 'application/octet-stream', | |||
}, | |||
customRequest({ action, file, headers, onError, onProgress, onSuccess, withCredentials }) { | |||
customRequest({ | |||
action, | |||
file, | |||
headers, | |||
onError, | |||
onProgress, | |||
onSuccess, | |||
withCredentials, | |||
}) { | |||
//覆盖action 上传之前获取上传地址 | |||
var index = file.name.lastIndexOf('.'); | |||
var index = file.name.lastIndexOf("."); | |||
var ext = file.name.substr(index + 1); | |||
let fileData = null; | |||
GetCosRequestURL({ directory: "logo", fileExtension: ext, method: "PUT" }).then((r) => { | |||
SetCosInfo(r) | |||
action = r.fileUrl + '?' + r.param; | |||
action = r.allUrl; | |||
const reader = new FileReader(); | |||
reader.readAsArrayBuffer(file); | |||
reader.onload = (e) => { | |||
@@ -60,24 +69,26 @@ const EnterpriseLog = () => { | |||
// 在文件读取结束后执行的操作 | |||
fileData = e.target.result; | |||
// 使用 axios 进行文件上传的请求 | |||
axios | |||
.put(action, fileData, { | |||
withCredentials, | |||
headers, | |||
onUploadProgress: ({ total, loaded }) => { | |||
// 进行上传进度输出,更加直观 | |||
onProgress({ percent: Math.round((loaded / total) * 100).toFixed(2) }, file); | |||
}, | |||
}) | |||
.then((response) => { | |||
console.log('onSuccess', response, file); | |||
if (response.status == 200 || response.statusText == 'OK') { | |||
setUrl(r.seeUrl); | |||
CompanyInfo.logo = r.seeUrl; | |||
updateCompany(CompanyInfo); | |||
} | |||
// onSuccess(response, file); | |||
}) | |||
axios.put(action, fileData, { | |||
withCredentials, | |||
headers, | |||
onUploadProgress: ({ total, loaded }) => { | |||
// 进行上传进度输出,更加直观 | |||
onProgress({ percent: Math.round(loaded / total * 100).toFixed(2) }, file); | |||
}, | |||
}).then(response => { | |||
// console.log('onSuccess', response, file); | |||
if (response.status == 200 || response.statusText == 'OK') { | |||
// setUrl(r.seeUrl); | |||
const company = JSON.parse(JSON.stringify(props.fetchCompanyInfo)); | |||
company.logo = r.seeUrl; | |||
// console.log('LOGO变更', company.logo) | |||
props.onUpdateCompanyInfo(company); | |||
// CompanyInfo.logo = r.seeUrl; | |||
// updateCompany(CompanyInfo); | |||
} | |||
// onSuccess(response, file); | |||
}) | |||
.catch(onError); | |||
}; | |||
}); | |||
@@ -87,19 +98,17 @@ const EnterpriseLog = () => { | |||
}, | |||
}; | |||
}, | |||
//defaultFileList: props.location.query.values ? props.location.query.values : null | |||
}; | |||
return ( | |||
<div className={styles.baseView}> | |||
{loading ? null : ( | |||
<> | |||
<div className={styles.right}> | |||
<AvatarView | |||
url={CompanyInfo.logo ? CompanyInfo.logo:'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png' } | |||
uploadProp={uploadProps} | |||
/> | |||
</div> | |||
</> | |||
)} | |||
<div className={styles.right}> | |||
<AvatarView | |||
url={props.fetchCompanyInfo.logo ? props.fetchCompanyInfo.logo : 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png'} | |||
uploadProp={uploadProps} | |||
/> | |||
</div> | |||
</div> | |||
); | |||
}; | |||
@@ -1,9 +1,10 @@ | |||
import React, { useState, useRef, useLayoutEffect } from 'react'; | |||
import React, { useState, useRef, useLayoutEffect, useEffect } from 'react'; | |||
import { GridContent } from '@ant-design/pro-layout'; | |||
import { Menu } from 'antd'; | |||
import BaseView from './components/base'; | |||
import EnterpriseLog from './components/EnterpriseLog'; | |||
import styles from './style.less'; | |||
import { GetCompanyInfo, GetCosRequestURL, updateCompany } from './components/service'; | |||
const { Item } = Menu; | |||
const Settings = () => { | |||
@@ -16,6 +17,9 @@ const Settings = () => { | |||
selectKey: 'EnterpriseLog', | |||
}); | |||
const dom = useRef(); | |||
const [fetchCompanyInfo, setFetchCompanyInfo] = useState({ | |||
logo: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png' | |||
}); | |||
const resize = () => { | |||
requestAnimationFrame(() => { | |||
@@ -61,13 +65,29 @@ const Settings = () => { | |||
// return <BaseView />; | |||
case 'EnterpriseLog': | |||
return <EnterpriseLog />; | |||
return <EnterpriseLog fetchCompanyInfo={fetchCompanyInfo} onUpdateCompanyInfo={onUpdateCompanyInfo} />; | |||
default: | |||
return null; | |||
} | |||
}; | |||
const onUpdateCompanyInfo = async (companyInfo) => { | |||
await updateCompany(companyInfo); | |||
await onFetchCompanyInfo(); | |||
} | |||
const onFetchCompanyInfo = async () => { | |||
const response = await GetCompanyInfo(); | |||
if (response.statusCode === 200) { | |||
setFetchCompanyInfo(response.data); | |||
} | |||
} | |||
useEffect(() => { | |||
onFetchCompanyInfo(); | |||
}, []); | |||
return ( | |||
<GridContent> | |||
<div | |||
@@ -21,7 +21,7 @@ const initPuppeteer = async () => { | |||
try { | |||
// eslint-disable-next-line import/no-unresolved | |||
const findChromePath = await findChrome({}); | |||
const { executablePath } = findChromePath; | |||
const { executablePath } = findChromePath;4 | |||
console.log(`🧲 find you browser in ${executablePath}`); | |||
return; | |||
} catch (error) { | |||