2 Commits

19 changed files with 3029 additions and 2389 deletions

View File

@@ -8,9 +8,9 @@
:height="height" :height="height"
:maxCount="maxCount" :maxCount="maxCount"
> >
<template #default v-if="$slots.default"> <!-- <template #default v-if="$slots.default">
<slot></slot> <slot></slot>
</template> </template> -->
</up-upload> </up-upload>
</template> </template>

View File

@@ -14,6 +14,16 @@ export function categoryPage(data, urlType = 'product') {
} }
}) })
} }
/**
* 获取分类详情
* @returns
*/
export function getCategoryDetail(id, urlType = 'product') {
return request({
url: `${urlType}/admin/prod/category/`+id,
method: "GET",
})
}
/** /**
* 分类添加 * 分类添加

View File

@@ -14,7 +14,19 @@ export function getConsPage(data, urlType = 'product') {
} }
}) })
} }
/**
* 耗材库存列表接口
* @returns
*/
export function getConsStock(data, urlType = 'product') {
return request({
url: `${urlType}/admin/product/cons/consStock`,
method: "GET",
data: {
...data
}
})
}
/** /**
* 获取耗材列表 * 获取耗材列表
* @returns * @returns

View File

@@ -13,15 +13,22 @@
</view> </view>
<view class=""> <view class="">
<uni-forms-item label="分类名称" required name="name"> <uni-forms-item label="分类名称" required name="name">
<uni-easyinput padding-none :placeholderStyle="'font-size:28rpx;'" <uni-easyinput padding-none :placeholderStyle="'font-size:28rpx;'" :inputBorder="false"
:inputBorder="false" v-model="category.name" placeholder="输入分类名称" /> v-model="category.name" placeholder="输入分类名称" />
</uni-forms-item>
</view>
<view class="">
<uni-forms-item label="退菜是否退库存" required name=" refundMode">
<up-radio-group v-model="category.refundMode" placement="row">
<up-radio v-for="(item, index) in refundModes" :key="index" :label="item.name"
:name="item.value" activeColor="rgb(49, 138, 254)"></up-radio>
</up-radio-group>
</uni-forms-item> </uni-forms-item>
</view> </view>
<template v-if="option.type==='edit'"> <template v-if="option.type==='edit'">
<uni-forms-item label="排序" required name="sort"> <uni-forms-item label="排序" required name="sort">
<uni-easyinput padding-none :placeholderStyle="'font-size:28rpx;'" <uni-easyinput padding-none :placeholderStyle="'font-size:28rpx;'" :inputBorder="false"
:inputBorder="false" v-model="category.sort" type="number" v-model="category.sort" type="number" placeholder="排序越小越靠前" />
placeholder="排序越小越靠前" />
</uni-forms-item> </uni-forms-item>
</template> </template>
<uni-forms-item label=""> <uni-forms-item label="">
@@ -50,14 +57,35 @@
</template> </template>
<script setup> <script setup>
import { reactive, ref } from 'vue'; import {
reactive,
ref
} from 'vue';
import go from '@/commons/utils/go.js'; import go from '@/commons/utils/go.js';
import infoBox from '@/commons/utils/infoBox.js'; import infoBox from '@/commons/utils/infoBox.js';
import mySwitch from '@/components/my-components/my-switch' import mySwitch from '@/components/my-components/my-switch'
import myUploadFile from '@/components/my-components/my-upload-file' import myUploadFile from '@/components/my-components/my-upload-file'
import { onLoad, onReady } from '@dcloudio/uni-app'; import {
import { addCategory, putCategory } from '@/http/api/cateGory.js' onLoad,
onReady
} from '@dcloudio/uni-app';
import {
addCategory,
putCategory
} from '@/http/api/cateGory.js'
const refundModes = [{
name: "退菜退库存",
value: 1
},
{
name: "仅退菜不退库存",
value: 2
},
{
name: "每次询问-退菜后弹窗提示",
value: 3
},
]
// 构造分类的基础数据 // 构造分类的基础数据
const category = reactive({ const category = reactive({
@@ -121,6 +149,7 @@
} }
} }
} }
function validateFunc(key, value) { function validateFunc(key, value) {
if (validateFuncObj.hasOwnProperty(key)) { if (validateFuncObj.hasOwnProperty(key)) {
const func = validateFuncObj[key] const func = validateFuncObj[key]

View File

@@ -18,6 +18,12 @@
<view>预警值</view> <view>预警值</view>
<view><input type="number" placeholder="请输入预警值" v-model="datas.form.conWarning" name="" id="" /></view> <view><input type="number" placeholder="请输入预警值" v-model="datas.form.conWarning" name="" id="" /></view>
</view> </view>
<view>
<view>是否检测耗材</view>
<up-switch size="20" :inactive-value="0" :active-value="1" v-model="datas.form.isStock"></up-switch>
</view>
<view v-if="!datas.form.id" style="justify-content: space-between"> <view v-if="!datas.form.id" style="justify-content: space-between">
<view>耗材类型</view> <view>耗材类型</view>
<view style="width: 54%" @tap="datas.show = !datas.show"> <view style="width: 54%" @tap="datas.show = !datas.show">
@@ -55,7 +61,8 @@
<view class="label">默认入库单位</view> <view class="label">默认入库单位</view>
<view class="ipt"> <view class="ipt">
<u-radio-group v-model="datas.form.defaultUnit"> <u-radio-group v-model="datas.form.defaultUnit">
<u-radio :name="item" :label="item" v-for="(item, index) in unitList" :key="index"></u-radio> <u-radio :name="item" :label="item" v-for="(item, index) in unitList"
:key="index"></u-radio>
</u-radio-group> </u-radio-group>
</view> </view>
</view> </view>
@@ -63,19 +70,30 @@
</view> </view>
</template> </template>
<view class="bottombutton"> <view class="bottombutton">
<up-button type="primary" style="background-color: #318afe; color: #fff" @tap="sumbit" :plain="true" text="保存"></up-button> <up-button type="primary" style="background-color: #318afe; color: #fff" @tap="sumbit" :plain="true"
text="保存"></up-button>
</view> </view>
<up-picker :show="datas.show" :columns="datas.typeList" keyName="name" @cancel="datas.show = false" @confirm="confirmConsGroup"></up-picker> <up-picker :show="datas.show" :columns="datas.typeList" keyName="name" @cancel="datas.show = false"
@confirm="confirmConsGroup"></up-picker>
<!-- 消息提示 --> <!-- 消息提示 -->
<up-toast ref="uToastRef"></up-toast> <up-toast ref="uToastRef"></up-toast>
<u-picker :show="unitShow" :columns="unitList"></u-picker> <u-picker :show="unitShow" :columns="unitList"></u-picker>
</template> </template>
<script setup> <script setup>
import { ref, reactive } from 'vue'; import {
import { onLoad } from '@dcloudio/uni-app'; ref,
reactive
} from 'vue';
import {
onLoad
} from '@dcloudio/uni-app';
import { getConsGrpupList, addCons, editCons } from '@/http/api/cons.js'; import {
getConsGrpupList,
addCons,
editCons
} from '@/http/api/cons.js';
let datas = reactive({ let datas = reactive({
show: false, show: false,
@@ -87,7 +105,8 @@ let datas = reactive({
consGroupId: null, consGroupId: null,
conUnitTwo: '', // 第二单位 conUnitTwo: '', // 第二单位
conUnitTwoConvert: '', // 第二单位转换数量 conUnitTwoConvert: '', // 第二单位转换数量
defaultUnit: '' defaultUnit: '',
isStock: 1,
}, },
consGroupName: '', consGroupName: '',
typeList: [] typeList: []
@@ -148,9 +167,13 @@ let sumbit = async () => {
return; return;
} }
if (!datas.form.id) { if (!datas.form.id) {
await addCons({ ...datas.form }); await addCons({
...datas.form
});
} else { } else {
await editCons({ ...datas.form }); await editCons({
...datas.form
});
} }
uni.navigateBack(); uni.navigateBack();
}; };
@@ -191,7 +214,7 @@ page {
.df; .df;
>view:first-child { >view:first-child {
width: 190rpx; width: 240rpx;
height: 84rpx; height: 84rpx;
line-height: 84rpx; line-height: 84rpx;
// text-align: left; // text-align: left;
@@ -233,10 +256,12 @@ page {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.tips-wrap { .tips-wrap {
--pColor: #e6a23c; --pColor: #e6a23c;
--iColor: #fdf6ec; --iColor: #fdf6ec;
padding: 0 28upx; padding: 0 28upx;
.content { .content {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -248,10 +273,12 @@ page {
flex-direction: column; flex-direction: column;
padding-left: 10px; padding-left: 10px;
gap: 8upx; gap: 8upx;
.t1 { .t1 {
font-size: 32upx; font-size: 32upx;
color: var(--pColor); color: var(--pColor);
} }
.t2 { .t2 {
font-size: 24upx; font-size: 24upx;
color: var(--pColor); color: var(--pColor);
@@ -259,13 +286,16 @@ page {
} }
} }
} }
.form-wrap { .form-wrap {
padding: 28upx 28upx 0; padding: 28upx 28upx 0;
.form { .form {
padding: 28upx; padding: 28upx;
background-color: #fff; background-color: #fff;
border-radius: 16upx; border-radius: 16upx;
} }
.row { .row {
height: 84upx; height: 84upx;
display: flex; display: flex;
@@ -273,13 +303,16 @@ page {
align-items: center; align-items: center;
background-color: #fcfcfc; background-color: #fcfcfc;
padding: 0 20upx; padding: 0 20upx;
&:not(:last-child) { &:not(:last-child) {
margin-bottom: 28upx; margin-bottom: 28upx;
} }
.label { .label {
font-size: 32upx; font-size: 32upx;
color: #333; color: #333;
} }
.ipt { .ipt {
flex: 1; flex: 1;
} }

View File

@@ -12,25 +12,25 @@
<view> <view>
<view> <text style="color: red;">*</text> 入库时间 </view> <view> <text style="color: red;">*</text> 入库时间 </view>
<view> <view>
<up-datetime-picker <up-datetime-picker hasInput v-model="datas.form.inOutDate" mode="date"></up-datetime-picker>
hasInput
v-model="datas.form.inOutDate"
mode="date"
></up-datetime-picker>
</view> </view>
</view> </view>
<view> <view>
<view> <text style="color: red;">*</text> 入库数量 </view> <view> <text style="color: red;">*</text> 入库数量 </view>
<view> <input type="number" placeholder="请输入数量" v-model="datas.form.bodyList.inOutNumber" @change="datas.form.bodyList.inOutNumber = $utils.isNumber(datas.form.bodyList.inOutNumber)" name="" id=""> </view> <view> <input type="number" placeholder="请输入数量" v-model="datas.form.bodyList.inOutNumber"
@change="datas.form.bodyList.inOutNumber = $utils.isNumber(datas.form.bodyList.inOutNumber)"
name="" id=""> </view>
</view> </view>
<view> <view>
<view> <text style="color: red;">*</text>单价 </view> <view> <text style="color: red;">*</text>单价 </view>
<view> <input type="number" placeholder="请输入单价(元)" v-model="datas.form.bodyList.purchasePrice" @change="datas.form.bodyList.purchasePrice = $utils.isMoney(datas.form.bodyList.purchasePrice)" name="" id=""> </view> <view> <input type="number" placeholder="请输入单价(元)" v-model="datas.form.bodyList.purchasePrice"
@change="datas.form.bodyList.purchasePrice = $utils.isMoney(datas.form.bodyList.purchasePrice)"
name="" id=""> </view>
</view> </view>
<view style="justify-content: space-between;"> <view style="justify-content: space-between;">
<view> 单位 </view> <view> 单位 </view>
<view> <input type="text" placeholder="请输入单位" v-model="datas.form.bodyList.conUnit" name="" id=""> </view> <view> <input type="text" placeholder="请输入单位" v-model="datas.form.bodyList.conUnit" name="" id="">
</view>
</view> </view>
<view> <view>
<view> 应付金额 </view> <view> 应付金额 </view>
@@ -43,7 +43,8 @@
<view style="justify-content: space-between;align-items: center;"> <view style="justify-content: space-between;align-items: center;">
<view> 供应商 </view> <view> 供应商 </view>
<picker @change="changeNowStatusIndex" :value="nowStatusIndex" :range="datas.status"> <picker @change="changeNowStatusIndex" :value="nowStatusIndex" :range="datas.status">
<view class="color-333" style="height: 84rpx;line-height: 84rpx;">{{datas.status[nowStatusIndex]}}</view> <view class="color-333" style="height: 84rpx;line-height: 84rpx;">{{datas.status[nowStatusIndex]}}
</view>
</picker> </picker>
<uni-icons type="bottom" size="16"></uni-icons> <uni-icons type="bottom" size="16"></uni-icons>
<view style="color: #318AFE;width: 80rpx;text-align: center;" @tap="toggle"> 新增 </view> <view style="color: #318AFE;width: 80rpx;text-align: center;" @tap="toggle"> 新增 </view>
@@ -64,13 +65,24 @@
<script setup> <script setup>
import { ref, computed, reactive } from 'vue'; import {
import { onShow, onLoad } from '@dcloudio/uni-app'; ref,
computed,
reactive
} from 'vue';
import {
onShow,
onLoad
} from '@dcloudio/uni-app';
import go from '@/commons/utils/go.js'; import go from '@/commons/utils/go.js';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { getVendorPage } from '@/http/api/vendor.js'; import {
import { consStockIn } from '@/http/api/cons.js'; getVendorPage
} from '@/http/api/vendor.js';
import {
consStockIn
} from '@/http/api/cons.js';
let showStatus = ref(false) let showStatus = ref(false)
let datas = reactive({ let datas = reactive({
@@ -157,10 +169,11 @@
datas.form.bodyList.conId = datas.item.id datas.form.bodyList.conId = datas.item.id
datas.form.bodyList = [datas.form.bodyList] datas.form.bodyList = [datas.form.bodyList]
datas.form.inOutDate = dayjs(datas.form.inOutDate).format('YYYY-MM-DD') datas.form.inOutDate = dayjs(datas.form.inOutDate).format('YYYY-MM-DD')
consStockIn({ consStockIn({
...datas.form, ...datas.form,
// 供应商id // 供应商id
vendorId: datas.list[nowStatusIndex.value].id, vendorId: datas.list[nowStatusIndex.value]?datas.list[nowStatusIndex.value].id:'',
amountPayable: datas.form.bodyList[0].inOutNumber * datas.form.bodyList[0].purchasePrice, amountPayable: datas.form.bodyList[0].inOutNumber * datas.form.bodyList[0].purchasePrice,
}).then(res => { }).then(res => {
uni.$utils.showToast("保存成功") uni.$utils.showToast("保存成功")
@@ -194,9 +207,11 @@
list-style: none; list-style: none;
padding: 0; padding: 0;
} }
::v-deep.u-input { ::v-deep.u-input {
border: none !important; border: none !important;
} }
.status { .status {
margin: 0 32rpx; margin: 0 32rpx;
position: absolute; position: absolute;

View File

@@ -42,6 +42,7 @@ async function getProductListAjax() {
mask: true mask: true
}); });
const res = await getProductList(); const res = await getProductList();
console.log('res',res);
list.value = res; list.value = res;
} catch (error) { } catch (error) {
console.log(error); console.log(error);

View File

@@ -4,15 +4,16 @@
<my-tabs :list="tabsList" v-model="tabsCurrent"></my-tabs> <my-tabs :list="tabsList" v-model="tabsCurrent"></my-tabs>
</up-sticky> </up-sticky>
<view class="box"> <view class="box">
<template v-if="tabsCurrent === 0"> <view class="basic" v-show="tabsCurrent === 0">
<view class="basic"> <uni-forms :model="FormData" :rules="rules" :border="true" label-position="top"
<uni-forms :model="FormData" :rules="rules" :border="true" label-position="top" err-show-type="toast" validateTrigger="submit" label-width="350" ref="Forms"> err-show-type="toast" validateTrigger="submit" label-width="350" ref="Forms">
<view class="block"> <view class="block">
<view class="border-top-0 typeEnum"> <view class="border-top-0 typeEnum">
<uni-forms-item label="商品类型" required showRequired> <uni-forms-item label="商品类型" required showRequired>
<up-radio-group v-model="FormData.type" @change="changeFormDatatype"> <up-radio-group v-model="FormData.type" @change="changeFormDatatype">
<view style="display: flex; flex-wrap: wrap; justify-content: flex-start"> <view style="display: flex; flex-wrap: wrap; justify-content: flex-start">
<view v-for="(item, index) in pageData.types" :key="index" style="margin-right: 30rpx"> <view v-for="(item, index) in pageData.types" :key="index"
style="margin-right: 30rpx">
<up-radio :label="item.name" :name="item.value"></up-radio> <up-radio :label="item.name" :name="item.value"></up-radio>
</view> </view>
</view> </view>
@@ -23,65 +24,45 @@
<view class="" v-if="FormData.type === 'package'"> <view class="" v-if="FormData.type === 'package'">
<uni-forms-item label="套餐商品"> <uni-forms-item label="套餐商品">
<up-radio-group v-model="FormData.groupType" placement="row"> <up-radio-group v-model="FormData.groupType" placement="row">
<up-radio <up-radio :custom-style="{ marginRight: '30px' }"
:custom-style="{ marginRight: '30px' }" v-for="(item, index) in packageType.list" :key="index" :label="item.name"
v-for="(item, index) in packageType.list" :name="item.value"></up-radio>
:key="index"
:label="item.name"
:name="item.value"
></up-radio>
</up-radio-group> </up-radio-group>
</uni-forms-item> </uni-forms-item>
</view> </view>
<uni-forms-item required name="name" label="商品名称" showRequired> <uni-forms-item required name="name" label="商品名称" showRequired>
<uni-easyinput <uni-easyinput :paddingNone="inputPaddingNone" :placeholderStyle="placeholderStyle"
:paddingNone="inputPaddingNone" :inputBorder="inputBorder" v-model="FormData.name" placeholder="请输入商品名称" />
:placeholderStyle="placeholderStyle"
:inputBorder="inputBorder"
v-model="FormData.name"
placeholder="请输入商品名称"
/>
</uni-forms-item> </uni-forms-item>
<uni-forms-item ref="fileItem" label="图片" required showRequired> <uni-forms-item ref="fileItem" label="图片" required showRequired>
<my-upload-file ref="refFile" :images="FormData.images" :imageStyles="imageStyles"></my-upload-file> <my-upload-file ref="refFile" :images="FormData.images"
:imageStyles="imageStyles"></my-upload-file>
<view class="u-m-t-16 color-999 u-font-24">:第一张图为商品封面图图片尺寸为750x750</view> <view class="u-m-t-16 color-999 u-font-24">:第一张图为商品封面图图片尺寸为750x750</view>
</uni-forms-item> </uni-forms-item>
<view class="u-relative"> <view class="u-relative">
<uni-forms-item label="商品分类" required showRequired name="categoryId"> <uni-forms-item label="商品分类" required showRequired name="categoryId">
<uni-data-picker <uni-data-picker :clear-icon="false" :map="{ text: 'name', value: 'id' }"
:clear-icon="false" placeholder="请选择商品分类" popup-title="请选择商品分类" :localdata="pageData.category"
:map="{ text: 'name', value: 'id' }" v-model="FormData.categoryId"></uni-data-picker>
placeholder="请选择商品分类"
popup-title="请选择商品分类"
:localdata="pageData.category"
v-model="FormData.categoryId"
></uni-data-picker>
</uni-forms-item> </uni-forms-item>
<view class="zhezhao u-absolute position-all" @click="canEditGoodsCategory(true)" v-if="option.type == 'edit' && disabledChangeCategory"></view> <view class="zhezhao u-absolute position-all" @click="canEditGoodsCategory(true)"
v-if="option.type == 'edit' && disabledChangeCategory"></view>
</view> </view>
<view class=""> <view class="">
<uni-forms-item label="单位" required showRequired name="units"> <uni-forms-item label="单位" required showRequired name="units">
<uni-data-picker <uni-data-picker :clear-icon="false" @change="unitIdChange"
:clear-icon="false" :map="{ text: 'name', value: 'id' }" placeholder="请选择单位" popup-title="请选择单位"
@change="unitIdChange" :localdata="pageData.units" v-model="FormData.unitId"></uni-data-picker>
:map="{ text: 'name', value: 'id' }"
placeholder="请选择单位"
popup-title="请选择单位"
:localdata="pageData.units"
v-model="FormData.unitId"
></uni-data-picker>
</uni-forms-item> </uni-forms-item>
</view> </view>
<template v-if="FormData.type === 'package'"> <template v-if="FormData.type === 'package'">
<view class="border-top" v-if="FormData.proGroupVo"> <view class="border-top" v-if="FormData.proGroupVo">
<view <view class="" v-if="
class=""
v-if="
(FormData.groupType == 1 && FormData.proGroupVo.length) || (FormData.groupType == 1 && FormData.proGroupVo.length) ||
(FormData.groupType == 0 && FormData.proGroupVo.length && FormData.proGroupVo[0].goods.length) (FormData.groupType == 0 && FormData.proGroupVo.length && FormData.proGroupVo[0].goods.length)
" ">
> <view class="border-bottom u-p-b-32"
<view class="border-bottom u-p-b-32" v-for="(item, index) in FormData.proGroupVo" :key="index"> v-for="(item, index) in FormData.proGroupVo" :key="index">
<view class="u-p-t-24" v-if="FormData.groupType == 1"> <view class="u-p-t-24" v-if="FormData.groupType == 1">
<view class="u-flex u-row-between"> <view class="u-flex u-row-between">
<view class="u-flex"> <view class="u-flex">
@@ -90,14 +71,17 @@
</view> </view>
<view class="u-flex color-999" @tap="delproGroupVo(index)"> <view class="u-flex color-999" @tap="delproGroupVo(index)">
<uni-icons type="minus-filled" :size="16" :color="$utils.ColorRed"></uni-icons> <uni-icons type="minus-filled" :size="16"
:color="$utils.ColorRed"></uni-icons>
<view class="u-m-l-10">删除套餐组</view> <view class="u-m-l-10">删除套餐组</view>
</view> </view>
</view> </view>
<view class="u-flex u-m-t-16"> <view class="u-flex u-m-t-16">
<up-input v-model="item.title" placeholder="请输入套餐名称"></up-input> <up-input v-model="item.title" placeholder="请输入套餐名称"></up-input>
<view class="u-flex color-main u-font-24 u-m-l-24" @click="proGroupVoAddGoods(index, item.goods)"> <view class="u-flex color-main u-font-24 u-m-l-24"
<up-icon name="plus" :size="12" :color="$utils.ColorMain"></up-icon> @click="proGroupVoAddGoods(index, item.goods)">
<up-icon name="plus" :size="12"
:color="$utils.ColorMain"></up-icon>
<view class="font-bold">添加商品</view> <view class="font-bold">添加商品</view>
</view> </view>
</view> </view>
@@ -113,19 +97,25 @@
<view class="u-p-r-40">数量</view> <view class="u-p-r-40">数量</view>
</view> </view>
</view> </view>
<view class="u-flex row u-p-24 u-row-between" v-for="(product, goodsIndex) in item.goods" :key="goodsIndex"> <view class="u-flex row u-p-24 u-row-between"
v-for="(product, goodsIndex) in item.goods" :key="goodsIndex">
<view class="u-flex u-flex-1"> <view class="u-flex u-flex-1">
<view class=" "> <view class=" ">
{{ product.name || product.proName }} {{ product.name || product.proName }}
</view> </view>
</view> </view>
<view class="u-flex u-row-center u-flex-1"> <view class="u-flex u-row-center u-flex-1">
<view @click="refChooseGuigeOpen(product.skuList, index, goodsIndex)" class=""> <view
<template v-if="!product.skuName && product.type == 'sku'"> @click="refChooseGuigeOpen(product.skuList, index, goodsIndex)"
<up-button type="primary" size="mini">设置规格</up-button> class="">
<template
v-if="!product.skuName && product.type == 'sku'">
<up-button type="primary"
size="mini">设置规格</up-button>
</template> </template>
<template v-else> <template v-else>
<text class="color-main">{{ product.skuName }}</text> <text
class="color-main">{{ product.skuName }}</text>
</template> </template>
</view> </view>
</view> </view>
@@ -136,7 +126,8 @@
</view> </view>
<view class="u-flex u-text-right u-flex-1 u-row-right"> <view class="u-flex u-text-right u-flex-1 u-row-right">
<view class="u-flex u-p-r-30"> <view class="u-flex u-p-r-30">
<up-number-box :button-size="14" integer v-model="product.number"> <up-number-box :button-size="14" integer
v-model="product.number">
<template #minus> <template #minus>
<view class="minus"> <view class="minus">
<up-icon name="minus" size="12"></up-icon> <up-icon name="minus" size="12"></up-icon>
@@ -149,7 +140,9 @@
</template> </template>
</up-number-box> </up-number-box>
</view> </view>
<up-icon @click="proGroupVoGoodsDel(index, goodsIndex)" size="14" name="trash" :color="$utils.ColorMain"></up-icon> <up-icon @click="proGroupVoGoodsDel(index, goodsIndex)"
size="14" name="trash"
:color="$utils.ColorMain"></up-icon>
</view> </view>
</view> </view>
</view> </view>
@@ -160,20 +153,24 @@
<text class="font-bold">几选几</text> <text class="font-bold">几选几</text>
</view> </view>
<view class="u-flex u-m-t-16"> <view class="u-flex u-m-t-16">
<uni-number-box :min="1" :max="item.goods.length" :width="200" v-model="item.number" placeholder="几选几"></uni-number-box> <uni-number-box :min="1" :max="item.goods.length" :width="200"
v-model="item.number" placeholder="几选几"></uni-number-box>
</view> </view>
</template> </template>
</view> </view>
</view> </view>
<template v-if="FormData.groupType == 1"> <template v-if="FormData.groupType == 1">
<view class="bg-fff u-flex u-p-t-24 u-p-b-24 border-r-12" @tap="proGroupVoPush"> <view class="bg-fff u-flex u-p-t-24 u-p-b-24 border-r-12" @tap="proGroupVoPush">
<uni-icons type="plus-filled" :color="$utils.ColorMain" :size="20"></uni-icons> <uni-icons type="plus-filled" :color="$utils.ColorMain"
:size="20"></uni-icons>
<view class="u-m-l-16">添加套餐组</view> <view class="u-m-l-16">添加套餐组</view>
</view> </view>
</template> </template>
<template v-else> <template v-else>
<view class="bg-fff u-flex u-p-t-24 u-p-b-24 border-r-12" @tap="proGroupVoAddGoods()"> <view class="bg-fff u-flex u-p-t-24 u-p-b-24 border-r-12"
<uni-icons type="plus-filled" :color="$utils.ColorMain" :size="20"></uni-icons> @tap="proGroupVoAddGoods()">
<uni-icons type="plus-filled" :color="$utils.ColorMain"
:size="20"></uni-icons>
<view class="u-m-l-16">添加商品</view> <view class="u-m-l-16">添加商品</view>
</view> </view>
</template> </template>
@@ -182,13 +179,8 @@
<view class=""> <view class="">
<uni-forms-item label="商品描述"> <uni-forms-item label="商品描述">
<uni-easyinput <uni-easyinput :paddingNone="inputPaddingNone" :placeholderStyle="placeholderStyle"
:paddingNone="inputPaddingNone" type="textarea" v-model="FormData.shortTitle" placeholder="请填写商品简述" />
:placeholderStyle="placeholderStyle"
type="textarea"
v-model="FormData.shortTitle"
placeholder="请填写商品简述"
/>
</uni-forms-item> </uni-forms-item>
</view> </view>
</view> </view>
@@ -222,7 +214,8 @@
<text>原价</text> <text>原价</text>
</view> </view>
<view class="u-m-t-16"> <view class="u-m-t-16">
<price-number-box placeholder="请输入原价" v-model="sku.originPrice"></price-number-box> <price-number-box placeholder="请输入原价"
v-model="sku.originPrice"></price-number-box>
</view> </view>
</view> </view>
<view class="u-flex-1"> <view class="u-flex-1">
@@ -231,7 +224,8 @@
<text>售价</text> <text>售价</text>
</view> </view>
<view class="u-m-t-16"> <view class="u-m-t-16">
<price-number-box placeholder="请输入售价" v-model="sku.salePrice"></price-number-box> <price-number-box placeholder="请输入售价"
v-model="sku.salePrice"></price-number-box>
</view> </view>
</view> </view>
</view> </view>
@@ -242,7 +236,8 @@
<text>会员价</text> <text>会员价</text>
</view> </view>
<view class="u-m-t-16"> <view class="u-m-t-16">
<price-number-box placeholder="请输入会员价(元)" v-model="sku.memberPrice"></price-number-box> <price-number-box placeholder="请输入会员价(元)"
v-model="sku.memberPrice"></price-number-box>
</view> </view>
</view> </view>
<view class="u-flex-1"> <view class="u-flex-1">
@@ -251,7 +246,8 @@
<text>成本价</text> <text>成本价</text>
</view> </view>
<view class="u-m-t-16"> <view class="u-m-t-16">
<price-number-box placeholder="请输入成本价" v-model="sku.costPrice"></price-number-box> <price-number-box placeholder="请输入成本价"
v-model="sku.costPrice"></price-number-box>
</view> </view>
</view> </view>
</view> </view>
@@ -261,7 +257,8 @@
<text>起售数量</text> <text>起售数量</text>
</view> </view>
<view class="u-m-t-16"> <view class="u-m-t-16">
<price-number-box inputType="number" placeholder="请输入起售数量" v-model="sku.suitNum"></price-number-box> <price-number-box inputType="number" placeholder="请输入起售数量"
v-model="sku.suitNum"></price-number-box>
</view> </view>
</view> </view>
<view class="u-m-t-24"> <view class="u-m-t-24">
@@ -314,11 +311,12 @@
<uni-forms-item label=""> <uni-forms-item label="">
<view class="u-flex u-row-between"> <view class="u-flex u-row-between">
<view class="label-title">上架</view> <view class="label-title">上架</view>
<my-switch disabled :openDisabledClass="false" @click="isGroundingChange" v-model="FormData.isSale"></my-switch> <my-switch disabled :openDisabledClass="false" @click="isGroundingChange"
v-model="FormData.isSale"></my-switch>
</view> </view>
</uni-forms-item> </uni-forms-item>
</view> </view>
<uni-forms-item label=""> <!-- <uni-forms-item label="">
<view class="u-flex u-row-between"> <view class="u-flex u-row-between">
<view class="label-title">库存开关</view> <view class="label-title">库存开关</view>
<my-switch v-model="FormData.isStock"></my-switch> <my-switch v-model="FormData.isStock"></my-switch>
@@ -341,7 +339,7 @@
</uni-forms-item> </uni-forms-item>
<view class="u-absolute position-all" v-if="disabledStock" @click="canEditGoodsStock(true)"></view> <view class="u-absolute position-all" v-if="disabledStock" @click="canEditGoodsStock(true)"></view>
</view> </view>
</template> </template> -->
<uni-forms-item label=""> <uni-forms-item label="">
<view class="u-flex u-row-between"> <view class="u-flex u-row-between">
@@ -351,33 +349,51 @@
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="打包费"> <uni-forms-item label="打包费">
<uni-easyinput <uni-easyinput @blur="priceFormat(FormData, 'packFee')"
@blur="priceFormat(FormData, 'packFee')" :paddingNone="inputPaddingNone" :placeholderStyle="placeholderStyle"
:paddingNone="inputPaddingNone" :inputBorder="inputBorder" v-model="FormData.packFee" type="digit"
:placeholderStyle="placeholderStyle" placeholder="请输入打包费" />
:inputBorder="inputBorder"
v-model="FormData.packFee"
type="digit"
placeholder="请输入打包费"
/>
</uni-forms-item> </uni-forms-item>
<template v-if="option.type === 'edit'"> <template v-if="option.type === 'edit'">
<uni-forms-item label="排序"> <uni-forms-item label="排序">
<uni-easyinput <uni-easyinput @blur="priceFormat(FormData, 'sort')"
@blur="priceFormat(FormData, 'sort')" :paddingNone="inputPaddingNone" :placeholderStyle="placeholderStyle"
:paddingNone="inputPaddingNone" :inputBorder="inputBorder" v-model="FormData.sort" type="digit"
:placeholderStyle="placeholderStyle" placeholder="请输入排序" />
:inputBorder="inputBorder"
v-model="FormData.sort"
type="digit"
placeholder="请输入排序"
/>
</uni-forms-item> </uni-forms-item>
</template> </template>
<uni-forms-item label="关联推荐商品">
<view class="tips">
</view>
</template>
</uni-forms>
<view style="height: 100rpx"></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 fontWeight="700" shape="circle" @tap="save">保存</my-button>
</view>
</view>
</view>
<template v-if="tabsCurrent === 1">
<edit-haocai @updateGoods="updateGoodsDetail" :goods="FormData"
v-model:isAutoSoldStock="FormData.isAutoSoldStock"
v-model:refundMode="FormData.refundMode"
@cancel="changeTabsCurrent(0)"></edit-haocai>
</template>
<template v-if="tabsCurrent === 2">
<view class="link-goods">
<view class="font-bold">关联推荐商品</view>
<view class="tips u-m-t-10">
<text class="t">设置商品后,用户可以在商品详情页中看到推荐商品,最多设置{{ goodsListMax }}个商品</text> <text class="t">设置商品后,用户可以在商品详情页中看到推荐商品,最多设置{{ goodsListMax }}个商品</text>
</view> </view>
<view class="table"> <view class="table">
@@ -403,7 +419,8 @@
<text class="t">{{ item.name }}</text> <text class="t">{{ item.name }}</text>
</view> </view>
<view class="td"> <view class="td">
<u-text type="error" text="删除" @click="FormData.relatedRecommendJson.splice(index, 1)"></u-text> <u-text type="error" text="删除"
@click="FormData.relatedRecommendJson.splice(index, 1)"></u-text>
</view> </view>
</view> </view>
<view class="table-tips" v-if="!FormData.relatedRecommendJson.length"> <view class="table-tips" v-if="!FormData.relatedRecommendJson.length">
@@ -413,48 +430,47 @@
</view> </view>
<view class="add-goods" v-if="FormData.relatedRecommendJson.length < goodsListMax"> <view class="add-goods" v-if="FormData.relatedRecommendJson.length < goodsListMax">
<view class="btn"> <view class="btn">
<u-text type="primary" text="添加商品" prefixIcon="plus" iconStyle="color:#409EFF;" @click="toSelectGoodsPage"></u-text> <u-text type="primary" text="添加商品" prefixIcon="plus" iconStyle="color:#409EFF;"
</view> @click="toSelectGoodsPage"></u-text>
</view>
</uni-forms-item>
</view>
</template>
</uni-forms>
<view style="height: 100rpx"></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 fontWeight="700" shape="circle" @tap="save">保存</my-button>
</view> </view>
</view> </view>
</view> </view>
</template>
<template v-if="tabsCurrent === 1">
<edit-haocai @updateGoods="updateGoodsDetail" :goods="FormData" @cancel="changeTabsCurrent(0)"></edit-haocai>
</template> </template>
</view> </view>
<!-- 删除弹窗 --> <!-- 删除弹窗 -->
<my-model @confirm="delmodelConfirm" ref="delModel" desc="确认删除"></my-model> <my-model @confirm="delmodelConfirm" ref="delModel" desc="确认删除"></my-model>
<!-- 选择商品 --> <!-- 选择商品 -->
<choose-goods ref="refChooseGoods" @confirm="refChooseGoodsConfirm" :category="pageData.category"></choose-goods> <choose-goods ref="refChooseGoods" @confirm="refChooseGoodsConfirm"
:category="pageData.category"></choose-goods>
<!-- 选择规格 --> <!-- 选择规格 -->
<choose-guige ref="refChooseGuige" @confirm="refChooseGuigeConfirm"></choose-guige> <choose-guige ref="refChooseGuige" @confirm="refChooseGuigeConfirm"></choose-guige>
</view> </view>
</template> </template>
<script setup> <script setup>
import { computed, onBeforeUnmount, reactive, ref, watch, nextTick } from 'vue'; import {
import { onLoad, onShow, onReady } from '@dcloudio/uni-app'; computed,
onBeforeUnmount,
reactive,
ref,
watch,
nextTick
} from 'vue';
import {
onLoad,
onShow,
onReady
} from '@dcloudio/uni-app';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { formatPrice } from '@/commons/utils/format.js'; import {
formatPrice
} from '@/commons/utils/format.js';
import go from '@/commons/utils/go.js'; import go from '@/commons/utils/go.js';
import linkGoods from './components/link-goods.vue';
import chooseGoods from './components/choose-goods'; import chooseGoods from './components/choose-goods';
import chooseGuige from './components/choose-guige'; import chooseGuige from './components/choose-guige';
import editHaocai from './components/edit-haocai.vue'; import editHaocai from './components/edit-haocai.vue';
@@ -463,12 +479,26 @@ import priceNumberBox from './components/price-number-box';
import infoBox from '@/commons/utils/infoBox.js'; import infoBox from '@/commons/utils/infoBox.js';
import { hasPermission } from '@/commons/utils/hasPermission.js'; import {
hasPermission
} from '@/commons/utils/hasPermission.js';
import { $defaultSku } from '@/commons/goodsData.js'; import {
$defaultSku
} from '@/commons/goodsData.js';
import { getCategoryList, getProdUnitList, getProductDetail, addProduct, updateProduct, delProduct, productBindCons } from '@/http/api/product.js'; import {
import { uploadFile } from '@/http/api/index.js'; getCategoryList,
getProdUnitList,
getProductDetail,
addProduct,
updateProduct,
delProduct,
productBindCons
} from '@/http/api/product.js';
import {
uploadFile
} from '@/http/api/index.js';
const imageStyles = reactive({ const imageStyles = reactive({
width: 82, width: 82,
@@ -518,7 +548,9 @@ function getLocalSelectGoods() {
}); });
return; return;
} }
FormData.relatedRecommendJson.push({ ...res }); FormData.relatedRecommendJson.push({
...res
});
} }
uni.setStorageSync('packageSelectGoods', ''); uni.setStorageSync('packageSelectGoods', '');
} }
@@ -551,7 +583,8 @@ const FormData = reactive({
packFee: 0, //打包费 packFee: 0, //打包费
sort: 1, //排序值 sort: 1, //排序值
specName: '', //规格模版名称 specName: '', //规格模版名称
isAutoSoldStock:0,
isRefundStock:1,
unitName: '', unitName: '',
specificationsGroup: '', specificationsGroup: '',
relatedRecommendJson: [] // 关联商品 relatedRecommendJson: [] // 关联商品
@@ -559,8 +592,7 @@ const FormData = reactive({
//页面全部数据 //页面全部数据
const pageData = reactive({ const pageData = reactive({
// 商品类型 // 商品类型
types: [ types: [{
{
name: '单规格商品', name: '单规格商品',
value: 'single' value: 'single'
}, },
@@ -589,12 +621,10 @@ const pageData = reactive({
skuList: [] skuList: []
}); });
const skuList = reactive({ const skuList = reactive({
list: [ list: [{
{
...$defaultSku, ...$defaultSku,
barCode: `${uni.getStorageSync('shopId')}${dayjs().valueOf()}` barCode: `${uni.getStorageSync('shopId')}${dayjs().valueOf()}`
} }]
]
}); });
let $goodsData = {}; let $goodsData = {};
@@ -619,12 +649,10 @@ watch(
} }
} else { } else {
if (newval != 'sku') { if (newval != 'sku') {
skuList.list = [ skuList.list = [{
{
...$defaultSku, ...$defaultSku,
barCode: `${uni.getStorageSync('shopId')}${dayjs().valueOf()}` barCode: `${uni.getStorageSync('shopId')}${dayjs().valueOf()}`
} }];
];
} else { } else {
skuList.list = []; skuList.list = [];
} }
@@ -635,12 +663,10 @@ watch(
} else { } else {
FormData.specId = ''; FormData.specId = '';
if (newval != 'sku') { if (newval != 'sku') {
skuList.list = [ skuList.list = [{
{
...$defaultSku, ...$defaultSku,
barCode: `${uni.getStorageSync('shopId')}${dayjs().valueOf()}` barCode: `${uni.getStorageSync('shopId')}${dayjs().valueOf()}`
} }];
];
} else { } else {
skuList.list = []; skuList.list = [];
} }
@@ -920,7 +946,15 @@ function refChooseGoodsClose() {
function refChooseGoodsConfirm(arr) { function refChooseGoodsConfirm(arr) {
refChooseGoodsClose(); refChooseGoodsClose();
arr = arr.map((v) => { arr = arr.map((v) => {
const { proId, id, name, unitName, lowPrice, type, skuList } = v; const {
proId,
id,
name,
unitName,
lowPrice,
type,
skuList
} = v;
if (proId) { if (proId) {
return v; return v;
} }
@@ -979,8 +1013,7 @@ function priceFormat(item, key) {
* 套餐商品类型 * 套餐商品类型
*/ */
const packageType = reactive({ const packageType = reactive({
list: [ list: [{
{
name: '固定套餐', name: '固定套餐',
value: 0 value: 0
}, },
@@ -992,14 +1025,13 @@ const packageType = reactive({
sel: 0 sel: 0
}); });
const tabsList = ['基础设置', '耗材绑定']; const tabsList = ['基础设置', '耗材设置', '关联推荐商品'];
let tabsCurrent = ref(0); let tabsCurrent = ref(0);
const Forms = ref(null); const Forms = ref(null);
const delModel = ref(null); const delModel = ref(null);
const rules = { const rules = {
images: { images: {
rules: [ rules: [{
{
validateFunction: function(rule, value, data, callback) { validateFunction: function(rule, value, data, callback) {
console.log(value); console.log(value);
if (value.length < 1) { if (value.length < 1) {
@@ -1007,12 +1039,10 @@ const rules = {
} }
return true; return true;
} }
} }]
]
}, },
name: { name: {
rules: [ rules: [{
{
required: true, required: true,
errorMessage: '请输入商品名称' errorMessage: '请输入商品名称'
}, },
@@ -1024,20 +1054,16 @@ const rules = {
] ]
}, },
categoryId: { categoryId: {
rules: [ rules: [{
{
required: true, required: true,
errorMessage: '请选择商品分类' errorMessage: '请选择商品分类'
} }]
]
}, },
floorPrice: { floorPrice: {
rules: [ rules: [{
{
required: true, required: true,
errorMessage: '请填写商品底价' errorMessage: '请填写商品底价'
} }]
]
} }
}; };
@@ -1065,7 +1091,8 @@ function delmodelConfirm() {
} }
function updateGoodsDetail() { function updateGoodsDetail() {
getGoodsDetail(); // getGoodsDetail();
save()
} }
let timer = null; let timer = null;
@@ -1087,7 +1114,10 @@ async function save() {
Forms.value Forms.value
.validate() .validate()
.then((res) => { .then((res) => {
const { groupType, type } = FormData; const {
groupType,
type
} = FormData;
const images = refFile.value.getFileList(); const images = refFile.value.getFileList();
if (images.length <= 0) { if (images.length <= 0) {
@@ -1286,14 +1316,12 @@ function returnTimerTimeText() {
} }
function initDefaultProGroupVo() { function initDefaultProGroupVo() {
FormData.proGroupVo = [ FormData.proGroupVo = [{
{
title: '', title: '',
count: 1, count: 1,
number: 1, number: 1,
goods: [] goods: []
} }];
];
console.log(FormData.proGroupVo); console.log(FormData.proGroupVo);
} }
@@ -1362,6 +1390,7 @@ page {
font-size: 28upx; font-size: 28upx;
color: #999; color: #999;
} }
.barCode { .barCode {
border: 1px solid #e5e5e5; border: 1px solid #e5e5e5;
border-radius: 8rpx 8rpx 8rpx 8rpx; border-radius: 8rpx 8rpx 8rpx 8rpx;
@@ -1441,11 +1470,9 @@ page {
z-index: 9; z-index: 9;
} }
.minus { .minus {}
}
.plus { .plus {}
}
.box { .box {
margin-top: 32rpx; margin-top: 32rpx;
@@ -1480,6 +1507,32 @@ page {
color: #333; color: #333;
} }
.link-goods {
background-color: #fff;
padding: 32rpx 20rpx;
}
::v-deep .link-goods .uni-forms-item {
align-items: inherit;
}
::v-deep .link-goods .typeEnum .u-radio-group--row {
flex-wrap: nowrap;
justify-content: space-between;
}
::v-deep .link-goods .typeEnum .u-checkbox-group--row {
flex-wrap: nowrap;
justify-content: space-between;
}
::v-deep .link-goods .uni-forms-item .uni-forms-item__label {
text-indent: 0;
font-size: 28rpx !important;
font-weight: bold;
color: #333;
}
::v-deep .stock .uni-forms-item { ::v-deep .stock .uni-forms-item {
min-height: initial !important; min-height: initial !important;
} }
@@ -1618,48 +1671,60 @@ page {
} }
} }
} }
.table { .table {
border: 1px solid #ececec; border: 1px solid #ececec;
margin-top: 28upx; margin-top: 28upx;
.table-tips { .table-tips {
padding: 28upx; padding: 28upx;
display: flex; display: flex;
justify-content: center; justify-content: center;
.t { .t {
font-size: 28upx; font-size: 28upx;
color: #999; color: #999;
} }
} }
.tabhead { .tabhead {
background-color: #f8f8f8; background-color: #f8f8f8;
border-bottom: 1px solid #ececec; border-bottom: 1px solid #ececec;
.t { .t {
font-weight: bold; font-weight: bold;
} }
} }
.tr { .tr {
display: flex; display: flex;
&:not(:last-child) { &:not(:last-child) {
border-bottom: 1px solid #ececec; border-bottom: 1px solid #ececec;
} }
.td { .td {
flex: 1; flex: 1;
min-height: 80upx; min-height: 80upx;
display: flex; display: flex;
align-items: center; align-items: center;
padding: 20upx; padding: 20upx;
&:not(:last-child) { &:not(:last-child) {
border-right: 1px solid #ececec; border-right: 1px solid #ececec;
} }
&:nth-child(2) { &:nth-child(2) {
flex: 2; flex: 2;
} }
.cover { .cover {
$size: 80upx; $size: 80upx;
width: $size; width: $size;
height: $size; height: $size;
border-radius: 8upx; border-radius: 8upx;
} }
.t { .t {
font-size: 28upx; font-size: 28upx;
color: #333; color: #333;
@@ -1667,6 +1732,7 @@ page {
} }
} }
} }
.add-goods { .add-goods {
display: flex; display: flex;
justify-content: center; justify-content: center;

View File

@@ -145,7 +145,7 @@
let obj = pageData.types.find(item=> item.value == e) let obj = pageData.types.find(item=> item.value == e)
return obj.name return obj.name
} }
let selArr=[]
getGoods() getGoods()
/** /**
* 获取商品列表 * 获取商品列表
@@ -200,7 +200,6 @@
const show = ref(props.modelValue) const show = ref(props.modelValue)
let selArr=[]
let $selGoodsMap={} let $selGoodsMap={}
async function open(arr) { async function open(arr) {

View File

@@ -1,6 +1,7 @@
<template> <template>
<view> <view>
<view class="default-box-padding bg-fff border-r-18"> <view class="default-box-padding bg-fff border-r-18">
<view class="font-bold u-m-b-32">绑定耗材</view>
<view class="u-flex u-row-between"> <view class="u-flex u-row-between">
<view>商品名称</view> <view>商品名称</view>
</view> </view>
@@ -58,8 +59,25 @@
</view> </view>
</view> </view>
<view class="default-box-padding bg-fff border-r-18 u-flex u-row-between u-m-t-32"> <view class="default-box-padding bg-fff border-r-18 u-m-t-32">
<view>当某个耗材的使用库存不足时商品自动售罄</view> <view class="up-border-bottom u-p-b-32">
<view class="u-flex u-row-between ">
<view class="font-bold"> 自动售罄</view>
<up-switch :size="16" v-model="isAutoSoldStock" :inactive-value="0" :active-value="1"></up-switch>
</view>
<view class=" u-m-t-10">当某个耗材的使用库存不足时商品自动售罄</view>
</view>
<view class=" u-p-t-32">
<view class="">
<view class="font-bold u-m-b-16"> 退菜是否退库存</view>
<up-radio-group v-model="refundMode">
<up-radio v-for="(item,index) in tuiStockTypes" :key="index" :label="item.label"
:name="item.key"></up-radio>
</up-radio-group>
<view class="color-red u-m-t-10">当前店铺退菜退库存规则{{nowRefundRule}}</view>
</view>
</view>
</view> </view>
<view class="bottom"> <view class="bottom">
@@ -72,15 +90,42 @@
</template> </template>
<script setup> <script setup>
import { ref, reactive, watch, computed, onMounted } from 'vue'; import {
ref,
reactive,
watch,
computed,
onMounted
} from 'vue';
import infoBox from '@/commons/utils/infoBox.js' import infoBox from '@/commons/utils/infoBox.js'
import chooseHaocai from './choose-haocai.vue'; import chooseHaocai from './choose-haocai.vue';
import chooseDanwei from './choose-danwei.vue'; import chooseDanwei from './choose-danwei.vue';
import { hasPermission } from '@/commons/utils/hasPermission.js'; import {
hasPermission
} from '@/commons/utils/hasPermission.js';
import { getConsList } from '@/http/api/cons.js'; import {
import { productBindCons } from '@/http/api/product.js'; getConsList
} from '@/http/api/cons.js';
import {
productBindCons
} from '@/http/api/product.js';
const tuiStockTypes = ref([{
label: '退菜退库存',
key: 1
},
{
label: '仅退菜不退库存',
key: 2
},
{
label: '每次询问-退菜后弹窗提示,可手动选择',
key: 3
},
])
const isAutoSoldStock=defineModel('isAutoSoldStock',0)
const refundMode=defineModel('refundMode',1)
const emits = defineEmits(['cancel', 'updateGoods']) const emits = defineEmits(['cancel', 'updateGoods'])
@@ -91,12 +136,20 @@
return { return {
consList: [], consList: [],
skuList: [], skuList: [],
type: '' type: '',
isAutoSoldStock:0,
isRefundStock:1,
} }
} }
} }
}) })
const shopInfo=uni.getStorageSync('shopInfo')
const nowRefundRule=computed(()=>{
if(!shopInfo||!shopInfo.refundMode){
return ''
}
return shopInfo.refundMode==1?'跟随商品分类':'跟随单商品'
})
const pageData = reactive({ const pageData = reactive({
isBindGuige: false, //是否绑定至规格 isBindGuige: false, //是否绑定至规格
}) })
@@ -105,6 +158,7 @@
let $haocaiMap = reactive({}) let $haocaiMap = reactive({})
const skuList = ref(props.goods.skuList) const skuList = ref(props.goods.skuList)
const consList = ref(props.goods.consList || []) const consList = ref(props.goods.consList || [])
watch(() => props.goods.consList, (newval) => { watch(() => props.goods.consList, (newval) => {
consList.value = newval consList.value = newval
}) })
@@ -207,7 +261,6 @@
emits('updateGoods') emits('updateGoods')
infoBox.showToast('修改成功') infoBox.showToast('修改成功')
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@@ -0,0 +1,11 @@
<template>
<view>
<view></view>
</view>
</template>
<script setup>
</script>
<style lang="scss" scoped>
</style>

View File

@@ -6,10 +6,10 @@
<text class="">排序</text> <text class="">排序</text>
<text class="u-m-l-20">{{data.sort}}</text> <text class="u-m-l-20">{{data.sort}}</text>
</view> </view>
<view class="color-333 u-m-l-42 u-flex"> <!-- <view class="color-333 u-m-l-42 u-flex">
<text class="stock u-m-l-4">库存:{{data.stockNumber}}</text> <text class="stock u-m-l-4">库存:{{data.stockNumber}}</text>
<up-icon @click="editStock" name="edit-pen" :size="16" :color="$utils.ColorMain"></up-icon> <up-icon @click="editStock" name="edit-pen" :size="16" :color="$utils.ColorMain"></up-icon>
</view> </view> -->
</view> </view>
<view> <view>
<!-- <text class="u-font-28 color-666" @click="changePrice">改价</text> --> <!-- <text class="u-font-28 color-666" @click="changePrice">改价</text> -->

View File

@@ -3,39 +3,30 @@
<view class="page-cell"> <view class="page-cell">
<view class="label">头像</view> <view class="label">头像</view>
<view class="right"> <view class="right">
<up-avatar <up-avatar class="fileImg" :src="vdata.shopInfo.coverImg ? vdata.shopInfo.coverImg : ''"
class="fileImg" mode="aspectFill"></up-avatar>
:src="vdata.shopInfo.coverImg ? vdata.shopInfo.coverImg : ''"
mode="aspectFill"
></up-avatar>
<view class="file" @tap="chooseAndUploadAvatar('coverImg')"></view> <view class="file" @tap="chooseAndUploadAvatar('coverImg')"></view>
</view> </view>
</view> </view>
<!-- <view class="page-cell m" @tap="updateValue('商户名称','shopName',vdata.shopInfo.shopName)"> --> <!-- <view class="page-cell m" @tap="updateValue('商户名称','shopName',vdata.shopInfo.shopName)"> -->
<view <view class="page-cell m" @tap="
class="page-cell m"
@tap="
go.to('PAGES_SHOP_EDITVAL', { go.to('PAGES_SHOP_EDITVAL', {
name: 'shopName', name: 'shopName',
value: vdata.shopInfo.shopName, value: vdata.shopInfo.shopName,
}) })
" ">
>
<view class="label">商户名称</view> <view class="label">商户名称</view>
<view class="right"> <view class="right">
<view>{{ vdata.shopInfo.shopName }}</view> <view>{{ vdata.shopInfo.shopName }}</view>
<up-icon name="arrow-right" color="#999999" size="15"></up-icon> <up-icon name="arrow-right" color="#999999" size="15"></up-icon>
</view> </view>
</view> </view>
<view <view class="page-cell m" @tap="
class="page-cell m"
@tap="
go.to('PAGES_SHOP_EDITVAL', { go.to('PAGES_SHOP_EDITVAL', {
name: 'phone', name: 'phone',
value: vdata.shopInfo.phone, value: vdata.shopInfo.phone,
}) })
" ">
>
<view class="label">商户电话</view> <view class="label">商户电话</view>
<view class="right"> <view class="right">
<view>{{ vdata.shopInfo.phone }}</view> <view>{{ vdata.shopInfo.phone }}</view>
@@ -49,14 +40,8 @@
<view class="page-cell m"> <view class="page-cell m">
<view class="label">营业状态</view> <view class="label">营业状态</view>
<view class="right"> <view class="right">
<up-switch <up-switch v-model="vdata.shopInfo.status" size="20" :inactiveValue="2" :activeValue="1"
v-model="vdata.shopInfo.status" activeColor="#0FC161" @change="switchChange('status')"></up-switch>
size="20"
:inactiveValue="2"
:activeValue="1"
activeColor="#0FC161"
@change="switchChange('status')"
></up-switch>
</view> </view>
</view> </view>
<view class="page-cell m" @tap="showMap"> <view class="page-cell m" @tap="showMap">
@@ -72,58 +57,31 @@
</view> --> </view> -->
<view class="page-cell"> <view class="page-cell">
<view class="label">允许打包</view> <view class="label">允许打包</view>
<view class="right" <view class="right"><up-switch v-model="vdata.takeout" size="20" activeColor="#0FC161"
><up-switch @change="switchChange('eatModel')"></up-switch></view>
v-model="vdata.takeout"
size="20"
activeColor="#0FC161"
@change="switchChange('eatModel')"
></up-switch
></view>
</view> </view>
<view class="page-cell m"> <view class="page-cell m">
<view class="label">是否开启会员余额支付</view> <view class="label">是否开启会员余额支付</view>
<view class="right"> <view class="right">
<up-switch <up-switch v-model="vdata.shopInfo.isAccountPay" size="20" :inactiveValue="0" :activeValue="1"
v-model="vdata.shopInfo.isAccountPay" activeColor="#0FC161" @change="switchChange('isAccountPay')"></up-switch>
size="20"
:inactiveValue="0"
:activeValue="1"
activeColor="#0FC161"
@change="switchChange('isAccountPay')"
></up-switch>
</view> </view>
</view> </view>
<view class="page-cell m"> <view class="page-cell m">
<view class="label">是否开启数签子</view> <view class="label">是否开启数签子</view>
<view class="right"> <view class="right">
<up-switch <up-switch v-model="vdata.shopInfo.isCountStick" size="20" :inactiveValue="0" :activeValue="1"
v-model="vdata.shopInfo.isCountStick" activeColor="#0FC161" @change="switchChange('isCountStick')"></up-switch>
size="20"
:inactiveValue="0"
:activeValue="1"
activeColor="#0FC161"
@change="switchChange('isCountStick')"
></up-switch>
</view> </view>
</view> </view>
<view class="page-cell m" style="display: block"> <view class="page-cell m" style="display: block">
<view class="u-flex u-row-between"> <view class="u-flex u-row-between">
<view class="label">点餐电子围栏</view> <view class="label">点餐电子围栏</view>
<view class="right" <view class="right"><up-switch v-model="vdata.shopInfo.isOrderFence" size="20" :inactiveValue="0"
><up-switch :activeValue="1" activeColor="#0FC161" @change="switchChange('isOrderFence')"></up-switch>
v-model="vdata.shopInfo.isOrderFence"
size="20"
:inactiveValue="0"
:activeValue="1"
activeColor="#0FC161"
@change="switchChange('isOrderFence')"
></up-switch
></view>
</view> </view>
<view class="u-m-t-6 color-666 u-font-24" </view>
>开启后用户只能在店铺附近两公里范围内点餐</view <view class="u-m-t-6 color-666 u-font-24">开启后用户只能在店铺附近两公里范围内点餐</view>
>
</view> </view>
<!-- <view class="page-cell m"> <!-- <view class="page-cell m">
@@ -142,29 +100,20 @@
<view class="page-cell"> <view class="page-cell">
<view class="label"> <view class="label">
桌位费 桌位费
<view <view v-if="!vdata.isTableFee" class="tableFee" @tap="
v-if="!vdata.isTableFee"
class="tableFee"
@tap="
go.to('PAGES_SHOP_EDITVAL', { go.to('PAGES_SHOP_EDITVAL', {
name: 'tableFee', name: 'tableFee',
value: vdata.shopInfo.tableFee, value: vdata.shopInfo.tableFee,
}) })
" ">
>
{{ vdata.shopInfo.tableFee }} {{ vdata.shopInfo.tableFee }}
</view> </view>
</view> </view>
<view class="right"> <view class="right">
<view> <view>
<up-checkbox-group> <up-checkbox-group>
<up-checkbox <up-checkbox label="免桌位费" v-model:checked="vdata.isTableFee" activeColor="#0FC161"
label="免桌位费" shape="circle" @change="isTableFeeChange"></up-checkbox>
v-model:checked="vdata.isTableFee"
activeColor="#0FC161"
shape="circle"
@change="isTableFeeChange"
></up-checkbox>
</up-checkbox-group> </up-checkbox-group>
</view> </view>
</view> </view>
@@ -186,45 +135,74 @@
</view> </view>
</view> --> </view> -->
<view class="page-cell m"> <view class="page-cell">
<view class="label">付费模式</view> <view class="label">付费模式</view>
<view class="right"> <view class="right">
<up-radio-group v-model="vdata.shopInfo.registerType" placement="row"> <up-radio-group v-model="vdata.shopInfo.registerType" placement="row">
<up-radio <up-radio :customStyle="{ marginRight: '10px' }" v-for="(item, index) in vdata.registerTypeList"
:customStyle="{ marginRight: '10px' }" :key="index" :label="item.name" :name="item.value" activeColor="#0FC161"
v-for="(item, index) in vdata.registerTypeList" @change="radioChange"></up-radio>
:key="index"
:label="item.name"
:name="item.value"
activeColor="#0FC161"
@change="radioChange"
></up-radio>
</up-radio-group> </up-radio-group>
</view> </view>
</view> </view>
<view <view class="page-cell m">
class="page-cell" <view class="label">退菜退库存模式</view>
@tap=" <view class="right">
<up-radio-group v-model="vdata.shopInfo.refundMode" placement="row">
<up-radio v-for="(item, index) in vdata.refund_modes" :key="index" :label="item.name"
:name="item.value" activeColor="#0FC161" @change="refundModeChange"></up-radio>
</up-radio-group>
</view>
</view>
<view class="page-cell" @tap="
go.to('PAGES_SHOP_QRCODE', { go.to('PAGES_SHOP_QRCODE', {
paymentQrcode: vdata.shopInfo.paymentQrcode, paymentQrcode: vdata.shopInfo.paymentQrcode,
}) })
" ">
>
<view class="label">店铺收款码</view> <view class="label">店铺收款码</view>
<view class="right" <view class="right"><up-icon name="arrow-right" color="#999999" size="15"></up-icon></view>
><up-icon name="arrow-right" color="#999999" size="15"></up-icon
></view>
</view> </view>
<!-- <view class="cutShop" @tap="go.to('PAGES_SHOP_LIST')">切换门店</view> --> <!-- <view class="cutShop" @tap="go.to('PAGES_SHOP_LIST')">切换门店</view> -->
<up-modal :show="refundMode.show" title="提示" asyncClose android-*=""
showCancelButton
@close="refundMode.show=false"
@cancel="refundModeCancel"
@confirm="refundModeConfirm"
>
<view>
<view class="u-font-28">
<text>当前操作退菜退库存模式切换为</text>
<text class="color-red">{{refundMode.mode}}</text>
</view>
<view class="u-font-28 color-666 u-m-t-12">
<text class="">修改后可前往商品管理-商品分类中编辑/查看配置</text>
</view>
<view class="u-m-t-40 u-font-28 color-red">
本操作将会影响耗材库存数量的统计请谨慎操作
</view>
</view>
</up-modal>
</view> </view>
</template> </template>
<script setup> <script setup>
import { ref, reactive, onMounted } from "vue"; import {
import { onShow } from "@dcloudio/uni-app"; ref,
reactive,
onMounted
} from "vue";
import {
onShow
} from "@dcloudio/uni-app";
import go from "@/commons/utils/go.js"; import go from "@/commons/utils/go.js";
import { uploadFile } from "@/http/api/index.js"; import {
uploadFile
} from "@/http/api/index.js";
import { import {
getShopInfo, getShopInfo,
editShopInfo, editShopInfo,
@@ -232,6 +210,31 @@ import {
editShopExtend, editShopExtend,
} from "@/http/api/shop.js"; } from "@/http/api/shop.js";
const refundMode = reactive({
show: false,
mode: ''
})
function refundModeCancel(){
vdata.shopInfo.refundMode=vdata.shopInfo.refundMode==1?2:1
refundMode.show = false
}
function refundModeConfirm(){
let params = {
id: vdata.shopInfo.id,
refundMode: vdata.shopInfo.refundMode,
};
updateShopInfo(params);
refundMode.show = false
}
function refundModeChange(e) {
console.log(e);
const item = vdata.refund_modes.find(v => v.value == e)
if (item) {
refundMode.mode = item.name
}
refundMode.show = true
}
const vdata = reactive({ const vdata = reactive({
shopInfo: { shopInfo: {
status: 2, status: 2,
@@ -239,9 +242,23 @@ const vdata = reactive({
isMemberPrice: 0, isMemberPrice: 0,
}, },
extendList: [], extendList: [],
registerTypeList: [ registerTypeList: [{
{ name: "先付费", value: "before" }, name: "先付费",
{ name: "后付费", value: "after" }, value: "before"
},
{
name: "后付费",
value: "after"
},
],
refund_modes: [{
name: "跟随商品分类",
value: 1
},
{
name: "跟随单商品",
value: 2
},
], ],
extendIndex: 0, extendIndex: 0,
extendInfo: {}, extendInfo: {},
@@ -281,7 +298,9 @@ let refreshData = (e) => {
* 获取店铺信息 * 获取店铺信息
*/ */
const shopInfo = () => { const shopInfo = () => {
getShopInfo({ id: uni.getStorageSync("shopInfo").id }).then((res) => { getShopInfo({
id: uni.getStorageSync("shopInfo").id
}).then((res) => {
vdata.isTableFee = res.isTableFee == 1 ? true : false; vdata.isTableFee = res.isTableFee == 1 ? true : false;
if (res.eatModel.split(",").indexOf("dine-in") != -1) { if (res.eatModel.split(",").indexOf("dine-in") != -1) {
vdata.dineIn = true; vdata.dineIn = true;
@@ -326,6 +345,7 @@ let radioChange = (n) => {
updateShopInfo(params); updateShopInfo(params);
}; };
/** /**
* 修改 * 修改
*/ */
@@ -499,6 +519,7 @@ let showMap = () => {
.page-wrapper { .page-wrapper {
background-color: #f8f8f8; background-color: #f8f8f8;
padding-bottom: 32rpx; padding-bottom: 32rpx;
.page-cell { .page-cell {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@@ -506,6 +527,7 @@ let showMap = () => {
padding: 32rpx 28rpx; padding: 32rpx 28rpx;
box-sizing: border-box; box-sizing: border-box;
background-color: #fff; background-color: #fff;
.label { .label {
font-weight: bold; font-weight: bold;
font-size: 28rpx; font-size: 28rpx;
@@ -514,6 +536,7 @@ let showMap = () => {
align-items: center; align-items: center;
flex-shrink: 0; flex-shrink: 0;
margin-right: 20rpx; margin-right: 20rpx;
.tableFee { .tableFee {
width: 186rpx; width: 186rpx;
height: 54rpx; height: 54rpx;
@@ -528,14 +551,17 @@ let showMap = () => {
box-sizing: border-box; box-sizing: border-box;
} }
} }
.extendList { .extendList {
width: 100%; width: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin-top: 24rpx; margin-top: 24rpx;
.extendTab { .extendTab {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
.extendTab_item { .extendTab_item {
font-size: 24rpx; font-size: 24rpx;
font-weight: 400; font-weight: 400;
@@ -544,21 +570,25 @@ let showMap = () => {
border: 2rpx solid #e5e5e5; border: 2rpx solid #e5e5e5;
margin-right: 20rpx; margin-right: 20rpx;
} }
.active { .active {
background: #318afe; background: #318afe;
border: 2rpx solid #318afe; border: 2rpx solid #318afe;
color: #fff; color: #fff;
} }
} }
.extend_content { .extend_content {
display: flex; display: flex;
margin-top: 32rpx; margin-top: 32rpx;
.preview { .preview {
min-width: 146rpx; min-width: 146rpx;
height: 342rpx; height: 342rpx;
position: relative; position: relative;
margin-right: 32rpx; margin-right: 32rpx;
background-color: #f7f7f7; background-color: #f7f7f7;
::v-deep .bg, ::v-deep .bg,
::v-deep .bg .u-image, ::v-deep .bg .u-image,
::v-deep .bg .u-image__image { ::v-deep .bg .u-image__image {
@@ -603,6 +633,7 @@ let showMap = () => {
position: absolute; position: absolute;
top: 0; top: 0;
} }
::v-deep .bg.ticket_logo, ::v-deep .bg.ticket_logo,
::v-deep .bg.ticket_logo .u-image, ::v-deep .bg.ticket_logo .u-image,
::v-deep .bg.ticket_logo .u-image__image { ::v-deep .bg.ticket_logo .u-image__image {
@@ -611,6 +642,7 @@ let showMap = () => {
position: absolute; position: absolute;
top: 0; top: 0;
} }
::v-deep .ticket_logo.img .u-image, ::v-deep .ticket_logo.img .u-image,
::v-deep .ticket_logo.img .u-image__image { ::v-deep .ticket_logo.img .u-image__image {
width: 146rpx !important; width: 146rpx !important;
@@ -628,19 +660,23 @@ let showMap = () => {
background-color: #fff; background-color: #fff;
} }
} }
.extend_img { .extend_img {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.extend_title { .extend_title {
font-weight: 400; font-weight: 400;
font-size: 24rpx; font-size: 24rpx;
color: #333333; color: #333333;
margin-bottom: 16rpx; margin-bottom: 16rpx;
} }
.fileUp { .fileUp {
width: 148rpx; width: 148rpx;
height: 148rpx; height: 148rpx;
position: relative; position: relative;
.file { .file {
width: 148rpx; width: 148rpx;
height: 148rpx; height: 148rpx;
@@ -648,6 +684,7 @@ let showMap = () => {
top: 0; top: 0;
} }
} }
::v-deep .u-image, ::v-deep .u-image,
::v-deep .u-image__image { ::v-deep .u-image__image {
width: 148rpx !important; width: 148rpx !important;
@@ -657,15 +694,19 @@ let showMap = () => {
} }
} }
} }
.column { .column {
flex-direction: column; flex-direction: column;
.label { .label {
align-self: flex-start; align-self: flex-start;
} }
} }
.m { .m {
margin-bottom: 12rpx; margin-bottom: 12rpx;
} }
.cutShop { .cutShop {
width: 530rpx; width: 530rpx;
height: 80rpx; height: 80rpx;
@@ -701,6 +742,7 @@ let showMap = () => {
.fileImg { .fileImg {
width: 112rpx !important; width: 112rpx !important;
height: 112rpx !important; height: 112rpx !important;
::v-deep .u-avatar__image { ::v-deep .u-avatar__image {
width: 112rpx !important; width: 112rpx !important;
height: 112rpx !important; height: 112rpx !important;
@@ -708,4 +750,8 @@ let showMap = () => {
} }
} }
} }
.color-red {
color: red;
}
</style> </style>

View File

@@ -3,7 +3,9 @@
<up-image :src="data.coverImg" mode="aspectFill" :width="img.width" :height="img.height"></up-image> <up-image :src="data.coverImg" mode="aspectFill" :width="img.width" :height="img.height"></up-image>
<view class="info u-flex u-row-between u-col-top u-flex-col"> <view class="info u-flex u-row-between u-col-top u-flex-col">
<view class="limit-discount" v-if="is_time_discount">限时折扣</view> <view class="limit-discount" v-if="is_time_discount">限时折扣</view>
<view class="nowStockerNumber" v-if="data.isAutoSoldStock&&nowStockerNumber<=10&&nowStockerNumber>0">
剩余库存{{nowStockerNumber}}
</view>
<view> <view>
<view> <view>
<text class="up-line-1">{{ data.name }}</text> <text class="up-line-1">{{ data.name }}</text>
@@ -56,7 +58,7 @@
<view class="isSellout" v-else-if="data.isSoldStock == 1"> <view class="isSellout" v-else-if="data.isSoldStock == 1">
<image class="isSellout_icon" src="/pagesCreateOrder/static/images/no-sold.svg" mode=""></image> <image class="isSellout_icon" src="/pagesCreateOrder/static/images/no-sold.svg" mode=""></image>
</view> </view>
<view class="isSellout" v-else-if="data.isStock == 1 && data.stockNumber <= 0"> <view class="isSellout" v-else>
<image class="isSellout_icon" src="/pagesCreateOrder/static/images/no-stock.svg" mode=""></image> <image class="isSellout_icon" src="/pagesCreateOrder/static/images/no-stock.svg" mode=""></image>
</view> </view>
</template> </template>
@@ -107,6 +109,10 @@
return {}; return {};
}, },
}, },
consStockList: {
type: Array,
default:[]
}
}); });
//判断是否是时间折扣商品 //判断是否是时间折扣商品
@@ -156,12 +162,54 @@
return false; return false;
} }
return ( return (
(item.isStock == 1 && item.stockNumber <= 0) || !consStockisFull(item) ||
item.isSoldStock == 1 || item.isSoldStock == 1 ||
item.isSale == 0 || item.isSale == 0 ||
!isProductAvailable(item.days, item.startTime, item.endTime) !isProductAvailable(item.days, item.startTime, item.endTime)
); );
}); });
const stockNumber=computed(()=>{
})
// 1. 筛选匹配的耗材列表,增加对应商品数量
const conslist=computed(()=>{
if(props.consStockList.length<=0){
return []
}
return props.consStockList.filter(v => {
return props.data.consList.find(i =>{
return i.consInfoId == v.consId
});
}).map(v=>{
const cItem=props.data.consList.find(c=>c.consInfoId==v.consId)
const goodsNumber=Math.floor(v.stockNumber/cItem.surplusStock)
console.log('props.data',props.data.name);
console.log('goodsNumber',goodsNumber);
return {
...v,
goodsNumber
}
}).sort((a,b)=>{
return a.goodsNumber-b.goodsNumber
})
})
const nowStockerNumber=computed(()=>{
return conslist.value[0]?conslist.value[0].goodsNumber:9999
})
function consStockisFull(item) {
if(!item.isAutoSoldStock){
return true
}
// 4. 判断:最小库存 > 每份消耗库存 → 返回 true否则 false
if (nowStockerNumber.value>=1) {
return true;
} else {
return false;
}
}
// 判断商品是否在可售时间内 // 判断商品是否在可售时间内
function isProductAvailable(sellDaysStr, startTimeStr, endTimeStr) { function isProductAvailable(sellDaysStr, startTimeStr, endTimeStr) {
// 将后端返回的字符串转换为数组 // 将后端返回的字符串转换为数组
@@ -306,4 +354,14 @@
color: rgba(255, 255, 255, 0.8); color: rgba(255, 255, 255, 0.8);
text-decoration: line-through; text-decoration: line-through;
} }
.nowStockerNumber{
position: absolute;
left: 24rpx;
bottom: 80rpx;
background-color: rgba(255, 255, 255, .8);
color: red;
padding: 4rpx 8rpx;
font-size: 24rpx;
border-radius: 4rpx ;
}
</style> </style>

View File

@@ -36,9 +36,7 @@
</view> </view>
</scroll-view> </scroll-view>
<scroll-view :scroll-top="data.scrollRightTop" scroll-y scroll-with-animation class="right-box" <scroll-view :scroll-top="data.scrollRightTop" scroll-y scroll-with-animation class="right-box"
@scroll="rightScroll" @scroll="rightScroll" @scrolltoupper="scrolltoupper">
@scrolltoupper="scrolltoupper"
>
<view class="page-view u-p-l-24"> <view class="page-view u-p-l-24">
<view class="list-tight-top"> <view class="list-tight-top">
<template v-if="lingshi.show"> <template v-if="lingshi.show">
@@ -62,7 +60,7 @@
<view class="item-container"> <view class="item-container">
<view class="thumb-box" v-for="(goodsItem, goodsIndex) in item.foods" :key="goodsIndex"> <view class="thumb-box" v-for="(goodsItem, goodsIndex) in item.foods" :key="goodsIndex">
<list-goods-item :limitTimeDiscount="data.limitTimeDiscount" <list-goods-item :limitTimeDiscount="data.limitTimeDiscount"
@chooseGuige="chooseGuige($event, index)" :consStockList="consStockList" @chooseGuige="chooseGuige($event, index)"
@add="goodsUpdate($event, index, true)" @add="goodsUpdate($event, index, true)"
@reduce="goodsUpdate($event, index, false)" @tapweigh="tapweigh($event, index)" @reduce="goodsUpdate($event, index, false)" @tapweigh="tapweigh($event, index)"
:index="goodsIndex" :data="goodsItem"></list-goods-item> :index="goodsIndex" :data="goodsItem"></list-goods-item>
@@ -81,7 +79,7 @@
<view class="u-flex u-m-t-20 u-flex-wrap u-row-between"> <view class="u-flex u-m-t-20 u-flex-wrap u-row-between">
<view class="u-m-b-30" v-for="(goodsItem, goodsIndex) in searchResult" :key="goodsIndex"> <view class="u-m-b-30" v-for="(goodsItem, goodsIndex) in searchResult" :key="goodsIndex">
<list-goods-item :img="{ width: '330rpx', height: '330rpx' }" <list-goods-item :img="{ width: '330rpx', height: '330rpx' }"
:limitTimeDiscount="data.limitTimeDiscount" :consStockList="consStockList" :limitTimeDiscount="data.limitTimeDiscount"
@chooseGuige="chooseGuige(goodsItem.goodsIndex, goodsItem.index)" @chooseGuige="chooseGuige(goodsItem.goodsIndex, goodsItem.index)"
@add="searchGoodsUpdate(goodsItem, goodsIndex, true)" @add="searchGoodsUpdate(goodsItem, goodsIndex, true)"
@reduce="searchGoodsUpdate(goodsItem, goodsIndex, false)" @reduce="searchGoodsUpdate(goodsItem, goodsIndex, false)"
@@ -98,8 +96,7 @@
<view class="bottom w-full"> <view class="bottom w-full">
<my-car :isCreateOrderToDetail="isCreateOrderToDetail" @updateNumber="carsNumberChange" :table="data.table" <my-car :isCreateOrderToDetail="isCreateOrderToDetail" @updateNumber="carsNumberChange" :table="data.table"
:data="cars" :orderInfo="data.orderInfo" :limitTimeDiscount="data.limitTimeDiscount" :data="cars" :orderInfo="data.orderInfo" :limitTimeDiscount="data.limitTimeDiscount"
@changeNumber="goodsChangeNumber" @changeNumber="goodsChangeNumber" @clear="cleaCart"></my-car>
@clear="cleaCart"></my-car>
</view> </view>
<!-- 套餐选择规格 --> <!-- 套餐选择规格 -->
<taocanModel ref="taocanModelRef" @confirm="taocanConfirm" :goodsData="selGoods"></taocanModel> <taocanModel ref="taocanModelRef" @confirm="taocanConfirm" :goodsData="selGoods"></taocanModel>
@@ -117,7 +114,8 @@
</view> </view>
<!-- 修改购物车数量 --> <!-- 修改购物车数量 -->
<popupChangeNumber v-model="popupChangeNumberData.show" :goods="popupChangeNumberData.data" @confirm="carsNumberChange"></popupChangeNumber> <popupChangeNumber v-model="popupChangeNumberData.show" :goods="popupChangeNumberData.data"
@confirm="carsNumberChange"></popupChangeNumber>
</view> </view>
</template> </template>
<script setup> <script setup>
@@ -196,6 +194,9 @@
cancelOrder, cancelOrder,
rmPlaceOrder, rmPlaceOrder,
} from "@/http/api/order.js"; } from "@/http/api/order.js";
import {
getConsStock
} from '@/http/api/cons.js'
const modal = reactive({ const modal = reactive({
key: "", key: "",
@@ -349,6 +350,24 @@
let $originGoods = []; let $originGoods = [];
let $category = []; let $category = [];
const consStockList = ref([])
function getCons() {
return new Promise((resolve, reject) => {
try {
getConsStock({
shopId: uni.getStorageSync("shopInfo").id
}).then(res => {
consStockList.value = res || []
console.log('consStockList', consStockList.value);
resolve()
})
} catch (err) {
reject()
}
})
}
async function init() { async function init() {
if (option.type == "add") { if (option.type == "add") {
setTabBar($category, $originGoods, []); setTabBar($category, $originGoods, []);
@@ -364,6 +383,8 @@
size: 300 size: 300
}); });
$category = categoryRes.records; $category = categoryRes.records;
// 获取耗材数据
await getCons()
// 获取商品数据 // 获取商品数据
const goodsRes = await getGoods(); const goodsRes = await getGoods();
const goods = goodsRes.filter((v) => { const goods = goodsRes.filter((v) => {
@@ -387,6 +408,8 @@
initCart(); initCart();
} }
const allHistoryOrder = ref([])
/** /**
* 获取订单详情 * 获取订单详情
*/ */
@@ -409,13 +432,13 @@
console.log("data.historyOrder===", data.historyOrder); console.log("data.historyOrder===", data.historyOrder);
let allHistoryOrder = data.historyOrder.map((item) => { allHistoryOrder.value = data.historyOrder.map((item) => {
return [...item.info]; return [...item.info];
}); }).flat();
// console.log('allHistoryOrder===', allHistoryOrder.flat()); // console.log('allHistoryOrder===', allHistoryOrder.flat());
data.historyOrderNum = 0; data.historyOrderNum = 0;
allHistoryOrder.flat().map((item) => { allHistoryOrder.value.map((item) => {
data.historyOrderNum += item.num; data.historyOrderNum += item.num;
}); });
// console.log('data.historyOrderNum===', data.historyOrderNum); // console.log('data.historyOrderNum===', data.historyOrderNum);
@@ -741,7 +764,22 @@
} }
// initCart() // initCart()
} }
// 封装成 Promise 的确认弹窗
const showConfirmModal = (title, content) => {
return new Promise((resolve) => {
uni.showModal({
title: title,
content: content,
showCancel: true,
cancelText: '取消添加',
confirmText: '继续',
success(res) {
// 确认返回 true取消/关闭返回 false
resolve(res.confirm === true);
}
});
});
};
/** /**
* 菜品操作 * 菜品操作
* @param {Object} foodsindex * @param {Object} foodsindex
@@ -800,6 +838,34 @@
//更新 //更新
let cartItem = cars[goodsInCarIndex]; let cartItem = cars[goodsInCarIndex];
let number = isAdd ? cartItem.number + 1 : +cartItem.number - 1; let number = isAdd ? cartItem.number + 1 : +cartItem.number - 1;
if (isAdd) {
if (allHistoryOrder.value.find(v => v.productId == $goods.id)) {
// 等待用户点击
const isConfirm = await showConfirmModal(
'该商品已下单过,请确认是否重复',
'菜品名称:《' + $goods.name + '》'
);
if (!isConfirm) {
return
}
}else{
if (number == 2) {
// 等待用户点击
const isConfirm = await showConfirmModal(
'购物车已有该商品,请确认是否重复',
'菜品名称:《' + $goods.name + '》'
);
if (!isConfirm) {
return
}
}
}
}
if (!isAdd) { if (!isAdd) {
if (number === 0 || number < suitNum) { if (number === 0 || number < suitNum) {
//移除 //移除
@@ -828,6 +894,7 @@
data.isGoodsAdd = false; data.isGoodsAdd = false;
setSearchGoods(searchGoodsIndex, number); setSearchGoods(searchGoodsIndex, number);
} else { } else {
// 不影响之前的代码 称重suit单独处理 // 不影响之前的代码 称重suit单独处理
if ($goods.type == "weight" && showCurrentInput) { if ($goods.type == "weight" && showCurrentInput) {
suitNum = showCurrentInput; suitNum = showCurrentInput;
@@ -839,6 +906,16 @@
return; return;
} }
} }
if (allHistoryOrder.value.find(v => v.productId == $goods.id)) {
// 等待用户点击
const isConfirm = await showConfirmModal(
'该商品已下单过,请确认是否重复',
'菜品名称:《' + $goods.name + '》'
);
if (!isConfirm) {
return
}
}
// 套餐和单规格 // 套餐和单规格
if ($goods.groupType != 1) { if ($goods.groupType != 1) {
//增加 //增加
@@ -937,8 +1014,7 @@
tabbarItem.foods.find((v) => v.id == e.goods.product_id); tabbarItem.foods.find((v) => v.id == e.goods.product_id);
} }
}); });
$sku = !e.goods.product_id ? $sku = !e.goods.product_id ? {
{
suitNum: 1 suitNum: 1
} : } :
$goods.skuList.find((v) => v.id == e.goods.sku_id); $goods.skuList.find((v) => v.id == e.goods.sku_id);
@@ -1018,13 +1094,22 @@
* @param {Object} skuList * @param {Object} skuList
*/ */
function returnSelGoodsSkuList(selectSpecInfo) { function returnSelGoodsSkuList(selectSpecInfo) {
// 👇 修复:如果是字符串,转成对象
if (typeof selectSpecInfo === 'string') {
selectSpecInfo = JSON.parse(selectSpecInfo);
}
let specInfo = []; let specInfo = [];
console.log('selectSpecInfo', selectSpecInfo);
for (var key in selectSpecInfo) { for (var key in selectSpecInfo) {
console.log('key', key); // 现在会正确打印:口味、汤
specInfo.push({ specInfo.push({
name: key, name: key,
value: selectSpecInfo[key], value: selectSpecInfo[key],
}); });
} }
let result = specInfo.map((v, index) => { let result = specInfo.map((v, index) => {
return { return {
...v, ...v,
@@ -1062,9 +1147,30 @@
} = res; } = res;
let carGoods = cars[index]; let carGoods = cars[index];
let cartId = carGoods.id; let cartId = carGoods.id;
let newNumber = carGoods.number * 1 + suitNum;
let suitNum = goods.skuList[0].suitNum || 1; let suitNum = goods.skuList[0].suitNum || 1;
let newNumber = carGoods.number * 1 + suitNum;
if (allHistoryOrder.value.find(v => v.productId == goods.id)) {
// 等待用户点击
const isConfirm = await showConfirmModal(
'该商品已下单过,请确认是否重复',
'菜品名称:《' + goods.name + '》'
);
if (!isConfirm) {
return
}
}else{
if (newNumber == 2 && carGoods.number < newNumber) {
// 等待用户点击
const isConfirm = await showConfirmModal(
'购物车已有该商品,请确认是否重复?',
'菜品名称:《' + goods.name + '》'
);
if (!isConfirm) {
return
}
}
}
editCart({ editCart({
id: cartId, id: cartId,
number: newNumber, number: newNumber,
@@ -1079,6 +1185,17 @@
); );
data.isGoodsAdd = false; data.isGoodsAdd = false;
} else { } else {
if (allHistoryOrder.value.find(v => v.productId == goods.id)) {
// 等待用户点击
const isConfirm = await showConfirmModal(
'该商品已下单过,请确认是否重复',
'菜品名称:《' + goods.name + '》'
);
if (!isConfirm) {
return
}
}
//添加 //添加
editCart({ editCart({
number: suitNum, number: suitNum,
@@ -1106,8 +1223,7 @@
return carsGoods.sku_id == sku_id && carsGoods.product_id == product_id; return carsGoods.sku_id == sku_id && carsGoods.product_id == product_id;
}); });
const carGoods = cars[goodsInCarIndex]; const carGoods = cars[goodsInCarIndex];
return carGoods ? return carGoods ? {
{
index: goodsInCarIndex, index: goodsInCarIndex,
carGoods, carGoods,
} : } :

View File

@@ -1,4 +1,5 @@
<template> <template>
<view>
<my-model title="退菜" ref="model" @close="onModelClose" @open="onModelOpen"> <my-model title="退菜" ref="model" @close="onModelClose" @open="onModelOpen">
<template #desc> <template #desc>
<view class="u-p-30 u-text-left"> <view class="u-p-30 u-text-left">
@@ -36,8 +37,8 @@
<view class="u-flex u-m-r-16 u-m-b-16" v-for="(item,index) in tags" :key="index"> <view class="u-flex u-m-r-16 u-m-b-16" v-for="(item,index) in tags" :key="index">
<up-tag @click="changeTagSel(item)" :text="item.label" plain borderColor="#E6FOFF" <up-tag @click="changeTagSel(item)" :text="item.label" plain borderColor="#E6FOFF"
color="#318AFE" v-if="item.checked"> </up-tag> color="#318AFE" v-if="item.checked"> </up-tag>
<up-tag @click="changeTagSel(item)" borderColor="#E5E5E5" color="#666" :text="item.label" <up-tag @click="changeTagSel(item)" borderColor="#E5E5E5" color="#666"
plain v-else> </up-tag> :text="item.label" plain v-else> </up-tag>
</view> </view>
</view> </view>
<view class="u-m-t-24"> <view class="u-m-t-24">
@@ -50,16 +51,37 @@
<view class="u-p-t-18 u-p-l-30 u-p-r-30 u-p-b-10"> <view class="u-p-t-18 u-p-l-30 u-p-r-30 u-p-b-10">
<my-button box-shadow shape="circle" @tap="confirm">确认退菜</my-button> <my-button box-shadow shape="circle" @tap="confirm">确认退菜</my-button>
<view class="u-m-t-10"> <view class="u-m-t-10">
<my-button @tap="onModelClose" shape="circle" bgColor="#fff" type="cancel" box-shadow>取消</my-button> <my-button @tap="onModelClose" shape="circle" bgColor="#fff" type="cancel"
box-shadow>取消</my-button>
</view> </view>
</view> </view>
</template> </template>
</my-model> </my-model>
<up-modal :show="confirmModal.show" title="提示" @close="confirmModalClose" @cancel="confirmModalClose"
@confirm="confirmModalConfirm" showCancelButton>
<view>
<view>
<up-radio-group v-model="confirmModal.selRefundStock">
<up-radio v-for="(item,index) in confirmModal.refundStocks" :key="index" :label="item.name"
:name="item.key"></up-radio>
</up-radio-group>
</view>
</view>
</up-modal>
</view>
</template> </template>
<script setup> <script setup>
import { reactive, ref, watch } from 'vue'; import {
reactive,
ref,
watch
} from 'vue';
import infoBox from '@/commons/utils/infoBox.js' import infoBox from '@/commons/utils/infoBox.js'
const emits = defineEmits(['update:show', 'confirm']) const emits = defineEmits(['update:show', 'confirm'])
const props = defineProps({ const props = defineProps({
@@ -76,6 +98,22 @@
default: false default: false
} }
}) })
const confirmModal = reactive({
show: false,
selRefundStock: false,
refundStocks: [{
name: '已上菜(仅退菜不退库存)',
key: false
}, {
name: '未上菜(退菜后退库存)',
key: true,
}]
})
function confirmModalClose() {
confirmModal.show = false
confirmModal.selRefundStock = false
}
const form = reactive({ const form = reactive({
note: '' note: ''
}) })
@@ -157,11 +195,51 @@
}) })
form.note = '' form.note = ''
} }
import {
getProductDetail
} from '@/http/api/product.js'
import {
getCategoryDetail
} from '@/http/api/cateGory.js'
async function getGoodsCategory(goods) {
const res = await getProductDetail(goods.productId)
if (res) {
console.log('res', res);
const res1 = await getCategoryDetail(res.categoryId)
return res1
}
uni.showToast({
title: '获取该商品信息数据失败',
icon: 'none'
})
return null
}
function confirmModalConfirm() {
refundGoods()
confirmModalClose()
}
function refundGoods() {
const selTag = tags.value.filter(item => item.checked).map(item => item.label).join(",")
const note = selTag + (form.note.length > 0 ? "," + form.note : "");
let par = {
orderId: props.data.orderId,
refundAmount: number.value * props.data.unitPrice,
refundReason: note,
refundStock: confirmModal.selRefundStock,
refundDetails: [{
id: props.data.id,
returnAmount: number.value * props.data.unitPrice,
num: number.value,
}],
}
emits('confirm', par)
}
/** /**
* 确认退菜 * 确认退菜
*/ */
function confirm() { async function confirm() {
const selTag = tags.value.filter(item => item.checked).map(item => item.label).join(",") const selTag = tags.value.filter(item => item.checked).map(item => item.label).join(",")
const note = selTag + (form.note.length > 0 ? "," + form.note : ""); const note = selTag + (form.note.length > 0 ? "," + form.note : "");
console.log({ console.log({
@@ -171,17 +249,22 @@
if (!note) { if (!note) {
return infoBox.showToast("请输入退菜原因"); return infoBox.showToast("请输入退菜原因");
} }
let par = { const shopInfo = uni.getStorageSync('shopInfo')
orderId: props.data.orderId, if (shopInfo.refundMode == 1) {
refundAmount: number.value * props.data.unitPrice, const res = await getGoodsCategory(props.data)
refundReason: note, if (res.refundMode === 3) {
refundDetails: [{ confirmModal.show = true
id: props.data.id, return
returnAmount: number.value * props.data.unitPrice,
num: number.value,
}],
} }
emits('confirm', par) }
if (shopInfo.refundMode == 2) {
const res = await getProductDetail(props.data.productId)
if (res.refundMode === 3) {
confirmModal.show = true
return
}
}
refundGoods()
} }
</script> </script>

View File

@@ -12,7 +12,8 @@
</view> </view>
<view class="u-flex"> <view class="u-flex">
<view> <view>
<text :class="[data.status]">{{$dict.getDiceName(data.status,'orderStatus')}}{{data.refundType?'['+$dict.getDiceName(data.refundType,'refundType')+']':''}}</text> <text
:class="[data.status]">{{$dict.getDiceName(data.status,'orderStatus')}}{{data.refundType?'['+$dict.getDiceName(data.refundType,'refundType')+']':''}}</text>
</view> </view>
<view class="line"></view> <view class="line"></view>
<view class=" color-main"> <view class=" color-main">
@@ -33,13 +34,18 @@
<view class="" v-for="(item,index) in data.goods" :key="index"> <view class="" v-for="(item,index) in data.goods" :key="index">
<view class="u-flex u-row-between u-col-top u-m-t-32" v-if="item.productId!=-999"> <view class="u-flex u-row-between u-col-top u-m-t-32" v-if="item.productId!=-999">
<view> <view>
<view class=""> {{item.productName}}</view> <view class="">
<text>{{item.productName}}</text>
</view>
<view class="color-999 u-font-24 u-m-t-8"> <view class="color-999 u-font-24 u-m-t-8">
{{item.skuName}} {{item.skuName}}
</view> </view>
</view> </view>
<view class="u-flex u-flex-1 u-row-right" style="align-items: center;"> <view class="u-flex u-flex-1 u-row-right" style="align-items: center;">
<view style="margin-right: 10rpx;">×{{item.num}}</view> <view style="margin-right: 10rpx;">
<text>×{{item.num}}</text>
<text class="color-red u-m-l-10 font-bold" v-if="item.returnNum">(退{{item.returnNum}})</text>
</view>
<view class="u-text-right u-relative" :style="computedPriceStyle()"> <view class="u-text-right u-relative" :style="computedPriceStyle()">
<text>{{item.unitPrice}}</text> <text>{{item.unitPrice}}</text>
</view> </view>
@@ -98,7 +104,12 @@
</template> </template>
<script setup> <script setup>
import { computed, reactive, ref, watch } from 'vue'; import {
computed,
reactive,
ref,
watch
} from 'vue';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import go from '@/commons/utils/go.js' import go from '@/commons/utils/go.js'

View File

@@ -2,12 +2,15 @@
<view class="min-page bg-gray u-p-30"> <view class="min-page bg-gray u-p-30">
<view class="bg-fff u-p-l-30 u-p-r-30 "> <view class="bg-fff u-p-l-30 u-p-r-30 ">
<view class="myTabs u-m-t-20"> <view class="myTabs u-m-t-20">
<my-tabs :list="pageData.tabsList" :modelValue="pageData.tabsIndex" :textKey="'label'" @change="tabsChange"></my-tabs> <my-tabs :list="pageData.tabsList" :modelValue="pageData.tabsIndex" :textKey="'label'"
@change="tabsChange"></my-tabs>
</view> </view>
</view> </view>
<view v-if="pageData.tabsIndex == 2" class="bg-fff u-p-24 border-r-12 u-flex u-row-between" style="margin-top: 30rpx;"> <view v-if="pageData.tabsIndex == 2" class="bg-fff u-p-24 border-r-12 u-flex u-row-between"
<up-input type="digit" placeholder="请输入退款金额" @change="parseIntNumber($event)" border="surround" v-model="pageData.modify" > style="margin-top: 30rpx;">
<up-input type="digit" placeholder="请输入退款金额" @change="parseIntNumber($event)" border="surround"
v-model="pageData.modify">
<template #prefix> <template #prefix>
<up-text text="¥" margin="0 3px 0 0" type="tips"></up-text> <up-text text="¥" margin="0 3px 0 0" type="tips"></up-text>
</template> </template>
@@ -96,28 +99,60 @@
:color="$utils.ColorMain"></up-button> :color="$utils.ColorMain"></up-button>
</view> </view>
<confirmRefundPopup ref="refundPopup" /> <confirmRefundPopup ref="refundPopup" />
<up-modal :show="confirmModal.show" title="提示" @close="confirmModalClose" @cancel="confirmModalClose"
@confirm="confirmModalConfirm" showCancelButton>
<view>
<view>
<up-radio-group v-model="confirmModal.selRefundStock">
<up-radio v-for="(item,index) in confirmModal.refundStocks" :key="index" :label="item.name"
:name="item.key"></up-radio>
</up-radio-group>
</view>
</view>
</up-modal>
</view> </view>
</template> </template>
<script setup> <script setup>
import { computed, reactive, ref, watch } from 'vue'; import {
import { onLoad, onShow } from '@dcloudio/uni-app'; computed,
reactive,
ref,
watch
} from 'vue';
import {
onLoad,
onShow
} from '@dcloudio/uni-app';
import confirmRefundPopup from './components/confirmRefundPopup.vue'; import confirmRefundPopup from './components/confirmRefundPopup.vue';
import {hasPermission} from '@/commons/utils/hasPermission.js' import {
import { refundOrder } from '@/http/api/order.js' hasPermission
import { mathFloorPrice } from '@/commons/utils/goodsUtil.js' } from '@/commons/utils/hasPermission.js'
import {
refundOrder
} from '@/http/api/order.js'
import {
mathFloorPrice
} from '@/commons/utils/goodsUtil.js'
let note = ref('') let note = ref('')
const tuikuan = reactive({ const tuikuan = reactive({
list: ['点错', '数量点错', '客人要求', '协商退费'], list: ['点错', '数量点错', '客人要求', '协商退费'],
sel: -1 sel: -1
}) })
const pageData = reactive({ const pageData = reactive({
tabsList: [ tabsList: [{
{label: '部分退款', value: 0}, label: '部分退款',
{label: '全部退款', value: 1}, value: 0
{label: '自定义退款', value: 2}, },
{
label: '全部退款',
value: 1
},
{
label: '自定义退款',
value: 2
},
], ],
tabsIndex: 0, tabsIndex: 0,
modify: '', modify: '',
@@ -168,6 +203,7 @@
function changeTuiKuanSel(i) { function changeTuiKuanSel(i) {
tuikuan.sel = i tuikuan.sel = i
} }
function parseIntNumber(e) { function parseIntNumber(e) {
if (e > (orderDetail.info.payAmount - orderDetail.info.refundAmount)) { if (e > (orderDetail.info.payAmount - orderDetail.info.refundAmount)) {
setTimeout(() => { setTimeout(() => {
@@ -272,6 +308,7 @@
params = { params = {
orderId: option.orderId, orderId: option.orderId,
refundReason: noteResult, refundReason: noteResult,
refundStock: confirmModal.selRefundStock,
refundDetails: orderDetail.goodsList.filter(v => v.number * 1).map(v => { refundDetails: orderDetail.goodsList.filter(v => v.number * 1).map(v => {
return { return {
id: v.id, id: v.id,
@@ -297,17 +334,77 @@
refundPost() refundPost()
} }
async function refundPost (payPassword) {
import {
getProductList,
getCategoryList
} from '@/http/api/product.js'
const confirmModal = reactive({
show: false,
selRefundStock: false,
payPassword: '',
refundStocks: [{
name: '已上菜(仅退菜不退库存)',
key: false
}, {
name: '未上菜(退菜后退库存)',
key: true,
}]
})
function confirmModalClose() {
confirmModal.show = false
confirmModal.selRefundStock = false
confirmModal.payPassword = ''
}
function confirmModalConfirm() {
refundSubmit(confirmModal.payPassword)
confirmModalClose()
}
async function refundSubmit(payPassword) {
if (payPassword) { if (payPassword) {
params.pwd = payPassword params.pwd = payPassword
} }
params.refundStock = confirmModal.selRefundStock
await refundOrder(params) await refundOrder(params)
uni.$utils.showToast('退款请求提交成功') uni.$utils.showToast('退款请求提交成功')
setTimeout(() => { setTimeout(() => {
uni.navigateBack({delta:1}) uni.navigateBack({
delta: 1
})
}, 500) }, 500)
} }
async function refundPost(payPassword) {
confirmModal.payPassword = confirmModal.payPassword
const shopInfo = uni.getStorageSync('shopInfo')
if (pageData.tabsIndex != 2) {
if (shopInfo.refundMode == 1) {
const res = await getCategoryList()
for (let goods of res) {
if (goods.refundMode == 3) {
confirmModal.show = true
return
}
}
}
if (shopInfo.refundMode == 2) {
const res = await getProductList()
for (let goods of res) {
console.log(goods);
if (goods.refundMode == 3) {
confirmModal.show = true
return
}
}
}
}
refundSubmit(payPassword)
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>