unknown 4 lat temu
rodzic
commit
4ed5232d46
6 zmienionych plików z 182 dodań i 95 usunięć
  1. +0
    -1
      package.json
  2. +64
    -6
      src/services/system.js
  3. +12
    -1
      src/services/user.js
  4. +102
    -84
      src/views/components_web/distWork/distWork.vue
  5. +3
    -2
      src/views/components_web/projSetting/projSetting.vue
  6. +1
    -1
      src/views/main_web/index/index.vue

+ 0
- 1
package.json Wyświetl plik

@@ -25,7 +25,6 @@
"lodash": "^4.17.20",
"sass": "^1.26.11",
"sass-loader": "^10.0.2",
"socket.io-client": "^2.3.1",
"vue": "^2.6.11",
"vue-lazyload": "^1.3.3",
"vue-router": "^3.4.5",


+ 64
- 6
src/services/system.js Wyświetl plik

@@ -2,35 +2,93 @@
* 模拟客户端back server
* 目前还不知道back的API及具体实现,暂时先抑制代码报错
*/
import io from 'socket.io-client';

export const isClient = process.env.IS_CLIENT;

let socket;
const noop = () => {};

const io = (path) => {
return new WebSocket(path);
}

console.log(global.electron);

const safeCall = f => isClient ? f : noop;
const safeSocket = f => (...args) => socket && f(...args);

