diff --git a/public/manifest.json b/public/manifest.json index 080d6c77ac21bb2ef88a6992b2b73ad93daaca92..8ae57f7115f27b28d8703850573313292c9411d9 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,21 +1,11 @@ { - "short_name": "React App", - "name": "Create React App Sample", + "short_name": "WMS", + "name": "物流仓储管理系统", "icons": [ { "src": "favicon.ico", "sizes": "64x64 32x32 24x24 16x16", "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" } ], "start_url": ".", diff --git a/src/components/Accountant/WareIn.jsx b/src/components/Accountant/WareIn.jsx index f9e8b5864a399862c21fd5206d6d6d051656577a..ccadee9ae1b460adb910c56065211fbd9303c33b 100644 --- a/src/components/Accountant/WareIn.jsx +++ b/src/components/Accountant/WareIn.jsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from "react"; -import { useLocation } from "react-router-dom"; +import { useLocation, useNavigate } from "react-router-dom"; import axios from "axios"; import { Button, message } from "antd"; @@ -11,6 +11,8 @@ const editCSS = const WareIn = () => { const location = useLocation(); + const navigate = useNavigate(); + const orderInfo = location.state.record; const [productVOList, setProductVOList] = useState( @@ -79,6 +81,7 @@ const WareIn = () => { if (res.data.code === 10000) { message.success("办理成功"); setLoading(false); + navigate(-1) } else { message.error(res.data.message); setLoading(false); diff --git a/src/components/Header.jsx b/src/components/Header.jsx index 9e3683b38f71b1f7896a5cccd9b97dc2a53ce39d..2e1f2658b44234b739cf3e7007022c86c69e4db0 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -2,10 +2,19 @@ import React, { useState } from "react"; import { FiHelpCircle } from "react-icons/fi"; import { MdLogout } from "react-icons/md"; import Avatar from "../img/avatar.png"; -import { logout } from "../utils/adminCookie"; +import axios from "axios"; -const Header = ({priority,id}) => { +const Header = ({ priority, username }) => { const [date, setDate] = useState(new Date()); + + const logout = () => { + localStorage.removeItem("username"); + localStorage.removeItem("priority"); + localStorage.removeItem("token"); + axios.defaults.headers.common["token"] = ""; + window.location.href = "/"; + }; + return (
{/* Hello */} @@ -28,7 +37,7 @@ const Header = ({priority,id}) => {
- +
diff --git a/src/components/LoginReg/LoginCard.jsx b/src/components/LoginReg/LoginCard.jsx index 48d03741b5ae160716f746c3acc1545f7a710865..490e4073fd0abd47ef50c707486e48aa51ac6801 100644 --- a/src/components/LoginReg/LoginCard.jsx +++ b/src/components/LoginReg/LoginCard.jsx @@ -1,6 +1,6 @@ import React, { useState, useEffect } from "react"; import { AiOutlineUser, AiOutlineCheck } from "react-icons/ai"; -import { Navigate } from "react-router-dom"; +import { Navigate, useNavigate } from "react-router-dom"; import { motion } from "framer-motion"; import axios from "axios"; @@ -10,14 +10,17 @@ import RememberPw from "./RememberPw"; import { onLogin } from "../../utils/adminCookie"; import { accounts } from "../../utils/data"; +axios.defaults.baseURL = "http://127.0.0.1:8088"; + const LoginCard = () => { + const navigate = useNavigate(); + const [userInput, setUserInput] = useState(""); const [pwInput, setPwInput] = useState(""); const [codeInput, setCodeInput] = useState(""); const [imgCode, setImgCode] = useState(""); - const [loginSucc, setLoginSucc] = useState(false); const [loginFail, setLoginFail] = useState(false); const [codeWrong, setCodeWrong] = useState(false); @@ -39,7 +42,7 @@ const LoginCard = () => { e.preventDefault(); const [uname, upw, ucode] = document.forms[0]; if (uname.value === "12" && upw.value === "12") { - setLoginSucc(true); + navigate("/admin"); onLogin(accounts.filter((item) => item.username === uname.value)); } axios @@ -52,22 +55,26 @@ const LoginCard = () => { password: upw.value, code: ucode.value, }, - withCredentials: true, + // withCredentials: true, } ) .then((res) => { console.log(res.data); - let code = res.data.code; - // if (code === 20004) { - // setCodeWrong(true); - // } - // onLogin - setLoginSucc(true); + if (res.data.success) { + setLoginFail(false); + axios.defaults.headers.common["token"] = res.data.data.token; + // onLogin({ username: uname.value, priority: res.data.data.priority }); + localStorage.setItem("username", uname.value); + localStorage.setItem("priority", res.data.data.priority); + localStorage.setItem("token", res.data.data.token); + navigate("/admin"); + } else { + setLoginFail(true); + } }) .catch((error) => { setLoginFail(true); - // console.log(error) - console.log(JSON.stringify(error)); + console.log(error); }); }; @@ -84,9 +91,7 @@ const LoginCard = () => { }); }, []); - return loginSucc ? ( - - ) : ( + return (
diff --git a/src/components/WareClerk/GoodsIn.jsx b/src/components/WareClerk/GoodsIn.jsx index 241012d104f91f9cf9144cf489f7920a0cc50337..97bf89d6511323b0e5b417b825c9af93d63dfa22 100644 --- a/src/components/WareClerk/GoodsIn.jsx +++ b/src/components/WareClerk/GoodsIn.jsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from "react"; -import { useLocation } from "react-router-dom"; +import { useLocation, useNavigate } from "react-router-dom"; import { Table, Modal, Button, message } from "antd"; import axios from "axios"; @@ -11,8 +11,12 @@ const editCSS = const GoodsIn = () => { const location = useLocation(); + const navigate = useNavigate(); + const ownerIC = location.state.record.orderOwner; + // console.log(location.state.record) + const [repositoryRaw, setRepositoryRaw] = useState([]); const [repositoryList, setRepositoryList] = useState([]); const [orderList, setOrderList] = useState( @@ -78,24 +82,6 @@ const GoodsIn = () => { setPosSelected(""); setInAmount(0); setIsModalVisible(false); - // axios - // .post("http://127.0.0.1:8088/admin/ware-clerk/tasks/goods-in/goods", { - // ...singleGoods - // }) - // .then((res) => { - // if (res.data.code === 10000) { - // message.success(res.data.message); - // list.push(singleGoods); - // setInventoryList([...list]); - // setIsModalVisible(false); - // } else { - // message.error(res.data.message); - // } - // }) - // .catch((err) => { - // console.log(err); - // message.error(err); - // }); }; const handleCancel = () => { @@ -130,6 +116,7 @@ const GoodsIn = () => { .then((res) => { if (res.data.code === 10000) { message.success(res.data.message); + navigate(-1); } else { message.error(res.data.message); } diff --git a/src/components/WareClerk/WareChange.jsx b/src/components/WareClerk/WareChange.jsx index e59280b1f95905fc3cc00eb078bfb623ba6380a2..35f6fe88d7dd5b95052199b4ee14d18a690c982f 100644 --- a/src/components/WareClerk/WareChange.jsx +++ b/src/components/WareClerk/WareChange.jsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from "react"; import axios from "axios"; import { FiSearch } from "react-icons/fi"; -import { Modal, Table } from "antd"; +import { Modal, Table, Button, message } from "antd"; import InputArea from "../InputArea"; import Selector from "../Selector"; @@ -9,21 +9,62 @@ import Selector from "../Selector"; const WareChange = () => { const [curData, setCurData] = useState(null); const [ownerIC, setOwnerIC] = useState(null); - const [mockData, setMockData] = useState([]); + + const [stock, setStock] = useState([]); const [searchRes, setSearchRes] = useState([]); + + const [repositoryRaw, setRepositoryRaw] = useState([]); + const [repositoryList, setRepositoryList] = useState([]); + const [posList, setPosList] = useState([]); + const [repoSelected, setRepoSelected] = useState(""); + const [posSelected, setPosSelected] = useState(""); + + const [initial, setInitial] = useState(true); + const [loading, setLoading] = useState(false); + const [dataUpdate, setDataUpdate] = useState(false); + const [isInfoCompleted, setIsInfoCompleted] = useState(false); const [isModalVisible, setIsModalVisible] = useState(false); const [isCancelModalVisible, setIsCancelModalVisible] = useState(false); const showModal = (item) => { setCurData(item); + // console.log(item) setIsModalVisible(true); }; const handleOk = () => { - setIsModalVisible(false); + // console.log(curData, repoSelected, posSelected); + setLoading(true); + axios + .post("http://127.0.0.1:8088/ /admin/ware-clerk/ware-change/change", { + ...curData, + inventoryRepositoryNew: repoSelected, + inventoryPositionNew: posSelected, + }) + .then((res) => { + if (res.data.success) { + message.success(res.data.message); + setLoading(false); + setIsModalVisible(false); + setRepoSelected(""); + setPosSelected(""); + setDataUpdate((pre) => !pre); + } else { + message.error(res.data.message); + } + setLoading(false); + }) + .catch((err) => { + console.log(err); + setTimeout(() => { + setLoading(false); + }, 2000); + }); }; const handleCancel = () => { + setRepoSelected(""); + setPosSelected(""); setIsCancelModalVisible(true); }; @@ -39,38 +80,34 @@ const WareChange = () => { const searchHandler = (e) => { e.preventDefault(); const [input] = document.forms[0]; - console.log(input.value); + // console.log(input.value); if (input.value) { - setSearchRes(mockData.filter((item) => item.buyer === ownerIC)); + setSearchRes(stock.filter((item) => item.inventoryOwner == ownerIC)); } else { - setSearchRes(mockData); + setSearchRes(stock); } }; const columns = [ { title: "货品编号", - dataIndex: "id", + dataIndex: "inventoryId", }, { title: "货品名称", - dataIndex: "name", + dataIndex: "inventoryProductName", }, { title: "货主名称", - dataIndex: "owner", - }, - { - title: "货主IC编号", - dataIndex: "buyer", + dataIndex: "inventoryOwner", }, { title: "仓库号", - dataIndex: "in", + dataIndex: "inventoryRepository", }, { title: "仓位号", - dataIndex: "in", + dataIndex: "inventoryPosition", }, { title: "操作", @@ -88,13 +125,77 @@ const WareChange = () => { }, ]; + //检查仓位是否重复 useEffect(() => { - axios.get("/admin/accountant/order-query").then((res) => { - setMockData(res.data.result.list.filter((data) => data.type === 0)); - setSearchRes(res.data.result.list.filter((data) => data.type === 0)); - }); + if (initial) { + setInitial(false); + return; + } + if (curData && posSelected === curData.inventoryPosition) { + setIsInfoCompleted(false); + } else { + setIsInfoCompleted(repoSelected && posSelected); + } + }, [repoSelected, posSelected]); + + //所有库存 + useEffect(() => { + axios + .get("http://127.0.0.1:8088/admin/ware-manager/stock/findAll") + .then((res) => { + if (res.data.success) { + setStock(res.data.data.stock); + setSearchRes(res.data.data.stock); + } else { + message.error(res.data.message); + } + }) + .catch((err) => { + console.log(err); + message.error(err); + }); + }, [dataUpdate]); + + //所有仓库 + useEffect(() => { + axios + .get("http://127.0.0.1:8088/admin/system/ware-manage/queryAll") + .then((res) => { + if (res.data.code === 10000) { + setRepositoryRaw(res.data.data.repositoryList); + setRepositoryList( + res.data.data.repositoryList.map((item) => ({ + id: item.repositoryId, + name: item.repositoryId, + })) + ); + } else { + message.error(res.data.message); + } + }) + .catch((err) => { + console.log(err); + message.error(err); + }); }, []); + //所有仓位 + useEffect(() => { + let resObj = {}; + for (let repo of repositoryList) { + Object.assign(resObj, { + [repo.id]: repositoryRaw + .filter((item) => item.repositoryId === repo.id)[0] + .positionVOList.filter((item) => item.positionStatus !== 0) + .map((item) => ({ + id: item.positionId, + name: item.positionNum, + })), + }); + } + setPosList(resObj); + }, [repositoryList]); + return (
@@ -131,54 +232,69 @@ const WareChange = () => { }} />
- -
-
- - setAdminCategory(e.target.value)} - className={ - "w-20 pt-1 outline-none border-gray-300 border-2 rounded-lg font-medium" - } - // categories={adminCategories.filter( - // (cat) => cat.id !== item.priority - // )} - /> -
-
- - setAdminCategory(e.target.value)} - className={ - "w-20 pt-1 outline-none border-gray-300 border-2 rounded-lg font-medium" - } - // categories={adminCategories.filter( - // (cat) => cat.id !== item.priority - // )} - /> + {isModalVisible && ( + + {"取消"} + , + , + ]} + > +
+
+ + { + setRepoSelected(+e.target.value); + }} + className={ + "w-20 pt-1 outline-none border-gray-300 border-2 rounded-lg font-medium" + } + categories={repositoryList} + /> +
+
+ + { + setPosSelected(+e.target.value); + }} + className={ + "w-20 pt-1 outline-none border-gray-300 border-2 rounded-lg font-medium" + } + categories={posList[repoSelected]} + /> +
-
- + + )} {/* Cancel Modal */} - - ⚠️ 确定放弃修改吗? - + {isCancelModalVisible && ( + + ⚠️ 确定放弃修改吗? + + )}
); }; diff --git a/src/components/WareManager/Stock.jsx b/src/components/WareManager/Stock.jsx index 0adaaab285e205d5611e2e405011c83d98b32c8c..d22c7a97b92f067994255acf55a66e709eeaf7dd 100644 --- a/src/components/WareManager/Stock.jsx +++ b/src/components/WareManager/Stock.jsx @@ -1,19 +1,19 @@ import React, { useState, useEffect } from "react"; import axios from "axios"; import { FiSearch } from "react-icons/fi"; -import { Table, DatePicker, Space, ConfigProvider } from "antd"; +import { Table, DatePicker, Space, ConfigProvider, message } from "antd"; import locale from "antd/lib/locale/zh_CN"; import Selector from "../Selector"; import InputArea from "../InputArea"; const Stock = () => { + const onChange = (date, dateString) => { setTime(dateString); - // console.log(date, dateString); }; - const [cate, setCate] = useState(-1); //-1是全部 + const [cate, setCate] = useState(-1); //-1是全部仓库 const [time, setTime] = useState(null); const [info, setInfo] = useState(null); @@ -21,97 +21,106 @@ const Stock = () => { const [dataSource, setDataSource] = useState([]); useEffect(() => { - axios.get("/admin/ware-manager/stock").then((res) => { - setSearchRes(res.data.result.list); - setDataSource(res.data.result.list); - // setSearchRes(res.data.result.list); - }); + axios + .get("http://127.0.0.1:8088/admin/ware-manager/stock/findAll") + .then((res) => { + if (res.data.success) { + setSearchRes(res.data.data.stock); + setDataSource(res.data.data.stock); + } else { + message.error(res.data.message); + } + }) + .catch((err) => { + console.log(err); + }); }, []); const columns = [ { title: "仓库号", - dataIndex: "repository", + dataIndex: "inventoryRepository", }, { title: "仓位号", - dataIndex: "position", + dataIndex: "inventoryPosition", }, { title: "货品编号", - dataIndex: "product", + dataIndex: "inventoryProduct", }, { title: "货品名称", - dataIndex: "name", - }, - { - title: "货品类型", - dataIndex: "type", + dataIndex: "inventoryProductName", }, { - title: "货主名称", - dataIndex: "owner", + title: "货主IC", + dataIndex: "inventoryOwner", }, { title: "入库时间", - dataIndex: "time", - render: (record) => record.split(" ")[0], + dataIndex: "inventoryCreatetime", + render: (record) => record.split("T")[0], }, ]; - const query = (event) => { + const query = (e) => { + e.preventDefault(); if (cate == -1 && !time && !info) { setSearchRes(dataSource); } else if (cate != -1 && !time && !info) { - setSearchRes(dataSource.filter((item) => item.repository == cate)); + setSearchRes( + dataSource.filter((item) => item.inventoryRepository == cate) + ); } else if (cate == -1 && time && !info) { setSearchRes( - dataSource.filter((item) => item.time.split(" ")[0] == time) + dataSource.filter( + (item) => item.inventoryCreatetime.split("T")[0] == time + ) ); } else if (cate == -1 && !time && info) { setSearchRes( dataSource.filter( - (item) => item.owner == info || item.type == info || item.name == info + (item) => + item.inventoryOwner == info || item.inventoryProductName == info ) ); } else if (cate == -1 && time && info) { setSearchRes( dataSource.filter( (item) => - item.time.split(" ")[0] == time && - (item.owner == info || item.type == info || item.name == info) + item.inventoryCreatetime.split("T")[0] == time && + (item.inventoryOwner == info || item.inventoryProductName == info) ) ); } else if (cate != -1 && time && !info) { setSearchRes( dataSource.filter( - (item) => item.time.split(" ")[0] == time && item.repository == cate + (item) => + item.inventoryCreatetime.split("T")[0] == time && + item.inventoryRepository == cate ) ); } else if (cate != -1 && !time && info) { setSearchRes( dataSource.filter( (item) => - item.repository == cate && - (item.owner == info || item.type == info || item.name == info) + item.inventoryRepository == cate && + (item.inventoryOwner == info || item.inventoryProductName == info) ) ); } else if (cate != -1 && time && info) { setSearchRes( dataSource.filter( (item) => - item.time.split(" ")[0] == time && - item.repository == cate && - (item.owner == info || item.type == info || item.name == info) + item.inventoryCreatetime.split("T")[0] == time && + item.inventoryRepository == cate && + (item.inventoryOwner == info || item.inventoryProductName == info) ) ); } - - //setSearchRes(dataSource.filter(item=>item.repository===cate&&item.time===time)); - console.log(cate); - console.log(time); - event.preventDefault(); + // console.log(cate); + // console.log(time); }; return ( @@ -126,7 +135,10 @@ const Stock = () => { .map((item) => Object.assign( {}, - { id: item.repository, name: item.repository } + { + id: item.inventoryRepository, + name: item.inventoryRepository, + } ) ) .concat({ id: "-1", name: "全部" })} @@ -145,7 +157,7 @@ const Stock = () => { setInfo(e.target.value)} - placeholder={"货主名称/货品名称/货品类型"} + placeholder={"货主IC/货品名称"} className={ "w-[200px] pl-2 py-1 outline-none border-gray-300 border-2 rounded" } diff --git a/src/components/WareManager/StockQuery.js b/src/components/WareManager/StockQuery.js deleted file mode 100644 index c9648858db9b9e174669231308d0d27b9325fa06..0000000000000000000000000000000000000000 --- a/src/components/WareManager/StockQuery.js +++ /dev/null @@ -1,87 +0,0 @@ -import React, { useState, useEffect } from "react"; -import axios from "axios"; -import { Table } from "antd"; -import { FiSearch } from "react-icons/fi"; -import { DatePicker, Space, ConfigProvider } from "antd"; -import locale from "antd/lib/locale/zh_CN"; - -import { wareCategories } from "../../utils/data"; -import Selector from "../Selector"; -import InputArea from "../InputArea"; -/* -class StockQuery extends React.Component{ - constructor(props){ - super(props); - this.state={ - queryCate:null, - queryDate:null, - queryInfo:null, - } - this.cateChange=this.cateChange.bind(this); - this.dateChange=this.dateChange.bind(this); - this.query=this.query.bind(this); - } - - cateChange(event){ - this.setState({ - queryCate:event.target.value, - }) - } - - dateChange(date, dateString){ - this.setState({ - queryDate:dateString, - }) - console.log(date, dateString); - } - - query(event){ - this.props.mockStockData=this.props.dataSource.filter(item=>item.time==this.state.queryDate), - - event.preventDefault(); - } - - render(){ - return( -
-
- - - - - - - - - - - - - - -
-
- ) - } -} - -export default StockQuery;*/ \ No newline at end of file diff --git a/src/components/WareManager/WareQuery.jsx b/src/components/WareManager/WareQuery.jsx index 27f6022b785795f64832f274de2a02ade4ef74b1..6487c06ea6f809caab24a64e8a1ad0357f0f6aa3 100644 --- a/src/components/WareManager/WareQuery.jsx +++ b/src/components/WareManager/WareQuery.jsx @@ -12,7 +12,7 @@ const { TabPane } = Tabs; // 流水查询 const WareQuery = () => { - const [cate, setCate] = useState(3); + const [cate, setCate] = useState(6); const [inTime, setInTime] = useState(null); const [outTime, setOutTime] = useState(null); const [inTime2, setInTime2] = useState(null); diff --git a/src/index.js b/src/index.js index e04292ef877bceb63c63b848eb673d31803d2bfb..c0fb00377113e394137e8254626d11ee370e62cb 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,6 @@ import { BrowserRouter as Router } from "react-router-dom"; import "./index.css"; import App from "./App"; import './mock'; -import reportWebVitals from "./reportWebVitals"; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( @@ -12,5 +11,3 @@ root.render( ); - -reportWebVitals(); diff --git a/src/pages/Admin.jsx b/src/pages/Admin.jsx index 37e124a470edb166f42d7e89ca33eb44d165a61e..ddd43e7acb24d73841957d83596fb984eead56fb 100644 --- a/src/pages/Admin.jsx +++ b/src/pages/Admin.jsx @@ -26,7 +26,6 @@ import { wareManagerMenu, priority, } from "../utils/data"; -import { loginAdmin } from "../utils/adminCookie"; const menuList = [ sysManagerMenu, @@ -36,15 +35,13 @@ const menuList = [ ]; const Admin = () => { - const [adminInfo] = loginAdmin(); + const username = localStorage.getItem("username"); + const localPriority = localStorage.getItem("priority"); return (
- +
-
+
} />