From c8a8d64127234863da2cd3f2f0718d54dd555b99 Mon Sep 17 00:00:00 2001 From: Teo <2642673902@qq.com> Date: Wed, 2 Apr 2025 18:31:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0,=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E4=BA=BA=E8=84=B8,=E6=89=93=E5=8D=A1,=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E7=BC=96=E8=BE=91,=E4=B8=8B=E8=BD=BD=E8=B5=84?= =?UTF-8?q?=E6=96=99=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/project/constructionUser/index.ts | 84 ++++- src/api/project/constructionUser/types.ts | 47 +++ src/api/project/constructionUserFile/index.ts | 40 +++ src/api/project/constructionUserFile/types.ts | 133 ++++++++ src/assets/icons/svg/PDF.png | Bin 0 -> 3378 bytes src/components/FileUpload/index.vue | 102 +++++- src/views/project/constructionUser/index.vue | 322 +++++++++++++++++- 7 files changed, 709 insertions(+), 19 deletions(-) create mode 100644 src/api/project/constructionUserFile/index.ts create mode 100644 src/api/project/constructionUserFile/types.ts create mode 100644 src/assets/icons/svg/PDF.png diff --git a/src/api/project/constructionUser/index.ts b/src/api/project/constructionUser/index.ts index f86ff14..6f8fe98 100644 --- a/src/api/project/constructionUser/index.ts +++ b/src/api/project/constructionUser/index.ts @@ -1,6 +1,16 @@ import request from '@/utils/request'; import { AxiosPromise } from 'axios'; -import { ConstructionUserForm, ConstructionUserQuery, ConstructionUserVO, skipType } from '@/api/project/constructionUser/types'; +import { + ConstructionUserForm, + ConstructionUserQuery, + ConstructionUserVO, + skipType, + ConstructionUserStatusForm, + ConstructionUserPlayCardForm, + ConstructionUserSalaryForm, + ConstructionUserExitForm, + ConstructionUserTemplateForm +} from '@/api/project/constructionUser/types'; /** * 查询施工人员列表 @@ -83,3 +93,75 @@ export const delConstructionUser = (id: string | number | Array method: 'delete' }); }; + +/** + * 修改施工人员在职状态 + * @param data + */ +export const updateConstructionUserStatus = (data: ConstructionUserStatusForm) => { + return request({ + url: '/project/constructionUser/batch/status', + method: 'put', + data: data + }); +}; + +/** + * 根据项目id批量修改施工人员打卡状态 + * @param data + */ +export const updateConstructionUserPlayCardStatus = (data: ConstructionUserPlayCardForm) => { + return request({ + url: '/project/constructionUser/batch/clock', + method: 'put', + data: data + }); +}; + +/** + * 修改施工人员打卡状态 + * @param data + */ +export const updateConstructionUserPlayCardOneStatus = (data: ConstructionUserPlayCardForm) => { + return request({ + url: '/project/constructionUser/clock', + method: 'put', + data: data + }); +}; + +/** + * 修改施工人员工资 + * @param data + */ +export const updateConstructionUserSalary = (data: ConstructionUserSalaryForm) => { + return request({ + url: '/project/constructionUser/salary', + method: 'put', + data: data + }); +}; + +/** + * 查询施工人员入退场记录 + * @param query + */ +export const getConstructionUserExit = (query: ConstructionUserExitForm) => { + return request({ + url: '/project/constructionUserExit/list', + method: 'get', + params: query + }); +}; + +/** + * 下载施工人员文件存储模板 + * @param query + */ +export const dowloadConstructionUserTemplate = (query: ConstructionUserTemplateForm) => { + return request({ + url: '/project/constructionUserFile/exportFileTemplate', + method: 'get', + params: query + }); +}; diff --git a/src/api/project/constructionUser/types.ts b/src/api/project/constructionUser/types.ts index 502fb62..51e9075 100644 --- a/src/api/project/constructionUser/types.ts +++ b/src/api/project/constructionUser/types.ts @@ -1,5 +1,6 @@ import { ContractorVO } from '@/api/project/contractor/types'; import { ProjectTeamVO } from '@/api/project/projectTeam/types'; +import { S } from 'node_modules/vite/dist/node/types.d-aGj9QkWt'; export interface ConstructionUserVO { /** @@ -196,6 +197,47 @@ export interface skipType { id: string | number; } +export interface ConstructionUserTemplateForm { + /** + * 项目id + */ + projectId: string | number; +} + +export interface ConstructionUserExitForm { + /** + * userId + */ + userId: number | string; +} + +export interface ConstructionUserSalaryForm { + /** + * 列表 + */ + id: number | string; + + /** + * 工资 + */ + salary?: number | string; +} + +export interface ConstructionUserPlayCardForm { + /** + * 项目 + */ + projectId?: string | number; + /** + * 用户id + */ + id?: string | number; + /** + * 打卡状态 + */ + clock: number | string; +} + export interface skipOptionType { /** * 名称 @@ -385,6 +427,11 @@ export interface ConstructionUserForm extends BaseEntity { remark?: string; } +export interface ConstructionUserStatusForm { + status: number | string; + idList: Array; +} + export interface ConstructionUserQuery extends PageQuery { /** * 微信id diff --git a/src/api/project/constructionUserFile/index.ts b/src/api/project/constructionUserFile/index.ts new file mode 100644 index 0000000..ef40d02 --- /dev/null +++ b/src/api/project/constructionUserFile/index.ts @@ -0,0 +1,40 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { ConstructionUserFileVO, ConstructionUserFileForm, ConstructionUserFileQuery } from '@/api/project/constructionUserFile/types'; + +/** + * 查询施工人员文件存储列表 + * @param query + * @returns {*} + */ + +export const listConstructionUserFile = (query?: ConstructionUserFileQuery): AxiosPromise => { + return request({ + url: '/project/constructionUserFile/list', + method: 'get', + params: query + }); +}; + +/** + * 查询施工人员文件存储详细 + * @param data + */ +export const setConstructionUserFile = (data: ConstructionUserFileForm): AxiosPromise => { + return request({ + url: '/project/constructionUserFile/save', + method: 'post', + data + }); +}; + +/** + * 删除施工人员文件存储 + * @param id + */ +export const delConstructionUserFile = (id: string | number | Array) => { + return request({ + url: '/project/constructionUserFile/' + id, + method: 'delete' + }); +}; diff --git a/src/api/project/constructionUserFile/types.ts b/src/api/project/constructionUserFile/types.ts new file mode 100644 index 0000000..75a9851 --- /dev/null +++ b/src/api/project/constructionUserFile/types.ts @@ -0,0 +1,133 @@ +export interface ConstructionUserFileVO { + /** + * 主键id + */ + id: string | number; + + /** + * 用户id + */ + userId: string | number; + + /** + * 文件类型 + */ + fileType: string; + + /** + * 文件名称 + */ + fileName: string; + + /** + * 文件路径 + */ + path: string; + + /** + * 备注 + */ + remark: string; +} + +export interface ConstructionUserExitVO { + /** + * 主键id + */ + id: string | number; + + /** + * 用户id + */ + userId: string | number; + + /** + * 身份证号码 + + */ + sfzNumber: string; + + /** + * 项目id + */ + projectId: string; + /** + * 班组id + */ + teamId: string; + /** + * 入场时间 + + */ + entryDate: string; + /** + * 退场时间 + + */ + leaveDate: string; + + /** + * 退场文件 + + */ + path: string; + + /** + * 备注 + */ + remark: string; +} + +export interface ConstructionUserFileForm extends BaseEntity { + /** + * 用户id + */ + userId?: string | number; + + /** + * 文件类型 + */ + fileList?: Array; +} + +interface fileListType { + fileId: string | number; + fileType: string | number; +} + +export interface ConstructionUserFileQuery { + /** + * 主键id + */ + id?: string | number; + + /** + * 用户id + */ + userId?: string | number; + + /** + * 文件类型 + */ + fileType?: string; + + /** + * 文件名称 + */ + fileName?: string; + + /** + * 文件路径 + */ + path?: string; + + /** + * 备注 + */ + remark?: string; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/assets/icons/svg/PDF.png b/src/assets/icons/svg/PDF.png new file mode 100644 index 0000000000000000000000000000000000000000..5cea7352960528889f27e7e4b5e9bfb409d50e2a GIT binary patch literal 3378 zcmai12{aU3`!~j(3?;o3hK4K?vc}*Y`%Koz)Fj*3vW6HVWD?2})7Z&UM!nX;NC+h~ z%J3Qy!%&e-#ugdz4&U_u|Ihiq@AvYkiRJsD;H#%vj$MRmPvYyOC+YU(tiZrE+s(mK2+;z^*5~3gUKDkEt zw3DuG*P8oj$d^8~#1JcYyNh&Z#8{NY($0{jrGog&L#=iCDU1@4f&&qQVsqDY}| zAsaJs;*nFrcevW|;gWYourS@8LSJdyIKthdYI5K3o`S;2xC6XBRjv;ti271n;N;3h zp#jBffX3Iam*S<82EmY13vuGtL4z;~V=EOA6iX4lf<#WmA50((#zl7Q+W>v15}BT zQP%y_s~w{J zASw8Yk&TP)eYVWX(_!+FfrJ3 z!DIPp@~&fYE3X@Gjm_fUe>UrB?DcXiC~nz_QDWrB8)i%nS4$-}?k^|bG;0TqM;#?x zZ&3_hS$5I0MVsVaa+9`!n~PrvbL^yEkGJ?1>hF{Yq!qRyv0KWZcG*9sa4zL)5oBoz z@v4zq=N~d?Y5`&2=g67ZT@Bt++koO$j99fl6G`kkn$%^xYOQcmkhd2s`yYdH6VD^Y z_xE@a79JhEMNIFgO(R+Ahr(-U)8q#qKM_!!fk5Yi9wn&~eJG9d=wSbg(Z`qa1LiiT z1}h}7dan*K!suRh`-u@$Ox2=hb!(BCD9yrY+?H7CP;XLs@(8oLx~0H7g#OV&6BzB* zUJJ^Dp1^E8M{`!qG7DSK6>rdW0Fz2YjP0ZBxW(cReuJiYdSl)CJ+%G68Eeg^uG1y1 zUjEq8^d@Gf%_%D%wLrV*-M~J&T3~{93$vV9ZD#bhEcmwr|1CjE`_fx*PAKDovV_M<*NRiBHg@C*{n~7dW;Ezcg|DFNk=iE# zje$V=N1fnrSK;Yi@5@6h}(=9lmRn2LI})T%P%UqC{!=Uwj~j<4cvZP~y*nd`^4Yq5VN8x7 zQKCPH85Mx`N!efH+Flm@KB=dL5agnd?jx$Gn&)m`ctjXfj&|7(XjEGu)KI&%s3o!1 zwi|e|P3TV!PBPtW(v!{?d=@s+Tm!8iV0+4$v5ZZd}=L7l?#vg9bTIhK;T}>&z0!BV5szDb}BquT|ne4C}_MQiXVz zMhf<1XAKNe&vq9O`6Shm@bxxu$&6Lsr4GN@yOrb3-#d~0Qv;ClJ?$wkCc1O=kdsPD zk1!>(!R3mNa`MWpPkf|0_BNNHS@}MGqVRSpLI1D=oCm~B7^m?sJDKCTxcrBnTdT_} zKXSfS4P0ZAPy84k$GGX+x`kclL=?-#Lfd@m4>g-}$bQYb?N8Wj$FiKEvL#kB+8#!X zn!hqP?BOsp(s?&A_>eN}FZQEk+d62l0ISW1!4_x8FbX`}0BKQv(fu(Ji!T>VnV)t? zgEJ}+M8(d?=rQivpZQc~8M$&-ME;OQqq$DIX4?|SVM;w5@zy^mq~D|CRuNRb7&zC5 zk_pdV$y-5sZB@He?p`lSe41=!Pz@a{Me^eO8SRL9iR9-+NJIk(?wqvBJZe5RndaD6=xW(*zs;E{(iyW;cx zvd@lQea^-S;n`&4V_|=wE@xOFi~~~@s9p&5Sy9%O@9Jh6CG*>rMnwf?4%8u3ie>%r ztkDg*-pp*rr7^v$IvN9w99d&Gx$vuhW;En?lvFoL+Xtr3KmwkHtc1*^@D5e{*fgfF zG(F0nabHv-M{`#hb9;M^@(z!)AiCwk%qVoitLvb^Jdhog-*2=G5cTG2X9rdi8w6CfWYy$=d=4J!;lqmSZ!;T!=2#$K!5`5)_>LjP$ zQ%D<3^mQ=d2wKtSI>hGtOVS7L7_N78x868CfkzOF&g=yj;V#k=<3A+f(Hz%jy1vR; zozJ)3UKxWvV_Ik1Jfb&rq+fRxEsnol=v}{hicP)DM;Zw0+z_)GF;Gf)8*_?sCRpA@ zk~3`_!y0ZV_@V~3$1au16IGW9jRx<&SxblJl80j4*A|jU1xlR|A4kf>Y;oFS&!zdh a`-1Ps>#3DRBftJaJV+}C%La3=q<;ak^)N{Q literal 0 HcmV?d00001 diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue index b22d09a..2dc5933 100644 --- a/src/components/FileUpload/index.vue +++ b/src/components/FileUpload/index.vue @@ -10,12 +10,30 @@ :on-error="handleUploadError" :on-exceed="handleExceed" :on-success="handleUploadSuccess" - :show-file-list="false" + :show-file-list="isConstruction" :headers="headers" class="upload-file-uploader" + :list-type="isConstruction ? 'picture-card' : 'text'" > - 选取文件 + 选取文件 + +
@@ -29,7 +47,7 @@ 的文件
- +
  • {{ getFileName(file.name) }} @@ -59,7 +77,9 @@ const props = defineProps({ // 文件类型, 例如['png', 'jpg', 'jpeg'] fileType: propTypes.array.def(['doc', 'xls', 'ppt', 'txt', 'pdf']), // 是否显示提示 - isShowTip: propTypes.bool.def(true) + isShowTip: propTypes.bool.def(true), + //是否为施工人员上传 + isConstruction: propTypes.bool.def(false) }); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -168,10 +188,16 @@ const handleUploadSuccess = (res: any, file: UploadFile) => { }; // 删除文件 -const handleDelete = (index: number) => { - let ossId = fileList.value[index].ossId; - delOss(ossId); - fileList.value.splice(index, 1); +const handleDelete = (index: string | number, type?: string) => { + if (type === 'ossId') { + delOss(index); + fileList.value = fileList.value.filter((f) => f.ossId !== index); + } else { + let ossId = fileList.value[index].ossId; + delOss(ossId); + index = parseInt(index as string); + fileList.value.splice(index, 1); + } emit('update:modelValue', listToString(fileList.value)); }; @@ -179,8 +205,10 @@ const handleDelete = (index: number) => { const uploadedSuccessfully = () => { if (number.value > 0 && uploadList.value.length === number.value) { fileList.value = fileList.value.filter((f) => f.url !== undefined).concat(uploadList.value); + console.log('🚀 ~ uploadedSuccessfully ~ fileList.value:', fileList.value); uploadList.value = []; number.value = 0; + emit('update:modelValue', listToString(fileList.value)); proxy?.$modal.closeLoading(); } @@ -210,6 +238,27 @@ const listToString = (list: any[], separator?: string) => { diff --git a/src/views/project/constructionUser/index.vue b/src/views/project/constructionUser/index.vue index 0797240..f013c48 100644 --- a/src/views/project/constructionUser/index.vue +++ b/src/views/project/constructionUser/index.vue @@ -62,6 +62,33 @@ 导出 + + 用户状态编辑 + + + + + + + 员工资料 + + + 下载资料模板 + + + 导入员工资料 + + + @@ -91,7 +118,24 @@ + + + @@ -115,12 +159,17 @@ 黑名单 - - 人员迁移 - + 切换人脸 + 人员迁移 + 入退场记录 删除 + + + 文件上传 + + @@ -286,6 +335,69 @@ + +
    +
    {{ item.label }}
    +
    + +
    +
    + +
    + +
    + +
    + +
    + + + + + + + + + + 请输入薪资(元/月) + + + + +
    + + + {{ item.entryDate }} + + +
    + + +
    @@ -297,7 +409,13 @@ import { listConstructionUser, updateConstructionUser, getProjectContractorList, - transferConstructionUser + transferConstructionUser, + updateConstructionUserStatus, + updateConstructionUserPlayCardStatus, + updateConstructionUserPlayCardOneStatus, + updateConstructionUserSalary, + getConstructionUserExit, + dowloadConstructionUserTemplate } from '@/api/project/constructionUser'; import { ConstructionUserForm, @@ -314,10 +432,19 @@ import { ContractorVO } from '@/api/project/contractor/types'; import { ProjectTeamVO } from '@/api/project/projectTeam/types'; import ConstructionUserDetail from '@/views/project/constructionUser/component/ConstructionUserDetail.vue'; import { addConstructionBlacklist } from '@/api/project/constructionBlacklist'; +import { listConstructionUserFile, setConstructionUserFile } from '@/api/project/constructionUserFile'; +import { + ConstructionUserFileVO, + ConstructionUserExitVO, + ConstructionUserFileForm, + ConstructionUserFileQuery +} from '@/api/project/constructionUserFile/types'; +import { ElLoadingService } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const { type_of_work, user_sex_type, user_clock_type } = toRefs(proxy?.useDict('type_of_work', 'user_sex_type', 'user_clock_type')); - +const { type_of_work, user_sex_type, user_clock_type, user_file_type, user_status_type } = toRefs( + proxy?.useDict('type_of_work', 'user_sex_type', 'user_clock_type', 'user_file_type', 'user_status_type') +); // 获取用户 store const userStore = useUserStoreHook(); // 从 store 中获取项目列表和当前选中的项目 @@ -331,6 +458,18 @@ const single = ref(true); const multiple = ref(true); const total = ref(0); const skip = ref(false); +const fileStatus = ref(false); +const showFaceDrawer = ref(false); +const statusDialog = ref(false); +const playCardStatus = ref(false); +const playCardLoding = ref(false); +const salaryStatus = ref(false); +const exitStatus = ref(false); +const informationStatus = ref(false); +const exitList = ref([]); +const changeSalary = ref(''); +const vocationalStatus = ref(null); +const fileList = ref([]); const queryFormRef = ref(); const constructionUserFormRef = ref(); const skipName = ref(''); @@ -421,6 +560,27 @@ const data = reactive>({ } }); +/** 返回遍历文件对象 */ +const uploadPath = computed(() => { + const list = JSON.parse(JSON.stringify(user_file_type.value)); + for (const item of fileList.value) { + const targetType = item.fileType; + for (let i = 0; i < list.length; i++) { + if (list[i].value == targetType) { + list[i] = { ...list[i], ...item }; // 合并对象 + break; + } + } + } + for (let i = 0; i < list.length; i++) { + if (!list[i].hasOwnProperty('fileType')) { + list[i].fileType = list[i].value; + } + } + console.log(list); + return list; +}); + const { queryParams, form, rules } = toRefs(data); /** 查询施工人员列表 */ @@ -433,13 +593,13 @@ const getList = async () => { }; const selectProject = (e: any) => { - //选中项目筛选出项目下的分包单位 + //选中项目筛选出项目下的分包单位并清空分包单位value contractorList.value = skipOptions.value.filter((item) => item.id == e)[0].contractorList; + skipObject.contractorId = ''; }; const setUnits = async () => { //人员迁移 - console.log('🚀 ~ setUnits ~ skipObject:', skipObject); let res = await transferConstructionUser(skipObject); if (res.code == 200) { ElMessage.success(res.msg); @@ -483,6 +643,28 @@ const getProjectTeamList = async () => { loading.value = false; }; +/** 上传安全协议书按钮操作 */ + +const updateProjectFile = async () => { + buttonLoading.value = true; + let fileList = uploadPath.value.map((item) => { + return { + fileId: item.path, + fileType: item.fileType + }; + }); + const data = { + userId: currentUserId.value, + fileList + }; + console.log('🚀 ~ updateProjectFile ~ data:', data); + await setConstructionUserFile(data); + proxy?.$modal.msgSuccess('上传成功'); + buttonLoading.value = false; + fileStatus.value = false; + await getList(); +}; + const getTeamName = (teamId: string | number) => { const team = projectTeamOpt.value.find((item: any) => item.value === teamId); return team ? team.label : teamId; @@ -544,6 +726,17 @@ const handleShowDrawer = (row?: ConstructionUserVO) => { showDetailDrawer.value = true; }; +//下载模板 +const downloadTemplate = async () => { + const loadingInstance = ElLoadingService({ + lock: true, + text: 'Loading', + background: 'rgba(0, 0, 0, 0.7)' + }); + await dowloadConstructionUserTemplate({ projectId: currentProject.value.id }); + loadingInstance.close(); +}; + /** 人员迁移 */ const handleChange = async (row: ConstructionUserVO) => { const _id = row?.id || ids.value[0]; @@ -554,6 +747,33 @@ const handleChange = async (row: ConstructionUserVO) => { skip.value = true; }; +//切换人脸 +const handleToggle = async (row: ConstructionUserVO) => { + reset(); + skipName.value = row?.userName; + const _id = row?.id || ids.value[0]; + const res = await getConstructionUser(_id); + Object.assign(form.value, res.data); + showFaceDrawer.value = true; +}; + +const handleExit = async (row: ConstructionUserVO) => { + const _id = row?.id || ids.value[0]; + currentUserId.value = _id; + const res = await getConstructionUserExit({ userId: _id }); + exitList.value = res.data; + exitStatus.value = true; +}; + +//上传按钮 +const handleUpload = async (row: ConstructionUserVO) => { + const _id = row?.id || ids.value[0]; + currentUserId.value = _id; + const res = await listConstructionUserFile({ userId: _id }); + fileList.value = res.data; + fileStatus.value = true; +}; + /** 提交按钮 */ const submitForm = () => { constructionUserFormRef.value?.validate(async (valid: boolean) => { @@ -566,6 +786,7 @@ const submitForm = () => { } proxy?.$modal.msgSuccess('操作成功'); dialog.visible = false; + showFaceDrawer.value = false; await getList(); } }); @@ -601,6 +822,69 @@ const handleExport = () => { `constructionUser_${new Date().getTime()}.xlsx` ); }; +/** 用户状态编辑操作 */ +const handleEdit = async () => { + if (!vocationalStatus.value) { + proxy?.$modal.msgError('请选择状态'); + return; + } + const data = { + idList: ids.value, + status: vocationalStatus.value + }; + await updateConstructionUserStatus(data); + proxy?.$modal.msgSuccess('修改成功'); + getList(); + ids.value = []; + statusDialog.value = false; +}; + +//打开修改日薪 +const openSalaryDialog = (row: ConstructionUserVO) => { + const _id = row?.id || ids.value[0]; + currentUserId.value = _id; + if (row.salary) { + setSalary(); + return; + } + console.log(row); + salaryStatus.value = true; +}; + +//变更日薪 +const handleSalary = async () => { + if (!changeSalary.value) { + proxy?.$modal.msgError('请输入薪资'); + return; + } + setSalary(); +}; +const setSalary = async () => { + await updateConstructionUserSalary({ id: currentUserId.value, salary: changeSalary.value }); + proxy?.$modal.msgSuccess('修改成功'); + getList(); + changeSalary.value = ''; + salaryStatus.value = false; +}; + +// 批量切换在职状态 +const handlePlayCardStatus = async (e) => { + playCardLoding.value = true; + const clock = e ? 1 : 0; + await updateConstructionUserPlayCardStatus({ projectId: currentProject.value.id, clock }); + proxy?.$modal.msgSuccess('修改成功'); + getList(); + playCardLoding.value = false; +}; + +// 切换在职状态 +const handleClockStatus = async (row: ConstructionUserVO) => { + playCardLoding.value = true; + await updateConstructionUserPlayCardOneStatus({ id: row.id, clock: row.clock }); + proxy?.$modal.msgSuccess('修改成功'); + getList(); + playCardLoding.value = false; +}; onMounted(() => { getList(); @@ -608,7 +892,7 @@ onMounted(() => { getProjectTeamList(); }); -