const system = {
isClient,
init: () => {

},
test: safeCall(() => {
console.log('客户端 electron API 检测:', global.electron);
system.initalSocket();
}),
initalSocket: () => {
socket = io('http://10.240.32.243:3000');
initialSocket: () => {
socket = io('ws://10.240.5.17:8000');
// socket = io('ws://127.0.0.1:3000');
debugger;
socket.on('connect', () => { console.log('本地socket服务连接成功') });
},
/**
* 系统打开只当文件
* todo
* 通知登录
*/
login: () => {

},
/**
* todo
* 通知登出
*/
logout: () => {

},
/**
* todo
* 通知系统进入当前的工作空间
*/
entryProject: () => {

},
/**
* 下载文件到工作空间
*/
downloadFile: () => {

},
/**
* 上传文件到工作空间
* issue:
* + 浏览器的文件上传不会带有本地的文件路径,本地服务是否可以唤起一个选择文件的弹窗?
*/
uploadFile: safeCall(() => {
const { ipcRender } = global.electron;
ipcRender.send('project-upload-file', { value: 'custom-var-test' });
}),
/**
* 系统打开文件
*/
openFile: safeCall((filePath) => {
const { shell } = global.electron;
shell.openPath(filePath);
}),
// todo
/**
* 初始化ipcRender
*/
initialClient: safeCall(() => {
const { ipcRender } = global.electron;
// 项目中的文件上传事件监听
ipcRender.on('project-selected-upload-file', (event, path) => {
console.log('ipcRender project-selected-upload-file:', event, path);
debugger;
// todo 取出文件的本地路径, 及当前项目相关的数据通过socket,发送给本机服务
//
});
}),
}


export default system;

+ 12
- 1
src/services/user.js Wyświetl plik

@@ -12,7 +12,18 @@ export async function fetchAddressBook(companyId) {
firnode.children = await fetchNodes(companyId);
return [firnode];
}

/**
* 获取部门列表
* @param {string} companyId
*/
export async function fetchDeptList(companyId) {
const res = await fetchApi('company/queryDeptListByCompanyId', { companyId });
return (res.Data || []).map(d => {
const data = firstCharToLowerCase(d);
data.arraySuper = data.levelId.split('-');
return node('dept', data.id, data.deptName, data);
});
}

/**
* 查询单个节点下的节点列表


+ 102
- 84
src/views/components_web/distWork/distWork.vue Wyświetl plik

@@ -157,9 +157,7 @@
</div>
<span class="Text_tiny tinyText_wirte">工作负责人</span>
</div>
<li v-for="(user, index) in listManagerComputed(
folder.manageUser
)" :key="index">
<li v-for="(user, index) in folder.manageUser" :key="index">
<div>
<div class="avtarface" title="编辑">
<!-- <img src="" v-lazy="headSrc + user.headImgUrl" @click="aloneAddUserForFolder(folder)" /> -->
@@ -240,7 +238,8 @@
<li v-for="(user, index) in folderChild.manageUser" :key="index">
<div>
<div class="avtarface" title="编辑">
<img src="" v-lazy="headSrc + user.headImgUrl" @click="aloneAddUserForFolder(folderChild)" />
<!-- <img src="" v-lazy="headSrc + user.headImgUrl" @click="aloneAddUserForFolder(folderChild)" /> -->
<img :src="user.headImgUrl | resolveAvator" @click="aloneAddUserForFolder(folderChild)" />
</div>
<span class="Text_tiny tinyText_wirte">{{
user.cnName
@@ -261,7 +260,7 @@
)" :key="index">
<div v-if="index < 14 || showAll">
<div class="avtarface" title="编辑">
<img src="" v-lazy="headSrc + user.headImgUrl" />
<img :src=" user.headImgUrl | resolveAvator" />
</div>
<span class="Text_tiny tinyText_wirte">{{
user.cnName
@@ -288,7 +287,7 @@
</div>
</div>
</div>
<div v-show="listNewFolder.length>0">
<div v-show="listNewFolder.length > 0 && false">
<span class="fl label_text">自定义工作</span>
<span class="fr mt-10" @click="addProjFolderWork()"><i class="yiyunPlusmini"></i></span>
</div>
@@ -333,23 +332,24 @@
<!-- 添加协作群与工作 -->
<el-collapse-item name="1" class="nomidline">
<template slot="title">
<!-- <span class="fr mr_20"> -->
<!-- <el-checkbox class="checkBoxCol" v-model="ischeckAll" @change="handleCheckTopAll">全选</el-checkbox> -->
<!-- </span> -->
<span class="fr mr_20">
<el-checkbox class="checkBoxCol" v-model="ischeckAll" @change="handleCheckTopAll">全选</el-checkbox>
</span>
<span>从部门中选择职员</span>
</template>
<el-collapse accordion v-for="(dept, group_index) in listDept" v-show="dept.listUser.length>0" :key="group_index">
<!-- 二级折叠面板 -->
<el-collapse-item>
<template slot="title">
<!-- <span class="fr mr_20"> -->
<!-- <el-checkbox class="checkBoxCol" v-model="dept.selected" :key="group_index" @change="handleCheckItemAll(group_index,$event)">全选</el-checkbox> -->
<!-- </span> -->
<span class="fr mr_20">
<el-checkbox class="checkBoxCol" v-model="dept.selected" :key="group_index" @change="handleCheckItemAll(group_index,$event)">全选</el-checkbox>
</span>
<span>{{ dept.deptName }} </span>
</template>
<div class="user_info_item" v-for="(user, index) in listUserManager(
<!-- <div class="user_info_item" v-for="(user, index) in listUserManager(
dept.listUser
)" :label="user" :key="index">
)" :label="user" :key="index"> -->
<div class="user_info_item" v-for="(user, index) in dept.listUser" :label="user" :key="index">
<el-checkbox class="checkBoxCol" v-model="user.selected" @change="
handleCheckedOnlyOne(
group_index,
@@ -408,9 +408,10 @@
</div>
<!-- 项目负责人选择后 -->
<div v-if="listManagerComputed(selectedUser).length != 0">
<div class="user_info_item mainpeople_H" v-for="(user, index) in listManagerComputed(
<!-- <div class="user_info_item mainpeople_H" v-for="(user, index) in listManagerComputed(
selectedUser
)" :key="index">
)" :key="index"> -->
<div class="user_info_item mainpeople_H" v-for="(user, index) in selectedUser" :key="index">
<i class="icon font_family icon-icon_huangguan-jihuo middlehuangguan fl" title="负责人"></i>
<!-- <img v-lazy="headSrc + user.headImgUrl" alt="" class="user_info_faceImg" /> -->
<img :src="user.headImgUrl | resolveAvator" alt="" class="user_info_faceImg" />
@@ -442,18 +443,20 @@
}},进行职员指派。
</p>
</div>
<!-- <div v-if="isShowStaffList">
<div v-if="isShowStaffList">
<div class="row_painfr" v-for="dept in listDeptComputed" :key="dept.deptID" >
<div class="yiyun_line"></div>
<div v-for="deptID in listDeptUserNoZero(selectedUser)" :key="deptID">
<div v-if="deptID ==dept.deptID">
<div v-if="deptID == dept.id">
<div class="yiyun_line"></div>
<span>{{dept.deptName}}</span>
</div>
</div>
<div class="renyuanbox" v-for="(user,index) in listUserComputed(selectedUser)" :key="index">
<div class="user_info_item" v-if="user.deptID ==dept.deptID">
<img v-lazy="headSrc+user.headImgUrl" alt="" class="user_info_faceImg">
<!-- <div class="renyuanbox" v-for="(user,index) in listUserComputed(selectedUser)" :key="index"> -->
<div class="renyuanbox" v-for="(user,index) in selectedUser" :key="index">
<div class="user_info_item" v-if="user.deptId == dept.id">
<!-- <img v-lazy="headSrc+user.headImgUrl" alt="" class="user_info_faceImg"> -->
<img v-lazy="user.headImgUrl | resolveAvator" alt="" class="user_info_faceImg">
<span class="user_info_name">{{user.cnName}}</span>
<el-popover placement="bottom-start" width="180" trigger="hover">
<ul class="popover_ul popover_ul">
@@ -478,7 +481,7 @@
</div>
</div>
</div>
</div> -->
</div>
</div>
</div>
</div>
@@ -506,9 +509,10 @@
handleCheckItemAll(group_index, $event)
">全选</el-checkbox>
</template>
<div class="user_info_item" v-for="(user, index) in listUserStaff(
<!-- <div class="user_info_item" v-for="(user, index) in listUserStaff(
dept.listUser
)" :label="user" :key="index">
)" :label="user" :key="index"> -->
<div class="user_info_item" v-for="(user, index) in dept.listUser" :label="user" :key="index">
<el-checkbox class="checkBoxCol" v-model="user.selected" @change="
handleCheckedOne(group_index, user, $event)
" :disabled="disabled">
@@ -558,37 +562,37 @@
<span>工作负责人</span>
<div class="yiyun_line"></div>
<!-- 项目负责人选择前 -->
<div class="main_workerBox" v-if="listManagerComputed(selectedUser).length == 0">
<!-- <div class="main_workerBox" v-if="listManagerComputed(selectedUser).length == 0"> -->
<div class="main_workerBox" v-if="selectedUser.length == 0">
<i class="icon font_family icon-icon_huangguan-weijihuo largehuangguan"></i>
<div class="rentou_alrge"></div>
</div>
<!-- 项目负责人选择后 -->
<div v-if="listManagerComputed(selectedUser).length != 0">
<div class="user_info_item mainpeople_H" v-for="(user, index) in listManagerComputed(
<!-- <div v-if="listManagerComputed(selectedUser).length != 0"> -->
<div v-if="selectedUser.length != 0">
<!-- <div class="user_info_item mainpeople_H" v-for="(user, index) in listManagerComputed(
selectedUser
)" :key="index">
)" :key="index"> -->
<div class="user_info_item mainpeople_H" v-for="(user, index) in selectedUser" :key="index">
<i class="icon font_family icon-icon_huangguan-jihuo middlehuangguan fl" title="负责人"></i>
<!-- <img v-lazy="headSrc + user.headImgUrl" alt="" class="user_info_faceImg" /> -->
<img :src="user.headImgUrl | resolveAvator" alt="" class="user_info_faceImg" />
<img :src="user.headImgUrl | resolveAvator" alt="" class="user_info_faceImg" />
<span class="user_info_name">{{ user.cnName }}</span>
<el-popover placement="bottom-start" width="180" trigger="hover">
<ul class="popover_ul popover_ul">
<li>
<a href="javascript:;">{{ user.roleName }}</a>
</li>
<li>
<a href="javascript:;">{{ user.phone }}</a>
</li>
<li>
<a href="javascript:;">所在项目{{ user.projCount }}个</a>
</li>
</ul>
<span class="user_info_job" slot="reference">{{
user.position
}}</span>
</el-popover>
<span class="user_info_role" @click="removeManageUser(user)">修改
</span>
<el-popover placement="bottom-start" width="180" trigger="hover">
<ul class="popover_ul popover_ul">
<li>
<a href="javascript:;">{{ user.roleName }}</a>
</li>
<li>
<a href="javascript:;">{{ user.phone }}</a>
</li>
<li>
<a href="javascript:;">所在项目{{ user.projCount }}个</a>
</li>
</ul>
<span class="user_info_job" slot="reference">{{user.position}}</span>
</el-popover>
<span class="user_info_role" @click="removeManageUser(user)">修改</span>
</div>
</div>
<p class="diaTip">
@@ -598,15 +602,15 @@
</p>
</div>
<div v-if="isShowStaffList">
<div class="row_painfr" v-for="dept in listDept" v-show="dept.listUser.length > 0" :key="dept.deptID">
<div class="row_painfr" v-for="dept in listDept" v-show="dept.listUser.length > 0" :key="dept.id">
<div v-for="deptID in listDeptUserNoZero(selectedUser)" :key="deptID">
<div v-if="deptID == dept.deptID">
<div v-if="deptID == dept.id">
<div class="yiyun_line"></div>
<span>{{ dept.deptName }}</span>
</div>
</div>
<div class="renyuanbox" v-for="(user, index) in listUserComputed(selectedUser)" :key="index">
<div class="user_info_item" v-if="user.deptID == dept.deptID">
<div class="user_info_item" v-if="user.deptId == dept.id">
<!-- <img v-lazy="headSrc + user.headImgUrl" alt="" class="user_info_faceImg" /> -->
<img :src="user.headImgUrl | resolveAvator" alt="" class="user_info_faceImg" />
<span class="user_info_name">{{ user.cnName }}</span>
@@ -658,7 +662,7 @@
</template>
<script>
import { getUserInfo,roleOptions,fetchAddressBook,getUserListByNode,roleMap,stateOptions} from '@/services/user.js';
import { getUserInfo,roleOptions,fetchDeptList,getUserListByNode,roleMap,stateOptions} from '@/services/user.js';
import { fetchApi } from '@/utils/request';
import { firstCharToLowerCase, firstCharToUpperCase } from '@/utils/tool';
@@ -1028,7 +1032,8 @@ export default {
this.listDept[j].listUser[k].selected = false;
for (var i = 0; i < data.listUser.length; i++) {
if (
this.listDept[j].listUser[k].userID == data.listUser[i].userID
// this.listDept[j].listUser[k].userID == data.listUser[i].userID
this.listDept[j].listUser[k].id == data.listUser[i].id
) {
this.listDept[j].listUser[k].folderPerm =
data.listUser[i].folderPerm;
@@ -1036,7 +1041,8 @@ export default {
}
if(!this.isShowManager)
{
if(this.currUser.userID == sessionStorage.userId && sessionStorage.userId == this.listDept[j].listUser[k].userID )
// if(this.currUser.accountId == sessionStorage.userId && sessionStorage.accountId == this.listDept[j].listUser[k].userID )
if(this.currUser.accountId == sessionStorage.userId && sessionStorage.accountId == this.listDept[j].listUser[k].id)
{
this.listDept[j].listUser[k].selected = true;
}
@@ -1100,15 +1106,6 @@ export default {
this.selectedManageUser = [];
this.isShowThreePage = true;
this.isShowFirstPage = false;
// this.fetchPlainDeptUserList(this.$store.state.currentCompanyId).then(list => {
// this.listDept = list;
// this.listDept = [...this.listDept];
// console.log('1111111111111111111111111',this.listDept);
// }).catch(err => {
// console.log(err);
// })
// this.selectedUser = this.newProjData.projectData.listProjManager;
},
/*
*顶部全选
@@ -1118,7 +1115,7 @@ export default {
//首级全选
for (var j = 0; j < this.listDept.length; j++) {
if (this.listDept[j].listUser.length > 0) {
this.handleCheckItemAll(j, false); //清除已经被选中的状态
// this.handleCheckItemAll(j, false); //清除已经被选中的状态
this.handleCheckItemAll(j, e);
}
}
@@ -1147,18 +1144,18 @@ export default {
handleCheckedOne(topIndex, user, e) {
if(!this.isShowManager)
{
if(user.userID == sessionStorage.userId)
{
this.$notify.info({
title: "温馨提示",
message: "不能移除自己哦",
offset: 100,
duration: 5000
});
user.selected=true;
return;
}
if(user.userID == this.currUser.userID)
// if(user.userID == sessionStorage.userId)
// {
// this.$notify.info({
// title: "温馨提示",
// message: "不能移除自己哦",
// offset: 100,
// duration: 5000
// });
// user.selected=true;
// return;
// }
if(user.id == this.currUser.accountId)
{
this.$notify.info({
title: "温馨提示",
@@ -1240,7 +1237,7 @@ export default {
}
}
}
if (checkCount == haveDataCount) {
if ((checkCount == haveDataCount) && checkCount !== 0 && haveDataCount !== 0) {
this.ischeckAll = true;
} else {
this.ischeckAll = false;
@@ -1449,14 +1446,13 @@ export default {
// });
// },
async fetchProjectDetail() {
const [userList, projectDataRes, treeDeptList] = await Promise.all([
const [userList, projectDataRes, deptList] = await Promise.all([
this.getUserList(),
this.$fetchApi('folder/queryNodeFolderListByProjectId', { projectId: sessionStorage.projId }),
fetchAddressBook(this.$store.state.currentCompanyId),
fetchDeptList(this.$store.state.currentCompanyId),
]);
const deptHeadList = treeDeptList[0].children || [];
const oList = this.plainTreeNodes(deptHeadList, userList);
// const deptHeadList = deptList[0].children || [];
const oList = this.plainTreeNodes(deptList, userList);
this.listDept = oList;
this.currListDeptUserData = oList;
@@ -1466,14 +1462,16 @@ export default {
h[user.id] = user;
return h;
}, {});
this.listManagerUser = manager.map(u => userHash[u.Id]);
this.listManagerUser = manager.map(u => userHash[u.UserId]);
// debugger;
if(this.listManagerUser.length) {
this.currUser = this.listManagerUser[0];
this.currUser = this.listManagerUser[0] || {};
this.listManagerUser = this.listManagerUser.slice(1);
}
// todo folder, userList
const folderList = mergeFolderList(folder, userHash);
console.log(folderList);
this.listNewFolder = folderList;
},
async getUserList(){
const { list: userList } = await getUserListByNode({ id: this.$store.state.currentCompanyId, nodeType: 'company' }, 1, 10000);
@@ -1592,7 +1590,27 @@ export default {
};
function mergeFolderList(plainFolderList, userHash) {
return [];
const [rootFolder, commonFolder, ...restFolderList] = plainFolderList;
const rootFolderId = rootFolder.Id;
const headList = [];
const hash = {};
restFolderList.forEach(upperFolder => {
const folder = firstCharToLowerCase(upperFolder);
hash[folder.id] = folder;
folder.listChildren = [];
folder.listUser = folder.oldGeneralId.split(',').filter(a => a);
folder.manageUser = (folder.oldManager === '0' ? '' : folder.oldManager).split(',').filter(a => a);
const parentFolderId = folder.superId;
// headList.push(folder);
if(parentFolderId === rootFolderId) {
headList.push(folder);
return;
}
const parentFolder = hash[parentFolderId];
if(!parentFolder) return;
parentFolder.listChildren.push(folder);
});
return headList;
}
</script>
<style scoped lang="scss">


+ 3
- 2
src/views/components_web/projSetting/projSetting.vue Wyświetl plik

@@ -227,9 +227,10 @@
<span class="checkBoxCol">{{ dept.deptName }}
</span>
</template>
<div class="user_info_item" v-for="(user, index) in listUserManager(
<!-- <div class="user_info_item" v-for="(user, index) in listUserManager(
dept.listUser
)" :label="user" :key="index">
)" :label="user" :key="index"> -->
<div class="user_info_item" v-for="(user, index) in dept.listUser" :label="user" :key="index">
<el-checkbox class="checkBoxCol" v-model="user.selected" @change="
handleCheckedOnlyOne(
group_index,


+ 1
- 1
src/views/main_web/index/index.vue Wyświetl plik

@@ -121,7 +121,7 @@
</div>
<div class="clear"></div>
<span class="tinyLabel biaoqianweizhi1" v-if="projItem.newProjStatus == 1">新项目</span>
<h4 class="biaoqianweizhi2" :title="projItem.projName">{{ projItem.projName }}</h4>
<h4 class="biaoqianweizhi2" :title="projItem.projName">{{ projItem.ProjName }}</h4>
</div>
</div>
<div class="project_gantetubox_warp" v-show="isDistProj">


Ładowanie…
Anuluj
Zapisz