|
@@ -19,10 +19,12 @@
|
|
<t-form-item label="项目单号">{{ formData.crmNo }} </t-form-item>
|
|
<t-form-item label="项目单号">{{ formData.crmNo }} </t-form-item>
|
|
</t-col>
|
|
</t-col>
|
|
<t-col :span="4">
|
|
<t-col :span="4">
|
|
- <t-form-item label="客户类型">{{ formData.customType }} </t-form-item>
|
|
|
|
|
|
+ <t-form-item label="客户类型"
|
|
|
|
+ >{{ customerTypeFilter(formData.customType) }}
|
|
|
|
+ </t-form-item>
|
|
</t-col>
|
|
</t-col>
|
|
<t-col :span="8">
|
|
<t-col :span="8">
|
|
- <t-form-item label="客户名称">{{ formData.custom }} </t-form-item>
|
|
|
|
|
|
+ <t-form-item label="客户名称">{{ formData.customName }} </t-form-item>
|
|
</t-col>
|
|
</t-col>
|
|
<t-col :span="4">
|
|
<t-col :span="4">
|
|
<t-form-item label="服务档位">{{ formData.level }} </t-form-item>
|
|
<t-form-item label="服务档位">{{ formData.level }} </t-form-item>
|
|
@@ -30,7 +32,7 @@
|
|
<t-col :span="12">
|
|
<t-col :span="12">
|
|
<t-form-item label="客户地址">
|
|
<t-form-item label="客户地址">
|
|
<t-space>
|
|
<t-space>
|
|
- <span>{{ formData.privince }}</span>
|
|
|
|
|
|
+ <span>{{ formData.province }}</span>
|
|
<span>{{ formData.city }}</span>
|
|
<span>{{ formData.city }}</span>
|
|
<span>{{ formData.area }}</span>
|
|
<span>{{ formData.area }}</span>
|
|
<span>{{ formData.address }}</span>
|
|
<span>{{ formData.address }}</span>
|
|
@@ -44,27 +46,27 @@
|
|
size="small"
|
|
size="small"
|
|
row-key="roleId"
|
|
row-key="roleId"
|
|
:columns="roleColumns"
|
|
:columns="roleColumns"
|
|
- :data="formData.roleList"
|
|
|
|
|
|
+ :data="formData.roleConfigInfo"
|
|
|
|
+ bordered
|
|
>
|
|
>
|
|
<template #num="{ row }">
|
|
<template #num="{ row }">
|
|
- <span>{{ row.users.length }}</span>
|
|
|
|
|
|
+ <span>{{ row.userIdList.length }}</span>
|
|
<span>/</span>
|
|
<span>/</span>
|
|
<span>{{ row.quota }}</span>
|
|
<span>{{ row.quota }}</span>
|
|
</template>
|
|
</template>
|
|
<template #users="{ row }">
|
|
<template #users="{ row }">
|
|
<select-type-user
|
|
<select-type-user
|
|
|
|
+ v-model="row.userIdList"
|
|
:type="row.roleType"
|
|
:type="row.roleType"
|
|
:multiple="row.roleType !== 'REGION_COORDINATOR'"
|
|
:multiple="row.roleType !== 'REGION_COORDINATOR'"
|
|
></select-type-user>
|
|
></select-type-user>
|
|
</template>
|
|
</template>
|
|
<template #operate="{ row }">
|
|
<template #operate="{ row }">
|
|
- <div
|
|
|
|
- v-if="row.roleType !== 'REGION_COORDINATOR'"
|
|
|
|
- class="table-operations"
|
|
|
|
- >
|
|
|
|
|
|
+ <div class="table-operations">
|
|
<t-button
|
|
<t-button
|
|
- shape="circle"
|
|
|
|
theme="danger"
|
|
theme="danger"
|
|
|
|
+ shape="square"
|
|
|
|
+ variant="text"
|
|
@click="handleDelete(row)"
|
|
@click="handleDelete(row)"
|
|
>
|
|
>
|
|
<template #icon> <MinusCircleFilledIcon /></template>
|
|
<template #icon> <MinusCircleFilledIcon /></template>
|
|
@@ -76,10 +78,15 @@
|
|
</t-form-item>
|
|
</t-form-item>
|
|
<t-form-item>
|
|
<t-form-item>
|
|
<div class="flex justify-between items-center" style="width: 100%">
|
|
<div class="flex justify-between items-center" style="width: 100%">
|
|
- <select-role
|
|
|
|
- v-model="selectedRoleId"
|
|
|
|
- @change="roleChange"
|
|
|
|
- ></select-role>
|
|
|
|
|
|
+ <t-select v-model="selectedRoleId" @change="roleChange">
|
|
|
|
+ <t-option
|
|
|
|
+ v-for="item in roleList"
|
|
|
|
+ :key="item.id"
|
|
|
|
+ :value="item.id"
|
|
|
|
+ :label="item.name"
|
|
|
|
+ :disabled="configRoleIds.includes(item.id)"
|
|
|
|
+ ></t-option>
|
|
|
|
+ </t-select>
|
|
<t-button
|
|
<t-button
|
|
class="m-l-10px"
|
|
class="m-l-10px"
|
|
theme="primary"
|
|
theme="primary"
|
|
@@ -101,10 +108,16 @@
|
|
</my-dialog>
|
|
</my-dialog>
|
|
</template>
|
|
</template>
|
|
<script setup name="PersonDeployDialog">
|
|
<script setup name="PersonDeployDialog">
|
|
-import { ref } from 'vue';
|
|
|
|
-import { MessagePlugin, MinusCircleFilledIcon } from 'tdesign-vue-next';
|
|
|
|
|
|
+import { computed, onMounted, ref } from 'vue';
|
|
|
|
+import { MessagePlugin } from 'tdesign-vue-next';
|
|
|
|
+import { MinusCircleFilledIcon } from 'tdesign-icons-vue-next';
|
|
import useClearDialog from '@/hooks/useClearDialog';
|
|
import useClearDialog from '@/hooks/useClearDialog';
|
|
-import { personAllocateDeployApi } from '@/api/resource-guard';
|
|
|
|
|
|
+import useAuthenRole from '@/hooks/useAuthenRole';
|
|
|
|
+import {
|
|
|
|
+ personAllocateDeployApi,
|
|
|
|
+ personAllocateRoleDetailApi,
|
|
|
|
+} from '@/api/resource-guard';
|
|
|
|
+import { customerTypeFilter } from '@/utils/filter';
|
|
|
|
|
|
const emit = defineEmits(['update:visible', 'success']);
|
|
const emit = defineEmits(['update:visible', 'success']);
|
|
const props = defineProps({
|
|
const props = defineProps({
|
|
@@ -112,44 +125,83 @@ const props = defineProps({
|
|
curRow: Object,
|
|
curRow: Object,
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+const configRoleIds = computed(() => {
|
|
|
|
+ return formData.roleConfigInfo.map((item) => item.roleId);
|
|
|
|
+});
|
|
|
|
+
|
|
const formRef = ref(null);
|
|
const formRef = ref(null);
|
|
let selectedRole = ref(null);
|
|
let selectedRole = ref(null);
|
|
let selectedRoleId = ref(null);
|
|
let selectedRoleId = ref(null);
|
|
|
|
|
|
|
|
+const { roleList, getRoleList } = useAuthenRole();
|
|
|
|
+
|
|
|
|
+const getDetail = async () => {
|
|
|
|
+ for (let key in formData) {
|
|
|
|
+ formData[key] = props.curRow[key];
|
|
|
|
+ }
|
|
|
|
+ formData.roleConfigInfo = formData.roleConfigInfo || [];
|
|
|
|
+
|
|
|
|
+ const res = await personAllocateRoleDetailApi(props.curRow.crmNo).catch(
|
|
|
|
+ () => {}
|
|
|
|
+ );
|
|
|
|
+ if (!res) return;
|
|
|
|
+
|
|
|
|
+ const roleQuota = {
|
|
|
|
+ REGION_COORDINATOR: props.curRow.coordinatorQuota,
|
|
|
|
+ EFFECT_ENGINEER: props.curRow.effectQuota,
|
|
|
|
+ ASSISTANT_ENGINEER: props.curRow.assistantQuota,
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ if (res.length) {
|
|
|
|
+ let roleConfigMap = {};
|
|
|
|
+
|
|
|
|
+ res.forEach((item) => {
|
|
|
|
+ if (!roleConfigMap[item.roleResult.roleId]) {
|
|
|
|
+ roleConfigMap[item.roleResult.roleId] = {
|
|
|
|
+ quota: roleQuota[item.roleResult.roleType],
|
|
|
|
+ userIdList: [],
|
|
|
|
+ ...item.roleResult,
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ roleConfigMap[item.roleResult.roleId].userIdList.push(item.userId);
|
|
|
|
+ });
|
|
|
|
+ formData.roleConfigInfo = Object.values(roleConfigMap);
|
|
|
|
+ } else {
|
|
|
|
+ const validRoleTypes = Object.keys(roleQuota).filter(
|
|
|
|
+ (item) => roleQuota[item]
|
|
|
|
+ );
|
|
|
|
+ formData.roleConfigInfo = roleList.value
|
|
|
|
+ .filter((item) => validRoleTypes.includes(item.type))
|
|
|
|
+ .map((item) => {
|
|
|
|
+ return {
|
|
|
|
+ quota: roleQuota[item.type],
|
|
|
|
+ userIdList: [],
|
|
|
|
+ roleId: item.id,
|
|
|
|
+ roleName: item.name,
|
|
|
|
+ roleType: item.type,
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
const { formData } = useClearDialog(
|
|
const { formData } = useClearDialog(
|
|
{
|
|
{
|
|
id: null,
|
|
id: null,
|
|
|
|
+ serviceUnitId: null,
|
|
|
|
+ serviceUnitName: '',
|
|
|
|
+ crmNo: '',
|
|
|
|
+ customName: '',
|
|
|
|
+ customType: '',
|
|
|
|
+ province: '',
|
|
|
|
+ city: '',
|
|
|
|
+ area: '',
|
|
level: '',
|
|
level: '',
|
|
- type: '',
|
|
|
|
- devices: null,
|
|
|
|
- enable: true,
|
|
|
|
- roleList: [],
|
|
|
|
|
|
+ roleConfigInfo: [],
|
|
},
|
|
},
|
|
props,
|
|
props,
|
|
formRef,
|
|
formRef,
|
|
- () => {
|
|
|
|
- for (let key in formData) {
|
|
|
|
- formData[key] = props.curRow[key];
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ getDetail
|
|
);
|
|
);
|
|
-const rules = {
|
|
|
|
- roleList: [
|
|
|
|
- {
|
|
|
|
- validator: (val) => {
|
|
|
|
- if (!val || !val.length)
|
|
|
|
- return { result: false, message: '请填写至少一个角色' };
|
|
|
|
-
|
|
|
|
- if (val.some((item) => !item.quota))
|
|
|
|
- return { result: false, message: '有角色未设置配额' };
|
|
|
|
-
|
|
|
|
- return { result: true, type: 'success' };
|
|
|
|
- },
|
|
|
|
- type: 'error',
|
|
|
|
- trigger: 'change',
|
|
|
|
- },
|
|
|
|
- ],
|
|
|
|
-};
|
|
|
|
|
|
|
|
const roleColumns = [
|
|
const roleColumns = [
|
|
{ colKey: 'roleName', title: '项目角色', width: 120 },
|
|
{ colKey: 'roleName', title: '项目角色', width: 120 },
|
|
@@ -163,31 +215,40 @@ const dialogOpened = () => {
|
|
selectedRoleId.value = null;
|
|
selectedRoleId.value = null;
|
|
};
|
|
};
|
|
|
|
|
|
-const roleChange = (role) => {
|
|
|
|
- selectedRole.value = role;
|
|
|
|
|
|
+const roleChange = () => {
|
|
|
|
+ selectedRole.value = roleList.value.find(
|
|
|
|
+ (item) => item.id === selectedRoleId.value
|
|
|
|
+ );
|
|
};
|
|
};
|
|
const toAddRole = () => {
|
|
const toAddRole = () => {
|
|
- if (formData.roleList.some((item) => item.roleId === selectedRole.value.id)) {
|
|
|
|
|
|
+ if (
|
|
|
|
+ formData.roleConfigInfo.some(
|
|
|
|
+ (item) => item.roleId === selectedRole.value.id
|
|
|
|
+ )
|
|
|
|
+ ) {
|
|
MessagePlugin.error('当前角色已经被选过!');
|
|
MessagePlugin.error('当前角色已经被选过!');
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- formData.roleList.push({
|
|
|
|
|
|
+ formData.roleConfigInfo.push({
|
|
quota: 1,
|
|
quota: 1,
|
|
- users: [],
|
|
|
|
|
|
+ userIdList: [],
|
|
roleId: selectedRole.value.id,
|
|
roleId: selectedRole.value.id,
|
|
roleName: selectedRole.value.name,
|
|
roleName: selectedRole.value.name,
|
|
roleType: selectedRole.value.type,
|
|
roleType: selectedRole.value.type,
|
|
});
|
|
});
|
|
|
|
+
|
|
|
|
+ selectedRole.value = null;
|
|
|
|
+ selectedRoleId.value = null;
|
|
};
|
|
};
|
|
const handleDelete = (row) => {
|
|
const handleDelete = (row) => {
|
|
- formData.roleList = formData.roleList.filter(
|
|
|
|
|
|
+ formData.roleConfigInfo = formData.roleConfigInfo.filter(
|
|
(item) => item.roleId !== row.roleId
|
|
(item) => item.roleId !== row.roleId
|
|
);
|
|
);
|
|
};
|
|
};
|
|
|
|
|
|
const checkRoleList = () => {
|
|
const checkRoleList = () => {
|
|
- const val = formData.roleList;
|
|
|
|
|
|
+ const val = formData.roleConfigInfo;
|
|
if (!val || !val.length)
|
|
if (!val || !val.length)
|
|
return { result: false, message: '至少配置一个角色' };
|
|
return { result: false, message: '至少配置一个角色' };
|
|
|
|
|
|
@@ -203,11 +264,26 @@ const save = async () => {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- const res = await personAllocateDeployApi(formData).catch(() => {});
|
|
|
|
|
|
+ let data = {
|
|
|
|
+ serviceUnitId: formData.serviceUnitId,
|
|
|
|
+ crmNo: formData.crmNo,
|
|
|
|
+ allocationParams: formData.roleConfigInfo.map((item) => {
|
|
|
|
+ return {
|
|
|
|
+ roleId: item.roleId,
|
|
|
|
+ userIdList: item.userIdList,
|
|
|
|
+ };
|
|
|
|
+ }),
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const res = await personAllocateDeployApi(data).catch(() => {});
|
|
if (!res) return;
|
|
if (!res) return;
|
|
|
|
|
|
MessagePlugin.success('保存成功');
|
|
MessagePlugin.success('保存成功');
|
|
emit('update:visible', false);
|
|
emit('update:visible', false);
|
|
emit('success');
|
|
emit('success');
|
|
};
|
|
};
|
|
|
|
+
|
|
|
|
+onMounted(() => {
|
|
|
|
+ getRoleList();
|
|
|
|
+});
|
|
</script>
|
|
</script>
|