Commit 1db69ba7 by yuananting

fix:合并人员组织架构分支代码

parents 82905161 fa4275cc
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
.container-left-body-table{ .container-left-body-table{
width: 300px; width: 300px;
height: 330px; height: 330px;
overflow: scroll;
.ant-table { .ant-table {
border: none; border: none;
min-height: 250px !important; min-height: 250px !important;
......
module.exports = {
isWeiXin() {
const ua = navigator.userAgent.toLowerCase();
return ua.indexOf('micromessenger') > 0;
},
isWorkWx (){
return /wxwork/i.test(navigator.userAgent)
},
isAlipay() {
const ua = navigator.userAgent.toLowerCase();
return ua.indexOf('aliapp') > 0 || ua.indexOf('alipay') > 0;
},
isXiaoMaiApp() {
const ua = navigator.userAgent.toLowerCase();
return ua.match(/xiaomai_ios/i) === 'xiaomai_ios' || ua.match(/xiaomai_android/i) === 'xiaomai_android';
},
isXiaoMaiIOSApp() {
const ua = navigator.userAgent.toLowerCase();
return ua.match(/xiaomai_ios/i) === 'xiaomai_ios';
},
isXiaoMaiAndroidApp() {
const ua = navigator.userAgent.toLowerCase();
return ua.match(/xiaomai_android/i) === 'xiaomai_android';
},
isAndroid() {
const ua = navigator.userAgent.toLowerCase();
return /android/i.test(ua);
},
isIOS() {
const ua = navigator.userAgent.toLowerCase();
return /iphone|ipad|ipod/i.test(ua);
},
isMeiKe() {
const ua = navigator.userAgent.toLowerCase();
return /xmappc/i.test(ua);
},
};
\ No newline at end of file
/*
* @Author: wufan
* @Date: 2021-05-11 10:21:37
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-07-19 15:24:27
* @Description: 企业微信api
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*
*/
import Platform from '@/common/js/platform';
import User from '@/common/js/user';
import Service from '@/common/js/service';
export default class WechatApi {
static async initConfig(params = { isAgentConfig: false, url: '' }) {
if (Platform.isWorkWx()) {
return new Promise(async (resolve, reject) => {
Service.Hades('anon/hades/getWxCorpJSAPISignature', {
storeId: User.getStoreId(),
url: params.url,
}).then((result) => {
const res = result.result;
this.config({
beta: true, // 必须这么写,否则wx.invoke调用形式的jsapi会有问题
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: res.appId, // 必填,企业微信的corpID
timestamp: res.timestamp, // 必填,生成签名的时间戳
nonceStr: res.nonceStr, // 必填,生成签名的随机串
signature: res.signature, // 必填,签名,见 附录-JS-SDK使用权限签名算法
jsApiList: ['chooseImage', 'shareToExternalContact', 'selectExternalContact', 'selectEnterpriseContact'],
}).then(() => {
Service.Hades('anon/hades/getWxWorkJSAPISignature', {
storeId: User.getStoreId(),
url: params.url,
}).then((result2) => {
const res2 = result2.result;
this.agentConfig({
corpid: res2.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致
agentid: res2.agentid, // 必填,企业微信的应用id (e.g. 1000247)
timestamp: res2.timestamp, // 必填,生成签名的时间戳
nonceStr: res2.nonceStr, // 必填,生成签名的随机串
signature: res2.signature, // 必填,签名,见附录-JS-SDK使用权限签名算法
jsApiList: ['selectExternalContact', 'getCurExternalContact', 'getContext', 'shareToExternalContact', 'sendChatMessage', 'shareToExternalChat'],
success: (res) => {
console.log(res, 'res-agentconfig');
console.info('window.WWOpenData', window.WWOpenData);
resolve(res);
},
fail: (err) => {
console.log(1213545344545)
console.log(err, 'err-agentconfig');
reject(err);
},
});
});
})
});
})
} else {
if (params.isAgentConfig) {
console.log(32132132, 'cesgu')
return new Promise(async (resolve, reject) => {
Service.Hades('anon/hades/getWxWorkJSAPISignature', {
storeId: User.getStoreId(),
url: params.url,
}).then((result2) => {
const res2 = result2.result;
this.agentConfig({
corpid: res2.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致
agentid: res2.agentid, // 必填,企业微信的应用id (e.g. 1000247)
timestamp: res2.timestamp, // 必填,生成签名的时间戳
nonceStr: res2.nonceStr, // 必填,生成签名的随机串
signature: res2.signature, // 必填,签名,见附录-JS-SDK使用权限签名算法
jsApiList: ['selectExternalContact', 'getCurExternalContact', 'getContext', 'shareToExternalContact', 'sendChatMessage', 'shareToExternalChat'],
success: (res) => {
console.log(res, 'res-agentconfig');
console.info('window.WWOpenData', window.WWOpenData);
resolve(res);
},
fail: (err) => {
console.log(1213545344545)
console.log(err, 'err-agentconfig');
reject(err);
},
});
});
});
}
}
}
static async config(config) {
return new Promise((resolve, reject) => {
console.info('wx.config', config);
wx.config(config);
wx.ready(resolve);
wx.error(reject);
}).then(
() => {
console.info('wx.ready');
},
(error) => {
console.error('wx.error', error);
throw error;
}
);
}
static async agentConfig(config) {
wx.agentConfig({ ...config });
}
static getCurExternalContact() {
return new Promise((resolve, reject) => {
wx.ready(() => {
wx.invoke('getCurExternalContact', {}, function (res) {
if (res.err_msg == 'getCurExternalContact:ok') {
resolve(res.userId); //返回当前外部联系人userId
} else {
reject(res.err_msg); //错误处理
}
});
});
});
}
static getContext() {
return new Promise((resolve, reject) => {
wx.ready(() => {
wx.invoke('getContext', {}, function (res) {
if (res.err_msg == 'getContext:ok') {
resolve(res.entry); //返回进入H5页面的入口类型,目前有normal、contact_profile、single_chat_tools、group_chat_tools、chat_attachment
} else {
reject(res.err_msg); //错误处理
}
});
});
});
}
}
import React, { useRef, useLayoutEffect } from 'react'
export default function WWOpenDataCom({ type, openid }) {
const ref = useRef(null)
useLayoutEffect(() => {
console.log('1111');
console.log(WWOpenData);
WWOpenData && WWOpenData.bind(ref.current)
})
return <ww-open-data ref={ref} type={type} openid={openid} />
}
\ No newline at end of file
import React, { useContext, useRef, useLayoutEffect } from 'react'
import { XMContext } from '@/store/context';
import WWOpenData from './WWOpenData'
export default function WWOpenDataCom(props) {
const ctx = useContext(XMContext);
const ref = useRef(null)
return ctx.xmState.wechatLogin ? <WWOpenData {...props} /> : <div></div>
}
\ No newline at end of file
import Platform from './platform';
import Service from "@/common/js/service";
import User from '@/common/js/user';
export default class WechatApi {
static initShareConfig() {
// if (Platform.isWeiXin()) {
const data = { url: window.location.href.split('#')[0], storeId: User.getStoreId(), }
Service.Hades('anon/hades/getWxWorkJSAPISignature', data).then((result) => {
const res = result.result;
const conf ={
corpid: res.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致
agentid: res.agentid, // 必填,企业微信的应用id (e.g. 1000247)
timestamp: res.timestamp, // 必填,生成签名的时间戳
nonceStr: res.nonceStr,// 必填,生成签名的随机串
signature: res.signature,
jsApiList: ['startLiving','downloadLivingReplay'],
success: function(res) {
console.log('agentConfig注册成功')
console.log(res,'agentConfig')
},
fail: function(res) {
console.log(res,' agentConfig1 错误')
if(res.errMsg.indexOf('function not exist') > -1){
alert('版本过低请升级')
}
},
complete:(res)=>{
console.log(res,' agentConfig2 错误')
}
}
console.log(conf)
wx.agentConfig(conf);
});
// }
}
}
\ No newline at end of file
/* /*
* @Author: wufan * @Author: wufan
* @Date: 2020-11-25 18:25:02 * @Date: 2020-11-25 18:25:02
* @LastEditors: zhangleyuan * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-03-09 10:28:03 * @LastEditTime: 2021-07-30 17:00:06
* @Description: Description * @Description: Description
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -75,6 +75,36 @@ export function updateStoreMessage(params: object) { ...@@ -75,6 +75,36 @@ export function updateStoreMessage(params: object) {
export function getStoreDetail(params: object) { export function getStoreDetail(params: object) {
return Service.Hades("public/hades/getStoreDetail", params); return Service.Hades("public/hades/getStoreDetail", params);
} }
export function getByDepartmentId(params: object) {
return Service.Hades("public/hades/getByDepartmentId", params);
}
export function getDepartmentUser(params: object) {
return Service.Hades("/public/hades/getDepartmentAndDepartmentUserByName", params);
}
export function getDepartmentUserNotPage(params: object) {
return Service.Hades("public/hades/getDepartmentAndDepartmentUserNotPageByName", params);
}
export function addDepartment(params: object) {
return Service.Hades("public/hades/addDepartment", params);
}
export function editDepartment(params: object) {
return Service.Hades("public/hades/editDepartment", params);
}
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);
}
export function syncWorkWeChatDepartment(params: object) {
return Service.Hades("public/hades/syncWorkWeChatDepartment", params);
}
export function getSyncCount(params: object) {
return Service.Hades("public/hades/getSyncCount", params);
}
/* /*
* @Author: zhangleyuan * @Author: zhangleyuan
* @Date: 2021-01-19 11:27:56 * @Date: 2021-01-19 11:27:56
* @LastEditors: zhangleyuan * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-03-08 10:36:04 * @LastEditTime: 2021-07-29 13:37:10
* @Description: 描述一下 * @Description: 描述一下
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -12,6 +12,7 @@ export const storeRoleEnum = { ...@@ -12,6 +12,7 @@ export const storeRoleEnum = {
"1": "管理员", "1": "管理员",
"2": "普通讲师" "2": "普通讲师"
}; };
export const industryList = ["IT服务","制造业","批发/零售","生活服务","文化/体育/娱乐业","建筑/房地产","教育","运输/物流/仓储","医疗","政府","金融","能源/采矿","农林渔牧","其他行业"]; export const industryList = ["IT服务","制造业","批发/零售","生活服务","文化/体育/娱乐业","建筑/房地产","教育","运输/物流/仓储","医疗","政府","金融","能源/采矿","农林渔牧","其他行业"];
export const childIndustryList = { export const childIndustryList = {
...@@ -29,4 +30,9 @@ export const childIndustryList = { ...@@ -29,4 +30,9 @@ export const childIndustryList = {
"能源/采矿":["电力/热力/燃气/水供应业","石油/天然气","煤炭","有色金属","钢铁","其他"], "能源/采矿":["电力/热力/燃气/水供应业","石油/天然气","煤炭","有色金属","钢铁","其他"],
"农林渔牧":["农林渔牧"], "农林渔牧":["农林渔牧"],
"其他行业":["科学研究和技术服务业","社会组织","水利和环境管理","国际组织","其他"] "其他行业":["科学研究和技术服务业","社会组织","水利和环境管理","国际组织","其他"]
}
export const DepType = {
'departMentTab':'DEP_ORG',
'postGrouptab':'DEP_POST',
'customGroupTab':'DEP_CUSTOM'
} }
\ No newline at end of file
/* /*
* @Author: wufan * @Author: wufan
* @Date: 2020-11-25 18:25:02 * @Date: 2020-11-25 18:25:02
* @LastEditors: zhangleyuan * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-03-08 11:48:43 * @LastEditTime: 2021-08-01 09:38:54
* @Description: Description * @Description: Description
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
import { getEmployeeList, getUserList, getStoreDecorationList, getStoreRole, addEmployee, editEmployee, deleteEmployee, getCourseCatalogList, import { getEmployeeList, getUserList, getStoreDecorationList, getStoreRole, addEmployee, editEmployee, deleteEmployee, getCourseCatalogList,
getAllSonCategory, addCourseCategory, delCourseCategory, editCourseCategory, deleteStoreDecorationList, addStoreBanner, editStoreBanner, getAllSonCategory, addCourseCategory, delCourseCategory, editCourseCategory, deleteStoreDecorationList, addStoreBanner, editStoreBanner,
moveBannerSequence,getStoreUserBasicPage,updateStoreMessage,getStoreDetail} from '@/data-source/store/request-apis'; moveBannerSequence,getStoreUserBasicPage,updateStoreMessage,getStoreDetail,getByDepartmentId,getDepartmentUser,getDepartmentUserNotPage,addDepartment,
editDepartment,delDepartment,queryDepartmentTree,getStoreCustomerAndDepNamePage,delDepartmentUser,syncWorkWeChatDepartment,getSyncCount
} from '@/data-source/store/request-apis';
export default class StoreService { export default class StoreService {
// 获取员工列表 // 获取员工列表
...@@ -89,4 +91,37 @@ export default class StoreService { ...@@ -89,4 +91,37 @@ export default class StoreService {
static getStoreDetail(params: any) { static getStoreDetail(params: any) {
return getStoreDetail(params); return getStoreDetail(params);
} }
static getByDepartmentId(params:any){
return getByDepartmentId(params);
}
static getDepartmentUser(params:any){
return getDepartmentUser(params);
}
static getDepartmentUserNotPage(params:any){
return getDepartmentUserNotPage(params);
}
static addDepartment(params:any){
return addDepartment(params);
}
static editDepartment(params:any){
return editDepartment(params);
}
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);
}
static syncWorkWeChatDepartment(params:any){
return syncWorkWeChatDepartment(params);
}
static getSyncCount(params:any){
return getSyncCount(params);
}
} }
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-08-24 12:20:57 * @Date: 2020-08-24 12:20:57
* @LastEditors: yuananting * @LastEditors: yuananting
* @LastEditTime: 2021-08-05 16:19:02 * @LastEditTime: 2021-08-05 19:50:10
* @Description: * @Description:
* @Copyright: 杭州杰竞科技有限公司 版权所有 * @Copyright: 杭州杰竞科技有限公司 版权所有
--> -->
...@@ -47,6 +47,8 @@ ...@@ -47,6 +47,8 @@
<script type="text/javascript" src="https://image.xiaomaiketang.com/xm/PhotoClip.js"></script> <script type="text/javascript" src="https://image.xiaomaiketang.com/xm/PhotoClip.js"></script>
<script type="text/javascript" charset="utf-8" src="//g.alicdn.com/sd/ncpc/nc.js?t=2015052012"></script> <script type="text/javascript" charset="utf-8" src="//g.alicdn.com/sd/ncpc/nc.js?t=2015052012"></script>
<script type="text/javascript" src="https://xiaomai-js.oss-cn-hangzhou.aliyuncs.com/loghub-xm-0.0.1-beta.js"></script> <script type="text/javascript" src="https://xiaomai-js.oss-cn-hangzhou.aliyuncs.com/loghub-xm-0.0.1-beta.js"></script>
<script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="text/javascript" src="//open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
</head> </head>
<body> <body>
<noscript>You need to enable JavaScript to run this app.</noscript> <noscript>You need to enable JavaScript to run this app.</noscript>
......
...@@ -5,4 +5,16 @@ ...@@ -5,4 +5,16 @@
.add-show-btn{ .add-show-btn{
margin-top:12px; margin-top:12px;
} }
.update-user-btn{
margin-left:8px;
margin-right:8px;
}
.origin-text{
font-size:14px;
color:#999;
}
.view-text{
font-size:14px;
color:#5289FA;
}
} }
\ No newline at end of file
...@@ -5,20 +5,21 @@ ...@@ -5,20 +5,21 @@
* @Last Modified time: 2021-04-10 14:36:43 * @Last Modified time: 2021-04-10 14:36:43
* 学院管理-员工管理 * 学院管理-员工管理
*/ */
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 _ 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 } 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';
import EmployeeAddOrEditModal from "../store-manage/EmployeeAddOrEditModal"; import EmployeeAddOrEditModal from '../store-manage/EmployeeAddOrEditModal';
import User from "@/common/js/user"; import User from '@/common/js/user';
import LimitTip from "./LimitTip"; import LimitTip from './LimitTip';
import WWOpenDataCom from '@/components/WWOpenDataCom';
import "./EmployeeManage.less"; import './EmployeeManage.less';
import ChooseMembersModal from "./modal/ChooseMembersModal"; import NewChooseMembersModal from './modal/NewChooseMembersModal';
const { confirm } = Modal; const { confirm } = Modal;
const { Search } = Input; const { Search } = Input;
...@@ -32,6 +33,7 @@ interface RecordTypes { ...@@ -32,6 +33,7 @@ interface RecordTypes {
phone: string; phone: string;
avatar?: string; avatar?: string;
weChatAccount?: string; weChatAccount?: string;
depNameList: Array<string>;
} }
interface RoleItemType { interface RoleItemType {
...@@ -63,25 +65,25 @@ function EmployeeManage() { ...@@ -63,25 +65,25 @@ function EmployeeManage() {
const [query, setQuery] = useState<QueryType>({ const [query, setQuery] = useState<QueryType>({
current: 0, current: 0,
size: 10, size: 10,
nickName: "", nickName: '',
phone: "", phone: '',
roleCodes: [], roleCodes: [],
}); });
const [total, setTotal] = useState(0); const [total, setTotal] = useState(0);
const [realTotal, setRealTotal] = useState(0) const [realTotal, setRealTotal] = useState(0);
const [model, setModel] = useState<React.ReactNode>(null); const [model, setModel] = useState<React.ReactNode>(null);
const [employeeModal, setEmployeeModal] = useState(false); const [employeeModal, setEmployeeModal] = useState(false);
const [choosedItem, setChooseItem] = useState<ChoosedItemType>({ const [choosedItem, setChooseItem] = useState<ChoosedItemType>({
nickName: "", nickName: '',
phone: "", phone: '',
role: [], role: [],
avatar: "", avatar: '',
}); });
const [roleIds, setRoleIds] = useState<Array<RoleItemType>>([]); const [roleIds, setRoleIds] = useState<Array<RoleItemType>>([]);
const storeId = User.getStoreId(); const storeId = User.getStoreId();
const StoreType = User.getStoreType(); const StoreType = User.getStoreType();
const isWorkWechat = !!(StoreType === "WE_CHAT_STORE"); const isWorkWechat = !!(StoreType === 'WE_CHAT_STORE');
useEffect(() => { useEffect(() => {
if (!User.getEnterpriseId()) { if (!User.getEnterpriseId()) {
...@@ -91,14 +93,14 @@ function EmployeeManage() { ...@@ -91,14 +93,14 @@ function EmployeeManage() {
const _query = { const _query = {
current: 0, current: 0,
size: 10, size: 10,
nickName: "", nickName: '',
phone: "", phone: '',
roleCodes: [], roleCodes: [],
} };
StoreService.getEmployeeList(_query).then((res: any) => { StoreService.getEmployeeList(_query).then((res: any) => {
setRealTotal(res.result.total); setRealTotal(res.result.total);
}); });
}, []) }, []);
useEffect(() => { useEffect(() => {
getEmployeeList(); getEmployeeList();
...@@ -127,7 +129,7 @@ function EmployeeManage() { ...@@ -127,7 +129,7 @@ function EmployeeManage() {
const _query = { ...query }; const _query = { ...query };
let _data = _.filter(data, (_item) => { let _data = _.filter(data, (_item) => {
return _item.roleCode !== "StoreManager"; return _item.roleCode !== 'StoreManager';
}); });
setRoleIds(_data); setRoleIds(_data);
...@@ -137,61 +139,72 @@ function EmployeeManage() { ...@@ -137,61 +139,72 @@ function EmployeeManage() {
function parseColumn() { function parseColumn() {
const columns = [ const columns = [
{ {
title: "员工", title: '员工',
dataIndex: "nickName", dataIndex: 'nickName',
render: (val: string, record: RecordTypes) => { render: (val: string, record: RecordTypes) => {
return ( return (
<div className="employee-info"> <div className='employee-info'>
{isWorkWechat && ( {isWorkWechat && <img src={record.avatar || 'https://image.xiaomaiketang.com/xm/rJeQaZxtc7.png'} alt='' />}
<img
src={
record.avatar ||
"https://image.xiaomaiketang.com/xm/rJeQaZxtc7.png"
}
alt=""
/>
)}
<span className="title">{val}</span> {/* <span className="title">{val}</span> */}
<span className='title'>
<WWOpenDataCom type='userName' openid={val} />
</span>
</div> </div>
); );
}, },
}, },
{ {
title: "手机号", title: '手机号',
dataIndex: "phone", dataIndex: 'phone',
key: "phone", key: 'phone',
render: (val: string) => { render: (val: string) => {
return <div>{val || '-'}</div>; return <div>{val || '-'}</div>;
}, },
}, },
{ {
title: "角色", title: '部门',
dataIndex: "role", dataIndex: 'depNameList',
key: "role", key: 'depNameList',
render: (val: string, record: RecordTypes) => {
if (!record.depNameList) {
return <span>-</span>;
}
return record.depNameList.map((item, index) => {
return (
<span>
<WWOpenDataCom type='departmentName' openid={item} />
{index < record.depNameList.length - 1 ? '、' : ''}
</span>
);
});
},
},
{
title: '身份',
dataIndex: 'role',
key: 'role',
render: (val: string) => { render: (val: string) => {
return <div>{val.split(",").join("、")}</div>; return <div>{val.split(',').join('、')}</div>;
}, },
}, },
{ {
title: "操作", title: '操作',
dataIndex: "operation", dataIndex: 'operation',
render: (val: string, record: RecordTypes) => { render: (val: string, record: RecordTypes) => {
return record.role === "学院管理员" || return record.role === '学院管理员' || record.userId === User.getUserId() ? (
record.userId === User.getUserId() ? ( <div className='no-operate'>-</div>
<div className="no-operate">-</div>
) : ( ) : (
<div className="operation"> <div className='operation'>
<span className="edit" onClick={() => handleEditEmployee(record)}> <span className='edit' onClick={() => handleEditEmployee(record)}>
编辑 编辑
</span> </span>
<span className="divider-line">{" | "}</span> <span className='divider-line'>{' | '}</span>
<span <span
className="delete" className='delete'
onClick={() =>{ onClick={() => {
handleDeleteWorkWechatEmployeeConfirm(record) handleDeleteWorkWechatEmployeeConfirm(record);
}} }}>
>
删除 删除
</span> </span>
</div> </div>
...@@ -202,9 +215,9 @@ function EmployeeManage() { ...@@ -202,9 +215,9 @@ function EmployeeManage() {
if (isWorkWechat && columns) { if (isWorkWechat && columns) {
const item = { const item = {
title: "企业微信账号", title: '企业微信账号',
dataIndex: "weChatAccount", dataIndex: 'weChatAccount',
key: "weChatAccount", key: 'weChatAccount',
render: (val: string) => { render: (val: string) => {
return <div>{val}</div>; return <div>{val}</div>;
}, },
...@@ -222,7 +235,7 @@ function EmployeeManage() { ...@@ -222,7 +235,7 @@ function EmployeeManage() {
role: roleCodes, role: roleCodes,
avatar: avatar, avatar: avatar,
storeUserId: id, storeUserId: id,
weChatAccount weChatAccount,
}; };
setChooseItem(_choosesItem); setChooseItem(_choosesItem);
const model: React.ReactNode = ( const model: React.ReactNode = (
...@@ -232,12 +245,12 @@ function EmployeeManage() { ...@@ -232,12 +245,12 @@ function EmployeeManage() {
setModel(null); setModel(null);
getEmployeeList(); getEmployeeList();
setChooseItem({ setChooseItem({
nickName: "", nickName: '',
phone: "", phone: '',
role: [], role: [],
avatar: "", avatar: '',
storeUserId: "", storeUserId: '',
weChatAccount:"" weChatAccount: '',
}); });
}} }}
isWorkWechat={isWorkWechat} isWorkWechat={isWorkWechat}
...@@ -248,14 +261,12 @@ function EmployeeManage() { ...@@ -248,14 +261,12 @@ function EmployeeManage() {
function handleDeleteWorkWechatEmployeeConfirm(record: RecordTypes) { function handleDeleteWorkWechatEmployeeConfirm(record: RecordTypes) {
return confirm({ return confirm({
title: "你确定要删除此员工吗?", title: '你确定要删除此员工吗?',
content: "删除后数据无法恢复", content: '删除后数据无法恢复',
icon: ( icon: <span className='icon iconfont default-confirm-icon'>&#xe839; </span>,
<span className="icon iconfont default-confirm-icon">&#xe839; </span> okText: '删除',
), okType: 'danger',
okText: "删除", cancelText: '取消',
okType: "danger",
cancelText: "取消",
onOk: () => { onOk: () => {
handleDeleteEmployee(record.id); handleDeleteEmployee(record.id);
}, },
...@@ -268,155 +279,215 @@ function EmployeeManage() { ...@@ -268,155 +279,215 @@ function EmployeeManage() {
function handleDeleteEmployee(storeUserId: string) { function handleDeleteEmployee(storeUserId: string) {
StoreService.deleteEmployee({ storeUserId }).then((res: any) => { StoreService.deleteEmployee({ storeUserId }).then((res: any) => {
const msg = isWorkWechat ? "员工已删除":"讲师已删除"; const msg = isWorkWechat ? '员工已删除' : '讲师已删除';
message.success(msg); message.success(msg);
getEmployeeList(); getEmployeeList();
}); });
} }
function updateListData() {
let num: any;
const params = {
enterpriseId: User.getEnterpriseId(),
storeId: User.getStoreId(),
userType: 'USER',
};
StoreService.getSyncCount(params).then((res) => {
num = res.result;
if (num < 3) {
return confirm({
title: '确定更新列表数据吗?',
content: `员工数据来源企微通讯录,一天只能更新3次,今日还能更新${3 - num}次。`,
icon: <span className='icon iconfont default-confirm-icon'>&#xe839; </span>,
okText: '确定',
cancelText: '取消',
onOk: () => {
confirmUpdateListData();
},
});
} else {
Modal.warning({
title: '提示',
okText: '我知道了',
content: '员工数据今日更新次数已达上限(3次),无法继续更新。',
icon: (
<span className='icon iconfont default-confirm-icon' style={{ color: '#FFBB54 !important' }}>
&#xe834;
</span>
),
});
}
});
}
function confirmUpdateListData() {
const params = {
enterpriseId: User.getEnterpriseId(),
storeId: User.getStoreId(),
userType: 'USER',
};
StoreService.syncWorkWeChatDepartment(params).then((res) => {
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>
<div className="box"> <div className='box'>
<div className="box-header"> <div className='box-header'>
<div <div
style={{ style={{
display: "flex", display: 'flex',
alignItems: "center", alignItems: 'center',
justifyContent: "flex-start", justifyContent: 'flex-start',
padding: "0px 0 4px", padding: '0px 0 4px',
}} }}>
> <div>
<div>
搜索员工: 搜索员工:
<Search <Search
style={{ style={{
width: 300, width: 300,
marginRight: 40, marginRight: 40,
}} }}
placeholder={ placeholder={isWorkWechat ? '请输入员工昵称' : '搜索员工昵称/手机号'}
isWorkWechat ? "请输入员工昵称" : "搜索员工昵称/手机号" onSearch={(value) => {
const _query = { ...query };
// 企业微信用户只能搜索员工昵称
if (isWorkWechat) {
_query.nickName = value;
_query.current = 0;
setQuery(_query);
return;
} }
onSearch={(value) => {
const _query = { ...query };
// 企业微信用户只能搜索员工昵称
if (isWorkWechat) {
_query.nickName = value;
_query.current = 0;
setQuery(_query);
return;
}
if (value) { if (value) {
const isPhone = (value || "").match(/^\d+$/); const isPhone = (value || '').match(/^\d+$/);
const name = isPhone ? "phone" : "nickName"; const name = isPhone ? 'phone' : 'nickName';
const otherName = isPhone ? "nickName" : "phone"; const otherName = isPhone ? 'nickName' : 'phone';
_query[name] = value; _query[name] = value;
_query[otherName] = ""; _query[otherName] = '';
_query.current = 0; _query.current = 0;
} else { } else {
_query.nickName = ""; _query.nickName = '';
_query.phone = ""; _query.phone = '';
_query.current = 0; _query.current = 0;
} }
setQuery(_query); setQuery(_query);
}} }}
enterButton={<span className="icon iconfont">&#xe832;</span>} enterButton={<span className='icon iconfont'>&#xe832;</span>}
/> />
</div> </div>
<div> <div>
角色: 角色:
{_.map(roleIds, (item: any) => { {_.map(roleIds, (item: any) => {
return ( return (
<CheckBox <CheckBox
key={item.roleCode} key={item.roleCode}
text={item.name} text={item.name}
name={item.roleCode} name={item.roleCode}
onChange={(e: any) => { onChange={(e: any) => {
const { checked, name } = e.target; const { checked, name } = e.target;
const _query = { ...query }; const _query = { ...query };
_query.roleCodes = []; _query.roleCodes = [];
_query.current = 0; _query.current = 0;
const _roleIds: Array<RoleItemType> = roleIds.map( const _roleIds: Array<RoleItemType> = roleIds.map((_item: RoleItemType) => {
(_item: RoleItemType) => { if (name === _item.roleCode) {
if (name === _item.roleCode) { if (checked) {
if (checked) { _item.isChecked = true;
_item.isChecked = true; } else {
} else { _item.isChecked = false;
_item.isChecked = false;
}
}
if (_item.isChecked) {
_query.roleCodes.push(_item.roleCode);
}
return _item;
} }
); }
if (_item.isChecked) {
_query.roleCodes.push(_item.roleCode);
}
return _item;
});
setRoleIds(_roleIds); setRoleIds(_roleIds);
setQuery(_query); setQuery(_query);
}} }}
defaultChecked={item.isChecked} defaultChecked={item.isChecked}
/> />
); );
})} })}
</div>
</div> </div>
{(User.getUserRole() === 'CloudManager' || User.getUserRole() === 'StoreManager') && </div>
{(User.getUserRole() === 'CloudManager' || User.getUserRole() === 'StoreManager') && (
<>
<Button <Button
onClick={() => { onClick={() => {
handleToAddEmployee(); handleToAddEmployee();
}} }}
type="primary" type='primary'
className="add-show-btn" className='add-show-btn'>
>
添加员工 添加员工
</Button> </Button>
} <Button
</div> className='update-user-btn'
<LimitTip type="员工" total={realTotal} tip={()=>{return (<div>数据为当前学院的员工数,若员工存在多个学院,企业人数只统计为1人</div>)}}/> onClick={() => {
<div className="box-body"> updateListData();
<XMTable }}>
renderEmpty={{ 更新列表数据
image: college, </Button>
description: '暂无数据' <span className='origin-text'>数据来源企业微信通讯录</span>
}} <a href='https://www.yuque.com/wangzhong-zkqw0/qixue' target='_blank'>
size={"middle"} <span className='view-text'>查看数据更新说明</span>
pagination={false} </a>
dataSource={employeeList} </>
columns={parseColumn()} )}
rowKey={(item: any) => item.id}
bordered
/>
</div>
<div className="box-footer">
<PageControl
current={query.current}
pageSize={query.size}
total={total}
toPage={(page: any) => {
const queryStates = _.clone(query);
queryStates.current = page;
setQuery(queryStates);
}}
/>
</div>
</div> </div>
{model} <LimitTip
{employeeModal && type='员工'
<ChooseMembersModal total={realTotal}
isOpen={employeeModal} tip={() => {
type="USER" return <div>数据为当前学院的员工数,若员工存在多个学院,企业人数只统计为1人</div>;
handleChooseModal={(bool: any) => { }}
setEmployeeModal(false) />
if (bool) { <div className='box-body'>
message.success('添加成功') <XMTable
getEmployeeList(); renderEmpty={{
} image: college,
description: '暂无数据',
}} }}
size={'middle'}
pagination={false}
dataSource={employeeList}
columns={parseColumn()}
rowKey={(item: any) => item.id}
bordered
/> />
} </div>
<div className='box-footer'>
<PageControl
current={query.current}
pageSize={query.size}
total={total}
toPage={(page: any) => {
const queryStates = _.clone(query);
queryStates.current = page;
setQuery(queryStates);
}}
/>
</div>
</div>
{model}
{employeeModal && (
<NewChooseMembersModal
treeDepType='DEP_CHAT'
visible={employeeModal}
type='USER'
close={() => {
setEmployeeModal(false);
}}
onConfirm={() => {
setEmployeeModal(false);
message.success('添加成功');
getEmployeeList();
}}
/>
)}
</div> </div>
); );
} }
......
/*
* @Author: your name
* @Date: 2021-08-04 15:21:36
* @LastEditTime: 2021-08-04 15:23:37
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: /xiaomai-cloud-class-web/src/modules/college-manage/LimitTip.tsx
*/
import React, { useContext, useEffect, useState } from "react"; import React, { useContext, useEffect, useState } from "react";
import { Tooltip } from "antd" import { Tooltip } from "antd"
import { VersionContext } from "@/store/context"; import { VersionContext } from "@/store/context";
...@@ -26,7 +34,7 @@ export default function LimitTip(props:{total:number,type:string,tip:() => React ...@@ -26,7 +34,7 @@ export default function LimitTip(props:{total:number,type:string,tip:() => React
{ {
isOver ? ( isOver ? (
<> <>
<div style={{marginLeft:"14px",display:"inline-block"}}>当前企业使用人数已达到上限 (<span style={{color:"#333333",fontWeight:"bold"}}>{limitUser}</span>人),将无法添加新员工、新学员,如需增加人数限制,请联系小麦企学院服务平台。</div> <div style={{marginLeft:"14px",display:"inline-block"}}>当前企业使用人数已达到上限 <span style={{color:"#333333",fontWeight:"bold"}}>{limitUser}</span>,将无法添加新员工、新学员,如需增加人数限制,请联系小麦企学院服务平台。</div>
<ContactWidget trigger="hover" placement="bottom"> <ContactWidget trigger="hover" placement="bottom">
<div className="renew-text">立即续费<span className="icon iconfont" style={{fontSize:"10px"}}>&#59291;</span></div> <div className="renew-text">立即续费<span className="icon iconfont" style={{fontSize:"10px"}}>&#59291;</span></div>
</ContactWidget> </ContactWidget>
......
/*
* @Author: wufan
* @Date: 2020-11-30 10:47:38
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-03 16:04:30
* @Description: 学员管理页面
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import _ from "underscore";
import {Tabs,Input,Tree,Button} from "antd";
import CustomGroupTabCon from './components/CustomGroupTabCon';
import DepartMentTabCon from './components/DepartMentTabCon';
import PostGroupTabCon from './components/PostGroupTabCon';
import "./NewUsersManagePage.less";
const { TabPane } = Tabs;
function UserManagePage() {
const [currentTab, setCurrentTab] = useState("departMentTab");
const [courseList,setCourseList] = useState([]);
const [total, setTotal] = useState(0);
const [query, setQuery] = useState({
current: 0,
size: 10,
});
return (
<div className="page new-user-manage-page">
<div className="content-header">学员管理</div>
<div className="box">
<div className="tab-box">
<Tabs
onChange={(key) => {
setCurrentTab(key);
}}
activeKey={currentTab}
>
<TabPane key="departMentTab" tab="部门"></TabPane>
<TabPane key="postGrouptab" tab="岗位组"></TabPane>
<TabPane key="customGroupTab" tab="自定义分组"></TabPane>
</Tabs>
</div>
<div className="box-body tab-con">
<DepartMentTabCon currentTab={currentTab}/>
</div>
</div>
</div>
);
}
export default withRouter(UserManagePage);
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import { Button, Input, message } from "antd";
import LeftStructureTree from "./LeftStructureTree";
import AddOrEditPostGroupModal from "../modal/AddOrEditPostGroupModal";
import UserTable from "./UserTable";
import "./PostGroupTabCon.less";
const { Search } = Input;
function CustomGroupTabCon() {
const [postGroupTreeData, setPostGroupTreeData] = useState([]);
return (
<div className="post-group-tab-con">
<LeftStructureTree
treeData={postGroupTreeData}
treeType={"customGroupTab"}
editPostGroup={(record)=>editPostGroup(record)}
addPostGroup={(record)=>addPostGroup(record)}
/>
<div className="table-con">
<div className="operate-area">
<Button type="primary" className="add-user-btn">
添加学员
</Button>
<Button className="del-user-btn">移出学员</Button>
</div>
<UserTable />
</div>
</div>
);
}
export default withRouter(CustomGroupTabCon);
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
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 WWOpenDataCom from '@/components/WWOpenDataCom';
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,
};
function DepartMentTabCon(props) {
const [chooseMembersModalVisible, setChooseMembersModalVisible] = useState(
false
);
const [query, setQuery] = useState(DefaultQuery);
const [total, setTotal] = useState(0);
const [userListdata, setUserListData] = useState([]);
const [selectUser,setSelectUser] = useState([]); // 设置选中的用户
const [selectDep,setSelectDep] = useState({});
const columns = [
{
title: "学员",
dataIndex: "nickName",
width: 220,
render: (val, item) => {
return (
<div>
{item.sourceEnum === "WORK_WE_CHAT" ?
<span> <WWOpenDataCom type="userName" openid={val}/></span>:
<span>{val}</span>
}
<span
className="tag"
style={{
color:
item.sourceEnum === "WORK_WE_CHAT" ? "#2966FF" : "#1DCC65",
}}
>
{item.sourceEnum === "WORK_WE_CHAT" ? "@企业微信" : "@微信"}
</span>
</div>
);
},
},
{
title: "真实姓名",
dataIndex: "realName",
width: "15%",
render: (val, record) => {
return <span>{val}</span>;
},
},
{
title: "账号",
dataIndex: "nickName",
width: "15%",
render: (val, item) => {
return <span>{val}</span>;
},
},
{
title: "岗位",
dataIndex: "depNameList",
render: (val, record) => {
if(!record.depNameList){
return <span>-</span>
}else{
if(record.depNameList.length === 0){
return <span>-</span>
}
return <div className="post-name"> {record.depNameList.map((item, index) => {
return <span>{item}{index!==record.depNameList.length-1 && <span></span>}</span>;
})}
</div>
}
}
},
{
title: "手机号",
dataIndex: "phone",
render: (val, item) => {
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, item) => {
return (
<div className="operate">
{props.currentTab==='departMentTab'?
<div className="operate__item" onClick={()=>delUser('single',item.userId)}>删除</div>
:
<div className="operate__item" onClick={()=>delUser('single',item.userId)}>移出</div>
}
</div>
);
},
},
];
function closeChooseMembersModal() {
setChooseMembersModalVisible(false);
}
function getUserList(record,treeType,current) {
const params = {
...query,
depType:DepType[treeType]|| DepType[props.currentTab],
enterpriseId: User.getEnterpriseId(),
source: 0,
storeId: User.getStoreId(),
userId: User.getUserId()
};
if(record){
if(record.id){
params.departmentId = record.id;
}else{
params.departmentId = null;
}
if(record.queryName){
params.nickName = record.queryName;
}else{
params.nickName = null;
}
}
if (current) {
params.current = current;
}
setQuery(params);
console.log('params ++++ ',params);
StoreService.getStoreCustomerAndDepNamePage(params).then((res) => {
const { records = [], total } = res.result;
setUserListData(records);
setTotal(total);
});
}
function confirmAddCustomer() {
const _query = {
...DefaultQuery,
id:query.departmentId
}
Bus.trigger("addCustomer",{treeType:props.currentTab,query:_query});
}
function delUser(type,userId){
let idList = [];
if(type === 'single'){
idList.push(userId);
}
if(type==='multiple'){
idList = _.pluck(selectUser,'userId');
}
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()
}
console.log('selectDep',selectDep)
if(selectDep.id==='100'){
params.userType='WE_CHAT';
}else{
params.userType='WORK_WE_CHAT';
}
StoreService.delDepartmentUser(params).then((res) => {
message.success(`删除成功`);
getUserList();
Bus.trigger("changeTreeData");
});
}
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);
};
function updateListData(){
let num;
const params = {
enterpriseId:User.getEnterpriseId(),
storeId:User.getStoreId(),
userType:'CUSTOMER'
}
StoreService.getSyncCount(params).then((res) => {
num = res.result;
if(num<3){
return confirm({
title: "确定更新列表数据吗?",
content: `学员数据来源企微通讯录,一天只能更新3次,今日还能更新${3-num}次。`,
icon: (
<span className="icon iconfont default-confirm-icon">&#xe839; </span>
),
okText: "确定",
cancelText: "取消",
onOk: () => {
confirmUpdateListData()
},
});
}else{
Modal.warning({
title: '提示',
okText: '我知道了',
content: '学员数据今日更新次数已达上限(3次),无法继续更新。',
icon: (
<span className='icon iconfont default-confirm-icon' style={{ color: '#FFBB54 !important' }}>
&#xe834;
</span>
),
});
}
});
}
function confirmUpdateListData(){
const params = {
enterpriseId:User.getEnterpriseId(),
storeId:User.getStoreId(),
userType:'CUSTOMER'
}
StoreService.syncWorkWeChatDepartment(params).then((res) => {
message.success('已更新');
});
}
return (
<div className="department-tab-con">
<LeftStructureTree
treeType={props.currentTab}
searchUserList={(params,treeType) => getUserList(params,treeType,1)}
onChangeSelectDep={(record)=>{setSelectDep(record);}}
/>
<div className="table-con">
{props.currentTab === "departMentTab" && (
<div className="operate-area">
{ selectDep.id !== '100' &&
<Button
type="primary"
className="add-user-btn"
onClick={() => {
setChooseMembersModalVisible(true);
}}
>
添加学员
</Button>
}
<Button className="del-user-btn" onClick={()=>delUser('multiple')}>删除学员</Button>
{ selectDep.id !== '100' &&
<>
<Button className="update-user-btn" onClick={()=>{updateListData()}}>更新列表数据</Button>
<span className="origin-text">数据来源企业微信通讯录</span>
<a
href="https://www.yuque.com/wangzhong-zkqw0/qixue"
target="_blank"
>
<span className="view-text">查看数据更新说明</span>
</a>
</>
}
</div>
)}
{(props.currentTab === "postGrouptab" ||
props.currentTab === "customGroupTab") && (
<div className="operate-area">
{/* 岗位组和自定义分组只有岗位下和分组才展示添加学员*/}
{(selectDep.depLevel > 0) &&
<Button
type="primary"
className="add-user-btn"
onClick={() => {
setChooseMembersModalVisible(true);
}}
>
添加学员
</Button>
}
<Button className="del-user-btn" onClick={()=>delUser('multiple')}>移出学员</Button>
</div>
)}
<div className="user-table">
<XMTable
renderEmpty={{
image: college,
description: "暂无数据",
}}
bordered
size="middle"
pagination={false}
columns={columns}
scroll={{ x: 800 }}
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">
<PageControl
current={query.current - 1}
pageSize={query.size}
total={total}
toPage={(page) => {
const queryStates = _.clone(query);
queryStates.current = page + 1;
setQuery(queryStates);
getUserList(null,null,queryStates.current);
}}
/>
</div>
</div>
</div>
{chooseMembersModalVisible && (
<NewChooseMembersModal
visible={chooseMembersModalVisible}
type="CUSTOMER"
selectDep={selectDep}
treeDepType={
props.currentTab === "departMentTab" ? "DEP_CHAT" : "DEP_ORG"
}
addDepType={DepType[props.currentTab]}
close={() => {
closeChooseMembersModal();
}}
onConfirm={() => {
confirmAddCustomer();
}}
/>
)}
</div>
);
}
export default withRouter(DepartMentTabCon);
.department-tab-con{
display: flex;
.table-con{
margin-left:16px;
flex:1;
.post-name{
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.operate-area{
margin-bottom:16px;
.add-user-btn{
margin-right:8px;
}
.del-user-btn{
margin-right:8px;
}
.update-user-btn{
margin-right:8px;
}
.origin-text{
font-size:14px;
color:#999;
}
.view-text{
font-size:14px;
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,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 WWOpenDataCom from '@/components/WWOpenDataCom';
import "./LeftStructureTree.less";
const { Search } = Input;
const { DirectoryTree } = Tree;
const { Option } = AutoComplete;
function LeftStructureTree(props) {
const {treeType} = props;
const [treeData,setTreeData]=useState([]);
const [addOrEditPostGroupShow, setAddOrEditPostGroupShow] = useState(false);
const [postGroupModalLevel, setPostGroupModalLevel] = useState("");
const [operatePostGroupModalType,setOperatePostGroupModalType] = useState("");
const [postGroupModalTitle,setPostGroupModalTitle] = useState("");
const [postGroupModalLable,setPostGroupModalLable] = useState("");
const [postGroupName, setPostGroupName] = useState("");
const [currentGroupData,setCurrentGroupData] = useState({});
const [completeOptions,setCompleteOption] = useState([]);
const [selectedKeys,setSelectedKeys]= useState([]); // 设置选中的部门key值
const [queryName,setQueryName] = useState('');
const [postGroupTreeData,setPostGroupTreeData] = useState([]);
const [open,setOpen]=useState(false);
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><WWOpenDataCom type="userName" openid={record.userName}/></div>
:
<div><WWOpenDataCom type="departmentName" openid={record.name}/></div>
}
{type === 'user' &&
record.postDepNamesList.map((item,index)=>{
return <span><WWOpenDataCom type="departmentName" openid={item}/></span>
})
}
{type === 'post' &&
<span>{record.parentName}</span>
}
</div>
),
});
const notFoundContentNode = ()=>{
return <span>暂无数据</span>
}
const Complete = () => (
<AutoComplete
dropdownClassName="certain-category-search-dropdown"
dropdownMatchSelectWidth={250}
allowClear
// onChange={(value)=>{setQueryName(value)}}
onSearch={(value)=>{setQueryName(value)}}
notFoundContent={notFoundContentNode()}
value={queryName}
open={open}
onFocus={()=>{setOpen(true)}}
onBlur={()=>{setOpen(false)}}
style={{
width: 250,
}}
options={completeOptions}
onSelect={confirmSearchSelect}
placeholder='搜索员工、部门'
>
</AutoComplete>
);
function confirmSearchSelect(value,option){
console.log('option',option);
setOpen(false);
setQueryName(value);
props.searchUserList({queryName:value},treeType,1);
}
// 获取关键词的搜索结果
function getCompleteOptionData(value){
// setQueryName(value);
console.log("treeType",props.treeType);
const params = {
depType:DepType[props.treeType],
queryName:value,
enterpriseId:User.getEnterpriseId(),
source:0,//0代表来自企培
storeId:User.getStoreId(),
userId:User.getUserId(),
whetherCount:false,
distinct:false,
queryType:'CUSTOMER'
}
StoreService.getDepartmentUser(params).then((res) => {
const _completeOptions = [];
const userObj = {};
const departmentGroupObj = {};
const postobj = {};
const { result = {}} = res;
const {departmentUserVOList=[],departmentVOList=[],subLevelDepartmentVOList=[]} = result;
if(departmentUserVOList.length>0){
userObj.label=renderTitle('员工');
userObj.options=departmentUserVOList.map((item,index)=>{
return renderItem(item,'user');
})
}
if(departmentVOList.length>0){
switch (props.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(subLevelDepartmentVOList.length>0){
switch (props.treeType){
case 'postGrouptab':
postobj.label=renderTitle('岗位');
break;
case 'customGroupTab':
postobj.label=renderTitle('分组');
break;
default:
break;
}
postobj.options=subLevelDepartmentVOList.map((item,index)=>{
return renderItem(item,'post');
})
}
if(Object.keys(userObj).length !==0){
_completeOptions.push(userObj);
}
if(Object.keys(departmentGroupObj).length !==0){
_completeOptions.push(departmentGroupObj);
}
if(Object.keys(postobj).length !==0){
_completeOptions.push(postobj);
}
setCompleteOption(_completeOptions);
});
}
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){
await getTreeData(treeType);
props.searchUserList(query,treeType,1);
}
function getTreeData(treeType){
return new Promise((resolve,reject)=>{
const params = {
departmentTypeEnum:DepType[treeType] || DepType[props.treeType],
enterpriseId:User.getEnterpriseId(),
source:0,//0代表来自企培
storeId:User.getStoreId(),
userId:User.getUserId(),
whetherCount:true
}
StoreService.queryDepartmentTree(params).then((res) => {
const { result = []} = res
let { departmentVOList=[] } =result;
let _treeData = handleData(result);
setTreeData(_treeData);
resolve(result);
});
})
}
function handleData(dataArray){
const _dataArray = dataArray.map((item,index)=>{
item.key=item.id;
if(item.sonDepartmentVOList){
item.children = item.sonDepartmentVOList;
handleData(item.sonDepartmentVOList)
}
return item
})
return _dataArray;
}
const leftBoxWidth =
(document.getElementById("left-box") &&
document.getElementById("left-box").style.width) ||
"304px";
const moreOpenGroupOperate = (record) => (
<Menu>
<Menu.Item key="edit">
<span onClick={()=>{props.treeType==='postGrouptab'?editPostGroup(record):editCustomGroup(record)}}>编辑</span>
</Menu.Item>
{record.depLevel ===0 &&
<Menu.Item key="add" >
<span onClick={()=>{props.treeType==='postGrouptab'?addPostGroup(1,record):addCustomGroup(1,record)}}>
{props.treeType==='postGrouptab' &&
<span>新建岗位</span>
}
{props.treeType==='customGroupTab' &&
<span>新建分组</span>
}
</span>
</Menu.Item>
}
{ (record.departmentCount === 0 || !record.departmentCount) &&
<Menu.Item key="del">
<span onClick={()=>{props.treeType==='postGrouptab'?delPostGroup(record):delCustomGroup(record)}}>删除</span>
</Menu.Item>
}
</Menu>
);
function closeAddOrEditPostGroupModal() {
setAddOrEditPostGroupShow(false);
}
//添加岗位组/岗位
function addPostGroup(level,record) {
if (treeData.length === 10) {
message.error("岗位组数量已达10个上限");
return;
}
setCurrentGroupData({});
setAddOrEditPostGroupShow(true);
setOperatePostGroupModalType("add");
setPostGroupModalLevel(level);
setCurrentGroupData(record);
console.log('treeData',record);
if(level===0){
setPostGroupModalTitle('添加岗位组');
setPostGroupModalLable('岗位组');
setPostGroupTreeData(treeData);
}else{
setPostGroupModalTitle('添加岗位'); // sub代表岗位
setPostGroupModalLable('岗位');
setPostGroupTreeData(record.sonDepartmentVOList || []);
}
}
//编辑岗位组/岗位
function editPostGroup(record){
setAddOrEditPostGroupShow(true);
setOperatePostGroupModalType("edit");
//level为0的时候编辑的是岗位组 大于0的时候
setPostGroupModalLevel(record.depLevel);
setCurrentGroupData(record);
console.log('treeData',record);
if(record.depLevel===0){
setPostGroupModalTitle('编辑岗位组');
setPostGroupModalLable('岗位组');
setPostGroupTreeData(treeData);
}else{
setPostGroupModalTitle('编辑岗位');
setPostGroupModalLable('岗位');
setPostGroupTreeData([]);
}
}
function delPostGroup(record){
let title = '确认删除该岗位组吗?';
let content= '删除后,该岗位组下的岗位及也将全部删除。';
if(record.level>0){
title = '确认删除该岗位吗?';
content = '删除后,不可恢复';
}
Modal.confirm({
title,
content,
icon: <span className='icon iconfont default-confirm-icon'>&#xe6f4;</span>,
okText: '确定',
okType: 'danger',
cancelText: '取消',
onOk: () => {
delGroup(record);
},
});
}
function delGroup(record){
let parmas = {
departmentId:record.id,
enterpriseId:User.getEnterpriseId(),
source:0,
storeId:User.getStoreId(),
userId:User.getUserId()
}
StoreService.delDepartment(parmas).then((res) => {
message.success(`删除成功`)
getTreeData();
});
}
//添加自定义分组集合/分组
function addCustomGroup(level,record) {
if (treeData.length === 10) {
message.error("岗位组数量已达10个上限");
return;
}
setCurrentGroupData({});
setAddOrEditPostGroupShow(true);
setOperatePostGroupModalType("add");
setPostGroupModalLevel(level);
setCurrentGroupData(record)
if(level===0){
setPostGroupModalTitle('添加分组集合');
setPostGroupModalLable('分组集合');
setPostGroupTreeData(treeData);
}else{
setPostGroupModalTitle('添加分组'); // sub代表岗位
setPostGroupModalLable('分组');
setPostGroupTreeData(record.sonDepartmentVOList || []);
}
}
//编辑自定义分组集合/分组
function editCustomGroup(record){
setAddOrEditPostGroupShow(true);
setOperatePostGroupModalType("edit");
setPostGroupModalLevel(record.level);
setCurrentGroupData(record)
//level为0的时候编辑的是岗位组 大于0的时候
if(record.level===0){
setPostGroupModalTitle('编辑分组集合');
setPostGroupModalLable('分组集合');
setPostGroupTreeData(treeData);
}else{
setPostGroupModalTitle('编辑分组');
setPostGroupModalLable('分组');
setPostGroupTreeData([]);
}
}
function delCustomGroup(record){
let title = '确认删除该分组集合吗?';
let content= '删除后,该分组集合下的岗位及也将全部删除。';
if(record.level>0){
title = '确认删除该分组吗?';
content = '删除后,不可恢复';
}
Modal.confirm({
title,
content,
icon: <span className='icon iconfont default-confirm-icon'>&#xe6f4;</span>,
okText: '确定',
okType: 'danger',
cancelText: '取消',
onOk: () => {
delGroup(record)
},
});
}
function confirmAddOrEditPostGroup() {
closeAddOrEditPostGroupModal();
getTreeData()
}
function selectUserList(record,e){
const _selectKeys = [];
_selectKeys.push(e.selectedNodes[0].id)
setSelectedKeys(_selectKeys);
props.onChangeSelectDep(e.selectedNodes[0]);
props.searchUserList(e.selectedNodes[0],treeType,1);
}
return (
<div className="left-structure-tree">
<div className="organization">
<div className="search-con">
{/* <Complete/> */}
<AutoComplete
dropdownClassName="certain-category-search-dropdown"
dropdownMatchSelectWidth={250}
allowClear
onChange={(value)=>setQueryName(value)}
onSearch={(value)=>{getCompleteOptionData(value)}}
notFoundContent={notFoundContentNode()}
value={queryName}
open={open}
onFocus={()=>{setOpen(true)}}
onBlur={()=>{setOpen(false)}}
style={{
width: 250,
}}
options={completeOptions}
onSelect={confirmSearchSelect}
placeholder='搜索员工、部门'
>
</AutoComplete>
</div>
{ (props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab') && (
<div className="operate">
{props.treeType==='postGrouptab' &&
<Button
className="add-btn"
onClick={() => {
addPostGroup(0)
}}
>
添加岗位组
</Button>
}
{props.treeType==='customGroupTab' &&
<Button
className="add-btn"
onClick={() => {
addCustomGroup(0)
}}
>
添加自定义分组
</Button>
}
</div>
)}
<div className="tree-con">
<DirectoryTree
defaultExpandAll
showIcon={false}
treeData={treeData}
selectedKeys={selectedKeys}
onSelect={selectUserList}
titleRender={(nodeData) => {
return (
<div
className="node-title-div"
onMouseOver={(e) => {
if((props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab')){
if (nodeData.key === "null") return;
let moreDiv = e.currentTarget.getElementsByClassName(
"item-more"
)[0];
let countDiv = e.currentTarget.getElementsByClassName(
"item-count"
)[0];
if (moreDiv) {
moreDiv.style.visibility = "visible";
}
if (countDiv) {
countDiv.style.visibility = "hidden";
}
}
}}
onMouseOut={(e) => {
if((props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab')){
if (nodeData.key === "null") return;
let moreDiv = e.currentTarget.getElementsByClassName(
"item-more"
)[0];
let countDiv = e.currentTarget.getElementsByClassName(
"item-count"
)[0];
if (moreDiv) {
moreDiv.style.visibility = "hidden";
}
if (countDiv) {
countDiv.style.visibility = "visible";
}
}
}}
>
<div className="item-icon">
<span className="icon iconfont title-icon">&#xe604;</span>
</div>
<div
className="item-title"
style={{
width:
leftBoxWidth <= "240px"
? "35%"
: leftBoxWidth <= "304px"
? "60%"
: "78%",
}}
>
{ props.treeType==='departMentTab'?
<span><WWOpenDataCom type="departmentName" openid={nodeData.name}/></span>
:
<span>{nodeData.name}</span>
}
</div>
<div className="item-count">({nodeData.departmentCount || 0})</div>
{ (props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab') && (
<Dropdown overlay={moreOpenGroupOperate(nodeData)}>
<div className="item-more icon iconfont">&#xe927;</div>
</Dropdown>
)}
</div>
);
}}
/>
</div>
</div>
{addOrEditPostGroupShow && (
<AddOrEditPostGroupModal
onClose={() => {
closeAddOrEditPostGroupModal();
}}
onConfirm={() => {
confirmAddOrEditPostGroup();
}}
title={postGroupModalTitle}
postGroupModalLevel={postGroupModalLevel}
modalOperateType={operatePostGroupModalType}
postGroupName={postGroupName}
postGroupTreeData={postGroupTreeData}
label={postGroupModalLable}
currentTab={props.treeType}
currentGroupData={currentGroupData}
/>
)}
</div>
);
}
export default withRouter(LeftStructureTree);
.left-structure-tree {
margin-right: 24px;
width:250px;
height: calc(~'100vh - 260px');
.organization{
overflow: scroll;
.search-con{
margin-bottom: 10px;
}
.operate {
margin-bottom:16px;
.add-btn {
width: 230px;
height:32px;
}
}
&::-webkit-scrollbar {
display: none;
}
.node-title-div {
display: flex;
justify-content: space-between;
white-space: nowrap;
.item-icon {
img {
width: 16px;
height: 16px;
}
}
.item-title {
position: absolute;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: 55%;
left: 28px;
}
.item-more {
visibility: hidden;
position: absolute;
right: 8px;
text-align: right;
}
.item-count {
visibility: visible;
position: absolute;
right: 12px;
text-align: right;
}
}
// 修改树样式
.ant-tree .ant-tree-treenode {
padding: 10px 0 14px 0;
}
.ant-tree.ant-tree-directory {
.ant-tree-node-selected{
color:#2966FF !important;
}
.ant-tree-treenode-selected:hover::before,
.ant-tree-treenode-selected::before {
background: #f3f6fa;
}
.ant-tree-treenode-selected .ant-tree-switcher {
color: #666666;
}
.ant-tree-treenode .ant-tree-node-content-wrapper {
color: #666666;
}
}
}
}
\ No newline at end of file
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import { Tree} from "antd";
import StoreService from "@/domains/store-domain/storeService";
import User from '@/common/js/user';
import WWOpenDataCom from '@/components/WWOpenDataCom';
import "./MemberTree.less";
import _ from 'underscore';
const { DirectoryTree } = Tree;
function MemberTree(props) {
const [treeData,setTreeData]=useState([]);
useEffect(()=>{
getTreeData();
},[]);
function getTreeData(){
const params = {
depType:props.treeDepType,
enterpriseId:User.getEnterpriseId(),
source:0,//0代表来自企培
storeId:User.getStoreId(),
userId:User.getUserId(),
whetherCount:false,
distinct:true,
queryType:props.type
}
if(props.departmentId){
params.departmentId = props.departmentId;
}
if(props.nowTreeDepType){
params.nowDepType = props.nowTreeDepType;
}
StoreService.getDepartmentUserNotPage(params).then((res) => {
let { departmentVOList=[]} = res.result;
let _treeData = handleData(departmentVOList);
console.log("_treeData",_treeData);
setTreeData(_treeData);
});
}
function handleData(dataArray){
const _dataArray = dataArray.map((item,index)=>{
item.key=item.id;
item.children = []
if(item.departmentUserVOList){
item.children = item.departmentUserVOList;
}
if(item.sonDepartmentVOList){
item.children = [...item.children,...item.sonDepartmentVOList];
}
if(item.children.length > 0){
handleData(item.children)
}else{
delete item.children
}
return item
})
return _dataArray;
}
function treeSelected (selectedKeys,e){
const _checkedNodes = e.checkedNodes;
const _selectNodes = [];
_checkedNodes.map((item,index)=>{
if(item.userId){
_selectNodes.push(item);
}
})
console.log('_selectNodes',_selectNodes);
props.onSelect(_selectNodes);
}
return (
<div className="member-tree">
<div className="tree-con">
<DirectoryTree
defaultExpandAll
checkable
showIcon={false}
treeData={treeData}
checkedKeys={_.pluck(props.selectUserList, 'id')}
onCheck={(selectedKeys,e)=>treeSelected(selectedKeys,e)}
titleRender={(nodeData) => {
return (
<div
className="node-title-con"
>
{nodeData.userId ?
<div>
<span className="icon iconfont title-icon">&#xe603;</span>
<span><WWOpenDataCom type="userName" openid={nodeData.userName}/></span>
</div>
:
<div>
<span className="icon iconfont title-icon">&#xe604;</span>
<span><WWOpenDataCom type="departmentName" openid={nodeData.name}/></span>
</div>
}
</div>
);
}}
/>
</div>
</div>
);
}
export default withRouter(MemberTree);
.member-tree{
.node-title-con{
color:#666;
font-size:14px;
.title-icon{
margin-right:8px;
}
}
}
\ No newline at end of file
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import { Button, Input, message,Modal} from "antd";
import LeftStructureTree from "./LeftStructureTree";
import UserTable from "./UserTable";
import "./PostGroupTabCon.less";
const { Search } = Input;
function PostGroupTabCon() {
// const [addOrEditPostGroupShow, setAddOrEditPostGroupShow] = useState(false);
// const [postGroupModalType, setPostGroupModalType] = useState("");
// const [operatePostGroupModalType,setOperatePostGroupModalType] = useState("");
// const [postGroupModalTitle,setPostGroupModalTitle] = useState("");
// const [postGroupModalLable,setPostGroupModalLable] = useState("");
const [postGroupTreeData, setPostGroupTreeData] = useState([]);
// function closeAddOrEditPostGroupModal() {
// setAddOrEditPostGroupShow(false);
// }
// //添加岗位组/岗位
// function addPostGroup(type) {
// if (postGroupTreeData.length === 10) {
// message.error("岗位组数量已达10个上限");
// return;
// }
// setAddOrEditPostGroupShow(true);
// setOperatePostGroupModalType("add");
// if(type==='parentGroup'){
// setPostGroupModalType('parentGroup'); //parentGroup 代表岗位组
// setPostGroupModalTitle('添加岗位组');
// setPostGroupModalLable('岗位组');
// }else{
// setPostGroupModalType('sub');
// setPostGroupModalTitle('添加岗位'); // sub代表岗位
// setPostGroupModalLable('岗位');
// }
// }
// //编辑岗位组/岗位
// function editPostGroup(record){
// setAddOrEditPostGroupShow(true);
// setOperatePostGroupModalType("edit");
// //level为0的时候编辑的是岗位组 大于0的时候
// if(record.level===0){
// setPostGroupModalType('parentGroup');
// setPostGroupModalTitle('编辑岗位组');
// setPostGroupModalLable('岗位组');
// }else{
// setPostGroupModalType('sub');
// setPostGroupModalTitle('编辑岗位');
// setPostGroupModalLable('岗位');
// }
// }
// function delPostGroup(record){
// let title = '确认删除该岗位组吗?';
// let content= '删除后,该岗位组下的岗位及也将全部删除。';
// if(record.level>0){
// title = '确认删除该岗位吗?';
// content = '删除后,不可恢复';
// }
// Modal.confirm({
// title,
// content,
// icon: <span className='icon iconfont default-confirm-icon'>&#xe6f4;</span>,
// okText: '确定',
// okType: 'danger',
// cancelText: '取消',
// onOk: () => {
// },
// });
// }
// function confirmAddOrEditPostGroup() {
// getPostGroupTreeData()
// }
return (
<div className="post-group-tab-con">
{/* <div className="organization">
<div className="search-con">
<Search
placeholder="搜索部门/学员姓名"
className="search search-input"
style={{ width: 245 }}
enterButton={<span className="icon iconfont">&#xe832;</span>}
/>
</div>
<div className="operate">
<Button
className="add-btn"
onClick={() => {
addPostGroup('postGroup');
}}
>
添加岗位组
</Button>
</div>
</div> */}
<LeftStructureTree
treeData={postGroupTreeData}
treeType={"postGrouptab"}
editPostGroup={(record)=>editPostGroup(record)}
addPostGroup={(record)=>addPostGroup(record)}
delPostGroup={(record)=>delPostGroup('record')}
/>
<div className="table-con">
<div className="operate-area">
<Button type="primary" className="add-user-btn">
添加学员
</Button>
<Button className="del-user-btn">移出学员</Button>
</div>
<UserTable />
</div>
{/* {addOrEditPostGroupShow && (
<AddOrEditPostGroupModal
onClose={() => {
closeAddOrEditPostGroupModal();
}}
onConfirm={() => {
confirmAddOrEditPostGroup();
}}
title={postGroupModalTitle}
modalType={postGroupModalType}
modalOperateType={operatePostGroupModalType}
postGroupName={postGroupName}
postGroupTreeData={postGroupTreeData}
label={postGroupModalLable}
/>
)} */}
</div>
);
}
export default withRouter(PostGroupTabCon);
.post-group-tab-con {
display: flex;
.table-con {
margin-left: 16px;
flex: 1;
.operate-area {
margin-bottom: 16px;
.add-user-btn {
margin-right: 8px;
}
.del-user-btn {
margin-right: 8px;
}
.update-user-btn {
margin-right: 8px;
}
.origin-text {
font-size: 14px;
color: #999;
}
.view-text {
font-size: 14px;
color: #5289fa;
}
}
}
}
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import { Input,Checkbox} from "antd";
import StoreService from "@/domains/store-domain/storeService";
import User from '@/common/js/user';
import WWOpenDataCom from '@/components/WWOpenDataCom';
import $ from 'jquery';
import './SearchUser.less'
const { Search } = Input;
function SearchUser(props) {
const [dropDownVisible,setDropDownVisible]=useState(false);
useEffect(()=>{
documentClick();
},[])
function onFocus(e){
setDropDownVisible(true);
}
function onChange(e){
props.onChange(e.target.value)
}
function selectuser(e,item){
if(e.target.checked){
let _record = []
_record.push(item)
props.onSelect(_record,'user')
}
}
function selectDep(e,item){
if(e.target.checked){
console.log('item',item);
props.onSelect(item,'department');
}
}
function documentClick(){
document.onclick = function (e) {
let _con =$('#search-user');
if(!_con.is(e.target) && _con.has(e.target).length === 0){
setDropDownVisible(false);
}
};
}
return (
<div className="search-user" style={{width:'300px'}} id="search-user">
<Search
placeholder='搜索成员'
enterButton={<span className="icon iconfont">&#xe832;</span>}
onFocus={(e)=>{onFocus(e)}}
onChange={(e)=>{onChange(e)}}
className="search-input-item"
// onBlur={()=>{onBlur()}}
/>
{dropDownVisible &&
<div className="drop-down">
<div className="drop-down__list">
{props.data.departmentUserVOList &&
<div>
<div className="drop-down__item__title">
员工
</div>
<div className="drop-down__item__con">
<div>
{props.data.departmentUserVOList.map((item,index)=>{
return <div>
<Checkbox onChange={(e)=>{selectuser(e,item)}} >
<div className="drop-down__item__con__item">
<div className="drop-down__item__con__item__left">
<span className="icon iconfont title-icon">&#xe603;</span>
<WWOpenDataCom type="userName" openid={item.userName}/>
</div>
<div className="drop-down__item__con__item__right">
{item.depNamesList.map((_item,index)=>{
return <span> <WWOpenDataCom type="departmentName" openid={_item}/>{index<(item.depNamesList.length -1)?';':''}</span>
})
}
</div>
</div>
</Checkbox>
</div>
})
}
</div>
</div>
</div>
}
{props.data.departmentVOList &&
<div>
<div className="drop-down__item__title">
部门
</div>
<div className="drop-down__item__con">
<div>
{props.data.departmentVOList.map((item,index)=>{
return <div><Checkbox onChange={(e)=>{selectDep(e,item)}}>
<div className="drop-down__item__con__item">
<div className="drop-down__item__con__item__left">
<WWOpenDataCom type="departmentName" openid={item.name}/>
</div>
</div>
</Checkbox>
</div>
})
}
</div>
</div>
</div>
}
{(!props.data.departmentUserVOList && !props.data.departmentVOList)&&
<div>暂无数据</div>
}
</div>
</div>
}
</div>
);
}
export default withRouter(SearchUser);
.search-user{
position: relative;
padding:12px 16px;
.drop-down{
padding:18px;
position: absolute;
background: #FFF;
z-index:100001;
background: #FFFFFF;
box-shadow: 0px 2px 15px 6px rgba(0, 0, 0, 0.05);
border-radius:2px;
width:270px;
.ant-checkbox-wrapper{
width:100%;
.drop-down__item__con__item{
display:flex;
width:220px;
justify-content:space-between;
color:#333;
font-size:14px;
.drop-down__item__con__item__right{
width:84px;
text-align:right;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color:#999;
}
}
}
}
}
\ No newline at end of file
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import { XMTable,PageControl} from '@/components';
import college from '@/common/lottie/college.json';
import "./UserTable.less";
function UserTable() {
const [courseList,setCourseList] = useState([]);
const [total, setTotal] = useState(0);
const [query, setQuery] = useState({
current: 0,
size: 10,
});
const columns = [
{
title: '学员',
dataIndex: 'user',
width:220,
render: (val, record) => {
return <span>{val}</span>
}
},
{
title: '真实姓名',
dataIndex: 'nickname',
width:'15%',
render: (val,record) => {
return <span>{val}</span>
}
},
{
title: '账号',
dataIndex: 'account',
width:'15%',
render: (val,record) => {
return <span>{val}</span>
}
},
{
title: '岗位',
dataIndex: 'post',
render: (val, record) => {
return <span className="post-name">{val}</span>
}
},
{
title: '手机号',
dataIndex: 'phone',
render: (val, record) => {
return <span>{val}</span>;
}
},
{
title: '注册时间',
dataIndex: 'registerTime',
render: (val, record) => {
return <span>{val}</span>;
}
},
{
title: "操作",
key: "operate",
dataIndex: "operate",
render: (val, record) => {
return (
<div className="operate">
<div
className="operate__item"
>
删除
</div>
</div>
)
}
},
];
return (
<div className="user-table">
<XMTable
renderEmpty={{
image: college,
description: '暂无数据',
}}
bordered
size='middle'
pagination={false}
columns={columns}
scroll={{ x: 1300 }}
dataSource={courseList}
/>
<div className='box-footer'>
<PageControl
current={query.current}
pageSize={query.size}
total={total}
toPage={(page) => {
const queryStates = _.clone(query);
queryStates.current = page;
setQuery(queryStates);
}}
/>
</div>
</div>
);
}
export default withRouter(UserTable);
\ No newline at end of file
.user-table{
.post-name{
max-width: 100px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
\ No newline at end of file
/*
* @Author: wufan
* @Date: 2020-11-27 16:21:49
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-03 17:23:40
* @Description: Description
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
import React, { useState, useEffect } from "react";
import { Modal,Form,Input,Button,message} from "antd";
import User from '@/common/js/user';
import StoreService from "@/domains/store-domain/storeService";
import { DepType } from '@/domains/store-domain/constants';
import './AddOrEditPostGroupModal.less'
function AddOrEditPostGroupModal(props) {
const [nameErrorMsg,setNameErrorMsg] = useState('');
const [validateStatus,setValidateStatus] = useState('success');
const [postGroupName,setPostGroupName] = useState('');
useEffect(() => {
},[]);
function changePostGroupName(e){
let isError = false;
setValidateStatus('success');
setNameErrorMsg('');
props.postGroupTreeData.map((item,index)=>{
if(item.name === e.target.value){
setValidateStatus('error');
setNameErrorMsg(`该${props.label}已存在`);
isError = true;
}
return item;
})
if(!isError){
setPostGroupName(e.target.value);
}
}
function handleConfirm(){
if(props.modalOperateType === 'add'){
addGroup();
}else{
editGroup();
}
}
function addGroup(){
if(!postGroupName){
return;
}
const { postGroupModalLevel,currentTab,currentGroupData,label} = props
let parmas={
depLevel:postGroupModalLevel,
depType:DepType[currentTab],
departmentName:postGroupName,
enterpriseId:User.getEnterpriseId(),
source:0,
storeId:User.getStoreId(),
userId:User.getUserId()
}
if(postGroupModalLevel===0){
parmas.parentId = 0;
}else{
parmas.parentId = currentGroupData.id
}
StoreService.addDepartment(parmas).then((res) => {
message.success(`${label}创建成功`)
props.onConfirm();
});
}
function editGroup(){
if(!postGroupName){
return;
}
const {postGroupModalLevel,currentTab,currentGroupData,label} = props
let parmas={
departmentLevel:postGroupModalLevel,
departmentId:currentGroupData.id,
depType:DepType[currentTab],
departmentName:postGroupName,
enterpriseId:User.getEnterpriseId(),
source:0,
storeId:User.getStoreId(),
userId:User.getUserId()
}
if(postGroupModalLevel===0){
parmas.parentId = 0;
}else{
parmas.parentId = currentGroupData.parentId
}
StoreService.editDepartment(parmas).then((res) => {
message.success(`${label}修改成功`)
props.onConfirm();
});
}
return (
<Modal
visible={true}
title={props.title}
className="add-edit-post-group-modal"
onCancel={props.onClose}
width={448}
footer={[
<Button
id='cancel_allot_btn'
key="back" onClick={props.onClose}>取消</Button>,
<Button
id='confirm_allot_btn'
key="submit"
type="primary"
onClick={() => {
handleConfirm()
}}>
保存
</Button>
]}
maskClosable={false}
closeIcon={<span className="icon iconfont modal-close-icon">&#xe6ef;</span>}
>
<Form
labelCol={ {span:5 }}
>
<Form.Item
// label={`${props.label}名称`}
name={`${props.label}名称`}
rules={[{ required: true}]}
validateStatus={validateStatus}
help={nameErrorMsg}
>
<Input type="text" placeholder={`请输入${props.label}名称(8个字以内)`} maxLength={8} style={{ width: 348 }}
defaultValue={props.modalOperateType==='edit'?props.currentGroupData.name:''}
onChange={(e) => {
changePostGroupName(e);
}} />
</Form.Item>
</Form>
</Modal>
);
}
export default AddOrEditPostGroupModal;
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
.container-left-body-table{ .container-left-body-table{
width: 300px; width: 300px;
height: 330px; height: 330px;
overflow: scroll;
.ant-table { .ant-table {
border: none; border: none;
min-height: 250px !important; min-height: 250px !important;
......
/*
* @Author: wanghaofeng
* @date: 2020/11/14 17:42
* @Description:权限管理-选择成员弹窗
*/
import React from 'react';
import { Modal, Input, message, Tooltip,AutoComplete} from 'antd';
import { XMTable } from '@/components';
import college from '@/common/lottie/college.json';
import Service from '@/common/js/service';
import User from '@/common/js/user'
import SetEmployeeModal from "./SetEmployeeModal";
import search from '../../lottie/search/data.json';
import MemberTree from '../components/MemberTree'
import { DepType } from "@/domains/store-domain/constants";
import StoreService from "@/domains/store-domain/storeService";
import SearchUser from "../components/SearchUser"
import WWOpenDataCom from '@/components/WWOpenDataCom';
import './ChooseMembersModal.less';
import _ from 'underscore';
const { Search } = Input;
class NewChooseMembersModal extends React.Component {
constructor(props) {
super(props);
this.state = {
selectUserList:[],
selectObject: {},
openSetModal: false,
visible:this.props.visible,
completeOptions:[],
queryName:'',
open:false,
searchUserResultList:{}
}
}
componentDidMount() {
}
handleClose = ()=>{
this.props.close()
}
// 信息列表——右边
selectedColumnsRight = () => {
const selectColumns = [
{
title: '学员名',
key: 'nameRight',
dataIndex: 'userName',
width: '70%',
render: (value, record) => {
const { userName = '', avatar } = record;
return (
<div className='avatar'>
<span className="icon iconfont avatar-icon">&#xe84a;</span>
<Tooltip title={<WWOpenDataCom type="userName" openid={userName}/>}>
<span className='userImg'>
<WWOpenDataCom type="userName" openid={userName}/>
{/* {userName} */}
</span>
</Tooltip>
</div>
)
}
},{
title : '操作',
key : 'edit',
dataIndex : 'edit',
width : '30%',
align : 'right',
render: (value, record) => {
return (
<div className='edit' onClick={() => this.clearOneUser(record)}>
<span className="icon iconfont edit-icon">&#xe717;</span>
</div>
)
}
},
]
return selectColumns;
}
treeSelect = (record)=>{
// console.log('record',record)
this.setState({
selectUserList:record
})
}
clearOneUser = (record) =>{
console.log("record",record);
const {selectUserList} = this.state;
const _selectUserList = selectUserList.filter((item,index)=>{
return item.userId !== record.userId
})
console.log('selectUserList',selectUserList);
this.setState({
selectUserList:_selectUserList
})
}
// 清空所有成员
clearAllUser = () => {
this.setState({
selectUserList : [],
})
}
addCustomer = () => {
const { selectUserList } = this.state;
const { addDepType } = this.props;
let enterpriseUserList = []; // 保存新加进去的成员
enterpriseUserList = selectUserList.map((item) => {
const _item = {}
if(addDepType==='DEP_ORG'){
_item.depUserType = 'VISIBLE_USER';
_item.departmentId = item.departmentId;
_item.enterpriseVisibleUserId = item.userId;
}else{
_item.depUserType = 'STORE_USER';
_item.departmentId = this.props.selectDep.id;
_item.enterpriseVisibleUserId = item.enterpriseUserId;
}
return _item
})
const _params = {
storeId: User.getStoreId(),
depType:addDepType,
userAndDepartmentList:enterpriseUserList
}
Service.Hades('public/hades/addBatchUserAndDepartmentStoreCustomer', _params).then((res) => {
this.handleClose();
this.props.onConfirm();
})
}
// 批量添加成员(点击确定)
addUser = (selectUserList) => {
let enterpriseUserList = []; // 保存新加进去的成员
selectUserList.map((item) => {
enterpriseUserList.push({
roleCode: item.roleCode,
enterpriseVisibleUserId: item.userId
})
return enterpriseUserList
})
const _params = {
storeId: User.getStoreId(),
enterpriseUserList,
}
Service.Hades('public/hades/addBatchEnterpriseStoreUser', _params).then((res) => {
if (res.code === '200') {
this.props.onConfirm();
this.setState({
openSetModal: false,
})
}
})
}
renderTitle = (title) => {
return <span>{title}</span>
}
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>
})
}
{type === 'post' &&
<span>{item.parentName}</span>
}
</div>
),
});
notFoundContentNode = ()=>{
return <span>暂无数据</span>
}
Complete = () =>{
const {open,completeOptions,queryName} = this.state;
return <AutoComplete
dropdownClassName="certain-category-search-dropdown"
dropdownMatchSelectWidth={250}
allowClear
onChange={(value)=>{this.getCompleteOptionData(value)}}
notFoundContent={()=>{this.notFoundContentNode()}}
value={queryName}
open={open}
onFocus={()=>{this.setState({open:true})}}
onBlur={()=>{this.setState({open:false})}}
style={{
width: 250,
}}
options={completeOptions}
onSelect={()=>this.confirmSearchSelect()}
placeholder='搜索员工、部门'
>
</AutoComplete>
}
getCompleteOptionData=(value)=>{
if(!value){
this.setState({
searchUserResultList:{}
})
return
}
this.setState({
queryName:value
})
const params = {
distinct:true,
queryType:this.props.type,
depType:this.props.treeDepType,
queryName:value,
enterpriseId:User.getEnterpriseId(),
source:0,//0代表来自企培
storeId:User.getStoreId(),
userId:User.getUserId(),
whetherCount:false
}
StoreService.getDepartmentUser(params).then((res) => {
const { result = {}} = res;
this.setState({
searchUserResultList:result
})
});
}
confirmSearchSelect=(record,type)=>{
const { selectUserList } = this.state;
if(type==='user'){
this.setState({selectUserList:[...selectUserList,...record]});
}else{
let _list = [];
if(record.departmentUserVOList){
_list = record.departmentUserVOList;
}
console.log('_list',_list);
this.setState({selectUserList:[...selectUserList,..._list]},()=>{
console.log('selectUserList',this.state.selectUserList);
});
}
// }else{
// const params = {
// depType:this.props.treeDepType,
// enterpriseId: User.getEnterpriseId(),
// source: 0,
// storeId: User.getStoreId(),
// userId: User.getUserId(),
// departmentId:record.id
// }
// StoreService.getStoreCustomerAndDepNamePage(params).then((res) => {
// const { records = []} = res.result;
// this.setState({selectUserList:[...selectUserList,...records]});
// });
// }
}
render() {
const {type,treeDepType,selectDep={},addDepType=''} = this.props;
const { id=''} = selectDep;
const {selectUserList,selectObject,visible,openSetModal,searchUserResultList} = this.state;
const title = type === 'USER' ? '添加员工' : '添加学员';
return (
<div>
{/* 添加学员页面 */}
<Modal
className="choose-member-modal"
visible={visible}
onCancel={() => this.handleClose()}
onOk={() => {
if (User.getVersion() && User.getVersion().whetherReachUserNum) {
message.error("添加失败,企业使用人数超出限制")
return
}
if (_.isEmpty(selectUserList)) {
message.warning(type === 'USER' ? '请选择员工' : '请选择学员')
return null;
}
type === 'USER' ? this.setState({openSetModal:true,visible:false}) : this.addCustomer();
}}
okText={type === 'USER' ? '下一步' : '确定'}
title={title}
width={680}
maskClosable={false}
closeIcon={<span className="icon iconfont modal-close-icon">&#xe6ef;</span>}
>
<div className='member-container'>
<div className='container-left'>
<div className='container-left-body'>
{/* <Search
placeholder='搜索成员'
className='search search-input'
enterButton={<span className="icon iconfont">&#xe832;</span>}
/> */}
{/* {this.Complete()} */}
<SearchUser onChange={(value)=>{this.getCompleteOptionData(value)}} data={searchUserResultList} onSelect={(record,type)=>{this.confirmSearchSelect(record,type)}}/>
<div className='container-left-body-table'>
<MemberTree departmentId={id} treeDepType={treeDepType} nowTreeDepType={addDepType} onSelect={(record)=>{this.treeSelect(record)}} selectUserList={selectUserList} type={type}/>
</div>
</div>
</div>
{/* 已选择的成员列表 */}
<div className='container-right'>
<span className='span-left'>已选择{type === 'USER' ? '员工' : '学员'}</span>
<div className='span-right' onClick={() => this.clearAllUser()}>
<span className={ (selectUserList.length > 0) ? 'span-right-l' : null }>清空</span>
</div>
<div className='container-right-body'>
<XMTable
renderEmpty={{
image: college,
description: '暂无数据'
}}
rowKey={(record) => record.id}
dataSource={selectUserList}
columns={this.selectedColumnsRight()}
showHeader={false}
scroll={{ y: 375 }}
pagination={false}
size={'small'}
/>
</div>
</div>
</div>
</Modal>
{openSetModal &&
<SetEmployeeModal
list={selectUserList}
selectObject={selectObject}
onChange={(key, value) => {
selectObject[key] = value;
this.setState({ selectObject });
}}
onClose={() => {
// this.setState({ openSetModal: true},()=>{this.handleClose()})
this.setState({ openSetModal: false, visible: true })
}}
onCancel={() => {
this.handleClose();
this.setState({ openSetModal: false });
}}
onOk={(list) => {
this.addUser(list);
}}
/>
}
</div>
)
}
}
export default NewChooseMembersModal;
\ No newline at end of file
import React from 'react'; import React from 'react';
import { Modal, Button, Radio, Tooltip } from 'antd'; import { Modal, Button, Radio, Tooltip } from 'antd';
import WWOpenDataCom from '@/components/WWOpenDataCom';
import './SetEmployeeModal.less' import './SetEmployeeModal.less'
const RadioGroup = Radio.Group; const RadioGroup = Radio.Group;
...@@ -13,13 +14,13 @@ export default class SetEmployeeModal extends React.Component { ...@@ -13,13 +14,13 @@ export default class SetEmployeeModal extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
const list = props.list.map(item => { const list = props.list.map(item => {
item.roleCode = (props.selectObject || {})[item.enterpriseVisibleUserId] || (item.enterpriseRole === 'ADMIN' ? 'Cloud_Manager' : 'Cloud_Lecturer'); item.roleCode = (props.selectObject || {})[item.userId] || (item.enterpriseRole === 'ADMIN' ? 'Cloud_Manager' : 'Cloud_Lecturer');
return item; return item;
}) })
const selectedData = list[0] || {}; const selectedData = list[0] || {};
this.state = { this.state = {
list, list,
selected: selectedData.enterpriseVisibleUserId, selected: selectedData.userId,
roleCode: selectedData.roleCode, roleCode: selectedData.roleCode,
} }
} }
...@@ -27,7 +28,7 @@ export default class SetEmployeeModal extends React.Component { ...@@ -27,7 +28,7 @@ export default class SetEmployeeModal extends React.Component {
handleChangeValues(value) { handleChangeValues(value) {
const { list, selected } = this.state; const { list, selected } = this.state;
list.map((item) => { list.map((item) => {
if (item.enterpriseVisibleUserId === selected) { if (item.userId === selected) {
item.roleCode = value; item.roleCode = value;
} }
}) })
...@@ -62,15 +63,18 @@ export default class SetEmployeeModal extends React.Component { ...@@ -62,15 +63,18 @@ export default class SetEmployeeModal extends React.Component {
<div className="employee-box"> <div className="employee-box">
{list.map((item) => ( {list.map((item) => (
<div <div
className={`item ${selected === item.enterpriseVisibleUserId ? ' selected' : ''}`} className={`item ${selected === item.userId ? ' selected' : ''}`}
key={item.enterpriseVisibleUserId} key={item.userId}
onClick={() => { onClick={() => {
this.setState({ selected: item.enterpriseVisibleUserId, roleCode: item.roleCode }) this.setState({ selected: item.userId, roleCode: item.roleCode })
}} }}
> >
<span className="icon iconfont avatar-icon">&#xe84a;</span> <span className="icon iconfont avatar-icon">&#xe84a;</span>
<Tooltip title={item.name}> <Tooltip title={item.name}>
<span className='name'>{item.name}</span> <span className='name'>
{/* {item.userName} */}
<WWOpenDataCom type="userName" openid={item.userName}/>
</span>
</Tooltip> </Tooltip>
<span className="tag">{tagMap[item.roleCode]}</span> <span className="tag">{tagMap[item.roleCode]}</span>
</div> </div>
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
padding: 24px 60px 60px 40px !important; padding: 24px 60px 60px 40px !important;
} }
.label{ .label{
width:84px; width:100px;
text-align:right; text-align:right;
font-size: 14px; font-size: 14px;
color: #666666; color: #666666;
...@@ -37,10 +37,10 @@ ...@@ -37,10 +37,10 @@
color:#FFF; color:#FFF;
font-size:22px; font-size:22px;
} }
&:hover{ // &:hover{
display: inline-block; // display: inline-block;
opacity:0.5; // opacity:0.5;
} // }
} }
} }
.name-item{ .name-item{
...@@ -58,7 +58,8 @@ ...@@ -58,7 +58,8 @@
} }
} }
.save-btn { .save-btn {
margin-left: 92px; margin-top:20px;
margin-left: 106px;
} }
} }
\ No newline at end of file
/* /*
* @Author: zhangleyuan * @Author: zhangleyuan
* @Date: 2020-11-27 15:06:31 * @Date: 2020-11-27 15:06:31
* @LastEditors: wufan * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-05-28 15:31:06 * @LastEditTime: 2021-08-05 10:26:25
* @Description: 描述一下 * @Description: 描述一下
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -17,6 +17,7 @@ import IdentificationModal from "./IdentificationModal"; ...@@ -17,6 +17,7 @@ import IdentificationModal from "./IdentificationModal";
import ChangePhoneModal from "./ChangePhoneModal"; import ChangePhoneModal from "./ChangePhoneModal";
import BaseService from "@/domains/basic-domain/baseService"; import BaseService from "@/domains/basic-domain/baseService";
import StoreService from "@/domains/store-domain/storeService"; import StoreService from "@/domains/store-domain/storeService";
import WWOpenDataCom from '@/components/WWOpenDataCom';
import User from "@/common/js/user"; import User from "@/common/js/user";
import "./index.less"; import "./index.less";
import { XMContext } from "@/store/context"; import { XMContext } from "@/store/context";
...@@ -35,7 +36,7 @@ function PersonalInfoPage() { ...@@ -35,7 +36,7 @@ function PersonalInfoPage() {
const [roleCodes, setRoleCodes] = useState([]); const [roleCodes, setRoleCodes] = useState([]);
const [phone, setPhone] = useState(""); const [phone, setPhone] = useState("");
const [weChatAccount, setWeChatAccount] = useState(""); const [weChatAccount, setWeChatAccount] = useState("");
const [departmentList,setDepartmentList] = useState([]);
const storeUserId = User.getStoreUserId(); const storeUserId = User.getStoreUserId();
const ctx: any = useContext(XMContext); const ctx: any = useContext(XMContext);
const userId = User.getUserId(); const userId = User.getUserId();
...@@ -51,11 +52,12 @@ function PersonalInfoPage() { ...@@ -51,11 +52,12 @@ function PersonalInfoPage() {
storeUserId: User.getStoreUserId(), storeUserId: User.getStoreUserId(),
}; };
BaseService.getStoreUser(param).then((res) => { BaseService.getStoreUser(param).then((res) => {
const { nickName, phone, roleCodes, weChatAccount } = res.result; const { nickName, phone, roleCodes, weChatAccount,depNameList=[]} = res.result;
setNickName(nickName); setNickName(nickName);
setPhone(phone); setPhone(phone);
setRoleCodes(roleCodes); setRoleCodes(roleCodes);
setWeChatAccount(weChatAccount); setWeChatAccount(weChatAccount);
setDepartmentList(depNameList)
if (res.result.avatar) { if (res.result.avatar) {
setAvatar(res.result.avatar); setAvatar(res.result.avatar);
} }
...@@ -122,7 +124,6 @@ function PersonalInfoPage() { ...@@ -122,7 +124,6 @@ function PersonalInfoPage() {
setPhone(phone); setPhone(phone);
} }
console.log('User.getStoreType()',User.getStoreType());
return ( return (
<div className="page personal-info-page"> <div className="page personal-info-page">
<div className="content-header">个人设置</div> <div className="content-header">个人设置</div>
...@@ -130,18 +131,7 @@ console.log('User.getStoreType()',User.getStoreType()); ...@@ -130,18 +131,7 @@ console.log('User.getStoreType()',User.getStoreType());
<Form> <Form>
<div className="avatat-item"> <div className="avatat-item">
<span className="label">头像:</span> <span className="label">头像:</span>
<input
type="file"
accept="image/*"
value={""}
id="CrpperAvatarPic"
style={{ display: "none" }}
onChange={_handleUpdateAvatar}
/>
<img className="avatar" src={avatar}></img> <img className="avatar" src={avatar}></img>
<span className="avatar-cover" onClick={_onUpload}>
<span className="icon iconfont pen">&#xe82c;</span>
</span>
{cropperModalVisible && ( {cropperModalVisible && (
<CropperModal <CropperModal
imgUrl={imgUrl} imgUrl={imgUrl}
...@@ -162,9 +152,13 @@ console.log('User.getStoreType()',User.getStoreType()); ...@@ -162,9 +152,13 @@ console.log('User.getStoreType()',User.getStoreType());
}} }}
/> />
</div> </div>
<div className="phone-item">
<span className="label">企业微信姓名:</span>
<span><WWOpenDataCom type="userName" openid={weChatAccount}/></span>
</div>
{isWorkWechat ? ( {isWorkWechat ? (
<div className="phone-item"> <div className="phone-item">
<span className="label">企业微信号:</span> <span className="label">企业微信号:</span>
<span>{weChatAccount}</span> <span>{weChatAccount}</span>
</div> </div>
) : ( ) : (
...@@ -181,6 +175,12 @@ console.log('User.getStoreType()',User.getStoreType()); ...@@ -181,6 +175,12 @@ console.log('User.getStoreType()',User.getStoreType());
</Button> </Button>
</div> </div>
)} )}
<div>
<span className="label">所在部门:</span>
{departmentList.map((item,index)=>{
return <span><WWOpenDataCom type="departmentName" openid={item}/>{index<departmentList.length-1?'、':''}</span>
})}
</div>
<div className="save-btn"> <div className="save-btn">
<Button <Button
type="primary" type="primary"
......
/* /*
* @Author: zhangleyuan * @Author: zhangleyuan
* @Date: 2021-02-20 16:46:46 * @Date: 2021-02-20 16:46:46
* @LastEditors: wufan * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-07-16 11:29:13 * @LastEditTime: 2021-07-21 16:03:02
* @Description: 描述一下 * @Description: 描述一下
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2019-07-10 10:30:49 * @Date: 2019-07-10 10:30:49
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-06-22 17:47:02 * @LastEditTime: 2021-07-19 16:21:07
* @Description: * @Description:
*/ */
import React, { useContext, useEffect, useState } from 'react'; import React, { useContext, useEffect, useState } from 'react';
...@@ -16,9 +16,10 @@ import User from '@/common/js/user'; ...@@ -16,9 +16,10 @@ import User from '@/common/js/user';
import BaseService from "@/domains/basic-domain/baseService"; import BaseService from "@/domains/basic-domain/baseService";
import moment from 'moment'; import moment from 'moment';
import { VersionContext, VersionInfo, XMContext } from '@/store/context'; import { VersionContext, VersionInfo, XMContext } from '@/store/context';
import { setStoreGroupPermission, setStorePermission, setStoreGroupList, setStoreList } from '@/store/actions/index'; import { setStoreGroupPermission, setStorePermission, setStoreGroupList, setStoreList, setWechatLogin } from '@/store/actions/index';
import Service from "@/common/js/service"; import Service from "@/common/js/service";
import Bus from '@/core/tbus'; import Bus from '@/core/tbus';
import WechatApi from '@/common/js/wechatApi';
import { func } from 'prop-types'; import { func } from 'prop-types';
const { Footer, Sider, Content } = Layout; const { Footer, Sider, Content } = Layout;
...@@ -28,14 +29,16 @@ declare var window: any; ...@@ -28,14 +29,16 @@ declare var window: any;
const App: React.FC = (props: any) => { const App: React.FC = (props: any) => {
const [storeUserId, setStoreUserId] = useState('') const [storeUserId, setStoreUserId] = useState('')
const ctx: any = useContext(XMContext); const ctx: any = useContext(XMContext);
const [versionInfo, setVersionInfo] = useState<VersionInfo|null>(null) const [versionInfo, setVersionInfo] = useState<VersionInfo | null>(null)
const userId = User.getUserId(); const userId = User.getUserId();
const [menuType, setMenuType] = useState(true); const [menuType, setMenuType] = useState(true);
const [initWechat, setInitWechat] = useState(false);
const enterpriseId = User.getEnterpriseId(); const enterpriseId = User.getEnterpriseId();
window.ctx = ctx; window.ctx = ctx;
useEffect(() => { useEffect(() => {
initWechatConfig();
getStoreAndUserInfo(); getStoreAndUserInfo();
getVersion(); getVersion();
if (window.location.hash === "#/") { if (window.location.hash === "#/") {
...@@ -44,7 +47,13 @@ const App: React.FC = (props: any) => { ...@@ -44,7 +47,13 @@ const App: React.FC = (props: any) => {
}) })
} }
}, []) }, [])
async function initWechatConfig() {
WechatApi.initConfig({ isAgentConfig: true, url: window.location.href.split('#')[0] }).then(() => {
ctx.dispatch(setWechatLogin(true))
})
}
useEffect(() => { useEffect(() => {
getStorePermission(); getStorePermission();
}, [window.location.hash]) }, [window.location.hash])
...@@ -66,7 +75,7 @@ const App: React.FC = (props: any) => { ...@@ -66,7 +75,7 @@ const App: React.FC = (props: any) => {
let version = res.result; let version = res.result;
User.setVersion(version); User.setVersion(version);
User.setExpirationTime(res.result.validEndTime) User.setExpirationTime(res.result.validEndTime)
let versioninfo:VersionInfo = { let versioninfo: VersionInfo = {
dayTime: version.dayTime, dayTime: version.dayTime,
stateEnum: version.stateEnum, stateEnum: version.stateEnum,
userNum: version.userNum === -1 ? '不限人数' : version.userNum, userNum: version.userNum === -1 ? '不限人数' : version.userNum,
...@@ -85,30 +94,30 @@ const App: React.FC = (props: any) => { ...@@ -85,30 +94,30 @@ const App: React.FC = (props: any) => {
async function getStoreAndUserInfo() { async function getStoreAndUserInfo() {
await (enterpriseId ? getStoreInfo() : getStoreGroupAndStoreList()); await (enterpriseId ? getStoreInfo() : getStoreGroupAndStoreList());
} }
function getStoreInfo() { function getStoreInfo() {
console.log("currentStoreUserInfo",window.currentStoreUserInfo); console.log("currentStoreUserInfo", window.currentStoreUserInfo);
const params = { const params = {
storeId: User.getStoreId(), storeId: User.getStoreId(),
userId: User.getUserId(), userId: User.getUserId(),
}; };
Service.Hades('public/customerHades/getStoreAndUserMsg', params).then((res) => { Service.Hades('public/customerHades/getStoreAndUserMsg', params).then((res) => {
if(res.success){ if (res.success) {
const { id, storeUserId, storeName, userRole, storeType } = res.result; const { id, storeUserId, storeName, userRole, storeType } = res.result;
User.setStoreId(id); User.setStoreId(id);
User.setStoreUserId(storeUserId); User.setStoreUserId(storeUserId);
User.setStoreName(storeName); User.setStoreName(storeName);
Bus.trigger('storeNameChange',storeName); Bus.trigger('storeNameChange', storeName);
User.setUserRole(userRole); User.setUserRole(userRole);
User.setStoreType(storeType); User.setStoreType(storeType);
setCurrentStoreUserInfo(id,storeUserId) setCurrentStoreUserInfo(id, storeUserId)
setStoreUserId(storeUserId); setStoreUserId(storeUserId);
getUserPermission(); getUserPermission();
} }
}) })
} }
function setCurrentStoreUserInfo(storeId:any,storeUserId:any){ function setCurrentStoreUserInfo(storeId: any, storeUserId: any) {
window.currentStoreUserInfo.storeId = storeId; window.currentStoreUserInfo.storeId = storeId;
window.currentStoreUserInfo.storeUserId = storeUserId; window.currentStoreUserInfo.storeUserId = storeUserId;
window.currentStoreUserInfo.userId = User.getUserId(); window.currentStoreUserInfo.userId = User.getUserId();
...@@ -134,7 +143,7 @@ const App: React.FC = (props: any) => { ...@@ -134,7 +143,7 @@ const App: React.FC = (props: any) => {
Bus.trigger('storeNameChange', storeName); Bus.trigger('storeNameChange', storeName);
User.setUserRole(userRole); User.setUserRole(userRole);
User.setStoreType(storeType); User.setStoreType(storeType);
setCurrentStoreUserInfo(id,storeUserId); setCurrentStoreUserInfo(id, storeUserId);
ctx.dispatch(setStoreGroupList(storeGroupVOS)) ctx.dispatch(setStoreGroupList(storeGroupVOS))
ctx.dispatch(setStoreList(storeVOS)); ctx.dispatch(setStoreList(storeVOS));
setStoreUserId(storeUserId) setStoreUserId(storeUserId)
......
...@@ -5,6 +5,8 @@ import BaseService from "@/domains/basic-domain/baseService"; ...@@ -5,6 +5,8 @@ import BaseService from "@/domains/basic-domain/baseService";
import User from "@/common/js/user"; import User from "@/common/js/user";
import { LIVE_SHARE } from "@/domains/course-domain/constants"; import { LIVE_SHARE } from "@/domains/course-domain/constants";
import { Modal, message } from 'antd'; import { Modal, message } from 'antd';
import WechatApi from '@/common/js/wechatApi';
import WWOpenDataCom from '@/components/WWOpenData';
import './CollegeManagePage.less'; import './CollegeManagePage.less';
import storage from '@/common/js/storage'; import storage from '@/common/js/storage';
...@@ -18,9 +20,9 @@ const roleMap = { ...@@ -18,9 +20,9 @@ const roleMap = {
function ExpirationPopover(props) { function ExpirationPopover(props) {
const [showType, setShowType] = useState(0); //0不显示,1剩余30天,2小于等于7天,3已过期 const [showType, setShowType] = useState(0); //0不显示,1剩余30天,2小于等于7天,3已过期
useEffect(()=> { useEffect(() => {
if (props.surplusDayTime === 0 ) { if (props.surplusDayTime === 0) {
//已过期 //已过期
let loginflag = storage.get("expiration_tip_login") let loginflag = storage.get("expiration_tip_login")
if (loginflag === null || loginflag === "true") { if (loginflag === null || loginflag === "true") {
...@@ -31,7 +33,7 @@ function ExpirationPopover(props) { ...@@ -31,7 +33,7 @@ function ExpirationPopover(props) {
} }
//即将过期 //即将过期
if (props.surplusDayTime === 30 || props.surplusDayTime <= 7) { if (props.surplusDayTime === 30 || props.surplusDayTime <= 7) {
let daysflag = storage.get("expiration_tip"+User.getUserId()+"_days") let daysflag = storage.get("expiration_tip" + User.getUserId() + "_days")
if (daysflag === null || daysflag !== moment().format("YYYYMMDD")) { if (daysflag === null || daysflag !== moment().format("YYYYMMDD")) {
setShowType(2) setShowType(2)
} }
...@@ -52,12 +54,12 @@ function ExpirationPopover(props) { ...@@ -52,12 +54,12 @@ function ExpirationPopover(props) {
// setShowType(2) // setShowType(2)
// } // }
// } // }
},[props.endTime,props.surplusDayTime]) }, [props.endTime, props.surplusDayTime])
function iknow() { function iknow() {
storage.set("expiration_tip_login",false) storage.set("expiration_tip_login", false)
storage.set("expiration_tip"+User.getUserId()+"_days",moment().format("YYYYMMDD")) storage.set("expiration_tip" + User.getUserId() + "_days", moment().format("YYYYMMDD"))
/* /*
if (props.surplusDayTime === 0 ) { if (props.surplusDayTime === 0 ) {
//已过期 //已过期
...@@ -79,27 +81,27 @@ function ExpirationPopover(props) { ...@@ -79,27 +81,27 @@ function ExpirationPopover(props) {
return ( return (
<> <>
{ {
showType === 0 ? ("") :( showType === 0 ? ("") : (
<div className="expirationpopover"> <div className="expirationpopover">
<div className="dialog"> <div className="dialog">
<div className="title">{props.surplusDayTime === 0 ? "服务已到期":"服务到期提醒"}</div> <div className="title">{props.surplusDayTime === 0 ? "服务已到期" : "服务到期提醒"}</div>
{ {
showType === 3 ? ( showType === 3 ? (
<div className="tip-text">当前企业购买的小麦企学院服务已于<span style={{color:"#FF4F4F"}}>{moment(props.endTime).format("YYYY-MM-DD HH:mm:ss")}</span>到期,到期后仍可访问,但功能不可使用,建议尽快续费购买哦~</div> <div className="tip-text">当前企业购买的小麦企学院服务已于<span style={{ color: "#FF4F4F" }}>{moment(props.endTime).format("YYYY-MM-DD HH:mm:ss")}</span>到期,到期后仍可访问,但功能不可使用,建议尽快续费购买哦~</div>
) : ( ) : (
<div className="tip-text">当前企业购买的小麦企学院服务 <span style={{color:"#FF4F4F"}}>仅剩{props.surplusDayTime}</span>(于<span>{moment(props.endTime).format("YYYY-MM-DD")}</span>到期),为了不影响使用,建议尽快续费购买哦~</div> <div className="tip-text">当前企业购买的小麦企学院服务 <span style={{ color: "#FF4F4F" }}>仅剩{props.surplusDayTime}</span>(于<span>{moment(props.endTime).format("YYYY-MM-DD")}</span>到期),为了不影响使用,建议尽快续费购买哦~</div>
) )
} }
<div className="qrcode"> <div className="qrcode">
<img src="https://cdn.xiaomai5.com/qixueyuankehu.png" alt=""></img> <img src="https://cdn.xiaomai5.com/qixueyuankehu.png" alt=""></img>
<div className="des">微信/企业微信扫码咨询</div> <div className="des">微信/企业微信扫码咨询</div>
</div>
<div className="phone"><svg style={{ position: "relative", top: "2px", marginRight: "4px" }} viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M512.651 3.78c-281.433 0-509.21 228.324-509.21 509.209 0 281.43 228.325 509.203 509.21 509.203 281.427 0 509.202-228.317 509.202-509.203 0.55-280.885-227.775-509.21-509.202-509.21z m198.205 743.553c-36.14 36.136-169.737 1.641-302.24-130.312-131.953-131.959-165.902-266.104-129.768-301.695 31.211-31.21 68.99-85.417 125.939-14.782 56.943 70.629 29.016 90.34-3.291 122.647-22.449 22.448 24.642 79.392 73.37 128.125 49.283 48.73 105.678 95.818 128.126 73.368 32.306-32.305 52.017-60.23 122.646-3.288 71.182 56.949 16.426 95.276-14.782 125.937z" p-id="4409" fill="#999999"></path></svg>
咨询电话:19157875632</div>
<div className="button" onClick={iknow}>我知道了</div>
</div>
</div> </div>
<div className="phone"><svg style={{position:"relative",top:"2px",marginRight:"4px"}} viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M512.651 3.78c-281.433 0-509.21 228.324-509.21 509.209 0 281.43 228.325 509.203 509.21 509.203 281.427 0 509.202-228.317 509.202-509.203 0.55-280.885-227.775-509.21-509.202-509.21z m198.205 743.553c-36.14 36.136-169.737 1.641-302.24-130.312-131.953-131.959-165.902-266.104-129.768-301.695 31.211-31.21 68.99-85.417 125.939-14.782 56.943 70.629 29.016 90.34-3.291 122.647-22.449 22.448 24.642 79.392 73.37 128.125 49.283 48.73 105.678 95.818 128.126 73.368 32.306-32.305 52.017-60.23 122.646-3.288 71.182 56.949 16.426 95.276-14.782 125.937z" p-id="4409" fill="#999999"></path></svg>
咨询电话:19157875632</div>
<div className="button" onClick={iknow}>我知道了</div>
</div>
</div>
) )
} }
</> </>
...@@ -115,9 +117,10 @@ export default class CollegeManagePage extends React.Component { ...@@ -115,9 +117,10 @@ export default class CollegeManagePage extends React.Component {
list: [], list: [],
enterpriseId: User.getEnterpriseId(), enterpriseId: User.getEnterpriseId(),
isAdmin: false, isAdmin: false,
createStoreList:[], createStoreList: [],
joinStoreList:[], joinStoreList: [],
surplusDayTime:365, //剩余天数 initWechat: false,
surplusDayTime: 365, //剩余天数
endTime: 0, //有效截至时间 endTime: 0, //有效截至时间
}; };
} }
...@@ -126,8 +129,16 @@ export default class CollegeManagePage extends React.Component { ...@@ -126,8 +129,16 @@ export default class CollegeManagePage extends React.Component {
this.getStoreList(); this.getStoreList();
this.getEnterpriseUser(); this.getEnterpriseUser();
this.getVersion() this.getVersion()
} }
initWechatConfig() {
WechatApi.initConfig({ isAgentConfig: true, url: window.location.href.split('#')[0] }).then(() => {
this.setState({ initWechat: true })
})
}
getEnterpriseUser() { getEnterpriseUser() {
const { enterpriseId } = this.state; const { enterpriseId } = this.state;
const params = { const params = {
...@@ -142,16 +153,16 @@ export default class CollegeManagePage extends React.Component { ...@@ -142,16 +153,16 @@ export default class CollegeManagePage extends React.Component {
getVersion() { getVersion() {
BaseService.getLesseeVersionMsg() BaseService.getLesseeVersionMsg()
.then(res=> { .then(res => {
User.setVersion(res.result) User.setVersion(res.result)
User.setExpirationTime(res.result.validEndTime) User.setExpirationTime(res.result.validEndTime)
this.setState({ this.setState({
surplusDayTime: res.result.stateEnum === "NO" ? 0 : res.result.surplusDayTime, surplusDayTime: res.result.stateEnum === "NO" ? 0 : res.result.surplusDayTime,
endTime: res.result.validEndTime endTime: res.result.validEndTime
})
}) })
})
} }
getStoreList() { getStoreList() {
const { enterpriseId } = this.state; const { enterpriseId } = this.state;
if (!enterpriseId) return null; if (!enterpriseId) return null;
...@@ -166,13 +177,14 @@ export default class CollegeManagePage extends React.Component { ...@@ -166,13 +177,14 @@ export default class CollegeManagePage extends React.Component {
User.setStoreId(mainStore.id); User.setStoreId(mainStore.id);
User.setStoreUserId(mainStore.storeUserId); User.setStoreUserId(mainStore.storeUserId);
} }
const createStoreList = list.filter((item)=>{ this.initWechatConfig();
const createStoreList = list.filter((item) => {
return item.userRole === 'StoreManager' return item.userRole === 'StoreManager'
}) })
const joinStoreList = list.filter((item)=>{ const joinStoreList = list.filter((item) => {
return item.userRole !== 'StoreManager' return item.userRole !== 'StoreManager'
}) })
this.setState({createStoreList:createStoreList,joinStoreList:joinStoreList}) this.setState({ createStoreList: createStoreList, joinStoreList: joinStoreList })
}); });
} }
checkCollege(item, bool) { checkCollege(item, bool) {
...@@ -218,13 +230,14 @@ export default class CollegeManagePage extends React.Component { ...@@ -218,13 +230,14 @@ export default class CollegeManagePage extends React.Component {
} }
handleLogout() { handleLogout() {
BaseService.logout({identifier:User.getIdentifier()}).then((res) => { BaseService.logout({ identifier: User.getIdentifier() }).then((res) => {
User.removeUserId(); User.removeUserId();
User.removeToken(); User.removeToken();
User.removeEnterpriseId(); User.removeEnterpriseId();
User.clearUserInfo(); window.RCHistory.replace('/login');
const htmlUrl = `${LIVE_SHARE}store/index?id=${User.getCustomerStoreId()||User.getStoreId()}&userId=${User.getUserId()}&from=work_weixin`; // User.clearUserInfo();
window.location.href = htmlUrl; // const htmlUrl = `${LIVE_SHARE}store/index?id=${User.getCustomerStoreId()||User.getStoreId()}&userId=${User.getUserId()}&from=work_weixin`;
// window.location.href = htmlUrl;
}); });
} }
...@@ -235,17 +248,23 @@ export default class CollegeManagePage extends React.Component { ...@@ -235,17 +248,23 @@ export default class CollegeManagePage extends React.Component {
list, list,
isAdmin, isAdmin,
createStoreList, createStoreList,
joinStoreList joinStoreList,
initWechat
} = this.state; } = this.state;
return ( return (
<div className="college-manage-page"> <div className="college-manage-page">
<ExpirationPopover surplusDayTime={this.state.surplusDayTime} endTime={this.state.endTime}/> <ExpirationPopover surplusDayTime={this.state.surplusDayTime} endTime={this.state.endTime} />
<div className="college-header"> <div className="college-header">
<div className="box"> <div className="box">
<img className="box-image" src="https://image.xiaomaiketang.com/xm/fe4NCjr7XF.png" /> <img className="box-image" src="https://image.xiaomaiketang.com/xm/fe4NCjr7XF.png" />
<div className="user"> <div className="user">
<img className="image" src={avatar} /> <img className="image" src={avatar} />
<span className="name">{name}</span> <span className="name">
{
initWechat && <WWOpenDataCom type="userName" openid={name} />
}
</span>
<span <span
className="logout" className="logout"
onClick={() => { onClick={() => {
...@@ -269,7 +288,11 @@ export default class CollegeManagePage extends React.Component { ...@@ -269,7 +288,11 @@ export default class CollegeManagePage extends React.Component {
<div className="college-box"> <div className="college-box">
<div className="user"> <div className="user">
<img className="image" src={avatar} /> <img className="image" src={avatar} />
<span className="name">{name}</span> <span className="name">
{
initWechat && <WWOpenDataCom type="userName" openid={name} />
}
</span>
</div> </div>
<div> <div>
<div className="title-box"> <div className="title-box">
...@@ -300,7 +323,7 @@ export default class CollegeManagePage extends React.Component { ...@@ -300,7 +323,7 @@ export default class CollegeManagePage extends React.Component {
<div className="title">{item.storeName}</div> <div className="title">{item.storeName}</div>
<div className="time">{moment(item.createTime).format('YYYY-MM-DD HH:mm')}</div> <div className="time">{moment(item.createTime).format('YYYY-MM-DD HH:mm')}</div>
<div className="control-box"> <div className="control-box">
{item.userRole === 'StoreManager' && item.state === 'VALID' && {item.userRole === 'StoreManager' && item.state === 'VALID' &&
<span <span
className="control-button" className="control-button"
onClick={(e) => { onClick={(e) => {
...@@ -348,76 +371,76 @@ export default class CollegeManagePage extends React.Component { ...@@ -348,76 +371,76 @@ export default class CollegeManagePage extends React.Component {
} }
</div> </div>
</div> </div>
{ joinStoreList.length > 0 && {joinStoreList.length > 0 &&
<div className="join-container"> <div className="join-container">
<div className="title-box"> <div className="title-box">
<span className="title">我加入的({joinStoreList.length})</span> <span className="title">我加入的({joinStoreList.length})</span>
</div> </div>
<div className="college-list"> <div className="college-list">
{joinStoreList.map((item) => ( {joinStoreList.map((item) => (
<div <div
key={item.id} key={item.id}
className={`college-item${item.state === 'VALID' ? '' : ' disabled'}${item.userRole === 'StoreManager' ? ' enabled' : ''}`} className={`college-item${item.state === 'VALID' ? '' : ' disabled'}${item.userRole === 'StoreManager' ? ' enabled' : ''}`}
onClick={() => { onClick={() => {
if (item.state !== 'VALID') { if (item.state !== 'VALID') {
message.warning('学院已停用,请启用后使用或联系学院管理员'); message.warning('学院已停用,请启用后使用或联系学院管理员');
return null; return null;
}; };
User.setStoreId(item.id); User.setStoreId(item.id);
User.setStoreUserId(item.storeUserId); User.setStoreUserId(item.storeUserId);
window.currentStoreUserInfo.storeId = item.id; window.currentStoreUserInfo.storeId = item.id;
window.currentStoreUserInfo.storeUserId = item.storeUserId; window.currentStoreUserInfo.storeUserId = item.storeUserId;
window.RCHistory.push('/home') window.RCHistory.push('/home')
}} }}
> >
<div className="header"> <div className="header">
<img className="image" src={item.logo || "https://image.xiaomaiketang.com/xm/fe4NCjr7XF.png"} /> <img className="image" src={item.logo || "https://image.xiaomaiketang.com/xm/fe4NCjr7XF.png"} />
<span className="tag">{roleMap[item.userRole]}</span> <span className="tag">{roleMap[item.userRole]}</span>
</div> </div>
<div className="title">{item.storeName}</div> <div className="title">{item.storeName}</div>
<div className="time">{moment(item.createTime).format('YYYY-MM-DD HH:mm')}</div> <div className="time">{moment(item.createTime).format('YYYY-MM-DD HH:mm')}</div>
<div className="control-box"> <div className="control-box">
{item.userRole === 'StoreManager' && item.state === 'VALID' && !item.mainStore && {item.userRole === 'StoreManager' && item.state === 'VALID' && !item.mainStore &&
<span
className="control-button"
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
User.setStoreId(item.id);
User.setStoreUserId(item.storeUserId);
window.currentStoreUserInfo.storeId = item.id;
window.currentStoreUserInfo.storeUserId = item.storeUserId;
window.RCHistory.push('/college-info')
}}
>编辑</span>
}
{((item.userRole === 'StoreManager' && !item.mainStore) || item.state !== 'VALID') &&
<span
className="control-button"
onClick={(e) => {
if (item.state !== 'VALID') return null;
e.preventDefault();
e.stopPropagation();
this.checkCollege(item, false);
}}
>{item.state === 'VALID' ? '停用' : '已停用'}</span>
}
<span <span
className="control-button" className="control-button disable-button"
onClick={(e) => { onClick={(e) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
User.setStoreId(item.id); this.changeCollege(item, true);
User.setStoreUserId(item.storeUserId);
window.currentStoreUserInfo.storeId = item.id;
window.currentStoreUserInfo.storeUserId = item.storeUserId;
window.RCHistory.push('/college-info')
}} }}
>编辑</span> >启用</span>
} </div>
{((item.userRole === 'StoreManager' && !item.mainStore) || item.state !== 'VALID') &&
<span
className="control-button"
onClick={(e) => {
if (item.state !== 'VALID') return null;
e.preventDefault();
e.stopPropagation();
this.checkCollege(item, false);
}}
>{item.state === 'VALID' ? '停用' : '已停用'}</span>
}
<span
className="control-button disable-button"
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
this.changeCollege(item, true);
}}
>启用</span>
</div> </div>
</div> ))}
))} </div>
</div> </div>
</div>
} }
</div> </div>
</div> </div>
) )
} }
......
...@@ -71,9 +71,10 @@ export default class ErrorCollege extends React.Component { ...@@ -71,9 +71,10 @@ export default class ErrorCollege extends React.Component {
User.removeUserId(); User.removeUserId();
User.removeToken(); User.removeToken();
User.removeEnterpriseId(); User.removeEnterpriseId();
User.clearUserInfo(); window.RCHistory.replace('/login');
const url = `${LIVE_SHARE}store/index?id=${User.getCustomerStoreId()||User.getStoreId()}&userId=${User.getUserId()}&from=work_weixin`; // User.clearUserInfo();
window.location.href = url; // const url = `${LIVE_SHARE}store/index?id=${User.getCustomerStoreId()||User.getStoreId()}&userId=${User.getUserId()}&from=work_weixin`;
// window.location.href = url;
}); });
} }
......
/* /*
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2019-09-10 18:26:03 * @Date: 2019-09-10 18:26:03
* @LastEditors: Please set LastEditors * @LastEditors: yuananting
* @LastEditTime: 2021-07-20 17:39:52 * @LastEditTime: 2021-08-05 19:50:53
* @Description: * @Description:
*/ */
import React, { useRef, useContext, useEffect, useState } from 'react'; import React, { useRef, useContext, useEffect, useState } from 'react';
...@@ -19,6 +19,7 @@ import CourseService from '@/domains/course-domain/CourseService'; ...@@ -19,6 +19,7 @@ import CourseService from '@/domains/course-domain/CourseService';
import qrcode from '@/libs/qrcode/qrcode.js'; import qrcode from '@/libs/qrcode/qrcode.js';
import Bus from '@/core/tbus'; import Bus from '@/core/tbus';
import ClickOutside from '../../components/ClickOutside'; import ClickOutside from '../../components/ClickOutside';
import WWOpenDataCom from '@/components/WWOpenDataCom';
import _ from 'underscore'; import _ from 'underscore';
const baseImg = 'https://image.xiaomaiketang.com/xm/rJeQaZxtc7.png'; const baseImg = 'https://image.xiaomaiketang.com/xm/rJeQaZxtc7.png';
...@@ -134,7 +135,10 @@ function Header(props) { ...@@ -134,7 +135,10 @@ function Header(props) {
<div className='user-detail'> <div className='user-detail'>
<div className='box'> <div className='box'>
<Tooltip title={nickName}> <Tooltip title={nickName}>
<div className='name'>{nickName}</div> <div className='name'>
{/* <span>{nickName}</span> */}
<WWOpenDataCom type='userName' openid={nickName} />
</div>
</Tooltip> </Tooltip>
<span className='phone'>{phone}</span> <span className='phone'>{phone}</span>
</div> </div>
...@@ -201,9 +205,10 @@ function Header(props) { ...@@ -201,9 +205,10 @@ function Header(props) {
User.removeUserId(); User.removeUserId();
User.removeToken(); User.removeToken();
User.removeEnterpriseId(); User.removeEnterpriseId();
User.clearUserInfo(); window.RCHistory.replace('/login');
const url = `${LIVE_SHARE}store/index?id=${User.getCustomerStoreId() || User.getStoreId()}&userId=${User.getUserId()}&from=work_weixin`; // User.clearUserInfo();
window.location.href = url; // const url = `${LIVE_SHARE}store/index?id=${User.getCustomerStoreId() || User.getStoreId()}&userId=${User.getUserId()}&from=work_weixin`;
// window.location.href = url;
}); });
} }
...@@ -337,7 +342,11 @@ function Header(props) { ...@@ -337,7 +342,11 @@ function Header(props) {
<div <div
className='url-link' className='url-link'
onClick={() => { onClick={() => {
window.open(`${LIVE_SHARE}store/index?id=${window.currentStoreUserInfo.storeId||User.getStoreId()}&userId=${window.currentStoreUserInfo.userId||User.getUserId()}&enterpriseId=${window.currentStoreUserInfo.enterpriseId||User.getEnterpriseId()}&from=admin&avatar=${avatar}`); window.open(
`${LIVE_SHARE}store/index?id=${window.currentStoreUserInfo.storeId || User.getStoreId()}&userId=${
window.currentStoreUserInfo.userId || User.getUserId()
}&enterpriseId=${window.currentStoreUserInfo.enterpriseId || User.getEnterpriseId()}&from=admin&avatar=${avatar}`
);
}}> }}>
{'立即前往 >'} {'立即前往 >'}
</div> </div>
...@@ -374,7 +383,10 @@ function Header(props) { ...@@ -374,7 +383,10 @@ function Header(props) {
}} }}
src={avatar || baseImg} src={avatar || baseImg}
/> />
<span className='name'>{nickName}</span> <span className='name'>
{/* {nickName} */}
<WWOpenDataCom type='userName' openid={nickName} />
</span>
</div> </div>
</Dropdown> </Dropdown>
</div> </div>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-04-29 10:26:32 * @Date: 2020-04-29 10:26:32
* @LastEditors: yuananting * @LastEditors: yuananting
* @LastEditTime: 2021-07-30 10:08:19 * @LastEditTime: 2021-08-05 19:51:01
* @Description: 内容线路由配置 * @Description: 内容线路由配置
*/ */
import Home from '@/modules/home/Home'; import Home from '@/modules/home/Home';
...@@ -10,7 +10,7 @@ import EmployeesManagePage from '@/modules/store-manage/EmployeesManagePage'; ...@@ -10,7 +10,7 @@ import EmployeesManagePage from '@/modules/store-manage/EmployeesManagePage';
import EmployeeManage from '@/modules/college-manage/EmployeeManage'; import EmployeeManage from '@/modules/college-manage/EmployeeManage';
import personalInfoPage from '@/modules/personalInfo'; import personalInfoPage from '@/modules/personalInfo';
import UserManagePage from '@/modules/store-manage/UserManagePage'; import UserManagePage from '@/modules/store-manage/UserManagePage';
import UserManage from '@/modules/college-manage/UserManagePage'; import UserManage from '@/modules/college-manage/NewUsersManagePage';
import StoreDecorationPage from '@/modules/store-manage/StoreDecorationPage'; import StoreDecorationPage from '@/modules/store-manage/StoreDecorationPage';
import CourseCatalogPage from '@/modules/store-manage/CourseCatalogPage'; import CourseCatalogPage from '@/modules/store-manage/CourseCatalogPage';
import LiveCoursePage from '@/modules/course-manage/LiveCoursePage'; import LiveCoursePage from '@/modules/course-manage/LiveCoursePage';
......
...@@ -10,7 +10,8 @@ import { ...@@ -10,7 +10,8 @@ import {
STORE_GROUP_PERMISSION, STORE_GROUP_PERMISSION,
STORE_PERMISSION, STORE_PERMISSION,
STORE_GROUP_LIST, STORE_GROUP_LIST,
STORE_LIST STORE_LIST,
WECHAT_LOGIN
} from './constants' } from './constants'
...@@ -34,12 +35,18 @@ const setStoreList = (payload: any) => ({ ...@@ -34,12 +35,18 @@ const setStoreList = (payload: any) => ({
payload payload
}) })
const setWechatLogin = (payload: any) => ({
type: WECHAT_LOGIN,
payload
})
export { export {
setStoreGroupPermission, setStoreGroupPermission,
setStorePermission, setStorePermission,
setStoreGroupList, setStoreGroupList,
setStoreList setStoreList,
setWechatLogin
} }
...@@ -10,11 +10,13 @@ const STORE_GROUP_PERMISSION = 'STORE_GROUP_PERMISSION'; ...@@ -10,11 +10,13 @@ const STORE_GROUP_PERMISSION = 'STORE_GROUP_PERMISSION';
const STORE_PERMISSION = 'STORE_PERMISSION'; const STORE_PERMISSION = 'STORE_PERMISSION';
const STORE_GROUP_LIST = 'STORE_GROUP_LIST'; const STORE_GROUP_LIST = 'STORE_GROUP_LIST';
const STORE_LIST = 'STORE_LIST'; const STORE_LIST = 'STORE_LIST';
const WECHAT_LOGIN = 'WECHAT_LOGIN';
export { export {
STORE_GROUP_PERMISSION, STORE_GROUP_PERMISSION,
STORE_PERMISSION, STORE_PERMISSION,
STORE_GROUP_LIST, STORE_GROUP_LIST,
STORE_LIST, STORE_LIST,
WECHAT_LOGIN,
} }
\ No newline at end of file
...@@ -4,12 +4,14 @@ import { ...@@ -4,12 +4,14 @@ import {
setStoreGroupPermission, setStoreGroupPermission,
setStorePermission, setStorePermission,
setStoreGroupList, setStoreGroupList,
setStoreList setStoreList,
setWechatLogin
} from './basicAction'; } from './basicAction';
export { export {
setStoreGroupPermission, setStoreGroupPermission,
setStorePermission, setStorePermission,
setStoreGroupList, setStoreGroupList,
setStoreList setStoreList,
setWechatLogin
} }
\ No newline at end of file
...@@ -10,7 +10,8 @@ import { ...@@ -10,7 +10,8 @@ import {
STORE_GROUP_PERMISSION, STORE_GROUP_PERMISSION,
STORE_PERMISSION, STORE_PERMISSION,
STORE_GROUP_LIST, STORE_GROUP_LIST,
STORE_LIST STORE_LIST,
WECHAT_LOGIN,
} from '@/store/actions/constants'; } from '@/store/actions/constants';
import _ from 'underscore'; import _ from 'underscore';
import Permission from '@/common/js/permission'; import Permission from '@/common/js/permission';
...@@ -45,6 +46,11 @@ const basicReducer = (state: any, action: any) => { ...@@ -45,6 +46,11 @@ const basicReducer = (state: any, action: any) => {
return Object.assign({}, state, { return Object.assign({}, state, {
storeList, storeList,
}); });
case WECHAT_LOGIN:
const wechatLogin: any = action.payload;
return Object.assign({}, state, {
wechatLogin,
});
default: default:
return state; return state;
} }
......
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