Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
W
wangxiaolu-sfa-ui
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
sfa
wangxiaolu-sfa-ui
Commits
0688f888
提交
0688f888
authored
1月 15, 2025
作者:
lidongxu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(promotion): 促销任务列表
增加筛选条件,尝试调用线上接口
上级
b8d3aaa7
隐藏空白字符变更
内嵌
并排
正在显示
12 个修改的文件
包含
229 行增加
和
26 行删除
+229
-26
.env.development
.env.development
+2
-0
.env.production
.env.production
+1
-0
.env.staging
.env.staging
+1
-0
index.js
src/api/index.js
+1
-0
task.js
src/api/promotion/task.js
+52
-0
date.js
src/hooks/date.js
+15
-7
date.js
src/utils/date.js
+0
-13
request.js
src/utils/request.js
+3
-0
index.vue
src/views/bi/competitor/cmm/index.vue
+2
-2
index.vue
src/views/bi/competitor/sycm_prd/index.vue
+2
-2
index.vue
src/views/bi/competitor/sycm_store/index.vue
+2
-2
index.vue
src/views/promotion/task/index.vue
+148
-0
没有找到文件。
.env.development
浏览文件 @
0688f888
...
...
@@ -7,6 +7,8 @@ VITE_APP_BASE_API = '/dev-api'
# VITE_APP_BASE_API = '/bclan'
# VITE_APP_BASE_API = '/home'
VITE_APP_PROMOTION_BASE_API = 'http://promotion.wxl66.cn:8010'
# 开发环境配置
VITE_APP_ENV = 'development'
...
...
.env.production
浏览文件 @
0688f888
...
...
@@ -3,6 +3,7 @@ VITE_APP_TITLE = 王小卤-链路中心
# 基地址
VITE_APP_BASE_API = '/api'
VITE_APP_PROMOTION_BASE_API = 'http://promotion.wxl66.cn:8010'
# 生产环境配置
VITE_APP_ENV = 'production'
...
...
.env.staging
浏览文件 @
0688f888
...
...
@@ -3,6 +3,7 @@ VITE_APP_TITLE = 王小卤-链路中心
# 基地址
VITE_APP_BASE_API = '/api'
VITE_APP_PROMOTION_BASE_API = 'http://promotion.wxl66.cn:8010'
# 开发环境配置
VITE_APP_ENV = 'staging'
...
...
src/api/index.js
浏览文件 @
0688f888
...
...
@@ -11,6 +11,7 @@ export * from './monitor/job'
export
*
from
'./monitor/jobLog'
export
*
from
'./monitor/online'
export
*
from
'./monitor/server'
export
*
from
'./promotion/task'
export
*
from
'./system/dict/data'
export
*
from
'./system/dict/type'
export
*
from
'./system/attendance'
...
...
src/api/promotion/task.js
0 → 100644
浏览文件 @
0688f888
import
request
,
{
promotionBaseURL
}
from
'@/utils/request'
import
{
parseTime
}
from
'@/utils'
// 战区列表
export
const
getWarZoneListAPI
=
()
=>
{
return
request
({
url
:
promotionBaseURL
+
'/user/dept/query/enroll/list'
,
method
:
'POST'
,
data
:
{
"orgNameLike1"
:
"战区"
,
// "orgName1": "重客运营部"
}
})
}
// 负责人列表
export
const
getChargeListAPI
=
()
=>
{
return
request
({
url
:
promotionBaseURL
+
'/user/employee/query/enroll/list'
,
method
:
'POST'
,
data
:
{
"waiqin365OrgId"
:
''
,
"empName"
:
''
,
"qcId"
:
''
}
})
}
// 任务列表
export
const
getTaskListAPI
=
(
queryParams
)
=>
{
return
request
({
url
:
promotionBaseURL
+
'/activity/employee/query/page'
,
method
:
'POST'
,
data
:
{
"pageNum"
:
queryParams
.
page
,
"pageSize"
:
queryParams
.
pageSize
,
"queryParams"
:
{
"deptQcId"
:
queryParams
.
zoneId
,
// "createDateStart": parseTime(queryParams.date[0], '{y}-{m}-{d}'),
"createDateStart"
:
'2025-01-12 00:00:00'
,
// "createDateEnd": parseTime(queryParams.date[1], '{y}-{m}-{d}'),
"createDateEnd"
:
'2025-01-14 23:59:59'
,
"province"
:
queryParams
.
province
,
"city"
:
queryParams
.
city
,
"approverId"
:
''
,
"approveStatus"
:
queryParams
.
taskStatus
,
"storeNameLike"
:
queryParams
.
storeName
,
}
}
})
}
\ No newline at end of file
src/hooks/date.js
浏览文件 @
0688f888
export
const
useDatePickerOptions
=
()
=>
{
const
nowMouth
=
[
new
Date
().
setDate
((
new
Date
().
getDate
()
-
30
)),
new
Date
().
setDate
((
new
Date
().
getDate
()
-
1
))]
/**
* 日期选项配置
* @param {*} type 0:从今天开始往前,-1 则是 T - 1 开始日期往前
* @returns {}
*/
export
const
useDatePickerOptions
=
(
type
=
-
1
)
=>
{
const
last30Date
=
[
new
Date
().
setDate
((
new
Date
().
getDate
()
-
(
30
-
1
))),
new
Date
().
setDate
((
new
Date
().
getDate
()
+
type
))]
const
last7Date
=
[
new
Date
().
setDate
((
new
Date
().
getDate
()
-
(
7
-
1
))),
new
Date
().
setDate
((
new
Date
().
getDate
()
+
type
))]
const
pickerOptions
=
ref
([
// 日期选项配置
{
text
:
'最近一周'
,
value
()
{
const
end
=
new
Date
().
setDate
((
new
Date
().
getDate
()
-
1
));
const
end
=
new
Date
().
setDate
((
new
Date
().
getDate
()
+
type
));
const
start
=
new
Date
();
start
.
setTime
(
start
.
getTime
()
-
3600
*
1000
*
24
*
7
);
start
.
setTime
(
start
.
getTime
()
-
3600
*
1000
*
24
*
(
7
-
1
)
);
return
[
start
,
end
]
}
},
{
text
:
'最近一个月'
,
value
()
{
const
end
=
new
Date
().
setDate
((
new
Date
().
getDate
()
-
1
));
const
end
=
new
Date
().
setDate
((
new
Date
().
getDate
()
+
type
));
const
start
=
new
Date
();
start
.
setTime
(
start
.
getTime
()
-
3600
*
1000
*
24
*
30
);
start
.
setTime
(
start
.
getTime
()
-
3600
*
1000
*
24
*
(
30
-
1
)
);
return
[
start
,
end
]
}
}
])
return
{
nowMouth
,
last30Date
,
last7Date
,
pickerOptions
}
}
\ No newline at end of file
src/utils/date.js
浏览文件 @
0688f888
...
...
@@ -121,19 +121,6 @@ export function parseTime(time, pattern) {
return
time_str
}
/**
* 传入 "start" 获取 90 天前的时间戳,否则返回今天的年月日的日期对象(默认时间为 0 时 0 分 0 秒)
* @param {string} type
* @returns {Date}
*/
export
function
getTime
(
type
)
{
if
(
type
===
'start'
)
{
return
new
Date
().
getTime
()
-
3600
*
1000
*
24
*
90
}
else
{
return
new
Date
(
new
Date
().
toDateString
())
}
}
/**
* 时间后补 0 格式 例如:09:00 转成 09:00:00
* @param {*} time 时间字符串
...
...
src/utils/request.js
浏览文件 @
0688f888
...
...
@@ -12,6 +12,9 @@ let downloadLoadingInstance;
// 是否显示重新登录
export
let
isRelogin
=
{
show
:
false
};
// 其他系统后台 baseURL
export
const
promotionBaseURL
=
import
.
meta
.
env
.
VITE_APP_PROMOTION_BASE_API
axios
.
defaults
.
headers
[
'Content-Type'
]
=
'application/json;charset=utf-8'
// 创建axios实例
const
service
=
axios
.
create
({
...
...
src/views/bi/competitor/cmm/index.vue
浏览文件 @
0688f888
...
...
@@ -66,7 +66,7 @@ import { useDatePickerOptions } from '@/hooks'
const
loading
=
ref
(
true
)
const
brandList
=
ref
([])
// 直播间列表
const
typeList
=
ref
([
'销售额'
,
'观看人次'
])
// 数据类型列表
const
{
pickerOptions
,
nowMouth
}
=
useDatePickerOptions
()
// 日期快捷方式
const
{
pickerOptions
,
last30Date
}
=
useDatePickerOptions
()
// 日期快捷方式
const
queryParams
=
reactive
({
// 查询表单
brandList
:
[],
...
...
@@ -225,7 +225,7 @@ const filterData = () => {
const
init
=
async
function
()
{
// 初始化参数
queryParams
.
date
=
nowMouth
queryParams
.
date
=
last30Date
queryParams
.
typeList
=
[
typeList
.
value
[
0
]]
// 请求数据
const
data
=
await
getList
()
...
...
src/views/bi/competitor/sycm_prd/index.vue
浏览文件 @
0688f888
...
...
@@ -80,7 +80,7 @@ import { useDatePickerOptions } from '@/hooks'
const
loading
=
ref
(
true
)
const
prdList
=
ref
([])
// 商品列表
const
typeList
=
ref
([
'支付买家数'
,
'交易增速'
,
'独立访客范围'
,
'流量增速'
])
// 数据类型
const
{
pickerOptions
,
nowMouth
}
=
useDatePickerOptions
()
const
{
pickerOptions
,
last30Date
}
=
useDatePickerOptions
()
const
showType
=
ref
(
'charts'
)
// 展示类型('charts' / 'table')
const
dateMerge
=
ref
(
false
)
// 表格中日期是否合并
...
...
@@ -355,7 +355,7 @@ const dateMergeFn = () => {
// 默认打开页面请求一次所有数据,并保存在数据源
async
function
init
()
{
// 初始化参数
queryParams
.
date
=
nowMouth
queryParams
.
date
=
last30Date
queryParams
.
typeList
=
[
typeList
.
value
[
0
]]
await
getPrdList
()
await
getList
()
...
...
src/views/bi/competitor/sycm_store/index.vue
浏览文件 @
0688f888
...
...
@@ -77,7 +77,7 @@ import { useDatePickerOptions } from '@/hooks'
const
loading
=
ref
(
true
)
const
brandList
=
ref
([])
// 店铺列表
const
typeList
=
ref
([
'支付买家数'
,
'交易增速'
,
'独立访客范围'
,
'流量增速'
])
// 数据类型
const
{
pickerOptions
,
nowMouth
}
=
useDatePickerOptions
()
const
{
pickerOptions
,
last30Date
}
=
useDatePickerOptions
()
const
showType
=
ref
(
'charts'
)
// 展示类型('charts' / 'table')
const
dateMerge
=
ref
(
false
)
// 表格中日期是否合并
...
...
@@ -351,7 +351,7 @@ const dateMergeFn = () => {
// 默认打开页面请求一次所有数据,并保存在数据源
async
function
init
()
{
// 初始化参数
queryParams
.
date
=
nowMouth
queryParams
.
date
=
last30Date
queryParams
.
typeList
=
[
typeList
.
value
[
0
]]
await
getStoreList
()
await
getList
()
...
...
src/views/promotion/task/index.vue
0 → 100644
浏览文件 @
0688f888
<
template
>
<div
class=
"app-container"
>
<div
class=
"container"
>
<el-form
:model=
"queryParams"
inline
label-width=
"auto"
>
<el-form-item
label=
"选择日期"
prop=
"date"
>
<el-date-picker
v-model=
"queryParams.date"
type=
"daterange"
:clearable=
"false"
range-separator=
"至"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
:shortcuts=
"pickerOptions"
@
change=
"queryChangeFn('date')"
/>
</el-form-item>
<el-form-item
label=
"任务状态"
prop=
"taskStatus"
>
<el-radio-group
v-model=
"queryParams.taskStatus"
>
<el-radio-button
v-for=
"item in taskStatusList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"区域查询"
prop=
"region"
>
<el-radio-group
v-model=
"queryParams.region"
>
<el-radio-button
label=
"全国"
value=
"全国"
/>
<el-radio-button
label=
"省"
value=
"省"
/>
<el-radio-button
label=
"省-市"
value=
"省-市"
/>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"战区查询"
prop=
"zone"
>
<el-select
v-model=
"queryParams.zoneId"
placeholder=
"请选择战区"
>
<el-option
v-for=
"item in zoneList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"负责人"
prop=
"manager"
>
<el-select
v-model=
"queryParams.managerId"
placeholder=
"请选择负责人"
>
<el-option
v-for=
"item in managerList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"门店"
prop=
"store"
>
<el-input
v-model=
"queryParams.storeName"
placeholder=
"请输入门店名称"
/>
</el-form-item>
</el-form>
</div>
</div>
</
template
>
<
script
setup
>
import
{
reactive
}
from
'vue'
import
{
useDatePickerOptions
}
from
'@/hooks'
import
{
getWarZoneListAPI
,
getChargeListAPI
,
getTaskListAPI
}
from
'@/api'
const
{
pickerOptions
,
last7Date
}
=
useDatePickerOptions
(
0
)
const
queryParams
=
reactive
({
date
:
last7Date
,
taskStatus
:
'SUBMITTED'
,
region
:
'全国'
,
province
:
''
,
city
:
''
,
zoneId
:
undefined
,
managerId
:
undefined
,
storeName
:
undefined
,
page
:
1
,
pageSize
:
10
})
// 任务状态
const
taskStatusList
=
ref
([
{
label
:
'未审批'
,
value
:
'SUBMITTED'
},
{
label
:
'已审批'
,
value
:
'APPROVED'
},
{
label
:
'全部数据'
,
value
:
'ALL'
}
])
// 战区列表
const
zoneList
=
ref
([])
const
getZoneList
=
async
()
=>
{
const
{
data
}
=
await
getWarZoneListAPI
()
zoneList
.
value
=
data
.
map
(
item
=>
{
return
{
label
:
item
.
orgName
,
value
:
item
.
qcId
}
})
}
getZoneList
()
// 负责人列表
const
managerList
=
ref
([])
const
getManagerList
=
async
()
=>
{
const
{
data
}
=
await
getChargeListAPI
()
managerList
.
value
=
data
.
map
(
item
=>
{
return
{
label
:
item
.
empName
,
value
:
item
.
qcId
}
})
}
getManagerList
()
// 任务列表
const
tableList
=
ref
([])
const
getTaskList
=
async
()
=>
{
const
{
data
}
=
await
getTaskListAPI
(
queryParams
)
tableList
.
value
=
data
.
map
(
item
=>
{
return
{
label
:
item
.
taskName
,
value
:
item
.
taskId
}
})
}
getTaskList
()
</
script
>
<
style
scoped
lang=
"scss"
></
style
>
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论