Compare commits

...

41 Commits

Author SHA1 Message Date
  txb 3f5d07e8bf feat(商品管理): 添加制作时间 2 years ago
  yangwenhua e4b1cbe0f3 会员模块接口调用 2 years ago
  gwbvipvip 19fe84cff0 会员修改 2 years ago
  yangwenhua 65393d824b 新增 wangeditor。记得 yarn install 2 years ago
  yangwenhua 9a50fac95e 大屏横幅富文本展示 2 years ago
  yangwenhua 0f84473208 档口管理、刷卡机管理接口调用 2 years ago
  yangwenhua 7077123ca1 新增档口管理、刷卡机管理 2 years ago
  yangwenhua c0c149d350 储值卡会员管理、储值卡管理、储值卡账号管理 2 years ago
  yangwenhua 72a30a3ea0 新增一卡通管理模块:会员管理、账户管理、储值卡管理 2 years ago
  gwbvipvip 26af69ee99 支付配置 2 years ago
  yangwenhua b71f2340b9 停用做法类别 2 years ago
  yangwenhua 54bea2be3d 解决bug.386,169.295.325 2 years ago
  yangwenhua bc5c1b4dc9 399/393bug修复 2 years ago
  yangwenhua 39673b2abd 营销报表、配方分类Bug修复 2 years ago
  yangwenhua 727cbfe84f 订单流水唯一Key更新为orderFlowId 2 years ago
  yangwenhua 6907043564 更新企业LOGO 2 years ago
  yangwenhua 8c25f29e59 企业LOGO更新 2 years ago
  唐学波 2520c4d909 上传log 2 years ago
  唐学波 47183d8acf 🐞 fix(头像): 头像 2 years ago
  txb 492dab9b03 Merge branch 'dev' of http://10.2.1.24:10244/bpa/BPA.KitChen.Web into dev 2 years ago
  txb a69b9ee1a7 🐞 fix(解决做法): 解决做法 2 years ago
  yangwenhua 4939a5db2d Merge branch 'dev' of http://10.2.1.24:10244/bpa/BPA.KitChen.Web into dev 2 years ago
  yangwenhua 8ea55fc61a 更新素材 2 years ago
  txb b23d6d23f6 Merge branch 'dev' of http://10.2.1.24:10244/bpa/BPA.KitChen.Web into dev 2 years ago
  txb f99f040c2a 🐞 fix(订单流水): 订单流水 2 years ago
  yangwenhua b267ed85e8 新增小程序配置 2 years ago
  yangwenhua 0c50cf49ff 新增小程序配置 2 years ago
  gwbvipvip e9d98811ce 订单汇总 2 years ago
  txb 003c93adbf feat(桌台码): 桌台码 2 years ago
  txb dbdb64b194 合并代码 2 years ago
  txb 13b2f1aa89 Merge branch 'feature-DeviceCopy' into dev 2 years ago
  gwbvipvip 0021fffdb4 员工店铺 2 years ago
  gwbvipvip 7893419cc4 商品code 2 years ago
  gwbvipvip bc61e6e1ea 员工店铺 2 years ago
  gwbvipvip 77439b75cc 页面问题 2 years ago
  gwbvipvip c775240421 提交 2 years ago
  gwbvipvip 7778c66c1c 配方用量 2 years ago
  txb 192ec80d81 feat(配方排序): 配方自定义排序 2 years ago
  gwbvipvip 38481a979c 设备物料数量 2 years ago
  txb 7c7d4b0f16 🐞 fix(设备库存管理): 库存位置校验 2 years ago
  txb 00bbff43c7 feat(修改小炒): 修改小炒 2 years ago
