From ce6d5e5d6ec6d0300aac82aa9298d6de39b1eadc Mon Sep 17 00:00:00 2001
From: zx
Date: Fri, 3 Apr 2026 08:38:34 +0800
Subject: [PATCH] =?UTF-8?q?=E5=85=A5=E5=BA=93=E6=B5=81=E7=A8=8B=E5=AF=B9?=
=?UTF-8?q?=E6=8E=A5=E5=AE=8C=E6=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
api/getRepository.js | 24 ++
api/request.js | 3 +-
api/stockIn.js | 37 +++
api/system.js | 8 +
api/uniqueCode.js | 6 +-
components/BarcodeGenerator.vue | 60 ----
package-lock.json | 24 ++
package.json | 3 +
pages.json | 122 +++++++-
pages/components/ChooseList.vue | 236 ++++++++++++++
pages/components/DetailInfo.vue | 88 ++++++
pages/components/LineSteps.vue | 97 ++++++
pages/components/MaterialList.vue | 281 +++++++++++++++++
pages/components/Navigation.vue | 107 +++++++
pages/components/SearchList.vue | 186 +++++++++++
pages/components/WarehousingInfo.vue | 144 +++++++++
pages/index/index.vue | 1 +
pages/intelligent/index.vue | 1 +
pages/login/login.vue | 4 +-
pages/my/index.vue | 5 +-
pages/uniqueCode/issueUniqueCode/index.vue | 242 ---------------
.../issueUniqueCode/materialSelection.vue | 121 --------
pages/uniqueCode/myUniqueCode/QrCodeModal.vue | 97 ------
pages/uniqueCode/myUniqueCode/detail.vue | 292 ------------------
pages/until.js | 123 ++++++++
.../warehousing/StockIn/components/detail.vue | 147 +++++++++
.../StockIn/components/inbound.vue | 158 ++++++++++
pages/warehousing/StockIn/create.vue | 206 ++++++++++++
pages/warehousing/StockIn/my.vue | 9 +
pages/warehousing/StockIn/putaway.vue | 10 +
pages/warehousing/index.vue | 69 +++--
pages/warehousing/toChooseList.vue | 18 ++
.../uniqueCode/issueUniqueCode/index.vue | 205 ++++++++++++
.../issueUniqueCode/materialSelection.vue | 218 +++++++++++++
.../uniqueCode/myUniqueCode/QrCodeModal.vue | 112 +++++++
.../uniqueCode/myUniqueCode/detail.vue | 184 +++++++++++
.../uniqueCode/myUniqueCode/index.vue | 18 +-
pages/{ => warehousing}/uniqueCode/until.js | 5 +-
static/edit.png | Bin 0 -> 2850 bytes
static/printer.png | Bin 0 -> 3071 bytes
styles/theme.scss | 278 +++++++++++++----
yarn.lock | 15 +
42 files changed, 3028 insertions(+), 936 deletions(-)
create mode 100644 api/getRepository.js
create mode 100644 api/stockIn.js
create mode 100644 api/system.js
delete mode 100644 components/BarcodeGenerator.vue
create mode 100644 pages/components/ChooseList.vue
create mode 100644 pages/components/DetailInfo.vue
create mode 100644 pages/components/LineSteps.vue
create mode 100644 pages/components/MaterialList.vue
create mode 100644 pages/components/Navigation.vue
create mode 100644 pages/components/SearchList.vue
create mode 100644 pages/components/WarehousingInfo.vue
delete mode 100644 pages/uniqueCode/issueUniqueCode/index.vue
delete mode 100644 pages/uniqueCode/issueUniqueCode/materialSelection.vue
delete mode 100644 pages/uniqueCode/myUniqueCode/QrCodeModal.vue
delete mode 100644 pages/uniqueCode/myUniqueCode/detail.vue
create mode 100644 pages/until.js
create mode 100644 pages/warehousing/StockIn/components/detail.vue
create mode 100644 pages/warehousing/StockIn/components/inbound.vue
create mode 100644 pages/warehousing/StockIn/create.vue
create mode 100644 pages/warehousing/StockIn/my.vue
create mode 100644 pages/warehousing/StockIn/putaway.vue
create mode 100644 pages/warehousing/toChooseList.vue
create mode 100644 pages/warehousing/uniqueCode/issueUniqueCode/index.vue
create mode 100644 pages/warehousing/uniqueCode/issueUniqueCode/materialSelection.vue
create mode 100644 pages/warehousing/uniqueCode/myUniqueCode/QrCodeModal.vue
create mode 100644 pages/warehousing/uniqueCode/myUniqueCode/detail.vue
rename pages/{ => warehousing}/uniqueCode/myUniqueCode/index.vue (90%)
rename pages/{ => warehousing}/uniqueCode/until.js (91%)
create mode 100644 static/edit.png
create mode 100644 static/printer.png
diff --git a/api/getRepository.js b/api/getRepository.js
new file mode 100644
index 0000000..367f1e9
--- /dev/null
+++ b/api/getRepository.js
@@ -0,0 +1,24 @@
+// mockWarehousing.js
+
+// 模拟数据
+const mockWarehousingData = [
+ { id: 101, deptName: "Y00002", deptId: "WSA0197", remark: "备注" },
+ { id: 102, deptName: "Y00003", deptId: "WSA0198", remark: "" },
+ { id: 103, deptName: "Y00004", deptId: "WSA0199", remark: "备注" },
+ { id: 104, deptName: "Y00005", deptId: "WSA0200", remark: "" },
+];
+
+// Mock 接口(和你原接口格式一致)
+const getRepository = (params) => {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ resolve({
+ code: 200,
+ msg: "获取成功",
+ data: mockWarehousingData,
+ });
+ }, 200);
+ });
+};
+
+export default getRepository;
diff --git a/api/request.js b/api/request.js
index dd881bb..341a530 100644
--- a/api/request.js
+++ b/api/request.js
@@ -1,5 +1,6 @@
//存放主站域名
-const BASE_URL = 'http://192.168.1.5:8082' // 正式环境接口
+// const BASE_URL = 'http://192.168.1.5:8082' // w
+const BASE_URL = 'http://192.168.1.9:8082' // 正式环境接口
// const BASE_URL = 'http://47.100.212.83:18088' // 正式环境接口
// const BASE_URL = 'http://192.168.1.9:8088' // 测试环境接口
// const BASE_URL = 'http://192.168.1.5:8088' // 测试环境接口
diff --git a/api/stockIn.js b/api/stockIn.js
new file mode 100644
index 0000000..5b26149
--- /dev/null
+++ b/api/stockIn.js
@@ -0,0 +1,37 @@
+import { request } from './request'
+const api ='/worn/inboundBill/'
+// 新建:入库单
+const addStockIn = (params) => {
+ return request(api+'add', params, 'POST')
+}
+// 列表
+const stockList = (params) => {
+ return request(api+'list', params, 'get')
+}
+// 详情
+const stockInDetail = (params) => {
+ return request('/worn/item/list', params, 'get')
+}
+// 编辑
+const stockInUpdate = (params) => {
+ return request('/worn/item/update', params, 'post')
+}
+// 入库
+const inboundFinish = (params) => {
+ return request('/worn/inboundBill/inboundFinish', params, 'post')
+}
+// 作废
+const inboundBillVoid = (params) => {
+ return request('/worn/inboundBill/void', params, 'post')
+}
+
+
+export {
+ addStockIn,
+ stockList,
+ stockInDetail,
+ stockInUpdate,
+ inboundFinish,
+ inboundBillVoid
+
+}
\ No newline at end of file
diff --git a/api/system.js b/api/system.js
new file mode 100644
index 0000000..1e2a9c5
--- /dev/null
+++ b/api/system.js
@@ -0,0 +1,8 @@
+import { request } from "./request";
+
+// 根据当前用户获取仓库信息
+const getWarehousingInfo = (params) => {
+ return request(`/system/user/myDeptChildren`, params, "get");
+};
+
+export { getWarehousingInfo };
diff --git a/api/uniqueCode.js b/api/uniqueCode.js
index 4bd7818..dfd8aa4 100644
--- a/api/uniqueCode.js
+++ b/api/uniqueCode.js
@@ -21,9 +21,12 @@ const delUniqueCode = (params) => {
};
// 详情:唯一码
const detailUniqueCode = (params) => {
- console.log(params,'params');
return request(`/unique/code/${params.id}`, params, 'GET');
};
+// 详情:通过唯一码获取物料信息
+const getMaterialUnique = (params) => {
+ return request(`/unique/code/materialInfo/${params.code}`, params, 'GET');
+};
export {
getMaterial,
@@ -32,4 +35,5 @@ export {
delUniqueCode,
detailUniqueCode,
editUniqueCode,
+ getMaterialUnique
};
diff --git a/components/BarcodeGenerator.vue b/components/BarcodeGenerator.vue
deleted file mode 100644
index 189810d..0000000
--- a/components/BarcodeGenerator.vue
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 76a6634..dd3ecd6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,10 @@
"": {
"dependencies": {
"@climblee/uv-ui": "^1.1.20",
+ "dayjs": "^1.11.20",
"jsbarcode": "^3.12.3",
+ "lodash": "^4.17.23",
+ "numeral": "^2.0.6",
"z-paging": "^2.8.8"
},
"devDependencies": {
@@ -817,6 +820,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/dayjs": {
+ "version": "1.11.20",
+ "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.20.tgz",
+ "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==",
+ "license": "MIT"
+ },
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz",
@@ -1107,6 +1116,12 @@
"node": ">=8.9.0"
}
},
+ "node_modules/lodash": {
+ "version": "4.17.23",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+ "license": "MIT"
+ },
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -1159,6 +1174,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/numeral": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/numeral/-/numeral-2.0.6.tgz",
+ "integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
diff --git a/package.json b/package.json
index 978e13e..eb56032 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,10 @@
{
"dependencies": {
"@climblee/uv-ui": "^1.1.20",
+ "dayjs": "^1.11.20",
"jsbarcode": "^3.12.3",
+ "lodash": "^4.17.23",
+ "numeral": "^2.0.6",
"z-paging": "^2.8.8"
},
"devDependencies": {
diff --git a/pages.json b/pages.json
index 6dcbacf..81daa19 100644
--- a/pages.json
+++ b/pages.json
@@ -32,22 +32,117 @@
"path": "pages/my/index",
"style": { "navigationBarTitleText": "我的" }
},
+
+ // 仓储 - 唯一码
{
- "path": "pages/uniqueCode/issueUniqueCode/index",
+ "path": "pages/warehousing/uniqueCode/issueUniqueCode/index",
"style": { "navigationBarTitleText": "唯一码发放" }
},
{
- "path": "pages/uniqueCode/issueUniqueCode/materialSelection",
+ "path": "pages/warehousing/uniqueCode/issueUniqueCode/materialSelection",
"style": { "navigationBarTitleText": "物料选择" }
},
{
- "path": "pages/uniqueCode/myUniqueCode/index",
+ "path": "pages/warehousing/uniqueCode/myUniqueCode/index",
"style": { "navigationBarTitleText": "唯一码" }
},
{
- "path": "pages/uniqueCode/myUniqueCode/detail",
- "style": { "navigationBarTitleText": "唯一码详情" }
+ "path": "pages/warehousing/uniqueCode/myUniqueCode/detail",
+ "style": {
+ "navigationBarTitleText": "唯一码详情",
+ "navigationStyle": "custom"
+ }
+ },
+ // {
+ // "path": "pages/uniqueCode/bindRfid",
+ // "style": { "navigationBarTitleText": "绑定RFID" }
+ // },
+
+ // ========== 库存信息模块 ==========
+ // {
+ // "path": "pages/inventory/checkUniqueCode",
+ // "style": { "navigationBarTitleText": "唯一码盘点" }
+ // },
+ // {
+ // "path": "pages/inventory/age",
+ // "style": { "navigationBarTitleText": "库龄查看" }
+ // },
+ // {
+ // "path": "pages/inventory/alert",
+ // "style": { "navigationBarTitleText": "库存预警" }
+ // },
+
+ // ========== 报表模块 ==========
+ // {
+ // "path": "pages/report/daily",
+ // "style": { "navigationBarTitleText": "库存日报" }
+ // },
+ // {
+ // "path": "pages/report/monthly",
+ // "style": { "navigationBarTitleText": "库存月报" }
+ // },
+ // {
+ // "path": "pages/report/company",
+ // "style": { "navigationBarTitleText": "公司库存报表" }
+ // },
+ // {
+ // "path": "pages/report/warehouse",
+ // "style": { "navigationBarTitleText": "仓库库存报表" }
+ // },
+
+ // ========== 申报单模块 ==========
+ // {
+ // "path": "pages/declaration/materialQuery",
+ // "style": { "navigationBarTitleText": "物资查询" }
+ // },
+ // {
+ // "path": "pages/declaration/create",
+ // "style": { "navigationBarTitleText": "申报单开单" }
+ // },
+ // {
+ // "path": "pages/declaration/my",
+ // "style": { "navigationBarTitleText": "我的申报单" }
+ // },
+
+ // ========== 入库单模块 ==========
+ {
+ "path": "pages/warehousing/stockIn/create",
+ "style": { "navigationBarTitleText": "入库单开单" }
+ },
+ {
+ "path": "pages/warehousing/stockIn/my",
+ "style": { "navigationBarTitleText": "我的入库单" }
+ },
+ {
+ "path": "pages/warehousing/stockIn/components/detail",
+ "style": { "navigationBarTitleText": "详情", "navigationStyle": "custom" }
+ },
+ {
+ "path": "pages/warehousing/stockIn/putaway",
+ "style": { "navigationBarTitleText": "入库单入库" }
+ },
+ {
+ "path": "pages/warehousing/toChooseList",
+ "style": { "navigationBarTitleText": "请选择" }
+ },
+ {
+ "path": "pages/warehousing/stockIn/components/inbound",
+ "style": { "navigationBarTitleText": "入库" }
}
+
+ // ========== 出库单模块 ==========
+ // {
+ // "path": "pages/stockOut/create",
+ // "style": { "navigationBarTitleText": "出库单开单" }
+ // },
+ // {
+ // "path": "pages/stockOut/my",
+ // "style": { "navigationBarTitleText": "我的出库单" }
+ // },
+ // {
+ // "path": "pages/stockOut/warehousing",
+ // "style": { "navigationBarTitleText": "出库单出库" }
+ // }
],
"globalStyle": {
"navigationBarTextStyle": "black",
@@ -55,18 +150,17 @@
"navigationBarBackgroundColor": "#F5F5F5",
"backgroundColor": "#F5F5F5"
},
- // 底部 tabBar 核心配置
"tabBar": {
- "color": "#666", // 未选中文字颜色
- "selectedColor": "#007AFF", // 选中文字颜色
- "backgroundColor": "#fff", // 导航栏背景色
- "borderStyle": "black", // 上边框样式(black/white)
- "height": "50px", // 导航栏高度(App 端建议 50px 左右)
+ "color": "#666",
+ "selectedColor": "#007AFF",
+ "backgroundColor": "#fff",
+ "borderStyle": "black",
+ "height": "50px",
"list": [
{
- "pagePath": "pages/index/index", // 必须和 pages 中的路径一致
- "text": "首页", // 底部文字
- "iconPath": "static/icon/home.png", // 未选中图标(建议 28x28px)
+ "pagePath": "pages/index/index",
+ "text": "首页",
+ "iconPath": "static/icon/home.png",
"selectedIconPath": "static/icon/home-active.png"
},
{
diff --git a/pages/components/ChooseList.vue b/pages/components/ChooseList.vue
new file mode 100644
index 0000000..805fc85
--- /dev/null
+++ b/pages/components/ChooseList.vue
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 仓库名称
+ {{ item.deptName }}
+
+
+ 仓库编码
+ {{ item.deptId }}
+
+
+
+
+ 备注
+
+
+ 未填写
+
+
+
+
+
+
+ {{ item.deptName }} ({{ item.deptId }})
+
+
+
+ {{ item?.remark }}
+ 未填写
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/components/DetailInfo.vue b/pages/components/DetailInfo.vue
new file mode 100644
index 0000000..bdda3c6
--- /dev/null
+++ b/pages/components/DetailInfo.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+ {{ typeName + '单号' }}:{{ detailInfo?.billNo }}
+
+ {{ getBillType(detailInfo?.billType,detailInfo?.status) }}
+
+
+
+ 仓库:
+ {{ detailInfo?.warehouseName }}
+
+ 存储区:
+ {{ detailInfo?.areaName }}
+
+ 开单时间:
+ {{ formatDate(detailInfo?.createTime) }}
+
+ {{ typeName + '时间' }} :
+ {{ formatDate(detailInfo?.inboundTime) }}
+
+
+
+
+ 详细备注:
+
+ {{ detailInfo?.billRemark || '-' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/components/LineSteps.vue b/pages/components/LineSteps.vue
new file mode 100644
index 0000000..6a6cc15
--- /dev/null
+++ b/pages/components/LineSteps.vue
@@ -0,0 +1,97 @@
+
+
+
+
+ {{ index + 1 }}
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/components/MaterialList.vue b/pages/components/MaterialList.vue
new file mode 100644
index 0000000..6bd0a1b
--- /dev/null
+++ b/pages/components/MaterialList.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+
+
+
+ handleItemLongPress(item, index)">
+
+
+
+ {{ item.materialName }} ({{ item.materialCode }})
+
+
+
+ {{ item.materialShortName }} /
+ {{ item.model }} /
+ {{ item.specification }} /
+ {{ item.typeName }}
+
+
+
+ 唯一码:{{ item?.uniqueCode }}
+
+
+
+ {{ getTypeParentNames(item.typeParentNames) }}
+
+
+
+
+ {{ item.unitName }}
+
+
+
+
+
+ 已入库:
+ {{ getStockQuantity(item, 'complete') }}
+
+
+ 剩余:
+ {{ getStockQuantity(item, 'remaining') }}
+
+
+
+
+
+
+
+
+
+ 暂无物料,请添加物料
+
+
+
+
+
+
+ 请选择称重来源
+ 无线液位计
+ 手动输入
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/components/Navigation.vue b/pages/components/Navigation.vue
new file mode 100644
index 0000000..9d62ed7
--- /dev/null
+++ b/pages/components/Navigation.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/components/SearchList.vue b/pages/components/SearchList.vue
new file mode 100644
index 0000000..8628150
--- /dev/null
+++ b/pages/components/SearchList.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ typeName + '编号' }}:{{ item.billNo }}
+
+ {{ getBillType(item?.billType, item?.status) }}
+
+
+ {{ typeName + '类型' }}:
+ {{ getOrderType(item.status) }}
+
+ 库位:
+ {{ item.areaName }}
+
+ 开单时间:
+ {{ item.createTime }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/components/WarehousingInfo.vue b/pages/components/WarehousingInfo.vue
new file mode 100644
index 0000000..4d3f848
--- /dev/null
+++ b/pages/components/WarehousingInfo.vue
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+ {{ formData?.warehousing?.[0].deptName }}
+
+ 请选择仓库
+
+
+
+
+
+
+
+
+
+ {{ formData?.storageArea?.[0].deptName }}
+
+ 请选择存储区
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/index/index.vue b/pages/index/index.vue
index 3ec3d6e..e655b9c 100644
--- a/pages/index/index.vue
+++ b/pages/index/index.vue
@@ -1,3 +1,4 @@
+
首页
diff --git a/pages/intelligent/index.vue b/pages/intelligent/index.vue
index 4e38eca..2482742 100644
--- a/pages/intelligent/index.vue
+++ b/pages/intelligent/index.vue
@@ -1,3 +1,4 @@
+
智能
diff --git a/pages/login/login.vue b/pages/login/login.vue
index 622b61f..6db82b3 100644
--- a/pages/login/login.vue
+++ b/pages/login/login.vue
@@ -32,7 +32,8 @@
-
\ No newline at end of file
diff --git a/pages/uniqueCode/issueUniqueCode/materialSelection.vue b/pages/uniqueCode/issueUniqueCode/materialSelection.vue
deleted file mode 100644
index 712f56b..0000000
--- a/pages/uniqueCode/issueUniqueCode/materialSelection.vue
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{ item.materialName }} ({{ item.materialCode }})
-
-
- {{ item.materialShortName }} /
- {{ item.model }} /
- {{ item.specification }} /
- {{ item.typeName }}
-
-
-
-
单位:{{ item.unitName }}
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pages/uniqueCode/myUniqueCode/QrCodeModal.vue b/pages/uniqueCode/myUniqueCode/QrCodeModal.vue
deleted file mode 100644
index 34c3057..0000000
--- a/pages/uniqueCode/myUniqueCode/QrCodeModal.vue
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- 物料:
- {{ material?.materialName }}
- x {{ material?.quantity }}
-
- 描述:
- {{ material?.description || '-' }}
-
- {{ material?.materialShortName }} /
- {{ material?.model }} /
- {{ material?.specification }} /
- {{ material?.typeName }}
-
-
-
- 备注:
-
- {{ material?.qrCodeMark || '' }}
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pages/uniqueCode/myUniqueCode/detail.vue b/pages/uniqueCode/myUniqueCode/detail.vue
deleted file mode 100644
index 4d3d64a..0000000
--- a/pages/uniqueCode/myUniqueCode/detail.vue
+++ /dev/null
@@ -1,292 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- 编号:{{ item.code }}
- {{ getStatusName(item.status) }}
-
-
-
- RFID:
- {{ item.remark }}
- 未绑定RFID
-
- 生成时间:
- {{ item?.createTime }}
-
-
-
- 备注:
- {{ item.remark }}
- 未填写
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ item.materialName }} ({{ item.materialCode }})
-
-
-
- {{ item.materialShortName }} /
- {{ item.model }} /
- {{ item.specification }} /
- {{ item.typeName }}
-
-
-
-
-
-
-
-
-
- {{ item.unitName }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pages/until.js b/pages/until.js
new file mode 100644
index 0000000..04a06aa
--- /dev/null
+++ b/pages/until.js
@@ -0,0 +1,123 @@
+import dayjs from "dayjs";
+import numeral from "numeral";
+// 订单状态
+// 0=入库申请,1=入库成功,2=出库申请,3=出库成功,4=作废
+const billTypeMenu = [
+ {
+ value: "0",
+ label: "入库单已提交",
+ },
+ {
+ value: "1",
+ label: "已完成",
+ },
+ {
+ value: "2",
+ label: "出库单已提交",
+ },
+ {
+ value: "3",
+ label: "已完成",
+ },
+ {
+ value: "4",
+ label: "已取消",
+ },
+];
+
+// 订单状态为0时 再查一次
+const billStatueMenu = [
+ {
+ value: "0",
+ label: "入库单已提交",
+ },
+ {
+ value: "1",
+ label: "全部入库",
+ },
+ {
+ value: "2",
+ label: "物料部分入库",
+ },
+];
+// 物料状态
+const materialType = [
+ {
+ value: "0",
+ label: "未提交",
+ },
+ {
+ value: "1",
+ label: "已提交",
+ },
+];
+
+// 入/出库单状态的label
+export const getBillType = (val, status) => {
+ if (val === "0") {
+ return billStatueMenu.find((i) => i.value == `${status}`)?.label;
+ }
+ return billTypeMenu.find((i) => i.value == `${val}`)?.label;
+};
+
+
+// 获取出入库单的状态以及tag颜色
+export const getColor = (val) => {
+ if (val == "0" || val == "2") {
+ return "color:#B8B8B8;font-weight:500;font-size:12px;";
+ } else if (val == "1" || val == "3") {
+ return "color:green;font-weight:500;font-size:12px;";
+ } else {
+ return "color:red;font-weight:500;font-size:12px;";
+ }
+};
+
+// 时间格式化
+export const formatDate = (t, fmt = "YYYY-MM-DD HH:mm:ss") =>
+ t ? dayjs(t).format(fmt) : "-";
+
+// 数字格式化
+export const formatNum = (num, fmt = "0.00") =>
+ num ? numeral(num).format(fmt) : "-";
+
+// 入库单/出库单:获取已入库、出库数量
+// item:此列数据 type:已入库、剩余数量
+export const getStockQuantity = (item, type) => {
+ const num = item.quantity;
+ const status = item.status;
+ // 未入库
+ if (status == "0") {
+ if (type == "complete") {
+ return "0.000";
+ } else {
+ return formatNum(num, "0.00");
+ }
+ } else {
+ if (type == "complete") {
+ return formatNum(num, "0.000");
+ } else {
+ return "0.00";
+ }
+ }
+};
+
+
+// 清楚缓存 - 将所有需要清楚的缓存写入此处不要写登录信息
+export const removeStorage = () => {
+ uni.removeStorageSync("app_warehousing");
+ uni.removeStorageSync("app_storageArea");
+ uni.removeStorageSync("app_billRemark");
+ uni.removeStorageSync("app_material");
+ uni.removeStorageSync("app_material_select_list");
+};
+
+// 对象转 URL 查询字符串 ?a=1&b=2
+export const objectToQuery = (params) => {
+ if (!params || Object.keys(params).length === 0) return "";
+
+ const query = Object.entries(params)
+ .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)
+ .join("&");
+
+ return "?" + query;
+};
diff --git a/pages/warehousing/StockIn/components/detail.vue b/pages/warehousing/StockIn/components/detail.vue
new file mode 100644
index 0000000..a48bac2
--- /dev/null
+++ b/pages/warehousing/StockIn/components/detail.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/warehousing/StockIn/components/inbound.vue b/pages/warehousing/StockIn/components/inbound.vue
new file mode 100644
index 0000000..a621742
--- /dev/null
+++ b/pages/warehousing/StockIn/components/inbound.vue
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+ 入库
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/warehousing/StockIn/create.vue b/pages/warehousing/StockIn/create.vue
new file mode 100644
index 0000000..344e9cc
--- /dev/null
+++ b/pages/warehousing/StockIn/create.vue
@@ -0,0 +1,206 @@
+
+
+
+
+
+
+
+
+ 扫码添加
+ 提交
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/warehousing/StockIn/my.vue b/pages/warehousing/StockIn/my.vue
new file mode 100644
index 0000000..cc1c770
--- /dev/null
+++ b/pages/warehousing/StockIn/my.vue
@@ -0,0 +1,9 @@
+
+
+
+
\ No newline at end of file
diff --git a/pages/warehousing/StockIn/putaway.vue b/pages/warehousing/StockIn/putaway.vue
new file mode 100644
index 0000000..0ea9ff2
--- /dev/null
+++ b/pages/warehousing/StockIn/putaway.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/warehousing/index.vue b/pages/warehousing/index.vue
index fc36325..9b5f8c7 100644
--- a/pages/warehousing/index.vue
+++ b/pages/warehousing/index.vue
@@ -1,3 +1,4 @@
+
import { onShow } from '@dcloudio/uni-app';
-
+import {removeStorage} from '../until';
const menuList = [
{
id: 'inventory',
@@ -125,7 +126,11 @@ const menuList = [
icon: '../../static/stockInOrOut/stockInCreateOrder.png',
title: '入库单开单',
click: () => {
+ removeStorage()
console.log('入库单开单')
+ uni.navigateTo({
+ url: '/pages/warehousing/stockIn/create'
+ });
}
},
{
@@ -134,6 +139,10 @@ const menuList = [
title: '我的入库单',
click: () => {
console.log('我的入库单')
+ removeStorage()
+ uni.navigateTo({
+ url: '/pages/warehousing/stockIn/my'
+ });
}
},
{
@@ -142,6 +151,9 @@ const menuList = [
title: '入库单入库',
click: () => {
console.log('入库单入库')
+ uni.navigateTo({
+ url: '/pages/warehousing/stockIn/putaway'
+ });
}
},
@@ -188,9 +200,9 @@ const menuList = [
title: '唯一码发放',
click: () => {
console.log('唯一码发放')
- uni.setStorageSync('app_material', []);
+ uni.removeStorage('app_material')
uni.navigateTo({
- url: '/pages/uniqueCode/issueUniqueCode/index'
+ url: '/pages/warehousing/uniqueCode/issueUniqueCode/index'
});
}
},
@@ -201,7 +213,7 @@ const menuList = [
click: () => {
console.log('唯一码')
uni.navigateTo({
- url: '/pages/uniqueCode/myUniqueCode/index'
+ url: '/pages/warehousing/uniqueCode/myUniqueCode/index'
});
}
},
@@ -216,40 +228,39 @@ const menuList = [
},
]
},
- {
- id: 'transportCheckIn',
- title: '运输打卡',
- menuItem: [
- {
- id: "transportCheckIn_transportCheckIn",
- icon: '../../static/transportCheckIn/transportCheckIn.png',
- title: '运输打卡',
- click: () => {
- console.log('运输打卡')
- }
- },
- {
- id: "transportCheckIn_myTransportCheckIn",
- icon: '../../static/transportCheckIn/myTransportCheckIn.png',
- title: '我的运输打卡',
- click: () => {
- console.log('我的运输打卡')
- }
- },
- ]
- },
+ // {
+ // id: 'transportCheckIn',
+ // title: '运输打卡',
+ // menuItem: [
+ // {
+ // id: "transportCheckIn_transportCheckIn",
+ // icon: '../../static/transportCheckIn/transportCheckIn.png',
+ // title: '运输打卡',
+ // click: () => {
+ // console.log('运输打卡')
+ // }
+ // },
+ // {
+ // id: "transportCheckIn_myTransportCheckIn",
+ // icon: '../../static/transportCheckIn/myTransportCheckIn.png',
+ // title: '我的运输打卡',
+ // click: () => {
+ // console.log('我的运输打卡')
+ // }
+ // },
+ // ]
+ // },
]
onShow(() => {
uni.removeStorage({
key: 'app_material',
- success: (result) => {},
- fail: (error) => {}
+ success: (result) => { },
+ fail: (error) => { }
})
})
\ No newline at end of file
diff --git a/pages/warehousing/uniqueCode/issueUniqueCode/materialSelection.vue b/pages/warehousing/uniqueCode/issueUniqueCode/materialSelection.vue
new file mode 100644
index 0000000..2877f34
--- /dev/null
+++ b/pages/warehousing/uniqueCode/issueUniqueCode/materialSelection.vue
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.materialName }} ({{ item.materialCode }})
+
+
+ {{ item.materialShortName }} /
+ {{ item.model }} /
+ {{ item.specification }} /
+ {{ item.typeName }}
+
+
+
+
单位:{{ item.unitName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.materialName }} ({{ item.materialCode }})
+
+
+ {{ item.materialShortName }} /
+ {{ item.model }} /
+ {{ item.specification }} /
+ {{ item.typeName }}
+
+
+
+
单位:{{ item.unitName }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/warehousing/uniqueCode/myUniqueCode/QrCodeModal.vue b/pages/warehousing/uniqueCode/myUniqueCode/QrCodeModal.vue
new file mode 100644
index 0000000..61dcc29
--- /dev/null
+++ b/pages/warehousing/uniqueCode/myUniqueCode/QrCodeModal.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+ 物料:
+ {{ material?.materialName }}
+ x {{ material?.quantity }}
+
+ 描述:
+ {{ material?.description || '-' }}
+
+ {{ material?.materialShortName }} /
+ {{ material?.model }} /
+ {{ material?.specification }} /
+ {{ material?.typeName }}
+
+
+
+ 备注:
+ {{ material?.uniqueCodeRemark || '' }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/warehousing/uniqueCode/myUniqueCode/detail.vue b/pages/warehousing/uniqueCode/myUniqueCode/detail.vue
new file mode 100644
index 0000000..ccf4b67
--- /dev/null
+++ b/pages/warehousing/uniqueCode/myUniqueCode/detail.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编号:{{ item.code }}
+ {{ getStatusName(item.status) }}
+
+
+
+ RFID:
+ {{ item.remark }}
+ 未绑定RFID
+
+ 生成时间:
+ {{ item?.createTime }}
+
+
+
+ 备注:
+ {{ item.remark }}
+ 未填写
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/uniqueCode/myUniqueCode/index.vue b/pages/warehousing/uniqueCode/myUniqueCode/index.vue
similarity index 90%
rename from pages/uniqueCode/myUniqueCode/index.vue
rename to pages/warehousing/uniqueCode/myUniqueCode/index.vue
index 4b10841..90b29e1 100644
--- a/pages/uniqueCode/myUniqueCode/index.vue
+++ b/pages/warehousing/uniqueCode/myUniqueCode/index.vue
@@ -34,7 +34,7 @@
未填写
-
@@ -52,7 +52,7 @@
-
+
@@ -79,9 +79,13 @@ const isDialog = ref(false)
// 唯一码列表
const uniqueCodeList = ref([])
// 物料列表数组
-const materialList = ref([])
+const materialList = ref({
+ material: []
+})
// 列表:唯一码
-const getMaterialList = () => {
+const getMaterialList = (pageNo, pageSize) => {
+ queryParams.value.pageNum = pageNo
+ console.log(pageNo, pageSize, queryParams.value)
getUniqueCodeList(queryParams.value).then(res => {
res.rows.forEach(e => {
e.showMore = false;
@@ -99,7 +103,7 @@ onShow(() => {
// 详情:唯一码
const toDetail = (val) => {
uni.navigateTo({
- url: `/pages/uniqueCode/myUniqueCode/detail?id=${val.id}&code=${val.code}`,
+ url: `/pages/warehousing/uniqueCode/myUniqueCode/detail?id=${val.id}&code=${val.code}`,
});
}
@@ -118,7 +122,6 @@ const dialogClose = () => {
const dialogConfirm = () => {
console.log(delItem.value.id, 'delItem.value.id');
delUniqueCode({ ids: [delItem.value.id] }).then(res => {
- console.log(res, '11');
dialogClose()
})
}
@@ -126,7 +129,7 @@ const dialogConfirm = () => {
const getDetailInfo = (row) => {
detailUniqueCode({ id: row.id }).then((res) => {
if (res.code == 200) {
- materialList.value = [{ ...res.data.material, ...getDetail(res.data.material.wornMaterial), qrCode: res.data.qrCode, code: res.data.code,qrCodeMark:res.data.remark }]
+ materialList.value.material = [{ ...res.data.material, ...getDetail(res.data.material.wornMaterial), qrCode: res.data.qrCode, code: res.data.code, uniqueCodeRemark: res.data.remark }]
setTimeout(() => {
modalRef.value.open()
}, 300)
@@ -159,6 +162,7 @@ const getDetailInfo = (row) => {
font-size: 12px;
}
}
+
::v-deep.qrCodeModal {
.uv-modal__content {
display: block;
diff --git a/pages/uniqueCode/until.js b/pages/warehousing/uniqueCode/until.js
similarity index 91%
rename from pages/uniqueCode/until.js
rename to pages/warehousing/uniqueCode/until.js
index 3eea086..5ce62ce 100644
--- a/pages/uniqueCode/until.js
+++ b/pages/warehousing/uniqueCode/until.js
@@ -1,8 +1,8 @@
export const getTypeParentNames = (val) => {
if (val) {
- let value = val.replace("/", ",");
+ let value = val.replace(/\//g, ",");
const arr = `${value}`.split(",");
- return arr[arr?.length - 1];
+ return arr[0];
}
};
@@ -49,6 +49,7 @@ export const getDetail = (info) => {
description: info.description,
weight: info.weight,
kgFactor: info.kgFactor,
+ materialId:info.id,//物料id
}
diff --git a/static/edit.png b/static/edit.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba6172306a70decc0b15e38fbdebeab1ef6381e9
GIT binary patch
literal 2850
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