<template>
<view class="viewport">
<!-- 上 -->
<view class="top-box">
<!-- tab -->
<view class="tabs">
<text
v-for="(item, index) in tabArr"
:key="item.id"
class="text"
:class="{ active: index === activeIndex }"
@tap="handleClickTab(item, index)"
>{{ item.title }}</text
>
</view>
<!-- tab的scroll-view -->
<scroll-view
v-for="(val, index) in tabArr"
:key="val.id"
v-show="activeIndex === index"
:scroll-y="true"
class="scroll-view"
>
<view v-show="activeIndex === 0" class="base-box">
<uni-section title="基本信息核对"></uni-section>
<view class="base-text-box">
<view>姓名:{{ itemData?.applyName }}</view>
<view>性别:{{ changeSex(itemData?.sex) }}</view>
<view>年龄:{{ itemData?.age }}</view>
<view>
<text>现居住地址:</text>
<text>{{ itemData?.address }}</text>
</view>
</view>
</view>
<view v-show="activeIndex === 1" class="contract-content-box">
<!-- 新增按钮 -->
<view class="new-add-btn">
<u-button type="primary" shape="square" text="新增" @click="addNewData"></u-button>
</view>
<!-- 列表 -->
<view class="item-wrap">
<view class="item-box" v-for="item in remodelProductArr" :key="item.id">
<view class="item-content">
<view class="product-title">
<text style="margin-right: 20rpx">产品名称</text>
</view>
<view class="product-content">
<text style="margin-right: 20rpx">{{ item?.name }}</text>
</view>
</view>
<view class="item-content">
<view class="product-title">
<text style="margin-right: 20rpx">单价(元)</text>
</view>
<view class="product-content">
<text style="margin-right: 20rpx">{{ item?.unitPrice }}</text>
</view>
</view>
<view class="item-content">
<view class="product-title">
<text style="margin-right: 20rpx">数量</text>
</view>
<view class="product-content">
<text style="margin-right: 20rpx">{{ item?.number }}</text>
</view>
</view>
<view class="item-content">
<view class="product-title">
<text style="margin-right: 20rpx">总价(元)</text>
</view>
<view class="product-content">
<text style="margin-right: 20rpx; color: red">{{ item?.totalPrice }}</text>
</view>
</view>
<view class="item-content">
<view class="product-title">
<text style="margin-right: 20rpx">施工单位</text>
</view>
<view class="product-content">
<text style="margin-right: 20rpx">{{ item?.constructionUnit }}</text>
</view>
</view>
<!-- 编辑-删除按钮 -->
<view class="btn-box">
<view class="look-more" @click="onClicKLookMore(item)">查看更多</view>
<view class="btn-content-box">
<view>
<u-button
type="success"
shape="square"
text="编辑"
@click="onEdit(item)"
></u-button>
</view>
<view>
<u-button
type="error"
shape="square"
text="删除"
@click="onDelete(item)"
></u-button>
</view>
</view>
</view>
</view>
</view>
</view>
<view v-show="activeIndex === 2" class="service-plan-box">
<uni-section title="改造前照片"></uni-section>
<!-- 选择图片 -->
<view class="before-img-box">
<uni-file-picker
@select="handleSelectImg"
@delete="handleDeleteImg"
:auto-upload="false"
v-model="beforeImageValueArr"
fileMediatype="image"
mode="grid"
limit="9"
title="最多选择9张图片"
></uni-file-picker>
</view>
<uni-section title="改造后照片"></uni-section>
<view class="before-img-box">
<uni-file-picker
v-model="afterImageValueArr"
fileMediatype="image"
mode="grid"
@select="handleSelectImg2"
@delete="handleDeleteImg2"
limit="9"
title="最多选择9张图片"
></uni-file-picker>
</view>
</view>
</scroll-view>
</view>
<!-- 下 -->
<view class="bottom-box">
<view v-show="activeIndex === 1" class="bottom-price-box">
<view class="item-content">
<view class="product-title">
<text style="margin-right: 20rpx">总价(元)</text>
</view>
<view class="product-content">
<text style="margin-right: 20rpx; color: red">{{ itemData?.totalPrice }}</text>
</view>
</view>
</view>
<!-- 按钮-保存-提交 -->
<view class="btn-box">
<view class="btn-save">
<u-button type="primary" shape="circle" text="保存" @click="onSave"></u-button>
</view>
<view class="btn-submit">
<u-button
color="#f59a23"
type="primary"
shape="circle"
text="提交验收"
@click="onSubmit"
></u-button>
</view>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import { onLoad, onReady, onShow } from "@dcloudio/uni-app"
import { nextTick, ref } from "vue"
import { getElderlyChangeDetailDataByIdAPI, deleteElderlyChangeDataAPI } from "@/services/change"
// --------改造前-图片------------
const beforeImageValueArr: any = ref([])
const afterImageValueArr: any = ref([])
const imgMain: any = ref([])
// --------改造 临时图片数组------------
const tempBeforeImageValueArr: any = ref([])
const tempAfterImageValueArr: any = ref([])
// -------适老化产品------------
const remodelProductArr: any = ref([])
// -------弹框--------------
const isTankuang = ref(false)
const tankuangTableData: any = ref([])
// -------表格-----------
const itemTableData: any = ref([])
// 时间选择事件
const qiandingDateClick = (e: any) => {
console.log("点击时间改变事件:e", e)
baseFormData.value.qiandingDate = e
}
const hetongStartDateClick = (e: any) => {
console.log("点击时间改变事件:e", e)
baseFormData.value.hetongStartDate = e
}
const hetongEndDateClick = (e: any) => {
console.log("点击时间改变事件:e", e)
baseFormData.value.hetongEndDate = e
}
// -----------表单---------------
// 表单总数据
const baseFormData = ref({
hetongbianhao: "",
qiandingshijian: "",
hetongkaishishijian: "",
hetongjieshushijian: "",
jiafangxingming: "",
jiafanglianxidianhua: "",
jiafanglianxidizhi: "",
yifangxingming: "",
yifanglianxidianhua: "",
yifanglianxidizhi: "",
// 选择时间
qiandingDate: "",
hetongStartDate: "",
hetongEndDate: "",
})
// -------------------
// 高亮的下标
const activeIndex = ref(2)
// 老人id
const peopleId = ref()
// 详情
const itemData = ref()
const tabArr = ref([
{
id: 0,
title: "基本信息",
},
{
id: 1,
title: "适老化产品",
},
{
id: 2,
title: "改造前后照片",
},
])
// 页面第1次加载生命周期
onLoad((option) => {
console.log(option, "<<<=== option 页面跳转-传递参数")
peopleId.value = option!.itemDataId
// 发请求拿到详细信息
getList()
})
// 页面第1次全部渲染完毕后调用这个生命周期
onReady(() => {})
// 点击tab
const handleClickTab = (item: any, index: any) => {
console.log(item, "点击tab拿到的item")
console.log(index, "点击tab拿到的index")
activeIndex.value = index
}
// 将字典数据变成文字-性别
const changeSex = (data: string) => {
if (data === "0") {
return "男"
} else if (data === "1") {
return "女"
} else {
return "未知"
}
}
// 点击提交
const onSubmit = () => {}
// 点击服务频率
const onClickServiceFrequency = (data: any, index: any) => {
isTankuang.value = true
console.log(data, "点击服务频率-data")
tankuangTableData.value = data.serviceTimeList
console.log(tankuangTableData.value, "tankuangTableData.value")
}
// 点击全局弹框的关闭icon
const onClickCloseIcon = () => {
isTankuang.value = false
}
// 点击保存按钮
const onSave = () => {}
// 点击新增按钮
const addNewData = () => {
// 跳转到新增页面
uni.navigateTo({
url:
"/pages/change/add-edit?itemDataId=" + encodeURIComponent(JSON.stringify(itemData.value.id)),
})
}
// ----------方法----------------
// 拿数组数据
const getList = () => {
getElderlyChangeDetailDataByIdAPI(peopleId.value)
.then((res: any) => {
// console.log(res, "<<<=== res 改造 详细信息 请求成功")
itemData.value = res.elderlyOrientedInfo
// console.log(itemData.value, "<<<=== itemData 改造 详细信息")
remodelProductArr.value = res.elderlyOrientedInfo.elderlyOrientedRemodelProductList
// console.log(remodelProductArr.value, "<<<=== remodelProductArr 改造 产品列表")
// 拿到改造前的图片数组
tempBeforeImageValueArr.value = res.elderlyOrientedInfo.beforeElderlyRemodelGalleryList
tempAfterImageValueArr.value = res.elderlyOrientedInfo.afterElderlyRemodelGalleryList
// console.log(tempBeforeImageValueArr.value, "<<<=== tempBeforeImageValueArr 临时图片数组")
// 对临时数组进行改造
beforeImageValueArr.value = tempBeforeImageValueArr.value.map((item: any) => {
return {
extname: "",
url: item.imgUrl,
name: item.name,
}
})
afterImageValueArr.value = tempAfterImageValueArr.value.map((item: any) => {
return {
extname: "",
url: item.imgUrl,
name: item.name,
}
})
console.log(
afterImageValueArr.value,
"<<<=== afterImageValueArr 图片数组-数据改造后----->初始化",
)
console.log(
beforeImageValueArr.value,
"<<<=== beforeImageValueArr 图片数组-数据改造后----->初始化",
)
})
.catch((error) => {
console.log(error, "<<<=== error 请求失败")
})
}
// 改造前-图片上传
const handleSelectImg = (res: any) => {
console.log("选择图片")
// console.log(res, "点击上传图片-res")
// console.log(res.tempFilePaths, "点击上传图片-e---tempFilePaths 数组")
// 图片上传后,拿到临时文件路径,用uni.uploadFile方法上传
const p = new Promise((resolve, reject) => {
// 执行异步和同步代码
uni.uploadFile({
url: "/file/upload",
name: "file",
filePath: res.tempFilePaths[0],
success: (res) => {
// console.log(res, "<<<=== res 服务器返回的信息")
if (res.statusCode === 200) {
// 状态码为200,说明上传成功了
const urlData = JSON.parse(res.data)
resolve(urlData)
// console.log(urlData, "<<<=== urlData 服务器返回的图片信息")
// beforeImageValueArr.value.push({
// url: urlData.data.url,
// extname: "",
// name: urlData.data.name,
// })
// console.log(beforeImageValueArr.value, "<<<=== beforeImageValueArr.value-图片数组1")
// serviceBackImg.value = urlData.data.url
// console.log(serviceBackImg.value, "<<<=== serviceBackImg.value 服务器返回的图片url")
}
},
fail: (error) => {
console.log(error, "<<<=== error 错误信息")
reject(error)
},
})
})
p.then((res: any) => {
console.log(res, "<<<=== res promise的实例对象-p")
beforeImageValueArr.value.push({
url: res.data.url,
extname: "",
name: res.data.name,
})
console.log(
beforeImageValueArr.value,
"<<<=== beforeImageValueArr 图片数组-----------> 异步处理后",
)
}).catch((error) => {
console.log(error, "<<<=== error 错误信息")
})
}
// 改造后-图片上传
const handleSelectImg2 = (res: any) => {
console.log("选择图片")
// console.log(res, "点击上传图片-res")
// console.log(res.tempFilePaths, "点击上传图片-e---tempFilePaths 数组")
// 图片上传后,拿到临时文件路径,用uni.uploadFile方法上传
const p = new Promise((resolve, reject) => {
// 执行异步和同步代码
uni.uploadFile({
url: "/file/upload",
name: "file",
filePath: res.tempFilePaths[0],
success: (res) => {
// console.log(res, "<<<=== res 服务器返回的信息")
if (res.statusCode === 200) {
// 状态码为200,说明上传成功了
const urlData = JSON.parse(res.data)
resolve(urlData)
// console.log(urlData, "<<<=== urlData 服务器返回的图片信息")
// beforeImageValueArr.value.push({
// url: urlData.data.url,
// extname: "",
// name: urlData.data.name,
// })
// console.log(beforeImageValueArr.value, "<<<=== beforeImageValueArr.value-图片数组1")
// serviceBackImg.value = urlData.data.url
// console.log(serviceBackImg.value, "<<<=== serviceBackImg.value 服务器返回的图片url")
}
},
fail: (error) => {
console.log(error, "<<<=== error 错误信息")
reject(error)
},
})
})
p.then((res: any) => {
console.log(res, "<<<=== res promise的实例对象-p")
afterImageValueArr.value.push({
url: res.data.url,
extname: "",
name: res.data.name,
})
console.log(
afterImageValueArr.value,
"<<<=== afterImageValueArr 图片数组-----------> 异步处理后",
)
}).catch((error) => {
console.log(error, "<<<=== error 错误信息")
})
}
// -----------删除图片--------------------
const handleDeleteImg = (e: any) => {
console.log(e, "<<<=== e 点击-删除图片")
console.log(beforeImageValueArr.value, "<<<=== beforeImageValueArr 图片数组-----------> 删除后")
const deleteItemName = e.tempFile.name
// 根据名字找下标
const index = beforeImageValueArr.value.findIndex((item: any) => {
if (item.path) {
console.log("进入本地")
return item.url === e.tempFilePath
}
// if (!e.tempFile.url.startsWith("http://tmp")) {
// console.log("进入本地")
// return item.url === e.tempFilePath
// }
const one = item.name.split("_")
// console.log(one, "<<<=== one 图片名字")
const two = one[1].split(".")
// console.log(two, "<<<=== two 图片名字")
const wanzheng = one[0] + "." + two[1]
console.log(wanzheng, "<<<=== wanzheng 图片名字")
// console.log(item.name, "<<<=== item.name 查询名字")
// console.log(deleteItemName, "<<<=== deleteItemName 删除的图片地址名字")
return wanzheng === deleteItemName
})
console.log(index, "<<<=== index 删除的图片下标")
beforeImageValueArr.value.splice(index, 1)
console.log(
beforeImageValueArr.value,
"<<<=== beforeImageValueArr 图片数组-----------> 根据index 删除后",
)
}
const handleDeleteImg2 = (e: any) => {
console.log(e, "<<<=== e 点击-删除图片")
console.log(afterImageValueArr.value, "<<<=== afterImageValueArr 图片数组-----------> 删除后")
const deleteItemName = e.tempFile.name
// 根据名字找下标
const index = afterImageValueArr.value.findIndex((item: any) => {
if (item.path) {
console.log("进入本地")
return item.url === e.tempFilePath
}
// if (!e.tempFile.url.startsWith("http://tmp")) {
// console.log("进入本地")
// return item.url === e.tempFilePath
// }
const one = item.name.split("_")
// console.log(one, "<<<=== one 图片名字")
const two = one[1].split(".")
// console.log(two, "<<<=== two 图片名字")
const wanzheng = one[0] + "." + two[1]
console.log(wanzheng, "<<<=== wanzheng 图片名字")
// console.log(item.name, "<<<=== item.name 查询名字")
// console.log(deleteItemName, "<<<=== deleteItemName 删除的图片地址名字")
return wanzheng === deleteItemName
})
console.log(index, "<<<=== index 删除的图片下标")
afterImageValueArr.value.splice(index, 1)
console.log(
afterImageValueArr.value,
"<<<=== afterImageValueArr 图片数组-----------> 根据index 删除后2",
)
}
// 点击编辑按钮
const onEdit = (data: any) => {
console.log("onEdit -点击编辑按钮")
console.log(data, "data -点击编辑--当前item的数据")
// 跳转到编辑页面-和新增公用一个页面
uni.navigateTo({
url: "/pages/change/add-edit?editData=" + encodeURIComponent(JSON.stringify(data)),
})
}
// 点击删除按钮
const onDelete = (data: any) => {
console.log("onDelete -点击删除按钮")
console.log(data, "data -点击删除--当前item的数据")
console.log([data.id], "data -点击删除--[data.homeBedApplyId]")
deleteElderlyChangeDataAPI([data.id])
.then((res: any) => {
console.log(res, "<<<=== res 删除 请求成功")
uni.showToast({
title: "删除成功",
icon: "success",
duration: 1000,
})
setTimeout(() => {
// 重新请求数据
getList()
}, 500)
})
.catch((error: any) => {
console.log(error, "<<<=== error 请求失败")
})
}
// 点击查看更多
const onClicKLookMore = (data: any) => {
console.log("onClicKLookMore -点击查看更多")
console.log(data, "data -点击查看更多--当前item的数据")
uni.navigateTo({
url: "/pages/change/look-more?itemData=" + encodeURIComponent(JSON.stringify(data)),
})
}
// -----------生命周期---------------
onShow(() => {
console.log("onShow 生命周期----当前页面显示在前台了")
// getList()
})
</script>
<style lang="scss">
page {
height: 100%;
overflow: hidden;
}
.viewport {
height: 100%;
font-size: 14px;
display: flex;
flex-direction: column;
justify-content: space-around;
// background-color: #f2f2f2;
// overflow: hidden;
// position: relative;
// border: 1px solid orangered;
}
.tabs {
display: flex;
justify-content: space-evenly;
height: 100rpx;
line-height: 90rpx;
margin: 20rpx 20rpx 0rpx 20rpx;
font-size: 28rpx;
border-radius: 10rpx;
box-shadow: 0 4rpx 5rpx rgba(200, 200, 200, 0.3);
color: #333;
background-color: #fff;
position: relative;
z-index: 9;
.text {
margin: 0 20rpx;
position: relative;
}
.active {
&::after {
content: "";
width: 40rpx;
height: 4rpx;
transform: translate(-50%);
background-color: #27ba9b;
position: absolute;
left: 50%;
bottom: 24rpx;
}
}
}
.contract-content-box {
flex: 1;
position: relative;
}
.service-plan-box {
flex: 1;
}
.btn-box {
// border: 1px solid red;
margin-bottom: 20rpx;
display: flex;
flex-direction: row;
.btn-save {
padding: 0 20rpx;
width: 400rpx;
}
.btn-submit {
padding: 0 20rpx;
width: 400rpx;
}
}
// 下部分
.bottom-box {
background-color: #fafafa;
width: 750rpx;
border: 1px solid blue;
display: flex;
flex-direction: column;
// justify-content: space-between;
}
.top-box {
height: 100%;
flex: 1;
width: 750rpx;
// border: 1px solid orangered;
display: flex;
flex-direction: column;
}
.scroll-view {
margin-top: 10rpx;
height: calc(100vh - 360rpx);
// height: 100%;
// height: 500rpx;
// flex: 1;
overflow-y: auto; //可写可不写
border: 1px solid green;
}
// 基本信息的滚动区域
.base-box {
height: 100%;
overflow-y: auto;
// background-color: pink;
}
// 适老化产品-滚动区域
.contract-content-box {
height: 100%;
overflow-y: auto;
// background-color: orange;
}
// 服务计划的滚动区域
.service-plan-box {
height: 100%;
// background-color: greenyellow;
overflow-y: auto;
}
// ------签名---------------
.ok-btn {
width: 100rpx;
height: 60rpx;
margin-right: 20rpx;
}
// canvas盒子
.canvas-box {
width: 300rpx;
height: 200rpx;
border: 1px dashed blue;
margin: auto;
}
// 图片
.img-box {
display: block;
border: 1px dashed red;
width: 300rpx;
height: 200rpx;
margin: auto;
}
// -------------
.base-text-box {
background-color: #fff;
padding: 10px 10px 10px 10px;
}
// 标题模块改背景颜色
.uni-section {
background-color: #f2f2f2 !important;
}
// -------表格------------
.uni-table-tr:first-child {
background-color: #0285bd !important;
.uni-table-th {
color: #fff !important;
}
}
// -------弹框---------------
// ---------新增按钮------------------
.new-add-btn {
z-index: 9999;
width: 710rpx;
background-color: #f2f2f2;
position: fixed;
top: 132rpx;
left: 20rpx;
}
.item-content {
display: flex;
flex-direction: row;
// justify-content: space-between;
.product-title {
width: 155rpx;
display: flex;
flex-direction: row;
justify-content: flex-end;
}
.product-content {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
}
// -----------元素------------------
.item-box {
padding-top: 20rpx;
padding-bottom: 20rpx;
margin: 20rpx;
position: relative;
// border: 1px solid rgb(212, 206, 206);
border-radius: 10rpx;
background-color: #ffffff;
}
.item-box::after {
content: "";
position: absolute;
width: 690rpx;
height: 1px;
border-bottom: 1px dashed #c0b9b9;
left: 10rpx;
top: 220rpx;
z-index: 999;
}
//-----------编辑 删除 按钮------------------------
.btn-box {
border: 1px solied red;
margin-top: 50rpx;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.btn-content-box {
width: 260rpx;
// border: 1px solid red;
display: flex;
flex-direction: row;
justify-content: space-between;
margin-right: 50rpx;
}
.look-more {
margin-left: 50rpx;
}
.item-wrap {
border: 1px solid red;
background-color: #f2f2f2;
margin-top: 80rpx;
}
// -----------底部价格-----------------------------
.bottom-price-box {
padding-right: 20rpx;
.item-content {
display: flex;
flex-direction: row;
justify-content: flex-end;
.product-title {
width: 155rpx;
display: flex;
flex-direction: row;
justify-content: flex-end;
}
.product-content {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
}
}
// ---------改造图片-之前-------------
.before-img-box {
padding: 20rpx;
padding-top: 10rpx;
}
</style>