Commit 11f4ee76 by yuananting

fix:解决合并人员组织架构分支的冲突

parents 422e709c 4c65917e
...@@ -17,4 +17,10 @@ ...@@ -17,4 +17,10 @@
font-size:14px; font-size:14px;
color:#5289FA; color:#5289FA;
} }
.post-name{
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
} }
\ No newline at end of file
...@@ -9,7 +9,7 @@ import React, { useEffect, useState } from 'react'; ...@@ -9,7 +9,7 @@ import React, { useEffect, useState } from 'react';
import { withRouter } from 'react-router-dom'; import { withRouter } from 'react-router-dom';
import _ from 'underscore'; import _ from 'underscore';
import { CheckBox, PageControl } from '@/components'; import { CheckBox, PageControl } from '@/components';
import { Button, Table, Modal, message, Input } from 'antd'; import { Button, Table, Modal, message, Input, Tooltip } from 'antd';
import { XMTable } from '@/components'; import { XMTable } from '@/components';
import college from '@/common/lottie/college.json'; import college from '@/common/lottie/college.json';
import StoreService from '@/domains/store-domain/storeService'; import StoreService from '@/domains/store-domain/storeService';
...@@ -33,7 +33,7 @@ interface RecordTypes { ...@@ -33,7 +33,7 @@ interface RecordTypes {
phone: string; phone: string;
avatar?: string; avatar?: string;
weChatAccount?: string; weChatAccount?: string;
depNameList: Array<string>; depNameList: any;
} }
interface RoleItemType { interface RoleItemType {
...@@ -58,6 +58,7 @@ interface ChoosedItemType { ...@@ -58,6 +58,7 @@ interface ChoosedItemType {
avatar?: string; avatar?: string;
storeUserId?: string; storeUserId?: string;
weChatAccount?: string; weChatAccount?: string;
depNameList?: any;
} }
function EmployeeManage() { function EmployeeManage() {
...@@ -140,7 +141,7 @@ function EmployeeManage() { ...@@ -140,7 +141,7 @@ function EmployeeManage() {
const columns = [ const columns = [
{ {
title: '员工', title: '员工',
dataIndex: 'nickName', dataIndex: 'weChatAccount',
render: (val: string, record: RecordTypes) => { render: (val: string, record: RecordTypes) => {
return ( return (
<div className='employee-info'> <div className='employee-info'>
...@@ -170,14 +171,27 @@ function EmployeeManage() { ...@@ -170,14 +171,27 @@ function EmployeeManage() {
if (!record.depNameList) { if (!record.depNameList) {
return <span>-</span>; return <span>-</span>;
} }
return record.depNameList.map((item, index) => { if (record.depNameList.length === 0) {
return <span>-</span>;
}
// return record.depNameList.map((item,index)=>{
// return <span><WWOpenDataCom type="departmentName" openid={item}/>{index<(record.depNameList.length -1)?';':''}</span>;
// })
return (
<Tooltip title={<div>{handleDepName(record.depNameList)}</div>} placement='top' arrowPointAtCenter>
<div className='post-name'>
{' '}
{record.depNameList.map((item: any, index: any) => {
return ( return (
<span> <span>
<WWOpenDataCom type='departmentName' openid={item} /> <WWOpenDataCom type='departmentName' openid={item} />
{index < record.depNameList.length - 1 ? '、' : ''} {index < record.depNameList.length - 1 ? ';' : ''}
</span> </span>
); );
}); })}
</div>
</Tooltip>
);
}, },
}, },
{ {
...@@ -227,8 +241,19 @@ function EmployeeManage() { ...@@ -227,8 +241,19 @@ function EmployeeManage() {
return columns; return columns;
} }
function handleDepName(depArray: any): any {
const depArrayDom = depArray.map((item: any, index: any) => {
return (
<span>
<WWOpenDataCom type='departmentName' openid={item} />
</span>
);
});
return depArrayDom;
}
function handleEditEmployee(record: RecordTypes) { function handleEditEmployee(record: RecordTypes) {
const { nickName, phone, roleCodes, avatar, id, weChatAccount } = record; const { nickName, phone, roleCodes, avatar, id, weChatAccount, depNameList } = record;
const _choosesItem = { const _choosesItem = {
nickName: nickName, nickName: nickName,
phone: phone, phone: phone,
...@@ -236,6 +261,7 @@ function EmployeeManage() { ...@@ -236,6 +261,7 @@ function EmployeeManage() {
avatar: avatar, avatar: avatar,
storeUserId: id, storeUserId: id,
weChatAccount, weChatAccount,
depNameList: depNameList,
}; };
setChooseItem(_choosesItem); setChooseItem(_choosesItem);
const model: React.ReactNode = ( const model: React.ReactNode = (
...@@ -251,6 +277,7 @@ function EmployeeManage() { ...@@ -251,6 +277,7 @@ function EmployeeManage() {
avatar: '', avatar: '',
storeUserId: '', storeUserId: '',
weChatAccount: '', weChatAccount: '',
depNameList: [],
}); });
}} }}
isWorkWechat={isWorkWechat} isWorkWechat={isWorkWechat}
...@@ -326,10 +353,10 @@ function EmployeeManage() { ...@@ -326,10 +353,10 @@ function EmployeeManage() {
userType: 'USER', userType: 'USER',
}; };
StoreService.syncWorkWeChatDepartment(params).then((res) => { StoreService.syncWorkWeChatDepartment(params).then((res) => {
getEmployeeList();
message.success('已更新'); message.success('已更新');
}); });
} }
return ( return (
<div className='page employee-manage-page'> <div className='page employee-manage-page'>
<div className='content-header'>角色管理</div> <div className='content-header'>角色管理</div>
...@@ -459,19 +486,22 @@ function EmployeeManage() { ...@@ -459,19 +486,22 @@ function EmployeeManage() {
bordered bordered
/> />
</div> </div>
<div className='box-footer'> {model}
<PageControl {employeeModal && (
current={query.current} <NewChooseMembersModal
pageSize={query.size} treeDepType='DEP_CHAT'
total={total} visible={employeeModal}
toPage={(page: any) => { type='USER'
const queryStates = _.clone(query); close={() => {
queryStates.current = page; setEmployeeModal(false);
setQuery(queryStates); }}
onConfirm={() => {
setEmployeeModal(false);
message.success('添加成功');
getEmployeeList();
}} }}
/> />
</div> )}
</div>
{model} {model}
{employeeModal && ( {employeeModal && (
<NewChooseMembersModal <NewChooseMembersModal
...@@ -489,6 +519,7 @@ function EmployeeManage() { ...@@ -489,6 +519,7 @@ function EmployeeManage() {
/> />
)} )}
</div> </div>
</div>
); );
} }
......
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom"; import { withRouter } from "react-router-dom";
import { Button, Input, message,Modal} from "antd"; import { Button, Input, message,Modal,Tooltip} from "antd";
import NewChooseMembersModal from "@/modules/college-manage/modal/NewChooseMembersModal"; import NewChooseMembersModal from "@/modules/college-manage/modal/NewChooseMembersModal";
import LeftStructureTree from "./LeftStructureTree"; import LeftStructureTree from "./LeftStructureTree";
import { XMTable, PageControl } from "@/components"; import { XMTable, PageControl } from "@/components";
...@@ -37,8 +37,8 @@ function DepartMentTabCon(props) { ...@@ -37,8 +37,8 @@ function DepartMentTabCon(props) {
return ( return (
<div> <div>
{item.sourceEnum === "WORK_WE_CHAT" ? {item.sourceEnum === "WORK_WE_CHAT" ?
<span> <WWOpenDataCom type="userName" openid={val}/></span>: <Tooltip title={<div><WWOpenDataCom type="userName" openid={val}/></div>}><span className="student-name"><WWOpenDataCom type="userName" openid={val}/></span></Tooltip>:
<span>{val}</span> <Tooltip title={val}><span className="student-name">{val}</span></Tooltip>
} }
<span <span
className="tag" className="tag"
...@@ -73,17 +73,17 @@ function DepartMentTabCon(props) { ...@@ -73,17 +73,17 @@ function DepartMentTabCon(props) {
title: "岗位", title: "岗位",
dataIndex: "depNameList", dataIndex: "depNameList",
render: (val, record) => { render: (val, record) => {
if(!record.depNameList){ if(!record.depNameList){
return <span>-</span> return <span>-</span>
}else{ }else{
if(record.depNameList.length === 0){ if(record.depNameList.length === 0){
return <span>-</span> return <span>-</span>
} }
return <div className="post-name"> {record.depNameList.map((item, index) => { return <Tooltip title={handleDepName(record.depNameList)} placement='top' arrowPointAtCenter><div className="post-name"> {record.depNameList.map((item, index) => {
return <span>{item}{index!==record.depNameList.length-1 && <span></span>}</span>; return <span>{item}{index!==record.depNameList.length-1 && <span></span>}</span>
})} })}
</div> </div>
</Tooltip>
} }
} }
...@@ -92,7 +92,11 @@ function DepartMentTabCon(props) { ...@@ -92,7 +92,11 @@ function DepartMentTabCon(props) {
title: "手机号", title: "手机号",
dataIndex: "phone", dataIndex: "phone",
render: (val, item) => { render: (val, item) => {
return <span>{val}</span>; if(!val){
return <span>-</span>
}else{
return <span>{item.phone}</span>
}
}, },
}, },
{ {
...@@ -110,7 +114,8 @@ function DepartMentTabCon(props) { ...@@ -110,7 +114,8 @@ function DepartMentTabCon(props) {
return ( return (
<div className="operate"> <div className="operate">
{props.currentTab==='departMentTab'? {props.currentTab==='departMentTab'?
<div className="operate__item" onClick={()=>delUser('single',item.userId)}>删除</div> <span>-</span>
// <div className="operate__item" onClick={()=>delUser('single',item.userId)}>删除</div>
: :
<div className="operate__item" onClick={()=>delUser('single',item.userId)}>移出</div> <div className="operate__item" onClick={()=>delUser('single',item.userId)}>移出</div>
} }
...@@ -119,6 +124,17 @@ function DepartMentTabCon(props) { ...@@ -119,6 +124,17 @@ function DepartMentTabCon(props) {
}, },
}, },
]; ];
function handleDepName(depArray){
let depStr = '';
depArray.forEach((item, index) => {
if (index < depArray.length - 1) {
depStr = depStr + item + ';';
} else {
depStr = depStr + item;
}
});
return depStr;
};
function closeChooseMembersModal() { function closeChooseMembersModal() {
setChooseMembersModalVisible(false); setChooseMembersModalVisible(false);
} }
...@@ -197,7 +213,7 @@ function DepartMentTabCon(props) { ...@@ -197,7 +213,7 @@ function DepartMentTabCon(props) {
storeId:User.getStoreId() storeId:User.getStoreId()
} }
console.log('selectDep',selectDep) console.log('selectDep',selectDep)
if(selectDep.id==='100'){ if(selectDep.depId==='10000'){
params.userType='WE_CHAT'; params.userType='WE_CHAT';
}else{ }else{
params.userType='WORK_WE_CHAT'; params.userType='WORK_WE_CHAT';
...@@ -205,7 +221,7 @@ function DepartMentTabCon(props) { ...@@ -205,7 +221,7 @@ function DepartMentTabCon(props) {
StoreService.delDepartmentUser(params).then((res) => { StoreService.delDepartmentUser(params).then((res) => {
message.success(`删除成功`); message.success(`删除成功`);
getUserList(); getUserList();
Bus.trigger("changeTreeData"); Bus.trigger("changeTreeData",{treeType:props.currentTab});
}); });
} }
function handleSelectUserList(record, selected){ function handleSelectUserList(record, selected){
...@@ -281,7 +297,7 @@ function DepartMentTabCon(props) { ...@@ -281,7 +297,7 @@ function DepartMentTabCon(props) {
<div className="table-con"> <div className="table-con">
{props.currentTab === "departMentTab" && ( {props.currentTab === "departMentTab" && (
<div className="operate-area"> <div className="operate-area">
{ selectDep.id !== '100' && { selectDep.depId !== '10000' &&
<Button <Button
type="primary" type="primary"
className="add-user-btn" className="add-user-btn"
...@@ -292,8 +308,10 @@ function DepartMentTabCon(props) { ...@@ -292,8 +308,10 @@ function DepartMentTabCon(props) {
添加学员 添加学员
</Button> </Button>
} }
{(props.currentTab === "postGrouptab" || props.currentTab === "customGroupTab") &&
<Button className="del-user-btn" onClick={()=>delUser('multiple')}>删除学员</Button> <Button className="del-user-btn" onClick={()=>delUser('multiple')}>删除学员</Button>
{ selectDep.id !== '100' && }
{ selectDep.depId !== '10000' &&
<> <>
<Button className="update-user-btn" onClick={()=>{updateListData()}}>更新列表数据</Button> <Button className="update-user-btn" onClick={()=>{updateListData()}}>更新列表数据</Button>
<span className="origin-text">数据来源企业微信通讯录</span> <span className="origin-text">数据来源企业微信通讯录</span>
......
...@@ -9,6 +9,14 @@ ...@@ -9,6 +9,14 @@
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
.student-name{
max-width: 120px;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
vertical-align: middle;
display: inline-block;
}
.operate-area{ .operate-area{
margin-bottom:16px; margin-bottom:16px;
.add-user-btn{ .add-user-btn{
......
...@@ -24,10 +24,32 @@ function LeftStructureTree(props) { ...@@ -24,10 +24,32 @@ function LeftStructureTree(props) {
const [currentGroupData,setCurrentGroupData] = useState({}); const [currentGroupData,setCurrentGroupData] = useState({});
const [completeOptions,setCompleteOption] = useState([]); const [completeOptions,setCompleteOption] = useState([]);
const [selectedKeys,setSelectedKeys]= useState([]); // 设置选中的部门key值 const [selectedKeys,setSelectedKeys]= useState([]); // 设置选中的部门key值
const [queryName,setQueryName] = useState(''); const [queryName,setQueryName] = useState(''); // 搜索框内的值
const [postGroupTreeData,setPostGroupTreeData] = useState([]); const [selctQueryName,setSelctQueryName]= useState(''); // 搜索出结果后最终选择的名字
const [postGroupTreeData,setPostGroupTreeData] = useState([]); // 为了判定创建和编辑时的数据会不会重明
const [open,setOpen]=useState(false); const [open,setOpen]=useState(false);
useEffect(()=>{
setQueryName(''); //切换tab时搜索置空
setCompleteOption([]);
setOpen(false); //切换tab时搜索的下拉框置为空
getTreeData().then((res)=>{
const _defaultSelectedKeys = [];
if(res.length > 0){
_defaultSelectedKeys.push(res[0].id);
setSelectedKeys(_defaultSelectedKeys);
props.onChangeSelectDep(res[0])
props.searchUserList(res[0],treeType,1);
}
});
},[props.treeType]);
useEffect(()=>{
Bus.bind("addCustomer",(record)=>{addCustomer(record.treeType,record.query)})
},[]);
useEffect(()=>{
Bus.bind("changeTreeData",(record)=>{getTreeData(record.treeType)})
},[]);
const renderTitle = (title) => ( const renderTitle = (title) => (
<span> <span>
{title} {title}
...@@ -62,33 +84,28 @@ function LeftStructureTree(props) { ...@@ -62,33 +84,28 @@ function LeftStructureTree(props) {
const notFoundContentNode = ()=>{ const notFoundContentNode = ()=>{
return <span>暂无数据</span> return <span>暂无数据</span>
} }
function handlePlaceHolder(){
const Complete = () => ( let placeholder = '';
<AutoComplete switch (props.treeType){
dropdownClassName="certain-category-search-dropdown" case 'departMentTab':
dropdownMatchSelectWidth={250} placeholder = '搜索学员姓名、部门';
allowClear break;
// onChange={(value)=>{setQueryName(value)}} case 'postGrouptab':
onSearch={(value)=>{setQueryName(value)}} placeholder = '搜索学员姓名/岗位/岗位组';
notFoundContent={notFoundContentNode()} break;
value={queryName} case 'customGroupTab':
open={open} placeholder = '搜索学员姓名/自定义分组集合/自定义分组';
onFocus={()=>{setOpen(true)}} break;
onBlur={()=>{setOpen(false)}} default:
style={{ break;
width: 250, }
}} return placeholder
options={completeOptions} }
onSelect={confirmSearchSelect}
placeholder='搜索员工、部门'
>
</AutoComplete>
);
function confirmSearchSelect(value,option){ function confirmSearchSelect(value,option){
console.log('option',option);
setOpen(false); setOpen(false);
setQueryName(value); setQueryName(value);
// console.log('option',option);
// setSelctQueryName(option)
props.searchUserList({queryName:value},treeType,1); props.searchUserList({queryName:value},treeType,1);
} }
...@@ -115,7 +132,7 @@ function LeftStructureTree(props) { ...@@ -115,7 +132,7 @@ function LeftStructureTree(props) {
const { result = {}} = res; const { result = {}} = res;
const {departmentUserVOList=[],departmentVOList=[],subLevelDepartmentVOList=[]} = result; const {departmentUserVOList=[],departmentVOList=[],subLevelDepartmentVOList=[]} = result;
if(departmentUserVOList.length>0){ if(departmentUserVOList.length>0){
userObj.label=renderTitle('员工'); userObj.label=renderTitle('学员');
userObj.options=departmentUserVOList.map((item,index)=>{ userObj.options=departmentUserVOList.map((item,index)=>{
return renderItem(item,'user'); return renderItem(item,'user');
}) })
...@@ -166,27 +183,7 @@ function LeftStructureTree(props) { ...@@ -166,27 +183,7 @@ function LeftStructureTree(props) {
}); });
} }
useEffect(()=>{
setQueryName(''); //切换tab时搜索置空
setCompleteOption([]);
setOpen(false); //切换tab时搜索的下拉框置为空
getTreeData().then((res)=>{
const _defaultSelectedKeys = [];
if(res.length > 0){
_defaultSelectedKeys.push(res[0].id);
setSelectedKeys(_defaultSelectedKeys);
props.onChangeSelectDep(res[0])
props.searchUserList(res[0],treeType,1);
}
});
},[props.treeType]);
useEffect(()=>{
Bus.bind("addCustomer",(record)=>{addCustomer(record.treeType,record.query)})
},[]);
useEffect(()=>{
Bus.bind("changeTreeData",(record)=>{getTreeData()})
},[]);
async function addCustomer(treeType,query){ async function addCustomer(treeType,query){
await getTreeData(treeType); await getTreeData(treeType);
props.searchUserList(query,treeType,1); props.searchUserList(query,treeType,1);
...@@ -214,6 +211,7 @@ function LeftStructureTree(props) { ...@@ -214,6 +211,7 @@ function LeftStructureTree(props) {
} }
function handleData(dataArray){ function handleData(dataArray){
const _dataArray = dataArray.map((item,index)=>{ const _dataArray = dataArray.map((item,index)=>{
item.title = "";
item.key=item.id; item.key=item.id;
if(item.sonDepartmentVOList){ if(item.sonDepartmentVOList){
item.children = item.sonDepartmentVOList; item.children = item.sonDepartmentVOList;
...@@ -260,10 +258,21 @@ function LeftStructureTree(props) { ...@@ -260,10 +258,21 @@ function LeftStructureTree(props) {
//添加岗位组/岗位 //添加岗位组/岗位
function addPostGroup(level,record) { function addPostGroup(level,record) {
if (treeData.length === 10) { if(level===0){
if (treeData.length > 9) {
message.error("岗位组数量已达10个上限"); message.error("岗位组数量已达10个上限");
return; return;
} }
}
if(level===1){
if(record.sonDepartmentVOList){
if(record.sonDepartmentVOList.length > 19){
message.error("岗位数量已达20个上限");
return;
}
}
}
setCurrentGroupData({}); setCurrentGroupData({});
setAddOrEditPostGroupShow(true); setAddOrEditPostGroupShow(true);
setOperatePostGroupModalType("add"); setOperatePostGroupModalType("add");
...@@ -295,8 +304,19 @@ function LeftStructureTree(props) { ...@@ -295,8 +304,19 @@ function LeftStructureTree(props) {
}else{ }else{
setPostGroupModalTitle('编辑岗位'); setPostGroupModalTitle('编辑岗位');
setPostGroupModalLable('岗位'); setPostGroupModalLable('岗位');
setPostGroupTreeData([]); setPostGroupTreeData(getParentChildernData(record.parentId));
}
} }
// 获取父节点下的所有的子级数据
function getParentChildernData(parentId){
let _parentChildernData = []
treeData.map((item,index)=>{
if( parentId=== item.id){
_parentChildernData = item.sonDepartmentVOList
}
})
return _parentChildernData
} }
function delPostGroup(record){ function delPostGroup(record){
let title = '确认删除该岗位组吗?'; let title = '确认删除该岗位组吗?';
...@@ -336,10 +356,20 @@ function LeftStructureTree(props) { ...@@ -336,10 +356,20 @@ function LeftStructureTree(props) {
//添加自定义分组集合/分组 //添加自定义分组集合/分组
function addCustomGroup(level,record) { function addCustomGroup(level,record) {
if (treeData.length === 10) { if(level===0){
message.error("岗位组数量已达10个上限"); if (treeData.length > 9) {
message.error("自定义分组集合数量已达10个上限");
return; return;
} }
}
if(level===1){
if(record.sonDepartmentVOList){
if(record.sonDepartmentVOList.length > 19){
message.error("自定义分组数量已达20个上限");
return;
}
}
}
setCurrentGroupData({}); setCurrentGroupData({});
setAddOrEditPostGroupShow(true); setAddOrEditPostGroupShow(true);
setOperatePostGroupModalType("add"); setOperatePostGroupModalType("add");
...@@ -362,14 +392,14 @@ function LeftStructureTree(props) { ...@@ -362,14 +392,14 @@ function LeftStructureTree(props) {
setPostGroupModalLevel(record.level); setPostGroupModalLevel(record.level);
setCurrentGroupData(record) setCurrentGroupData(record)
//level为0的时候编辑的是岗位组 大于0的时候 //level为0的时候编辑的是岗位组 大于0的时候
if(record.level===0){ if(record.depLevel===0){
setPostGroupModalTitle('编辑分组集合'); setPostGroupModalTitle('编辑分组集合');
setPostGroupModalLable('分组集合'); setPostGroupModalLable('分组集合');
setPostGroupTreeData(treeData); setPostGroupTreeData(treeData);
}else{ }else{
setPostGroupModalTitle('编辑分组'); setPostGroupModalTitle('编辑分组');
setPostGroupModalLable('分组'); setPostGroupModalLable('分组');
setPostGroupTreeData([]); setPostGroupTreeData(getParentChildernData(record.parentId));
} }
} }
function delCustomGroup(record){ function delCustomGroup(record){
...@@ -428,7 +458,7 @@ function LeftStructureTree(props) { ...@@ -428,7 +458,7 @@ function LeftStructureTree(props) {
}} }}
options={completeOptions} options={completeOptions}
onSelect={confirmSearchSelect} onSelect={confirmSearchSelect}
placeholder='搜索员工、部门' placeholder={handlePlaceHolder()}
> >
</AutoComplete> </AutoComplete>
</div> </div>
...@@ -457,6 +487,7 @@ function LeftStructureTree(props) { ...@@ -457,6 +487,7 @@ function LeftStructureTree(props) {
</div> </div>
)} )}
<div className="tree-con"> <div className="tree-con">
{!selctQueryName ?
<DirectoryTree <DirectoryTree
defaultExpandAll defaultExpandAll
showIcon={false} showIcon={false}
...@@ -532,6 +563,32 @@ function LeftStructureTree(props) { ...@@ -532,6 +563,32 @@ function LeftStructureTree(props) {
); );
}} }}
/> />
:
<div>
{ (props.treeType==='departMentTab') &&
<div>
{ option.name?
<WWOpenDataCom type="departmentName" openid={option.name}/>
:
<WWOpenDataCom type="userName" openid={option.userName}/>
}
</div>
}
{ (props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab') &&
<div>
{ option.name?
<span>{option.name}</span>
:
<span>{option.userName}</span>
}
</div>
}
</div>
}
</div> </div>
</div> </div>
{addOrEditPostGroupShow && ( {addOrEditPostGroupShow && (
......
.left-structure-tree { .left-structure-tree {
margin-right: 24px; margin-right: 24px;
width:250px; width:260px;
height: calc(~'100vh - 260px'); height: calc(~'100vh - 260px');
overflow-y: scroll;
.organization{ .organization{
overflow: scroll; overflow: scroll;
.search-con{ .search-con{
......
...@@ -38,6 +38,7 @@ function MemberTree(props) { ...@@ -38,6 +38,7 @@ function MemberTree(props) {
} }
function handleData(dataArray){ function handleData(dataArray){
const _dataArray = dataArray.map((item,index)=>{ const _dataArray = dataArray.map((item,index)=>{
item.title = "";
item.key=item.id; item.key=item.id;
item.children = [] item.children = []
if(item.departmentUserVOList){ if(item.departmentUserVOList){
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: wufan * @Author: wufan
* @Date: 2020-11-27 16:21:49 * @Date: 2020-11-27 16:21:49
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-03 17:23:40 * @LastEditTime: 2021-08-06 17:10:50
* @Description: Description * @Description: Description
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -16,25 +16,29 @@ function AddOrEditPostGroupModal(props) { ...@@ -16,25 +16,29 @@ function AddOrEditPostGroupModal(props) {
const [nameErrorMsg,setNameErrorMsg] = useState(''); const [nameErrorMsg,setNameErrorMsg] = useState('');
const [validateStatus,setValidateStatus] = useState('success'); const [validateStatus,setValidateStatus] = useState('success');
const [postGroupName,setPostGroupName] = useState(''); const [postGroupName,setPostGroupName] = useState('');
const [isError,setIsError] = useState(false)
useEffect(() => { useEffect(() => {
},[]); },[]);
function changePostGroupName(e){ function changePostGroupName(e){
let isError = false; setIsError(false)
setValidateStatus('success'); setValidateStatus('success');
setNameErrorMsg(''); setNameErrorMsg('');
if((!e.target.value) || /^\s+$/.test(e.target.value)){
setValidateStatus('error');
setNameErrorMsg(`${props.label}不能为空`);
setIsError(true)
}
props.postGroupTreeData.map((item,index)=>{ props.postGroupTreeData.map((item,index)=>{
if(item.name === e.target.value){ if(item.name === e.target.value){
setValidateStatus('error'); setValidateStatus('error');
setNameErrorMsg(`该${props.label}已存在`); setNameErrorMsg(`该${props.label}已存在`);
isError = true; setIsError(true)
} }
return item; return item;
}) })
if(!isError){
setPostGroupName(e.target.value); setPostGroupName(e.target.value);
} }
}
function handleConfirm(){ function handleConfirm(){
if(props.modalOperateType === 'add'){ if(props.modalOperateType === 'add'){
...@@ -44,10 +48,11 @@ function AddOrEditPostGroupModal(props) { ...@@ -44,10 +48,11 @@ function AddOrEditPostGroupModal(props) {
} }
} }
function addGroup(){ function addGroup(){
if(!postGroupName){ if(isError){
return; return;
} }
const { postGroupModalLevel,currentTab,currentGroupData,label} = props const { postGroupModalLevel,currentTab,currentGroupData,label} = props
let parmas={ let parmas={
depLevel:postGroupModalLevel, depLevel:postGroupModalLevel,
depType:DepType[currentTab], depType:DepType[currentTab],
...@@ -68,7 +73,7 @@ function AddOrEditPostGroupModal(props) { ...@@ -68,7 +73,7 @@ function AddOrEditPostGroupModal(props) {
}); });
} }
function editGroup(){ function editGroup(){
if(!postGroupName){ if(isError){
return; return;
} }
const {postGroupModalLevel,currentTab,currentGroupData,label} = props const {postGroupModalLevel,currentTab,currentGroupData,label} = props
......
...@@ -16,7 +16,6 @@ import './ChooseMembersModal.less'; ...@@ -16,7 +16,6 @@ import './ChooseMembersModal.less';
import _ from 'underscore'; import _ from 'underscore';
const { Search } = Input; const { Search } = Input;
class ChooseMembersModal extends React.Component { class ChooseMembersModal extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
...@@ -162,6 +161,7 @@ class ChooseMembersModal extends React.Component { ...@@ -162,6 +161,7 @@ class ChooseMembersModal extends React.Component {
}) })
} }
}) })
} }
addCustomer = () => { addCustomer = () => {
......
...@@ -119,9 +119,15 @@ class NewChooseMembersModal extends React.Component { ...@@ -119,9 +119,15 @@ class NewChooseMembersModal extends React.Component {
_item.departmentId = item.departmentId; _item.departmentId = item.departmentId;
_item.enterpriseVisibleUserId = item.userId; _item.enterpriseVisibleUserId = item.userId;
}else{ }else{
if(item.depId === '10000'){
_item.depUserType = 'WE_CHART_USER'; // depid=10000代表是微信学员
_item.userId = item.userId;
}else{
_item.depUserType = 'STORE_USER'; _item.depUserType = 'STORE_USER';
_item.departmentId = this.props.selectDep.id; }
_item.enterpriseVisibleUserId = item.enterpriseUserId; _item.enterpriseVisibleUserId = item.enterpriseUserId;
_item.departmentId = this.props.selectDep.id;
} }
return _item return _item
}) })
......
...@@ -19,10 +19,25 @@ export default class SetEmployeeModal extends React.Component { ...@@ -19,10 +19,25 @@ export default class SetEmployeeModal extends React.Component {
}) })
const selectedData = list[0] || {}; const selectedData = list[0] || {};
this.state = { this.state = {
list, list:this.uniqArr([...list]),
selected: selectedData.userId, selected: selectedData.userId,
roleCode: selectedData.roleCode, roleCode: selectedData.roleCode,
submit:false
}
}
uniqArr(arr){
let obj={};
arr.map((item,index)=>{
// 若重复则删除该项
if(obj.hasOwnProperty(item.userId)){
arr.splice(index,1);
// 不重复则存入obj
}else{
obj[item.userId]=item.userName;
} }
});
return arr;
} }
handleChangeValues(value) { handleChangeValues(value) {
...@@ -33,7 +48,7 @@ export default class SetEmployeeModal extends React.Component { ...@@ -33,7 +48,7 @@ export default class SetEmployeeModal extends React.Component {
} }
}) })
this.props.onChange(selected, value); this.props.onChange(selected, value);
this.setState({ roleCode: value, list }); this.setState({ roleCode: value, list});
} }
render() { render() {
...@@ -41,6 +56,7 @@ export default class SetEmployeeModal extends React.Component { ...@@ -41,6 +56,7 @@ export default class SetEmployeeModal extends React.Component {
list, list,
roleCode, roleCode,
selected, selected,
submit
} = this.state; } = this.state;
return ( return (
<Modal <Modal
...@@ -55,7 +71,7 @@ export default class SetEmployeeModal extends React.Component { ...@@ -55,7 +71,7 @@ export default class SetEmployeeModal extends React.Component {
<div className="modal-footer"> <div className="modal-footer">
<Button style={{ float: 'left' }} onClick={() => this.props.onClose()}>上一步</Button> <Button style={{ float: 'left' }} onClick={() => this.props.onClose()}>上一步</Button>
<Button onClick={() => this.props.onCancel()}>取消</Button> <Button onClick={() => this.props.onCancel()}>取消</Button>
<Button onClick={() => this.props.onOk(list)} type="primary">确定</Button> <Button onClick={() =>{this.setState({submit:true},()=>this.props.onOk(list))}} type="primary" disabled={submit}>确定</Button>
</div> </div>
} }
> >
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2019-09-10 18:26:03 * @Date: 2019-09-10 18:26:03
* @LastEditors: yuananting * @LastEditors: yuananting
* @LastEditTime: 2021-08-05 19:50:53 * @LastEditTime: 2021-08-09 19:20:55
* @Description: * @Description:
*/ */
import React, { useRef, useContext, useEffect, useState } from 'react'; import React, { useRef, useContext, useEffect, useState } from 'react';
...@@ -76,8 +76,8 @@ function Header(props) { ...@@ -76,8 +76,8 @@ function Header(props) {
storeUserId: User.getStoreUserId(), storeUserId: User.getStoreUserId(),
}; };
BaseService.getStoreUser(param).then((res) => { BaseService.getStoreUser(param).then((res) => {
const { nickName, phone } = res.result; const { weChatAccount, phone } = res.result;
setNickName(nickName); setNickName(weChatAccount);
setPhone(phone); setPhone(phone);
setAvatar(res.result.avatar); setAvatar(res.result.avatar);
User.setAvatar(res.result.avatar); User.setAvatar(res.result.avatar);
......
/* /*
* @Author: wufan * @Author: wufan
* @Date: 2020-11-27 16:21:49 * @Date: 2020-11-27 16:21:49
* @LastEditors: wufan * @LastEditors: yuananting
* @LastEditTime: 2021-07-29 14:51:26 * @LastEditTime: 2021-08-09 19:20:49
* @Description: Description * @Description: Description
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from 'react';
import { import { Modal, Form, Button, Input, InputNumber, Radio, Row, Col, message, Tooltip } from 'antd';
Modal, import _, { values } from 'underscore';
Form, import './EmployeeAddOrEditModal.less';
Button, import { CropperModal } from '@/components/';
Input, import StoreService from '@/domains/store-domain/storeService';
InputNumber, import WWOpenDataCom from '@/components/WWOpenDataCom';
Radio, import $ from 'jquery';
Row, import User from '@/common/js/user';
Col,
message,
Tooltip,
} from "antd";
import _, { values } from "underscore";
import "./EmployeeAddOrEditModal.less";
import { CropperModal } from "@/components/";
import StoreService from "@/domains/store-domain/storeService";
import $ from "jquery";
import User from "@/common/js/user";
const RadioGroup = Radio.Group; const RadioGroup = Radio.Group;
declare let window: any; declare let window: any;
...@@ -36,39 +26,31 @@ interface AddEmployeeModalProps { ...@@ -36,39 +26,31 @@ interface AddEmployeeModalProps {
role: Array<string>; role: Array<string>;
avatar?: string; avatar?: string;
storeUserId?: string; storeUserId?: string;
weChatAccount?: string weChatAccount?: string;
depNameList?: any;
}; };
onClose: () => void; onClose: () => void;
isWorkWechat: boolean; isWorkWechat: boolean;
} }
function AddEmployeeModal(props: AddEmployeeModalProps) { function AddEmployeeModal(props: AddEmployeeModalProps) {
const [nickName, setName] = useState(""); const [nickName, setName] = useState('');
const [phone, setPhone] = useState(""); const [phone, setPhone] = useState('');
const [role, setRole] = useState("CloudLecturer"); const [role, setRole] = useState('CloudLecturer');
const [avatar, setAvatar] = useState( const [avatar, setAvatar] = useState('https://image.xiaomaiketang.com/xm/rJeQaZxtc7.png');
"https://image.xiaomaiketang.com/xm/rJeQaZxtc7.png"
);
const storeUserId = props.choosedItem.storeUserId; const storeUserId = props.choosedItem.storeUserId;
const [imgUrl, setImgUrl] = useState( const [imgUrl, setImgUrl] = useState(avatar || 'https://image.xiaomaiketang.com/xm/rJeQaZxtc7.png');
avatar || "https://image.xiaomaiketang.com/xm/rJeQaZxtc7.png" const [nameErrorMsg, setNameErrorMsg] = useState('');
); const [nameStatus, setNameStatus] = useState<'' | 'error' | 'success' | 'warning' | 'validating' | undefined>();
const [nameErrorMsg, setNameErrorMsg] = useState(""); const [phoneErrorMessage, setPhoneErrorMessage] = useState('');
const [nameStatus, setNameStatus] = useState< const [phoneStatus, setPhoneStatus] = useState<'' | 'error' | 'success' | 'warning' | 'validating' | undefined>();
"" | "error" | "success" | "warning" | "validating" | undefined
>();
const [phoneErrorMessage, setPhoneErrorMessage] = useState("");
const [phoneStatus, setPhoneStatus] = useState<
"" | "error" | "success" | "warning" | "validating" | undefined
>();
const [cropperModalVisible, setCropperModalVisible] = useState(false); const [cropperModalVisible, setCropperModalVisible] = useState(false);
const [form] = Form.useForm(); const [form] = Form.useForm();
useEffect(() => { useEffect(() => {
if (props.choosedItem.nickName) { if (props.choosedItem.nickName) {
console.log("props.choosedItem", props.choosedItem); console.log('props.choosedItem', props.choosedItem);
setName(props.choosedItem.nickName); setName(props.choosedItem.nickName);
console.log('choosedItem',props.choosedItem); console.log('choosedItem', props.choosedItem);
props.choosedItem.phone && setPhone(props.choosedItem.phone); props.choosedItem.phone && setPhone(props.choosedItem.phone);
props.choosedItem.role && setRole(props.choosedItem.role[0]); props.choosedItem.role && setRole(props.choosedItem.role[0]);
props.choosedItem.avatar && setAvatar(props.choosedItem.avatar); props.choosedItem.avatar && setAvatar(props.choosedItem.avatar);
...@@ -94,13 +76,13 @@ function AddEmployeeModal(props: AddEmployeeModalProps) { ...@@ -94,13 +76,13 @@ function AddEmployeeModal(props: AddEmployeeModalProps) {
function _handleUpdateAvatar(e: any): any { function _handleUpdateAvatar(e: any): any {
const avatar = e.target.files[0]; const avatar = e.target.files[0];
const newUrl = URL.createObjectURL(avatar); const newUrl = URL.createObjectURL(avatar);
const $image = $("#image"); const $image = $('#image');
setImgUrl(newUrl); setImgUrl(newUrl);
setCropperModalVisible(true); setCropperModalVisible(true);
} }
function _onUpload(): any { function _onUpload(): any {
$("#CrpperAvatarPic").trigger("click"); $('#CrpperAvatarPic').trigger('click');
} }
function changeAvatar(img: string): any { function changeAvatar(img: string): any {
...@@ -118,47 +100,47 @@ function AddEmployeeModal(props: AddEmployeeModalProps) { ...@@ -118,47 +100,47 @@ function AddEmployeeModal(props: AddEmployeeModalProps) {
function handleOk(): void { function handleOk(): void {
const values = form.getFieldsValue(); const values = form.getFieldsValue();
if (!values.nickName.trim()) { if (!values.nickName.trim()) {
setNameErrorMsg("请输入员工昵称"); setNameErrorMsg('请输入员工昵称');
setNameStatus("error"); setNameStatus('error');
return; return;
} }
setNameErrorMsg(""); setNameErrorMsg('');
setNameStatus(""); setNameStatus('');
if (!String(values.phone) && !props.isWorkWechat) { if (!String(values.phone) && !props.isWorkWechat) {
setPhoneErrorMessage("请输入手机号码"); setPhoneErrorMessage('请输入手机号码');
setPhoneStatus("error"); setPhoneStatus('error');
return; return;
} }
setPhoneErrorMessage(""); setPhoneErrorMessage('');
setPhoneStatus(""); setPhoneStatus('');
if (String(values.phone).length !== 11 && !props.isWorkWechat) { if (String(values.phone).length !== 11 && !props.isWorkWechat) {
setPhoneErrorMessage("请输入11位手机号"); setPhoneErrorMessage('请输入11位手机号');
setPhoneStatus("error"); setPhoneStatus('error');
return; return;
} }
setPhoneErrorMessage(""); setPhoneErrorMessage('');
setPhoneStatus(""); setPhoneStatus('');
props.choosedItem.nickName ? handleEditEmployee() : handleAddEmployee(); props.choosedItem.nickName ? handleEditEmployee() : handleAddEmployee();
} }
function handleChangeValues(name: string, value: any) { function handleChangeValues(name: string, value: any) {
switch (name) { switch (name) {
case "nickName": case 'nickName':
form.setFieldsValue({ nickName: value }); form.setFieldsValue({ nickName: value });
setName(value); setName(value);
return; return;
case "phone": case 'phone':
form.setFieldsValue({ phone: value }); form.setFieldsValue({ phone: value });
setPhone(value); setPhone(value);
setPhoneErrorMessage(""); setPhoneErrorMessage('');
setPhoneStatus(""); setPhoneStatus('');
return; return;
case "role": case 'role':
form.setFieldsValue({ role: value }); form.setFieldsValue({ role: value });
setRole(value); setRole(value);
return; return;
...@@ -175,9 +157,9 @@ function AddEmployeeModal(props: AddEmployeeModalProps) { ...@@ -175,9 +157,9 @@ function AddEmployeeModal(props: AddEmployeeModalProps) {
roleCodes: [role], roleCodes: [role],
avatar, avatar,
}; };
console.log("params", params); console.log('params', params);
StoreService.addEmployee(params).then((res) => { StoreService.addEmployee(params).then((res) => {
message.success("保存成功"); message.success('保存成功');
props.onClose(); props.onClose();
}); });
} }
...@@ -189,12 +171,12 @@ function AddEmployeeModal(props: AddEmployeeModalProps) { ...@@ -189,12 +171,12 @@ function AddEmployeeModal(props: AddEmployeeModalProps) {
roleCodes: [role], roleCodes: [role],
avatar, avatar,
storeUserId: storeUserId, storeUserId: storeUserId,
storeId:User.getStoreId() storeId: User.getStoreId(),
}; };
console.log("params", params); console.log('params', params);
StoreService.editEmployee(params).then((res) => { StoreService.editEmployee(params).then((res) => {
message.success("编辑成功"); message.success('编辑成功');
props.onClose(); props.onClose();
}); });
} }
...@@ -202,98 +184,94 @@ function AddEmployeeModal(props: AddEmployeeModalProps) { ...@@ -202,98 +184,94 @@ function AddEmployeeModal(props: AddEmployeeModalProps) {
return ( return (
<Modal <Modal
visible={true} visible={true}
title={`${props.choosedItem.nickName ? "编辑员工" : "添加员工"}`} title={`${props.choosedItem.nickName ? '编辑员工' : '添加员工'}`}
className="employee-add-modal" className='employee-add-modal'
width={680} width={680}
onCancel={props.onClose} onCancel={props.onClose}
onOk={handleOk} onOk={handleOk}
maskClosable={false} maskClosable={false}
closeIcon={<span className="icon iconfont modal-close-icon">&#xe6ef;</span>} closeIcon={<span className='icon iconfont modal-close-icon'>&#xe6ef;</span>}>
>
<Row style={{ height: 271 }}> <Row style={{ height: 271 }}>
<Col span={18}> <Col span={18}>
<Form <Form {...layout} form={form} name='basic' initialValues={{ nickName: nickName, phone: phone, role: role }}>
{...layout}
form={form}
name="basic"
initialValues={{ nickName: nickName, phone: phone, role: role }}
>
<Form.Item <Form.Item
label="员工昵称" label='员工姓名'
name="nickName" name='nickName'
rules={[{ required: true }]} // rules={[{ required: true }]}
validateStatus={nameStatus} // validateStatus={nameStatus}
help={nameErrorMsg || undefined} // help={nameErrorMsg || undefined}
style={{ marginBottom: 0 }} style={{ marginBottom: 0 }}>
> <div
<Input style={{
style={{ width: 200 }} whiteSpace: 'nowrap',
placeholder="请输入员工昵称" textOverflow: 'ellipsis',
maxLength={15} overflow: 'hidden',
autoComplete="off" }}>
onChange={(e) => handleChangeValues("nickName", e.target.value)} <WWOpenDataCom type='userName' openid={props.choosedItem.weChatAccount} />
/> </div>
</Form.Item> </Form.Item>
{props.isWorkWechat ? ( {props.isWorkWechat ? (
<Form.Item <Form.Item label='企业微信账号' name='weChatAccount'>
label="企业微信账号"
name="weChatAccount"
>
<Tooltip title={props.choosedItem.weChatAccount}> <Tooltip title={props.choosedItem.weChatAccount}>
<div style={{ <div
style={{
whiteSpace: 'nowrap', whiteSpace: 'nowrap',
textOverflow: 'ellipsis', textOverflow: 'ellipsis',
overflow: 'hidden', overflow: 'hidden',
}}>{props.choosedItem.weChatAccount}</div> }}>
{props.choosedItem.weChatAccount}
</div>
</Tooltip> </Tooltip>
</Form.Item> </Form.Item>
) : ( ) : (
<Form.Item <Form.Item label='手机号码' name='phone' rules={[{ required: true }]} validateStatus={phoneStatus} help={phoneErrorMessage}>
label="手机号码"
name="phone"
rules={[{ required: true }]}
validateStatus={phoneStatus}
help={phoneErrorMessage}
>
<Input <Input
style={{ width: 200 }} style={{ width: 200 }}
placeholder="请输入手机号" placeholder='请输入手机号'
maxLength={11} maxLength={11}
autoComplete="off" autoComplete='off'
disabled={!!props.choosedItem.nickName} disabled={!!props.choosedItem.nickName}
onChange={(e) => { onChange={(e) => {
if (e.target.value.match(/^\d+$/)) { if (e.target.value.match(/^\d+$/)) {
handleChangeValues("phone", e.target.value); handleChangeValues('phone', e.target.value);
} else { } else {
setPhoneErrorMessage("只能输入数字"); setPhoneErrorMessage('只能输入数字');
setPhoneStatus("error"); setPhoneStatus('error');
} }
}} }}
/> />
</Form.Item> </Form.Item>
)} )}
<Form.Item <Form.Item label='所在部门' name='weChatAccount' style={{ marginBottom: 0 }}>
label="员工角色" <div
name="role" style={{
rules={[{ required: false }]} whiteSpace: 'nowrap',
style={{marginBottom:'-2px !important'}} textOverflow: 'ellipsis',
className="mt-26" overflow: 'hidden',
> }}>
{props.choosedItem.depNameList.map((item: any, index: any) => {
return (
<span>
<WWOpenDataCom type='departmentName' openid={item} />
{index < props.choosedItem.depNameList.length - 1 ? '、' : ''}
</span>
);
})}
</div>
</Form.Item>
<Form.Item label='员工角色' name='role' rules={[{ required: false }]} style={{ marginBottom: '-2px !important' }} className='mt-26'>
<RadioGroup <RadioGroup
onChange={(e) => { onChange={(e) => {
handleChangeValues("role", e.target.value); handleChangeValues('role', e.target.value);
}} }}
className="mt5" className='mt5'>
> <Radio value={'CloudLecturer'} className='mt-4'>
<Radio value={"CloudLecturer"} className="mt-4"> <span style={{ color: '#333' }}>普通讲师</span>
<span style={{ color: "#333" }}>普通讲师</span> <p className='radio-tip'>仅可查看/使用与自己相关的文件和课表,并进行上课</p>
<p className="radio-tip">
仅可查看/使用与自己相关的文件和课表,并进行上课
</p>
</Radio> </Radio>
<Radio value={"CloudManager"}> <Radio value={'CloudManager'}>
<span style={{ color: "#333" }}>管理员</span> <span style={{ color: '#333' }}>管理员</span>
<p className="radio-tip">可执行学院中所有的操作</p> <p className='radio-tip'>可执行学院中所有的操作</p>
</Radio> </Radio>
</RadioGroup> </RadioGroup>
</Form.Item> </Form.Item>
...@@ -301,29 +279,10 @@ function AddEmployeeModal(props: AddEmployeeModalProps) { ...@@ -301,29 +279,10 @@ function AddEmployeeModal(props: AddEmployeeModalProps) {
</Col> </Col>
<Col span={6}> <Col span={6}>
<div className="avatar-box"> <div className='avatar-box'>
<div className="avatar-text">头像</div> <div className='avatar-text'>头像</div>
<div className="avatart-img"> <div className='avatart-img'>
<img className="avatar" src={avatar}></img> <img className='avatar' src={avatar}></img>
</div>
<div className="upload-avatar">
<Button id="click_upload_btn" onClick={_onUpload}>
上传头像
</Button>
<input
type="file"
accept="image/*"
id="CrpperAvatarPic"
style={{ display: "none" }}
onChange={_handleUpdateAvatar}
/>
{cropperModalVisible && (
<CropperModal
imgUrl={imgUrl}
save={changeAvatar}
close={closeCropperModal}
/>
)}
</div> </div>
</div> </div>
</Col> </Col>
......
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