update 实现部分表单使用detail获取详细数据

This commit is contained in:
2021-06-28 20:45:33 +08:00
parent 54955e26e5
commit e8dd6f4eca
13 changed files with 328 additions and 233 deletions

View File

@@ -13,6 +13,7 @@ using Microsoft.EntityFrameworkCore;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using System;
namespace Ewide.Application.Service namespace Ewide.Application.Service
{ {
@@ -108,10 +109,10 @@ WHERE 1=1";
var users = await _dapperRepository.QueryPageData<UserOutput>(sql, input, param); var users = await _dapperRepository.QueryPageData<UserOutput>(sql, input, param);
foreach (var user in users.Items) //foreach (var user in users.Items)
{ //{
user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id); // user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id);
} //}
return PageDataResult<UserOutput>.PageResult(users); return PageDataResult<UserOutput>.PageResult(users);
} }
@@ -170,7 +171,10 @@ WHERE 1=1";
[UnitOfWork] [UnitOfWork]
public async Task DeleteUser(DeleteUserInput input) public async Task DeleteUser(DeleteUserInput input)
{ {
// 片区监管员在本片区已有安全员的情况下无法删除 /*
* 未处理逻辑
* 片区监管员在本片区已有安全员的情况下无法删除
*/
await _sysUserService.DeleteUser(input); await _sysUserService.DeleteUser(input);
} }
@@ -185,6 +189,7 @@ WHERE 1=1";
public async Task UpdateUser(UpdateUserInput input) public async Task UpdateUser(UpdateUserInput input)
{ {
/* /*
* 未处理逻辑
* 如果移动组织架构,会产生以下几种逻辑 * 如果移动组织架构,会产生以下几种逻辑
* 片区1监管员(无安全员或有其他监管员)=>片区2,直接成功 * 片区1监管员(无安全员或有其他监管员)=>片区2,直接成功
* 片区1监管员(有安全员并且无其他监管员)=>片区2,无法移动 * 片区1监管员(有安全员并且无其他监管员)=>片区2,无法移动
@@ -203,7 +208,30 @@ WHERE 1=1";
[HttpGet("/houseMember/detail")] [HttpGet("/houseMember/detail")]
public async Task<dynamic> GetUser([FromQuery] QueryUserInput input) public async Task<dynamic> GetUser([FromQuery] QueryUserInput input)
{ {
return await _sysUserService.GetUser(input); var sql = @"SELECT
SU.*,
SO.Name OrgName,
SUR.RoleName,
SUR.RoleCode
FROM sys_user SU
LEFT JOIN sys_emp SE ON SU.Id = SE.Id
LEFT JOIN sys_org SO ON SE.OrgId = SO.Id
LEFT JOIN (
SELECT
SUR.SysUserId,
GROUP_CONCAT(SR.Name) RoleName,
GROUP_CONCAT(SR.Code) RoleCode
FROM sys_user_role SUR
LEFT JOIN sys_role SR ON SUR.SysRoleId = SR.Id
GROUP BY SUR.SysUserId
) SUR ON SU.Id = SUR.SysUserId
WHERE SU.Id=@Id";
var user = (await _dapperRepository.QueryAsync<UserOutput>(sql, new { input.Id })).SingleOrDefault();
if (user != null)
{
user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id);
}
return user;
} }
/// <summary> /// <summary>
@@ -254,7 +282,7 @@ WHERE 1=1";
var _sysOrgRep = Db.GetRepository<SysOrg>(); var _sysOrgRep = Db.GetRepository<SysOrg>();
var org = await _sysOrgRep.DetachedEntities.FirstOrDefaultAsync(p => p.Id == orgId); var org = await _sysOrgRep.DetachedEntities.FirstOrDefaultAsync(p => p.Id == orgId);
// 如果当前组织为街道, 则直接返回安全员 // 如果当前组织为街道, 则直接返回安全员
if (org == null || org.Type <= 30) if (org == null || org.Type <= (int)OrgType.)
{ {
return roles.LastOrDefault(); return roles.LastOrDefault();
} }
@@ -265,7 +293,7 @@ WHERE 1=1";
var roleIds = await _sysUserRoleRep.DetachedEntities.Where(p => userIds.Contains(p.SysUserId)).Select(p => p.SysRoleId).ToListAsync(); var roleIds = await _sysUserRoleRep.DetachedEntities.Where(p => userIds.Contains(p.SysUserId)).Select(p => p.SysRoleId).ToListAsync();
var _sysRoleRep = Db.GetRepository<SysRole>(); var _sysRoleRep = Db.GetRepository<SysRole>();
var isExistZoneManager = await _sysRoleRep.DetachedEntities.AnyAsync(p => roleIds.Contains(p.Id) && p.Code == System.Enum.GetName(HouseManagerRole.ZoneManager).ToUnderScoreCase()); var isExistZoneManager = await _sysRoleRep.DetachedEntities.AnyAsync(p => roleIds.Contains(p.Id) && p.Code == Enum.GetName(HouseManagerRole.ZoneManager).ToUnderScoreCase());
// 存在片区监管员,返回安全员, 否则返回监管员 // 存在片区监管员,返回安全员, 否则返回监管员
if (isExistZoneManager) if (isExistZoneManager)
{ {
@@ -282,7 +310,10 @@ WHERE 1=1";
[NonAction] [NonAction]
private async Task<List<SysRole>> GetRoleRange() private async Task<List<SysRole>> GetRoleRange()
{ {
var codes = System.Enum.GetNames(typeof(HouseManagerRole)).Select(p => p.ToUnderScoreCase()); var codes = (new[] {
Enum.GetName(HouseManagerRole.ZoneManager),
Enum.GetName(HouseManagerRole.HouseSecurityManager),
}).Select(p => p.ToUnderScoreCase());
var _sysRoleRep = Db.GetRepository<SysRole>(); var _sysRoleRep = Db.GetRepository<SysRole>();
var roles = await _sysRoleRep.DetachedEntities.Where(p => codes.Contains(p.Code)).ToListAsync(); var roles = await _sysRoleRep.DetachedEntities.Where(p => codes.Contains(p.Code)).ToListAsync();

View File

@@ -86,10 +86,10 @@ namespace Ewide.Core.Service
// emps.Add(_sysEmpService.GetEmpInfo(long.Parse(u.Id))); // emps.Add(_sysEmpService.GetEmpInfo(long.Parse(u.Id)));
//}); //});
//await Task.WhenAll(emps); //await Task.WhenAll(emps);
foreach (var user in users.Items) //foreach (var user in users.Items)
{ //{
user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id); // user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id);
} //}
return PageDataResult<UserOutput>.PageResult(users); return PageDataResult<UserOutput>.PageResult(users);
} }
@@ -170,8 +170,17 @@ namespace Ewide.Core.Service
if (isExist) throw Oops.Oh(ErrorCode.D1003); if (isExist) throw Oops.Oh(ErrorCode.D1003);
var user = input.Adapt<SysUser>(); var user = input.Adapt<SysUser>();
await user.UpdateExcludeAsync(new[] { nameof(SysUser.Password), nameof(SysUser.Status), nameof(SysUser.AdminType) }, true); await user.UpdateIncludeAsync(new[] {
user.UpdateIncludeNow(new[] { nameof(SysUser.Birthday) }); nameof(SysUser.Account),
nameof(SysUser.NickName),
nameof(SysUser.Name),
nameof(SysUser.Birthday),
nameof(SysUser.Sex),
nameof(SysUser.Email),
nameof(SysUser.Phone),
nameof(SysUser.Tel),
}, true);
// user.UpdateIncludeNow(new[] { nameof(SysUser.Birthday) });
input.SysEmpParam.Id = user.Id.ToString(); input.SysEmpParam.Id = user.Id.ToString();
// 更新员工及附属机构职位信息 // 更新员工及附属机构职位信息
await _sysEmpService.AddOrUpdate(input.SysEmpParam); await _sysEmpService.AddOrUpdate(input.SysEmpParam);

View File

@@ -1,7 +1,7 @@
import React, { Component } from 'react' import React, { Component } from 'react'
import { Form, Spin } from 'antd' import { Form, Spin } from 'antd'
import { AntIcon } from 'components' import { AntIcon } from 'components'
import { cloneDeep } from 'lodash' import { api } from 'common/api'
const initialValues = {} const initialValues = {}
@@ -31,14 +31,15 @@ export default class form extends Component {
* @param {*} params * @param {*} params
*/ */
async fillData(params) { async fillData(params) {
this.record = cloneDeep(params.record) const state = { loading: false }
//#region 从后端转换成前段所需格式,也可以在此处调用获取详细数据接口 //#region 从后端转换成前段所需格式,也可以在此处调用获取详细数据接口
if (params.id) {
this.record = (await api).data
}
//#endregion //#endregion
this.form.current.setFieldsValue(this.record) this.form.current.setFieldsValue(this.record)
this.setState({ this.setState(state)
loading: false,
})
} }
/** /**

View File

@@ -63,16 +63,16 @@ export default class index extends Component {
title: '操作', title: '操作',
width: 150, width: 150,
dataIndex: 'actions', dataIndex: 'actions',
render: (text, record) => ( render: (text, { id }) => (
<QueryTableActions> <QueryTableActions>
<Auth auth={{ [authName]: 'edit' }}> <Auth auth={{ [authName]: 'edit' }}>
<a onClick={() => this.onOpen(this.editForm, record)}>编辑</a> <a onClick={() => this.onOpen(this.editForm, id)}>编辑</a>
</Auth> </Auth>
<Auth auth={{ [authName]: 'delete' }}> <Auth auth={{ [authName]: 'delete' }}>
<Popconfirm <Popconfirm
placement="topRight" placement="topRight"
title="是否确认删除" title="是否确认删除"
onConfirm={() => this.onDelete(record)} onConfirm={() => this.onDelete(id)}
> >
<a>删除</a> <a>删除</a>
</Popconfirm> </Popconfirm>
@@ -145,12 +145,10 @@ export default class index extends Component {
/** /**
* 打开新增/编辑弹窗 * 打开新增/编辑弹窗
* @param {*} modal * @param {*} modal
* @param {*} record * @param {*} id
*/ */
onOpen(modal, record) { onOpen(modal, id) {
modal.current.open({ modal.current.open({ id })
record,
})
} }
/** /**
@@ -177,10 +175,10 @@ export default class index extends Component {
/** /**
* 删除 * 删除
* @param {*} record * @param {*} id
*/ */
onDelete(record) { onDelete(id) {
this.onAction(apiAction.delete(record), '删除成功') this.onAction(apiAction.delete({ id }), '删除成功')
} }
//#region 自定义方法 //#region 自定义方法

View File

@@ -3,6 +3,7 @@ const urls = {
houseMemberAdd: ['/houseMember/add', 'post'], houseMemberAdd: ['/houseMember/add', 'post'],
houseMemberEdit: ['/houseMember/edit', 'post'], houseMemberEdit: ['/houseMember/edit', 'post'],
houseMemberDelete: ['/houseMember/delete', 'post'], houseMemberDelete: ['/houseMember/delete', 'post'],
houseMemberDetail: ['/houseMember/detail', 'detail'],
houseMemberOwnRole: ['/houseMember/ownRole', 'get'], houseMemberOwnRole: ['/houseMember/ownRole', 'get'],
houseMemberOwnData: ['/houseMember/ownData', 'get'], houseMemberOwnData: ['/houseMember/ownData', 'get'],
houseMemberGrantData: ['/houseMember/grantData', 'post'], houseMemberGrantData: ['/houseMember/grantData', 'post'],

View File

@@ -20,7 +20,7 @@ export default class dataForm extends Component {
form = React.createRef() form = React.createRef()
// 初始化数据 // 初始化数据
record = {} id = ''
/** /**
* mount后回调 * mount后回调
@@ -29,11 +29,11 @@ export default class dataForm extends Component {
this.props.created && this.props.created(this) this.props.created && this.props.created(this)
} }
async fillData(params) { async fillData(params) {
this.record = cloneDeep(params.record) this.id = params.id
//#region 从后端转换成前段所需格式 //#region 从后端转换成前段所需格式
const orgData = await this.loadOrgData() const orgData = await this.loadOrgData()
const areaData = await this.loadAreaData() const areaData = await this.loadAreaData()
const orgCheckedKeys = await this.loadMemberOwn(this.record.id) const orgCheckedKeys = await this.loadMemberOwn(this.id)
this.setState({ this.setState({
options: { options: {
orgData, orgData,
@@ -42,7 +42,7 @@ export default class dataForm extends Component {
}, },
}) })
this.form.current.setFieldsValue({ this.form.current.setFieldsValue({
id: this.record.id, id: this.id,
grantOrgIdList: orgCheckedKeys, grantOrgIdList: orgCheckedKeys,
grantAreaCodeList: [], grantAreaCodeList: [],
}) })
@@ -63,8 +63,8 @@ export default class dataForm extends Component {
const valid = await form.validateFields() const valid = await form.validateFields()
if (valid) { if (valid) {
const postData = form.getFieldsValue() const postData = form.getFieldsValue()
if (this.record) { if (this.id) {
postData.id = this.record.id postData.id = this.id
} }
//#region 从前段转换后端所需格式 //#region 从前段转换后端所需格式
//#endregion //#endregion

View File

@@ -41,8 +41,10 @@ export default class form extends Component {
* @param {*} params * @param {*} params
*/ */
async fillData(params) { async fillData(params) {
this.record = cloneDeep(params.record || {})
//#region 从后端转换成前段所需格式 //#region 从后端转换成前段所需格式
if (params.id) {
this.record = (await api.houseMemberDetail({ id: params.id })).data
}
const orgData = await this.loadOrgData() const orgData = await this.loadOrgData()
const roleData = await this.LoadRoleData() const roleData = await this.LoadRoleData()
@@ -64,30 +66,22 @@ export default class form extends Component {
if (params.orgId) { if (params.orgId) {
this.record.sysEmpParam.orgId = params.orgId this.record.sysEmpParam.orgId = params.orgId
} }
const defaultRole = params.record const defaultRole = params.id
? await this.loadOwnRole(params.record.id) ? await this.loadOwnRole(params.id)
: params.orgId : await this.loadDefaultRole(params.orgId)
? await this.loadDefaultRole(params.orgId)
: []
if (defaultRole.constructor === Array) { if (defaultRole.constructor === Array) {
this.record.roleId = defaultRole.length > 0 ? defaultRole[0] : '' this.record.roleId = defaultRole[0]
this.setState({
lockRole: true,
})
} else { } else {
this.record.roleId = defaultRole.id this.record.roleId = defaultRole.id
this.setState({
lockRole: defaultRole.code === 'zone_manager',
})
} }
const lockRole = this.doLockRole(defaultRole)
this.setState({ this.setState({
options: { options: {
...this.state.options,
orgData, orgData,
roleData, roleData,
}, },
lockRole,
}) })
this.record = { this.record = {
@@ -141,6 +135,27 @@ export default class form extends Component {
const { data } = await api.houseMemberDefaultRole({ orgId }) const { data } = await api.houseMemberDefaultRole({ orgId })
return data return data
} }
async onOrgChange(orgId) {
this.setState({ loading: true })
const defaultRole = await this.loadDefaultRole(orgId)
const lockRole = this.doLockRole(defaultRole)
this.setState({ loading: false, lockRole })
}
doLockRole(defaultRole) {
if (defaultRole.constructor === Array) {
this.form.current.setFieldsValue({
roleId: defaultRole[0].id,
})
return true
} else {
this.form.current.setFieldsValue({
roleId: defaultRole.id,
})
return defaultRole.code === 'zone_manager'
}
}
render() { render() {
return ( return (
<Form initialValues={initialValues} ref={this.form} className="yo-form"> <Form initialValues={initialValues} ref={this.form} className="yo-form">
@@ -156,6 +171,7 @@ export default class form extends Component {
dropdownStyle={{ maxHeight: '300px', overflow: 'auto' }} dropdownStyle={{ maxHeight: '300px', overflow: 'auto' }}
treeDefaultExpandAll treeDefaultExpandAll
placeholder="请选择所属组织机构" placeholder="请选择所属组织机构"
onChange={value => this.onOrgChange(value)}
/> />
</Form.Item> </Form.Item>
<Form.Item <Form.Item

View File

@@ -149,12 +149,12 @@ export default class index extends Component {
/** /**
* 打开新增/编辑弹窗 * 打开新增/编辑弹窗
* @param {*} modal * @param {*} modal
* @param {*} record * @param {*} id
*/ */
onOpen(modal, record) { onOpen(modal, id) {
modal.current.open({ modal.current.open({
orgId: this.selectId, orgId: this.selectId,
record, id,
}) })
} }
@@ -177,35 +177,49 @@ export default class index extends Component {
/** /**
* 删除 * 删除
* @param {*} record * @param {*} id
*/ */
onDelete(record) { onDelete(id) {
this.onAction(apiAction.delete(record), '删除成功') this.onAction(apiAction.delete({ id }), '删除成功')
} }
//#region 自定义方法 //#region 自定义方法
renderItem(record) { renderItem(record) {
const {
id,
account,
name,
nickName,
avatar,
sex,
phone,
email,
status,
roleCode,
roleName,
orgName,
} = record
return ( return (
<List.Item <List.Item
key={record.id} key={id}
actions={[ actions={[
<Auth auth="houseMember:edit"> <Auth auth="houseMember:edit">
<a onClick={() => this.onOpen(this.editForm, record)}>编辑</a> <a onClick={() => this.onOpen(this.editForm, id)}>编辑</a>
</Auth>, </Auth>,
<Auth auth="houseMember:delete"> <Auth auth="houseMember:delete">
<Popconfirm <Popconfirm
placement="topRight" placement="topRight"
title="是否确认删除" title="是否确认删除"
onConfirm={() => this.onDelete(record)} onConfirm={() => this.onDelete(id)}
> >
<a>删除</a> <a>删除</a>
</Popconfirm> </Popconfirm>
</Auth>, </Auth>,
<Auth aut="houseMember:resetPwd"> <Auth aut="houseMember:resetPwd">
<a onClick={() => this.onResetPassword(record)}>重置密码</a> <a onClick={() => this.onResetPassword(id)}>重置密码</a>
</Auth>, </Auth>,
<Auth auth="houseMember:grantData"> <Auth auth="houseMember:grantData">
<a onClick={() => this.onOpen(this.dataForm, record)}>授权额外数据</a> <a onClick={() => this.onOpen(this.dataForm, id)}>授权额外数据</a>
</Auth>, </Auth>,
]} ]}
> >
@@ -216,10 +230,10 @@ export default class index extends Component {
type="avatar" type="avatar"
shape="square" shape="square"
size={48} size={48}
id={record.avatar} id={avatar}
icon={<AntIcon type="user" />} icon={<AntIcon type="user" />}
/> />
{record.roleCode && record.roleCode.includes('house_security_manager') && ( {roleCode && roleCode.includes('house_security_manager') && (
<Button <Button
size="small" size="small"
type="primary" type="primary"
@@ -233,9 +247,9 @@ export default class index extends Component {
} }
title={ title={
<> <>
{record.nickName || record.name} {nickName || name}
{record.roleName && {roleName &&
record.roleName.split(',').map((item, i) => ( roleName.split(',').map((item, i) => (
<span key={i}> <span key={i}>
<Divider type="vertical" /> <Divider type="vertical" />
<Tag color="pink">{item}</Tag> <Tag color="pink">{item}</Tag>
@@ -243,25 +257,24 @@ export default class index extends Component {
))} ))}
</> </>
} }
description={record.account} description={account}
/> />
<Descriptions className="flex-1" column={2}> <Descriptions className="flex-1" column={2}>
<Descriptions.Item label="部门">{record.orgName}</Descriptions.Item> <Descriptions.Item label="部门">{orgName}</Descriptions.Item>
<Descriptions.Item label="性别"> <Descriptions.Item label="性别">
{this.bindCodeValue(record.sex, 'sex')} {this.bindCodeValue(sex, 'sex')}
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label="手机">{record.phone || '未设置'}</Descriptions.Item> <Descriptions.Item label="手机">{phone || '未设置'}</Descriptions.Item>
<Descriptions.Item label="邮箱">{record.email || '未设置'}</Descriptions.Item> <Descriptions.Item label="邮箱">{email || '未设置'}</Descriptions.Item>
</Descriptions> </Descriptions>
<div className="yo-list-content--h"> <div className="yo-list-content--h">
<Auth auth="houseMember:changeStatus"> <Auth auth="houseMember:changeStatus">
<div className="yo-list-content--h--item text-center"> <div className="yo-list-content--h--item text-center">
<Switch <Switch
checked={!record.status} checked={!status}
loading={record.statusChanging}
checkedChildren={this.bindCodeValue(0, 'common_status')} checkedChildren={this.bindCodeValue(0, 'common_status')}
unCheckedChildren={this.bindCodeValue(1, 'common_status')} unCheckedChildren={this.bindCodeValue(1, 'common_status')}
onChange={checked => this.onSetUserStatus(record, checked)} onChange={checked => this.onSetUserStatus(id, checked)}
/> />
</div> </div>
</Auth> </Auth>
@@ -270,18 +283,18 @@ export default class index extends Component {
) )
} }
onSetUserStatus(record, checked) { onSetUserStatus(id, checked) {
this.onAction( this.onAction(
apiAction.changeStatus({ apiAction.changeStatus({
id: record.id, id,
status: +!checked, status: +!checked,
}), }),
'设置成功' '设置成功'
) )
} }
onResetPassword(record) { onResetPassword(id) {
this.onAction(apiAction.resetPwd(record), '重置成功') this.onAction(apiAction.resetPwd({ id }), '重置成功')
} }
//#endregion //#endregion

View File

@@ -26,7 +26,7 @@ export default class index extends Component {
*/ */
async fillData(params) { async fillData(params) {
this.setState({ this.setState({
userId: params.record.id, userId: params.id,
}) })
} }

View File

@@ -20,7 +20,7 @@ export default class data extends Component {
form = React.createRef() form = React.createRef()
// 初始化数据 // 初始化数据
record = {} id = ''
/** /**
* mount后回调 * mount后回调
@@ -29,11 +29,11 @@ export default class data extends Component {
this.props.created && this.props.created(this) this.props.created && this.props.created(this)
} }
async fillData(params) { async fillData(params) {
this.record = cloneDeep(params.record) this.id = params.id
//#region 从后端转换成前段所需格式 //#region 从后端转换成前段所需格式
const orgData = await this.loadOrgData() const orgData = await this.loadOrgData()
const areaData = await this.loadAreaData() const areaData = await this.loadAreaData()
const orgCheckedKeys = await this.loadMemberOwn(this.record.id) const orgCheckedKeys = await this.loadMemberOwn(this.id)
this.setState({ this.setState({
options: { options: {
orgData, orgData,
@@ -42,7 +42,7 @@ export default class data extends Component {
}, },
}) })
this.form.current.setFieldsValue({ this.form.current.setFieldsValue({
id: this.record.id, id: this.id,
grantOrgIdList: orgCheckedKeys, grantOrgIdList: orgCheckedKeys,
grantAreaCodeList: [], grantAreaCodeList: [],
}) })
@@ -63,8 +63,8 @@ export default class data extends Component {
const valid = await form.validateFields() const valid = await form.validateFields()
if (valid) { if (valid) {
const postData = form.getFieldsValue() const postData = form.getFieldsValue()
if (this.record) { if (this.id) {
postData.id = this.record.id postData.id = this.id
} }
//#region 从前段转换后端所需格式 //#region 从前段转换后端所需格式
//#endregion //#endregion

View File

@@ -1,5 +1,17 @@
import React, { Component } from 'react' import React, { Component } from 'react'
import { Button, Row, Col, Form, Input, DatePicker, Radio, Table, Select, Spin, TreeSelect } from 'antd' import {
Button,
Row,
Col,
Form,
Input,
DatePicker,
Radio,
Table,
Select,
Spin,
TreeSelect,
} from 'antd'
import { AntIcon } from 'components' import { AntIcon } from 'components'
import { cloneDeep } from 'lodash' import { cloneDeep } from 'lodash'
import getDictData from 'util/dic' import getDictData from 'util/dic'
@@ -9,25 +21,24 @@ import moment from 'moment'
const initialValues = { const initialValues = {
sex: 0, sex: 0,
sysEmpParam: {} sysEmpParam: {},
} }
export default class form extends Component { export default class form extends Component {
state = { state = {
// 加载状态 // 加载状态
loading: true, loading: true,
codes: { codes: {
orgType: [] orgType: [],
}, },
options: { options: {
orgData: [], orgData: [],
posData: [] posData: [],
}, },
sysEmpParam: { sysEmpParam: {
extIds: [] extIds: [],
} },
} }
extColumns = [ extColumns = [
{ {
@@ -45,7 +56,7 @@ export default class form extends Component {
placeholder="请选择附加组织机构" placeholder="请选择附加组织机构"
/> />
</Form.Item> </Form.Item>
) ),
}, },
{ {
title: '附属岗位', title: '附属岗位',
@@ -56,33 +67,28 @@ export default class form extends Component {
<Select <Select
defaultValue={text} defaultValue={text}
className="w-100-p" className="w-100-p"
placeholder="请选择附加职位信息"> placeholder="请选择附加职位信息"
{ >
this.state.options.posData.map(item => { {this.state.options.posData.map(item => {
return <Select.Option return (
key={item.id} <Select.Option key={item.id} value={item.id}>
value={item.id} {item.name}
> </Select.Option>
{item.name}</Select.Option> )
}) })}
}
</Select> </Select>
</Form.Item> </Form.Item>
) ),
}, },
{ {
title: '操作', title: '操作',
key: 'action', key: 'action',
width: '70px', width: '70px',
render: (text, record) => ( render: (text, record) => (
<Button <Button onClick={() => this.onRemoveExtData(record)} size="small" danger>
onClick={() => this.onRemoveExtData(record)}
size="small"
danger
>
删除 删除
</Button> </Button>
) ),
}, },
] ]
// 表单实例 // 表单实例
@@ -102,11 +108,13 @@ export default class form extends Component {
* 填充数据 * 填充数据
* 可以在设置this.record之后对其作出数据结构调整 * 可以在设置this.record之后对其作出数据结构调整
* [异步,必要] * [异步,必要]
* @param {*} params * @param {*} params
*/ */
async fillData(params) { async fillData(params) {
this.record = cloneDeep(params.record || {})
//#region 从后端转换成前段所需格式 //#region 从后端转换成前段所需格式
if (params.id) {
this.record = (await api.sysUserDetail({ id: params.id })).data
}
const orgData = await this.loadOrgData() const orgData = await this.loadOrgData()
const posData = await this.loadPosData() const posData = await this.loadPosData()
const codes = await getDictData('org_type') const codes = await getDictData('org_type')
@@ -118,17 +126,17 @@ export default class form extends Component {
// 提交的时候是"param",而获取下来却是"info",在这里转换一下 // 提交的时候是"param",而获取下来却是"info",在这里转换一下
if (this.record.sysEmpInfo) { if (this.record.sysEmpInfo) {
this.record.sysEmpParam = this.record.sysEmpInfo; this.record.sysEmpParam = this.record.sysEmpInfo
delete this.record.sysEmpInfo; delete this.record.sysEmpInfo
} else if (!this.record.sysEmpParam) { } else if (!this.record.sysEmpParam) {
this.record.sysEmpParam = { this.record.sysEmpParam = {
extIds: [], extIds: [],
}; }
} }
// 转换职位信息列表 // 转换职位信息列表
if (this.record.sysEmpParam.positions) { if (this.record.sysEmpParam.positions) {
this.record.sysEmpParam.posIdList = this.record.sysEmpParam.positions.map((p) => p.posId); this.record.sysEmpParam.posIdList = this.record.sysEmpParam.positions.map(p => p.posId)
} }
// 附加信息 // 附加信息
@@ -138,12 +146,12 @@ export default class form extends Component {
key: i, key: i,
orgId: p.orgId, orgId: p.orgId,
posId: p.posId, posId: p.posId,
}; }
}); })
} }
if (params.orgId) { if (params.orgId) {
this.record.sysEmpParam.orgId = params.orgId; this.record.sysEmpParam.orgId = params.orgId
} }
this.setState({ this.setState({
@@ -154,18 +162,18 @@ export default class form extends Component {
posData, posData,
}, },
sysEmpParam: { sysEmpParam: {
...this.record.sysEmpParam ...this.record.sysEmpParam,
} },
}) })
this.record = { this.record = {
...this.record ...this.record,
} }
//#endregion //#endregion
this.form.current.setFieldsValue(this.record) this.form.current.setFieldsValue(this.record)
this.setState({ this.setState({
loading: false loading: false,
}) })
} }
@@ -173,7 +181,7 @@ export default class form extends Component {
* 获取数据 * 获取数据
* 可以对postData进行数据结构调整 * 可以对postData进行数据结构调整
* [异步,必要] * [异步,必要]
* @returns * @returns
*/ */
async getData() { async getData() {
const form = this.form.current const form = this.form.current
@@ -206,24 +214,26 @@ export default class form extends Component {
const record = { const record = {
key: extIds.length > 0 ? extIds[extIds.length - 1].key + 1 : 0, key: extIds.length > 0 ? extIds[extIds.length - 1].key + 1 : 0,
orgId: undefined, orgId: undefined,
posId: undefined posId: undefined,
} }
this.setState({ this.setState(
sysEmpParam: { {
extIds: [...extIds, record] sysEmpParam: {
extIds: [...extIds, record],
},
},
() => {
console.log(this.form.current.getFieldsValue())
} }
}, () => { )
console.log(this.form.current.getFieldsValue())
})
} }
onRemoveExtData(record) { onRemoveExtData(record) {
const ext = this.state.sysEmpParam.extIds, const ext = this.state.sysEmpParam.extIds,
remove = ext.find((p) => p.key === record.key), remove = ext.find(p => p.key === record.key),
index = ext.indexOf(remove); index = ext.indexOf(remove)
ext.splice(index, 1); ext.splice(index, 1)
console.log(ext) console.log(ext)
// this.form.current.setFieldsValue({ // this.form.current.setFieldsValue({
@@ -232,14 +242,16 @@ export default class form extends Component {
// } // }
// }) // })
this.setState({ this.setState(
sysEmpParam: { {
extIds: ext sysEmpParam: {
extIds: ext,
},
},
() => {
//console.log(this.form.current.getFieldsValue())
} }
}, () => { )
//console.log(this.form.current.getFieldsValue())
})
} }
//#endregion //#endregion
renderExtInfoTable() { renderExtInfoTable() {
@@ -251,79 +263,100 @@ export default class form extends Component {
pagination={false} pagination={false}
size="small" size="small"
bordered bordered
rowKey={(record) => record.key} rowKey={record => record.key}
footer={ footer={() => (
() => <Button
<Button block
block icon={<AntIcon type="plus" />}
icon={ type="dashed"
<AntIcon type="plus" /> onClick={() => this.onAddExtData()}
} >
type="dashed" 新增一项
onClick={() => this.onAddExtData()}> </Button>
新增一项</Button> )}
} ></Table>
>
</Table>
) )
} }
render() { render() {
return ( return (
<Form <Form initialValues={initialValues} ref={this.form} className="yo-form">
initialValues={initialValues} <Spin spinning={this.state.loading} indicator={<AntIcon type="loading" />}>
ref={this.form}
className="yo-form"
>
<Spin
spinning={this.state.loading}
indicator={<AntIcon type="loading" />}>
<h3 className="h3">基本信息</h3> <h3 className="h3">基本信息</h3>
<div className="yo-form-group"> <div className="yo-form-group">
<Form.Item label="账号" name="account" rules={[{ required: true, message: '请输入账号', trigger: 'blur' }]}> <Form.Item
label="账号"
name="account"
rules={[{ required: true, message: '请输入账号', trigger: 'blur' }]}
>
<Input autoComplete="off" placeholder="请输入账号" /> <Input autoComplete="off" placeholder="请输入账号" />
</Form.Item> </Form.Item>
<Form.Item label="姓名" name="name" rules={[{ required: true, message: '请输入姓名', trigger: 'blur' }]}> <Form.Item
label="姓名"
name="name"
rules={[{ required: true, message: '请输入姓名', trigger: 'blur' }]}
>
<Input autoComplete="off" placeholder="请输入姓名" /> <Input autoComplete="off" placeholder="请输入姓名" />
</Form.Item> </Form.Item>
{this.props.mode == 'add' && <> {this.props.mode == 'add' && (
<Form.Item label="密码" name="password" rules={[{ required: true, message: '请输入密码', trigger: 'blur' }]}> <>
<Input.Password autoComplete="off" placeholder="请输入密码" /> <Form.Item
</Form.Item> label="密码"
<Form.Item label="确认密码" name="confirm" rules={[{ required: true, message: '请确认密码', trigger: 'blur' }]}> name="password"
<Input.Password autoComplete="off" placeholder="请确认密码" /> rules={[
</Form.Item> { required: true, message: '请输入密码', trigger: 'blur' },
</> ]}
} >
<Form.Item label="昵称" name="nickName" > <Input.Password autoComplete="off" placeholder="请输入密码" />
</Form.Item>
<Form.Item
label="确认密码"
name="confirm"
rules={[
{ required: true, message: '请确认密码', trigger: 'blur' },
]}
>
<Input.Password autoComplete="off" placeholder="请确认密码" />
</Form.Item>
</>
)}
<Form.Item label="昵称" name="nickName">
<Input autoComplete="off" placeholder="请输入昵称" /> <Input autoComplete="off" placeholder="请输入昵称" />
</Form.Item> </Form.Item>
<Form.Item label="生日" name="birthday" > <Form.Item label="生日" name="birthday">
<DatePicker className="w-100-p" /> <DatePicker className="w-100-p" />
</Form.Item> </Form.Item>
<Form.Item label="性别" name="sex" > <Form.Item label="性别" name="sex">
<Radio.Group > <Radio.Group>
<Radio.Button value={0}> <Radio.Button value={0}>
<AntIcon className="mr-xxs" type="stop" /> <AntIcon className="mr-xxs" type="stop" />
<span>保密</span> <span>保密</span>
</Radio.Button> </Radio.Button>
<Radio.Button value={1}> <Radio.Button value={1}>
<AntIcon style={{ color: '#1890ff' }} className="mr-xxs" type="man" /> <AntIcon
style={{ color: '#1890ff' }}
className="mr-xxs"
type="man"
/>
<span></span> <span></span>
</Radio.Button> </Radio.Button>
<Radio.Button value={2}> <Radio.Button value={2}>
<AntIcon style={{ color: '#eb2f96' }} className="mr-xxs" type="woman" /> <AntIcon
style={{ color: '#eb2f96' }}
className="mr-xxs"
type="woman"
/>
<span></span> <span></span>
</Radio.Button> </Radio.Button>
</Radio.Group> </Radio.Group>
</Form.Item> </Form.Item>
<Form.Item label="邮箱" name="email" > <Form.Item label="邮箱" name="email">
<Input autoComplete="off" placeholder="请输入邮箱" /> <Input autoComplete="off" placeholder="请输入邮箱" />
</Form.Item> </Form.Item>
<Form.Item label="手机号" name="phone" > <Form.Item label="手机号" name="phone">
<Input autoComplete="off" placeholder="请输入手机号" /> <Input autoComplete="off" placeholder="请输入手机号" />
</Form.Item> </Form.Item>
<Form.Item label="电话" name="tel" > <Form.Item label="电话" name="tel">
<Input autoComplete="off" placeholder="请输入电话" /> <Input autoComplete="off" placeholder="请输入电话" />
</Form.Item> </Form.Item>
</div> </div>
@@ -332,7 +365,8 @@ export default class form extends Component {
<Form.Item <Form.Item
label="所属组织机构" label="所属组织机构"
name={['sysEmpParam', 'orgId']} name={['sysEmpParam', 'orgId']}
rules={[{ required: true, message: '所属组织机构' }]}> rules={[{ required: true, message: '所属组织机构' }]}
>
<TreeSelect <TreeSelect
treeData={this.state.options.orgData} treeData={this.state.options.orgData}
dropdownStyle={{ maxHeight: '300px', overflow: 'auto' }} dropdownStyle={{ maxHeight: '300px', overflow: 'auto' }}
@@ -340,26 +374,18 @@ export default class form extends Component {
placeholder="请选择所属组织机构" placeholder="请选择所属组织机构"
/> />
</Form.Item> </Form.Item>
<Form.Item <Form.Item label="工号" name={['sysEmpParam', 'jobNum']}>
label="工号" <Input autoComplete="off" placeholder="请输入工号" />
name={['sysEmpParam', 'jobNum']} >
<Input
autoComplete="off"
placeholder="请输入工号" />
</Form.Item> </Form.Item>
<Form.Item label="职位信息" name={['sysEmpParam', 'posIdList']}> <Form.Item label="职位信息" name={['sysEmpParam', 'posIdList']}>
<Select <Select mode="multiple" placeholder="请选择职位信息">
mode="multiple" {this.state.options.posData.map(item => {
placeholder="请选择职位信息"> return (
{ <Select.Option key={item.id} value={item.id}>
this.state.options.posData.map(item => { {item.name}
return <Select.Option </Select.Option>
key={item.id} )
value={item.id} })}
>
{item.name}</Select.Option>
})
}
</Select> </Select>
</Form.Item> </Form.Item>
</div> </div>

View File

@@ -155,12 +155,12 @@ export default class index extends Component {
/** /**
* 打开新增/编辑弹窗 * 打开新增/编辑弹窗
* @param {*} modal * @param {*} modal
* @param {*} record * @param {*} id
*/ */
onOpen(modal, record) { onOpen(modal, id) {
modal.current.open({ modal.current.open({
orgId: this.selectId, orgId: this.selectId,
record, id,
}) })
} }
@@ -191,24 +191,25 @@ export default class index extends Component {
//#region 自定义方法 //#region 自定义方法
renderItem(record) { renderItem(record) {
const { id, account, name, nickName, avatar, sex, phone, email, status } = record
return ( return (
<List.Item <List.Item
key={record.id} key={id}
actions={[ actions={[
<Auth auth="sysUser:edit"> <Auth auth="sysUser:edit">
<a onClick={() => this.onOpen(this.editForm, record)}>编辑</a> <a onClick={() => this.onOpen(this.editForm, id)}>编辑</a>
</Auth>, </Auth>,
<Auth auth="sysOrg:delete"> <Auth auth="sysOrg:delete">
<Popconfirm <Popconfirm
placement="topRight" placement="topRight"
title="是否确认删除" title="是否确认删除"
onConfirm={() => this.onDelete(record)} onConfirm={() => this.onDelete(id)}
> >
<a>删除</a> <a>删除</a>
</Popconfirm> </Popconfirm>
</Auth>, </Auth>,
<Auth aut="sysUser:resetPwd"> <Auth aut="sysUser:resetPwd">
<a onClick={() => this.onResetPassword(record)}>重置密码</a> <a onClick={() => this.onResetPassword(id)}>重置密码</a>
</Auth>, </Auth>,
<Auth auth={{ sysUser: [['grantRole'], ['grantData']] }}> <Auth auth={{ sysUser: [['grantRole'], ['grantData']] }}>
<Dropdown <Dropdown
@@ -217,14 +218,14 @@ export default class index extends Component {
<Menu> <Menu>
{auth('sysUser:grantRole') && ( {auth('sysUser:grantRole') && (
<Menu.Item key="1"> <Menu.Item key="1">
<a onClick={() => this.onOpen(this.roleForm, record)}> <a onClick={() => this.onOpen(this.roleForm, id)}>
授权角色 授权角色
</a> </a>
</Menu.Item> </Menu.Item>
)} )}
{auth('sysUser:grantData') && ( {auth('sysUser:grantData') && (
<Menu.Item key="2"> <Menu.Item key="2">
<a onClick={() => this.onOpen(this.dataForm, record)}> <a onClick={() => this.onOpen(this.dataForm, id)}>
授权额外数据 授权额外数据
</a> </a>
</Menu.Item> </Menu.Item>
@@ -246,29 +247,28 @@ export default class index extends Component {
type="avatar" type="avatar"
shape="square" shape="square"
size={48} size={48}
id={record.avatar} id={avatar}
icon={<AntIcon type="user" />} icon={<AntIcon type="user" />}
/> />
} }
title={record.nickName || record.name} title={nickName || name}
description={record.account} description={account}
/> />
<Descriptions className="flex-1" column={2}> <Descriptions className="flex-1" column={2}>
<Descriptions.Item label="性别"> <Descriptions.Item label="性别">
{this.bindCodeValue(record.sex, 'sex')} {this.bindCodeValue(sex, 'sex')}
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label="手机">{record.phone || '未设置'}</Descriptions.Item> <Descriptions.Item label="手机">{phone || '未设置'}</Descriptions.Item>
<Descriptions.Item label="邮箱">{record.email || '未设置'}</Descriptions.Item> <Descriptions.Item label="邮箱">{email || '未设置'}</Descriptions.Item>
</Descriptions> </Descriptions>
<div className="yo-list-content--h"> <div className="yo-list-content--h">
<Auth auth="sysUser:changeStatus"> <Auth auth="sysUser:changeStatus">
<div className="yo-list-content--h--item text-center"> <div className="yo-list-content--h--item text-center">
<Switch <Switch
checked={!record.status} checked={!status}
loading={record.statusChanging}
checkedChildren={this.bindCodeValue(0, 'common_status')} checkedChildren={this.bindCodeValue(0, 'common_status')}
unCheckedChildren={this.bindCodeValue(1, 'common_status')} unCheckedChildren={this.bindCodeValue(1, 'common_status')}
onChange={checked => this.onSetUserStatus(record, checked)} onChange={checked => this.onSetUserStatus(id, checked)}
/> />
</div> </div>
</Auth> </Auth>
@@ -277,12 +277,12 @@ export default class index extends Component {
) )
} }
onSetUserStatus(record, checked) { onSetUserStatus(id, checked) {
this.onAction(apiAction.changeStatus({ id: record.id, status: +!checked }), '设置成功') this.onAction(apiAction.changeStatus({ id, status: +!checked }), '设置成功')
} }
onResetPassword(record) { onResetPassword(id) {
this.onAction(apiAction.resetPwd(record), '重置成功') this.onAction(apiAction.resetPwd({ id }), '重置成功')
} }
//#endregion //#endregion

View File

@@ -19,7 +19,7 @@ export default class role extends Component {
form = React.createRef() form = React.createRef()
// 初始化数据 // 初始化数据
record = {} id = ''
/** /**
* mount后回调 * mount后回调
@@ -28,10 +28,10 @@ export default class role extends Component {
this.props.created && this.props.created(this) this.props.created && this.props.created(this)
} }
async fillData(params) { async fillData(params) {
this.record = cloneDeep(params.record) this.id = params.id
//#region 从后端转换成前段所需格式 //#region 从后端转换成前段所需格式
const roleData = await this.loadRoleData() const roleData = await this.loadRoleData()
const roles = await this.loadRole(this.record.id) const roles = await this.loadRole(this.id)
this.setState({ this.setState({
options: { options: {
roleData, roleData,
@@ -39,7 +39,7 @@ export default class role extends Component {
roles, roles,
}) })
this.form.current.setFieldsValue({ this.form.current.setFieldsValue({
id: this.record.id, id: this.id,
grantRoleIdList: roles, grantRoleIdList: roles,
}) })
@@ -59,8 +59,8 @@ export default class role extends Component {
const valid = await form.validateFields() const valid = await form.validateFields()
if (valid) { if (valid) {
const postData = form.getFieldsValue() const postData = form.getFieldsValue()
if (this.record) { if (this.id) {
postData.id = this.record.id postData.id = this.id
} }
//#region 从前段转换后端所需格式 //#region 从前段转换后端所需格式
//#endregion //#endregion