Commit 3f6ecf02965d505106cc56f5c65e1c6357678045
1 parent
ce698ce0
添加 工作类型设置(内部),并对接接口;
Showing
4 changed files
with
230 additions
and
116 deletions
config/routers/office.ts
1 | 1 | /* |
2 | 2 | * @Date: 2021-08-10 09:51:37 |
3 | 3 | * @LastEditors: wangqiang@feewee.cn |
4 | - * @LastEditTime: 2021-10-12 14:36:13 | |
4 | + * @LastEditTime: 2023-01-30 10:41:51 | |
5 | 5 | */ |
6 | 6 | export default [ |
7 | 7 | /** 会议办公 **/ |
8 | 8 | { |
9 | - path: '/office/workStandardSetting', // 工作项标准配置 | |
10 | - component: './office/Work/WorkStandardSetting' | |
9 | + path: "/office/workStandardSetting", // 工作项标准配置 | |
10 | + component: "./office/Work/WorkStandardSetting", | |
11 | 11 | }, |
12 | 12 | { |
13 | - path: '/office/workShopStandardSetting', // 门店工作项匹配标准设置 | |
14 | - component: './office/Work/WorkShopStandardSetting' | |
13 | + path: "/office/workShopStandardSetting", // 门店工作项匹配标准设置 | |
14 | + component: "./office/Work/WorkShopStandardSetting", | |
15 | 15 | }, |
16 | 16 | { |
17 | - path: '/office/punishmentMattersSettings', // 处罚事项设置 | |
18 | - component: './office/PunishmentMattersSettings' | |
17 | + path: "/office/punishmentMattersSettings", // 处罚事项设置 | |
18 | + component: "./office/PunishmentMattersSettings", | |
19 | 19 | }, |
20 | 20 | { |
21 | - path: '/office/rewardAmountSetting', // 奖励额度设置 | |
22 | - component: './office/RewardAmountSetting' | |
21 | + path: "/office/rewardAmountSetting", // 奖励额度设置 | |
22 | + component: "./office/RewardAmountSetting", | |
23 | 23 | }, |
24 | 24 | { |
25 | - path: '/office/workTypeSetting', // 工作类型设置 | |
26 | - component: './office/WorkTypeSetting' | |
25 | + path: "/office/workTypeSetting", // 工作类型设置 | |
26 | + component: "./office/WorkTypeSetting", | |
27 | + }, | |
28 | + { | |
29 | + path: "/office/workTypeSetting_private", // 工作类型设置(内部) | |
30 | + component: "./office/WorkTypeSetting", | |
27 | 31 | }, |
28 | 32 | ]; |
29 | 33 | \ No newline at end of file | ... | ... |
src/pages/office/WorkTypeSetting/api.ts
1 | 1 | /* |
2 | 2 | * @Date: 2021-03-23 17:48:39 |
3 | 3 | * @LastEditors: wangqiang@feewee.cn |
4 | - * @LastEditTime: 2021-10-08 10:06:58 | |
4 | + * @LastEditTime: 2023-01-30 10:47:34 | |
5 | 5 | */ |
6 | -import request from '@/utils/request'; | |
7 | -import { OFFICE } from '@/utils/host'; | |
8 | -import { http } from '@/typing/http'; | |
6 | +import request from "@/utils/request"; | |
7 | +import { OFFICE } from "@/utils/host"; | |
8 | +import { http } from "@/typing/http"; | |
9 | 9 | |
10 | 10 | /** |
11 | 11 | * @description: 工作类型分页 |
12 | 12 | * @param {WorkTypeSetting.QueryParams} params |
13 | 13 | * @return {http.PromisePageResp<WorkTypeSetting.WorkTypeItemVO>} |
14 | 14 | */ |
15 | -export function getWorkTypeListApi(params: WorkTypeSetting.QueryParams): http.PromisePageResp<WorkTypeSetting.WorkTypeItemVO> { | |
16 | - return request.get(`${OFFICE}/erp/work/config//type/page`, { params }); | |
15 | +export function getWorkTypeListApi( | |
16 | + params: WorkTypeSetting.QueryParams | |
17 | +): http.PromisePageResp<WorkTypeSetting.WorkTypeItemVO> { | |
18 | + return request.get(`${OFFICE}/erp/work/config/type/page`, { params }); | |
17 | 19 | } |
18 | 20 | |
19 | 21 | /** |
... | ... | @@ -21,7 +23,9 @@ export function getWorkTypeListApi(params: WorkTypeSetting.QueryParams): http.Pr |
21 | 23 | * @param {WorkTypeSetting.WorkTypeItemVO} params |
22 | 24 | * @return {http.PromiseResp<string>} |
23 | 25 | */ |
24 | -export function saveWorkTypeApi(params: WorkTypeSetting.WorkTypeItemVO): http.PromiseResp<string> { | |
26 | +export function saveWorkTypeApi( | |
27 | + params: WorkTypeSetting.WorkTypeItemVO | |
28 | +): http.PromiseResp<string> { | |
25 | 29 | return request.post(`${OFFICE}/erp/work/config//type/save`, params); |
26 | 30 | } |
27 | 31 | |
... | ... | @@ -31,5 +35,7 @@ export function saveWorkTypeApi(params: WorkTypeSetting.WorkTypeItemVO): http.Pr |
31 | 35 | * @return {http.PromiseResp<string>} |
32 | 36 | */ |
33 | 37 | export function deleteWorkTypeApi(id: number): http.PromiseResp<string> { |
34 | - return request.get(`${OFFICE}/erp/work/config//type/remove`, { params: { id } }); | |
35 | -} | |
36 | 38 | \ No newline at end of file |
39 | + return request.get(`${OFFICE}/erp/work/config//type/remove`, { | |
40 | + params: { id }, | |
41 | + }); | |
42 | +} | ... | ... |
src/pages/office/WorkTypeSetting/index.tsx
1 | 1 | /* |
2 | 2 | * @Date: 2021-03-23 17:47:45 |
3 | 3 | * @LastEditors: wangqiang@feewee.cn |
4 | - * @LastEditTime: 2021-10-08 10:17:36 | |
4 | + * @LastEditTime: 2023-01-30 11:19:10 | |
5 | 5 | */ |
6 | -import React, { useEffect, useState } from 'react'; | |
7 | -import { Modal, List, Button, Row, Col, Input, Popconfirm, message, Card, ConfigProvider } from 'antd'; | |
8 | -import { PlusOutlined, CloseOutlined, DatabaseOutlined, PlusCircleOutlined, EditOutlined, CheckCircleOutlined, CloseCircleOutlined, DeleteOutlined } from '@ant-design/icons'; | |
9 | -import { getWorkTypeListApi, saveWorkTypeApi, deleteWorkTypeApi } from './api'; | |
10 | -import { debounce } from 'lodash'; | |
11 | -import usePagination from '@/hooks/usePagination'; | |
12 | -import { PageHeaderWrapper } from '@ant-design/pro-layout'; | |
13 | -import zhCN from 'antd/lib/locale-provider/zh_CN'; | |
6 | +import React, { useEffect, useState } from "react"; | |
7 | +import { | |
8 | + Modal, | |
9 | + Button, | |
10 | + Row, | |
11 | + Input, | |
12 | + Popconfirm, | |
13 | + message, | |
14 | + Card, | |
15 | + ConfigProvider, | |
16 | + Table, | |
17 | + Divider, | |
18 | + Form, | |
19 | + Spin, | |
20 | +} from "antd"; | |
21 | +import { PlusOutlined } from "@ant-design/icons"; | |
22 | +import { getWorkTypeListApi, saveWorkTypeApi, deleteWorkTypeApi } from "./api"; | |
23 | +import { debounce } from "lodash"; | |
24 | +import usePagination from "@/hooks/usePagination"; | |
25 | +import { PageHeaderWrapper } from "@ant-design/pro-layout"; | |
26 | +import zhCN from "antd/lib/locale-provider/zh_CN"; | |
27 | +import { history } from "umi"; | |
28 | +import FeeweeFilterOption from "@/pages/notice/components/FeeweeFilterOption"; | |
14 | 29 | |
15 | 30 | export default function WorkTypeSettings() { |
16 | - const examTypePagination = usePagination(getWorkTypeListApi); | |
17 | - const { list, loading, setLoading, paginationConfig, setParams: setExamTypeParams } = examTypePagination; | |
18 | - const [isAdd, setIsAdd] = useState(false); | |
19 | - const [addInputValue, setAddInputValue] = useState<string>(); | |
20 | - const [edit, setEdit] = useState<{ id?: number, value?: string }>(); | |
31 | + const systemDefine = history.location.pathname.includes( | |
32 | + "workTypeSetting_private" | |
33 | + ); | |
34 | + const workTypePagination = usePagination(getWorkTypeListApi, { | |
35 | + systemDefine, | |
36 | + }); | |
37 | + const { | |
38 | + list, | |
39 | + loading, | |
40 | + setLoading, | |
41 | + paginationConfig, | |
42 | + setParams: setExamTypeParams, | |
43 | + } = workTypePagination; | |
44 | + const [form] = Form.useForm(); | |
45 | + const [confirmLoading, setConfirmLoading] = useState(false); | |
46 | + const [current, setCurrent] = useState<WorkTypeSetting.WorkTypeItemVO>(); | |
47 | + const [open, setOpen] = useState(false); | |
21 | 48 | |
22 | - const editItem = (): any => { | |
23 | - if (!edit?.value || (edit?.value && !edit?.value.trim())) return message.error('工作类型不能为空!'); | |
24 | - saveWorkTypeApi({ id: edit?.id, name: edit?.value }).then(res => { | |
25 | - message.success('操作成功'); | |
26 | - setLoading(true); | |
27 | - setEdit(undefined); | |
28 | - }).catch(error => { | |
29 | - message.error(error.message); | |
30 | - }); | |
31 | - } | |
49 | + useEffect(() => { | |
50 | + if (open) { | |
51 | + current && | |
52 | + form.setFieldsValue({ | |
53 | + ...current, | |
54 | + }); | |
55 | + } else { | |
56 | + form.resetFields(); | |
57 | + } | |
58 | + }, [open, current]); | |
32 | 59 | |
33 | 60 | const delItem = (id: number) => { |
34 | - deleteWorkTypeApi(id).then(res => { | |
35 | - message.success('删除成功'); | |
36 | - setLoading(true); | |
37 | - }).catch(error => message.error(error.message)); | |
38 | - } | |
61 | + deleteWorkTypeApi(id) | |
62 | + .then((res) => { | |
63 | + message.success("删除成功"); | |
64 | + setLoading(true); | |
65 | + }) | |
66 | + .catch((error) => message.error(error.message)); | |
67 | + }; | |
39 | 68 | |
40 | - const addOption = (): any => { | |
41 | - if (!addInputValue || (addInputValue && !addInputValue.trim())) return message.error('工作类型不能为空!'); | |
42 | - saveWorkTypeApi({ name: addInputValue }).then(res => { | |
43 | - message.success('操作成功'); | |
44 | - setAddInputValue(undefined); | |
45 | - setLoading(true); | |
46 | - }).catch(error => { | |
47 | - message.error(error.message); | |
48 | - }); | |
49 | - } | |
69 | + const onSearch = debounce( | |
70 | + (name: string) => setExamTypeParams({ name, current: 1 }, true), | |
71 | + 500 | |
72 | + ); | |
50 | 73 | |
51 | - const renderItem = (item: ExamSetting.TypeItem) => <List.Item key={item.id}> | |
52 | - <DatabaseOutlined style={{ marginRight: 10 }} /> | |
53 | - <Input | |
54 | - readOnly={edit?.id !== item.id} | |
55 | - bordered={edit?.id === item.id} | |
56 | - allowClear | |
57 | - value={edit && edit.id === item.id ? edit.value : item.name} | |
58 | - onChange={e => setEdit({ ...edit, value: e.target.value })} | |
59 | - onClick={() => setEdit({ id: item.id, value: item.name })} | |
60 | - suffix={edit && edit.id === item.id ? | |
61 | - <Popconfirm title={`确定修改工作类型?`} onConfirm={() => editItem()}> | |
62 | - <Button type='link' icon={<CheckCircleOutlined />} /> | |
63 | - </Popconfirm> : | |
64 | - <> | |
65 | - <Button type='link' icon={<EditOutlined />} onClick={() => setEdit({ id: item.id, value: item.name })} /> | |
66 | - <Popconfirm title={`确定删除【${item.name}】工作类型?`} onConfirm={() => delItem(item.id!)}> | |
67 | - <Button type='link' icon={<DeleteOutlined />} danger /> | |
68 | - </Popconfirm> | |
69 | - </>} | |
70 | - /> | |
71 | - </List.Item> | |
72 | - | |
73 | - const onSearch = debounce((name: string) => setExamTypeParams({ name, current: 1 }, true), 500); | |
74 | + const onOk = (val: any) => { | |
75 | + const params: WorkTypeSetting.WorkTypeItemVO = { | |
76 | + id: current?.id, | |
77 | + name: val.name, | |
78 | + key: val?.key, | |
79 | + pageLink: val.pageLink, | |
80 | + systemDefine, | |
81 | + }; | |
82 | + setConfirmLoading(true); | |
83 | + saveWorkTypeApi(params) | |
84 | + .then((res) => { | |
85 | + setConfirmLoading(false); | |
86 | + message.success(res.result); | |
87 | + setOpen(false); | |
88 | + setLoading(true); | |
89 | + }) | |
90 | + .catch((error) => { | |
91 | + setConfirmLoading(false); | |
92 | + message.error(error.message || "保存工作类型失败"); | |
93 | + }); | |
94 | + }; | |
74 | 95 | |
75 | 96 | return ( |
76 | - <PageHeaderWrapper title="工作类型设置"> | |
97 | + <PageHeaderWrapper title={`工作类型设置${systemDefine ? "(内部)" : ""}`}> | |
77 | 98 | <ConfigProvider locale={zhCN}> |
78 | 99 | <Card bordered={false}> |
79 | 100 | <Row justify="space-between" style={{ marginBottom: 20 }}> |
80 | - <Input placeholder="输入工作项大类查询" allowClear style={{ width: 260 }} onChange={e => onSearch(e.target.value)} /> | |
81 | - <Button type='link' icon={<CloseCircleOutlined />} disabled={!edit} onClick={() => setEdit(undefined)}>取消编辑</Button> | |
101 | + <FeeweeFilterOption title="工作类型"> | |
102 | + <Input | |
103 | + placeholder="输入工作类型查询" | |
104 | + allowClear | |
105 | + style={{ minWidth: 260 }} | |
106 | + onChange={(e) => onSearch(e.target.value)} | |
107 | + /> | |
108 | + </FeeweeFilterOption> | |
109 | + <Button | |
110 | + type="primary" | |
111 | + icon={<PlusOutlined />} | |
112 | + onClick={() => { | |
113 | + setCurrent(undefined); | |
114 | + setOpen(true); | |
115 | + }} | |
116 | + > | |
117 | + 添加 | |
118 | + </Button> | |
82 | 119 | </Row> |
83 | - <List | |
84 | - bordered | |
85 | - loading={loading} | |
86 | - pagination={{ ...paginationConfig, size: 'small' }} | |
120 | + <Table | |
87 | 121 | dataSource={list} |
122 | + pagination={paginationConfig} | |
123 | + loading={loading} | |
88 | 124 | rowKey="id" |
89 | - renderItem={item => renderItem(item)} | |
90 | - /> | |
91 | - <Row justify='space-between' style={{ height: 42, marginTop: 20 }}> | |
92 | - <Col span={6} style={{ justifyContent: 'center', alignItems: 'center', display: 'flex' }}> | |
93 | - <Button type='link' icon={isAdd ? <CloseOutlined /> : <PlusOutlined />} onClick={() => setIsAdd(!isAdd)} style={{ padding: '4px 0' }}>{isAdd ? '取消添加类型' : '添加工作类型'}</Button> | |
94 | - </Col> | |
95 | - <Col span={18}> | |
96 | - {isAdd && <Input | |
97 | - style={{ width: '100%' }} | |
98 | - placeholder='请输入工作类型' | |
99 | - allowClear | |
100 | - value={addInputValue} | |
101 | - onChange={e => setAddInputValue(e.target.value)} | |
102 | - suffix={ | |
103 | - <Popconfirm title={`确定添加工作类型?`} onConfirm={() => addOption()}> | |
104 | - <Button type='link' icon={<PlusCircleOutlined />} disabled={!addInputValue} /> | |
105 | - </Popconfirm> | |
106 | - } /> | |
107 | - } | |
108 | - </Col> | |
109 | - </Row> | |
125 | + > | |
126 | + <Table.Column title="工作类型" dataIndex="name" align="left" /> | |
127 | + {systemDefine ? ( | |
128 | + <> | |
129 | + <Table.Column | |
130 | + title="业务详情key" | |
131 | + dataIndex="key" | |
132 | + align="left" | |
133 | + render={(key: string) => key || "-"} | |
134 | + /> | |
135 | + <Table.Column | |
136 | + title="业务详情APP路径" | |
137 | + dataIndex="pageLink" | |
138 | + align="left" | |
139 | + render={(pageLink: string) => pageLink || "-"} | |
140 | + /> | |
141 | + </> | |
142 | + ) : null} | |
143 | + <Table.Column | |
144 | + title="操作" | |
145 | + align="left" | |
146 | + render={(record: WorkTypeSetting.WorkTypeItemVO) => ( | |
147 | + <> | |
148 | + <a | |
149 | + onClick={() => { | |
150 | + setCurrent(record); | |
151 | + setOpen(true); | |
152 | + }} | |
153 | + > | |
154 | + 编辑 | |
155 | + </a> | |
156 | + {/* <Divider type="vertical" /> | |
157 | + <Popconfirm | |
158 | + title={`确定删除【${record.name}】工作类型?`} | |
159 | + onConfirm={() => delItem(record.id!)} | |
160 | + > | |
161 | + <a style={{ color: "#F0492C" }}>删除</a> | |
162 | + </Popconfirm> */} | |
163 | + </> | |
164 | + )} | |
165 | + /> | |
166 | + </Table> | |
167 | + <Modal | |
168 | + title={`${current ? "编辑" : "添加"}工作类型`} | |
169 | + open={open} | |
170 | + maskClosable={false} | |
171 | + onOk={form.submit} | |
172 | + onCancel={() => setOpen(false)} | |
173 | + afterClose={() => { | |
174 | + setCurrent(undefined); | |
175 | + }} | |
176 | + confirmLoading={confirmLoading} | |
177 | + > | |
178 | + <Spin spinning={confirmLoading}> | |
179 | + <Form form={form} onFinish={onOk}> | |
180 | + <Form.Item | |
181 | + name="name" | |
182 | + label="工作类型" | |
183 | + rules={[{ required: true, message: "请输入工作类型" }]} | |
184 | + > | |
185 | + <Input placeholder="请输入工作类型" allowClear /> | |
186 | + </Form.Item> | |
187 | + {systemDefine ? ( | |
188 | + <> | |
189 | + <Form.Item | |
190 | + name="key" | |
191 | + label="业务详情key" | |
192 | + rules={[{ required: true, message: "请输入业务详情key" }]} | |
193 | + > | |
194 | + <Input placeholder="请输入业务详情key" allowClear /> | |
195 | + </Form.Item> | |
196 | + <Form.Item | |
197 | + name="pageLink" | |
198 | + label="业务详情APP路径" | |
199 | + rules={[ | |
200 | + { required: true, message: "请输入业务详情APP路径" }, | |
201 | + ]} | |
202 | + > | |
203 | + <Input placeholder="请输入业务详情APP路径" allowClear /> | |
204 | + </Form.Item> | |
205 | + </> | |
206 | + ) : null} | |
207 | + </Form> | |
208 | + </Spin> | |
209 | + </Modal> | |
110 | 210 | </Card> |
111 | 211 | </ConfigProvider> |
112 | 212 | </PageHeaderWrapper> |
113 | - ) | |
114 | -} | |
115 | 213 | \ No newline at end of file |
214 | + ); | |
215 | +} | ... | ... |
src/pages/office/WorkTypeSetting/interface.d.ts
1 | 1 | /* |
2 | 2 | * @Date: 2021-08-11 15:51:56 |
3 | 3 | * @LastEditors: wangqiang@feewee.cn |
4 | - * @LastEditTime: 2021-10-08 10:07:01 | |
4 | + * @LastEditTime: 2023-01-30 11:07:33 | |
5 | 5 | */ |
6 | 6 | declare namespace WorkTypeSetting { |
7 | 7 | interface QueryParams { |
8 | - name?: string // 工作项名称 | |
8 | + name?: string; // 工作项名称 | |
9 | + systemDefine?: boolean; // 内部设置:true,外部设置:false | |
9 | 10 | } |
10 | 11 | |
11 | 12 | interface WorkTypeItemVO { |
12 | - id?: number //工作类型id | |
13 | - name?: string //工作类型名称 | |
13 | + id?: number; //工作类型id | |
14 | + name?: string; //工作类型名称 | |
15 | + key?: string; // 业务详情key | |
16 | + pageLink?: string; // 业务详情路径 | |
17 | + systemDefine?: boolean; // 内部设置:true,外部设置:false | |
14 | 18 | } |
15 | 19 | } | ... | ... |