Commit dc8eebf1 authored by wuhao's avatar wuhao 🎯

jkuier

parent a5f936be
...@@ -78,6 +78,21 @@ export default [ ...@@ -78,6 +78,21 @@ export default [
}, },
], ],
}, },
{
path: "/historystore",
name: "出入库明细",
icon: "search",
routes: [
{
path: "/historystore/histore",
name: "出入库明细",
component: "./historystore/Histore",
},
{
component: "./404",
},
],
},
{ {
path: "/system", path: "/system",
name: "系统基础管理", name: "系统基础管理",
......
import React, { useState, useMemo, useRef, createContext } from 'react'; import React, { useState, useMemo, useRef, createContext } from 'react';
import { Tree, Input, Popconfirm, Tooltip, Divider, Modal, message } from 'antd'; import { Tree, Input, Popconfirm, Tooltip, Divider, Modal, message } from 'antd';
import { MinusSquareOutlined, FormOutlined, PlusSquareOutlined } from '@ant-design/icons'; import { MinusSquareOutlined, FormOutlined, PlusSquareOutlined, ArrowDownOutlined, ArrowRightOutlined } from '@ant-design/icons';
import getPrem from '@/utils/getPrem'; import getPrem from '@/utils/getPrem';
import { useRequest } from 'ahooks'; import { useRequest } from 'ahooks';
import { doFetch } from '@/utils/doFetch'; import { doFetch } from '@/utils/doFetch';
...@@ -12,17 +12,34 @@ let { Search } = Input, ...@@ -12,17 +12,34 @@ let { Search } = Input,
function TreeRender({ url, deleteurl, saveurl, onselected }) { function TreeRender({ url, deleteurl, saveurl, onselected, params, noaction, maxWidth }) {
const [search, setsearch] = useState(""); const [search, setsearch] = useState("");
const [savetitle, setsavetitle] = useState(null); const [savetitle, setsavetitle] = useState(null);
const [modal, setModal] = useState({ const [modal, setModal] = useState({
visible: false visible: false
}); });
const [expandall, setexpandall] = useState(false);
const [expandedKeys, onExpand] = useState();
const { data, loading, refresh } = useRequest(() => { const { data, loading, refresh } = useRequest(() => {
return doFetch({ url, params: { title: search } }) return doFetch({ url, params: params ?? { title: search } })
}, { }, {
refreshDeps: [search] refreshDeps: [search]
}); });
const allkeys = useMemo(() => {
let res = [];
const fn = (source) => {
source.map(el => {
res.push(el)
el.children && el.children.length > 0 ? fn(el.children) : "" // 子级递归
})
}
fn(data?.data?.dataList ?? []);
return res.filter(it => it.children).map(it => it.key)
}, [data])
const ref1 = useRef(), ref2 = useRef(); const ref1 = useRef(), ref2 = useRef();
const treeData = useMemo(() => { const treeData = useMemo(() => {
let res = data?.data?.dataList ?? []; let res = data?.data?.dataList ?? [];
...@@ -35,14 +52,15 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) { ...@@ -35,14 +52,15 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
] ]
}, [data]); }, [data]);
const loop = data => data.map(item => { const loop = data => data.map(item => {
const index = item.title.indexOf(search); const index = item.title.indexOf(search);
const beforeStr = item.title.substr(0, index); const beforeStr = item.title.substr(0, index);
const afterStr = item.title.substr(index + search.length); const afterStr = item.title.substr(index + search.length);
const title = let title =
index > -1 ? ( index > -1 ? (
<Tooltip title={item.title} placement="bottom"> <Tooltip title={item.title} placement="bottom">
<span style={{ display: "inline-block", maxWidth: 88, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}> <span style={{ display: "inline-block", maxWidth: maxWidth ?? 88, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
{beforeStr} {beforeStr}
<span style={{ color: '#f50' }}>{search}</span> <span style={{ color: '#f50' }}>{search}</span>
{afterStr} {afterStr}
...@@ -50,13 +68,14 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) { ...@@ -50,13 +68,14 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
</Tooltip> </Tooltip>
) : ( ) : (
<Tooltip title={item.title} placement="bottom"> <Tooltip title={item.title} placement="bottom">
<span style={{ display: "inline-block", maxWidth: 88, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>{item.title}</span> <span style={{ display: "inline-block", maxWidth: maxWidth ?? 88, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>{item.title}</span>
</Tooltip> </Tooltip>
); );
const actiontitle = ( const actiontitle = (
<div style={{ display: "flex", alignItems: "center" }}> <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between" }}>
{title} {title}
<div>
{ {
item.key != "0" && <Divider type='vertical' style={{ margin: "0 6px" }}></Divider> item.key != "0" && <Divider type='vertical' style={{ margin: "0 6px" }}></Divider>
} }
...@@ -126,12 +145,40 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) { ...@@ -126,12 +145,40 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
<MinusSquareOutlined onClick={(e) => { e.stopPropagation() }} style={{ color: "red" }} /> <MinusSquareOutlined onClick={(e) => { e.stopPropagation() }} style={{ color: "red" }} />
</Tooltip> </Tooltip>
</Popconfirm> </Popconfirm>
} }
{
item.key === "" && <Divider type='vertical' style={{ margin: "0 6px" }}></Divider>
}
{
item.key === "" && <Tooltip title={expandall ? "收起" : "展开"} onClick={(e) => {
e.stopPropagation();
setexpandall(!expandall)
onExpand(expandall ? [] : allkeys)
}}>
{expandall ? <ArrowDownOutlined /> : <ArrowRightOutlined />}
</Tooltip>
}
</div>
</div>
)
if (item.key === "") {
title = (
<div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", flex: 1 }}>
{title}
<Tooltip title={expandall ? "收起" : "展开"} onClick={(e) => {
e.stopPropagation();
setexpandall(!expandall)
onExpand(expandall ? [] : allkeys)
}}>
{expandall ? <ArrowDownOutlined /> : <ArrowRightOutlined />}
</Tooltip>
</div> </div>
) )
}
// if (item.children) { // if (item.children) {
// return ( // return (
// <TreeNode key={item.key} title={actiontitle}> // <TreeNode key={item.key} title={actiontitle}>
...@@ -141,7 +188,7 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) { ...@@ -141,7 +188,7 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
// } // }
// return <TreeNode key={item.key} title={title} />; // return <TreeNode key={item.key} title={title} />;
return ( return (
<TreeNode key={item.key} title={actiontitle}> <TreeNode key={item.key} title={noaction ? title : actiontitle}>
{item.children && loop(item.children)} {item.children && loop(item.children)}
</TreeNode> </TreeNode>
); );
...@@ -234,9 +281,15 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) { ...@@ -234,9 +281,15 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
<Tree <Tree
onSelect={(selectedKeys, e) => { onSelect={(selectedKeys, e) => {
onselected?.(selectedKeys) onselected?.(selectedKeys, e)
}} }}
autoExpandParent={true} autoExpandParent={true}
defaultExpandAll={true}
expandedKeys={expandedKeys}
onExpand={(expandedKeys) => {
console.log(expandedKeys);
onExpand(expandedKeys)
}}
> >
{loop(treeData ? treeData : [])} {loop(treeData ? treeData : [])}
</Tree> </Tree>
......
...@@ -322,3 +322,16 @@ table { ...@@ -322,3 +322,16 @@ table {
.ant-select-selector{ .ant-select-selector{
overflow: hidden !important; overflow: hidden !important;
} }
.ant-breadcrumb{
span{
>span{
max-width: 600px !important;
}
}
}
.ant-tree .ant-tree-treenode{
width: 100%;
>span:last-child{
flex:1
}
}
\ No newline at end of file
...@@ -6,16 +6,63 @@ import { ...@@ -6,16 +6,63 @@ import {
import { Breadcrumb, Layout, Menu, Input, Tooltip, Tree } from 'antd'; import { Breadcrumb, Layout, Menu, Input, Tooltip, Tree } from 'antd';
import React, { useState } from 'react'; import React, { useState } from 'react';
import styles from './index.less' import styles from './index.less'
import TreeRender from '@/components/TreeRender';
import AutoTable from "@/components/AutoTable";
const { Header, Content, Footer, Sider } = Layout, const { Header, Content, Footer, Sider } = Layout,
{ Search } = Input { Search } = Input
const Storesearch = () => { const Storesearch = (props) => {
const [collapsed, setCollapsed] = useState(false); const [collapsed, setCollapsed] = useState(false);
const [search, setsearch] = useState(); const [search, setsearch] = useState();
const [select, setselect] = useState({}); const [select, setselect] = useState({});
const columns = [
{
"title": "物料编码",
"dataIndex": "materieCode",
"key": "materieCode"
},
{
"title": "物料名称",
"dataIndex": "materieName",
"key": "materieName"
},
{
"title": "物料类型",
"dataIndex": "materieTypeName",
"key": "materieTypeName"
},
{
"title": "库存数量",
"dataIndex": "stockNum",
"key": "stockNum",
"search": false
},
{
"title": "可用库存",
"dataIndex": "usableNum",
"key": "usableNum",
"search": false
},
{
"title": "库存单位",
"dataIndex": "productionUnitName",
"key": "productionUnitName",
"search": false
}
]
const tableprops = {
...props,
pageextra: "none",
columns,
path: "/ngic-workmanship/wmsMaterieStock/queryStockList"
}
return ( return (
<Layout <Layout
style={{ style={{
...@@ -45,25 +92,15 @@ const Storesearch = () => { ...@@ -45,25 +92,15 @@ const Storesearch = () => {
/> />
)} )}
</div> </div>
{
!collapsed && <div style={{ padding: 12, paddingBottom: collapsed ? 12 : 0 }}>
<Search value={search} onChange={e => setsearch(e.target.value)} style={{ marginRight: 10 }}></Search>
</div>
}
{ {
!collapsed ? !collapsed ?
<div style={{ padding: collapsed ? 0 : 12 }}> <div style={{ padding: collapsed ? 0 : 12 }}>
<Tree <TreeRender
treeData={[ url="/ngic-auth/sysStore/queryTreeList"
{ title: '全部仓库', key: '0' }, // 菜单项务必填写 key params={{}}
{ title: '菜单项二', key: 'item-2' }, noaction={true}
{ maxWidth={140}
title: '子菜单', onselected={(selectedKeys, e) => {
key: 'submenu',
children: [{ title: '子菜单项', key: 'submenu-item-1' }],
},
]}
onSelect={(selectedKeys, e) => {
setselect(selectedKeys[0] ? { setselect(selectedKeys[0] ? {
title: e.node.title, title: e.node.title,
selectedKeys: selectedKeys[0] selectedKeys: selectedKeys[0]
...@@ -71,7 +108,9 @@ const Storesearch = () => { ...@@ -71,7 +108,9 @@ const Storesearch = () => {
}) })
}} }}
/> >
</TreeRender>
</div> : </div> :
<div onDoubleClick={() => { <div onDoubleClick={() => {
setCollapsed(false) setCollapsed(false)
...@@ -97,7 +136,7 @@ const Storesearch = () => { ...@@ -97,7 +136,7 @@ const Storesearch = () => {
}} }}
> >
<Breadcrumb.Item>物料库存</Breadcrumb.Item> <Breadcrumb.Item>物料库存</Breadcrumb.Item>
<Breadcrumb.Item>{select.title}</Breadcrumb.Item> <Breadcrumb.Item style={{ maxWidth: 600 }}>{select.title}</Breadcrumb.Item>
</Breadcrumb> </Breadcrumb>
<div <div
className={styles.sitelayoutbackground} className={styles.sitelayoutbackground}
...@@ -107,7 +146,11 @@ const Storesearch = () => { ...@@ -107,7 +146,11 @@ const Storesearch = () => {
flex: 1 flex: 1
}} }}
> >
Bill is a cat. <AutoTable
{
...tableprops
}
></AutoTable>
</div> </div>
</Content> </Content>
</Layout> </Layout>
......
This diff is collapsed.
import React, { useEffect, useMemo, useRef, useState } from "react";
import {
Dropdown,
Menu,
Button,
message,
} from "antd";
import AutoTable from "@/components/AutoTable";
import defaultFields from "./fields";
import { doFetch } from "@/utils/doFetch";
import DrawInitForm from "@/components/DrawInitForm";
import getPrem from '@/utils/getPrem';//权限判断fn
function Instore(props) {
const actionRef = useRef(),
ChildRef = null;
const columns = [
{
"title": "操作时间",
"dataIndex": "operateTime",
"key": "operateTimeList",
"valueType": "dateRange",
"render": (_, row) => {return (<div>{row.operateTime}</div>)},
},
{
"title": "操作人",
"dataIndex": "operateUserName",
"key": "operateUserName"
},
{
"title": "物料编码",
"dataIndex": "materieCode",
"key": "materieCode"
},
{
"title": "物料名称",
"dataIndex": "materieName",
"key": "materieName"
},
{
"title": "批次号/SN号",
"dataIndex": "materieControlNo",
"key": "materieControlNo"
},
{
"title": "当时库存数量",
"dataIndex": "currentNum",
"key": "currentNum",
"search": false
},
{
"title": "操作数量",
"dataIndex": "operateNum",
"key": "operateNum",
"search": false
},
{
"title": "库存单位",
"dataIndex": "productionUnitName",
"key": "productionUnitName",
"search": false
},
{
"title": "操作类型",
"dataIndex": "stockTypeName",
"key": "stockTypeName",
},
{
"title": "仓库名称",
"dataIndex": "storeName",
"key": "storeName"
},
{
"title": "库位",
"dataIndex": "storePositionName",
"key": "storePositionName"
},
{
"title": "相关单号",
"dataIndex": "relatedNo",
"key": "relatedNo"
}
]
const tableprops = {
...props,
pageextra: "none",
columns,
path: "/ngic-workmanship/wmsMaterieStockRecord/queryList"
}
return (
<div>
<AutoTable
{
...tableprops
}
actionRef={actionRef}
onRef={(node) => (ChildRef = node)}
></AutoTable>
</div>
);
}
export default Instore;
\ No newline at end of file
.sitelayout {
min-height: calc(100vh - 98px) !important;
.sitelayoutbackground {
background: #fff;
}
}
.title{
margin: 0px;
}
\ No newline at end of file
...@@ -22,7 +22,7 @@ const keytoval = { ...@@ -22,7 +22,7 @@ const keytoval = {
key: 'one', key: 'one',
label: ( label: (
<a> <a>
采购出库 生产领料出库
</a> </a>
), ),
}, },
...@@ -30,7 +30,7 @@ const keytoval = { ...@@ -30,7 +30,7 @@ const keytoval = {
key: 'two', key: 'two',
label: ( label: (
<a> <a>
生产出库 销售出库
</a> </a>
), ),
}, },
...@@ -38,7 +38,7 @@ const keytoval = { ...@@ -38,7 +38,7 @@ const keytoval = {
key: 'three', key: 'three',
label: ( label: (
<a> <a>
退料出库 报废出库
</a> </a>
), ),
}, },
...@@ -97,7 +97,7 @@ function Instore(props) { ...@@ -97,7 +97,7 @@ function Instore(props) {
val: "detail", val: "detail",
title: `查看详情`, title: `查看详情`,
...defaultFields?.detail, ...defaultFields?.detail,
totalPath: "/ngic-workmanship/wmsmaterieOutstore/getInStoreInfoById", totalPath: "/ngic-workmanship/wmsMaterieOutstore/getOutStoreInfoById",
totalParams: { id: record.id } totalParams: { id: record.id }
})) }))
}} }}
...@@ -241,7 +241,7 @@ function Instore(props) { ...@@ -241,7 +241,7 @@ function Instore(props) {
val: "detail", val: "detail",
title: `查看详情`, title: `查看详情`,
...defaultFields?.detail, ...defaultFields?.detail,
totalPath: "/ngic-workmanship/wmsmaterieOutstoreHis/getInStoreInfoById", totalPath: "/ngic-workmanship/wmsMaterieOutstoreHis/getOutStoreInfoById",
totalParams: { id: record.id } totalParams: { id: record.id }
})) }))
}} }}
...@@ -255,15 +255,15 @@ function Instore(props) { ...@@ -255,15 +255,15 @@ function Instore(props) {
"valueType": "select", "valueType": "select",
"options": [ "options": [
{ {
"label": "采购出库", "label": "生产领料出库",
"value": "1" "value": "1"
}, },
{ {
"label": "生产出库", "label": "销售出库",
"value": "2" "value": "2"
}, },
{ {
"label": "退料出库", "label": "报废出库",
"value": "3" "value": "3"
}, },
{ {
...@@ -404,6 +404,10 @@ function Instore(props) { ...@@ -404,6 +404,10 @@ function Instore(props) {
{...drawprops} {...drawprops}
submitData={async (value) => { submitData={async (value) => {
if (drawprops.val == "add") { if (drawprops.val == "add") {
value.materialList = value.materialList?.map(it=>{
delete it.usableNum;
return it
})//usableNum
let res = await doFetch({ url: "/ngic-workmanship/wmsMaterieOutstore/saveOutStore", params: { ...value, outstoreType: drawprops.outstoreType } }) let res = await doFetch({ url: "/ngic-workmanship/wmsMaterieOutstore/saveOutStore", params: { ...value, outstoreType: drawprops.outstoreType } })
if (res.code == "0000") { if (res.code == "0000") {
reload(); reload();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment