bonus-material-app/src/pages/part/part-lease/index.vue

409 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<!-- 退料任务 -->
<view class="accept page-common">
<uni-row :gutter="24" class="search-form">
<!-- <uni-col :span="10">
<view>
<uni-easyinput placeholder="请输入内容"/>
</view>
</uni-col>
<uni-col :span="4">
<view class="search" @click="">查询</view>
</uni-col> -->
<uni-col :span="10">
<view>
<uni-easyinput
placeholder="请输入物资名称"
v-model="searchKeyword"
/>
</view>
</uni-col>
<uni-col :span="4">
<view class="search" @click="search()">查询</view>
</uni-col>
<uni-col :span="4">
<view class="addBtn" @click="addApply">申请</view>
</uni-col>
<uni-col :span="6">
<view class="addBtn" @click="goApply()">申请记录</view>
</uni-col>
</uni-row>
<!-- <uni-row :gutter="24" class="search-form">
<uni-col :span="10">
<view>
<uni-easyinput
placeholder="请输入物资名称"
v-model="searchKeyword"
/>
</view>
</uni-col>
<uni-col :span="6">
<view class="search" @click="search()">查询</view>
</uni-col>
</uni-row> -->
<uni-row :gutter="24" class="search-form">
<uni-col :span="5">
<view style="font-size: 24rpx;">物资类型:</view>
</uni-col>
<uni-col :span="19">
<scroll-view scroll-x class="select-box" ref="nameScrollView">
<view class="select-box-content">
<view class="select-box-item" :style="{ color: maId=='' ? 'red':'black' }" @click="getLevelOneList()">
全部
</view>
<view class="select-box-item" v-for="(item,index) in maList" :key="index" @click="chosenLevelOne(item)" :style="{ color: maId==item.id ? 'red':'black' }">
{{item.paName}}
</view>
</view>
</scroll-view>
</uni-col>
</uni-row>
<uni-row :gutter="24" class="search-form">
<uni-col :span="5">
<view style="font-size: 24rpx;">物资名称:</view>
</uni-col>
<uni-col :span="19">
<scroll-view scroll-x class="select-box">
<view class="select-box-content">
<view class="select-box-item" :style="{ color: modelId=='' ? 'red':'black' }" @click="getLevelTwoList()">
全部
</view>
<view class="select-box-item" v-for="(item,index) in modelList" :key="index" @click="chosenLevelTwo(item)" :style="{ color: modelId==item.id ? 'red':'black' }">
{{item.paName}}
</view>
</view>
</scroll-view>
</uni-col>
</uni-row>
<uni-row :gutter="24" class="search-form">
<uni-col :span="5">
<view style="font-size: 24rpx;">规格型号:</view>
</uni-col>
<uni-col :span="19">
<scroll-view scroll-x class="select-box">
<view class="select-box-content">
<view class="select-box-item" :style="{ color: typeId=='' ? 'red':'black' }" @click="getLevelThreeList()">
全部
</view>
<view class="select-box-item" v-for="(item,index) in typeList" :key="index" @click="chosenLevelThree(item)" :style="{ color: typeId==item.id ? 'red':'black' }">
{{item.paName}}
</view>
</view>
</scroll-view>
</uni-col>
</uni-row>
<scroll-view scroll-y class="scroll-container">
<uni-table border stripe emptyText="暂无更多数据" >
<!-- 表头行 -->
<uni-tr>
<uni-th style="font-size: 20rpx;" width="50px" align="center" >序号</uni-th>
<uni-th style="font-size: 20rpx;" width="80px" align="center">机具类型</uni-th>
<uni-th style="font-size: 20rpx;" width="80px" align="center">配件名称</uni-th>
<uni-th style="font-size: 20rpx;" width="80px" align="center">规格型号</uni-th>
<uni-th style="font-size: 20rpx;" width="50px" align="center">库存</uni-th>
<uni-th style="font-size: 20rpx;" width="120px" align="center">预领数量</uni-th>
<uni-th style="font-size: 20rpx;" width="50px" align="center">操作</uni-th>
</uni-tr>
<!-- 表格数据行 -->
<uni-tr v-for="(item,index) in partList" :key="index">
<uni-td style="font-size: 20rpx;text-align: center;">{{(index+1)}}</uni-td>
<uni-td style="font-size: 20rpx;text-align: center;">{{item.modelType}}</uni-td>
<uni-td style="font-size: 20rpx;text-align: center;">{{item.partName}}</uni-td>
<uni-td style="font-size: 20rpx;text-align: center;">{{item.typeName}}</uni-td>
<uni-td style="font-size: 20rpx;text-align: center;">{{item.storageNum}}</uni-td>
<uni-td style="font-size: 20rpx;text-align: center;">
<uni-easyinput placeholder="预领数量" v-model="item.preNum" style="font-size: 20rpx;" @input="checkNum(item)"/>
</uni-td>
<uni-td style="font-size: 20rpx;text-align: center;">
<view>
<uni-icons type="trash-filled" size="20" style="color: red;margin-left:10px;" @click="delRow(index)"></uni-icons>
</view>
</uni-td>
</uni-tr>
</uni-table>
</scroll-view>
</view>
</template>
<script setup>
import { ref, computed } from 'vue'
import { onLoad,onShow} from '@dcloudio/uni-app'
import { selectPartTreeListApi,selectPartTreeListByLevelApi,addPartLeaseApi } from '../../../services/partLease.js'
import { debounce } from 'lodash-es'
const partList = ref([
// {modelType:"手扶绞磨机", partName:"离合器轴", typeName:"XJSF-JM-1", storageNum:"20", preNum:"0"},{modelType:"手扶绞磨机", partName:"离合器轴", typeName:"XJSF-JM-2", storageNum:"20", preNum:"0"},{modelType:"手扶绞磨机", partName:"离合器轴", typeName:"XJSF-JM-3", storageNum:"20", preNum:"0"}
]) //列表数据源
const searchKeyword = ref('')
const nameScrollView = ref(null)
// --------1---------
// 类型数据
const maList = ref([])//一级选择数据
const maId = ref("")//一级选中id
const search = async () => {
const res = await selectPartTreeListApi({level:2,id:maId.value,paName:searchKeyword.value,flag:1})
modelList.value=res.data.secondList;
typeList.value=res.data.thirdList;
}
// 获取类型数据(一级)
const getLevelOneList = async () => {
const res = await selectPartTreeListApi({level:1})
maList.value=res.data;
maId.value="";
getLevelTwoList()
}
//选择类型(一级)
const chosenLevelOne = async (item) => {
maId.value=item.id;
const res = await selectPartTreeListApi({level:2,id:item.id})
modelList.value=res.data.secondList;
typeList.value=res.data.thirdList;
}
// --------2---------
// 名称数据
const modelList = ref([])//二级选择数据
// 获取名称数据
const getLevelTwoList = async () => {
const res = await selectPartTreeListApi({level:2})
modelList.value=res.data
modelId.value=""
getLevelThreeList()
}
const modelId = ref("")//二级选中id
//选择类型
const chosenLevelTwo = async (item) => {
modelId.value=item.id;
const res = await selectPartTreeListApi({level:3,id:item.id})
typeList.value=res.data.thirdList
}
// --------3---------
// 型号数据
const typeList = ref([])
// 获取名称数据
const getLevelThreeList = async () => {
const res = await selectPartTreeListApi({level:3})
typeList.value=res.data
typeId.value=""
}
const typeId = ref("")
//选择类型
const chosenLevelThree = async(item) => {
typeId.value=item.id;
let obj = {
partId:item.id,
modelType:"",
partName:"",
typeName:item.paName,
storageNum:item.storageNum || 0,
preNum:0
}
const res = await selectPartTreeListByLevelApi({id:item.id})
res.data.forEach(i=>{
if(i.level==1){
obj.modelType=i.paName
}
if(i.level==2){
obj.partName=i.paName
}
})
//添加到table
if(partList.value.length==0){
partList.value[0]=obj
}else{
let index = partList.value.findIndex(v=>v.partId==item.id)
if(index<0){//添加
partList.value.unshift(obj)
}else{//已存在
uni.showToast({
title: '当前领料任务已存在该规格型号',
icon: 'none',
})
}
}
}
//输入框事件
const checkNum = (item) => {
setTimeout(() => {
item.preNum = Number(String(item.preNum).replace(/[^\d]/g, ''))
if(item.storageNum>0){
if(Number(item.preNum)>=Number(item.storageNum)){
item.preNum=Number(item.storageNum)
}
}
}, 500)
}
//删除
const delRow = (index) => {
partList.value.splice(index,1)
}
//新增记录
const addApply = () => {
console.log(partList.value)
if(partList.value.length==0){
uni.showToast({
title: '请先添加配件类型',
icon: 'none',
})
}else{
let index = partList.value.findIndex(v=>v.preNum==0)
if(index<0){//添加
uni.showModal({
title: '提示',
content: '是否确认提交申请',
confirmText: '确定',
cancelText: '取消',
success: async (res) => {
if (res.confirm) {
let param = {
partLeaseDetailsList:partList.value
}
console.log(param)
const res = await addPartLeaseApi(param)
if (res.code === 200) {
uni.showToast({
title: '提交成功',
icon: 'none',
})
setTimeout(() => {
getLevelOneList()
partList.value=[]
}, 500)
}else{
uni.showToast({ title: '提交失败', icon: 'none' })
}
}
}
})
}else{
uni.showToast({ title: '配件领料数量不可为零!',icon: 'none'})
}
}
}
//点击记录
const goApply = () => {
uni.navigateTo({ url: `/pages/part/part-lease/applyList` })
}
onLoad(() => {
getLevelOneList()
})
</script>
<style lang="scss" scoped>
.accept {
height: 95vh;
word-break: break-all;
background-color: #f7f8fa;
padding: 24rpx;
// 搜索表单
.search-form {
display: flex;
align-items: center;
background: #fff;
padding: 10rpx;
border-radius: 20rpx;
margin-bottom: 24rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
.select-box{
width: 100%;
height: 80rpx;
}
.select-box-content{
height: 75rpx;
width: auto;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
.select-box-item{
width: auto;
padding: 5rpx;
margin-right: 10rpx;
height: 60rpx;
line-height: 60rpx;
font-size: 24rpx;
word-break: keep-all;
white-space: nowrap;
}
// 搜索按钮
.search {
height: 80rpx;
background: linear-gradient(135deg, #4b8eff 0%, #3784fb 100%);
text-align: center;
line-height: 80rpx;
color: #fff;
border-radius: 12rpx;
font-size: 28rpx;
font-weight: 600;
box-shadow: 0 6rpx 20rpx rgba(55, 132, 251, 0.2);
transition: all 0.3s ease;
&:active {
transform: scale(0.98);
opacity: 0.9;
}
}
// 新增按钮
.addBtn {
height: 80rpx;
background: linear-gradient(135deg, #19be6b 0%, #16a75c 100%);
text-align: center;
line-height: 80rpx;
color: #fff;
border-radius: 12rpx;
font-size: 28rpx;
font-weight: 600;
box-shadow: 0 6rpx 20rpx rgba(25, 190, 107, 0.2);
transition: all 0.3s ease;
&:active {
transform: scale(0.98);
opacity: 0.9;
}
}
}
}
// 列表容器
.scroll-container {
width: 98%;
padding: 5rpx;
height: 50vh;
margin: 20rpx auto;
}
/* 针对Web平台 */
.scroll-view {
overflow: auto; /* 允许滚动 */
-ms-overflow-style: none; /* IE和Edge */
scrollbar-width: none; /* Firefox */
}
/* 针对其他非Web平台比如小程序可以通过条件编译来设置 */
/* #ifdef MP-WEIXIN */
.scroll-view {
scroll-view {
scroll-x: true;
scroll-y: auto;
::-webkit-scrollbar {
display: none; /* 针对Webkit浏览器隐藏滚动条 */
width: 0;
height: 0;
color: transparent;
}
}
}
/* #endif */
</style>