From 998310cf2e28bdbfc8fda4b0c947b6053b1ecd2f Mon Sep 17 00:00:00 2001 From: feie9454 Date: Tue, 30 Sep 2025 09:18:31 +0800 Subject: [PATCH] 0930-m --- src/App.vue | 6 +- src/manifest.json | 3 +- src/pages.json | 101 +- src/pages/api/fixedAssets.js | 712 ++ src/pages/api/inventory.js | 70 + src/pages/consumables/distribution.vue | 144 + src/pages/consumables/inventory-end.vue | 67 + src/pages/consumables/inventory-ing.vue | 139 + src/pages/consumables/inventory-plan.vue | 101 + src/pages/consumables/plan.vue | 159 + src/pages/fixed-assets/detail.vue | 140 + src/pages/fixed-assets/index.vue | 442 + src/pages/fixed-assets/inventory-end.vue | 64 + src/pages/fixed-assets/inventory-ing.vue | 99 + src/pages/fixed-assets/inventory-plan.vue | 170 + src/pages/fixed-assets/maintenance-info.vue | 74 + src/pages/fixed-assets/my-borrows.vue | 133 + src/pages/fixed-assets/scan.vue | 150 + src/pages/index/index.vue | 234 +- src/pages/login/index.vue | 78 +- src/pages/mine/index.vue | 393 +- src/static/icons/home-selected.png | Bin 0 -> 34110 bytes src/static/icons/messages-selected.png | Bin 0 -> 36769 bytes src/static/icons/profile-selected.png | Bin 0 -> 17490 bytes src/static/icons/tabbar/home-selected.png | Bin 0 -> 13804 bytes src/static/icons/tabbar/home.png | Bin 0 -> 15559 bytes src/static/icons/tabbar/messages-selected.png | Bin 0 -> 13600 bytes src/static/icons/tabbar/messages.png | Bin 0 -> 15457 bytes src/static/icons/tabbar/profile-selected.png | Bin 0 -> 10947 bytes src/static/icons/tabbar/profile.png | Bin 0 -> 12346 bytes src/static/icons/tabbar/tasks-selected.png | Bin 0 -> 17072 bytes src/static/icons/tabbar/tasks.png | Bin 0 -> 20037 bytes src/static/icons/tasks-selected.png | Bin 0 -> 45600 bytes src/static/icons/图标.psd | Bin 979404 -> 1251026 bytes src/uni_modules/jz-h5-scanCode/CHANGELOG.md | 244 + src/uni_modules/jz-h5-scanCode/README.md | 364 + .../jz-h5-scanCode/js/cameraScanner.js | 513 + .../js/imageProcessor.worker.js | 286 + src/uni_modules/jz-h5-scanCode/js/index.js | 2162 ++++ .../jz-h5-scanCode/js/qrCodeDecoder.js | 1197 ++ .../jz-h5-scanCode/js/uiManager.js | 1057 ++ src/uni_modules/jz-h5-scanCode/js/utils.js | 332 + .../jz-h5-scanCode/js/workerManager.js | 533 + src/uni_modules/jz-h5-scanCode/package.json | 106 + src/uni_modules/jz-h5-scanCode/static/jsQR.js | 10102 ++++++++++++++++ .../jz-h5-scanCode/static/quagga.min.js | 1 + 46 files changed, 20270 insertions(+), 106 deletions(-) create mode 100644 src/pages/api/fixedAssets.js create mode 100644 src/pages/api/inventory.js create mode 100644 src/pages/consumables/distribution.vue create mode 100644 src/pages/consumables/inventory-end.vue create mode 100644 src/pages/consumables/inventory-ing.vue create mode 100644 src/pages/consumables/inventory-plan.vue create mode 100644 src/pages/consumables/plan.vue create mode 100644 src/pages/fixed-assets/detail.vue create mode 100644 src/pages/fixed-assets/index.vue create mode 100644 src/pages/fixed-assets/inventory-end.vue create mode 100644 src/pages/fixed-assets/inventory-ing.vue create mode 100644 src/pages/fixed-assets/inventory-plan.vue create mode 100644 src/pages/fixed-assets/maintenance-info.vue create mode 100644 src/pages/fixed-assets/my-borrows.vue create mode 100644 src/pages/fixed-assets/scan.vue create mode 100644 src/static/icons/home-selected.png create mode 100644 src/static/icons/messages-selected.png create mode 100644 src/static/icons/profile-selected.png create mode 100644 src/static/icons/tabbar/home-selected.png create mode 100644 src/static/icons/tabbar/home.png create mode 100644 src/static/icons/tabbar/messages-selected.png create mode 100644 src/static/icons/tabbar/messages.png create mode 100644 src/static/icons/tabbar/profile-selected.png create mode 100644 src/static/icons/tabbar/profile.png create mode 100644 src/static/icons/tabbar/tasks-selected.png create mode 100644 src/static/icons/tabbar/tasks.png create mode 100644 src/static/icons/tasks-selected.png create mode 100644 src/uni_modules/jz-h5-scanCode/CHANGELOG.md create mode 100644 src/uni_modules/jz-h5-scanCode/README.md create mode 100644 src/uni_modules/jz-h5-scanCode/js/cameraScanner.js create mode 100644 src/uni_modules/jz-h5-scanCode/js/imageProcessor.worker.js create mode 100644 src/uni_modules/jz-h5-scanCode/js/index.js create mode 100644 src/uni_modules/jz-h5-scanCode/js/qrCodeDecoder.js create mode 100644 src/uni_modules/jz-h5-scanCode/js/uiManager.js create mode 100644 src/uni_modules/jz-h5-scanCode/js/utils.js create mode 100644 src/uni_modules/jz-h5-scanCode/js/workerManager.js create mode 100644 src/uni_modules/jz-h5-scanCode/package.json create mode 100644 src/uni_modules/jz-h5-scanCode/static/jsQR.js create mode 100644 src/uni_modules/jz-h5-scanCode/static/quagga.min.js diff --git a/src/App.vue b/src/App.vue index 6086575..c2446a7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -10,4 +10,8 @@ onHide(() => { console.log("App Hide"); }); - + diff --git a/src/manifest.json b/src/manifest.json index ad484c8..b1c0b46 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -44,7 +44,8 @@ "ios" : {}, /* SDK配置 */ "sdkConfigs" : {} - } + }, + "nativePlugins" : {} }, /* 快应用特有相关 */ "quickapp" : {}, diff --git a/src/pages.json b/src/pages.json index acb80b7..9f07267 100644 --- a/src/pages.json +++ b/src/pages.json @@ -42,6 +42,90 @@ "navigationBarTitleText": "我的" } } + , + { + "path": "pages/fixed-assets/index", + "style": { + "navigationBarTitleText": "固定资产", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/fixed-assets/detail", + "style": { + "navigationBarTitleText": "资产详情" + } + }, + { + "path": "pages/fixed-assets/maintenance-info", + "style": { + "navigationBarTitleText": "维修信息" + } + }, + { + "path": "pages/fixed-assets/my-borrows", + "style": { + "navigationBarTitleText": "我的借用" + } + } + , + { + "path": "pages/fixed-assets/inventory-plan", + "style": { + "navigationBarTitleText": "资产盘点计划" + } + }, + { + "path": "pages/fixed-assets/inventory-end", + "style": { + "navigationBarTitleText": "盘点计划(已结束)" + } + }, + { + "path": "pages/fixed-assets/inventory-ing", + "style": { + "navigationBarTitleText": "盘点计划(进行中)" + } + } + , + { + "path": "pages/consumables/plan", + "style": { + "navigationBarTitleText": "易耗品领用计划" + } + }, + { + "path": "pages/consumables/distribution", + "style": { + "navigationBarTitleText": "发放物资" + } + } +, + { + "path": "pages/consumables/inventory-plan", + "style": { + "navigationBarTitleText": "易耗品盘点计划" + } + }, + { + "path": "pages/consumables/inventory-end", + "style": { + "navigationBarTitleText": "易耗品盘点(已结束)" + } + }, + { + "path": "pages/consumables/inventory-ing", + "style": { + "navigationBarTitleText": "易耗品盘点(进行中)" + } + } +, + { + "path": "pages/fixed-assets/scan", + "style": { + "navigationBarTitleText": "扫码查看信息" + } + } ], "globalStyle": { "navigationBarTextStyle": "black", @@ -55,30 +139,31 @@ "backgroundColor": "#ffffff", "borderStyle": "black", "height": "64px", + "fontSize": "12px", "list": [ { "pagePath": "pages/index/index", "text": "首页", - "iconPath": "static/icons/home.png", - "selectedIconPath": "static/icons/home.png" + "iconPath": "static/icons/tabbar/home.png", + "selectedIconPath": "static/icons/tabbar/home-selected.png" }, { "pagePath": "pages/message/index", "text": "消息", - "iconPath": "static/icons/messages.png", - "selectedIconPath": "static/icons/messages.png" + "iconPath": "static/icons/tabbar/messages.png", + "selectedIconPath": "static/icons/tabbar/messages-selected.png" }, { "pagePath": "pages/task/index", "text": "任务", - "iconPath": "static/icons/tasks.png", - "selectedIconPath": "static/icons/tasks.png" + "iconPath": "static/icons/tabbar/tasks.png", + "selectedIconPath": "static/icons/tabbar/tasks-selected.png" }, { "pagePath": "pages/mine/index", "text": "我的", - "iconPath": "static/icons/profile.png", - "selectedIconPath": "static/icons/profile.png" + "iconPath": "static/icons/tabbar/profile.png", + "selectedIconPath": "static/icons/tabbar/profile-selected.png" } ] } diff --git a/src/pages/api/fixedAssets.js b/src/pages/api/fixedAssets.js new file mode 100644 index 0000000..07ae547 --- /dev/null +++ b/src/pages/api/fixedAssets.js @@ -0,0 +1,712 @@ +const BASE_URL = 'http://10.3.1.212:8089';//定义后端基础接口地址 +import config from '../../config.js'; // 引入配置文件 + + + + +// 根据手机号搜索用户列表 +export function searchUserByMobile(mobile) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/assetInformation/getUserListByUserMobile`, + method: 'GET', + header: getHeaders(), + data: { + mobile: mobile + }, + success: (res) => { + console.log(res); + + if (res.statusCode === 200) { + resolve(res.data); + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + + +//——————————————————————————————————————————————————————时间———————————————————————————————————————————————————— +// 数字补零工具函数(辅助日期格式化) +const formatNumber = n => { + n = n.toString()// 1. 将数字转为字符串(如 5 → "5",12 → "12") + return n[1] ? n : '0' + n// 2. 补零逻辑:若字符串长度<2(如 "5"),则在前面加"0" → "05";否则直接返回(如 "12") +} + +//时间格式化函数(仅返回时分秒) +const formatTime = date => { + date = new Date(date);// 1. 将输入的日期参数(可能是时间戳/字符串)转为标准 Date 对象 + const hour = date.getHours()// 2. 获取小时(0-23 + const minute = date.getMinutes()// 3. 获取分钟(0-59) + const second = date.getSeconds()// 4. 获取秒(0-59) + // 5. 拼接为 "时:分:秒" 格式(调用 formatNumber 补零),如 "09:05:03 + return `${formatNumber(hour)}:${formatNumber(minute)}:${formatNumber(second)}` +} + + + +//日期格式化函数(仅返回年月日) +const formatDate = date => { + date = new Date(date);// 1. 转为标准 Date 对象 + const year = date.getFullYear()// 2. 获取完整年份(如 2024) + const month = date.getMonth() + 1// 3. 获取月份(注意:Date 中月份是 0-11,需+1 才是实际月份,如 2→3月 + const day = date.getDate()// 4. 获取日期(1-31) + // 5. 拼接为 "年-月-日" 格式(补零),如 "2024-03-15" + return `${year}-${formatNumber(month)}-${formatNumber(day)}` +} + +//完整日期时间格式化函数(年月日 + 时分秒) +const formatDateTime = date => { + return `${formatDate(date)} ${formatTime(date)}` +} +//—————————————————————————————————————————————————————————————————————————————————————————————————————————————————— + + +//用户信息初始化与判断 +let staff = uni.getStorageSync('staff'); // 1. 从 UniApp 本地缓存中读取 "staff"(用户信息,如ID、医院ID、手机号等) +let staffisnull = (staff == null || staff == undefined || staff == '');// 2. 判断用户信息是否为空(null/undefined/空字符串) + + +//统一请求头配置函数(核心!!!!!!!!!!!!!!!!!!!!所有接口共用) +export function getHeaders() { + const staff = uni.getStorageSync('staff') || null// 1. 再次读取用户信息(避免缓存过期,确保最新) + // console.log("用户信息:",staff)// 2. 控制台打印用户信息,用于开发调试 + const staffisnull = !staff // 3. 简化判断:用户信息为空则为 true,否则为 false +// 4. 返回请求头对象(接口请求时会携带这些信息,供后端验证) + return { + 'content-type': 'application/json',// ① 声明请求体格式为 JSON(后端需按 JSON 解析数据) + //'Authorization': staffisnull ? null : `Bearer ${uni.getStorageSync('token')}`, + 'hosp-ID': staffisnull ? config.defaultHospId : staff.hosp_id,// ③ 医院ID:用户未登录用配置文件的默认值,登录后用用户所属医院ID + 'user-ID': staffisnull ? null : staff.id,// ④ 用户ID:用户未登录为 null,登录后用用户ID(后端用于识别请求用户) + 'datetime': formatDateTime(new Date()),// ⑤ 请求时间:当前完整日期时间(后端可用于校验请求时效性) + 'createby': staffisnull ? null : staff.id// ⑥ 创建人ID:与 user-ID 类似,用于后端记录操作人 + }////核心作用:统一所有接口的请求头格式,避免每个接口重复写头信息,同时支持 “登录 / 未登录” 状态的动态适配。 +} + +//————————————————————————————————————————————————————固定资产相关———————————————————————————————————————————————————————— +//分页请求固定资产数据 +//作用:前端加载固定资产列表时调用(如 “资产列表页” 分页加载数据)。 + + +// 所有接口函数均遵循 “返回 Promise + 封装 uni.request” 的模式,目的是: + +// 统一接口调用方式(用 async/await 或 .then() 处理异步结果); +// 统一成功 / 失败判断逻辑(以 HTTP 状态码 200 为成功标准); +// 失败时通过 reject 抛出错误,便于前端捕获处理(如提示 “请求失败”)。 +export function fetchFixedAssets(pageNum, pageSize) { + return new Promise((resolve, reject) => { // 返回 Promise,支持异步调用 + uni.request({ // UniApp 内置的网络请求方法 + url: `${BASE_URL}/api/assetInformation/page?pageNum=${pageNum}&pageSize=${pageSize}`,// 接口路径:拼接基础地址+分页参数(pageNum=页码,pageSize=每页条数) + method: 'POST',// 请求方法:POST + data: {// 请求体:空查询条件(后端可能支持按条件筛选,此处默认无筛选) + query:{}, + }, + + header:getHeaders(),// 请求头:调用上面的 getHeaders() 获取统一头信息 + + success: (res) => { // 请求成功回调(后端有响应,无论业务成功与否) + if (res.statusCode === 200) {// 若 HTTP 状态码为 200(表示网络请求成功) + resolve(res.data); // 根据你的接口返回结构调整 // 将后端返回的业务数据传给前端(前端用 .then() 接收) + } else { // HTTP 状态码非 200(如 404 接口不存在、500 后端报错) + reject(res); // 抛出错误(前端用 .catch() 捕获) + } + }, + fail: (err) => {// 请求失败回调(如网络超时、断网) + reject(err);// 抛出错误 + } + }); + }); +} + + +//按名称搜索固定资产 +//分页请求固定资产数据 +//作用:前端通过 “资产名称” 搜索特定固定资产时调用(如搜索 “电脑”“打印机”) +export function searchFixedAssets(name) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/assetInformation/list`,// 接口路径:资产搜索接口 + method: 'POST', + data: { + assetName:name // 请求体:传递搜索关键词(assetName=资产名称) + }, + + header:getHeaders(), + + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + + +//通过id获取设备信息 +export function fetchAssetInfoById(id) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/assetInformation/list`, // 接口路径:获取单条资产信息 + method: 'POST', + header:getHeaders(), + data:{ + + "assetSn":id // 请求体:传递资产编号(assetSn=资产唯一编号) + + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} +//通过id获取设备维修信息 +export function fetchMaintenanceInfoById(id) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/asset/maintenance/getByAssetId/${id}`, // 接口路径:拼接资产ID(RESTful 风格) + method: 'GET', // 请求方法:GET(此处用 GET 传递路径参数) + header:getHeaders(), + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + + +//借用资产 +export function borrowAssetById(addDTO) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/asset/borrow/add`, // 接口路径:资产借用申请接口 + method: 'POST', + header: getHeaders(), + data: { // 请求体:传递借用所需的所有参数(从前端表单收集的信息) + assetId: addDTO.assetId, // 资产ID + assetName: addDTO.assetName, // 资产名称 + borrowDate: addDTO.borrowDate,// 借用日期(需前端传递格式化后的日期) + borrowerId: addDTO.borrowerId,// 借用人ID + borrowerMobile: addDTO.borrowerMobile, // 借用人手机号 + lenderId: addDTO.lenderId,// 出借人ID + lenderMobile: addDTO.lenderMobile,// 出借人手机号 + note: addDTO.note,// 备注(可选) + registrantDate: addDTO.registrantDate,// 登记日期 + registrantId: addDTO.registrantId,// 登记人ID + returnDate: addDTO.returnDate// 预计归还日期 + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + + +//查询个人借用信息 +//作用:前端 “个人借用记录页” 加载数据时调用(如显示当前用户借了哪些资产)。 +export function borrowInfo(borrowerId) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/asset/borrow/list`,// 接口路径:个人借用记录列表 + method: 'POST', + header: getHeaders(), + data: { + borrowerId:borrowerId // 请求体:传递借用人ID(查询该用户的所有借用记录) + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + + +//归还资产 +//作用:前端点击 “归还” 按钮时调用(将资产状态从 “已借出” 更新为 “已归还”)。 +export function returnAsset(id) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/asset/borrow/returnAsset?assetId=${id}`, // 接口路径:拼接资产ID(URL参数) + method: 'PUT', // 请求方法:PUT(通常用于“更新资源状态”,此处更新资产为“已归还”) + header:getHeaders(), + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + +//————————————————————————————————————————————————业务接口函数(易耗品相关)—————————————————————————————————————————— +//易耗品领用 +//作用:前端提交 “易耗品领用表单” 时调用(完成领用申请)。 +export function getConsumption(addDTO) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/consumable-distribution-item/add`, //接口路径:易耗品领用提交 + method: 'POST', + header:getHeaders(), + data:{ // 请求体:易耗品领用所需参数(数量、组别ID、备注等) + actualQuantity:addDTO.actualQuantity, // 实际领用数量 + groupId:addDTO.groupId,// 所属组别ID + notes:addDTO.notes,// 备注 + planId:addDTO.planId,// 发放计划ID + recipientMobile:addDTO.recipientMobile,// 领取人手机号 + skuId:addDTO.skuId// 易耗品SKU编号(唯一标识) + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + +//根据条码查询sku Id +export function getConsumptionSkuId(barcode) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/consumable/sku/list`,// 接口路径:条码查询SKU + method: 'POST', + header:getHeaders(), + data:{ + barcode:barcode // 请求体:传递易耗品条码(通过条码获取对应的SKU ID) + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + +//查询商品库存 +export function getConsumptionQuantity(goodsInfo) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/consumable-inventory/findByCondition`, // 接口路径:库存查询 + method: 'POST', + header:getHeaders(), + data:{ // 请求体:库存查询条件(SKU ID、仓库ID、位置ID) + skuId:goodsInfo.skuId, + locationId:goodsInfo.locationId, + warehouseId:goodsInfo.warehouseId + + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + +//——————————————————————————————————————————易耗品领用计划?????????????????????????????? +//获取组别信息 +export function getGroupsInfo(mobile) { //参数 mobile 表示“组长手机号” + return new Promise((resolve, reject) => { // 返回 Promise 对象,支持异步调用(用 async/await 或 .then() 处理结果) + // 调用 UniApp 的网络请求 API + uni.request({ + // 请求地址:拼接基础地址 + 易耗品组别查询接口 + // 接口作用:根据条件查询易耗品组别(此处条件是组长手机号) + url: `${BASE_URL}/api/consumable-groups/findByCondition`, + method: 'POST', + header:getHeaders(), // 请求头:使用统一的 getHeaders() 配置(携带用户、医院等信息) + data:{ // 请求体:传递查询条件 + groupHeadMobile:mobile // 按“组长手机号”查询对应的组别(如组长管理的易耗品分组) + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} +//获取发放计划信息 +export function getPlanInfo(id,pageNum, pageSize) { + return new Promise((resolve, reject) => { + uni.request({ + // 请求地址:拼接基础地址 + 发放计划接口 + 分页参数(pageNum/pageSize) + url: `${BASE_URL}/api/consumable-distribution-plan/findByCondition?pageNum=${pageNum}&pageSize=${pageSize}`, + method: 'POST', + header:getHeaders(), + data:{ + hospId:id // 按“医院ID”查询该医院的易耗品发放计划(如“2024年Q1耗材发放计划”) + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} +//获取易耗品领用详情 +export function getConsumptionDetail(id) { + return new Promise((resolve, reject) => { + uni.request({ + // 请求地址:拼接基础地址 + 领用详情接口 + 领用记录ID(RESTful风格) + url: `${BASE_URL}/api/consumable-distribution-item/app_getDistributeItem/${id}`, + method: 'GET', // 请求方法:GET(查询详情常用GET) + header:getHeaders(), + data:{ + // GET请求无需请求体,参数通过URL路径传递 + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} +//确认易耗品领用 +export function consumptonConfirm(id) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/consumable-distribution-item/app_getDistributeItem/${id}`, + method: 'POST', // 请求方法:POST(用于更新状态,确认领用 + header:getHeaders(), + data:{ + + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + + + +//————————————————————————————————————————————————资产盘点———————————————————————————————————————————————————————————— +//新增固定资产盘点 +export function addInventory(addDTO) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/asset/inventory/add`, // 接口路径:固定资产盘点记录提交接口 + method: 'POST', // 请求方法:POST(新增数据用POST) + data: { // 请求体:盘点记录所需的核心参数(从前端盘点表单收集) + assetId:addDTO.assetId, // 被盘点的固定资产ID + assetName:addDTO.assetName, // 固定资产名称(冗余字段,便于后端校验) + inventoryDate:addDTO.inventoryDate, // 盘点日期(格式化后的日期时间) + inventoryManId:addDTO.inventoryManId, // 盘点人ID(当前操作用户ID) + inventoryManMobile:addDTO.inventoryManMobile, // 盘点人手机号(用于身份校验) + inventoryPic:addDTO.inventoryPic, // 盘点照片(可选,如资产实物照片,通常是Base64或图片URL) + inventoryPlanId:addDTO.inventoryPlanId, // 所属盘点计划ID(关联到具体的盘点任务) + inventoryResult:addDTO.inventoryResult, // 盘点结果(如“正常”“缺失”“损坏”等枚举值) + note:addDTO.note // 盘点备注(可选,记录特殊情况,如“资产外观有划痕”) + }, + + header:getHeaders(), // 统一请求头(携带用户、医院等信息) + + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 成功时返回后端的盘点记录ID或成功信息 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} +//获取固定资产盘点计划信息 +export function getInventoryPlan(pageNum, pageSize) { + return new Promise((resolve, reject) => { + uni.request({ + // 接口路径:固定资产盘点计划分页接口,拼接页码(pageNum)和每页条数(pageSize) + url: `${BASE_URL}/api/asset/inventoryPlan/page?pageNum=${pageNum}&pageSize=${pageSize}`, + method: 'POST', + header:getHeaders(), + data:{ + // 请求体:空(后端可能默认返回当前用户有权限的盘点计划,无需额外筛选条件) + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} +//获取盘点详情(计划结束) +//作用:前端点击 “已结束” 的盘点计划时调用(查看该计划的完整盘点结果,如哪些资产正常、哪些异常)。 +export function getInventoryDetailEnd(id) { + return new Promise((resolve, reject) => { + uni.request({ + + url: `${BASE_URL}/api/asset/inventory/app_getInventoryPlan/${id}`, + // 接口路径:拼接盘点计划ID,专门获取“进行中”计划的详情(与已结束计划接口区分开) + method: 'GET', + header:getHeaders(), + data:{ + + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 返回进行中计划的详情(如待盘点资产列表、已盘点进度) + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} +//获取盘点详情(计划进行中) +//作用:前端点击 “进行中” 的盘点计划时调用(查看待盘点的资产列表,继续完成未盘点的任务)。 +export function getInventoryDetailIng(id) { + return new Promise((resolve, reject) => { + uni.request({ + // 接口路径:拼接盘点计划ID,专门获取“进行中”计划的详情(与已结束计划接口区分开) + url: `${BASE_URL}/api/asset/inventory/app_getInventoryPlan2/${id}`, + method: 'GET', + header:getHeaders(), + data:{ + + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + +//盘点 +export function inventory(addDTO) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/asset/inventory/add`, // 与“addInventory”接口路径相同,可能是后端兼容的简化版 + method: 'POST', + header:getHeaders(), + data:{ // 请求体:简化后的参数(去掉了assetName、note等非必填项,inventoryDate注释后可能由后端自动填充) + assetId:addDTO.assetId, // 被盘点资产ID(必填) + inventoryManId:addDTO.inventoryManId, // 盘点人ID(必填) + inventoryManMobile:addDTO.inventoryManMobile, // 盘点人手机号(必填) + inventoryPic:addDTO.inventoryPic, // 盘点照片(可选) + inventoryPlanId:addDTO.inventoryPlanId, // 所属计划ID(必填) + inventoryResult:addDTO.inventoryResult, // 盘点结果(必填) + //inventoryDate:addDTO.inventoryDate // 注释后,后端可能自动用当前时间作为盘点日期 + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + +//————————————————————————————————————————————————易耗品盘点—————————————————————————————————————————————————————— +//获取消耗品盘点计划信息 +//作用:前端 “易耗品盘点计划页” 加载数据时调用(与固定资产盘点计划逻辑一致,仅业务类型不同)。 +export function getConsumpationPlan(pageNum, pageSize) { + return new Promise((resolve, reject) => { + uni.request({ + // 接口路径:易耗品盘点计划分页接口,名称区分于固定资产计划 + url: `${BASE_URL}/api/consumable-check-plan/findByConditionWithPage?pageNum=${pageNum}&pageSize=${pageSize}`, + method: 'POST', + header:getHeaders(), + data:{ + // 空请求体(后端默认返回当前用户的易耗品盘点计划) + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 返回易耗品盘点计划的分页数据 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} +//获取消耗品盘点详情(计划结束) +export function getConsumpationInventoryDetailEnd(id) { + return new Promise((resolve, reject) => { + uni.request({ + // 接口路径:拼接易耗品盘点计划ID,专门获取“已结束”计划的详情 + url: `${BASE_URL}/api/consumable-check-item/app_getInventoryPlan/${id}`, + method: 'GET', + header:getHeaders(), + data:{ + + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 返回已结束计划的详情(如易耗品盘点总数、盈亏统计) + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} +//获取消耗品盘点详情(计划进行中) +//作用:前端查看 “进行中” 的易耗品盘点计划时调用(对应固定资产的 “getInventoryDetailIng”)。 +export function getConsumpationInventoryDetailIng(id) { + return new Promise((resolve, reject) => { + uni.request({ + // 接口路径:拼接易耗品盘点计划ID,专门获取“进行中”计划的详情 + url: `${BASE_URL}/api/consumable-check-item/app_getInventoryPlan2/${id}`, + method: 'GET', + header:getHeaders(), + data:{ + + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 返回进行中计划的详情(如待盘点易耗品列表、已盘点进度) + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + + +//盘点消耗品 +export function addComInventory(addDTO) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/consumable-check-item/add`, // 接口路径:易耗品盘点记录提交接口 + method: 'POST', + header:getHeaders(), + data:{ // 请求体:易耗品盘点的核心参数(与固定资产盘点参数差异在于“数量”字段) + checkPlanId:addDTO.checkPlanId, // 所属易耗品盘点计划ID + checkResult:addDTO.checkResult, // 盘点结果(如“账实相符”“盘盈”“盘亏”) + inventoryId:addDTO.inventoryId, // 库存ID(关联到具体的易耗品库存记录) + quantity:addDTO.quantity // 实际盘点数量(易耗品需统计数量,固定资产通常是“有无”) + + }, + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} \ No newline at end of file diff --git a/src/pages/api/inventory.js b/src/pages/api/inventory.js new file mode 100644 index 0000000..1235341 --- /dev/null +++ b/src/pages/api/inventory.js @@ -0,0 +1,70 @@ +const BASE_URL = 'http://10.3.1.212:8089'; +const config = require('config.js'); +const formatTime = date => { + date = new Date(date); + const hour = date.getHours() + const minute = date.getMinutes() + const second = date.getSeconds() + + return `${formatNumber(hour)}:${formatNumber(minute)}:${formatNumber(second)}` +} + +const formatNumber = n => { + n = n.toString() + return n[1] ? n : '0' + n +} + +const formatDate = date => { + date = new Date(date); + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + + return `${year}-${formatNumber(month)}-${formatNumber(day)}` +} + +const formatDateTime = date => { + return `${formatDate(date)} ${formatTime(date)}` +} +let staff = uni.getStorageSync('staff'); +let staffisnull = (staff == null || staff == undefined || staff == ''); +export function getHeaders() { + const staff = uni.getStorageSync('staff') || null + const staffisnull = !staff + + return { + 'content-type': 'application/json', + 'Authorization': staffisnull ? null : `Bearer ${uni.getStorageSync('token')}`, + 'hosp-ID': staffisnull ? config.defaultHospId : staff.hosp_id, + 'user-ID': staffisnull ? null : staff.id, + 'datetime': formatDateTime(new Date()), + 'createby': staffisnull ? null : staff.id + } +} + +//分页请求固定资产盘点信息 +export function fetchAssetInventory(pageNum, pageSize) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}/api/asset/inventory/page?pageNum=${pageNum}&pageSize=${pageSize}`, + method: 'POST', + data: { + query:{}, + }, + + header:getHeaders(), + + success: (res) => { + if (res.statusCode === 200) { + resolve(res.data); // 根据你的接口返回结构调整 + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }); + }); +} + diff --git a/src/pages/consumables/distribution.vue b/src/pages/consumables/distribution.vue new file mode 100644 index 0000000..c9e06e0 --- /dev/null +++ b/src/pages/consumables/distribution.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/pages/consumables/inventory-end.vue b/src/pages/consumables/inventory-end.vue new file mode 100644 index 0000000..774824f --- /dev/null +++ b/src/pages/consumables/inventory-end.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/pages/consumables/inventory-ing.vue b/src/pages/consumables/inventory-ing.vue new file mode 100644 index 0000000..292b953 --- /dev/null +++ b/src/pages/consumables/inventory-ing.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/pages/consumables/inventory-plan.vue b/src/pages/consumables/inventory-plan.vue new file mode 100644 index 0000000..af0f83c --- /dev/null +++ b/src/pages/consumables/inventory-plan.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/pages/consumables/plan.vue b/src/pages/consumables/plan.vue new file mode 100644 index 0000000..afb8b93 --- /dev/null +++ b/src/pages/consumables/plan.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/pages/fixed-assets/detail.vue b/src/pages/fixed-assets/detail.vue new file mode 100644 index 0000000..bc2f6a9 --- /dev/null +++ b/src/pages/fixed-assets/detail.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/src/pages/fixed-assets/index.vue b/src/pages/fixed-assets/index.vue new file mode 100644 index 0000000..8097f29 --- /dev/null +++ b/src/pages/fixed-assets/index.vue @@ -0,0 +1,442 @@ +