if (typeof Promise !== "undefined" && !Promise.prototype.finally) { Promise.prototype.finally = function(callback) { const promise = this.constructor; return this.then( (value) => promise.resolve(callback()).then(() => value), (reason) => promise.resolve(callback()).then(() => { throw reason; }) ); }; } ; if (typeof uni !== "undefined" && uni && uni.requireGlobal) { const global = uni.requireGlobal(); ArrayBuffer = global.ArrayBuffer; Int8Array = global.Int8Array; Uint8Array = global.Uint8Array; Uint8ClampedArray = global.Uint8ClampedArray; Int16Array = global.Int16Array; Uint16Array = global.Uint16Array; Int32Array = global.Int32Array; Uint32Array = global.Uint32Array; Float32Array = global.Float32Array; Float64Array = global.Float64Array; BigInt64Array = global.BigInt64Array; BigUint64Array = global.BigUint64Array; } ; if (uni.restoreGlobal) { uni.restoreGlobal(Vue, weex, plus, setTimeout, clearTimeout, setInterval, clearInterval); } (function(vue) { "use strict"; const _export_sfc = (sfc, props) => { const target = sfc.__vccOpts || sfc; for (const [key, val] of props) { target[key] = val; } return target; }; const _sfc_main$5 = { data() { return { currentDate: "", taskList: [ { title: "仓库A盘点", time: "2024-06-01 10:00", status: "pending", statusText: "待完成" }, { title: "仓库B盘点", time: "2024-05-28 14:30", status: "completed", statusText: "已完成" }, { title: "仓库C盘点", time: "2024-05-25 09:15", status: "in-progress", statusText: "进行中" } ], showH5Scan: false, html5QrCode: null, scanType: "" // 'inventory' or 'view' }; }, onLoad() { this.updateDate(); }, methods: { updateDate() { const now = /* @__PURE__ */ new Date(); const year = now.getFullYear(); const month = String(now.getMonth() + 1).padStart(2, "0"); const day = String(now.getDate()).padStart(2, "0"); this.currentDate = `${year}-${month}-${day}`; }, handleScan(type) { this.scanType = type; uni.scanCode({ success: (res) => { let url = res.result; let id = ""; const match = url.match(/[?&]id=([^&]+)/); if (match) { id = match[1]; } if (!id) { uni.showToast({ title: "二维码无效", icon: "none" }); return; } if (type === "inventory") { uni.navigateTo({ url: `/pages/inventory/inventory?code=${encodeURIComponent(id)}` }); } else { uni.navigateTo({ url: `/pages/inventory/inventory?code=${encodeURIComponent(id)}&view=1` }); } }, fail: () => { uni.showToast({ title: "扫码失败", icon: "none" }); } }); }, scanInventory() { this.handleScan("inventory"); }, scanView() { this.handleScan("view"); }, closeH5Scan() { this.showH5Scan = false; if (this.html5QrCode) { this.html5QrCode.stop().then(() => { this.html5QrCode.clear(); }); } }, goTaskDetail(item) { uni.navigateTo({ url: `/pages/task-detail/task-detail?title=${encodeURIComponent(item.title)}&time=${encodeURIComponent(item.time)}&status=${item.status}&statusText=${encodeURIComponent(item.statusText)}` }); } } }; function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) { return vue.openBlock(), vue.createElementBlock("view", { class: "index-bg" }, [ vue.createElementVNode("view", { class: "index-content" }, [ vue.createElementVNode("view", { class: "btn-group" }, [ vue.createElementVNode("button", { class: "main-btn", onClick: _cache[0] || (_cache[0] = (...args) => $options.scanInventory && $options.scanInventory(...args)) }, "扫码盘点"), vue.createElementVNode("button", { class: "main-btn outline", onClick: _cache[1] || (_cache[1] = (...args) => $options.scanView && $options.scanView(...args)) }, "扫码查看") ]), vue.createElementVNode("view", { class: "task-section" }, [ vue.createElementVNode("view", { class: "task-title" }, "盘点任务列表"), vue.createElementVNode("view", { class: "task-list" }, [ (vue.openBlock(true), vue.createElementBlock( vue.Fragment, null, vue.renderList($data.taskList, (item, idx) => { return vue.openBlock(), vue.createElementBlock("view", { class: "task-item", key: idx, onClick: ($event) => $options.goTaskDetail(item) }, [ vue.createElementVNode("view", { class: "task-info" }, [ vue.createElementVNode( "text", { class: "task-name" }, vue.toDisplayString(item.title), 1 /* TEXT */ ), vue.createElementVNode( "text", { class: "task-time" }, vue.toDisplayString(item.time), 1 /* TEXT */ ) ]), vue.createElementVNode( "text", { class: vue.normalizeClass(["task-status", item.status]) }, vue.toDisplayString(item.statusText), 3 /* TEXT, CLASS */ ) ], 8, ["onClick"]); }), 128 /* KEYED_FRAGMENT */ )) ]) ]), vue.createCommentVNode(" H5扫码弹窗 "), $data.showH5Scan ? (vue.openBlock(), vue.createElementBlock("div", { key: 0, class: "h5-scan-modal" }, [ vue.createElementVNode("div", { id: "reader", style: { "width": "300px", "height": "300px", "margin": "0 auto" } }), vue.createElementVNode("button", { onClick: _cache[2] || (_cache[2] = (...args) => $options.closeH5Scan && $options.closeH5Scan(...args)) }, "关闭") ])) : vue.createCommentVNode("v-if", true) ]) ]); } const PagesIndexIndex = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["render", _sfc_render$4], ["__file", "D:/Lynn/Langye/stocktaking/pages/index/index.vue"]]); function formatAppLog(type, filename, ...args) { if (uni.__log__) { uni.__log__(type, filename, ...args); } else { console[type].apply(console, [...args, filename]); } } const BASE_API = "http://192.168.60.99:8004/"; const config = { BASE_API }; function login(username, password) { return new Promise((resolve, reject) => { uni.request({ url: BASE_API + "api/admin/auth/login", method: "POST", data: { username, password }, success: resolve, fail: reject }); }); } function getUserInfo() { const token = uni.getStorageSync("token"); return new Promise((resolve, reject) => { uni.request({ url: BASE_API + "api/admin/auth/me", method: "POST", data: { token }, success: resolve, fail: reject }); }); } function getMaterialInfo(id) { const token = uni.getStorageSync("token"); return new Promise((resolve, reject) => { uni.request({ url: BASE_API + "api/admin/material-infos/show", method: "GET", data: { id, token }, success: resolve, fail: reject }); }); } function saveInventoryCheck(data) { const token = uni.getStorageSync("token"); return new Promise((resolve, reject) => { formatAppLog("log", "at api.js:70", "confirm接口"); uni.request({ url: BASE_API + "api/admin/material-infos-plan-link/confirm", method: "POST", data: { ...data, token }, success: resolve, fail: reject }); }); } function uploadFile(filePath) { const token = uni.getStorageSync("token"); return new Promise((resolve, reject) => { uni.uploadFile({ url: BASE_API + "api/admin/upload-file", filePath, name: "file", formData: { token }, success: (res) => { try { const data = JSON.parse(res.data); resolve(data); } catch (e) { reject(e); } }, fail: reject }); }); } const _sfc_main$4 = { data() { return { userInfo: {} }; }, onShow() { getUserInfo().then((response) => { if (response.data) { formatAppLog("log", "at pages/profile/profile.vue:36", "返回数据", response.data); this.userInfo = response.data; } else { uni.showToast({ title: response.data.errmsg || "获取信息失败", icon: "none" }); } }).catch(() => { uni.showToast({ title: "网络错误", icon: "none" }); }); }, methods: { logout() { uni.removeStorageSync("token"); uni.reLaunch({ url: "/pages/login/login" }); } } }; function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) { return vue.openBlock(), vue.createElementBlock("view", { class: "profile-container" }, [ vue.createElementVNode("view", { class: "avatar-section" }, [ vue.createElementVNode("image", { class: "avatar", src: $data.userInfo.avatar || "/static/profile/avatar.png", mode: "aspectFill" }, null, 8, ["src"]) ]), vue.createElementVNode("view", { class: "info-section" }, [ vue.createElementVNode("view", { class: "info-item" }, [ vue.createElementVNode("text", { class: "label" }, "用户名:"), vue.createElementVNode( "text", { class: "value" }, vue.toDisplayString($data.userInfo.username || "-"), 1 /* TEXT */ ) ]), vue.createElementVNode("view", { class: "info-item" }, [ vue.createElementVNode("text", { class: "label" }, "姓名:"), vue.createElementVNode( "text", { class: "value" }, vue.toDisplayString($data.userInfo.name || "-"), 1 /* TEXT */ ) ]), vue.createElementVNode("view", { class: "info-item" }, [ vue.createElementVNode("text", { class: "label" }, "部门:"), vue.createElementVNode( "text", { class: "value" }, vue.toDisplayString($data.userInfo.department && $data.userInfo.department.name || "-"), 1 /* TEXT */ ) ]) ]), vue.createElementVNode("button", { class: "logout-btn", onClick: _cache[0] || (_cache[0] = (...args) => $options.logout && $options.logout(...args)) }, "退出登录") ]); } const PagesProfileProfile = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["render", _sfc_render$3], ["__file", "D:/Lynn/Langye/stocktaking/pages/profile/profile.vue"]]); const _sfc_main$3 = { data() { return { username: "", password: "" }; }, methods: { handleLogin() { if (!this.username || !this.password) { uni.showToast({ title: "请输入用户名和密码", icon: "none" }); return; } uni.showLoading({ title: "登录中...", mask: true }); login(this.username, this.password).then((response) => { uni.hideLoading(); formatAppLog("log", "at pages/login/login.vue:41", response); if (response.data && response.data.errcode !== void 0) { uni.showToast({ title: response.data.errmsg || "登录失败", icon: "none" }); } else if (response.data) { formatAppLog("log", "at pages/login/login.vue:48", response.data.access_token); if (response.data.access_token) { uni.setStorageSync("token", response.data.access_token); } uni.showToast({ title: "登录成功", icon: "success", duration: 1500 }); setTimeout(() => { uni.switchTab({ url: "/pages/index/index" }); }, 1500); } }).catch(() => { uni.hideLoading(); uni.showToast({ title: "网络错误", icon: "none" }); }); } } }; function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) { return vue.openBlock(), vue.createElementBlock("view", { class: "login-bg" }, [ vue.createElementVNode("view", { class: "login-card" }, [ vue.createElementVNode("view", { class: "login-title" }, "欢迎登录"), vue.createElementVNode("view", { class: "login-subtitle" }, "河道防汛物资管理系统"), vue.createElementVNode("view", { class: "form-group" }, [ vue.createElementVNode("text", { class: "form-label" }, "用户名"), vue.withDirectives(vue.createElementVNode( "input", { class: "form-input", type: "text", "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.username = $event), placeholder: "请输入用户名" }, null, 512 /* NEED_PATCH */ ), [ [vue.vModelText, $data.username] ]) ]), vue.createElementVNode("view", { class: "form-group" }, [ vue.createElementVNode("text", { class: "form-label" }, "密码"), vue.withDirectives(vue.createElementVNode( "input", { class: "form-input", type: "password", "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.password = $event), placeholder: "请输入密码" }, null, 512 /* NEED_PATCH */ ), [ [vue.vModelText, $data.password] ]) ]), vue.createElementVNode("button", { class: "login-btn", onClick: _cache[2] || (_cache[2] = (...args) => $options.handleLogin && $options.handleLogin(...args)) }, "登 录") ]) ]); } const PagesLoginLogin = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["render", _sfc_render$2], ["__file", "D:/Lynn/Langye/stocktaking/pages/login/login.vue"]]); const _sfc_main$2 = { data() { return { result: "" }; }, methods: { doScan() { uni.scanCode({ success: (res) => { this.result = res.result; }, fail: () => { uni.showToast({ title: "扫码失败", icon: "none" }); } }); } } }; function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) { return vue.openBlock(), vue.createElementBlock("view", { class: "scan-bg" }, [ vue.createElementVNode("view", { class: "scan-title" }, "扫码盘点"), vue.createElementVNode("button", { class: "scan-btn", onClick: _cache[0] || (_cache[0] = (...args) => $options.doScan && $options.doScan(...args)) }, "点击开始扫码"), $data.result ? (vue.openBlock(), vue.createElementBlock("view", { key: 0, class: "scan-result" }, [ vue.createElementVNode("text", { class: "result-label" }, "扫码结果:"), vue.createElementVNode( "text", { class: "result-value" }, vue.toDisplayString($data.result), 1 /* TEXT */ ) ])) : vue.createCommentVNode("v-if", true) ]); } const PagesScanScan = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["render", _sfc_render$1], ["__file", "D:/Lynn/Langye/stocktaking/pages/scan/scan.vue"]]); const _sfc_main$1 = { data() { return { isViewMode: false, stockQty: "", countQty: "", remark: "", photo: "", photos: [], materialName: "", materialSpec: "", unit: "", materialCode: "", material_infos_plan_id: "", materialId: "" }; }, onLoad(options) { this.isViewMode = options.view === "1"; this.date = this.getToday(); this.materialId = options.code; formatAppLog("log", "at pages/inventory/inventory.vue:73", "materialId:", this.materialId); if (this.materialId) { getMaterialInfo(this.materialId).then((response) => { formatAppLog("log", "at pages/inventory/inventory.vue:76", "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"; } else { uni.showToast({ title: "未获取到物资信息", icon: "none" }); } }).catch(() => { uni.showToast({ title: "获取物资信息失败", icon: "none" }); }); } }, methods: { getToday() { const now = /* @__PURE__ */ new Date(); const y = now.getFullYear(); const m = String(now.getMonth() + 1).padStart(2, "0"); const d = String(now.getDate()).padStart(2, "0"); return `${y}-${m}-${d}`; }, choosePhoto() { if (this.photos.length >= 3) { uni.showToast({ title: "最多上传3张照片", icon: "none" }); return; } uni.chooseImage({ count: 3 - this.photos.length, success: (res) => { this.photos = [...this.photos, ...res.tempFilePaths]; } }); }, deletePhoto(index) { this.photos.splice(index, 1); }, async submit() { if (!this.countQty) { uni.showToast({ title: "请输入盘点数量", icon: "none" }); return; } if (!/^(0|[1-9][0-9]*)$/.test(this.countQty)) { uni.showToast({ title: "盘点数量必须为0或正整数", icon: "none" }); return; } uni.showLoading({ title: "提交中..." }); let file_ids = []; for (let i = 0; i < this.photos.length; i++) { try { const res = await uploadFile(this.photos[i]); if (res && res.id) { file_ids.push(res.id); } } catch (e) { uni.hideLoading(); uni.showToast({ title: "图片上传失败", icon: "none" }); return; } } const data = { status: "1", material_info_id: this.materialId, // 或实际物资id字段 check_num: this.countQty, remark: this.remark, file_ids // 其他参数如 material_infos_plan_id、status、check_date 可按需补充 }; formatAppLog("log", "at pages/inventory/inventory.vue:149", "data:", data); saveInventoryCheck(data).then((res) => { formatAppLog("log", "at pages/inventory/inventory.vue:152", "res:", res); uni.hideLoading(); if (res && (!res.data || res.data.errcode === void 0)) { uni.showToast({ title: "盘点提交成功", icon: "success" }); setTimeout(() => { uni.reLaunch({ url: "/pages/index/index" }); }, 1200); } else { uni.showToast({ title: res.data.errmsg || "提交失败", icon: "none" }); } }).catch(() => { uni.hideLoading(); uni.showToast({ title: "提交失败", icon: "none" }); }); } } }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { return vue.openBlock(), vue.createElementBlock("view", { class: "inventory-bg" }, [ vue.createElementVNode("view", { class: "inventory-card" }, [ vue.createElementVNode("view", { class: "readonly-group" }, [ vue.createElementVNode("view", { class: "readonly-item" }, [ vue.createElementVNode("text", { class: "readonly-label" }, "物资名称"), vue.createElementVNode( "text", { class: "readonly-value" }, vue.toDisplayString($data.materialName), 1 /* TEXT */ ) ]), vue.createElementVNode("view", { class: "readonly-item" }, [ vue.createElementVNode("text", { class: "readonly-label" }, "物质代码"), vue.createElementVNode( "text", { class: "readonly-value" }, vue.toDisplayString($data.materialCode), 1 /* TEXT */ ) ]), vue.createElementVNode("view", { class: "readonly-item" }, [ vue.createElementVNode("text", { class: "readonly-label" }, "规格型号"), vue.createElementVNode( "text", { class: "readonly-value" }, vue.toDisplayString($data.materialSpec), 1 /* TEXT */ ) ]), vue.createElementVNode("view", { class: "readonly-item" }, [ vue.createElementVNode("text", { class: "readonly-label" }, "库存数量"), vue.createElementVNode( "text", { class: "readonly-value" }, vue.toDisplayString($data.stockQty) + vue.toDisplayString($data.unit ? " " + $data.unit : ""), 1 /* TEXT */ ) ]) ]), !$data.isViewMode ? (vue.openBlock(), vue.createElementBlock("view", { key: 0, class: "form-group" }, [ vue.createElementVNode("text", { class: "form-label" }, "盘点数量"), vue.withDirectives(vue.createElementVNode( "input", { class: "form-input", type: "number", "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.countQty = $event), placeholder: "请输入盘点数量" }, null, 512 /* NEED_PATCH */ ), [ [vue.vModelText, $data.countQty] ]) ])) : vue.createCommentVNode("v-if", true), !$data.isViewMode ? (vue.openBlock(), vue.createElementBlock("view", { key: 1, class: "form-group" }, [ vue.createElementVNode("text", { class: "form-label" }, "盘点备注"), vue.withDirectives(vue.createElementVNode( "textarea", { class: "form-textarea", "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.remark = $event), placeholder: "请输入备注信息" }, null, 512 /* NEED_PATCH */ ), [ [vue.vModelText, $data.remark] ]) ])) : vue.createCommentVNode("v-if", true), !$data.isViewMode ? (vue.openBlock(), vue.createElementBlock("view", { key: 2, class: "form-group" }, [ vue.createElementVNode("text", { class: "form-label" }, "照片上传"), vue.createElementVNode("view", { class: "photo-upload" }, [ (vue.openBlock(true), vue.createElementBlock( vue.Fragment, null, vue.renderList($data.photos, (photo, index) => { return vue.openBlock(), vue.createElementBlock("view", { key: index, class: "photo-preview" }, [ vue.createElementVNode("image", { src: photo, mode: "aspectFill", class: "photo-img" }, null, 8, ["src"]), vue.createElementVNode("view", { class: "photo-del", onClick: ($event) => $options.deletePhoto(index) }, [ vue.createElementVNode("text", { class: "delete-icon" }, "×") ], 8, ["onClick"]) ]); }), 128 /* KEYED_FRAGMENT */ )), $data.photos.length < 3 ? (vue.openBlock(), vue.createElementBlock("button", { key: 0, class: "photo-btn", onClick: _cache[2] || (_cache[2] = (...args) => $options.choosePhoto && $options.choosePhoto(...args)) }, [ vue.createElementVNode("text", { class: "iconfont icon-camera" }), vue.createElementVNode("text", { class: "btn-text" }, "上传照片") ])) : vue.createCommentVNode("v-if", true) ]) ])) : vue.createCommentVNode("v-if", true), !$data.isViewMode ? (vue.openBlock(), vue.createElementBlock("button", { key: 3, class: "submit-btn", onClick: _cache[3] || (_cache[3] = (...args) => $options.submit && $options.submit(...args)) }, "提交盘点")) : vue.createCommentVNode("v-if", true) ]) ]); } const PagesInventoryInventory = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render], ["__file", "D:/Lynn/Langye/stocktaking/pages/inventory/inventory.vue"]]); __definePage("pages/index/index", PagesIndexIndex); __definePage("pages/profile/profile", PagesProfileProfile); __definePage("pages/login/login", PagesLoginLogin); __definePage("pages/scan/scan", PagesScanScan); __definePage("pages/inventory/inventory", PagesInventoryInventory); const _sfc_main = { onLaunch: function() { formatAppLog("log", "at App.vue:4", "App Launch"); const token = uni.getStorageSync("token"); if (!token) { uni.reLaunch({ url: "/pages/login/login" }); } else { uni.reLaunch({ url: "/pages/index/index" }); } }, onShow: function() { formatAppLog("log", "at App.vue:13", "App Show"); }, onHide: function() { formatAppLog("log", "at App.vue:16", "App Hide"); } }; const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "D:/Lynn/Langye/stocktaking/App.vue"]]); function createApp() { const app = vue.createVueApp(App); app.config.globalProperties.$config = config; return { app }; } const { app: __app__, Vuex: __Vuex__, Pinia: __Pinia__ } = createApp(); uni.Vuex = __Vuex__; uni.Pinia = __Pinia__; __app__.provide("__globalStyles", __uniConfig.styles); __app__._component.mpType = "app"; __app__._component.render = () => { }; __app__.mount("#app"); })(Vue);