master
lion 1 week ago
parent b0863a1fef
commit 43174bc5b4

@ -2,7 +2,8 @@
"version" : "1.0",
"configurations" : [
{
"playground" : "standard",
"customPlaygroundType" : "local",
"playground" : "custom",
"type" : "uni-app:app-android"
}
]

@ -1,23 +1,102 @@
<script>
export default {
onLaunch: function() {
console.log('App Launch')
const token = uni.getStorageSync('token');
if (!token) {
uni.reLaunch({ url: '/pages/login/login' });
} else {
uni.reLaunch({ url: '/pages/index/index' });
}
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<style>
/*每个页面公共css */
</style>
<script>
// plus API
let main = null;
// AppH5plus API
// #ifdef APP-PLUS
if (typeof plus !== 'undefined' && plus.android) {
main = plus.android.runtimeMainActivity();
// UHF退APP
if (uni.getSystemInfoSync().platform == 'android') {
plus.runtime.quit = function() {
setTimeout(() => {
main.finish()
}, 10)
};
}
}
// #endif
var hhwUHFController;
export default {
globalData: {
// AppH5
hhwUHFController: null,
globalEvent: null
},
onLaunch: function() {
console.log('App Launch')
// App
// #ifdef APP-PLUS
this.globalData.hhwUHFController = uni.requireNativePlugin('HL-HHWUHFController');
this.globalData.globalEvent = uni.requireNativePlugin('globalEvent');
// #endif
hhwUHFController = this.globalData.hhwUHFController;
const token = uni.getStorageSync('token');
if (!token) {
uni.reLaunch({ url: '/pages/login/login' });
console.log('App Launch token1234',token)
} else {
uni.reLaunch({ url: '/pages/index/index' });
}
},
onShow: function() {
console.log('App Show')
// UHFAppH5
// #ifdef APP-PLUS
if (hhwUHFController) {
// java
hhwUHFController.setDebuggable(true, result => {
console.log("App Show", "setDebuggable: " + result);
});
// UHF
var enterTime = Date.now();
var outTime = enterTime;
hhwUHFController.initUhf(result => {
outTime = Date.now();
console.log("App Show", "initUHF: " + result, "cusTime: " + (outTime - enterTime));
uni.showToast({
title: '初始化成功',
icon: "none",
duration: 1000
});
});
}
// #endif
// #ifdef H5
console.log('H5端跳过UHF初始化操作');
// #endif
},
onHide: function() {
console.log('App Hide')
// UHFAppH5
// #ifdef APP-PLUS
if (hhwUHFController) {
// UHF
hhwUHFController.closeUhf(result => {
console.log("App Hide", "closeUhf: " + result);
uni.showToast({
title: '关闭成功',
icon: "none",
duration: 1000
});
});
}
// #endif
// #ifdef H5
console.log('H5端跳过UHF关闭操作');
// #endif
}
}
</script>
<style>
/*每个页面公共css */
</style>

@ -51,7 +51,7 @@ export function getMaterialInfo(id) {
const token = uni.getStorageSync('token')
return new Promise((resolve, reject) => {
uni.request({
url: BASE_API + 'api/admin/material-infos/show',
url: BASE_API + 'api/admin/inventory/show',
method: 'GET',
data: {
id,
@ -63,6 +63,23 @@ export function getMaterialInfo(id) {
})
}
// 获取物资数据列表接口
export function getInventoryTaskList(data) {
const token = uni.getStorageSync('token');
return new Promise((resolve, reject) => {
uni.request({
url: BASE_API + 'api/admin/inventory/index',
method: 'GET',
data: {
...data,
token
},
success: resolve,
fail: reject
});
});
}
// 盘点保存接口
export function saveInventoryCheck(data) {
const token = uni.getStorageSync('token')
@ -80,6 +97,39 @@ export function saveInventoryCheck(data) {
})
})
}
// 盘点计划接口
export function getInventoryPlanList(data) {
const token = uni.getStorageSync('token')
return new Promise((resolve, reject) => {
uni.request({
url: BASE_API + 'api/admin/material-infos-plan/index',
method: 'GET',
data: {
...data,
token
},
success: resolve,
fail: reject
})
})
}
// 获取 盘点物资列表
export function getInventoryMaterialList(data) {
const token = uni.getStorageSync('token')
return new Promise((resolve, reject) => {
uni.request({
url: BASE_API + 'api/admin/material-infos-plan-link/index',
method: 'GET',
data: {
...data,
token
},
success: resolve,
fail: reject
})
})
}
// 文件上传接口
export function uploadFile(filePath) {

@ -1,9 +1,9 @@
{
"name" : "stocktaking",
"name" : "应急保障物资盘点",
"appid" : "__UNI__A789D1D",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"versionName" : "1.0.1",
"versionCode" : 101,
"transformPx" : false,
/* 5+App */
"app-plus" : {
@ -17,7 +17,10 @@
"delay" : 0
},
/* */
"modules" : {},
"modules" : {
"Barcode" : {},
"Camera" : {}
},
/* */
"distribute" : {
/* android */
@ -38,12 +41,65 @@
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
],
"minSdkVersion" : 21,
"targetSdkVersion" : 29,
"abiFilters" : [ "armeabi-v7a", "arm64-v8a" ]
},
/* ios */
"ios" : {},
"ios" : {
"dSYMs" : false
},
/* SDK */
"sdkConfigs" : {}
"sdkConfigs" : {},
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi" : "unpackage/res/icons/192x192.png"
},
"ios" : {
"appstore" : "unpackage/res/icons/1024x1024.png",
"ipad" : {
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"notification" : "unpackage/res/icons/20x20.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
},
"iphone" : {
"app@2x" : "unpackage/res/icons/120x120.png",
"app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png"
}
}
}
},
"nativePlugins" : {
"HL-HHWUHFController" : {
"__plugin_info__" : {
"name" : "HHWUHFController",
"description" : "调用超高频的原生插件",
"platforms" : "Android",
"url" : "",
"android_package_name" : "",
"ios_bundle_id" : "",
"isCloud" : false,
"bought" : -1,
"pid" : "",
"parameters" : {}
}
}
}
},
/* */
@ -81,9 +137,9 @@
"enable" : true
}
},
"permission": {
"scope.camera": {
"desc": "用于扫描二维码"
"permission" : {
"scope.camera" : {
"desc" : "用于扫描二维码"
}
}
}

@ -0,0 +1,19 @@
{
"name": "HHWUHFController",
"id": "HL-HHWUHFController",
"version": "1.9",
"description": "调用超高频的原生插件",
"_dp_type":"nativeplugin",
"_dp_nativeplugin":{
"android": {
"plugins": [
{
"type": "module",
"name": "HL-HHWUHFController",
"class": "com.hhw.hl.uhf.HHWUHFController"
}
],
"integrateType": "aar"
}
}
}

@ -29,6 +29,12 @@
"style": {
"navigationBarTitleText": "物资盘点"
}
},
{
"path": "pages/plan-detail/plan-detail",
"style": {
"navigationBarTitleText": "计划详情"
}
}
],
"globalStyle": {

File diff suppressed because it is too large Load Diff

@ -0,0 +1,455 @@
<script setup>
import {
reactive
} from 'vue'
import {
onLoad,
onShow,
onHide
} from "@dcloudio/uni-app"
const page_state = reactive({
btn1Info: "开始盘点",
tagsAmount: 0, //读取到的标签总数
btn2Disabled: false, //禁用按键
btn3Disabled: false, //禁用按键
cbDisabled: false, //是否禁用
dataList: [] // list展示的标签列表首次最多加载offset个待上拉加载更多时加载tempList中的数据
})
var main = plus.android.runtimeMainActivity()
// UHF控制器在App.vue中初始化
var hhwUHFController = getApp().globalData.hhwUHFController
// 事件监听在App.vue中初始化
var globalEvent = getApp().globalData.globalEvent
// 每页加载数量
var pageNum = 100
// 第一页加载的数量/已加载的数量
var offset = 50
// 过滤所用列表只存标签的EPC信息
var epcList = []
// 标签缓存列表,缓存标签信息,等待上拉至列表底部时,按页加载缓存列表中的数据
var tempList = []
// 异步盘点标志
var async_flag = false
// 声音播放标志
var voice_flag = true
var keyDownTime = 1;
var barcode_flag = false;
onLoad(() => {
globalEvent.addEventListener('uhf_tag_event', function(e) {
console.log(e.tag_info_list)
var result = e.tag_info_list
if (result == null) {
// 接收到停止盘点的回调消息
var event = e.inventory_event
if (event == "stopInventory") {
uni.showToast({
title: "停止盘点",
icon: "none"
})
page_state.btn2Disabled = false
page_state.btn3Disabled = false
page_state.cbDisabled = false
page_state.btn1Info = "开始盘点"
}
return
}
// 接收盘点到的标签信息
for (var i = 0; i < result.length; i++) {
var id = i
var epc = bytes2HexString(result[i].EpcId)
var rssi = result[i].RSSI
//获取标签tid配合startEpcTidInventory使用
// var EmbededData = bytes2HexString(result[i].EmbededData)
// console.log("tagEpcTidInventoryByTimer", "epc:" + epc , "Tid: " + EmbededData)
var tag = {
id: id,
epc: epc,
count: 1,
rssi: rssi,
}
var index = epcList.indexOf(epc)
if (index == -1) {
tag.id = epcList.length
if (page_state.dataList.length < offset) {
page_state.dataList.push(tag)
}
tempList.push(tag)
epcList.push(epc)
} else {
tag.id = index
tag.count = tempList[index].count + 1
if (index < page_state.dataList.length) {
page_state.dataList.splice(index, 1, tag)
}
tempList.splice(index, 1, tag)
}
}
page_state.tagsAmount = epcList.length
})
})
onShow(() => {
console.log("inventory Show")
// 初始化二维码扫描,以防扫描服务处于关闭状态,而无法调用扫描
initBarcodeScan()
// 屏蔽二维码扫描扳机以便app可以自定义触发
disableBarcodeScanKey()
// 监听功能按键,触发扫描
var IntentFilter = plus.android.importClass('android.content.IntentFilter')
var filter = new IntentFilter()
filter.addAction("android.rfid.FUN_KEY")
receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive: function(context, intent) {
plus.android.importClass(intent)
var code = intent.getIntExtra("keyCode", 0)
var keyDown = intent.getBooleanExtra("keydown", false)
if (keyDown && keyDownTime == 1 && code == 137) {
console.log("inventory", "receive keyUp code: " + code)
if (barcode_flag) {
// 开始扫描
startBarcodeScan()
} else {
// 开始超高频
startInventory()
}
keyDownTime++
} else if (!keyDown) {
if (barcode_flag) {
// 停止扫描
stopBarcodeScan()
} else {
// 停止超高频
stopInventory()
}
keyDownTime = 1
}
}
})
main.registerReceiver(receiver, filter)
})
onHide(() => {
console.log("inventory Hide")
// 注销按键监听
main.unregisterReceiver(receiver)
})
function disableBarcodeScanKey(){
var Intent = plus.android.importClass("android.content.Intent")
var intent = new Intent("com.rfid.KEY_SET")
var keyValueArray = ["137"]
intent.putExtra("keyValueArray", keyValueArray)
intent.putExtra("137", false)
main.sendBroadcast(intent)
}
//字节数组转十六进制字符
function bytes2HexString(byteArray) {
return Array.from(byteArray, function(byte) {
return ('0' + (byte & 0xFF).toString(16)).slice(-2)
}).join('')
}
//十六进制字符串转字节数组
function hexString2Bytes(str) {
var pos = 0
var len = str.length
if (len % 2 != 0) {
return null
}
len /= 2
var hexA = new Array()
for (var i = 0; i < len; i++) {
var s = str.substr(pos, 2)
var v = parseInt(s, 16)
hexA.push(v)
pos += 2
}
return hexA
}
// 初始化二维码扫描
function initBarcodeScan() {
var Intent = plus.android.importClass("android.content.Intent")
var intent = new Intent("com.rfid.SCAN_INIT")
main.sendBroadcast(intent);
}
// 触发二维码扫描
function startBarcodeScan() {
var Intent = plus.android.importClass("android.content.Intent")
var intent = new Intent("com.rfid.SCAN_CMD")
main.sendBroadcast(intent);
}
// 暂停二维码扫描
function stopBarcodeScan() {
var Intent = plus.android.importClass("android.content.Intent")
var intent = new Intent("com.rfid.STOP_SCAN")
main.sendBroadcast(intent);
}
function inventory() {
if (page_state.btn1Info == "开始盘点") {
startInventory()
} else {
stopInventory()
}
}
function startInventory() {
page_state.btn2Disabled = true
page_state.btn3Disabled = true
page_state.cbDisabled = true
page_state.btn1Info = "停止盘点"
hhwUHFController.setCancleInventoryFilter();
// 盘点过滤数据
//var fdata = hexString2Bytes("0b54c56384b36fdd5204e9d1")
// 盘点过滤数据区域1 => EPC区2 => TID区3 => USER区
//var fbank = 1
// 盘点过滤起始地址指标签数据区域的起始地址比如3代表从标签数据区的第3*2个字节开始匹配数据EPC区需要从2开始详情参考“标签读写注意事项”中关于EPC区数据结构的描述
//var fstartaddr = 2
// 显示匹配的标签或不匹配的标签。true => 显示匹配的标签false => 显示不匹配的标签
//var matching = true
// 设置盘点过滤条件
//hhwUHFController.setInventoryFilter(fdata, fbank, fstartaddr, matching, result => {
// console.log("inventory inventory", "setInventoryFilter " + result)
//})
if (async_flag) {
// 设置盘点的session为1
// console.log("inventory inventory", "async setGen2session: " + result)
// 大量标签场景200张标签以上开始异步盘点手动调用停止盘点后停止盘点
hhwUHFController.startInventory(30, 1, true, 0, voice_flag, result => {
console.log("inventory inventory", "startInventory " + result)
})
// })
} else {
// 设置盘点的session为0
console.log("async_flag")
// 少量标签场景200张标签以下开始同步盘点手动调用停止盘点后停止盘点
hhwUHFController.startInventory(30,0, false, 0, voice_flag, result => {
console.log("inventory inventory", "startInventory " + result)
})
}
// })
}
function stopInventory() {
// 停止盘点注意stopInventory中的参数值需要和startInventory第一个参数值对应
if (async_flag) {
hhwUHFController.stopInventory(true)
} else {
hhwUHFController.stopInventory(false)
}
}
var data = "3600"
function clear() {
page_state.dataList = []
tempList = []
epcList = []
page_state.tagsAmount = 0
offset = 50
// hhwUHFController.writeTagDataByFilter(3 , 0 , "eac345678" , hexString2Bytes("12345678").length , "00000000"
// , 1000 , "e710" , 1 , 2 , true , result=> {
// // int mbank, 写入标签的区域0:RESERVED区1:EPC区2:TID区3:USER区
// // int startaddress, 写入标签的起始地址单位1word = 2byte
// // String data, 写入的数据
// // int len, 写入标签数据的长度单位word
// // String epc, 标签EPC号
// console.log("write"+data,result)
// })
// hhwUHFController.getTagDataByFilter(3 , 0 , 2 , "00000000", 1000 , "e710" , 1 , 2 , true , result=> {
// // int mbank, 读取标签的区域0:RESERVED区1:EPC区2:TID区3:USER区
// // int startaddress, 读标签的起始地址单位1word = 2byte
// // int len, 要读取的标签数据的长度单位word
// // String epc, 要读取的标签的EPC号
// console.log("read data", bytes2HexString(result)) //读取标签数据
// })
// hhwUHFController.writeTagEPCByFilter("e710" , "00000000", 1000 ,"e310" , 1 , 2 , true ,result=> {
// console.log("write EPC:" + data,result)
// })
}
function inventoryTimer() {
uni.showToast({
title: "开启10S定时盘点",
icon: "none"
})
page_state.btn2Disabled = true
page_state.btn3Disabled = true
page_state.cbDisabled = true
page_state.btn1Info = "停止盘点"
// 取消盘点过滤
//hhwUHFController.setCancleInventoryFilter(result => {
// console.log("inventory inventoryTimer", "setCancleInventoryFilter: " + result)
//})
if (async_flag) {
// 设置盘点的session为1
// hhwUHFController.setGen2session(1, result => {
// console.log("inventory inventoryTimer", "async setGen2session: " + result)
// 大量标签场景200张标签以上开始异步盘点10000ms后自动停止盘点
// hhwUHFController.startInventory(true, 10000, voice_flag)
hhwUHFController.startInventory(30, 1, true, 10000, voice_flag, result => {
console.log("inventory inventory", "startInventory " + result)
})
// })
} else {
// 设置盘点的session为0
// hhwUHFController.setGen2session(0, result => {
// console.log("inventory inventoryTimer", "sync setGen2session: " + result)
// 少量标签场景200张标签以下开始同步盘点10000ms后自动停止盘点
// hhwUHFController.startInventory(false, 10000, voice_flag)
hhwUHFController.startInventory(30, 0, false, 10000, voice_flag, result => {
console.log("inventory inventory", "startInventory " + result)
})
// })
}
// })
}
function loadmore() {
console.log("inventory loadmore", "dataList size1: " + page_state.dataList.length, "temList size: " + tempList.length)
if (page_state.dataList.length >= tempList.length) {
console.log("inventory loadmore", "nomore")
return
}
// 每次加载pageNum个
var size
if (tempList.length - offset >= pageNum) {
size = pageNum
} else {
size = tempList.length - offset
}
for (var i = offset; i < size + offset; i++) {
page_state.dataList.push(tempList[i])
}
offset = offset + size
}
</script>
<template>
<list class="list" loadmoreoffset="5" @loadmore="loadmore()">
<header>
<view class="list-item-head">
<text class="list-item-text-id">id</text>
<text class="list-item-text-epc">epc</text>
<text class="list-item-text-count">count</text>
<text class="list-item-text-rssi">rssi</text>
</view>
</header>
<cell v-for="(item, index) in page_state.dataList" v-bind:key="item.id" @click="onclick">
<view class="list-item">
<text class="list-item-text-id">{{item.id}}</text>
<text class="list-item-text-epc">{{item.epc}}</text>
<text class="list-item-text-count">{{item.count}}</text>
<text class="list-item-text-rssi">{{item.rssi}}</text>
</view>
</cell>
</list>
<view style="flex-direction: row;padding: 8rpx;align-items: center;margin-top: 5rpx;margin-bottom: 5rpx;">
<text>标签数量:</text>
<text>{{page_state.tagsAmount}}</text>
<checkbox-group style="flex-direction:row;padding-left: 20rpx;"
v-on:change="e => async_flag = e.detail.value[0] ==='async_checkbox'">
<label style="flex-direction: row">
<checkbox value="async_checkbox" :disabled="page_state.cbDisabled" />
<view style="margin-left: 3rpx;">异步</view>
</label>
</checkbox-group>
<checkbox-group style="flex-direction:row;padding-left: 20rpx;"
v-on:change="e => voice_flag = e.detail.value[0] === 'voice_checkbox'">
<label style="flex-direction: row;padding-left: 5px;">
<checkbox value="voice_checkbox" :disabled="page_state.cbDisabled" :checked="true" />
<view style="margin-left: 3rpx;">声音</view>
</label>
</checkbox-group>
<checkbox-group style="flex-direction:row;padding-left: 20rpx;"
v-on:change="e => barcode_flag = e.detail.value[0] === 'barcode_checkbox'">
<label style="flex-direction: row;padding-left: 5px;">
<checkbox value="barcode_checkbox" :disabled="page_state.cbDisabled" :checked="false" />
<view style="margin-left: 3rpx;">手柄扫码</view>
</label>
</checkbox-group>
</view>
<view class="btn-box">
<button type="primary" @click="inventory()" style="flex: 3;">{{page_state.btn1Info}}</button>
<button type="primary" :disabled="page_state.btn2Disabled" @click="inventoryTimer()"
style="flex: 3;margin-left: 5px;">定时盘点</button>
<button type="primary" :disabled="page_state.btn3Disabled" @click="clear()"
style="flex: 1;margin-left: 5px;">清空</button>
</view>
</template>
<style scoped>
.list {
flex: 1;
background-color: #ebebeb;
}
.list-item-head {
display: flex;
flex-direction: row;
background-color: #fff;
}
.list-item {
display: flex;
flex-direction: row;
background-color: #fff;
}
.list-item-text-id {
width: 65px;
padding-left: 5px;
padding-right: 5px;
padding-top: 8px;
padding-bottom: 8px;
font-size: 16px;
}
.list-item-text-epc {
width: 247px;
padding-left: 5px;
padding-right: 5px;
padding-top: 8px;
padding-bottom: 8px;
font-size: 16px;
}
.list-item-text-count {
width: 65px;
padding-left: 5px;
padding-right: 5px;
padding-top: 8px;
padding-bottom: 8px;
font-size: 16px;
}
.list-item-text-rssi {
width: 35px;
padding-left: 5px;
padding-right: 5px;
padding-top: 8px;
padding-bottom: 8px;
font-size: 16px;
}
.btn-box {
display: flex;
flex-direction: row;
background-color: #fff;
padding-bottom: 5px;
padding-left: 5px;
padding-right: 5px;
align-items: center;
}
</style>

