提交 2f7dcc27 authored 作者: lidongxu's avatar lidongxu

refactor(mobile/promotion): 促销移动端:批量修改归属人

同上
上级 d019365e
...@@ -2,21 +2,30 @@ ...@@ -2,21 +2,30 @@
import { ref } from 'vue'; import { ref } from 'vue';
const longPressDuration = ref(500); // 长按时间阈值,单位毫秒 const longPressDuration = ref(500); // 长按时间阈值,单位毫秒
let start = null; // 记录触摸开始时间 let start = null; // 按下函数
let cancel = null; let move = null; // 移动函数
let cancel = null; // 取消函数
let isMove = false // 是否移动
export default { export default {
beforeMount(el, binding) { beforeMount(el, binding) {
let pressTimer = null; let pressTimer = null;
start = (e) => { start = (e) => {
isMove = false;
if (pressTimer === null) { if (pressTimer === null) {
pressTimer = setTimeout(() => { pressTimer = setTimeout(() => {
binding.value(); // 长按定时器触发,先不执行函数,等待 touchend 判断坐标
!isMove && binding.value();
}, longPressDuration.value); }, longPressDuration.value);
} }
}; };
move = (e) => {
isMove = true
}
cancel = (e) => { cancel = (e) => {
if (pressTimer !== null) { if (pressTimer !== null) {
clearTimeout(pressTimer); clearTimeout(pressTimer);
...@@ -25,13 +34,14 @@ export default { ...@@ -25,13 +34,14 @@ export default {
}; };
el.addEventListener('touchstart', start); el.addEventListener('touchstart', start);
el.addEventListener('touchmove', move)
el.addEventListener('touchend', cancel); el.addEventListener('touchend', cancel);
el.addEventListener('touchcancel', cancel); el.addEventListener('touchcancel', cancel);
}, },
unmounted(el) { unmounted(el) {
el.removeEventListener('touchstart', start); el.removeEventListener('touchstart', start);
el.removeEventListener('touchmove', move)
el.removeEventListener('touchend', cancel); el.removeEventListener('touchend', cancel);
el.removeEventListener('touchcancel', cancel); el.removeEventListener('touchcancel', cancel);
} }
}; };
\ No newline at end of file
<template> <template>
<PickerSearch v-model:show="showEmployee" <PickerSearch
:columns="showEmployeeList" :columns="showEmployeeList"
placeholder="搜索归属人" placeholder="搜索归属人"
@confirm="onEmployeeConfirm" @confirm="onEmployeeConfirm"
...@@ -8,7 +8,11 @@ ...@@ -8,7 +8,11 @@
<script setup> <script setup>
import { getChargeListAPI } from '@/api' import { getChargeListAPI } from '@/api'
// 选择归属人弹窗组件
const emits = defineEmits(['confirm'])
const showEmployeeList = ref([])
// 归属人 // 归属人
const allEmpolyeeList = ref([]) const allEmpolyeeList = ref([])
const getEmployeeList = async () => { const getEmployeeList = async () => {
...@@ -22,20 +26,19 @@ const getEmployeeList = async () => { ...@@ -22,20 +26,19 @@ const getEmployeeList = async () => {
deptQcId: item.deptQcId deptQcId: item.deptQcId
} }
}) })
showEmployeeList.value = allEmpolyeeList.value
} }
getEmployeeList() getEmployeeList()
// 确定归属人 // 确定归属人
const onEmployeeConfirm = (val) => { const onEmployeeConfirm = (val) => {
props.query.employeeId = val.selectedOptions[0].value emits('confirm', val)
showEmployee.value = false
emits('query')
} }
// 搜索归属人 // 搜索归属人
const searchEmployee = (searchName) => { const searchEmployee = (searchName) => {
showEmployeeList.value = allEmpolyeeList.filter(item => { showEmployeeList.value = allEmpolyeeList.value.filter(item => {
return item.text.includes(searchName) return item.text.includes(searchName)
}) })
} }
......
...@@ -130,12 +130,14 @@ ...@@ -130,12 +130,14 @@
</div> </div>
</van-form> </van-form>
</div> </div>
<PickerBelong v-model:show="showEmployeePicker"
@confirm="confirmEmployee" />
<PickerSearch v-model:show="showPicker" <PickerSearch v-model:show="showPicker"
:columns="columns" :columns="columns"
:searchShow="showPickerSearch" :searchShow="showPickerSearch"
@search="search" @search="search"
@cancel="showPicker = false" @cancel="showPicker = false"
@confirm="confirm"></PickerSearch> @confirm="confirm" />
<van-popup v-model:show="showInTimePicker" <van-popup v-model:show="showInTimePicker"
destroy-on-close destroy-on-close
position="bottom"> position="bottom">
...@@ -162,6 +164,7 @@ ...@@ -162,6 +164,7 @@
import { getPlanStoreListAPI, getChargeListAPI, addPlanByWebAPI, getPlanDetailAPI, updatePlanByWebAPI } from '@/api' import { getPlanStoreListAPI, getChargeListAPI, addPlanByWebAPI, getPlanDetailAPI, updatePlanByWebAPI } from '@/api'
import userStore from '@/store/modules/user' import userStore from '@/store/modules/user'
import { parseTime } from '@/utils' import { parseTime } from '@/utils'
import PickerBelong from '../components/PickerBelong'
const myForm = ref({}) const myForm = ref({})
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
...@@ -228,11 +231,13 @@ const onSubmit = async () => { ...@@ -228,11 +231,13 @@ const onSubmit = async () => {
} }
// 选择门店 // 选择门店
const selStoreName = () => { const selStoreName = async () => {
isType.value = '门店' isType.value = '门店'
showPicker.value = true showPicker.value = true
await getStoreList()
showPickerSearch.value = true showPickerSearch.value = true
searchPlaceholder.value = '搜索门店名称' searchPlaceholder.value = '搜索门店名称'
} }
// 获取门店列表 // 获取门店列表
const getStoreList = async (storeName) => { const getStoreList = async (storeName) => {
...@@ -245,7 +250,6 @@ const getStoreList = async (storeName) => { ...@@ -245,7 +250,6 @@ const getStoreList = async (storeName) => {
storeAddr: item.storeAddr storeAddr: item.storeAddr
})) }))
} }
getStoreList()
// 活动日期 // 活动日期
const showCalendar = ref(false) const showCalendar = ref(false)
...@@ -271,30 +275,11 @@ const selPattern = () => { ...@@ -271,30 +275,11 @@ const selPattern = () => {
} }
// 归属人 // 归属人
const allBelongList = ref([]) // 所有归属人列表 const showEmployeePicker = ref(false)
const selEmployee = () => { const selEmployee = () => {
isType.value = '归属人' showEmployeePicker.value = true
showPicker.value = true
showPickerSearch.value = true
columns.value = allBelongList.value
getBelongList()
}
const getBelongList = async () => {
const res = await getChargeListAPI()
allBelongList.value = res.data.map(item => ({
text: item.name,
value: item.employeeNo,
id: item.id
}))
columns.value = allBelongList.value
// 判断如果是城市经理,则设置默认归属人为自己
if (isCityManager.value) {
form.employeeName = userStore().employeeName
form.employeeNo = userStore().employeeNo
}
} }
// 上班打卡时间 // 上班打卡时间
const showInTimePicker = ref(false) const showInTimePicker = ref(false)
const inTime = ref([]) // 选择器里的时间 const inTime = ref([]) // 选择器里的时间
...@@ -357,12 +342,16 @@ const isType = ref('') // 0: 门店 1: 计划 2: 归属人 ...@@ -357,12 +342,16 @@ const isType = ref('') // 0: 门店 1: 计划 2: 归属人
const search = (value) => { const search = (value) => {
if (isType.value === '门店') { if (isType.value === '门店') {
getStoreList(value) getStoreList(value)
} else if (isType.value === '归属人') {
// 模糊搜索
columns.value = allBelongList.value.filter(item => item.text.includes(value))
} }
} }
// 确认 // 确认
const confirmEmployee = (value) => {
const { selectedOptions } = value
form.employeeName = selectedOptions[0]?.text
form.employeeNo = selectedOptions[0]?.employeeNo
form.employeeId = selectedOptions[0]?.value
showEmployeePicker.value = false
}
const confirm = (value) => { const confirm = (value) => {
if (isType.value === '门店') { if (isType.value === '门店') {
const { selectedOptions } = value const { selectedOptions } = value
...@@ -372,11 +361,6 @@ const confirm = (value) => { ...@@ -372,11 +361,6 @@ const confirm = (value) => {
} else if (isType.value === '计划') { } else if (isType.value === '计划') {
const { selectedOptions } = value const { selectedOptions } = value
form.pattern = selectedOptions[0]?.text form.pattern = selectedOptions[0]?.text
} else if (isType.value === '归属人') {
const { selectedOptions } = value
form.employeeName = selectedOptions[0]?.text
form.employeeNo = selectedOptions[0]?.value
form.employeeId = selectedOptions[0]?.id
} }
showPicker.value = false showPicker.value = false
} }
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
:pull-distance="100" :pull-distance="100"
success-text="刷新成功" success-text="刷新成功"
@refresh="onRefresh" @refresh="onRefresh"
:class="{safe_bottom: showSelect}"> :class="{ safe_bottom: showSelect }">
<van-list v-model:loading="loading" <van-list v-model:loading="loading"
:finished="finished" :finished="finished"
:immediate-check="false" :immediate-check="false"
...@@ -64,11 +64,15 @@ ...@@ -64,11 +64,15 @@
<van-action-bar v-show="showSelect"> <van-action-bar v-show="showSelect">
<span @click="showSelect = false">取消</span> <span @click="showSelect = false">取消</span>
<van-action-bar-button type="warning" <van-action-bar-button type="warning"
text="修改归属人" /> text="修改归属人"
@click="clickChangeBelong" />
<van-action-bar-button type="danger" <van-action-bar-button type="danger"
text="删除" text="删除"
@click="clickDelSome" /> @click="clickDelSome" />
</van-action-bar> </van-action-bar>
<!-- 选择归属人 -->
<PickerBelong v-model:show="showPickerBelong"
@confirm="confirmPickerBelong" />
</div> </div>
</template> </template>
...@@ -81,13 +85,15 @@ import userStore from '@/store/modules/user' ...@@ -81,13 +85,15 @@ import userStore from '@/store/modules/user'
import { parseTime } from '@/utils' import { parseTime } from '@/utils'
import { checkPlanExpire } from '@/hooks' import { checkPlanExpire } from '@/hooks'
import { getPromotionActiveStatus } from '@/dicts' import { getPromotionActiveStatus } from '@/dicts'
import { getPlanListAPI, deletePlanAPI } from '@/api' import { getPlanListAPI, deletePlanAPI, batchUpdatePlanAPI } from '@/api'
import PlanSearch from './plan-search.vue' import PlanSearch from './plan-search.vue'
import PickerBelong from '../components/PickerBelong'
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const router = useRouter() const router = useRouter()
const promotionIdentity = computed(() => userStore().promotionIdentity) const promotionIdentity = computed(() => userStore().promotionIdentity)
const employeeNo = computed(() => userStore().employeeNo) const employeeNo = computed(() => userStore().employeeNo)
const employeeName = computed(() => userStore().employeeName)
// 搜索弹窗 // 搜索弹窗
const showSearch = ref(false) const showSearch = ref(false)
...@@ -113,8 +119,6 @@ const planColumns = [ ...@@ -113,8 +119,6 @@ const planColumns = [
} }
] ]
const getPlanList = async () => { const getPlanList = async () => {
// 搜索条件改变/刷新时,页码重置为 1 // 搜索条件改变/刷新时,页码重置为 1
!loading.value && (query.pageNum = 1) !loading.value && (query.pageNum = 1)
...@@ -165,7 +169,6 @@ const querySearch = () => { ...@@ -165,7 +169,6 @@ const querySearch = () => {
// 编辑计划 // 编辑计划
const editPlan = (row) => { const editPlan = (row) => {
console.log(123)
if (!checkPlanExpire(row)) { if (!checkPlanExpire(row)) {
return proxy.$modal.msgWarning('无法编辑,已执行或之前计划') return proxy.$modal.msgWarning('无法编辑,已执行或之前计划')
} }
...@@ -226,6 +229,36 @@ const clickDelSome = () => { ...@@ -226,6 +229,36 @@ const clickDelSome = () => {
onRefresh() onRefresh()
}) })
} }
// 选择归属人
const showPickerBelong = ref(false)
const clickChangeBelong = () => {
const ids = planList.value.filter(item => item.checked).map(item => item.id)
if (ids.length === 0) {
return proxy.$modal.msgWarning('请选择要修改归属人的计划')
}
for (let i = 0; i < ids.length; i++) {
const item = planList.value.find(o => o.id === ids[i])
if (!checkPlanExpire(item)) {
return proxy.$modal.msgWarning('无法修改,已执行或之前计划')
}
}
showPickerBelong.value = true
}
const confirmPickerBelong = async (val) => {
showPickerBelong.value = false
showSelect.value = false
// 调用后台接口批量修改归属人
// 循环判断计划是否含有以前和执行中的
await batchUpdatePlanAPI({
employeeId: val.selectedOptions[0]?.value, // 选择的归属人 id
operName: employeeName.value,
planIds: planList.value.filter(item => item.checked).map(item => item.id)
})
proxy.$modal.msgSuccess('修改成功')
onRefresh()
}
</script> </script>
<style scoped <style scoped
...@@ -234,9 +267,10 @@ const clickDelSome = () => { ...@@ -234,9 +267,10 @@ const clickDelSome = () => {
background: #f5f5f5; background: #f5f5f5;
min-height: 100vh; min-height: 100vh;
.van-pull-refresh{ .van-pull-refresh {
/* 并列选择身上的类名 */ /* 并列选择身上的类名 */
&.safe_bottom{ &.safe_bottom {
padding-bottom: 50px; padding-bottom: 50px;
} }
} }
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
</van-popup> </van-popup>
<!-- 归属人 --> <!-- 归属人 -->
<van-field :model-value="showEmployeeList.find(o => o.value === query.employeeId)?.text" <van-field :modelValue="query.employeeName"
is-link is-link
readonly readonly
label="归属人" label="归属人"
...@@ -75,7 +75,6 @@ import userStore from '@/store/modules/user' ...@@ -75,7 +75,6 @@ import userStore from '@/store/modules/user'
import PickerBelong from '../components/PickerBelong' import PickerBelong from '../components/PickerBelong'
const promotionIdentity = computed(() => userStore().promotionIdentity) const promotionIdentity = computed(() => userStore().promotionIdentity)
const employeeNo = computed(() => userStore().employeeNo)
const { recentPickerOptions: pickerOptions } = useDatePickerOptions() const { recentPickerOptions: pickerOptions } = useDatePickerOptions()
...@@ -146,7 +145,8 @@ const showEmployee = ref(false) ...@@ -146,7 +145,8 @@ const showEmployee = ref(false)
// 确定归属人 // 确定归属人
const onEmployeeConfirm = (val) => { const onEmployeeConfirm = (val) => {
props.query.employeeId = val.selectedOptions[0].value props.query.employeeName = val.selectedOptions[0]?.text
props.query.employeeId = val.selectedOptions[0]?.value
showEmployee.value = false showEmployee.value = false
emits('query') emits('query')
} }
...@@ -163,7 +163,10 @@ const resetFn = () => { ...@@ -163,7 +163,10 @@ const resetFn = () => {
props.query.activityStartDate = '' props.query.activityStartDate = ''
props.query.activityEndDate = '' props.query.activityEndDate = ''
props.query.planStatus = undefined props.query.planStatus = undefined
!promotionIdentity.value && (props.query.employeeId = undefined) if (!promotionIdentity.value) {
props.query.employeeName = undefined
props.query.employeeId = undefined
}
props.query.storeNameLike = undefined props.query.storeNameLike = undefined
emits('query') emits('query')
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论