Commit 955d14d6 by zhaochengxiang

资产盘点任务

parent ba6fcc25
...@@ -74,6 +74,6 @@ ...@@ -74,6 +74,6 @@
"last 1 safari version" "last 1 safari version"
] ]
}, },
"proxy": "http://139.198.127.28:17389", "proxy": "http://139.198.127.28:17279",
"homepage": "http://myhost/data-govern" "homepage": "http://myhost/data-govern"
} }
...@@ -23,6 +23,7 @@ import EditModel from './view/Manage/Model/Component/EditModel'; ...@@ -23,6 +23,7 @@ import EditModel from './view/Manage/Model/Component/EditModel';
import EditTemplate from './view/Manage/ModelConfig/Component/EditTemplate'; import EditTemplate from './view/Manage/ModelConfig/Component/EditTemplate';
import AssetTree from './view/Manage/AssetManage/Component/AssetTree'; import AssetTree from './view/Manage/AssetManage/Component/AssetTree';
import Asset1104Manage from './view/Manage/Asset1104Manage'; import Asset1104Manage from './view/Manage/Asset1104Manage';
import AssetTask from './view/Manage/AssetTask';
import { AssetMountReference } from './util/constant'; import { AssetMountReference } from './util/constant';
...@@ -131,6 +132,7 @@ export class App extends React.Component { ...@@ -131,6 +132,7 @@ export class App extends React.Component {
<Route path={'/center-home/view/asset-resource-browse'} component={AssetResourceBrowse} exact /> <Route path={'/center-home/view/asset-resource-browse'} component={AssetResourceBrowse} exact />
<Route path={'/center-home/view/asset-browse'} component={AssetBrowse} exact /> <Route path={'/center-home/view/asset-browse'} component={AssetBrowse} exact />
<Route path={'/center-home/view/asset-recycle'} component={AssetRecycle} exact /> <Route path={'/center-home/view/asset-recycle'} component={AssetRecycle} exact />
<Route path={'/center-home/view/asset-task'} component={AssetTask} exact />
<Route path={'/center-home/view/asset-1104-manage'} component={Asset1104Manage} exact /> <Route path={'/center-home/view/asset-1104-manage'} component={Asset1104Manage} exact />
<Route path={'/center-home/menu/datasource-manage'} component={DatasourceManage} exact /> <Route path={'/center-home/menu/datasource-manage'} component={DatasourceManage} exact />
...@@ -141,6 +143,7 @@ export class App extends React.Component { ...@@ -141,6 +143,7 @@ export class App extends React.Component {
<Route path={'/center-home/menu/asset-resource-browse'} component={AssetResourceBrowse} exact /> <Route path={'/center-home/menu/asset-resource-browse'} component={AssetResourceBrowse} exact />
<Route path={'/center-home/menu/asset-browse'} component={AssetBrowse} exact /> <Route path={'/center-home/menu/asset-browse'} component={AssetBrowse} exact />
<Route path={'/center-home/menu/asset-recycle'} component={AssetRecycle} exact /> <Route path={'/center-home/menu/asset-recycle'} component={AssetRecycle} exact />
<Route path={'/center-home/menu/asset-task'} component={AssetTask} exact />
<Route path={'/center-home/menu/asset-1104-manage'} component={Asset1104Manage} exact /> <Route path={'/center-home/menu/asset-1104-manage'} component={Asset1104Manage} exact />
<Route path={'/center-home/data-model-action'} component={EditModel} exact /> <Route path={'/center-home/data-model-action'} component={EditModel} exact />
<Route path={'/center-home/asset-detail'} component={AssetDetailPage} exact /> <Route path={'/center-home/asset-detail'} component={AssetDetailPage} exact />
......
...@@ -204,3 +204,19 @@ export function* listSmartBIWorkbooks(payload) { ...@@ -204,3 +204,19 @@ export function* listSmartBIWorkbooks(payload) {
export function* deleteSmartBIWorkbooks(payload) { export function* deleteSmartBIWorkbooks(payload) {
return yield call(service.deleteSmartBIWorkbooks, payload); return yield call(service.deleteSmartBIWorkbooks, payload);
} }
export function* listTasks(payload) {
return yield call(service.listTasks, payload);
}
export function* saveTask(payload) {
return yield call(service.saveTask, payload);
}
export function* auditTask(payload) {
return yield call(service.auditTask, payload);
}
export function* uploadDataAssetExcel(payload) {
return yield call(service.uploadDataAssetExcel, payload);
}
\ No newline at end of file
...@@ -15,3 +15,9 @@ export function* signout() { ...@@ -15,3 +15,9 @@ export function* signout() {
export function* getDomains() { export function* getDomains() {
return yield call(service.getDomains); return yield call(service.getDomains);
} }
export function* userGroups() {
return yield call(service.userGroups);
}
export function* getGroupUsers(payload) {
return yield call(service.getGroupUsers, payload);
}
\ No newline at end of file
...@@ -46,6 +46,10 @@ export const routes = [ ...@@ -46,6 +46,10 @@ export const routes = [
{ {
name: 'asset-recycle', name: 'asset-recycle',
text: '未挂载资产', text: '未挂载资产',
},
{
name: 'asset-task',
text: '资产盘点任务',
} }
] ]
} }
......
...@@ -211,3 +211,19 @@ export function listSmartBIWorkbooks(payload) { ...@@ -211,3 +211,19 @@ export function listSmartBIWorkbooks(payload) {
export function deleteSmartBIWorkbooks(payload) { export function deleteSmartBIWorkbooks(payload) {
return Post("/dataassetmanager/smartBIApi/deleteWorkbooks", payload); return Post("/dataassetmanager/smartBIApi/deleteWorkbooks", payload);
} }
export function listTasks(payload) {
return PostJSON("/dataassetmanager/dataAssetCheckApi/listTasks", payload);
}
export function saveTask(payload) {
return PostJSON("/dataassetmanager/dataAssetCheckApi/saveTask", payload);
}
export function auditTask(payload) {
return PostJSON("/dataassetmanager/dataAssetCheckApi/audit", payload);
}
export function uploadDataAssetExcel(payload) {
return PostFile("/dataassetmanager/dataAssetCheckApi/uploadDataAssetExcel", payload);
}
\ No newline at end of file
...@@ -22,3 +22,11 @@ export function queryUserSystem(payload) { ...@@ -22,3 +22,11 @@ export function queryUserSystem(payload) {
export function getDomains() { export function getDomains() {
return GetJSON("/authservice/domains"); return GetJSON("/authservice/domains");
} }
export function userGroups() {
return GetJSON("/authservice/userGroups");
}
export function getGroupUsers(payload) {
return GetJSON(`/authservice/userGroups/${payload.id}/users`)
}
\ No newline at end of file
...@@ -6,6 +6,7 @@ import { IsArr, showMessage, isSzseEnv } from './index'; ...@@ -6,6 +6,7 @@ import { IsArr, showMessage, isSzseEnv } from './index';
const CancelToken = axios.CancelToken; const CancelToken = axios.CancelToken;
const baseURL = '/api/'; const baseURL = '/api/';
const debugEnv = 475629450;
const instance = axios.create({ const instance = axios.create({
baseURL, baseURL,
...@@ -102,7 +103,7 @@ const callback = resp => { ...@@ -102,7 +103,7 @@ const callback = resp => {
export function Get(url, params) { export function Get(url, params) {
const cancelToken = __source ? __source.token : null; const cancelToken = __source ? __source.token : null;
const env = LocalStorage.get('assetsEnv'); const env = LocalStorage.get('assetsEnv')??debugEnv;
return textplain.get(url, { return textplain.get(url, {
params: {...params, env}, cancelToken params: {...params, env}, cancelToken
...@@ -113,7 +114,7 @@ export function Get(url, params) { ...@@ -113,7 +114,7 @@ export function Get(url, params) {
export function GetJSON(url, params) { export function GetJSON(url, params) {
const cancelToken = __source ? __source.token : null; const cancelToken = __source ? __source.token : null;
const env = LocalStorage.get('assetsEnv'); const env = LocalStorage.get('assetsEnv')??debugEnv;
return instance.get(url, { return instance.get(url, {
params: {...params, env}, cancelToken, params: {...params, env}, cancelToken,
...@@ -125,7 +126,7 @@ export function GetJSON(url, params) { ...@@ -125,7 +126,7 @@ export function GetJSON(url, params) {
export function Delete(url, params) { export function Delete(url, params) {
const cancelToken = __source ? __source.token : null; const cancelToken = __source ? __source.token : null;
const env = LocalStorage.get('assetsEnv'); const env = LocalStorage.get('assetsEnv')??debugEnv;
return instance.delete(url, { return instance.delete(url, {
params: {...params, env}, cancelToken, params: {...params, env}, cancelToken,
...@@ -137,7 +138,7 @@ export function Delete(url, params) { ...@@ -137,7 +138,7 @@ export function Delete(url, params) {
export function PostJSON(url, payload) { export function PostJSON(url, payload) {
const { params = null, data = null } = payload||{}; const { params = null, data = null } = payload||{};
const cancelToken = __source ? __source.token : null; const cancelToken = __source ? __source.token : null;
const env = LocalStorage.get('assetsEnv'); const env = LocalStorage.get('assetsEnv')??debugEnv;
return IsArr(data) ? instance.post(url, data, { return IsArr(data) ? instance.post(url, data, {
params: {...params, env}, cancelToken params: {...params, env}, cancelToken
...@@ -153,7 +154,7 @@ export function PostJSON(url, payload) { ...@@ -153,7 +154,7 @@ export function PostJSON(url, payload) {
export function Post(url, payload) { export function Post(url, payload) {
const { params = null, data = null } = payload||{}; const { params = null, data = null } = payload||{};
const cancelToken = __source ? __source.token : null; const cancelToken = __source ? __source.token : null;
const env = LocalStorage.get('assetsEnv'); const env = LocalStorage.get('assetsEnv')??debugEnv;
return textplain.post(url, null, { return textplain.post(url, null, {
params: {...params, env}, data, cancelToken params: {...params, env}, data, cancelToken
...@@ -164,7 +165,7 @@ export function Post(url, payload) { ...@@ -164,7 +165,7 @@ export function Post(url, payload) {
export function PostFile(url, payload) { export function PostFile(url, payload) {
const { fileList = null, params = null } = payload||{}; const { fileList = null, params = null } = payload||{};
const env = LocalStorage.get('assetsEnv'); const env = LocalStorage.get('assetsEnv')??debugEnv;
let formData = new FormData(); let formData = new FormData();
(fileList||[]).forEach(file=> { (fileList||[]).forEach(file=> {
......
import React, { useEffect, useState, useContext } from 'react';
import { Modal, Form, Input, Select, Space, Button } from 'antd';
import { AppContext } from '../../../App';
import { dispatch } from '../../../model';
const FC = (props) => {
const { visible, onCancel, task, action } = props;
const [form] = Form.useForm();
const [confirmLoading, setConfirmLoading] = useState(false);
const { user } = useContext(AppContext);
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 4 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 20 },
},
};
const handleOk = async (status = '-1') => {
try {
const values = await form.validateFields();
setConfirmLoading(true);
dispatch({
type: 'assetmanage.auditTask',
payload: {
params: {
taskId: task?.id
},
data: {
dealUser: user?.userName??'test',
processDate: new Date().toLocaleString(),
status,
title: `${action}意见`,
value: values.content
}
},
callback: data => {
setConfirmLoading(false);
reset();
onCancel && onCancel(true);
},
error: () => {
setConfirmLoading(false);
}
})
} catch (errInfo) {
}
}
const reset = () => {
setConfirmLoading(false);
form.resetFields();
}
return (
<Modal
visible={visible}
title={`${action}${task?.title}`}
width={650}
confirmLoading={confirmLoading}
onCancel={() => {
reset();
onCancel && onCancel();
}}
footer={
<Space>
<Button onClick={() => onCancel && onCancel() }>取消</Button>
<Button type="primary" onClick={() => {handleOk()}} loading={confirmLoading}>确定</Button>
<Button type="danger" onClick={() => {handleOk('-1')}} loading={confirmLoading}>驳回</Button>
</Space>
}
>
<Form
{...formItemLayout}
form={form}
>
<Form.Item
label={`${action}意见`}
name="content"
rules={[{ required: true, message: `请输入${action}意见` }]}
>
<Input.TextArea rows={4} placeholder={`请输入${action}意见`} />
</Form.Item>
</Form>
</Modal>
);
}
export default FC;
\ No newline at end of file
import React, { useEffect, useState } from 'react';
import { Modal, Form, Input, Select } from 'antd';
import { dispatch } from '../../../model';
const GroupsSelect = ({value = {}, data, onChange}) => {
const handleChange = (newValue) => {
if (newValue) {
const findGroup = data?.find(group => group.id === newValue);
if (findGroup) {
onChange?.({
groupId: findGroup.id,
groupName: findGroup.name,
groupDisplayName: findGroup.desc,
});
}
} else {
onChange?.(null);
}
}
return (
<Select
value={value?.groupId}
onChange={handleChange}
allowClear
>
{
data?.map((group, index) => <Select.Option key={index} value={group.id}>{group.desc??group.name}</Select.Option>)
}
</Select>
)
}
const UsersSelect = ({value = {}, data, onChange}) => {
const handleChange = (newValue) => {
if (newValue) {
const findUser = data?.find(user => user.id === newValue);
if (findUser) {
onChange?.({
userId: findUser.id,
userName: findUser.name,
userDisplayName: findUser.dname,
});
}
} else {
onChange?.(null);
}
}
return (
<Select
value={value?.id}
onChange={handleChange}
allowClear
>
{
data?.map((user, index) => <Select.Option key={index} value={user.id}>{user.dname??user.name}</Select.Option>)
}
</Select>
)
}
const FC = (props) => {
const { visible, onCancel, task, action = 'add' } = props;
const [form] = Form.useForm();
const [confirmLoading, setConfirmLoading] = useState(false);
const [groups, setGroups] = useState();
const [users, setUsers] = useState();
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 4 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 20 },
},
};
useEffect(() => {
if (visible) {
getGroups();
if (action !== 'add') {
// form.setFieldsValue({ name: item?.name||'', cnName: item?.cnName||'', partitionMethod: item?.partitionMethod||'', definition: item?.definition||'', remark: item?.remark||'' });
}
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [visible])
const getGroups = () => {
dispatch({
type: 'user.userGroups',
callback: (data) => {
setGroups(data);
}
})
}
const getUsers = (gid) => {
dispatch({
type: 'user.getGroupUsers',
payload: {
id: gid
},
callback: (data) => {
setUsers(data);
}
})
}
const handleOk = async () => {
try {
const values = await form.validateFields();
let newTask = {};
if (action === 'add') {
newTask = {...values};
} else {
newTask = {...task, ...values};
}
setConfirmLoading(true);
dispatch({
type: 'assetmanage.saveTask',
payload: {
data: newTask
},
callback: data => {
setConfirmLoading(false);
reset();
onCancel && onCancel(true);
},
error: () => {
setConfirmLoading(false);
}
})
} catch (errInfo) {
}
}
const onValuesChange = (changedValues, allValues) => {
if (changedValues.hasOwnProperty('department') ) {
if (changedValues.department?.groupId) {
getUsers(changedValues.department.groupId);
} else {
setUsers();
}
}
}
const reset = () => {
setConfirmLoading(false);
form.resetFields();
}
return (
<Modal
visible={visible}
title={action==='add'?'新增任务':'编辑任务'}
width={650}
confirmLoading={confirmLoading}
onCancel={() => {
reset();
onCancel && onCancel();
}}
onOk={handleOk}
>
<Form
{...formItemLayout}
form={form}
onValuesChange={onValuesChange}
>
<Form.Item
label="盘点任务标题"
name="title"
rules={[{ required: true, message: '请输入标题名称' }]}
>
<Input />
</Form.Item>
<Form.Item
label="盘点任务说明"
name="comment"
>
<Input />
</Form.Item>
<Form.Item
label="所属部门"
name="department"
rules={[{ required: true, message: '请选择所属部门' }]}
>
<GroupsSelect data={groups} />
</Form.Item>
<Form.Item
label="资产专员"
name="specialist"
rules={[{ required: true, message: '请选择资产专员' }]}
>
<UsersSelect data={users} />
</Form.Item>
</Form>
</Modal>
);
}
export default FC;
\ No newline at end of file
import { useState, useEffect, useMemo } from 'react';
import { Button, Table, Space } from 'antd';
import UpdateTask from './UpdateTask';
import AuditTask from './AuditTask';
import { dispatch } from '../../../model';
export const status = {
'tobeDistributed': '待分发',
'checking': '盘点中',
'tobeReviewed': '待审核',
'finished': '已完成',
'1': '通过',
'-1': '未通过',
}
export const actions = {
'tobeDistributed': ['详情', '修改', '分发'],
'checking': ['详情', '盘点', '提交'],
'tobeReviewed': ['详情', '审核'],
'finished': ['详情'],
}
const FC = (props) => {
const [loading, setLoading] = useState(false);
const [tasks, setTasks] = useState();
const [updateTaskParams, setUpdateTaskParams] = useState({
visible: false,
task: undefined,
action: 'add',
});
const [auditTaskParams, setAuditTaskParams] = useState({
visible: false,
task: undefined,
action: undefined,
})
const onActionClick = (task, action) => {
if (action === '详情') {
} else if (action === '修改') {
} else if (action === '盘点') {
} else {
setAuditTaskParams({...auditTaskParams, action, task, visible: true});
}
}
const columns = useMemo(() => {
return (
[
{
title: '任务ID',
dataIndex: 'id',
},
{
title: '任务标题',
dataIndex: 'title',
},
{
title: '任务说明',
dataIndex: 'comment',
},
{
title: '任务状态',
dataIndex: 'status',
render: (state, _, __) => status[state],
},
{
title: '所属部门',
dataIndex: 'department',
render: (department, _, __) => department?.groupDisplayName??department?.groupName,
},
{
title: '资产专员',
dataIndex: 'specialist',
render: (user, _, __) => user?.userDisplayName??user?.userName,
},
{
title: '更新日期',
dataIndex: 'updateTime',
},
{
title: '更新人',
dataIndex: 'updateUser',
render: (user, _, __) => user?.userDisplayName??user?.userName,
},
{
title: '创建日期',
dataIndex: 'createTime',
},
{
title: '创建人',
dataIndex: 'createUser',
render: (user, _, __) => user?.userDisplayName??user?.userName,
},
{
title: '操作',
key: 'action',
width: 120,
render: (_,record) => (
<Space size='small'>
{
actions[record.status]?.map((action, index) => <a key={index} onClick={() => {onActionClick(record, action)}}>{action}</a>)
}
</Space>
)
}
]
)
}, [onActionClick])
useEffect(() => {
getTasks();
}, [])
const getTasks = () => {
setLoading(true);
dispatch({
type: 'assetmanage.listTasks',
callback: (data) => {
setLoading(false);
setTasks(data);
},
error: () => {
setLoading(false);
}
})
}
const onAddClick = () => {
setUpdateTaskParams({...updateTaskParams, action: 'add', visible: true});
}
const onUpdateTaskCancel = (refresh = false) => {
setUpdateTaskParams({...updateTaskParams, visible: false});
refresh && getTasks();
}
const onAuditTaskCancel = (refresh = false) => {
setAuditTaskParams({...auditTaskParams, visible: false});
refresh && getTasks();
}
return (
<div>
<div>
<Button onClick={onAddClick}>新增</Button>
</div>
<Table
rowKey='id'
loading={loading}
columns={columns}
dataSource={tasks||[]}
/>
<UpdateTask
visible={updateTaskParams.visible}
task={updateTaskParams.task}
action={updateTaskParams.action}
onCancel={onUpdateTaskCancel}
/>
<AuditTask
visible={auditTaskParams.visible}
task={auditTaskParams.task}
action={auditTaskParams.action}
onCancel={onAuditTaskCancel}
/>
</div>
)
}
export default FC;
\ No newline at end of file
...@@ -13,6 +13,7 @@ import AssetManage from './AssetManage'; ...@@ -13,6 +13,7 @@ import AssetManage from './AssetManage';
import AssetResourceBrowse from './AssetResourceBrowse'; import AssetResourceBrowse from './AssetResourceBrowse';
import AssetBrowse from './AssetBrowse'; import AssetBrowse from './AssetBrowse';
import AssetRecycle from './AssetRecycle'; import AssetRecycle from './AssetRecycle';
import AssetTask from './AssetTask';
import Asset1104Manage from "./Asset1104Manage"; import Asset1104Manage from "./Asset1104Manage";
class Manage extends Component { class Manage extends Component {
...@@ -36,6 +37,7 @@ class Manage extends Component { ...@@ -36,6 +37,7 @@ class Manage extends Component {
<Route path={`${match.path}/asset-resource-browse`} component={AssetResourceBrowse} /> <Route path={`${match.path}/asset-resource-browse`} component={AssetResourceBrowse} />
<Route path={`${match.path}/asset-browse`} component={AssetBrowse} /> <Route path={`${match.path}/asset-browse`} component={AssetBrowse} />
<Route path={`${match.path}/asset-recycle`} component={AssetRecycle} /> <Route path={`${match.path}/asset-recycle`} component={AssetRecycle} />
<Route path={`${match.path}/asset-task`} component={AssetTask} />
<Route path={`${match.path}/1104-asset`} component={Asset1104Manage} /> <Route path={`${match.path}/1104-asset`} component={Asset1104Manage} />
</Switch> </Switch>
) : ( ) : (
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment