修改bug
parent
38a84af88f
commit
ea604057f4
|
|
@ -3,10 +3,12 @@
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev:app": "uni -p app",
|
"dev:app": "uni -p app",
|
||||||
|
"dev:app:pro": "uni -p app --mode production",
|
||||||
"dev:app-android": "uni -p app-android",
|
"dev:app-android": "uni -p app-android",
|
||||||
"dev:app-ios": "uni -p app-ios",
|
"dev:app-ios": "uni -p app-ios",
|
||||||
"dev:custom": "uni -p",
|
"dev:custom": "uni -p",
|
||||||
"dev:h5": "uni",
|
"dev:h5": "uni",
|
||||||
|
"dev:h5:pro": "uni --mode production",
|
||||||
"dev:h5:ssr": "uni --ssr",
|
"dev:h5:ssr": "uni --ssr",
|
||||||
"dev:mp-alipay": "uni -p mp-alipay",
|
"dev:mp-alipay": "uni -p mp-alipay",
|
||||||
"dev:mp-baidu": "uni -p mp-baidu",
|
"dev:mp-baidu": "uni -p mp-baidu",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,502 @@
|
||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
<CuNavbar :isBack="isBack || false" title="数据上报"></CuNavbar>
|
||||||
|
|
||||||
|
<view
|
||||||
|
:class="[
|
||||||
|
checkPermission(['store']) && form.allow_rereport
|
||||||
|
? ''
|
||||||
|
: 'pointer-events-none',
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<uv-form
|
||||||
|
class="mt-30rpx"
|
||||||
|
labelPosition="left"
|
||||||
|
ref="formRef"
|
||||||
|
:model="form"
|
||||||
|
:rules="rules"
|
||||||
|
errorType="toast"
|
||||||
|
labelWidth="130rpx"
|
||||||
|
>
|
||||||
|
<view class="px-base space-y-20rpx">
|
||||||
|
<view class="card">
|
||||||
|
<view class="pl-20rpx">
|
||||||
|
<uv-form-item
|
||||||
|
label="日期"
|
||||||
|
prop="form.date"
|
||||||
|
@click="showDateSelect"
|
||||||
|
>
|
||||||
|
<uv-input
|
||||||
|
disabled
|
||||||
|
v-model="form.date"
|
||||||
|
disabledColor="#ffffff"
|
||||||
|
placeholder="请选择日期"
|
||||||
|
:border="`none`"
|
||||||
|
>
|
||||||
|
</uv-input>
|
||||||
|
<template v-slot:right>
|
||||||
|
<uv-icon name="arrow-right"></uv-icon>
|
||||||
|
</template>
|
||||||
|
</uv-form-item>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="card" v-for="(item, i) in form.items" :key="i">
|
||||||
|
<TitleComp :title="item.name"></TitleComp>
|
||||||
|
<view class="mt-20rpx">
|
||||||
|
<uv-line color="#f5f5f5"></uv-line>
|
||||||
|
</view>
|
||||||
|
<view class="pl-20rpx">
|
||||||
|
<uv-form-item label="销售" :prop="`items.${i}.sales`">
|
||||||
|
<uv-input
|
||||||
|
@input="salesChange"
|
||||||
|
v-model="item.sales"
|
||||||
|
:border="`none`"
|
||||||
|
type="digit"
|
||||||
|
:placeholder="`请输入${item.name}销售金额`"
|
||||||
|
></uv-input>
|
||||||
|
</uv-form-item>
|
||||||
|
<uv-line color="#f5f5f5"></uv-line>
|
||||||
|
<uv-form-item label="兑奖" :prop="`items.${i}.expenditure`">
|
||||||
|
<uv-input
|
||||||
|
@input="expenditureChange"
|
||||||
|
v-model="item.expenditure"
|
||||||
|
:border="`none`"
|
||||||
|
type="digit"
|
||||||
|
:placeholder="`请输入${item.name}兑奖金额`"
|
||||||
|
></uv-input>
|
||||||
|
</uv-form-item>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="card">
|
||||||
|
<TitleComp title="汇总情况"></TitleComp>
|
||||||
|
<view class="mt-20rpx">
|
||||||
|
<uv-line color="#f5f5f5"></uv-line>
|
||||||
|
</view>
|
||||||
|
<view class="pl-20rpx">
|
||||||
|
<uv-form-item label="销售合计" prop="sales">
|
||||||
|
<uv-input
|
||||||
|
:border="`none`"
|
||||||
|
type="digit"
|
||||||
|
v-model="form.sales"
|
||||||
|
placeholder="请输入总账销售金额"
|
||||||
|
></uv-input>
|
||||||
|
</uv-form-item>
|
||||||
|
<uv-line color="#f5f5f5"></uv-line>
|
||||||
|
<uv-form-item
|
||||||
|
:label="`${store?.is_lottery_store ? '兑奖' : '支出'}合计`"
|
||||||
|
prop="expenditure"
|
||||||
|
>
|
||||||
|
<uv-input
|
||||||
|
type="digit"
|
||||||
|
:border="`none`"
|
||||||
|
v-model="form.expenditure"
|
||||||
|
:placeholder="`请输入总账${
|
||||||
|
store?.is_lottery_store ? '兑奖' : '支出'
|
||||||
|
}金额`"
|
||||||
|
></uv-input>
|
||||||
|
</uv-form-item>
|
||||||
|
<uv-line color="#f5f5f5"></uv-line>
|
||||||
|
<uv-form-item label="新增客户" prop="new_customers">
|
||||||
|
<uv-input
|
||||||
|
:border="`none`"
|
||||||
|
v-model="form.new_customers"
|
||||||
|
type="number"
|
||||||
|
placeholder="请输入微信新增人数"
|
||||||
|
></uv-input>
|
||||||
|
</uv-form-item>
|
||||||
|
<uv-line color="#f5f5f5"></uv-line>
|
||||||
|
<uv-form-item label="交账金额" prop="handover_amount">
|
||||||
|
<uv-input
|
||||||
|
:border="`none`"
|
||||||
|
type="digit"
|
||||||
|
v-model="form.handover_amount"
|
||||||
|
placeholder="请输入交账金额"
|
||||||
|
></uv-input>
|
||||||
|
</uv-form-item>
|
||||||
|
<view class="text-primary text-24rpx py-10rpx"
|
||||||
|
>* 请确保填写的交账金额正确无误!</view
|
||||||
|
>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="card">
|
||||||
|
<TitleComp title="时段报表照片">
|
||||||
|
<template #right>
|
||||||
|
<view class="text-24rpx text-gray-400"
|
||||||
|
>{{ form.photos.length }}/9</view
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
</TitleComp>
|
||||||
|
<uv-form-item label="" prop="photos">
|
||||||
|
<view>
|
||||||
|
<uv-upload
|
||||||
|
width="200rpx"
|
||||||
|
height="200rpx"
|
||||||
|
:maxCount="9"
|
||||||
|
multiple
|
||||||
|
:fileList="form.photos"
|
||||||
|
@afterRead="afterRead"
|
||||||
|
@delete="deletePic"
|
||||||
|
name="photos"
|
||||||
|
></uv-upload>
|
||||||
|
</view>
|
||||||
|
</uv-form-item>
|
||||||
|
<view class="text-primary text-24rpx py-10rpx">
|
||||||
|
*竞彩时段报表照片,玩法时段报表照片,每日账本上传(需亲笔签字),销量本上传
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</uv-form>
|
||||||
|
</view>
|
||||||
|
<view class="h-130rpx">
|
||||||
|
<view
|
||||||
|
class="fixed z-10 bottom-0 left-0 right-0 h-120rpx bg-white flex-center box-border px-base"
|
||||||
|
:style="style"
|
||||||
|
>
|
||||||
|
<view class="w-full">
|
||||||
|
<uv-button
|
||||||
|
:disabled="isRule"
|
||||||
|
type="primary"
|
||||||
|
shape="circle"
|
||||||
|
block
|
||||||
|
@click="submit"
|
||||||
|
>
|
||||||
|
上报
|
||||||
|
</uv-button>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<uv-calendars
|
||||||
|
color="#ee2c37"
|
||||||
|
confirmColor="#ee2c37"
|
||||||
|
ref="calendars"
|
||||||
|
@confirm="calendarsConfirm"
|
||||||
|
:endDate="endDate"
|
||||||
|
:date="form.date"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<uv-modal
|
||||||
|
ref="modalRef"
|
||||||
|
title="提示"
|
||||||
|
content="确定提交?"
|
||||||
|
@confirm="onSubmit"
|
||||||
|
:showCancelButton="true"
|
||||||
|
></uv-modal>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { http } from '@/utils/request'
|
||||||
|
import CuNavbar from '@/components/cu-navbar/index'
|
||||||
|
import TitleComp from '@/components/title-comp/index'
|
||||||
|
import { addUnit, sys } from '@climblee/uv-ui/libs/function/index'
|
||||||
|
import {
|
||||||
|
computed,
|
||||||
|
ref,
|
||||||
|
onBeforeMount,
|
||||||
|
reactive,
|
||||||
|
onMounted,
|
||||||
|
watch,
|
||||||
|
nextTick,
|
||||||
|
} from 'vue'
|
||||||
|
import { useUserStore } from '@/store/modules/user'
|
||||||
|
import { timeFormat } from '@climblee/uv-ui/libs/function/index'
|
||||||
|
import { empty } from '@climblee/uv-ui/libs/function/test'
|
||||||
|
import { add, sub } from '@/utils/index'
|
||||||
|
import checkPermission from '@/utils/permission'
|
||||||
|
import { onShow } from '@dcloudio/uni-app'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
isBack: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
dete: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const calendars = ref(null)
|
||||||
|
const modalRef = ref(null)
|
||||||
|
const formRef = ref(null)
|
||||||
|
const userStore = useUserStore()
|
||||||
|
|
||||||
|
const userInfo = computed(() => userStore.userInfo || {})
|
||||||
|
const store = computed(() => userInfo.value.store)
|
||||||
|
|
||||||
|
const endDate = timeFormat(
|
||||||
|
props.dete ? new Date(props.dete) : new Date(),
|
||||||
|
'yyyy-mm-dd'
|
||||||
|
)
|
||||||
|
const isRule = computed(() => {
|
||||||
|
return !form.allow_rereport || !checkPermission(['store'])
|
||||||
|
})
|
||||||
|
|
||||||
|
const form = reactive({
|
||||||
|
date: endDate,
|
||||||
|
items: [],
|
||||||
|
new_customers: '',
|
||||||
|
sales: '',
|
||||||
|
expenditure: '',
|
||||||
|
handover_amount: '',
|
||||||
|
photos: [],
|
||||||
|
})
|
||||||
|
const rules = reactive({
|
||||||
|
date: {
|
||||||
|
required: true,
|
||||||
|
message: '请选择日期',
|
||||||
|
trigger: ['change'],
|
||||||
|
},
|
||||||
|
handover_amount: {
|
||||||
|
required: true,
|
||||||
|
message: '请输入交账金额',
|
||||||
|
trigger: ['change'],
|
||||||
|
},
|
||||||
|
sales: {
|
||||||
|
required: true,
|
||||||
|
message: '请输入总账销售金额',
|
||||||
|
},
|
||||||
|
expenditure: {
|
||||||
|
required: true,
|
||||||
|
message: `请输入总账${store.value?.is_lottery_store ? '兑奖' : '支出'}金额`,
|
||||||
|
},
|
||||||
|
new_customers: {
|
||||||
|
required: true,
|
||||||
|
message: '请输入微信新增人数',
|
||||||
|
},
|
||||||
|
photos: {
|
||||||
|
type: 'array',
|
||||||
|
required: true,
|
||||||
|
message: '请上传时段报表照片',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const style = computed(() => {
|
||||||
|
const style = {}
|
||||||
|
style.bottom = addUnit(sys().windowBottom, 'px')
|
||||||
|
return style
|
||||||
|
})
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
// console.log(endDate);
|
||||||
|
getData()
|
||||||
|
})
|
||||||
|
|
||||||
|
const submit = () => {
|
||||||
|
formRef.value.validate().then((res) => {
|
||||||
|
modalRef.value.open()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterLotteryData(datas) {
|
||||||
|
return datas.filter((item) => {
|
||||||
|
if (empty(item.sales) && empty(item.expenditure)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeEmptyValues(datas) {
|
||||||
|
return datas
|
||||||
|
.map((item) => {
|
||||||
|
// 过滤出空值的属性
|
||||||
|
const filteredItem = Object.entries(item)
|
||||||
|
.filter(([key, value]) => !empty(value))
|
||||||
|
.reduce((acc, [key, value]) => {
|
||||||
|
acc[key] = value
|
||||||
|
return acc
|
||||||
|
}, {})
|
||||||
|
|
||||||
|
return filteredItem
|
||||||
|
})
|
||||||
|
.filter((item) => Object.keys(item).length !== 0) // 移除所有属性都为空的对象
|
||||||
|
}
|
||||||
|
const onSubmit = async () => {
|
||||||
|
let valid = false
|
||||||
|
filterLotteryData(form.items).forEach((item) => {
|
||||||
|
if (!item.sales) {
|
||||||
|
valid = true
|
||||||
|
return uni.showToast({
|
||||||
|
title: `请填写${item.name}销售金额`,
|
||||||
|
icon: 'none',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!item.expenditure) {
|
||||||
|
valid = true
|
||||||
|
return uni.showToast({
|
||||||
|
title: `请填写${item.name}兑奖金额`,
|
||||||
|
icon: 'none',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (valid) return
|
||||||
|
|
||||||
|
const params = {
|
||||||
|
date: form.date,
|
||||||
|
sales: form.sales,
|
||||||
|
expenditure: form.expenditure,
|
||||||
|
handover_amount: form.handover_amount,
|
||||||
|
new_customers: form.new_customers,
|
||||||
|
photos: form.photos.map((item) => item.url),
|
||||||
|
items: filterLotteryData(form.items),
|
||||||
|
}
|
||||||
|
http
|
||||||
|
.request({
|
||||||
|
url: '/ledgers',
|
||||||
|
method: 'POST',
|
||||||
|
header: {
|
||||||
|
Accept: 'application/json',
|
||||||
|
},
|
||||||
|
data: params,
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
uni.$emit('refresh')
|
||||||
|
uni.showToast({
|
||||||
|
title: '提交成功',
|
||||||
|
icon: 'none',
|
||||||
|
})
|
||||||
|
if (props.isBack) {
|
||||||
|
uni.navigateBack()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
const resData = await http.get(`/ledgers/${form.date}`)
|
||||||
|
|
||||||
|
Object.assign(form, resData, {
|
||||||
|
photos:
|
||||||
|
resData?.photos?.map((item) => {
|
||||||
|
return { url: item }
|
||||||
|
}) || [],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const getTypeList = () => {
|
||||||
|
http
|
||||||
|
.get('/keywords', {
|
||||||
|
params: {
|
||||||
|
parent_key: 'lottery_type',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
form.items = res
|
||||||
|
res.forEach((item, i) => {
|
||||||
|
rules[`items.${i}.${'sales'}`] = {
|
||||||
|
required: true,
|
||||||
|
message: `请输入${item.name}销售金额`,
|
||||||
|
}
|
||||||
|
rules[`items.${i}.${'expenditure'}`] = {
|
||||||
|
required: true,
|
||||||
|
message: `请输入${item.name}兑奖金额`,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const calendarsConfirm = (e) => {
|
||||||
|
form.date = e.fulldate
|
||||||
|
getData()
|
||||||
|
}
|
||||||
|
|
||||||
|
const showDateSelect = () => {
|
||||||
|
calendars.value.open()
|
||||||
|
hideKeyboard()
|
||||||
|
}
|
||||||
|
|
||||||
|
const hideKeyboard = () => {
|
||||||
|
uni.hideKeyboard()
|
||||||
|
}
|
||||||
|
|
||||||
|
const afterRead = async (event) => {
|
||||||
|
let lists = [].concat(event.file)
|
||||||
|
let fileListLen = form[event.name].length
|
||||||
|
|
||||||
|
lists.map((item) => {
|
||||||
|
form[event.name].push({
|
||||||
|
...item,
|
||||||
|
status: 'uploading',
|
||||||
|
message: '上传中',
|
||||||
|
})
|
||||||
|
})
|
||||||
|
for (let i = 0; i < lists.length; i++) {
|
||||||
|
const result = await uploadFilePromise(lists[i].url)
|
||||||
|
let item = form[event.name][fileListLen]
|
||||||
|
form[event.name].splice(
|
||||||
|
fileListLen,
|
||||||
|
1,
|
||||||
|
Object.assign(item, {
|
||||||
|
status: 'success',
|
||||||
|
message: '',
|
||||||
|
url: result,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
fileListLen++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const uploadFilePromise = (url) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
http
|
||||||
|
.upload('/fileupload', {
|
||||||
|
filePath: url,
|
||||||
|
name: 'file',
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
resolve(res.url)
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
reject(err)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const deletePic = (event) => {
|
||||||
|
form[event.name].splice(event.index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const salesChange = async () => {
|
||||||
|
await nextTick()
|
||||||
|
const val = form?.items || []
|
||||||
|
const sales = val.reduce((a, b) => {
|
||||||
|
if (b.operator == '-') return sub(a, b?.sales ?? 0)
|
||||||
|
else if (b.operator == '+') return add(a, b?.sales ?? 0)
|
||||||
|
return a
|
||||||
|
}, 0)
|
||||||
|
|
||||||
|
form.sales = sales || 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const expenditureChange = async () => {
|
||||||
|
await nextTick()
|
||||||
|
const val = form?.items || []
|
||||||
|
const expenditure = val.reduce((a, b) => {
|
||||||
|
if (b.operator == '-') return sub(a, b?.expenditure ?? 0)
|
||||||
|
else if (b.operator == '+') return add(a, b?.expenditure ?? 0)
|
||||||
|
return a
|
||||||
|
}, 0)
|
||||||
|
form.expenditure = expenditure || 0
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => form.items,
|
||||||
|
(val) => {
|
||||||
|
// const sales = val.reduce((a, b) => {
|
||||||
|
// return add(a, b?.sales ?? 0)
|
||||||
|
// }, 0)
|
||||||
|
// const expenditure = val.reduce((a, b) => {
|
||||||
|
// return add(a, b?.expenditure ?? 0)
|
||||||
|
// }, 0)
|
||||||
|
// form.sales = sales || null
|
||||||
|
// form.expenditure = expenditure || null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
immediate: true,
|
||||||
|
deep: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
</script>
|
||||||
|
|
@ -1,502 +1,9 @@
|
||||||
<template>
|
<template>
|
||||||
<view>
|
<view>
|
||||||
<CuNavbar :isBack="isBack || false" title="数据上报"></CuNavbar>
|
<Base/>
|
||||||
|
|
||||||
<view
|
|
||||||
:class="[
|
|
||||||
checkPermission(['store']) && form.allow_rereport
|
|
||||||
? ''
|
|
||||||
: 'pointer-events-none',
|
|
||||||
]"
|
|
||||||
>
|
|
||||||
<uv-form
|
|
||||||
class="mt-30rpx"
|
|
||||||
labelPosition="left"
|
|
||||||
ref="formRef"
|
|
||||||
:model="form"
|
|
||||||
:rules="rules"
|
|
||||||
errorType="toast"
|
|
||||||
labelWidth="130rpx"
|
|
||||||
>
|
|
||||||
<view class="px-base space-y-20rpx">
|
|
||||||
<view class="card">
|
|
||||||
<view class="pl-20rpx">
|
|
||||||
<uv-form-item
|
|
||||||
label="日期"
|
|
||||||
prop="form.date"
|
|
||||||
@click="showDateSelect"
|
|
||||||
>
|
|
||||||
<uv-input
|
|
||||||
disabled
|
|
||||||
v-model="form.date"
|
|
||||||
disabledColor="#ffffff"
|
|
||||||
placeholder="请选择日期"
|
|
||||||
:border="`none`"
|
|
||||||
>
|
|
||||||
</uv-input>
|
|
||||||
<template v-slot:right>
|
|
||||||
<uv-icon name="arrow-right"></uv-icon>
|
|
||||||
</template>
|
|
||||||
</uv-form-item>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view class="card" v-for="(item, i) in form.items" :key="i">
|
|
||||||
<TitleComp :title="item.name"></TitleComp>
|
|
||||||
<view class="mt-20rpx">
|
|
||||||
<uv-line color="#f5f5f5"></uv-line>
|
|
||||||
</view>
|
|
||||||
<view class="pl-20rpx">
|
|
||||||
<uv-form-item label="销售" :prop="`items.${i}.sales`">
|
|
||||||
<uv-input
|
|
||||||
@input="salesChange"
|
|
||||||
v-model="item.sales"
|
|
||||||
:border="`none`"
|
|
||||||
type="digit"
|
|
||||||
:placeholder="`请输入${item.name}销售金额`"
|
|
||||||
></uv-input>
|
|
||||||
</uv-form-item>
|
|
||||||
<uv-line color="#f5f5f5"></uv-line>
|
|
||||||
<uv-form-item label="兑奖" :prop="`items.${i}.expenditure`">
|
|
||||||
<uv-input
|
|
||||||
@input="expenditureChange"
|
|
||||||
v-model="item.expenditure"
|
|
||||||
:border="`none`"
|
|
||||||
type="digit"
|
|
||||||
:placeholder="`请输入${item.name}兑奖金额`"
|
|
||||||
></uv-input>
|
|
||||||
</uv-form-item>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view class="card">
|
|
||||||
<TitleComp title="汇总情况"></TitleComp>
|
|
||||||
<view class="mt-20rpx">
|
|
||||||
<uv-line color="#f5f5f5"></uv-line>
|
|
||||||
</view>
|
|
||||||
<view class="pl-20rpx">
|
|
||||||
<uv-form-item label="销售合计" prop="sales">
|
|
||||||
<uv-input
|
|
||||||
:border="`none`"
|
|
||||||
type="digit"
|
|
||||||
v-model="form.sales"
|
|
||||||
placeholder="请输入总账销售金额"
|
|
||||||
></uv-input>
|
|
||||||
</uv-form-item>
|
|
||||||
<uv-line color="#f5f5f5"></uv-line>
|
|
||||||
<uv-form-item
|
|
||||||
:label="`${store?.is_lottery_store ? '兑奖' : '支出'}合计`"
|
|
||||||
prop="expenditure"
|
|
||||||
>
|
|
||||||
<uv-input
|
|
||||||
type="digit"
|
|
||||||
:border="`none`"
|
|
||||||
v-model="form.expenditure"
|
|
||||||
:placeholder="`请输入总账${
|
|
||||||
store?.is_lottery_store ? '兑奖' : '支出'
|
|
||||||
}金额`"
|
|
||||||
></uv-input>
|
|
||||||
</uv-form-item>
|
|
||||||
<uv-line color="#f5f5f5"></uv-line>
|
|
||||||
<uv-form-item label="新增客户" prop="new_customers">
|
|
||||||
<uv-input
|
|
||||||
:border="`none`"
|
|
||||||
v-model="form.new_customers"
|
|
||||||
type="number"
|
|
||||||
placeholder="请输入微信新增人数"
|
|
||||||
></uv-input>
|
|
||||||
</uv-form-item>
|
|
||||||
<uv-line color="#f5f5f5"></uv-line>
|
|
||||||
<uv-form-item label="交账金额" prop="handover_amount">
|
|
||||||
<uv-input
|
|
||||||
:border="`none`"
|
|
||||||
type="digit"
|
|
||||||
v-model="form.handover_amount"
|
|
||||||
placeholder="请输入交账金额"
|
|
||||||
></uv-input>
|
|
||||||
</uv-form-item>
|
|
||||||
<view class="text-primary text-24rpx py-10rpx"
|
|
||||||
>* 请确保填写的交账金额正确无误!</view
|
|
||||||
>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view class="card">
|
|
||||||
<TitleComp title="时段报表照片">
|
|
||||||
<template #right>
|
|
||||||
<view class="text-24rpx text-gray-400"
|
|
||||||
>{{ form.photos.length }}/9</view
|
|
||||||
>
|
|
||||||
</template>
|
|
||||||
</TitleComp>
|
|
||||||
<uv-form-item label="" prop="photos">
|
|
||||||
<view>
|
|
||||||
<uv-upload
|
|
||||||
width="200rpx"
|
|
||||||
height="200rpx"
|
|
||||||
:maxCount="9"
|
|
||||||
multiple
|
|
||||||
:fileList="form.photos"
|
|
||||||
@afterRead="afterRead"
|
|
||||||
@delete="deletePic"
|
|
||||||
name="photos"
|
|
||||||
></uv-upload>
|
|
||||||
</view>
|
|
||||||
</uv-form-item>
|
|
||||||
<view class="text-primary text-24rpx py-10rpx">
|
|
||||||
*竞彩时段报表照片,玩法时段报表照片,每日账本上传(需亲笔签字),销量本上传
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</uv-form>
|
|
||||||
</view>
|
|
||||||
<view class="h-130rpx">
|
|
||||||
<view
|
|
||||||
class="fixed z-10 bottom-0 left-0 right-0 h-120rpx bg-white flex-center box-border px-base"
|
|
||||||
:style="style"
|
|
||||||
>
|
|
||||||
<view class="w-full">
|
|
||||||
<uv-button
|
|
||||||
:disabled="isRule"
|
|
||||||
type="primary"
|
|
||||||
shape="circle"
|
|
||||||
block
|
|
||||||
@click="submit"
|
|
||||||
>
|
|
||||||
上报
|
|
||||||
</uv-button>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<uv-calendars
|
|
||||||
color="#ee2c37"
|
|
||||||
confirmColor="#ee2c37"
|
|
||||||
ref="calendars"
|
|
||||||
@confirm="calendarsConfirm"
|
|
||||||
:endDate="endDate"
|
|
||||||
:date="form.date"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<uv-modal
|
|
||||||
ref="modalRef"
|
|
||||||
title="提示"
|
|
||||||
content="确定提交?"
|
|
||||||
@confirm="onSubmit"
|
|
||||||
:showCancelButton="true"
|
|
||||||
></uv-modal>
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { http } from '@/utils/request'
|
import Base from './base.vue'
|
||||||
import CuNavbar from '@/components/cu-navbar/index'
|
|
||||||
import TitleComp from '@/components/title-comp/index'
|
|
||||||
import { addUnit, sys } from '@climblee/uv-ui/libs/function/index'
|
|
||||||
import {
|
|
||||||
computed,
|
|
||||||
ref,
|
|
||||||
onBeforeMount,
|
|
||||||
reactive,
|
|
||||||
onMounted,
|
|
||||||
watch,
|
|
||||||
nextTick,
|
|
||||||
} from 'vue'
|
|
||||||
import { useUserStore } from '@/store/modules/user'
|
|
||||||
import { timeFormat } from '@climblee/uv-ui/libs/function/index'
|
|
||||||
import { empty } from '@climblee/uv-ui/libs/function/test'
|
|
||||||
import { add, sub } from '@/utils/index'
|
|
||||||
import checkPermission from '@/utils/permission'
|
|
||||||
import { onShow } from '@dcloudio/uni-app'
|
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
isBack: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
dete: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const calendars = ref(null)
|
|
||||||
const modalRef = ref(null)
|
|
||||||
const formRef = ref(null)
|
|
||||||
const userStore = useUserStore()
|
|
||||||
|
|
||||||
const userInfo = computed(() => userStore.userInfo || {})
|
|
||||||
const store = computed(() => userInfo.value.store)
|
|
||||||
|
|
||||||
const endDate = timeFormat(
|
|
||||||
props.dete ? new Date(props.dete) : new Date(),
|
|
||||||
'yyyy-mm-dd'
|
|
||||||
)
|
|
||||||
const isRule = computed(() => {
|
|
||||||
return !form.allow_rereport || !checkPermission(['store'])
|
|
||||||
})
|
|
||||||
|
|
||||||
const form = reactive({
|
|
||||||
date: endDate,
|
|
||||||
items: [],
|
|
||||||
new_customers: '',
|
|
||||||
sales: '',
|
|
||||||
expenditure: '',
|
|
||||||
handover_amount: '',
|
|
||||||
photos: [],
|
|
||||||
})
|
|
||||||
const rules = reactive({
|
|
||||||
date: {
|
|
||||||
required: true,
|
|
||||||
message: '请选择日期',
|
|
||||||
trigger: ['change'],
|
|
||||||
},
|
|
||||||
handover_amount: {
|
|
||||||
required: true,
|
|
||||||
message: '请输入交账金额',
|
|
||||||
trigger: ['change'],
|
|
||||||
},
|
|
||||||
sales: {
|
|
||||||
required: true,
|
|
||||||
message: '请输入总账销售金额',
|
|
||||||
},
|
|
||||||
expenditure: {
|
|
||||||
required: true,
|
|
||||||
message: `请输入总账${store.value?.is_lottery_store ? '兑奖' : '支出'}金额`,
|
|
||||||
},
|
|
||||||
new_customers: {
|
|
||||||
required: true,
|
|
||||||
message: '请输入微信新增人数',
|
|
||||||
},
|
|
||||||
photos: {
|
|
||||||
type: 'array',
|
|
||||||
required: true,
|
|
||||||
message: '请上传时段报表照片',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const style = computed(() => {
|
|
||||||
const style = {}
|
|
||||||
style.bottom = addUnit(sys().windowBottom, 'px')
|
|
||||||
return style
|
|
||||||
})
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
// console.log(endDate);
|
|
||||||
getData()
|
|
||||||
})
|
|
||||||
|
|
||||||
const submit = () => {
|
|
||||||
formRef.value.validate().then((res) => {
|
|
||||||
modalRef.value.open()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function filterLotteryData(datas) {
|
|
||||||
return datas.filter((item) => {
|
|
||||||
if (empty(item.sales) && empty(item.expenditure)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeEmptyValues(datas) {
|
|
||||||
return datas
|
|
||||||
.map((item) => {
|
|
||||||
// 过滤出空值的属性
|
|
||||||
const filteredItem = Object.entries(item)
|
|
||||||
.filter(([key, value]) => !empty(value))
|
|
||||||
.reduce((acc, [key, value]) => {
|
|
||||||
acc[key] = value
|
|
||||||
return acc
|
|
||||||
}, {})
|
|
||||||
|
|
||||||
return filteredItem
|
|
||||||
})
|
|
||||||
.filter((item) => Object.keys(item).length !== 0) // 移除所有属性都为空的对象
|
|
||||||
}
|
|
||||||
const onSubmit = async () => {
|
|
||||||
let valid = false
|
|
||||||
filterLotteryData(form.items).forEach((item) => {
|
|
||||||
if (!item.sales) {
|
|
||||||
valid = true
|
|
||||||
return uni.showToast({
|
|
||||||
title: `请填写${item.name}销售金额`,
|
|
||||||
icon: 'none',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!item.expenditure) {
|
|
||||||
valid = true
|
|
||||||
return uni.showToast({
|
|
||||||
title: `请填写${item.name}兑奖金额`,
|
|
||||||
icon: 'none',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (valid) return
|
|
||||||
|
|
||||||
const params = {
|
|
||||||
date: form.date,
|
|
||||||
sales: form.sales,
|
|
||||||
expenditure: form.expenditure,
|
|
||||||
handover_amount: form.handover_amount,
|
|
||||||
new_customers: form.new_customers,
|
|
||||||
photos: form.photos.map((item) => item.url),
|
|
||||||
items: filterLotteryData(form.items),
|
|
||||||
}
|
|
||||||
http
|
|
||||||
.request({
|
|
||||||
url: '/ledgers',
|
|
||||||
method: 'POST',
|
|
||||||
header: {
|
|
||||||
Accept: 'application/json',
|
|
||||||
},
|
|
||||||
data: params,
|
|
||||||
})
|
|
||||||
.then((res) => {
|
|
||||||
uni.$emit('refresh')
|
|
||||||
uni.showToast({
|
|
||||||
title: '提交成功',
|
|
||||||
icon: 'none',
|
|
||||||
})
|
|
||||||
if (props.isBack) {
|
|
||||||
uni.navigateBack()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const getData = async () => {
|
|
||||||
const resData = await http.get(`/ledgers/${form.date}`)
|
|
||||||
|
|
||||||
Object.assign(form, resData, {
|
|
||||||
photos:
|
|
||||||
resData?.photos?.map((item) => {
|
|
||||||
return { url: item }
|
|
||||||
}) || [],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const getTypeList = () => {
|
|
||||||
http
|
|
||||||
.get('/keywords', {
|
|
||||||
params: {
|
|
||||||
parent_key: 'lottery_type',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.then((res) => {
|
|
||||||
form.items = res
|
|
||||||
res.forEach((item, i) => {
|
|
||||||
rules[`items.${i}.${'sales'}`] = {
|
|
||||||
required: true,
|
|
||||||
message: `请输入${item.name}销售金额`,
|
|
||||||
}
|
|
||||||
rules[`items.${i}.${'expenditure'}`] = {
|
|
||||||
required: true,
|
|
||||||
message: `请输入${item.name}兑奖金额`,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const calendarsConfirm = (e) => {
|
|
||||||
form.date = e.fulldate
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
|
|
||||||
const showDateSelect = () => {
|
|
||||||
calendars.value.open()
|
|
||||||
hideKeyboard()
|
|
||||||
}
|
|
||||||
|
|
||||||
const hideKeyboard = () => {
|
|
||||||
uni.hideKeyboard()
|
|
||||||
}
|
|
||||||
|
|
||||||
const afterRead = async (event) => {
|
|
||||||
let lists = [].concat(event.file)
|
|
||||||
let fileListLen = form[event.name].length
|
|
||||||
|
|
||||||
lists.map((item) => {
|
|
||||||
form[event.name].push({
|
|
||||||
...item,
|
|
||||||
status: 'uploading',
|
|
||||||
message: '上传中',
|
|
||||||
})
|
|
||||||
})
|
|
||||||
for (let i = 0; i < lists.length; i++) {
|
|
||||||
const result = await uploadFilePromise(lists[i].url)
|
|
||||||
let item = form[event.name][fileListLen]
|
|
||||||
form[event.name].splice(
|
|
||||||
fileListLen,
|
|
||||||
1,
|
|
||||||
Object.assign(item, {
|
|
||||||
status: 'success',
|
|
||||||
message: '',
|
|
||||||
url: result,
|
|
||||||
})
|
|
||||||
)
|
|
||||||
fileListLen++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const uploadFilePromise = (url) => {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
http
|
|
||||||
.upload('/fileupload', {
|
|
||||||
filePath: url,
|
|
||||||
name: 'file',
|
|
||||||
})
|
|
||||||
.then((res) => {
|
|
||||||
resolve(res.url)
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
reject(err)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const deletePic = (event) => {
|
|
||||||
form[event.name].splice(event.index, 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const salesChange = async () => {
|
|
||||||
await nextTick()
|
|
||||||
const val = form?.items || []
|
|
||||||
const sales = val.reduce((a, b) => {
|
|
||||||
if (b.operator == '-') return sub(a, b?.sales ?? 0)
|
|
||||||
else if (b.operator == '+') return add(a, b?.sales ?? 0)
|
|
||||||
return a
|
|
||||||
}, 0)
|
|
||||||
|
|
||||||
form.sales = sales || 0
|
|
||||||
}
|
|
||||||
|
|
||||||
const expenditureChange = async () => {
|
|
||||||
await nextTick()
|
|
||||||
const val = form?.items || []
|
|
||||||
const expenditure = val.reduce((a, b) => {
|
|
||||||
if (b.operator == '-') return sub(a, b?.expenditure ?? 0)
|
|
||||||
else if (b.operator == '+') return add(a, b?.expenditure ?? 0)
|
|
||||||
return a
|
|
||||||
}, 0)
|
|
||||||
form.expenditure = expenditure || 0
|
|
||||||
}
|
|
||||||
|
|
||||||
watch(
|
|
||||||
() => form.items,
|
|
||||||
(val) => {
|
|
||||||
// const sales = val.reduce((a, b) => {
|
|
||||||
// return add(a, b?.sales ?? 0)
|
|
||||||
// }, 0)
|
|
||||||
// const expenditure = val.reduce((a, b) => {
|
|
||||||
// return add(a, b?.expenditure ?? 0)
|
|
||||||
// }, 0)
|
|
||||||
// form.sales = sales || null
|
|
||||||
// form.expenditure = expenditure || null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
immediate: true,
|
|
||||||
deep: true,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onLoad } from "@dcloudio/uni-app";
|
import { onLoad } from "@dcloudio/uni-app";
|
||||||
import RevertPage from "@/pages/revert/index";
|
import RevertPage from "@/pages/revert/base";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
|
|
||||||
const date = ref("")
|
const date = ref("")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue