巴林闲侠
2 years ago
10 changed files with 526 additions and 3 deletions
@ -0,0 +1,140 @@ |
|||
'use strict'; |
|||
|
|||
async function getGroup(ctx, next) { |
|||
let error = { name: 'FindError', message: '获取检查项分组失败' }; |
|||
let rslt = []; |
|||
try { |
|||
const models = ctx.fs.dc.models; |
|||
let list = await models.CheckItemsGroup.findAll({}); |
|||
|
|||
rslt = list; |
|||
error = null; |
|||
} catch (err) { |
|||
ctx.fs.logger.error(`path: ${ctx.path}, error: ${err}`); |
|||
} |
|||
if (error) { |
|||
ctx.status = 400; |
|||
ctx.body = error; |
|||
} else { |
|||
ctx.status = 200; |
|||
ctx.body = rslt; |
|||
} |
|||
} |
|||
|
|||
async function createGroup(ctx, next) { |
|||
const models = ctx.fs.dc.models; |
|||
try { |
|||
const data = ctx.request.body; |
|||
await models.CheckItemsGroup.create(data) |
|||
ctx.status = 204; |
|||
ctx.body = { message: '新建分组成功' } |
|||
} catch (error) { |
|||
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); |
|||
ctx.status = 400; |
|||
ctx.body = { message: '新建分组失败' } |
|||
} |
|||
} |
|||
|
|||
async function getCheckItems(ctx, next) { |
|||
try { |
|||
const models = ctx.fs.dc.models; |
|||
const { limit, page } = ctx.query; |
|||
let options = { |
|||
order: [['id', 'asc']], |
|||
include: [{ |
|||
required: true, |
|||
model: models.CheckItemsGroup, |
|||
attributes: ['id', 'name'], |
|||
}] |
|||
} |
|||
if (limit) { |
|||
options.limit = Number(limit); |
|||
} |
|||
if (page && limit) { |
|||
options.offset = Number(page) * Number(limit); |
|||
} |
|||
const userRes = await models.CheckItems.findAndCountAll(options) |
|||
|
|||
ctx.status = 200; |
|||
ctx.body = userRes |
|||
} catch (error) { |
|||
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); |
|||
ctx.status = 400; |
|||
ctx.body = { |
|||
"message": "获取检查项失败" |
|||
} |
|||
} |
|||
} |
|||
|
|||
async function createCheckItems(ctx, next) { |
|||
let errMsg = "新增检查项失败" |
|||
try { |
|||
const models = ctx.fs.dc.models; |
|||
const data = ctx.request.body; |
|||
|
|||
await models.CheckItems.create(data); |
|||
|
|||
ctx.status = 204; |
|||
} catch (error) { |
|||
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); |
|||
ctx.status = 400; |
|||
ctx.body = { |
|||
"message": errMsg |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
async function updateCheckItems(ctx, next) { |
|||
let errMsg = "修改检查项失败" |
|||
try { |
|||
const models = ctx.fs.dc.models; |
|||
const data = ctx.request.body; |
|||
const { id } = ctx.params; |
|||
|
|||
await models.CheckItems.update({ |
|||
name: data.name, |
|||
}, { |
|||
where: { |
|||
id: id |
|||
} |
|||
}); |
|||
|
|||
ctx.status = 204; |
|||
} catch (error) { |
|||
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); |
|||
ctx.status = 400; |
|||
ctx.body = { |
|||
"message": errMsg |
|||
} |
|||
} |
|||
} |
|||
|
|||
async function deleteCheckItems(ctx, next) { |
|||
try { |
|||
const models = ctx.fs.dc.models; |
|||
const { ids } = ctx.params; |
|||
const userIds = ids.split(','); |
|||
await models.CheckItems.destroy({ |
|||
where: { |
|||
id: { $in: userIds }, |
|||
} |
|||
}); |
|||
ctx.status = 204; |
|||
} catch (error) { |
|||
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); |
|||
ctx.status = 400; |
|||
ctx.body = { |
|||
"message": "删除检查项失败" |
|||
} |
|||
} |
|||
} |
|||
|
|||
module.exports = { |
|||
getGroup, |
|||
createGroup, |
|||
getCheckItems, |
|||
createCheckItems, |
|||
updateCheckItems, |
|||
deleteCheckItems, |
|||
} |
@ -0,0 +1,31 @@ |
|||
'use strict'; |
|||
|
|||
const checkItems = require('../../controllers/patrolManage/checkItems'); |
|||
|
|||
module.exports = function (app, router, opts) { |
|||
|
|||
app.fs.api.logAttr['GET/checkItems/group'] = { content: '获取分组信息', visible: false }; |
|||
router.get('/checkItems/group', checkItems.getGroup); |
|||
|
|||
app.fs.api.logAttr['POST/checkItems/group'] = { content: '新增分组', visible: false }; |
|||
router.post('/checkItems/group', checkItems.createGroup); |
|||
|
|||
// app.fs.api.logAttr['PUT/organization/dept/:id/modify'] = { content: '修改部门', visible: true };
|
|||
// router.put('/organization/dept/:id/modify', checkItems.updateDept);
|
|||
|
|||
// app.fs.api.logAttr['DELETE/organization/dept/:id'] = { content: '删除部门', visible: true };
|
|||
// router.del('/organization/dept/:id', checkItems.delDept);
|
|||
|
|||
app.fs.api.logAttr['GET/checkItems'] = { content: '获取检查项', visible: false }; |
|||
router.get('/checkItems', checkItems.getCheckItems); |
|||
|
|||
app.fs.api.logAttr['POST/checkItems'] = { content: '新增检查项', visible: false }; |
|||
router.post('/checkItems', checkItems.createCheckItems); |
|||
|
|||
app.fs.api.logAttr['PUT/checkItems/:id'] = { content: '修改检查项', visible: false }; |
|||
router.put('/checkItems/:id', checkItems.updateCheckItems); |
|||
|
|||
app.fs.api.logAttr['DEL/checkItems/:ids'] = { content: '删除检查项', visible: false }; |
|||
router.del('/checkItems/:ids', checkItems.deleteCheckItems); |
|||
|
|||
}; |
@ -0,0 +1,76 @@ |
|||
'use strict'; |
|||
|
|||
import { basicAction } from '@peace/utils' |
|||
import { ApiTable } from '$utils' |
|||
|
|||
export function getCheckItemsGroup() { |
|||
return dispatch => basicAction({ |
|||
type: 'get', |
|||
dispatch: dispatch, |
|||
actionType: 'GET_CHECK_ITEMS_GRROUP', |
|||
url: ApiTable.checkItemsGroup, |
|||
msg: { error: '获取检查项分组失败' }, |
|||
}); |
|||
} |
|||
|
|||
export function createCheckItemsGroup(data) { |
|||
return dispatch => basicAction({ |
|||
type: 'post', |
|||
data, |
|||
dispatch: dispatch, |
|||
actionType: 'CREATE_CHECK_ITEMS_GRROUP', |
|||
url: ApiTable.checkItemsGroup, |
|||
msg: { option: '创建检查项分组' }, |
|||
}); |
|||
} |
|||
|
|||
export function getCheckItems() { |
|||
return dispatch => basicAction({ |
|||
type: 'get', |
|||
dispatch: dispatch, |
|||
actionType: 'GET_CHECK_ITEMS', |
|||
url: ApiTable.checkItems, |
|||
msg: { error: '获取检查项失败' } |
|||
}); |
|||
} |
|||
|
|||
export function createCheckItems(data) { |
|||
return dispatch => basicAction({ |
|||
type: 'post', |
|||
data, |
|||
dispatch: dispatch, |
|||
actionType: 'CREATE_CHECK_ITEMS', |
|||
url: ApiTable.checkItems, |
|||
msg: { option: '新建检查项' }, |
|||
}); |
|||
} |
|||
|
|||
export function updateCheckItems(id, data) { |
|||
return dispatch => basicAction({ |
|||
type: 'put', |
|||
data, |
|||
dispatch: dispatch, |
|||
actionType: 'UPDATE_CHECK_ITEMS', |
|||
url: ApiTable.updateCheckItems.replace('{id}', id), |
|||
msg: { option: '修改检查项' }, |
|||
}); |
|||
} |
|||
|
|||
export function delCheckItems(ids) { |
|||
return dispatch => basicAction({ |
|||
type: 'del', |
|||
dispatch: dispatch, |
|||
actionType: 'DEL_CHECK_ITEMS', |
|||
url: ApiTable.delUser.replace('{ids}', ids), |
|||
msg: { option: '删除检查项' }, |
|||
}); |
|||
} |
|||
|
|||
export default { |
|||
getCheckItemsGroup, |
|||
createCheckItemsGroup, |
|||
getCheckItems, |
|||
createCheckItems, |
|||
updateCheckItems, |
|||
delCheckItems, |
|||
} |
@ -0,0 +1,112 @@ |
|||
import { Button, Form, Input, Modal, Select } from 'antd'; |
|||
import React, { useState, useEffect } from 'react'; |
|||
import { connect } from 'react-redux'; |
|||
import { getUserList, getProjectList, positionList } from '../actions/plan'; |
|||
import { getCheckItemsGroup } from '../actions/checkItems'; |
|||
import moment from 'moment'; |
|||
|
|||
const CheckItemsModal = ({ visible, onCreate, onCancel, dispatch, type, curRecord }) => { |
|||
const [pointOpt, setPointOpt] = useState(); |
|||
const [points, setPoints] = useState(); |
|||
const [isNewGroup, setIsNewGroup] = useState(false); |
|||
const [form] = Form.useForm(); |
|||
|
|||
useEffect(() => { |
|||
dispatch(getCheckItemsGroup()); |
|||
if (type === 'create') { |
|||
dispatch(getUserList()) |
|||
} else { |
|||
dispatch(positionList({ projectId: curRecord?.project?.id })).then(res => { |
|||
if (res.success) { |
|||
setPoints(res.payload.data?.rows) |
|||
setPointOpt(res.payload.data?.rows[0]?.points?.map(p => ({ label: p.name, value: p.id }))) |
|||
} |
|||
}) |
|||
} |
|||
}, []) |
|||
|
|||
return ( |
|||
<Modal |
|||
visible={visible} |
|||
title="新增巡检计划" |
|||
okText="确定" |
|||
cancelText="取消" |
|||
onCancel={() => { |
|||
form.resetFields(); |
|||
onCancel(); |
|||
}} |
|||
onOk={() => { |
|||
if (type === 'view') { |
|||
form.resetFields(); |
|||
onCancel(); |
|||
return; |
|||
} |
|||
form |
|||
.validateFields() |
|||
.then((values) => { |
|||
form.resetFields(); |
|||
const params = { |
|||
...values, |
|||
startTime: values.time[0], |
|||
endTime: values.time[1], |
|||
points: points[0]?.points?.filter(p => values?.points?.includes(p.id)) |
|||
} |
|||
onCreate(params); |
|||
}) |
|||
.catch((info) => { |
|||
console.log('Validate Failed:', info); |
|||
}); |
|||
}} |
|||
> |
|||
<Form |
|||
form={form} |
|||
layout="vertical" |
|||
name="form_in_modal" |
|||
initialValues={{ |
|||
...curRecord, |
|||
points: curRecord?.points?.map(p => p.id), |
|||
userDept: curRecord?.user?.department?.name, |
|||
}} |
|||
disabled={type === 'view'} |
|||
> |
|||
<Form.Item |
|||
name="name" |
|||
label="检查项名称" |
|||
rules={[ |
|||
{ required: true, message: '请输入检查项名称' }, |
|||
]} |
|||
> |
|||
<Input /> |
|||
</Form.Item> |
|||
<Form.Item |
|||
name="groupName" |
|||
label="分组名称" |
|||
rules={[ |
|||
{ required: true, message: '请选择分组' }, |
|||
]} |
|||
> |
|||
{ |
|||
isNewGroup ? |
|||
<Select options={pointOpt} disabled={!pointOpt || type === 'view'} /> : |
|||
<Input /> |
|||
} |
|||
</Form.Item> |
|||
</Form> |
|||
<Button type='link' onClick={() => { |
|||
setIsNewGroup(!isNewGroup); |
|||
}}>创建分组</Button> |
|||
</Modal > |
|||
); |
|||
}; |
|||
|
|||
function mapStateToProps(state) { |
|||
const { auth, userList, structureList } = state |
|||
return { |
|||
user: auth.user, |
|||
userList: userList.data || [], |
|||
structureList: structureList.data || [], |
|||
userLoading: userList.isRequesting, |
|||
struLoading: structureList.isRequesting |
|||
} |
|||
} |
|||
export default connect(mapStateToProps)(CheckItemsModal); |
@ -0,0 +1,146 @@ |
|||
import React, { useState, useRef } from 'react'; |
|||
import { connect } from 'react-redux'; |
|||
import { Button, Popconfirm } from 'antd'; |
|||
import ProTable from '@ant-design/pro-table'; |
|||
import CheckItemsModal from '../components/checkItemsModal'; |
|||
import { createPatrolPlan, delPatrolPlan, updatePatrolPlan } from '../actions/plan'; |
|||
import { getCheckItems } from '../actions/checkItems'; |
|||
import moment from 'moment'; |
|||
|
|||
function CheckItems(props) { |
|||
const { dispatch, user } = props; |
|||
const tableRef = useRef(); |
|||
const [dataSource, setDataSource] = useState([{}]); |
|||
const [visible, setVisible] = useState(false); |
|||
const [type, setType] = useState(); |
|||
const [curRecord, setCurRecord] = useState(); |
|||
const [select, setSelect] = useState([]); |
|||
|
|||
const onCreate = (values) => { |
|||
if (type === 'create') { |
|||
dispatch(createPatrolPlan(values)).then(res => { |
|||
if (res.success) { |
|||
tableRef.current.reload(); |
|||
} |
|||
}) |
|||
} else { |
|||
dispatch(updatePatrolPlan({ ...values, id: curRecord.id })).then(res => { |
|||
if (res.success) { |
|||
tableRef.current.reload(); |
|||
} |
|||
}) |
|||
} |
|||
setVisible(false); |
|||
}; |
|||
|
|||
const columns = [{ |
|||
title: '检查项', |
|||
dataIndex: 'name', |
|||
key: 'name', |
|||
ellipsis: true, |
|||
width: 150, |
|||
}, { |
|||
title: '分组名称', |
|||
dataIndex: 'groupName', |
|||
key: 'groupName', |
|||
ellipsis: true, |
|||
search: false, |
|||
width: 150, |
|||
render: (_, record) => { |
|||
return <div>{record?.check_items_group?.name}</div> |
|||
} |
|||
}, { |
|||
title: '操作', |
|||
dataIndex: 'action', |
|||
key: 'action', |
|||
search: false, |
|||
width: 200, |
|||
render: (_, record) => { |
|||
return <> |
|||
<Button type="link" onClick={() => { |
|||
setType('edit') |
|||
setCurRecord(record) |
|||
setVisible(true) |
|||
}}>修改</Button> |
|||
<Popconfirm |
|||
title="确认删除?" |
|||
onConfirm={() => { |
|||
dispatch(delPatrolPlan(record.id)).then(res => { |
|||
if (res.success) { |
|||
tableRef.current.reload(); |
|||
} |
|||
}) |
|||
}}> |
|||
<Button type="link" danger>删除</Button> |
|||
</Popconfirm> |
|||
</> |
|||
}, |
|||
}]; |
|||
|
|||
return ( |
|||
<> |
|||
<ProTable |
|||
columns={columns} |
|||
actionRef={tableRef} |
|||
options={false} |
|||
dataSource={dataSource || []} |
|||
rowKey='id' |
|||
pagination={{ pageSize: 10 }} |
|||
request={async (params = {}) => { |
|||
const res = await dispatch(getCheckItems(params)); |
|||
setDataSource(res?.payload.data?.rows); |
|||
return { ...res }; |
|||
}} |
|||
onReset={() => { }} |
|||
search={{ |
|||
defaultCollapsed: false, |
|||
optionRender: (searchConfig, formProps, dom) => [ |
|||
...dom.reverse(), |
|||
<Button |
|||
key="add" |
|||
type='primary' |
|||
onClick={() => { |
|||
setType('create') |
|||
setVisible(true) |
|||
}} |
|||
>新增</Button>, |
|||
<Button |
|||
key="del" |
|||
type='primary' |
|||
onClick={() => { |
|||
const values = searchConfig?.form?.getFieldsValue(); |
|||
console.log(values); |
|||
}} |
|||
>批量删除</Button>, |
|||
], |
|||
}} |
|||
rowSelection={{ |
|||
selectedRowKeys: select?.map(v => v.id) || [], |
|||
onChange: (selectedRowKeys, selectedRows) => { |
|||
setSelect(selectedRows) |
|||
} |
|||
}} |
|||
/> |
|||
{ |
|||
visible ? |
|||
<CheckItemsModal |
|||
visible={visible} |
|||
onCreate={onCreate} |
|||
type={type} |
|||
curRecord={curRecord} |
|||
onCancel={() => { |
|||
setVisible(false); |
|||
}} |
|||
/> : null |
|||
} |
|||
</> |
|||
) |
|||
} |
|||
|
|||
function mapStateToProps(state) { |
|||
const { auth } = state |
|||
return { |
|||
user: auth.user |
|||
} |
|||
} |
|||
export default connect(mapStateToProps)(CheckItems); |
Loading…
Reference in new issue