Skip to content

Commit b3ed46d

Browse files
committed
Merge remote-tracking branch 'yudao/dev' into crm-msg
2 parents c38bbb9 + 64cfcbf commit b3ed46d

File tree

20 files changed

+406
-306
lines changed

20 files changed

+406
-306
lines changed

src/api/crm/followup/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ export interface FollowUpRecordVO {
77
bizId: number // 数据编号
88
type: number // 跟进类型
99
content: string // 跟进内容
10+
picUrls: string[] // 图片
11+
fileUrls: string[] // 附件
1012
nextTime: Date // 下次联系时间
1113
businessIds: number[] // 关联的商机编号数组
1214
contactIds: number[] // 关联的联系人编号数组

src/api/crm/permission/index.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import request from '@/config/axios'
22

33
export interface PermissionVO {
44
id?: number // 数据权限编号
5-
userId: number | undefined // 用户编号
6-
bizType: number | undefined // Crm 类型
7-
bizId: number | undefined // Crm 类型数据编号
8-
level: number | undefined // 权限级别
5+
userId: number // 用户编号
6+
bizType: number // Crm 类型
7+
bizId: number // Crm 类型数据编号
8+
level: number // 权限级别
99
deptName?: string // 部门名称
1010
nickname?: string // 用户昵称
1111
postNames?: string[] // 岗位名称数组
1212
createTime?: Date
13+
ids?: number[]
1314
}
1415

1516
/**
@@ -50,11 +51,11 @@ export const updatePermission = async (data) => {
5051
}
5152

5253
// 删除数据权限(删除团队成员)
53-
export const deletePermissionBatch = async (params) => {
54-
return await request.delete({ url: '/crm/permission/delete', params })
54+
export const deletePermissionBatch = async (val: number[]) => {
55+
return await request.delete({ url: '/crm/permission/delete?ids=' + val.join(',') })
5556
}
5657

5758
// 删除自己的数据权限(退出团队)
58-
export const deleteSelfPermission = async (id) => {
59-
return await request.delete({ url: '/crm/permission/quit-team?id=' + id })
59+
export const deleteSelfPermission = async (id: number) => {
60+
return await request.delete({ url: '/crm/permission/delete-self?id=' + id })
6061
}

src/components/UploadFile/src/UploadImgs.vue

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<Icon icon="ep:zoom-in" />
2929
<span>查看</span>
3030
</div>
31-
<div class="handle-icon" @click="handleRemove(file)" v-if="!disabled">
31+
<div v-if="!disabled" class="handle-icon" @click="handleRemove(file)">
3232
<Icon icon="ep:delete" />
3333
<span>删除</span>
3434
</div>
@@ -46,7 +46,6 @@
4646
</div>
4747
</template>
4848
<script lang="ts" setup>
49-
import { PropType } from 'vue'
5049
import type { UploadFile, UploadProps, UploadUserFile } from 'element-plus'
5150
import { ElNotification } from 'element-plus'
5251
@@ -70,10 +69,7 @@ type FileTypes =
7069
| 'image/x-icon'
7170
7271
const props = defineProps({
73-
modelValue: {
74-
type: Array as PropType<UploadUserFile[]>,
75-
required: true
76-
},
72+
modelValue: propTypes.oneOfType<string | string[]>([String, Array<String>]).isRequired,
7773
updateUrl: propTypes.string.def(import.meta.env.VITE_UPLOAD_URL),
7874
drag: propTypes.bool.def(true), // 是否支持拖拽上传 ==> 非必传(默认为 true)
7975
disabled: propTypes.bool.def(false), // 是否禁用上传组件 ==> 非必传(默认为 false)
@@ -91,18 +87,8 @@ const uploadHeaders = ref({
9187
})
9288
9389
const fileList = ref<UploadUserFile[]>([])
94-
// fix: 改为动态监听赋值解决图片回显问题
95-
watch(
96-
() => props.modelValue,
97-
(data) => {
98-
if (!data) return
99-
fileList.value = data
100-
},
101-
{
102-
deep: true,
103-
immediate: true
104-
}
105-
)
90+
const uploadNumber = ref<number>(0)
91+
const uploadList = ref<UploadUserFile[]>([])
10692
/**
10793
* @description 文件上传之前判断
10894
* @param rawFile 上传的文件
@@ -122,29 +108,61 @@ const beforeUpload: UploadProps['beforeUpload'] = (rawFile) => {
122108
message: `上传图片大小不能超过 ${props.fileSize}M!`,
123109
type: 'warning'
124110
})
111+
uploadNumber.value++
125112
return imgType.includes(rawFile.type as FileTypes) && imgSize
126113
}
127114
128115
// 图片上传成功
129116
interface UploadEmits {
130-
(e: 'update:modelValue', value: UploadUserFile[]): void
117+
(e: 'update:modelValue', value: string[]): void
131118
}
132119
133120
const emit = defineEmits<UploadEmits>()
134-
const uploadSuccess = (response, uploadFile: UploadFile) => {
135-
if (!response) return
136-
// TODO 多图上传组件成功后只是把保存成功后的url替换掉组件选图时的文件路径,所以返回的fileList包含的是一个包含文件信息的对象列表
137-
uploadFile.url = response.data
138-
emit('update:modelValue', fileList.value)
121+
const uploadSuccess: UploadProps['onSuccess'] = (res: any): void => {
139122
message.success('上传成功')
123+
// 删除自身
124+
debugger
125+
const index = fileList.value.findIndex((item) => item.response?.data === res.data)
126+
fileList.value.splice(index, 1)
127+
uploadList.value.push({ name: res.data, url: res.data })
128+
if (uploadList.value.length == uploadNumber.value) {
129+
fileList.value.push(...uploadList.value)
130+
uploadList.value = []
131+
uploadNumber.value = 0
132+
emitUpdateModelValue()
133+
}
140134
}
141135
136+
// 监听模型绑定值变动
137+
watch(
138+
() => props.modelValue,
139+
(val: string | string[]) => {
140+
if (!val) {
141+
fileList.value = [] // fix:处理掉缓存,表单重置后上传组件的内容并没有重置
142+
return
143+
}
144+
145+
fileList.value = [] // 保障数据为空
146+
fileList.value.push(
147+
...(val as string[]).map((url) => ({ name: url.substring(url.lastIndexOf('/') + 1), url }))
148+
)
149+
},
150+
{ immediate: true, deep: true }
151+
)
152+
// 发送图片链接列表更新
153+
const emitUpdateModelValue = () => {
154+
let result: string[] = fileList.value.map((file) => file.url!)
155+
emit('update:modelValue', result)
156+
}
142157
// 删除图片
143158
const handleRemove = (uploadFile: UploadFile) => {
144159
fileList.value = fileList.value.filter(
145160
(item) => item.url !== uploadFile.url || item.name !== uploadFile.name
146161
)
147-
emit('update:modelValue', fileList.value)
162+
emit(
163+
'update:modelValue',
164+
fileList.value.map((file) => file.url!)
165+
)
148166
}
149167
150168
// 图片上传错误提示

src/views/crm/backlog/tables/TodayCustomer.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.dealStatus" />
8383
</template>
8484
</el-table-column>
85-
<!-- TODO @puhui999:距进入公海天数 -->
85+
<el-table-column align="center" label="距进入公海天数" prop="poolDay" width="100px" />
8686
<el-table-column
8787
:formatter="dateFormatter"
8888
align="center"

src/views/crm/clue/ClueForm.vue

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,6 @@
1010
<el-form-item label="线索名称" prop="name">
1111
<el-input v-model="formData.name" placeholder="请输入线索名称" />
1212
</el-form-item>
13-
<!-- TODO 芋艿:后续客户的选择 -->
14-
<el-form-item label="客户" prop="customerId">
15-
<el-select v-model="formData.customerId" clearable placeholder="请选择客户">
16-
<el-option
17-
v-for="item in customerList"
18-
:key="item.id"
19-
:label="item.name"
20-
:value="item.id"
21-
/>
22-
</el-select>
23-
</el-form-item>
2413
<el-form-item label="下次联系时间" prop="contactNextTime">
2514
<el-date-picker
2615
v-model="formData.contactNextTime"
@@ -38,9 +27,15 @@
3827
<el-form-item label="地址" prop="address">
3928
<el-input v-model="formData.address" placeholder="请输入地址" />
4029
</el-form-item>
41-
<!-- TODO wanwan 负责人选择 -->
42-
<el-form-item label="负责人" prop="ownerUserId">
43-
<el-input v-model="formData.ownerUserId" placeholder="请输入负责人" />
30+
<el-form-item v-if="formType === 'create'" label="负责人" prop="userIds" span="24">
31+
<el-select v-model="formData.ownerUserId">
32+
<el-option
33+
v-for="item in userOptions"
34+
:key="item.id"
35+
:label="item.nickname"
36+
:value="item.id"
37+
/>
38+
</el-select>
4439
</el-form-item>
4540
<el-form-item label="备注" prop="remark">
4641
<el-input v-model="formData.remark" placeholder="请输入备注" />
@@ -54,20 +49,20 @@
5449
</template>
5550
<script setup lang="ts">
5651
import * as ClueApi from '@/api/crm/clue'
57-
import * as CustomerApi from '@/api/crm/customer'
52+
import {CACHE_KEY, useCache} from "@/hooks/web/useCache";
53+
import * as UserApi from "@/api/system/user";
5854
5955
const { t } = useI18n() // 国际化
6056
const message = useMessage() // 消息弹窗
6157
6258
const dialogVisible = ref(false) // 弹窗的是否展示
6359
const dialogTitle = ref('') // 弹窗的标题
64-
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
60+
const formLoading = ref(false) // 表单加载中:1)修改时的数据加载;2)提交的按钮禁用
6561
const formType = ref('') // 表单的类型:create - 新增;update - 修改
66-
const customerList = ref([]) // 客户列表
62+
const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
6763
const formData = ref({
6864
id: undefined,
6965
name: undefined,
70-
customerId: undefined,
7166
contactNextTime: undefined,
7267
telephone: undefined,
7368
mobile: undefined,
@@ -78,7 +73,7 @@ const formData = ref({
7873
})
7974
const formRules = reactive({
8075
name: [{ required: true, message: '线索名称不能为空', trigger: 'blur' }],
81-
customerId: [{ required: true, message: '客户不能为空', trigger: 'blur' }]
76+
ownerUserId: [{ required: true, message: '负责人不能为空', trigger: 'blur' }]
8277
})
8378
const formRef = ref() // 表单 Ref
8479
@@ -88,12 +83,6 @@ const open = async (type: string, id?: number) => {
8883
dialogTitle.value = t('action.' + type)
8984
formType.value = type
9085
resetForm()
91-
const customerData = await CustomerApi.getCustomerPage({
92-
pageNo: 1,
93-
pageSize: 100,
94-
pool: false
95-
})
96-
customerList.value = customerData.list
9786
// 修改时,设置数据
9887
if (id) {
9988
formLoading.value = true
@@ -103,6 +92,14 @@ const open = async (type: string, id?: number) => {
10392
formLoading.value = false
10493
}
10594
}
95+
// 获得用户列表
96+
userOptions.value = await UserApi.getSimpleUserList()
97+
// 新建时负责人默认为登录人
98+
if (formType.value === 'create') {
99+
const { wsCache } = useCache()
100+
const user = wsCache.get(CACHE_KEY.USER).user
101+
formData.value.ownerUserId = user.id
102+
}
106103
}
107104
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
108105
@@ -137,7 +134,6 @@ const resetForm = () => {
137134
formData.value = {
138135
id: undefined,
139136
name: undefined,
140-
customerId: undefined,
141137
contactNextTime: undefined,
142138
telephone: undefined,
143139
mobile: undefined,

src/views/crm/customer/detail/index.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
:biz-id="customer.id!"
5252
:biz-type="BizTypeEnum.CRM_CUSTOMER"
5353
:show-action="!permissionListRef?.isPool || false"
54+
@quit-team="close"
5455
/>
5556
</el-tab-pane>
5657
<el-tab-pane label="商机" lazy>

0 commit comments

Comments
 (0)