Compare commits

4 Commits

Author SHA1 Message Date
wangzhuo
a6a98eb2b6 fix: 客户人员-编辑-多选组件失去焦点关闭 2025-09-01 13:56:20 +08:00
wangzhuo
d37b721c28 fix: 主归属人-变更审核 2025-09-01 13:50:12 +08:00
wangzhuo
ca7572c542 fix: 客户人员-多选表单、日期表单问题修复 2025-09-01 13:46:13 +08:00
wangzhuo
c10a0be121 fix: 计划查看-头部空白高度修复 2025-09-01 13:29:47 +08:00
11 changed files with 307 additions and 181 deletions

View File

@@ -1,12 +1,5 @@
import request from "@/utils/request"
export function getPersonalPlanList(params) {
return request.post({
url: '/getPersonalPlanList',
params
})
}
// 获取用户信息
export function getUserInfo(data) {
return request.get({
url: '/crm/app/user/getUserInfo',

View File

@@ -43,7 +43,7 @@
</template>
<script setup>
import { onMounted, reactive, ref } from "vue";
import { onMounted, reactive, ref, defineExpose} from "vue";
const props = defineProps({
// 是否显示全部清空按钮
@@ -175,6 +175,17 @@ const handleChange = (index, item) => {
// 触发回调函数
emit("change", changevalue, realValue);
};
// 失去焦点时关闭选项列表
const handleBlur = () => {
active.value = false;
};
// 定义组件实例暴露的方法
defineExpose({
handleBlur
});
</script>
<style lang="scss" scoped>

View File

@@ -168,7 +168,7 @@
<uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top">
<!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange-->
<uni-easyinput v-model="formData.hobby" placeholder="请输入爱好" :disabled="!editable"/>
<multipleSelect :multiple="true" :value="hobbyIndex" downInner :options="hobbyList"
<multipleSelect ref="hobbySelectRef" :multiple="true" downInner :value="hobbyIds" :options="hobbyList"
@change="handleHobbyChange" :slabel="'name'"
></multipleSelect><!--placeholder="请选择爱好标签"-->
@@ -467,20 +467,29 @@ let handleThinkLevelChange = (e) => {
// 系统推荐等级
let recommendLevel = ref("");
let getRecommendLevel = async () => {
if (formData.value.cusEstate && formData.value.functionalRequirements) {
if (formData.value.cusEstate) {
let {cusEstate, functionalRequirements} = formData.value;
let param = {cusEstate, functionalRequirements};
if (formData.value.salesmanThinkLevel) {
param.personnelLevel = formData.value.salesmanThinkLevel;
}
let res = await getCustomerLevel(param).catch(err => {
let res = await getCustomerLevel(param)
/*.catch(err => {
console.error(err, "客户的系统推荐等级获取失败")
})
if (!res.systemRecommendationLevel) {
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
console.log(formData.value.systemThinkLevel + "???")
})*/
try{
if(res.data.systemRecommendationLevel){
formData.value.systemThinkLevel = res.data.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐";
}
}catch(e){
if (res.systemRecommendationLevel) {
formData.value.systemThinkLevel = res.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
}
}
} else {
recommendLevel.value = "无公司等级信息,无法推荐等级";
}
@@ -509,8 +518,7 @@ let handleUserTypeChange = (e) => {
// 选择日期
function handleTenureTimeChange(e) {
let {value} = e.detail;
formData.value.tenureTime = value;
formData.value.tenureTime = e;
}
// 需求层次索引
@@ -533,16 +541,16 @@ let handleDevelopChange = e => {
// 选择生日
function handleBirthdayChange(e) {
let{value} = e.detail
formData.value.birthday = value;
formData.value.birthday = e;
}
// 爱好标签索引
let hobbyIndex = reactive([]);
let hobbyIds = ref([]);
let hobbies = ref([]);
// 选择爱好标签
const handleHobbyChange = (item, value) => {
// console.log("爱好", item, value);
hobbyIndex = value;
const handleHobbyChange = (items, ids) => {
hobbyIds.value = [];
hobbies.value = items;
};
// 选择
const handleNativeChange = (e) => {

View File

@@ -1,3 +1,8 @@
<!--
* @author wangzhuo
* @date 2025年9月1日
* @description 编辑客户人员信息
-->
<template>
<view class="con-body">
<view class="con-bg">
@@ -17,7 +22,7 @@
<!-- 正文内容 -->
<view class="white-bg">
<view class="form-con">
<view class="form-con" @click="handleBlur">
<uni-forms ref="formRef" :model="formData" :rules="rules" label-width="40%">
<!-- 选择客户 -->
<uni-forms-item label="客户名称" name="cusName" required class="f-c-right">
@@ -168,7 +173,7 @@
<uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top">
<!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange-->
<uni-easyinput v-model="formData.hobby" placeholder="请输入爱好"/>
<multipleSelect :multiple="true" :value="hobbyIndex" downInner :options="hobbyList"
<multipleSelect ref="hobbySelectRef" :multiple="true" downInner :value="hobbyIds" :options="hobbyList"
@change="handleHobbyChange" :slabel="'name'"
></multipleSelect><!--placeholder="请选择爱好标签"-->
@@ -468,20 +473,29 @@ let handleThinkLevelChange = (e) => {
// 系统推荐等级
let recommendLevel = ref("");
let getRecommendLevel = async () => {
if (formData.value.cusEstate && formData.value.functionalRequirements) {
if (formData.value.cusEstate) {
let {cusEstate, functionalRequirements} = formData.value;
let param = {cusEstate, functionalRequirements};
if (formData.value.salesmanThinkLevel) {
param.personnelLevel = formData.value.salesmanThinkLevel;
}
let res = await getCustomerLevel(param).catch(err => {
let res = await getCustomerLevel(param)
/*.catch(err => {
console.error(err, "客户的系统推荐等级获取失败")
})
if (!res.systemRecommendationLevel) {
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
console.log(formData.value.systemThinkLevel + "???")
})*/
try{
if(res.data.systemRecommendationLevel){
formData.value.systemThinkLevel = res.data.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐";
}
}catch(e){
if (res.systemRecommendationLevel) {
formData.value.systemThinkLevel = res.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
}
}
} else {
recommendLevel.value = "无公司等级信息,无法推荐等级";
}
@@ -510,8 +524,7 @@ let handleUserTypeChange = (e) => {
// 选择日期
function handleTenureTimeChange(e) {
let {value} = e.detail;
formData.value.tenureTime = value;
formData.value.tenureTime = e;
}
// 需求层次索引
@@ -534,17 +547,19 @@ let handleDevelopChange = e => {
// 选择生日
function handleBirthdayChange(e) {
let{value} = e.detail
formData.value.birthday = value;
formData.value.birthday = e;
}
// 爱好标签索引
let hobbyIndex = reactive([]);
let hobbyIds = ref([]);
let hobbies = ref([]);
// 选择爱好标签
const handleHobbyChange = (item, value) => {
// console.log("爱好", item, value);
hobbyIndex = value;
const handleHobbyChange = (items, ids) => {
console.log('选择爱好', items, ids);
hobbyIds.value = [];
hobbies.value = items;
};
// 选择
const handleNativeChange = (e) => {
formData.value.nativec = (e.detail.value.map(item => {
@@ -567,17 +582,22 @@ let handleWorkingStatusChange = e => {
formData.value.workingStatus = workingStatusList[value].name;
}
const hobbySelectRef = ref(null);
// 多选组件失去焦点关闭
let handleBlur = () => {
if (hobbySelectRef.value) hobbySelectRef.value.handleBlur();
}
let submitForm = async () => {
let hobbyTags = hobbyIndex.map(it => {
let {name} = hobbyList[it];
let hobbyTags = hobbies.value.map(it => {
let {name} = it;
return name;
})
formData.value.iphone = formData.value.mobilePhone; // 特殊处理
const hobbyTagString = hobbyTags.join('');
console.log(hobbyTagString);
if (hobbyTagString || formData.value.hobby) {
formData.value.hobby = formData.value.hobby ? formData.value.hobby + '' + hobbyTagString : hobbyTagString;
formData.value.hobby = hobbyTagString ? (formData.value.hobby ? formData.value.hobby + '' : '') + hobbyTagString : formData.value.hobby;
}
formData.value.iphone = formData.value.mobilePhone; // 特殊处理
// console.log(formData.value, "校验表单数据")
// console.log(recommendLevel);
formData.value.cusName = customerUser.value.cusName;

View File

@@ -21,7 +21,7 @@
<!-- 正文内容 -->
<view class="white-bg">
<view class="form-con">
<view class="form-con" @click="handleBlur">
<uni-forms ref="formRef" :model="formData" :rules="rules" label-width="40%">
<!-- 选择客户 -->
<uni-forms-item label="客户名称" name="cusName" required class="f-c-right">
@@ -178,7 +178,7 @@
<uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top">
<!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange-->
<uni-easyinput v-model="formData.hobby" placeholder="请输入爱好"/>
<multipleSelect :multiple="true" :value="hobbyIndex" downInner :options="hobbyList"
<multipleSelect ref="hobbySelectRef" :multiple="true" downInner :value="hobbyIds" :options="hobbyList"
@change="handleHobbyChange" :slabel="'name'"
></multipleSelect><!--placeholder="请选择爱好标签"-->
@@ -271,7 +271,7 @@
</template>
<script setup>
import {ref, onMounted, computed, reactive} from 'vue'
import {ref, reactive} from 'vue'
import customHeader from '@/components/customHeader.vue'
import multipleSelect from '@/components/multipleSelect.vue'
import {
@@ -284,7 +284,8 @@ import {
} from "./dataMap";
import city from "@/utils/area";
import {getCustomerLevel, saveappCrmCusUserNew} from "@/api/crm/customer/getCustomer";
// 对 multipleSelect 组件的引用
const hobbySelectRef = ref(null);
// 表单引用
const formRef = ref({});
// 表单数据
@@ -448,20 +449,29 @@ let handleThinkLevelChange = (e) => {
// 系统推荐等级
let recommendLevel = ref("");
let getRecommendLevel = async () => {
if (formData.value.cusEstate && formData.value.functionalRequirements) {
if (formData.value.cusEstate) {
let {cusEstate, functionalRequirements} = formData.value;
let param = {cusEstate, functionalRequirements};
if (formData.value.salesmanThinkLevel) {
param.personnelLevel = formData.value.salesmanThinkLevel;
}
let res = await getCustomerLevel(param).catch(err => {
let res = await getCustomerLevel(param)
/*.catch(err => {
console.error(err, "客户的系统推荐等级获取失败")
})
if (!res.systemRecommendationLevel) {
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
console.log(formData.value.systemThinkLevel + "???")
})*/
try{
if(res.data.systemRecommendationLevel){
formData.value.systemThinkLevel = res.data.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐";
}
}catch(e){
if (res.systemRecommendationLevel) {
formData.value.systemThinkLevel = res.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
}
}
} else {
recommendLevel.value = "无公司等级信息,无法推荐等级";
}
@@ -489,9 +499,9 @@ let handleUserTypeChange = (e) => {
}
// 选择日期
function handleTenureTimeChange(e) {
let {value} = e.detail;
formData.value.tenureTime = value;
function handleTenureTimeChange(val) {
console.log(val)
formData.value.tenureTime = val;
}
// 需求层次索引
@@ -513,18 +523,20 @@ let handleDevelopChange = e => {
}
// 选择生日
function handleBirthdayChange(e) {
let{value} = e.detail
formData.value.birthday = value;
function handleBirthdayChange(val) {
formData.value.birthday = val;
}
// 爱好标签索引
let hobbyIndex = reactive([]);
let hobbyIds = ref([]);
let hobbies = ref([]);
// 选择爱好标签
const handleHobbyChange = (item, value) => {
// console.log("爱好", item, value);
hobbyIndex = value;
const handleHobbyChange = (items, ids) => {
console.log('选择爱好', items, ids);
hobbyIds.value = [];
hobbies.value = items;
};
// 选择
const handleNativeChange = (e) => {
formData.value.nativec = (e.detail.value.map(item => {
@@ -546,16 +558,93 @@ let handleWorkingStatusChange = e => {
workingStatusIndex.value = 0;
formData.value.workingStatus = workingStatusList[value].name;
}
let submitForm = async () => {
let hobbyTags = hobbyIndex.map(it => {
let {name} = hobbyList[it];
// 多选组件失去焦点关闭
let handleBlur = () => {
if (hobbySelectRef.value) hobbySelectRef.value.handleBlur();
}
// 提取爱好标签处理逻辑
const processHobbyTags = () => {
let hobbyTags = hobbies.value.map(it => {
let {name} = it;
return name;
})
const hobbyTagString = hobbyTags.join('');
console.log(hobbyTagString);
if (hobbyTagString || formData.value.hobby) {
formData.value.hobby = formData.value.hobby ? formData.value.hobby + '' + hobbyTagString : hobbyTagString;
formData.value.hobby = hobbyTagString ? (formData.value.hobby ? formData.value.hobby + '' : '') + hobbyTagString : formData.value.hobby;
}
};
// 提取表单验证逻辑
const validateForm = async () => {
formData.value.cusName = customerUser.value.cusName;
await formRef.value.validate();
console.log(formData.value, "提交表单数据");
};
// 提取API调用逻辑
const saveCustomerUser = async () => {
uni.showLoading();
try {
const res = await saveappCrmCusUserNew(formData.value);
if(res.code === 200){
uni.showToast({
title: "保存成功"
});
} else {
uni.showToast({
title: "操作失败",
icon: "error"
});
}
setTimeout(() => uni.navigateBack(), 1500);
} catch(err) {
uni.showToast({
icon: 'none',
title: "保存失败"
});
}
finally{
uni.hideLoading()
}
};
// 简化后的 submitForm 方法
let submitForm = async () => {
console.log(formData.value);
try {
if(formData.value.iphone){
formData.value.mobilePhone = formData.value.iphone;
}
// 处理爱好标签
processHobbyTags();
// 表单验证
await validateForm();
// 保存客户人员信息
await saveCustomerUser();
} catch (err) {
uni.showToast({
icon: 'none',
title: '请检查并完善信息'
});
console.warn(err);
}
};
/*let submitForm = async () => {
let hobbyTags = hobbies.value.map(it => {
let {name} = it;
return name;
})
const hobbyTagString = hobbyTags.join('');
console.log(hobbyTagString);
if (hobbyTagString || formData.value.hobby) {
formData.value.hobby = hobbyTagString ? (formData.value.hobby ? formData.value.hobby + '' : '') + hobbyTagString : formData.value.hobby;
}
if(formData.value.iphone){
formData.value.mobilePhone = formData.value.iphone;
}
// console.log(formData.value, "校验表单数据")
// console.log(recommendLevel);
@@ -577,7 +666,7 @@ let submitForm = async () => {
})
}
setTimeout(() => uni.navigateBack(), 1500);
}).catch(err=>{
}).catch(() => {
uni.showToast({
icon: 'none',
title: "保存失败"
@@ -593,7 +682,7 @@ let submitForm = async () => {
})
console.warn(err);
}
}
}*/
</script>

View File

@@ -134,7 +134,7 @@ const upOption = ref({
noMoreSize: 5,
empty: {
tip: '~ 空空如也 ~',
icon: "../../../../static/images/mescroll-empty.png"
icon: "../../static/images/mescroll-empty.png"
},
textLoading: '加载中...',
textNoMore: '已经到底了'

View File

@@ -168,7 +168,7 @@
<uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top">
<!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange-->
<uni-easyinput v-model="formData.hobby" placeholder="请输入爱好" :disabled="!editable"/>
<multipleSelect :multiple="true" :value="hobbyIndex" downInner :options="hobbyList"
<multipleSelect ref="hobbySelectRef" :multiple="true" downInner :value="hobbyIds" :options="hobbyList"
@change="handleHobbyChange" :slabel="'name'"
></multipleSelect><!--placeholder="请选择爱好标签"-->
@@ -439,20 +439,29 @@ let handleThinkLevelChange = (e) => {
// 系统推荐等级
let recommendLevel = ref("");
let getRecommendLevel = async () => {
if (formData.value.cusEstate && formData.value.functionalRequirements) {
if (formData.value.cusEstate) {
let {cusEstate, functionalRequirements} = formData.value;
let param = {cusEstate, functionalRequirements};
if (formData.value.salesmanThinkLevel) {
param.personnelLevel = formData.value.salesmanThinkLevel;
}
let res = await getCustomerLevel(param).catch(err => {
let res = await getCustomerLevel(param)
/*.catch(err => {
console.error(err, "客户的系统推荐等级获取失败")
})
if (!res.systemRecommendationLevel) {
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
console.log(formData.value.systemThinkLevel + "???")
})*/
try{
if(res.data.systemRecommendationLevel){
formData.value.systemThinkLevel = res.data.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐";
}
}catch(e){
if (res.systemRecommendationLevel) {
formData.value.systemThinkLevel = res.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
}
}
} else {
recommendLevel.value = "无公司等级信息,无法推荐等级";
}
@@ -481,8 +490,7 @@ let handleUserTypeChange = (e) => {
// 选择日期
function handleTenureTimeChange(e) {
let {value} = e.detail;
formData.value.tenureTime = value;
formData.value.tenureTime = e;
}
// 需求层次索引
@@ -505,17 +513,19 @@ let handleDevelopChange = e => {
// 选择生日
function handleBirthdayChange(e) {
let{value} = e.detail
formData.value.birthday = value;
formData.value.birthday = e;
}
// 爱好标签索引
let hobbyIndex = reactive([]);
let hobbyIds = ref([]);
let hobbies = ref([]);
// 选择爱好标签
const handleHobbyChange = (item, value) => {
// console.log("爱好", item, value);
hobbyIndex = value;
const handleHobbyChange = (items, ids) => {
console.log('选择爱好', items, ids);
hobbyIds.value = [];
hobbies.value = items;
};
// 选择
const handleNativeChange = (e) => {
formData.value.nativec = (e.detail.value.map(item => {
@@ -539,16 +549,18 @@ let handleWorkingStatusChange = e => {
}
let submitForm = async () => {
let hobbyTags = hobbyIndex.map(it => {
let {name} = hobbyList[it];
let hobbyTags = hobbies.value.map(it => {
let {name} = it;
return name;
})
formData.value.iphone = formData.value.mobilePhone; // 特殊处理
const hobbyTagString = hobbyTags.join('');
console.log(hobbyTagString);
if (hobbyTagString || formData.value.hobby) {
formData.value.hobby = formData.value.hobby ? formData.value.hobby + '' + hobbyTagString : hobbyTagString;
formData.value.hobby = hobbyTagString ? (formData.value.hobby ? formData.value.hobby + '' : '') + hobbyTagString : formData.value.hobby;
}
formData.value.iphone = formData.value.mobilePhone; // 特殊处理
// console.log(formData.value, "校验表单数据")
// console.log(recommendLevel);
formData.value.cusName = customerUser.value.cusName;

View File

@@ -11,7 +11,7 @@
</customHeader>
<!-- 高度来避免头部遮挡 -->
<view class="top-height" :style="{ paddingTop: navBarPaddingTop + 'px' }"></view>
<view class="top-height"></view>
<!-- 正文内容 -->
<view class="all-body">
@@ -122,10 +122,7 @@ let list = ref([]);
const upOption = ref({
page: {num: 0, size: 10},
noMoreSize: 5,
empty: {
tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png"
},
empty: {tip: '~ 空空如也 ~'},
textLoading: '加载中...',
textNoMore: '已经到底了'
});

View File

@@ -8,7 +8,7 @@
<!-- #endif -->
<!-- 高度来避免头部遮挡 -->
<view class="top-height" :style="{ paddingTop: navBarPaddingTop + 'px' }"></view>
<view class="top-height"></view>
<view class="white-bg">
<navigator url="/pages/business/CRM/plan/myPlan">

View File

@@ -11,8 +11,7 @@
</customHeader>
<!-- 高度来避免头部遮挡 -->
<view class="top-height" :style="{ paddingTop: navBarPaddingTop + 'px' }"></view>
<view class="top-height"></view>
<!-- 正文内容 -->
<view>
@@ -144,10 +143,7 @@ const mescrollRef = ref(null);
const upOption = ref({
page: {num: 0, size: 10},
noMoreSize: 5,
empty: {
tip: '~ 空空如也 ~',
icon: "../../../../static/images/mescroll-empty.png"
},
empty: {tip: '~ 空空如也 ~'},
textLoading: '加载中...',
textNoMore: '已经到底了'
});