@ -2,22 +2,118 @@
<view class="inventory-bg">
<view class="inventory-card">
<view class="readonly-group">
<view class="readonly-item">
<text class="readonly-label">一级分类</text>
<text class="readonly-value">{{ firstCategory }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">二级分类</text>
<text class="readonly-value">{{ secondCategory }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">所属种类</text>
<text class="readonly-value">{{ categoryName }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">物资名称</text>
<text class="readonly-value">{{ materialName }}</text>
</view>
<view class="readonly-item">
<!-- <view class="readonly-item">
<text class="readonly-label">物质代码</text>
<text class="readonly-value">{{ materialCode }}</text>
</view> -->
<view class="readonly-item">
<text class="readonly-label">物资类型</text>
<text class="readonly-value">{{ materialType }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">规格型号</text>
<text class="readonly-label">物资型号</text>
<text class="readonly-value">{{ materialSpec }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">库存数量</text>
<text class="readonly-label">物资规格</text>
<text class="readonly-value">{{ materialSize }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">单位</text>
<text class="readonly-value">{{ unit }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">入库批次</text>
<text class="readonly-value">{{ batchNumber }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">在库数量</text>
<text class="readonly-value">{{ stockQty }}{{ unit ? ' ' + unit : '' }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">顺序号</text>
<text class="readonly-value">{{ sequenceNumber }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">待出库</text>
<text class="readonly-value">{{ waitNum }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">生产日期</text>
<text class="readonly-value">{{ productionDate }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">入库日期</text>
<text class="readonly-value">{{ storageDate }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">物资状态</text>
<text class="readonly-value">{{ materialStatus }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">储备方式</text>
<text class="readonly-value">{{ reserveMethod }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">所在仓库</text>
<view class="readonly-value">{{ warehouseName }}</view>
</view>
<view class="readonly-item">
<text class="readonly-label">所在货架</text>
<text class="readonly-value">{{ shelfName }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">所在货架层</text>
<text class="readonly-value">{{ shelfLayer }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">等级分类</text>
<text class="readonly-value">{{ levelCategory }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">产权信息</text>
<text class="readonly-value">{{ propertyInfo }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">是否为固定资产</text>
<text class="readonly-value">{{ isFixedAsset }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">固定资产编码</text>
<text class="readonly-value">{{ fixedAssetCode }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">储备年限</text>
<text class="readonly-value">{{ reserveYears }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">存放要求</text>
<text class="readonly-value">{{ storageRequirement }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">维护要求</text>
<text class="readonly-value">{{ maintenanceRequirement }}</text>
</view>
<view class="readonly-item">
<text class="readonly-label">保养频次</text>
<text class="readonly-value">{{ maintenanceFrequency }}</text>
</view>
</view>
<view class="form-group" v-if="!isViewMode">
<text class="form-label">盘点数量</text>
@ -58,10 +154,37 @@ export default {
remark: '',
photo: '',
photos: [],
materialName: '',
materialSpec: '',
unit: '',
materialCode: '',
material_info_id:'',
//
firstCategory: '-',
secondCategory: '-',
categoryName: '-',
materialName: '-',
materialCode: '-',
materialType: '-',
materialSpec: '-',
materialSize: '-',
unit: '-',
//
batchNumber: '-',
sequenceNumber: '-',
waitNum: '-',
//
productionDate: '-',
storageDate: '-',
materialStatus: '-',
reserveMethod: '-',
warehouseName: '-',
shelfName: '-',
shelfLayer: '-',
levelCategory: '-',
propertyInfo: '-',
isFixedAsset: '-',
fixedAssetCode: '-',
reserveYears: '-',
storageRequirement: '-',
maintenanceRequirement: '-',
maintenanceFrequency: '-',
material_infos_plan_id: '',
materialId: ''
}
@ -75,12 +198,109 @@ export default {
getMaterialInfo(this.materialId).then(response => {
console.log("response:", response);
if (response.data) {
this.materialName = response.data.zichanmingcheng || '-'
this.materialSpec = response.data.guigexinghao || '-'
this.unit = response.data.jiliangdanwei || '-'
this.materialCode = response.data.wuzibianma || '-'
this.material_infos_plan_id = response.data.material_infos_plan_id || ''
this.stockQty = response.data.inventorys_total || '0'
const data = response.data;
this.material_info_id = data.wuzibianma_material_infos_wuzibianma_relation.id;
const relation = data.wuzibianma_material_infos_wuzibianma_relation || {};
const fenleiDetail = relation.fenlei_detail || {};
const wuzizhuangtaiDetail = data.wuzizhuangtai_detail || {};
const chubeifangshiDetail = data.chubeifangshi_detail || {};
const dengjifenleiDetail = data.dengjifenlei_detail || {};
const chanquanxinxiDetail = data.chanquanxinxi_detail || {};
const materialstorages = data.materialstorages || {};
const shelfs = data.shelfs || {};
const equipmentMaintainConfig = data.equipment_maintain_config || {};
//
// - material_info_type
const materialInfoType = data.material_info_type || '';
if (materialInfoType) {
const parts = materialInfoType.split('-');
this.firstCategory = parts[0] || '-';
this.secondCategory = parts.length > 1 ? parts[1] : parts[0] || '-';
}
//
this.categoryName = fenleiDetail.name || '-';
//
this.materialName = data.zichanmingcheng || '-';
//
this.materialCode = data.wuzibianma || '-';
//
this.materialType = data.wuzileixing || '-';
//
this.materialSpec = relation.guigexinghao || data.guigexinghao || '-';
//
this.materialSize = relation.wuziguige || '-';
//
this.unit = relation.jiliangdanwei || data.jiliangdanwei || '-';
//
//
this.batchNumber = data.rukupici || '-';
//
this.stockQty = data.zaikushuliang || data.inventorys_total || '0';
//
this.sequenceNumber = data.shunxuhao || '-';
//
this.waitNum = data.wait_num || '-';
//
//
this.productionDate = data.shengchanriqi || '-';
//
this.storageDate = data.rukuriqi || '-';
//
this.materialStatus = wuzizhuangtaiDetail.value || '-';
//
this.reserveMethod = chubeifangshiDetail.value || '-';
//
this.warehouseName = materialstorages.cangkumingcheng || '-';
//
this.shelfName = shelfs.huojiamingcheng || '-';
//
this.shelfLayer = data.huojiaceng || '-';
//
this.levelCategory = dengjifenleiDetail.value || '-';
//
this.propertyInfo = chanquanxinxiDetail.value || '-';
//
this.isFixedAsset = data.shifouweigudingzichan || '-';
//
this.fixedAssetCode = data.gudingzichanbianma || '-';
//
this.reserveYears = data.chubeinianxian || '-';
//
this.storageRequirement = data.cunfangyaoqiu || '-';
//
this.maintenanceRequirement = data.weihuyaoqiu || '-';
//
this.maintenanceFrequency = equipmentMaintainConfig.name || '-';
// material_infos_plan_id
this.material_infos_plan_id = data.material_infos_plan_id || '';
} else {
uni.showToast({ title: '未获取到物资信息', icon: 'none' })
}
@ -140,7 +360,7 @@ export default {
// 2.
const data = {
status: '1',
material_info_id: this.materialId, // id
inventorys_id:this.materialId,
check_num: this.countQty,
remark: this.remark,
file_ids
@ -202,12 +422,15 @@ export default {
.readonly-label {
color: #666;
font-size: 28rpx;
width:20%;
}
.readonly-value {
color: #333;
font-size: 28rpx;
font-weight: 500;
text-align: right;
width:75%;
}
.form-group {

@ -0,0 +1,623 @@
<template>
<scroll-view class="plan-detail-container" scroll-y @scrolltolower="loadMoreMaterials" lower-threshold="100"
@refresherrefresh="refreshMaterials" refresher-enabled="true" :refresher-triggered="materialLoading">
<!-- 计划信息卡片 -->
<view class="plan-info-card">
<view class="plan-info-header">
<text class="plan-info-title">盘点计划详情</text>
</view>
<view class="plan-info-content">
<view class="info-row">
<view class="info-item">
<text class="info-label">计划名称</text>
<text class="info-value">{{planInfo.name || '暂无'}}</text>
</view>
<view class="info-item">
<text class="info-label">计划编号</text>
<text class="info-value">{{planInfo.no || '暂无'}}</text>
</view>
</view>
<view class="info-row">
<view class="info-item">
<text class="info-label">盘点类型</text>
<text class="info-value type-text">{{getTypeText(planInfo.type)}}</text>
</view>
<view class="info-item">
<text class="info-label">物资数量</text>
<text class="info-value count-text">{{planInfo.chart_total || 0}} </text>
</view>
</view>
<view class="info-row">
<view class="info-item">
<text class="info-label">开始时间</text>
<text class="info-value">{{formatDate(planInfo.start_date)}}</text>
</view>
<view class="info-item">
<text class="info-label">结束时间</text>
<text class="info-value">{{formatDate(planInfo.end_date)}}</text>
</view>
</view>
<view class="status-row">
<view class="status-item">
<text class="status-label">计划状态</text>
<view class="status-badge" :class="'status-' + planInfo.status">
<text class="status-text">{{getStatusText(planInfo.status)}}</text>
</view>
</view>
</view>
</view>
</view>
<!-- 物资列表 -->
<view class="material-list-card">
<view class="material-list-header">
<text class="material-list-title">盘点物资列表</text>
<text class="material-count"> {{materialTotal}} </text>
</view>
<!-- 表头 -->
<view class="material-list">
<view class="material-item" style="font-weight:600;">
<view class="material-info material-name-col">
<text class="material-name">物资名称</text>
</view>
<view class="material-info material-model-col">
<text class="material-time">物资型号</text>
</view>
<view class="material-info material-spec-col">
<text class="material-time">物资规格</text>
</view>
<view class="material-info material-status-col">
<text class="material-time">状态</text>
</view>
<view class="material-info material-action-col">
<text class="material-time">操作</text>
</view>
</view>
<!-- 数据行 -->
<view class="material-item" v-for="item in materialList" :key="item.id">
<view class="material-info material-name-col">
<text class="material-name">{{item.inventory?.zichanmingcheng || '未知物资'}}</text>
</view>
<view class="material-info material-model-col">
<text class="material-time">{{item.inventory?.guigexinghao || '暂无'}}</text>
</view>
<view class="material-info material-spec-col">
<text class="material-time">{{item.inventory?.wuziguige || '暂无'}}</text>
</view>
<view class="material-info material-status-col">
<text class="material-status" :class="'status-' + (item.status || 0)">{{getInventoryStatusText(item.status)}}</text>
</view>
<view class="material-info material-action-col">
<view class="inventory-action-btn" @click.stop="startInventory(item)">
<text class="inventory-btn-text">盘点</text>
</view>
</view>
</view>
</view>
<!-- 加载更多提示 -->
<view class="load-more" v-if="materialLoading">
<view class="loading-spinner"></view>
<text class="loading-text">加载中...</text>
</view>
<view class="load-more" v-else-if="!materialHasMore && materialList.length > 0">
<text class="no-more-text"> 没有更多数据了 </text>
</view>
</view>
</scroll-view>
</template>
<script>
import { getInventoryMaterialList } from '@/api.js';
export default {
data() {
return {
planId: null, // ID
planInfo: {}, //
materialList: [], //
materialPage: 1, //
materialPageSize: 10, //
materialTotal: 0, //
materialLoading: false, //
materialHasMore: true //
}
},
onLoad(options) {
//
if (options.planInfo) {
try {
this.planInfo = JSON.parse(decodeURIComponent(options.planInfo));
this.planId = this.planInfo.id;
} catch (e) {
console.error('解析计划信息失败:', e);
}
}
if (options.planId) {
this.planId = options.planId;
}
//
uni.setNavigationBarTitle({
title: this.planInfo.name || '盘点计划详情'
});
//
this.getMaterialList(true);
},
methods: {
//
async getMaterialList(isRefresh = false) {
if (this.materialLoading || !this.planId) return;
try {
this.materialLoading = true;
//
if (isRefresh) {
this.materialPage = 1;
this.materialHasMore = true;
}
const params = {
page: this.materialPage,
page_size: this.materialPageSize,
'filter[0][key]': 'material_infos_plan_id',
'filter[0][op]': 'eq',
'filter[0][value]': this.planId
};
const res = await getInventoryMaterialList(params);
console.log("物资列表响应:", res);
//
if(res.data && res.data.errcode === 40001){
uni.showToast({
title: res.data?.errmsg || '获取物资列表失败',
icon: 'none'
});
uni.reLaunch({
url: '/pages/login/login'
});
return;
}
if (res.data && res.data.list) {
const data = res.data.list;
const newList = data.data || [];
if (isRefresh) {
this.materialList = newList;
} else {
this.materialList = [...this.materialList, ...newList];
}
this.materialTotal = data.total || 0;
this.materialHasMore = newList.length === this.materialPageSize;
if (this.materialHasMore) {
this.materialPage++;
}
} else {
uni.showToast({
title: res.data?.message || '获取物资列表失败',
icon: 'none'
});
}
} catch (error) {
console.error('获取物资列表失败:', error);
uni.showToast({
title: '获取物资列表失败',
icon: 'none'
});
} finally {
this.materialLoading = false;
}
},
//
refreshMaterials() {
this.getMaterialList(true);
},
//
loadMoreMaterials() {
if (!this.materialHasMore || this.materialLoading) return;
this.getMaterialList(false);
},
//
getStatusText(status) {
const statusMap = {
0: '未开始',
1: '进行中',
2: '已完成'
};
return statusMap[status] || '未知状态';
},
//
getTypeText(type) {
const typeMap = {
1: '年度',
2: '季度'
};
return typeMap[type] || '未知类型';
},
//
getInventoryStatusText(status) {
const statusMap = {
0: '待盘点',
1: '已盘点'
};
return statusMap[status] || '待盘点';
},
//
formatDate(dateStr) {
if (!dateStr) return '';
const date = new Date(dateStr);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
},
//
startInventory(item) {
console.log('开始盘点物资:', item);
// uni.showToast({
// title: `: ${item.name}`,
// icon: 'none'
// });
if(item.inventorys_id){
uni.navigateTo({
url: `/pages/inventory/inventory?code=${item.inventorys_id}`
});
}else{
uni.showToast({
title: '暂无盘点信息',
icon: 'none'
});
}
}
}
}
</script>
<style>
.plan-detail-container {
height: 100vh;
background: #f5f5f5;
padding: 20rpx;
box-sizing: border-box;
width: 100%;
}
/* 计划信息卡片样式 */
.plan-info-card {
background: #fff;
border-radius: 22rpx;
box-shadow: 0 4px 18px rgba(64,158,255,0.07);
padding: 28rpx 24rpx;
margin-bottom: 24rpx;
}
.plan-info-header {
margin-bottom: 24rpx;
padding-bottom: 16rpx;
border-bottom: 2px solid #f0f0f0;
}
.plan-info-title {
font-size: 32rpx;
color: #222;
font-weight: 700;
}
.plan-info-content {
display: flex;
flex-direction: column;
gap: 20rpx;
}
.info-row {
display: flex;
justify-content: space-between;
gap: 20rpx;
}
.info-item {
flex: 1;
display: flex;
flex-direction: column;
gap: 8rpx;
}
.info-label {
font-size: 22rpx;
color: #999;
font-weight: 500;
}
.info-value {
font-size: 26rpx;
color: #333;
font-weight: 600;
}
.type-text {
color: #409eff;
}
.count-text {
color: #52c41a;
}
.status-row {
display: flex;
justify-content: center;
margin-top: 16rpx;
}
.status-item {
display: flex;
flex-direction: column;
align-items: center;
gap: 12rpx;
}
.status-label {
font-size: 22rpx;
color: #999;
font-weight: 500;
}
.status-badge {
padding: 12rpx 24rpx;
border-radius: 24rpx;
font-size: 24rpx;
font-weight: 600;
}
.status-badge.status-0 {
background: linear-gradient(135deg, #fff3e0, #ffe0b2);
color: #f57c00;
border: 1px solid #ffcc80;
}
.status-badge.status-1 {
background: linear-gradient(135deg, #e3f2fd, #bbdefb);
color: #1976d2;
border: 1px solid #90caf9;
}
.status-badge.status-2 {
background: linear-gradient(135deg, #e8f5e9, #c8e6c9);
color: #388e3c;
border: 1px solid #a5d6a7;
}
/* 物资列表卡片样式 */
.material-list-card {
background: #fff;
border-radius: 22rpx;
box-shadow: 0 4px 18px rgba(64,158,255,0.07);
padding: 28rpx 24rpx 18rpx 24rpx;
flex: 1;
width: 100%;
box-sizing: border-box;
overflow: hidden;
}
.material-list-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 18rpx;
}
.material-list-title {
font-size: 28rpx;
color: #222;
font-weight: 700;
}
.material-count {
font-size: 24rpx;
color: #409eff;
font-weight: 600;
}
/* 空状态样式 */
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 300rpx;
color: #999;
}
.empty-text {
font-size: 28rpx;
margin-bottom: 10rpx;
}
.empty-desc {
font-size: 22rpx;
}
/* 物资列表表格样式 */
.material-list {
display: flex;
flex-direction: column;
gap: 14rpx;
}
.material-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 14rpx 0;
border-bottom: 1px solid #f0f0f0;
width: 100%;
box-sizing: border-box;
}
.material-item:last-child {
border-bottom: none;
}
.material-info {
display: flex;
flex-direction: column;
align-items: flex-start;
overflow: hidden;
}
.material-name-col {
flex: 1;
min-width: 0;
max-width: 200rpx;
}
.material-model-col {
width: 180rpx;
min-width: 0;
}
.material-spec-col {
width: 120rpx;
min-width: 0;
}
.material-status-col {
width: 100rpx;
align-items: center;
}
.material-action-col {
width: 100rpx;
display: flex;
justify-content: flex-end;
align-items: center;
}
.material-name {
font-size: 24rpx;
color: #333;
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 100%;
}
.material-time {
font-size: 20rpx;
color: #999;
margin-top: 2rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 100%;
}
.material-status {
font-size: 18rpx;
padding: 4rpx 10rpx;
border-radius: 16rpx;
white-space: nowrap;
}
.material-status.status-0 {
background-color: #fff7e6;
color: #fa8c16;
}
.material-status.status-1 {
background-color: #e8f5e9;
color: #388e3c;
}
.completed-text {
color: #388e3c;
font-size: 20rpx;
font-weight: 500;
}
.inventory-action-btn {
background: linear-gradient(135deg, #409eff, #66b1ff);
color: #fff;
border: none;
border-radius: 16rpx;
padding: 8rpx 16rpx;
font-size: 22rpx;
font-weight: 500;
box-shadow: 0 2px 8px rgba(64,158,255,0.3);
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
min-width: 80rpx;
}
.inventory-action-btn:active {
transform: scale(0.95);
box-shadow: 0 1px 4px rgba(64,158,255,0.4);
opacity: 0.9;
}
.inventory-btn-text {
color: #fff;
font-size: 22rpx;
font-weight: 500;
}
/* 加载更多样式 */
.load-more {
display: flex;
align-items: center;
justify-content: center;
gap: 12rpx;
padding: 30rpx 20rpx;
font-size: 24rpx;
color: #999;
}
.loading-spinner {
width: 32rpx;
height: 32rpx;
border: 3rpx solid #f0f0f0;
border-top: 3rpx solid #409eff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.loading-text {
color: #409eff;
font-weight: 500;
}
.no-more-text {
color: #ccc;
font-size: 22rpx;
}
</style>

Binary file not shown.

@ -0,0 +1 @@
https://app.liuyingyong.cn/build/download/20f32500-cc0f-11f0-ac67-d98be73d179c

File diff suppressed because one or more lines are too long

@ -0,0 +1,4 @@
andrCertfile=/Applications/HBuilderX.app/Contents/HBuilderX/plugins/app-safe-pack/Test.keystore
andrCertAlias=android
andrCertPass=ep/Tdjka4Y7WYqDB6/S7dw==
storePassword=ep/Tdjka4Y7WYqDB6/S7dw==

@ -0,0 +1,4 @@
[General]
andrCertAlias=__UNI__A789D1D
andrCertPass="CbM6HvRQDpyme/yqAbmNVA=="
andrCertfile=package.keystore

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>View</title>
<link rel="icon" href="data:,">
<link rel="stylesheet" href="app.css" />
<script>var __uniConfig = {"globalStyle":{},"darkmode":false}</script>
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
</head>
<body>
<div id="app"></div>
<script src="uni-app-view.umd.js"></script>
</body>
</html>

@ -0,0 +1,11 @@
;(function(){
let u=void 0,isReady=false,onReadyCallbacks=[],isServiceReady=false,onServiceReadyCallbacks=[];
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#F8F8F8","navigationBar":{"backgroundColor":"#F8F8F8","titleText":"物资盘点","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"应急保障物资盘点","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"4.76","entryPagePath":"pages/index/index","entryPageQuery":"","realEntryPagePath":"","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"tabBar":{"position":"bottom","color":"#999999","selectedColor":"#007AFF","borderStyle":"black","blurEffect":"none","fontSize":"10px","iconWidth":"24px","spacing":"3px","height":"50px","list":[{"pagePath":"pages/index/index","text":"盘点","iconPath":"/static/tabbar/inventory.png","selectedIconPath":"/static/tabbar/inventory-active.png"},{"pagePath":"pages/profile/profile","text":"个人中心","iconPath":"/static/tabbar/profile.png","selectedIconPath":"/static/tabbar/profile-active.png"}],"backgroundColor":"#ffffff","selectedIndex":0,"shown":true},"locales":{},"darkmode":false,"themeConfig":{}};
const __uniRoutes = [{"path":"pages/index/index","meta":{"isQuit":true,"isEntry":true,"isTabBar":true,"tabBarIndex":0,"navigationBar":{"titleText":"物资盘点","type":"default"},"isNVue":false}},{"path":"pages/profile/profile","meta":{"isQuit":true,"isTabBar":true,"tabBarIndex":1,"navigationBar":{"titleText":"个人中心","type":"default"},"isNVue":false}},{"path":"pages/login/login","meta":{"navigationBar":{"titleText":"登录","type":"default"},"isNVue":false}},{"path":"pages/scan/scan","meta":{"navigationBar":{"titleText":"扫码盘点","type":"default"},"isNVue":false}},{"path":"pages/inventory/inventory","meta":{"navigationBar":{"titleText":"物资盘点","type":"default"},"isNVue":false}},{"path":"pages/plan-detail/plan-detail","meta":{"navigationBar":{"titleText":"计划详情","type":"default"},"isNVue":false}}].map(uniRoute=>(uniRoute.meta.route=uniRoute.path,__uniConfig.pages.push(uniRoute.path),uniRoute.path='/'+uniRoute.path,uniRoute));
__uniConfig.styles=[];//styles
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:16})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:u,window:u,document:u,frames:u,self:u,location:u,navigator:u,localStorage:u,history:u,Caches:u,screen:u,alert:u,confirm:u,prompt:u,fetch:u,XMLHttpRequest:u,WebSocket:u,webkit:u,print:u}}}});
})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
{"@platforms":["android","iPhone","iPad"],"id":"__UNI__A789D1D","name":"应急保障物资盘点","version":{"name":"1.0.1","code":101},"description":"","developer":{"name":"","email":"","url":""},"permissions":{"Barcode":{},"Camera":{},"UniNView":{"description":"UniNView原生渲染"}},"plus":{"useragent":{"value":"uni-app","concatenate":true},"splashscreen":{"autoclose":true,"delay":0,"target":"id:1","waiting":true},"popGesture":"close","launchwebview":{"id":"1","kernel":"WKWebview"},"usingComponents":true,"nvueStyleCompiler":"uni-app","compilerVersion":3,"distribute":{"icons":{"android":{"hdpi":"icon-android-hdpi.png","xhdpi":"icon-android-xhdpi.png","xxhdpi":"icon-android-xxhdpi.png","xxxhdpi":"icon-android-xxxhdpi.png"},"ios":{"appstore":"unpackage/res/icons/1024x1024.png","ipad":{"app":"unpackage/res/icons/76x76.png","app@2x":"unpackage/res/icons/152x152.png","notification":"unpackage/res/icons/20x20.png","notification@2x":"unpackage/res/icons/40x40.png","proapp@2x":"unpackage/res/icons/167x167.png","settings":"unpackage/res/icons/29x29.png","settings@2x":"unpackage/res/icons/58x58.png","spotlight":"unpackage/res/icons/40x40.png","spotlight@2x":"unpackage/res/icons/80x80.png"},"iphone":{"app@2x":"unpackage/res/icons/120x120.png","app@3x":"unpackage/res/icons/180x180.png","notification@2x":"unpackage/res/icons/40x40.png","notification@3x":"unpackage/res/icons/60x60.png","settings@2x":"unpackage/res/icons/58x58.png","settings@3x":"unpackage/res/icons/87x87.png","spotlight@2x":"unpackage/res/icons/80x80.png","spotlight@3x":"unpackage/res/icons/120x120.png"},"prerendered":"false"}},"google":{"abiFilters":["armeabi-v7a","arm64-v8a"],"minSdkVersion":21,"permissions":["<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>","<uses-permission android:name=\"android.permission.VIBRATE\"/>","<uses-permission android:name=\"android.permission.READ_LOGS\"/>","<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>","<uses-feature android:name=\"android.hardware.camera.autofocus\"/>","<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.CAMERA\"/>","<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>","<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>","<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>","<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>","<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>","<uses-feature android:name=\"android.hardware.camera\"/>","<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"],"targetSdkVersion":29,"packagename":"uni.app.UNIA789D1D","custompermissions":true},"apple":{"dSYMs":false,"devices":"universal"},"plugins":{"audio":{"mp3":{"description":"Android平台录音支持MP3格式文件"}}},"orientation":"portrait-primary"},"nativePlugins":{"HL-HHWUHFController":{}},"statusbar":{"immersed":"supportedDevice","style":"dark","background":"#F8F8F8"},"uniStatistics":{"enable":false},"allowsInlineMediaPlayback":true,"safearea":{"background":"#ffffff","bottom":{"offset":"auto"}},"uni-app":{"control":"uni-v3","vueVersion":"3","compilerVersion":"4.76","nvueCompiler":"uni-app","renderer":"auto","nvue":{"flex-direction":"column"},"nvueLaunchMode":"normal","webView":{"minUserAgentVersion":"49.0"}},"tabBar":{"position":"bottom","color":"#999999","selectedColor":"#007AFF","borderStyle":"rgba(0,0,0,0.4)","blurEffect":"none","fontSize":"10px","iconWidth":"24px","spacing":"3px","height":"50px","list":[{"pagePath":"pages/index/index","text":"盘点","iconPath":"/static/tabbar/inventory.png","selectedIconPath":"/static/tabbar/inventory-active.png"},{"pagePath":"pages/profile/profile","text":"个人中心","iconPath":"/static/tabbar/profile.png","selectedIconPath":"/static/tabbar/profile-active.png"}],"backgroundColor":"#ffffff","selectedIndex":0,"shown":true,"child":["lauchwebview"],"selected":0},"adid":"122299150103"},"app-harmony":{"useragent":{"value":"uni-app","concatenate":true},"uniStatistics":{"enable":false},"safearea":{"background":"#ffffff","bottom":{"offset":"auto"}}},"launch_path":"__uniappview.html"}

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.inventory-bg{min-height:100vh;background:#f5f6f7;padding:.75rem}.inventory-card{background:#fff;border-radius:.75rem;padding:1rem .75rem;margin-bottom:.75rem}.readonly-group{margin-bottom:1rem;padding:.75rem;background:#f8f9fa;border-radius:.5rem}.readonly-item{display:flex;justify-content:space-between;margin-bottom:.625rem}.readonly-item:last-child{margin-bottom:0}.readonly-label{color:#666;font-size:.875rem;width:20%}.readonly-value{color:#333;font-size:.875rem;font-weight:500;text-align:right;width:75%}.form-group{margin-bottom:1rem}.form-label{font-size:.875rem;color:#333;margin-bottom:.5rem;font-weight:500}.form-input{height:2.75rem;background:#f8f9fa;border:none;border-radius:.5rem;padding:0 .75rem;font-size:.875rem;color:#333}.form-textarea{min-height:5rem;background:#f8f9fa;border:none;border-radius:.5rem;padding:.625rem .75rem;font-size:.875rem;color:#333}.photo-upload{display:flex;flex-wrap:wrap;gap:.625rem}.photo-preview{position:relative;width:5rem;height:5rem}.photo-btn{width:5rem;height:5rem;background:#f8f9fa;border-radius:.5rem;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:0}.photo-btn .iconfont{font-size:1.5rem;color:#666;margin-bottom:.25rem}.btn-text{font-size:.75rem;color:#666}.photo-preview{position:relative}.photo-img{width:5rem;height:5rem;border-radius:.5rem}.photo-del{position:absolute;top:-.5rem;right:-.5rem;width:1.25rem;height:1.25rem;background:rgba(0,0,0,.6);border-radius:50%;display:flex;align-items:center;justify-content:center}.delete-icon{color:#ff4d4f;font-size:1rem;font-weight:700;line-height:1}.submit-btn{width:100%;height:2.75rem;background:#409eff;color:#fff;font-size:1rem;font-weight:500;border-radius:1.375rem;margin-top:1.5rem}.submit-btn:active{opacity:.9}

@ -0,0 +1 @@
.login-bg{min-height:100vh;background:linear-gradient(180deg,#eaf1fb,#f7fafd);display:flex;align-items:center;justify-content:center}.login-card{width:92vw;max-width:420px;background:#fff;border-radius:28px;box-shadow:0 8px 32px rgba(64,158,255,.1);padding:56px 24px 40px;display:flex;flex-direction:column;align-items:stretch}.login-title{font-size:28px;font-weight:700;color:#222;text-align:center;margin-bottom:10px;letter-spacing:2px}.login-subtitle{font-size:16px;color:#7a8ca3;text-align:center;margin-bottom:38px;letter-spacing:1px}.form-group{margin-bottom:28px;display:flex;flex-direction:column}.form-label{font-size:16px;color:#3a3a3a;margin-bottom:10px;font-weight:500}.form-input{height:52px;border:1.5px solid #e3e8f0;border-radius:14px;padding:0 16px;font-size:17px;background:#f6f8fa;color:#222;transition:border .2s}.form-input:focus{border:1.5px solid #409eff;background:#fff}.login-btn{margin-top:18px;height:58px;background:linear-gradient(90deg,#409eff,#3b7cff);color:#fff;font-size:22px;font-weight:800;border-radius:18px;letter-spacing:10px;box-shadow:0 6px 18px rgba(64,158,255,.18);transition:background .2s,box-shadow .2s;border:none;outline:none;width:100%;display:flex;align-items:center;justify-content:center}.login-btn:active{background:linear-gradient(90deg,#337ecc,#2a5db0);box-shadow:0 2px 8px rgba(64,158,255,.1)}@media (max-width: 400px){.login-card{padding:32px 8px 24px}.form-input,.login-btn{height:44px;font-size:16px}}

@ -0,0 +1 @@
.plan-detail-container{height:100vh;background:#f5f5f5;padding:.625rem;box-sizing:border-box;width:100%}.plan-info-card{background:#fff;border-radius:.6875rem;box-shadow:0 4px 18px rgba(64,158,255,.07);padding:.875rem .75rem;margin-bottom:.75rem}.plan-info-header{margin-bottom:.75rem;padding-bottom:.5rem;border-bottom:2px solid #f0f0f0}.plan-info-title{font-size:1rem;color:#222;font-weight:700}.plan-info-content{display:flex;flex-direction:column;gap:.625rem}.info-row{display:flex;justify-content:space-between;gap:.625rem}.info-item{flex:1;display:flex;flex-direction:column;gap:.25rem}.info-label{font-size:.6875rem;color:#999;font-weight:500}.info-value{font-size:.8125rem;color:#333;font-weight:600}.type-text{color:#409eff}.count-text{color:#52c41a}.status-row{display:flex;justify-content:center;margin-top:.5rem}.status-item{display:flex;flex-direction:column;align-items:center;gap:.375rem}.status-label{font-size:.6875rem;color:#999;font-weight:500}.status-badge{padding:.375rem .75rem;border-radius:.75rem;font-size:.75rem;font-weight:600}.status-badge.status-0{background:linear-gradient(135deg,#fff3e0,#ffe0b2);color:#f57c00;border:1px solid #ffcc80}.status-badge.status-1{background:linear-gradient(135deg,#e3f2fd,#bbdefb);color:#1976d2;border:1px solid #90caf9}.status-badge.status-2{background:linear-gradient(135deg,#e8f5e9,#c8e6c9);color:#388e3c;border:1px solid #a5d6a7}.material-list-card{background:#fff;border-radius:.6875rem;box-shadow:0 4px 18px rgba(64,158,255,.07);padding:.875rem .75rem .5625rem;flex:1;width:100%;box-sizing:border-box;overflow:hidden}.material-list-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.5625rem}.material-list-title{font-size:.875rem;color:#222;font-weight:700}.material-count{font-size:.75rem;color:#409eff;font-weight:600}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;height:9.375rem;color:#999}.empty-text{font-size:.875rem;margin-bottom:.3125rem}.empty-desc{font-size:.6875rem}.material-list{display:flex;flex-direction:column;gap:.4375rem}.material-item{display:flex;justify-content:space-between;align-items:center;padding:.4375rem 0;border-bottom:1px solid #f0f0f0;width:100%;box-sizing:border-box}.material-item:last-child{border-bottom:none}.material-info{display:flex;flex-direction:column;align-items:flex-start;overflow:hidden}.material-name-col{flex:1;min-width:0;max-width:6.25rem}.material-model-col{width:5.625rem;min-width:0}.material-spec-col{width:3.75rem;min-width:0}.material-status-col{width:3.125rem;align-items:center}.material-action-col{width:3.125rem;display:flex;justify-content:flex-end;align-items:center}.material-name{font-size:.75rem;color:#333;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.material-time{font-size:.625rem;color:#999;margin-top:.0625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.material-status{font-size:.5625rem;padding:.125rem .3125rem;border-radius:.5rem;white-space:nowrap}.material-status.status-0{background-color:#fff7e6;color:#fa8c16}.material-status.status-1{background-color:#e8f5e9;color:#388e3c}.completed-text{color:#388e3c;font-size:.625rem;font-weight:500}.inventory-action-btn{background:linear-gradient(135deg,#409eff,#66b1ff);color:#fff;border:none;border-radius:.5rem;padding:.25rem .5rem;font-size:.6875rem;font-weight:500;box-shadow:0 2px 8px rgba(64,158,255,.3);transition:all .3s ease;display:flex;align-items:center;justify-content:center;cursor:pointer;min-width:2.5rem}.inventory-action-btn:active{transform:scale(.95);box-shadow:0 1px 4px rgba(64,158,255,.4);opacity:.9}.inventory-btn-text{color:#fff;font-size:.6875rem;font-weight:500}.load-more{display:flex;align-items:center;justify-content:center;gap:.375rem;padding:.9375rem .625rem;font-size:.75rem;color:#999}.loading-spinner{width:1rem;height:1rem;border:.09375rem solid #f0f0f0;border-top:.09375rem solid #409eff;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.loading-text{color:#409eff;font-weight:500}.no-more-text{color:#ccc;font-size:.6875rem}

@ -0,0 +1 @@
.profile-container{min-height:100vh;background:#f5f6fa;display:flex;flex-direction:column;align-items:center;padding-top:2.5rem}.avatar-section{display:flex;flex-direction:column;align-items:center;margin-bottom:1.25rem}.avatar{width:4.375rem;height:4.375rem;border-radius:50%;background:#fff;margin-bottom:.625rem}.username{font-size:1rem;color:#333;font-weight:700}.info-section{width:80%;background:#fff;border-radius:.5rem;box-shadow:0 .0625rem .3125rem rgba(0,0,0,.05);padding:.9375rem;margin-bottom:1.875rem}.info-item{display:flex;flex-direction:row;margin-bottom:.625rem}.info-item:last-child{margin-bottom:0}.label{color:#888;font-size:.875rem;width:3.75rem}.value{color:#333;font-size:.875rem}.logout-btn{width:80%;height:2.8125rem;line-height:2.8125rem;background:#ff4d4f;color:#fff;font-size:1rem;border-radius:1.40625rem;font-weight:700;margin-top:1.25rem}.logout-btn:active{background:#d9363e}

@ -0,0 +1 @@
.scan-bg{min-height:100vh;background:linear-gradient(180deg,#eaf1fb,#f7fafd);display:flex;flex-direction:column;align-items:center;padding-top:3.75rem}.scan-title{font-size:1.125rem;font-weight:700;color:#222;margin-bottom:2.5rem}.scan-btn{width:80vw;max-width:400px;height:3.125rem;font-size:1rem;font-weight:700;border-radius:.625rem;background:linear-gradient(90deg,#409eff,#3b7cff);color:#fff;box-shadow:0 6px 18px rgba(64,158,255,.13);letter-spacing:.25rem;margin:0 auto 1.25rem;border:none;outline:none;display:flex;align-items:center;justify-content:center;transition:background .2s,box-shadow .2s}.scan-btn:active{background:linear-gradient(90deg,#337ecc,#2a5db0)}.scan-result{margin-top:1.25rem;background:#fff;border-radius:.5rem;box-shadow:0 2px 8px rgba(64,158,255,.08);padding:1rem .75rem;width:80vw;max-width:400px;display:flex;flex-direction:column;align-items:flex-start}.result-label{font-size:.8125rem;color:#888;margin-bottom:.3125rem}.result-value{font-size:.875rem;color:#222;word-break:break-all}

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

@ -0,0 +1,11 @@
var __getOwnPropNames = Object.getOwnPropertyNames;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var require_app_css = __commonJS({
"app.css.js"(exports) {
const _style_0 = {};
exports.styles = [_style_0];
}
});
export default require_app_css();

@ -0,0 +1,2 @@
Promise.resolve("./app.css.js").then(() => {
});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>View</title>
<link rel="icon" href="data:,">
<link rel="stylesheet" href="app.css" />
<script>var __uniConfig = {"globalStyle":{},"darkmode":false}</script>
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
</head>
<body>
<div id="app"></div>
<script src="uni-app-view.umd.js"></script>
</body>
</html>

@ -0,0 +1,11 @@
;(function(){
let u=void 0,isReady=false,onReadyCallbacks=[],isServiceReady=false,onServiceReadyCallbacks=[];
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#F8F8F8","navigationBar":{"backgroundColor":"#F8F8F8","titleText":"物资盘点","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"应急保障物资盘点","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"4.76","entryPagePath":"pages/index/index","entryPageQuery":"","realEntryPagePath":"","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"tabBar":{"position":"bottom","color":"#999999","selectedColor":"#007AFF","borderStyle":"black","blurEffect":"none","fontSize":"10px","iconWidth":"24px","spacing":"3px","height":"50px","list":[{"pagePath":"pages/index/index","text":"盘点","iconPath":"/static/tabbar/inventory.png","selectedIconPath":"/static/tabbar/inventory-active.png"},{"pagePath":"pages/profile/profile","text":"个人中心","iconPath":"/static/tabbar/profile.png","selectedIconPath":"/static/tabbar/profile-active.png"}],"backgroundColor":"#ffffff","selectedIndex":0,"shown":true},"locales":{},"darkmode":false,"themeConfig":{}};
const __uniRoutes = [{"path":"pages/index/index","meta":{"isQuit":true,"isEntry":true,"isTabBar":true,"tabBarIndex":0,"navigationBar":{"titleText":"物资盘点","type":"default"},"isNVue":false}},{"path":"pages/profile/profile","meta":{"isQuit":true,"isTabBar":true,"tabBarIndex":1,"navigationBar":{"titleText":"个人中心","type":"default"},"isNVue":false}},{"path":"pages/login/login","meta":{"navigationBar":{"titleText":"登录","type":"default"},"isNVue":false}},{"path":"pages/scan/scan","meta":{"navigationBar":{"titleText":"扫码盘点","type":"default"},"isNVue":false}},{"path":"pages/inventory/inventory","meta":{"navigationBar":{"titleText":"物资盘点","type":"default"},"isNVue":false}},{"path":"pages/plan-detail/plan-detail","meta":{"navigationBar":{"titleText":"计划详情","type":"default"},"isNVue":false}}].map(uniRoute=>(uniRoute.meta.route=uniRoute.path,__uniConfig.pages.push(uniRoute.path),uniRoute.path='/'+uniRoute.path,uniRoute));
__uniConfig.styles=[];//styles
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:16})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:u,window:u,document:u,frames:u,self:u,location:u,navigator:u,localStorage:u,history:u,Caches:u,screen:u,alert:u,confirm:u,prompt:u,fetch:u,XMLHttpRequest:u,WebSocket:u,webkit:u,print:u}}}});
})();

@ -0,0 +1 @@
(function(){})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,208 @@
{
"@platforms": [
"android",
"iPhone",
"iPad"
],
"id": "__UNI__A789D1D",
"name": "应急保障物资盘点",
"version": {
"name": "1.0.1",
"code": 101
},
"description": "",
"developer": {
"name": "",
"email": "",
"url": ""
},
"permissions": {
"Barcode": {},
"Camera": {},
"UniNView": {
"description": "UniNView原生渲染"
}
},
"plus": {
"useragent": {
"value": "uni-app",
"concatenate": true
},
"splashscreen": {
"target": "id:1",
"autoclose": true,
"waiting": true,
"delay": 0
},
"popGesture": "close",
"launchwebview": {
"id": "1",
"kernel": "WKWebview"
},
"usingComponents": true,
"nvueStyleCompiler": "uni-app",
"compilerVersion": 3,
"distribute": {
"icons": {
"android": {
"hdpi": "unpackage/res/icons/72x72.png",
"xhdpi": "unpackage/res/icons/96x96.png",
"xxhdpi": "unpackage/res/icons/144x144.png",
"xxxhdpi": "unpackage/res/icons/192x192.png"
},
"ios": {
"appstore": "unpackage/res/icons/1024x1024.png",
"ipad": {
"app": "unpackage/res/icons/76x76.png",
"app@2x": "unpackage/res/icons/152x152.png",
"notification": "unpackage/res/icons/20x20.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"proapp@2x": "unpackage/res/icons/167x167.png",
"settings": "unpackage/res/icons/29x29.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"spotlight": "unpackage/res/icons/40x40.png",
"spotlight@2x": "unpackage/res/icons/80x80.png"
},
"iphone": {
"app@2x": "unpackage/res/icons/120x120.png",
"app@3x": "unpackage/res/icons/180x180.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"notification@3x": "unpackage/res/icons/60x60.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"settings@3x": "unpackage/res/icons/87x87.png",
"spotlight@2x": "unpackage/res/icons/80x80.png",
"spotlight@3x": "unpackage/res/icons/120x120.png"
}
}
},
"google": {
"permissions": [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
],
"minSdkVersion": 21,
"targetSdkVersion": 29,
"abiFilters": [
"armeabi-v7a",
"arm64-v8a"
]
},
"apple": {
"dSYMs": false
},
"plugins": {
"audio": {
"mp3": {
"description": "Android平台录音支持MP3格式文件"
}
}
}
},
"nativePlugins": {
"HL-HHWUHFController": {
"__plugin_info__": {
"name": "HHWUHFController",
"description": "调用超高频的原生插件",
"platforms": "Android",
"url": "",
"android_package_name": "",
"ios_bundle_id": "",
"isCloud": false,
"bought": -1,
"pid": "",
"parameters": {}
}
}
},
"statusbar": {
"immersed": "supportedDevice",
"style": "dark",
"background": "#F8F8F8"
},
"uniStatistics": {
"enable": false
},
"allowsInlineMediaPlayback": true,
"safearea": {
"background": "#ffffff",
"bottom": {
"offset": "auto"
}
},
"uni-app": {
"control": "uni-v3",
"vueVersion": "3",
"compilerVersion": "4.76",
"nvueCompiler": "uni-app",
"renderer": "auto",
"nvue": {
"flex-direction": "column"
},
"nvueLaunchMode": "normal",
"webView": {
"minUserAgentVersion": "49.0"
}
},
"tabBar": {
"position": "bottom",
"color": "#999999",
"selectedColor": "#007AFF",
"borderStyle": "rgba(0,0,0,0.4)",
"blurEffect": "none",
"fontSize": "10px",
"iconWidth": "24px",
"spacing": "3px",
"height": "50px",
"list": [
{
"pagePath": "pages/index/index",
"text": "盘点",
"iconPath": "/static/tabbar/inventory.png",
"selectedIconPath": "/static/tabbar/inventory-active.png"
},
{
"pagePath": "pages/profile/profile",
"text": "个人中心",
"iconPath": "/static/tabbar/profile.png",
"selectedIconPath": "/static/tabbar/profile-active.png"
}
],
"backgroundColor": "#ffffff",
"selectedIndex": 0,
"shown": true,
"child": [
"lauchwebview"
],
"selected": 0
}
},
"app-harmony": {
"useragent": {
"value": "uni-app",
"concatenate": true
},
"uniStatistics": {
"enable": false
},
"safearea": {
"background": "#ffffff",
"bottom": {
"offset": "auto"
}
}
},
"launch_path": "__uniappview.html"
}

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.inventory-bg{min-height:100vh;background:#f5f6f7;padding:.75rem}.inventory-card{background:#fff;border-radius:.75rem;padding:1rem .75rem;margin-bottom:.75rem}.readonly-group{margin-bottom:1rem;padding:.75rem;background:#f8f9fa;border-radius:.5rem}.readonly-item{display:flex;justify-content:space-between;margin-bottom:.625rem}.readonly-item:last-child{margin-bottom:0}.readonly-label{color:#666;font-size:.875rem;width:20%}.readonly-value{color:#333;font-size:.875rem;font-weight:500;text-align:right;width:75%}.form-group{margin-bottom:1rem}.form-label{font-size:.875rem;color:#333;margin-bottom:.5rem;font-weight:500}.form-input{height:2.75rem;background:#f8f9fa;border:none;border-radius:.5rem;padding:0 .75rem;font-size:.875rem;color:#333}.form-textarea{min-height:5rem;background:#f8f9fa;border:none;border-radius:.5rem;padding:.625rem .75rem;font-size:.875rem;color:#333}.photo-upload{display:flex;flex-wrap:wrap;gap:.625rem}.photo-preview{position:relative;width:5rem;height:5rem}.photo-btn{width:5rem;height:5rem;background:#f8f9fa;border-radius:.5rem;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:0}.photo-btn .iconfont{font-size:1.5rem;color:#666;margin-bottom:.25rem}.btn-text{font-size:.75rem;color:#666}.photo-preview{position:relative}.photo-img{width:5rem;height:5rem;border-radius:.5rem}.photo-del{position:absolute;top:-.5rem;right:-.5rem;width:1.25rem;height:1.25rem;background:rgba(0,0,0,.6);border-radius:50%;display:flex;align-items:center;justify-content:center}.delete-icon{color:#ff4d4f;font-size:1rem;font-weight:700;line-height:1}.submit-btn{width:100%;height:2.75rem;background:#409eff;color:#fff;font-size:1rem;font-weight:500;border-radius:1.375rem;margin-top:1.5rem}.submit-btn:active{opacity:.9}

@ -0,0 +1 @@
.login-bg{min-height:100vh;background:linear-gradient(180deg,#eaf1fb,#f7fafd);display:flex;align-items:center;justify-content:center}.login-card{width:92vw;max-width:420px;background:#fff;border-radius:28px;box-shadow:0 8px 32px rgba(64,158,255,.1);padding:56px 24px 40px;display:flex;flex-direction:column;align-items:stretch}.login-title{font-size:28px;font-weight:700;color:#222;text-align:center;margin-bottom:10px;letter-spacing:2px}.login-subtitle{font-size:16px;color:#7a8ca3;text-align:center;margin-bottom:38px;letter-spacing:1px}.form-group{margin-bottom:28px;display:flex;flex-direction:column}.form-label{font-size:16px;color:#3a3a3a;margin-bottom:10px;font-weight:500}.form-input{height:52px;border:1.5px solid #e3e8f0;border-radius:14px;padding:0 16px;font-size:17px;background:#f6f8fa;color:#222;transition:border .2s}.form-input:focus{border:1.5px solid #409eff;background:#fff}.login-btn{margin-top:18px;height:58px;background:linear-gradient(90deg,#409eff,#3b7cff);color:#fff;font-size:22px;font-weight:800;border-radius:18px;letter-spacing:10px;box-shadow:0 6px 18px rgba(64,158,255,.18);transition:background .2s,box-shadow .2s;border:none;outline:none;width:100%;display:flex;align-items:center;justify-content:center}.login-btn:active{background:linear-gradient(90deg,#337ecc,#2a5db0);box-shadow:0 2px 8px rgba(64,158,255,.1)}@media (max-width: 400px){.login-card{padding:32px 8px 24px}.form-input,.login-btn{height:44px;font-size:16px}}

@ -0,0 +1 @@
.plan-detail-container{height:100vh;background:#f5f5f5;padding:.625rem;box-sizing:border-box;width:100%}.plan-info-card{background:#fff;border-radius:.6875rem;box-shadow:0 4px 18px rgba(64,158,255,.07);padding:.875rem .75rem;margin-bottom:.75rem}.plan-info-header{margin-bottom:.75rem;padding-bottom:.5rem;border-bottom:2px solid #f0f0f0}.plan-info-title{font-size:1rem;color:#222;font-weight:700}.plan-info-content{display:flex;flex-direction:column;gap:.625rem}.info-row{display:flex;justify-content:space-between;gap:.625rem}.info-item{flex:1;display:flex;flex-direction:column;gap:.25rem}.info-label{font-size:.6875rem;color:#999;font-weight:500}.info-value{font-size:.8125rem;color:#333;font-weight:600}.type-text{color:#409eff}.count-text{color:#52c41a}.status-row{display:flex;justify-content:center;margin-top:.5rem}.status-item{display:flex;flex-direction:column;align-items:center;gap:.375rem}.status-label{font-size:.6875rem;color:#999;font-weight:500}.status-badge{padding:.375rem .75rem;border-radius:.75rem;font-size:.75rem;font-weight:600}.status-badge.status-0{background:linear-gradient(135deg,#fff3e0,#ffe0b2);color:#f57c00;border:1px solid #ffcc80}.status-badge.status-1{background:linear-gradient(135deg,#e3f2fd,#bbdefb);color:#1976d2;border:1px solid #90caf9}.status-badge.status-2{background:linear-gradient(135deg,#e8f5e9,#c8e6c9);color:#388e3c;border:1px solid #a5d6a7}.material-list-card{background:#fff;border-radius:.6875rem;box-shadow:0 4px 18px rgba(64,158,255,.07);padding:.875rem .75rem .5625rem;flex:1;width:100%;box-sizing:border-box;overflow:hidden}.material-list-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.5625rem}.material-list-title{font-size:.875rem;color:#222;font-weight:700}.material-count{font-size:.75rem;color:#409eff;font-weight:600}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;height:9.375rem;color:#999}.empty-text{font-size:.875rem;margin-bottom:.3125rem}.empty-desc{font-size:.6875rem}.material-list{display:flex;flex-direction:column;gap:.4375rem}.material-item{display:flex;justify-content:space-between;align-items:center;padding:.4375rem 0;border-bottom:1px solid #f0f0f0;width:100%;box-sizing:border-box}.material-item:last-child{border-bottom:none}.material-info{display:flex;flex-direction:column;align-items:flex-start;overflow:hidden}.material-name-col{flex:1;min-width:0;max-width:6.25rem}.material-model-col{width:5.625rem;min-width:0}.material-spec-col{width:3.75rem;min-width:0}.material-status-col{width:3.125rem;align-items:center}.material-action-col{width:3.125rem;display:flex;justify-content:flex-end;align-items:center}.material-name{font-size:.75rem;color:#333;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.material-time{font-size:.625rem;color:#999;margin-top:.0625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.material-status{font-size:.5625rem;padding:.125rem .3125rem;border-radius:.5rem;white-space:nowrap}.material-status.status-0{background-color:#fff7e6;color:#fa8c16}.material-status.status-1{background-color:#e8f5e9;color:#388e3c}.completed-text{color:#388e3c;font-size:.625rem;font-weight:500}.inventory-action-btn{background:linear-gradient(135deg,#409eff,#66b1ff);color:#fff;border:none;border-radius:.5rem;padding:.25rem .5rem;font-size:.6875rem;font-weight:500;box-shadow:0 2px 8px rgba(64,158,255,.3);transition:all .3s ease;display:flex;align-items:center;justify-content:center;cursor:pointer;min-width:2.5rem}.inventory-action-btn:active{transform:scale(.95);box-shadow:0 1px 4px rgba(64,158,255,.4);opacity:.9}.inventory-btn-text{color:#fff;font-size:.6875rem;font-weight:500}.load-more{display:flex;align-items:center;justify-content:center;gap:.375rem;padding:.9375rem .625rem;font-size:.75rem;color:#999}.loading-spinner{width:1rem;height:1rem;border:.09375rem solid #f0f0f0;border-top:.09375rem solid #409eff;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.loading-text{color:#409eff;font-weight:500}.no-more-text{color:#ccc;font-size:.6875rem}

@ -0,0 +1 @@
.profile-container{min-height:100vh;background:#f5f6fa;display:flex;flex-direction:column;align-items:center;padding-top:2.5rem}.avatar-section{display:flex;flex-direction:column;align-items:center;margin-bottom:1.25rem}.avatar{width:4.375rem;height:4.375rem;border-radius:50%;background:#fff;margin-bottom:.625rem}.username{font-size:1rem;color:#333;font-weight:700}.info-section{width:80%;background:#fff;border-radius:.5rem;box-shadow:0 .0625rem .3125rem rgba(0,0,0,.05);padding:.9375rem;margin-bottom:1.875rem}.info-item{display:flex;flex-direction:row;margin-bottom:.625rem}.info-item:last-child{margin-bottom:0}.label{color:#888;font-size:.875rem;width:3.75rem}.value{color:#333;font-size:.875rem}.logout-btn{width:80%;height:2.8125rem;line-height:2.8125rem;background:#ff4d4f;color:#fff;font-size:1rem;border-radius:1.40625rem;font-weight:700;margin-top:1.25rem}.logout-btn:active{background:#d9363e}

@ -0,0 +1 @@
.scan-bg{min-height:100vh;background:linear-gradient(180deg,#eaf1fb,#f7fafd);display:flex;flex-direction:column;align-items:center;padding-top:3.75rem}.scan-title{font-size:1.125rem;font-weight:700;color:#222;margin-bottom:2.5rem}.scan-btn{width:80vw;max-width:400px;height:3.125rem;font-size:1rem;font-weight:700;border-radius:.625rem;background:linear-gradient(90deg,#409eff,#3b7cff);color:#fff;box-shadow:0 6px 18px rgba(64,158,255,.13);letter-spacing:.25rem;margin:0 auto 1.25rem;border:none;outline:none;display:flex;align-items:center;justify-content:center;transition:background .2s,box-shadow .2s}.scan-btn:active{background:linear-gradient(90deg,#337ecc,#2a5db0)}.scan-result{margin-top:1.25rem;background:#fff;border-radius:.5rem;box-shadow:0 2px 8px rgba(64,158,255,.08);padding:1rem .75rem;width:80vw;max-width:400px;display:flex;flex-direction:column;align-items:flex-start}.result-label{font-size:.8125rem;color:#888;margin-bottom:.3125rem}.result-value{font-size:.875rem;color:#222;word-break:break-all}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
import{E as n,G as a,H as e,J as t}from"./index-aGYdYpDa.js";function o(e,t){return new Promise(((o,s)=>{n({url:a+"api/admin/auth/login",method:"POST",data:{username:e,password:t},success:o,fail:s})}))}function s(){const t=e("token");return new Promise(((e,o)=>{n({url:a+"api/admin/auth/me",method:"POST",data:{token:t},success:e,fail:o})}))}function i(t){const o=e("token");return new Promise(((e,s)=>{n({url:a+"api/admin/inventory/show",method:"GET",data:{id:t,token:o},success:e,fail:s})}))}function r(t){const o=e("token");return new Promise(((e,s)=>{n({url:a+"api/admin/inventory/index",method:"GET",data:{...t,token:o},success:e,fail:s})}))}function c(t){const o=e("token");return new Promise(((e,s)=>{console.log("confirm接口"),n({url:a+"api/admin/material-infos-plan-link/confirm",method:"POST",data:{...t,token:o},success:e,fail:s})}))}function u(t){const o=e("token");return new Promise(((e,s)=>{n({url:a+"api/admin/material-infos-plan/index",method:"GET",data:{...t,token:o},success:e,fail:s})}))}function m(t){const o=e("token");return new Promise(((e,s)=>{n({url:a+"api/admin/material-infos-plan-link/index",method:"GET",data:{...t,token:o},success:e,fail:s})}))}function l(n){const o=e("token");return new Promise(((e,s)=>{t({url:a+"api/admin/upload-file",filePath:n,name:"file",formData:{token:o},success:n=>{try{const a=JSON.parse(n.data);e(a)}catch(a){s(a)}},fail:s})}))}export{r as a,s as b,i as c,m as d,u as g,o as l,c as s,l as u};

@ -1 +0,0 @@
.detail-bg[data-v-611e83f8]{min-height:100vh;background:linear-gradient(180deg,#eaf1fb,#f7fafd);display:flex;align-items:center;justify-content:center}.detail-card[data-v-611e83f8]{width:94vw;max-width:500px;background:#fff;border-radius:28px;box-shadow:0 8px 32px rgba(64,158,255,.1);padding:38px 18px 28px;display:flex;flex-direction:column;align-items:stretch}.detail-title[data-v-611e83f8]{font-size:26px;font-weight:800;color:#409eff;text-align:center;margin-bottom:32px;letter-spacing:2px}.detail-list[data-v-611e83f8]{display:flex;flex-direction:column;gap:0}.detail-item[data-v-611e83f8]{display:flex;flex-direction:row;align-items:flex-start;justify-content:space-between;background:#f7fafd;border-radius:16px;margin-bottom:18px;padding:18px 16px;box-shadow:0 2px 8px rgba(64,158,255,.04)}.detail-label[data-v-611e83f8]{color:#888;font-size:16px;min-width:80px;margin-right:10px}.detail-value[data-v-611e83f8]{color:#222;font-size:16px;font-weight:600;flex:1;text-align:right;word-break:break-all}.detail-value.stock[data-v-611e83f8]{color:#409eff;font-weight:700}.detail-img[data-v-611e83f8]{width:90px;height:90px;border-radius:10px;margin-left:10px;background:#f0f1f3;border:1px solid #e3e8f0}.img-placeholder[data-v-611e83f8]{width:90px;height:90px;border-radius:10px;background:#f0f1f3;color:#bbb;display:flex;align-items:center;justify-content:center;font-size:14px;margin-left:10px}.remark-item[data-v-611e83f8]{align-items:flex-start}.detail-remark[data-v-611e83f8]{color:#666;font-size:15px;flex:1;text-align:right;line-height:1.7;word-break:break-all}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +0,0 @@
.index-bg[data-v-91263ea8]{min-height:100vh;background:linear-gradient(180deg,#eaf1fb,#f7fafd);display:flex;flex-direction:column;align-items:center;justify-content:center}.index-content[data-v-91263ea8]{width:100%;max-width:600px;flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4vw 0 6vw;box-sizing:border-box}.btn-group[data-v-91263ea8]{width:90%;max-width:500px;display:flex;flex-direction:column;margin:0 auto 1.5rem}.main-btn[data-v-91263ea8]{height:3.4375rem;font-size:1.1875rem;font-weight:800;border-radius:.875rem;background:linear-gradient(90deg,#409eff,#3b7cff);color:#fff;box-shadow:0 8px 24px rgba(64,158,255,.15);letter-spacing:.3125rem;margin:0;border:none;outline:none;width:100%;display:flex;align-items:center;justify-content:center;transition:background .2s,box-shadow .2s;margin-bottom:1.125rem}.main-btn[data-v-91263ea8]:last-child{margin-bottom:0}.main-btn[data-v-91263ea8]:active{background:linear-gradient(90deg,#337ecc,#2a5db0);box-shadow:0 4px 12px rgba(64,158,255,.1)}.main-btn.outline[data-v-91263ea8]{background:#fff;color:#409eff;border:3px solid #409eff;box-shadow:none}.main-btn.outline[data-v-91263ea8]:active{background:#f0f7ff}.recent-section[data-v-91263ea8]{width:92%;max-width:520px;margin:0 auto;background:#fff;border-radius:.6875rem;box-shadow:0 4px 18px rgba(64,158,255,.07);padding:.875rem .625rem .5625rem}.recent-title[data-v-91263ea8]{font-size:.875rem;color:#222;font-weight:700;margin-bottom:.5625rem}.recent-list[data-v-91263ea8]{display:flex;flex-direction:column;gap:.4375rem}.recent-item[data-v-91263ea8]{display:flex;justify-content:space-between;align-items:center;padding:.4375rem 0;border-bottom:1px solid #f0f0f0}.recent-item[data-v-91263ea8]:last-child{border-bottom:none}.recent-info[data-v-91263ea8]{display:flex;flex-direction:column}.recent-name[data-v-91263ea8]{font-size:.75rem;color:#333;font-weight:600}.recent-time[data-v-91263ea8]{font-size:.625rem;color:#999;margin-top:.0625rem}.recent-status[data-v-91263ea8]{font-size:.625rem;padding:.125rem .4375rem;border-radius:.5rem}.recent-status.completed[data-v-91263ea8]{background-color:#e8f5e9;color:#4caf50}.recent-status.processing[data-v-91263ea8]{background-color:#fff3e0;color:#ff9800}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.inventory-bg[data-v-3954e584]{min-height:100vh;background:#f5f6f7;padding:.75rem}.inventory-card[data-v-3954e584]{background:#fff;border-radius:.75rem;padding:1rem .75rem;margin-bottom:.75rem}.readonly-group[data-v-3954e584]{margin-bottom:1rem;padding:.75rem;background:#f8f9fa;border-radius:.5rem}.readonly-item[data-v-3954e584]{display:flex;justify-content:space-between;margin-bottom:.625rem}.readonly-item[data-v-3954e584]:last-child{margin-bottom:0}.readonly-label[data-v-3954e584]{color:#666;font-size:.875rem;width:20%}.readonly-value[data-v-3954e584]{color:#333;font-size:.875rem;font-weight:500;text-align:right;width:75%}.form-group[data-v-3954e584]{margin-bottom:1rem}.form-label[data-v-3954e584]{font-size:.875rem;color:#333;margin-bottom:.5rem;font-weight:500}.form-input[data-v-3954e584]{height:2.75rem;background:#f8f9fa;border:none;border-radius:.5rem;padding:0 .75rem;font-size:.875rem;color:#333}.form-textarea[data-v-3954e584]{min-height:5rem;background:#f8f9fa;border:none;border-radius:.5rem;padding:.625rem .75rem;font-size:.875rem;color:#333}.photo-upload[data-v-3954e584]{display:flex;flex-wrap:wrap;gap:.625rem}.photo-preview[data-v-3954e584]{position:relative;width:5rem;height:5rem}.photo-btn[data-v-3954e584]{width:5rem;height:5rem;background:#f8f9fa;border-radius:.5rem;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:0}.photo-btn .iconfont[data-v-3954e584]{font-size:1.5rem;color:#666;margin-bottom:.25rem}.btn-text[data-v-3954e584]{font-size:.75rem;color:#666}.photo-preview[data-v-3954e584]{position:relative}.photo-img[data-v-3954e584]{width:5rem;height:5rem;border-radius:.5rem}.photo-del[data-v-3954e584]{position:absolute;top:-.5rem;right:-.5rem;width:1.25rem;height:1.25rem;background:rgba(0,0,0,.6);border-radius:50%;display:flex;align-items:center;justify-content:center}.delete-icon[data-v-3954e584]{color:#ff4d4f;font-size:1rem;font-weight:700;line-height:1}.submit-btn[data-v-3954e584]{width:100%;height:2.75rem;background:#409eff;color:#fff;font-size:1rem;font-weight:500;border-radius:1.375rem;margin-top:1.5rem}.submit-btn[data-v-3954e584]:active{opacity:.9}

@ -1 +0,0 @@
.inventory-bg[data-v-4b72a3fd]{min-height:100vh;background:linear-gradient(180deg,#eaf1fb,#f7fafd);display:flex;align-items:center;justify-content:center}.inventory-card[data-v-4b72a3fd]{width:92vw;max-width:480px;background:#fff;border-radius:24px;box-shadow:0 8px 32px rgba(64,158,255,.1);padding:48px 24px 32px;display:flex;flex-direction:column;align-items:stretch}.form-group[data-v-4b72a3fd]{margin-bottom:28px;display:flex;flex-direction:column}.form-label[data-v-4b72a3fd]{font-size:16px;color:#3a3a3a;margin-bottom:10px;font-weight:500}.form-input[data-v-4b72a3fd]{height:48px;border:1.5px solid #e3e8f0;border-radius:12px;padding:0 14px;font-size:17px;background:#f6f8fa;color:#222;margin-bottom:2px}.form-input[disabled][data-v-4b72a3fd]{background:#f0f1f3;color:#aaa}.form-textarea[data-v-4b72a3fd]{min-height:80px;border:1.5px solid #e3e8f0;border-radius:12px;padding:10px 14px;font-size:16px;background:#f6f8fa;color:#222}.photo-upload[data-v-4b72a3fd]{display:flex;align-items:center}.photo-btn[data-v-4b72a3fd]{height:44px;background:#409eff;color:#fff;font-size:16px;border-radius:8px;padding:0 24px;border:none}.photo-preview[data-v-4b72a3fd]{position:relative;display:flex;align-items:center}.photo-img[data-v-4b72a3fd]{width:80px;height:80px;border-radius:8px;margin-right:12px}.photo-del[data-v-4b72a3fd]{color:#ff4d4f;font-size:14px;cursor:pointer}.submit-btn[data-v-4b72a3fd]{margin-top:18px;height:52px;background:linear-gradient(90deg,#409eff,#3b7cff);color:#fff;font-size:20px;font-weight:700;border-radius:14px;letter-spacing:8px;box-shadow:0 4px 16px rgba(64,158,255,.13)}.submit-btn[data-v-4b72a3fd]:active{background:linear-gradient(90deg,#337ecc 60%,#2a5db0)}

@ -1 +1 @@
.login-bg[data-v-82dc1100]{min-height:100vh;background:linear-gradient(180deg,#eaf1fb,#f7fafd);display:flex;align-items:center;justify-content:center}.login-card[data-v-82dc1100]{width:92vw;max-width:420px;background:#fff;border-radius:28px;box-shadow:0 8px 32px rgba(64,158,255,.1);padding:56px 24px 40px;display:flex;flex-direction:column;align-items:stretch}.login-title[data-v-82dc1100]{font-size:28px;font-weight:700;color:#222;text-align:center;margin-bottom:10px;letter-spacing:2px}.login-subtitle[data-v-82dc1100]{font-size:16px;color:#7a8ca3;text-align:center;margin-bottom:38px;letter-spacing:1px}.form-group[data-v-82dc1100]{margin-bottom:28px;display:flex;flex-direction:column}.form-label[data-v-82dc1100]{font-size:16px;color:#3a3a3a;margin-bottom:10px;font-weight:500}.form-input[data-v-82dc1100]{height:52px;border:1.5px solid #e3e8f0;border-radius:14px;padding:0 16px;font-size:17px;background:#f6f8fa;color:#222;transition:border .2s}.form-input[data-v-82dc1100]:focus{border:1.5px solid #409eff;background:#fff}.login-btn[data-v-82dc1100]{margin-top:18px;height:58px;background:linear-gradient(90deg,#409eff,#3b7cff);color:#fff;font-size:22px;font-weight:800;border-radius:18px;letter-spacing:10px;box-shadow:0 6px 18px rgba(64,158,255,.18);transition:background .2s,box-shadow .2s;border:none;outline:none;width:100%;display:flex;align-items:center;justify-content:center}.login-btn[data-v-82dc1100]:active{background:linear-gradient(90deg,#337ecc,#2a5db0);box-shadow:0 2px 8px rgba(64,158,255,.1)}@media (max-width: 400px){.login-card[data-v-82dc1100]{padding:32px 8px 24px}.form-input[data-v-82dc1100],.login-btn[data-v-82dc1100]{height:44px;font-size:16px}}
.login-bg[data-v-973a11b9]{min-height:100vh;background:linear-gradient(180deg,#eaf1fb,#f7fafd);display:flex;align-items:center;justify-content:center}.login-card[data-v-973a11b9]{width:92vw;max-width:420px;background:#fff;border-radius:28px;box-shadow:0 8px 32px rgba(64,158,255,.1);padding:56px 24px 40px;display:flex;flex-direction:column;align-items:stretch}.login-title[data-v-973a11b9]{font-size:28px;font-weight:700;color:#222;text-align:center;margin-bottom:10px;letter-spacing:2px}.login-subtitle[data-v-973a11b9]{font-size:16px;color:#7a8ca3;text-align:center;margin-bottom:38px;letter-spacing:1px}.form-group[data-v-973a11b9]{margin-bottom:28px;display:flex;flex-direction:column}.form-label[data-v-973a11b9]{font-size:16px;color:#3a3a3a;margin-bottom:10px;font-weight:500}.form-input[data-v-973a11b9]{height:52px;border:1.5px solid #e3e8f0;border-radius:14px;padding:0 16px;font-size:17px;background:#f6f8fa;color:#222;transition:border .2s}.form-input[data-v-973a11b9]:focus{border:1.5px solid #409eff;background:#fff}.login-btn[data-v-973a11b9]{margin-top:18px;height:58px;background:linear-gradient(90deg,#409eff,#3b7cff);color:#fff;font-size:22px;font-weight:800;border-radius:18px;letter-spacing:10px;box-shadow:0 6px 18px rgba(64,158,255,.18);transition:background .2s,box-shadow .2s;border:none;outline:none;width:100%;display:flex;align-items:center;justify-content:center}.login-btn[data-v-973a11b9]:active{background:linear-gradient(90deg,#337ecc,#2a5db0);box-shadow:0 2px 8px rgba(64,158,255,.1)}@media (max-width: 400px){.login-card[data-v-973a11b9]{padding:32px 8px 24px}.form-input[data-v-973a11b9],.login-btn[data-v-973a11b9]{height:44px;font-size:16px}}

@ -1 +0,0 @@
import{c as a,w as e,i as l,o as t,b as s,d,t as i,h as o,k as c}from"./index-CWmHAt1Y.js";import{_ as f}from"./_plugin-vue_export-helper.BCo6x5W8.js";const u=f({data:()=>({info:{name:"",code:"",stockQty:"",photo:"",remark:""}}),onLoad(a){this.info={name:"仓库A物资",code:a.code||"未知",stockQty:100,photo:"",remark:"无特殊说明"}}},[["render",function(f,u,r,_,m,n){const p=o,k=l,h=c;return t(),a(k,{class:"detail-bg"},{default:e((()=>[s(k,{class:"detail-card"},{default:e((()=>[s(k,{class:"detail-list"},{default:e((()=>[s(k,{class:"detail-item"},{default:e((()=>[s(p,{class:"detail-label"},{default:e((()=>[d("物资名称")])),_:1}),s(p,{class:"detail-value"},{default:e((()=>[d(i(m.info.name),1)])),_:1})])),_:1}),s(k,{class:"detail-item"},{default:e((()=>[s(p,{class:"detail-label"},{default:e((()=>[d("物资编号")])),_:1}),s(p,{class:"detail-value"},{default:e((()=>[d(i(m.info.code),1)])),_:1})])),_:1}),s(k,{class:"detail-item"},{default:e((()=>[s(p,{class:"detail-label"},{default:e((()=>[d("库存数量")])),_:1}),s(p,{class:"detail-value stock"},{default:e((()=>[d(i(m.info.stockQty),1)])),_:1})])),_:1}),s(k,{class:"detail-item"},{default:e((()=>[s(p,{class:"detail-label"},{default:e((()=>[d("物资图片")])),_:1}),m.info.photo?(t(),a(h,{key:0,src:m.info.photo,class:"detail-img",mode:"aspectFill"},null,8,["src"])):(t(),a(k,{key:1,class:"img-placeholder"},{default:e((()=>[d("无图片")])),_:1}))])),_:1}),s(k,{class:"detail-item remark-item"},{default:e((()=>[s(p,{class:"detail-label"},{default:e((()=>[d("备注")])),_:1}),s(p,{class:"detail-remark"},{default:e((()=>[d(i(m.info.remark||"无"),1)])),_:1})])),_:1})])),_:1})])),_:1})])),_:1})}],["__scopeId","data-v-611e83f8"]]);export{u as default};

File diff suppressed because one or more lines are too long

@ -1 +0,0 @@
import{s as t,n as e,a as s,c as a,w as n,i as c,o as l,b as i,d as o,e as r,r as u,F as d,f,t as p,g as m,h as _}from"./index-CWmHAt1Y.js";import{_ as g}from"./_plugin-vue_export-helper.BCo6x5W8.js";const x=g({data:()=>({currentDate:"",recentRecords:[{title:"仓库A盘点",time:"2024-03-20 14:30",status:"completed",statusText:"已完成"},{title:"办公用品盘点",time:"2024-03-19 10:15",status:"processing",statusText:"进行中"},{title:"设备资产盘点",time:"2024-03-18 16:45",status:"completed",statusText:"已完成"}]}),onLoad(){this.updateDate()},methods:{updateDate(){const t=new Date,e=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0");this.currentDate=`${e}-${s}-${a}`},scanInventory(){t({success:t=>{e({url:`/pages/inventory/inventory?code=${encodeURIComponent(t.result)}`})},fail:()=>{s({title:"扫码失败",icon:"none"})}})},scanView(){t({success:t=>{e({url:`/pages/detail/detail?code=${encodeURIComponent(t.result)}`})},fail:()=>{s({title:"扫码失败",icon:"none"})}})}}},[["render",function(t,e,s,g,x,h){const v=f,C=c,D=_;return l(),a(C,{class:"index-bg"},{default:n((()=>[i(C,{class:"index-content"},{default:n((()=>[i(C,{class:"btn-group"},{default:n((()=>[i(v,{class:"main-btn",onClick:h.scanInventory},{default:n((()=>[o("扫码盘点")])),_:1},8,["onClick"]),i(v,{class:"main-btn outline",onClick:h.scanView},{default:n((()=>[o("扫码查看")])),_:1},8,["onClick"])])),_:1}),i(C,{class:"recent-section"},{default:n((()=>[i(C,{class:"recent-title"},{default:n((()=>[o("最近盘点记录")])),_:1}),i(C,{class:"recent-list"},{default:n((()=>[(l(!0),r(d,null,u(x.recentRecords,((t,e)=>(l(),a(C,{class:"recent-item",key:e},{default:n((()=>[i(C,{class:"recent-info"},{default:n((()=>[i(D,{class:"recent-name"},{default:n((()=>[o(p(t.title),1)])),_:2},1024),i(D,{class:"recent-time"},{default:n((()=>[o(p(t.time),1)])),_:2},1024)])),_:2},1024),i(D,{class:m(["recent-status",t.status])},{default:n((()=>[o(p(t.statusText),1)])),_:2},1032,["class"])])),_:2},1024)))),128))])),_:1})])),_:1})])),_:1})])),_:1})}],["__scopeId","data-v-91263ea8"]]);export{x as default};

@ -1 +0,0 @@
import{p as a,a as l,c as e,w as t,i as o,o as s,b as u,d as r,h as c,I as d,q as n,k as f,f as m}from"./index-CWmHAt1Y.js";import{_ as p}from"./_plugin-vue_export-helper.BCo6x5W8.js";const i=p({data:()=>({userName:"张三",date:"",stockQty:100,countQty:"",remark:"",photo:""}),onLoad(a){this.date=this.getToday(),a.code},methods:{getToday(){const a=new Date;return`${a.getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}-${String(a.getDate()).padStart(2,"0")}`},choosePhoto(){a({count:1,success:a=>{this.photo=a.tempFilePaths[0]}})},submit(){this.countQty?l({title:"盘点提交成功",icon:"success"}):l({title:"请输入盘点数量",icon:"none"})}}},[["render",function(a,l,p,i,h,_){const b=c,g=d,k=o,y=n,v=f,Q=m;return s(),e(k,{class:"inventory-bg"},{default:t((()=>[u(k,{class:"inventory-card"},{default:t((()=>[u(k,{class:"form-group"},{default:t((()=>[u(b,{class:"form-label"},{default:t((()=>[r("盘点人")])),_:1}),u(g,{class:"form-input",value:h.userName,disabled:""},null,8,["value"])])),_:1}),u(k,{class:"form-group"},{default:t((()=>[u(b,{class:"form-label"},{default:t((()=>[r("盘点日期")])),_:1}),u(g,{class:"form-input",value:h.date,disabled:""},null,8,["value"])])),_:1}),u(k,{class:"form-group"},{default:t((()=>[u(b,{class:"form-label"},{default:t((()=>[r("库存数量")])),_:1}),u(g,{class:"form-input",value:h.stockQty,disabled:""},null,8,["value"])])),_:1}),u(k,{class:"form-group"},{default:t((()=>[u(b,{class:"form-label"},{default:t((()=>[r("盘点数量")])),_:1}),u(g,{class:"form-input",type:"number",modelValue:h.countQty,"onUpdate:modelValue":l[0]||(l[0]=a=>h.countQty=a),placeholder:"请输入盘点数量"},null,8,["modelValue"])])),_:1}),u(k,{class:"form-group"},{default:t((()=>[u(b,{class:"form-label"},{default:t((()=>[r("盘点备注")])),_:1}),u(y,{class:"form-textarea",modelValue:h.remark,"onUpdate:modelValue":l[1]||(l[1]=a=>h.remark=a),placeholder:"请输入备注"},null,8,["modelValue"])])),_:1}),u(k,{class:"form-group"},{default:t((()=>[u(b,{class:"form-label"},{default:t((()=>[r("照片上传")])),_:1}),u(k,{class:"photo-upload"},{default:t((()=>[h.photo?(s(),e(k,{key:0,class:"photo-preview"},{default:t((()=>[u(v,{src:h.photo,mode:"aspectFill",class:"photo-img"},null,8,["src"]),u(b,{class:"photo-del",onClick:l[2]||(l[2]=a=>h.photo="")},{default:t((()=>[r("删除")])),_:1})])),_:1})):(s(),e(Q,{key:1,class:"photo-btn",onClick:_.choosePhoto},{default:t((()=>[r("上传照片")])),_:1},8,["onClick"]))])),_:1})])),_:1}),u(Q,{class:"submit-btn",onClick:_.submit},{default:t((()=>[r("提交盘点")])),_:1},8,["onClick"])])),_:1})])),_:1})}],["__scopeId","data-v-4b72a3fd"]]);export{i as default};

File diff suppressed because one or more lines are too long

@ -1 +0,0 @@
import{a,l as e,c as s,w as l,i as o,o as t,b as d,d as n,h as u,I as r,f as i}from"./index-CWmHAt1Y.js";import{_ as c}from"./_plugin-vue_export-helper.BCo6x5W8.js";const p=c({data:()=>({username:"",password:""}),methods:{handleLogin(){this.username&&this.password?(a({title:"登录成功",icon:"success",duration:1500}),setTimeout((()=>{e({url:"/pages/index/index"})}),1500)):a({title:"请输入用户名和密码",icon:"none"})}}},[["render",function(a,e,c,p,m,f){const _=o,g=u,h=r,b=i;return t(),s(_,{class:"login-bg"},{default:l((()=>[d(_,{class:"login-card"},{default:l((()=>[d(_,{class:"login-title"},{default:l((()=>[n("欢迎登录")])),_:1}),d(_,{class:"login-subtitle"},{default:l((()=>[n("河道防汛物资管理系统")])),_:1}),d(_,{class:"form-group"},{default:l((()=>[d(g,{class:"form-label"},{default:l((()=>[n("用户名")])),_:1}),d(h,{class:"form-input",type:"text",modelValue:m.username,"onUpdate:modelValue":e[0]||(e[0]=a=>m.username=a),placeholder:"请输入用户名"},null,8,["modelValue"])])),_:1}),d(_,{class:"form-group"},{default:l((()=>[d(g,{class:"form-label"},{default:l((()=>[n("密码")])),_:1}),d(h,{class:"form-input",type:"password",modelValue:m.password,"onUpdate:modelValue":e[1]||(e[1]=a=>m.password=a),placeholder:"请输入密码"},null,8,["modelValue"])])),_:1}),d(b,{class:"login-btn",onClick:f.handleLogin},{default:l((()=>[n("登 录")])),_:1},8,["onClick"])])),_:1})])),_:1})}],["__scopeId","data-v-82dc1100"]]);export{p as default};

@ -0,0 +1 @@
import{s as a,b as e,h as s,y as l,z as o,c as t,w as n,m as d,o as r,d as c,e as i,p as u,I as m,l as p}from"./index-aGYdYpDa.js";import{l as f}from"./api.qV-fdkUH.js";import{_}from"./_plugin-vue_export-helper.BCo6x5W8.js";const g=_({data:()=>({username:"",password:""}),methods:{handleLogin(){this.username&&this.password?(e({title:"登录中...",mask:!0}),f(this.username,this.password).then((e=>{s(),console.log(e),e.data&&void 0!==e.data.errcode?a({title:e.data.errmsg||"登录失败",icon:"none"}):e.data&&(console.log(e.data.access_token),e.data.access_token&&l("token",e.data.access_token),a({title:"登录成功",icon:"success",duration:1500}),setTimeout((()=>{o({url:"/pages/index/index"})}),1500))})).catch((()=>{s(),a({title:"网络错误",icon:"none"})}))):a({title:"请输入用户名和密码",icon:"none"})}}},[["render",function(a,e,s,l,o,f){const _=d,g=u,h=m,b=p;return r(),t(_,{class:"login-bg"},{default:n((()=>[c(_,{class:"login-card"},{default:n((()=>[c(_,{class:"login-title"},{default:n((()=>[i("欢迎登录")])),_:1}),c(_,{class:"login-subtitle"},{default:n((()=>[i("河道防汛物资管理系统")])),_:1}),c(_,{class:"form-group"},{default:n((()=>[c(g,{class:"form-label"},{default:n((()=>[i("用户名")])),_:1}),c(h,{class:"form-input",type:"text",modelValue:o.username,"onUpdate:modelValue":e[0]||(e[0]=a=>o.username=a),placeholder:"请输入用户名"},null,8,["modelValue"])])),_:1}),c(_,{class:"form-group"},{default:n((()=>[c(g,{class:"form-label"},{default:n((()=>[i("密码")])),_:1}),c(h,{class:"form-input",type:"password",modelValue:o.password,"onUpdate:modelValue":e[1]||(e[1]=a=>o.password=a),placeholder:"请输入密码"},null,8,["modelValue"])])),_:1}),c(b,{class:"login-btn",onClick:f.handleLogin},{default:n((()=>[i("登 录")])),_:1},8,["onClick"])])),_:1})])),_:1})}],["__scopeId","data-v-973a11b9"]]);export{g as default};

File diff suppressed because one or more lines are too long

@ -1 +0,0 @@
import{j as a,c as s,w as l,i as e,o as t,b as o,d as c,k as n,h as u,f as i}from"./index-CWmHAt1Y.js";import{_ as d}from"./_plugin-vue_export-helper.BCo6x5W8.js";const f=d({methods:{logout(){a({url:"/pages/login/login"})}}},[["render",function(a,d,f,r,_,p){const m=n,g=u,v=e,b=i;return t(),s(v,{class:"profile-container"},{default:l((()=>[o(v,{class:"avatar-section"},{default:l((()=>[o(m,{class:"avatar",src:"/h5/static/avatar.png",mode:"aspectFill"}),o(g,{class:"username"},{default:l((()=>[c("管理员")])),_:1})])),_:1}),o(v,{class:"info-section"},{default:l((()=>[o(v,{class:"info-item"},{default:l((()=>[o(g,{class:"label"},{default:l((()=>[c("账号:")])),_:1}),o(g,{class:"value"},{default:l((()=>[c("admin")])),_:1})])),_:1}),o(v,{class:"info-item"},{default:l((()=>[o(g,{class:"label"},{default:l((()=>[c("角色:")])),_:1}),o(g,{class:"value"},{default:l((()=>[c("系统管理员")])),_:1})])),_:1})])),_:1}),o(b,{class:"logout-btn",onClick:p.logout},{default:l((()=>[c("退出登录")])),_:1},8,["onClick"])])),_:1})}],["__scopeId","data-v-e699a2d9"]]);export{f as default};

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save