This commit is contained in:
quantulr
2023-08-30 17:27:21 +08:00
commit 0288146b0d
85 changed files with 26508 additions and 0 deletions

View File

@ -0,0 +1,7 @@
{
"usingComponents": {
"t-fab": "tdesign-miniprogram/fab/fab",
"statistics-card": "/components/statistics-card"
},
"enablePullDownRefresh": true
}

View File

@ -0,0 +1,92 @@
/* pages/stock/stock.wxss */
.t-fab {
z-index: 99;
}
page{
padding-top: 32rpx;
}
.stock-tabs {
margin: 16rpx 32rpx 0;
}
.stock-list {
padding: 16rpx 0 32rpx;
.scroll-container {
// height: calc(100vh - 96rpx - 64rpx - 64rpx);
.grid {
margin: 0 32rpx;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 32rpx;
.card {
box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1),
0 1px 2px -1px rgb(0 0 0 / 0.1);
// position: relative;
min-height: 300rpx;
background-color: #fff;
border-radius: 18rpx;
padding: 18rpx;
.prove-pic {
width: 100%;
height: 200rpx;
}
.close-button {
position: absolute;
top: -24rpx;
right: -24rpx;
}
.fields {
margin-top: 12rpx;
.field {
margin-top: 12rpx;
display: flex;
.indicator {
margin-top: 12rpx;
height: 24rpx;
width: 8rpx;
background-color: #ea7e41;
border-radius: 50rpx;
margin-right: 12rpx;
}
.content {
display: flex;
flex-direction: column;
.title {
font-size: large;
}
.value {
margin-top: 6rpx;
font-size: small;
}
}
&:nth-of-type(1) {
.indicator {
background-color: #ea7e41;
}
}
&:nth-of-type(2) {
.indicator {
background-color: #12b3a8;
}
}
&:nth-of-type(3) {
.indicator {
background-color: #dc7d85;
}
}
&:nth-of-type(4) {
.indicator {
background-color: #e0d2fd;
}
}
&:nth-of-type(5) {
.indicator {
background-color: #dc7d85;
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,339 @@
import { stockLogList, stockStatistics, storageList } from "../../api/stock";
import httpClient from "../../utils/request";
// pages/stock/stock.ts
Page({
/**
* 页面的初始数据
*/
data: {
authToken: undefined,
stockType: 0, // 库存类型
// 统计数据
statisticsData: {
total: {
label: "产品总数",
value: 0,
},
in: {
label: "当月入库",
value: 0,
},
out: {
label: "当月出库",
value: 0,
},
},
inStockQuery: {
pageNum: 1,
pageSize: 10,
},
outStockQuery: {
pageNum: 1,
pageSize: 10,
},
storageQuery: {
pageNum: 1,
pageSize: 10,
},
storageList: [], // 库存列表
inStockList: [], // 入库列表
outStockList: [], // 出库列表
storageLoading: false,
inStockLoading: false,
outStockLoading: false,
storageCompleted: false,
inStockCompleted: false,
outStockCompleted: false,
},
onTabsChange(e: any) {
const { value: stockType } = e.detail;
this.setData({
stockType,
});
if (stockType > 0) {
if (
(stockType == 1 && this.data.inStockList.length == 0) ||
(stockType == 2 && this.data.outStockList.length == 0)
) {
this.getStockIOList();
}
} else {
if (this.data.storageList.length === 0) {
this.getStorageList();
}
}
},
async loadData() {
const authToken = getApp().globalData.authToken;
this.setData({
authToken,
});
if (!authToken) return;
const { stockType } = this.data;
if (stockType == 0) {
await this.getStorageList();
} else {
await this.getStockIOList();
}
await this.loadStatisticData();
},
/**
* 加载出入库日志列表
*/
async getStockIOList() {
const { inStockQuery, outStockQuery, stockType } = this.data;
let query;
if (stockType == 1) {
this.setData({
inStockLoading: true,
});
query = inStockQuery;
} else if (stockType == 2) {
this.setData({
outStockLoading: true,
});
query = outStockQuery;
} else {
return;
}
try {
const resp: any = await stockLogList({
type: stockType,
pageNum: query.pageNum,
pageSize: query.pageSize,
});
let completed = false;
if (stockType == 1) {
if (
Math.ceil(resp.total / inStockQuery.pageSize) == inStockQuery.pageNum
) {
completed = true;
}
this.setData({
inStockCompleted: completed,
// @ts-ignore
inStockList: [
...this.data.inStockList,
...resp.rows.map((el: any) => ({
...el,
provePic:
el.provePic?.split(",").map((img: string) => {
if (img.startsWith("http://") || img.startsWith("https://")) {
return img;
} else {
return `${httpClient.baseUrl}${img}`;
}
}) ?? [],
})),
],
});
if (!completed) {
this.setData({
["inStockQuery.pageNum"]: inStockQuery.pageNum + 1,
});
}
} else if (stockType == 2) {
if (
Math.ceil(resp.total / outStockQuery.pageSize) ==
outStockQuery.pageNum
) {
completed = true;
}
this.setData({
outStockCompleted: completed,
// @ts-ignore
outStockList: [
...this.data.outStockList,
...resp.rows.map((el: any) => ({
...el,
provePic:
el.provePic?.split(",").map((img: string) => {
if (img.startsWith("http://") || img.startsWith("https://")) {
return img;
} else {
return `${httpClient.baseUrl}${img}`;
}
}) ?? [],
})),
],
});
if (!completed) {
this.setData({
["outStockQuery.pageNum"]: outStockQuery.pageNum + 1,
});
}
}
} catch (error) {
console.log(error);
}
if (this.data.stockType == 1) {
this.setData({
inStockLoading: false,
});
} else if (this.data.stockType == 2) {
this.setData({
outStockLoading: false,
});
}
},
/**
* 获取库存列表
*/
async getStorageList() {
this.setData({
storageLoading: false,
});
const { storageQuery } = this.data;
try {
const resp: any = await storageList(storageQuery);
let completed = false;
if (
Math.ceil(resp.total / storageQuery.pageSize) == storageQuery.pageNum
) {
completed = true;
}
this.setData({
// @ts-ignore
storageList: [...this.data.storageList, ...resp.rows],
storageCompleted: completed,
});
if (!completed) {
this.setData({
[`storageQuery.pageNum`]: storageQuery.pageNum + 1,
});
}
} catch (error) {}
this.setData({
storageLoading: false,
});
},
/**
* 获取统计数据列表
*/
async loadStatisticData() {
const resp: any = await stockStatistics();
this.setData({
["statisticsData.in.value"]: resp.data.in,
["statisticsData.out.value"]: resp.data.out,
["statisticsData.total.value"]: resp.data.total,
});
},
/**
* 触底时,加载更多库存列表
*/
loadMoreStorage() {
console.log("库存到底了");
const { storageLoading, storageCompleted } = this.data;
if (storageLoading || storageCompleted) {
return;
}
this.getStorageList();
},
/**
* 触底时,加载更多入库列表
*/
loadMoreInStock() {
const { inStockLoading, inStockCompleted } = this.data;
console.log(inStockLoading, inStockCompleted);
if (inStockLoading || inStockCompleted) {
return;
}
this.getStockIOList();
},
/**
* 触底时,加载更多出库列表
*/
loadMoreOutStock() {
const { outStockLoading, outStockCompleted } = this.data;
if (outStockLoading || outStockCompleted) {
return;
}
this.getStockIOList();
},
handleAddStock() {
const { stockType } = this.data;
wx.navigateTo({
url: `/pages/add-stock/add-stock?type=${stockType}`,
});
},
handleUpdateStock() {},
/**
* 生命周期函数--监听页面加载
*/
onLoad() {
this.loadData();
},
/**
* 刷新此页面
*/
async handleRefresh() {
this.setData({
["inStockQuery.pageNum"]: 1,
["outStockQuery.pageNum"]: 1,
["storageQuery.pageNum"]: 1,
storageLoading: false,
inStockLoading: false,
outStockLoading: false,
storageCompleted: false,
inStockCompleted: false,
outStockCompleted: false,
inStockList: [],
outStockList: [],
storageList: [],
});
await this.loadData();
wx.stopPullDownRefresh();
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {},
/**
* 生命周期函数--监听页面显示
*/
onShow() {},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
this.handleRefresh();
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
const { stockType } = this.data;
if (stockType == 0) {
this.loadMoreStorage();
} else if (stockType == 1) {
this.loadMoreInStock();
} else if (stockType == 2) {
this.loadMoreOutStock();
}
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {},
});

View File

@ -0,0 +1,140 @@
<!--pages/stock/stock.wxml-->
<!-- 产品库存管理 -->
<wxs module="times" src="../../utils/time.wxs" />
<statistics-card statistics-data="{{statisticsData}}" />
<t-tabs class="stock-tabs" defaultValue="{{0}}" value="{{stockType}}" bind:change="onTabsChange" theme="tag">
<t-tab-panel label="库存" value="{{0}}" />
<t-tab-panel label="入库" value="{{1}}" />
<t-tab-panel label="出库" value="{{2}}" />
</t-tabs>
<view class="stock-list">
<t-fab wx:if="{{stockType > 0}}" class="float-button" icon="add" aria-label="增加" bind:click="handleAddStock"></t-fab>
<view hidden="{{stockType!=0}}" class="scroll-container">
<view class="grid">
<view wx:for="{{storageList}}" wx:key="specId" class="card">
<view class="fields">
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">产品</text>
<text class="value">{{item.productName}}</text>
</view>
</view>
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">型号</text>
<text class="value">{{item.modelName}}</text>
</view>
</view>
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">规格</text>
<text class="value">{{item.specName}}</text>
</view>
</view>
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">库存</text>
<text class="value">{{item.stock}}</text>
</view>
</view>
</view>
</view>
</view>
</view>
<view hidden="{{stockType!=1}}" class="scroll-container">
<view class="grid">
<view wx:for="{{inStockList}}" wx:key="logId" class="card">
<t-image class="prove-pic" mode="aspectFill" error="slot" src="{{item.provePic[0]}}">
<t-icon name="image-error" slot="error" />
</t-image>
<view class="fields">
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">产品</text>
<text class="value">{{item.productName}}</text>
</view>
</view>
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">型号</text>
<text class="value">{{item.modelName}}</text>
</view>
</view>
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">规格</text>
<text class="value">{{item.specName}}</text>
</view>
</view>
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">数量</text>
<text class="value">{{item.total}}</text>
</view>
</view>
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">日期</text>
<text class="value">{{times.formatDate(item.date) || "-"}}</text>
</view>
</view>
</view>
</view>
</view>
</view>
<view hidden="{{stockType!=2}}" class="scroll-container">
<view class="grid">
<view wx:for="{{outStockList}}" wx:key="logId" class="card">
<t-image class="prove-pic" mode="aspectFill" error="slot" src="{{item.provePic[0]}}">
<t-icon name="image-error" slot="error" width="100rpx" height="100rpx" />
</t-image>
<view class="fields">
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">产品</text>
<text class="value">{{item.productName}}</text>
</view>
</view>
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">型号</text>
<text class="value">{{item.modelName}}</text>
</view>
</view>
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">规格</text>
<text class="value">{{item.specName}}</text>
</view>
</view>
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">数量</text>
<text class="value">{{item.total}}</text>
</view>
</view>
<view class="field">
<view class="indicator"></view>
<view class="content">
<text class="title">日期</text>
<text class="value">{{times.formatDate(item.date) || "-"}}</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>