|
@@ -1,25 +1,51 @@
|
|
|
<script setup lang="ts">
|
|
|
import { useMutation, useQuery } from '@tanstack/vue-query'
|
|
|
-import { addMember, deleteMember, getProjectMember } from '@/service/project'
|
|
|
+import { addMember, editorMember, deleteMember, getProjectMember } from '@/service/project'
|
|
|
import { ProjectMember } from '@/interface/project'
|
|
|
import { ElMessage } from 'element-plus'
|
|
|
import UserOrgTree from '@/views/OaSystem/components/UserOrgTree/index.vue'
|
|
|
|
|
|
-const defaultMemberData = {
|
|
|
+const defaultMemberData: ProjectMember = {
|
|
|
workerId: '',
|
|
|
- responsibility: ''
|
|
|
+ responsibility: '',
|
|
|
+ isManager: 0
|
|
|
}
|
|
|
/**
|
|
|
* 项目成员
|
|
|
*/
|
|
|
+//匹配是否在初始化项目成员时新增项目经理
|
|
|
+const isSubmit = ref<boolean>(true)
|
|
|
const props = defineProps<{
|
|
|
projectId: string
|
|
|
+ xmjlId: string
|
|
|
}>()
|
|
|
const workerRelationBool = ref<boolean>(false)
|
|
|
const projectWorkerRelation = ref<ProjectMember>(defaultMemberData)
|
|
|
const { data: projectWorkerRelationList, refetch } = useQuery(
|
|
|
[getProjectMember.name, props.projectId],
|
|
|
- async () => await getProjectMember(props?.projectId)
|
|
|
+ async () => await getProjectMember(props?.projectId),
|
|
|
+ {
|
|
|
+ onSuccess(data) {
|
|
|
+ //匹配项目详情中项目经理是否与项目成员匹配,匹配新增目经理,不匹配不做任何操作
|
|
|
+ if (!isSubmit.value) return
|
|
|
+ const xmjl = data.filter((item) => item.workerId === props.xmjlId)
|
|
|
+ if (xmjl.length === 0) {
|
|
|
+ const oXmjl = data.filter((item) => item.isManager === 1)
|
|
|
+ if (oXmjl.length > 0) {
|
|
|
+ handleEditor({
|
|
|
+ id: oXmjl[0]?.id as string,
|
|
|
+ isManager: 0
|
|
|
+ })
|
|
|
+ }
|
|
|
+ handleAdd({
|
|
|
+ workerId: props.xmjlId,
|
|
|
+ responsibility: '项目经理',
|
|
|
+ isManager: 1,
|
|
|
+ projectId: props.projectId as string
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
)
|
|
|
watch(
|
|
|
() => props.projectId,
|
|
@@ -27,41 +53,80 @@ watch(
|
|
|
refetch()
|
|
|
}
|
|
|
)
|
|
|
-const { mutate: handleDelete } = useMutation(deleteMember, {
|
|
|
+/**
|
|
|
+ * 新增项目成员
|
|
|
+ */
|
|
|
+const isAdd = ref<boolean>(true)
|
|
|
+const handleAddClick = () => {
|
|
|
+ isAdd.value = true
|
|
|
+ workerRelationBool.value = true
|
|
|
+}
|
|
|
+const { mutate: handleAdd } = useMutation(addMember, {
|
|
|
onSuccess: () => {
|
|
|
+ isSubmit.value = false
|
|
|
void refetch()
|
|
|
+ workerRelationBool.value = false
|
|
|
+ projectWorkerRelation.value = defaultMemberData
|
|
|
ElMessage({
|
|
|
- message: '删除成功',
|
|
|
+ message: '添加成员成功',
|
|
|
type: 'success'
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
-
|
|
|
-const { mutate: handleAdd } = useMutation(addMember, {
|
|
|
+/***
|
|
|
+ * 编辑项目成员
|
|
|
+ */
|
|
|
+const handleEditorClick = (item: ProjectMember) => {
|
|
|
+ isAdd.value = false
|
|
|
+ workerRelationBool.value = true
|
|
|
+ projectWorkerRelation.value['id'] = item['id']
|
|
|
+ projectWorkerRelation.value['workerId'] = item['workerId']
|
|
|
+ projectWorkerRelation.value['responsibility'] = item['responsibility']
|
|
|
+}
|
|
|
+const { mutate: handleEditor } = useMutation(editorMember, {
|
|
|
onSuccess: () => {
|
|
|
+ isSubmit.value = false
|
|
|
void refetch()
|
|
|
workerRelationBool.value = false
|
|
|
projectWorkerRelation.value = defaultMemberData
|
|
|
ElMessage({
|
|
|
- message: '添加成员成功',
|
|
|
+ message: '成员更新成功',
|
|
|
+ type: 'success'
|
|
|
+ })
|
|
|
+ }
|
|
|
+})
|
|
|
+const handleAddOrEditorMember = () => {
|
|
|
+ if (isAdd.value) {
|
|
|
+ handleAdd({
|
|
|
+ ...projectWorkerRelation.value,
|
|
|
+ projectId: props.projectId as string
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ handleEditor({
|
|
|
+ id: projectWorkerRelation.value?.id as string,
|
|
|
+ responsibility: projectWorkerRelation.value.responsibility as string
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+/***
|
|
|
+ * 删除成员
|
|
|
+ */
|
|
|
+const { mutate: handleDelete } = useMutation(deleteMember, {
|
|
|
+ onSuccess: () => {
|
|
|
+ isSubmit.value = false
|
|
|
+ void refetch()
|
|
|
+ ElMessage({
|
|
|
+ message: '删除成功',
|
|
|
type: 'success'
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
-
|
|
|
const handleDeleteMember = (workerId: string) => {
|
|
|
handleDelete({
|
|
|
workerId,
|
|
|
projectId: props.projectId as string
|
|
|
})
|
|
|
}
|
|
|
-
|
|
|
-const handleAddMember = () => {
|
|
|
- handleAdd({
|
|
|
- ...projectWorkerRelation.value,
|
|
|
- projectId: props.projectId as string
|
|
|
- })
|
|
|
-}
|
|
|
// 获取assets静态资源
|
|
|
const getAssetURL = (img: string) => {
|
|
|
return new URL(`../../../../../../assets/imgs/${img}`, import.meta.url).href
|
|
@@ -74,7 +139,7 @@ const getAssetURL = (img: string) => {
|
|
|
<div class="total"
|
|
|
>当前项目参与人员:<b>{{ projectWorkerRelationList?.length ?? 0 }}人</b></div
|
|
|
>
|
|
|
- <div class="handle-add-btn" @click="workerRelationBool = true">+ 新增人员</div>
|
|
|
+ <div class="handle-add-btn" @click="handleAddClick">+ 新增人员</div>
|
|
|
</div>
|
|
|
<ul>
|
|
|
<li v-for="(item, index) in projectWorkerRelationList" :key="index">
|
|
@@ -91,17 +156,23 @@ const getAssetURL = (img: string) => {
|
|
|
<p class="txt">电话:{{ item['mobile'] }}</p>
|
|
|
</div>
|
|
|
|
|
|
- <el-popconfirm
|
|
|
- title="确定删除该成员?"
|
|
|
- width="180px"
|
|
|
- @confirm="handleDeleteMember(item.workerId)"
|
|
|
- >
|
|
|
- <template #reference>
|
|
|
- <i class="del_icon">
|
|
|
- <Icon icon="ep:delete" />
|
|
|
- </i>
|
|
|
- </template>
|
|
|
- </el-popconfirm>
|
|
|
+ <div class="icon_group">
|
|
|
+ <i class="edit_icon" @click="handleEditorClick(item)">
|
|
|
+ <Icon icon="ep:edit" />
|
|
|
+ </i>
|
|
|
+ <el-popconfirm
|
|
|
+ title="确定删除该成员?"
|
|
|
+ v-if="item.isManager != 1"
|
|
|
+ width="180px"
|
|
|
+ @confirm="handleDeleteMember(item.workerId)"
|
|
|
+ >
|
|
|
+ <template #reference>
|
|
|
+ <i class="del_icon">
|
|
|
+ <Icon icon="ep:delete" />
|
|
|
+ </i>
|
|
|
+ </template>
|
|
|
+ </el-popconfirm>
|
|
|
+ </div>
|
|
|
</li>
|
|
|
</ul>
|
|
|
</div>
|
|
@@ -119,6 +190,7 @@ const getAssetURL = (img: string) => {
|
|
|
<el-form-item label="人员选择">
|
|
|
<UserOrgTree
|
|
|
:default-expand-all="true"
|
|
|
+ :disabled="!isAdd"
|
|
|
v-model="projectWorkerRelation['workerId']"
|
|
|
/>
|
|
|
</el-form-item>
|
|
@@ -137,7 +209,7 @@ const getAssetURL = (img: string) => {
|
|
|
</div>
|
|
|
<div class="btnGroup">
|
|
|
<el-button type="default" @click="workerRelationBool = false">取消</el-button>
|
|
|
- <el-button type="primary" @click="handleAddMember">保存</el-button>
|
|
|
+ <el-button type="primary" @click="handleAddOrEditorMember">保存</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
@@ -183,20 +255,20 @@ const getAssetURL = (img: string) => {
|
|
|
|
|
|
&:not(.operation) {
|
|
|
position: relative;
|
|
|
-
|
|
|
- > .del_icon {
|
|
|
+ > .icon_group {
|
|
|
position: absolute;
|
|
|
- top: calc(50% - 7px);
|
|
|
+ bottom: 10px;
|
|
|
right: 10px;
|
|
|
- display: none;
|
|
|
- cursor: pointer;
|
|
|
- }
|
|
|
-
|
|
|
- &:hover {
|
|
|
- background-color: #f2f7ff;
|
|
|
-
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ > i {
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
> .del_icon {
|
|
|
- display: block;
|
|
|
+ display: inline-block;
|
|
|
+ cursor: pointer;
|
|
|
+ margin-left: 10px;
|
|
|
}
|
|
|
}
|
|
|
|