From e8dd6f4eca6be5a9048937a6d04fe289d5e528f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=87=AA=E5=B8=A6=E5=A4=A7=E4=BD=AC=E6=B0=94=E5=9C=BA?= <188633308@qq.com> Date: Mon, 28 Jun 2021 20:45:33 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E5=AE=9E=E7=8E=B0=E9=83=A8=E5=88=86?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E4=BD=BF=E7=94=A8detail=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E8=AF=A6=E7=BB=86=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HouseMember/HouseMemberService.cs | 49 +++- Api/Ewide.Core/Service/User/SysUserService.cs | 21 +- .../public/seed/query-table-form/form.jsx | 11 +- web-react/public/seed/query-table/index.jsx | 20 +- .../business/houseSafety/houseMember.js | 1 + .../src/pages/business/house/member/data.jsx | 12 +- .../src/pages/business/house/member/form.jsx | 46 ++- .../src/pages/business/house/member/index.jsx | 69 +++-- .../business/house/member/selector/index.jsx | 2 +- web-react/src/pages/system/user/data.jsx | 12 +- web-react/src/pages/system/user/form.jsx | 262 ++++++++++-------- web-react/src/pages/system/user/index.jsx | 44 +-- web-react/src/pages/system/user/role.jsx | 12 +- 13 files changed, 328 insertions(+), 233 deletions(-) diff --git a/Api/Ewide.Application/Service/HouseSafety/HouseMember/HouseMemberService.cs b/Api/Ewide.Application/Service/HouseSafety/HouseMember/HouseMemberService.cs index ad44a3e..b099b03 100644 --- a/Api/Ewide.Application/Service/HouseSafety/HouseMember/HouseMemberService.cs +++ b/Api/Ewide.Application/Service/HouseSafety/HouseMember/HouseMemberService.cs @@ -13,6 +13,7 @@ using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using System; namespace Ewide.Application.Service { @@ -108,10 +109,10 @@ WHERE 1=1"; var users = await _dapperRepository.QueryPageData(sql, input, param); - foreach (var user in users.Items) - { - user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id); - } + //foreach (var user in users.Items) + //{ + // user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id); + //} return PageDataResult.PageResult(users); } @@ -170,7 +171,10 @@ WHERE 1=1"; [UnitOfWork] public async Task DeleteUser(DeleteUserInput input) { - // 片区监管员在本片区已有安全员的情况下无法删除 + /* + * 未处理逻辑 + * 片区监管员在本片区已有安全员的情况下无法删除 + */ await _sysUserService.DeleteUser(input); } @@ -185,6 +189,7 @@ WHERE 1=1"; public async Task UpdateUser(UpdateUserInput input) { /* + * 未处理逻辑 * 如果移动组织架构,会产生以下几种逻辑 * 片区1监管员(无安全员或有其他监管员)=>片区2,直接成功 * 片区1监管员(有安全员并且无其他监管员)=>片区2,无法移动 @@ -203,7 +208,30 @@ WHERE 1=1"; [HttpGet("/houseMember/detail")] public async Task 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(sql, new { input.Id })).SingleOrDefault(); + if (user != null) + { + user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id); + } + return user; } /// @@ -254,7 +282,7 @@ WHERE 1=1"; var _sysOrgRep = Db.GetRepository(); 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(); } @@ -265,7 +293,7 @@ WHERE 1=1"; var roleIds = await _sysUserRoleRep.DetachedEntities.Where(p => userIds.Contains(p.SysUserId)).Select(p => p.SysRoleId).ToListAsync(); var _sysRoleRep = Db.GetRepository(); - 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) { @@ -282,7 +310,10 @@ WHERE 1=1"; [NonAction] private async Task> 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(); var roles = await _sysRoleRep.DetachedEntities.Where(p => codes.Contains(p.Code)).ToListAsync(); diff --git a/Api/Ewide.Core/Service/User/SysUserService.cs b/Api/Ewide.Core/Service/User/SysUserService.cs index 54dcfd3..01e6950 100644 --- a/Api/Ewide.Core/Service/User/SysUserService.cs +++ b/Api/Ewide.Core/Service/User/SysUserService.cs @@ -86,10 +86,10 @@ namespace Ewide.Core.Service // emps.Add(_sysEmpService.GetEmpInfo(long.Parse(u.Id))); //}); //await Task.WhenAll(emps); - foreach (var user in users.Items) - { - user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id); - } + //foreach (var user in users.Items) + //{ + // user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id); + //} return PageDataResult.PageResult(users); } @@ -170,8 +170,17 @@ namespace Ewide.Core.Service if (isExist) throw Oops.Oh(ErrorCode.D1003); var user = input.Adapt(); - await user.UpdateExcludeAsync(new[] { nameof(SysUser.Password), nameof(SysUser.Status), nameof(SysUser.AdminType) }, true); - user.UpdateIncludeNow(new[] { nameof(SysUser.Birthday) }); + await user.UpdateIncludeAsync(new[] { + 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(); // 更新员工及附属机构职位信息 await _sysEmpService.AddOrUpdate(input.SysEmpParam); diff --git a/web-react/public/seed/query-table-form/form.jsx b/web-react/public/seed/query-table-form/form.jsx index 0c83022..cebd795 100644 --- a/web-react/public/seed/query-table-form/form.jsx +++ b/web-react/public/seed/query-table-form/form.jsx @@ -1,7 +1,7 @@ import React, { Component } from 'react' import { Form, Spin } from 'antd' import { AntIcon } from 'components' -import { cloneDeep } from 'lodash' +import { api } from 'common/api' const initialValues = {} @@ -31,14 +31,15 @@ export default class form extends Component { * @param {*} params */ async fillData(params) { - this.record = cloneDeep(params.record) + const state = { loading: false } //#region 从后端转换成前段所需格式,也可以在此处调用获取详细数据接口 + if (params.id) { + this.record = (await api).data + } //#endregion this.form.current.setFieldsValue(this.record) - this.setState({ - loading: false, - }) + this.setState(state) } /** diff --git a/web-react/public/seed/query-table/index.jsx b/web-react/public/seed/query-table/index.jsx index def3cf2..95eb779 100644 --- a/web-react/public/seed/query-table/index.jsx +++ b/web-react/public/seed/query-table/index.jsx @@ -63,16 +63,16 @@ export default class index extends Component { title: '操作', width: 150, dataIndex: 'actions', - render: (text, record) => ( + render: (text, { id }) => ( - this.onOpen(this.editForm, record)}>编辑 + this.onOpen(this.editForm, id)}>编辑 this.onDelete(record)} + onConfirm={() => this.onDelete(id)} > 删除 @@ -145,12 +145,10 @@ export default class index extends Component { /** * 打开新增/编辑弹窗 * @param {*} modal - * @param {*} record + * @param {*} id */ - onOpen(modal, record) { - modal.current.open({ - record, - }) + onOpen(modal, id) { + modal.current.open({ id }) } /** @@ -177,10 +175,10 @@ export default class index extends Component { /** * 删除 - * @param {*} record + * @param {*} id */ - onDelete(record) { - this.onAction(apiAction.delete(record), '删除成功') + onDelete(id) { + this.onAction(apiAction.delete({ id }), '删除成功') } //#region 自定义方法 diff --git a/web-react/src/common/api/requests/business/houseSafety/houseMember.js b/web-react/src/common/api/requests/business/houseSafety/houseMember.js index bf8c24f..74654c3 100644 --- a/web-react/src/common/api/requests/business/houseSafety/houseMember.js +++ b/web-react/src/common/api/requests/business/houseSafety/houseMember.js @@ -3,6 +3,7 @@ const urls = { houseMemberAdd: ['/houseMember/add', 'post'], houseMemberEdit: ['/houseMember/edit', 'post'], houseMemberDelete: ['/houseMember/delete', 'post'], + houseMemberDetail: ['/houseMember/detail', 'detail'], houseMemberOwnRole: ['/houseMember/ownRole', 'get'], houseMemberOwnData: ['/houseMember/ownData', 'get'], houseMemberGrantData: ['/houseMember/grantData', 'post'], diff --git a/web-react/src/pages/business/house/member/data.jsx b/web-react/src/pages/business/house/member/data.jsx index 7e6db71..7a22985 100644 --- a/web-react/src/pages/business/house/member/data.jsx +++ b/web-react/src/pages/business/house/member/data.jsx @@ -20,7 +20,7 @@ export default class dataForm extends Component { form = React.createRef() // 初始化数据 - record = {} + id = '' /** * mount后回调 @@ -29,11 +29,11 @@ export default class dataForm extends Component { this.props.created && this.props.created(this) } async fillData(params) { - this.record = cloneDeep(params.record) + this.id = params.id //#region 从后端转换成前段所需格式 const orgData = await this.loadOrgData() const areaData = await this.loadAreaData() - const orgCheckedKeys = await this.loadMemberOwn(this.record.id) + const orgCheckedKeys = await this.loadMemberOwn(this.id) this.setState({ options: { orgData, @@ -42,7 +42,7 @@ export default class dataForm extends Component { }, }) this.form.current.setFieldsValue({ - id: this.record.id, + id: this.id, grantOrgIdList: orgCheckedKeys, grantAreaCodeList: [], }) @@ -63,8 +63,8 @@ export default class dataForm extends Component { const valid = await form.validateFields() if (valid) { const postData = form.getFieldsValue() - if (this.record) { - postData.id = this.record.id + if (this.id) { + postData.id = this.id } //#region 从前段转换后端所需格式 //#endregion diff --git a/web-react/src/pages/business/house/member/form.jsx b/web-react/src/pages/business/house/member/form.jsx index 1857200..3a8145b 100644 --- a/web-react/src/pages/business/house/member/form.jsx +++ b/web-react/src/pages/business/house/member/form.jsx @@ -41,8 +41,10 @@ export default class form extends Component { * @param {*} params */ async fillData(params) { - this.record = cloneDeep(params.record || {}) //#region 从后端转换成前段所需格式 + if (params.id) { + this.record = (await api.houseMemberDetail({ id: params.id })).data + } const orgData = await this.loadOrgData() const roleData = await this.LoadRoleData() @@ -64,30 +66,22 @@ export default class form extends Component { if (params.orgId) { this.record.sysEmpParam.orgId = params.orgId } - const defaultRole = params.record - ? await this.loadOwnRole(params.record.id) - : params.orgId - ? await this.loadDefaultRole(params.orgId) - : [] - + const defaultRole = params.id + ? await this.loadOwnRole(params.id) + : await this.loadDefaultRole(params.orgId) if (defaultRole.constructor === Array) { - this.record.roleId = defaultRole.length > 0 ? defaultRole[0] : '' - this.setState({ - lockRole: true, - }) + this.record.roleId = defaultRole[0] } else { this.record.roleId = defaultRole.id - this.setState({ - lockRole: defaultRole.code === 'zone_manager', - }) } + const lockRole = this.doLockRole(defaultRole) this.setState({ options: { - ...this.state.options, orgData, roleData, }, + lockRole, }) this.record = { @@ -141,6 +135,27 @@ export default class form extends Component { const { data } = await api.houseMemberDefaultRole({ orgId }) 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() { return (
@@ -156,6 +171,7 @@ export default class form extends Component { dropdownStyle={{ maxHeight: '300px', overflow: 'auto' }} treeDefaultExpandAll placeholder="请选择所属组织机构" + onChange={value => this.onOrgChange(value)} /> - this.onOpen(this.editForm, record)}>编辑 + this.onOpen(this.editForm, id)}>编辑 , this.onDelete(record)} + onConfirm={() => this.onDelete(id)} > 删除 , - this.onResetPassword(record)}>重置密码 + this.onResetPassword(id)}>重置密码 , - this.onOpen(this.dataForm, record)}>授权额外数据 + this.onOpen(this.dataForm, id)}>授权额外数据 , ]} > @@ -216,10 +230,10 @@ export default class index extends Component { type="avatar" shape="square" size={48} - id={record.avatar} + id={avatar} icon={} /> - {record.roleCode && record.roleCode.includes('house_security_manager') && ( + {roleCode && roleCode.includes('house_security_manager') && ( - ) + ), }, ] // 表单实例 @@ -102,11 +108,13 @@ export default class form extends Component { * 填充数据 * 可以在设置this.record之后对其作出数据结构调整 * [异步,必要] - * @param {*} params + * @param {*} params */ async fillData(params) { - this.record = cloneDeep(params.record || {}) //#region 从后端转换成前段所需格式 + if (params.id) { + this.record = (await api.sysUserDetail({ id: params.id })).data + } const orgData = await this.loadOrgData() const posData = await this.loadPosData() const codes = await getDictData('org_type') @@ -118,17 +126,17 @@ export default class form extends Component { // 提交的时候是"param",而获取下来却是"info",在这里转换一下 if (this.record.sysEmpInfo) { - this.record.sysEmpParam = this.record.sysEmpInfo; - delete this.record.sysEmpInfo; + this.record.sysEmpParam = this.record.sysEmpInfo + delete this.record.sysEmpInfo } else if (!this.record.sysEmpParam) { this.record.sysEmpParam = { extIds: [], - }; + } } // 转换职位信息列表 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, orgId: p.orgId, posId: p.posId, - }; - }); + } + }) } if (params.orgId) { - this.record.sysEmpParam.orgId = params.orgId; + this.record.sysEmpParam.orgId = params.orgId } this.setState({ @@ -154,18 +162,18 @@ export default class form extends Component { posData, }, sysEmpParam: { - ...this.record.sysEmpParam - } + ...this.record.sysEmpParam, + }, }) this.record = { - ...this.record + ...this.record, } //#endregion this.form.current.setFieldsValue(this.record) this.setState({ - loading: false + loading: false, }) } @@ -173,7 +181,7 @@ export default class form extends Component { * 获取数据 * 可以对postData进行数据结构调整 * [异步,必要] - * @returns + * @returns */ async getData() { const form = this.form.current @@ -206,24 +214,26 @@ export default class form extends Component { const record = { key: extIds.length > 0 ? extIds[extIds.length - 1].key + 1 : 0, orgId: undefined, - posId: undefined + posId: undefined, } - this.setState({ - sysEmpParam: { - extIds: [...extIds, record] + this.setState( + { + sysEmpParam: { + extIds: [...extIds, record], + }, + }, + () => { + console.log(this.form.current.getFieldsValue()) } - }, () => { - console.log(this.form.current.getFieldsValue()) - }) - + ) } onRemoveExtData(record) { const ext = this.state.sysEmpParam.extIds, - remove = ext.find((p) => p.key === record.key), - index = ext.indexOf(remove); + remove = ext.find(p => p.key === record.key), + index = ext.indexOf(remove) - ext.splice(index, 1); + ext.splice(index, 1) console.log(ext) // this.form.current.setFieldsValue({ @@ -232,14 +242,16 @@ export default class form extends Component { // } // }) - this.setState({ - sysEmpParam: { - extIds: ext + this.setState( + { + sysEmpParam: { + extIds: ext, + }, + }, + () => { + //console.log(this.form.current.getFieldsValue()) } - }, () => { - //console.log(this.form.current.getFieldsValue()) - }) - + ) } //#endregion renderExtInfoTable() { @@ -251,79 +263,100 @@ export default class form extends Component { pagination={false} size="small" bordered - rowKey={(record) => record.key} - footer={ - () => - - } - > - + rowKey={record => record.key} + footer={() => ( + + )} + > ) } render() { return ( - - }> + + }>

基本信息

- + - + - {this.props.mode == 'add' && <> - - - - - - - - } - + {this.props.mode == 'add' && ( + <> + + + + + + + + )} + - + - - + + 保密 - + - + - + - + - +
@@ -332,7 +365,8 @@ export default class form extends Component { + rules={[{ required: true, message: '所属组织机构' }]} + > - - + + - + {this.state.options.posData.map(item => { + return ( + + {item.name} + + ) + })} diff --git a/web-react/src/pages/system/user/index.jsx b/web-react/src/pages/system/user/index.jsx index f40c684..080b4e0 100644 --- a/web-react/src/pages/system/user/index.jsx +++ b/web-react/src/pages/system/user/index.jsx @@ -155,12 +155,12 @@ export default class index extends Component { /** * 打开新增/编辑弹窗 * @param {*} modal - * @param {*} record + * @param {*} id */ - onOpen(modal, record) { + onOpen(modal, id) { modal.current.open({ orgId: this.selectId, - record, + id, }) } @@ -191,24 +191,25 @@ export default class index extends Component { //#region 自定义方法 renderItem(record) { + const { id, account, name, nickName, avatar, sex, phone, email, status } = record return ( - this.onOpen(this.editForm, record)}>编辑 + this.onOpen(this.editForm, id)}>编辑 , this.onDelete(record)} + onConfirm={() => this.onDelete(id)} > 删除 , - this.onResetPassword(record)}>重置密码 + this.onResetPassword(id)}>重置密码 , {auth('sysUser:grantRole') && ( - this.onOpen(this.roleForm, record)}> + this.onOpen(this.roleForm, id)}> 授权角色 )} {auth('sysUser:grantData') && ( - this.onOpen(this.dataForm, record)}> + this.onOpen(this.dataForm, id)}> 授权额外数据 @@ -246,29 +247,28 @@ export default class index extends Component { type="avatar" shape="square" size={48} - id={record.avatar} + id={avatar} icon={} /> } - title={record.nickName || record.name} - description={record.account} + title={nickName || name} + description={account} /> - {this.bindCodeValue(record.sex, 'sex')} + {this.bindCodeValue(sex, 'sex')} - {record.phone || '未设置'} - {record.email || '未设置'} + {phone || '未设置'} + {email || '未设置'}
this.onSetUserStatus(record, checked)} + onChange={checked => this.onSetUserStatus(id, checked)} />
@@ -277,12 +277,12 @@ export default class index extends Component { ) } - onSetUserStatus(record, checked) { - this.onAction(apiAction.changeStatus({ id: record.id, status: +!checked }), '设置成功') + onSetUserStatus(id, checked) { + this.onAction(apiAction.changeStatus({ id, status: +!checked }), '设置成功') } - onResetPassword(record) { - this.onAction(apiAction.resetPwd(record), '重置成功') + onResetPassword(id) { + this.onAction(apiAction.resetPwd({ id }), '重置成功') } //#endregion diff --git a/web-react/src/pages/system/user/role.jsx b/web-react/src/pages/system/user/role.jsx index beb472b..131cc68 100644 --- a/web-react/src/pages/system/user/role.jsx +++ b/web-react/src/pages/system/user/role.jsx @@ -19,7 +19,7 @@ export default class role extends Component { form = React.createRef() // 初始化数据 - record = {} + id = '' /** * mount后回调 @@ -28,10 +28,10 @@ export default class role extends Component { this.props.created && this.props.created(this) } async fillData(params) { - this.record = cloneDeep(params.record) + this.id = params.id //#region 从后端转换成前段所需格式 const roleData = await this.loadRoleData() - const roles = await this.loadRole(this.record.id) + const roles = await this.loadRole(this.id) this.setState({ options: { roleData, @@ -39,7 +39,7 @@ export default class role extends Component { roles, }) this.form.current.setFieldsValue({ - id: this.record.id, + id: this.id, grantRoleIdList: roles, }) @@ -59,8 +59,8 @@ export default class role extends Component { const valid = await form.validateFields() if (valid) { const postData = form.getFieldsValue() - if (this.record) { - postData.id = this.record.id + if (this.id) { + postData.id = this.id } //#region 从前段转换后端所需格式 //#endregion