新增地缘获客

master
doublekou 1 year ago
parent 594908817c
commit 2b75b549f4

@ -4,6 +4,7 @@
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<!-- <link rel="icon" href="<%= BASE_URL %>favicon.ico" /> -->
<link rel="stylesheet" href="https://cache.amap.com/lbs/static/main1119.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="format-detection" content="telephone=yes" />
<title><%- title %></title>
@ -219,5 +220,18 @@
</div>
</div>
<script type="module" src="/src/main.ts"></script>
<!-- 高德地图 -->
<script>
window._AMapSecurityConfig = {
securityJsCode: 'ac1232036e1e20026f1e3e95338fc9c4'
}
</script>
<!--引入高德地图JSAPI -->
<script
type="text/javascript"
src="https://webapi.amap.com/maps?v=2.0&key=df6e9416230b57f3c7f48be57dd2f813&plugin=AMap.Autocomplete,AMap.PlaceSearch,AMap.SearchNearBy,AMap.Geocoder,AMap.Geolocation"
></script>
<!--引入UI组件库1.1版本) -->
<!-- <script src="https://webapi.amap.com/ui/1.1/main.js"></script> -->
</body>
</html>

@ -18,6 +18,7 @@
"pnpm": ">=8"
},
"dependencies": {
"@amap/amap-jsapi-loader": "^1.0.1",
"@ant-design/icons-vue": "^6.1.0",
"@ballcat/vue-cropper": "^1.0.5",
"@ckpack/vue-color": "^1.4.1",
@ -26,6 +27,7 @@
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"ant-design-vue": "^3.2.20",
"area-data": "^5.0.6",
"axios": "^1.4.0",
"cropperjs": "^1.5.13",
"crypto-js": "^4.1.1",
@ -36,6 +38,7 @@
"pinia": "^2.1.3",
"qs": "^6.11.2",
"vue": "^3.3.4",
"vue-area-linkage": "^5.1.0",
"vue-clipboard3": "^2.0.0",
"vue-i18n": "^9.2.2",
"vue-router": "^4.2.1"
@ -65,6 +68,7 @@
"lint-staged": "^13.2.2",
"npm-run-all": "^4.1.5",
"prettier": "^2.8.8",
"terser": "^5.19.3",
"typescript": "~5.0.4",
"unplugin-auto-import": "^0.16.0",
"unplugin-vue-components": "^0.24.1",

@ -5,6 +5,9 @@ settings:
excludeLinksFromLockfile: false
dependencies:
'@amap/amap-jsapi-loader':
specifier: ^1.0.1
version: 1.0.1
'@ant-design/icons-vue':
specifier: ^6.1.0
version: 6.1.0(vue@3.3.4)
@ -29,6 +32,9 @@ dependencies:
ant-design-vue:
specifier: ^3.2.20
version: 3.2.20(vue@3.3.4)
area-data:
specifier: ^5.0.6
version: 5.0.6
axios:
specifier: ^1.4.0
version: 1.4.0
@ -59,6 +65,9 @@ dependencies:
vue:
specifier: ^3.3.4
version: 3.3.4
vue-area-linkage:
specifier: ^5.1.0
version: 5.1.0(area-data@5.0.6)(vue@3.3.4)
vue-clipboard3:
specifier: ^2.0.0
version: 2.0.0
@ -142,6 +151,9 @@ devDependencies:
prettier:
specifier: ^2.8.8
version: 2.8.8
terser:
specifier: ^5.19.3
version: 5.19.3
typescript:
specifier: ~5.0.4
version: 5.0.4
@ -153,7 +165,7 @@ devDependencies:
version: 0.24.1(vue@3.3.4)
vite:
specifier: ^4.3.8
version: 4.3.8(@types/node@18.16.8)(less@4.1.3)
version: 4.3.8(@types/node@18.16.8)(less@4.1.3)(terser@5.19.3)
vite-plugin-html:
specifier: ^3.2.0
version: 3.2.0(vite@4.3.8)
@ -163,6 +175,10 @@ devDependencies:
packages:
/@amap/amap-jsapi-loader@1.0.1:
resolution: {integrity: sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==}
dev: false
/@ampproject/remapping@2.2.0:
resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==}
engines: {node: '>=6.0.0'}
@ -1079,8 +1095,8 @@ packages:
engines: {node: '>=6.0.0'}
dev: true
/@jridgewell/source-map@0.3.2:
resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==}
/@jridgewell/source-map@0.3.5:
resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==}
dependencies:
'@jridgewell/gen-mapping': 0.3.2
'@jridgewell/trace-mapping': 0.3.17
@ -1412,7 +1428,7 @@ packages:
'@babel/core': 7.21.3
'@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.3)
'@vue/babel-plugin-jsx': 1.1.1(@babel/core@7.21.3)
vite: 4.3.8(@types/node@18.16.8)(less@4.1.3)
vite: 4.3.8(@types/node@18.16.8)(less@4.1.3)(terser@5.19.3)
vue: 3.3.4
transitivePeerDependencies:
- supports-color
@ -1425,7 +1441,7 @@ packages:
vite: ^4.0.0
vue: ^3.2.25
dependencies:
vite: 4.3.8(@types/node@18.16.8)(less@4.1.3)
vite: 4.3.8(@types/node@18.16.8)(less@4.1.3)(terser@5.19.3)
vue: 3.3.4
dev: true
@ -2054,6 +2070,10 @@ packages:
picomatch: 2.3.1
dev: true
/area-data@5.0.6:
resolution: {integrity: sha512-QxLoA+823xXKyhw5S3750I9TToki0OS42HU9ol3rCOsCXfkjtl8RtQ/eoj0cK0Levn4//oEM05FmMumfw/HIlg==}
dev: false
/arg@4.1.3:
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
dev: true
@ -3416,7 +3436,7 @@ packages:
he: 1.2.0
param-case: 3.0.4
relateurl: 0.2.7
terser: 5.16.6
terser: 5.19.3
dev: true
/html-tags@3.2.0:
@ -3927,6 +3947,10 @@ packages:
/lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, tarball: https://registry.npm.taobao.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz}
/lodash.find@4.6.0:
resolution: {integrity: sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==}
dev: false
/lodash.foreach@4.5.0:
resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==, tarball: https://registry.npm.taobao.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz}
@ -5158,12 +5182,12 @@ packages:
resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
dev: true
/terser@5.16.6:
resolution: {integrity: sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg==}
/terser@5.19.3:
resolution: {integrity: sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==}
engines: {node: '>=10'}
hasBin: true
dependencies:
'@jridgewell/source-map': 0.3.2
'@jridgewell/source-map': 0.3.5
acorn: 8.8.2
commander: 2.20.3
source-map-support: 0.5.21
@ -5465,10 +5489,10 @@ packages:
html-minifier-terser: 6.1.0
node-html-parser: 5.4.2
pathe: 0.2.0
vite: 4.3.8(@types/node@18.16.8)(less@4.1.3)
vite: 4.3.8(@types/node@18.16.8)(less@4.1.3)(terser@5.19.3)
dev: true
/vite@4.3.8(@types/node@18.16.8)(less@4.1.3):
/vite@4.3.8(@types/node@18.16.8)(less@4.1.3)(terser@5.19.3):
resolution: {integrity: sha512-uYB8PwN7hbMrf4j1xzGDk/lqjsZvCDbt/JC5dyfxc19Pg8kRm14LinK/uq+HSLNswZEoKmweGdtpbnxRtrAXiQ==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@ -5498,10 +5522,23 @@ packages:
less: 4.1.3
postcss: 8.4.23
rollup: 3.21.7
terser: 5.19.3
optionalDependencies:
fsevents: 2.3.2
dev: true
/vue-area-linkage@5.1.0(area-data@5.0.6)(vue@3.3.4):
resolution: {integrity: sha512-86WD4O6PD9e2koWZ81Zlfcyey17U1+3B3fpWoyIZlBIe2V6qfvrg9BTozWdTpdF4CmKBiz138LBRTKhawl/UWw==}
engines: {node: '>= 6.0.0', npm: '>= 5.2.0'}
peerDependencies:
area-data: '>=5.0.6'
vue: '>=2.2.0'
dependencies:
area-data: 5.0.6
lodash.find: 4.6.0
vue: 3.3.4
dev: false
/vue-clipboard3@2.0.0:
resolution: {integrity: sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A==}
dependencies:

@ -6,6 +6,7 @@ import type {
LoginResult
} from '@/api/auth/types'
import { useUserStore } from '@/stores/user-store'
import type { ApiResult, SelectData } from '@/api/types'
// Base64(clientId:clientSecret)
// const BASIC_AUTHORIZATION = 'Basic bm8tY2FwdGNoYTpuby1jYXB0Y2hh'
@ -71,3 +72,9 @@ export function logout() {
params: { token: accessToken }
})
}
/**
*
*/
export function getCodeData() {
return httpClient.get<ApiResult<SelectData[]>>('/captcha/code')
}

