master
doublekou 11 months ago
parent c6b90e1b62
commit 95c15c2f5d

@ -170,7 +170,7 @@ export type SysUserDTO = {
chargingStatus?: number chargingStatus?: number
nickname?: string | undefined nickname?: string | undefined
//剩余线索数量 //剩余线索数量
residueClueNum?: number | undefined // residueClueNum?: number | undefined
} }
//编辑线索阶段表单 //编辑线索阶段表单

@ -109,7 +109,10 @@
:wrapper-col="{ sm: { span: 24 }, md: { span: 15 } }" :wrapper-col="{ sm: { span: 24 }, md: { span: 15 } }"
:rules="[ :rules="[
{ {
required: activeKey === '1', required:
activeKey === '1' ||
(activeKey === '2' && title === '编辑') ||
(activeKey === '2' && title === '分发'),
message: '请选择地址信息', message: '请选择地址信息',
trigger: ['blur', 'change'] trigger: ['blur', 'change']
} }
@ -134,7 +137,14 @@
<a-col :xl="10" :md="10" :sm="10"> <a-col :xl="10" :md="10" :sm="10">
<a-form-item <a-form-item
:rules="[ :rules="[
{ required: activeKey === '1', message: '请输入小区名称', trigger: 'change' } {
required:
activeKey === '1' ||
(activeKey === '2' && title === '编辑') ||
(activeKey === '2' && title === '分发'),
message: '请输入小区名称',
trigger: 'change'
}
]" ]"
name="detailAddress" name="detailAddress"
> >
@ -164,7 +174,16 @@
label="请输入区域半径" label="请输入区域半径"
class="radius" class="radius"
name="radius" name="radius"
:rules="[{ required: activeKey === '1', message: '请选择区域半径', trigger: 'blur' }]" :rules="[
{
required:
activeKey === '1' ||
(activeKey === '2' && title === '编辑') ||
(activeKey === '2' && title === '分发'),
message: '请选择区域半径',
trigger: 'blur'
}
]"
> >
<a-select <a-select
ref="select" ref="select"
@ -392,7 +411,7 @@
>暂存</a-button >暂存</a-button
> >
</div> </div>
<a-button v-if="title === ''" type="primary" html-type="submit" @click="visible = false" <a-button v-if="title === ''" type="primary" html-type="submit" @click="handleClose"
>确定</a-button >确定</a-button
> >
<div v-if="title === '编辑'"> <div v-if="title === '编辑'">
@ -469,13 +488,7 @@ const userInfoCurrent = ref<string | undefined>('')
// required: true, // required: true,
// trigger: 'change' // trigger: 'change'
// } // }
// watch(
// () => activeKey.value,
// (newVal, oldVal) => {
// console.log('newVal, oldVal', newVal, oldVal)
// },
// { immediate: true, deep: true }
// )
onMounted(() => { onMounted(() => {
// //
provincesAndCitiesAndAutonomousOptions.value = window.globalProvincesAndCitiesAndAutonomousRegions provincesAndCitiesAndAutonomousOptions.value = window.globalProvincesAndCitiesAndAutonomousRegions
@ -549,7 +562,6 @@ const formRef = ref<FormInstance>()
const provincesAndCitiesAndAutonomousOptions: any = ref([]) const provincesAndCitiesAndAutonomousOptions: any = ref([])
//change //change
const addressChange = async (value: any) => { const addressChange = async (value: any) => {
// console.log(value, 'value')
formModel.detailAddress = '' formModel.detailAddress = ''
if (value) { if (value) {
@ -1027,10 +1039,7 @@ const idThen = (detailAddress: string) => {
// //
const pois = result.poiList.pois const pois = result.poiList.pois
console.log(pois, 'pois') console.log(pois, 'pois')
console.log(formModel.detailAddress, 'formModel.detailAddress')
// //
// console.log(pois, 'pois')
// console.log(pois[0].location.lng, pois[0].location.lat, 'pois')
if (pois[0].name.includes('小区')) { if (pois[0].name.includes('小区')) {
const result = pois[0].name.replace('小区', '') const result = pois[0].name.replace('小区', '')
if ( if (
@ -1208,9 +1217,11 @@ const showModal = () => {
if (formModel.customStoreEntities.length === 0) { if (formModel.customStoreEntities.length === 0) {
message.info('请先添加预约门店') message.info('请先添加预约门店')
} else { } else {
formModel.enrollStatus = 1
registerVisible.value = true registerVisible.value = true
} }
} else { } else {
formModel.enrollStatus = 1
registerVisible.value = true registerVisible.value = true
} }
}) })
@ -1340,7 +1351,7 @@ const { title, visible, openModal, closeModal } = useModal()
const { formAction } = useFormAction() const { formAction } = useFormAction()
// //
const formModel = reactive<CustomerDTO>({ const formModel = reactive<CustomerDTO>({
customType: 0, customType: undefined,
customId: undefined, customId: undefined,
customName: '', customName: '',
customNid: '', customNid: '',
@ -1413,7 +1424,9 @@ const handleClose = () => {
} }
// listData.value.length = 0 // listData.value.length = 0
formRef.value?.resetFields() formRef.value?.resetFields()
// resetFields.value()
resetFields.value()
// formModel.customType = undefined
delete formModel.description delete formModel.description
submitLoading.value = false submitLoading.value = false
} }
@ -1433,7 +1446,6 @@ const handleMapInit = async () => {
defineExpose({ defineExpose({
open(opendata: openObj) { open(opendata: openObj) {
isSubmit.value = false isSubmit.value = false
openModal()
// console.log('formModel.customType resssssssss', formModel.customType) // console.log('formModel.customType resssssssss', formModel.customType)
//resetFields.value(),resetFields.value()formModel.customType0 //resetFields.value(),resetFields.value()formModel.customType0
// resetFields.value() // resetFields.value()
@ -1504,11 +1516,11 @@ defineExpose({
if (formModel.detailAddress) { if (formModel.detailAddress) {
isDetailAddressDisabled.value = true isDetailAddressDisabled.value = true
} }
if (formModel.address.length !== 0 && formModel.detailAddress && formModel.radius) {
handleMapInit().then(() => { handleMapInit().then(() => {
if (formModel.address?.length !== 0 && formModel.detailAddress && formModel.radius) {
match(formModel.detailAddress) match(formModel.detailAddress)
})
} }
})
} else if (opendata.type === 'edit') { } else if (opendata.type === 'edit') {
getActiveKey() getActiveKey()
title.value = '编辑预约' title.value = '编辑预约'
@ -1521,11 +1533,11 @@ defineExpose({
if (formModel.detailAddress) { if (formModel.detailAddress) {
isDetailAddressDisabled.value = true isDetailAddressDisabled.value = true
} }
if (formModel.address.length !== 0 && formModel.detailAddress && formModel.radius) {
handleMapInit().then(() => { handleMapInit().then(() => {
if (formModel.address?.length !== 0 && formModel.detailAddress && formModel.radius) {
match(formModel.detailAddress) match(formModel.detailAddress)
})
} }
})
} else if (opendata.type === 'view') { } else if (opendata.type === 'view') {
if (formModel.customType === 0) { if (formModel.customType === 0) {
activeKey.value = '1' activeKey.value = '1'
@ -1546,6 +1558,7 @@ defineExpose({
isReservationTimeisReadOnly.value = true isReservationTimeisReadOnly.value = true
formModel.description = 1 formModel.description = 1
} }
openModal()
} }
if (opendata.newFormAction === FormAction.CREATE) { if (opendata.newFormAction === FormAction.CREATE) {
@ -1553,6 +1566,8 @@ defineExpose({
handleMapInit() handleMapInit()
title.value = '新建预约' title.value = '新建预约'
formModel.customStoreEntities.length = 0 formModel.customStoreEntities.length = 0
formModel.customType = 0
openModal()
} else if (opendata.newFormAction === FormAction.UPDATE) { } else if (opendata.newFormAction === FormAction.UPDATE) {
doRequest(getDetail({ id: opendata.record?.customId }), { doRequest(getDetail({ id: opendata.record?.customId }), {
onSuccess: handleSuccess onSuccess: handleSuccess
@ -1608,7 +1623,6 @@ const initMap = async () => {
// center: [120.1551, 30.2741], // // center: [120.1551, 30.2741], //
zoom: 18 // zoom: 18 //
}) })
console.log(map.value, 'initMap map.value')
// await auto('') // await auto('')
if ( if (
(title.value === '编辑预约' && formModel.otherAddressesInfo) || (title.value === '编辑预约' && formModel.otherAddressesInfo) ||

@ -0,0 +1,143 @@
<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,6 +28,7 @@
<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>
<!-- <delete-text-button @confirm="handleDelete(record)" /> --> <!-- <delete-text-button @confirm="handleDelete(record)" /> -->
</operation-group> </operation-group>
</template> </template>
@ -37,6 +38,8 @@
<sys-user-form-modal ref="sysUserFormModalRef" @submit-success="reloadTable" /> <sys-user-form-modal ref="sysUserFormModalRef" @submit-success="reloadTable" />
<!-- 修改密码弹窗 --> <!-- 修改密码弹窗 -->
<change-password-modal ref="changePasswordModalRef" /> <change-password-modal ref="changePasswordModalRef" />
<!-- 充值弹窗 -->
<charge-clue-modal ref="chargeClueModalRef" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -62,6 +65,8 @@ import ChangePasswordModal from '@/views/system/user/ChangePasswordModal.vue'
import SysUserFormModal from '@/views/salesmanagement/salespersonList/salespersonListModal.vue' import SysUserFormModal from '@/views/salesmanagement/salespersonList/salespersonListModal.vue'
// //
import { doRequest } from '@/utils/axios/request' import { doRequest } from '@/utils/axios/request'
//
import chargeClueModal from '@/views/system/user/chargeClueModal.vue'
defineOptions({ name: 'SalespersonList' }) defineOptions({ name: 'SalespersonList' })
// //
@ -71,6 +76,8 @@ const tableRef = ref<ProTableInstanceExpose>()
const sysUserFormModalRef = ref<InstanceType<typeof SysUserFormModal>>() const sysUserFormModalRef = ref<InstanceType<typeof SysUserFormModal>>()
// //
const changePasswordModalRef = ref<InstanceType<typeof ChangePasswordModal>>() const changePasswordModalRef = ref<InstanceType<typeof ChangePasswordModal>>()
//
const chargeClueModalRef = ref<InstanceType<typeof chargeClueModal>>()
// //
let searchParams: SysUserQO = {} let searchParams: SysUserQO = {}
@ -121,6 +128,10 @@ const handleDelete = (record: SysUserPageVO) => {
onSuccess: () => reloadTable() onSuccess: () => reloadTable()
}) })
} }
/* 充值 */
const handleCharge = (record: SysUserPageVO) => {
chargeClueModalRef.value?.open(record)
}
const columns: ProColumns[] = [ const columns: ProColumns[] = [
{ {

@ -34,9 +34,12 @@
placeholder="请选择" placeholder="请选择"
/> />
</a-form-item> </a-form-item>
<a-form-item label="线索数量"> <a-form-item label="状态">
<a-input v-model:value="formModel.residueClueNum" placeholder="请输入" /> <dict-radio-group v-model:value="formModel.status" dict-code="user_status" />
</a-form-item> </a-form-item>
<!-- <a-form-item label="线索数量">
<a-input v-model:value="formModel.residueClueNum" placeholder="请输入" />
</a-form-item> -->
</a-col> </a-col>
<a-col :xs="24" :sm="24" :md="12"> <a-col :xs="24" :sm="24" :md="12">
@ -61,9 +64,6 @@
@changes="updateRole" @changes="updateRole"
/> />
</a-form-item> </a-form-item>
<a-form-item label="状态">
<dict-radio-group v-model:value="formModel.status" dict-code="user_status" />
</a-form-item>
</a-col> </a-col>
</a-row> </a-row>
</a-form> </a-form>

@ -68,8 +68,7 @@
<span v-else></span> <span v-else></span>
</template> </template>
<template v-else-if="column.key === 'residueClueNum'"> <template v-else-if="column.key === 'residueClueNum'">
<span v-if="record.whichUserId !== 1">{{ record.residueClueNum }}</span> <span>{{ record.residueClueNum }}</span>
<span v-else></span>
</template> </template>
<template v-else-if="column.key === 'operate'"> <template v-else-if="column.key === 'operate'">
<a-dropdown :trigger="['click']"> <a-dropdown :trigger="['click']">
@ -85,6 +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 @click="handleCharge(record)"></a>
</a-menu-item>
<!-- <a-menu-item v-if="hasPermission('system:user:del')"> <!-- <a-menu-item v-if="hasPermission('system:user:del')">
<delete-text-button @confirm="handleDelete(record)" /> <delete-text-button @confirm="handleDelete(record)" />
</a-menu-item> --> </a-menu-item> -->
@ -110,6 +112,8 @@
<!-- 修改密码弹窗 --> <!-- 修改密码弹窗 -->
<change-password-modal ref="changePasswordModalRef" /> <change-password-modal ref="changePasswordModalRef" />
<!-- 充值弹窗 -->
<charge-clue-modal ref="chargeClueModalRef" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -132,6 +136,7 @@ import type { CSSProperties } from 'vue'
import { useAuthorize } from '@/hooks/permission' import { useAuthorize } from '@/hooks/permission'
import SysUserScopeModal from '@/views/system/user/SysUserScopeModal.vue' import SysUserScopeModal from '@/views/system/user/SysUserScopeModal.vue'
import ChangePasswordModal from '@/views/system/user/ChangePasswordModal.vue' import ChangePasswordModal from '@/views/system/user/ChangePasswordModal.vue'
import chargeClueModal from '@/views/system/user/chargeClueModal.vue'
import SysUserFormModal from '@/views/system/user/SysUserFormModal.vue' import SysUserFormModal from '@/views/system/user/SysUserFormModal.vue'
import useMediaQuery from '#/utils/hooks/useMediaQuery' import useMediaQuery from '#/utils/hooks/useMediaQuery'
import type { SysUserStatus } from '@/api/system/user/types' import type { SysUserStatus } from '@/api/system/user/types'
@ -159,6 +164,8 @@ const cropperModalRef = ref<InstanceType<typeof CropperModal>>()
const sysUserScopeModalRef = ref<InstanceType<typeof SysUserScopeModal>>() const sysUserScopeModalRef = ref<InstanceType<typeof SysUserScopeModal>>()
// //
const changePasswordModalRef = ref<InstanceType<typeof ChangePasswordModal>>() const changePasswordModalRef = ref<InstanceType<typeof ChangePasswordModal>>()
//
const chargeClueModalRef = ref<InstanceType<typeof chargeClueModal>>()
// ids // ids
const organizationIds = ref<number[]>() const organizationIds = ref<number[]>()
@ -239,6 +246,10 @@ const handleGrant = (record: SysUserPageVO) => {
const changePass = (record: SysUserPageVO) => { const changePass = (record: SysUserPageVO) => {
changePasswordModalRef.value?.open(record) changePasswordModalRef.value?.open(record)
} }
/* 充值 */
const handleCharge = (record: SysUserPageVO) => {
chargeClueModalRef.value?.open(record)
}
/* 打开头像模态框 */ /* 打开头像模态框 */
const openAvatarModal = (record: SysUserPageVO) => { const openAvatarModal = (record: SysUserPageVO) => {

@ -0,0 +1,143 @@
<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>
::v-deep .ant-input-number {
width: 120px;
}
</style>

@ -22,13 +22,13 @@ 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'
//线上ip //线上ip
// export const serverAddress = 'http://175.27.212.74:80' // export const serverAddress = 'http://175.27.212.74:80'

Loading…
Cancel
Save