vue-cli init

This commit is contained in:
2025-08-15 16:25:44 +08:00
parent e81805b4c0
commit 8e22afd798
590 changed files with 103286 additions and 213 deletions
+736
View File
@@ -0,0 +1,736 @@
<template>
<view class="wrap">
<u-form ref="uForm">
<u-form-item>
<text class="title" style="width: 200px">单号:{{ BillNo }}</text>
<text class="title" style="width: 200px">日期:{{ BillDate }}</text>
</u-form-item>
<u-form-item>
<text class="title" style="width: 200px"
>客户名称:{{ CustomerName }}</text
>
<text class="title" style="width: 200px"
>销 售 员:{{ SaleUserName }}</text
>
</u-form-item>
<u-form-item>
<text class="title" style="width: 200px"
>仓库名称:{{ StoreName }}{{ ToStoreName }}</text
>
</u-form-item>
<u-form-item>
<text class="title" style="width: 200px"
>备注内容:{{ BillRemark }}</text
>
</u-form-item>
<u-form-item label-width="130" label="条码资料:">
<input
type="text"
v-model="QRBarCode"
maxlength="-1"
style="width: 170px"
@confirm="SalePickBillDetailScan"
/>
<checkbox-group @change="handleAllCrockNoChange">
<checkbox :checked="AllCrockNoScanStatus">整缸</checkbox>
</checkbox-group>
<checkbox-group @change="handleBarCodeDelChange">
<checkbox :checked="BarCodeDelStatus">删除</checkbox>
</checkbox-group>
</u-form-item>
</u-form>
<u-form ref="uForm">
<u-form-item>
<text class="title" style="width: 400px"
>成品名称:{{ FabricGoodsNo }}{{ FabricGoodsName }}</text
>
</u-form-item>
<u-form-item>
<text class="title" style="width: 400px"
>色号颜色:{{ GoodsCodeNo }}{{ GoodsCodeName }}</text
>
</u-form-item>
<u-form-item>
<text class="title" style="width: 200px">成品缸号:{{ CrockNo }}</text>
<text class="title" style="width: 200px"
>成品卷号:{{ GoodsBillNo }}</text
>
</u-form-item>
<u-form-item>
<text class="title">{{ BillDataMessage }}</text>
</u-form-item>
<u-form-item>
<text class="title" style="width: 130px"
>配布条数:{{ BillSumRoll }}</text
>
<text class="title" style="width: 130px">数量:{{ BillSumQty }}</text>
<text class="title" style="width: 120px">米数:{{ BillSumMQty }}</text>
</u-form-item>
<u-form-item>
<text class="title" style="width: 130px"
>已配条数:{{ BillScanRoll }}</text
>
<text class="title" style="width: 130px">数量:{{ BillScanQty }}</text>
<text class="title" style="width: 120px">米数:{{ BillScanMQty }}</text>
</u-form-item>
<view class="submitView">
<u-button
type="primary"
class="submitBtn"
:ripple="true"
:loading="submitLoading"
ripple-bg-color="#909399"
@click="submitBtnFun"
>
{{ pageType ? "保存" : "提交" }}
</u-button>
</view>
</u-form>
<view class="u-demo-area">
<u-toast ref="uToast"></u-toast>
<wyb-table
ref="table"
:headers="headersMaster"
:contents="GoodsDetailList"
/>
</view>
</view>
</template>
<script>
import util, {
parFabricGoodsBarCode2D,
parYarnGoodsBarCode2D,
playSuccessAudio,
playErrorAudio,
} from "../../common/util";
import wybTable from "@/components/wyb-table/wyb-table.vue";
let that = "";
export default {
data() {
return {
SaleBillNo: "", // 单号
BillMasterID: 0, // 订单ID
borderColor: "#e4e7ed",
align: "center",
index: 0,
pageType: "",
submitLoading: false,
actionSheetShow: false,
QRBarCode: "",
BillNo: "",
BillDate: "",
BillTypeID: 0,
BillRemark: "",
CustomerName: "",
StoreNameID: 0,
StoreName: "",
ToStoreName: "",
SaleUserName: "",
BillTypeName: "",
FabricGoodsNo: "",
FabricGoodsName: "",
GoodsCodeNo: "",
GoodsCodeName: "",
CrockNo: "",
GoodsBillNo: "",
BillSumRoll: 0,
BillSumQty: 0,
BillSumMQty: 0,
BillScanRoll: 0,
BillScanQty: 0,
BillScanMQty: 0,
AllCrockNoScanStatus: false,
BarCodeDelStatus: false,
GoodsDetailList: [],
BillDataMessage: "",
headersMaster: [
{
label: "成品编号",
key: "product_code",
},
{
label: "色号",
key: "product_color_code",
},
{
label: "颜色",
key: "product_color_name",
},
{
label: "缸号",
key: "dye_factory_dyelot_number",
},
{
label: "配布条数",
key: "push_roll",
},
{
label: "配布数量",
key: "push_weight",
},
{
label: "配布长度",
key: "push_length",
},
{
label: "已配条数",
key: "arrange_roll",
},
{
label: "已配数量",
key: "arrange_weight",
},
{
label: "成品等级",
key: "product_level_name",
},
{
label: "成品备注",
key: "product_remark",
},
],
scanningInput: "", // 用于累积扫码输入
lastKeyTime: 0, // 用于判断扫码速度
scanReceiver: null,
isPageActive: false, // 添加页面活动状态标志
};
},
onLoad(e) {
that = this;
if (e.billid) {
that.BillMasterID = e.billid;
}
if (e.order_no) {
that.SaleBillNo = e.order_no;
}
this.SalePickDetail();
// #ifdef APP-PLUS
this.isPageActive = true;
// this.registerScanBroadcast();
// #endif
},
onUnload() {
// #ifdef APP-PLUS
this.isPageActive = false;
this.unregisterScanBroadcast();
// #endif
},
onHide() {
// 页面隐藏时
this.isPageActive = false;
// #ifdef APP-PLUS
this.unregisterScanBroadcast();
// #endif
},
onShow() {
// 页面显示时
this.isPageActive = true;
// #ifdef APP-PLUS
this.registerScanBroadcast();
// #endif
},
methods: {
playSuccess() {
util.playSuccessAudio();
},
playError() {
util.playErrorAudio();
},
handleAllCrockNoChange() {
if (this.AllCrockNoScanStatus) {
this.AllCrockNoScanStatus = false;
} else {
this.AllCrockNoScanStatus = true;
this.BarCodeDelStatus = false;
}
},
handleBarCodeDelChange() {
if (this.BarCodeDelStatus) {
this.BarCodeDelStatus = false;
} else {
this.BarCodeDelStatus = true;
this.AllCrockNoScanStatus = false;
}
},
SalePickDetail: function () {
// 获取成品配布单详情
this.$u.api.getFpmArrangeOrder({
id: this.BillMasterID,
order_no: this.SaleBillNo
}).then(res => {
this.triggered = false;
var aResultData = res;
this.BillMasterID = aResultData.id; // 重写订单ID
this.BillNo = aResultData.order_no; // 重写单号
this.BillDate = this.$u.timeFormat(
aResultData.arrange_time,
"yyyy-mm-dd"
);
this.CustomerName = aResultData.biz_unit_name;
this.StoreNameID = aResultData.warehouse_id;
this.StoreName = aResultData.warehouse_name;
this.SaleUserName = aResultData.sale_user_name;
this.BillTypeName = aResultData.out_order_type_name;
this.BillRemark = aResultData.internal_remark;
this.BillSumRoll = aResultData.push_roll / 100 + "匹";
this.BillSumQty = aResultData.push_weight / 10000 + "Kg";
this.BillSumMQty = aResultData.push_length / 10000 + "米";
this.BillScanRoll = aResultData.total_roll / 100 + "匹";
this.BillScanQty = aResultData.total_weight / 10000 + "Kg";
this.BillScanMQty = aResultData.total_length / 10000 + "米";
let aResultDataList = res.item_data;
for (var i = 0; i < aResultDataList.length; i++) {
aResultDataList[i].push_roll = aResultDataList[i].push_roll / 100;
aResultDataList[i].push_weight = aResultDataList[i].push_weight / 10000;
aResultDataList[i].push_length = aResultDataList[i].push_length / 10000;
aResultDataList[i].arrange_roll = aResultDataList[i].arrange_roll / 100;
aResultDataList[i].arrange_weight = aResultDataList[i].arrange_weight / 10000;
}
this.GoodsDetailList = aResultDataList;
}).catch(error => {
this.triggered = false;
this.showError(error.msg);
});
},
// 添加通用错误提示方法
showError(message) {
this.playError();
uni.showModal({
title: '提示',
content: message,
showCancel: false
});
},
// 添加成功提示方法
showSuccess(message) {
this.playSuccess();
uni.showToast({
title: message,
icon: 'success'
});
},
handleScans() {
// 删除模式判断
let aBarCodeDelStatus = 1; // 1=正常扫码,3=删除模式
if (this.BarCodeDelStatus) {
aBarCodeDelStatus = 3;
}
// 整缸扫描判断
let aAllCrockNoScanStatus = 2; // 0=普通扫描,1=整缸扫描
if (this.AllCrockNoScanStatus) {
aAllCrockNoScanStatus = "1";
}
// 数据清理:去除空格、换行符等
let cleanCode = this.QRBarCode.replace(/\s+/g, '').replace(/[\r\n]/g, '');
console.log("this.QRBarCode ---->>" + cleanCode);
// 初始化条码和二维码变量
let aQRBarCode = "";
let aBarCode = "";
if (cleanCode.startsWith("66^") || cleanCode.startsWith("99^") || /[\u4E00-\u9FA5]/.test(cleanCode)) {
aQRBarCode = cleanCode;
} else {
aBarCode = cleanCode;
}
if (aQRBarCode == "" && aBarCode == "") {
this.QRBarCode = "";
this.showError('请扫描二维码或者条码');
return;
}
console.log('请求参数', aBarCodeDelStatus);
console.log('请求参数', aBarCode);
console.log('请求参数', aQRBarCode);
console.log('请求参数', this.BillMasterID);
console.log('请求参数 SaleBillNo', this.SaleBillNo);
console.log('请求参数 token', uni.getStorageSync("userToken").Token);
// 发送请求
util.request({
url: "/product/fpmArrangeOrder/updateFpmArrangeOrder",
method: "PUT",
header: {
Platform: 2,
Authorization: uni.getStorageSync("userToken").Token,
},
data: {
arrange_type: aBarCodeDelStatus, // 1=正常扫码,3=删除模式
bar_code: aBarCode, // 条码(如果是条形码就使用这个)
qr_code: aQRBarCode, // 二维码(如果是二维码就使用这个)
id: parseInt(this.BillMasterID), // 订单ID
// order_no: this.SaleBillNo, // 单号
},
success: (res) => {
console.log('API响应:', res);
if (res.data.code == 0 && res.data.msg == "success") {
var aResultData = res.data.data;
this.playSuccess();
this.FabricGoodsNo = aResultData.product_code;
this.FabricGoodsName = aResultData.product_name;
this.GoodsCodeNo = aResultData.product_color_code;
this.GoodsCodeName = aResultData.product_color_name;
this.CrockNo = aResultData.dyelot_number;
this.GoodsBillNo = aResultData.volume_number;
this.QRBarCode = "";
if (aBarCodeDelStatus == 1) {
this.showSuccess("扫描成功!");
} else {
this.showSuccess("删除成功!");
}
this.SalePickDetail();
} else {
this.showError("扫描出错," + res.data.msg);
this.QRBarCode = "";
}
},
fail: (error) => {
console.error('API请求失败:', error);
this.QRBarCode = "";
this.showError("连接服务器出错,请检查后台服务是否启动!");
},
});
},
// 注册扫码广播接收器(支持商米和新大陆扫码头)
registerScanBroadcast() {
try {
// 先尝试注册商米扫码头
this.registerSunmiBroadcast()
.then(() => {
console.log('商米扫码头注册成功');
})
.catch((error) => {
console.log('商米扫码头注册失败,尝试新大陆扫码头:', error);
// 如果商米扫码头注册失败,尝试新大陆扫码头
this.registerNewlandBroadcast();
});
} catch (error) {
console.error("注册扫码广播失败:", error);
}
},
// 注册商米扫码头广播接收器
registerSunmiBroadcast() {
return new Promise((resolve, reject) => {
try {
const main = plus.android.runtimeMainActivity();
const IntentFilter = plus.android.importClass("android.content.IntentFilter");
const filter = new IntentFilter();
filter.addAction("com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED");
const receiver = plus.android.implements(
"io.dcloud.feature.internal.reflect.BroadcastReceiver",
{
onReceive: (context, intent) => {
console.log('商米扫码广播接收,isPageActive:', this.isPageActive);
// 只有当页面活动时才处理广播
if (!this.isPageActive) return;
try {
const scanResult = intent.getStringExtra("data");
const sourceBytes = intent.getByteArrayExtra("source_byte");
console.log('商米扫码结果:', scanResult, sourceBytes);
if (scanResult) {
this.handleScanResult(scanResult);
}
} catch (error) {
console.error('处理商米广播数据时出错:', error);
}
}
}
);
// 注册广播接收器
main.registerReceiver(receiver, filter);
this.scanReceiver = receiver;
console.log('商米扫码广播接收器注册成功');
resolve();
} catch (error) {
console.error('注册商米广播接收器失败:', error);
reject(error);
}
});
},
// 注册新大陆扫码头广播接收器
registerNewlandBroadcast() {
try {
const main = plus.android.runtimeMainActivity();
// 先配置扫码枪广播设置
try {
const Intent = plus.android.importClass("android.content.Intent");
const intent = new Intent("com.android.scanner.service_settings");
intent.putExtra(
"action_barcode_broadcast",
"com.android.server.scannerservice.broadcast"
);
intent.putExtra("key_barcode_broadcast", "scannerdata");
main.sendBroadcast(intent);
console.log('新大陆扫码枪广播配置完成');
} catch (error) {
console.error("配置新大陆扫码枪广播失败:", error);
}
// 注册广播接收器
const IntentFilter = plus.android.importClass(
"android.content.IntentFilter"
);
const filter = new IntentFilter();
filter.addAction("com.android.server.scannerservice.broadcast");
console.log("添加新大陆广播action完成");
const receiver = plus.android.implements(
"io.dcloud.feature.internal.reflect.BroadcastReceiver",
{
onReceive: (context, intent) => {
console.log('新大陆扫码广播接收,isPageActive:', this.isPageActive);
// 只有当页面活动时才处理广播
if (!this.isPageActive) return;
try {
const scanResult = intent.getStringExtra("scannerdata");
console.log("新大陆扫码结果:", scanResult);
if (scanResult) {
this.handleScanResult(scanResult);
}
} catch (error) {
console.error("处理新大陆广播数据时出错:", error);
}
},
}
);
// 注册广播接收器
main.registerReceiver(receiver, filter);
this.scanReceiver = receiver;
console.log("新大陆扫码广播注册成功,等待扫码...");
} catch (error) {
console.error("注册新大陆扫码广播失败:", error);
throw error;
}
},
// 处理扫码结果的统一方法
handleScanResult(scanResult) {
try {
// 数据清理:去除空格、换行符等
let cleanCode = scanResult.replace(/\s+/g, '').replace(/[\r\n]/g, '');
console.log("配布单详情-扫码结果:", cleanCode);
this.QRBarCode = cleanCode;
this.$nextTick(() => {
this.handleScans();
});
} catch (error) {
console.error("处理扫码结果时出错:", error);
}
},
// 注销扫码广播接收器
unregisterScanBroadcast() {
if (this.scanReceiver) {
try {
const main = plus.android.runtimeMainActivity();
main.unregisterReceiver(this.scanReceiver);
this.scanReceiver = null;
console.log("扫码广播注销成功");
} catch (error) {
console.error("注销扫码广播失败:", error);
}
}
},
SalePickBillDetailScan() {
// 聚焦输入框触发的方法
this.handleScans();
},
// 提交按钮方法
submitBtnFun: function () {
if (this.BillMasterID == 0) {
this.playError();
this.BillDataMessage = "单号为空,不能提交";
return;
}
// 获取配布总匹数和已配匹数进行比较
const totalRoll = parseFloat(this.BillSumRoll.replace('匹', '')); // 配布总匹数
const arrangedRoll = parseFloat(this.BillScanRoll.replace('匹', '')); // 已配匹数
if (arrangedRoll < totalRoll) {
// 如果已配匹数小于总匹数,显示确认弹窗
uni.showModal({
title: '提示',
content: '配布匹数不足,是否确定提交',
cancelText: '取消',
confirmText: '确定',
success: (res) => {
if (res.confirm) {
// 用户点击确定,继续提交
this.submitOrder();
}
}
});
} else {
// 匹数足够,直接提交
this.submitOrder();
}
},
// 新增提交订单的方法
submitOrder: function() {
this.submitLoading = true
this.$u.api.outFpmArrangeOrder({
id: parseInt(this.BillMasterID)
}).then(res => {
this.submitLoading = false
console.log('outFpmArrangeOrder res',res)
if (res) {
this.BillDataMessage = "成功生成出仓单!";
this.playSuccess();
} else {
this.playError();
this.BillDataMessage = "提交生成出仓单出错!" + res.msg;
return;
}
}).catch(error => {
this.submitLoading = false
this.playError();
this.BillDataMessage = "连接服务器出错,请检查后台服务是否启动!";
});
},
},
};
</script>
<style>
page {
background-color: #f8f8f8;
padding-bottom: 260rpx;
}
.u-radio {
width: 200rpx !important;
}
.submitView {
width: 100%;
padding: 16rpx 0 26rpx;
background-color: #ffffff;
position: fixed;
bottom: 0;
left: 0;
border-top: 1rpx solid #f1f1f1;
display: flex;
align-items: center;
justify-content: center;
z-index: 100;
}
.submitBtn {
width: 666rpx;
}
.productBox {
background-color: #ffffff;
margin-top: 32rpx;
padding: 26rpx 0;
}
.tjcpName {
width: 686rpx;
height: 40rpx;
font-size: 16px;
font-weight: bold;
border-left: 6rpx solid #007aff;
padding-left: 12rpx;
margin-left: 26rpx;
margin-top: 26rpx;
}
.cpInput {
width: 150rpx !important;
margin-right: 12rpx;
}
.cpInput > input {
box-sizing: border-box;
border: 1rpx solid #dddddd;
width: 100%;
height: 60rpx;
border-radius: 10rpx;
padding: 0 10rpx;
}
.cpInput1 {
width: 200rpx !important;
margin-right: 12rpx;
}
.cpInput1 > input {
box-sizing: border-box;
border: 1rpx solid #dddddd;
width: 100%;
height: 60rpx;
border-radius: 10rpx;
padding: 0 10rpx;
}
.clearIcon {
position: absolute;
right: 6rpx;
top: 6rpx;
}
.greenPrice {
font-size: 16px;
color: #19be6b !important;
font-weight: bold;
}
.disFlex {
display: flex;
align-items: center;
margin-bottom: 8rpx;
}
.inputName {
color: #adadad;
font-size: 16px;
}
.addHKQS {
display: flex;
align-items: center;
padding: 16rpx 26rpx;
font-size: 15px;
font-weight: bold;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
</style>