Commit 9ee00993fab8dbc457d262e25becec03706e2881

Authored by 王强
2 parents 45201ff7 7043c73b

Merge branch 'bug_fix' of gitlab.feewee.cn:FEV2/fw-cms into ehr-ability

config/routers/capital.ts
@@ -28,11 +28,19 @@ export default [ @@ -28,11 +28,19 @@ export default [
28 component: './capital/StandardName' 28 component: './capital/StandardName'
29 }, 29 },
30 { 30 {
  31 + path: '/ams/maintenance/stock', // 运维库存池查询
  32 + component: './capital/Maintenance/StockQuery'
  33 + },
  34 + {
  35 + path: '/ams/maintenance/standard/config/:disabled?', // 运维物品标准查询
  36 + component: './capital/StandardMange'
  37 + },
  38 + {
31 path: '/ams/standardMange/receive/rules/goods/:id?/:name?', // 按物品领用规则 39 path: '/ams/standardMange/receive/rules/goods/:id?/:name?', // 按物品领用规则
32 component: './capital/ReceiveRules/subPages/GoodsDimension' 40 component: './capital/ReceiveRules/subPages/GoodsDimension'
33 }, 41 },
34 { 42 {
35 - path: '/ams/standardMange/auth/goods/:id?', // 按物品授权分页列表 43 + path: '/ams/standardMange/auth/goods/:id?/:disabled?', // 按物品授权分页列表
36 component: './capital/ReceiveRules/subPages/GoodsDimension/components/PageAuthEdit' 44 component: './capital/ReceiveRules/subPages/GoodsDimension/components/PageAuthEdit'
37 }, 45 },
38 { 46 {
src/pages/attendance/FieldService/subpages/WorkAddress/components/TravelAddressModal.tsx
@@ -46,6 +46,9 @@ export default function ModalIndex(props: Props) { @@ -46,6 +46,9 @@ export default function ModalIndex(props: Props) {
46 if ((current.maxStayMinute || 0) >= 60) { 46 if ((current.maxStayMinute || 0) >= 60) {
47 maxStayMinute = (current.maxStayMinute || 0) % 60; 47 maxStayMinute = (current.maxStayMinute || 0) % 60;
48 maxStayHour = Math.floor((current.maxStayMinute || 0) / 60) 48 maxStayHour = Math.floor((current.maxStayMinute || 0) / 60)
  49 + } else {
  50 + maxStayMinute = (current.maxStayMinute || 0)
  51 + maxStayHour = 0
49 } 52 }
50 let feildsValue: any = { 53 let feildsValue: any = {
51 ...current, 54 ...current,
@@ -87,7 +90,7 @@ export default function ModalIndex(props: Props) { @@ -87,7 +90,7 @@ export default function ModalIndex(props: Props) {
87 // return; 90 // return;
88 // } 91 // }
89 // } 92 // }
90 - const maxStayMinute = params.maxStayMinute + params.maxStayHour * 60; 93 + const maxStayMinute = (params.maxStayMinute || 0)+ (params.maxStayHour || 0) * 60;
91 setLoading(true); 94 setLoading(true);
92 let _param = { 95 let _param = {
93 ...params, 96 ...params,
src/pages/capital/Maintenance/StockQuery/api.ts 0 → 100644
  1 +import request from '@/utils/request';
  2 +import { AMS_HOST } from '@/utils/host';
  3 +import { http } from '@/typing/http';
  4 +
  5 +export interface ListParams {
  6 + /**是否代管物品 1代管 0被领用 */
  7 + agent?: boolean;
  8 + /**资产类型 1固定资产 2低质品 3易耗品 */
  9 + type?: number;
  10 + /**关键字 */
  11 + keywords?: string;
  12 + /**库存来源类型 1.资产 2.配件 3.市场物料 */
  13 + sourceType?: number;
  14 + /**状态 1正常2已报废3已变卖 */
  15 + status?: number;
  16 + /**是否维修中 0正常1处理中 */
  17 + repair?: boolean;
  18 + /**是否报废中 0正常1处理中 */
  19 + scrap?: boolean;
  20 + /**是否变卖中 0正常1处理中 */
  21 + sell?: boolean;
  22 + /**是否调拨中 0正常1处理中 */
  23 + allocate?: boolean;
  24 + /**是否退回中 0正常1处理中 */
  25 + transfer?: boolean;
  26 + /**管理人员姓名
  27 + 216 */
  28 + staffName?: string;
  29 + /** 物品唯一标识 */
  30 + uniqueCode?: string;
  31 + pageSize?: number;
  32 + current?: number;
  33 +}
  34 +export interface ListItems {
  35 + poolId: number;
  36 + fids: string;
  37 + name: string;
  38 + type: number;
  39 + standardId: number;
  40 + code: string;
  41 + uniqueCode: string;
  42 + unit: string;
  43 + specList: StanderList.AuthSpecList,
  44 + assetShopId: number;
  45 + assetShopName: string;
  46 + useShopId: number;
  47 + useShopName: string;
  48 + storageTime: number;
  49 + receiveTime: number;
  50 + storageNum: number;
  51 + staffId: number;
  52 + staffName: string;
  53 + manager: string;
  54 + unitPrice: number;
  55 +}
  56 +
  57 +export function getDateApi(params: ListParams): http.PromisePageResp<ListItems> {
  58 + return request.get(`${AMS_HOST}/erp/operations/inventory/pool/page`, { params });
  59 +}
src/pages/capital/Maintenance/StockQuery/components/Filter.tsx 0 → 100644
  1 +import React from 'react';
  2 +import { Input, Radio, Row, Select } from 'antd';
  3 +import { debounce } from 'lodash';
  4 +import useInitail from '@/hooks/useInitail';
  5 +import { getShopApi } from '@/common/api';
  6 +
  7 +const Option = Select.Option;
  8 +interface Props {
  9 + setParams: Function;
  10 + innerParams: AmsSpec.ListParams;
  11 +}
  12 +export default function SeriesFilter({ setParams, innerParams }: Props) {
  13 + const { data: shopList } = useInitail<Array<CommonApi.OptionVO>, CommonApi.ShopParam>(getShopApi, [], {});
  14 +
  15 + const fetchListByName = debounce(value => {
  16 + setParams({ ...value, current: 1 }, true);
  17 + }, 500);
  18 +
  19 + const onSearch = (value: object) => setParams({ ...value, current: 1 }, true);
  20 + return (
  21 + <div>
  22 + <Row justify="space-between" style={{ flexWrap: "wrap" }}>
  23 + <Input.Search
  24 + allowClear
  25 + style={{ flex: 1, marginRight: 10 }}
  26 + onChange={e => fetchListByName({ keywords: e.target.value })}
  27 + onSearch={v => setParams({ keywords: v }, true)}
  28 + placeholder="物品名称/编码"
  29 + />
  30 + {/* <Input.Search
  31 + allowClear
  32 + style={{ flex: 1, marginRight: 10 }}
  33 + onChange={e => fetchListByName({ uniqueCode: e.target.value })}
  34 + onSearch={v => setParams({ uniqueCode: v }, true)}
  35 + placeholder="物品唯一标识"
  36 + /> */}
  37 + <Input.Search
  38 + allowClear
  39 + style={{ flex: 1, marginRight: 10 }}
  40 + onChange={e => fetchListByName({ staffName: e.target.value })}
  41 + onSearch={v => setParams({ staffName: v }, true)}
  42 + placeholder="管理人员姓名"
  43 + />
  44 + <Select
  45 + optionFilterProp="children"
  46 + showSearch
  47 + allowClear
  48 + placeholder="物品使用门店"
  49 + style={{ flex: 1, marginRight: 10 }}
  50 + onChange={(value) => onSearch({ useShopId: value })}
  51 + >
  52 + {shopList.map((item) => (
  53 + <Option key={item.id} value={item.id}>
  54 + {item.name}
  55 + </Option>
  56 + ))}
  57 + </Select>
  58 + <Select
  59 + optionFilterProp="children"
  60 + showSearch
  61 + allowClear
  62 + placeholder="物品归属门店"
  63 + style={{ flex: 1, marginRight: 10 }}
  64 + onChange={(value) => onSearch({ assetShopId: value })}
  65 + >
  66 + {shopList.map((item) => (
  67 + <Option key={item.id} value={item.id}>
  68 + {item.name}
  69 + </Option>
  70 + ))}
  71 + </Select>
  72 + </Row>
  73 +
  74 + <Row justify="space-between" style={{ marginTop: 10 }}>
  75 + <Select style={{ flex: 1, marginRight: 10 }} allowClear onChange={(v) => onSearch({ type: v })} placeholder="资产类型">
  76 + <Option value={1} key={1}>固定资产</Option>
  77 + <Option value={2} key={2}>低值品</Option>
  78 + <Option value={3} key={3}>易耗品</Option>
  79 + </Select>
  80 + <Select style={{ flex: 1, marginRight: 10 }} allowClear onChange={(v) => onSearch({ agent: v })} placeholder="是否代管物品">
  81 + <Option value={1} key={1}>代管</Option>
  82 + <Option value={0} key={0}>被领用</Option>
  83 + </Select>
  84 + {/* <Select style={{ flex: 1, marginRight: 10 }} allowClear onChange={(v) => onSearch({ sourceType: v })} placeholder="库存来源类型">
  85 + <Option value={1} key={1}>资产</Option>
  86 + <Option value={2} key={2}>配件</Option>
  87 + <Option value={3} key={3}>市场物料</Option>
  88 + </Select> */}
  89 + <Select style={{ flex: 1, marginRight: 10 }} allowClear onChange={(v) => onSearch({ status: v })} placeholder="状态">
  90 + <Option value={1} key={1}>正常</Option>
  91 + <Option value={2} key={2}>已报废</Option>
  92 + <Option value={3} key={3}>已变卖</Option>
  93 + </Select>
  94 + <Select style={{ flex: 1, marginRight: 10 }} allowClear onChange={(v) => onSearch({ repair: v })} placeholder="是否维修中">
  95 + <Option value={0} key={0}>正常</Option>
  96 + <Option value={1} key={1}>处理中</Option>
  97 + </Select>
  98 + </Row>
  99 +
  100 + <Row justify="space-between" style={{ marginTop: 10, marginBottom: 15 }}>
  101 + <Select style={{ flex: 1, marginRight: 10 }} allowClear onChange={(v) => onSearch({ sell: v })} placeholder="是否变卖中">
  102 + <Option value={0} key={0}>正常</Option>
  103 + <Option value={1} key={1}>处理中</Option>
  104 + </Select>
  105 + <Select style={{ flex: 1, marginRight: 10 }} allowClear onChange={(v) => onSearch({ allocate: v })} placeholder="是否调拨中">
  106 + <Option value={0} key={0}>正常</Option>
  107 + <Option value={1} key={1}>处理中</Option>
  108 + </Select>
  109 + <Select style={{ flex: 1, marginRight: 10 }} allowClear onChange={(v) => onSearch({ transfer: v })} placeholder="是否退回中">
  110 + <Option value={0} key={0}>正常</Option>
  111 + <Option value={1} key={1}>处理中</Option>
  112 + </Select>
  113 + <Select style={{ flex: 1, marginRight: 10 }} allowClear onChange={(v) => onSearch({ scrap: v })} placeholder="是否报废中">
  114 + <Option value={0} key={0}>正常</Option>
  115 + <Option value={1} key={1}>处理中</Option>
  116 + </Select>
  117 + </Row>
  118 + </div>
  119 + );
  120 +}
0 \ No newline at end of file 121 \ No newline at end of file
src/pages/capital/Maintenance/StockQuery/index.tsx 0 → 100644
  1 +import React from 'react';
  2 +import { PageHeaderWrapper } from '@ant-design/pro-layout';
  3 +import { Card, Table } from 'antd';
  4 +import * as api from './api';
  5 +import Column from 'antd/lib/table/Column';
  6 +import Filter from './components/Filter';
  7 +import moment from 'moment';
  8 +import usePagination from '@/hooks/usePagination';
  9 +import RenderGoodsSpec from '@/pages/capital/components/RenderGoodsSpec';
  10 +import { AssetTypeEnum } from '@/pages/capital/entity';
  11 +
  12 +export default function SpecConfig() {
  13 + const { list, loading, paginationConfig, setParams, innerParams, setLoading } = usePagination(api.getDateApi, { status: 1 });
  14 +
  15 + return (
  16 + <PageHeaderWrapper title="库存池查询">
  17 + <Card>
  18 + <Filter setParams={setParams} innerParams={innerParams} />
  19 + <Table
  20 + dataSource={list}
  21 + loading={loading}
  22 + pagination={paginationConfig}
  23 + rowKey="poolId"
  24 + size="small"
  25 + >
  26 + <Column title="物品名称" dataIndex="name" />
  27 + <Column title="物品编码" dataIndex="code" />
  28 + <Column title="唯一标识" dataIndex="uniqueCode" />
  29 + <Column
  30 + title="型号规格"
  31 + dataIndex="specList"
  32 + width="16%"
  33 + ellipsis
  34 + render={(text, record) => <RenderGoodsSpec specList={text} />}
  35 + />
  36 + <Column
  37 + title="物品类型"
  38 + dataIndex="type"
  39 + render={(value) => (
  40 + <span>{AssetTypeEnum[value]}</span>
  41 + )}
  42 + />
  43 + <Column title="资产归属门店" dataIndex="assetShopName" />
  44 + <Column title="使用门店" dataIndex="useShopName" />
  45 + <Column title="是否代管" dataIndex="agent" render={t => (t ? "是" : "否")} />
  46 + <Column title="库存数量" dataIndex="storageNum" render={(t, record: api.ListItems) => `${t || 0}${record.unit}`} />
  47 + <Column title="管理员工" dataIndex="staffName" />
  48 + <Column title="入库时间" dataIndex="storageTime" render={(t) => t && moment(t).format("YYYY-MM-DD hh:mm") || '--'} />
  49 + <Column title="领用时间" dataIndex="receiveTime" render={(t) => t && moment(t).format("YYYY-MM-DD hh:mm") || '--'} />
  50 + {/* <Column title="采购单价金额(元)" dataIndex="unitPrice" /> */}
  51 + </Table>
  52 + </Card>
  53 + </PageHeaderWrapper>
  54 + );
  55 +}
0 \ No newline at end of file 56 \ No newline at end of file
src/pages/capital/ReceiveRules/subPages/GoodsDimension/components/PageAuthEdit/index.tsx
@@ -18,7 +18,7 @@ interface Props { @@ -18,7 +18,7 @@ interface Props {
18 18
19 export default function SpecConfig(props: Props) { 19 export default function SpecConfig(props: Props) {
20 const { match } = props; 20 const { match } = props;
21 - const { id } = match.params; 21 + const { id, disabled } = match.params;
22 const { list, loading, setLoading, paginationConfig, innerParams, setParams } = usePagination(getGoodsAuthDetail, { standardId: id }); 22 const { list, loading, setLoading, paginationConfig, innerParams, setParams } = usePagination(getGoodsAuthDetail, { standardId: id });
23 const [confirLoaing, setConfirLoading] = useState<boolean>(false); 23 const [confirLoaing, setConfirLoading] = useState<boolean>(false);
24 const [modalPa, setModalPa] = useState({ visible: false, rowValue: undefined }); 24 const [modalPa, setModalPa] = useState({ visible: false, rowValue: undefined });
@@ -82,7 +82,7 @@ export default function SpecConfig(props: Props) { @@ -82,7 +82,7 @@ export default function SpecConfig(props: Props) {
82 /> 82 />
83 </div> 83 </div>
84 </Row> 84 </Row>
85 - <Button type="primary" icon={<PlusOutlined />} onClick={() => setModalPa({ visible: true })}>新增</Button> 85 + {!disabled && (<Button type="primary" icon={<PlusOutlined />} onClick={() => setModalPa({ visible: true })}>新增</Button>)}
86 </Row> 86 </Row>
87 <Table 87 <Table
88 dataSource={list} 88 dataSource={list}
@@ -118,7 +118,7 @@ export default function SpecConfig(props: Props) { @@ -118,7 +118,7 @@ export default function SpecConfig(props: Props) {
118 align="center" 118 align="center"
119 title="操作" 119 title="操作"
120 render={(value) => { 120 render={(value) => {
121 - return ( 121 + return !disabled ? (
122 <> 122 <>
123 <Button type="link" onClick={() => edit(value)}> 123 <Button type="link" onClick={() => edit(value)}>
124 编辑 124 编辑
@@ -130,7 +130,7 @@ export default function SpecConfig(props: Props) { @@ -130,7 +130,7 @@ export default function SpecConfig(props: Props) {
130 </Button> 130 </Button>
131 </Popconfirm> 131 </Popconfirm>
132 </> 132 </>
133 - ); 133 + ) : null;
134 }} 134 }}
135 /> 135 />
136 </Table> 136 </Table>
src/pages/capital/ReceiveRules/subPages/GoodsDimension/index.tsx
@@ -53,9 +53,10 @@ export default function Index(props: Props) { @@ -53,9 +53,10 @@ export default function Index(props: Props) {
53 <RenderSelectGoos /> 53 <RenderSelectGoos />
54 </Form.Item> 54 </Form.Item>
55 ) : ( 55 ) : (
56 - <Form.Item label="物品名称">  
57 - <Input bordered={false} value={name} />  
58 - </Form.Item> 56 + // <Form.Item label="物品名称">
  57 + // <Input bordered={false} value={name} />
  58 + // </Form.Item>
  59 + null
59 )} 60 )}
60 <Form.Item label="按门店授权" name="shopAuthPostList" rules={[{ required: true, message: '添加授权信息' }]}> 61 <Form.Item label="按门店授权" name="shopAuthPostList" rules={[{ required: true, message: '添加授权信息' }]}>
61 <AuthTableList /> 62 <AuthTableList />
src/pages/capital/StandardMange/components/Add/index.tsx
@@ -17,10 +17,13 @@ const Option = Select.Option; @@ -17,10 +17,13 @@ const Option = Select.Option;
17 const RadioGroup = Radio.Group; 17 const RadioGroup = Radio.Group;
18 18
19 export default function AddItem() { 19 export default function AddItem() {
20 - const { typeName, data = [], currentItem = {}, unitItem, setBreadcrumbs, setLoading, setCurrentBreadcrumb, setIsPart } = useStore() 20 + const { typeName, data = [], currentItem = {}, unitItem, setBreadcrumbs, setLoading, setCurrentBreadcrumb, setIsPart, editDisabled } = useStore();
21 const [saveConfig, setSaveConfig] = useState<boolean>(false); 21 const [saveConfig, setSaveConfig] = useState<boolean>(false);
22 const [nameId, setNameId] = useState<number>(); 22 const [nameId, setNameId] = useState<number>();
23 const [visible, setVisible] = useState(false); 23 const [visible, setVisible] = useState(false);
  24 + const [partValue, setPartValue] = useState<{
  25 + partId?: number, partCode?: string,
  26 + }>({});
24 const [form] = Form.useForm(); 27 const [form] = Form.useForm();
25 28
26 useEffect(() => { 29 useEffect(() => {
@@ -33,11 +36,13 @@ export default function AddItem() { @@ -33,11 +36,13 @@ export default function AddItem() {
33 part: Number(currentItem.part) || 0, 36 part: Number(currentItem.part) || 0,
34 purchaseChannelList: currentItem.purchaseChannelList && JSON.stringify(currentItem) != '{}' ? currentItem.purchaseChannelList.map(i => ({ value: i.subjectId, label: i.subjectName })) : undefined, 37 purchaseChannelList: currentItem.purchaseChannelList && JSON.stringify(currentItem) != '{}' ? currentItem.purchaseChannelList.map(i => ({ value: i.subjectId, label: i.subjectName })) : undefined,
35 }); 38 });
  39 + currentItem.partCode && setPartValue({ partCode: currentItem.partCode, partId: currentItem.partId });
36 }, []); 40 }, []);
37 41
38 function save(feildValue: any) { 42 function save(feildValue: any) {
39 const params = { 43 const params = {
40 ...feildValue, 44 ...feildValue,
  45 + ...partValue,
41 id: currentItem.id, 46 id: currentItem.id,
42 name: currentItem.name || feildValue.name.label || feildValue.name, 47 name: currentItem.name || feildValue.name.label || feildValue.name,
43 nameId: currentItem.nameId || feildValue.name.value || nameId, 48 nameId: currentItem.nameId || feildValue.name.value || nameId,
@@ -49,6 +54,7 @@ export default function AddItem() { @@ -49,6 +54,7 @@ export default function AddItem() {
49 api.saveForm(params).then(res => { 54 api.saveForm(params).then(res => {
50 setSaveConfig(false); 55 setSaveConfig(false);
51 setNameId(undefined); 56 setNameId(undefined);
  57 + setPartValue({});
52 if (res.data && !currentItem.id) { 58 if (res.data && !currentItem.id) {
53 Modal.confirm({ 59 Modal.confirm({
54 title: '保存成功', 60 title: '保存成功',
@@ -57,7 +63,7 @@ export default function AddItem() { @@ -57,7 +63,7 @@ export default function AddItem() {
57 okText: '去授权', 63 okText: '去授权',
58 cancelText: '返回', 64 cancelText: '返回',
59 onOk() { 65 onOk() {
60 - history.push(`/ams/standardMange/receive/rules/goods/${res.data}/${params.name}`); 66 + history.push(`/ams/standardMange/receive/rules/goods/${res.data}/name`);
61 }, 67 },
62 onCancel() { 68 onCancel() {
63 setLoading(true); 69 setLoading(true);
@@ -104,7 +110,8 @@ export default function AddItem() { @@ -104,7 +110,8 @@ export default function AddItem() {
104 }).catch(e => { 110 }).catch(e => {
105 message.error(e.message); 111 message.error(e.message);
106 }); 112 });
107 - form.setFieldsValue({ name: item.partName, specList: spec, type: 2 }); 113 + setPartValue({ partCode: item.partCode, partId: item.id });
  114 + form.setFieldsValue({ name: item.partName, partCode: item.partCode, partId: item.id, specList: spec, type: 2 });
108 } 115 }
109 116
110 return ( 117 return (
@@ -112,7 +119,7 @@ export default function AddItem() { @@ -112,7 +119,7 @@ export default function AddItem() {
112 <h1 style={{ marginBottom: 20 }}>1.基本信息</h1> 119 <h1 style={{ marginBottom: 20 }}>1.基本信息</h1>
113 <Form {...layout} form={form} onFinish={save}> 120 <Form {...layout} form={form} onFinish={save}>
114 <Form.Item label="是否配件" name="part" rules={[{ required: true, message: '请选择' }]}> 121 <Form.Item label="是否配件" name="part" rules={[{ required: true, message: '请选择' }]}>
115 - <RadioGroup onChange={(e) => { changeSpc(e.target.value); }}> 122 + <RadioGroup disabled={!!editDisabled} onChange={(e) => { changeSpc(e.target.value); }}>
116 <Radio value={1}>是</Radio> 123 <Radio value={1}>是</Radio>
117 <Radio value={0}>否</Radio> 124 <Radio value={0}>否</Radio>
118 </RadioGroup> 125 </RadioGroup>
@@ -147,6 +154,7 @@ export default function AddItem() { @@ -147,6 +154,7 @@ export default function AddItem() {
147 labelInValue 154 labelInValue
148 optionFilterProp="children" 155 optionFilterProp="children"
149 showSearch 156 showSearch
  157 + disabled={!!editDisabled}
150 > 158 >
151 {unitItem.map((i: StanderList.UnitItem) => ( 159 {unitItem.map((i: StanderList.UnitItem) => (
152 <Option value={i.id} key={i.id}>{i.unitName}</Option> 160 <Option value={i.id} key={i.id}>{i.unitName}</Option>
@@ -154,19 +162,19 @@ export default function AddItem() { @@ -154,19 +162,19 @@ export default function AddItem() {
154 </Select> 162 </Select>
155 </Form.Item> 163 </Form.Item>
156 <Form.Item label="状态" name="status" valuePropName="checked" rules={[{ required: true, message: '请选择' }]}> 164 <Form.Item label="状态" name="status" valuePropName="checked" rules={[{ required: true, message: '请选择' }]}>
157 - <Switch checkedChildren="启用" unCheckedChildren="禁用" /> 165 + <Switch disabled={!!editDisabled} checkedChildren="启用" unCheckedChildren="禁用" />
158 </Form.Item> 166 </Form.Item>
159 <Form.Item noStyle shouldUpdate={(prevValues, currentValues) => prevValues.type != currentValues.type}> 167 <Form.Item noStyle shouldUpdate={(prevValues, currentValues) => prevValues.type != currentValues.type}>
160 {({ getFieldValue }): any => { 168 {({ getFieldValue }): any => {
161 return getFieldValue("type") === 1 ? ( 169 return getFieldValue("type") === 1 ? (
162 <Form.Item label="摊销周期 (月)" name="amortizePeriod" rules={[{ required: true, message: '请输入摊销周期' }]}> 170 <Form.Item label="摊销周期 (月)" name="amortizePeriod" rules={[{ required: true, message: '请输入摊销周期' }]}>
163 - <InputNumber min={0} style={{ width: '100%' }} placeholder="请输入" /> 171 + <InputNumber disabled={!!editDisabled} min={0} style={{ width: '100%' }} placeholder="请输入" />
164 </Form.Item> 172 </Form.Item>
165 ) : null; 173 ) : null;
166 }} 174 }}
167 </Form.Item> 175 </Form.Item>
168 <Form.Item label="备注" name="remark"> 176 <Form.Item label="备注" name="remark">
169 - <Input.TextArea placeholder="请输入" allowClear /> 177 + <Input.TextArea disabled={!!editDisabled} placeholder="请输入" allowClear />
170 </Form.Item> 178 </Form.Item>
171 <h1 style={{ marginBottom: 20 }}>2.规格型号</h1> 179 <h1 style={{ marginBottom: 20 }}>2.规格型号</h1>
172 180
@@ -180,7 +188,7 @@ export default function AddItem() { @@ -180,7 +188,7 @@ export default function AddItem() {
180 noStyle 188 noStyle
181 rules={[{ required: true, message: '最大采购金额(单个物品)' }]} 189 rules={[{ required: true, message: '最大采购金额(单个物品)' }]}
182 > 190 >
183 - <InputNumber style={{ width: 150 }} min={0} precision={4} placeholder="请输入金额" /> 191 + <InputNumber disabled={!!editDisabled} style={{ width: 150 }} min={0} precision={4} placeholder="请输入金额" />
184 </Form.Item> 192 </Form.Item>
185 <span style={{ marginLeft: 10 }}>元</span> 193 <span style={{ marginLeft: 10 }}>元</span>
186 </Form.Item> 194 </Form.Item>
@@ -188,16 +196,16 @@ export default function AddItem() { @@ -188,16 +196,16 @@ export default function AddItem() {
188 {({ getFieldValue }): any => { 196 {({ getFieldValue }): any => {
189 return getFieldValue("type") === 3 ? ( 197 return getFieldValue("type") === 3 ? (
190 <Form.Item label="最小单位采购数量" name="minNum" {...layout} rules={[{ required: true, message: '请输入最小采购数量' }]}> 198 <Form.Item label="最小单位采购数量" name="minNum" {...layout} rules={[{ required: true, message: '请输入最小采购数量' }]}>
191 - <InputNumber style={{ width: 150 }} min={0} placeholder="请输入单位数量" /> 199 + <InputNumber disabled={!!editDisabled} style={{ width: 150 }} min={0} placeholder="请输入单位数量" />
192 </Form.Item> 200 </Form.Item>
193 ) : null; 201 ) : null;
194 }} 202 }}
195 </Form.Item> 203 </Form.Item>
196 <Form.Item label="计划提前天数" name="planAheadDay" {...layout}> 204 <Form.Item label="计划提前天数" name="planAheadDay" {...layout}>
197 - <InputNumber style={{ width: 150 }} min={0} placeholder="请输入" /> 205 + <InputNumber disabled={!!editDisabled} style={{ width: 150 }} min={0} placeholder="请输入" />
198 </Form.Item> 206 </Form.Item>
199 <Form.Item label="采购渠道" name="purchaseChannelList" rules={[{ required: true, message: '请选择采购渠道' }]}> 207 <Form.Item label="采购渠道" name="purchaseChannelList" rules={[{ required: true, message: '请选择采购渠道' }]}>
200 - <Select placeholder="请选择采购渠道" allowClear labelInValue mode="multiple" showSearch optionFilterProp="children"> 208 + <Select disabled={!!editDisabled} placeholder="请选择采购渠道" allowClear labelInValue mode="multiple" showSearch optionFilterProp="children">
201 {(data || []).map((i: any) => ( 209 {(data || []).map((i: any) => (
202 <Option value={i.id} key={i.id}>{i.name}</Option> 210 <Option value={i.id} key={i.id}>{i.name}</Option>
203 ))} 211 ))}
@@ -205,7 +213,7 @@ export default function AddItem() { @@ -205,7 +213,7 @@ export default function AddItem() {
205 </Form.Item> 213 </Form.Item>
206 <h1 style={{ marginBottom: 20 }}>4.领用条件</h1> 214 <h1 style={{ marginBottom: 20 }}>4.领用条件</h1>
207 <Form.Item label="领用前提条件" name="premise" rules={[{ required: true, message: '请选择' }]}> 215 <Form.Item label="领用前提条件" name="premise" rules={[{ required: true, message: '请选择' }]}>
208 - <Select placeholder="请选择"> 216 + <Select disabled={!!editDisabled} placeholder="请选择">
209 <Option value={0} key={0}>无限制</Option> 217 <Option value={0} key={0}>无限制</Option>
210 <Option value={1} key={1}>入职后</Option> 218 <Option value={1} key={1}>入职后</Option>
211 <Option value={2} key={2}>转正后</Option> 219 <Option value={2} key={2}>转正后</Option>
@@ -215,15 +223,15 @@ export default function AddItem() { @@ -215,15 +223,15 @@ export default function AddItem() {
215 {({ getFieldValue }): any => { 223 {({ getFieldValue }): any => {
216 const premise = getFieldValue("premise"); 224 const premise = getFieldValue("premise");
217 return premise ? ( 225 return premise ? (
218 - <Form.Item label={premise === 1 ? "入职后" :"转正后"} name="premiseValue" {...layout} rules={[{ required: true, message: '请输入' }]}>  
219 - <InputNumber style={{ width: '100%' }} addonAfter="月" min={0} placeholder="请输入领取前提条件值" /> 226 + <Form.Item label={premise === 1 ? "入职后" : "转正后"} name="premiseValue" {...layout} rules={[{ required: true, message: '请输入' }]}>
  227 + <InputNumber disabled={!!editDisabled} style={{ width: '100%' }} addonAfter="月" min={0} placeholder="请输入领取前提条件值" />
220 </Form.Item> 228 </Form.Item>
221 ) : null; 229 ) : null;
222 }} 230 }}
223 </Form.Item> 231 </Form.Item>
224 <Row justify="center"> 232 <Row justify="center">
225 <Button type="primary" onClick={() => { setBreadcrumbs([{ name: '列表', key: 'list' }]); setCurrentBreadcrumb({ name: '列表', key: 'list' }); }}>返回</Button> 233 <Button type="primary" onClick={() => { setBreadcrumbs([{ name: '列表', key: 'list' }]); setCurrentBreadcrumb({ name: '列表', key: 'list' }); }}>返回</Button>
226 - <Button style={{ marginLeft: 25 }} type="primary" loading={saveConfig} onClick={() => form.submit()}>保存</Button> 234 + <Button style={{ marginLeft: 25 }} type="primary" disabled={!!editDisabled} loading={saveConfig} onClick={() => form.submit()}>保存</Button>
227 </Row> 235 </Row>
228 </Form> 236 </Form>
229 <SelectPartsTable 237 <SelectPartsTable
src/pages/capital/StandardMange/components/List/index.tsx
@@ -17,7 +17,8 @@ import { AssetTypeEnum } from &#39;@/pages/capital/entity&#39;; @@ -17,7 +17,8 @@ import { AssetTypeEnum } from &#39;@/pages/capital/entity&#39;;
17 const Option = Select.Option; 17 const Option = Select.Option;
18 18
19 export default function List() { 19 export default function List() {
20 - const { typeName, setIsPart, breadcrumbs, MenuItems, setCurrentItem, innerParams, list, setBreadcrumbs, setLoading, setParams, paginationConfig, loading, setCurrentBreadcrumb } = useStore(); 20 + const { typeName, setIsPart, breadcrumbs, MenuItems, setCurrentItem, innerParams,
  21 + list, setBreadcrumbs, setLoading, setParams, paginationConfig, loading, setCurrentBreadcrumb, editDisabled } = useStore();
21 const [switchLoading, setSwitchLoading] = useState(false); 22 const [switchLoading, setSwitchLoading] = useState(false);
22 23
23 function editAdd(value?: any) { 24 function editAdd(value?: any) {
@@ -51,7 +52,6 @@ export default function List() { @@ -51,7 +52,6 @@ export default function List() {
51 }); 52 });
52 53
53 const handleMenuClick: MenuProps['onClick'] = (e) => { 54 const handleMenuClick: MenuProps['onClick'] = (e) => {
54 - console.log("handleMenuClick", e.key);  
55 switch (e.key) { 55 switch (e.key) {
56 case '1': 56 case '1':
57 history.push("/ams/standardMange/receive/rules/goods"); 57 history.push("/ams/standardMange/receive/rules/goods");
@@ -68,8 +68,9 @@ export default function List() { @@ -68,8 +68,9 @@ export default function List() {
68 }; 68 };
69 69
70 const clickToAuth = (item: StanderList.ListVO) => { 70 const clickToAuth = (item: StanderList.ListVO) => {
71 - history.push(`/ams/standardMange/auth/goods/${item.id}`); 71 + history.push(`/ams/standardMange/auth/goods/${item.id}/${editDisabled || ''}`);
72 }; 72 };
  73 +
73 return ( 74 return (
74 <Card> 75 <Card>
75 <Row justify="space-between"> 76 <Row justify="space-between">
@@ -85,29 +86,35 @@ export default function List() { @@ -85,29 +86,35 @@ export default function List() {
85 禁用 86 禁用
86 </Radio.Button> 87 </Radio.Button>
87 </Radio.Group> 88 </Radio.Group>
88 - <Select style={{ width: 200 }} allowClear onChange={(e) => _onChangeType({ type: e })} placeholder="请选择类型"> 89 + <Select allowClear onChange={(e) => _onChangeType({ type: e })} placeholder="请选择类型">
89 {typeName.map(i => ( 90 {typeName.map(i => (
90 <Option value={i.type} key={i.type}>{i.name}</Option> 91 <Option value={i.type} key={i.type}>{i.name}</Option>
91 ))} 92 ))}
92 </Select> 93 </Select>
  94 + <Select allowClear onChange={(v) => _onChangeType({ part: v })} placeholder="是否配件">
  95 + <Option value={1} key={1}>是</Option>
  96 + <Option value={0} key={0}>否</Option>
  97 + </Select>
93 <Search 98 <Search
94 style={{ width: 260 }} 99 style={{ width: 260 }}
95 placeholder="搜索资产名称/型号" 100 placeholder="搜索资产名称/型号"
96 allowClear 101 allowClear
97 onChange={(e) => _onChange(e.target.value)} 102 onChange={(e) => _onChange(e.target.value)}
98 /> 103 />
99 - <div>  
100 - <Dropdown  
101 - overlay={  
102 - <Menu onClick={handleMenuClick} items={MenuItems} />  
103 - }  
104 - >  
105 - <Button icon={<SnippetsOutlined />} type="primary" style={{ width: 100, marginRight: 20 }}>  
106 - 领用授权  
107 - </Button>  
108 - </Dropdown>  
109 - <Button type="primary" icon={<PlusOutlined />} onClick={() => editAdd(undefined)}>新增</Button>  
110 - </div> 104 + {!editDisabled && (
  105 + <div>
  106 + <Dropdown
  107 + overlay={
  108 + <Menu onClick={handleMenuClick} items={MenuItems} />
  109 + }
  110 + >
  111 + <Button icon={<SnippetsOutlined />} type="primary" style={{ width: 100, marginRight: 20 }}>
  112 + 领用授权
  113 + </Button>
  114 + </Dropdown>
  115 + <Button type="primary" icon={<PlusOutlined />} onClick={() => editAdd(undefined)}>新增</Button>
  116 + </div>
  117 + )}
111 </Row> 118 </Row>
112 119
113 <Table 120 <Table
@@ -146,6 +153,7 @@ export default function List() { @@ -146,6 +153,7 @@ export default function List() {
146 unCheckedChildren="关闭" 153 unCheckedChildren="关闭"
147 checked={!!value.status} 154 checked={!!value.status}
148 loading={switchLoading} 155 loading={switchLoading}
  156 + disabled={!!editDisabled}
149 onChange={() => changeSwich(value)} 157 onChange={() => changeSwich(value)}
150 /> 158 />
151 )} 159 )}
@@ -166,7 +174,7 @@ export default function List() { @@ -166,7 +174,7 @@ export default function List() {
166 align="center" 174 align="center"
167 render={(record: StanderList.ListVO) => ( 175 render={(record: StanderList.ListVO) => (
168 <> 176 <>
169 - <Button type="link" style={{ padding: 0 }} onClick={() => { editAdd(record); }}>编辑</Button> 177 + <Button type="link" style={{ padding: 0 }} onClick={() => { editAdd(record); }}> {!editDisabled ? "编辑" : "查看"}</Button>
170 <Divider type="vertical" /> 178 <Divider type="vertical" />
171 <Button type="link" style={{ padding: 0 }} onClick={() => { clickToAuth(record); }}>授权</Button> 179 <Button type="link" style={{ padding: 0 }} onClick={() => { clickToAuth(record); }}>授权</Button>
172 </> 180 </>
src/pages/capital/StandardMange/index.tsx
@@ -8,9 +8,15 @@ import AddItem from &#39;./components/Add&#39;; @@ -8,9 +8,15 @@ import AddItem from &#39;./components/Add&#39;;
8 8
9 export const { Provider, useStore } = createStore(store); 9 export const { Provider, useStore } = createStore(store);
10 10
11 -function EditMange() { 11 +function EditMange(props: any) {
  12 + const { match } = props;
  13 + const { disabled } = match.params;
12 const [IndexDOM, setIndexDOM] = useState(<List />); 14 const [IndexDOM, setIndexDOM] = useState(<List />);
13 - const { setLoading, currentItem, breadcrumbs, currentBreadcrumb, setCurrentItem, setBreadcrumbs, setCurrentBreadcrumb } = useStore(); 15 + const { setLoading, currentItem, breadcrumbs, currentBreadcrumb, setCurrentItem, setBreadcrumbs, setEditDisabled, setCurrentBreadcrumb } = useStore();
  16 +
  17 + useEffect(() => {
  18 + setEditDisabled(!!disabled);
  19 + }, [disabled]);
14 20
15 useEffect(() => { 21 useEffect(() => {
16 switch (currentBreadcrumb.key) { 22 switch (currentBreadcrumb.key) {
@@ -49,4 +55,4 @@ function EditMange() { @@ -49,4 +55,4 @@ function EditMange() {
49 ); 55 );
50 } 56 }
51 57
52 -export default () => <Provider><EditMange /></Provider>;  
53 \ No newline at end of file 58 \ No newline at end of file
  59 +export default (props: any) => <Provider><EditMange {...props} /></Provider>;
54 \ No newline at end of file 60 \ No newline at end of file
src/pages/capital/StandardMange/interface.d.ts
@@ -6,6 +6,8 @@ declare namespace StanderList { @@ -6,6 +6,8 @@ declare namespace StanderList {
6 type?: number, //物品类型 1固定资产2低值品3易耗品 6 type?: number, //物品类型 1固定资产2低值品3易耗品
7 name?: string, //物品名称 7 name?: string, //物品名称
8 nameId?: number, 8 nameId?: number,
  9 + partCode?: string,
  10 + partId?: number,
9 unit?: number, //单位 1个2只3把4枚5台6包7车8瓶9壶10套11张12打13担 11 unit?: number, //单位 1个2只3把4枚5台6包7车8瓶9壶10套11张12打13担
10 unitName?: string, 12 unitName?: string,
11 spec?: string, //型号规格 13 spec?: string, //型号规格
src/pages/capital/StandardMange/store.ts
@@ -22,6 +22,8 @@ export default function useStore() { @@ -22,6 +22,8 @@ export default function useStore() {
22 const { list: postList, loading: postLoading } = usePagination(api.getPostList, {}); 22 const { list: postList, loading: postLoading } = usePagination(api.getPostList, {});
23 const { list, setParams, paginationConfig, innerParams, loading, setLoading } = usePagination(api.getListApi, { status: 1 }); 23 const { list, setParams, paginationConfig, innerParams, loading, setLoading } = usePagination(api.getListApi, { status: 1 });
24 const [isPart, setIsPart] = useState<boolean>(false); 24 const [isPart, setIsPart] = useState<boolean>(false);
  25 + /**是否可编辑 */
  26 + const [editDisabled, setEditDisabled] = useState<boolean>(false);
25 27
26 const typeName = [ 28 const typeName = [
27 { name: '固定资产', type: 1 }, 29 { name: '固定资产', type: 1 },
@@ -60,6 +62,8 @@ export default function useStore() { @@ -60,6 +62,8 @@ export default function useStore() {
60 setLoading, 62 setLoading,
61 isPart, 63 isPart,
62 setIsPart, 64 setIsPart,
63 - MenuItems 65 + MenuItems,
  66 + editDisabled,
  67 + setEditDisabled
64 }; 68 };
65 } 69 }
66 \ No newline at end of file 70 \ No newline at end of file
src/pages/capital/components/RenderGoodsSpec.tsx
1 -import React from 'react';  
2 -import { Popover } from 'antd'; 1 +import React, { useCallback, useState } from 'react';
  2 +import { Button, Modal, Popover, Table } from 'antd';
3 3
4 interface Props { 4 interface Props {
5 specList: StanderList.AuthSpecList[] 5 specList: StanderList.AuthSpecList[]
6 } 6 }
7 7
8 export default function RenderGoodsSpec({ specList }: Props) { 8 export default function RenderGoodsSpec({ specList }: Props) {
  9 + const [visible, setVisible] = useState(false);
9 const items = (specList || []).map(i => `${i.standardSpecName}:${i.specDetails}`); 10 const items = (specList || []).map(i => `${i.standardSpecName}:${i.specDetails}`);
  11 + const RenderSpecModal = useCallback(() => (visible ? (
  12 + <SpecModal
  13 + visible={visible}
  14 + onCancel={() => setVisible(false)}
  15 + items={specList}
  16 + />
  17 + ) : null), [visible]);
10 return ( 18 return (
11 - <Popover  
12 - placement="topLeft"  
13 - content={<div style={{ maxWidth: 260 }}>{items.join(';')}</div>}  
14 - >  
15 - <div>  
16 - {items.slice(0, 3).map((i: string) => {  
17 - return (  
18 - <p key={i} style={{ margin: 0, fontSize: 12 }}>{i}</p>  
19 - );  
20 - })}  
21 - {items.length > 3 ? (<span>...</span>) : null}  
22 - </div>  
23 - </Popover> 19 + <>
  20 + <Popover
  21 + placement="topLeft"
  22 + content={<div style={{ maxWidth: 260 }}>{items.join(';')}</div>}
  23 + >
  24 + <div>
  25 + {items.slice(0, 3).map((i: string) => {
  26 + return (
  27 + <p key={i} style={{ margin: 0, fontSize: 12 }}>{i}</p>
  28 + );
  29 + })}
  30 + {items.length > 3 ? (<span>...</span>) : null}
  31 + </div>
  32 + <Button type="link" style={{ fontSize: 12, padding: 0 }} onClick={() => setVisible(true)}>查看</Button>
  33 + </Popover>
  34 + {RenderSpecModal()}
  35 + </>
  36 + );
  37 +}
  38 +
  39 +function SpecModal({ items, onCancel, visible }: any) {
  40 + const columns = [
  41 + {
  42 + title: '规格名称',
  43 + dataIndex: 'standardSpecName',
  44 + },
  45 + {
  46 + title: '规格内容',
  47 + dataIndex: 'specDetails',
  48 + },
  49 + {
  50 + title: '排序',
  51 + dataIndex: 'sort',
  52 + },
  53 + ];
  54 +
  55 + return (
  56 + <Modal title="规格属性" open={visible} onCancel={onCancel} footer={false}>
  57 + <Table
  58 + pagination={false}
  59 + bordered
  60 + rowKey="standardSpecName"
  61 + dataSource={items}
  62 + size="small"
  63 + columns={columns}
  64 + />
  65 + </Modal>
24 ); 66 );
25 } 67 }
26 \ No newline at end of file 68 \ No newline at end of file
src/pages/order3/RetailTask/api.ts
@@ -18,6 +18,7 @@ export interface ShopTaskList { @@ -18,6 +18,7 @@ export interface ShopTaskList {
18 clueDealTaskCount?: number // 线索到店零售数量 18 clueDealTaskCount?: number // 线索到店零售数量
19 clueDealTaskRate?: number // 线索到店零售占比 19 clueDealTaskRate?: number // 线索到店零售占比
20 staffTaskList?: StaffTaskList[]//员工任务列表 20 staffTaskList?: StaffTaskList[]//员工任务列表
  21 + addedValueTask?: number
21 } 22 }
22 23
23 interface StaffTaskList { 24 interface StaffTaskList {
@@ -26,6 +27,7 @@ interface StaffTaskList { @@ -26,6 +27,7 @@ interface StaffTaskList {
26 taskCount?: number//任务数量 27 taskCount?: number//任务数量
27 clueDealTaskCount?: number // 线索到店零售数量 28 clueDealTaskCount?: number // 线索到店零售数量
28 regularMonth?: number//转正几个月 29 regularMonth?: number//转正几个月
  30 + addedValueTask?: number
29 } 31 }
30 export interface saveParams { 32 export interface saveParams {
31 id?: number, 33 id?: number,
src/pages/pms/entity.ts
@@ -190,12 +190,12 @@ export const planPoolTypeData = [ @@ -190,12 +190,12 @@ export const planPoolTypeData = [
190 export const typeReceiverObj: {[key: string]: string} = { 190 export const typeReceiverObj: {[key: string]: string} = {
191 '售后工单锁定': '服务', 191 '售后工单锁定': '服务',
192 '装潢零售锁定': '销售', 192 '装潢零售锁定': '销售',
193 - '调锁定': '', 193 + '调锁定': '',
194 '': '', 194 '': '',
195 }; 195 };
196 export const typeSenderObj: {[key: string]: string} = { 196 export const typeSenderObj: {[key: string]: string} = {
197 - '售后工单锁定': '送修人',  
198 - '装潢零售锁定': '下单人',  
199 - '调件锁定': '', 197 + '售后工单锁定': '送修人:',
  198 + '装潢零售锁定': '下单人:',
  199 + '调出锁定': '',
200 '': '', 200 '': '',
201 }; 201 };
src/pages/pms/part/Repertory/components/EPCModal.tsx
@@ -4,7 +4,6 @@ import { useStore } from &#39;../index&#39;; @@ -4,7 +4,6 @@ import { useStore } from &#39;../index&#39;;
4 import usePagination from '@/hooks/usePagination'; 4 import usePagination from '@/hooks/usePagination';
5 import { getEpcdetailApi, deleteApi } from '../api'; 5 import { getEpcdetailApi, deleteApi } from '../api';
6 import AddepcModal from './AddepcModal'; 6 import AddepcModal from './AddepcModal';
7 -import debounce from 'lodash/debounce';  
8 7
9 const { Column } = Table; 8 const { Column } = Table;
10 9
@@ -14,9 +13,9 @@ export default function FactoryEpcDetailModal() { @@ -14,9 +13,9 @@ export default function FactoryEpcDetailModal() {
14 const [addVisible, setAddVisible] = useState(false); 13 const [addVisible, setAddVisible] = useState(false);
15 const { list, loading, setLoading, setParams, paginationConfig } = usePagination(getEpcdetailApi, { partCode: currentItem.partCode }, { delay }); 14 const { list, loading, setLoading, setParams, paginationConfig } = usePagination(getEpcdetailApi, { partCode: currentItem.partCode }, { delay });
16 15
17 - const _onChange = debounce((param: string) => { 16 + const _onChange = (param: string) => {
18 setParams({ partCode: currentItem.partCode, current: 1, keywords: param }, true); 17 setParams({ partCode: currentItem.partCode, current: 1, keywords: param }, true);
19 - }, 500); 18 + };
20 19
21 useEffect(() => { 20 useEffect(() => {
22 if (currentItem.partCode) { 21 if (currentItem.partCode) {
@@ -81,7 +80,8 @@ export default function FactoryEpcDetailModal() { @@ -81,7 +80,8 @@ export default function FactoryEpcDetailModal() {
81 placeholder="搜索车型代码" 80 placeholder="搜索车型代码"
82 allowClear 81 allowClear
83 style={{ width: 200 }} 82 style={{ width: 200 }}
84 - onChange={(e) => _onChange(e.target.value)} 83 + onSearch={v => _onChange(v)}
  84 + enterButton
85 /> 85 />
86 <Button type="primary" onClick={() => { setAddVisible(true); setCurrentInfo({}); }}>新增</Button> 86 <Button type="primary" onClick={() => { setAddVisible(true); setCurrentInfo({}); }}>新增</Button>
87 </div> 87 </div>
src/pages/pms/part/Repertory/components/SpecEpcModal.tsx
@@ -79,11 +79,11 @@ export default function specEcpModal() { @@ -79,11 +79,11 @@ export default function specEcpModal() {
79 <Card title="知识库信息"> 79 <Card title="知识库信息">
80 <div style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 10 }}> 80 <div style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 10 }}>
81 <Input.Search 81 <Input.Search
82 - placeholder="输入关键词" 82 + placeholder="搜索配件编码/名称"
83 allowClear 83 allowClear
84 - style={{ width: 200 }} 84 + style={{ width: 240 }}
85 onSearch={(v) => _onChange(v)} 85 onSearch={(v) => _onChange(v)}
86 - onChange={e => _onChange(e.target.value)} 86 + enterButton
87 /> 87 />
88 <Button type="primary" onClick={() => { setAddVisible(true); setCurrentInfo({}); }}>新增</Button> 88 <Button type="primary" onClick={() => { setAddVisible(true); setCurrentInfo({}); }}>新增</Button>
89 </div> 89 </div>
src/pages/pms/partPlan/PlanPool/api.ts
@@ -13,6 +13,7 @@ export interface Params { @@ -13,6 +13,7 @@ export interface Params {
13 storageId?: number; // Form 13 storageId?: number; // Form
14 isOil?: boolean; 14 isOil?: boolean;
15 keywords?: string 15 keywords?: string
  16 + poolType?:number
16 } 17 }
17 18
18 export interface ListVO { 19 export interface ListVO {
@@ -40,6 +41,8 @@ export interface ListVO { @@ -40,6 +41,8 @@ export interface ListVO {
40 unit?: string; // 采购规格(配件展示) 41 unit?: string; // 采购规格(配件展示)
41 splitUnit?: string; // 拆分件规格(配件展示) 42 splitUnit?: string; // 拆分件规格(配件展示)
42 splitCnt?: number; // 拆分件数量(配件展示) 43 splitCnt?: number; // 拆分件数量(配件展示)
  44 + typeName?:string
  45 + partType?:number
43 } 46 }
44 47
45 /** 48 /**
src/pages/pms/partPlan/PlanPool/components/Filter.tsx
@@ -7,7 +7,6 @@ import usePagination from &quot;@/hooks/usePagination&quot;; @@ -7,7 +7,6 @@ import usePagination from &quot;@/hooks/usePagination&quot;;
7 import {getStoragePage} from "@/pages/pms/storage/StorageManage/api"; 7 import {getStoragePage} from "@/pages/pms/storage/StorageManage/api";
8 import useInitail from "@/hooks/useInitail"; 8 import useInitail from "@/hooks/useInitail";
9 import * as api from "@/pages/pms/storage/partShop/api"; 9 import * as api from "@/pages/pms/storage/partShop/api";
10 -import {getPartTypeApi} from '@/pages/pms/part/Repertory/api';  
11 import PmsSelect from '@/pages/pms/comonents/PmsSelect'; 10 import PmsSelect from '@/pages/pms/comonents/PmsSelect';
12 11
13 const { Search } = Input; 12 const { Search } = Input;
@@ -15,8 +14,7 @@ const { Search } = Input; @@ -15,8 +14,7 @@ const { Search } = Input;
15 export default function Filter() { 14 export default function Filter() {
16 const { list: storages } = usePagination<PartStorageSpace.PageVO>(getStoragePage, {pageSize: 1000}); 15 const { list: storages } = usePagination<PartStorageSpace.PageVO>(getStoragePage, {pageSize: 1000});
17 const { data: shops } = useInitail<PmsStoragePartShop.Option[], {}>(api.getShopApi, [], {}); 16 const { data: shops } = useInitail<PmsStoragePartShop.Option[], {}>(api.getShopApi, [], {});
18 - const { dfParams, setDfParams } = useStore();  
19 - const { data: partTypeData } = useInitail(getPartTypeApi, [], {}); 17 + const { dfParams, setDfParams, partTypeData } = useStore();
20 18
21 const handleChangeKeywords = debounce((value: string) => { 19 const handleChangeKeywords = debounce((value: string) => {
22 setDfParams({ ...dfParams, current: 1, keywords: value }); 20 setDfParams({ ...dfParams, current: 1, keywords: value });
src/pages/pms/partPlan/PlanPool/components/PartTable.tsx
@@ -16,7 +16,7 @@ interface Props { @@ -16,7 +16,7 @@ interface Props {
16 id?: number, // 上一个列表ID 16 id?: number, // 上一个列表ID
17 } 17 }
18 export default function Index(props: Props = {}) { 18 export default function Index(props: Props = {}) {
19 - const { dfParams, key } = useStore(); 19 + const { dfParams, key, partTypeData } = useStore();
20 const {showAnalyse=true} = props; 20 const {showAnalyse=true} = props;
21 const { data: parts, setParams } = useInitial(getList, [], {...dfParams, ...props}); 21 const { data: parts, setParams } = useInitial(getList, [], {...dfParams, ...props});
22 const [visible, setVisible] = useState(false); 22 const [visible, setVisible] = useState(false);
@@ -35,6 +35,8 @@ export default function Index(props: Props = {}) { @@ -35,6 +35,8 @@ export default function Index(props: Props = {}) {
35 <Table rowKey={(v: ListVO) => `${v.id}`} scroll={{y: 500, x: 2000}} dataSource={parts || []} pagination={false}> 35 <Table rowKey={(v: ListVO) => `${v.id}`} scroll={{y: 500, x: 2000}} dataSource={parts || []} pagination={false}>
36 <Column title="配件编码" dataIndex="code" fixed="left" /> 36 <Column title="配件编码" dataIndex="code" fixed="left" />
37 <Column title="配件名称" dataIndex="name" /> 37 <Column title="配件名称" dataIndex="name" />
  38 + <Column title="来源类型" dataIndex="typeName" />
  39 + <Column title="配件类型" dataIndex="partType" render={t => partTypeData.find(i => i.value == t)?.label} />
38 <Column title="采购单价" dataIndex="price" /> 40 <Column title="采购单价" dataIndex="price" />
39 <Column title="采购数量" dataIndex="cnt" /> 41 <Column title="采购数量" dataIndex="cnt" />
40 <Column title="采购规格" dataIndex="unit" /> 42 <Column title="采购规格" dataIndex="unit" />
@@ -82,8 +84,6 @@ export default function Index(props: Props = {}) { @@ -82,8 +84,6 @@ export default function Index(props: Props = {}) {
82 </a> 84 </a>
83 )} 85 )}
84 /> 86 />
85 - <Column title="拆分件规格" dataIndex="splitUnit" />  
86 - <Column title="拆分件数量" dataIndex="splitCnt" />  
87 </> 87 </>
88 )} 88 )}
89 </Table> 89 </Table>
src/pages/pms/partPlan/PlanPool/components/StoragePartTable.tsx
@@ -12,7 +12,7 @@ interface Props { @@ -12,7 +12,7 @@ interface Props {
12 type?: number, // 类型1区域库2库房3车系4车型5配件 12 type?: number, // 类型1区域库2库房3车系4车型5配件
13 } 13 }
14 export default function Index(props: Props = {}) { 14 export default function Index(props: Props = {}) {
15 - const { dfParams, key } = useStore(); 15 + const { dfParams, key, partTypeData } = useStore();
16 const [form] = Form.useForm(); 16 const [form] = Form.useForm();
17 const { data: parts, setParams } = useInitial(getList, [], dfParams); 17 const { data: parts, setParams } = useInitial(getList, [], dfParams);
18 const [visible, setVisible] = useState(false); 18 const [visible, setVisible] = useState(false);
@@ -40,6 +40,7 @@ export default function Index(props: Props = {}) { @@ -40,6 +40,7 @@ export default function Index(props: Props = {}) {
40 <Column title="库房名称" dataIndex="storageName" /> 40 <Column title="库房名称" dataIndex="storageName" />
41 <Column title="门店名称" dataIndex="shopName" /> 41 <Column title="门店名称" dataIndex="shopName" />
42 <Column title="来源类型" dataIndex="typeName" /> 42 <Column title="来源类型" dataIndex="typeName" />
  43 + <Column title="配件类型" dataIndex="partType" render={t => partTypeData.find(i => i.value == t)?.label} />
43 <Column title="采购规格" dataIndex="unit" render={t => t || '--'} /> 44 <Column title="采购规格" dataIndex="unit" render={t => t || '--'} />
44 <Column title="采购数量" dataIndex="cnt" /> 45 <Column title="采购数量" dataIndex="cnt" />
45 <Column title="采购单价" dataIndex="price" /> 46 <Column title="采购单价" dataIndex="price" />
src/pages/pms/partPlan/PlanPool/useStore.ts
1 import { useState } from 'react'; 1 import { useState } from 'react';
  2 +import useInitail from "@/hooks/useInitail";
  3 +import { getPartTypeApi } from '@/pages/pms/part/Repertory/api';
2 4
3 export default function useStore() { 5 export default function useStore() {
4 const [dfParams, setDfParams] = useState<any>({}); 6 const [dfParams, setDfParams] = useState<any>({});
5 const [key, setKey] = useState<any>('1'); 7 const [key, setKey] = useState<any>('1');
  8 + const { data: partTypeData } = useInitail(getPartTypeApi, [], {});
  9 +
6 return { 10 return {
7 dfParams, 11 dfParams,
8 setDfParams, 12 setDfParams,
9 key, 13 key,
10 - setKey 14 + setKey,
  15 + partTypeData
11 }; 16 };
12 } 17 }
src/pages/pms/purchase/PurchaseRecord/comonents/AddPurchaseModal.tsx
@@ -10,6 +10,9 @@ import {purchaseApply, getrelationlist, EditItem} from &#39;../api&#39;; @@ -10,6 +10,9 @@ import {purchaseApply, getrelationlist, EditItem} from &#39;../api&#39;;
10 import {getList, ListVO, Params} from '@/pages/pms/partPlan/PlanPool/api'; 10 import {getList, ListVO, Params} from '@/pages/pms/partPlan/PlanPool/api';
11 import _ from 'lodash'; 11 import _ from 'lodash';
12 import useInitial from '@/hooks/useInitail'; 12 import useInitial from '@/hooks/useInitail';
  13 +import PmsSelect from '@/pages/pms/comonents/PmsSelect';
  14 +import { getPartTypeApi } from '@/pages/pms/part/Repertory/api';
  15 +import {planPoolTypeData} from '@/pages/pms/entity';
13 16
14 const Option = Select.Option; 17 const Option = Select.Option;
15 const {Item} = Form; 18 const {Item} = Form;
@@ -33,7 +36,8 @@ export default function PartStorageModal({ onCancel, visible, itemData, setItemD @@ -33,7 +36,8 @@ export default function PartStorageModal({ onCancel, visible, itemData, setItemD
33 const {data: planeData, setParams, setData: setPlaneData} = useInitial<ListVO[], Params>(getList, [], {}, delay); 36 const {data: planeData, setParams, setData: setPlaneData} = useInitial<ListVO[], Params>(getList, [], {}, delay);
34 const {data: casData, setParams: casSetParams, setData: casSetData} = useInitial<poolitem[], Params>(getPurchasePool, [], {}, delay); 37 const {data: casData, setParams: casSetParams, setData: casSetData} = useInitial<poolitem[], Params>(getPurchasePool, [], {}, delay);
35 const [planePart, setPlanePart] = useState<ListVO[]>([]); 38 const [planePart, setPlanePart] = useState<ListVO[]>([]);
36 - 39 + const { data: partTypeData } = useInitial(getPartTypeApi, [], {});
  40 +
37 const [choosePartVisable, setChoosePartVisable] = useState(false); 41 const [choosePartVisable, setChoosePartVisable] = useState(false);
38 const [selectedParts, setSelectedParts] = useState<any[]>([]); 42 const [selectedParts, setSelectedParts] = useState<any[]>([]);
39 const [form] = Form.useForm(); 43 const [form] = Form.useForm();
@@ -259,7 +263,23 @@ export default function PartStorageModal({ onCancel, visible, itemData, setItemD @@ -259,7 +263,23 @@ export default function PartStorageModal({ onCancel, visible, itemData, setItemD
259 allowClear 263 allowClear
260 placeholder="请输入配件名称/编码" 264 placeholder="请输入配件名称/编码"
261 onChange={e => setParams({keywords: e.target.value}, true)} 265 onChange={e => setParams({keywords: e.target.value}, true)}
262 - style={{ width: 240 }} 266 + style={{ width: 210 }}
  267 + />
  268 + <PmsSelect
  269 + allowClear
  270 + style={{ width: 180, marginRight: 10, marginLeft: 10}}
  271 + onChange={v => {
  272 + setParams({poolType: v}, true);
  273 + }}
  274 + placeholder="请选择来源类型"
  275 + options={planPoolTypeData.map(i => ({value: i.value, label: i.label}))}
  276 + />
  277 + <PmsSelect
  278 + allowClear
  279 + style={{ width: 180}}
  280 + onChange={v => setParams({partType: v}, true)}
  281 + placeholder="请选择配件类型"
  282 + options={partTypeData.map(i => ({value: i.value, label: i.label}))}
263 /> 283 />
264 </div> 284 </div>
265 <Table 285 <Table
@@ -278,6 +298,8 @@ export default function PartStorageModal({ onCancel, visible, itemData, setItemD @@ -278,6 +298,8 @@ export default function PartStorageModal({ onCancel, visible, itemData, setItemD
278 > 298 >
279 <Column title="配件名称" dataIndex="partName" /> 299 <Column title="配件名称" dataIndex="partName" />
280 <Column title="配件编码" dataIndex="partCode" /> 300 <Column title="配件编码" dataIndex="partCode" />
  301 + <Column title="数据来源" dataIndex="typeName" />
  302 + <Column title="配件类型" dataIndex="partType" render={t => partTypeData.find(i => i.value == t)?.label} />
281 <Column title="采购单价(元)" dataIndex="price" /> 303 <Column title="采购单价(元)" dataIndex="price" />
282 <Column title="采购数量" dataIndex="cnt" /> 304 <Column title="采购数量" dataIndex="cnt" />
283 <Column title="总价(元)" render={r => _.ceil((r.cnt * r.price), 2)} /> 305 <Column title="总价(元)" render={r => _.ceil((r.cnt * r.price), 2)} />
src/pages/pms/storage/partShop/components/LockDetailModal.tsx
@@ -60,7 +60,7 @@ export default function Index({ item = {}, visible, onCancel }: Props) { @@ -60,7 +60,7 @@ export default function Index({ item = {}, visible, onCancel }: Props) {
60 <div>{`锁定库存数: ${it.lockCnt || 0}件`}</div> 60 <div>{`锁定库存数: ${it.lockCnt || 0}件`}</div>
61 <div>{`锁库天数: ${(it.days || 0).toFixed(0)}天`}</div> 61 <div>{`锁库天数: ${(it.days || 0).toFixed(0)}天`}</div>
62 {!!obj.receiverName && <div>{`${typeReceiverObj[it.type || '']}顾问: ${obj.receiverName}`}</div>} 62 {!!obj.receiverName && <div>{`${typeReceiverObj[it.type || '']}顾问: ${obj.receiverName}`}</div>}
63 - {!!obj.senderName && <div>{`${typeSenderObj[it.type || '']}: ${obj.senderName}`}</div>} 63 + {!!obj.senderName && !!typeSenderObj[it.type || ''] && <div>{`${typeSenderObj[it.type || '']}${obj.senderName}`}</div>}
64 {!!obj.ownerName && <div>{`车主: ${obj.ownerName}`}</div>} 64 {!!obj.ownerName && <div>{`车主: ${obj.ownerName}`}</div>}
65 {!!obj.senderTime && <div>{`进站时间: ${moment(obj.senderTime).format('YYYY-MM-DD HH:mm')}`}</div>} 65 {!!obj.senderTime && <div>{`进站时间: ${moment(obj.senderTime).format('YYYY-MM-DD HH:mm')}`}</div>}
66 {!!obj.plateNo && <div>{`车牌号: ${obj.plateNo}`}</div>} 66 {!!obj.plateNo && <div>{`车牌号: ${obj.plateNo}`}</div>}