Commit dc8eebf1 authored by wuhao's avatar wuhao 🎯

jkuier

parent a5f936be
......@@ -78,6 +78,21 @@ export default [
},
],
},
{
path: "/historystore",
name: "出入库明细",
icon: "search",
routes: [
{
path: "/historystore/histore",
name: "出入库明细",
component: "./historystore/Histore",
},
{
component: "./404",
},
],
},
{
path: "/system",
name: "系统基础管理",
......
import React, { useState, useMemo, useRef, createContext } from 'react';
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 { useRequest } from 'ahooks';
import { doFetch } from '@/utils/doFetch';
......@@ -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 [savetitle, setsavetitle] = useState(null);
const [modal, setModal] = useState({
visible: false
});
const [expandall, setexpandall] = useState(false);
const [expandedKeys, onExpand] = useState();
const { data, loading, refresh } = useRequest(() => {
return doFetch({ url, params: { title: search } })
return doFetch({ url, params: params ?? { title: 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 treeData = useMemo(() => {
let res = data?.data?.dataList ?? [];
......@@ -35,14 +52,15 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
]
}, [data]);
const loop = data => data.map(item => {
const index = item.title.indexOf(search);
const beforeStr = item.title.substr(0, index);
const afterStr = item.title.substr(index + search.length);
const title =
let title =
index > -1 ? (
<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}
<span style={{ color: '#f50' }}>{search}</span>
{afterStr}
......@@ -50,13 +68,14 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
</Tooltip>
) : (
<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>
);
const actiontitle = (
<div style={{ display: "flex", alignItems: "center" }}>
<div style={{ display: "flex", alignItems: "center", justifyContent: "space-between" }}>
{title}
<div>
{
item.key != "0" && <Divider type='vertical' style={{ margin: "0 6px" }}></Divider>
}
......@@ -126,12 +145,40 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
<MinusSquareOutlined onClick={(e) => { e.stopPropagation() }} style={{ color: "red" }} />
</Tooltip>
</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>
)
}
// if (item.children) {
// return (
// <TreeNode key={item.key} title={actiontitle}>
......@@ -141,7 +188,7 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
// }
// return <TreeNode key={item.key} title={title} />;
return (
<TreeNode key={item.key} title={actiontitle}>
<TreeNode key={item.key} title={noaction ? title : actiontitle}>
{item.children && loop(item.children)}
</TreeNode>
);
......@@ -234,9 +281,15 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
<Tree
onSelect={(selectedKeys, e) => {
onselected?.(selectedKeys)
onselected?.(selectedKeys, e)
}}
autoExpandParent={true}
defaultExpandAll={true}
expandedKeys={expandedKeys}
onExpand={(expandedKeys) => {
console.log(expandedKeys);
onExpand(expandedKeys)
}}
>
{loop(treeData ? treeData : [])}
</Tree>
......
......@@ -322,3 +322,16 @@ table {
.ant-select-selector{
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 {
import { Breadcrumb, Layout, Menu, Input, Tooltip, Tree } from 'antd';
import React, { useState } from 'react';
import styles from './index.less'
import TreeRender from '@/components/TreeRender';
import AutoTable from "@/components/AutoTable";
const { Header, Content, Footer, Sider } = Layout,
{ Search } = Input
const Storesearch = () => {
const Storesearch = (props) => {
const [collapsed, setCollapsed] = useState(false);
const [search, setsearch] = 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 (
<Layout
style={{
......@@ -45,25 +92,15 @@ const Storesearch = () => {
/>
)}
</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 ?
<div style={{ padding: collapsed ? 0 : 12 }}>
<Tree
treeData={[
{ title: '全部仓库', key: '0' }, // 菜单项务必填写 key
{ title: '菜单项二', key: 'item-2' },
{
title: '子菜单',
key: 'submenu',
children: [{ title: '子菜单项', key: 'submenu-item-1' }],
},
]}
onSelect={(selectedKeys, e) => {
<TreeRender
url="/ngic-auth/sysStore/queryTreeList"
params={{}}
noaction={true}
maxWidth={140}
onselected={(selectedKeys, e) => {
setselect(selectedKeys[0] ? {
title: e.node.title,
selectedKeys: selectedKeys[0]
......@@ -71,7 +108,9 @@ const Storesearch = () => {
})
}}
/>
>
</TreeRender>
</div> :
<div onDoubleClick={() => {
setCollapsed(false)
......@@ -97,7 +136,7 @@ const Storesearch = () => {
}}
>
<Breadcrumb.Item>物料库存</Breadcrumb.Item>
<Breadcrumb.Item>{select.title}</Breadcrumb.Item>
<Breadcrumb.Item style={{ maxWidth: 600 }}>{select.title}</Breadcrumb.Item>
</Breadcrumb>
<div
className={styles.sitelayoutbackground}
......@@ -107,7 +146,11 @@ const Storesearch = () => {
flex: 1
}}
>
Bill is a cat.
<AutoTable
{
...tableprops
}
></AutoTable>
</div>
</Content>
</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 = {
key: 'one',
label: (
<a>
采购出库
生产领料出库
</a>
),
},
......@@ -30,7 +30,7 @@ const keytoval = {
key: 'two',
label: (
<a>
生产出库
销售出库
</a>
),
},
......@@ -38,7 +38,7 @@ const keytoval = {
key: 'three',
label: (
<a>
退料出库
报废出库
</a>
),
},
......@@ -97,7 +97,7 @@ function Instore(props) {
val: "detail",
title: `查看详情`,
...defaultFields?.detail,
totalPath: "/ngic-workmanship/wmsmaterieOutstore/getInStoreInfoById",
totalPath: "/ngic-workmanship/wmsMaterieOutstore/getOutStoreInfoById",
totalParams: { id: record.id }
}))
}}
......@@ -241,7 +241,7 @@ function Instore(props) {
val: "detail",
title: `查看详情`,
...defaultFields?.detail,
totalPath: "/ngic-workmanship/wmsmaterieOutstoreHis/getInStoreInfoById",
totalPath: "/ngic-workmanship/wmsMaterieOutstoreHis/getOutStoreInfoById",
totalParams: { id: record.id }
}))
}}
......@@ -255,15 +255,15 @@ function Instore(props) {
"valueType": "select",
"options": [
{
"label": "采购出库",
"label": "生产领料出库",
"value": "1"
},
{
"label": "生产出库",
"label": "销售出库",
"value": "2"
},
{
"label": "退料出库",
"label": "报废出库",
"value": "3"
},
{
......@@ -404,6 +404,10 @@ function Instore(props) {
{...drawprops}
submitData={async (value) => {
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 } })
if (res.code == "0000") {
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