修改bug

main
ihzero 2024-05-27 00:24:08 +08:00
parent 38a84af88f
commit ea604057f4
4 changed files with 507 additions and 496 deletions

View File

@ -3,10 +3,12 @@
"version": "0.0.0",
"scripts": {
"dev:app": "uni -p app",
"dev:app:pro": "uni -p app --mode production",
"dev:app-android": "uni -p app-android",
"dev:app-ios": "uni -p app-ios",
"dev:custom": "uni -p",
"dev:h5": "uni",
"dev:h5:pro": "uni --mode production",
"dev:h5:ssr": "uni --ssr",
"dev:mp-alipay": "uni -p mp-alipay",
"dev:mp-baidu": "uni -p mp-baidu",

View File

@ -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>

View File

@ -1,502 +1,9 @@
<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>
<Base/>
</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,
}
)
import Base from './base.vue'
</script>

View File

@ -5,7 +5,7 @@
</template>
<script setup>
import { onLoad } from "@dcloudio/uni-app";
import RevertPage from "@/pages/revert/index";
import RevertPage from "@/pages/revert/base";
import { ref } from "vue";
const date = ref("")