Compare commits
9 Commits
c87c999d42
...
test
| Author | SHA1 | Date | |
|---|---|---|---|
| ffad9432c5 | |||
| 6d09813aa4 | |||
| e2338b3888 | |||
| c7f22e193a | |||
| 50139a5e57 | |||
| 209be704e1 | |||
| 6a20930a7d | |||
| 506dcbb804 | |||
| 75e46ec6dd |
12
src/App.vue
12
src/App.vue
@@ -3,7 +3,17 @@
|
|||||||
<!-- 开启水印 -->
|
<!-- 开启水印 -->
|
||||||
<el-watermark :font="{ color: fontColor }" :content="watermarkEnabled ? defaultSettings.watermarkContent : ''"
|
<el-watermark :font="{ color: fontColor }" :content="watermarkEnabled ? defaultSettings.watermarkContent : ''"
|
||||||
:z-index="9999" class="wh-full">
|
:z-index="9999" class="wh-full">
|
||||||
<router-view />
|
<!-- 🔴 修改开始:使用 v-slot 处理路由组件 -->
|
||||||
|
<router-view v-slot="{ Component, route }">
|
||||||
|
<!--
|
||||||
|
1. 使用 <transition> 包裹,防止渲染冲突
|
||||||
|
2. 加上 :key="route.path" 强制 Vue 在路由变化时重新渲染,避免复用导致的空白
|
||||||
|
-->
|
||||||
|
<transition name="fade" mode="out-in">
|
||||||
|
<component :is="Component" :key="route.path" />
|
||||||
|
</transition>
|
||||||
|
</router-view>
|
||||||
|
<!-- 🟢 修改结束 -->
|
||||||
</el-watermark>
|
</el-watermark>
|
||||||
</el-config-provider>
|
</el-config-provider>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -89,6 +89,22 @@ const OrderApi = {
|
|||||||
responseType: 'blob'
|
responseType: 'blob'
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
// 打印经营日报
|
||||||
|
printDayReport(params: any) {
|
||||||
|
return request<any>({
|
||||||
|
url: `${Order_BaseUrl}/admin/finance/printDayReport`,
|
||||||
|
method: "get",
|
||||||
|
params
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 打印日结单
|
||||||
|
printDaySettle(params: any) {
|
||||||
|
return request<any>({
|
||||||
|
url: `${Order_BaseUrl}/admin/finance/printDaySettle`,
|
||||||
|
method: "get",
|
||||||
|
params
|
||||||
|
});
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default OrderApi;
|
export default OrderApi;
|
||||||
|
|||||||
@@ -28,6 +28,14 @@ const Api = {
|
|||||||
responseType: 'blob'
|
responseType: 'blob'
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
// 商品报表打印
|
||||||
|
print(params: any) {
|
||||||
|
return request<any>({
|
||||||
|
url: `${baseURL}/print`,
|
||||||
|
method: "get",
|
||||||
|
params
|
||||||
|
});
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Api;
|
export default Api;
|
||||||
|
|||||||
@@ -48,6 +48,14 @@ const AuthAPI = {
|
|||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
// 商品-标记自动售罄
|
||||||
|
markIsAutoSoldOut(data: Object) {
|
||||||
|
return request<any, Responseres>({
|
||||||
|
url: `${baseURL}/markIsAutoSoldOut`,
|
||||||
|
method: "post",
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
},
|
||||||
// 删除
|
// 删除
|
||||||
deleteByIds(id: number | String) {
|
deleteByIds(id: number | String) {
|
||||||
return request<any, Responseres>({
|
return request<any, Responseres>({
|
||||||
@@ -88,6 +96,14 @@ const AuthAPI = {
|
|||||||
params
|
params
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
// 耗材列表
|
||||||
|
consStock(params: any) {
|
||||||
|
return request<any, Responseres>({
|
||||||
|
url: `/product/admin/product/cons/consStock`,
|
||||||
|
method: "get",
|
||||||
|
params
|
||||||
|
});
|
||||||
|
},
|
||||||
// 上下架
|
// 上下架
|
||||||
onOff(data: any) {
|
onOff(data: any) {
|
||||||
return request<any, Responseres>({
|
return request<any, Responseres>({
|
||||||
|
|||||||
120
src/components/printBusinessDialog.vue
Normal file
120
src/components/printBusinessDialog.vue
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog title="打印确认" width="400px" v-model="showDayBusiness">
|
||||||
|
<div class="business_wrap">
|
||||||
|
<div class="title">
|
||||||
|
<el-text>请选择要打印的日期:</el-text> <el-text type="danger">周期最长为7天</el-text>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<el-date-picker v-model="printDayBusinessParams.date" type="daterange" start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" :disabled-date="disabledDate"
|
||||||
|
@change="handleDateChange" clearable />
|
||||||
|
</div>
|
||||||
|
<div class="business_tips">
|
||||||
|
<el-text type="info">若数据过多,打印时间会比较长,请耐心等待</el-text>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<template #footer>
|
||||||
|
<div class="dialog-footer">
|
||||||
|
<el-button @click="showDayBusiness = false">取 消</el-button>
|
||||||
|
<el-button type="primary" @click="confirmHandle" :loading="printDayBusinessLoading">确 定</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import dayjs from "dayjs";
|
||||||
|
import { ref, onMounted } from "vue";
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
default: '经营日报'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const showDayBusiness = ref(false)
|
||||||
|
const emits = defineEmits(['success'])
|
||||||
|
|
||||||
|
// 打印参数
|
||||||
|
const printDayBusinessParams = ref({
|
||||||
|
date: [],
|
||||||
|
})
|
||||||
|
const printDayBusinessLoading = ref(false)
|
||||||
|
|
||||||
|
// 取消
|
||||||
|
const confirmHandle = () => {
|
||||||
|
// 校验日期
|
||||||
|
if (!printDayBusinessParams.value.date || printDayBusinessParams.value.date.length !== 2) {
|
||||||
|
ElMessage.warning('请选择日期范围')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
showDayBusiness.value = false
|
||||||
|
emits('success', { date: printDayBusinessParams.value.date })
|
||||||
|
}
|
||||||
|
|
||||||
|
// 日期禁用规则:只能选昨天及更早,不能选未来
|
||||||
|
const disabledDate = (time) => {
|
||||||
|
const yesterday = dayjs().subtract(1, 'day').format('YYYY-MM-DD')
|
||||||
|
return dayjs(time).isAfter(yesterday)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 日期选择后校验:区间长度不能超过7天
|
||||||
|
const handleDateChange = (val) => {
|
||||||
|
if (!val || val.length !== 2) return
|
||||||
|
const [start, end] = val
|
||||||
|
const days = dayjs(end).diff(start, 'day') + 1 // 包含起止日
|
||||||
|
if (days > 7) {
|
||||||
|
ElMessage.warning('日期范围最多只能选择7天')
|
||||||
|
printDayBusinessParams.value.date = [] // 清空选择
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断当前时间 是否在 00:00 ~ 05:20 之间
|
||||||
|
const time = ref(['00:00', '05:20'])
|
||||||
|
const isInTimeRange = () => {
|
||||||
|
const now = dayjs()
|
||||||
|
const startTime = dayjs(time.value[0], 'HH:mm')
|
||||||
|
const endTime = dayjs(time.value[1], 'HH:mm')
|
||||||
|
return now.isAfter(startTime) && now.isBefore(endTime)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 打开弹窗
|
||||||
|
const show = () => {
|
||||||
|
if (isInTimeRange()) {
|
||||||
|
ElMessage.warning(`当前时间不能打印${props.title},打印时间:${time.value[0]}点至${time.value[1]}点`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
showDayBusiness.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 暴露方法
|
||||||
|
defineExpose({ show })
|
||||||
|
|
||||||
|
// 初始化默认选中昨天
|
||||||
|
onMounted(() => {
|
||||||
|
const yesterday = dayjs().subtract(1, 'day').format('YYYY-MM-DD')
|
||||||
|
printDayBusinessParams.value.date = [yesterday, yesterday]
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.business_wrap {
|
||||||
|
.title {
|
||||||
|
display: flex;
|
||||||
|
gap: 6px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.row {
|
||||||
|
padding-top: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.business_tips {
|
||||||
|
padding-top: 6px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
83
src/components/refundConsModal.vue
Normal file
83
src/components/refundConsModal.vue
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog title="提示" width="450px" v-model="visible">
|
||||||
|
<div class="refund_content">
|
||||||
|
<div class="title_wrap">请确认当前菜品是否已上菜</div>
|
||||||
|
<div class="list_wrap">
|
||||||
|
<div class="item" v-for="(item, index) in list" :key="index">
|
||||||
|
<span>{{ item.name }}</span>
|
||||||
|
<span>x{{ item.num }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="dialog_footer">
|
||||||
|
<div class="btn">
|
||||||
|
<el-button @click="handleCancel" style="width: 100%;">未上菜(退还库存)</el-button>
|
||||||
|
</div>
|
||||||
|
<div class="btn">
|
||||||
|
<el-button type="primary" @click="handleOk" style="width: 100%;">已上菜(不退库存)</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
const visible = ref(false)
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
list: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const emits = defineEmits(['success'])
|
||||||
|
|
||||||
|
// 未上菜 1退菜图库存
|
||||||
|
function handleCancel() {
|
||||||
|
visible.value = false
|
||||||
|
emits('success', 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 已上菜 2仅退菜不退库存
|
||||||
|
function handleOk() {
|
||||||
|
visible.value = false
|
||||||
|
emits('success', 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
function show() {
|
||||||
|
visible.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
show
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.refund_content {
|
||||||
|
.title_wrap {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list_wrap {
|
||||||
|
padding-top: 14px;
|
||||||
|
.item {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog_footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 20px;
|
||||||
|
padding-top: 20px;
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -3,6 +3,7 @@ import WebSocketManager, { type ApifoxModel, msgType } from "@/utils/websocket";
|
|||||||
import orderApi from "@/api/order/order";
|
import orderApi from "@/api/order/order";
|
||||||
import { useUserStoreHook } from "@/store/modules/user";
|
import { useUserStoreHook } from "@/store/modules/user";
|
||||||
import productApi from "@/api/product/index";
|
import productApi from "@/api/product/index";
|
||||||
|
import categoryApi from "@/api/product/productclassification";
|
||||||
import shopUserApi from '@/api/account/shopUser'
|
import shopUserApi from '@/api/account/shopUser'
|
||||||
import limitTimeDiscountApi from '@/api/market/limitTimeDiscount.js'
|
import limitTimeDiscountApi from '@/api/market/limitTimeDiscount.js'
|
||||||
import { BigNumber } from "bignumber.js";
|
import { BigNumber } from "bignumber.js";
|
||||||
@@ -82,8 +83,6 @@ export const useCartsStore = defineStore("carts", () => {
|
|||||||
default: productType = GoodsType.NORMAL;
|
default: productType = GoodsType.NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...item,
|
...item,
|
||||||
id: item.id,
|
id: item.id,
|
||||||
@@ -350,11 +349,61 @@ export const useCartsStore = defineStore("carts", () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const consList = await productApi.consStock({ shopId: localStorage.getItem("shopId") })
|
||||||
|
|
||||||
|
goods.value = addGoodsSoldOutStatus(goods.value, consList)
|
||||||
|
|
||||||
console.log('代客下单页面商品缓存.goods.value', goods.value);
|
console.log('代客下单页面商品缓存.goods.value', goods.value);
|
||||||
|
|
||||||
setGoodsMap(goods.value);
|
setGoodsMap(goods.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给商品列表批量添加 isSoldOut 售罄状态字段
|
||||||
|
* @param {Array} goodsList - 商品列表 [ { consList, isAutoSoldStock } ]
|
||||||
|
* @param {Array} consStockList - 真实耗材库存列表 [ { consId, stockNumber } ]
|
||||||
|
* @returns 带 isSoldOut 字段的新商品列表
|
||||||
|
*/
|
||||||
|
function addGoodsSoldOutStatus(goodsList, consStockList) {
|
||||||
|
// console.log('addGoodsSoldOutStatus.goodsList', goodsList);
|
||||||
|
// console.log('addGoodsSoldOutStatus.consStockList', consStockList);
|
||||||
|
|
||||||
|
// 耗材ID映射真实库存(保留)
|
||||||
|
const consMap = _.keyBy(consStockList, item => String(item.consId));
|
||||||
|
|
||||||
|
return _.map(goodsList, goods => {
|
||||||
|
let isSoldOut = false;
|
||||||
|
|
||||||
|
// 开启自动售罄才判断
|
||||||
|
if (goods.isAutoSoldStock === 1 || goods.isAutoSoldStock === true) {
|
||||||
|
const goodsConsList = goods.consList || [];
|
||||||
|
|
||||||
|
// 无耗材 → 不售罄
|
||||||
|
if (goodsConsList.length === 0) {
|
||||||
|
isSoldOut = false;
|
||||||
|
} else {
|
||||||
|
// 核心:只要有一个耗材 真实库存 < 商品需要量 → 售罄
|
||||||
|
isSoldOut = _.some(goodsConsList, consItem => {
|
||||||
|
// 商品绑定的耗材ID(对应真实库存ID)
|
||||||
|
const consId = String(consItem.consInfoId);
|
||||||
|
// 商品需要消耗的数量(你的需求量)
|
||||||
|
const needStock = consItem.surplusStock || 0;
|
||||||
|
// 起售数量
|
||||||
|
const suitNum = goods.type == 'single' ? goods.skuList[0].suitNum : 1;
|
||||||
|
// 真实库存
|
||||||
|
const realStock = _.get(consMap, [consId, 'stockNumber'], 0);
|
||||||
|
|
||||||
|
// 真实库存 < 需要量 * 起售数量 → 不足 → 售罄
|
||||||
|
return realStock < needStock * suitNum;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { ...goods, isSoldOut };
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function setGoodsMap(goods: any[]) {
|
function setGoodsMap(goods: any[]) {
|
||||||
for (let item of goods) {
|
for (let item of goods) {
|
||||||
goodsMap[item.id] = item;
|
goodsMap[item.id] = item;
|
||||||
@@ -660,7 +709,9 @@ export const useCartsStore = defineStore("carts", () => {
|
|||||||
sendMessage('add', { ...basic_msg, ...data });
|
sendMessage('add', { ...basic_msg, ...data });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 添加购物车/编辑购物车
|
||||||
function add(data: any) {
|
function add(data: any) {
|
||||||
|
// console.log('添加购物车/编辑购物车===', data);
|
||||||
goods.value.map(item => {
|
goods.value.map(item => {
|
||||||
if (item.id == data.product_id) {
|
if (item.id == data.product_id) {
|
||||||
data.is_time_discount = item.is_time_discount ? 1 : 0
|
data.is_time_discount = item.is_time_discount ? 1 : 0
|
||||||
@@ -675,8 +726,29 @@ export const useCartsStore = defineStore("carts", () => {
|
|||||||
console.log('carts.add===', data);
|
console.log('carts.add===', data);
|
||||||
|
|
||||||
if (hasCart) {
|
if (hasCart) {
|
||||||
|
// console.log('编辑', msg);
|
||||||
|
if (hasCart.number * 1 + msg.number * 1 == 2) {
|
||||||
|
ElMessage({
|
||||||
|
type: 'warning',
|
||||||
|
message: '购物车已有该商品,请确认是否重复',
|
||||||
|
duration: 4000
|
||||||
|
})
|
||||||
|
}
|
||||||
update({ ...hasCart, ...msg, number: hasCart.number * 1 + msg.number * 1 });
|
update({ ...hasCart, ...msg, number: hasCart.number * 1 + msg.number * 1 });
|
||||||
} else {
|
} else {
|
||||||
|
// console.log('添加', msg);
|
||||||
|
let arr = _.flatten(_.values(oldOrder.value.detailMap))
|
||||||
|
// console.log('添加.arr===', arr);
|
||||||
|
const isExist = _.some(arr, item => Number(item.productId) === msg.product_id)
|
||||||
|
|
||||||
|
// console.log('添加.isExist===', isExist);
|
||||||
|
if (msg.number == 1 && isExist) {
|
||||||
|
ElMessage({
|
||||||
|
type: 'warning',
|
||||||
|
message: '该商品已下单过,请确认是否重复',
|
||||||
|
duration: 4000
|
||||||
|
})
|
||||||
|
}
|
||||||
sendMessage('add', msg);
|
sendMessage('add', msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -906,7 +978,7 @@ export const useCartsStore = defineStore("carts", () => {
|
|||||||
console.log("收到消息:", msg);
|
console.log("收到消息:", msg);
|
||||||
if (!msg.status) {
|
if (!msg.status) {
|
||||||
if (msg.hasOwnProperty('status') && msg.status !== 1 && msg.operate_type !== 'bulk_edit') {
|
if (msg.hasOwnProperty('status') && msg.status !== 1 && msg.operate_type !== 'bulk_edit') {
|
||||||
return ElMessage.error(msg.message || '操作失败');
|
return ElMessage.error(msg.msg || '操作失败');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (msg?.data) {
|
if (msg?.data) {
|
||||||
@@ -1068,8 +1140,6 @@ export const useCartsStore = defineStore("carts", () => {
|
|||||||
newUserDiscount.value = {}
|
newUserDiscount.value = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
disconnect,
|
disconnect,
|
||||||
dinnerType,
|
dinnerType,
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ export const useUserStore = defineStore("user", () => {
|
|||||||
setRefreshToken(token);
|
setRefreshToken(token);
|
||||||
localStorage.setItem("shopId", "" + data.shopInfo.id);
|
localStorage.setItem("shopId", "" + data.shopInfo.id);
|
||||||
localStorage.setItem("branch_shopId", data.shopInfo.id)
|
localStorage.setItem("branch_shopId", data.shopInfo.id)
|
||||||
resolve();
|
resolve(data);
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
reject(error);
|
reject(error);
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="Search" :loading="loading" @click="handleQuery">查询</el-button>
|
<el-button type="primary" icon="Search" :loading="loading" @click="handleQuery">查询</el-button>
|
||||||
<el-button @click="handleReset" icon="Refresh" :loading="loading">重置</el-button>
|
<el-button @click="handleReset" icon="Refresh" :loading="loading">重置</el-button>
|
||||||
|
<el-button icon="Printer" @click="printBusinessDialogRef.show()">经营日报</el-button>
|
||||||
|
<el-button icon="Printer" @click="printBusinessDialogRef2.show()">日结单</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<el-form inline>
|
<el-form inline>
|
||||||
@@ -359,6 +361,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<printBusinessDialog ref="printBusinessDialogRef" @success="printHandle" />
|
||||||
|
<printBusinessDialog ref="printBusinessDialogRef2" @success="printHandle2" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
@@ -366,6 +370,46 @@ import dayjs from "dayjs";
|
|||||||
import { ref, onMounted } from "vue";
|
import { ref, onMounted } from "vue";
|
||||||
import OrderApi from "@/api/order/order";
|
import OrderApi from "@/api/order/order";
|
||||||
import { downloadFile, multiplyAndFormat } from '@/utils'
|
import { downloadFile, multiplyAndFormat } from '@/utils'
|
||||||
|
import printBusinessDialog from "@/components/printBusinessDialog.vue";
|
||||||
|
|
||||||
|
const printBusinessDialogRef = ref(null)
|
||||||
|
|
||||||
|
// 打印经营日报回调
|
||||||
|
async function printHandle(res) {
|
||||||
|
try {
|
||||||
|
const shopStaff = JSON.parse(localStorage.getItem('shopStaff')) || { name: '' }
|
||||||
|
const shopName = localStorage.getItem('shopName')
|
||||||
|
await OrderApi.printDayReport({
|
||||||
|
beginDate: res.date[0],
|
||||||
|
endDate: res.date[1],
|
||||||
|
rangeType: 'CUSTOM',
|
||||||
|
shopId: localStorage.getItem('shopId') || '',
|
||||||
|
operator: shopStaff.name || shopName
|
||||||
|
})
|
||||||
|
ElMessage.success('打印成功')
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const printBusinessDialogRef2 = ref(null)
|
||||||
|
// 打印日结单回调
|
||||||
|
async function printHandle2(res) {
|
||||||
|
try {
|
||||||
|
const shopStaff = JSON.parse(localStorage.getItem('shopStaff')) || { name: '' }
|
||||||
|
const shopName = localStorage.getItem('shopName')
|
||||||
|
await OrderApi.printDaySettle({
|
||||||
|
beginDate: res.date[0],
|
||||||
|
endDate: res.date[1],
|
||||||
|
rangeType: 'CUSTOM',
|
||||||
|
shopId: localStorage.getItem('shopId') || '',
|
||||||
|
operator: shopStaff.name || shopName
|
||||||
|
})
|
||||||
|
ElMessage.success('打印成功')
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const queryForm = ref({
|
const queryForm = ref({
|
||||||
queryDate: dayjs().format('YYYY-MM-DD'), // 查询日期 yyyy-MM-dd
|
queryDate: dayjs().format('YYYY-MM-DD'), // 查询日期 yyyy-MM-dd
|
||||||
|
|||||||
@@ -44,6 +44,7 @@
|
|||||||
<span v-if="!downloadLoading">导出Excel</span>
|
<span v-if="!downloadLoading">导出Excel</span>
|
||||||
<span v-else>下载中...</span>
|
<span v-else>下载中...</span>
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button icon="Printer" :loading="printLoading" @click="$refs.printBusinessDialogRef.show()">打印</el-button>
|
||||||
<importData :type="7" @close="getTableData" />
|
<importData :type="7" @close="getTableData" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
@@ -185,6 +186,7 @@
|
|||||||
@current-change="paginationChange" @size-change="sizeChange"
|
@current-change="paginationChange" @size-change="sizeChange"
|
||||||
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
|
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
|
||||||
</div>
|
</div>
|
||||||
|
<printBusinessDialog ref="printBusinessDialogRef" title="商品报表" @success="printBusinessConfirm" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -197,9 +199,10 @@ import ShopApi from "@/api/account/shop";
|
|||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import { downloadFile, multiplyAndFormat } from "@/utils/index";
|
import { downloadFile, multiplyAndFormat } from "@/utils/index";
|
||||||
import { formatDateRange } from './utils/index.js'
|
import { formatDateRange } from './utils/index.js'
|
||||||
|
import printBusinessDialog from '@/components/printBusinessDialog.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { importData },
|
components: { importData, printBusinessDialog },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
multiplyAndFormat,
|
multiplyAndFormat,
|
||||||
@@ -233,7 +236,8 @@ export default {
|
|||||||
// dayjs(time):将原生 Date 转为 dayjs 对象
|
// dayjs(time):将原生 Date 转为 dayjs 对象
|
||||||
// isAfter:判断目标日期是否在今天之后
|
// isAfter:判断目标日期是否在今天之后
|
||||||
return dayjs(time).isAfter(dayjs().startOf('day'));
|
return dayjs(time).isAfter(dayjs().startOf('day'));
|
||||||
}
|
},
|
||||||
|
printLoading: false
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
filters: {
|
filters: {
|
||||||
@@ -255,6 +259,34 @@ export default {
|
|||||||
this.geiShopList();
|
this.geiShopList();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
// 确认打印
|
||||||
|
printBusinessConfirm(res) {
|
||||||
|
this.printHandle(res.date)
|
||||||
|
},
|
||||||
|
// 打印
|
||||||
|
async printHandle(date) {
|
||||||
|
try {
|
||||||
|
const shopStaff = JSON.parse(localStorage.getItem('shopStaff')) || { name: '' }
|
||||||
|
const shopName = localStorage.getItem('shopName')
|
||||||
|
|
||||||
|
this.printLoading = true
|
||||||
|
|
||||||
|
await saleSummaryApi.print({
|
||||||
|
beginDate: date[0],
|
||||||
|
endDate: date[1],
|
||||||
|
categoryId: this.query.prodCategoryId,
|
||||||
|
productName: this.query.productName,
|
||||||
|
shopId: this.shopId,
|
||||||
|
rangeType: this.timeValue,
|
||||||
|
operator: shopStaff.name || shopName
|
||||||
|
})
|
||||||
|
ElMessage.success('操作成功')
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.printLoading = false
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
* 获取分店列表
|
* 获取分店列表
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -4,10 +4,10 @@
|
|||||||
<el-table-column prop="shopName" align="center" label="商户名称" />
|
<el-table-column prop="shopName" align="center" label="商户名称" />
|
||||||
<el-table-column prop="staffName" align="center" label="职员名称" />
|
<el-table-column prop="staffName" align="center" label="职员名称" />
|
||||||
<el-table-column prop="orderCount" align="center" label="订单数量" />
|
<el-table-column prop="orderCount" align="center" label="订单数量" />
|
||||||
<el-table-column prop="handAmount" align="center" label="应交金额" />
|
<el-table-column prop="orderTurnover" align="center" label="应交金额" />
|
||||||
<el-table-column prop="quickInAmount" align="center" label="快捷收款金额" />
|
<el-table-column prop="balance" align="center" label="余额支付" />
|
||||||
<el-table-column prop="refundAmount" align="center" label="退款金额" />
|
<el-table-column prop="refundAmount" align="center" label="退款金额" />
|
||||||
<el-table-column prop="handAmount" align="center" label="总收入" />
|
<el-table-column prop="turnover" align="center" label="总收入" />
|
||||||
<el-table-column prop="loginTime" align="center" label="开始时间" />
|
<el-table-column prop="loginTime" align="center" label="开始时间" />
|
||||||
<el-table-column prop="handoverTime" align="center" label="交班时间" />
|
<el-table-column prop="handoverTime" align="center" label="交班时间" />
|
||||||
<el-table-column label="操作" align="center">
|
<el-table-column label="操作" align="center">
|
||||||
|
|||||||
@@ -15,9 +15,13 @@ const modalConfig: IModalConfig<addRequest> = {
|
|||||||
},
|
},
|
||||||
formAction: function (data) {
|
formAction: function (data) {
|
||||||
let obj = { ...data }
|
let obj = { ...data }
|
||||||
obj.printType = data.printType.join(',')
|
console.log("打印类型", data);
|
||||||
|
// obj.printType = data.printType.join(',')
|
||||||
obj.categoryIds = JSON.stringify(data.categoryIdsArr)
|
obj.categoryIds = JSON.stringify(data.categoryIdsArr)
|
||||||
obj.categoryList = JSON.stringify(data.categoryIdsArr)
|
obj.categoryList = JSON.stringify(data.categoryIdsArr)
|
||||||
|
if (data.classifyPrint == 0) {
|
||||||
|
obj.categoryIds = ''
|
||||||
|
}
|
||||||
// obj.categoryIds = '[' + data.categoryIdsArr.join(',') + ']'
|
// obj.categoryIds = '[' + data.categoryIdsArr.join(',') + ']'
|
||||||
return printerApi.add(obj);
|
return printerApi.add(obj);
|
||||||
},
|
},
|
||||||
@@ -85,7 +89,7 @@ const modalConfig: IModalConfig<addRequest> = {
|
|||||||
{
|
{
|
||||||
type: "select",
|
type: "select",
|
||||||
label: "打印类型",
|
label: "打印类型",
|
||||||
prop: "subType",
|
prop: "printType",
|
||||||
rules: [{ required: false, message: "请选择打印类型", trigger: "blur" }],
|
rules: [{ required: false, message: "请选择打印类型", trigger: "blur" }],
|
||||||
attrs: {
|
attrs: {
|
||||||
placeholder: "请选择打印类型",
|
placeholder: "请选择打印类型",
|
||||||
@@ -103,7 +107,7 @@ const modalConfig: IModalConfig<addRequest> = {
|
|||||||
{
|
{
|
||||||
type: "select",
|
type: "select",
|
||||||
label: "打印机品牌",
|
label: "打印机品牌",
|
||||||
prop: "contentType",
|
prop: "brand",
|
||||||
rules: [{ required: true, message: "请选择打印机品牌", trigger: "blur" }],
|
rules: [{ required: true, message: "请选择打印机品牌", trigger: "blur" }],
|
||||||
attrs: {
|
attrs: {
|
||||||
placeholder: "请选择打印机品牌",
|
placeholder: "请选择打印机品牌",
|
||||||
@@ -139,27 +143,27 @@ const modalConfig: IModalConfig<addRequest> = {
|
|||||||
label: "",
|
label: "",
|
||||||
initialValue: []
|
initialValue: []
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
type: "radio",
|
type: "radio",
|
||||||
label: "打印数量",
|
label: "打印数量",
|
||||||
prop: "printQty",
|
prop: "printNum",
|
||||||
options: options.printQty,
|
options: options.printQty,
|
||||||
initialValue: options.printQty[0].value
|
initialValue: options.printQty[0].value
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "radio",
|
type: "radio",
|
||||||
label: "打印方式",
|
label: "打印方式",
|
||||||
prop: "printMethod",
|
prop: "kitchenPrintMode",
|
||||||
options: options.printMethod,
|
options: options.printMethod,
|
||||||
initialValue: options.printMethod[0].value
|
initialValue: options.printMethod[0].value
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "checkbox",
|
type: "custom",
|
||||||
label: "打印类型",
|
label: "打印类型",
|
||||||
prop: "printType",
|
prop: "printContentType",
|
||||||
options: options.printType,
|
options: options.printType,
|
||||||
initialValue: options.printType.map(v => v.value)
|
initialValue: options.printType.map(v => v.value),
|
||||||
|
slotName: 'printTypeSlot'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "打印机状态",
|
label: "打印机状态",
|
||||||
|
|||||||
@@ -59,8 +59,8 @@ const contentConfig: IContentConfig<getListRequest> = {
|
|||||||
label: "状态",
|
label: "状态",
|
||||||
align: "center",
|
align: "center",
|
||||||
prop: "status",
|
prop: "status",
|
||||||
templet: "switch",
|
templet: "custom",
|
||||||
slotName: "status",
|
slotName: "status"
|
||||||
},
|
},
|
||||||
{ label: "创建时间", align: "center", prop: "createTime" },
|
{ label: "创建时间", align: "center", prop: "createTime" },
|
||||||
// {
|
// {
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ const modalConfig: IModalConfig<editRequest> = {
|
|||||||
obj.categoryIds = JSON.stringify(data.categoryIdsArr)
|
obj.categoryIds = JSON.stringify(data.categoryIdsArr)
|
||||||
obj.categoryList = JSON.stringify(data.categoryIdsArr)
|
obj.categoryList = JSON.stringify(data.categoryIdsArr)
|
||||||
}
|
}
|
||||||
|
if (data.classifyPrint == 0) {
|
||||||
|
obj.categoryIds = ''
|
||||||
|
}
|
||||||
return printerApi.edit(obj);
|
return printerApi.edit(obj);
|
||||||
},
|
},
|
||||||
beforeSubmit(data) {
|
beforeSubmit(data) {
|
||||||
@@ -157,11 +160,11 @@ const modalConfig: IModalConfig<editRequest> = {
|
|||||||
initialValue: options.printMethod[0].value
|
initialValue: options.printMethod[0].value
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "checkbox",
|
type: "custom",
|
||||||
label: "打印类型",
|
label: "打印类型",
|
||||||
prop: "printType",
|
prop: "printContentType",
|
||||||
options: options.printType,
|
options: '',
|
||||||
initialValue: options.printType.map(v => v.value)
|
initialValue: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "打印机状态",
|
label: "打印机状态",
|
||||||
|
|||||||
@@ -9,16 +9,16 @@
|
|||||||
<page-content ref="contentRef" :content-config="contentConfig" @add-click="handleAddClick"
|
<page-content ref="contentRef" :content-config="contentConfig" @add-click="handleAddClick"
|
||||||
@edit-click="handleEditClick" @export-click="handleExportClick" @search-click="handleSearchClick"
|
@edit-click="handleEditClick" @export-click="handleExportClick" @search-click="handleSearchClick"
|
||||||
@toolbar-click="handleToolbarClick" @operat-click="handleOperatClick" @filter-change="handleFilterChange">
|
@toolbar-click="handleToolbarClick" @operat-click="handleOperatClick" @filter-change="handleFilterChange">
|
||||||
<template #status="scope">
|
<!-- <template #status="scope">
|
||||||
<el-tag :type="scope.row[scope.prop] == 1 ? 'success' : 'info'">
|
<el-tag :type="scope.row[scope.prop] == 1 ? 'success' : 'info'">
|
||||||
{{ scope.row[scope.prop] == 1 ? "启用" : "禁用" }}
|
{{ scope.row[scope.prop] == 1 ? "启用" : "禁用" }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
</template>
|
</template> -->
|
||||||
<template #contentType="scope">
|
<template #contentType="scope">
|
||||||
{{ scope.row.contentType == 'yxyPrinter' ? "云想印" : "飞鹅" }}
|
{{ scope.row.contentType == "yxyPrinter" ? "云想印" : "飞鹅" }}
|
||||||
</template>
|
</template>
|
||||||
<template #subType="scope">
|
<template #subType="scope">
|
||||||
{{ scope.row.subType == 'label' ? "标签" : "小票" }}
|
{{ scope.row.subType == "label" ? "标签" : "小票" }}
|
||||||
</template>
|
</template>
|
||||||
<template #caozuo="scope">
|
<template #caozuo="scope">
|
||||||
{{ scope }}
|
{{ scope }}
|
||||||
@@ -26,10 +26,18 @@
|
|||||||
<template #gender="scope">
|
<template #gender="scope">
|
||||||
<DictLabel v-model="scope.row[scope.prop]" code="gender" />
|
<DictLabel v-model="scope.row[scope.prop]" code="gender" />
|
||||||
</template>
|
</template>
|
||||||
|
<template #status="scope">
|
||||||
|
<el-switch v-model="scope.row.status" :active-value="1" :inactive-value="0"
|
||||||
|
@click="statusChange($event, scope.row)"></el-switch>
|
||||||
|
</template>
|
||||||
<template #operate="scope">
|
<template #operate="scope">
|
||||||
<div v-if="scope.row.connectionType != 'USB'">
|
<div v-if="scope.row.connectionType != 'USB'">
|
||||||
<el-button @click="handleEditClick(scope.row)" icon="Edit" type="primary" link>编辑</el-button>
|
<el-button @click="handleEditClick(scope.row)" icon="Edit" type="primary" link>
|
||||||
<el-button @click="handdeleteevent(scope.row)" icon="Delete" type="danger" link>删除</el-button>
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="handdeleteevent(scope.row)" icon="Delete" type="danger" link>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<!-- <template #mobile="scope">
|
<!-- <template #mobile="scope">
|
||||||
@@ -39,10 +47,21 @@
|
|||||||
</page-content>
|
</page-content>
|
||||||
|
|
||||||
<!-- 新增 -->
|
<!-- 新增 -->
|
||||||
<page-modal ref="addModalRef" :modal-config="addModalConfig" @submit-click="handleSubmitClick">
|
<!-- <page-modal ref="addModalRef" :modal-config="addModalConfig" @submit-click="handleSubmitClick">
|
||||||
<template #gender="scope">
|
<template #gender="scope">
|
||||||
<Dict v-model="scope.formData[scope.prop]" code="gender" />
|
<Dict v-model="scope.formData[scope.prop]" code="gender" />
|
||||||
</template>
|
</template>
|
||||||
|
<template #printTypeSlot="scope">
|
||||||
|
<div class="row" v-for="(item, index) in printTypeList" :key="index">
|
||||||
|
<div class="title">{{ item.label }}</div>
|
||||||
|
<div class="cont">
|
||||||
|
<el-checkbox-group v-model="item.values" @change="printTypeChange($event, index, scope)">
|
||||||
|
<el-checkbox :label="item.label" :value="item.value" v-for="item in item.list"
|
||||||
|
:key="item.value"></el-checkbox>
|
||||||
|
</el-checkbox-group>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
<template #classifyPrintData="scope">
|
<template #classifyPrintData="scope">
|
||||||
<template v-if="scope.formData.classifyPrint == 1">
|
<template v-if="scope.formData.classifyPrint == 1">
|
||||||
<el-checkbox-group v-model="scope.formData.categoryIdsArr">
|
<el-checkbox-group v-model="scope.formData.categoryIdsArr">
|
||||||
@@ -52,13 +71,24 @@
|
|||||||
</el-checkbox-group>
|
</el-checkbox-group>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</page-modal>
|
</page-modal> -->
|
||||||
|
|
||||||
<!-- 编辑 -->
|
<!-- 编辑 -->
|
||||||
<page-modal ref="editModalRef" :modal-config="editModalConfig" @submit-click="handleSubmitClick">
|
<!-- <page-modal ref="editModalRef" :modal-config="editModalConfig" @submit-click="handleSubmitClick">
|
||||||
<template #gender="scope">
|
<template #gender="scope">
|
||||||
<Dict v-model="scope.formData[scope.prop]" code="gender" v-bind="scope.attrs" />
|
<Dict v-model="scope.formData[scope.prop]" code="gender" v-bind="scope.attrs" />
|
||||||
</template>
|
</template>
|
||||||
|
<template #printTypeSlot="scope">
|
||||||
|
<div class="row" v-for="(item, index) in printTypeList" :key="index">
|
||||||
|
<div class="title">{{ item.label }}</div>
|
||||||
|
<div class="cont">
|
||||||
|
<el-checkbox-group v-model="item.values" @change="printTypeChange($event, index, scope)">
|
||||||
|
<el-checkbox :label="item.label" :value="item.value" v-for="item in item.list"
|
||||||
|
:key="item.value"></el-checkbox>
|
||||||
|
</el-checkbox-group>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
<template #classifyPrintData="scope">
|
<template #classifyPrintData="scope">
|
||||||
<template v-if="scope.formData.classifyPrint == 1">
|
<template v-if="scope.formData.classifyPrint == 1">
|
||||||
<el-checkbox-group v-model="scope.formData.categoryIdsArr">
|
<el-checkbox-group v-model="scope.formData.categoryIdsArr">
|
||||||
@@ -68,11 +98,103 @@
|
|||||||
</el-checkbox-group>
|
</el-checkbox-group>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</page-modal>
|
</page-modal> -->
|
||||||
|
|
||||||
|
<el-dialog :title="form.id ? '编辑打印机' : '添加打印机'" width="800px" v-model="visible" @closed="dialogClosed"
|
||||||
|
@open="dialogOpen">
|
||||||
|
<div style="height: 60vh;overflow-y: auto;" ref="formDivRef">
|
||||||
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
|
||||||
|
<el-form-item label="设备名称" prop="name">
|
||||||
|
<el-input v-model="form.name" placeholder="请输入设备名称"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="设备类型">
|
||||||
|
<el-radio-group v-model="form.connectionType">
|
||||||
|
<el-radio-button label="USB" value="USB"></el-radio-button>
|
||||||
|
<el-radio-button label="云打印" value="云打印"></el-radio-button>
|
||||||
|
<el-radio-button label="局域网" value="局域网"></el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="小票类型">
|
||||||
|
<el-radio-group v-model="form.printType">
|
||||||
|
<el-radio-button label="标签" value="label"></el-radio-button>
|
||||||
|
<el-radio-button label="小票" value="cash"></el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="打印机品牌" prop="brand">
|
||||||
|
<el-radio-group v-model="form.brand">
|
||||||
|
<el-radio-button label="飞鹅"></el-radio-button>
|
||||||
|
<el-radio-button label="云想印"></el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="ip地址/MAC地址" prop="address">
|
||||||
|
<el-input v-model="form.address" placeholder="请输入ip地址/MAC地址"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="端口" prop="port">
|
||||||
|
<el-input v-model="form.port" placeholder="请输入端口"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="小票尺寸" prop="receiptSize">
|
||||||
|
<el-radio-group v-model="form.receiptSize">
|
||||||
|
<el-radio-button label="58mm"></el-radio-button>
|
||||||
|
<el-radio-button label="80mm"></el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="打印数量" prop="printNum">
|
||||||
|
<el-input-number v-model="form.printNum" :step="1" :min="1"></el-input-number>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="打印内容" prop="printContentType">
|
||||||
|
<div class="row" v-for="(item, index) in printTypeList" :key="index">
|
||||||
|
<div class="title">{{ item.label }}</div>
|
||||||
|
<div class="cont">
|
||||||
|
<el-checkbox-group v-model="item.values" @change="printTypeChange($event, index)">
|
||||||
|
<el-checkbox :label="item.label" :value="item.value" v-for="item in item.list"
|
||||||
|
:key="item.value"></el-checkbox>
|
||||||
|
</el-checkbox-group>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
<!-- <el-form-item label="打印模式" prop="kitchenPrintMode">
|
||||||
|
<el-radio-group v-model="form.kitchenPrintMode">
|
||||||
|
<el-radio-button label="整单" value="all"></el-radio-button>
|
||||||
|
<el-radio-button label="单个" value="only"></el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
<el-text type="info" style="margin-left: 14px;">仅针对厨房制作单的打印</el-text>
|
||||||
|
</el-form-item> -->
|
||||||
|
<el-form-item label="分类打印">
|
||||||
|
<div class="column">
|
||||||
|
<div style="display: flex;align-items: center;">
|
||||||
|
<el-radio-group v-model="form.classifyPrint">
|
||||||
|
<el-radio-button label="所有" value="0"></el-radio-button>
|
||||||
|
<el-radio-button label="部分分类" value="1" v-if="printTypeList[1].values.length > 0"></el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
<el-text type="info" style="margin-left: 14px;">仅针对厨房制作单的打印</el-text>
|
||||||
|
</div>
|
||||||
|
<template v-if="form.classifyPrint == 1">
|
||||||
|
<el-checkbox-group v-model="form.categoryIds">
|
||||||
|
<el-checkbox v-for="item in PrinterTypeList" :value="item.id" :label="item.name"></el-checkbox>
|
||||||
|
</el-checkbox-group>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="媒体音量">
|
||||||
|
<el-switch v-model="form.volumeSwitch" :active-value="1" :inactive-value="0"></el-switch>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="启用状态">
|
||||||
|
<el-switch v-model="form.status" :active-value="1" :inactive-value="0"></el-switch>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
<template #footer>
|
||||||
|
<div class="dialog-footer">
|
||||||
|
<el-button @click="visible = false">取 消</el-button>
|
||||||
|
<el-button type="primary" :loading="loading" @click="submitHandle">确 定</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import _ from 'lodash'
|
||||||
import UserAPI from "@/api/account/printer";
|
import UserAPI from "@/api/account/printer";
|
||||||
import type { IObject, IOperatData } from "@/components/CURD/types";
|
import type { IObject, IOperatData } from "@/components/CURD/types";
|
||||||
import usePage from "@/components/CURD/usePage";
|
import usePage from "@/components/CURD/usePage";
|
||||||
@@ -80,6 +202,166 @@ import addModalConfig from "./config/add";
|
|||||||
import contentConfig from "./config/content";
|
import contentConfig from "./config/content";
|
||||||
import editModalConfig from "./config/edit";
|
import editModalConfig from "./config/edit";
|
||||||
import searchConfig from "./config/search";
|
import searchConfig from "./config/search";
|
||||||
|
import { options } from './config/config'
|
||||||
|
import printerApi, { type addRequest } from "@/api/account/printer";
|
||||||
|
|
||||||
|
const printTypeList = ref([
|
||||||
|
{
|
||||||
|
label: '前台',
|
||||||
|
values: [],
|
||||||
|
list: [
|
||||||
|
{ label: '客看单', value: 'GUEST_ORDER' },
|
||||||
|
{ label: '预结算单', value: 'PRE_ORDER' },
|
||||||
|
{ label: '结算单', value: 'ORDER' },
|
||||||
|
{ label: '退菜单', value: 'RETURN_ORDER' },
|
||||||
|
{ label: '退款单', value: 'REFUND_ORDER' },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '后厨',
|
||||||
|
values: [],
|
||||||
|
list: [
|
||||||
|
{ label: '后厨-整单', value: 'ALL_KITCHEN' },
|
||||||
|
{ label: '后厨-分单', value: 'ONLY_KITCHEN' },
|
||||||
|
{ label: '后厨-退菜单', value: 'REFUND_KITCHEN' },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '其它',
|
||||||
|
values: [],
|
||||||
|
list: [
|
||||||
|
{ label: '交班单', value: 'HANDOVER' },
|
||||||
|
{ label: '排队取号', value: 'CALL' },
|
||||||
|
{ label: '储值单', value: 'RECHARGE' },
|
||||||
|
{ label: '入库单', value: 'STOCK' },
|
||||||
|
{ label: '盘点单', value: 'STOCK_CHECK' },
|
||||||
|
{ label: '商品报表', value: 'PRODUCT_REPORT' },
|
||||||
|
{ label: '经营日报', value: 'DAY_REPORT' },
|
||||||
|
{ label: '日结单', value: 'DAY_ORDER' },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
const loading = ref(false)
|
||||||
|
const visible = ref(false)
|
||||||
|
const formRef = ref(null)
|
||||||
|
const obj = {
|
||||||
|
id: '',
|
||||||
|
name: '', // 设备名称
|
||||||
|
connectionType: '云打印', // 连接方式 USB、云打印、局域网
|
||||||
|
printType: 'cash', // 打印类型 label标签 cash小票
|
||||||
|
brand: '', // 打印机品牌 飞鹅/云想印
|
||||||
|
address: '', // ip地址/MAC地址
|
||||||
|
port: '', // 端口
|
||||||
|
receiptSize: '58mm', // 小票尺寸 58mm 80mm
|
||||||
|
printNum: 1, // 打印数量
|
||||||
|
printContentType: '', // 打印内容
|
||||||
|
kitchenPrintMode: 'all', // 打印模式(厨房打印菜品) all整单 /only单个
|
||||||
|
classifyPrint: '0', // 分类打印 0-所有 1-部分分类
|
||||||
|
categoryIds: [], // 分类Id
|
||||||
|
status: 1, // 0 禁用 1启用
|
||||||
|
volumeSwitch: 1, // 媒体声音开关 0关1开
|
||||||
|
}
|
||||||
|
const form = ref({ ...obj })
|
||||||
|
|
||||||
|
const rules = {
|
||||||
|
name: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: '请输入设备名称',
|
||||||
|
trigger: 'blur'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
brand: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: '请选择打印机品牌',
|
||||||
|
trigger: 'change'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
printNum: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: '请选择打印数量',
|
||||||
|
trigger: 'change'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
// kitchenPrintMode: [
|
||||||
|
// {
|
||||||
|
// required: true,
|
||||||
|
// message: '请选择打印模式',
|
||||||
|
// trigger: 'change'
|
||||||
|
// }
|
||||||
|
// ]
|
||||||
|
}
|
||||||
|
|
||||||
|
function dialogClosed() {
|
||||||
|
formRef.value.resetFields()
|
||||||
|
form.value = { ...obj }
|
||||||
|
}
|
||||||
|
|
||||||
|
const formDivRef = ref(null)
|
||||||
|
async function dialogOpen() {
|
||||||
|
await nextTick()
|
||||||
|
if (formDivRef.value) {
|
||||||
|
// console.log('开始滚动到顶部')
|
||||||
|
formDivRef.value.scrollTop = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 打印类型切换
|
||||||
|
function printTypeChange(e, index, scope) {
|
||||||
|
if (index == 1 && printTypeList.value[index].values.length == 0) {
|
||||||
|
form.value.categoryList = []
|
||||||
|
}
|
||||||
|
|
||||||
|
let arr = []
|
||||||
|
printTypeList.value.forEach(item => {
|
||||||
|
arr.push(...item.values)
|
||||||
|
})
|
||||||
|
|
||||||
|
form.value.printContentType = arr.join(',')
|
||||||
|
}
|
||||||
|
|
||||||
|
function submitHandle() {
|
||||||
|
console.log('submitHandle===', form.value);
|
||||||
|
formRef.value.validate(async valid => {
|
||||||
|
try {
|
||||||
|
if (valid) {
|
||||||
|
loading.value = true
|
||||||
|
const data = { ...form.value }
|
||||||
|
data.categoryIds = form.value.categoryIds.join(',')
|
||||||
|
if (form.value.id) {
|
||||||
|
await printerApi.edit(data)
|
||||||
|
} else {
|
||||||
|
await printerApi.add(data)
|
||||||
|
}
|
||||||
|
ElMessage.success(form.value.id ? '编辑成功' : '添加成功')
|
||||||
|
visible.value = false
|
||||||
|
|
||||||
|
handleQueryClick();
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
setTimeout(() => {
|
||||||
|
loading.value = false
|
||||||
|
}, 300);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更改状态
|
||||||
|
async function statusChange(e, data) {
|
||||||
|
try {
|
||||||
|
await printerApi.edit({
|
||||||
|
id: data.id,
|
||||||
|
status: data.status
|
||||||
|
});
|
||||||
|
handleQueryClick();
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const {
|
const {
|
||||||
searchRef,
|
searchRef,
|
||||||
@@ -98,11 +380,11 @@ const {
|
|||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getPrinterType();
|
getPrinterType();
|
||||||
});
|
});
|
||||||
let PrinterTypeList = ref([])
|
let PrinterTypeList = ref([]);
|
||||||
// 获取商品分类
|
// 获取商品分类
|
||||||
async function getPrinterType() {
|
async function getPrinterType() {
|
||||||
let res = await UserAPI.getPrinterType();
|
let res = await UserAPI.getPrinterType();
|
||||||
PrinterTypeList.value = res.records
|
PrinterTypeList.value = res.records;
|
||||||
}
|
}
|
||||||
function handdeleteevent(item) {
|
function handdeleteevent(item) {
|
||||||
ElMessageBox.confirm("确认删除?", "警告", {
|
ElMessageBox.confirm("确认删除?", "警告", {
|
||||||
@@ -114,28 +396,45 @@ function handdeleteevent(item) {
|
|||||||
ElMessage.success("删除成功");
|
ElMessage.success("删除成功");
|
||||||
handleQueryClick();
|
handleQueryClick();
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// 新增
|
// 新增
|
||||||
async function handleAddClick() {
|
async function handleAddClick() {
|
||||||
addModalRef.value?.setModalVisible();
|
// addModalRef.value?.setModalVisible();
|
||||||
|
visible.value = true
|
||||||
}
|
}
|
||||||
// 编辑
|
// 编辑
|
||||||
async function handleEditClick(row: IObject) {
|
async function handleEditClick(row: IObject) {
|
||||||
editModalRef.value?.handleDisabled(false);
|
form.value = { ...row }
|
||||||
editModalRef.value?.setModalVisible();
|
visible.value = true
|
||||||
// 根据id获取数据进行填充
|
|
||||||
let data = await UserAPI.get(row.id);
|
|
||||||
data.printType = data.printType.split(',');
|
|
||||||
|
|
||||||
if (data.categoryIds) {
|
form.value.categoryIds = form.value.categoryIds.split(',')
|
||||||
data.categoryIdsArr = JSON.parse(data.categoryIds)
|
|
||||||
}
|
|
||||||
|
|
||||||
data.classifyPrint = data.classifyPrint * 1;
|
const printContentTypes = row.printContentType.split(',')
|
||||||
|
printTypeList.value.forEach(val => {
|
||||||
|
val.values = _.map(
|
||||||
|
_.filter(val.list, item => printContentTypes.includes(item.value)),
|
||||||
|
'value'
|
||||||
|
);
|
||||||
|
})
|
||||||
|
|
||||||
editModalRef.value?.setFormData(data);
|
// editModalRef.value?.handleDisabled(false);
|
||||||
|
// editModalRef.value?.setModalVisible();
|
||||||
|
// // 根据id获取数据进行填充
|
||||||
|
// let data = await UserAPI.get(row.id);
|
||||||
|
// data.printType = data.printType.split(",");
|
||||||
|
|
||||||
|
// if (data.categoryIds) {
|
||||||
|
// data.categoryIdsArr = JSON.parse(data.categoryIds);
|
||||||
|
// } else {
|
||||||
|
// data.categoryIdsArr = [];
|
||||||
|
// }
|
||||||
|
// console.log(data.categoryIdsArr);
|
||||||
|
// console.log(data);
|
||||||
|
|
||||||
|
// data.classifyPrint = data.classifyPrint * 1;
|
||||||
|
|
||||||
|
// editModalRef.value?.setFormData(data);
|
||||||
}
|
}
|
||||||
// 其他工具栏
|
// 其他工具栏
|
||||||
function handleToolbarClick(name: string) {
|
function handleToolbarClick(name: string) {
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
<div class="item_wrap">
|
<div class="item_wrap">
|
||||||
<div class="title">您好,欢迎登录</div>
|
<div class="title">您好,欢迎登录</div>
|
||||||
<div class="item_list">
|
<div class="item_list">
|
||||||
<div class="item" v-for="(item, index) in quickStore.quickMenus" :key="item.id" @click="menuClick(item.menuId)">
|
<div class="item" v-for="(item, index) in quickStore.quickMenus.splice(0, 6)" :key="item.id"
|
||||||
|
@click="menuClick(item.menuId)">
|
||||||
<img class="icon" :src="icons[index + 1]" alt="">
|
<img class="icon" :src="icons[index + 1]" alt="">
|
||||||
{{ returnMenuName(item.menuId) }}
|
{{ returnMenuName(item.menuId) }}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -198,6 +198,12 @@ function handleLogin() {
|
|||||||
userStore
|
userStore
|
||||||
.login(user)
|
.login(user)
|
||||||
.then(async (res) => {
|
.then(async (res) => {
|
||||||
|
|
||||||
|
console.log('login===', res);
|
||||||
|
|
||||||
|
localStorage.setItem('shopStaff', JSON.stringify(res.shopStaff))
|
||||||
|
|
||||||
|
|
||||||
const token = getToken();
|
const token = getToken();
|
||||||
console.log("token", token);
|
console.log("token", token);
|
||||||
$douyin_checkIn({
|
$douyin_checkIn({
|
||||||
|
|||||||
@@ -93,13 +93,8 @@
|
|||||||
<div>
|
<div>
|
||||||
实收金额:
|
实收金额:
|
||||||
<span style="color: red">¥{{ detail.payAmount }}</span>
|
<span style="color: red">¥{{ detail.payAmount }}</span>
|
||||||
<el-button
|
<el-button v-if="detail.status != 'unpaid' && detail.refundAmount < detail.payAmount" size="small"
|
||||||
v-if="detail.status != 'unpaid' && detail.refundAmount < detail.payAmount"
|
type="danger" class="u-m-l-10" @click="tuikuan()">
|
||||||
size="small"
|
|
||||||
type="danger"
|
|
||||||
class="u-m-l-10"
|
|
||||||
@click="tuikuan()"
|
|
||||||
>
|
|
||||||
<span>退款</span>
|
<span>退款</span>
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -130,35 +125,22 @@
|
|||||||
<div style="margin-bottom: 16px; font-size: 16px">商品信息</div>
|
<div style="margin-bottom: 16px; font-size: 16px">商品信息</div>
|
||||||
<template v-for="(item, index) in detail.detailMap" :key="index">
|
<template v-for="(item, index) in detail.detailMap" :key="index">
|
||||||
<h4>第{{ index }}次下单</h4>
|
<h4>第{{ index }}次下单</h4>
|
||||||
<el-table
|
<el-table :data="item" :ref="'refTable' + index" @select-all="tableSelectAll($event, index)">
|
||||||
:data="item"
|
|
||||||
:ref="'refTable' + index"
|
|
||||||
@select-all="tableSelectAll($event, index)"
|
|
||||||
>
|
|
||||||
<!-- <el-table-column type="selection" width="55" /> -->
|
<!-- <el-table-column type="selection" width="55" /> -->
|
||||||
<el-table-column label="数量" type="selection">
|
<el-table-column label="数量" type="selection">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<div v-if="detail.status == 'unpaid'">
|
<div v-if="detail.status == 'unpaid'">
|
||||||
<el-checkbox
|
<el-checkbox v-if="scope.row.num - scope.row.returnNum > 0" v-model="scope.row.checked" />
|
||||||
v-if="scope.row.num - scope.row.returnNum > 0"
|
|
||||||
v-model="scope.row.checked"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<el-checkbox
|
<el-checkbox v-if="scope.row.num - scope.row.refundNum > 0" v-model="scope.row.checked" />
|
||||||
v-if="scope.row.num - scope.row.refundNum > 0"
|
|
||||||
v-model="scope.row.checked"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="商品" width="150">
|
<el-table-column label="商品" width="150">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<div class="shop_info">
|
<div class="shop_info">
|
||||||
<el-image
|
<el-image :src="scope.row.productImg" style="width: 40px; height: 40px"></el-image>
|
||||||
:src="scope.row.productImg"
|
|
||||||
style="width: 40px; height: 40px"
|
|
||||||
></el-image>
|
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<span :class="[scope.row.isVip == 1 ? 'colorStyle' : '']">
|
<span :class="[scope.row.isVip == 1 ? 'colorStyle' : '']">
|
||||||
{{ scope.row.productName }}
|
{{ scope.row.productName }}
|
||||||
@@ -191,32 +173,17 @@
|
|||||||
<el-table-column label="实付">
|
<el-table-column label="实付">
|
||||||
<template v-slot="scope">¥{{ scope.row.payAmount }}</template>
|
<template v-slot="scope">¥{{ scope.row.payAmount }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column v-if="detail.status == 'unpaid'" label="可退菜数量" align="center" width="130px">
|
||||||
v-if="detail.status == 'unpaid'"
|
|
||||||
label="可退菜数量"
|
|
||||||
align="center"
|
|
||||||
width="130px"
|
|
||||||
>
|
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<el-input-number
|
<el-input-number v-if="scope.row.checked" :min="0" style="width: 100px" v-model="scope.row.selNumber"
|
||||||
v-if="scope.row.checked"
|
:max="scope.row.num - scope.row.returnNum"></el-input-number>
|
||||||
:min="0"
|
|
||||||
style="width: 100px"
|
|
||||||
v-model="scope.row.selNumber"
|
|
||||||
:max="scope.row.num - scope.row.returnNum"
|
|
||||||
></el-input-number>
|
|
||||||
<span class="" v-else>{{ scope.row.num - scope.row.returnNum }}</span>
|
<span class="" v-else>{{ scope.row.num - scope.row.returnNum }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column v-else label="可退款数量" align="center" width="130px">
|
<el-table-column v-else label="可退款数量" align="center" width="130px">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<el-input-number
|
<el-input-number v-if="scope.row.checked" :min="0" style="width: 100px" v-model="scope.row.selNumber"
|
||||||
v-if="scope.row.checked"
|
:max="scope.row.num - scope.row.refundNum - scope.row.returnNum"></el-input-number>
|
||||||
:min="0"
|
|
||||||
style="width: 100px"
|
|
||||||
v-model="scope.row.selNumber"
|
|
||||||
:max="scope.row.num - scope.row.refundNum - scope.row.returnNum"
|
|
||||||
></el-input-number>
|
|
||||||
<span class="" v-else>
|
<span class="" v-else>
|
||||||
{{ scope.row.num - scope.row.refundNum - scope.row.returnNum }}
|
{{ scope.row.num - scope.row.refundNum - scope.row.returnNum }}
|
||||||
</span>
|
</span>
|
||||||
@@ -231,23 +198,13 @@
|
|||||||
<el-table-column label="操作" fixed="right">
|
<el-table-column label="操作" fixed="right">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<template v-if="detail.status != 'unpaid'">
|
<template v-if="detail.status != 'unpaid'">
|
||||||
<el-button
|
<el-button v-if="canTuikuan(scope.row)" link size="small" @click="tuikuan(scope.row)">
|
||||||
v-if="canTuikuan(scope.row)"
|
|
||||||
link
|
|
||||||
size="small"
|
|
||||||
@click="tuikuan(scope.row)"
|
|
||||||
>
|
|
||||||
<span>退款</span>
|
<span>退款</span>
|
||||||
</el-button>
|
</el-button>
|
||||||
<span class="color-999" v-if="scope.row.status == 'refund'">已退款</span>
|
<span class="color-999" v-if="scope.row.status == 'refund'">已退款</span>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="detail.status == 'unpaid'">
|
<template v-if="detail.status == 'unpaid'">
|
||||||
<el-button
|
<el-button v-if="canTuicai(scope.row)" link size="small" @click="tuicai(scope.row)">
|
||||||
v-if="canTuicai(scope.row)"
|
|
||||||
link
|
|
||||||
size="small"
|
|
||||||
@click="tuicai(scope.row)"
|
|
||||||
>
|
|
||||||
<span>退菜</span>
|
<span>退菜</span>
|
||||||
</el-button>
|
</el-button>
|
||||||
<span class="color-999" v-else>已退菜</span>
|
<span class="color-999" v-else>已退菜</span>
|
||||||
@@ -257,41 +214,25 @@
|
|||||||
</el-table>
|
</el-table>
|
||||||
</template>
|
</template>
|
||||||
<!-- 退款 -->
|
<!-- 退款 -->
|
||||||
<div
|
<div class="u-p-20 u-flex u-row-right" v-if="
|
||||||
class="u-p-20 u-flex u-row-right"
|
detail.status !== 'refund' &&
|
||||||
v-if="
|
detail.status !== 'unpaid' &&
|
||||||
detail.status !== 'refund' &&
|
detail.status !== 'cancelled'
|
||||||
detail.status !== 'unpaid' &&
|
">
|
||||||
detail.status !== 'cancelled'
|
<el-checkbox v-model="allSelected" @change="allSelectedChange" label="全选"></el-checkbox>
|
||||||
"
|
|
||||||
>
|
|
||||||
<el-checkbox
|
|
||||||
v-model="allSelected"
|
|
||||||
@change="allSelectedChange"
|
|
||||||
label="全选"
|
|
||||||
></el-checkbox>
|
|
||||||
<el-button type="danger" class="u-m-l-20" @click.stop="tuikuan('all')">退款</el-button>
|
<el-button type="danger" class="u-m-l-20" @click.stop="tuikuan('all')">退款</el-button>
|
||||||
</div>
|
</div>
|
||||||
<!-- 退菜 -->
|
<!-- 退菜 -->
|
||||||
<div class="u-p-20 u-flex u-row-right" v-if="detail.status == 'unpaid'">
|
<div class="u-p-20 u-flex u-row-right" v-if="detail.status == 'unpaid'">
|
||||||
<el-checkbox
|
<el-checkbox v-model="allSelected" @change="allSelectedChange" label="全选"></el-checkbox>
|
||||||
v-model="allSelected"
|
|
||||||
@change="allSelectedChange"
|
|
||||||
label="全选"
|
|
||||||
></el-checkbox>
|
|
||||||
<el-button type="danger" class="u-m-l-20" @click.stop="tuicai('all')">退菜</el-button>
|
<el-button type="danger" class="u-m-l-20" @click.stop="tuicai('all')">退菜</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-drawer>
|
</el-drawer>
|
||||||
<!-- 退款 -->
|
<!-- 退款 -->
|
||||||
<return-money
|
<return-money :modal="false" ref="refReturnMoney" :max="selGoods.num" :goods="selGoods"
|
||||||
:modal="false"
|
@confirm="refReturnMoneyConfirm"></return-money>
|
||||||
ref="refReturnMoney"
|
|
||||||
:max="selGoods.num"
|
|
||||||
:goods="selGoods"
|
|
||||||
@confirm="refReturnMoneyConfirm"
|
|
||||||
></return-money>
|
|
||||||
<!-- 退菜 -->
|
<!-- 退菜 -->
|
||||||
<order-return-cart ref="refReturnCart" @confirm="refReturnCartConfirm"></order-return-cart>
|
<order-return-cart ref="refReturnCart" @confirm="refReturnCartConfirm"></order-return-cart>
|
||||||
</div>
|
</div>
|
||||||
@@ -466,6 +407,12 @@ export default {
|
|||||||
},
|
},
|
||||||
tuikuan(item) {
|
tuikuan(item) {
|
||||||
if (!item) {
|
if (!item) {
|
||||||
|
let arrs = []
|
||||||
|
for (let i in this.detail.detailMap) {
|
||||||
|
this.detail.detailMap[i].map((v) => {
|
||||||
|
arrs.push(v);
|
||||||
|
});
|
||||||
|
}
|
||||||
this.$refs.refReturnMoney.open([], this.detail);
|
this.$refs.refReturnMoney.open([], this.detail);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -484,6 +431,9 @@ export default {
|
|||||||
if (arr.length == 0) {
|
if (arr.length == 0) {
|
||||||
return ElMessage.error("请选择要退款的商品和数量");
|
return ElMessage.error("请选择要退款的商品和数量");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('tuikuan===', arr);
|
||||||
|
|
||||||
this.$refs.refReturnMoney.open(arr, this.detail);
|
this.$refs.refReturnMoney.open(arr, this.detail);
|
||||||
},
|
},
|
||||||
tuicai(item) {
|
tuicai(item) {
|
||||||
@@ -502,7 +452,7 @@ export default {
|
|||||||
if (arr.length == 0) {
|
if (arr.length == 0) {
|
||||||
return ElMessage.error("请选择要退菜的商品和数量");
|
return ElMessage.error("请选择要退菜的商品和数量");
|
||||||
}
|
}
|
||||||
console.log(arr);
|
console.log('tuicai===', arr);
|
||||||
this.$refs.refReturnCart.open(arr, this.detail);
|
this.$refs.refReturnCart.open(arr, this.detail);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,7 @@
|
|||||||
<div class="u-flex u-col-top" v-if="goodsList && goodsList.length">
|
<div class="u-flex u-col-top" v-if="goodsList && goodsList.length">
|
||||||
<span class="u-m-0">退款商品</span>
|
<span class="u-m-0">退款商品</span>
|
||||||
<div class="u-p-l-20 goods-list">
|
<div class="u-p-l-20 goods-list">
|
||||||
<div
|
<div class="u-flex u-font-12 goods-list-item" v-for="(goods, index) in goodsList" :key="index">
|
||||||
class="u-flex u-font-12 goods-list-item"
|
|
||||||
v-for="(goods, index) in goodsList"
|
|
||||||
:key="index"
|
|
||||||
>
|
|
||||||
<span class="">
|
<span class="">
|
||||||
{{ goods.productName }}
|
{{ goods.productName }}
|
||||||
</span>
|
</span>
|
||||||
@@ -35,12 +31,7 @@
|
|||||||
<div class="flex u-row-between">
|
<div class="flex u-row-between">
|
||||||
<span class="color-red">退款金额</span>
|
<span class="color-red">退款金额</span>
|
||||||
<div class="u-flex u-flex-1 u-p-l-20">
|
<div class="u-flex u-flex-1 u-p-l-20">
|
||||||
<el-input-number
|
<el-input-number type="number" v-model="number" :min="min" :max="canReturnMoney"></el-input-number>
|
||||||
type="number"
|
|
||||||
v-model="number"
|
|
||||||
:min="min"
|
|
||||||
:max="canReturnMoney"
|
|
||||||
></el-input-number>
|
|
||||||
<span class="u-m-l-10">可退{{ canReturnMoney }}元</span>
|
<span class="u-m-l-10">可退{{ canReturnMoney }}元</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -73,13 +64,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="u-flex u-flex-wrap tags">
|
<div class="u-flex u-flex-wrap tags">
|
||||||
<div
|
<div class="tag" v-for="(tag, index) in tags" @click="changeSel(tag)" :key="index"
|
||||||
class="tag"
|
:class="{ active: tag.checked }">
|
||||||
v-for="(tag, index) in tags"
|
|
||||||
@click="changeSel(tag)"
|
|
||||||
:key="index"
|
|
||||||
:class="{ active: tag.checked }"
|
|
||||||
>
|
|
||||||
{{ tag.label }}
|
{{ tag.label }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -94,16 +80,22 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
<safe-password ref="refPassword" @confirm="pwdConfirm"></safe-password>
|
<safe-password ref="refPassword" @confirm="pwdConfirm"></safe-password>
|
||||||
|
<!-- 退款退菜推库存的操作弹窗 -->
|
||||||
|
<refundConsModal ref="refundConsModalRef" :list="refundList" @success="refundConsModalSuccess" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import safePassword from "./password.vue";
|
import safePassword from "./password.vue";
|
||||||
import { useUserStore } from "@/store/modules/user";
|
import { useUserStore } from "@/store/modules/user";
|
||||||
|
import { useCartsStore } from "@/store/modules/carts";
|
||||||
|
import categoryApi from "@/api/product/productclassification";
|
||||||
|
import refundConsModal from "@/components/refundConsModal.vue";
|
||||||
const shopUser = useUserStore();
|
const shopUser = useUserStore();
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
safePassword,
|
safePassword,
|
||||||
|
refundConsModal
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
modal: {
|
modal: {
|
||||||
@@ -135,6 +127,8 @@ export default {
|
|||||||
goods: {
|
goods: {
|
||||||
productId: -999,
|
productId: -999,
|
||||||
},
|
},
|
||||||
|
refundList: [],
|
||||||
|
refundStock: ''
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -196,18 +190,26 @@ export default {
|
|||||||
.join(",");
|
.join(",");
|
||||||
const note = selTag + (this.note.length > 0 ? "," + this.note : "");
|
const note = selTag + (this.note.length > 0 ? "," + this.note : "");
|
||||||
console.log(note);
|
console.log(note);
|
||||||
this.$emit("confirm", {
|
|
||||||
|
const data = {
|
||||||
refundAmount: this.number,
|
refundAmount: this.number,
|
||||||
cash: this.cash,
|
cash: this.cash,
|
||||||
refundReason: note,
|
refundReason: note,
|
||||||
refundDetails: this.goodsList.map((v) => {
|
refundDetails: this.goodsList.map((v) => {
|
||||||
return { id: v.id, num: v.num };
|
return { id: v.id, num: v.selNumber };
|
||||||
}),
|
}),
|
||||||
...e,
|
...e,
|
||||||
});
|
refundStock: this.refundStock
|
||||||
|
}
|
||||||
|
this.$emit("confirm", data);
|
||||||
this.close();
|
this.close();
|
||||||
},
|
},
|
||||||
confirm() {
|
// 退款推库存的操作
|
||||||
|
refundConsModalSuccess(e) {
|
||||||
|
this.refundStock = e
|
||||||
|
this.emitTuikuan()
|
||||||
|
},
|
||||||
|
async confirm() {
|
||||||
const selTag = this.tags
|
const selTag = this.tags
|
||||||
.filter((item) => item.checked)
|
.filter((item) => item.checked)
|
||||||
.map((item) => item.label)
|
.map((item) => item.label)
|
||||||
@@ -220,14 +222,58 @@ export default {
|
|||||||
this.$refs.refPassword.open();
|
this.$refs.refPassword.open();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 在这里给订单的商品补全库存信息 start
|
||||||
|
const carts = useCartsStore();
|
||||||
|
let categorys = JSON.parse(localStorage.getItem('categorys'))
|
||||||
|
let shopInfo = JSON.parse(localStorage.getItem('userInfo'))
|
||||||
|
|
||||||
|
if (!categorys) {
|
||||||
|
categorys = await categoryApi.getList({})
|
||||||
|
}
|
||||||
|
|
||||||
|
this.goodsList.forEach(item => {
|
||||||
|
carts.goods.forEach(val => {
|
||||||
|
if (item.productId == val.id) {
|
||||||
|
if (shopInfo.refundMode == 1) {
|
||||||
|
// 跟随分类退款模式
|
||||||
|
categorys.forEach(v => {
|
||||||
|
if (val.categoryId == v.id) {
|
||||||
|
item.refundMode = v.refundMode
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// 跟随商品退款模式及
|
||||||
|
item.refundMode = val.refundMode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
console.log('this.goodsList===', this.goodsList);
|
||||||
|
// 在这里给订单的商品补全库存信息 end
|
||||||
|
|
||||||
|
this.goodsList.forEach(item => {
|
||||||
|
if (item.refundMode == 3) {
|
||||||
|
this.refundList.push({
|
||||||
|
name: item.productName,
|
||||||
|
num: item.selNumber
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (this.refundList.length > 0) {
|
||||||
|
this.$refs.refundConsModalRef.show()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
this.emitTuikuan();
|
this.emitTuikuan();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {},
|
mounted() { },
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
:deep(.el-tag) {
|
:deep(.el-tag) {
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
@@ -237,6 +283,7 @@ export default {
|
|||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
height: 35px;
|
height: 35px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tags {
|
.tags {
|
||||||
.tag {
|
.tag {
|
||||||
margin: 10px 10px 0 0;
|
margin: 10px 10px 0 0;
|
||||||
@@ -246,6 +293,7 @@ export default {
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #000;
|
color: #000;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
color: #1890ff;
|
color: #1890ff;
|
||||||
background: #e8f4ff;
|
background: #e8f4ff;
|
||||||
@@ -253,14 +301,17 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep(.number-box .el-input__inner::-webkit-inner-spin-button) {
|
:deep(.number-box .el-input__inner::-webkit-inner-spin-button) {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep(.number-box .el-input__inner::-webkit-outer-spin-button) {
|
:deep(.number-box .el-input__inner::-webkit-outer-spin-button) {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.goods-list-item {
|
.goods-list-item {
|
||||||
height: 24px;
|
height: 24px;
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
@@ -268,6 +319,7 @@ export default {
|
|||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.goods-list-item:not(:first-child) {
|
.goods-list-item:not(:first-child) {
|
||||||
margin-top: 6px;
|
margin-top: 6px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,11 @@
|
|||||||
{{ scope.row[scope.prop] == 1 ? "启用" : "禁用" }}
|
{{ scope.row[scope.prop] == 1 ? "启用" : "禁用" }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
</template>
|
</template>
|
||||||
|
<template #refundMode="scope">
|
||||||
|
<!-- <el-switch v-model="scope.row[scope.prop]" :active-value="1" :inactive-value="0"
|
||||||
|
@click="isRefundStockChange($event, scope)" /> -->
|
||||||
|
<el-text>{{ returnLabel(scope.row[scope.prop]) }}</el-text>
|
||||||
|
</template>
|
||||||
<template #slotNameimage="scope">
|
<template #slotNameimage="scope">
|
||||||
<el-image v-if="scope.row.pic" :src="scope.row.pic" lazy style="width: 40px; height: 40px" />
|
<el-image v-if="scope.row.pic" :src="scope.row.pic" lazy style="width: 40px; height: 40px" />
|
||||||
<div v-else>无</div>
|
<div v-else>无</div>
|
||||||
@@ -68,6 +72,17 @@ import editModalConfig from "./categoryconfig/edit";
|
|||||||
import searchConfig from "./categoryconfig/search";
|
import searchConfig from "./categoryconfig/search";
|
||||||
import { isSyncStatus, downloadFile } from "@/utils/index";
|
import { isSyncStatus, downloadFile } from "@/utils/index";
|
||||||
|
|
||||||
|
const options = ref([
|
||||||
|
{ label: "退菜退库存", value: 1 },
|
||||||
|
{ label: "仅退菜不退库存", value: 2 },
|
||||||
|
{ label: "每次询问-退菜后弹窗提示,可手动选择", value: 3 },
|
||||||
|
])
|
||||||
|
|
||||||
|
function returnLabel(value: number) {
|
||||||
|
const option = options.value.find((option) => option.value === value);
|
||||||
|
return option ? option.label : "未知";
|
||||||
|
}
|
||||||
|
|
||||||
const {
|
const {
|
||||||
searchRef,
|
searchRef,
|
||||||
contentRef,
|
contentRef,
|
||||||
@@ -106,6 +121,16 @@ async function handleExportClick() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 退菜是否退库存开关切换
|
||||||
|
async function isRefundStockChange(e: any, scope: any) {
|
||||||
|
try {
|
||||||
|
await UserAPI.update(scope.row);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
ElMessage.error("操作失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 新增
|
// 新增
|
||||||
async function handleAddClick() {
|
async function handleAddClick() {
|
||||||
addModalRef.value?.setModalVisible();
|
addModalRef.value?.setModalVisible();
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ const modalConfig: IModalConfig<UserForm> = {
|
|||||||
draggable: true,
|
draggable: true,
|
||||||
},
|
},
|
||||||
form: {
|
form: {
|
||||||
labelWidth: 100,
|
labelWidth: 120,
|
||||||
},
|
},
|
||||||
formAction: UserAPI.addunit,
|
formAction: UserAPI.addunit,
|
||||||
beforeSubmit(data) {
|
beforeSubmit(data) {
|
||||||
@@ -31,6 +31,26 @@ const modalConfig: IModalConfig<UserForm> = {
|
|||||||
prop: "pic",
|
prop: "pic",
|
||||||
type: "UpImage",
|
type: "UpImage",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: '退菜是否退库存',
|
||||||
|
prop: 'refundMode',
|
||||||
|
type: 'radio',
|
||||||
|
options: [
|
||||||
|
{ label: "退菜退库存", value: 1 },
|
||||||
|
{ label: "仅退菜不退库存", value: 2 },
|
||||||
|
{ label: "每次询问-退菜后弹窗提示,可手动选择", value: 3 },
|
||||||
|
],
|
||||||
|
initialValue: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "排序",
|
||||||
|
prop: "sort",
|
||||||
|
type: "input-number",
|
||||||
|
attrs: {
|
||||||
|
placeholder: "请输入排序",
|
||||||
|
},
|
||||||
|
initialValue: 1,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: "开关",
|
label: "开关",
|
||||||
prop: "status",
|
prop: "status",
|
||||||
@@ -44,15 +64,6 @@ const modalConfig: IModalConfig<UserForm> = {
|
|||||||
inactiveValue: 0,
|
inactiveValue: 0,
|
||||||
},
|
},
|
||||||
initialValue: 1,
|
initialValue: 1,
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "排序",
|
|
||||||
prop: "sort",
|
|
||||||
type: "input-number",
|
|
||||||
attrs: {
|
|
||||||
placeholder: "请输入排序",
|
|
||||||
},
|
|
||||||
initialValue: 1,
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -77,6 +77,13 @@ const contentConfig: IContentConfig<UserPageQuery> = {
|
|||||||
templet: "switch",
|
templet: "switch",
|
||||||
slotName: "status",
|
slotName: "status",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: "退菜是否退库存",
|
||||||
|
align: "center",
|
||||||
|
prop: "refundMode",
|
||||||
|
templet: "custom",
|
||||||
|
slotName: "refundMode",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: "操作",
|
label: "操作",
|
||||||
align: "center",
|
align: "center",
|
||||||
|
|||||||
@@ -35,6 +35,26 @@ const modalConfig: IModalConfig<UserForm> = {
|
|||||||
prop: "pic",
|
prop: "pic",
|
||||||
type: "UpImage",
|
type: "UpImage",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: '退菜是否退库存',
|
||||||
|
prop: 'refundMode',
|
||||||
|
type: 'radio',
|
||||||
|
options: [
|
||||||
|
{ label: "退菜退库存", value: 1 },
|
||||||
|
{ label: "仅退菜不退库存", value: 2 },
|
||||||
|
{ label: "每次询问-退菜后弹窗提示,可手动选择", value: 3 },
|
||||||
|
],
|
||||||
|
initialValue: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "排序",
|
||||||
|
prop: "sort",
|
||||||
|
type: "input-number",
|
||||||
|
attrs: {
|
||||||
|
placeholder: "请输入排序",
|
||||||
|
},
|
||||||
|
initialValue: 1,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: "开关",
|
label: "开关",
|
||||||
prop: "status",
|
prop: "status",
|
||||||
@@ -48,15 +68,6 @@ const modalConfig: IModalConfig<UserForm> = {
|
|||||||
inactiveValue: 0,
|
inactiveValue: 0,
|
||||||
},
|
},
|
||||||
initialValue: 1,
|
initialValue: 1,
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "排序",
|
|
||||||
prop: "sort",
|
|
||||||
type: "input-number",
|
|
||||||
attrs: {
|
|
||||||
placeholder: "请输入排序",
|
|
||||||
},
|
|
||||||
initialValue: 1,
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,26 +2,14 @@
|
|||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<!-- 搜索 -->
|
<!-- 搜索 -->
|
||||||
<page-search
|
<page-search ref="searchRef" :search-config="searchConfig" @query-click="newHandleQueryClick"
|
||||||
ref="searchRef"
|
@reset-click="handleResetClick2" />
|
||||||
:search-config="searchConfig"
|
|
||||||
@query-click="newHandleQueryClick"
|
|
||||||
@reset-click="handleResetClick2"
|
|
||||||
/>
|
|
||||||
<!-- 顶部数据 -->
|
<!-- 顶部数据 -->
|
||||||
<Statistics :data="gongjiData"></Statistics>
|
<!-- <Statistics :data="gongjiData"></Statistics> -->
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<page-content
|
<page-content ref="contentRef" :content-config="contentConfig" @add-click="handleAddClick"
|
||||||
ref="contentRef"
|
@edit-click="handleEditClick" @export-click="handleExportClick" @search-click="handleSearchClick"
|
||||||
:content-config="contentConfig"
|
@toolbar-click="handleToolbarClick" @operat-click="handleOperatClick" @filter-change="handleFilterChange">
|
||||||
@add-click="handleAddClick"
|
|
||||||
@edit-click="handleEditClick"
|
|
||||||
@export-click="handleExportClick"
|
|
||||||
@search-click="handleSearchClick"
|
|
||||||
@toolbar-click="handleToolbarClick"
|
|
||||||
@operat-click="handleOperatClick"
|
|
||||||
@filter-change="handleFilterChange"
|
|
||||||
>
|
|
||||||
<!-- <template #status="scope">
|
<!-- <template #status="scope">
|
||||||
<el-tag :type="scope.row[scope.prop] == 1 ? 'success' : 'info'">
|
<el-tag :type="scope.row[scope.prop] == 1 ? 'success' : 'info'">
|
||||||
{{ scope.row[scope.prop] == 1 ? "启用" : "禁用" }}
|
{{ scope.row[scope.prop] == 1 ? "启用" : "禁用" }}
|
||||||
@@ -37,22 +25,12 @@
|
|||||||
<DictLabel v-model="scope.row[scope.prop]" code="gender" />
|
<DictLabel v-model="scope.row[scope.prop]" code="gender" />
|
||||||
</template>
|
</template>
|
||||||
<template #shangjia="scope">
|
<template #shangjia="scope">
|
||||||
<el-switch
|
<el-switch v-model="scope.row[scope.prop]" :active-value="1" :inactive-value="0"
|
||||||
v-model="scope.row[scope.prop]"
|
@click="handleSwitchChange(scope.row)"></el-switch>
|
||||||
:active-value="1"
|
|
||||||
:inactive-value="0"
|
|
||||||
@click="handleSwitchChange(scope.row)"
|
|
||||||
></el-switch>
|
|
||||||
</template>
|
</template>
|
||||||
<template #isStock="scope">
|
<template #isStock="scope">
|
||||||
<el-switch
|
<el-switch v-if="!scope.row.productId" v-model="scope.row[scope.prop]" :active-value="1" :inactive-value="0"
|
||||||
v-if="!scope.row.productId"
|
:disabled="!scope.row.type" @click="isStockChange(scope.row)"></el-switch>
|
||||||
v-model="scope.row[scope.prop]"
|
|
||||||
:active-value="1"
|
|
||||||
:inactive-value="0"
|
|
||||||
:disabled="!scope.row.type"
|
|
||||||
@click="isStockChange(scope.row)"
|
|
||||||
></el-switch>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #kucunedit="scope">
|
<template #kucunedit="scope">
|
||||||
@@ -65,29 +43,21 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #tuikuantuihui="scope">
|
<template #tuikuantuihui="scope">
|
||||||
<el-switch
|
<!-- <el-switch v-if="!scope.row.productId" v-model="scope.row[scope.prop]" :active-value="1" :inactive-value="0"
|
||||||
v-if="!scope.row.productId"
|
@click="handleSwitchhaocai(scope.row)"></el-switch> -->
|
||||||
v-model="scope.row[scope.prop]"
|
<el-text>{{ returnLabel(scope.row[scope.prop]) }}</el-text>
|
||||||
:active-value="1"
|
|
||||||
:inactive-value="0"
|
|
||||||
@click="handleSwitchhaocai(scope.row)"
|
|
||||||
></el-switch>
|
|
||||||
</template>
|
</template>
|
||||||
<template #sellOut="scope">
|
<template #sellOut="scope">
|
||||||
<el-switch
|
<el-switch v-model="scope.row[scope.prop]" :active-value="1" :inactive-value="0"
|
||||||
v-model="scope.row[scope.prop]"
|
@click="handleSwitchChangeTwo(scope.row)"></el-switch>
|
||||||
:active-value="1"
|
</template>
|
||||||
:inactive-value="0"
|
<template #autoSellOut="scope">
|
||||||
@click="handleSwitchChangeTwo(scope.row)"
|
<el-switch v-model="scope.row[scope.prop]" :active-value="1" :inactive-value="0"
|
||||||
></el-switch>
|
@click="handleSwitchChangeTwo2($event, scope.row)"></el-switch>
|
||||||
</template>
|
</template>
|
||||||
<template #mobile="scope">
|
<template #mobile="scope">
|
||||||
<el-text>{{ scope.row[scope.prop] }}</el-text>
|
<el-text>{{ scope.row[scope.prop] }}</el-text>
|
||||||
<copy-button
|
<copy-button v-if="scope.row[scope.prop]" :text="scope.row[scope.prop]" style="margin-left: 2px" />
|
||||||
v-if="scope.row[scope.prop]"
|
|
||||||
:text="scope.row[scope.prop]"
|
|
||||||
style="margin-left: 2px"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
<template #consumables="scope">
|
<template #consumables="scope">
|
||||||
<template v-if="scope.row.type != null">
|
<template v-if="scope.row.type != null">
|
||||||
@@ -110,11 +80,7 @@
|
|||||||
</page-modal>
|
</page-modal>
|
||||||
|
|
||||||
<!-- 编辑 -->
|
<!-- 编辑 -->
|
||||||
<page-modal
|
<page-modal ref="editModalRef" :modal-config="editModalConfig" @submit-click="handleSubmitClick">
|
||||||
ref="editModalRef"
|
|
||||||
:modal-config="editModalConfig"
|
|
||||||
@submit-click="handleSubmitClick"
|
|
||||||
>
|
|
||||||
<template #gender="scope">
|
<template #gender="scope">
|
||||||
<Dict v-model="scope.formData[scope.prop]" code="gender" v-bind="scope.attrs" />
|
<Dict v-model="scope.formData[scope.prop]" code="gender" v-bind="scope.attrs" />
|
||||||
</template>
|
</template>
|
||||||
@@ -135,7 +101,7 @@
|
|||||||
<el-input-number v-model="datas.number" :min="1" label="描述文字"></el-input-number>
|
<el-input-number v-model="datas.number" :min="1" label="描述文字"></el-input-number>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="报损照片" label-width="">
|
<el-form-item label="报损照片" label-width="">
|
||||||
<MultiImageUpload v-model="datas.images" />
|
<MultiImageUpload v-model="datas.imgUrls" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="备注" label-width="">
|
<el-form-item label="备注" label-width="">
|
||||||
<el-input v-model="datas.remark" type="textarea" />
|
<el-input v-model="datas.remark" type="textarea" />
|
||||||
@@ -161,31 +127,17 @@
|
|||||||
<el-table-column label="序号" type="index" width="60"></el-table-column>
|
<el-table-column label="序号" type="index" width="60"></el-table-column>
|
||||||
<el-table-column label="耗材名称" prop="consInfoId">
|
<el-table-column label="耗材名称" prop="consInfoId">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<el-select
|
<el-select filterable v-model="scope.row.consInfoId" reserve-keyword placeholder="请输入关键词"
|
||||||
filterable
|
@change="selectionChange($event, scope.row)">
|
||||||
v-model="scope.row.consInfoId"
|
<el-option v-for="item in options" :key="item.id * 1" :label="item.conName"
|
||||||
reserve-keyword
|
:value="item.id * 1"></el-option>
|
||||||
placeholder="请输入关键词"
|
|
||||||
@change="selectionChange($event, scope.row)"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item in options"
|
|
||||||
:key="item.id * 1"
|
|
||||||
:label="item.conName"
|
|
||||||
:value="item.id * 1"
|
|
||||||
></el-option>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
<!-- <div class="tips" v-if="scope.row.stockNumber">库存:{{ scope.row.stockNumber }}</div> -->
|
<!-- <div class="tips" v-if="scope.row.stockNumber">库存:{{ scope.row.stockNumber }}</div> -->
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="单位" prop="conUnit">
|
<el-table-column label="单位" prop="conUnit">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<el-input
|
<el-input v-model="scope.row.conUnit" readonly disabled placeholder="请选择耗材"></el-input>
|
||||||
v-model="scope.row.conUnit"
|
|
||||||
readonly
|
|
||||||
disabled
|
|
||||||
placeholder="请选择耗材"
|
|
||||||
></el-input>
|
|
||||||
<!-- <el-select v-model="scope.row.conUnit" reserve-keyword placeholder="请输入关键词">
|
<!-- <el-select v-model="scope.row.conUnit" reserve-keyword placeholder="请输入关键词">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in returnConUnits(scope.row.consInfoId)"
|
v-for="item in returnConUnits(scope.row.consInfoId)"
|
||||||
@@ -204,20 +156,13 @@
|
|||||||
<el-table-column label="操作" width="100">
|
<el-table-column label="操作" width="100">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<div class="table_btn_wrap">
|
<div class="table_btn_wrap">
|
||||||
<div
|
<div class="btn sub" v-if="haocaiData.consList.length > 1"
|
||||||
class="btn sub"
|
@click="haocaiData.consList.splice(scope.$index, 1)">
|
||||||
v-if="haocaiData.consList.length > 1"
|
|
||||||
@click="haocaiData.consList.splice(scope.$index, 1)"
|
|
||||||
>
|
|
||||||
<el-icon>
|
<el-icon>
|
||||||
<RemoveFilled />
|
<RemoveFilled />
|
||||||
</el-icon>
|
</el-icon>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div class="btn add" v-if="scope.$index == haocaiData.consList.length - 1" @click="createItem(scope.row)">
|
||||||
class="btn add"
|
|
||||||
v-if="scope.$index == haocaiData.consList.length - 1"
|
|
||||||
@click="createItem(scope.row)"
|
|
||||||
>
|
|
||||||
<el-icon>
|
<el-icon>
|
||||||
<CirclePlusFilled />
|
<CirclePlusFilled />
|
||||||
</el-icon>
|
</el-icon>
|
||||||
@@ -231,6 +176,19 @@
|
|||||||
<MyDialog ref="myDialogRefkucun" @confirm="confirmkucun" width="30%" title="库存修改">
|
<MyDialog ref="myDialogRefkucun" @confirm="confirmkucun" width="30%" title="库存修改">
|
||||||
<el-input-number v-model="kucundata.stockNumbers" :min="0" />
|
<el-input-number v-model="kucundata.stockNumbers" :min="0" />
|
||||||
</MyDialog>
|
</MyDialog>
|
||||||
|
<!-- 报损记录 -->
|
||||||
|
<MyDialog ref="myDialogRefRecord" :title="dataAll.dataTitle" width="70%" @confirm="myDialogRefRecord.close()">
|
||||||
|
<!-- 表格 -->
|
||||||
|
<Table :list="dataAll.tableData"
|
||||||
|
v-if="dataAll.dataType == 'inSumTotal' || dataAll.dataType == 'winInNum' || dataAll.dataType == 'outSumTotal' || dataAll.dataType == 'lossOutNum'">
|
||||||
|
</Table>
|
||||||
|
<TableTwo :list="dataAll.tableData" v-else-if="dataAll.dataType == 'refundInNum'"></TableTwo>
|
||||||
|
<TableThree :list="dataAll.tableData" v-else-if="dataAll.dataType == 'salesNum'"></TableThree>
|
||||||
|
|
||||||
|
<TableFour :list="dataAll.tableData" v-else-if="dataAll.dataType == 'damageNum'"></TableFour>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Paging :pagingConfig="dataAll.pagingConfig" @sizeChange="sizeChange" @currentChange="currentChange"></Paging>
|
||||||
|
</MyDialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -249,6 +207,89 @@ import editModalConfig from "./indexconfig/edit";
|
|||||||
import searchConfig from "./indexconfig/search";
|
import searchConfig from "./indexconfig/search";
|
||||||
import MyDialog from "@/components/mycomponents/myDialog.vue";
|
import MyDialog from "@/components/mycomponents/myDialog.vue";
|
||||||
import Statistics from "./indexconfig/statistics.vue";
|
import Statistics from "./indexconfig/statistics.vue";
|
||||||
|
import TableFour from './indexconfig/TableFour.vue'
|
||||||
|
|
||||||
|
const myDialogRefRecord = ref(null)
|
||||||
|
|
||||||
|
const refoundModeOptions = ref([
|
||||||
|
{ label: "退菜退库存", value: 1 },
|
||||||
|
{ label: "仅退菜不退库存", value: 2 },
|
||||||
|
{ label: "每次询问-退菜后弹窗提示,可手动选择", value: 3 },
|
||||||
|
])
|
||||||
|
|
||||||
|
function returnLabel(value: number) {
|
||||||
|
const option = refoundModeOptions.value.find((option) => option.value == value);
|
||||||
|
return option ? option.label : "未知";
|
||||||
|
}
|
||||||
|
|
||||||
|
let dataAll = reactive({
|
||||||
|
dataList: [],
|
||||||
|
tableData: [],
|
||||||
|
pagingConfig: {
|
||||||
|
total: 0, // 总数
|
||||||
|
pageSize: 10, // 每页数据数量
|
||||||
|
pageNumber: 1, // 当前页码
|
||||||
|
},
|
||||||
|
dataType: "",
|
||||||
|
dataTitle: ""
|
||||||
|
});
|
||||||
|
|
||||||
|
function sizeChange(val) {
|
||||||
|
dataAll.pagingConfig.pageSize = val
|
||||||
|
clickEvent(dataAll.dataType)
|
||||||
|
}
|
||||||
|
function currentChange(val) {
|
||||||
|
dataAll.pagingConfig.pageNumber = val
|
||||||
|
clickEvent(dataAll.dataType)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function clickEvent(key) {
|
||||||
|
dataAll.dataType = key
|
||||||
|
let obj = {}
|
||||||
|
switch (key) {
|
||||||
|
case 'inSumTotal':
|
||||||
|
dataAll.dataTitle = '增加数据统计'
|
||||||
|
obj = { page: dataAll.pagingConfig.pageNumber, size: dataAll.pagingConfig.pageSize, productId: "", inOutType: "in", inOutItem: "" }
|
||||||
|
break;
|
||||||
|
case 'winInNum':
|
||||||
|
dataAll.dataTitle = '手动增加统计'
|
||||||
|
obj = { page: dataAll.pagingConfig.pageNumber, size: dataAll.pagingConfig.pageSize, productId: "", inOutType: "in", inOutItem: "win-in" }
|
||||||
|
break;
|
||||||
|
case 'refundInNum':
|
||||||
|
dataAll.dataTitle = '退货统计'
|
||||||
|
obj = { page: dataAll.pagingConfig.pageNumber, size: dataAll.pagingConfig.pageSize, productId: "", inOutType: "in", inOutItem: "order-in" }
|
||||||
|
break;
|
||||||
|
case 'outSumTotal':
|
||||||
|
dataAll.dataTitle = '减少数量统计'
|
||||||
|
obj = { page: dataAll.pagingConfig.pageNumber, size: dataAll.pagingConfig.pageSize, productId: "", inOutType: "out", inOutItem: "" }
|
||||||
|
break;
|
||||||
|
case 'lossOutNum':
|
||||||
|
dataAll.dataTitle = '手动减少统计'
|
||||||
|
obj = { page: dataAll.pagingConfig.pageNumber, size: dataAll.pagingConfig.pageSize, productId: "", inOutType: "out", inOutItem: "loss-out" }
|
||||||
|
break;
|
||||||
|
case 'salesNum':
|
||||||
|
dataAll.dataTitle = '销量统计'
|
||||||
|
obj = { page: dataAll.pagingConfig.pageNumber, size: dataAll.pagingConfig.pageSize, productId: "", inOutType: "out", inOutItem: "order-out" }
|
||||||
|
break;
|
||||||
|
case 'damageNum':
|
||||||
|
dataAll.dataTitle = '报损统计'
|
||||||
|
obj = { page: dataAll.pagingConfig.pageNumber, size: dataAll.pagingConfig.pageSize, productId: datas.productId, inOutType: "out", inOutItem: "damage-out" }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dataAll.tableData = []
|
||||||
|
|
||||||
|
let res = await UserAPI.stockFlow(obj);
|
||||||
|
dataAll.tableData = res.records
|
||||||
|
dataAll.tableData.forEach((item, index) => {
|
||||||
|
if (item.imgUrls.length > 7) {
|
||||||
|
item.imagesone = JSON.parse(item.imgUrls)[0]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
dataAll.pagingConfig.total = res.totalRow
|
||||||
|
dataAll.pagingConfig.pageSize = res.pageSize
|
||||||
|
dataAll.pagingConfig.pageNumber = res.pageNumber
|
||||||
|
myDialogRefRecord.value.open()
|
||||||
|
}
|
||||||
|
|
||||||
const importDataRef = ref(null);
|
const importDataRef = ref(null);
|
||||||
|
|
||||||
@@ -295,7 +336,7 @@ const form = reactive({
|
|||||||
let datas = reactive({
|
let datas = reactive({
|
||||||
number: 0,
|
number: 0,
|
||||||
remark: "",
|
remark: "",
|
||||||
images: [],
|
imgUrls: [],
|
||||||
productId: null, // Added productId property
|
productId: null, // Added productId property
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -434,6 +475,16 @@ function handleSwitchChangeTwo(data: any) {
|
|||||||
UserAPI.markIsSoldOut(obj);
|
UserAPI.markIsSoldOut(obj);
|
||||||
ElMessage.success("修改成功!");
|
ElMessage.success("修改成功!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 自动售罄
|
||||||
|
function handleSwitchChangeTwo2(e: any, data: any) {
|
||||||
|
UserAPI.markIsAutoSoldOut({
|
||||||
|
id: data.id,
|
||||||
|
isAutoSoldStock: data.isAutoSoldStock
|
||||||
|
});
|
||||||
|
ElMessage.success("修改成功!");
|
||||||
|
}
|
||||||
|
|
||||||
function handleSwitchChangethree(data: any) {
|
function handleSwitchChangethree(data: any) {
|
||||||
let obj = {
|
let obj = {
|
||||||
type: data.type == "sku" ? "sku" : "product",
|
type: data.type == "sku" ? "sku" : "product",
|
||||||
@@ -531,10 +582,21 @@ function typeFilter(item: any) {
|
|||||||
}
|
}
|
||||||
// 其他操作列
|
// 其他操作列
|
||||||
async function handleOperatClick(data: IOperatData) {
|
async function handleOperatClick(data: IOperatData) {
|
||||||
|
console.log(data);
|
||||||
datas.productId = data.row.id;
|
datas.productId = data.row.id;
|
||||||
myDialogRefbaosun.value.open();
|
switch (data.name) {
|
||||||
datas.number = 1;
|
case 'cons':
|
||||||
datas.remark = "";
|
myDialogRefbaosun.value.open();
|
||||||
|
datas.number = 1;
|
||||||
|
datas.remark = "";
|
||||||
|
break;
|
||||||
|
case 'consRecord':
|
||||||
|
clickEvent('damageNum')
|
||||||
|
// myDialogRefRecord.value.open()
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function gethaocaiList() {
|
async function gethaocaiList() {
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
<div style="margin-top: 10px;">
|
<div style="margin-top: 10px;">
|
||||||
<el-table :data="props.list" border style="">
|
<el-table :data="props.list" border style="">
|
||||||
<el-table-column prop="productName" align="center" label="商品名称/规格名称" />
|
<el-table-column prop="productName" align="center" label="商品名称/规格名称" />
|
||||||
<el-table-column prop="beforeNumber" align="center" label="原库存" />
|
<!-- <el-table-column prop="beforeNumber" align="center" label="原库存" />
|
||||||
<el-table-column prop="afterNumber" align="center" label="变动后库存" />
|
<el-table-column prop="afterNumber" align="center" label="变动后库存" /> -->
|
||||||
<el-table-column prop="inOutNumber" align="center" label="报损数量" />
|
<el-table-column prop="inOutNumber" align="center" label="报损数量" />
|
||||||
<el-table-column prop="createUserName" align="center" label="报损人" />
|
<el-table-column prop="createUserName" align="center" label="报损人" />
|
||||||
<el-table-column prop="remark" align="center" label="备注" />
|
<el-table-column prop="remark" align="center" label="备注" />
|
||||||
|
|||||||
@@ -1,185 +1,194 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="addgoods">
|
<div class="addgoods">
|
||||||
|
<div class="header-wrap">
|
||||||
|
<el-radio-group v-model="addFormType" size="large">
|
||||||
|
<el-radio-button label="基础信息" :value="1"></el-radio-button>
|
||||||
|
<el-radio-button label="耗材设置" :value="2"></el-radio-button>
|
||||||
|
<el-radio-button label="关联推荐商品" :value="3"></el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
</div>
|
||||||
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="150px" class="demo-ruleForm" status-icon>
|
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="150px" class="demo-ruleForm" status-icon>
|
||||||
<el-form-item label="商品名称" required>
|
<div v-show="addFormType == 1">
|
||||||
<el-col :span="12">
|
<el-form-item label="商品名称" required>
|
||||||
<el-form-item prop="name">
|
<el-col :span="12">
|
||||||
<el-input v-model="ruleForm.name" placeholder="请输入商品名称" :disabled="isSyncStatus()" />
|
<el-form-item prop="name">
|
||||||
</el-form-item>
|
<el-input v-model="ruleForm.name" placeholder="请输入商品名称" :disabled="isSyncStatus()" />
|
||||||
</el-col>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
<el-form-item label="商品介绍">
|
</el-form-item>
|
||||||
<el-col :span="12">
|
<el-form-item label="商品介绍">
|
||||||
<el-form-item>
|
<el-col :span="12">
|
||||||
<el-input v-model="ruleForm.shortTitle" type="textarea" placeholder="请输入商品介绍" :disabled="isSyncStatus()" />
|
<el-form-item>
|
||||||
</el-form-item>
|
<el-input v-model="ruleForm.shortTitle" type="textarea" placeholder="请输入商品介绍"
|
||||||
</el-col>
|
:disabled="isSyncStatus()" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="单位" required>
|
</el-col>
|
||||||
<el-col :span="12">
|
</el-form-item>
|
||||||
<el-form-item prop="unitId">
|
<el-form-item label="单位" required>
|
||||||
<el-select v-model="ruleForm.unitId" placeholder="请选择单位" :disabled="isSyncStatus()">
|
<el-col :span="12">
|
||||||
<el-option :label="item.name" :value="item.id" v-for="item in datas.Company" :key="item.id" />
|
<el-form-item prop="unitId">
|
||||||
</el-select>
|
<el-select v-model="ruleForm.unitId" placeholder="请选择单位" :disabled="isSyncStatus()">
|
||||||
</el-form-item>
|
<el-option :label="item.name" :value="item.id" v-for="item in datas.Company" :key="item.id" />
|
||||||
</el-col>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="商品分类" required>
|
</el-col>
|
||||||
<el-col :span="12">
|
</el-form-item>
|
||||||
<el-form-item prop="region">
|
<el-form-item label="商品分类" required>
|
||||||
<el-select v-model="ruleForm.categoryId" placeholder="请选择商品分类" :disabled="isSyncStatus()">
|
<el-col :span="12">
|
||||||
<el-option :label="item.name" :value="item.id" v-for="item in datas.classification" :key="item.id" />
|
<el-form-item prop="region">
|
||||||
</el-select>
|
<el-select v-model="ruleForm.categoryId" placeholder="请选择商品分类" :disabled="isSyncStatus()">
|
||||||
</el-form-item>
|
<el-option :label="item.name" :value="item.id" v-for="item in datas.classification" :key="item.id" />
|
||||||
</el-col>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item label="商品图片" required prop="images">
|
</el-col>
|
||||||
|
</el-form-item>
|
||||||
|
<!-- <el-form-item label="商品图片" required prop="images">
|
||||||
<MultiImageUpload v-model="ruleForm.images" />
|
<MultiImageUpload v-model="ruleForm.images" />
|
||||||
</el-form-item> -->
|
</el-form-item> -->
|
||||||
<el-form-item label="商品图片" required prop="images">
|
<el-form-item label="商品图片" required prop="images">
|
||||||
<div style="display: flex; flex-wrap: wrap">
|
<div style="display: flex; flex-wrap: wrap">
|
||||||
<div v-for="(item, index) in ruleForm.images" :key="index" style="position: relative" class="showStyle">
|
<div v-for="(item, index) in ruleForm.images" :key="index" style="position: relative" class="showStyle">
|
||||||
<el-icon class="buttonstyle" @click="deleteEvent(item)">
|
<el-icon class="buttonstyle" @click="deleteEvent(item)">
|
||||||
<DeleteFilled />
|
<DeleteFilled />
|
||||||
</el-icon>
|
</el-icon>
|
||||||
<img style="width: 148px; height: 148px; margin-right: 6px" class="imgStyle" :src="item" alt="" />
|
<img style="width: 148px; height: 148px; margin-right: 6px" class="imgStyle" :src="item" alt="" />
|
||||||
</div>
|
|
||||||
<div class="upImgStyle" @click="addimgEvent">+</div>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item>
|
|
||||||
<div class="tips">注:第一张图为商品封面图,图片尺寸为750×750</div>
|
|
||||||
</el-form-item>
|
|
||||||
<!-- 选择图片 -->
|
|
||||||
<AddImg ref="addImg" @successEvent="successEvent"></AddImg>
|
|
||||||
|
|
||||||
<el-form-item label="商品类型">
|
|
||||||
<el-radio-group v-model="ruleForm.type" @change="changeTypeEnum(ruleForm.type)" :disabled="isSyncStatus()">
|
|
||||||
<el-radio value="single">单规格商品</el-radio>
|
|
||||||
<el-radio value="sku">多规格商品</el-radio>
|
|
||||||
<el-radio value="package">套餐商品</el-radio>
|
|
||||||
<el-radio value="weight">称重商品</el-radio>
|
|
||||||
<!-- <el-radio label="coupon">团购券</el-radio> -->
|
|
||||||
</el-radio-group>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="套餐商品" v-if="ruleForm.type == 'package'">
|
|
||||||
<div style="display: block; width: 100%">
|
|
||||||
<div class="head-container">
|
|
||||||
<el-radio-group v-model="ruleForm.groupType" @change="typeChange">
|
|
||||||
<el-radio-button :label="0">固定套餐</el-radio-button>
|
|
||||||
<el-radio-button :label="1">可选套餐</el-radio-button>
|
|
||||||
</el-radio-group>
|
|
||||||
</div>
|
|
||||||
<div v-if="ruleForm.groupType == 0">
|
|
||||||
<el-table border :data="item.goods" v-for="(item, index) in ruleForm.proGroupVo" :key="index">
|
|
||||||
<el-table-column label="名称" prop="proName"></el-table-column>
|
|
||||||
<el-table-column label="规格" prop="skuName"></el-table-column>
|
|
||||||
<el-table-column label="价格" prop="price"></el-table-column>
|
|
||||||
<el-table-column label="数量" prop="number">
|
|
||||||
<template v-slot="scope">
|
|
||||||
<el-input-number v-model="scope.row.number" :min="0" />
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column width="150">
|
|
||||||
<template #header>
|
|
||||||
<el-button type="primary" @click="addgoods(-1)" :disabled="isSyncStatus()">
|
|
||||||
添加商品
|
|
||||||
</el-button>
|
|
||||||
</template>
|
|
||||||
<template v-slot="scope">
|
|
||||||
<el-button type="text" :disabled="scope.row.type != 'sku' && isSyncStatus()"
|
|
||||||
@click="showSelectSkuHandle(scope.row, scope.$index, index)">设置规格</el-button>
|
|
||||||
<el-button type="text"
|
|
||||||
@click="ruleForm.proGroupVo[index].goods.splice(scope.$index, 1)">删除</el-button>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</div>
|
|
||||||
<div v-if="ruleForm.groupType == 1">
|
|
||||||
<div class="group_wrap" v-for="(item, index) in ruleForm.proGroupVo" :key="index">
|
|
||||||
<el-form inline :model="item">
|
|
||||||
<el-form-item label="规格组名">
|
|
||||||
<el-input v-model="item.title" :disabled="isSyncStatus()" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item :label="`本组菜品${item.goods.length}选`">
|
|
||||||
<el-input v-model="item.number" :disabled="isSyncStatus()" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item>
|
|
||||||
<el-button @click="ruleForm.proGroupVo.splice(index, 1)" :disabled="isSyncStatus()">
|
|
||||||
删除
|
|
||||||
</el-button>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
<div style="margin-top: 20px">
|
|
||||||
<el-table border :data="item.goods">
|
|
||||||
<el-table-column label="名称" prop="proName"></el-table-column>
|
|
||||||
<el-table-column label="规格" prop="skuName"></el-table-column>
|
|
||||||
<el-table-column label="价格" prop="price"></el-table-column>
|
|
||||||
<el-table-column label="数量" prop="number">
|
|
||||||
<template v-slot="scope">
|
|
||||||
<el-input-number v-model="scope.row.number" :min="0" :disabled="isSyncStatus()" />
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column width="150">
|
|
||||||
<template #header>
|
|
||||||
<el-button type="primary" @click="addgoods(index)" :disabled="isSyncStatus()">
|
|
||||||
添加商品
|
|
||||||
</el-button>
|
|
||||||
</template>
|
|
||||||
<template v-slot="scope">
|
|
||||||
<el-button type="text" :disabled="scope.row.type != 'sku' && isSyncStatus()"
|
|
||||||
@click="showSelectSkuHandle(scope.row, scope.$index, index)">设置规格</el-button>
|
|
||||||
<el-button type="text" @click="ruleForm.proGroupVo[index].goods.splice(scope.$index, 1)"
|
|
||||||
:disabled="isSyncStatus()">删除</el-button>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<el-button type="primary" @click="addtaocan" :disabled="isSyncStatus()">
|
<div class="upImgStyle" @click="addimgEvent">+</div>
|
||||||
添加套餐组
|
|
||||||
</el-button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</el-form-item>
|
||||||
</el-form-item>
|
<el-form-item>
|
||||||
<el-form-item label="选择规格" v-if="ruleForm.type == 'sku'">
|
<div class="tips">注:第一张图为商品封面图,图片尺寸为750×750</div>
|
||||||
<el-select v-model="ruleForm.specId" placeholder="请选择规格" style="width: 500px" @change="selectSpecHandle"
|
</el-form-item>
|
||||||
:disabled="isSyncStatus()">
|
<!-- 选择图片 -->
|
||||||
<el-option :label="item.name" :value="item.id" v-for="item in datas.specificationsconfig"
|
<AddImg ref="addImg" @successEvent="successEvent"></AddImg>
|
||||||
:key="item.id"></el-option>
|
|
||||||
</el-select>
|
<el-form-item label="商品类型">
|
||||||
</el-form-item>
|
<el-radio-group v-model="ruleForm.type" @change="changeTypeEnum(ruleForm.type)" :disabled="isSyncStatus()">
|
||||||
<el-form-item :label="ele.name" v-if="datas.selectSpeclist.length" v-for="ele in datas.selectSpeclist"
|
<el-radio value="single">单规格商品</el-radio>
|
||||||
:key="ele.name">
|
<el-radio value="sku">多规格商品</el-radio>
|
||||||
<el-checkbox-group v-model="ele.selectSpecResult" @change="selectSpecResultChange">
|
<el-radio value="package">套餐商品</el-radio>
|
||||||
<el-checkbox :value="element.name" :label="element.name" v-for="(element, index) in ele.children"
|
<el-radio value="weight">称重商品</el-radio>
|
||||||
:key="index"></el-checkbox>
|
<!-- <el-radio label="coupon">团购券</el-radio> -->
|
||||||
</el-checkbox-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 规格属性 -->
|
<el-form-item label="套餐商品" v-if="ruleForm.type == 'package'">
|
||||||
<!-- 单规格、称重 -->
|
<div style="display: block; width: 100%">
|
||||||
<SpecificationAttribute v-if="ruleForm.type != 'sku'" :info="ruleForm" :list="list"
|
<div class="head-container">
|
||||||
ref="specificationAttributeRef">
|
<el-radio-group v-model="ruleForm.groupType" @change="typeChange">
|
||||||
</SpecificationAttribute>
|
<el-radio-button :label="0">固定套餐</el-radio-button>
|
||||||
<SpecificationAttribute v-if="ruleForm.type == 'sku' && list.length" :specTableHeaders="datas.specTableHeaders"
|
<el-radio-button :label="1">可选套餐</el-radio-button>
|
||||||
:info="ruleForm" :list="list" ref="specificationAttributeRef"></SpecificationAttribute>
|
</el-radio-group>
|
||||||
<el-form-item label="重量">
|
</div>
|
||||||
<el-col :span="12">
|
<div v-if="ruleForm.groupType == 0">
|
||||||
<div style="display: block">
|
<el-table border :data="item.goods" v-for="(item, index) in ruleForm.proGroupVo" :key="index">
|
||||||
<el-input v-model="ruleForm.weight" placeholder="" :disabled="isSyncStatus()">
|
<el-table-column label="名称" prop="proName"></el-table-column>
|
||||||
<template #append>千克</template>
|
<el-table-column label="规格" prop="skuName"></el-table-column>
|
||||||
</el-input>
|
<el-table-column label="价格" prop="price"></el-table-column>
|
||||||
<!-- <div style="color: #999;">用于快递或配送运费计重</div> -->
|
<el-table-column label="数量" prop="number">
|
||||||
|
<template v-slot="scope">
|
||||||
|
<el-input-number v-model="scope.row.number" :min="0" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="150">
|
||||||
|
<template #header>
|
||||||
|
<el-button type="primary" @click="addgoods(-1)" :disabled="isSyncStatus()">
|
||||||
|
添加商品
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
<template v-slot="scope">
|
||||||
|
<el-button type="text" :disabled="scope.row.type != 'sku' && isSyncStatus()"
|
||||||
|
@click="showSelectSkuHandle(scope.row, scope.$index, index)">设置规格</el-button>
|
||||||
|
<el-button type="text"
|
||||||
|
@click="ruleForm.proGroupVo[index].goods.splice(scope.$index, 1)">删除</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
<div v-if="ruleForm.groupType == 1">
|
||||||
|
<div class="group_wrap" v-for="(item, index) in ruleForm.proGroupVo" :key="index">
|
||||||
|
<el-form inline :model="item">
|
||||||
|
<el-form-item label="规格组名">
|
||||||
|
<el-input v-model="item.title" :disabled="isSyncStatus()" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="`本组菜品${item.goods.length}选`">
|
||||||
|
<el-input v-model="item.number" :disabled="isSyncStatus()" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="ruleForm.proGroupVo.splice(index, 1)" :disabled="isSyncStatus()">
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div style="margin-top: 20px">
|
||||||
|
<el-table border :data="item.goods">
|
||||||
|
<el-table-column label="名称" prop="proName"></el-table-column>
|
||||||
|
<el-table-column label="规格" prop="skuName"></el-table-column>
|
||||||
|
<el-table-column label="价格" prop="price"></el-table-column>
|
||||||
|
<el-table-column label="数量" prop="number">
|
||||||
|
<template v-slot="scope">
|
||||||
|
<el-input-number v-model="scope.row.number" :min="0" :disabled="isSyncStatus()" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="150">
|
||||||
|
<template #header>
|
||||||
|
<el-button type="primary" @click="addgoods(index)" :disabled="isSyncStatus()">
|
||||||
|
添加商品
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
<template v-slot="scope">
|
||||||
|
<el-button type="text" :disabled="scope.row.type != 'sku' && isSyncStatus()"
|
||||||
|
@click="showSelectSkuHandle(scope.row, scope.$index, index)">设置规格</el-button>
|
||||||
|
<el-button type="text" @click="ruleForm.proGroupVo[index].goods.splice(scope.$index, 1)"
|
||||||
|
:disabled="isSyncStatus()">删除</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<el-button type="primary" @click="addtaocan" :disabled="isSyncStatus()">
|
||||||
|
添加套餐组
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-form-item>
|
||||||
</el-form-item>
|
<el-form-item label="选择规格" v-if="ruleForm.type == 'sku'">
|
||||||
<el-form-item label="是否允许临时改价">
|
<el-select v-model="ruleForm.specId" placeholder="请选择规格" style="width: 500px" @change="selectSpecHandle"
|
||||||
<el-radio-group v-model="ruleForm.isAllowTempModifyPrice" :disabled="isSyncStatus()">
|
:disabled="isSyncStatus()">
|
||||||
<el-radio :value="1">允许</el-radio>
|
<el-option :label="item.name" :value="item.id" v-for="item in datas.specificationsconfig"
|
||||||
<el-radio :value="0">不允许</el-radio>
|
:key="item.id"></el-option>
|
||||||
</el-radio-group>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item label="每日销量上限">
|
<el-form-item :label="ele.name" v-if="datas.selectSpeclist.length" v-for="ele in datas.selectSpeclist"
|
||||||
|
:key="ele.name">
|
||||||
|
<el-checkbox-group v-model="ele.selectSpecResult" @change="selectSpecResultChange">
|
||||||
|
<el-checkbox :value="element.name" :label="element.name" v-for="(element, index) in ele.children"
|
||||||
|
:key="index"></el-checkbox>
|
||||||
|
</el-checkbox-group>
|
||||||
|
</el-form-item>
|
||||||
|
<!-- 规格属性 -->
|
||||||
|
<!-- 单规格、称重 -->
|
||||||
|
<SpecificationAttribute v-if="ruleForm.type != 'sku'" :info="ruleForm" :list="list"
|
||||||
|
ref="specificationAttributeRef">
|
||||||
|
</SpecificationAttribute>
|
||||||
|
<SpecificationAttribute v-if="ruleForm.type == 'sku' && list.length" :specTableHeaders="datas.specTableHeaders"
|
||||||
|
:info="ruleForm" :list="list" ref="specificationAttributeRef"></SpecificationAttribute>
|
||||||
|
<el-form-item label="重量">
|
||||||
|
<el-col :span="12">
|
||||||
|
<div style="display: block">
|
||||||
|
<el-input v-model="ruleForm.weight" placeholder="" :disabled="isSyncStatus()">
|
||||||
|
<template #append>千克</template>
|
||||||
|
</el-input>
|
||||||
|
<!-- <div style="color: #999;">用于快递或配送运费计重</div> -->
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="是否允许临时改价">
|
||||||
|
<el-radio-group v-model="ruleForm.isAllowTempModifyPrice" :disabled="isSyncStatus()">
|
||||||
|
<el-radio :value="1">允许</el-radio>
|
||||||
|
<el-radio :value="0">不允许</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<!-- <el-form-item label="每日销量上限">
|
||||||
<el-input-number v-model="ruleForm.dayLimit" :min="0" />
|
<el-input-number v-model="ruleForm.dayLimit" :min="0" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="每单限购">
|
<el-form-item label="每单限购">
|
||||||
@@ -188,48 +197,127 @@
|
|||||||
<el-form-item label="每人限购">
|
<el-form-item label="每人限购">
|
||||||
<el-input-number v-model="ruleForm.dayLimit" :min="0" />
|
<el-input-number v-model="ruleForm.dayLimit" :min="0" />
|
||||||
</el-form-item> -->
|
</el-form-item> -->
|
||||||
<el-form-item label="定时上下架">
|
<el-form-item label="定时上下架">
|
||||||
<el-checkbox-group v-model="ruleForm.days">
|
<el-checkbox-group v-model="ruleForm.days">
|
||||||
<el-checkbox v-for="(item, index) in datas.cycle" :key="item.value" :value="item.value">
|
<el-checkbox v-for="(item, index) in datas.cycle" :key="item.value" :value="item.value">
|
||||||
{{ item.label }}
|
{{ item.label }}
|
||||||
</el-checkbox>
|
</el-checkbox>
|
||||||
</el-checkbox-group>
|
</el-checkbox-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-col :span="20">
|
<el-col :span="20">
|
||||||
<!-- <el-time-picker v-model="ruleForm.useTime" is-range range-separator="至" start-placeholder="开始时间"
|
<!-- <el-time-picker v-model="ruleForm.useTime" is-range range-separator="至" start-placeholder="开始时间"
|
||||||
end-placeholder="结束时间" value-format="HH:mm:ss" format="HH:mm:ss" />
|
end-placeholder="结束时间" value-format="HH:mm:ss" format="HH:mm:ss" />
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<el-time-picker v-model="ruleForm.startTime" value-format="HH:mm:ss" format="HH:mm:ss" placeholder="选择开始时间">
|
<el-time-picker v-model="ruleForm.startTime" value-format="HH:mm:ss" format="HH:mm:ss" placeholder="选择开始时间">
|
||||||
</el-time-picker>-
|
</el-time-picker>-
|
||||||
<el-time-picker v-model="ruleForm.endTime" value-format="HH:mm:ss" format="HH:mm:ss" placeholder="选择结束时间">
|
<el-time-picker v-model="ruleForm.endTime" value-format="HH:mm:ss" format="HH:mm:ss" placeholder="选择结束时间">
|
||||||
</el-time-picker>
|
</el-time-picker>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="上架">
|
<el-form-item label="上架">
|
||||||
<el-switch v-model="ruleForm.isSale" :active-value="1" :inactive-value="0" />
|
<el-switch v-model="ruleForm.isSale" :active-value="1" :inactive-value="0" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="库存开关">
|
<!-- <el-form-item label="库存开关">
|
||||||
<div style="display: block;">
|
<div style="display: block;">
|
||||||
<el-switch v-model="ruleForm.isStock" :active-value="1" :inactive-value="0" :disabled="isSyncStatus()" />
|
<el-switch v-model="ruleForm.isStock" :active-value="1" :inactive-value="0" :disabled="isSyncStatus()" />
|
||||||
<div style="color: #999;">注:关闭则不计算出库数据</div>
|
<div style="color: #999;">注:关闭则不计算出库数据</div>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item> -->
|
||||||
<el-form-item label="设为推荐" prop="delivery">
|
<el-form-item label="设为推荐" prop="delivery">
|
||||||
<el-switch v-model="ruleForm.isHot" :active-value="1" :inactive-value="0" />
|
<el-switch v-model="ruleForm.isHot" :active-value="1" :inactive-value="0" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="库存数量">
|
<!-- <el-form-item label="库存数量">
|
||||||
<el-input-number v-model="ruleForm.stockNumber" :min="0" />
|
<el-input-number v-model="ruleForm.stockNumber" :min="0" />
|
||||||
</el-form-item>
|
</el-form-item> -->
|
||||||
<el-form-item label="打包费" prop="delivery">
|
<el-form-item label="打包费" prop="delivery">
|
||||||
<div style="display: block;">
|
<div style="display: block;">
|
||||||
<el-input-number v-model="ruleForm.packFee" controls-position="right"
|
<el-input-number v-model="ruleForm.packFee" controls-position="right"
|
||||||
:disabled="isSyncStatus()"></el-input-number>
|
:disabled="isSyncStatus()"></el-input-number>
|
||||||
<div style="color: #999;">单份商品打包费。注:店铺开启外卖模式下该数据才生效</div>
|
<div style="color: #999;">单份商品打包费。注:店铺开启外卖模式下该数据才生效</div>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="关联推荐商品">
|
</div>
|
||||||
|
<div v-show="addFormType == 2" style="padding-bottom: 20px;">
|
||||||
|
<!-- 耗材绑定 -->
|
||||||
|
<el-form-item label="绑定耗材"></el-form-item>
|
||||||
|
<el-form-item label="商品名">{{ ruleForm.name }}</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-table :data="ruleForm.consList" border>
|
||||||
|
<el-table-column label="序号" type="index" width="60"></el-table-column>
|
||||||
|
<el-table-column label="耗材名称" prop="consInfoId">
|
||||||
|
<template v-slot="scope">
|
||||||
|
<el-select filterable v-model="scope.row.consInfoId" reserve-keyword placeholder="请输入关键词"
|
||||||
|
@change="selectionChange($event, scope.row)">
|
||||||
|
<el-option v-for="item in consOptions" :key="item.id" :label="item.conName"
|
||||||
|
:value="item.id"></el-option>
|
||||||
|
</el-select>
|
||||||
|
<!-- <div class="tips" v-if="scope.row.stockNumber">库存:{{ scope.row.stockNumber }}</div> -->
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="单位" prop="conUnit">
|
||||||
|
<template v-slot="scope">
|
||||||
|
<el-input v-model="scope.row.conUnit" readonly disabled placeholder="请选择耗材"></el-input>
|
||||||
|
<!-- <el-select v-model="scope.row.conUnit" reserve-keyword placeholder="请输入关键词">
|
||||||
|
<el-option
|
||||||
|
v-for="item in returnConUnits(scope.row.consInfoId)"
|
||||||
|
:key="item"
|
||||||
|
:label="item"
|
||||||
|
:value="item"
|
||||||
|
></el-option>
|
||||||
|
</el-select> -->
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="使用数量" prop="surplusStock" min-width="150px">
|
||||||
|
<template v-slot="scope">
|
||||||
|
<el-input-number v-model="scope.row.surplusStock" :min="0" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="操作" width="100">
|
||||||
|
<template #header>
|
||||||
|
<el-button type="primary" size="small" @click="createItem">添加</el-button>
|
||||||
|
</template>
|
||||||
|
<template v-slot="scope">
|
||||||
|
<div class="table_btn_wrap">
|
||||||
|
<div class="btn sub" @click="ruleForm.consList.splice(scope.$index, 1)">
|
||||||
|
<el-icon>
|
||||||
|
<RemoveFilled />
|
||||||
|
</el-icon>
|
||||||
|
</div>
|
||||||
|
<!-- <div class="btn add" v-if="scope.$index == ruleForm.consList.length - 1"
|
||||||
|
@click="createItem(scope.row)">
|
||||||
|
<el-icon>
|
||||||
|
<CirclePlusFilled />
|
||||||
|
</el-icon>
|
||||||
|
</div> -->
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="自动售罄">
|
||||||
|
<div class="center">
|
||||||
|
<el-switch v-model="ruleForm.isAutoSoldStock" :active-value="1" :inactive-value="0"></el-switch>
|
||||||
|
<el-text type="info">当绑定的任何一种耗材库存不足时,商品自动售罄</el-text>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="退菜是否退库存">
|
||||||
|
<div class="column">
|
||||||
|
<div>
|
||||||
|
<el-radio-group v-model="ruleForm.refundMode">
|
||||||
|
<el-radio label="退菜退库存" :value="1"></el-radio>
|
||||||
|
<el-radio label="仅退菜不退库存" :value="2"></el-radio>
|
||||||
|
<el-radio label="每次询问-退菜后弹窗提示,可手动选择" :value="3"></el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<el-text type="danger">当前店铺退菜退库存规则:{{ shopInfoTypeFilter(shopInfo.refundMode) }}</el-text>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
<el-form-item label="关联推荐商品" v-show="addFormType == 3">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="center">
|
<div class="center">
|
||||||
@@ -313,10 +401,62 @@ import Sortable from "sortablejs";
|
|||||||
import { useTagsViewStore } from "@/store";
|
import { useTagsViewStore } from "@/store";
|
||||||
import selecProductDialog from "@/views/marketing_center/group_booking/components/selecProductDialog.vue";
|
import selecProductDialog from "@/views/marketing_center/group_booking/components/selecProductDialog.vue";
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
const selecProductDialogRef = ref(null)
|
const selecProductDialogRef = ref(null)
|
||||||
const goodsListMax = ref(9)
|
const goodsListMax = ref(9)
|
||||||
|
|
||||||
|
const addFormType = ref(1)
|
||||||
|
|
||||||
|
const consOptions = ref([])
|
||||||
|
|
||||||
|
// let haocaiData = ref({
|
||||||
|
// consList: [
|
||||||
|
// {
|
||||||
|
// productId: '',
|
||||||
|
// consInfoId: "",
|
||||||
|
// surplusStock: "0",
|
||||||
|
// }
|
||||||
|
// ]
|
||||||
|
// });
|
||||||
|
|
||||||
|
// 生成新商品绑定耗材关系项
|
||||||
|
function createItem(val) {
|
||||||
|
let item = {
|
||||||
|
productId: '',
|
||||||
|
consInfoId: "",
|
||||||
|
surplusStock: "",
|
||||||
|
};
|
||||||
|
ruleForm.consList.push(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 商品选择耗材
|
||||||
|
function selectionChange(e, row) {
|
||||||
|
let item = consOptions.value.find((item) => item.id == e);
|
||||||
|
row.name = item.conName;
|
||||||
|
row.conUnit = item.conUnit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取耗材列表
|
||||||
|
async function gethaocaiList() {
|
||||||
|
try {
|
||||||
|
let res = await UserAPI3.productconsList({ id: route.query.id });
|
||||||
|
console.log('获取耗材列表', res);
|
||||||
|
consOptions.value = res || [];
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const shopInfo = ref('')
|
||||||
|
|
||||||
|
function shopInfoTypeFilter(t) {
|
||||||
|
if (t == 1) return '跟随商品分类'
|
||||||
|
if (t == 2) return '跟随单商品'
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
shopInfo.value = JSON.parse(localStorage.getItem('userInfo'))
|
||||||
|
gethaocaiList()
|
||||||
// Sortable 需要在 el-table 渲染 tbody 后初始化,尝试多次以确保 DOM 可用
|
// Sortable 需要在 el-table 渲染 tbody 后初始化,尝试多次以确保 DOM 可用
|
||||||
const initSortable = async () => {
|
const initSortable = async () => {
|
||||||
await nextTick();
|
await nextTick();
|
||||||
@@ -520,7 +660,10 @@ const ruleForm = reactive<RuleForm>({
|
|||||||
// 排序值
|
// 排序值
|
||||||
sort: 1,
|
sort: 1,
|
||||||
selectSpecInfo: {},
|
selectSpecInfo: {},
|
||||||
relatedRecommendJson: [] // 关联推荐商品
|
relatedRecommendJson: [], // 关联推荐商品
|
||||||
|
consList: [], // 耗材列表
|
||||||
|
refundMode: 1, // 退菜是否退库存 1退菜退库存 2仅退菜不退库存 3每次询问-退菜后弹窗提示
|
||||||
|
isAutoSoldStock: 0, // 是否自动售罄
|
||||||
});
|
});
|
||||||
const rules = reactive<FormRules<RuleForm>>({
|
const rules = reactive<FormRules<RuleForm>>({
|
||||||
name: [{ required: true, message: "请输入商品名称", trigger: "blur" }],
|
name: [{ required: true, message: "请输入商品名称", trigger: "blur" }],
|
||||||
@@ -584,6 +727,14 @@ async function tbProductGetDetail(id: any) {
|
|||||||
} else {
|
} else {
|
||||||
list.value = ruleForm.skuList;
|
list.value = ruleForm.skuList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if (res.consList.length == 0) {
|
||||||
|
// ruleForm.consList.push({
|
||||||
|
// productId: '',
|
||||||
|
// consInfoId: "",
|
||||||
|
// surplusStock: "0",
|
||||||
|
// })
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
// 选择套餐商品sku
|
// 选择套餐商品sku
|
||||||
function selectSkuHandle(item: any, index: number) {
|
function selectSkuHandle(item: any, index: number) {
|
||||||
@@ -1088,4 +1239,8 @@ const resetForm = (formEl: FormInstance | undefined) => {
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.header-wrap {
|
||||||
|
padding-bottom: 20px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -73,13 +73,13 @@ const contentConfig: IContentConfig<UserPageQuery> = {
|
|||||||
name: "sync",
|
name: "sync",
|
||||||
auth: "import",
|
auth: "import",
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
icon: "edit",
|
// icon: "edit",
|
||||||
text: "库存预警",
|
// text: "库存预警",
|
||||||
type: "danger",
|
// type: "danger",
|
||||||
name: "custom1",
|
// name: "custom1",
|
||||||
auth: "import",
|
// auth: "import",
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
icon: "Download",
|
icon: "Download",
|
||||||
text: "导出",
|
text: "导出",
|
||||||
@@ -98,15 +98,15 @@ const contentConfig: IContentConfig<UserPageQuery> = {
|
|||||||
slotName: "type",
|
slotName: "type",
|
||||||
},
|
},
|
||||||
// { label: "库存", align: "center", prop: "stockNumber" },
|
// { label: "库存", align: "center", prop: "stockNumber" },
|
||||||
{ label: "库存", align: "center", slotName: "kucunedit", templet: "custom", prop: "stockNumber" },
|
// { label: "库存", align: "center", slotName: "kucunedit", templet: "custom", prop: "stockNumber" },
|
||||||
{ label: "耗材信息", align: "center", prop: "consName", slotName: "consumables", templet: "custom", },
|
{ label: "耗材信息", align: "center", prop: "consName", slotName: "consumables", templet: "custom", },
|
||||||
{
|
// {
|
||||||
label: "库存开关",
|
// label: "库存开关",
|
||||||
align: "center",
|
// align: "center",
|
||||||
prop: "isStock",
|
// prop: "isStock",
|
||||||
templet: "custom",
|
// templet: "custom",
|
||||||
slotName: "isStock",
|
// slotName: "isStock",
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
label: "上架",
|
label: "上架",
|
||||||
align: "center",
|
align: "center",
|
||||||
@@ -122,9 +122,16 @@ const contentConfig: IContentConfig<UserPageQuery> = {
|
|||||||
slotName: "sellOut",
|
slotName: "sellOut",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "退款退回库存",
|
label: "自动售罄",
|
||||||
align: "center",
|
align: "center",
|
||||||
prop: "isRefundStock",
|
prop: "isAutoSoldStock",
|
||||||
|
templet: "custom",
|
||||||
|
slotName: "autoSellOut",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "退菜是否退库存",
|
||||||
|
align: "center",
|
||||||
|
prop: "refundMode",
|
||||||
templet: "custom",
|
templet: "custom",
|
||||||
slotName: "tuikuantuihui",
|
slotName: "tuikuantuihui",
|
||||||
},
|
},
|
||||||
@@ -134,7 +141,11 @@ const contentConfig: IContentConfig<UserPageQuery> = {
|
|||||||
fixed: "right",
|
fixed: "right",
|
||||||
width: 280,
|
width: 280,
|
||||||
templet: "tool",
|
templet: "tool",
|
||||||
operat: [{ text: "报损", name: '' }, { text: "编辑", icon: 'edit', name: "edit" }, { text: "删除", icon: 'delete', type: 'danger', name: "delete" }],
|
operat: [
|
||||||
|
{ text: "报损", icon: '', name: 'cons' },
|
||||||
|
{ text: "报损记录", name: 'consRecord' },
|
||||||
|
{ text: "编辑", icon: 'edit', name: "edit" },
|
||||||
|
{ text: "删除", icon: 'delete', type: 'danger', name: "delete" }],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,25 +3,14 @@
|
|||||||
<div>
|
<div>
|
||||||
<el-form ref="form" :model="form" :rules="rules" label-width="160px" label-position="left">
|
<el-form ref="form" :model="form" :rules="rules" label-width="160px" label-position="left">
|
||||||
<el-form-item label="门店名称" prop="shopName">
|
<el-form-item label="门店名称" prop="shopName">
|
||||||
<el-input
|
<el-input v-model.trim="form.shopName" placeholder="请输入门店名称" style="width: 500px"></el-input>
|
||||||
v-model.trim="form.shopName"
|
|
||||||
placeholder="请输入门店名称"
|
|
||||||
style="width: 500px"
|
|
||||||
></el-input>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="连锁店扩展店名">
|
<el-form-item label="连锁店扩展店名">
|
||||||
<el-input
|
<el-input v-model.trim="form.chainName" placeholder="请输入连锁店扩展店名" style="width: 500px"></el-input>
|
||||||
v-model.trim="form.chainName"
|
|
||||||
placeholder="请输入连锁店扩展店名"
|
|
||||||
style="width: 500px"
|
|
||||||
></el-input>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="门店logo">
|
<el-form-item label="门店logo">
|
||||||
<div class="img_box">
|
<div class="img_box">
|
||||||
<single-image-upload
|
<single-image-upload style="width: 80px; height: 80px" v-model="form.logo"></single-image-upload>
|
||||||
style="width: 80px; height: 80px"
|
|
||||||
v-model="form.logo"
|
|
||||||
></single-image-upload>
|
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item label="门店照片">
|
<!-- <el-form-item label="门店照片">
|
||||||
@@ -38,22 +27,14 @@
|
|||||||
<el-form-item label="门店收款码">
|
<el-form-item label="门店收款码">
|
||||||
<div class="img_box">
|
<div class="img_box">
|
||||||
<canvas ref="canvas" id="QRCode_header" style="width: 80px; height: 80px"></canvas>
|
<canvas ref="canvas" id="QRCode_header" style="width: 80px; height: 80px"></canvas>
|
||||||
<el-button
|
<el-button size="small" plain v-if="form.paymentQrcode" @click="downloadCanvas(form.paymentQrcode)">
|
||||||
size="small"
|
|
||||||
plain
|
|
||||||
v-if="form.paymentQrcode"
|
|
||||||
@click="downloadCanvas(form.paymentQrcode)"
|
|
||||||
>
|
|
||||||
下载
|
下载
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="微信二维码">
|
<el-form-item label="微信二维码">
|
||||||
<div class="img_box">
|
<div class="img_box">
|
||||||
<single-image-upload
|
<single-image-upload style="width: 80px; height: 80px" v-model="form.shopQrcode"></single-image-upload>
|
||||||
style="width: 80px; height: 80px"
|
|
||||||
v-model="form.shopQrcode"
|
|
||||||
></single-image-upload>
|
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item label="店铺小程序码">
|
<!-- <el-form-item label="店铺小程序码">
|
||||||
@@ -71,11 +52,7 @@
|
|||||||
<el-radio value="after">餐饮版(先下单后支付)</el-radio>
|
<el-radio value="after">餐饮版(先下单后支付)</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item
|
<el-form-item label="是否允许用户自行支付" prop="isUserPay" v-if="form.registerType === 'after'">
|
||||||
label="是否允许用户自行支付"
|
|
||||||
prop="isUserPay"
|
|
||||||
v-if="form.registerType === 'after'"
|
|
||||||
>
|
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<div class="center" style="display: flex; align-items: center; gap: 14px">
|
<div class="center" style="display: flex; align-items: center; gap: 14px">
|
||||||
<el-switch v-model="form.isUserPay" :active-value="1" :inactive-value="0"></el-switch>
|
<el-switch v-model="form.isUserPay" :active-value="1" :inactive-value="0"></el-switch>
|
||||||
@@ -92,6 +69,12 @@
|
|||||||
<el-checkbox value="take-out">允许打包</el-checkbox>
|
<el-checkbox value="take-out">允许打包</el-checkbox>
|
||||||
</el-checkbox-group>
|
</el-checkbox-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="退菜退库存模式">
|
||||||
|
<el-radio-group :model-value="form.refundMode" @change="refundModeChange">
|
||||||
|
<el-radio label="跟随商品分类" :value="1"></el-radio>
|
||||||
|
<el-radio label="跟随单商品" :value="2"></el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
<!-- <el-form-item label="积分群体">
|
<!-- <el-form-item label="积分群体">
|
||||||
<el-radio-group v-model="form.consumeColony">
|
<el-radio-group v-model="form.consumeColony">
|
||||||
<el-radio label="all">所有</el-radio>
|
<el-radio label="all">所有</el-radio>
|
||||||
@@ -99,11 +82,7 @@
|
|||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item> -->
|
</el-form-item> -->
|
||||||
<el-form-item label="联系电话" prop="phone">
|
<el-form-item label="联系电话" prop="phone">
|
||||||
<el-input
|
<el-input v-model.trim="form.phone" placeholder="请输入联系电话" style="width: 500px"></el-input>
|
||||||
v-model.trim="form.phone"
|
|
||||||
placeholder="请输入联系电话"
|
|
||||||
style="width: 500px"
|
|
||||||
></el-input>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item label="外卖起送金额">
|
<!-- <el-form-item label="外卖起送金额">
|
||||||
<el-input-number v-model="form.takeaway_money" placeholder="0.00" controls-position="right"
|
<el-input-number v-model="form.takeaway_money" placeholder="0.00" controls-position="right"
|
||||||
@@ -129,62 +108,30 @@
|
|||||||
<div style="color: #999">注:准确的定位便于用户导航到店铺</div>
|
<div style="color: #999">注:准确的定位便于用户导航到店铺</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="门店详细地址">
|
<el-form-item label="门店详细地址">
|
||||||
<el-input
|
<el-input type="textarea" v-model.trim="form.address" placeholder="请输入门店详细地址" style="width: 500px"></el-input>
|
||||||
type="textarea"
|
|
||||||
v-model.trim="form.address"
|
|
||||||
placeholder="请输入门店详细地址"
|
|
||||||
style="width: 500px"
|
|
||||||
></el-input>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="营业时间">
|
<el-form-item label="营业时间">
|
||||||
<div class="u-flex gap-2" style="width: 50%">
|
<div class="u-flex gap-2" style="width: 50%">
|
||||||
<el-select v-model="form.businessStartDay" placeholder="周几开始">
|
<el-select v-model="form.businessStartDay" placeholder="周几开始">
|
||||||
<el-option
|
<el-option :value="item.label" :label="item.label" v-for="item in weeks" :key="item.value"></el-option>
|
||||||
:value="item.label"
|
|
||||||
:label="item.label"
|
|
||||||
v-for="item in weeks"
|
|
||||||
:key="item.value"
|
|
||||||
></el-option>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-select v-model="form.businessEndDay" placeholder="周几结束">
|
<el-select v-model="form.businessEndDay" placeholder="周几结束">
|
||||||
<el-option
|
<el-option :value="item.label" :label="item.label" v-for="item in weeks" :key="item.value"></el-option>
|
||||||
:value="item.label"
|
|
||||||
:label="item.label"
|
|
||||||
v-for="item in weeks"
|
|
||||||
:key="item.value"
|
|
||||||
></el-option>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-time-picker
|
<el-time-picker placeholder="起始时间" v-model="startTime" :picker-options="{
|
||||||
placeholder="起始时间"
|
selectableRange: '00:00:00 - 23:59:59',
|
||||||
v-model="startTime"
|
format: 'HH:mm',
|
||||||
:picker-options="{
|
}" format="HH:mm" value-format="HH:mm"></el-time-picker>
|
||||||
selectableRange: '00:00:00 - 23:59:59',
|
<el-time-picker placeholder="结束时间" v-model="endTime" :picker-options="{
|
||||||
format: 'HH:mm',
|
selectableRange: '00:00:00 - 23:59:59',
|
||||||
}"
|
}" format="HH:mm" value-format="HH:mm"></el-time-picker>
|
||||||
format="HH:mm"
|
|
||||||
value-format="HH:mm"
|
|
||||||
></el-time-picker>
|
|
||||||
<el-time-picker
|
|
||||||
placeholder="结束时间"
|
|
||||||
v-model="endTime"
|
|
||||||
:picker-options="{
|
|
||||||
selectableRange: '00:00:00 - 23:59:59',
|
|
||||||
}"
|
|
||||||
format="HH:mm"
|
|
||||||
value-format="HH:mm"
|
|
||||||
></el-time-picker>
|
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="桌位费/位/元">
|
<el-form-item label="桌位费/位/元">
|
||||||
<el-input-number :disabled="!!form.isTableFee" v-model="form.tableFee" :min="0" />
|
<el-input-number :disabled="!!form.isTableFee" v-model="form.tableFee" :min="0" />
|
||||||
<!-- <el-checkbox v-model="form.isTableFee" :label="1">免餐位费</el-checkbox> -->
|
<!-- <el-checkbox v-model="form.isTableFee" :label="1">免餐位费</el-checkbox> -->
|
||||||
<el-switch
|
<el-switch class="u-m-l-10" v-model.trim="form.isTableFee" :active-value="1" :inactive-value="0"
|
||||||
class="u-m-l-10"
|
active-text="免餐位费"></el-switch>
|
||||||
v-model.trim="form.isTableFee"
|
|
||||||
:active-value="1"
|
|
||||||
:inactive-value="0"
|
|
||||||
active-text="免餐位费"
|
|
||||||
></el-switch>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item label="是否开启8折活动">
|
<!-- <el-form-item label="是否开启8折活动">
|
||||||
<el-switch v-model.trim="form.isOpenYhq" active-value="true" inactive-value="false"></el-switch>
|
<el-switch v-model.trim="form.isOpenYhq" active-value="true" inactive-value="false"></el-switch>
|
||||||
@@ -218,41 +165,24 @@
|
|||||||
</el-time-picker>
|
</el-time-picker>
|
||||||
</el-form-item> -->
|
</el-form-item> -->
|
||||||
<el-form-item label="店铺简介">
|
<el-form-item label="店铺简介">
|
||||||
<el-input
|
<el-input type="textarea" v-model.trim="form.detail" placeholder="请输入店铺简介" style="width: 500px"></el-input>
|
||||||
type="textarea"
|
|
||||||
v-model.trim="form.detail"
|
|
||||||
placeholder="请输入店铺简介"
|
|
||||||
style="width: 500px"
|
|
||||||
></el-input>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="台桌预订短信">
|
<el-form-item label="台桌预订短信">
|
||||||
<el-input
|
<el-input type="textarea" v-model.trim="form.bookingSms" placeholder="请输入台桌预订短信"
|
||||||
type="textarea"
|
style="width: 500px"></el-input>
|
||||||
v-model.trim="form.bookingSms"
|
|
||||||
placeholder="请输入台桌预订短信"
|
|
||||||
style="width: 500px"
|
|
||||||
></el-input>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="电子围栏" prop="isOrderFence">
|
<el-form-item label="电子围栏" prop="isOrderFence">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<div class="center" style="display: flex; align-items: center; gap: 14px">
|
<div class="center" style="display: flex; align-items: center; gap: 14px">
|
||||||
<el-switch
|
<el-switch v-model="form.isOrderFence" :active-value="1" :inactive-value="0"></el-switch>
|
||||||
v-model="form.isOrderFence"
|
|
||||||
:active-value="1"
|
|
||||||
:inactive-value="0"
|
|
||||||
></el-switch>
|
|
||||||
<div class="tips" style="font-size: 14px; color: #999">
|
<div class="tips" style="font-size: 14px; color: #999">
|
||||||
开启后,用户只能在店铺附近xx公里内点餐
|
开启后,用户只能在店铺附近xx公里内点餐
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="center" v-if="form.isOrderFence == 1">
|
<div class="center" v-if="form.isOrderFence == 1">
|
||||||
<el-input
|
<el-input v-model="form.orderFenceDistance" placeholder="请输入"
|
||||||
v-model="form.orderFenceDistance"
|
@input="(e) => (form.orderFenceDistance = filterNumberInput(e))" style="width: 250px"
|
||||||
placeholder="请输入"
|
input-style="text-align: center;">
|
||||||
@input="(e) => (form.orderFenceDistance = filterNumberInput(e))"
|
|
||||||
style="width: 250px"
|
|
||||||
input-style="text-align: center;"
|
|
||||||
>
|
|
||||||
<template #prepend>限制:</template>
|
<template #prepend>限制:</template>
|
||||||
<template #append>公里</template>
|
<template #append>公里</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
@@ -263,23 +193,15 @@
|
|||||||
<el-form-item label="上菜时间(分钟)" prop="isServeTimeControl">
|
<el-form-item label="上菜时间(分钟)" prop="isServeTimeControl">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<div class="center" style="display: flex; align-items: center; gap: 14px">
|
<div class="center" style="display: flex; align-items: center; gap: 14px">
|
||||||
<el-switch
|
<el-switch v-model="form.isServeTimeControl" :active-value="1" :inactive-value="0"></el-switch>
|
||||||
v-model="form.isServeTimeControl"
|
|
||||||
:active-value="1"
|
|
||||||
:inactive-value="0"
|
|
||||||
></el-switch>
|
|
||||||
<div class="tips" style="font-size: 14px; color: #999">
|
<div class="tips" style="font-size: 14px; color: #999">
|
||||||
起菜到上菜的时间间隔,开启后会有超时提示
|
起菜到上菜的时间间隔,开启后会有超时提示
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="center" v-if="form.isServeTimeControl == 1">
|
<div class="center" v-if="form.isServeTimeControl == 1">
|
||||||
<el-input
|
<el-input v-model="form.serveTime" placeholder="请输入"
|
||||||
v-model="form.serveTime"
|
@input="(e) => (form.serveTime = filterNumberInput(e))" style="width: 250px"
|
||||||
placeholder="请输入"
|
input-style="text-align: center;">
|
||||||
@input="(e) => (form.serveTime = filterNumberInput(e))"
|
|
||||||
style="width: 250px"
|
|
||||||
input-style="text-align: center;"
|
|
||||||
>
|
|
||||||
<template #prepend>限制:</template>
|
<template #prepend>限制:</template>
|
||||||
<template #append>分钟</template>
|
<template #append>分钟</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
@@ -304,24 +226,11 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
<ChooseAddress ref="refChooseAddress" @choose="chooseAddressConfirm"></ChooseAddress>
|
<ChooseAddress ref="refChooseAddress" @choose="chooseAddressConfirm"></ChooseAddress>
|
||||||
<el-dialog
|
<el-dialog v-model="showUpload" :close-on-click-modal="false" append-to-body width="500px"
|
||||||
v-model="showUpload"
|
@close="showUpload = false">
|
||||||
:close-on-click-modal="false"
|
<el-upload :before-remove="handleBeforeRemove" :on-success="handleSuccess" :on-error="handleError"
|
||||||
append-to-body
|
:file-list="fileList" :headers="headers" :action="qiNiuUploadApi" :limit="1" list-type="picture"
|
||||||
width="500px"
|
class="upload-demo">
|
||||||
@close="showUpload = false"
|
|
||||||
>
|
|
||||||
<el-upload
|
|
||||||
:before-remove="handleBeforeRemove"
|
|
||||||
:on-success="handleSuccess"
|
|
||||||
:on-error="handleError"
|
|
||||||
:file-list="fileList"
|
|
||||||
:headers="headers"
|
|
||||||
:action="qiNiuUploadApi"
|
|
||||||
:limit="1"
|
|
||||||
list-type="picture"
|
|
||||||
class="upload-demo"
|
|
||||||
>
|
|
||||||
<el-button size="small" type="primary">点击上传</el-button>
|
<el-button size="small" type="primary">点击上传</el-button>
|
||||||
<template #tip>
|
<template #tip>
|
||||||
<div style="display: block" class="el-upload__tip">请勿上传违法文件,且文件不超过15M</div>
|
<div style="display: block" class="el-upload__tip">请勿上传违法文件,且文件不超过15M</div>
|
||||||
@@ -459,6 +368,24 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
// 切换退菜退库存模式
|
||||||
|
refundModeChange(value) {
|
||||||
|
console.log('refundModeChange===', value);
|
||||||
|
const m = {
|
||||||
|
1: {
|
||||||
|
1: '跟随商品分类',
|
||||||
|
2: '商品分类'
|
||||||
|
},
|
||||||
|
2: {
|
||||||
|
1: '跟随单商品模式',
|
||||||
|
2: '商品列表'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ElMessageBox.confirm(`当前操作:将《退菜退库存》模式切换为「${m[value][1]}」本操作将会影响耗材库存数量的统计请谨慎操作修改后,可前往「商品管理-${m[value][2]}」中编辑/查看配置`, '提示', { showClose: false, showCancelButton: false }).then(() => {
|
||||||
|
this.form.refundMode = value
|
||||||
|
}).catch(() => { })
|
||||||
|
},
|
||||||
chooseAddressConfirm(e) {
|
chooseAddressConfirm(e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
this.$refs.refChooseAddress.close();
|
this.$refs.refChooseAddress.close();
|
||||||
@@ -576,7 +503,7 @@ export default {
|
|||||||
handleBeforeRemove(file, fileList) {
|
handleBeforeRemove(file, fileList) {
|
||||||
for (let i = 0; i < this.files.length; i++) {
|
for (let i = 0; i < this.files.length; i++) {
|
||||||
if (this.files[i].uid === file.uid) {
|
if (this.files[i].uid === file.uid) {
|
||||||
crudQiNiu.del([this.files[i].id]).then((res) => {});
|
crudQiNiu.del([this.files[i].id]).then((res) => { });
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="status" v-if="
|
<div class="status" v-if="
|
||||||
item.isSoldStock ||
|
item.isSoldStock ||
|
||||||
|
item.isSoldOut ||
|
||||||
!item.isSale ||
|
!item.isSale ||
|
||||||
!item.isSaleTime ||
|
!item.isSaleTime ||
|
||||||
(item.isStock && item.stockNumber * 1 <= 0)
|
(item.isStock && item.stockNumber * 1 <= 0)
|
||||||
@@ -37,8 +38,8 @@
|
|||||||
ElMessage.error('该商品不在可售时间内') ||
|
ElMessage.error('该商品不在可售时间内') ||
|
||||||
isProductAvailable(item.days, item.startTime, item.endTime)
|
isProductAvailable(item.days, item.startTime, item.endTime)
|
||||||
" v-else-if="!item.isSaleTime" iconClass="no-sale" color="#fff" size="60"></svg-icon>
|
" v-else-if="!item.isSaleTime" iconClass="no-sale" color="#fff" size="60"></svg-icon>
|
||||||
<svg-icon @click="ElMessage.error('该商品已售罄')" v-else-if="item.isSoldStock" iconClass="shouqing" color="#fff"
|
<svg-icon @click="ElMessage.error('该商品已售罄')" v-else-if="item.isSoldStock || item.isSoldOut" iconClass="shouqing"
|
||||||
size="60"></svg-icon>
|
color="#fff" size="60"></svg-icon>
|
||||||
<svg-icon @click="ElMessage.error('库存不足')" v-else-if="item.isStock && item.stockNumber * 1 <= 0"
|
<svg-icon @click="ElMessage.error('库存不足')" v-else-if="item.isStock && item.stockNumber * 1 <= 0"
|
||||||
iconClass="stock_null" color="#fff" size="60"></svg-icon>
|
iconClass="stock_null" color="#fff" size="60"></svg-icon>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -41,13 +41,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="u-flex u-flex-wrap tags">
|
<div class="u-flex u-flex-wrap tags">
|
||||||
<div
|
<div class="tag" v-for="(tag, index) in tags" @click="changeSel(tag)" :key="index"
|
||||||
class="tag"
|
:class="{ active: tag.checked }">
|
||||||
v-for="(tag, index) in tags"
|
|
||||||
@click="changeSel(tag)"
|
|
||||||
:key="index"
|
|
||||||
:class="{ active: tag.checked }"
|
|
||||||
>
|
|
||||||
{{ tag.label }}
|
{{ tag.label }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -64,10 +59,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
<!-- 退款退菜推库存的操作弹窗 -->
|
||||||
|
<refundConsModal ref="refundConsModalRef" :list="refundList" @success="refundConsModalSuccess" />
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
|
import { useCartsStore } from '@/store/modules/carts'
|
||||||
|
import refundConsModal from "@/components/refundConsModal.vue";
|
||||||
export default {
|
export default {
|
||||||
|
components: { refundConsModal },
|
||||||
props: {
|
props: {
|
||||||
modal: {
|
modal: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
@@ -90,6 +90,9 @@ export default {
|
|||||||
goods: {
|
goods: {
|
||||||
productId: -999,
|
productId: -999,
|
||||||
},
|
},
|
||||||
|
refundList: [],
|
||||||
|
refundStock: '',
|
||||||
|
note: ''
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -132,34 +135,79 @@ export default {
|
|||||||
this.show = false;
|
this.show = false;
|
||||||
this.number = 1;
|
this.number = 1;
|
||||||
},
|
},
|
||||||
|
// 选择退库存模式后
|
||||||
|
refundConsModalSuccess(e) {
|
||||||
|
this.refundStock = e
|
||||||
|
this.refundNext()
|
||||||
|
},
|
||||||
|
refundNext() {
|
||||||
|
this.$emit("confirm", {
|
||||||
|
refundReason: this.note,
|
||||||
|
refundAmount: 0,
|
||||||
|
refundDetails: [{ id: this.goods.id, num: this.number, returnAmount: 0 }],
|
||||||
|
refundStock: this.refundStock
|
||||||
|
});
|
||||||
|
this.close();
|
||||||
|
},
|
||||||
|
// 确认退菜
|
||||||
confirm() {
|
confirm() {
|
||||||
const selTag = this.tags
|
const selTag = this.tags
|
||||||
.filter((item) => item.checked)
|
.filter((item) => item.checked)
|
||||||
.map((item) => item.label)
|
.map((item) => item.label)
|
||||||
.join(",");
|
.join(",");
|
||||||
const note = selTag + (this.note.length > 0 ? "," + this.note : "");
|
this.note = selTag + (this.note.length > 0 ? "," + this.note : "");
|
||||||
console.log(note);
|
|
||||||
if (!note) {
|
if (!this.note) {
|
||||||
return ElMessage.error("请输入退菜原因");
|
return ElMessage.error("请输入退菜原因");
|
||||||
}
|
}
|
||||||
this.$emit("confirm", {
|
|
||||||
refundReason: note,
|
const carts = useCartsStore();
|
||||||
refundAmount: 0,
|
let categorys = JSON.parse(localStorage.getItem('categorys'))
|
||||||
refundDetails: [{ id: this.goods.id, num: this.number, returnAmount: 0 }],
|
let shopInfo = JSON.parse(localStorage.getItem('userInfo'))
|
||||||
});
|
|
||||||
this.close();
|
// 在这里给订单的商品补全库存信息 start
|
||||||
|
carts.goods.forEach(val => {
|
||||||
|
if (this.goods.productId == val.id) {
|
||||||
|
if (shopInfo.refundMode == 1) {
|
||||||
|
// 跟随分类退款模式
|
||||||
|
categorys.forEach(v => {
|
||||||
|
if (val.categoryId == v.id) {
|
||||||
|
this.goods.refundMode = v.refundMode
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// 跟随商品退款模式及
|
||||||
|
this.goods.refundMode = val.refundMode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log('this.goods===', this.goods);
|
||||||
|
if (this.goods.refundMode == 3) {
|
||||||
|
this.refundList = [
|
||||||
|
{
|
||||||
|
name: this.goods.product_name,
|
||||||
|
num: this.number
|
||||||
|
}
|
||||||
|
]
|
||||||
|
this.$refs.refundConsModalRef.show()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 在这里给订单的商品补全库存信息 end
|
||||||
|
this.refundNext()
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {},
|
mounted() { },
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
:deep(.el-dialog__body) {
|
:deep(.el-dialog__body) {
|
||||||
margin-bottom: 14px;
|
margin-bottom: 14px;
|
||||||
margin-top: 14px;
|
margin-top: 14px;
|
||||||
padding: 0 20px;
|
padding: 0 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep(.el-tag) {
|
:deep(.el-tag) {
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
@@ -169,6 +217,7 @@ export default {
|
|||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
height: 35px;
|
height: 35px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tags {
|
.tags {
|
||||||
.tag {
|
.tag {
|
||||||
margin: 10px 10px 0 0;
|
margin: 10px 10px 0 0;
|
||||||
@@ -178,6 +227,7 @@ export default {
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #000;
|
color: #000;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
color: #1890ff;
|
color: #1890ff;
|
||||||
background: #e8f4ff;
|
background: #e8f4ff;
|
||||||
@@ -185,10 +235,12 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep(.number-box .el-input__inner::-webkit-inner-spin-button) {
|
:deep(.number-box .el-input__inner::-webkit-inner-spin-button) {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep(.number-box .el-input__inner::-webkit-outer-spin-button) {
|
:deep(.number-box .el-input__inner::-webkit-outer-spin-button) {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|||||||
@@ -665,6 +665,7 @@ function getCategoryList() {
|
|||||||
size: 200,
|
size: 200,
|
||||||
})
|
})
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
|
localStorage.setItem('categorys', JSON.stringify(res))
|
||||||
res.unshift({ name: "全部", id: "" });
|
res.unshift({ name: "全部", id: "" });
|
||||||
category.list = res;
|
category.list = res;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -8,13 +8,18 @@
|
|||||||
// adminIn 管理员充值
|
// adminIn 管理员充值
|
||||||
// adminOut管理员消费
|
// adminOut管理员消费
|
||||||
export const $bizCode = {
|
export const $bizCode = {
|
||||||
cashIn: "现金充值",
|
cashIn: "会员充值",
|
||||||
|
cashback: "消费返现",
|
||||||
|
cashback_refund: "消费返现扣减",
|
||||||
|
freeIn: "霸王餐充值",
|
||||||
|
awardIn: "充值奖励",
|
||||||
wechatIn: "微信小程序充值",
|
wechatIn: "微信小程序充值",
|
||||||
alipayIn: "支付宝小程序充值",
|
alipayIn: "支付宝小程序充值",
|
||||||
awardIn: "充值奖励",
|
orderPay: "订单支付奖励",
|
||||||
rechargeRefund: "充值退款",
|
|
||||||
orderPay: "订单消费",
|
|
||||||
orderRefund: "订单退款",
|
orderRefund: "订单退款",
|
||||||
adminIn: "管理员充值",
|
rechargeRefund: "充值退款",
|
||||||
adminOut: "管理员消费",
|
rechargeCashRefund: "会员现金退款",
|
||||||
|
adminIn: "管理员手动增减余额",
|
||||||
|
adminOut: "管理员退款充值",
|
||||||
|
rechargeRedemption: "充值兑换码"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user