货无忧
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

699 lines
18 KiB

<template>
<view class="maboxbg" @touchmove.stop v-if="isshow" @click="checkbox(0)">
<scroll-view class="modtips" @click.stop.prevent>
<view class="title">
{{title||'提示'}}
</view>
<!-- 输入框 -->
<template v-if="tipstate === 1">
<view class="inputbx">
<input v-model="inputtext" :placeholder="placeholder" />
</view>
</template>
<!-- 单选框 -->
<template v-else-if="tipstate === 2">
<view class="selviebx" v-if="!isonecheck">
<view @click="checkall" v-if="checklength!=checklist.length">全选</view>
<view @click="removeall" v-else>全不选</view>
</view>
<view class="listcheck">
<view @click="checkitem(index)" v-for="(item,index) in list">
<image :src="checklist.indexOf(index)==-1?'/static/nocheck.png':'/static/check.png'"></image>
<view>{{item}}</view>
</view>
</view>
</template>
<!-- 照片列表 -->
<template v-else-if="tipstate === 3">
<scroll-view scroll-y="true" class="scvboxs">
<view v-for="(item,index) in imglist" :key="item.dictKey">
<view style="display: flex; justify-content: space-between; align-items: center;">
<!-- 必传照片不足时显示提示文字 -->
<text
:class="{'tpstitl': true,'start': ImagesRequiredFields.find(val => val.key === item.dictKey), 'showTitle': ImagesRequiredFields.find(val => val.key === item.dictKey) && item.imgList.length < 1}">
{{item.dictValue}}
</text>
<!-- 有模版照片时, 显示模版按钮 -->
<template v-if="Object.keys(details.templatePhotos).includes(item.dictValue)">
<text @click="handleShowImage(details.templatePhotos[item.dictValue])"
class="showImageBtn">预览模版</text>
</template>
</view>
<view class="imgbx">
<!-- 循环显示图片 -->
<view v-for="(value,i) in item.imgList">
<image :src="value.urlRoute" @click="handleShowImage(value.urlRoute)"></image>
<image @click="remove(index,i,item.dictKey)" src="/compoment/cus-selects-fan/cha.png"></image>
</view>
<view @click="updateimg(item.dictKey, index)" v-if="item.imgList.length < maximglength">
<image src="/static/add.png"></image>
</view>
</view>
</view>
</scroll-view>
<view class="inputbx">
<input v-model="inputtext" :placeholder="placeholder" />
</view>
</template>
<!-- 输入框列表 -->
<template v-else-if="tipstate === 4">
<scroll-view scroll-y="true" class="scvboxs">
<view class="inpNumList" @click="checkitem(index)" v-for="(item,index) in inpList">
<view class="inpNum-title">
物料名称: {{item.title}}
</view>
<view class="inpNum-title">
物料总数: {{item.maxNum}}
</view>
<view class="inpNum-value">
<view class="">
物料数量:&nbsp;
</view>
<!-- 当输入框类型为数字类型时 -->
<input class="inpNum" v-if="(item.type).toLocaleLowerCase() === 'number' && !item.disabled"
:placeholder="item.placeholder" :disabled="item.disabled" type="number" v-model="item.value"
@input="inputNum(item)" />
<text v-else-if="item.disabled" style="flex: 1;"> {{item.value}}</text>
</view>
</view>
</scroll-view>
</template>
<!-- 盘点上架 -->
<template v-else-if="tipstate === 5">
<scroll-view scroll-y="true" class="scvboxs">
<!-- 定制品 -->
<template v-if="details.goodsType === '定制品'">
<view class="inputbx">
<input v-model="details.upform.article.contractNumber" placeholder="请输入合同号" />
</view>
<view class="inputbx">
<input v-model="details.upform.article.orderPackageCode" placeholder="请输入或扫描包条码" />
</view>
</template>
<!-- 零担 -->
<template v-if="details.goodsType === '零担'">
<view class="inputbx">
<input v-model="details.upform.article.contractNumber" placeholder="请输入订单号" />
</view>
<view class="inputbx">
<input v-model="details.upform.article.orderPackageCode" placeholder="请输入或扫描包条码" />
</view>
</template>
<!-- 库存品 -->
<template v-if="details.goodsType === '库存品'">
<view class="inputbx">
<input v-model="details.upform.stock.orderCode" placeholder="请输入合同号" />
</view>
<view class="inputbx">
<input v-model="details.upform.stock.incomingBatch" placeholder="请输入批次号" />
</view>
<view class="inputbx">
<input v-model="details.upform.stock.materialName" @input="searchStock"
placeholder="请输入物料编码或物料名称" />
<view class="select_content">
<template v-if="details.materialName.length !== 0">
<view @click="checkSec(val)" v-for="val in details.materialName" :key="val">
{{val.materialName}}
</view>
</template>
</view>
</view>
<view class="inputbx" @touchstart="handleshowMarket">
<input v-model="details.upform.stock.marketName" placeholder="请选择商城" disabled="true" />
<template v-if="details.showMarketList">
<view :class="{'select_content': true, 'show': details.showMarketList}">
<view v-for="val in details.marketName" :key="val"
@click="details.upform.stock.marketName = val">
{{val}}
</view>
</view>
</template>
</view>
<view class="inputbx">
<input v-model="details.upform.stock.stockNum" placeholder="请输入在库数量" />
</view>
</template>
</scroll-view>
</template>
<!-- 复选框列表 -->
<template v-else-if="tipstate === 6">
<scroll-view scroll-y="true" class="scvboxs">
<view class="selviebx" v-if="!isonecheck">
<view @click="checkallItem" v-if="checklength!=checklist.length">全选</view>
<view @click="invertSelection" v-else>反选</view>
</view>
<view class="listcheck">
<view>
<image src="/static/check1.png"></image>
<view style=" width: 60px;">在库</view>
{{list[0].value}}
</view>
<view v-for="(item,index) in details.checkSectionList">
<image @click="singlecheckitem(index)" style="flex: none;"
:src="checklist.indexOf(index)==-1?'/static/nock.png':'/static/check1.png'"></image>
<view style="flex: none; width: 60px;">{{item.title}}</view>
<input type="number" style="border: 1px solid #000;" v-model="item.value"
@input="checkInputNum(item)" :disabled="!details.checklist.includes(index)" />
</view>
</view>
</scroll-view>
</template>
<view class="buts">
<view @click="checkbox(1)" v-if="isshowcancel" class="cancel">{{cancelTxt||'取消'}}</view>
<view @click="checkbox(2)" class="confirm">{{confirmTxt||'确认'}}</view>
</view>
</scroll-view>
</view>
<!-- 预览图片 -->
<view class="previewPicture-container" v-if="showPreviewPicture" @click.stop="handleShowImage()">
<img :src="details.previewPictureUrl" class="previewPicture" alt="">
</view>
</template>
<script lang="ts" setup>
import functions from '@/utils/functions.js'
import { tiplistType } from '@/interfaces/compoment/tiplist'
import { postqueryfindMaterialList } from '@/api/user.js';
import { reactive, ref, toRefs, watch } from "vue";
let details = reactive<any>({
tipstate: 2,
title: '',
placeholder: '',
isshowcancel: true,
confirmTxt: '',
cancelTxt: '',
success: null,
cancel: null,
close: null,
isshow: false,
list: [],
checklist: [],
inputtext: '',
isonecheck: false,
imglist: [],
maximglength: 3,
checklength: 0,
// 是否是图片列表的修改提交
isChange: false,
changeImageList: [],
ImagesRequiredFields: [],
inpList: [],
showPreviewPicture: false,
// 预览图片地址
previewPictureUrl: '/static/changku.png',
// 盘点复选框
checkSectionList: [],
// 上架
upform: {
article: {
// 合同号
contractNumber: '',
// 包条码
orderPackageCode: ''
},
stock: {
orderCode: '',
incomingBatch: '',
materialName: '',
marketName: '',
stockNum: ''
}
},
templatePhotos: {
// 上门照
"上门照": 'https://htys.oss-cn-chengdu.aliyuncs.com/showImages/1.png',
// 堆码照
"堆码照": 'https://htys.oss-cn-chengdu.aliyuncs.com/showImages/2.png',
// 签收照
"签收照": 'https://htys.oss-cn-chengdu.aliyuncs.com/showImages/3.png',
},
// 商品类型
goodsType: '定制品',
marketName: [],
materialName: [],
showMarketList: false,
showmaterialList: false,
})
watch(() => { details.checklist }, () => {
details.checklength = details.checklist.length
})
// watchEffect(()=>{
// if(details.checklist.length>-1){
// details.checklength=details.checklist.length
// }
// })
function setdetails(objs : any) {
for (let key in objs) {
details[key] = objs[key]
}
}
function checkitem(index : number) {
console.log('123 :>> ', 123);
if (details.isonecheck) {
if (details.checklist.indexOf(index) == -1) {
details.checklist = [index]
} else {
details.checklist.splice(details.checklist.indexOf(index), 1)
}
return
}
console.log('222 :>> ', 222);
if (details.checklist.indexOf(index) == -1) {
details.checklist.push(index)
} else {
details.checklist.splice(details.checklist.indexOf(index), 1)
}
}
function checkbox(type : number) {
switch (type) {
case 0:
if (details.close) {
details.close(details)
}
break;
case 1:
if (details.cancel) {
details.cancel(details)
}
break;
case 2:
if (details.success) {
details.success(details)
}
break;
}
}
function remove(index : number, i : number, type : string) {
// 是否为提交修改, 记录修改的类型
if (details.isChange && !details.changeImageList.includes(type)) details.changeImageList.push(type)
details.imglist[index].imgList.splice(i, 1)
}
function updateimg(type : string, index : number) {
// 是否为提交修改, 记录修改的类型
if (details.isChange && !details.changeImageList.includes(type)) details.changeImageList.push(type)
uni.chooseImage({
count: details.maximglength,
success: async (chooseImageRes) => {
console.log('chooseImageRes >>>>>>>>', chooseImageRes)
const tempFilePaths = chooseImageRes.tempFilePaths as any;
// let url=await functions.upfile(tempFilePaths[0])
tempFilePaths.map(async (item) => {
console.log(1232131231)
let url = await functions.upfile(item)
console.log('url :>> ', url);
details.imglist[index].imgList.push({ urlRoute: url.link, type: type, name: url.originalName })
})
// uni.uploadFile({
// url: 'https://www.example.com/upload', //仅为示例,非真实的接口地址
// filePath: tempFilePaths[0],
// name: 'file',
// success: (uploadFileRes) => {
// console.log(uploadFileRes.data);
// }
// });
}
});
}
function checkall() {
console.log('111 :>> ', 111);
details.list.map((item, index) => {
details.checklist.push(index)
})
}
function removeall() {
console.log('111 :>> ', 111);
details.checklist = []
}
// 复选框全选
function checkallItem() { }
// 反选
function invertSelection() { }
// 单选
function singlecheckitem(index) {
if (details.isonecheck) {
if (details.checklist.indexOf(index) == -1) {
details.checklist = [index]
} else {
details.checklist.splice(details.checklist.indexOf(index), 1)
}
} else {
if (details.checklist.indexOf(index) == -1) {
details.checklist.push(index)
} else {
details.checklist.splice(details.checklist.indexOf(index), 1)
}
}
// 当未选择时, 数据清零
details.checkSectionList.forEach((val, i) => {
if (!details.checklist.includes(i)) val.value = 0
})
}
function handleShowImage(imgUrl = '/static/changku.png') {
details.previewPictureUrl = imgUrl
details.showPreviewPicture = !details.showPreviewPicture
}
let isInputN = null
function checkInputNum(item) {
// 重置定时器
if (isInputN) clearTimeout(isInputN)
isInputN = setTimeout(() => {
// 计算最大值
const maxNum = details.list[0].value - details.checkSectionList.reduce((curr, val) => curr + parseInt(val.value), 0) + parseInt(item.value)
console.log('maxNum :>> ', maxNum);
item.value = parseInt(item.value)
if (item.value <= 0 || isNaN(item.value)) item.value = 0
if (item.value >= maxNum) item.value = maxNum
isInputN = null
// 清除定时器
clearTimeout(isInputN)
}, 500)
}
let isInput = null
function inputNum(item) {
// 重置定时器
if (isInput) clearTimeout(isInput)
isInput = setTimeout(() => {
item.value = parseInt(item.value)
if (item.value <= item.minNum || isNaN(item.value)) item.value = item.minNum
if (item.value >= item.maxNum) item.value = item.maxNum
clearTimeout(isInput)
}, 300)
}
function handleshowMarket() {
details.showMarketList = !details.showMarketList
console.log('123 :>> ', 123);
console.log('details.showMarketList :>> ', details.showMarketList);
}
let _atn : any = null
function searchStock() {
if (_atn) clearTimeout(_atn)
_atn = setTimeout(async () => {
const res = await postqueryfindMaterialList({ materialCode: details.upform.stock.materialName })
console.log('res :>> ', res);
const { code } = res
if (code === 200) details.materialName = res.data
clearTimeout(_atn)
}, 500)
}
function checkSec(val) {
details.upform.stock.materialName = val.materialName
details.upform.stock.materialCode = val.materialCode
details.materialName = []
}
defineExpose({ setdetails })
const { isonecheck, checklength, imglist, inputtext, checklist, list, isshow, tipstate, title, isshowcancel, placeholder, confirmTxt, cancelTxt, showPreviewPicture, ImagesRequiredFields, maximglength, inpList } = toRefs(details)
</script>
<style lang="scss">
.tpstitl {
font-size: 26upx;
width: 550upx;
&.start {
&::before {
content: '*';
margin-right: 10upx;
color: #f00;
}
}
&.showTitle {
&::after {
content: '最少传入三张图片';
margin-left: 20upx;
color: #f00;
}
}
}
.maboxbg {
width: 100%;
height: 100%;
position: fixed;
left: 0;
top: 0;
background-color: #00000050;
z-index: 9999;
}
.modtips {
// height: 50vh;
width: 630upx;
// height: 63upx;
background: #FFFFFF;
border-radius: 7upx;
display: flex;
flex-direction: column;
align-items: center;
padding: 40upx 20upx;
position: absolute;
left: 50%;
top: 50%;
transform: translateX(-50%) translateY(-50%);
box-sizing: border-box;
.selviebx {
display: flex;
align-items: center;
width: 500upx;
justify-content: flex-start;
>view {
font-size: 26upx;
color: #d3832a;
}
}
.title {
font-size: 34upx;
color: #092C4D;
}
.contents {
max-width: 480upx;
font-size: 29upx;
color: #90A0AF;
margin-top: 30upx;
}
.scvboxs {
width: 100%;
max-height: 500upx;
}
.imgbx {
width: 550upx;
// display: grid;
// grid-template-columns: 33% 33% 33%;
display: flex;
// justify-content: ;
margin-top: 20upx;
flex-wrap: wrap;
>view {
width: 130upx;
height: 130upx;
padding: 10upx;
margin-right: 10upx;
box-sizing: border-box;
border: 1upx solid #e6e6e6;
margin-bottom: 15upx;
border-radius: 8upx;
position: relative;
>image:nth-of-type(1) {
width: 100%;
height: 100%;
}
>image:nth-of-type(2) {
width: 28upx;
height: 28upx;
position: absolute;
right: 10upx;
top: 10upx;
}
}
}
.buts {
display: flex;
align-items: center;
justify-content: center;
margin-top: 40upx;
>view {
display: flex;
align-items: center;
justify-content: center;
// width: 260upx;
// height: 88upx;
padding: 15upx 50upx;
border-radius: 8upx;
font-size: 32upx;
}
>.cancel {
background-color: #F5F5F6;
color: #5A6875;
margin-right: 20upx;
}
>.confirm {
background-color: #D3832A;
color: #FFFFFF;
}
}
.inputbx {
margin-top: 30upx;
margin-bottom: 10upx;
border: 1upx solid #092C4D20;
padding: 15upx 30upx;
padding-left: 20upx;
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
border-radius: 10upx;
font-size: 27upx;
color: #092C4D;
position: relative;
>input {
width: 480upx;
flex: 1;
}
.select_content {
position: absolute;
// margin: 0 auto;
z-index: 99;
top: 120%;
left: 50%;
transform: translateX(-50%);
background: #fff;
border: 1upx solid #eee;
width: 100%;
overflow: hidden;
view {
text-align: center;
padding: 20upx 0;
border-bottom: 1upx solid #000;
&:last-child {
border-bottom: 0;
}
}
}
}
.listcheck {
display: flex;
max-height: 50vh;
overflow-y: scroll;
flex-direction: column;
margin-top: 30upx;
>view {
width: 420upx;
display: flex;
align-items: center;
// justify-content: flex-start;
font-size: 28upx;
padding: 20upx 0;
>image {
width: 30upx;
height: 30upx;
margin-right: 15upx;
}
}
}
}
// 预览图片
.previewPicture-container {
z-index: 99999;
width: 100%;
height: 100%;
background: #65768499;
position: fixed;
top: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
.previewPicture {
width: 100%;
// height: 50%;
}
}
// 开启预览的按钮
.showImageBtn {
font-size: 26upx;
width: fit-content;
white-space: nowrap;
border: 1px solid #d3832a;
color: #d3832a;
padding: 10upx;
border-radius: 10upx;
}
// 数字输入框
.inpNumList {
margin-bottom: 20upx;
border-bottom: 1upx solid #092C4D20;
&>view {
margin-bottom: 10upx;
}
&:last-child {
border-bottom: 0px;
}
.inpNum-value {
display: flex;
align-items: center;
justify-content: space-between;
.inpNum {
margin-left: 10upx;
flex: 1;
padding: 5upx 10upx;
border: 1upx solid #afafaf;
border-radius: 10upx;
}
}
}
</style>