更新订单列表详情,更新商品管理,更新代客下单
This commit is contained in:
2026
pageProduct/add-Product/add-Product-9-19-back.vue
Normal file
2026
pageProduct/add-Product/add-Product-9-19-back.vue
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<view class="u-p-30 safe-page">
|
||||
<up-sticky v-if="option.type==='edit'" offset-top="20" zIndex="99">
|
||||
<myTabs :list="tabsList" @change="tabsChange"></myTabs>
|
||||
<myTabs :list="tabsList" v-model="tabsCurrent"></myTabs>
|
||||
</up-sticky>
|
||||
|
||||
<view class="box">
|
||||
@@ -11,19 +11,30 @@
|
||||
err-show-type="toast" validateTrigger="submit" label-width="350" ref="Forms">
|
||||
<view class="block">
|
||||
<uni-forms-item label="商品类型" required showRequired>
|
||||
<view class="u-flex u-flex-wrap types " :class="{disabled:option.productId!==''}">
|
||||
<up-radio-group
|
||||
:disabled="option.type=='edit'"
|
||||
v-model="FormData.typeEnum"
|
||||
placement="row"
|
||||
>
|
||||
<up-radio
|
||||
:customStyle="{marginRight: '30px'}"
|
||||
v-for="(item, index) in pageData.types"
|
||||
:key="index"
|
||||
:label="item.name"
|
||||
:name="item.value"
|
||||
>
|
||||
</up-radio>
|
||||
</up-radio-group>
|
||||
<!-- <view class="u-flex u-flex-wrap types " :class="{disabled:option.productId!==''}">
|
||||
<view class="item" @tap="changeFormData('typeEnum',item.value)"
|
||||
:class="{active:FormData.typeEnum===item.value}"
|
||||
v-for="(item,index) in pageData.types" :key="index">
|
||||
<!-- <view class="gou u-flex u-row-right u-col-top u-p-t-4 u-p-r-4">
|
||||
<uni-icons type="checkmarkempty" :size="8" color="#fff"></uni-icons>
|
||||
</view> -->
|
||||
<view class="title">{{item.title}}</view>
|
||||
<view class="u-font-24 color-999 u-m-t-10">
|
||||
{{item.desc}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view> -->
|
||||
|
||||
</uni-forms-item>
|
||||
<uni-forms-item ref="fileItem" label="图片">
|
||||
@@ -38,11 +49,6 @@
|
||||
</uni-forms-item>
|
||||
<template v-if="FormData.typeEnum!='group'">
|
||||
<uni-forms-item label="所属分类" required showRequired name="categoryId">
|
||||
<!-- <picker @change="bindPickerChange"
|
||||
range-key="name"
|
||||
:value="pageData.category" :range="pageData.category">
|
||||
<view class="uni-input">请选择分类</view>
|
||||
</picker> -->
|
||||
<uni-data-picker :clear-icon="false" :map="{text:'name',value:'id'}"
|
||||
placeholder="请选择分类" popup-title="请选择分类" :localdata="pageData.category"
|
||||
v-model="FormData.categoryId">
|
||||
@@ -50,10 +56,6 @@
|
||||
</uni-forms-item>
|
||||
</template>
|
||||
|
||||
<!-- <uni-forms-item label="产品编码">
|
||||
<uni-easyinput :paddingNone="inputPaddingNone" :placeholderStyle="placeholderStyle"
|
||||
:inputBorder="inputBorder" v-model="FormData.goodsCode" placeholder="请输入商品编码" />
|
||||
</uni-forms-item> -->
|
||||
<view class="border-top-0">
|
||||
<uni-forms-item label="商品描述">
|
||||
<uni-easyinput :paddingNone="inputPaddingNone" :placeholderStyle="placeholderStyle"
|
||||
@@ -726,161 +728,27 @@
|
||||
|
||||
</uni-forms>
|
||||
<view style="height: 200rpx;"></view>
|
||||
<view style="padding-left: 110rpx;padding-right: 110rpx;" class="u-m-t-20" v-if="option.type==='edit'" @click="delModelShow">
|
||||
<my-button bgColor="#F9F9F9" shape="circle" type="cancel" >
|
||||
<view class="color-red">删除该商品</view>
|
||||
</my-button>
|
||||
</view>
|
||||
<view class="bootom">
|
||||
<view class="save-btn-box">
|
||||
<my-button shape="circle" @tap="save">保存</my-button>
|
||||
</view>
|
||||
|
||||
<view class="u-m-t-20" v-if="option.type==='edit'" @click="delModelShow">
|
||||
<my-button shape="circle" type="cancel" bgColor="#fff">
|
||||
<!-- <view class="u-m-t-20" v-if="option.type==='edit'" @click="delModelShow">
|
||||
<my-button bgColor="#fff" shape="circle" type="cancel" >
|
||||
<view class="color-red">删除该商品</view>
|
||||
</my-button>
|
||||
<!-- <text>删除该商品</text> -->
|
||||
</view>
|
||||
</view> -->
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<template v-if="tabsCurrent===1">
|
||||
<view class="stock">
|
||||
<uni-forms :border="false" err-show-type="toast" validateTrigger="submit" ref="Forms1">
|
||||
<!-- <view class="block ">
|
||||
<uni-forms-item label="" required>
|
||||
<view class="u-flex">
|
||||
<view class="label-title">库存模式</view>
|
||||
<view class="u-flex-1 u-p-l-100">
|
||||
<uni-data-checkbox v-model="stockData.inventoryMode"
|
||||
:localdata="InventoryModeData"></uni-data-checkbox>
|
||||
</view>
|
||||
</view>
|
||||
</uni-forms-item>
|
||||
</view> -->
|
||||
<view class="block ">
|
||||
<uni-forms-item label="">
|
||||
<view class="u-flex u-row-between">
|
||||
<view class="label-title">库存开关</view>
|
||||
<my-switch v-model="FormData.isStock"
|
||||
@change="updateProductStatus(FormData.id,'isStock')"></my-switch>
|
||||
</view>
|
||||
</uni-forms-item>
|
||||
</view>
|
||||
<view class="block ">
|
||||
<uni-forms-item label="">
|
||||
<view class="u-flex u-row-between">
|
||||
<view class="label-title">共享库存</view>
|
||||
<my-switch v-model="FormData.isDistribute"
|
||||
@change="updateProductStatus(FormData.id,'isDistribute')"></my-switch>
|
||||
</view>
|
||||
</uni-forms-item>
|
||||
</view>
|
||||
<view class="block ">
|
||||
<uni-forms-item label="">
|
||||
<view class="u-flex u-row-between">
|
||||
<view class="label-title">售罄</view>
|
||||
<my-switch v-model="FormData.isPauseSale"
|
||||
@change="updateProductStatus(FormData.id,'isPauseSale')"></my-switch>
|
||||
</view>
|
||||
</uni-forms-item>
|
||||
</view>
|
||||
|
||||
<template v-if="FormData.typeEnum!=='sku'">
|
||||
<view class="block ">
|
||||
<uni-forms-item label="">
|
||||
<view class="u-flex u-row-between">
|
||||
<view class="label-title">上架</view>
|
||||
<my-switch v-model="FormData.isGrounding"
|
||||
@change="updateProductStatus(FormData.id,'isGrounding')"></my-switch>
|
||||
</view>
|
||||
</uni-forms-item>
|
||||
</view>
|
||||
<view class="block default-box-padding">
|
||||
<view class="u-flex">
|
||||
<view class="">
|
||||
<my-button @tap="toRecoders" :height="60">库存记录</my-button>
|
||||
</view>
|
||||
<view class="u-m-l-40">
|
||||
<my-button :height="60" @tap="toCheck">库存盘点</my-button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
|
||||
<template v-else>
|
||||
<view class="block default-box-padding">
|
||||
<view class="u-flex">
|
||||
<view class="">
|
||||
<my-button @tap="toRecoders" :height="60">库存记录</my-button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="u-text-center block">
|
||||
<view class="u-flex font-bold u-m-t-30 u-m-b-20">
|
||||
<!-- <view class="u-flex-1">商品信息</view> -->
|
||||
<view class="u-flex-1">规格</view>
|
||||
<view class="u-flex-1">库存</view>
|
||||
<view class="u-flex-1">售罄</view>
|
||||
<view class="u-flex-1">上架</view>
|
||||
<view class="u-flex-1">操作</view>
|
||||
</view>
|
||||
<view class="" v-for="(item,index) in pageData.skuList" :key="index">
|
||||
<view class="u-flex u-p-b-12 u-p-t-12 ">
|
||||
<view class="u-flex-1">{{item.specSnap}}</view>
|
||||
<!-- <view class="u-flex-1">{{item.salePrice}}</view> -->
|
||||
<view class="u-flex-1">{{item.stockNumber}}{{item.unitName}}</view>
|
||||
<view class="u-flex-1 u-flex u-row-center"><my-switch v-model="item.isPauseSale"
|
||||
@change="updateProductStatus(item.skuId,'isPauseSale')"></my-switch>
|
||||
</view>
|
||||
<view class="u-flex-1 u-flex u-row-center"><my-switch v-model="item.isGrounding"
|
||||
@change="updateProductStatus(item.skuId,'isGrounding')"></my-switch>
|
||||
</view>
|
||||
<view class="u-flex u-row-center">
|
||||
<my-button @tap="skuToCheck(item)" :width="120" :height="40">
|
||||
<view class="u-font-24 no-wrap">库存盘点</view>
|
||||
</my-button>
|
||||
<!-- <my-button @tap="moreShow(item,index)" :width="100" :height="40">
|
||||
<view class="u-font-24 no-wrap">更多</view>
|
||||
</my-button> -->
|
||||
</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
|
||||
</template>
|
||||
|
||||
<!-- <view class="block ">
|
||||
<uni-forms-item label="" required>
|
||||
<view class="u-flex">
|
||||
<view class="label-title">剩余库存数量</view>
|
||||
<view class="u-flex-1 u-p-l-40">
|
||||
<uni-easyinput :paddingNone="inputPaddingNone"
|
||||
:placeholderStyle="placeholderStyle" type="number"
|
||||
:inputBorder="inputBorder" v-model="FormData.stockNumber"
|
||||
placeholder="填写库存" />
|
||||
</view>
|
||||
</view>
|
||||
</uni-forms-item>
|
||||
</view> -->
|
||||
<!-- <view class="block ">
|
||||
<uni-forms-item label="" required>
|
||||
<view class="u-flex">
|
||||
<view class="label-title">库存模式</view>
|
||||
<view class="u-flex-1 u-p-l-100">
|
||||
<uni-data-checkbox v-model="stockData.inventoryReset"
|
||||
:localdata="InventoryReset"></uni-data-checkbox>
|
||||
</view>
|
||||
</view>
|
||||
</uni-forms-item>
|
||||
</view> -->
|
||||
</uni-forms>
|
||||
|
||||
<view class="btns">
|
||||
<my-button shape="circle">保存</my-button>
|
||||
<my-button shape="circle" type="default" @tap="back">取消</my-button>
|
||||
</view>
|
||||
</view>
|
||||
<edit-haocai :goods="FormData" @cancel="changeTabsCurrent(0)"></edit-haocai>
|
||||
</template>
|
||||
</view>
|
||||
|
||||
@@ -894,11 +762,8 @@
|
||||
</template>
|
||||
</my-model>
|
||||
|
||||
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
<!-- 删除弹窗 -->
|
||||
<my-model @confirm="delmodelConfirm" ref="delModel" desc="确认删除">
|
||||
</my-model>
|
||||
@@ -906,6 +771,9 @@
|
||||
<choose-goods ref="refChooseGoods" @confirm="refChooseGoodsConfirm" :category="pageData.category"></choose-goods>
|
||||
<!-- 更多操作 -->
|
||||
<my-action-sheet @itemClick="actionSheetClick" ref="refMoreSheet" :list="actionSheet.list"></my-action-sheet>
|
||||
</view>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@@ -922,6 +790,7 @@
|
||||
|
||||
import myModel from '@/components/my-components/my-model'
|
||||
import chooseGoods from './components/choose-goods'
|
||||
import editHaocai from './components/edit-haocai.vue'
|
||||
import chooseGroupCategory from './components/choose-coupon-category'
|
||||
import myRadio from '@/components/my-components/my-radio'
|
||||
import myUploadFile from '@/components/my-components/my-upload-file'
|
||||
@@ -929,6 +798,7 @@
|
||||
import myButton from '@/components/my-components/my-button'
|
||||
import mySwitch from '@/components/my-components/my-switch.vue'
|
||||
import infoBox from "@/commons/utils/infoBox.js"
|
||||
|
||||
import {
|
||||
$types,
|
||||
$defaultSku
|
||||
@@ -1274,7 +1144,13 @@
|
||||
}
|
||||
|
||||
|
||||
const tabsList = ['基础设置', '库存设置']
|
||||
const tabsList = ['基础设置', '耗材绑定']
|
||||
let tabsCurrent = ref(0)
|
||||
function changeTabsCurrent(newval){
|
||||
tabsCurrent.value=newval
|
||||
}
|
||||
|
||||
|
||||
const Forms = ref(null)
|
||||
|
||||
|
||||
@@ -1545,7 +1421,11 @@
|
||||
//页面全部数据
|
||||
const pageData = reactive({
|
||||
// 商品类型
|
||||
types: $types,
|
||||
// types: $types,
|
||||
types: [
|
||||
{name:'单规格',value:'normal'},
|
||||
{name:'多规格',value:'sku'}
|
||||
],
|
||||
// 单位
|
||||
units: [],
|
||||
// 分类
|
||||
@@ -1597,14 +1477,7 @@
|
||||
|
||||
|
||||
|
||||
let tabsCurrent = ref(0)
|
||||
|
||||
function tabsChange(i) {
|
||||
tabsCurrent.value = i
|
||||
// if (tabsCurrent.value === 1 && option.type === 'add') {
|
||||
// showModel('stockTips')
|
||||
// }
|
||||
}
|
||||
|
||||
let timer = null
|
||||
|
||||
@@ -1809,7 +1682,7 @@
|
||||
watchTimerSave(false)
|
||||
})
|
||||
onReady(() => {
|
||||
Forms.value.setRules(rules)
|
||||
Forms.value&&Forms.value.setRules(rules)
|
||||
})
|
||||
watch(() => pageData.types, (newval) => {
|
||||
Forms.value.setRules(rules)
|
||||
@@ -1884,13 +1757,13 @@
|
||||
position: fixed;
|
||||
left: 110rpx;
|
||||
right: 110rpx;
|
||||
bottom: 110rpx;
|
||||
bottom: 140rpx;
|
||||
padding-bottom: env(safe-area-inset-bottom);
|
||||
}
|
||||
|
||||
.box {
|
||||
margin-top: 70rpx;
|
||||
margin-top: 36rpx;
|
||||
font-size: 28rpx;
|
||||
|
||||
.block {
|
||||
background: #FFFFFF;
|
||||
border-radius: 18rpx 18rpx 18rpx 18rpx;
|
||||
|
||||
159
pageProduct/add-Product/components/choose-danwei.vue
Normal file
159
pageProduct/add-Product/components/choose-danwei.vue
Normal file
@@ -0,0 +1,159 @@
|
||||
<template>
|
||||
<view class="u-relative choose-haocai">
|
||||
<view class="input u-flex" @click="toggle" >
|
||||
<up-input @blur="blur" @change="filterHaocaiList" border="none" v-model="text" placeholder="请选择"></up-input>
|
||||
<up-icon :size="10" name="arrow-down-fill"></up-icon>
|
||||
</view>
|
||||
<view class="u-absolute" v-if="popShow">
|
||||
<scroll-view scroll-y="true" class="scroll">
|
||||
<view class="item" v-for="(item,index) in $haocaiList" :key="index" @click="haocaiClick(item,index)">
|
||||
{{item.name}}
|
||||
</view>
|
||||
<view class="item no-wrap" @click="toggle" v-if="text&&!$haocaiList.length">没有该单位</view>
|
||||
</scroll-view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {
|
||||
reactive,
|
||||
ref,
|
||||
watch,
|
||||
onMounted
|
||||
} from 'vue';
|
||||
const props = defineProps({
|
||||
listMap: {
|
||||
type: Object,
|
||||
default: () => {}
|
||||
},
|
||||
list: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
},
|
||||
modelValue: {
|
||||
type: [String, Number],
|
||||
default: ''
|
||||
},
|
||||
show: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
|
||||
})
|
||||
let text = ref('')
|
||||
|
||||
let popShow = ref(props.show)
|
||||
const emits = defineEmits(['update:show', 'close', 'confirm', 'update:modelValue'])
|
||||
|
||||
function close() {
|
||||
popShow.value = false
|
||||
}
|
||||
|
||||
function confirm() {
|
||||
popShow.value = false
|
||||
}
|
||||
watch(() => props.show, (newval) => {
|
||||
popShow.value = newval
|
||||
|
||||
})
|
||||
watch(() => popShow.value, (newval) => {
|
||||
console.log(newval);
|
||||
emits('update:show', newval)
|
||||
})
|
||||
let $haocaiList = ref(props.list)
|
||||
watch(() => props.list, (newval) => {
|
||||
$haocaiList.value = newval
|
||||
setText()
|
||||
})
|
||||
watch(() => props.modelValue, (newval) => {
|
||||
console.log(newval);
|
||||
setText()
|
||||
})
|
||||
|
||||
|
||||
|
||||
function setText() {
|
||||
// const item = props.listMap[props.modelValue]
|
||||
// text.value = item ? item.name : ''
|
||||
text.value=props.modelValue
|
||||
}
|
||||
|
||||
function toggle(e) {
|
||||
popShow.value = !popShow.value
|
||||
}
|
||||
|
||||
function filterHaocaiList(e) {
|
||||
if (e === '') {
|
||||
return $haocaiList.value = props.list
|
||||
}
|
||||
const arr = props.list.filter(v => v.name.match(e))
|
||||
$haocaiList.value = arr
|
||||
}
|
||||
|
||||
function haocaiClick(item, index) {
|
||||
console.log(item);
|
||||
// if (item.id != props.modelValue) {
|
||||
// emits('update:modelValue', item.id)
|
||||
// }
|
||||
if(item.name!=props.modelValue){
|
||||
emits('update:modelValue', item.name)
|
||||
}
|
||||
popShow.value = false
|
||||
}
|
||||
|
||||
function focus(){
|
||||
console.log('focus');
|
||||
popShow.value = true
|
||||
}
|
||||
function blur() {
|
||||
console.log('blur');
|
||||
setTimeout(()=>{
|
||||
popShow.value = false
|
||||
},100)
|
||||
}
|
||||
onMounted(() => {
|
||||
setText()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.choose-haocai {
|
||||
.input {
|
||||
width: 172rpx;
|
||||
padding: 10rpx 16rpx;
|
||||
height: 60rpx;
|
||||
box-sizing: border-box;
|
||||
background: #FFFFFF;
|
||||
border-radius: 8rpx 8rpx 8rpx 8rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
border: 2rpx solid #E5E5E5;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
.u-absolute {
|
||||
top: calc(100% + 10rpx);
|
||||
border: 1px solid #E5E5E5;
|
||||
left: 0;
|
||||
background-color: #fff;
|
||||
z-index: 10;
|
||||
right: 0;
|
||||
border-radius: 8rpx;
|
||||
|
||||
.scroll {
|
||||
$line-h: 60rpx;
|
||||
max-height: calc($line-h * 4);
|
||||
|
||||
.item {
|
||||
line-height: $line-h;
|
||||
padding: 0 20rpx;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
</style>
|
||||
57
pageProduct/add-Product/components/choose-haocai - 副本.vue
Normal file
57
pageProduct/add-Product/components/choose-haocai - 副本.vue
Normal file
@@ -0,0 +1,57 @@
|
||||
<template>
|
||||
<up-popup :round="10" :show="popShow" :closeable="true" @close="close">
|
||||
<view class="u-text-center font-bold u-font-32 u-p-t-30">选择状态</view>
|
||||
<view style="height: 20rpx;"></view>
|
||||
<view class="u-p-30 all-list u-flex u-flex-wrap gap-20">
|
||||
<view class="all-list-item" :class="{active:statusItemIndex==statusData.allListSel}" @click="changeAllListSel(statusItemIndex)" v-for="(statusItem,statusItemIndex) in statusData.allList" :key="statusItemIndex">
|
||||
{{statusItem.label}}
|
||||
</view>
|
||||
</view>
|
||||
<view class="u-flex u-p-t-30 u-p-b-30 u-p-l-20 u-p-r-20 gap-20">
|
||||
<up-button @click="close">取消</up-button>
|
||||
<up-button type="primary" @click="confirm">确定</up-button>
|
||||
</view>
|
||||
</up-popup>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, watch } from 'vue';
|
||||
const props=defineProps({
|
||||
show:{
|
||||
type:Boolean,
|
||||
default:false
|
||||
}
|
||||
})
|
||||
|
||||
let popShow=ref(props.show)
|
||||
const emits=defineEmits(['update:show','close','confirm'])
|
||||
function close(){
|
||||
popShow.value=false
|
||||
}
|
||||
function confirm(){
|
||||
popShow.value=false
|
||||
}
|
||||
watch(()=>props.show,(newval)=>{
|
||||
popShow.value=newval
|
||||
})
|
||||
watch(()=>popShow.value,(newval)=>{
|
||||
emits('update:show',newval)
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.all-list-item{
|
||||
text-align: center;
|
||||
width: 156rpx;
|
||||
white-space: nowrap;
|
||||
color: #666;
|
||||
padding: 10rpx 20rpx;
|
||||
border-radius: 8rpx;
|
||||
transition: all .2s ease-in-out;
|
||||
border: 1px solid #eee;
|
||||
&.active {
|
||||
color: $my-main-color;
|
||||
border-color: $my-main-color;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
149
pageProduct/add-Product/components/choose-haocai.vue
Normal file
149
pageProduct/add-Product/components/choose-haocai.vue
Normal file
@@ -0,0 +1,149 @@
|
||||
<template>
|
||||
<view class="u-relative choose-haocai">
|
||||
<view class="input u-flex" @click="toggle">
|
||||
<!-- <view>
|
||||
<text v-if="modelValue">{{modelValue}}</text>
|
||||
<text v-else class="color-666">请选择</text>
|
||||
</view> -->
|
||||
<up-input @blur="blur" @change="filterHaocaiList" border="none" v-model="text" placeholder="请选择"></up-input>
|
||||
<up-icon :size="10" name="arrow-down-fill"></up-icon>
|
||||
</view>
|
||||
<view class="u-absolute" v-if="popShow">
|
||||
<scroll-view scroll-y="true" class="scroll">
|
||||
<view class="item" v-for="(item,index) in $haocaiList" :key="index" @click="haocaiClick(item,index)">
|
||||
{{item.conName}}
|
||||
</view>
|
||||
<view class="item no-wrap" @click="toggle" v-if="text&&!$haocaiList.length">没有该耗材</view>
|
||||
</scroll-view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {
|
||||
reactive,
|
||||
ref,
|
||||
watch,
|
||||
onMounted
|
||||
} from 'vue';
|
||||
const props = defineProps({
|
||||
listMap: {
|
||||
type: Object,
|
||||
default: () => {}
|
||||
},
|
||||
list: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
},
|
||||
modelValue: {
|
||||
type: [String, Number],
|
||||
default: ''
|
||||
},
|
||||
show: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
|
||||
})
|
||||
let text = ref('')
|
||||
let popShow = ref(props.show)
|
||||
const emits = defineEmits(['update:show', 'close', 'confirm', 'update:modelValue','change'])
|
||||
|
||||
function close() {
|
||||
popShow.value = false
|
||||
}
|
||||
|
||||
function confirm() {
|
||||
popShow.value = false
|
||||
}
|
||||
watch(() => props.show, (newval) => {
|
||||
popShow.value = newval
|
||||
})
|
||||
watch(() => popShow.value, (newval) => {
|
||||
emits('update:show', newval)
|
||||
})
|
||||
let $haocaiList = ref(props.list)
|
||||
watch(() => props.list, (newval) => {
|
||||
$haocaiList.value = newval
|
||||
setText()
|
||||
})
|
||||
watch(() => props.modelValue, (newval) => {
|
||||
setText()
|
||||
})
|
||||
|
||||
function setText() {
|
||||
const item = props.listMap[props.modelValue]
|
||||
text.value = item ? item.conName : ''
|
||||
}
|
||||
|
||||
function toggle(e) {
|
||||
popShow.value = !popShow.value
|
||||
}
|
||||
|
||||
function filterHaocaiList(e) {
|
||||
if (e === '') {
|
||||
return $haocaiList.value = props.list
|
||||
}
|
||||
const arr = props.list.filter(v => v.conName.match(e))
|
||||
$haocaiList.value = arr
|
||||
}
|
||||
|
||||
function haocaiClick(item, index) {
|
||||
console.log(item);
|
||||
if (item.consId != props.modelValue) {
|
||||
emits('update:modelValue', item.consId)
|
||||
emits('change', item)
|
||||
}
|
||||
popShow.value = false
|
||||
}
|
||||
|
||||
function blur() {
|
||||
setTimeout(()=>{
|
||||
popShow.value = false
|
||||
},100)
|
||||
}
|
||||
onMounted(() => {
|
||||
setText()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.choose-haocai {
|
||||
.input {
|
||||
width: 172rpx;
|
||||
padding: 10rpx 16rpx;
|
||||
height: 60rpx;
|
||||
box-sizing: border-box;
|
||||
background: #FFFFFF;
|
||||
border-radius: 8rpx 8rpx 8rpx 8rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
border: 2rpx solid #E5E5E5;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
.u-absolute {
|
||||
top: calc(100% + 10rpx);
|
||||
border: 1px solid #E5E5E5;
|
||||
left: 0;
|
||||
background-color: #fff;
|
||||
z-index: 10;
|
||||
right: 0;
|
||||
border-radius: 8rpx;
|
||||
|
||||
.scroll {
|
||||
$line-h: 60rpx;
|
||||
max-height: calc($line-h * 4);
|
||||
|
||||
.item {
|
||||
line-height: $line-h;
|
||||
padding: 0 20rpx;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
</style>
|
||||
359
pageProduct/add-Product/components/edit-haocai.vue
Normal file
359
pageProduct/add-Product/components/edit-haocai.vue
Normal file
@@ -0,0 +1,359 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="default-box-padding bg-fff border-r-18">
|
||||
<view class="u-flex u-row-between">
|
||||
<view>商品名称</view>
|
||||
<template v-if="isSku">
|
||||
<view class="u-flex u-font-24 color-666">
|
||||
<view class="u-m-r-20">绑定至规格</view>
|
||||
<up-switch :size="18" v-model="isBindGuige" :disabled="!isSku">绑定至规格</up-switch>
|
||||
</view>
|
||||
</template>
|
||||
</view>
|
||||
<view class="border-bottom u-m-t-16 u-p-b-32">{{goods.name}}</view>
|
||||
<view class="">
|
||||
<template v-if="isBindGuige&&isSku">
|
||||
<view class="list">
|
||||
<view class="u-p-b-32 u-p-t-32 border-bottom" v-for="(item,index) in skuList" :key="index">
|
||||
<view>规格名称</view>
|
||||
<view class="u-m-t-16">{{item.specSnap}}</view>
|
||||
<view class="color-666 u-m-t-24 u-flex">
|
||||
<view class="xuhao">序号</view>
|
||||
<view class="u-flex u-flex-1 u-p-l-32 gap-20">
|
||||
<view class="u-flex-1">耗材名称</view>
|
||||
<view class="u-flex-1">单位</view>
|
||||
<view class="u-flex-1">用量</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="u-m-t-32 color-666">
|
||||
<view class="u-m-t-24" v-for="(haocai,haocaiIndex) in item.haoaiList"
|
||||
:key="haocaiIndex">
|
||||
<view class=" u-flex">
|
||||
<view class="xuhao">{{haocaiIndex+1}}</view>
|
||||
<view class="u-flex u-flex-1 u-p-l-32 gap-20">
|
||||
<view class="u-flex-1 ">
|
||||
<view class="u-flex input">
|
||||
<view>{{item.name}}</view>
|
||||
<up-icon :size="10" name="arrow-down-fill"></up-icon>
|
||||
</view>
|
||||
</view>
|
||||
<view class="u-flex-1 ">
|
||||
<view class="u-flex input">
|
||||
<view>{{item.unit}}</view>
|
||||
<up-icon :size="10" name="arrow-down-fill"></up-icon>
|
||||
</view>
|
||||
</view>
|
||||
<view class="u-flex-1 ">
|
||||
<view class="u-flex input">
|
||||
<up-input border="none"></up-input>
|
||||
<up-icon color="#EB4F4F" @click="delGuigeHaocao(index,haocaiIndex)"
|
||||
:size="16" name="minus-circle-fill"></up-icon>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="u-flex u-m-t-16 color-666 u-font-24">
|
||||
<view class="xuhao">
|
||||
</view>
|
||||
<view class="u-flex u-flex-1 u-p-l-32 gap-20">库存:{{item.stockNumber}}
|
||||
</view>
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
</view>
|
||||
<view class="u-flex">
|
||||
<view class=" u-p-t-32 u-flex" @click="addGuigeHaocai(index)">
|
||||
<up-icon :size="18" color="#318AFE" name="plus-circle-fill"></up-icon>
|
||||
<view class="u-m-l-16">添加耗材</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<template v-else>
|
||||
<view class="list">
|
||||
<view class="u-p-b-32 u-p-t-32 border-bottom" v-for="(item,index) in conInfos" :key="index">
|
||||
<view class="color-666 u-flex">
|
||||
<view class="xuhao">序号</view>
|
||||
<view class="u-flex u-flex-1 u-p-l-32 gap-20">
|
||||
<view class="u-flex-1">耗材名称</view>
|
||||
<view class="u-flex-1">单位</view>
|
||||
<view class="u-flex-1">用量</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="u-m-t-32 color-666">
|
||||
<view class=" u-m-t-24 u-flex">
|
||||
<view class="xuhao">{{index+1}}</view>
|
||||
<view class="u-flex u-flex-1 u-p-l-32 gap-20">
|
||||
<view class="u-flex-1 ">
|
||||
<choose-haocai @change="conInfosChange($event,item)" :listMap="$haocaiMap"
|
||||
:list="haoCaiList" v-model="item.conInfoId"></choose-haocai>
|
||||
<!-- <view class="u-flex input">
|
||||
<view>{{item.conName}}</view>
|
||||
<up-icon :size="10" name="arrow-down-fill"></up-icon>
|
||||
</view> -->
|
||||
</view>
|
||||
<view class="u-flex-1 ">
|
||||
<choose-danwei :listMap="$danweiMap" :list="danweiList"
|
||||
v-model="item.conUnit"></choose-danwei>
|
||||
<!-- <view class="u-flex input">
|
||||
<view>{{item.conUnit}}</view>
|
||||
<up-icon :size="10" name="arrow-down-fill"></up-icon>
|
||||
</view> -->
|
||||
</view>
|
||||
<view class="u-flex-1 ">
|
||||
<view class="u-flex input">
|
||||
<up-input border="none" v-model="item.surplusStock"></up-input>
|
||||
<up-icon @click="delHaocai(index)" color="#EB4F4F" :size="16"
|
||||
name="minus-circle-fill"></up-icon>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="u-flex u-m-t-16 u-font-24" v-if="item.stockNumber">
|
||||
<view class="xuhao">
|
||||
|
||||
</view>
|
||||
<view class="u-flex u-flex-1 u-p-l-32 gap-20">库存:{{item.stockNumber}}
|
||||
{{item.conUnit}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<template v-if="!isBindGuige">
|
||||
<view class="u-flex">
|
||||
<view class=" u-p-t-32 u-flex" @click="addHaocai">
|
||||
<up-icon :size="18" color="#318AFE" name="plus-circle-fill"></up-icon>
|
||||
<view class="u-m-l-16">添加耗材</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</template>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
<view class="default-box-padding bg-fff border-r-18 u-flex u-row-between u-m-t-32">
|
||||
<view>当某个耗材的使用库存不足时,商品自动
|
||||
售罄。</view>
|
||||
<view class="u-flex u-p-l-32">
|
||||
<up-switch :size="20"></up-switch>
|
||||
</view>
|
||||
</view>
|
||||
<view class="bottom">
|
||||
<my-button type="primary" shape="circle" @click="save">保存</my-button>
|
||||
<my-button bgColor="#F9F9F9" shape="circle" color="#999" @click="cancel">取消</my-button>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {
|
||||
ref,
|
||||
reactive,
|
||||
toRefs,
|
||||
watch,
|
||||
computed,
|
||||
onMounted
|
||||
}
|
||||
from 'vue';
|
||||
import {
|
||||
getviewConSku,
|
||||
gettbProductSpec,
|
||||
gettbConsInfo,
|
||||
posttbProskuCons,
|
||||
puttbProskuCon,
|
||||
deletetbProskuCon,
|
||||
} from "@/http/yskApi/consumable.js";
|
||||
import {
|
||||
tbShopCurrencyGet,$hasPermission
|
||||
} from '@/http/yskApi/shop.js'
|
||||
|
||||
import chooseHaocai from './choose-haocai.vue';
|
||||
import chooseDanwei from './choose-danwei.vue';
|
||||
import {
|
||||
$tbProskuConV2
|
||||
} from '@/http/yskApi/goods.js'
|
||||
const emits=defineEmits(['cancel'])
|
||||
function cancel(){
|
||||
emits('cancel')
|
||||
}
|
||||
const props = defineProps({
|
||||
goods: {
|
||||
type: Object,
|
||||
default: () => {
|
||||
return {
|
||||
conInfos: [],
|
||||
skuList: [],
|
||||
typeEnum: ''
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const conInfos = ref(props.goods.conInfos)
|
||||
watch(() => props.goods.conInfos, (newval) => {
|
||||
console.log(newval);
|
||||
conInfos.value = newval
|
||||
})
|
||||
function conInfosChange(newval, item) {
|
||||
console.log(newval);
|
||||
item.stockNumber = newval.balance
|
||||
item.conUnit = newval.conUnit
|
||||
}
|
||||
|
||||
const skuList = ref(props.goods.skuList)
|
||||
watch(() => props.goods.skuList, (newval) => {
|
||||
console.log(newval);
|
||||
skuList.value = newval
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function addHaocai() {
|
||||
conInfos.value.push({
|
||||
conInfoId: '',
|
||||
conUnit: '',
|
||||
surplusStock: ''
|
||||
})
|
||||
}
|
||||
const popup = reactive({
|
||||
haocai: {
|
||||
show: true
|
||||
}
|
||||
})
|
||||
|
||||
function addGuigeHaocai(index) {
|
||||
console.log(index);
|
||||
}
|
||||
|
||||
function delHaocai(index) {
|
||||
const item = conInfos.value[index]
|
||||
uni.showModal({
|
||||
title: '提示',
|
||||
content: '是否删除该耗材',
|
||||
success(res) {
|
||||
if (res.confirm) {
|
||||
if (item.id) {
|
||||
deletetbProskuCon([item.id]).then(res1 => {
|
||||
conInfos.value.splice(index, 1)
|
||||
})
|
||||
} else {
|
||||
conInfos.value.splice(index, 1)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
function delGuigeHaocao(guigeIndex, haocaiIndex) {
|
||||
skuList.value[guigeIndex].haoaiList.splice(haocaiIndex, 1)
|
||||
}
|
||||
|
||||
// 是否是多规格商品
|
||||
const isSku = computed(() => {
|
||||
return props.goods.typeEnum == 'sku'
|
||||
})
|
||||
let isBindGuige = ref(isSku.value)
|
||||
watch(() => props.goods.typeEnum, (newval) => {
|
||||
isBindGuige.value = isSku.value
|
||||
})
|
||||
|
||||
function save() {
|
||||
console.log('save');
|
||||
const isPas= conInfos.value.every(v=>{
|
||||
return v.conInfoId&&v.conUnit&&v.surplusStock>0
|
||||
})
|
||||
console.log(isPas);
|
||||
return
|
||||
let ajaxData = ''
|
||||
if (!isBindGuige.value) {
|
||||
//绑定至商品
|
||||
ajaxData = conInfos.value.map(v => {
|
||||
return {
|
||||
conInfoId: v.conInfoId,
|
||||
productId: props.goods.id,
|
||||
shopId: uni.getStorageSync('shopId'),
|
||||
productSkuId: 0,
|
||||
surplusStock: v.surplusStock
|
||||
}
|
||||
})
|
||||
} else {
|
||||
|
||||
}
|
||||
console.log(ajaxData);
|
||||
$tbProskuConV2(ajaxData)
|
||||
}
|
||||
|
||||
let haoCaiList = ref([])
|
||||
let $haocaiMap = reactive({})
|
||||
let danweiList = ref([])
|
||||
let $danweiMap = reactive({})
|
||||
|
||||
function init() {
|
||||
gettbConsInfo({
|
||||
page: 0,
|
||||
size: 200
|
||||
}).then(res => {
|
||||
for (let i in res.content) {
|
||||
const item = res.content[i]
|
||||
$haocaiMap[item.consId] = item
|
||||
}
|
||||
haoCaiList.value = res.content
|
||||
|
||||
})
|
||||
tbShopCurrencyGet({
|
||||
page: 0,
|
||||
size: 200
|
||||
}).then(res => {
|
||||
for (let i in res.content) {
|
||||
const item = res.content[i]
|
||||
$danweiMap[item.id] = item
|
||||
}
|
||||
danweiList.value = res.content
|
||||
})
|
||||
}
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.bottom {
|
||||
padding: 84rpx 82rpx;
|
||||
}
|
||||
|
||||
.xuhao {
|
||||
width: 52rpx;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.input {
|
||||
width: 172rpx;
|
||||
padding: 10rpx 16rpx;
|
||||
height: 60rpx;
|
||||
box-sizing: border-box;
|
||||
background: #FFFFFF;
|
||||
border-radius: 8rpx 8rpx 8rpx 8rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
border: 2rpx solid #E5E5E5;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.list .border-bottom:last-child {
|
||||
border: none;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user