Commit 796981fbb929bd2c6da79f9d254f592959ff592b
1 parent
e8ed4786
绩效目标绩效运费目标配置
Showing
8 changed files
with
292 additions
and
7 deletions
config/routers/pms.ts
... | ... | @@ -191,4 +191,12 @@ export default [ |
191 | 191 | path: '/pms/setting/performanceSetting', // 绩效设置 |
192 | 192 | component: './pms/setting/PerformanceSetting' |
193 | 193 | }, |
194 | + { | |
195 | + path: '/pms/setting/perTarget', // 绩效目标设置 | |
196 | + component: './pms/setting/PerTarget' | |
197 | + }, | |
198 | + { | |
199 | + path: '/pms/setting/freightTarget', // 运费目标设置 | |
200 | + component: './pms/setting/FreightTarget' | |
201 | + }, | |
194 | 202 | ]; | ... | ... |
src/pages/pms/setting/FreightTarget/api.ts
0 → 100644
1 | +import { http } from '@/typing/http'; | |
2 | +import request from '@/utils/request'; | |
3 | +import { PMS_HOST } from '@/utils/host'; | |
4 | + | |
5 | +export interface Item { | |
6 | + id?: number, | |
7 | + amount?: any, // | |
8 | + startDays?: any | |
9 | + endDays?: any// | |
10 | +} | |
11 | +interface Params { | |
12 | + shopId?: number | |
13 | + keywords?: string | |
14 | + storageId?: number | |
15 | +} | |
16 | +/** | |
17 | + * 查询绩效--运费目标达成设置 | |
18 | + */ | |
19 | +export function getDetail(params: Params): http.PromiseResp<Item[]> { | |
20 | + return request.get(`${PMS_HOST}/erp/target/amount/setting/get/list`, { params }); | |
21 | +} | |
22 | +/** | |
23 | + * 新增或编辑绩效--运费目标设置 | |
24 | + */ | |
25 | +export function saveApi(params: {list: Item[]}) { | |
26 | + return request.post(`${PMS_HOST}/erp/target/amount/setting/add/or/update`, params); | |
27 | +} | ... | ... |
src/pages/pms/setting/FreightTarget/components/AddModal.tsx
0 → 100644
src/pages/pms/setting/FreightTarget/index.tsx
0 → 100644
1 | +import React, { useState } from 'react'; | |
2 | +import { PageHeaderWrapper } from '@ant-design/pro-layout'; | |
3 | +import { Card, InputNumber, Button, message } from 'antd'; | |
4 | +import useInitial from '@/hooks/useInitail'; | |
5 | +import { getDetail, saveApi, Item} from './api'; | |
6 | +import ConfirmBnt from '../components/ConfirmBnt'; | |
7 | +import { DeleteOutlined } from '@ant-design/icons'; | |
8 | + | |
9 | +const Index = () => { | |
10 | + const [disable, setDisable] = useState(false); | |
11 | + const {data, setData, loading, setLoading} = useInitial<Item[], object>(getDetail, [], {}); | |
12 | + | |
13 | + const handleAdd = () => { | |
14 | + setData([...data, { startDays: '', endDays: '', amount: '' }]); | |
15 | + }; | |
16 | + | |
17 | + const handleInputChange = (index: number, p: any) => { | |
18 | + setData(data.map((it, i) => { | |
19 | + if (index == i) { | |
20 | + return { ...it, ...p}; | |
21 | + } else { | |
22 | + return it; | |
23 | + } | |
24 | + } | |
25 | + )); | |
26 | + }; | |
27 | + | |
28 | + const handleDel = (event: any, index: number) => { | |
29 | + let arr = data; | |
30 | + arr.splice(index, 1); | |
31 | + setData(arr); | |
32 | + }; | |
33 | + | |
34 | + const svae = () => { | |
35 | + saveApi({list: data}).then(() => { | |
36 | + message.success('保存成功'); | |
37 | + setLoading(true); | |
38 | + setDisable(false); | |
39 | + }).catch(e => message.error(e.message)); | |
40 | + }; | |
41 | + | |
42 | + return ( | |
43 | + <PageHeaderWrapper title="运费目标设置"> | |
44 | + <Card loading={loading}> | |
45 | + {!!data?.length && data.map((it, index) => ( | |
46 | + <div key={index} style={{ display: 'flex', alignItems: 'center', marginBottom: 10 }}> | |
47 | + <span style={{ marginRight: 10 }}>{index + 1}、</span> | |
48 | + <> | |
49 | + 缺件起始天数 | |
50 | + <InputNumber disabled={!disable} min={0} value={it.startDays} onChange={value => handleInputChange(index, { startDays: value })} style={{ width: 100, marginLeft: 10, marginRight: 20 }} /> | |
51 | + </> | |
52 | + <> | |
53 | + 缺件结束天数 | |
54 | + <InputNumber disabled={!disable} min={0} value={it.endDays} onChange={value => handleInputChange(index, { endDays: value })} style={{ width: 100, marginLeft: 10, marginRight: 20 }} /> | |
55 | + </> | |
56 | + <> | |
57 | + 运费统计增加 | |
58 | + <InputNumber disabled={!disable} value={it.amount} min={0} onChange={value => handleInputChange(index, { amount: value })} style={{ width: 100, marginLeft: 10, marginRight: 20 }} /> | |
59 | + </> | |
60 | + {(index == data.length - 1 && disable) ? <Button onClick={(event: any) => handleDel(event, index)} shape="circle" icon={<DeleteOutlined />} /> : ''} | |
61 | + </div> | |
62 | + ))} | |
63 | + <Button type="default" disabled={!disable} onClick={() => handleAdd()}>添加梯度</Button> | |
64 | + <ConfirmBnt | |
65 | + disable={disable} | |
66 | + onOk={() => svae()} | |
67 | + onCancel={() => { setDisable(false); setData(data); }} | |
68 | + onEdit={() => { | |
69 | + setDisable(true); | |
70 | + setData(data); | |
71 | + }} | |
72 | + /> | |
73 | + </Card> | |
74 | + </PageHeaderWrapper> | |
75 | + ); | |
76 | +}; | |
77 | +export default Index; | |
0 | 78 | \ No newline at end of file | ... | ... |
src/pages/pms/setting/PerTarget/api.ts
0 → 100644
1 | +import { http } from '@/typing/http'; | |
2 | +import request from '@/utils/request'; | |
3 | +import { PMS_HOST } from '@/utils/host'; | |
4 | + | |
5 | +export interface Item { | |
6 | + id?: number, | |
7 | + amount?: number, // | |
8 | + days?: number | |
9 | + storageId?: number// 员工调运费用, 1.5元 / 公里 | |
10 | + shopId?: number // 备料时效 | |
11 | + storageName?: string | |
12 | + shopName?: string | |
13 | +} | |
14 | +interface Params { | |
15 | + shopId?:number | |
16 | + keywords?:string | |
17 | + storageId?:number | |
18 | +} | |
19 | +/** | |
20 | + * 查询绩效--目标设置明细 | |
21 | + */ | |
22 | +export function getDetail(params: Params): http.PromiseResp<Item[]> { | |
23 | + return request.get(`${PMS_HOST}/erp/target/setting/get/list`, { params }); | |
24 | +} | |
25 | +/** | |
26 | + * 新增或编辑绩效--目标设置明细 | |
27 | + */ | |
28 | +export function saveApi(params: Item) { | |
29 | + return request.post(`${PMS_HOST}/erp/target/setting/add/or/update`, params); | |
30 | +} | |
31 | +/** | |
32 | + * 删除绩效--目标设置明细 | |
33 | + */ | |
34 | +export function DeleteApi(params: {id?: number}) { | |
35 | + return request.post(`${PMS_HOST}/erp/target/setting/delete`, params, {contentType: 'form-urlencoded'}); | |
36 | +} | ... | ... |
src/pages/pms/setting/PerTarget/components/AddModal.tsx
0 → 100644
1 | +import React, { useEffect } from 'react'; | |
2 | +import {Modal, Form, InputNumber, message} from 'antd'; | |
3 | +import PmsSelsct from '@/pages/pms/comonents/PmsSelect'; | |
4 | +import { getStoragePage } from '@/pages/pms/storage/StorageManage/api'; | |
5 | +import usePagination from '@/hooks/usePagination'; | |
6 | +import useInitial from '@/hooks/useInitail'; | |
7 | +import { saveApi } from '../api'; | |
8 | +import { getShopApi } from '@/common/api'; | |
9 | + | |
10 | +const {Item} = Form; | |
11 | + | |
12 | +interface Props { | |
13 | + item:any | |
14 | + visible:boolean | |
15 | + onCancel:Function | |
16 | + refesh:Function | |
17 | +} | |
18 | + | |
19 | +export default function Index(props: Props) { | |
20 | + const { item, onCancel, visible, refesh } = props; | |
21 | + const [form] = Form.useForm(); | |
22 | + const { list: storages } = usePagination<PartStorageSpace.PageVO>(getStoragePage, { pageSize: 1000 }); | |
23 | + const { data: shops } = useInitial<CommonApi.OptionVO[], object>(getShopApi, [], {}); | |
24 | + | |
25 | + const OK = () => { | |
26 | + form.validateFields().then(fileds => { | |
27 | + const params = { | |
28 | + id: item?.id, | |
29 | + storageId: fileds.storageId, | |
30 | + shopId: fileds.shopId, | |
31 | + days: fileds.days, | |
32 | + amount: fileds.amount | |
33 | + }; | |
34 | + saveApi(params).then(res => { | |
35 | + message.success("提交成功"); | |
36 | + onCancel(); | |
37 | + refesh(); | |
38 | + }).catch(e => { | |
39 | + message.error(e.message); | |
40 | + }); | |
41 | + }); | |
42 | + }; | |
43 | + | |
44 | + useEffect(() => { | |
45 | + if (visible && item.id) { | |
46 | + form.setFieldsValue({ | |
47 | + ...item | |
48 | + }); | |
49 | + } | |
50 | + if (!visible) { | |
51 | + form.resetFields(); | |
52 | + } | |
53 | + }, [visible]); | |
54 | + | |
55 | + return ( | |
56 | + <Modal | |
57 | + open={visible} | |
58 | + maskClosable={false} | |
59 | + onCancel={() => onCancel()} | |
60 | + onOk={() => OK()} | |
61 | + title={item.id ? '编辑' : '新增'} | |
62 | + > | |
63 | + <Form form={form} labelCol={{span: 6}} wrapperCol={{span: 16}}> | |
64 | + <Item name="storageId" label="库房" required rules={[{ required: true, message: '请选择库房' }]}> | |
65 | + <PmsSelsct | |
66 | + style={{width: 300}} | |
67 | + options={storages.map((item: PartStorageSpace.PageVO) => ({ value: item.id, label: item.storageName }))} | |
68 | + /> | |
69 | + </Item> | |
70 | + <Item name="shopId" label="门店" required rules={[{ required: true, message: '请选择门店' }]}> | |
71 | + <PmsSelsct | |
72 | + style={{width: 300}} | |
73 | + options={shops.map((item: CommonApi.OptionVO) => ({ value: item.id, label: item.name }))} | |
74 | + /> | |
75 | + </Item> | |
76 | + <Item name="days" label="订件时长目标" required rules={[{ required: true, message: '请输入' }]}> | |
77 | + <InputNumber style={{ width: 300 }} addonAfter="天" /> | |
78 | + </Item> | |
79 | + <Item name="amount" label="运费目标" required rules={[{ required: true, message: '请输入' }]}> | |
80 | + <InputNumber style={{ width: 300 }} addonAfter="元" /> | |
81 | + </Item> | |
82 | + </Form> | |
83 | + </Modal> | |
84 | + ); | |
85 | +} | |
0 | 86 | \ No newline at end of file | ... | ... |
src/pages/pms/setting/PerTarget/index.tsx
0 → 100644
1 | +import React, { useState } from 'react'; | |
2 | +import { PageHeaderWrapper } from '@ant-design/pro-layout'; | |
3 | +import { Table, Button, Card, Popconfirm, Divider, message } from 'antd'; | |
4 | +import AddModal from './components/AddModal'; | |
5 | +import {Item, getDetail, DeleteApi} from './api'; | |
6 | +import useInitial from '@/hooks/useInitail'; | |
7 | + | |
8 | +const {Column} = Table; | |
9 | + | |
10 | +const Index = () => { | |
11 | + const [current, setCurrent] = useState<{visible:boolean, item?:any}>({visible: false, item: {}}); | |
12 | + const { data, loading, setParams } = useInitial<Item[], object>(getDetail, [], {}); | |
13 | + | |
14 | + const dele = (id?: number) => { | |
15 | + DeleteApi({id}).then(res => { | |
16 | + message.success('操作成功'); | |
17 | + setParams({}, true); | |
18 | + }).catch(e => message.error(e.message)); | |
19 | + }; | |
20 | + | |
21 | + return ( | |
22 | + <PageHeaderWrapper title="绩效目标设置"> | |
23 | + <Card> | |
24 | + <div style={{display: 'flex', justifyContent: 'flex-end', marginBottom: 20}}> | |
25 | + <Button type="primary" onClick={() => setCurrent({visible: true, item: {}})}>新增</Button> | |
26 | + </div> | |
27 | + <Table | |
28 | + dataSource={data} | |
29 | + loading={loading} | |
30 | + rowKey={r => `${r.id}`} | |
31 | + pagination={false} | |
32 | + > | |
33 | + <Column title="库房" dataIndex="storageName" /> | |
34 | + <Column title="门店" dataIndex="shopName" /> | |
35 | + <Column title="订件时长目标(天)" dataIndex="days" /> | |
36 | + <Column title="运费目标(元)" dataIndex="amount" /> | |
37 | + <Column | |
38 | + title="操作" | |
39 | + render={(r:Item) => ( | |
40 | + <> | |
41 | + <a onClick={() => setCurrent({visible: true, item: r})}>编辑</a> | |
42 | + <Divider type="vertical" /> | |
43 | + <Popconfirm | |
44 | + title="确认删除" | |
45 | + onConfirm={() => dele(r.id)} | |
46 | + > | |
47 | + <a>删除</a> | |
48 | + </Popconfirm> | |
49 | + </> | |
50 | + )} | |
51 | + /> | |
52 | + </Table> | |
53 | + <AddModal item={current.item} visible={current.visible} onCancel={() => setCurrent({visible: false, item: {}})} refesh={() => setParams({}, true)} /> | |
54 | + </Card> | |
55 | + </PageHeaderWrapper> | |
56 | + ); | |
57 | +}; | |
58 | +export default Index; | |
0 | 59 | \ No newline at end of file | ... | ... |
src/pages/pms/setting/PlanSetting/index.tsx
1 | 1 | import React, { useState } from 'react'; |
2 | -import { Card, InputNumber, message, Radio } from 'antd'; | |
2 | +import { Card, InputNumber, message } from 'antd'; | |
3 | 3 | import { PageHeaderWrapper } from '@ant-design/pro-layout'; |
4 | 4 | import useInitail from '@/hooks/useInitail'; |
5 | 5 | import ConfirmBnt from '../components/ConfirmBnt'; |
... | ... | @@ -65,12 +65,6 @@ export default function Index() { |
65 | 65 | /> |
66 | 66 | ,配件计划不审批 |
67 | 67 | </span> |
68 | - <span style={{ marginBottom: 20 }}>4、计划员能否修改订件的错误配件编码: | |
69 | - <Radio.Group value={Number(data.editBuyPartCode)} disabled={!disable} onChange={v => setData({ ...data, editBuyPartCode: !!v.target.value})}> | |
70 | - <Radio value={1}>是</Radio> | |
71 | - <Radio value={0}>否</Radio> | |
72 | - </Radio.Group> | |
73 | - </span> | |
74 | 68 | <ConfirmBnt |
75 | 69 | disable={disable} |
76 | 70 | onOk={handleSave} | ... | ... |