初审员新增了重审员选择

master
doublekou 11 months ago
parent 576c4cd3b4
commit 96a73f5b99

@ -106,7 +106,7 @@ export function getDetail(customId: customId) {
* @param customerDto * @param customerDto
*/ */
export function auditCustomer(customerDto: auditDTO) { export function auditCustomer(customerDto: auditDTO) {
return httpClient.post<ApiResult<void>>('/custom/audit', customerDto) return httpClient.post<ApiResult<void>>('/custom/reAudit', customerDto)
} }
// export function auditCustomer(customerDto: CustomerDTO) { // export function auditCustomer(customerDto: CustomerDTO) {
// return httpClient.get<ApiResult>('/custom/audit', { // return httpClient.get<ApiResult>('/custom/audit', {
@ -126,11 +126,17 @@ export function getStoreData(pageParams: storePageParam) {
* *
* *
*/ */
export function updateCustomerAudit(customId: number, status: number, salesmanType: number) { export function updateCustomerAudit(
customId: number,
status: number,
salesmanType: number,
reviewUserId: undefined | number
) {
return httpClient.post<ApiResult>('/custom/audit', { return httpClient.post<ApiResult>('/custom/audit', {
customId, customId,
status, status,
salesmanType salesmanType,
reviewUserId
}) })
} }
/** /**
@ -142,3 +148,10 @@ export function getCustomDetails(id: number) {
params: { id } params: { id }
}) })
} }
/**
*
*
*/
export function selectedReviewerList() {
return httpClient.get<ApiResult>('/system/user/review/list')
}

@ -275,6 +275,8 @@ export interface FormReviewSearch {
// salesmanType: string | undefined // salesmanType: string | undefined
//编号 //编号
batchNo?: string batchNo?: string
//备注
remark?: string
// 访问时间区间的开始值 // 访问时间区间的开始值
startTime?: string startTime?: string
// 访问时间区间的结束值 // 访问时间区间的结束值

@ -6,7 +6,8 @@ import type {
SysUserPageParam, SysUserPageParam,
SysUserPageVO, SysUserPageVO,
SysUserPassDTO, SysUserPassDTO,
SysUserScope SysUserScope,
SysUserChargeDTO
} from '@/api/system/user/types' } from '@/api/system/user/types'
import type { SysUserStatus } from '@/api/system/user/types' import type { SysUserStatus } from '@/api/system/user/types'
import type { ApiResult } from '@/api/types' import type { ApiResult } from '@/api/types'
@ -41,7 +42,7 @@ export function updateUser(userUpdateDto: SysUserDTO) {
* *
* @param userId id * @param userId id
*/ */
export function deleteUser(userId: number) { export function deleteUser(userId: number | undefined) {
return httpClient.delete<ApiResult<void>>(`/system/user/${userId}`) return httpClient.delete<ApiResult<void>>(`/system/user/${userId}`)
} }
@ -61,7 +62,7 @@ export function updateUserStatus(userIds: number[], status: SysUserStatus) {
* @param userId id * @param userId id
* @param fileObj * @param fileObj
*/ */
export function updateUserAvatar(userId: Key, fileObj: FileObject) { export function updateUserAvatar(userId: Key | undefined, fileObj: FileObject) {
const formData = new FormData() const formData = new FormData()
formData.append('file', fileObj.data, fileObj.name) formData.append('file', fileObj.data, fileObj.name)
formData.append('userId', userId + '') formData.append('userId', userId + '')
@ -93,5 +94,10 @@ export function updateUserScope(userId: number, userScope: SysUserScope) {
export function updateUserPassword(userId: number, data: SysUserPassDTO) { export function updateUserPassword(userId: number, data: SysUserPassDTO) {
return httpClient.put<ApiResult<void>>(`/system/user/pass/${userId}`, data) return httpClient.put<ApiResult<void>>(`/system/user/pass/${userId}`, data)
} }
/**
*
* @param chargeDto
*/
export function chargeClue(chargeDto: SysUserChargeDTO) {
return httpClient.post<ApiResult<void>>('/system/user/recharge', chargeDto)
}

@ -45,6 +45,7 @@ export type SysUserPageParam = SysUserQO & PageParam
* *
*/ */
export type SysUserPageVO = { export type SysUserPageVO = {
userId?: number
id: number id: number
name: string name: string
labelList: Array<object> labelList: Array<object>
@ -248,3 +249,8 @@ export type clueStageDTO = {
desc: clueStageState desc: clueStageState
// stage?: objectState // stage?: objectState
} }
//充值
export type SysUserChargeDTO = {
userId: number | undefined
rechargeClueNum: number | undefined
}

@ -134,6 +134,7 @@ const menuState = reactive<{
watchEffect(() => { watchEffect(() => {
const matchedRoutes = route.matched const matchedRoutes = route.matched
console.log(matchedRoutes, 'matchedRoutes')
menuState.selectedKeys = matchedRoutes.filter(x => x.path !== '/').map(x => x.path) menuState.selectedKeys = matchedRoutes.filter(x => x.path !== '/').map(x => x.path)
menuState.matchMenuKeys = matchedRoutes.filter(x => x.path !== '/').map(x => x.path) menuState.matchMenuKeys = matchedRoutes.filter(x => x.path !== '/').map(x => x.path)
}) })

@ -24,6 +24,8 @@ const includeComponentNames = computed(() => [...multiTabStore.cachedComponentNa
// 使 ComponentName key keepAlive // 使 ComponentName key keepAlive
const getComponentKey = (Component: VNode, route: RouteLocationNormalizedLoaded) => { const getComponentKey = (Component: VNode, route: RouteLocationNormalizedLoaded) => {
// console.log(Component, 'Component')
// console.log(route, 'route')
if (multiTabStore.contentLoading) return emptyNodeName if (multiTabStore.contentLoading) return emptyNodeName
if (Component) { if (Component) {
const componentName = (Component.type as Component).name const componentName = (Component.type as Component).name

@ -65,13 +65,13 @@ const constantRoutes: RouteRecordRaw[] = [
// } // }
// ] // ]
// }, // },
// { {
// //个人中心 //个人中心
// path: '/user/center', path: '/user/center',
// name: '个人中心', name: '个人中心',
// component: () => import('@/views/user/center/updateEmail.vue'), component: () => import('@/views/system/userCenter/personCenter.vue'),
// meta: { title: '个人中心', withoutLayout: true } meta: { title: '个人中心', withoutLayout: true }
// }, },
// { // {
// // OAuth2 授权码登录处理页 // // OAuth2 授权码登录处理页
// path: '/clueaccess/clueImport', // path: '/clueaccess/clueImport',

@ -24,7 +24,9 @@ export const generatorDynamicRouter = (userMenus: SysMenuRouterVO[]): RouteRecor
const routes: RouteRecordRaw = { ...HOME_ROUTE } const routes: RouteRecordRaw = { ...HOME_ROUTE }
// 后端数据, 根级树数组, 根级 PID // 后端数据, 根级树数组, 根级 PID
const menuTree = listToTree(userMenus, 0) as SysMenuRouterTree[] const menuTree = listToTree(userMenus, 0) as SysMenuRouterTree[]
routes.children = menuToRoutes(menuTree) routes.children = menuToRoutes(menuTree)
console.log('routes', routes)
routes.children.push(buildNotFoundRoute('PageNotFound')) routes.children.push(buildNotFoundRoute('PageNotFound'))
fillRedirect(routes) fillRedirect(routes)

@ -25,6 +25,7 @@ const routerGuards = (router: Router) => {
const userMenus = await userStore.fetchUserMenus() const userMenus = await userStore.fetchUserMenus()
if (userMenus) { if (userMenus) {
const dynamicRouter = generatorDynamicRouter(userMenus) const dynamicRouter = generatorDynamicRouter(userMenus)
router.addRoute(dynamicRouter) router.addRoute(dynamicRouter)
return to.fullPath return to.fullPath
} }

@ -29,6 +29,34 @@ export const useUserStore = defineStore('userStore', {
actions: { actions: {
async fetchUserMenus() { async fetchUserMenus() {
const { data } = await getLoginUserMenus() const { data } = await getLoginUserMenus()
data.push({
path: 'usercenter',
hidden: 1,
icon: '',
id: 101000,
keepAlive: 1,
parentId: 100000,
remarks: '',
targetType: 1,
title: '个人中心',
type: 1,
uri: 'system/userCenter/personCenter'
})
if (!data.some(obj => obj.path === 'system')) {
data.push({
path: 'system',
hidden: 1, //0是显示,1是隐藏
icon: 'setting',
id: 100000,
keepAlive: 0,
parentId: 0,
remarks: '',
targetType: 1,
title: '系统用户',
type: 0,
uri: ''
})
}
this.userMenus = data this.userMenus = data
return data return data
}, },

@ -27,7 +27,7 @@
<operation-group> <operation-group>
<!-- <a v-if="record.enrollStatus !== 2" @click="handleAudit(record)"></a> --> <!-- <a v-if="record.enrollStatus !== 2" @click="handleAudit(record)"></a> -->
<a v-if="record.enrollStatus !== 2" @click="handleEdit(record)"></a> <a v-if="record.enrollStatus !== 2" @click="handleEdit(record)"></a>
<a v-if="record.enrollStatus !== 2" @click="handleDistribute(record)"></a> <a v-if="record.enrollStatus !== 2" @click="handleDistribute(record)"></a>
<span v-else>-</span> <span v-else>-</span>
</operation-group> </operation-group>
</template> </template>
@ -120,6 +120,10 @@ const columns: ProColumns[] = [
title: '联系方式', title: '联系方式',
dataIndex: 'customNid' dataIndex: 'customNid'
}, },
{
title: '备注',
dataIndex: 'remark'
},
{ {
title: '审核状态', title: '审核状态',
dataIndex: 'enrollStatus', dataIndex: 'enrollStatus',

@ -7,6 +7,11 @@
<a-input v-model:value="formModel.batchNo" placeholder="请输入" /> <a-input v-model:value="formModel.batchNo" placeholder="请输入" />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :xl="8" :md="12" :sm="24">
<a-form-item label="备注">
<a-input v-model:value="formModel.remark" placeholder="请输入" />
</a-form-item>
</a-col>
<a-col :xl="8" :md="12" :sm="24"> <a-col :xl="8" :md="12" :sm="24">
<a-form-item label="填写时间"> <a-form-item label="填写时间">
<a-range-picker <a-range-picker
@ -52,7 +57,8 @@ const emits = defineEmits<{
const searchTimeValue = ref<[Dayjs, Dayjs]>() const searchTimeValue = ref<[Dayjs, Dayjs]>()
const formModel = reactive<FormReviewSearch>({ const formModel = reactive<FormReviewSearch>({
batchNo: '' batchNo: '',
remark: ''
}) })
const { resetFields } = useForm(formModel) const { resetFields } = useForm(formModel)

@ -127,8 +127,10 @@ const columns: ProColumns[] = [
customRender: function ({ record }: any) { customRender: function ({ record }: any) {
if (record.customType === 0) { if (record.customType === 0) {
return h('div', 'A型') return h('div', 'A型')
} else { } else if (record.customType === 1) {
return h('div', 'B型') return h('div', 'B型')
} else {
return h('div', '-')
} }
} }
}, },

@ -32,7 +32,7 @@
:rule="formRule" :rule="formRule"
:label-col="{ sm: { span: 24 }, md: { span: 5 } }" :label-col="{ sm: { span: 24 }, md: { span: 5 } }"
:wrapper-col=" :wrapper-col="
title === '详情' || title === '分发' title === '详情' || title === '回单'
? { sm: { span: 24 }, md: { span: 16 } } ? { sm: { span: 24 }, md: { span: 16 } }
: { sm: { span: 24 }, md: { span: 19 } } : { sm: { span: 24 }, md: { span: 19 } }
" "
@ -43,7 +43,7 @@
:rules="[{ required: true, message: '请输入称呼', trigger: 'blur' }]" :rules="[{ required: true, message: '请输入称呼', trigger: 'blur' }]"
:label-col="{ sm: { span: 24 }, md: { span: 5 } }" :label-col="{ sm: { span: 24 }, md: { span: 5 } }"
:wrapper-col=" :wrapper-col="
title === '详情' || title === '分发' title === '详情' || title === '回单'
? { sm: { span: 24 }, md: { span: 9 } } ? { sm: { span: 24 }, md: { span: 9 } }
: { sm: { span: 24 }, md: { span: 11 } } : { sm: { span: 24 }, md: { span: 11 } }
" "
@ -52,7 +52,7 @@
v-model:value="formModel.customName" v-model:value="formModel.customName"
placeholder="请输入称呼" placeholder="请输入称呼"
style="width: 65%" style="width: 65%"
:readonly="title === '详情' || title === '分发'" :readonly="title === '详情' || title === '回单'"
/> />
</a-form-item> </a-form-item>
<a-form-item <a-form-item
@ -68,7 +68,7 @@
]" ]"
:label-col="{ sm: { span: 24 }, md: { span: 5 } }" :label-col="{ sm: { span: 24 }, md: { span: 5 } }"
:wrapper-col=" :wrapper-col="
title === '详情' || title === '分发' title === '详情' || title === '回单'
? { sm: { span: 24 }, md: { span: 9 } } ? { sm: { span: 24 }, md: { span: 9 } }
: { sm: { span: 24 }, md: { span: 11 } } : { sm: { span: 24 }, md: { span: 11 } }
" "
@ -77,7 +77,7 @@
v-model:value="formModel.customNid" v-model:value="formModel.customNid"
placeholder="请输入联系方式" placeholder="请输入联系方式"
style="width: 65%" style="width: 65%"
:readonly="title === '详情' || title === '分发'" :readonly="title === '详情' || title === '回单'"
/> />
</a-form-item> </a-form-item>
<a-row> <a-row>
@ -87,7 +87,7 @@
name="remark" name="remark"
:label-col="{ sm: { span: 24 }, md: { span: 5 } }" :label-col="{ sm: { span: 24 }, md: { span: 5 } }"
:wrapper-col=" :wrapper-col="
title === '详情' || title === '分发' title === '详情' || title === '回单'
? { sm: { span: 24 }, md: { span: 19 } } ? { sm: { span: 24 }, md: { span: 19 } }
: { sm: { span: 24 }, md: { span: 19 } } : { sm: { span: 24 }, md: { span: 19 } }
" "
@ -95,8 +95,8 @@
<a-textarea <a-textarea
v-model:value="formModel.remark" v-model:value="formModel.remark"
placeholder="请输入备注" placeholder="请输入备注"
:style="{ width: title === '详情' || title === '分发' ? '83%' : '100%' }" :style="{ width: title === '详情' || title === '回单' ? '83%' : '100%' }"
:readonly="title === '详情' || title === '分发'" :readonly="title === '详情' || title === '回单'"
/> />
</a-form-item> </a-form-item>
</a-col> </a-col>
@ -112,7 +112,7 @@
required: required:
activeKey === '1' || activeKey === '1' ||
(activeKey === '2' && title === '编辑') || (activeKey === '2' && title === '编辑') ||
(activeKey === '2' && title === '分发'), (activeKey === '2' && title === '回单'),
message: '请选择地址信息', message: '请选择地址信息',
trigger: ['blur', 'change'] trigger: ['blur', 'change']
} }
@ -141,7 +141,7 @@
required: required:
activeKey === '1' || activeKey === '1' ||
(activeKey === '2' && title === '编辑') || (activeKey === '2' && title === '编辑') ||
(activeKey === '2' && title === '分发'), (activeKey === '2' && title === '回单'),
message: '请输入小区名称', message: '请输入小区名称',
trigger: 'change' trigger: 'change'
} }
@ -179,7 +179,7 @@
required: required:
activeKey === '1' || activeKey === '1' ||
(activeKey === '2' && title === '编辑') || (activeKey === '2' && title === '编辑') ||
(activeKey === '2' && title === '分发'), (activeKey === '2' && title === '回单'),
message: '请选择区域半径', message: '请选择区域半径',
trigger: 'blur' trigger: 'blur'
} }
@ -188,7 +188,7 @@
<a-select <a-select
ref="select" ref="select"
v-model:value="formModel.radius" v-model:value="formModel.radius"
:style="{ width: title === '详情' || title === '分发' ? '37%' : '38%' }" :style="{ width: title === '详情' || title === '回单' ? '37%' : '38%' }"
:options="radiusOptions" :options="radiusOptions"
:field-names="{ label: 'name', value: 'id', options: 'children' }" :field-names="{ label: 'name', value: 'id', options: 'children' }"
:disabled="isRadiusDisabled" :disabled="isRadiusDisabled"
@ -308,12 +308,12 @@
style="width: 45%" style="width: 45%"
label="预约门店名称" label="预约门店名称"
:label-col=" :label-col="
title === '详情' || title === '分发' title === '详情' || title === '回单'
? { sm: { span: 24 }, md: { span: 11 } } ? { sm: { span: 24 }, md: { span: 11 } }
: { sm: { span: 24 }, md: { span: 8 } } : { sm: { span: 24 }, md: { span: 8 } }
" "
:wrapper-col=" :wrapper-col="
title === '详情' || title === '分发' title === '详情' || title === '回单'
? { sm: { span: 24 }, md: { span: 13 } } ? { sm: { span: 24 }, md: { span: 13 } }
: { sm: { span: 24 }, md: { span: 16 } } : { sm: { span: 24 }, md: { span: 16 } }
" "
@ -327,8 +327,8 @@
<a-input <a-input
v-model:value="item.storeName" v-model:value="item.storeName"
placeholder="请输入" placeholder="请输入"
:readonly="title === '详情' || title === '分发'" :readonly="title === '详情' || title === '回单'"
:style="{ width: title === '详情' || title === '分发' ? '103%' : '100%' }" :style="{ width: title === '详情' || title === '回单' ? '103%' : '100%' }"
/> />
</a-form-item> </a-form-item>
<!-- :rules="{ <!-- :rules="{
@ -340,12 +340,12 @@
style="width: 30%" style="width: 30%"
label="预约时间" label="预约时间"
:label-col=" :label-col="
title === '详情' || title === '分发' title === '详情' || title === '回单'
? { sm: { span: 24 }, md: { span: 9 } } ? { sm: { span: 24 }, md: { span: 9 } }
: { sm: { span: 24 }, md: { span: 9 } } : { sm: { span: 24 }, md: { span: 9 } }
" "
:wrapper-col=" :wrapper-col="
title === '详情' || title === '分发' title === '详情' || title === '回单'
? { sm: { span: 24 }, md: { span: 15 } } ? { sm: { span: 24 }, md: { span: 15 } }
: { sm: { span: 24 }, md: { span: 15 } } : { sm: { span: 24 }, md: { span: 15 } }
" "
@ -355,7 +355,7 @@
<a-date-picker <a-date-picker
v-model:value="item.reservationDate" v-model:value="item.reservationDate"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
:disabled="title === '详情' || title === '分发'" :disabled="title === '详情' || title === '回单'"
:class="reservationTimeClass" :class="reservationTimeClass"
/> />
</a-space> </a-space>
@ -368,12 +368,12 @@
<a-form-item <a-form-item
style="width: 18%" style="width: 18%"
:label-col=" :label-col="
title === '详情' || title === '分发' title === '详情' || title === '回单'
? { sm: { span: 24 }, md: { span: 0 } } ? { sm: { span: 24 }, md: { span: 0 } }
: { sm: { span: 24 }, md: { span: 0 } } : { sm: { span: 24 }, md: { span: 0 } }
" "
:wrapper-col=" :wrapper-col="
title === '详情' || title === '分发' title === '详情' || title === '回单'
? { sm: { span: 24 }, md: { span: 24 } } ? { sm: { span: 24 }, md: { span: 24 } }
: { sm: { span: 24 }, md: { span: 24 } } : { sm: { span: 24 }, md: { span: 24 } }
" "
@ -386,7 +386,7 @@
:allow-clear="title === '新建预约' || title === '编辑预约' || title === '编辑'" :allow-clear="title === '新建预约' || title === '编辑预约' || title === '编辑'"
:options="item.option" :options="item.option"
:class="reservationTimeClass" :class="reservationTimeClass"
:style="{ width: title === '详情' || title === '分发' ? '103%' : '100%' }" :style="{ width: title === '详情' || title === '回单' ? '103%' : '100%' }"
> >
</a-select> </a-select>
</a-space> </a-space>
@ -421,10 +421,10 @@
>确定</a-button >确定</a-button
> >
</div> </div>
<div v-if="title === '分发'"> <div v-if="title === '回单'">
<a-button @click="handleClose"></a-button> <a-button @click="handleClose"></a-button>
<a-button type="primary" html-type="submit" style="margin-left: 10px" @click="distribute" <a-button type="primary" html-type="submit" style="margin-left: 10px" @click="distribute"
>分发</a-button >回单</a-button
> >
</div> </div>
</template> </template>
@ -1193,7 +1193,7 @@ const storeResetForm = () => {
formModel.customName = '' formModel.customName = ''
formModel.customNid = '' formModel.customNid = ''
formModel.remark = '' formModel.remark = ''
if (title.value === '详情' || title.value === '分发' || title.value === '新建预约') { if (title.value === '详情' || title.value === '回单' || title.value === '新建预约') {
formModel.address = [] formModel.address = []
formModel.detailAddress = '' formModel.detailAddress = ''
formModel.radius = '5000' formModel.radius = '5000'
@ -1279,7 +1279,7 @@ const submitOperate = () => {
doRequest(requestFn(filteredObj), { doRequest(requestFn(filteredObj), {
onSuccess: handleSuccess onSuccess: handleSuccess
}) })
} else if (title.value === '分发') { } else if (title.value === '回单') {
doRequest(auditCustomer({ customId: formModel.customId, status: 1 }), { doRequest(auditCustomer({ customId: formModel.customId, status: 1 }), {
onSuccess: handleSuccess onSuccess: handleSuccess
}) })
@ -1326,7 +1326,7 @@ const temporaryStorage = async () => {
}) })
} }
// //
const distribute = () => { const distribute = () => {
formRef.value formRef.value
?.validate() ?.validate()
@ -1551,7 +1551,7 @@ defineExpose({
isReservationTimeisReadOnly.value = true isReservationTimeisReadOnly.value = true
} else if (opendata.type === 'distribute') { } else if (opendata.type === 'distribute') {
getActiveKey() getActiveKey()
title.value = '分发' title.value = '回单'
isAddressReadOnly.value = true isAddressReadOnly.value = true
isRadiusReadOnly.value = true isRadiusReadOnly.value = true
isDetailAddressReadOnly.value = true isDetailAddressReadOnly.value = true

@ -16,6 +16,7 @@
<a-tab-pane v-if="formModel.customType === 1" key="2" tab="B类型客户" force-render /> <a-tab-pane v-if="formModel.customType === 1" key="2" tab="B类型客户" force-render />
</a-tabs> </a-tabs>
<a-form <a-form
ref="formRef"
:model="formModel" :model="formModel"
:label-col="{ sm: { span: 24 }, md: { span: 8 } }" :label-col="{ sm: { span: 24 }, md: { span: 8 } }"
:wrapper-col="wrapperCol" :wrapper-col="wrapperCol"
@ -74,6 +75,24 @@
</a-col> </a-col>
</a-row> </a-row>
</template> </template>
<a-row v-if="formModel.enrollStatus == 1 && formModel.customType == 1" justify="start">
<a-col :span="12">
<a-form-item
label="复审员选择"
:rules="[{ required: true, message: '请选择人员' }]"
name="reviewUserId"
>
<a-select ref="select" v-model:value="formModel.reviewUserId">
<a-select-option
v-for="(item, index) in selectedReviewerOptions"
:key="index"
:value="item.value"
>{{ item.label }}</a-select-option
>
</a-select>
</a-form-item>
</a-col>
</a-row>
</a-form> </a-form>
<template #footer> <template #footer>
<div v-if="title !== '详情'"> <div v-if="title !== '详情'">
@ -106,11 +125,12 @@ import { useModal } from '@/hooks/modal'
import type { FormRequestMapping } from '@/hooks/form' import type { FormRequestMapping } from '@/hooks/form'
import { overrideProperties } from '@/utils/bean-utils' import { overrideProperties } from '@/utils/bean-utils'
import { message } from 'ant-design-vue' import { message } from 'ant-design-vue'
import { updateCustomerAudit } from '@/api/geopoliticalCustomers/index' import { updateCustomerAudit, selectedReviewerList } from '@/api/geopoliticalCustomers/index'
import { useAdminForm, useFormAction, FormAction, wrapperCol } from '@/hooks/form' import { useAdminForm, useFormAction, FormAction, wrapperCol } from '@/hooks/form'
import { useUserStore } from '@/stores/user-store' import { useUserStore } from '@/stores/user-store'
import { doRequest } from '@/utils/axios/request' import { doRequest } from '@/utils/axios/request'
import { getCustomDetails } from '@/api/geopoliticalCustomers' import { getCustomDetails } from '@/api/geopoliticalCustomers'
import type { SelectProps } from 'ant-design-vue'
// //
import 'dayjs/locale/zh-cn' import 'dayjs/locale/zh-cn'
import { $ref } from 'vue/macros' import { $ref } from 'vue/macros'
@ -139,6 +159,7 @@ interface SysUserPageVO {
remark?: string remark?: string
customType: number customType: number
customStoreVOList: ReservationShop[] customStoreVOList: ReservationShop[]
reviewUserId: number | undefined
} }
const formModel = reactive<SysUserPageVO>({ const formModel = reactive<SysUserPageVO>({
@ -149,11 +170,14 @@ const formModel = reactive<SysUserPageVO>({
comprehensiveAddress: '', comprehensiveAddress: '',
remark: '', remark: '',
customStoreVOList: [], customStoreVOList: [],
enrollStatus: undefined enrollStatus: undefined,
reviewUserId: undefined
}) })
// //
const formRule = ref({}) const formRule = ref({
reviewUserId: [{ required: true, message: '请选择人员' }]
})
// //
const formRequestMapping: FormRequestMapping<SysUserPageVO> = {} const formRequestMapping: FormRequestMapping<SysUserPageVO> = {}
@ -162,7 +186,7 @@ const { title, visible, openModal, closeModal } = useModal()
const { formAction } = useFormAction() const { formAction } = useFormAction()
const { submitLoading, resetFields } = useAdminForm( const { submitLoading, resetFields, validateInfos } = useAdminForm(
formAction, formAction,
formRequestMapping, formRequestMapping,
formModel, formModel,
@ -175,17 +199,50 @@ const handleClose = () => {
closeModal() closeModal()
submitLoading.value = false submitLoading.value = false
} }
const formRef = ref()
const toExamine = (type: number) => { const toExamine = (type: number) => {
updateCustomerAudit(formModel.customId as number, type, userInfo!.salesmanType).then(res => { console.log(formModel.reviewUserId, 'formModel.reviewUserId')
// if (type === 0) {
formRef.value
.validate()
.then(() => {
updateCustomerAudit(
formModel.customId as number,
type,
userInfo!.salesmanType,
formModel.reviewUserId
).then(res => {
message.info(res.message) message.info(res.message)
if (res.code == 200) { if (res.code == 200) {
closeModal() closeModal()
emits('submit-success') emits('submit-success')
} }
}) })
})
.catch((error: any) => {
console.log('error', error)
})
// }
} }
//
const selectedReviewerOptions = ref<SelectProps['options']>([])
defineExpose({ defineExpose({
open(newFormAction: FormAction, id: number) { open(newFormAction: FormAction, id: number) {
selectedReviewerOptions.value = []
doRequest(selectedReviewerList(), {
onSuccess: (res: any) => {
console.log(res, 'res')
const a = res.data.map((item: any) => {
return { label: item.name, value: item.value }
})
a.forEach((item: any) => {
selectedReviewerOptions.value?.push({
label: item.label,
value: item.value
})
})
}
})
openModal() openModal()
resetFields() resetFields()
let record: any = null let record: any = null

@ -1,143 +0,0 @@
<template>
<a-modal
title="充值"
:visible="visible"
:confirm-loading="submitLoading"
:mask-closable="false"
:width="400"
@ok="handleSubmit"
@cancel="handleClose"
>
<a-spin :spinning="submitLoading">
<a-form :model="formModel" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-form-item label="线索数量">
<!-- <a-input v-model:value="formModel.clueNumber" placeholder="用户名" /> -->
<a-input-number
id="inputNumber"
v-model:value="formModel.clueNumber"
:min="0"
placeholder="线索数量"
style="width: 140px"
/>
</a-form-item>
</a-form>
</a-spin>
</a-modal>
</template>
<script setup lang="ts">
import { updateUserPassword } from '@/api/system/user'
import type { SysUserPassDTO } from '@/api/system/user/types'
import type { SysUserPageVO } from '@/api/system/user/types'
import { passEncrypt } from '@/utils/password-utils'
import type { Rule } from 'ant-design-vue/es/form'
import { FormAction, useAdminForm } from '@/hooks/form'
import type { FormRequestMapping } from '@/hooks/form'
import { useModal } from '@/hooks/modal'
type ChangePasswordFormModel = SysUserPassDTO & {
clueNumber?: number | undefined
}
const { visible, openModal, closeModal } = useModal()
const labelCol = {
xs: { span: 24 },
sm: { span: 5 }
}
const wrapperCol = {
xs: { span: 24 },
sm: { span: 16 }
}
/** 校验密码 */
const validatePass = async (_rule: Rule, value: string) => {
if (value === '') {
return Promise.reject('请输入新密码!')
} else {
if (formModel.confirmPass !== '') {
validate('confirmPass')
}
return Promise.resolve()
}
}
/** 校验 confirm 密码 */
const validateConfirmPass = async (_rule: Rule, value: string) => {
if (value === '') {
return Promise.reject('请确认新密码!')
} else if (value !== formModel.pass) {
return Promise.reject('两次输入的密码不一致!')
} else {
return Promise.resolve()
}
}
interface chargeFormModel {
clueNumber?: number | undefined
}
//
const formModel = reactive<chargeFormModel>({
// username: '',
// pass: '',
// confirmPass: '',
clueNumber: undefined
})
//
const formRule = reactive({
pass: [{ required: true, validator: validatePass, trigger: 'change' }],
confirmPass: [{ required: true, validator: validateConfirmPass, trigger: 'change' }]
})
//
const formRequestMapping: FormRequestMapping<ChangePasswordFormModel> = {
[FormAction.OTHER]: () => {
return updateUserPassword(formModel.userId!, {
pass: passEncrypt(formModel.pass),
confirmPass: passEncrypt(formModel.confirmPass)
})
}
}
const formAction = FormAction.OTHER
const { submitLoading, validateAndSubmit, resetFields, validate, validateInfos } = useAdminForm(
formAction,
formRequestMapping,
formModel,
formRule
)
/** 表单提交方法 */
const handleSubmit = () => {
validateAndSubmit(
{ ...formModel },
{
onSuccess: () => {
closeModal()
}
}
)
}
/* 弹窗关闭方法 */
const handleClose = () => {
closeModal()
submitLoading.value = false
}
defineExpose({
open(record: SysUserPageVO) {
resetFields()
openModal()
formModel.userId = record.userId
formModel.username = record.username
}
})
</script>
<style lang="less" scoped>
/deep/ .ant-input-number {
width: 160px !important;
}
</style>

@ -28,7 +28,8 @@
<operation-group> <operation-group>
<a @click="changePass(record)"></a> <a @click="changePass(record)"></a>
<a @click="handleEdit(record)"></a> <a @click="handleEdit(record)"></a>
<a @click="handleCharge(record)"></a> <a v-if="record.isSalesman" @click="handleCharge(record)"></a>
<!-- <a @click="handleCharge(record)"></a> -->
<!-- <delete-text-button @confirm="handleDelete(record)" /> --> <!-- <delete-text-button @confirm="handleDelete(record)" /> -->
</operation-group> </operation-group>
</template> </template>
@ -39,7 +40,7 @@
<!-- 修改密码弹窗 --> <!-- 修改密码弹窗 -->
<change-password-modal ref="changePasswordModalRef" /> <change-password-modal ref="changePasswordModalRef" />
<!-- 充值弹窗 --> <!-- 充值弹窗 -->
<charge-clue-modal ref="chargeClueModalRef" /> <charge-clue-modal ref="chargeClueModalRef" @submit-success="reloadTable" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -130,7 +131,7 @@ const handleDelete = (record: SysUserPageVO) => {
} }
/* 充值 */ /* 充值 */
const handleCharge = (record: SysUserPageVO) => { const handleCharge = (record: SysUserPageVO) => {
chargeClueModalRef.value?.open(record) chargeClueModalRef.value?.open(FormAction.CREATE, record)
} }
const columns: ProColumns[] = [ const columns: ProColumns[] = [
@ -175,7 +176,7 @@ const columns: ProColumns[] = [
key: 'operate', key: 'operate',
title: '操作', title: '操作',
align: 'center', align: 'center',
width: 100, width: 140,
fixed: 'right' fixed: 'right'
} }
] ]

@ -84,7 +84,9 @@
<a-menu-item v-if="hasPermission('system:user:pass')"> <a-menu-item v-if="hasPermission('system:user:pass')">
<a @click="changePass(record)"></a> <a @click="changePass(record)"></a>
</a-menu-item> </a-menu-item>
<a-menu-item v-if="hasPermission('system:user:charge')"> <a-menu-item
v-if="hasPermission('system:user:charge') && record.whichUserId === 1"
>
<a @click="handleCharge(record)"></a> <a @click="handleCharge(record)"></a>
</a-menu-item> </a-menu-item>
<!-- <a-menu-item v-if="hasPermission('system:user:del')"> <!-- <a-menu-item v-if="hasPermission('system:user:del')">
@ -113,7 +115,7 @@
<!-- 修改密码弹窗 --> <!-- 修改密码弹窗 -->
<change-password-modal ref="changePasswordModalRef" /> <change-password-modal ref="changePasswordModalRef" />
<!-- 充值弹窗 --> <!-- 充值弹窗 -->
<charge-clue-modal ref="chargeClueModalRef" /> <charge-clue-modal ref="chargeClueModalRef" @submit-success="reloadTable" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -127,7 +129,7 @@ import CropperModal from '@/components/CropperModal/index.vue'
import { useUserStore } from '@/stores/user-store' import { useUserStore } from '@/stores/user-store'
import type { FileObject } from '@/components/CropperModal/types' import type { FileObject } from '@/components/CropperModal/types'
import type { SysUserPageVO, SysUserQO } from '@/api/system/user/types' import type { SysUserPageVO, SysUserQO } from '@/api/system/user/types'
import SysOrganizationSearchTree from '../organization/SysOrganizationSearchTree.vue' // import SysOrganizationSearchTree from '../organization/SysOrganizationSearchTree.vue'
import SysUserPageSearch from './SysUserPageSearch.vue' import SysUserPageSearch from './SysUserPageSearch.vue'
import type { Key } from '@/utils/tree-utils' import type { Key } from '@/utils/tree-utils'
import { mergePageParam } from '@/utils/page-utils' import { mergePageParam } from '@/utils/page-utils'
@ -144,10 +146,10 @@ import { FormAction } from '@/hooks/form'
import { doRequest } from '@/utils/axios/request' import { doRequest } from '@/utils/axios/request'
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface' import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface'
import { DictBadge, DictText } from '@/components/Dict' import { DictBadge, DictText } from '@/components/Dict'
import { NewButton, DeleteTextButton } from '@/components/Button' import { NewButton } from '@/components/Button'
// import { NewButton, DeleteTextButton } from '@/components/Button'
// //
import { updateUser } from '@/api/system/user' import { updateUser } from '@/api/system/user'
import { message } from 'ant-design-vue'
defineOptions({ name: 'SysUserPage' }) defineOptions({ name: 'SysUserPage' })
@ -248,7 +250,7 @@ const changePass = (record: SysUserPageVO) => {
} }
/* 充值 */ /* 充值 */
const handleCharge = (record: SysUserPageVO) => { const handleCharge = (record: SysUserPageVO) => {
chargeClueModalRef.value?.open(record) chargeClueModalRef.value?.open(FormAction.CREATE, record)
} }
/* 打开头像模态框 */ /* 打开头像模态框 */

@ -10,11 +10,10 @@
> >
<a-spin :spinning="submitLoading"> <a-spin :spinning="submitLoading">
<a-form :model="formModel" :label-col="labelCol" :wrapper-col="wrapperCol"> <a-form :model="formModel" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-form-item label="线索数量"> <a-form-item label="线索数量" v-bind="validateInfos.rechargeClueNum">
<!-- <a-input v-model:value="formModel.clueNumber" placeholder="用户名" /> -->
<a-input-number <a-input-number
id="inputNumber" id="inputNumber"
v-model:value="formModel.clueNumber" v-model:value="formModel.rechargeClueNum"
:min="0" :min="0"
placeholder="线索数量" placeholder="线索数量"
style="width: 140px" style="width: 140px"
@ -26,24 +25,15 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { updateUserPassword } from '@/api/system/user' import { chargeClue } from '@/api/system/user'
import type { SysUserPassDTO } from '@/api/system/user/types' import type { SysUserChargeDTO, SysUserPageVO } from '@/api/system/user/types'
import type { SysUserPageVO } from '@/api/system/user/types' import { useAdminForm, useFormAction, FormAction } from '@/hooks/form'
import { passEncrypt } from '@/utils/password-utils'
import type { Rule } from 'ant-design-vue/es/form'
import { FormAction, useAdminForm } from '@/hooks/form'
import type { FormRequestMapping } from '@/hooks/form' import type { FormRequestMapping } from '@/hooks/form'
import { useModal } from '@/hooks/modal' import { useModal } from '@/hooks/modal'
type ChangePasswordFormModel = SysUserPassDTO & {
clueNumber?: number | undefined
}
const { visible, openModal, closeModal } = useModal()
const labelCol = { const labelCol = {
xs: { span: 24 }, xs: { span: 24 },
sm: { span: 5 } sm: { span: 8 }
} }
const wrapperCol = { const wrapperCol = {
@ -51,93 +41,67 @@ const wrapperCol = {
sm: { span: 16 } sm: { span: 16 }
} }
/** 校验密码 */ const emits = defineEmits<{
const validatePass = async (_rule: Rule, value: string) => { (e: 'submit-success'): void
if (value === '') { }>()
return Promise.reject('请输入新密码!')
} else { const { visible, openModal, closeModal } = useModal()
if (formModel.confirmPass !== '') {
validate('confirmPass') const { formAction } = useFormAction()
}
return Promise.resolve()
}
}
/** 校验 confirm 密码 */
const validateConfirmPass = async (_rule: Rule, value: string) => {
if (value === '') {
return Promise.reject('请确认新密码!')
} else if (value !== formModel.pass) {
return Promise.reject('两次输入的密码不一致!')
} else {
return Promise.resolve()
}
}
interface chargeFormModel {
clueNumber?: number | undefined
}
// //
const formModel = reactive<chargeFormModel>({ const formModel = reactive<SysUserChargeDTO>({
// username: '', userId: undefined,
// pass: '', rechargeClueNum: undefined
// confirmPass: '',
clueNumber: undefined
}) })
// //
const formRule = reactive({ const formRule = reactive({
pass: [{ required: true, validator: validatePass, trigger: 'change' }], rechargeClueNum: [{ required: true, message: '请输入线索数量!' }]
confirmPass: [{ required: true, validator: validateConfirmPass, trigger: 'change' }]
}) })
// //
const formRequestMapping: FormRequestMapping<ChangePasswordFormModel> = { const formRequestMapping: FormRequestMapping<SysUserChargeDTO> = {
[FormAction.OTHER]: () => { [FormAction.CREATE]: chargeClue
return updateUserPassword(formModel.userId!, {
pass: passEncrypt(formModel.pass),
confirmPass: passEncrypt(formModel.confirmPass)
})
}
} }
const formAction = FormAction.OTHER const { submitLoading, validateAndSubmit, resetFields, validateInfos } = useAdminForm(
const { submitLoading, validateAndSubmit, resetFields, validate, validateInfos } = useAdminForm(
formAction, formAction,
formRequestMapping, formRequestMapping,
formModel, formModel,
formRule formRule
) )
/** 表单提交方法 */ //
const handleSubmit = () => { const handleSubmit = () => {
validateAndSubmit( validateAndSubmit(
{ ...formModel }, {
...formModel
},
{ {
onSuccess: () => { onSuccess: () => {
closeModal() closeModal()
emits('submit-success')
} }
} }
) )
} }
/* 弹窗关闭方法 */ //
const handleClose = () => { const handleClose = () => {
closeModal() closeModal()
submitLoading.value = false submitLoading.value = false
} }
defineExpose({ defineExpose({
open(record: SysUserPageVO) { open(newFormAction: FormAction, record: SysUserPageVO) {
resetFields() console.log(record, 'record')
openModal() openModal()
resetFields()
if (newFormAction === FormAction.CREATE) {
formModel.userId = record.userId formModel.userId = record.userId
formModel.username = record.username }
formAction.value = newFormAction
} }
}) })
</script> </script>
<style lang="less" scoped>
::v-deep .ant-input-number {
width: 120px;
}
</style>

@ -22,11 +22,11 @@ import { antdvStyleDeps } from './src/utils/resolvers'
//项目 //项目
// export const serverAddress = 'http://admin.ballcat.cn' // export const serverAddress = 'http://admin.ballcat.cn'
//xy //xy
export const serverAddress = 'http://172.18.0.225:8000' // export const serverAddress = 'http://172.18.0.225:8000'
//jt //jt
// export const serverAddress = 'http://172.18.1.8:8000' // export const serverAddress = 'http://172.18.1.8:8000'
//ts //ts
// export const serverAddress = 'http://172.18.0.228:8000' export const serverAddress = 'http://172.18.0.228:8000'
//测试 //测试
// export const serverAddress = 'http://39.100.77.21:8000' // export const serverAddress = 'http://39.100.77.21:8000'

Loading…
Cancel
Save