merchapp/java-mall-app-shop-admin/pages/my/printer/printerList.vue
2025-06-24 18:44:20 +08:00

619 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

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

<template>
<view class="printerList-container">
<!-- <zTable
:tableData="tableData"
:columns="columns"
titleTextAlign="center"
textAlign="center"
></zTable> -->
<u-navbar :autoBack="true" :safeAreaInsetTop="true" title="打印机列表">
<template slot="right">
<view
v-if="tableData.length > 0"
class="btn-addPrinter"
@click="showPopup = true"
>
新增打印机
</view>
</template>
</u-navbar>
<u-search
v-if="tableData.length > 0"
class="search"
placeholder="请输入打印机名字"
:showAction="false"
v-model="params.keyword"
@input="searchOrder()"
></u-search>
<scroll-view
v-if="tableData.length > 0"
class="uni-swiper-list"
scroll-y
:scroll-top="0"
enhanced
:show-scrollbar="false"
@scrolltolower="scrolltolower"
>
<view class="table">
<view class="table-title">
<view
class="table-title-item"
v-for="(item, index) of columns"
:key="index"
>
{{ item.title }}
</view>
</view>
<view
class="table-td"
v-for="(item, index) of tableData"
:key="index + item.num"
>
<view class="table-td-item table-td-name">
{{ item.printer_name }}
</view>
<view class="table-td-item table-td-num">{{ item.printer_sn }}</view>
<view class="table-td-item">
<u-switch
asyncChange
@change="updatePrinterStatus($event, item)"
v-model="item.status"
activeColor="#5ac725"
size="28"
:activeValue="1"
:inactiveValue="2"
></u-switch>
</view>
<view class="table-td-item table-td-operate">
<u-icon
class="fm-icon"
custom-prefix="custom-icon-bianji custom-icon"
size="25"
color="#000"
@click="showPopupModel(item)"
></u-icon>
<u-icon
class="fm-icon"
custom-prefix="custom-icon-shanchu custom-icon"
size="25"
color="#000"
@click="delectPrinter(item)"
></u-icon>
</view>
</view>
</view>
<view class="m-loading-box">
<block v-if="isLoadingReachData">
<view class="u-loadmore">
<view class="u-loading"></view>
<text class="u-loadmore-tips">正在加载...</text>
</view>
</block>
<block v-else>
<view class="u-loadmore u-loadmore-line">
<text class="u-loadmore-tips">没有更多打印机啦!</text>
</view>
</block>
</view>
</scroll-view>
<u-popup :show="showPopup" @close="close" :closeable="true">
<view class="printer-popup">
<u--form
labelPosition="left"
:model="form"
:rules="rules"
ref="uForm"
label-width="100"
>
<u-form-item label="打印机名称" prop="printer_name" required>
<u-input
class="form-input"
v-model="form.printer_name"
placeholder="请输打印机名称"
/>
</u-form-item>
<u-form-item
label="设备品牌"
prop="model_name"
required
@click="getPrinterModelList"
>
<u--input
v-model="form.model_name"
disabled
disabledColor="#ffffff"
placeholder="请选择打印机品牌"
></u--input>
<u-icon slot="right" name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="打印机编号" prop="printer_sn" required>
<u-input
class="form-input"
v-model="form.printer_sn"
placeholder="请输打印机编号"
/>
</u-form-item>
<u-form-item label="打印机密钥" prop="printer_key" required>
<u-input
class="form-input"
v-model="form.printer_key"
placeholder="请输打印机密钥"
/>
</u-form-item>
<u-form-item label="URL" prop="website_url" required>
<u-input
class="form-input"
v-model="form.website_url"
placeholder="例如:www.test.com"
/>
</u-form-item>
<u-form-item label="打印来源" prop="">
<u-radio-group v-model="form.flag" placement="row">
<u-radio
class="printer-radio-item"
v-for="(item, index) of radioGroup"
:key="index"
activeColor="#2979ff"
:label="item.region"
:name="item.region_id"
></u-radio>
</u-radio-group>
</u-form-item>
<u-form-item label="纸张宽度" prop="">
<u-radio-group v-model="form.paper_with" placement="row">
<u-radio
class="printer-radio-item"
activeColor="#2979ff"
label="58mm"
:name="58"
></u-radio>
<u-radio
class="printer-radio-item"
activeColor="#2979ff"
label="80mm"
:name="80"
></u-radio>
</u-radio-group>
</u-form-item>
<view class="tips">
* 80mm宽度仅支持“飞蛾打印机新接口”“芯烨云打印机”两种品牌。
</view>
</u--form>
<view class="btn-content">
<u-button class="btn-next" @click="submit">
{{ isAdd ? "添加" : "修改" }}
</u-button>
</view>
</view>
</u-popup>
<view class="no-data" v-if="tableData.length <= 0 && !loading">
<view class="no-data-bg"></view>
<view class="nodata-tips">暂无打印机!</view>
<view class="btn" @click="showPopup = true">立即添加</view>
</view>
<u-picker
class="u-printer-picker"
v-if="showbrandList"
mode="selector"
:show="showbrandList"
:safe-area-inset-bottom="true"
:default-selector="[0]"
:columns="brandList"
:keyName="'model_name'"
@cancel="handleCancel"
@confirm="handleConfirm"
></u-picker>
</view>
</template>
<script>
import {
GetPrinterList,
GetPrinterflagList,
GetPrinterModelList,
AddPrinter,
DelectPrinter,
UpdatePrinter,
UpdatePrinterStatus,
TestPrinter,
} from "../../../api/printer";
import zTable from "../../../components/table/z-table.vue";
// import UButton from "../../../uni_modules/uview-ui/components/u-button/u-button.vue";
export default {
components: {
zTable,
},
data() {
return {
params: {
keyword: "",
pageNum: 1,
pageSize: 20,
},
printerList: [],
tableData: [],
columns: [
{
title: "打印机名称",
listenerClick: true,
key: "name",
},
{
title: "编号",
key: "num",
},
{
title: "状态",
key: "status",
},
{
title: "操作",
key: "operate",
},
],
showPopup: false,
isAdd: true,
popupInfo: {},
form: {
printer_name: "",
model_name: "",
printer_sn: "",
printer_key: "",
website_url: "",
region: 0,
paper_with: 58,
flag: 1,
},
rules: {
printer_name: {
type: "string",
required: true,
message: "请输入打印机名称",
trigger: ["blur", "change"],
},
},
radioGroup: [
{
key: 1,
name: "收银台",
},
{
key: 2,
name: "核销处",
},
{
key: 3,
name: "网店",
},
],
params: {
keyword: "",
pageNum: 1,
pageSize: 10,
},
isLoadingReachData: false,
searchTime: 0,
showbrandList: false,
brandList: [[0]],
loading: true,
};
},
onReady() {
//如果需要兼容微信小程序并且校验规则中含有方法等只能通过setRules方法设置规则。
},
onShow() {
this.getPrinterList();
this.getPrinterflagList();
},
methods: {
async getPrinterList() {
let res = await GetPrinterList(this.params);
if (res && res.status == 200) {
if (this.isLoadingReachData) {
if (res.data.items.length > 0) {
this.isLoadingReachData = false;
return;
} else {
this.tableData = [...this.tableData, ...res.data.item];
}
} else {
this.tableData = res.data.items;
}
}
this.isLoadingReachData = false;
this.loading = false;
},
async getPrinterflagList() {
let res = await GetPrinterflagList({ count: 99 });
if (res && res.status == 200) {
this.radioGroup = res.data;
}
},
async getPrinterModelList() {
let res = await GetPrinterModelList({ count: 99 });
if (res && res.status == 200) {
this.brandList[0] = res.data;
this.showbrandList = true;
}
},
showPopupModel(item) {
this.isAdd = false;
setTimeout(() => {
this.$refs["uForm"].setRules(this.rules);
}, 0);
this.showPopup = true;
this.form = item;
},
handleCancel() {
this.showbrandList = false;
},
handleConfirm(e) {
this.form.model_id = e.value[0].model_id;
this.showbrandList = false;
},
close() {
this.showPopup = false;
},
searchOrder() {
this.params.pageNum = 1;
this.params.pageSize = 10;
clearTimeout(this.searchTime);
this.searchTime = setTimeout(() => {
this.getPrinterList();
}, 600);
},
scrolltolower() {
this.isLoadingReachData = true;
clearTimeout(this.searchTime);
this.searchTime = setTimeout(() => {
this.getPrinterList();
}, 600);
},
async updatePrinterStatus(value, item) {
let params = {
printer_id: item.printer_id,
status: value,
};
if (value == 2) {
uni.showModal({
title: "提示",
content: `你确认要禁用打印机?`,
success: async (res) => {
if (res.confirm) {
let res = await UpdatePrinterStatus(params);
if (res && res.status == 200) {
item.status = value;
uni.showToast({
title: `禁用成功`,
icon: "success",
duration: 600,
});
}
} else if (res.cancel) {
// 用户点击了取消按钮
}
},
});
} else {
let res = await UpdatePrinterStatus(params);
if (res && res.status == 200) {
item.status = value;
uni.showToast({
title: `禁用成功`,
icon: "success",
duration: 600,
});
}
}
},
async submit() {
let params = JSON.parse(JSON.stringify(this.form));
if (this.isAdd) {
let res = await AddPrinter(params);
if (res.status == 200) {
this.close();
uni.showToast({
title: `添加成功`,
icon: "success",
duration: 600,
});
}
} else {
let res = await UpdatePrinter(params);
if (res.status == 200) {
this.close();
uni.showToast({
title: `修改成功`,
icon: "success",
duration: 600,
});
}
}
this.getPrinterList();
},
delectPrinter(item) {
uni.showModal({
title: "警告",
content: `你确认要删除打印机?`,
success: async (res) => {
if (res.confirm) {
let res = await DelectPrinter({
printer_id: item.printer_id,
});
if (res && res.status == 200) {
uni.showToast({
title: `删除成功`,
icon: "success",
duration: 600,
});
this.params = {
keyword: "",
pageNum: 1,
pageSize: 10,
};
this.getPrinterList();
}
} else if (res.cancel) {
// 用户点击了取消按钮
}
},
});
},
},
};
</script>
<style lang="scss">
@import "@/styles/variables.scss";
.printerList-container {
overflow: hidden;
.btn-addPrinter {
color: $base-color;
}
.search {
margin: 40rpx !important;
margin-top: 120rpx !important;
}
.uni-swiper-list {
height: calc(100vh - 165px);
}
.table {
.table-title {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 24rpx;
padding-right: 52rpx;
height: 80rpx;
background: #f2f2f2;
color: #aaaaaa;
font-size: 28rpx;
}
.table-td-name {
min-width: 160rpx;
max-width: 160rpx;
word-wrap: break-word;
}
.table-td-num {
min-width: 160rpx;
max-width: 160rpx;
word-wrap: break-word;
text-align: center;
}
.table-td {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 24rpx;
margin: 40rpx 0;
.table-td-item {
}
}
.table-td-operate {
display: flex;
width: 120rpx;
justify-content: space-between;
}
}
.printer-popup {
padding: 92rpx 40rpx 36rpx;
.form {
padding: 0 36rpx;
background: red;
border-top: 1px solid #f2f2f2;
.printer-popup {
background: red;
}
::v-deep.printer-radio-item {
margin-right: 20rpx;
}
}
::v-deep.u-form-item__body__right__content__slot {
.u-radio-group {
.printer-radio-item {
margin-right: 56rpx;
}
}
}
::v-deep.u-form-item__body__left {
// min-width: 200rpx;
}
}
.tips {
font-size: 20rpx;
color: #aaaaaa;
}
.btn-content {
bottom: 40rpx;
width: 94%;
padding: 48rpx 24rpx;
}
.btn-next {
border-radius: 16rpx;
background: $base-color;
color: #fff;
}
.m-loading-box {
text-align: center;
margin: 40rpx;
color: #aaaa;
font-size: 28rpx;
}
.no-data {
.no-data-bg {
width: 600rpx;
height: 600rpx;
margin: 80rpx auto;
background-image: url("../../../static/no-data.png");
background-size: 100% 100%;
}
.nodata-tips {
font-size: 28rpx;
text-align: center;
color: #aaaaaa;
}
.btn {
margin: 80rpx auto;
width: 50%;
height: 100rpx;
line-height: 100rpx;
text-align: center;
font-size: 36rpx;
background: $base-color;
border-radius: 64rpx;
color: #fff;
}
}
.u-printer-picker {
::v-deep.u-transition {
z-index: 10075 !important;
}
}
}
</style>