业务办理

This commit is contained in:
hongchao 2025-02-19 14:08:54 +08:00
parent 14057b3dcb
commit ef7ecf76e1
2 changed files with 378 additions and 92 deletions

View File

@ -22,19 +22,6 @@
@clear="clearPro"
></eselect>
</uni-forms-item>
<uni-row :gutter="30" style="display: flex; align-items: center;margin-bottom: 10px;">
<uni-col :span="15">
<uni-forms-item label="开始时间" name="reduceStartTime" label-width="90rpx" >
<uni-datetime-picker type="date" :clear-icon="false" v-model="formData.reduceStartTime" @change="changeStartTime"/>
</uni-forms-item>
</uni-col>
<uni-col :span="15">
<uni-forms-item label="结束时间" name="reduceEndTime" label-width="90rpx" >
<uni-datetime-picker type="date" :clear-icon="false" v-model="formData.reduceEndTime" @change="changeEndTime"/>
</uni-forms-item>
</uni-col>
</uni-row>
<uni-row :gutter="30" style="display: flex; align-items: center;margin-bottom: 10px;">
<uni-col :span="15">
@ -55,7 +42,20 @@
</uni-forms-item>
</uni-col>
</uni-row>
<uni-forms-item label="附件">
<uni-row :gutter="30" style="display: flex; align-items: center;margin-bottom: 10px;">
<uni-col :span="15">
<uni-forms-item label="开始时间" name="reduceStartTime" label-width="90rpx" >
<uni-datetime-picker type="date" :clear-icon="false" v-model="formData.reduceStartTime" @change="changeStartTime"/>
</uni-forms-item>
</uni-col>
<uni-col :span="15">
<uni-forms-item label="结束时间" name="reduceEndTime" label-width="90rpx" >
<uni-datetime-picker type="date" :clear-icon="false" v-model="formData.reduceEndTime" @change="changeEndTime"/>
</uni-forms-item>
</uni-col>
</uni-row>
<uni-forms-item label="附件">
<div class="upload-wrapper" style="display: flex; flex-wrap: wrap;">
<!-- 上传按钮仅当上传图片数量少于 3 张时显示 -->
<div class="upload" @click="uploadImg" v-if="bmFileInfos.length < 3">+</div>
@ -68,11 +68,14 @@
</div>
</div>
</div>
</uni-forms-item>
</uni-forms-item>
<uni-row :gutter="24" style="display: flex; align-items: center;margin-bottom: 10px;">
<uni-col :span="8">
<view class="addBtn" @click="submitNum">减免申请</view>
</uni-col>
<uni-col :span="8">
<view class="addBtn" @click="handleClean" v-if="num1>0">一键去除</view>
</uni-col>
</uni-row>
</uni-forms>
</div>
@ -96,10 +99,10 @@
<!-- 表格数据行 -->
<uni-tr v-for="(item,index) in typeList" :key="item.id">
<uni-td style="font-size: 24rpx;text-align: center;">
<uni-datetime-picker type="date" :clear-icon="false" v-model="item.reduceStartTime" />
<uni-datetime-picker type="date" :key="componentKey" :clear-icon="false" v-model="item.reduceStartTime" @change="(e) =>updateReduceStart(item,e)"/>
</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">
<uni-datetime-picker type="date" :clear-icon="false" v-model="item.reduceEndTime" />
<uni-datetime-picker type="date" :key="componentKey" :clear-icon="false" v-model="item.reduceEndTime" @change="(e) =>updateReduceEnd(item,e)"/>
</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">
<uni-easyinput
@ -133,7 +136,7 @@
</template>
<script setup >
import { ref, reactive } from 'vue'
import { ref, reactive,nextTick } from 'vue'
import eselect from '@/components/tree-select/eselect.vue'
import { onLoad,onReady } from '@dcloudio/uni-app'
import { getUnitList,getProjectList,getThreeType,getFourType,getDirefList,insertApp,getAgreementInfoById,getTypeDataList,leaseTask } from '../../services/back.js';
@ -163,11 +166,14 @@ const typeId = ref("")//类型
const maCodeSelectList = ref([])
const typeCode = ref("")//
const typeList = ref([])
const typeListTemp = ref([])
const bmFileInfos = ref([])//
// form
const form = ref(null)
const reduceStartTime = ref('')
const reduceEndTime = ref('')
const componentKey = ref(0)
const num1 = ref(0)
//
const rules = ref({
@ -346,6 +352,10 @@ const selectMaCode = (e) => {
const paramList = res.data
paramList.forEach(item => {
item.reduceNum = item.num;
item.reduceDays = 0;
item.reduceLeaseMoney = 0;
item.reduceStartTime = null;
item.reduceEndTime = null;
typeList.value.push(item)
})
}).catch(error => {
@ -368,64 +378,92 @@ const selectMaCode = (e) => {
console.log(typeList.value)
}
//
const submitNum = async() => {
const submitNum = () => {
console.log(typeList.value)
// 使
form.value.validate((valid)=>{
form.value.validate(async(valid)=>{
console.log('🚀 ~ submitNum ~ valid:', valid)
if(!valid){
// preNum 0
if (typeList.value.length === 0) {
console.log('🚀 ~ submitNum ~ typeList.value:', typeList.value)
uni.showToast({
title: '请添加减免申请数据',
icon: 'none',
})
return
}
for (let i = 0; i < typeList.value.length; i++) {
if (typeList.value[i].preNum <= 0 || !typeList.value[i].preNum) {
uni.showToast({
title: '预领数量不能为空或等于0',
if(bmFileInfos.value.length==0){
await uni.showToast({
title: '请上传附件!',
icon: 'none',
})
return
}
// reduceNum 0
if (typeList.value.length === 0) {
console.log('🚀 ~ submitNum ~ typeList.value:', typeList.value)
await uni.showToast({
title: '请添加减免申请数据',
icon: 'none',
})
return
}
}
let obj = {
"leaseApplyInfo":{
"unitId":unitId.value,
"projectId":proId.value,
"agreementId":agreementId.value,
"leasePerson":formData.value.leasePerson,
"phone":formData.value.phone,
"standardConfigId":configId.value,
"applyCode":formData.value.applyCode,
},
"leaseApplyDetailsList":typeList.value
}
console.log(obj)
leaseTask(obj).then( res => {
console.log(res)
if(res.code==200){
console.log('xxxxxxxxxxxxxxxx')
uni.showToast({ title: '申请成功', icon: 'none',duration: 1000
})
setTimeout(() => {
uni.navigateBack({
delta: 1
});
}, 1000);
}else{
console.log('yyyyyyyyyyyyy')
uni.showToast({ title: res.msg, icon: 'none',duration: 1000 })
}
}).catch(error => {
console.log(error)
})
let index = typeList.value.findIndex(item => new Date(item.reduceEndTime) < new Date(item.reduceStartTime))
let index2 = typeList.value.findIndex(item => item.reduceNum > item.num)
let index3 = typeList.value.findIndex(item => item.reduceNum == 0)
let index4 = typeList.value.findIndex(item => item.reduceStartTime==null || new Date(item.reduceStartTime).getTime()==0)
let index5 = typeList.value.findIndex(item => item.reduceEndTime==null || new Date(item.reduceEndTime).getTime()==0)
console.log(index,index2,index3,index4,index5)
if(index3>-1){
uni.showToast({
title: '减免数量不能为0',
icon: 'none',
duration: 1000
})
return
}else if(index4>-1){
uni.showToast({
title: '请先去除减免时间不符合的数据!',
icon: 'none',
duration: 1000
})
return
}else if(index5>-1){
uni.showToast({
title: '请先去除减免时间不符合的数据!',
icon: 'none',
duration: 1000
})
return
}else if(index2>-1){
uni.showToast({
title: '减免数量不能大于领料数量!',
icon: 'none',
duration: 1000
})
return
}else if(index>-1){
uni.showToast({
title: '结束时间不能小于开始时间!',
icon: 'none',
duration: 1000
})
return
}else{
uni.showToast({
title: '提交成功!',
icon: 'none',
duration: 1000
})
}
// for (let i = 0; i < typeList.value.length; i++) {
// if (typeList.value[i].reduceNum <= 0 || !typeList.value[i].reduceNum) {
// uni.showToast({
// title: '0',
// icon: 'none',
// })
// return
// }
// }
}else{
console.log('xxxxxxxxxxxxxxxxxxxxxxxxxx')
return;
}
})
@ -500,7 +538,9 @@ const changeStartTime = (e) => {
});
//
typeList.value = [...typeList.value];
}
updateNum();
// formData.value.reduceStartTime = e.detail.value
}
//
@ -571,6 +611,135 @@ const changeEndTime = (e) => {
});
//
typeList.value = [...typeList.value];
}
updateNum();
}
const updateReduceStart = (row,e) => {
console.log('🚀 ~ updateReduceStart ~ e:', e)
let startTime = new Date(row.reduceStartTime);
let startTimeTemp = row.reduceStartTime
let endTime = new Date(row.reduceEndTime);
let endTimeTemp = row.reduceEndTime
let pickStartTime = new Date(row.startTime);
let pickEndTime = new Date(row.endTime);
// 退
if (startTime < pickStartTime || startTime > pickEndTime) {
console.log(row.reduceStartTime, '....>');
row.reduceStartTime = null
row.reduceDays = 0
row.reduceLeaseMoney = 0
console.log('11111111111111111111111111111', row.reduceStartTime);
nextTick(() => {
//
typeList.value = [...typeList.value];
componentKey.value++;
uni.showToast({
title: '请选择有效的减免开始时间!',
icon: 'none',
duration: 1000
});
});
}else if (startTimeTemp!=null && endTimeTemp!=null && endTime >= startTime) {
const oneDay = 24 * 60 * 60 * 1000; //
const diffDays = Math.ceil(Math.abs((endTime - startTime) / oneDay)) + (endTime - startTime === 0 ? 1 : 1);
row.reduceDays = diffDays
if(row.reduceNum && row.reduceDays && row.leasePrice){
row.reduceLeaseMoney = row.reduceDays*row.leasePrice*row.reduceNum
}
// row.leaseDays = diffDays;
}else if(endTimeTemp!=null && endTime<startTime){
row.reduceStartTime = null
row.reduceDays = 0
row.reduceLeaseMoney = 0
nextTick(() => {
//
typeList.value = [...typeList.value];
componentKey.value++;
uni.showToast({
title: '请选择有效的减免开始时间!',
icon: 'none',
duration: 1000
});
});
}else{
row.reduceDays = 0
row.reduceLeaseMoney = 0
//
typeList.value = [...typeList.value];
}
//
typeList.value = [...typeList.value];
updateNum();
}
const updateReduceEnd = (row,e) => {
let startTime = new Date(row.reduceStartTime);
let startTimeTemp = row.reduceStartTime
let endTimeTemp = row.reduceEndTime
let endTime = new Date(row.reduceEndTime);
let pickStartTime = new Date(row.startTime);
let pickEndTime = new Date(row.endTime);
// 退
if( endTime < pickStartTime || endTime > pickEndTime){
row.reduceEndTime = null
row.reduceDays = 0
row.reduceLeaseMoney = 0
nextTick(() => {
//
typeList.value = [...typeList.value];
componentKey.value++;
uni.showToast({
title: '请选择有效的减免结束时间!',
icon: 'none',
duration: 1000
});
});
}else if (startTimeTemp!=null && endTimeTemp!=null && endTime >= startTime) {
const oneDay = 24 * 60 * 60 * 1000; //
const diffDays = Math.ceil(Math.abs((endTime - startTime) / oneDay)) + (endTime - startTime === 0 ? 1 : 1);
row.reduceDays = diffDays
if(row.reduceNum && row.reduceDays && row.leasePrice){
row.reduceLeaseMoney = row.reduceDays*row.leasePrice*row.reduceNum
}
}else if(startTimeTemp!=null && endTime<startTime){
row.reduceEndTime = null
row.reduceDays = 0
row.reduceLeaseMoney = 0
nextTick(() => {
//
typeList.value = [...typeList.value];
componentKey.value++;
uni.showToast({
title: '请选择有效的减免结束时间!',
icon: 'none',
duration: 1000
});
});
}else{
row.reduceDays = 0
row.reduceLeaseMoney = 0
//
typeList.value = [...typeList.value];
}
//
typeList.value = [...typeList.value];
updateNum();
}
const handleClean = () => {
//
typeList.value = typeList.value.filter((item, index) => {
return index === typeList.value.length - 1 || (item.reduceStartTime && item.reduceEndTime);
});
// //
updateNum();
}
const updateNum = () => {
if (formData.value.reduceStartTime && formData.value.reduceEndTime) {
num1.value= typeList.value.filter(item =>!item.reduceStartTime ||!item.reduceEndTime).length;
}
}
@ -591,34 +760,46 @@ onLoad((options) => {
})
//
const uploadImg = (item) => {
if(bmFileInfos.value.length>=3){
uni.showToast({
title: '最多上传3张图片',
icon: 'none',
})
return
}
uni.chooseImage({
count: 1, //
count: 3 - bmFileInfos.value.length, //
sizeType: ['original', 'compressed'], //original compressed
sourceType: ['album', 'camera',], //album camera 使
success: res => {
console.log(res)
let imgFiles = res.tempFilePaths //
imgFiles.forEach((filePath) => {
console.log('2222222222222222222222')
bmFileInfos.value.push({urlTemp:filePath})
})
console.log('🚀 ~ uploadImg ~ imgFiles:', imgFiles)
// imgBeseUrl.value = imgFiles[0]
// console.log('', imgFiles)
// console.log('', baseURL+"/file/upload")
bmFileInfos.value.forEach((item,index) => {
uni.uploadFile({
// url: baseURL+"/file/upload",//app
url: "/file/upload",//h5
filePath: imgFiles[0],
filePath: item.urlTemp,
name: 'file',
success: (res) => {
res = JSON.parse(res.data)
console.log('上传成功', res.code);
console.log('上传成功', res.data);
if(res.code&&res.code==200){
let obj = {
"name":res.data.name,
"url":res.data.url
}
item.bmFileInfos.value = [obj]
bmFileInfos.value[index] = {
...bmFileInfos.value[index],
name: res.data.name,
url: res.data.url
};
uni.showToast({ title: '上传成功', icon: 'none' })
}else{
item.bmFileInfos.value = []
uni.showToast({ title: '上传失败', icon: 'none' })
}
},
@ -626,10 +807,17 @@ const uploadImg = (item) => {
console.error('上传失败', err);
}
});
});
// this.$refs.vForm.clearValidate()
}
})
}
const deleteImg = (index) => {
bmFileInfos.value.splice(index, 1);
// bmFileInfosTemp.value.splice(index, 1);
};
//
const delRow = (index) => {
console.log(index)
@ -645,6 +833,7 @@ const onChangeNumber = (item) => {
setTimeout(()=>{
// item.directNum = Number(String(item.directNum).replace(/[^\d.]/g,''))
if (Number(item.reduceNum)<= 0) {
item.reduceNum = 0;
}
@ -654,6 +843,11 @@ const onChangeNumber = (item) => {
icon: 'none',
})
item.reduceNum = maxNum;
}else{
if(item.reduceNum && item.reduceDays && item.leasePrice){
item.reduceLeaseMoney = item.reduceDays*item.leasePrice*item.reduceNum
}
typeList.value = [...typeList.value];
}
},500)
}

View File

@ -2,7 +2,7 @@
<view class="accept page-common">
<div class="card">
<uni-forms :model="formData" ref="form" label-width="200rpx" :rule="rules.value" :border="true" >
<uni-forms-item label="领用单位" name="unitId" >
<uni-forms-item label="领用单位" name="unitId" >
<eselect
style="width: 100%; height: 90rpx"
v-model="formData.unitId"
@ -12,7 +12,7 @@
@clear="clearUnit"
></eselect>
</uni-forms-item>
<uni-forms-item label="领用工程" name="proId" >
<uni-forms-item label="领用工程" name="proId" >
<eselect
style="width: 100%; height: 90rpx"
v-model="formData.proId"
@ -22,16 +22,16 @@
@clear="clearPro"
></eselect>
</uni-forms-item>
<uni-forms-item label="采购申请编号" name="applyCode" >
<uni-forms-item label="采购申请编号" name="applyCode" >
<uni-easyinput v-model="formData.applyCode" maxlength="10" placeholder="请输入领料人" />
</uni-forms-item>
<uni-forms-item label="领料人" name="leasePerson" >
<uni-forms-item label="领料人" name="leasePerson" >
<uni-easyinput v-model="formData.leasePerson" maxlength="10" placeholder="请输入领料人" />
</uni-forms-item>
<uni-forms-item label="联系电话" name="phone" >
<uni-forms-item label="联系电话" name="phone" >
<uni-easyinput v-model="formData.phone" maxlength="11" placeholder="请输入联系电话" />
</uni-forms-item>
<uni-forms-item label="标准配置" name="configId" >
<uni-forms-item label="标准配置" name="configId" >
<eselect
style="width: 100%; height: 90rpx"
v-model="formData.configId"
@ -41,6 +41,20 @@
@clear="clearConfig"
></eselect>
</uni-forms-item>
<uni-forms-item label="附件" label-width="100rpx" v-if="flagFile">
<div class="upload-wrapper" style="display: flex; flex-wrap: wrap;">
<!-- 上传按钮仅当上传图片数量少于 3 张时显示 -->
<div class="upload" @click="uploadImg" v-if="bmFileInfos.length < 3">+</div>
<!-- 动态展示已上传的图片 -->
<div class="upload" @click="uploadImg" v-for="(img, index) in bmFileInfos" :key="index">
<div class="image-container">
<image :src="img.urlTemp" style="width: 160rpx;height: 160rpx;" mode=""></image>
<!-- 删除 logo这里用一个 span 模拟可替换为实际的 logo 图片 -->
<span class="delete-logo" @click.stop="deleteImg(index)">&times;</span>
</div>
</div>
</div>
</uni-forms-item>
</uni-forms>
</div>
<div class="card">
@ -152,9 +166,10 @@ const typeId = ref("")//类型
const maCodeSelectList = ref([])
const typeCode = ref("")//
const typeList = ref([])
const bmFileInfos = ref([])//
// form
const form = ref(null)
const flagFile = ref(false)
//
@ -242,6 +257,10 @@ const getUnit = () => {
}
//
const getProject = async (e) => {
flagFile.value = false
if (e.typeKey == 'fbs') {
flagFile.value = true
}
console.log('🚀 ~ getProject ~ e:', e)
unitId.value = e?.id || ''
formData.value.unitId = e?.id || ''
@ -402,15 +421,24 @@ const submitNum = async() => {
console.log(typeList.value)
// 使
form.value.validate((valid)=>{
form.value.validate(async(valid)=>{
console.log('🚀 ~ submitNum ~ valid:', valid)
if(!valid){
if(flagFile.value && bmFileInfos.value.length==0){
await uni.showToast({
title: '请上传附件',
icon: 'none',
duration: 1000
})
return
}
// preNum 0
if (typeList.value.length === 0) {
console.log('🚀 ~ submitNum ~ typeList.value:', typeList.value)
uni.showToast({
await uni.showToast({
title: '请添加申请数据',
icon: 'none',
duration: 1000
})
return
}
@ -419,6 +447,7 @@ const submitNum = async() => {
uni.showToast({
title: '预领数量不能为空或等于0',
icon: 'none',
duration: 1000
})
return
}
@ -432,7 +461,7 @@ const submitNum = async() => {
"phone":formData.value.phone,
"standardConfigId":configId.value,
"applyCode":formData.value.applyCode,
"bmFileInfos": bmFileInfos.value,
},
"leaseApplyDetailsList":typeList.value
}
@ -480,34 +509,46 @@ onLoad((options) => {
})
//
const uploadImg = (item) => {
if(bmFileInfos.value.length>=3){
uni.showToast({
title: '最多上传3张图片',
icon: 'none',
})
return
}
uni.chooseImage({
count: 1, //
count: 3 - bmFileInfos.value.length, //
sizeType: ['original', 'compressed'], //original compressed
sourceType: ['album', 'camera',], //album camera 使
success: res => {
console.log(res)
let imgFiles = res.tempFilePaths //
imgFiles.forEach((filePath) => {
console.log('2222222222222222222222')
bmFileInfos.value.push({urlTemp:filePath})
})
console.log('🚀 ~ uploadImg ~ imgFiles:', imgFiles)
// imgBeseUrl.value = imgFiles[0]
// console.log('', imgFiles)
// console.log('', baseURL+"/file/upload")
bmFileInfos.value.forEach((item,index) => {
uni.uploadFile({
// url: baseURL+"/file/upload",//app
url: "/file/upload",//h5
filePath: imgFiles[0],
filePath: item.urlTemp,
name: 'file',
success: (res) => {
res = JSON.parse(res.data)
console.log('上传成功', res.code);
console.log('上传成功', res.data);
if(res.code&&res.code==200){
let obj = {
"name":res.data.name,
"url":res.data.url
}
item.bmFileInfos.value = [obj]
bmFileInfos.value[index] = {
...bmFileInfos.value[index],
name: res.data.name,
url: res.data.url
};
uni.showToast({ title: '上传成功', icon: 'none' })
}else{
item.bmFileInfos.value = []
uni.showToast({ title: '上传失败', icon: 'none' })
}
},
@ -515,10 +556,16 @@ const uploadImg = (item) => {
console.error('上传失败', err);
}
});
});
// this.$refs.vForm.clearValidate()
}
})
}
const deleteImg = (index) => {
bmFileInfos.value.splice(index, 1);
// bmFileInfosTemp.value.splice(index, 1);
};
//
const delRow = (index) => {
console.log(index)
@ -736,4 +783,49 @@ const clearConfig = () => {
}
}
}
//
.upload {
width: 160rpx;
height: 160rpx;
background-color: #f7f8fa;
border: 2rpx dashed #d9d9d9;
border-radius: 12rpx;
display: flex;
justify-content: center;
align-items: center;
font-size: 48rpx;
color: #bfbfbf;
transition: all 0.3s ease;
&:active {
background-color: #f0f0f0;
border-color: #3784fb;
}
image {
width: 100%;
height: 100%;
border-radius: 12rpx;
object-fit: cover;
}
}
.image-container {
position: relative;
display: inline-block;
}
.delete-logo {
position: absolute;
top: 5px;
right: 5px;
font-size: 20px;
color: white;
background-color: rgba(0, 0, 0, 0.5);
border-radius: 50%;
width: 20px;
height: 20px;
line-height: 20px;
text-align: center;
cursor: pointer;
}
</style>