@ -4,7 +4,9 @@
export interface AccountLoginParam {
username: string
password: string
captchaId?: string
uuid?: string
code: string
// captchaId: string
}
/**

@ -1,25 +1,30 @@
import httpClient from '@/utils/axios'
import type { ApiResult } from '@/api/types'
import type {
AccessLogPageParam,
AccessDetailPageParam,
SysMenuDTO,
flowParamsDto
} from '@/api/clueaccess/accessDetail/types'
/**
* 访
*
* @param pageParams
*/
// export function pageAccessLogs(pageParams: AccessLogPageParam) {
// return httpClient.get<ApiResult>('/log/access-log/page', {
// params: pageParams
// })
// }
export function pageAccessLogs(pageParams: AccessLogPageParam) {
export function pageAccessLogs(pageParams: AccessDetailPageParam) {
return httpClient.get<ApiResult>('/clueRecord/page', {
params: pageParams
})
}
/**
*
* @param flowParams
*/
export function trafficDistributionStatistics(flowParams: flowParamsDto) {
return httpClient.get<ApiResult>('/report/flow', {
params: flowParams
})
}
/**
*
* @param menuDto
@ -27,7 +32,6 @@ export function pageAccessLogs(pageParams: AccessLogPageParam) {
export function createMenu(menuDto: SysMenuDTO) {
return httpClient.post<ApiResult<void>>('/system/menu', menuDto)
}
/**
*
* @param menuDto
@ -35,13 +39,3 @@ export function createMenu(menuDto: SysMenuDTO) {
export function updateMenu(menuDto: SysMenuDTO) {
return httpClient.put<ApiResult<void>>('/system/menu', menuDto)
}
/**
*
* @param flowParams
*/
export function trafficDistributionStatistics(flowParams: flowParamsDto) {
return httpClient.get<ApiResult>('/report/flow', {
params: flowParams
})
}

@ -1,28 +1,21 @@
import type { PageParam } from '@/api/types'
// import type { DefaultOptionType } from 'ant-design-vue/es/select'
/**
* 访
*
*/
export type AccessLogPageParam = AccessLogQO & PageParam
export type AccessDetailPageParam = AccessDetailQO & PageParam
/**
* 访
*
*/
export interface AccessLogQO {
export interface AccessDetailQO {
// 追踪ID
oldFileName?: string
// 用户ID
// userId?: number
// 访问IP地址
ip?: string
// 请求Uri
uri?: string
allocationStatus?: string
status?: string
// 请求映射地址
// matchingPattern?: string
// 响应状态码
// httpStatus?: number
// 访问时间区间的开始值
startTime?: string
// 访问时间区间的结束值
@ -38,62 +31,39 @@ export enum SysUserStatus {
LOCKED = 0
}
/**
*
* record
*/
export type SysUserPageVO = {
executeStatus: number
taskId: number
// 用户ID
userId: number
// 登录账号
username: string
export type AccessDetailRecord = {
allocationStatus?: number
channelIdentifying?: string
channelType?: string
clueRecordId?: number
// 创建时间
createTime: string
distributeStatus?: number
failNum?: number
oldFileName: string
// 昵称
nickname: string
// 头像
avatar: string
// 性别(0-默认未知,1-男,2-女)
gender: 0 | 1 | 2
// 电子邮件
email: string
// 电话
phoneNumber: string
recordType?: number
remark?: string
// 状态(1-正常, 0-冻结)
status: SysUserStatus
// 用户类型1-系统用户2-客户用户
type: 1 | 2
// 组织机构ID
organizationId: number
// 组织机构名称
organizationName: string
// 创建时间
createTime: string
// 更新时间
updateTime: string
}
/**
*
*/
export interface SysMenuDTO extends Omit<SysMenu, 'id'> {
// 菜单id
id?: number
// 原菜单ID
originalId?: number
// 菜单标题对应的国际化信息
i18nMessages?: SysMenuI18n[]
successNum?: number
taskId?: number
url?: string
executeStatus: number
}
/**
*
*/
export interface SysMenuI18n {
// 国际化标识
code: string
// 消息
message: string
// 地区语言标签
languageTag: string
//添加推送record
export type PushAccessRecord = {
attributes?: null
disabled?: null
name?: string
selected?: null
type?: string | ''
value?: number
userId?: number
username?: string
}
//分发弹出框用到了,但是现在这个页面还没有分发功能,先留着,之后再细改
/**
*
*/
@ -128,9 +98,31 @@ export interface SysMenu {
fileSelection: Array<string>
selectedCompany: Array<string>
}
//流量分布统计
//流量分布统计(接口用到的)
export interface flowParamsDto {
userId?: number | undefined
channel?: string
type: number
}
/**
* (,,,)
*/
export interface SysMenuDTO extends Omit<SysMenu, 'id'> {
// 菜单id
id?: number
// 原菜单ID
originalId?: number
// 菜单标题对应的国际化信息
i18nMessages?: SysMenuI18n[]
}
/**
* (,,,)
*/
export interface SysMenuI18n {
// 国际化标识
code: string
// 消息
message: string
// 地区语言标签
languageTag: string
}

@ -1,7 +1,8 @@
import httpClient from '@/utils/axios'
import type { I18nData, I18nDataDTO, I18nDataQO, I18nImportData } from './types'
import type { I18nData, I18nDataDTO, I18nDataQO, I18nImportData, ReadFileId } from './types'
import type { FileObject } from '@/components/CropperModal/types'
import type { ImportMode } from '@/api/types'
import type { ApiResult } from '@/api/types'
export function pageI18nData(query: I18nDataQO) {
return httpClient.get('/i18n/i18n-data/page', {
@ -29,14 +30,37 @@ export function updateI18nData(data: I18nData) {
export function exportI18nDataExcel(params: I18nDataQO) {
return httpClient.get('/i18n/i18n-data/export', { params, responseType: 'blob' })
}
export function importI18nDataExcel(data: I18nImportData) {
/**
*
* @param data
*/
export function checkHeaderInformation(data: I18nImportData) {
const { file } = data
const formData = new FormData()
// @ts-ignore
formData.append('file', file, file.name)
// formData.append('importMode', importMode)
return httpClient.postForm('/clueFile/fileUpload', formData)
return httpClient.postForm('/clueFile/detection', formData)
}
// (data: I18nImportData) {
// return httpClient.post<ApiResult<void>>('/clueFile/detection', data)
// }
// export function importI18nDataExcel(data: ReadFileId) {
// // const { file } = data
// // const formData = new FormData()
// // @ts-ignore
// // formData.append('file', file, file.name)
// // formData.append('importMode', importMode)
// return httpClient.postForm('/clueFile/readFile', data)
// }
// export function importI18nDataExcel(data: ReadFileId) {
// return httpClient.post<ApiResult<void>>('/clueFile/readFile', data)
// }
export function importI18nDataExcel(data: ReadFileId) {
return httpClient.get<ApiResult>('/clueFile/readFile', {
params: data
})
}
// export function downloadI18nDataExcelTemplate() {

@ -41,3 +41,15 @@ export interface I18nDataPageVO extends I18nBaseData, LanguageText {
// 创建时间
createTime?: string
}
export interface I18nImportData {
// 文件内容
file?: UploadFile
// 导入模式
// importMode: ImportMode
}
export interface ReadFileId {
// 文件内容
recordId?: string
// 导入模式
// importMode: ImportMode
}

@ -1,46 +1,26 @@
import httpClient from '@/utils/axios'
import type { ApiResult } from '@/api/types'
import type {
SysMenuDTO,
SysUserPageParam,
CustomerManagementPageParam,
DistributeTaskDTO,
PushAccessDTO
} from '@/api/controlcenterstation/customerManagement/types'
/**
* 访
*
* @param pageParams
*/
// export function pageAccessLogs(pageParams: AccessLogPageParam) {
// return httpClient.get<ApiResult>('/log/access-log/page', {
// params: pageParams
// })
// }
export function pageAccessLogs(pageParams: SysUserPageParam) {
export function pageAccessLogs(pageParams: CustomerManagementPageParam) {
return httpClient.get<ApiResult>('/system/user/pageList', {
params: pageParams
})
}
// /**
// * 删除销售人员
// * @param userId 用户id
// */
// export function deleteUser(userId: number) {
// return httpClient.delete<ApiResult<void>>(`/system/user/${userId}`)
// }
/**
*
* @param menuDto
* id
* @param userId id
*/
export function createMenu(menuDto: SysMenuDTO) {
return httpClient.post<ApiResult<void>>('/system/menu', menuDto)
}
/**
*
* @param menuDto
*/
export function updateMenu(menuDto: SysMenuDTO) {
return httpClient.put<ApiResult<void>>('/system/menu', menuDto)
export function deleteUser(userId: number) {
return httpClient.delete<ApiResult<void>>(`/system/user/${userId}`)
}
/**
*
@ -63,17 +43,9 @@ export function updateDistributeConfigurationmenuDto(distributeDto: DistributeTa
export function fileSelectionList() {
return httpClient.get<ApiResult>('/clueRecord/select')
}
/**
* id
* @param userId id
*/
export function deleteUser(userId: number) {
return httpClient.delete<ApiResult<void>>(`/system/user/${userId}`)
}
/**
*
* @param useCreateDto
* @param useCreateDto
*/
export function createPushAccessLink(useCreateDto: PushAccessDTO) {
return httpClient.post<ApiResult<void>>('/pushLink/add', useCreateDto)

@ -2,190 +2,52 @@ import type { PageParam } from '@/api/types'
import { Dayjs } from 'dayjs'
/**
*
*
*/
export interface SysMenuDTO extends Omit<SysMenu, 'id'> {
// 菜单id
id?: number
// 原菜单ID
originalId?: number
// 菜单标题对应的国际化信息
i18nMessages?: SysMenuI18n[]
}
/**
*
*/
export interface SysMenuI18n {
// 国际化标识
code: string
// 消息
message: string
// 地区语言标签
languageTag: string
}
/**
* 访
*/
// export type AccessLogPageParam = AccessLogQO & PageParam
export type CustomerManagementPageParam = CustomerManagementQO & PageParam
/**
* 访
*
*/
export interface AccessLogQO {
// 追踪ID
// oldFileName?: string
// 用户ID
// userId?: number
// 访问IP地址
// ip?: string
// 请求Uri
export type CustomerManagementQO = {
// 客户名称
username?: string
uri?: string
// 请求映射地址
// matchingPattern?: string
// 响应状态码
// httpStatus?: number
// 访问时间区间的开始值
// 开始时间
startTime?: string
// 访问时间区间的结束值
// 结束时间
endTime?: string
}
/**
*
*/
export enum SysMenuType {
// 目录
DIRECTORY,
// 菜单
MENU,
// 按钮
BUTTON
}
/**
*
*
*/
export interface SysMenuVO extends SysMenu {
// 国际化标题
i18nTitle: string
export interface CustomerManagementRecord extends CustomerManagement {
// 用户编号
userId: number
// 创建时间
createTime: string
// 更新时间
updateTime: string
}
/**
*
*/
export enum SysUserStatus {
// 正常
NORMAL = 1,
// 锁定的
LOCKED = 0
// 修改时间
updateTime: string | null
}
/**
*
*/
export type SysUserPageParam = SysUserQO & PageParam
/**
*
* record
*/
export type SysUserQO = {
// 登录账号
username?: string
// 昵称
nickname?: string
// 性别(0-默认未知,1-男,2-女)
gender?: 0 | 1 | 2
// 电子邮件
export interface CustomerManagement {
// 用户编号
userId?: number
avatar?: string
children?: Array<any>
//分发总量
distributeNum?: number
email?: string
// 电话
gender?: number
nickname?: string
organizationId?: number
organizationName?: string
phoneNumber?: string
// 状态(1-正常,0-冻结)
status?: SysUserStatus
// organizationId
organizationId?: number[]
// 用户类型:1:系统用户, 2客户用户
status?: number
type?: number
// 开始时间
startTime?: string
// 结束时间
endTime?: string
}
/**
*
*/
// export interface SysMenuVO extends SysMenu {
// // 国际化标题
// i18nTitle: string
// // 创建时间
// createTime: string
// // 更新时间
// updateTime: string
// }
/**
*
*/
export interface SysMenu {
// 菜单ID
// id: number
// // 父级ID
// parentId: number
// 菜单名称
title: string
// // 菜单图标
icon: number
// // 权限标识
// permission?: string
// // 路由地址
path: string
// // 打开方式 (1组件 2内链 3外链)
// targetType: number
// // 定位标识 (打开方式为组件时其值为组件相对路径其他为URL地址)
uri: number
// // 显示排序
// sort: number
// // 组件缓存0-开启1-关闭
// keepAlive: number
// // 隐藏菜单: 0-否1-是
// hidden: number
// // 菜单类型 0目录1菜单2按钮
// type: SysMenuType
// // 备注信息
// remarks: string
// nickname: string
fileSelection: Array<string>
}
/**
*
*/
export type SysUserPageVO = {
// 用户ID
userId: number
// 登录账号
username: string
// 昵称
nickname: string
// 头像
avatar: string
// 性别(0-默认未知,1-男,2-女)
gender: 0 | 1 | 2
// 电子邮件
email: string
// 电话
phoneNumber: string
// 状态(1-正常, 0-冻结)
status: SysUserStatus
// 用户类型1-系统用户2-客户用户
type: 1 | 2
// 组织机构ID
organizationId: number
// 组织机构名称
organizationName: string
// 创建时间
createTime: string
// 更新时间
updateTime: string
// 备注
username?: string
whichUserId?: number
}
/**
* Id
@ -218,41 +80,7 @@ export interface DistributeTaskDTO {
users?: Array<weightDistribute>
//修改状态
executeStatus?: number
}
/**
*
*/
export type PushAccessPageVO = {
executeStatus: number
taskId: number
// 用户ID
userId: number
// 登录账号
username: string
oldFileName: string
// 昵称
nickname: string
// 头像
avatar: string
// 性别(0-默认未知,1-男,2-女)
gender: 0 | 1 | 2
// 电子邮件
email: string
// 电话
phoneNumber: string
// 状态(1-正常, 0-冻结)
status: SysUserStatus
// 用户类型1-系统用户2-客户用户
type: 1 | 2
// 组织机构ID
organizationId: number
// 组织机构名称
organizationName: string
// 创建时间
createTime: string
// 更新时间
updateTime: string
// executeStatus?: number
}
//推送接入表单数据
export type PushAccessDTO = {
@ -264,41 +92,13 @@ export type PushAccessDTO = {
userId: number | undefined
}
/**
*
*
*/
export type PushAccessPageVO = {
userId: number
id: number
name: string
labelList: Array<object>
// 用户ID
// userId: number
// 登录账号
username: string
// 昵称
nickname: string
// 头像
avatar: string
// 性别(0-默认未知,1-男,2-女)
gender: 0 | 1 | 2
// 电子邮件
email: string
// 电话
phoneNumber: string
// 状态(1-正常, 0-冻结)
status: SysUserStatus
// 用户类型1-系统用户2-客户用户
type: 1 | 2
// 组织机构ID
organizationId: number
// 组织机构名称
organizationName: string
// 创建时间
createTime: string
// 更新时间
updateTime: string
}
interface tagsItem {
labelName: string | undefined
labelOrganizeId: number | undefined
export interface CustomerManagementSearch {
username?: string
uri?: string
// 访问时间区间的开始值
startTime?: string
// 访问时间区间的结束值
endTime?: string
}

@ -1,22 +1,15 @@
import httpClient from '@/utils/axios'
import type { ApiResult } from '@/api/types'
import type {
SysMenuDTO,
SysUserPageParam,
AccessLogPageParam,
DistributeTaskManagementPageParam,
distributeTaskId
} from '@/api/controlcenterstation/distributionTaskManagement/types'
/**
*
*
* @param pageParams
*/
// export function pageAccessLogs(pageParams: AccessLogPageParam) {
// return httpClient.get<ApiResult>('/log/access-log/page', {
// params: pageParams
// })
// }
export function pageAccessLogs(pageParams: SysUserPageParam) {
export function pageAccessLogs(pageParams: DistributeTaskManagementPageParam) {
return httpClient.get<ApiResult>('/distributeTask/page', {
params: pageParams
})
@ -29,19 +22,13 @@ export function deleteUser(distributeTaskId: number) {
return httpClient.delete<ApiResult<void>>(`/distributeTask/${distributeTaskId}`)
}
/**
*
* @param distributeTask
*/
export function createMenu(distributeTask: SysMenuDTO) {
return httpClient.post<ApiResult<void>>('/system/menu', distributeTask)
}
/**
*
* @param distributeTask
*
*
*/
export function updateMenu(distributeTask: SysMenuDTO) {
return httpClient.put<ApiResult<void>>('/system/menu', distributeTask)
export function performTask(distributeTaskId: distributeTaskId) {
return httpClient.get<ApiResult>('/distributeTask/executeTask', {
params: distributeTaskId
})
}
/**
*
@ -66,12 +53,3 @@ export function selectedCompanyEcho(distributeTaskId: distributeTaskId) {
params: distributeTaskId
})
}
/**
*
*
*/
export function performTask(distributeTaskId: distributeTaskId) {
return httpClient.get<ApiResult>('/distributeTask/executeTask', {
params: distributeTaskId
})
}

@ -2,102 +2,28 @@ import type { PageParam } from '@/api/types'
import { Dayjs } from 'dayjs'
/**
*
*
*/
// export interface SysMenuVO extends SysMenu {
// // 国际化标题
// i18nTitle: string
// // 创建时间
// createTime: string
// // 更新时间
// updateTime: string
// }
/**
*
*/
export interface SysMenuDTO extends Omit<SysMenu, 'id'> {
// 菜单id
id?: number
// 原菜单ID
originalId?: number
// 菜单标题对应的国际化信息
i18nMessages?: SysMenuI18n[]
}
/**
*
*/
export interface SysMenuI18n {
// 国际化标识
code: string
// 消息
message: string
// 地区语言标签
languageTag: string
}
export type DistributeTaskManagementPageParam = DistributeTaskManagementQO & PageParam
/**
* 访
*
*/
export type AccessLogPageParam = AccessLogQO & PageParam
/**
* 访
*/
export interface AccessLogQO {
// 追踪ID
// traceId?: string
// 用户ID
// userId?: number
// 访问IP地址
ip?: string
// 请求Uri
uri?: string
executeStatus?: string
distributeTaskType?: string
// 请求映射地址
// matchingPattern?: string
// 响应状态码
// httpStatus?: number
// 访问时间区间的开始值
export type DistributeTaskManagementQO = {
// 任务名称
taskName?: string
//任务状态
executeStatus?: number
//任务类型
distributeTaskType?: number
// 开始时间
startTime?: string
// 访问时间区间的结束值
// 结束时间
endTime?: string
taskName?: string
}
/**
*
*/
export interface SysMenu {
// 菜单ID
// id: number
// // 父级ID
// parentId: number
// 菜单名称
title: string
// // 菜单图标
icon: number
// // 权限标识
// permission?: string
// // 路由地址
path: string
// // 打开方式 (1组件 2内链 3外链)
// targetType: number
// // 定位标识 (打开方式为组件时其值为组件相对路径其他为URL地址)
uri: number
// // 显示排序
// sort: number
// // 组件缓存0-开启1-关闭
// keepAlive: number
// // 隐藏菜单: 0-否1-是
// hidden: number
// // 菜单类型 0目录1菜单2按钮
// type: SysMenuType
// // 备注信息
// remarks: string
// nickname: string
fileSelection: Array<string>
selectedCompany: Array<string>
interface userListItem {
userName: string
userId: number
weight?: number
}
/**
*
@ -108,91 +34,33 @@ export enum SysUserStatus {
// 锁定的
LOCKED = 0
}
interface userListItem {
userName: string
userId: number
weight?: number
}
/**
*
* record
*/
export type SysUserPageVO = {
userList: Array<userListItem>
// users: Array<weightDistribute>
fileRulePrefix: string
defaultType: number
clueStageId: number
id: number
show: boolean
name: string
labelList: Array<object>
// 用户ID
distributeTaskId: number
// 登录账号
oldFileName: string
// 昵称
nickname: string
username: string
// 头像
avatar: string
// 性别(0-默认未知,1-男,2-女)
gender: 0 | 1 | 2
// 电子邮件
email: string
// 电话
phoneNumber: string
// 状态(1-正常, 0-冻结)
status: SysUserStatus
// 用户类型1-系统用户2-客户用户
type: 1 | 2
// 组织机构ID
organizationId: number
// 组织机构名称
organizationName: string
export type DistributeTaskManagementRecord = {
createBy?: number
// 创建时间
createTime: string
// 更新时间
updateTime: string
//选择时间
startTime?: string
//任务名称
taskName: string
defaultType?: number
// 用户ID
distributeTaskId: number
//任务类型
distributeTaskType: number
distributeTaskType?: number
//
executeNum?: number
executeStatus?: number
fileRecordId?: string
fileRulePrefix: string
recordList: Array<any>
//分发规则
ruleStatus: number
ruleStatus?: number
//选择时间
startTime?: string | null
//任务名称
taskName?: string
//分发时间
timeStatus: number
executeStatus: number
}
/**
*
*/
export type SysUserPageParam = SysUserQO & PageParam
/**
*
*/
export type SysUserQO = {
// 登录账号
username?: string
// 昵称
nickname?: string
// 性别(0-默认未知,1-男,2-女)
gender?: 0 | 1 | 2
// 电子邮件
email?: string
// 电话
phoneNumber?: string
// 状态(1-正常,0-冻结)
status?: SysUserStatus
// organizationId
organizationId?: number[]
// 用户类型:1:系统用户, 2客户用户
type?: number
// 开始时间
startTime?: string
// 结束时间
endTime?: string
timeStatus?: number
userList: Array<userListItem>
}
/**
* Id
@ -228,7 +96,33 @@ export interface DistributeTaskDTO {
users: Array<weightDistribute>
}
/**
* ID
*
*/
export interface DistributeTaskManagementSearch {
// 追踪ID
// traceId?: string
// 用户ID
// userId?: number
taskName?: string
// 访问IP地址
customNid?: string
executeStatus?: string
distributeTaskType?: string
// 访问时间区间的开始值
startTime?: string
// 访问时间区间的结束值
endTime?: string
// 请求Uri
// uri?: string
// 请求映射地址
// matchingPattern?: string
// 响应状态码
// httpStatus?: number
}
/**
* ID()
*/
export interface distributeTaskId {
// 分发任务ID

@ -1,52 +1,35 @@
import httpClient from '@/utils/axios'
import type { ApiResult } from '@/api/types'
import type {
AccessLogPageParam,
SysMenuDTO,
SysUserPageParam,
resourcesDtoDTO
} from '@/api/customermanagement/customerList/types'
// SysMenuDTO
import type { SysUserPageParam, resourcesDtoDTO } from '@/api/customermanagement/customerList/types'
/**
* 访
* 线
* @param pageParams
*/
// export function pageAccessLogs(pageParams: AccessLogPageParam) {
// return httpClient.get<ApiResult>('/log/access-log/page', {
// params: pageParams
// })
// }
export function pageAccessLogs(pageParams: SysUserPageParam) {
return httpClient.get<ApiResult>('/clue/page', {
params: pageParams
})
}
// /**
// * 新建菜单
// * @param menuDto 菜单传输对象
// */
// export function createMenu(menuDto: SysMenuDTO) {
// return httpClient.post<ApiResult<void>>('/system/menu', menuDto)
// }
/**
*
* @param userId id
*/
export function deleteUser(userId: number) {
return httpClient.delete<ApiResult<void>>(`/system/user/${userId}`)
}
/**
*
* @param menuDto
*/
export function createMenu(menuDto: SysMenuDTO) {
return httpClient.post<ApiResult<void>>('/system/menu', menuDto)
}
/**
*
* @param menuDto
*/
export function updateMenu(menuDto: SysMenuDTO) {
return httpClient.put<ApiResult<void>>('/system/menu', menuDto)
}
/**
*
* @param resourcesDto
*
* @param resourcesDto
*/
export function updateResource(resourcesDto: resourcesDtoDTO) {
return httpClient.post<ApiResult<void>>('/clue/update', resourcesDto)
}
// /**
// * 删除用户
// * @param userId 用户id
// */
// export function deleteUser(userId: number) {
// return httpClient.delete<ApiResult<void>>(`/system/user/${userId}`)
// }

@ -1,231 +1,111 @@
import type { PageParam } from '@/api/types'
/**
*
* 线
*/
export interface SysMenuDTO extends Omit<SysMenu, 'id'> {
// 菜单id
id?: number
// 原菜单ID
originalId?: number
// 菜单标题对应的国际化信息
i18nMessages?: SysMenuI18n[]
}
export type SysUserPageParam = CustomerListQO & PageParam
/**
*
* 线
*/
export interface SysMenuI18n {
// 国际化标识
code: string
// 消息
message: string
// 地区语言标签
languageTag: string
export type CustomerListQO = {
//标签
clueLabelName?: string
//
httpStatus?: number
//号码
nid?: string
// 开始时间
startTime?: string
// 结束时间
endTime?: string
}
/**
*
* 线record
*/
export enum SysMenuType {
// 目录
DIRECTORY,
// 菜单
MENU,
// 按钮
BUTTON
export type CustomerListRecord = {
assignedBy?: number
assignedName?: string
clueId?: number
clueLabel: string
clueLabelList?: Array<string>
clueLabelName?: string
clueRecordId?: number
clueStageEntities?: Array<string>
clueStageId?: number | null
clueStageName?: string
clueTime?: string
// 创建时间
createTime?: string
//号码
nid?: string
organizeEntities?: Array<any>
originName?: string
otherClue?: string
remark?: string
}
/**
* 访
*
*/
export type AccessLogPageParam = AccessLogQO & PageParam
export interface SysEdit {
clueId: number | undefined
clueStageName: string
clueStageId: number | undefined
clueLabelList: Array<any>
}
//详情表单
interface detailFormItem {
key: string
value: string
}
export interface detailForm {
extraData: Array<detailFormItem>
}
/**
* 访
* 线
*/
export interface AccessLogQO {
// 追踪ID
// traceId?: string
export type CustomerListPageParam = CustomerListSearch & PageParam
export interface CustomerListSearch {
// 用户ID
userId?: number
// 访问IP地址
ip?: string
// 请求Uri
// 号码
nid?: string
// 请求映射地址
// matchingPattern?: string
// 响应状态码
httpStatus?: number
// 访问时间区间的开始值
startTime?: string
// 访问时间区间的结束值
endTime?: string
username?: string
clueLabelName?: string
}
// interface timeobject {
// check: boolean
// content: string
// }
/**
*
*/
// export interface SysMenuVO extends SysMenu {
// //国际化标题
// i18nTitle: string
// // 创建时间
// createTime: string
// // 更新时间
// updateTime: string
// errorMsg: string
// httpStatus: number
// id: number
// ip: string
// matchingPattern: string
// method: string
// originalId: number
// reqBody: string
// reqParams: string
// result: string
// time: number
// traceId: string
// uri: string
// userAgent: string
// userId: string
// username: boolean
// parentId: number
// timelineList: timeobject[]
// }
interface timelineListObj {
check: boolean
content: string
}
/**
*
*/
export interface SysMenu {
clueId: number | undefined
clueStageName: string
clueStageId: number | undefined
clueLabelList: Array<string>
// 菜单ID
// id: number
// // 父级ID
// parentId: number
// // 菜单名称
// title: string
// // 菜单图标
// icon: string
// // 权限标识
// permission?: string
// // 路由地址
// path: string
// // 打开方式 (1组件 2内链 3外链)
// targetType: number
// // 定位标识 (打开方式为组件时其值为组件相对路径其他为URL地址)
// uri: string
// // 显示排序
// sort: number
// 组件缓存0-开启1-关闭
// keepAlive: number
// 隐藏菜单: 0-否1-是
// hidden: number
// // 菜单类型 0目录1菜单2按钮
// type: SysMenuType
// // 备注信息
// remarks: string
// nickname: string
// fileSelection: Array<string>
// timelineList: Array<timelineListObj>
}
/**
*
*/
export enum SysUserStatus {
// 正常
NORMAL = 1,
// 锁定的
LOCKED = 0
}
/**
*
*/
export type SysUserPageVO = {
clueStageName: string
otherClue: any
clueId: number
name: string
clueStageId: number
sort: number
// 用户ID
userId: number
// 登录账号
username: string
// 昵称
nickname: string
// 头像
avatar: string
// 性别(0-默认未知,1-男,2-女)
gender: 0 | 1 | 2
// 电子邮件
email: string
// 电话
phoneNumber: string
// 状态(1-正常, 0-冻结)
status: SysUserStatus
// 用户类型1-系统用户2-客户用户
type: 1 | 2
// 组织机构ID
organizationId: number
// 组织机构名称
organizationName: string
// 创建时间
createTime: string
// 更新时间
updateTime: string
clueLabel: string
clueLabelList: string
}
/**
*
*/
export type SysUserPageParam = SysUserQO & PageParam
/**
*
*/
export type SysUserQO = {
// 登录账号
username?: string
// 昵称
nickname?: string
// 性别(0-默认未知,1-男,2-女)
gender?: 0 | 1 | 2
// 电子邮件
email?: string
// 电话
phoneNumber?: string
// 状态(1-正常,0-冻结)
status?: SysUserStatus
// organizationId
organizationId?: number[]
// 用户类型:1:系统用户, 2客户用户
type?: number
// 开始时间
startTime?: string
// 结束时间
endTime?: string
}
//修改资源
//修改资源(编辑接口用到)
export interface resourcesDtoDTO {
clueId?: number
clueStageName?: string
clueStageId?: number
clueLabelList: Array<string>
}
//详情表单
interface detailFormItem {
key: string
value: string
}
export interface detailForm {
extraData: Array<detailFormItem>
}
// /**
// * 系统菜单传输对象
// */
// export interface SysMenuDTO extends Omit<SysEdit, 'id'> {
// // 菜单id
// id?: number
// // 原菜单ID
// originalId?: number
// // 菜单标题对应的国际化信息
// i18nMessages?: SysMenuI18n[]
// }
// /**
// * 菜单国际化信息
// */
// export interface SysMenuI18n {
// // 国际化标识
// code: string
// // 消息
// message: string
// // 地区语言标签
// languageTag: string
// }

@ -0,0 +1,98 @@
import httpClient from '@/utils/axios'
import type { ApiResult } from '@/api/types'
import type {
DistributeTaskManagementPageParam,
distributeTaskId
} from '@/api/controlcenterstation/distributionTaskManagement/types'
import type {
GeopoliticalCustomersDTO,
CustomerDTO,
customId
} from '@/api/geopoliticalCustomers/types'
import type { GeopoliticalCustomersPageParam } from '@/api/geopoliticalCustomers/types'
/**
*
* @param pageParams
*/
export function pageAccessLogs(pageParams: GeopoliticalCustomersPageParam) {
return httpClient.get<ApiResult>('/custom/page', {
params: pageParams
})
}
/**
*
* @param distributeTaskId id
*/
export function deleteUser(distributeTaskId: number) {
return httpClient.delete<ApiResult<void>>(`/distributeTask/${distributeTaskId}`)
}
/**
*
*
*/
export function performTask(distributeTaskId: distributeTaskId) {
return httpClient.get<ApiResult>('/distributeTask/executeTask', {
params: distributeTaskId
})
}
/**
*
*
*/
export function selectedCompanyList() {
return httpClient.get<ApiResult>('/system/user/selectSonList')
}
/**
*
*
*/
export function fileSelectionList() {
return httpClient.get<ApiResult>('/clueRecord/select')
}
/**
* ID
*
*/
export function selectedCompanyEcho(distributeTaskId: distributeTaskId) {
return httpClient.get<ApiResult>('/distributeTask/details', {
params: distributeTaskId
})
}
/**
*
* @param distributeDto
*/
export function addDistributeConfiguration(distributeDto: GeopoliticalCustomersDTO) {
return httpClient.post<ApiResult<void>>('/distributeTask/add', distributeDto)
}
/**
*
* @param distributeDto
*/
export function updateDistributeConfigurationmenuDto(distributeDto: GeopoliticalCustomersDTO) {
return httpClient.post<ApiResult<void>>('/distributeTask/update', distributeDto)
}
/**
*
* @param customerDto
*/
export function addCustomer(customerDto: CustomerDTO) {
return httpClient.post<ApiResult<void>>('/custom/add', customerDto)
}
/**
*
* @param customerDto
*/
export function updateCustomer(customerDto: CustomerDTO) {
return httpClient.post<ApiResult<void>>('/custom/update', customerDto)
}
/**
* ID
*
*/
export function getDetail(customId: customId) {
return httpClient.get<ApiResult>('/custom/details', {
params: customId
})
}

@ -0,0 +1,239 @@
import type { PageParam } from '@/api/types'
import { Dayjs } from 'dayjs'
/**
*
*/
export type DistributeTaskManagementPageParam = DistributeTaskManagementQO & PageParam
/**
*
*/
export type DistributeTaskManagementQO = {
// 任务名称
taskName?: string
//任务状态
executeStatus?: number
//任务类型
distributeTaskType?: number
// 开始时间
startTime?: string
// 结束时间
endTime?: string
}
interface userListItem {
userName: string
userId: number
weight?: number
}
/**
*
*/
export enum SysUserStatus {
// 正常
NORMAL = 1,
// 锁定的
LOCKED = 0
}
/**
* record
*/
export type DistributeTaskManagementRecord = {
createBy?: number
// 创建时间
createTime: string
defaultType?: number
// 用户ID
distributeTaskId: number
//任务类型
distributeTaskType?: number
//
executeNum?: number
executeStatus?: number
fileRecordId?: string
fileRulePrefix: string
recordList: Array<any>
//分发规则
ruleStatus?: number
//选择时间
startTime?: string | null
//任务名称
taskName?: string
//分发时间
timeStatus?: number
userList: Array<userListItem>
}
/**
* Id
*/
interface weightDistribute {
userId: number
weight?: number | ''
}
/**
*
*/
// export interface DistributeTaskDTO {
// defaultType: number | undefined
// sCID: Array<number>
// // 分发任务ID
// distributeTaskId?: number
// // 任务类型
// distributeTaskType: number | undefined
// // 任务名称
// taskName: string | undefined
// // 分发规则
// ruleStatus?: number
// // 分发时间
// timeStatus?: number
// // 选择时间
// // startTime?: Dayjs | string
// startTime: string | Dayjs | undefined
// // 文件规则前缀
// fileRulePrefix?: string
// //上传文件记录ID
// fileRecordIdList?: Array<string>
// // 权重
// users: Array<weightDistribute>
// }
/**
*
*/
export interface DistributeTaskManagementSearch {
// 追踪ID
// traceId?: string
// 用户ID
// userId?: number
taskName?: string
// 访问IP地址
ip?: string
executeStatus?: string
distributeTaskType?: string
// 访问时间区间的开始值
startTime?: string
// 访问时间区间的结束值
endTime?: string
// 请求Uri
// uri?: string
// 请求映射地址
// matchingPattern?: string
// 响应状态码
// httpStatus?: number
}
/**
* ID()
*/
export interface distributeTaskId {
// 分发任务ID
id: number | undefined
}
interface storeMessageItem {
storeName: string
appointTime: string
}
export interface GeopoliticalCustomersDTO {
appellation: string
number: string
address: any
communityName: string
radius: string
storeMessage: Array<storeMessageItem>
// storeMessage: any
}
export interface GeopoliticalCustomersStoreDTO {
storeName: string
appointTime: any
}
interface customStoreEntitiesItem {
// createBy: number
// updateBy: number
// createTime: string
// updateTime: string
// customStoreId: number
// storeId: number
// customId: number
//门店名称
storeName: string
//预约时间
reservationTime: string
}
export interface CustomerDTO {
customId?: number | undefined
//客户名称
customName: string | undefined
//客户联系方式
customNid: string | undefined
address?: Array<any>
//省
economize: string
//市
market: string
//区
distinguish: string
//详细地址
detailAddress: any
//半径
radius: any
//报名状态
enrollStatus: number
//门店信息
customStoreEntities: Array<customStoreEntitiesItem>
}
/**
* ID()
*/
export interface customId {
// 分发任务ID
id: number | undefined
}
////////////////////////////////
/**
*
*/
export type GeopoliticalCustomersPageParam = GeopoliticalCustomersQO & PageParam
/**
*
*/
export type GeopoliticalCustomersQO = {
// 客户名称
customName?: string
//报名状态
enrollStatus?: number
//联系方式
customNid?: string
// 开始时间
startTime?: string
// 结束时间
endTime?: string
}
/**
* record
*/
export type GeopoliticalCustomersRecord = {
// 创建时间
createTime?: string
customId?: number
customName?: string
customNid?: string
customStoreVOList?: Array<any>
detailAddress?: string
distinguish?: string
economize?: string
market?: string
enrollStatus?: string
radius?: string
}
/**
*
*/
export interface GeopoliticalCustomersSearch {
customName?: string
customNid?: string
enrollStatus?: string
// 访问时间区间的开始值
startTime?: string
// 访问时间区间的结束值
endTime?: string
}

@ -4,37 +4,17 @@ import type {
LabelOrganizeEntity,
labelGroupIdType,
clueStageType,
userId
userId,
LabelRulePageParam
} from '@/api/salesmanagement/labelRule/types'
import type { SysUserPageParam } from '@/api/controlcenterstation/distributionTaskManagement/types'
// import type { SysUserPageParam } from '@/api/controlcenterstation/distributionTaskManagement/types'
/**
*
* @param distributeTask
*/
export function createLabelOrganize(distributeTask: LabelOrganizeEntity) {
return httpClient.post<ApiResult<void>>('/labelOrganize/add', distributeTask)
}
/**
*
* @param distributeTask
*/
export function updateLabelOrganize(distributeTask: LabelOrganizeEntity) {
return httpClient.post<ApiResult<void>>('/labelOrganize/update', distributeTask)
}
/**
*
* @param distributeTask
*/
export function getLabelGroupList() {
return httpClient.get<ApiResult<SelectData[]>>('/labelOrganize/list')
}
/**
*
*
* @param pageParams
*/
export function pageAccessLogs(pageParams: SysUserPageParam) {
export function pageAccessLogs(pageParams: LabelRulePageParam) {
return httpClient.get<ApiResult>('/labelOrganize/page', {
params: pageParams
})
@ -46,6 +26,19 @@ export function pageAccessLogs(pageParams: SysUserPageParam) {
export function deleteLabelGroup(labelGroupId: Array<number>) {
return httpClient.delete<ApiResult<void>>('/labelOrganize/del', { data: labelGroupId })
}
/**
* 线
*/
export function getClueStageList() {
return httpClient.get<ApiResult<SelectData[]>>('/clueStage/list')
}
/**
* 线
* @param clueStageId id
*/
export function deleteClueStage(clueStageId: number) {
return httpClient.delete<ApiResult<void>>(`/clueStage/${clueStageId}`)
}
/**
* 线
* @param clueStage 线
@ -61,18 +54,29 @@ export function updateClueStage(clueStage: clueStageType) {
return httpClient.post<ApiResult<void>>('/clueStage/update', clueStage)
}
/**
* 线
*
* @param distributeTask
*/
export function getClueStageList() {
return httpClient.get<ApiResult<SelectData[]>>('/clueStage/list')
export function createLabelOrganize(distributeTask: LabelOrganizeEntity) {
return httpClient.post<ApiResult<void>>('/labelOrganize/add', distributeTask)
}
/**
* 线
* @param clueStageId id
*
* @param distributeTask
*/
export function deleteClueStage(clueStageId: number) {
return httpClient.delete<ApiResult<void>>(`/clueStage/${clueStageId}`)
export function updateLabelOrganize(distributeTask: LabelOrganizeEntity) {
return httpClient.post<ApiResult<void>>('/labelOrganize/update', distributeTask)
}
////////////////////////////////////////////////////////////////
/**
*
* @param distributeTask
*/
export function getLabelGroupList() {
return httpClient.get<ApiResult<SelectData[]>>('/labelOrganize/list')
}
/**
* id()
* @param userId id

@ -1,25 +1,67 @@
import type { PageParam } from '@/api/types'
interface labelObj {
labelName: string
}
/**
*
*
*/
// export interface LabelOrganizeEntity {
// // // 分发任务ID
// // id?: number
// // 标签组名称
// name: string
// // 标签组是否启用
// // isEnable: number
// // 标签
// labelList: Array<labelObj>
// }
export type LabelRulePageParam = LabelRuleQO & PageParam
/**
*
*/
export type LabelRuleQO = {
status?: string
// 开始时间
// startTime?: string
// // 结束时间
// endTime?: string
}
interface labelListItem {
createBy: number
createTime: string
id: number
labelName: string
labelOrganizeId: number
type?: null
updateBy?: null
updateTime?: null | string
}
//标签组record
export interface LabelGroupRecord {
// 创建时间
createTime: string
id: number
isEnable?: number
labelList?: Array<labelListItem>
name: string | undefined
clueStageId: number
}
interface tagsItem {
labelName: string
labelOrganizeId: number | undefined
}
interface objectState {
tags: tagsItem[]
inputVisible: boolean
inputValue: string
}
//新增线索阶段显示数据表单
export type ClueStageDTO = {
name: string | undefined
sort?: number | undefined
clueStageId?: number | undefined
desc: objectState
}
//编辑线索阶段表单
export type clueStageEditModelType = {
//标签组名
name: string | undefined
sort?: number | undefined
clueStageId?: number | undefined
}
interface labelEntityListItem {
labelName: string
labelOrganizeId: number
}
//添加标签组表单
export interface LabelOrganizeEntity {
// // 分发任务ID
id?: number | undefined
@ -34,6 +76,24 @@ export interface LabelOrganizeEntity {
// 标签
labelList?: Array<string>
}
////////////////////////////////////////////////////////////////
interface labelObj {
labelName: string
}
/**
*
*/
// export interface LabelOrganizeEntity {
// // // 分发任务ID
// // id?: number
// // 标签组名称
// name: string
// // 标签组是否启用
// // isEnable: number
// // 标签
// labelList: Array<labelObj>
// }
export interface labelGroupIdType {
integers: Array<number>
}

@ -73,6 +73,8 @@ export const useAdminForm = <T, R = unknown>(
/* 表单校验后并提交 */
const validateAndSubmit = (model: T, requestOptions?: RequestOptions<R>) => {
// 防止动态 formRule 异常抛出 outOfDate使用 setTimeout 包一层
console.log('model, requestOptions', model, requestOptions)
setTimeout(() => {
useFormResult
.validate()
@ -82,6 +84,7 @@ export const useAdminForm = <T, R = unknown>(
})
.catch(e => {
import.meta.env.DEV && console.log('error', e)
console.log('error', e)
console.log('catch')
})
}, 0)

@ -36,7 +36,6 @@ const onRequestFulfilled = (requestConfig: InternalAxiosRequestConfig) => {
// 响应成功处理函数
const onResponseFulfilled = (response: AxiosResponse) => {
console.log(response, 'response')
const headers = response.headers
if (
headers != null &&

File diff suppressed because it is too large Load Diff

@ -76,7 +76,7 @@
</a-row> -->
</a-card>
<!-- 工具栏 -->
<access-log-page-search :loading="tableRef?.loading" @search="searchTable" />
<access-detail-search :loading="tableRef?.loading" @search="searchTable" />
<!-- 批量操作更多操作 -->
<a-card :bordered="false" :body-style="{ paddingBottom: 0 }">
<div class="operationButtonArea">
@ -181,14 +181,18 @@ import { message } from 'ant-design-vue'
import ProTable from '#/table'
import type { ProTableInstanceExpose, TableRequest, ProColumns } from '#/table'
import { mergePageParam } from '@/utils/page-utils'
import type { AccessLogPageParam, SysUserPageVO } from '@/api/clueaccess/accessDetail/types'
import type {
AccessDetailPageParam,
AccessDetailRecord,
PushAccessRecord
} from '@/api/clueaccess/accessDetail/types'
import { pageAccessLogs, trafficDistributionStatistics } from '@/api/clueaccess/accessDetail'
import AccessLogPageSearch from '@/views/clueaccess/accessDetail/accessDetailSearch.vue'
import AccessDetailSearch from '@/views/clueaccess/accessDetail/accessDetailSearch.vue'
import AccessDetailModal from '@/views/clueaccess/accessDetail/accessDetailModal.vue'
import AccessDetailDistributionModal from '@/views/clueaccess/accessDetail/accessDetailDistributionModal.vue'
import { FormAction } from '@/hooks/form'
//
import type { ColProps } from 'ant-design-vue'
// import type { ColProps } from 'ant-design-vue'
import type { ValidateErrorEntity } from 'ant-design-vue/es/form/interface'
//
import { performTask } from '@/api/controlcenterstation/distributionTaskManagement'
@ -294,7 +298,7 @@ const tableRef = ref<ProTableInstanceExpose>()
const accessDetailModalRef = ref<InstanceType<typeof AccessDetailModal>>()
const accessDetailDistributionModalRef = ref<InstanceType<typeof AccessDetailDistributionModal>>()
//
let searchParams: AccessLogPageParam = {}
let searchParams: AccessDetailPageParam = {}
//
const tableRequest: TableRequest = (params, sorter, filter) => {
@ -306,7 +310,7 @@ const addPush = () => {
accessDetailModalRef.value?.open(FormAction.UPDATE)
}
//
const configuration = (record: SysUserPageVO) => {
const configuration = (record: PushAccessRecord) => {
accessDetailModalRef.value?.open(FormAction.UPDATE, record)
}
//
@ -322,7 +326,7 @@ const configuration = (record: SysUserPageVO) => {
// }
//
// const handleEdit = (record: SysUserPageVO) => {
// const handleEdit = (record: AccessDetailRecord) => {
// accessDetailDistributionModalRef.value?.open({
// newFormAction: FormAction.UPDATE,
// record: record
@ -335,7 +339,7 @@ const reloadTable = (resetPageIndex?: boolean) => {
}
//
const searchTable = (params: AccessLogPageParam) => {
const searchTable = (params: AccessDetailPageParam) => {
searchParams = params
reloadTable(true) // tableRequest
}
@ -474,7 +478,7 @@ const columns: ProColumns[] = [
// })
//
const isOpen = ref('开启')
const openOrStop = (record: SysUserPageVO) => {
const openOrStop = (record: AccessDetailRecord) => {
console.log(record, 'record')
if (record.executeStatus !== 2) {
doRequest(performTask(toRaw({ id: record.taskId })), {

@ -152,7 +152,7 @@ import { useAdminForm, useFormAction, FormAction } from '@/hooks/form'
import type { FormRequestMapping } from '@/hooks/form'
import { createMenu, updateMenu } from '@/api/clueaccess/accessDetail'
import type { ColProps } from 'ant-design-vue'
import type { SysUserPageVO, SysMenu } from '@/api/clueaccess/accessDetail/types'
import type { AccessDetailRecord, SysMenu } from '@/api/clueaccess/accessDetail/types'
import { overrideProperties } from '@/utils/bean-utils'
import { reactive, ref } from 'vue'
//
@ -275,7 +275,7 @@ const selectedDistribute: string[] = []
interface openObj {
newFormAction: FormAction
selectedCompany?: string[]
record?: SysUserPageVO
record?: AccessDetailRecord
}
defineExpose({

@ -85,15 +85,13 @@
</template>
<script setup lang="ts">
import { overrideProperties } from '@/utils/bean-utils'
// import { overrideProperties } from '@/utils/bean-utils'
import type { SelectProps } from 'ant-design-vue'
import { useAdminForm, useFormAction, FormAction, labelCol, wrapperCol } from '@/hooks/form'
import type { FormRequestMapping } from '@/hooks/form'
import { useModal } from '@/hooks/modal'
import type {
PushAccessDTO,
PushAccessPageVO
} from '@/api/controlcenterstation/customerManagement/types'
import type { PushAccessDTO } from '@/api/controlcenterstation/customerManagement/types'
import type { PushAccessRecord } from '@/api/clueaccess/accessDetail/types'
import { createPushAccessLink } from '@/api/controlcenterstation/customerManagement'
import { selectedCompanyList } from '@/api/controlcenterstation/distributionTaskManagement'
import { doRequest } from '@/utils/axios/request'
@ -200,7 +198,7 @@ const copy = async (text: string) => {
}
defineExpose({
open(newFormAction: FormAction, record?: PushAccessPageVO) {
open(newFormAction: FormAction, record?: PushAccessRecord) {
// if (newFormAction === FormAction.UPDATE) {
selectedCompanyOptions.value = []
doRequest(selectedCompanyList(), {

@ -56,7 +56,7 @@
<script setup lang="ts">
import { Form } from 'ant-design-vue'
import type { AccessLogQO } from '@/api/clueaccess/accessDetail/types'
import type { AccessDetailQO } from '@/api/clueaccess/accessDetail/types'
import dayjs from 'dayjs'
import type { Dayjs } from 'dayjs'
@ -77,7 +77,7 @@ const emits = defineEmits<{
}>()
const searchTimeValue = ref<[Dayjs, Dayjs]>()
const formModel = reactive<AccessLogQO>({
const formModel = reactive<AccessDetailQO>({
oldFileName: '',
// userId: undefined,
ip: undefined,
@ -95,6 +95,9 @@ const search = () => {
if (searchTimeValue.value && searchTimeValue.value.length == 2) {
param.startTime = searchTimeValue.value[0].format('YYYY-MM-DD HH:mm:ss')
param.endTime = searchTimeValue.value[1].format('YYYY-MM-DD HH:mm:ss')
}else {
param.startTime = ''
param.endTime = ''
}
emits('search', param)
}

@ -113,12 +113,13 @@ import {
downloadI18nDataExcelTemplate,
importI18nDataExcel,
deleteFile,
trafficDistributionStatistics
checkHeaderInformation
} from '@/api/clueaccess/clueImport'
import { remoteFileDownload } from '@/utils/file-utils'
import { doRequest } from '@/utils/axios/request'
import type { UploadChangeParam, UploadProps } from 'ant-design-vue'
import type { I18nImportData } from '@/api/clueaccess/clueImport/types'
// import type { I18nImportData } from '@/api/i18n/types'
// import { Moment } from 'moment'
// import { useI18n } from 'vue-i18n'
//
@ -128,7 +129,9 @@ import type { UnwrapRef } from 'vue'
//
import useClipboard from 'vue-clipboard3'
import { message } from 'ant-design-vue'
const tableRef = ref<ProTableInstanceExpose>()
//
import type { ProTableInstanceExpose } from '#/table'
import axios from 'axios'
//
// const { t } = useI18n()
@ -157,8 +160,9 @@ const handleChange = ({ file, fileList }: UploadChangeParam) => {
message.success('移除成功', 1)
}
} else {
doRequest(importI18nDataExcel(toRaw(formModel)), {
doRequest(checkHeaderInformation(toRaw(formModel)), {
onSuccess: (res: any) => {
console.log(res, 'res')
resData.length = 0
if (res.code === 200) {
visible.value = true
@ -172,6 +176,11 @@ const handleChange = ({ file, fileList }: UploadChangeParam) => {
fileList[0].response = error.message
customDefinitionFileList.value.length = 0
fileLists.value.length = 0
// currentId.value = ''
// fileList[0].status = 'error'
// fileList[0].response = error.message
// customDefinitionFileList.value.length = 0
// fileLists.value.length = 0
},
onError: () => {
// fileList[0].status = 'error'
@ -250,10 +259,34 @@ const loading = ref<boolean>(false)
const visible = ref<boolean>(false)
//
const handleOk = () => {
message.success('上传成功', 1)
visible.value = false
customDefinitionFileList.value.length = 0
fileLists.value.length = 0
doRequest(importI18nDataExcel(toRaw({ recordId: currentId.value })), {
onSuccess: (res: any) => {
// resData.length = 0
// if (res.code === 200) {
// visible.value = true
// resData.push(...res.data.excelHead)
// currentId.value = res.data.clueRecordId
message.success('上传成功', 1)
visible.value = false
customDefinitionFileList.value.length = 0
fileLists.value.length = 0
// }
},
onFail: error => {
// currentId.value = ''
// fileList[0].status = 'error'
// fileList[0].response = error.message
// customDefinitionFileList.value.length = 0
// fileLists.value.length = 0
},
onError: () => {
// fileList[0].status = 'error'
// fileLists.value.length = 0
// fileList[0].status = 'error'
// fileList.length = 0
// submitLoading.value = false
}
})
}
//
const handleCancel = () => {

@ -4,7 +4,7 @@
<div class="customerManagement-title">客户管理</div>
</a-card>
<!-- 工具栏 -->
<access-log-page-search :loading="tableRef?.loading" @search="searchTable" />
<customer-management-search :loading="tableRef?.loading" @search="searchTable" />
<!-- 分发配置 -->
<a-card :bordered="false" :body-style="{ paddingBottom: 0 }">
<div class="operationButtonArea">
@ -46,22 +46,25 @@
<script setup lang="ts">
import { reactive, ref } from 'vue'
import type { UnwrapRef } from 'vue'
// import type { UnwrapRef } from 'vue'
//
import { message } from 'ant-design-vue'
//
import ProTable from '#/table'
import type { ProTableInstanceExpose, TableRequest, ProColumns } from '#/table'
import { mergePageParam } from '@/utils/page-utils'
import type { SysUserQO, SysUserPageVO } from '@/api/controlcenterstation/customerManagement/types'
import type {
CustomerManagementPageParam,
CustomerManagementRecord
} from '@/api/controlcenterstation/customerManagement/types'
import { pageAccessLogs, deleteUser } from '@/api/controlcenterstation/customerManagement'
import AccessLogPageSearch from '@/views/controlcenterstation/customerManagement/customerManagementSearch.vue'
import CustomerManagementSearch from '@/views/controlcenterstation/customerManagement/customerManagementSearch.vue'
import CustomerManagementModal from '@/views/controlcenterstation/customerManagement/customerManagementModal.vue'
import CustomerManagementPushaccessModal from '@/views/controlcenterstation/customerManagement/customerManagementPushaccessModal.vue'
import { FormAction } from '@/hooks/form'
import { doRequest } from '@/utils/axios/request'
//
import useClipboard from 'vue-clipboard3'
// import useClipboard from 'vue-clipboard3'
defineOptions({ name: 'CustomerManagement' })
@ -76,7 +79,7 @@ const customerManagementPushaccessModalRef =
ref<InstanceType<typeof CustomerManagementPushaccessModal>>()
//
let searchParams: SysUserQO = {}
let searchParams: CustomerManagementPageParam = {}
//
const tableRequest: TableRequest = (params, sorter, filter) => {
@ -90,7 +93,7 @@ const reloadTable = (resetPageIndex?: boolean) => {
}
//
const searchTable = (params: SysUserQO) => {
const searchTable = (params: CustomerManagementPageParam) => {
searchParams = params
reloadTable(true) // tableRequest
}
@ -126,7 +129,7 @@ const handleNew = (type: string) => {
// }
//
const handleDelete = (record: SysUserPageVO) => {
const handleDelete = (record: CustomerManagementRecord) => {
doRequest(deleteUser(record.userId), {
successMessage: '删除成功!',
onSuccess: () => reloadTable()

@ -183,7 +183,7 @@ import { useModal } from '@/hooks/modal'
import { useAdminForm, useFormAction, FormAction } from '@/hooks/form'
import type { FormRequestMapping } from '@/hooks/form'
import type {
SysUserPageVO,
CustomerManagementRecord,
DistributeTaskDTO
} from '@/api/controlcenterstation/customerManagement/types'
import {
@ -194,8 +194,8 @@ import {
//
import type { RadioChangeEvent } from 'ant-design-vue/es/radio/interface'
//
import { Dayjs } from 'dayjs'
import dayjs from 'dayjs'
// import { Dayjs } from 'dayjs'
// import dayjs from 'dayjs'
import 'dayjs/locale/zh-cn'
//
import type { ValidateErrorEntity } from 'ant-design-vue/es/form/interface'
@ -417,6 +417,7 @@ const { submitLoading, validateAndSubmit, resetFields, validateInfos } = useAdmi
//
const handleSubmit = () => {
console.log('111')
const isEmpty = formState.selectedCompanys.every((item: optionItem) => {
return item.content
})
@ -429,7 +430,17 @@ const handleSubmit = () => {
validateAndSubmit(toRaw(formModel), {
onSuccess: () => {
closeModal()
formModel.fileRulePrefix = formModel.fileRulePrefix?.replace(/-/g, '')
console.log(formModel.fileRulePrefix, 'fileRulePrefix11')
emits('submit-success')
},
// onError: () => {
// formModel.fileRulePrefix = formModel.fileRulePrefix?.replace(/-/g, '')
// console.log(formModel.fileRulePrefix, 'fileRulePrefix22')
// },
onFinally: () => {
formModel.fileRulePrefix = formModel.fileRulePrefix?.replace(/-/g, '')
console.log(formModel.fileRulePrefix, 'fileRulePrefix333')
}
})
}
@ -452,7 +463,7 @@ const handleClose = () => {
interface openObj {
newFormAction: FormAction
selectedCompany: selectedItem[]
record?: SysUserPageVO
record?: CustomerManagementRecord
}
defineExpose({
open(opendata: openObj) {

@ -56,8 +56,7 @@
</template>
<script setup lang="ts">
import { overrideProperties } from '@/utils/bean-utils'
import { passEncrypt } from '@/utils/password-utils'
// import { overrideProperties } from '@/utils/bean-utils'
import { useAdminForm, useFormAction, FormAction, labelCol, wrapperCol } from '@/hooks/form'
import type { FormRequestMapping } from '@/hooks/form'
import { useModal } from '@/hooks/modal'
@ -67,7 +66,7 @@ import useClipboard from 'vue-clipboard3'
import { message } from 'ant-design-vue'
import type {
PushAccessDTO,
PushAccessPageVO
CustomerManagementRecord
} from '@/api/controlcenterstation/customerManagement/types'
import { createPushAccessLink } from '@/api/controlcenterstation/customerManagement'
import { selectedCompanyList } from '@/api/controlcenterstation/distributionTaskManagement'
@ -149,7 +148,7 @@ const handleClose = () => {
}
defineExpose({
open(newFormAction: FormAction, record?: PushAccessPageVO) {
open(newFormAction: FormAction, record?: CustomerManagementRecord) {
selectedCompanyOptions.value = []
doRequest(selectedCompanyList(), {
onSuccess: (res: any) => {

@ -53,7 +53,7 @@
<script setup lang="ts">
import { Form } from 'ant-design-vue'
import type { AccessLogQO } from '@/api/controlcenterstation/customerManagement/types'
import type { CustomerManagementSearch } from '@/api/controlcenterstation/customerManagement/types'
import dayjs from 'dayjs'
import type { Dayjs } from 'dayjs'
@ -75,7 +75,7 @@ const emits = defineEmits<{
//
const searchTimeValue = ref<[Dayjs, Dayjs]>()
const formModel = reactive<AccessLogQO>({
const formModel = reactive<CustomerManagementSearch>({
username: '',
uri: undefined
})

@ -4,7 +4,7 @@
<div class="distributionTaskManagement-title">分发任务管理</div>
</a-card>
<!-- 工具栏 -->
<access-log-page-search :loading="tableRef?.loading" @search="searchTable" />
<distributionTask-management-search :loading="tableRef?.loading" @search="searchTable" />
<!-- 批量操作更多操作 -->
<a-card :bordered="false" :body-style="{ paddingBottom: 0 }">
<div class="operationButtonArea">
@ -121,7 +121,7 @@
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import { ref } from 'vue'
import { message } from 'ant-design-vue'
import { doRequest } from '@/utils/axios/request'
//
@ -129,8 +129,8 @@ import ProTable from '#/table'
import type { ProTableInstanceExpose, TableRequest, ProColumns } from '#/table'
import { mergePageParam } from '@/utils/page-utils'
import type {
SysUserQO,
SysUserPageVO
DistributeTaskManagementPageParam,
DistributeTaskManagementRecord
} from '@/api/controlcenterstation/distributionTaskManagement/types'
import {
pageAccessLogs,
@ -138,7 +138,7 @@ import {
performTask
} from '@/api/controlcenterstation/distributionTaskManagement'
import DistributionTaskManagementModal from '@/views/controlcenterstation/distributionTaskManagement/distributionTaskManagementModal.vue'
import AccessLogPageSearch from '@/views/controlcenterstation/distributionTaskManagement/distributionTaskManagementSearch.vue'
import DistributionTaskManagementSearch from '@/views/controlcenterstation/distributionTaskManagement/distributionTaskManagementSearch.vue'
import { FormAction } from '@/hooks/form'
//()
import { updateDistributeConfigurationmenuDto } from '@/api/controlcenterstation/customerManagement'
@ -152,7 +152,7 @@ const tableRef = ref<ProTableInstanceExpose>()
const distributionTaskManagementModalRef =
ref<InstanceType<typeof DistributionTaskManagementModal>>()
//
let searchParams: SysUserQO = {}
let searchParams: DistributeTaskManagementPageParam = {}
//
const tableRequest: TableRequest = (params, sorter, filter) => {
@ -167,7 +167,7 @@ const reloadTable = (resetPageIndex?: boolean) => {
}
//
const searchTable = (params: SysUserQO) => {
const searchTable = (params: DistributeTaskManagementPageParam) => {
searchParams = params
reloadTable(true) // tableRequest
}
@ -179,7 +179,7 @@ const handleNew = () => {
}
//
const handleEdit = (record: SysUserPageVO) => {
const handleEdit = (record: DistributeTaskManagementRecord) => {
distributionTaskManagementModalRef.value?.open({
newFormAction: FormAction.UPDATE,
record: record
@ -253,7 +253,7 @@ const columns: ProColumns[] = [
}
]
//
const open = (record: SysUserPageVO) => {
const open = (record: DistributeTaskManagementRecord) => {
if (record.executeStatus === 0 || record.executeStatus === 3) {
doRequest(performTask(toRaw({ id: record.distributeTaskId })), {
onSuccess: (res: any) => {
@ -267,7 +267,7 @@ const open = (record: SysUserPageVO) => {
}
///
const manualtaskOpen = (record: SysUserPageVO) => {
const manualtaskOpen = (record: DistributeTaskManagementRecord) => {
doRequest(performTask(toRaw({ id: record.distributeTaskId })), {
onSuccess: (res: any) => {
if (res.code === 200) {
@ -278,7 +278,7 @@ const manualtaskOpen = (record: SysUserPageVO) => {
})
}
//
const confirm = (record: SysUserPageVO) => {
const confirm = (record: DistributeTaskManagementRecord) => {
if (record.executeStatus === 1 || record.executeStatus === 2) {
doRequest(
updateDistributeConfigurationmenuDto(
@ -299,7 +299,7 @@ const confirm = (record: SysUserPageVO) => {
}
}
//
const deleteConfirm = (record: SysUserPageVO) => {
const deleteConfirm = (record: DistributeTaskManagementRecord) => {
doRequest(deleteUser(record.distributeTaskId), {
successMessage: '删除成功!',
onSuccess: () => reloadTable()

@ -43,7 +43,7 @@
:value="1"
:disabled="isForbidden"
title="请选选择公司,再进行权重的分发"
@click="weightClick(1)"
@click="weightClick"
>权重</a-radio
>
<a-radio :value="2" :disabled="true">城市</a-radio>
@ -120,7 +120,7 @@
:value="1"
:disabled="isForbidden"
title="请选选择公司,再进行权重的分发"
@click="weightClick(1)"
@click="weightClick"
>权重</a-radio
>
<a-radio :value="2" :disabled="true">城市</a-radio>
@ -134,7 +134,6 @@
placeholder="请选择文件"
:max-tag-count="maxTagCount"
:options="fileSelectionOptions"
@change="handleChange"
></a-select>
</a-form-item>
</a-form>
@ -171,7 +170,7 @@
:value="1"
:disabled="isForbidden"
title="请选选择公司,再进行权重的分发"
@click="weightClick(1)"
@click="weightClick"
>权重</a-radio
>
<a-radio :value="2" :disabled="true">城市</a-radio>
@ -243,31 +242,27 @@
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import { doRequest } from '@/utils/axios/request'
import { message } from 'ant-design-vue'
import { useModal } from '@/hooks/modal'
import { useAdminForm, useFormAction, FormAction } from '@/hooks/form'
import type { FormRequestMapping } from '@/hooks/form'
import type {
DistributeTaskDTO,
DistributeTaskManagementRecord
} from '@/api/controlcenterstation/distributionTaskManagement/types'
import {
createMenu,
updateMenu,
selectedCompanyList,
fileSelectionList,
selectedCompanyEcho
} from '@/api/controlcenterstation/distributionTaskManagement'
// import type { ColProps } from 'ant-design-vue'
import type {
DistributeTaskDTO,
SysUserPageVO,
SysMenu
} from '@/api/controlcenterstation/distributionTaskManagement/types'
import { overrideProperties } from '@/utils/bean-utils'
import { reactive, ref } from 'vue'
//
// import { Dayjs } from 'dayjs'
// import { overrideProperties } from '@/utils/bean-utils'
//
import type { DefaultOptionType, SelectValue } from 'ant-design-vue/es/select'
import type { SelectProps } from 'ant-design-vue'
//change
import type { DictValue } from '@/api/system/dict/types'
// import type { DictValue } from '@/api/system/dict/types'
import type { RadioChangeEvent } from 'ant-design-vue/es/radio/interface'
//
import type { ColProps } from 'ant-design-vue'
@ -278,62 +273,50 @@ import {
addDistributeConfiguration,
updateDistributeConfigurationmenuDto
} from '@/api/controlcenterstation/customerManagement'
import { message } from 'ant-design-vue'
//
// import dayjs from 'dayjs'
import 'dayjs/locale/zh-cn'
import locale from 'ant-design-vue/es/date-picker/locale/zh_CN'
import dayjs, { Dayjs } from 'dayjs'
// import dayjs, { Dayjs } from 'dayjs'
//
import { useUserStore } from '@/stores/user-store'
import { doRequest } from '@/utils/axios/request'
const { userInfo } = useUserStore()
const userInfoCurrent = ref<string | undefined>('')
onMounted(() => {
console.log(userInfo, 'userInfo?.permissions')
// userInfoCurrent = userInfo?.roleCodes
userInfoCurrent.value = userInfo?.roleCodes?.toLocaleString()
})
const labelCol: ColProps = { sm: { span: 24 }, md: { span: 12 } }
const wrapperCol: ColProps = { sm: { span: 24 }, md: { span: 10 } }
//
interface selectedItem {
userId: number
taskName: string
}
// const selectedip: selectedItem[] = reactive([])
//
const activeKey = ref('1')
const tabsChange = () => {
resetFields()
if (activeKey.value === '1') {
formModel.distributeTaskType = 1
formRule.value = {
taskName: [{ required: true, message: '请输入任务名称' }],
fileRulePrefix: [{ required: true, message: '请输入文件前缀' }],
sCID: [{ type: 'array', required: true, message: '请选择人员', trigger: ['blur', 'change'] }],
startTime: [{ required: true, message: '请选择时间' }]
}
dynamicCheck()
// formRule.value = {
// taskName: [{ required: true, message: '' }],
// fileRulePrefix: [{ required: true, message: '' }],
// sCID: [{ type: 'array', required: true, message: '', trigger: ['blur', 'change'] }],
// startTime: [{ required: true, message: '' }]
// }
} else if (activeKey.value === '2') {
formModel.distributeTaskType = 0
formRule.value = {
taskName: [{ required: true, message: '请输入任务名称' }],
sCID: [{ type: 'array', required: true, message: '请选择人员', trigger: ['blur', 'change'] }],
fileRecordIdList: [
{ type: 'array', required: true, message: '请选择文件', trigger: ['blur', 'change'] }
]
}
dynamicCheck()
// formRule.value = {
// taskName: [{ required: true, message: '' }],
// sCID: [{ type: 'array', required: true, message: '', trigger: ['blur', 'change'] }],
// fileRecordIdList: [
// { type: 'array', required: true, message: '', trigger: ['blur', 'change'] }
// ]
// }
}
if (title.value === '分发配置') {
formModel.taskName = ''
formModel.ruleStatus = 0
formModel.timeStatus = 1
formModel.startTime = ''
// formModel.fileRulePrefix = 'prezzz-'
formModel.fileRecordIdList = []
formModel.users = []
formModel.sCID.forEach((item: any) => {
@ -343,20 +326,40 @@ const tabsChange = () => {
})
}
}
//
const show = ref(true)
//
const deploymentClick = () => {
show.value = !show.value
//
const selectedCompanyOptions = ref<SelectProps['options']>([])
//change
const selectedCompanyChange = (value: any, label: any) => {
formModel.sCID = value
//
const b = label.map((item: any) => {
return {
userId: item.value,
value: item.label,
content: '',
rule: [{ required: true, trigger: 'change', message: '不能为空' }]
}
})
if (b?.length > 0) {
formState.selectedCompanys.length = 0
formState.selectedCompanys.push(...b)
}
if (formModel.sCID.length > 0) {
isForbidden.value = false
} else {
isForbidden.value = true
}
}
//change
//
interface optionItem {
userId?: number | undefined
value?: string | undefined
content: number | ''
rule: object
}
//change
const onChange = (e: RadioChangeEvent) => {
formModel.users.length = 0
if (e.target.value === 0) {
@ -366,28 +369,7 @@ const onChange = (e: RadioChangeEvent) => {
userId: item.userId
})
})
} else if (e.target.value == 1) {
// formState.selectedCompanys.length = 0
// formModel.sCID.forEach(item =>
// newArr.push(
// selectedCompanyOptions.value?.filter((i: DefaultOptionType) => {
// return i.value === item
// })[0]
// )
// )
// if (newArr.length > 0) {
// newArr.forEach((i: any) => {
// formState.selectedCompanys.push({
// userId: i.value,
// value: i.label,
// content: '',
// rule: [{ required: true, trigger: 'change', message: '' }]
// })
// })
// }
// oneclickDistributionVisible.value = true
}
// emits('update:value', e.target.value as DictValue | DictValue[], selectedip)
}
//
const isForbidden = ref(true)
@ -399,7 +381,7 @@ interface iItem {
value?: number | undefined
}
let newArr: Array<any> = []
const weightClick = (val: number) => {
const weightClick = () => {
if (title.value === '分发配置') {
formState.selectedCompanys.length = 0
newArr = []
@ -433,15 +415,7 @@ const weightClick = (val: number) => {
}
oneclickDistributionVisible.value = true
}
//change
// const distributionTimeSelected = ref()
const distributionTimeChange = (e: RadioChangeEvent) => {
formModel.timeStatus = Number(e.target.value)
dynamicCheck()
// console.log(e.target.value, 'we')
// distributionTimeSelected.value = Number(e.target.value)
}
//
const oneclickDistributionVisible = ref<boolean>(false)
interface FormState {
@ -468,21 +442,6 @@ const oneclickDistributionSubmit = () => {
.validate()
.then(() => {
oneclickDistributionVisible.value = false
// formState.selectedCompanys.forEach((item: optionItem) => {
// formModel.users.push({
// userId: item.userId,
// weight: item.content
// })
// })
// if (formModel.ruleStatus === 1) {
console.log(formState.selectedCompanys, 'formState.selectedCompanys权重确定')
// formModel.users = []
// formState.selectedCompanys.forEach((item: any) => {
// formModel.users?.push({
// userId: item.userId,
// weight: item.content
// })
// })
})
.catch((error: ValidateErrorEntity<FormState>) => {
console.log('error', error)
@ -493,9 +452,15 @@ const oneclickDistributionSubmit = () => {
const oneclickDistributionClose = () => {
formRef.value.resetFields()
}
const resetForm = () => {
formState.selectedCompanys.length = 0
formRef.value.resetFields()
// const resetForm = () => {
// formState.selectedCompanys.length = 0
// formRef.value.resetFields()
// }
//change
const distributionTimeChange = (e: RadioChangeEvent) => {
formModel.timeStatus = Number(e.target.value)
dynamicCheck()
}
// const y = ref<string | number>()
// const m = ref<string | number>()
@ -521,7 +486,7 @@ const resetForm = () => {
// y.value + '-' + m.value + '-' + d.value + ' ' + h.value + ':' + minute.value + ':' + s.value
// )
// }
const finnalTime = ref<string>('')
//
// const onChangeTime = (value: string | Dayjs | null, dateString: string) => {
// console.log('Selected Time: ', value)
@ -532,61 +497,24 @@ const finnalTime = ref<string>('')
//
const maxTagCount = ref(2)
const fileSelectionOptions = ref<SelectProps['options']>([])
const handleChange = (value: SelectValue, option: DefaultOptionType | DefaultOptionType[]) => {
// console.log(`selected ${value}${option}`)
// if (option.length > 0) {
// isForbidden.value = false
// } else {
// formModel.icon = 1
// isForbidden.value = true
// }
}
// const selectedip: string[] = reactive([])
// const handleChange = (value: SelectValue, option: DefaultOptionType | DefaultOptionType[]) => {
// // console.log(`selected ${value}${option}`)
// // if (option.length > 0) {
// // isForbidden.value = false
// // } else {
// // formModel.icon = 1
// // isForbidden.value = true
// // }
// }
const emits = defineEmits<{
(e: 'submit-success', resetPageIndex?: boolean): void
// (e: 'update:value', selectedValue: DictValue | DictValue[], selectedArr: string[]): void
}>()
// const onChange = (e: RadioChangeEvent) => {
// emits('update:value', e.target.value as DictValue | DictValue[], sCID)
// }
const { title, visible, openModal, closeModal } = useModal()
const { formAction } = useFormAction()
//id
// const sCID = ref([])
//
const selectedCompanyOptions = ref<SelectProps['options']>([])
//change
const selectedCompanyChange = (value: any, label: any) => {
formModel.sCID = value
console.log(value, 'value')
console.log(label, 'label')
// await selectedCompanyEcho({ id: distributeTaskIdCurrent.value }).then((res: any) => {
//
const b = label.map((item: any) => {
return {
userId: item.value,
value: item.label,
content: '',
rule: [{ required: true, trigger: 'change', message: '不能为空' }]
}
})
if (b?.length > 0) {
formState.selectedCompanys.length = 0
formState.selectedCompanys.push(...b)
}
// })
console.log(formModel.sCID, 'formModel.sCID')
if (formModel.sCID.length > 0) {
isForbidden.value = false
} else {
isForbidden.value = true
}
}
//
const formModel = reactive<DistributeTaskDTO>({
distributeTaskId: undefined,
@ -629,64 +557,8 @@ const { submitLoading, validateAndSubmit, resetFields, validateInfos } = useAdmi
formModel,
formRule
)
interface fileRecordIdListItem {
label: string
value: number
}
// const month: any = ref()
// const day: any = ref()
// const hour: any = ref()
// const minute: any = ref()
// const second: any = ref()
// function getNowFormatDate() {
// const date = new Date(formModel.startTime) //
// month.value = date.getMonth() + 1 //
// day.value = date.getDate()
// hour.value = date.getHours()
// minute.value = date.getMinutes()
// second.value = date.getSeconds()
// month.value = month.value < 10 ? '0' + month.value : month.value //1-9,0
// day.value = day.value < 10 ? '0' + day.value : day.value //1-9,0
// hour.value = hour.value < 10 ? '0' + hour.value : hour.value //1-9,0
// minute.value = minute.value < 10 ? '0' + minute.value : minute.value //1-9,0
// second.value = second.value < 10 ? '0' + second.value : second.value //1-9,0
// const s1 = '-' //-
// const s2 = ':' //:
// //,
// const currDate =
// date.getFullYear() +
// s1 +
// month.value +
// s1 +
// day.value +
// ' ' +
// hour.value +
// s2 +
// minute.value +
// s2 +
// +second.value
// return currDate
// }
const y = ref<string | number>()
const m = ref<string | number>()
const d = ref<string | number>()
// const h = ref<string | number>()
// const minute = ref<string | number>()
// const s = ref<string | number>()
//
// function getNowFormatDate() {
// const date = new Date()
// y.value = date.getFullYear() //(4)
// ;(m.value = date.getMonth() + 1), //(0-11,01)
// (d.value = date.getDate()) // (1-31)
// if (m.value < 10) m.value = `0${m.value}` // 0
// if (d.value < 10) d.value = `0${d.value}` // 0
// return `${y.value}-${m.value}-${d.value}`
// }
/* 表单提交处理 */
//
const handleSubmit = () => {
formModel.users = []
formState.selectedCompanys.forEach((item: any) => {
@ -698,8 +570,6 @@ const handleSubmit = () => {
const isEmpty = formState.selectedCompanys.some((item: optionItem) => {
return item.content
})
console.log(formState.selectedCompanys, 'formState.selectedCompanys表单提交')
console.log(isEmpty, 'isEmpty')
if (!isEmpty && formModel.ruleStatus === 1) {
message.error('权重值不得为空')
} else {
@ -715,9 +585,6 @@ const handleSubmit = () => {
formModel.fileRecordIdList = formModel.fileRecordIdList?.map((item: any) => {
return item.value
})
// console.log(a, 'a')
// formModel.fileRecordIdList?.length = 0
// formModel.fileRecordIdList?.push(...a)
}
if (formModel.sCID.length > 0 && formModel.taskName && formModel.startTime) {
formModel.fileRulePrefix = formModel.fileRulePrefix + '-'
@ -736,38 +603,57 @@ const handleSubmit = () => {
const handleClose = () => {
closeModal()
activeKey.value = '1'
// if (title.value === '') {
// activeKey.value = '1'
// }
resetFields()
submitLoading.value = false
formModel.sCID.length = 0
// console.log(sCID.value, 'sCID.value')
isForbidden.value = true
console.log(activeKey.value, 'activeKey.value')
}
//
const dynamicCheck = () => {
formRule.value = {
taskName: [{ required: true, message: '请输入任务名称' }],
sCID: [{ type: 'array', required: true, message: '请选择人员', trigger: ['blur', 'change'] }]
}
if (title.value === '编辑手动分发') {
formRule.value.fileRecordIdList = [
{ type: 'array', required: true, message: '请选择文件', trigger: ['blur', 'change'] }
]
} else if (title.value === '编辑自动分发') {
if (formModel.timeStatus === 0) {
formRule.value.fileRulePrefix = [{ required: true, message: '请输入文件前缀' }]
} else if (formModel.timeStatus === 1) {
formRule.value.fileRulePrefix = [{ required: true, message: '请输入文件前缀' }]
formRule.value.startTime = [{ required: true, message: '请选择时间' }]
}
} else if (title.value === '编辑默认分发') {
if (formModel.timeStatus === 1) {
formRule.value.startTime = [{ required: true, message: '请选择时间' }]
}
}
if (activeKey.value === '1') {
if (formModel.timeStatus === 0) {
formRule.value.fileRulePrefix = [{ required: true, message: '请输入文件前缀' }]
} else if (formModel.timeStatus === 1) {
formRule.value.fileRulePrefix = [{ required: true, message: '请输入文件前缀' }]
formRule.value.startTime = [{ required: true, message: '请选择时间' }]
}
} else if (activeKey.value === '2') {
formRule.value.fileRecordIdList = [
{ type: 'array', required: true, message: '请选择文件', trigger: ['blur', 'change'] }
]
}
// if(formModel)
}
// distributionTimeSelected.value = ''
// defaultDistribute.value = ''
// if (title.value === '') {
// activeKey.value = '1'
// formRule.value = {
// taskName: [{ required: true, message: '' }],
// fileRulePrefix: [{ required: true, message: '' }],
// sCID: [{ type: 'array', required: true, message: '', trigger: ['blur', 'change'] }],
// startTime: [{ required: true, message: '' }]
// // fileRecordIdList: [
// // { type: 'array', required: true, message: '', trigger: ['blur', 'change'] }
// // ]
// }
// }
// if (formModel.timeStatus === 0) {
// distributionTimeSelected.value = 1
// }
interface selectedItem {
userId: number
taskName: string
}
interface openObj {
newFormAction: FormAction
selectedCompany?: selectedItem[]
record?: SysUserPageVO
record?: DistributeTaskManagementRecord
}
interface userListItem {
userName: string
@ -778,77 +664,22 @@ interface recordListItem {
fileName: string
recordId: number
}
// interface userListItem {
// weight: number
// userName: string
// userId: number
// }
// moment.fn.toISOString = function () {
// return this.format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')
// }
// const defaultDistribute = ref<string>('')
//
const dynamicCheck = () => {
if (title.value === '编辑手动分发') {
// if (formModel.timeStatus === 0) {
formRule.value = {
taskName: [{ required: true, message: '请输入任务名称' }],
sCID: [{ type: 'array', required: true, message: '请选择人员', trigger: ['blur', 'change'] }],
fileRecordIdList: [
{ type: 'array', required: true, message: '请选择文件', trigger: ['blur', 'change'] }
]
}
} else if (title.value === '编辑自动分发') {
if (formModel.timeStatus === 0) {
formRule.value = {
taskName: [{ required: true, message: '请输入任务名称' }],
fileRulePrefix: [{ required: true, message: '请输入文件前缀' }],
sCID: [
{ type: 'array', required: true, message: '请选择人员', trigger: ['blur', 'change'] }
]
}
} else if (formModel.timeStatus === 1) {
formRule.value = {
taskName: [{ required: true, message: '请输入任务名称' }],
fileRulePrefix: [{ required: true, message: '请输入文件前缀' }],
sCID: [
{ type: 'array', required: true, message: '请选择人员', trigger: ['blur', 'change'] }
],
startTime: [{ required: true, message: '请选择时间' }]
}
}
} else if (title.value === '编辑默认分发') {
if (formModel.timeStatus === 0) {
formRule.value = {
taskName: [{ required: true, message: '请输入任务名称' }],
sCID: [
{ type: 'array', required: true, message: '请选择人员', trigger: ['blur', 'change'] }
]
}
} else if (formModel.timeStatus === 1) {
formRule.value = {
taskName: [{ required: true, message: '请输入任务名称' }],
sCID: [
{ type: 'array', required: true, message: '请选择人员', trigger: ['blur', 'change'] }
],
startTime: [{ required: true, message: '请选择时间' }]
}
}
}
}
const distributeTaskIdCurrent = ref<number>()
//id
// const distributeTaskIdCurrent = ref<number>()
defineExpose({
async open(opendata: openObj) {
if (activeKey.value === '1') {
formRule.value = {
taskName: [{ required: true, message: '请输入任务名称' }],
fileRulePrefix: [{ required: true, message: '请输入文件前缀' }],
sCID: [
{ type: 'array', required: true, message: '请选择人员', trigger: ['blur', 'change'] }
],
startTime: [{ required: true, message: '请选择时间' }]
}
}
// if (activeKey.value === '1') {
// formRule.value = {
// taskName: [{ required: true, message: '' }],
// fileRulePrefix: [{ required: true, message: '' }],
// sCID: [
// { type: 'array', required: true, message: '', trigger: ['blur', 'change'] }
// ],
// startTime: [{ required: true, message: '' }]
// }
// }
dynamicCheck()
selectedCompanyOptions.value = []
await doRequest(selectedCompanyList(), {
onSuccess: (res: any) => {
@ -881,15 +712,10 @@ defineExpose({
resetFields()
if (opendata.newFormAction === FormAction.CREATE) {
title.value = '分发配置'
// defaultDistribute.value = ''
} else {
await doRequest(selectedCompanyEcho(toRaw({ id: opendata.record?.distributeTaskId })), {
onSuccess: (res: any) => {
formModel.timeStatus = res.data.timeStatus
console.log(formModel.timeStatus, res.data.timeStatus, 'formModel.timeStatus1111')
// if (res.data.timeStatus === 1) {
// distributionTimeSelected.value = 1
// }
//
formModel.sCID = []
formModel.sCID = res.data.userList?.map((item: userListItem) => {
@ -912,7 +738,6 @@ defineExpose({
}
//
const b = res.data.userList?.map((item: userListItem) => {
console.log(item, 'item')
return {
userId: item.userId,
value: item.userName,
@ -924,14 +749,12 @@ defineExpose({
formState.selectedCompanys.length = 0
formState.selectedCompanys.push(...b)
}
console.log(formState.selectedCompanys, 'formState.selectedCompanys打开')
//,
if (formModel.sCID.length > 0) {
isForbidden.value = false
}
if (opendata.record?.distributeTaskType === 0 && opendata.record?.defaultType === 1) {
title.value = '编辑手动分发'
// defaultDistribute.value = ''
activeKey.value = '2'
formModel.defaultType = 1
dynamicCheck()
@ -941,7 +764,6 @@ defineExpose({
) {
title.value = '编辑自动分发'
dynamicCheck()
// defaultDistribute.value = ''
activeKey.value = '1'
formModel.defaultType = 1
formModel.startTime = opendata.record.startTime?.split('T').toString()
@ -950,18 +772,15 @@ defineExpose({
opendata.record?.defaultType === 0
) {
title.value = '编辑默认分发'
// defaultDistribute.value = ''
formModel.defaultType = 0
activeKey.value = '3'
// formModel.ruleStatus = 1
formModel.startTime = opendata.record.startTime?.split('T').toString()
dynamicCheck()
console.log(formModel.timeStatus, 'formModeltimeStatus')
}
}
})
distributeTaskIdCurrent.value = opendata.record?.distributeTaskId
// distributeTaskIdCurrent.value = opendata.record?.distributeTaskId
// overrideProperties(formModel, opendata.record)
//
formModel.taskName = opendata.record?.taskName

@ -66,7 +66,7 @@
<script setup lang="ts">
import { Form } from 'ant-design-vue'
import type { AccessLogQO } from '@/api/controlcenterstation/distributionTaskManagement/types'
import type { DistributeTaskManagementSearch } from '@/api/controlcenterstation/distributionTaskManagement/types'
import dayjs from 'dayjs'
import type { Dayjs } from 'dayjs'
//
@ -97,7 +97,7 @@ const emits = defineEmits<{
}>()
const searchTimeValue = ref<[Dayjs, Dayjs]>()
const formModel = reactive<AccessLogQO>({
const formModel = reactive<DistributeTaskManagementSearch>({
taskName: '',
ip: undefined,
executeStatus: undefined,

@ -4,7 +4,7 @@
<div class="customerList-title">我的线索</div>
</a-card>
<!-- 工具栏 -->
<access-log-page-search :loading="tableRef?.loading" @search="searchTable" />
<customer-list-search :loading="tableRef?.loading" @search="searchTable" />
<!-- 批量操作更多操作 -->
<!-- 底部表格 -->
<pro-table
@ -43,6 +43,15 @@
</a-tooltip>
<span v-else>--</span>
</template>
<template v-else-if="column.key === 'remark'">
<a-tooltip v-if="record.remark">
<template #title
><span>{{ record.remark }}</span></template
>
<span>{{ record.remark }}</span>
</a-tooltip>
<span v-else>--</span>
</template>
</template>
</pro-table>
<!-- 详情弹窗 -->
@ -60,15 +69,19 @@ import { ref } from 'vue'
import ProTable from '#/table'
import type { ProTableInstanceExpose, TableRequest, ProColumns } from '#/table'
import { mergePageParam } from '@/utils/page-utils'
import type { SysUserQO, SysUserPageVO } from '@/api/customermanagement/customerList/types'
import { pageAccessLogs, deleteUser } from '@/api/customermanagement/customerList'
import { message } from 'ant-design-vue'
import { FormAction } from '@/hooks/form'
import AccessLogPageSearch from '@/views/customermanagement/customerList/customerListSearch.vue'
import type {
CustomerListQO,
CustomerListRecord
} from '@/api/customermanagement/customerList/types'
//deleteUser
import { pageAccessLogs } from '@/api/customermanagement/customerList'
import CustomerListSearch from '@/views/customermanagement/customerList/customerListSearch.vue'
import CustomerListViewModal from '@/views/customermanagement/customerList/customerListModal.vue'
import CustomerListEditModal from '@/views/customermanagement/customerList/customerListEditModal.vue'
//
import { doRequest } from '@/utils/axios/request'
// import { doRequest } from '@/utils/axios/request'
defineOptions({ name: 'CustomerList' })
@ -84,7 +97,7 @@ const customerListViewModalRef = ref<InstanceType<typeof CustomerListViewModal>>
//ref
const customerListEditModalRef = ref<InstanceType<typeof CustomerListEditModal>>()
//
let searchParams: SysUserQO = {}
let searchParams: CustomerListQO = {}
//
const tableRequest: TableRequest = (params, sorter, filter) => {
@ -98,27 +111,27 @@ const reloadTable = (resetPageIndex?: boolean) => {
}
//
const searchTable = (params: SysUserQO) => {
const searchTable = (params: CustomerListQO) => {
searchParams = params
reloadTable(true) // tableRequest
}
//
const handleView = (record: SysUserPageVO, tabIndex: string) => {
if (record.otherClue !== '{}') {
customerListViewModalRef.value?.open(FormAction.UPDATE, record, tabIndex)
} else {
const handleView = (record: CustomerListRecord, tabIndex: string) => {
if (record.otherClue === '{}' || record.otherClue === '') {
message.info('暂无详情')
} else {
customerListViewModalRef.value?.open(FormAction.UPDATE, record, tabIndex)
}
}
//
const handleEdit = (record: SysUserPageVO, tabIndex: string) => {
const handleEdit = (record: CustomerListRecord, tabIndex: string) => {
console.log('222')
customerListEditModalRef.value?.open(FormAction.UPDATE, record, tabIndex)
}
//
// const handleDelete = (record: SysUserPageVO) => {
// const handleDelete = (record: CustomerListRecord) => {
// doRequest(deleteUser(record.userId), {
// successMessage: '',
// onSuccess: () => reloadTable()
@ -178,6 +191,13 @@ const columns: ProColumns[] = [
}
}
},
{
title: '备注',
dataIndex: 'remark',
width: 180,
ellipsis: true,
align: 'center'
},
{
title: '线索日期',
dataIndex: 'clueTime',

@ -64,11 +64,14 @@ import { reactive, ref } from 'vue'
import { useModal } from '@/hooks/modal'
import { useAdminForm, useFormAction, FormAction } from '@/hooks/form'
import type { FormRequestMapping } from '@/hooks/form'
import { createMenu, updateResource } from '@/api/customermanagement/customerList'
import type { ColProps } from 'ant-design-vue'
import type { SysUserPageVO, SysMenu } from '@/api/customermanagement/customerList/types'
import { pageAccessLogs, getResourcesDetail } from '@/api/salesmanagement/labelRule'
import { doRequest } from '@/utils/axios/request'
import type { CustomerListRecord, SysEdit } from '@/api/customermanagement/customerList/types'
// createMenu
import { updateResource } from '@/api/customermanagement/customerList'
//pageAccessLogs
import { getResourcesDetail } from '@/api/salesmanagement/labelRule'
import { containsProp } from '@vueuse/shared'
//id
const resourcesId = ref<number>()
@ -96,6 +99,7 @@ const stepItemClick = (record: clueStageItem) => {
formModel.clueId = resourcesId.value
formModel.clueStageName = record.name
formModel.clueStageId = record.clueStageId
console.log(formModel, 'formModel')
}
//
@ -158,6 +162,7 @@ const checkboxChange = (e: any) => {
)
})
formModel.clueLabelList = newList
console.log(formModel.clueLabelList, 'formModel.clueLabel标签组change')
}
//
@ -173,7 +178,7 @@ const { title, visible, openModal, closeModal } = useModal()
const { formAction } = useFormAction()
//
const formModel = reactive<SysMenu>({
const formModel = reactive<SysEdit>({
clueId: undefined,
clueStageName: '',
clueStageId: undefined,
@ -181,8 +186,8 @@ const formModel = reactive<SysMenu>({
})
//
const formRequestMapping: FormRequestMapping<SysMenu> = {
[FormAction.CREATE]: createMenu,
const formRequestMapping: FormRequestMapping<SysEdit> = {
// [FormAction.CREATE]: createMenu,
[FormAction.UPDATE]: updateResource
}
@ -204,6 +209,8 @@ const handleSubmit = () => {
//
const handleClose = () => {
formModel.clueLabelList.length = 0
console.log(formModel.clueLabelList, 'formModel.clueLabelList关闭')
closeModal()
submitLoading.value = false
current.value = -1
@ -249,16 +256,17 @@ let b: Array<bItem> = reactive([])
const clueStageCurrentId = ref<number>()
defineExpose({
async open(newFormAction: FormAction, record: SysUserPageVO, tabIndex: string) {
async open(newFormAction: FormAction, record: CustomerListRecord, tabIndex: string) {
// activeKey.value = tabIndex
openModal()
resetFields()
// if (newFormAction === FormAction.CREATE) {
// title.value = ''
// } else {
title.value = '编辑商机'
title.value = '编辑'
resourcesId.value = record.clueId
formModel.clueId = record.clueId
// formModel.clueLabelList
label.length = 0
clueStage.length = 0
await doRequest(getResourcesDetail(toRaw(resourcesId.value)), {
@ -282,18 +290,46 @@ defineExpose({
plainOptions: b
})
})
clueStageCurrentId.value = res.data.clueStageId
if (res.data.clueLabel && res.data.clueLabelName) {
const newArr = res.data.clueLabel.split(',').map((id: number, i: string) => ({
id,
labelName: JSON.parse(res.data.clueLabelName)[i]
}))
newArr.forEach((i: any) => {
formModel.clueLabelList.push({ labelName: i.labelName, id: i.id })
})
}
// if (res.data.clueLabel && res.data.clueLabelName) {
// res.data.clueLabel.split(',').forEach((item: number) => {
// console.log(item, 'item')
// // if (res.data.clueLabelName) {
// JSON.parse(res.data.clueLabelName).forEach((i: string) => {
// console.log(i, 'i')
// formModel.clueLabelList.push({ labelName: i, id: item })
// })
// // }
// })
// }
console.log(res.data.clueLabelName, 'res.data.clueLabelName')
console.log(formModel.clueLabelList, 'formModel.clueLabelList')
// formModel.clueLabelList.length = 0
// formModel.clueLabelList.push(...b)
clueStageCurrentId.value = res.data.clueStageId
currentSort = {
name: '',
sort: 0,
clueStageId: 0
}
if (record.clueStageId) {
currentSort = clueStage.find((item: clueStageItem) => {
return item.clueStageId === clueStageCurrentId.value
})
}
console.log(record.clueStageId, 'record.clueStageId')
console.log(currentSort.sort, 'currentSort.sort')
// console.log(record.clueStageId, 'record.clueStageId')
// console.log(currentSort.sort, 'currentSort.sort')
if (currentSort) {
current.value = currentSort.sort - 1
console.log(current.value, 'current.value')
}
}
})

@ -25,8 +25,8 @@ import { reactive, ref } from 'vue'
import { useModal } from '@/hooks/modal'
import { useFormAction, FormAction } from '@/hooks/form'
import type { ColProps } from 'ant-design-vue'
import type { SysUserPageVO, detailForm } from '@/api/customermanagement/customerList/types'
import { pageAccessLogs } from '@/api/salesmanagement/labelRule'
import type { CustomerListRecord, detailForm } from '@/api/customermanagement/customerList/types'
// import { pageAccessLogs } from '@/api/salesmanagement/labelRule'
// const activeKey = ref('1')
@ -68,18 +68,21 @@ interface clueStageItem {
//id
const resourcesId = ref<number>()
defineExpose({
open(newFormAction: FormAction, record: SysUserPageVO, tabIndex: string) {
open(newFormAction: FormAction, record: CustomerListRecord, tabIndex: string) {
// activeKey.value = tabIndex
openModal()
// resetFields()
title.value = '编辑商机'
title.value = '详情'
resourcesId.value = record.clueId
// labelGroupReloadTable()
JSON.parse(record.otherClue)
formModel.extraData = []
for (const key in JSON.parse(record.otherClue)) {
formModel.extraData.push({ key: key, value: JSON.parse(record.otherClue)[key] })
if (record.otherClue) {
JSON.parse(record.otherClue)
formModel.extraData = []
for (const key in JSON.parse(record.otherClue)) {
formModel.extraData.push({ key: key, value: JSON.parse(record.otherClue)[key] })
}
}
formAction.value = newFormAction
}
})

@ -61,9 +61,9 @@
<script setup lang="ts">
import { Form } from 'ant-design-vue'
import type { AccessLogQO } from '@/api/customermanagement/customerList/types'
import dayjs from 'dayjs'
import type { Dayjs } from 'dayjs'
import type { CustomerListSearch } from '@/api/customermanagement/customerList/types'
const useForm = Form.useForm
@ -82,7 +82,7 @@ const emits = defineEmits<{
}>()
const searchTimeValue = ref<[Dayjs, Dayjs]>()
const formModel = reactive<AccessLogQO>({
const formModel = reactive<CustomerListSearch>({
clueLabelName: '',
//线
userId: undefined,

@ -0,0 +1,174 @@
<template>
<!-- 头部 -->
<a-card :bordered="false" :body-style="{ paddingBottom: 0 }">
<div class="formReview-title">表单重审</div>
</a-card>
<!-- 工具栏 -->
<form-review-search :loading="tableRef?.loading" @search="searchTable" />
<!-- 批量操作更多操作 -->
<!-- <a-card :bordered="false" :body-style="{ paddingBottom: 0 }">
<div class="operationButtonArea">
<a-button class="operationButton" @click="newAppointment"></a-button>
</div>
</a-card> -->
<!-- 底部表格 -->
<pro-table
ref="tableRef"
row-key="customId"
:request="tableRequest"
:columns="columns"
:scroll="{ x: 1100 }"
:tool-bar-render="false"
class="protable"
:pagination="{ showQuickJumper: true }"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'operate'">
<operation-group>
<!-- <a @click="handleView(record)"></a> -->
<a @click="handleEdit(record)"></a>
</operation-group>
</template>
</template>
</pro-table>
<!-- 新建预约新建/编辑弹窗 -->
<geopolitical-customers-modal ref="geopoliticalCustomersModalRef" @submit-success="reloadTable" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
// import { message } from 'ant-design-vue'
// import { doRequest } from '@/utils/axios/request'
//
import ProTable from '#/table'
import type { ProTableInstanceExpose, TableRequest, ProColumns } from '#/table'
import { mergePageParam } from '@/utils/page-utils'
import { FormAction } from '@/hooks/form'
import GeopoliticalCustomersModal from '@/views/geopoliticalCustomers/geopoliticalCustomersModal.vue'
import FormReviewSearch from '@/views/formReview/formReviewSearch.vue'
import { pageAccessLogs } from '@/api/geopoliticalCustomers'
import type {
GeopoliticalCustomersRecord,
GeopoliticalCustomersPageParam
} from '@/api/geopoliticalCustomers/types'
defineOptions({ name: 'GeopoliticalCustomers' })
//
//
const tableRef = ref<ProTableInstanceExpose>()
//ref
const geopoliticalCustomersModalRef = ref<InstanceType<typeof GeopoliticalCustomersModal>>()
//
let searchParams: GeopoliticalCustomersPageParam = {}
//
const tableRequest: TableRequest = (params, sorter, filter) => {
const pageParam = mergePageParam(params, sorter, filter)
return pageAccessLogs({ ...pageParam, ...searchParams })
}
//
const reloadTable = (resetPageIndex?: boolean) => {
tableRef.value?.actionRef?.reload(resetPageIndex)
}
//
const searchTable = (params: GeopoliticalCustomersPageParam) => {
searchParams = params
reloadTable(true) // tableRequest
}
//
const newAppointment = () => {
geopoliticalCustomersModalRef.value?.open({
newFormAction: FormAction.CREATE
})
}
//
const handleView = (record: GeopoliticalCustomersRecord) => {
geopoliticalCustomersModalRef.value?.open({
newFormAction: FormAction.UPDATE,
type: 'view',
record: record
})
}
//
const handleEdit = (record: GeopoliticalCustomersRecord) => {
geopoliticalCustomersModalRef.value?.open({
newFormAction: FormAction.UPDATE,
type: 'audit',
record: record
})
}
const columns: ProColumns[] = [
{
title: '编号',
width: 80,
customRender: function ({ index }) {
return `${index + 1}`
}
},
{
title: '客户名称',
dataIndex: 'customName'
},
{
title: '联系方式',
dataIndex: 'customNid'
},
{
title: '审核状态',
dataIndex: 'enrollStatus',
customRender: function ({ record }: any) {
if (record.enrollStatus === 0) {
return h('div', '待提交')
} else if (record.enrollStatus === 1) {
return h('div', '已报名')
}
}
},
{
title: '录入日期',
dataIndex: 'createTime',
width: 230,
align: 'center',
customRender: function ({ record }: any) {
if (record.createTime) {
return record.createTime
} else if (record.createTime === null) {
return '--'
}
}
},
{
key: 'operate',
title: '操作',
align: 'center',
width: 100,
fixed: 'right'
}
]
</script>
<style lang="less" scoped>
.formReview-title {
font-size: 17px;
font-weight: 600;
color: #000;
}
//
.operationButtonArea {
padding-bottom: 20px;
}
.operationButton {
background-color: #f4f4f5;
border-radius: 5px;
color: #909399;
margin-right: 10px;
}
.editable-row-operations a {
margin-right: 8px;
}
</style>

@ -0,0 +1,122 @@
<template>
<a-card :bordered="false" style="margin-bottom: 16px" :body-style="{ paddingBottom: 0 }">
<a-form :model="formModel" :label-col="labelCol">
<a-row :gutter="16">
<!-- v-if="userInfoCurrent === 'ROLE_ADMIN'" -->
<a-col :xl="8" :md="12" :sm="24">
<a-form-item label="编号">
<a-input v-model:value="formModel.customName" placeholder="请输入" />
</a-form-item>
</a-col>
<!-- <a-col v-if="userInfoCurrent === 'ROLE_SALES_EXECUTIVE'" :xl="8" :md="12" :sm="24">
<a-form-item label="坐席名称">
<a-input v-model:value="formModel.customName" placeholder="请输入" />
</a-form-item>
</a-col> -->
<!-- <a-col :xl="8" :md="12" :sm="24">
<a-form-item label="坐席名称">
<dict-select
v-model:value="formModel.ip"
dict-code="user_status"
allow-clear
placeholder="请选择"
/>
</a-form-item>
</a-col> -->
<!-- <a-col :xl="8" :md="12" :sm="24">
<a-form-item label="报名状态">
<dict-select
v-model:value="formModel.enrollStatus"
dict-code="registration_status"
allow-clear
placeholder="请选择"
/>
</a-form-item>
</a-col>
<a-col :xl="8" :md="12" :sm="24">
<a-form-item label="联系方式">
<a-input v-model:value="formModel.customNid" placeholder="请输入" />
</a-form-item>
</a-col> -->
<a-col :xl="8" :md="12" :sm="24">
<a-form-item label="填写时间">
<a-range-picker
v-model:value="searchTimeValue"
show-time
format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
:ranges="{
Today: [dayjs().startOf('date'), dayjs()]
}"
/>
</a-form-item>
</a-col>
<a-col :xl="24" :md="24" :sm="24">
<search-actions :loading="props.loading" @search="search" @reset="reset" />
</a-col>
</a-row>
</a-form>
</a-card>
</template>
<script setup lang="ts">
import { Form } from 'ant-design-vue'
import type { GeopoliticalCustomersSearch } from '@/api/geopoliticalCustomers/types'
import dayjs from 'dayjs'
import type { Dayjs } from 'dayjs'
//
import { useUserStore } from '@/stores/user-store'
const { userInfo } = useUserStore()
const userInfoCurrent = ref<string | undefined>('')
onMounted(() => {
console.log(userInfo, 'userInfo?.permissions')
// userInfoCurrent = userInfo?.roleCodes
userInfoCurrent.value = userInfo?.roleCodes?.toLocaleString()
})
const useForm = Form.useForm
// label
const labelCol = { md: { span: 6 } }
const props = withDefaults(
defineProps<{
loading?: boolean
}>(),
{ loading: false }
)
const emits = defineEmits<{
(e: 'search', params: Record<string, any>): void
}>()
const searchTimeValue = ref<[Dayjs, Dayjs]>()
const formModel = reactive<GeopoliticalCustomersSearch>({
customName: '',
customNid: '',
enrollStatus: undefined
})
const { resetFields } = useForm(formModel)
const search = () => {
const param = toRaw(formModel)
if (searchTimeValue.value && searchTimeValue.value.length == 2) {
param.startTime = searchTimeValue.value[0].format('YYYY-MM-DD HH:mm:ss')
param.endTime = searchTimeValue.value[1].format('YYYY-MM-DD HH:mm:ss')
} else {
param.startTime = ''
param.endTime = ''
}
emits('search', param)
}
const reset = () => {
//
resetFields()
//
searchTimeValue.value = undefined
search()
}
</script>

@ -0,0 +1,175 @@
<template>
<!-- 头部 -->
<a-card :bordered="false" :body-style="{ paddingBottom: 0 }">
<div class="geopoliticalCustomers-title">地缘获客</div>
</a-card>
<!-- 工具栏 -->
<geopolitical-customers-search :loading="tableRef?.loading" @search="searchTable" />
<!-- 批量操作更多操作 -->
<a-card :bordered="false" :body-style="{ paddingBottom: 0 }">
<div class="operationButtonArea">
<a-button class="operationButton" @click="newAppointment"></a-button>
<!-- 更多操作 -->
</div>
</a-card>
<!-- 底部表格 -->
<pro-table
ref="tableRef"
row-key="customId"
:request="tableRequest"
:columns="columns"
:scroll="{ x: 1100 }"
:tool-bar-render="false"
class="protable"
:pagination="{ showQuickJumper: true }"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'operate'">
<operation-group>
<a @click="handleView(record)"></a>
<a @click="handleEdit(record)"></a>
</operation-group>
</template>
</template>
</pro-table>
<!-- 新建预约新建/编辑弹窗 -->
<geopolitical-customers-modal ref="geopoliticalCustomersModalRef" @submit-success="reloadTable" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
// import { message } from 'ant-design-vue'
// import { doRequest } from '@/utils/axios/request'
//
import ProTable from '#/table'
import type { ProTableInstanceExpose, TableRequest, ProColumns } from '#/table'
import { mergePageParam } from '@/utils/page-utils'
import { FormAction } from '@/hooks/form'
import GeopoliticalCustomersModal from '@/views/geopoliticalCustomers/geopoliticalCustomersModal.vue'
import GeopoliticalCustomersSearch from '@/views/geopoliticalCustomers/geopoliticalCustomersSearch.vue'
import { pageAccessLogs } from '@/api/geopoliticalCustomers'
import type {
GeopoliticalCustomersRecord,
GeopoliticalCustomersPageParam
} from '@/api/geopoliticalCustomers/types'
defineOptions({ name: 'GeopoliticalCustomers' })
//
//
const tableRef = ref<ProTableInstanceExpose>()
//ref
const geopoliticalCustomersModalRef = ref<InstanceType<typeof GeopoliticalCustomersModal>>()
//
let searchParams: GeopoliticalCustomersPageParam = {}
//
const tableRequest: TableRequest = (params, sorter, filter) => {
const pageParam = mergePageParam(params, sorter, filter)
return pageAccessLogs({ ...pageParam, ...searchParams })
}
//
const reloadTable = (resetPageIndex?: boolean) => {
tableRef.value?.actionRef?.reload(resetPageIndex)
}
//
const searchTable = (params: GeopoliticalCustomersPageParam) => {
searchParams = params
reloadTable(true) // tableRequest
}
//
const newAppointment = () => {
geopoliticalCustomersModalRef.value?.open({
newFormAction: FormAction.CREATE
})
}
//
const handleView = (record: GeopoliticalCustomersRecord) => {
geopoliticalCustomersModalRef.value?.open({
newFormAction: FormAction.UPDATE,
type: 'view',
record: record
})
}
//
const handleEdit = (record: GeopoliticalCustomersRecord) => {
geopoliticalCustomersModalRef.value?.open({
newFormAction: FormAction.UPDATE,
type: 'edit',
record: record
})
}
const columns: ProColumns[] = [
{
title: '编号',
width: 80,
customRender: function ({ index }) {
return `${index + 1}`
}
},
{
title: '客户名称',
dataIndex: 'customName'
},
{
title: '联系方式',
dataIndex: 'customNid'
},
{
title: '报名状态',
dataIndex: 'enrollStatus',
customRender: function ({ record }: any) {
if (record.enrollStatus === 0) {
return h('div', '待提交')
} else if (record.enrollStatus === 1) {
return h('div', '已报名')
}
}
},
{
title: '录入日期',
dataIndex: 'createTime',
width: 230,
align: 'center',
customRender: function ({ record }: any) {
if (record.createTime) {
return record.createTime
} else if (record.createTime === null) {
return '--'
}
}
},
{
key: 'operate',
title: '操作',
align: 'center',
width: 160,
fixed: 'right'
}
]
</script>
<style lang="less" scoped>
.geopoliticalCustomers-title {
font-size: 17px;
font-weight: 600;
color: #000;
}
//
.operationButtonArea {
padding-bottom: 20px;
}
.operationButton {
background-color: #f4f4f5;
border-radius: 5px;
color: #909399;
margin-right: 10px;
}
.editable-row-operations a {
margin-right: 8px;
}
</style>

@ -0,0 +1,122 @@
<template>
<a-card :bordered="false" style="margin-bottom: 16px" :body-style="{ paddingBottom: 0 }">
<a-form :model="formModel" :label-col="labelCol">
<a-row :gutter="16">
<!-- v-if="userInfoCurrent === 'ROLE_ADMIN'" -->
<a-col :xl="8" :md="12" :sm="24">
<a-form-item label="客户名称">
<a-input v-model:value="formModel.customName" placeholder="请输入" />
</a-form-item>
</a-col>
<!-- <a-col v-if="userInfoCurrent === 'ROLE_SALES_EXECUTIVE'" :xl="8" :md="12" :sm="24">
<a-form-item label="坐席名称">
<a-input v-model:value="formModel.customName" placeholder="请输入" />
</a-form-item>
</a-col> -->
<!-- <a-col :xl="8" :md="12" :sm="24">
<a-form-item label="坐席名称">
<dict-select
v-model:value="formModel.ip"
dict-code="user_status"
allow-clear
placeholder="请选择"
/>
</a-form-item>
</a-col> -->
<a-col :xl="8" :md="12" :sm="24">
<a-form-item label="报名状态">
<dict-select
v-model:value="formModel.enrollStatus"
dict-code="registration_status"
allow-clear
placeholder="请选择"
/>
</a-form-item>
</a-col>
<a-col :xl="8" :md="12" :sm="24">
<a-form-item label="联系方式">
<a-input v-model:value="formModel.customNid" placeholder="请输入" />
</a-form-item>
</a-col>
<a-col :xl="8" :md="12" :sm="24">
<a-form-item label="填写时间">
<a-range-picker
v-model:value="searchTimeValue"
show-time
format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
:ranges="{
Today: [dayjs().startOf('date'), dayjs()]
}"
/>
</a-form-item>
</a-col>
<a-col :xl="24" :md="24" :sm="24">
<search-actions :loading="props.loading" @search="search" @reset="reset" />
</a-col>
</a-row>
</a-form>
</a-card>
</template>
<script setup lang="ts">
import { Form } from 'ant-design-vue'
import type { GeopoliticalCustomersSearch } from '@/api/geopoliticalCustomers/types'
import dayjs from 'dayjs'
import type { Dayjs } from 'dayjs'
//
import { useUserStore } from '@/stores/user-store'
const { userInfo } = useUserStore()
const userInfoCurrent = ref<string | undefined>('')
onMounted(() => {
console.log(userInfo, 'userInfo?.permissions')
// userInfoCurrent = userInfo?.roleCodes
userInfoCurrent.value = userInfo?.roleCodes?.toLocaleString()
})
const useForm = Form.useForm
// label
const labelCol = { md: { span: 6 } }
const props = withDefaults(
defineProps<{
loading?: boolean
}>(),
{ loading: false }
)
const emits = defineEmits<{
(e: 'search', params: Record<string, any>): void
}>()
const searchTimeValue = ref<[Dayjs, Dayjs]>()
const formModel = reactive<GeopoliticalCustomersSearch>({
customName: '',
customNid: '',
enrollStatus: undefined
})
const { resetFields } = useForm(formModel)
const search = () => {
const param = toRaw(formModel)
if (searchTimeValue.value && searchTimeValue.value.length == 2) {
param.startTime = searchTimeValue.value[0].format('YYYY-MM-DD HH:mm:ss')
param.endTime = searchTimeValue.value[1].format('YYYY-MM-DD HH:mm:ss')
} else {
param.startTime = ''
param.endTime = ''
}
emits('search', param)
}
const reset = () => {
//
resetFields()
//
searchTimeValue.value = undefined
search()
}
</script>

@ -4,7 +4,7 @@
<a-input
v-model:value="modelRef.username"
size="large"
placeholder="账号: admin"
placeholder="账号"
@press-enter="trySubmit"
>
<template #prefix>
@ -17,7 +17,7 @@
<a-input-password
v-model:value="modelRef.password"
size="large"
placeholder="密码: a123456"
placeholder="密码"
autocomplete="on"
@press-enter="trySubmit"
>
@ -26,6 +26,23 @@
</template>
</a-input-password>
</a-form-item>
<a-form-item v-bind="validateInfos.code">
<a-input
v-model:value="modelRef.code"
size="large"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@press-enter="trySubmit"
>
<template #prefix>
<safety-certificate-outlined :style="{ color: 'rgba(0,0,0,.25)' }" />
</template>
</a-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" />
</div>
</a-form-item>
</a-form>
</template>
@ -36,17 +53,34 @@ import { Form } from 'ant-design-vue'
import type { AccountLoginParam } from '@/api/auth/types'
import type { LoginFormInstance } from './types'
import { passEncrypt } from '@/utils/password-utils'
import { doRequest } from '@/utils/axios/request'
import { getCodeData } from '@/api/auth'
const codeUrl = ref('')
onMounted(() => getCode())
const getCode = () => {
doRequest(getCodeData(), {
onSuccess: (res: any) => {
console.log(res, 'res')
codeUrl.value = res.data.img
modelRef.uuid = res.data.uuid
}
})
}
//
const useForm = Form.useForm
const modelRef = reactive<AccountLoginParam>({
username: '',
password: ''
password: '',
code: '',
uuid: ''
})
const rulesRef = reactive({
username: [{ required: true, message: '请输入账号!' }],
password: [{ required: true, message: '请输入密码!' }]
// code: [{ required: true, message: '!' }]
})
const { validate, validateInfos } = useForm(modelRef, rulesRef)
@ -62,12 +96,27 @@ function trySubmit() {
defineExpose<LoginFormInstance>({
validate,
doLogin(captchaId) {
doLogin() {
console.log(modelRef.code, 'code')
return accountLogin({
username: modelRef.username,
password: passEncrypt(modelRef.password), //
captchaId // id
// captchaId // id
uuid: modelRef.uuid,
code: modelRef.code
})
}
})
</script>
<style lang="less" scoped>
.login-code {
width: 33%;
display: inline-block;
height: 38px;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
</style>

@ -142,8 +142,8 @@ function store(res: LoginResult) {
function handleLogin() {
const loginFormInstance = loginFormRef.value!
loginFormInstance.validate().then(() => {
// handleSubmit()
enableLoginCaptcha ? loginCaptchaRef.value?.show() : handleSubmit()
handleSubmit()
// enableLoginCaptcha ? loginCaptchaRef.value?.show() : handleSubmit()
})
}
@ -163,7 +163,9 @@ function handleSubmit(captchaId?: string) {
.catch(err => {
isLoginError.value = true
loginErrorMessage.value =
((err.response || {}).data || {}).message || '请求出现错误,请稍后再试'
((err.response || {}).data || {}).message ||
((err.response || {}).data || {}).error ||
'请求出现错误,请稍后再试'
})
.finally(() => {
loginLoading.value = false

@ -16,7 +16,7 @@
:wrapper-col="wrapperCol"
>
<a-form-item label="阶段" v-bind="tagvalidateInfos['desc.tags']">
<template v-for="(tag, index) in tagFormModel.desc?.tags" :key="index">
<template v-for="tag in tagFormModel.desc?.tags" :key="tag.labelName">
<a-tooltip v-if="tag.labelName.length > 20" :title="tag">
<a-tag :closable="true" @close="taghandleClose(tag, 'FormAction.CREATE')">
{{ `${tag.labelName.slice(0, 20)}...` }}
@ -60,7 +60,7 @@
</template>
<script setup lang="ts">
import type { SysUserDTO, clueStageEditModelType } from '@/api/system/user/types'
import type { ClueStageDTO, clueStageEditModelType } from '@/api/salesmanagement/labelRule/types'
import { createClueStage, updateClueStage } from '@/api/salesmanagement/labelRule'
// import type { clueStageType } from '@/api/salesmanagement/labelRule/types'
import { useAdminForm, useFormAction, FormAction, labelCol, wrapperCol } from '@/hooks/form'
@ -84,7 +84,7 @@ const clueStageEditModel = reactive<clueStageEditModelType>({
name: ''
})
//线
const tagFormModel = reactive<SysUserDTO>({
const tagFormModel = reactive<ClueStageDTO>({
sort: undefined,
clueStageId: undefined,
name: '',
@ -175,6 +175,21 @@ const taghandleClose = (removedTag: tagsItem, type: string) => {
console.log(type, 'type')
const tags = tagFormModel.desc?.tags.filter(tag => tag.labelName !== removedTag.labelName)
tagFormModel.desc.tags = tags
console.log(tags, 'tags')
const newList: any = reactive([])
if (formModel.length > 0) {
tags.forEach((item: any) => {
newList.push(
formModel.filter((prop: any) => {
return prop.name == item.labelName
})[0]
)
})
console.log(newList, 'newList')
formModel.length = 0
formModel.push(...newList)
}
console.log(formModel, 'formModel2')
// formModel.delLabelId?.push(removedTag.labelOrganizeId)
}
@ -186,6 +201,7 @@ const showInput = (type: string) => {
}
const handleInputConfirm = (type: string, index: number | undefined) => {
console.log(index, 'index')
const inputValue = tagFormModel.desc.inputValue
const labelNameList = tagFormModel.desc.tags.map((item: tagsItem) => {
return item.labelName
@ -196,12 +212,17 @@ const handleInputConfirm = (type: string, index: number | undefined) => {
{ labelName: inputValue, labelOrganizeId: undefined }
]
const length = ref<number | undefined>(0)
if (index && clueStageListLength.value) {
// length.value = index + clueStageListLength.value - 1
length.value = clueStageListLength.value
}
// if (index && clueStageListLength.value) {
// length.value = index + clueStageListLength.value - 1
length.value = Number(clueStageListLength.value) + Number(index)
console.log(length.value, 'length.value')
console.log(clueStageListLength.value, 'clueStageListLength.value2')
console.log(index, 'index')
// }
formModel.push({ name: inputValue, sort: length.value })
// formModel.push({ name: inputValue, sort: index })
console.log(formModel, 'formModel1')
}
Object.assign(tagFormModel.desc, {
@ -236,6 +257,7 @@ defineExpose({
open(opendata: openObj) {
console.log(opendata, 'opendata')
clueStageListLength.value = opendata.clueStageListLength
console.log(clueStageListLength.value, 'clueStageListLength.value1')
openModal()
if (isCreateForm.value) {
tagresetFields()

@ -78,8 +78,10 @@ import type { UnwrapRef } from 'vue'
//
import LabelRuleFormModal from '@/views/salesmanagement/labelRule/labelRuleFormModal.vue'
import ClueStageModal from '@/views/salesmanagement/labelRule/clueStageModal.vue'
import SysUserPageSearch from '@/views/salesmanagement/labelRule/labelRuleSearch.vue'
//
import type { FormInstance } from 'ant-design-vue'
import type { LabelGroupRecord, LabelRulePageParam } from '@/api/salesmanagement/labelRule/types'
import {
pageAccessLogs,
deleteLabelGroup,
@ -90,14 +92,8 @@ import {
import ProTable from '#/table'
import type { ProTableInstanceExpose, TableRequest, ProColumns } from '#/table'
import { mergePageParam } from '@/utils/page-utils'
import type {
SysUserQO,
SysUserPageVO
} from '@/api/controlcenterstation/distributionTaskManagement/types'
import { FormAction } from '@/hooks/form'
import SysMenuFormModal from '@/views/controlcenterstation/distributionTaskManagement/distributionTaskManagementModal.vue'
import { doRequest } from '@/utils/axios/request'
import SysUserPageSearch from '@/views/salesmanagement/labelRule/labelRuleSearch.vue'
//
//
@ -105,7 +101,7 @@ const tableRef = ref<ProTableInstanceExpose>()
//
const labelRuleFormModalRef = ref<InstanceType<typeof LabelRuleFormModal>>()
//
const searchParams: SysUserQO = {}
const searchParams: LabelRulePageParam = {}
//
const tableRequest: TableRequest = (params, sorter, filter) => {
@ -126,7 +122,7 @@ const addTagGroup = () => {
}
//
const handleEdit = (record: SysUserPageVO) => {
const handleEdit = (record: LabelGroupRecord) => {
labelRuleFormModalRef.value?.open({
newFormAction: FormAction.UPDATE,
record
@ -134,7 +130,7 @@ const handleEdit = (record: SysUserPageVO) => {
}
//
const handleDelete = (record: SysUserPageVO) => {
const handleDelete = (record: LabelGroupRecord) => {
doRequest(deleteLabelGroup([record.id]), {
successMessage: '删除成功!',
onSuccess: () => reloadTable()
@ -176,7 +172,7 @@ const clueStageModalRef = ref<InstanceType<typeof ClueStageModal>>()
const addClueStage = () => {
clueStageModalRef.value?.open({
newFormAction: FormAction.CREATE,
clueStageListLength: clueStage.length + 1
clueStageListLength: clueStage.length
})
}
@ -319,7 +315,7 @@ const handleInputConfirm = () => {
})
}
//线
const deleteClueStageClick = (record: SysUserPageVO) => {
const deleteClueStageClick = (record: LabelGroupRecord) => {
doRequest(deleteClueStage(toRaw(record.clueStageId)), {
onSuccess: (res: any) => {
console.log(res, 'res')

@ -27,7 +27,7 @@
</a-form-item> -->
<!-- v-bind="tagvalidateInfos['desc.tags']" -->
<a-form-item label="标签" v-bind="tagvalidateInfos['desc.tags']">
<template v-for="(tag, index) in tagFormModel.desc?.tags" :key="index">
<template v-for="tag in tagFormModel.desc?.tags" :key="tag.labelName">
<a-tooltip v-if="tag.labelName.length > 20" :title="tag">
<!-- :closable="index !== 0" -->
<a-tag :closable="true" @close="taghandleClose(tag, 'FormAction.CREATE')">
@ -72,7 +72,8 @@
<a-input v-model:value="tagFormModel.name" class="labelGroupName" />
</a-form-item>
<a-form-item label="标签" v-bind="tagvalidateInfos['desc.tags']">
<template v-for="(tag, index) in tagFormModel.desc?.tags" :key="index">
<!-- {{ tagFormModel.desc?.tags }} -->
<template v-for="tag in tagFormModel.desc?.tags" :key="tag.labelName">
<a-tooltip v-if="tag.labelName.length > 20" :title="tag">
<a-tag :closable="true" @close="taghandleClose(tag, 'FormAction.CREATE')">
{{ `${tag.labelName.slice(0, 20)}...` }}
@ -106,11 +107,15 @@
</template>
<script setup lang="ts">
import type { SysUserDTO, SysUserPageVO } from '@/api/system/user/types'
import { createLabelOrganize, updateLabelOrganize } from '@/api/salesmanagement/labelRule'
import type { LabelOrganizeEntity } from '@/api/salesmanagement/labelRule/types'
// import type { SysUserPageVO } from '@/api/system/user/types'
// import { overrideProperties } from '@/utils/bean-utils'
// import { passEncrypt } from '@/utils/password-utils'
import type {
LabelOrganizeEntity,
LabelGroupRecord,
ClueStageDTO
} from '@/api/salesmanagement/labelRule/types'
import { createLabelOrganize, updateLabelOrganize } from '@/api/salesmanagement/labelRule'
import { useAdminForm, useFormAction, FormAction, labelCol, wrapperCol } from '@/hooks/form'
import type { FormRequestMapping } from '@/hooks/form'
import { useModal } from '@/hooks/modal'
@ -129,7 +134,7 @@ const formModel = reactive<LabelOrganizeEntity>({
name: '',
labelList: []
})
const tagFormModel = reactive<SysUserDTO>({
const tagFormModel = reactive<ClueStageDTO>({
name: '',
desc: {
tags: [],
@ -165,15 +170,19 @@ const handleSubmit = () => {
//
if (isCreateForm.value) {
formModel.labelList = []
tagFormModel.desc?.tags.forEach((item: tagsItem) => {
tagFormModel.desc.tags.forEach((item: tagsItem) => {
formModel.labelList?.push(item.labelName)
})
}
formModel.name = tagFormModel.name
if (formModel.delLabelId?.length === 0) {
delete formModel.delLabelId
}
tagvalidateAndSubmit(toRaw(formModel), {
onSuccess: () => {
handleClose()
// delete formModel.delLabelId
// closeModal()
emits('tagsubmit-success')
}
@ -186,20 +195,36 @@ const handleClose = () => {
tagsubmitLoading.value = false
tagFormModel.desc.tags = []
}
formModel.labelList = []
tagsubmitLoading.value = false
formModel.id = undefined
delete formModel.delLabelId
// if (formModel.delLabelId.length > 0) {
// formModel.delLabelId = []
// }
}
//
const inputRef = ref()
formModel.delLabelId = []
// formModel.delLabelId = []
const taghandleClose = (removedTag: tagsItem, type: string) => {
const tags = tagFormModel.desc?.tags.filter(tag => tag.labelName !== removedTag.labelName)
tagFormModel.desc.tags = tags
console.log(tagFormModel.desc.tags, 'tagFormModel.desc.tags')
if (title.value === '编辑标签组') {
formModel.delLabelId?.push(removedTag.labelOrganizeId)
if (removedTag.labelOrganizeId) {
formModel.delLabelId?.push(removedTag.labelOrganizeId)
console.log(removedTag, 'removedTag')
console.log(formModel, 'formModel')
} else {
formModel.labelList = formModel.labelList?.filter((item: string) => {
return item !== removedTag.labelName
})
}
}
console.log(tagFormModel.desc.tags, 'tagFormModel.desc.tags1111')
console.log(formModel, 'formModel')
}
const showInput = (type: string) => {
@ -215,13 +240,16 @@ const handleInputConfirm = (type: string, id: number | undefined) => {
const labelNameList = tagFormModel.desc.tags.map((item: tagsItem) => {
return item.labelName
})
if (inputValue && labelNameList.indexOf(inputValue) === -1) {
tagFormModel.desc.tags = [
...tagFormModel.desc.tags,
{ labelName: inputValue, labelOrganizeId: undefined }
]
formModel.labelList?.push(inputValue)
console.log(formModel.labelList, 'formModel.labelList')
}
// console.log(tagFormModel.desc.tags, 'tagFormModel.desc.tags2')
Object.assign(tagFormModel.desc, {
tags: tagFormModel.desc.tags,
inputVisible: false,
@ -232,7 +260,7 @@ const handleInputConfirm = (type: string, id: number | undefined) => {
interface openObj {
newFormAction: FormAction
record?: SysUserPageVO
record?: LabelGroupRecord
}
defineExpose({
open(opendata: openObj) {
@ -244,18 +272,20 @@ defineExpose({
tagFormModel.name = ''
tagresetFields()
} else {
console.log()
tagFormModel.desc.tags = []
tagFormModel.name = opendata.record?.name
formModel.name = opendata.record?.name
formModel.id = opendata.record?.id
opendata.record?.labelList.forEach((item: any) => {
tagFormModel.desc.tags = []
opendata.record?.labelList?.forEach((item: any) => {
tagFormModel.desc?.tags.push({
labelName: item.labelName,
labelOrganizeId: item.id
})
})
console.log(tagFormModel.desc.tags, 'tagFormModel.desc.tags1')
title.value = '编辑标签组'
formModel.delLabelId = []
// overrideProperties(formModel, opendata.record)
}

@ -42,7 +42,7 @@
<script setup lang="ts">
import { reactive, ref } from 'vue'
//
import type { MenuProps } from 'ant-design-vue'
// import type { MenuProps } from 'ant-design-vue'
//
import ProTable from '#/table'
import type { ProTableInstanceExpose, TableRequest, ProColumns } from '#/table'
@ -55,7 +55,7 @@ import AccessLogPageSearch from '@/views/salesmanagement/salespersonList/salespe
import { FormAction } from '@/hooks/form'
import { DictBadge } from '@/components/Dict'
import { NewButton, DeleteTextButton } from '@/components/Button'
import { message } from 'ant-design-vue'
// import { message } from 'ant-design-vue'
//
import ChangePasswordModal from '@/views/system/user/ChangePasswordModal.vue'
//

@ -100,8 +100,15 @@ const formModel = reactive<SysUserDTO>({
roleCodes: []
})
//
interface formRuleItem {
username: Array<object>
pass?: Array<object>
nickname: Array<object>
roleCodes?: Array<object>
}
//
const formRule = reactive({
const formRule = ref<formRuleItem>({
username: [{ required: true, message: '请输入用户名!' }],
pass: [{ required: isCreateForm, message: '请输入密码!' }],
nickname: [{ required: true, message: '请输入昵称!' }],
@ -154,6 +161,10 @@ defineExpose({
title.value = '新建用户'
} else {
title.value = '编辑用户'
formRule.value = {
username: [{ required: true, message: '请输入用户名!' }],
nickname: [{ required: true, message: '请输入昵称!' }]
}
overrideProperties(formModel, record)
}
formAction.value = newFormAction

@ -15,6 +15,7 @@ declare module '@vue/runtime-core' {
AButton: typeof import('ant-design-vue/es')['Button']
AButtonGroup: typeof import('ant-design-vue/es')['ButtonGroup']
ACard: typeof import('ant-design-vue/es')['Card']
ACascader: typeof import('ant-design-vue/es')['Cascader']
ACheckbox: typeof import('ant-design-vue/es')['Checkbox']
ACheckboxGroup: typeof import('ant-design-vue/es')['CheckboxGroup']
ACol: typeof import('ant-design-vue/es')['Col']
@ -33,6 +34,9 @@ declare module '@vue/runtime-core' {
AInputNumber: typeof import('ant-design-vue/es')['InputNumber']
AInputPassword: typeof import('ant-design-vue/es')['InputPassword']
AInputSearch: typeof import('ant-design-vue/es')['InputSearch']
AList: typeof import('ant-design-vue/es')['List']
AListItem: typeof import('ant-design-vue/es')['ListItem']
AListItemMeta: typeof import('ant-design-vue/es')['ListItemMeta']
AMenu: typeof import('ant-design-vue/es')['Menu']
AMenuDivider: typeof import('ant-design-vue/es')['MenuDivider']
AMenuItem: typeof import('ant-design-vue/es')['MenuItem']
@ -54,6 +58,7 @@ declare module '@vue/runtime-core' {
ArrowUpOutlined: typeof import('@ant-design/icons-vue')['ArrowUpOutlined']
ASelect: typeof import('ant-design-vue/es')['Select']
ASelectOption: typeof import('ant-design-vue/es')['SelectOption']
ASkeleton: typeof import('ant-design-vue/es')['Skeleton']
ASpace: typeof import('ant-design-vue/es')['Space']
ASpin: typeof import('ant-design-vue/es')['Spin']
AStep: typeof import('ant-design-vue/es')['Step']
@ -65,6 +70,7 @@ declare module '@vue/runtime-core' {
ATag: typeof import('ant-design-vue/es')['Tag']
ATextarea: typeof import('ant-design-vue/es')['Textarea']
ATimePicker: typeof import('ant-design-vue/es')['TimePicker']
ATimeRangePicker: typeof import('ant-design-vue/es')['TimeRangePicker']
ATooltip: typeof import('ant-design-vue/es')['Tooltip']
ATransfer: typeof import('ant-design-vue/es')['Transfer']
ATree: typeof import('ant-design-vue/es')['Tree']
@ -106,6 +112,7 @@ declare module '@vue/runtime-core' {
RotateRightOutlined: typeof import('@ant-design/icons-vue')['RotateRightOutlined']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
SafetyCertificateOutlined: typeof import('@ant-design/icons-vue')['SafetyCertificateOutlined']
SearchActions: typeof import('./../src/components/Search/SearchActions.vue')['default']
SelectLanguage: typeof import('./../src/components/SelectLanguage/index.vue')['default']
SettingOutlined: typeof import('@ant-design/icons-vue')['SettingOutlined']

@ -24,6 +24,7 @@ import { antdvStyleDeps } from './src/utils/resolvers'
// const serverAddress = 'http://172.18.1.8:8100'
const serverAddress = 'http://8.130.96.163:8100'
// const serverAddress = 'https://baiyea.net'
// https://vitejs.dev/config/
export default defineConfig({
@ -135,5 +136,18 @@ export default defineConfig({
'crypto-js/index',
'@ballcat/vue-cropper'
]
},
build: {
// outDir: 'dist',
minify: 'terser',
// assetsDir: 'assets',
// sourcemap: false,
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true
}
}
}
})
//

Loading…
Cancel
Save