提交 6e3cf651 authored 作者: lidongxu's avatar lidongxu

feat(mobile/promotion): 移动端_促销计划列表和搜索完成

同上
上级 56028c0f
...@@ -7,6 +7,7 @@ VITE_APP_PUBLIC_PATH = '/' ...@@ -7,6 +7,7 @@ VITE_APP_PUBLIC_PATH = '/'
# 基地址 # 基地址
VITE_APP_BASE_API = '/dev-api' # 小卤 VITE_APP_BASE_API = '/dev-api' # 小卤
# VITE_APP_BASE_API = '/ql_local' # 小卤
VITE_APP_PROMOTION = '/promotion-api' # 促销 VITE_APP_PROMOTION = '/promotion-api' # 促销
# 飞书服务回调地址(本地测试已经通过并上线,后台飞书登录接口重定向地址已经不是 localhost 了所以本地开发无需使用飞书登录,线上已经可用) # 飞书服务回调地址(本地测试已经通过并上线,后台飞书登录接口重定向地址已经不是 localhost 了所以本地开发无需使用飞书登录,线上已经可用)
......
...@@ -39,6 +39,14 @@ export function fsLogin(data) { ...@@ -39,6 +39,14 @@ export function fsLogin(data) {
}) })
} }
// 勤策系统-静默登录(用勤测在 URL 上回传的参数调用自己后台登录接口)
export function qcLogin(params) {
return request({
url: `/auth/qc/login?${params}`
})
}
// 账号密码登录 // 账号密码登录
export function login(data) { export function login(data) {
return request({ return request({
...@@ -61,4 +69,5 @@ export function logout() { ...@@ -61,4 +69,5 @@ export function logout() {
url: '/auth/logout', url: '/auth/logout',
method: 'delete' method: 'delete'
}) })
} }
\ No newline at end of file
/** /**
* 日期选项配置 * 日期选项配置
* @param {*} type 0:从今天开始往前,-1 则是 T - 1 开始日期往前 * @param {*}
* @returns {} * @returns {}
*/ */
export const useDatePickerOptions = (type = -1) => { export const useDatePickerOptions = () => {
const last30Date = [new Date().setDate((new Date().getDate() - (30 - 1))), new Date().setDate((new Date().getDate() + type))] const last30Date = [new Date().setDate((new Date().getDate() - (30 - 1))), new Date().setDate((new Date().getDate()))]
const last7Date = [new Date().setDate((new Date().getDate() - (7 - 1))), new Date().setDate((new Date().getDate() + type))] const last7Date = [new Date().setDate((new Date().getDate() - (7 - 1))), new Date().setDate((new Date().getDate()))]
const lastDate = [new Date().setDate((new Date().getDate() + type)), new Date().setDate((new Date().getDate() + type))] const lastDate = [new Date().setDate((new Date().getDate())), new Date().setDate((new Date().getDate()))]
// 今日 0 点到 24 点 // 今日 0 点到 24 点
const today = new Date(); const today = new Date();
today.setHours(0, 0, 0, 0); today.setHours(0, 0, 0, 0);
const tomorrow = new Date(); const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate());
tomorrow.setHours(23, 59, 59, 59); tomorrow.setHours(23, 59, 59, 59);
const todayDate = [today, tomorrow] const todayDate = [today, tomorrow]
// 今年的 1.1 号到 12.31号 // 今年的 1.1 号到 12.31号
...@@ -24,19 +23,23 @@ export const useDatePickerOptions = (type = -1) => { ...@@ -24,19 +23,23 @@ export const useDatePickerOptions = (type = -1) => {
} }
}, },
{ {
text: '最近一周', text: '最近 7 日',
value() { value() {
const end = new Date().setDate((new Date().getDate() + type));
const start = new Date(); const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * (7 - 1)); start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
start.setHours(0, 0, 0, 0);
const end = new Date();
end.setHours(23, 59, 59, 59);
return [start, end] return [start, end]
} }
}, { }, {
text: '最近一个月', text: '最近 30 日',
value() { value() {
const end = new Date().setDate((new Date().getDate() + type));
const start = new Date(); const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * (30 - 1)); start.setDate((new Date().getDate() - 30))
start.setHours(0, 0, 0, 0);
const end = new Date();
end.setHours(23, 59, 59, 59);
return [start, end] return [start, end]
} }
} }
......
...@@ -4,20 +4,24 @@ ...@@ -4,20 +4,24 @@
right-text="搜索" right-text="搜索"
@click-right="showSearch = true" /> @click-right="showSearch = true" />
<!-- 计划列表 --> <!-- 计划列表 -->
<van-list v-model:loading="loading" <van-pull-refresh v-model="refreshLoading"
:finished="finished" :pull-distance="100"
:immediate-check="false" @refresh="onRefresh">
finished-text="没有更多了" <van-list v-model:loading="loading"
@load="onLoad"> :finished="finished"
<van-cell-group inset> :immediate-check="false"
<van-cell v-for="item in planList" finished-text="没有更多了"
:key="item.id" @load="onLoad">
:title="item.employeeName" <van-cell-group inset>
:value="item.pattern" <van-cell v-for="item in planList"
:label="item.storeName" :key="item.id"
@click="detailFn" /> :title="item.employeeName"
</van-cell-group> :value="item.pattern"
</van-list> :label="item.storeName"
@click="detailFn" />
</van-cell-group>
</van-list>
</van-pull-refresh>
<van-popup v-model:show="showSearch" <van-popup v-model:show="showSearch"
position="right" position="right"
...@@ -30,7 +34,7 @@ ...@@ -30,7 +34,7 @@
<van-button size="small" <van-button size="small"
type="primary" type="primary"
v-for="item in pickerOptions" v-for="item in pickerOptions"
@click.stop.self.prevent="pickerBtn(item)">{{ item.text }}</van-button> @click="pickerBtn(item)">{{ item.text }}</van-button>
</template> </template>
</van-field> </van-field>
<!-- 开始时间 --> <!-- 开始时间 -->
...@@ -40,7 +44,8 @@ ...@@ -40,7 +44,8 @@
name="datePicker" name="datePicker"
label="开始时间" label="开始时间"
placeholder="点击选择时间" placeholder="点击选择时间"
@click="startShowPicker = true" /> @click="startShowPicker = true">
</van-field>
<van-popup v-model:show="startShowPicker" <van-popup v-model:show="startShowPicker"
destroy-on-close destroy-on-close
position="bottom" position="bottom"
...@@ -102,7 +107,14 @@ ...@@ -102,7 +107,14 @@
<!-- 终端名 --> <!-- 终端名 -->
<van-field v-model="query.storeNameLike" <van-field v-model="query.storeNameLike"
label="终端名" label="终端名"
placeholder="请输入终端名" /> placeholder="请输入终端名"
@input="searchByStoreName" />
<!-- 重置按钮 -->
<van-button
icon="replay"
class="reset"
block
@click="resetFn">重置</van-button>
</van-popup> </van-popup>
...@@ -147,15 +159,8 @@ const query = reactive({ ...@@ -147,15 +159,8 @@ const query = reactive({
// 快捷时间 // 快捷时间
const pickerBtn = (item) => { const pickerBtn = (item) => {
let [startTime, endTime] = item.value() let [startTime, endTime] = item.value()
// 判断不是空并且不是日期对象则转换成日期对象 query.activityStartDate = parseTime(startTime)
if (startTime && !(startTime instanceof Date)) { query.activityEndDate = parseTime(endTime)
startTime = new Date(startTime)
}
if (endTime && !(endTime instanceof Date)) {
endTime = new Date(endTime)
}
query.activityStartDate = parseTime(startTime, '{y}-{m}-{d}')
query.activityEndDate = parseTime(endTime, '{y}-{m}-{d}')
// 更新两个数组格式时间 // 更新两个数组格式时间
activityStartDatePicker[0] = startTime.getFullYear() activityStartDatePicker[0] = startTime.getFullYear()
activityStartDatePicker[1] = startTime.getMonth() + 1 activityStartDatePicker[1] = startTime.getMonth() + 1
...@@ -163,6 +168,10 @@ const pickerBtn = (item) => { ...@@ -163,6 +168,10 @@ const pickerBtn = (item) => {
activityEndDatePicker[0] = endTime.getFullYear() activityEndDatePicker[0] = endTime.getFullYear()
activityEndDatePicker[1] = endTime.getMonth() + 1 activityEndDatePicker[1] = endTime.getMonth() + 1
activityEndDatePicker[2] = endTime.getDate() activityEndDatePicker[2] = endTime.getDate()
planList.value = []
planQueryParams.pageNum = 1
getPlanList()
} }
// 开始时间 // 开始时间
const startShowPicker = ref(false) const startShowPicker = ref(false)
...@@ -195,6 +204,10 @@ const onPlanConfirm = (val) => { ...@@ -195,6 +204,10 @@ const onPlanConfirm = (val) => {
query.planStatus = val.selectedOptions[0].text query.planStatus = val.selectedOptions[0].text
planStatusStr.value = val.selectedValues planStatusStr.value = val.selectedValues
planStatusShowPicker.value = false planStatusShowPicker.value = false
planList.value = []
planQueryParams.pageNum = 1
getPlanList()
} }
// 归属人 // 归属人
const employeeIdShowPicker = ref(false) const employeeIdShowPicker = ref(false)
...@@ -220,6 +233,10 @@ const onEmployeeConfirm = (val) => { ...@@ -220,6 +233,10 @@ const onEmployeeConfirm = (val) => {
query.employeeId = val.selectedOptions[0].text query.employeeId = val.selectedOptions[0].text
employeeIdStr.value = val.selectedValues employeeIdStr.value = val.selectedValues
employeeIdShowPicker.value = false employeeIdShowPicker.value = false
planList.value = []
planQueryParams.pageNum = 1
getPlanList()
} }
// 计划列表 // 计划列表
...@@ -231,37 +248,93 @@ const planList = ref([]) ...@@ -231,37 +248,93 @@ const planList = ref([])
const loading = ref(false) const loading = ref(false)
const finished = ref(false) const finished = ref(false)
const getPlanList = async () => { const getPlanList = async () => {
loading.value = true console.log(query)
const res = await getPlanListAPI(planQueryParams) const res = await getPlanListAPI({
...planQueryParams,
activityDate: [query.activityStartDate, query.activityEndDate],
planStatus: planColumns.find(item => item.text === query.planStatus)?.value,
employeeId: employeeIdColumns.value.find(item => item.text === query.employeeId)?.value,
storeName: query.storeNameLike,
})
planList.value = [...planList.value, ...res.data.records] planList.value = [...planList.value, ...res.data.records]
finished.value = res.data.records.length === 0 finished.value = res.data.records.length === 0
loading.value = false loading.value = false
} }
getPlanList() getPlanList()
const searchByStoreName = (val) => {
query.storeNameLike = val.data
planList.value = []
planQueryParams.pageNum = 1
getPlanList()
}
const onLoad = () => { const onLoad = () => {
loading.value = true
planQueryParams.pageNum++ planQueryParams.pageNum++
getPlanList() getPlanList()
} }
const detailFn = () => { const detailFn = () => {
} }
// 刷新
const refreshLoading = ref(false)
const onRefresh = () => {
refreshLoading.value = true
setTimeout(() => {
refreshLoading.value = false
planQueryParams.pageNum = 1
query.activityStartDate = ''
query.activityEndDate = ''
query.planStatus = ''
query.employeeId = ''
query.storeNameLike = ''
planList.value = []
getPlanList()
}, 1000)
}
// 重置
const resetFn = () => {
query.activityStartDate = ''
query.activityEndDate = ''
query.planStatus = ''
query.employeeId = ''
query.storeNameLike = ''
planList.value = []
planQueryParams.pageNum = 1
getPlanList()
}
</script> </script>
<style scoped <style scoped
lang="scss"> lang="scss">
.mobile-container{ .mobile-container {
background: #f5f5f5; background: #f5f5f5;
.van-cell-group{ min-height: 100vh;
.van-cell-group {
background: #f5f5f5; background: #f5f5f5;
} }
.van-cell{
.van-cell {
margin-top: 10px; margin-top: 10px;
::v-deep(.van-cell__label){
::v-deep(.van-cell__label) {
/* 强制一行显示 */ /* 强制一行显示 */
white-space: nowrap; white-space: nowrap;
} }
} }
} }
.van-list{
min-height: 100vh;
}
.reset{
margin-top: 20px;
}
::v-deep(.van-field):first-of-type { ::v-deep(.van-field):first-of-type {
.van-button { .van-button {
margin: 0 5px; margin: 0 5px;
......
...@@ -88,6 +88,11 @@ export const constantMobileRoutes = [ ...@@ -88,6 +88,11 @@ export const constantMobileRoutes = [
path: '/', path: '/',
redirect: '/promotion' redirect: '/promotion'
}, },
{
path: '/login',
component: () => import('@/views/login'),
hidden: true
},
{ {
path: '/promotion', path: '/promotion',
component: () => import('@/mobile_views/promotion/index'), component: () => import('@/mobile_views/promotion/index'),
......
import { login, fsLogin, getInfo } from '@/api' import { login, fsLogin, getInfo, qcLogin } from '@/api'
import { getToken, setToken, removeToken } from '@/utils/auth' import { getToken, setToken, removeToken } from '@/utils/auth'
import { isHttp, isEmpty } from "@/utils/validate" import { isHttp, isEmpty } from "@/utils/validate"
import defAva from '@/assets/images/profile.jpg' import defAva from '@/assets/images/profile.jpg'
...@@ -41,6 +41,13 @@ export default defineStore( ...@@ -41,6 +41,13 @@ export default defineStore(
}).catch(error => { }).catch(error => {
reject(error) reject(error)
}) })
} else if (type === 'qc') {
// 勤策登录
qcLogin(data).then(res => {
setToken(res.data.access_token)
this.token = res.data.access_token
resolve()
})
} }
}) })
}, },
......
...@@ -136,8 +136,8 @@ const getOAuthState = () => { ...@@ -136,8 +136,8 @@ const getOAuthState = () => {
} }
getOAuthState() getOAuthState()
// 飞书客户端登录 // 检查-是否飞书回跳,并客户端登录
const checkLoginAuth = async () => { const checkFsLoginAuth = async () => {
if (window.h5sdk) { if (window.h5sdk) {
const code = await fsClientAuth() const code = await fsClientAuth()
loginByType('fs', { code }) loginByType('fs', { code })
...@@ -145,7 +145,20 @@ const checkLoginAuth = async () => { ...@@ -145,7 +145,20 @@ const checkLoginAuth = async () => {
isShowLogin.value = true isShowLogin.value = true
} }
} }
checkLoginAuth() checkFsLoginAuth()
// 检查-是否勤策回跳,并客户端登录
const checkQcLoginAuth = async () => {
const params = new URLSearchParams(window.location.href.split('?')[1]);
const state = params.get('state');
console.log(state, 'state')
if (state === 'STATE') {
loginByType('qc', window.location.href.split('?')[1])
} else {
isShowLogin.value = true
}
}
checkQcLoginAuth()
// 工号密码登录 // 工号密码登录
function handleLogin() { function handleLogin() {
......
...@@ -30,6 +30,11 @@ export default defineConfig(({ mode, command }) => { ...@@ -30,6 +30,11 @@ export default defineConfig(({ mode, command }) => {
target: 'http://192.168.100.39:8010', target: 'http://192.168.100.39:8010',
changeOrigin: true, changeOrigin: true,
rewrite: (p) => p.replace(/^\/promotion-api/, '') rewrite: (p) => p.replace(/^\/promotion-api/, '')
},
'/ql_local': {
target: 'http://192.168.131.48:8080',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/ql_local/, '')
} }
} }
}, },
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论