添加跟进人

This commit is contained in:
WindowBird 2025-11-13 14:52:54 +08:00
parent 285c7ae0f7
commit f4fd1f39a3
4 changed files with 104 additions and 7 deletions

View File

@ -60,3 +60,15 @@ export const logout = () => {
});
};
/**
* 获取所有用户列表
* @returns {Promise<Array>} 返回用户列表
*/
export const getUserListAll = () => {
return uni.$uv.http.get('system/user/listAll', {
custom: {
auth: true // 启用 token 认证
}
});
};

View File

@ -88,6 +88,13 @@
<text v-else class="form-placeholder">选择微信好友</text>
<text class="arrow"></text>
</view>
<!-- 跟进人 -->
<view class="form-item clickable-item" @click="$emit('open-picker', 'followUser')">
<text v-if="formData.followName" class="form-value">{{ formData.followName }}</text>
<text v-else class="form-placeholder">选择跟进人</text>
<text class="arrow"></text>
</view>
</view>
</template>

View File

@ -174,6 +174,29 @@
</view>
</view>
</view>
<!-- 跟进人选择弹窗 -->
<view v-if="showFollowUserPicker" class="modal-mask" @click="closePicker('followUser')">
<view class="modal-content" @click.stop>
<view class="modal-title">选择跟进人</view>
<view class="picker-options">
<view
v-for="item in followUserOptions"
:key="item.userId"
class="picker-option"
:class="{ active: String(tempFollowUserId) === String(item.userId) }"
@click="selectFollowUser(item.userId)"
>
<text>{{ item.nickName }}</text>
<text v-if="String(tempFollowUserId) === String(item.userId)" class="check"></text>
</view>
</view>
<view class="modal-buttons">
<button class="modal-btn" @click="closePicker('followUser')">取消</button>
<button class="modal-btn primary" @click="confirmFollowUser">确定</button>
</view>
</view>
</view>
</template>
<script setup>
@ -187,12 +210,14 @@ const props = defineProps({
showCustomerStatusPicker: Boolean,
showWorkWechatPicker: Boolean,
showNextFollowTimePicker: Boolean,
showFollowUserPicker: Boolean,
customerTypeOptions: Array,
sourceOptions: Array,
intentOptions: Array,
intentLevelOptions: Array,
customerStatusOptions: Array,
workWechatOptions: Array,
followUserOptions: Array,
addressList: Array,
regionLoading: Boolean,
formData: Object
@ -209,6 +234,7 @@ const tempCustomerStatus = ref('');
const tempWorkWechat = ref('');
const tempNextFollowDate = ref('');
const tempNextFollowTime = ref('');
const tempFollowUserId = ref('');
const regionPicker = ref(null);
@ -221,6 +247,7 @@ watch(() => props.formData, (newData) => {
tempIntentLevel.value = newData.intentLevel || '';
tempCustomerStatus.value = newData.customerStatus || '';
tempWorkWechat.value = newData.workWechatId || '';
tempFollowUserId.value = newData.followId || '';
if (newData.nextFollowTime) {
const [date, time] = newData.nextFollowTime.split(' ');
tempNextFollowDate.value = date || '';
@ -356,6 +383,23 @@ const confirmNextFollowTime = () => {
closePicker('nextFollowTime');
};
//
const selectFollowUser = (userId) => {
tempFollowUserId.value = String(userId);
};
const confirmFollowUser = () => {
const selectedUser = props.followUserOptions.find(u => String(u.userId) === String(tempFollowUserId.value));
if (selectedUser) {
emit('update:formData', {
...props.formData,
followId: String(selectedUser.userId),
followName: selectedUser.nickName
});
}
closePicker('followUser');
};
//
const onRegionChange = (e) => {
emit('region-change', e);

View File

@ -40,12 +40,14 @@
:show-customer-status-picker="showCustomerStatusPicker"
:show-work-wechat-picker="showWorkWechatPicker"
:show-next-follow-time-picker="showNextFollowTimePicker"
:show-follow-user-picker="showFollowUserPicker"
:customer-type-options="customerTypeOptions"
:source-options="sourceOptions"
:intent-options="intentOptions"
:intent-level-options="intentLevelOptions"
:customer-status-options="customerStatusOptions"
:work-wechat-options="workWechatOptions"
:follow-user-options="followUserOptions"
:address-list="addressList"
:region-loading="regionLoading"
:form-data="formData"
@ -60,7 +62,7 @@
<script setup>
import { ref, onMounted } from 'vue';
import { createCustomer } from '@/api';
import { createCustomer, getUserListAll } from '@/api';
import { useUserStore } from '@/store/user';
import { useCustomerForm } from '@/composables/useCustomerForm';
import CustomerFormNavbar from '@/components/customer/customer-form/CustomerFormNavbar.vue';
@ -105,7 +107,9 @@ const formData = ref({
pain: '',
attention: '',
demand: '',
nextFollowTime: ''
nextFollowTime: '',
followId: null,
followName: ''
});
//
@ -117,6 +121,10 @@ const showIntentLevelPicker = ref(false);
const showCustomerStatusPicker = ref(false);
const showWorkWechatPicker = ref(false);
const showNextFollowTimePicker = ref(false);
const showFollowUserPicker = ref(false);
//
const followUserOptions = ref([]);
const pickersRef = ref(null);
@ -147,6 +155,9 @@ const handleOpenPicker = (pickerType) => {
case 'nextFollowTime':
showNextFollowTimePicker.value = true;
break;
case 'followUser':
showFollowUserPicker.value = true;
break;
}
};
@ -174,6 +185,9 @@ const handleClosePicker = (pickerType) => {
case 'nextFollowTime':
showNextFollowTimePicker.value = false;
break;
case 'followUser':
showFollowUserPicker.value = false;
break;
}
};
@ -192,12 +206,30 @@ const handleCancel = () => {
uni.navigateBack();
};
//
const loadUserList = async () => {
try {
const res = await getUserListAll();
if (res && res.data && Array.isArray(res.data)) {
followUserOptions.value = res.data;
} else if (res && Array.isArray(res)) {
followUserOptions.value = res;
} else {
followUserOptions.value = [];
}
} catch (error) {
console.error('加载用户列表失败:', error);
followUserOptions.value = [];
}
};
//
onMounted(async () => {
await Promise.all([
loadRegionTree(),
loadDictData(),
loadWechatList()
loadWechatList(),
loadUserList()
]);
// =label=value=label=value
@ -262,9 +294,6 @@ const handleSave = async () => {
saving.value = true;
try {
const userStore = useUserStore();
const userId = userStore.userInfo?.id || userStore.userInfo?.userId || '1';
const now = new Date();
const formatDateTime = (date) => {
const year = date.getFullYear();
@ -279,6 +308,11 @@ const handleSave = async () => {
const intentsArray = Array.isArray(formData.value.intents) ? formData.value.intents : [];
const regionIdsArray = formData.value.regionIds || [];
// 使ID使ID
const userStore = useUserStore();
const defaultUserId = userStore.userInfo?.id || userStore.userInfo?.userId || '1';
const followId = formData.value.followId || defaultUserId;
const submitData = {
id: null,
code: null,
@ -289,7 +323,7 @@ const handleSave = async () => {
wechat: formData.value.wechat.trim() || null,
source: formData.value.source || null,
intents: intentsArray,
followId: userId,
followId: followId,
remark: formData.value.remark.trim() || null,
type: '2',
workWechatId: formData.value.workWechatId || null,