Commit 306a9e02 by zhangleyuan

feat:处理学员的删除

parent cd5f3152
......@@ -2,7 +2,7 @@
* @Author: wufan
* @Date: 2020-11-25 18:25:02
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-07-28 15:59:30
* @LastEditTime: 2021-07-29 19:57:16
* @Description: Description
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -93,6 +93,12 @@ export function editDepartment(params: object) {
export function delDepartment(params: object) {
return Service.Hades("public/hades/delDepartment", params);
}
export function queryDepartmentTree(params: object) {
return Service.Hades("public/hades/queryDepartmentTree", params);
}
export function getStoreCustomerAndDepNamePage(params: object) {
return Service.Hades("public/hades/getStoreCustomerAndDepNamePage", params);
}
export function delDepartmentUser(params: object) {
return Service.Hades("public/hades/delDepartmentUser", params);
}
\ No newline at end of file
......@@ -2,7 +2,7 @@
* @Author: zhangleyuan
* @Date: 2021-01-19 11:27:56
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-07-28 18:07:31
* @LastEditTime: 2021-07-29 13:37:10
* @Description: 描述一下
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -32,7 +32,7 @@ export const childIndustryList = {
"其他行业":["科学研究和技术服务业","社会组织","水利和环境管理","国际组织","其他"]
}
export const DepType = {
'departMentTab':'DEP_CHAT',
'departMentTab':'DEP_ORG',
'postGrouptab':'DEP_POST',
'customGroupTab':'DEP_CUSTOM'
}
\ No newline at end of file
......@@ -2,14 +2,14 @@
* @Author: wufan
* @Date: 2020-11-25 18:25:02
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-07-27 15:09:12
* @LastEditTime: 2021-07-29 19:57:52
* @Description: Description
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
import { getEmployeeList, getUserList, getStoreDecorationList, getStoreRole, addEmployee, editEmployee, deleteEmployee, getCourseCatalogList,
getAllSonCategory, addCourseCategory, delCourseCategory, editCourseCategory, deleteStoreDecorationList, addStoreBanner, editStoreBanner,
moveBannerSequence,getStoreUserBasicPage,updateStoreMessage,getStoreDetail,getByDepartmentId,getDepartmentUser,getDepartmentUserNotPage,addDepartment,
editDepartment,delDepartment
editDepartment,delDepartment,queryDepartmentTree,getStoreCustomerAndDepNamePage,delDepartmentUser
} from '@/data-source/store/request-apis';
export default class StoreService {
......@@ -109,4 +109,13 @@ export default class StoreService {
static delDepartment(params:any){
return delDepartment(params);
}
static queryDepartmentTree(params:any){
return queryDepartmentTree(params);
}
static getStoreCustomerAndDepNamePage(params:any){
return getStoreCustomerAndDepNamePage(params);
}
static delDepartmentUser(params:any){
return delDepartmentUser(params);
}
}
\ No newline at end of file
......@@ -410,6 +410,7 @@ function EmployeeManage() {
{model}
{ employeeModal &&
<NewChooseMembersModal
treeDepType="DEP_CHAT"
visible={employeeModal}
type="USER"
close={()=>{setEmployeeModal(false)}}
......
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import {Button,Input} from "antd";
import { Button, Input, message,Modal} from "antd";
import NewChooseMembersModal from "@/modules/college-manage/modal/NewChooseMembersModal";
import LeftStructureTree from './LeftStructureTree';
import { XMTable,PageControl} from '@/components';
import college from '@/common/lottie/college.json';
import { DepType } from '@/domains/store-domain/constants';
import LeftStructureTree from "./LeftStructureTree";
import { XMTable, PageControl } from "@/components";
import college from "@/common/lottie/college.json";
import StoreService from "@/domains/store-domain/storeService";
import { DepType } from "@/domains/store-domain/constants";
import User from "@/common/js/user";
import moment from "moment";
import "./DepartMentTabCon.less";
import Bus from "@/core/bus";
import _ from 'underscore';
const { Search } = Input;
const { confirm } = Modal;
const DefaultQuery = {
size:10,
current:1
}
size: 10,
current: 1,
};
function DepartMentTabCon(props) {
const [chooseMembersModalVisible,setChooseMembersModalVisible] = useState(false);
const [query,setQuery] = useState(DefaultQuery);
const [total,setTotal] = useState(0);
const {userParams,setUserParams} = useState({})
const [userListdata,setUserListData] = useState([]);
const [chooseMembersModalVisible, setChooseMembersModalVisible] = useState(
false
);
const [query, setQuery] = useState(DefaultQuery);
const [total, setTotal] = useState(0);
const [userListdata, setUserListData] = useState([]);
const [selectUser,setSelectUser] = useState([]);
const columns = [
{
title: '学员',
dataIndex: 'user',
width:220,
render: (val, record) => {
return <span>{val}</span>
}
title: "学员",
dataIndex: "nickName",
width: 220,
render: (val, item) => {
return (
<div>
<span>{val}</span>
<span
className="tag"
style={{
color:
item.sourceEnum === "WORK_WE_CHAT" ? "#2966FF" : "#1DCC65",
}}
>
{item.sourceEnum === "WORK_WE_CHAT" ? "@企业微信" : "@微信"}
</span>
</div>
);
},
},
{
title: '真实姓名',
dataIndex: 'nickname',
width:'15%',
render: (val,record) => {
return <span>{val}</span>
}
title: "真实姓名",
dataIndex: "userName",
width: "15%",
render: (val, record) => {
return <span>{val}</span>;
},
},
{
title: '账号',
dataIndex: 'account',
width:'15%',
render: (val,record) => {
return <span>{val}</span>
}
title: "账号",
dataIndex: "nickName",
width: "15%",
render: (val, item) => {
return <span>{val}</span>;
},
},
{
title: '岗位',
dataIndex: 'post',
title: "岗位",
dataIndex: "depPostNameList",
render: (val, record) => {
return <span>{val}</span>
if(!record.depPostNameList){
return <span>-</span>
}else{
record.depPostNameList.map((item, index) => {
return <span>{item}{index!==record.depPostNameList.length-1 && <span></span>}</span>;
})
}
}
},
{
title: '手机号',
dataIndex: 'phone',
render: (val, record) => {
title: "手机号",
dataIndex: "phone",
render: (val, item) => {
return <span>{val}</span>;
}
},
},
{
title: '注册时间',
dataIndex: 'registerTime',
render: (val, record) => {
return <span>{val}</span>;
}
title: "注册时间",
dataIndex: "created",
render: (val, item) => {
return <div>{moment(val).format("YYYY-MM-DD HH:mm:ss")}</div>;
},
},
{
title: "操作",
key: "operate",
dataIndex: "operate",
render: (val, record) => {
render: (val, item) => {
return (
<div className="operate">
<div
className="operate__item"
>
删除
</div>
</div>
)
{props.currentTab==='departMentTab'?
<div className="operate__item" onClick={()=>delUser('single',item.id)}>删除</div>
:
<div className="operate__item" onClick={()=>delUser('single',item.id)}>移出</div>
}
</div>
);
},
},
];
function closeChooseMembersModal(){
function closeChooseMembersModal() {
setChooseMembersModalVisible(false);
}
function getUserList(params){
StoreService.getDepartmentUser(params).then((res) => {
const {records=[],current,size,total} = res.result;
function getUserList(record, current) {
const params = {
...query,
depType: DepType[props.currentTab],
departmentId: record.id,
enterpriseId: User.getEnterpriseId(),
source: 0,
storeId: User.getStoreId(),
userId: User.getUserId(),
};
if (current) {
params.current = current;
}
setQuery(params);
StoreService.getStoreCustomerAndDepNamePage(params).then((res) => {
const { records = [], total } = res.result;
setUserListData(records);
setQuery({
current,
size
});
setTotal(total);
});
}
function confirmAddCustomer() {
Bus.trigger("addCustomer");
}
function delUser(type,id){
let idList = [];
if(type === 'single'){
idList.push(id);
}
if(type==='multiple'){
idList = _.pluck(selectUser,'id');
}
if(idList.length===0){
message.warning('请先选择要删除的学员')
return;
}
return confirm({
title: "确定要删除学员吗?",
content: "删除后,该学员将从员工列表中删除,且看不到该学院用户端。",
icon: (
<span className="icon iconfont default-confirm-icon">&#xe839; </span>
),
okText: "删除",
okType: "danger",
cancelText: "取消",
onOk: () => {
handleConfirmDelUser(idList);
},
});
}
function handleConfirmDelUser(idList){
const params = {
depType:DepType[props.currentTab],
idList,
storeId:User.getStoreId()
}
StoreService.delDepartmentUser(params).then((res) => {
message.success(`删除成功`);
getUserList(query);
});
}
function handleSelectUserList(record, selected){
let _list = [];
if (selected || !_.find(selectUser, (item) => item.userId === record.userId)) {
_list = _.uniq(selectUser.concat([record]), false, (item) => item.userId);
} else {
_list = _.reject(selectUser, (item) => item.userId === record.userId);
}
if (_list.length > 50) {
message.warning('无法继续选择,最多选择50个');
return;
}
console.log('selectUser',_list);
setSelectUser(_list);
};
return (
<div className="department-tab-con">
{props.currentTab &&
<LeftStructureTree treeType={props.currentTab} searchUserList={(params)=>getUserList(params)}/>
}
{props.currentTab && (
<LeftStructureTree
treeType={props.currentTab}
searchUserList={(params) => getUserList(params)}
/>
)}
<div className="table-con">
{props.currentTab === 'departMentTab' &&
{props.currentTab === "departMentTab" && (
<div className="operate-area">
<Button type="primary" className="add-user-btn" onClick={()=>{setChooseMembersModalVisible(true)}}>添加学员</Button>
<Button className="del-user-btn">删除学员</Button>
<Button
type="primary"
className="add-user-btn"
onClick={() => {
setChooseMembersModalVisible(true);
}}
>
添加学员
</Button>
<Button className="del-user-btn" onClick={()=>delUser('multiple')}>删除学员</Button>
<Button className="update-user-btn">更新列表数据</Button>
<span className="origin-text">数据来源企业微信通讯录</span>
<a href='https://www.yuque.com/wangzhong-zkqw0/qixue' target="_blank">
<a
href="https://www.yuque.com/wangzhong-zkqw0/qixue"
target="_blank"
>
<span className="view-text">查看数据更新说明</span>
</a>
</div>
}
{ (props.currentTab === 'postGrouptab' || props.currentTab === 'customGroupTab') &&
)}
{(props.currentTab === "postGrouptab" ||
props.currentTab === "customGroupTab") && (
<div className="operate-area">
<Button type="primary" className="add-user-btn">
<Button
type="primary"
className="add-user-btn"
onClick={() => {
setChooseMembersModalVisible(true);
}}
>
添加学员
</Button>
<Button className="del-user-btn">移出学员</Button>
<Button className="del-user-btn" onClick={()=>delUser('multiple')}>移出学员</Button>
</div>
}
)}
<div className="user-table">
<XMTable
renderEmpty={{
image: college,
description: '暂无数据',
description: "暂无数据",
}}
bordered
size='middle'
size="middle"
pagination={false}
columns={columns}
scroll={{ x: 1300 }}
dataSource={userListdata}
rowKey={(record) => record.userId}
rowSelection={{
type: 'checkbox',
selectedRowKeys: _.pluck(selectUser, 'userId'),
onSelect: (record, selected) => {
console.log('record',record);
handleSelectUserList(record, selected)
},
onSelectAll: (selected, _selectedRows, changeRows) => {
let _list = [];
if (selected) {
_list = _.uniq(selectUser.concat(changeRows), false, (item) => item.userId);
} else {
_list = _.reject(selectUser, (item) => _.find(changeRows, (data) => data.userId === item.userId));
}
if (_list.length > 50) {
message.warning('无法继续选择,一个任务最多关联50个课程');
const extraLength = _list.length - 50;
_list.splice(_list.length - extraLength, extraLength);
}
setSelectUser(_list);
},
}}
/>
<div className='box-footer'>
<div className="box-footer">
<PageControl
current={query.current}
pageSize={query.size}
......@@ -143,16 +281,29 @@ function DepartMentTabCon(props) {
toPage={(page) => {
const queryStates = _.clone(query);
queryStates.current = page;
getUserList(queryStates);
setQuery(queryStates);
}}
/>
</div>
</div>
</div>
{
chooseMembersModalVisible &&
<NewChooseMembersModal visible={chooseMembersModalVisible} type="CUSTOMER" depType={DepType[props.currentTab]} close={()=>{closeChooseMembersModal()}} onConfirm={()=>{}}/>
{chooseMembersModalVisible && (
<NewChooseMembersModal
visible={chooseMembersModalVisible}
type="CUSTOMER"
treeDepType={
props.currentTab === "departMentTab" ? "DEP_CHAT" : "DEP_ORG"
}
addDepType={DepType[props.currentTab]}
close={() => {
closeChooseMembersModal();
}}
onConfirm={() => {
confirmAddCustomer();
}}
/>
)}
</div>
);
}
......
......@@ -23,5 +23,11 @@
color:#5289FA;
}
}
.operate{
.operate__item{
color:#2966FF;
cursor: pointer;
}
}
}
}
\ No newline at end of file
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import { Tree, Input, Dropdown, Menu,Button,Modal,message} from "antd";
import { Tree, Input, Dropdown, Menu,Button,Modal,message,AutoComplete} from "antd";
import AddOrEditPostGroupModal from "../modal/AddOrEditPostGroupModal";
import User from '@/common/js/user'
import StoreService from "@/domains/store-domain/storeService";
import { DepType } from '@/domains/store-domain/constants';
import Bus from '@/core/bus';
import "./LeftStructureTree.less";
const { Search } = Input;
......@@ -19,25 +20,141 @@ function LeftStructureTree(props) {
const [postGroupModalLable,setPostGroupModalLable] = useState("");
const [postGroupName, setPostGroupName] = useState("");
const [currentGroupData,setCurrentGroupData] = useState({});
const [selectUserParams,setSelectUserParams] = useState({});
const [completeOptions,setCompleteOption] =useState([]);
const renderTitle = (title) => (
<span>
{title}
</span>
);
const renderItem = (record,type) => ({
value: record.userName || record.name,
label: (
<div
style={{
display: 'flex',
justifyContent: 'space-between',
}}
>
{type === 'user'?
<div>{record.userName}</div>
:
<div>{record.name}</div>
}
{type === 'user' &&
record.postDepNamesList.map((item,index)=>{
return <span>{item}</span>
})
}
</div>
),
});
const notFoundContentNode = ()=>{
return <span>暂无数据</span>
}
const Complete = () => (
<AutoComplete
dropdownClassName="certain-category-search-dropdown"
dropdownMatchSelectWidth={250}
allowClear
onChange={getCompleteOptionData}
notFoundContent={notFoundContentNode()}
style={{
width: 250,
}}
options={completeOptions}
>
<Input size="large" placeholder="搜索部门/学员姓名" />
</AutoComplete>
);
function getCompleteOptionData(value){
const params = {
depType:DepType[treeType],
queryName:value,
enterpriseId:User.getEnterpriseId(),
source:0,//0代表来自企培
storeId:User.getStoreId(),
userId:User.getUserId(),
whetherCount:false
}
StoreService.getDepartmentUser(params).then((res) => {
const _completeOptions = [];
const userObj = {};
const departmentGroupObj = {};
const postobj = {};
const {departmentUserVOList,departmentVOList} = res.result;
if(departmentUserVOList.records.length>0){
userObj.label=renderTitle('员工');
userObj.options=departmentUserVOList.records.map((item,index)=>{
return renderItem(item,'user');
})
}
if(departmentVOList.length>0){
switch (treeType){
case 'departMentTab':
departmentGroupObj.label=renderTitle('部门');
break;
case 'postGrouptab':
departmentGroupObj.label=renderTitle('岗位组');
break;
case 'customGroupTab':
departmentGroupObj.label=renderTitle('自定义分组集合');
break;
default:
break;
}
departmentGroupObj.options=departmentVOList.map((item,index)=>{
return renderItem(item,'group');
})
}
if(Object.keys(userObj).length !==0){
_completeOptions.push(userObj);
}
if(Object.keys(departmentGroupObj).length !==0){
_completeOptions.push(departmentGroupObj);
}
console.log('_completeOptions',_completeOptions);
// setCompleteOption(_completeOptions);
});
}
useEffect(()=>{
getTreeData();
},[props.treeType]);
useEffect(()=>{
Bus.bind("addCustomer",addCustomer)
},[]);
async function addCustomer(){
await getTreeData();
props.searchUserList(setSelectUserParams)
}
function getTreeData(){
return new Promise((resolve,reject)=>{
const params = {
depType:DepType[treeType],
departmentTypeEnum:DepType[treeType],
enterpriseId:User.getEnterpriseId(),
source:0,//0代表来自企培
storeId:User.getStoreId(),
userId:User.getUserId(),
whetherCount:true
}
StoreService.getDepartmentUser(params).then((res) => {
let { departmentVOList=[]} = res.result;
let _treeData = handleData(departmentVOList);
console.log("_treeData",_treeData);
StoreService.queryDepartmentTree(params).then((res) => {
// let { departmentVOList=[]} = res.result;
let _treeData = handleData(res.result);
setTreeData(_treeData);
resolve();
});
})
}
function handleData(dataArray){
const _dataArray = dataArray.map((item,index)=>{
......@@ -214,20 +331,22 @@ function LeftStructureTree(props) {
getTreeData()
}
function selectUserList(){
props.searchUserList()
function selectUserList(record,e){
console.log('e',e);
props.searchUserList(e.selectedNodes[0]);
}
return (
<div className="left-structure-tree">
<div className="organization">
<div className="search-con">
<Search
{/* <Search
placeholder="搜索部门/学员姓名"
className="search search-input"
style={{ width: 245 }}
enterButton={<span className="icon iconfont">&#xe832;</span>}
/>
/> */}
<Complete/>
</div>
{ (treeType==='postGrouptab' || treeType=== 'customGroupTab') && (
<div className="operate">
......
......@@ -14,7 +14,7 @@ function MemberTree(props) {
},[]);
function getTreeData(){
const params = {
depType:props.depType || 'DEP_CHAT',
depType:props.treeDepType,
enterpriseId:User.getEnterpriseId(),
source:0,//0代表来自企培
storeId:User.getStoreId(),
......@@ -66,7 +66,7 @@ function MemberTree(props) {
checkable
showIcon={false}
treeData={treeData}
checkedKeys={_.pluck(props.selectUserList, 'id')}
// checkedKeys={_.pluck(props.selectUserList, 'id')}
onCheck={(selectedKeys,e)=>treeSelected(selectedKeys,e)}
titleRender={(nodeData) => {
return (
......
......@@ -101,25 +101,26 @@ class NewChooseMembersModal extends React.Component {
addCustomer = () => {
const { selectUserList } = this.state;
const { depType } = this.props;
const { addDepType } = this.props;
let enterpriseUserList = []; // 保存新加进去的成员
enterpriseUserList = selectUserList.map((item) => {
const _item = {}
if(depType==='DEP_CHAT'){
if(addDepType==='DEP_ORG'){
_item.depUserType = 'VISIBLE_USER';
}else{
_item.depUserType = 'STORE_USER';
}
_item.departmentId = item.depId;
_item.departmentId = item.departmentId;
_item.enterpriseVisibleUserId = item.userId;
return _item
})
const _params = {
storeId: User.getStoreId(),
depType:depType,
enterpriseUserList,
depType:addDepType,
userAndDepartmentList:enterpriseUserList
}
Service.Hades('public/hades/addBatchUserAndDepartmentStoreCustomer', _params).then((res) => {
this.handleClose();
this.props.onConfirm();
})
}
......@@ -148,7 +149,7 @@ class NewChooseMembersModal extends React.Component {
}
render() {
const {type,depType} = this.props;
const {type,treeDepType} = this.props;
const {selectUserList,selectObject,visible,openSetModal} = this.state;
const title = type === 'USER' ? '添加员工' : '添加学员';
return (
......@@ -184,7 +185,7 @@ class NewChooseMembersModal extends React.Component {
enterButton={<span className="icon iconfont">&#xe832;</span>}
/>
<div className='container-left-body-table'>
<MemberTree depType={depType} onSelect={(record)=>{this.treeSelect(record)}} selectUserList={selectUserList}/>
<MemberTree treeDepType={treeDepType} onSelect={(record)=>{this.treeSelect(record)}} selectUserList={selectUserList}/>
</div>
</div>
</div>
......
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