77 changed files with 5878 additions and 1101 deletions
Split View
  1. +1
    -1
      config/proxy.js
  2. +94
    -3
      config/routes.js
  3. +3
    -0
      package.json
  4. +87
    -1
      src/app.jsx
  5. +480
    -0
      src/pages/applet/material/index.jsx
  6. +12
    -0
      src/pages/applet/material/index.less
  7. +242
    -0
      src/pages/applet/pageManage/index.jsx
  8. +12
    -0
      src/pages/applet/pageManage/index.less
  9. +115
    -0
      src/pages/applet/service.js
  10. +3
    -3
      src/pages/bom/bomtype/components/CreateForm.jsx
  11. +77
    -0
      src/pages/bom/cookingentry/components/CreateForm.jsx
  12. +137
    -0
      src/pages/bom/cookingentry/components/PotActions.jsx
  13. +138
    -0
      src/pages/bom/cookingentry/components/RobotActions.jsx
  14. +330
    -0
      src/pages/bom/cookingentry/index.jsx
  15. +42
    -0
      src/pages/bom/cookingentry/services.js
  16. +45
    -0
      src/pages/bom/cookingwork/components/CreateForm.jsx
  17. +280
    -0
      src/pages/bom/cookingwork/index.jsx
  18. +25
    -0
      src/pages/bom/cookingwork/services.js
  19. +4
    -2
      src/pages/bom/manage/components/BomConsumption.jsx
  20. +4
    -1
      src/pages/bom/manage/components/CreateForm.jsx
  21. +18
    -0
      src/pages/bom/manage/index.jsx
  22. +0
    -61
      src/pages/bom/push/components/CreateForm.jsx
  23. +0
    -437
      src/pages/bom/push/index.jsx
  24. +0
    -65
      src/pages/bom/push/services.js
  25. +390
    -0
      src/pages/card/gate/index.jsx
  26. +4
    -0
      src/pages/card/gate/index.less
  27. +324
    -0
      src/pages/card/machine/index.jsx
  28. +4
    -0
      src/pages/card/machine/index.less
  29. +249
    -0
      src/pages/card/memberAccount/index.jsx
  30. +0
    -0
     
  31. +318
    -0
      src/pages/card/memberCard/index.jsx
  32. +0
    -0
     
  33. +136
    -0
      src/pages/card/service.js
  34. +258
    -0
      src/pages/card/storedValueCard/index.jsx
  35. +0
    -0
     
  36. +6
    -3
      src/pages/device/deviceInfo/components/CreateForm.jsx
  37. +46
    -26
      src/pages/device/deviceInfo/index.jsx
  38. +9
    -2
      src/pages/device/deviceInfo/services.js
  39. +64
    -0
      src/pages/device/deviceStirFryTime/components/CreateForm.jsx
  40. +237
    -0
      src/pages/device/deviceStirFryTime/index.jsx
  41. +40
    -0
      src/pages/device/deviceStirFryTime/service.js
  42. +94
    -0
      src/pages/device/deviceStirFryTimeStock/components/CreateForm.jsx
  43. +349
    -0
      src/pages/device/deviceStirFryTimeStock/index.jsx
  44. +79
    -0
      src/pages/device/deviceStirFryTimeStock/services.js
  45. +3
    -3
      src/pages/device/deviceStock/index.jsx
  46. +1
    -1
      src/pages/goods/goods-manage/components/CreateForm.jsx
  47. +5
    -3
      src/pages/goods/goodsInfo/index.jsx
  48. +8
    -1
      src/pages/goods/goodsPracticeInfo/components/createRecordForm.jsx
  49. +2
    -2
      src/pages/goods/goodsPracticeType/components/createTypeForm.jsx
  50. +84
    -46
      src/pages/goods/goodsPracticeType/index.jsx
  51. +7
    -0
      src/pages/goods/goodsPracticeType/service.js
  52. +1
    -1
      src/pages/goods/newgoods/components/CreateForm.jsx
  53. +28
    -8
      src/pages/member/memberInfo/components/CreateForm.jsx
  54. +52
    -9
      src/pages/member/memberInfo/index.jsx
  55. +9
    -0
      src/pages/member/memberInfo/service.js
  56. +1
    -92
      src/pages/order/order-flow-manage/index.jsx
  57. +0
    -42
      src/pages/order/order-flow-manage/orderflowDetail.jsx
  58. +6
    -2
      src/pages/order/order-revenue-statement/index.jsx
  59. +4
    -1
      src/pages/order/order-revenue-statement/service.js
  60. +72
    -186
      src/pages/order/order-summary-manage/index.jsx
  61. +2
    -1
      src/pages/store/storeDesktopNumber/components/CreateForm.jsx
  62. +19
    -23
      src/pages/store/storeDesktopNumber/index.jsx
  63. +22
    -26
      src/pages/store/storeGoodsInfo/components/CreateForm.jsx
  64. +18
    -2
      src/pages/store/storeGoodsInfo/index.jsx
  65. +3
    -1
      src/pages/store/storeGoodsInfo/services.js
  66. +64
    -0
      src/pages/store/storeStaff/components/CreateForm.jsx
  67. +292
    -0
      src/pages/store/storeStaff/index.jsx
  68. +38
    -0
      src/pages/store/storeStaff/services.js
  69. +20
    -5
      src/pages/sys/org/components/CreateForm.jsx
  70. +13
    -1
      src/pages/sys/org/index.jsx
  71. +8
    -0
      src/pages/sys/org/service.js
  72. +241
    -0
      src/pages/sys/paytemplate/index.jsx
  73. +30
    -0
      src/pages/sys/paytemplate/service.js
  74. +1
    -1
      src/pages/sys/roles/components/CreateForm.jsx
  75. +45
    -36
      src/pages/sys/sysSettings/components/EnterpriseLog.jsx
  76. +22
    -2
      src/pages/sys/sysSettings/index.jsx
  77. +1
    -1
      tests/beforeTest.js

+ 1
- 1
config/proxy.js View File

@@ -6,7 +6,7 @@
* For details, please see
* https://pro.ant.design/docs/deploy
*/
export default {
export default {
dev: {
'/kitchen/': {
target: 'https://localhost:5001/',


+ 94
- 3
config/routes.js View File

@@ -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: '设备配方管理',


+ 3
- 0
package.json View File

@@ -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"
},


+ 87
- 1
src/app.jsx View File

@@ -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;
}


+ 480
- 0
src/pages/applet/material/index.jsx View File

@@ -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;

+ 12
- 0
src/pages/applet/material/index.less View File

@@ -0,0 +1,12 @@
.table_search_item {
display: flex;
align-items: center;
}

.edit_image_item {
margin-bottom: 10px;
}

.edit_image_prev {
margin-bottom: 5px;
}

+ 242
- 0
src/pages/applet/pageManage/index.jsx View File

@@ -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;

+ 12
- 0
src/pages/applet/pageManage/index.less View File

@@ -0,0 +1,12 @@
.table_search_item {
display: flex;
align-items: center;
}

.edit_image_item {
margin-bottom: 10px;
}

.edit_image_prev {
margin-bottom: 5px;
}

+ 115
- 0
src/pages/applet/service.js View File

@@ -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
}
});
}

}

+ 3
- 3
src/pages/bom/bomtype/components/CreateForm.jsx View File

@@ -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>


+ 77
- 0
src/pages/bom/cookingentry/components/CreateForm.jsx View File

@@ -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;

+ 137
- 0
src/pages/bom/cookingentry/components/PotActions.jsx View File

@@ -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;

+ 138
- 0
src/pages/bom/cookingentry/components/RobotActions.jsx View File

@@ -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;

+ 330
- 0
src/pages/bom/cookingentry/index.jsx View File

@@ -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>{' '}
项 &nbsp;&nbsp;
</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;

+ 42
- 0
src/pages/bom/cookingentry/services.js View File

@@ -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',
});
},
};

+ 45
- 0
src/pages/bom/cookingwork/components/CreateForm.jsx View File

@@ -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;

+ 280
- 0
src/pages/bom/cookingwork/index.jsx View File

@@ -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>{' '}
项 &nbsp;&nbsp;
</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;

+ 25
- 0
src/pages/bom/cookingwork/services.js View File

@@ -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,
});
},
};

+ 4
- 2
src/pages/bom/manage/components/BomConsumption.jsx View File

@@ -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>
})


+ 4
- 1
src/pages/bom/manage/components/CreateForm.jsx View File

@@ -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">
保存


+ 18
- 0
src/pages/bom/manage/index.jsx View File

@@ -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>
);


+ 0
- 61
src/pages/bom/push/components/CreateForm.jsx View File

@@ -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;

+ 0
- 437
src/pages/bom/push/index.jsx View File

@@ -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;

+ 0
- 65
src/pages/bom/push/services.js View File

@@ -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 || {}),
});
},
};

+ 390
- 0
src/pages/card/gate/index.jsx View File

@@ -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;

+ 4
- 0
src/pages/card/gate/index.less View File

@@ -0,0 +1,4 @@
.table_search_item {
display: flex;
align-items: center;
}

+ 324
- 0
src/pages/card/machine/index.jsx View File

@@ -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;

+ 4
- 0
src/pages/card/machine/index.less View File

@@ -0,0 +1,4 @@
.table_search_item {
display: flex;
align-items: center;
}

+ 249
- 0
src/pages/card/memberAccount/index.jsx View File

@@ -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
View File


+ 318
- 0
src/pages/card/memberCard/index.jsx View File

@@ -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
View File


+ 136
- 0
src/pages/card/service.js View File

@@ -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,
});
},

}

+ 258
- 0
src/pages/card/storedValueCard/index.jsx View File

@@ -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;

+ 0
- 0
View File


+ 6
- 3
src/pages/device/deviceInfo/components/CreateForm.jsx View File

@@ -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" />


+ 46
- 26
src/pages/device/deviceInfo/index.jsx View File

@@ -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>
)}


+ 9
- 2
src/pages/device/deviceInfo/services.js View File

@@ -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',
});
}

+ 64
- 0
src/pages/device/deviceStirFryTime/components/CreateForm.jsx View File

@@ -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;

+ 237
- 0
src/pages/device/deviceStirFryTime/index.jsx View File

@@ -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>{' '}
项 &nbsp;&nbsp;
</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;

+ 40
- 0
src/pages/device/deviceStirFryTime/service.js View File

@@ -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,
},
});
}

+ 94
- 0
src/pages/device/deviceStirFryTimeStock/components/CreateForm.jsx View File

@@ -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;

+ 349
- 0
src/pages/device/deviceStirFryTimeStock/index.jsx View File

@@ -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;

+ 79
- 0
src/pages/device/deviceStirFryTimeStock/services.js View File

@@ -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 || {}),
});
}



+ 3
- 3
src/pages/device/deviceStock/index.jsx View File

@@ -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;
}


+ 1
- 1
src/pages/goods/goods-manage/components/CreateForm.jsx View File

@@ -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 }]}>


+ 5
- 3
src/pages/goods/goodsInfo/index.jsx View File

@@ -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">
保存


+ 8
- 1
src/pages/goods/goodsPracticeInfo/components/createRecordForm.jsx View File

@@ -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' }}>


+ 2
- 2
src/pages/goods/goodsPracticeType/components/createTypeForm.jsx View File

@@ -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}


+ 84
- 46
src/pages/goods/goodsPracticeType/index.jsx View File

@@ -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>
);
};



+ 7
- 0
src/pages/goods/goodsPracticeType/service.js View File

@@ -12,6 +12,13 @@ export async function addPracticeType(data) {
});
}

export async function removePracticeType(ids) {
return request(`/kitchen/api/goodspracticetype/remove`, {
method: 'POST',
data: ids,
});
}



/**


+ 1
- 1
src/pages/goods/newgoods/components/CreateForm.jsx View File

@@ -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 }]}>


+ 28
- 8
src/pages/member/memberInfo/components/CreateForm.jsx View File

@@ -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>


+ 52
- 9
src/pages/member/memberInfo/index.jsx View File

@@ -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);


+ 9
- 0
src/pages/member/memberInfo/service.js View File

@@ -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`, {


+ 1
- 92
src/pages/order/order-flow-manage/index.jsx View File

@@ -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,
}}


+ 0
- 42
src/pages/order/order-flow-manage/orderflowDetail.jsx View File

@@ -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',


+ 6
- 2
src/pages/order/order-revenue-statement/index.jsx View File

@@ -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 = [];


+ 4
- 1
src/pages/order/order-revenue-statement/service.js View File

@@ -9,9 +9,12 @@ export default {
},

//获取营销报表
getReportStatisticsMarketing() {
getReportStatisticsMarketing(params) {
return request(`/kitchen/api/report-statistics/marketing`, {
method: 'POST',
data: {
...params
}
});
}
};

+ 72
- 186
src/pages/order/order-summary-manage/index.jsx View File

@@ -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);


+ 2
- 1
src/pages/store/storeDesktopNumber/components/CreateForm.jsx View File

@@ -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>


+ 19
- 23
src/pages/store/storeDesktopNumber/index.jsx View File

@@ -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('删除成功');


+ 22
- 26
src/pages/store/storeGoodsInfo/components/CreateForm.jsx View File

@@ -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>


+ 18
- 2
src/pages/store/storeGoodsInfo/index.jsx View File

@@ -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: '是否设备制作',


+ 3
- 1
src/pages/store/storeGoodsInfo/services.js View File

@@ -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`, {


+ 64
- 0
src/pages/store/storeStaff/components/CreateForm.jsx View File

@@ -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;

+ 292
- 0
src/pages/store/storeStaff/index.jsx View File

@@ -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>{' '}
项 &nbsp;&nbsp;
{/* <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;

+ 38
- 0
src/pages/store/storeStaff/services.js View File

@@ -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 || {}),
});
}

+ 20
- 5
src/pages/sys/org/components/CreateForm.jsx View File

@@ -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">


+ 13
- 1
src/pages/sys/org/index.jsx View File

@@ -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={
[
{


+ 8
- 0
src/pages/sys/org/service.js View File

@@ -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},
});
}

+ 241
- 0
src/pages/sys/paytemplate/index.jsx View File

@@ -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;

+ 30
- 0
src/pages/sys/paytemplate/service.js View File

@@ -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,
});
}


+ 1
- 1
src/pages/sys/roles/components/CreateForm.jsx View File

@@ -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}>


+ 45
- 36
src/pages/sys/sysSettings/components/EnterpriseLog.jsx View File

@@ -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>
);
};


+ 22
- 2
src/pages/sys/sysSettings/index.jsx View File

@@ -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


+ 1
- 1
tests/beforeTest.js View File

@@ -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) {


Loading…
Cancel
Save