|
|
@@ -0,0 +1,360 @@
|
|
|
+/**
|
|
|
+ * 经销商库存管理页面 Mixin
|
|
|
+ * @fileoverview 提供经销商库存列表查询、详情查看等功能的混入
|
|
|
+ */
|
|
|
+
|
|
|
+import { getInventoryList, getInventoryDetail } from '@/api/dealer/inventory'
|
|
|
+import { mapGetters } from 'vuex'
|
|
|
+
|
|
|
+/**
|
|
|
+ * 经销商库存管理mixin
|
|
|
+ * 提供库存列表查询、详情查看等功能
|
|
|
+ */
|
|
|
+export default {
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ // 表格数据
|
|
|
+ /** @type {import('@/api/dealer/inventory').DealerInventoryRecord[]} */
|
|
|
+ tableData: [],
|
|
|
+ loading: false,
|
|
|
+
|
|
|
+ // 分页信息
|
|
|
+ /** @type {{currentPage: number, pageSize: number, total: number}} */
|
|
|
+ pagination: {
|
|
|
+ currentPage: 1,
|
|
|
+ pageSize: 20,
|
|
|
+ total: 0
|
|
|
+ },
|
|
|
+
|
|
|
+ // 搜索表单
|
|
|
+ /** @type {{customerCode: string, customerName: string, itemCode: string, itemName: string}} */
|
|
|
+ searchForm: {
|
|
|
+ customerCode: '',
|
|
|
+ customerName: '',
|
|
|
+ itemCode: '',
|
|
|
+ itemName: ''
|
|
|
+ },
|
|
|
+
|
|
|
+ // 详情对话框控制
|
|
|
+ detailDialogVisible: false,
|
|
|
+ detailLoading: false,
|
|
|
+
|
|
|
+ // 当前查看的库存详情
|
|
|
+ /** @type {import('@/api/dealer/inventory').DealerInventoryRecord|null} */
|
|
|
+ currentInventoryDetail: null,
|
|
|
+
|
|
|
+ // avue-crud配置
|
|
|
+ option: {
|
|
|
+ height: 'auto',
|
|
|
+ calcHeight: 30,
|
|
|
+ tip: false,
|
|
|
+ searchShow: true,
|
|
|
+ searchMenuSpan: 6,
|
|
|
+ border: true,
|
|
|
+ index: true,
|
|
|
+ selection: false,
|
|
|
+ viewBtn: true,
|
|
|
+ addBtn: false,
|
|
|
+ editBtn: false,
|
|
|
+ delBtn: false,
|
|
|
+ dialogClickModal: false,
|
|
|
+ dialogWidth: 800,
|
|
|
+ labelWidth: 120,
|
|
|
+ column: [
|
|
|
+ {
|
|
|
+ label: '客户编码',
|
|
|
+ prop: 'customerCode',
|
|
|
+ search: true,
|
|
|
+ minWidth: 120,
|
|
|
+ overHidden: true
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '客户名称',
|
|
|
+ prop: 'customerName',
|
|
|
+ search: true,
|
|
|
+ minWidth: 180,
|
|
|
+ overHidden: true
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '物料编码',
|
|
|
+ prop: 'itemCode',
|
|
|
+ search: true,
|
|
|
+ minWidth: 140,
|
|
|
+ overHidden: true
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '物料名称',
|
|
|
+ prop: 'itemName',
|
|
|
+ search: true,
|
|
|
+ minWidth: 200,
|
|
|
+ overHidden: true
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '规格型号',
|
|
|
+ prop: 'specs',
|
|
|
+ minWidth: 150,
|
|
|
+ overHidden: true
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '当前库存',
|
|
|
+ prop: 'currentInventory',
|
|
|
+ minWidth: 120,
|
|
|
+ align: 'right',
|
|
|
+ sortable: true
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '创建时间',
|
|
|
+ prop: 'createTime',
|
|
|
+ minWidth: 160,
|
|
|
+ type: 'datetime',
|
|
|
+ format: 'yyyy-MM-dd HH:mm:ss',
|
|
|
+ valueFormat: 'yyyy-MM-dd HH:mm:ss'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '更新时间',
|
|
|
+ prop: 'updateTime',
|
|
|
+ minWidth: 160,
|
|
|
+ type: 'datetime',
|
|
|
+ format: 'yyyy-MM-dd HH:mm:ss',
|
|
|
+ valueFormat: 'yyyy-MM-dd HH:mm:ss'
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ computed: {
|
|
|
+ ...mapGetters(['permission', 'userInfo'])
|
|
|
+ },
|
|
|
+
|
|
|
+ mounted() {
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ methods: {
|
|
|
+ /**
|
|
|
+ * 加载表格数据
|
|
|
+ * @returns {Promise<void>}
|
|
|
+ */
|
|
|
+ async loadTableData() {
|
|
|
+ try {
|
|
|
+ this.loading = true
|
|
|
+
|
|
|
+ const params = {
|
|
|
+ current: this.pagination.currentPage,
|
|
|
+ size: this.pagination.pageSize,
|
|
|
+ ...this.searchForm
|
|
|
+ }
|
|
|
+
|
|
|
+ const response= await getInventoryList(params)
|
|
|
+
|
|
|
+ if (response.data && response.data.success) {
|
|
|
+ const { records, total } = response.data.data
|
|
|
+ this.tableData = records || []
|
|
|
+ this.pagination.total = total || 0
|
|
|
+ } else {
|
|
|
+ this.$message.error(response.data?.msg || '获取库存列表失败')
|
|
|
+ this.tableData = []
|
|
|
+ this.pagination.total = 0
|
|
|
+ }
|
|
|
+ this.loading = false
|
|
|
+ } catch (error) {
|
|
|
+ this.loading = false
|
|
|
+ console.error('加载库存列表失败:', error)
|
|
|
+ this.$message.error('获取库存列表失败,请稍后重试')
|
|
|
+ this.tableData = []
|
|
|
+ this.pagination.total = 0
|
|
|
+ } finally {
|
|
|
+ this.loading = false
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 搜索处理
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ handleSearch() {
|
|
|
+ this.pagination.currentPage = 1
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重置搜索
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ handleResetSearch() {
|
|
|
+ this.searchForm = {
|
|
|
+ customerCode: '',
|
|
|
+ customerName: '',
|
|
|
+ itemCode: '',
|
|
|
+ itemName: ''
|
|
|
+ }
|
|
|
+ this.pagination.currentPage = 1
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 每页大小改变
|
|
|
+ * @param {number} size - 新的每页大小
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ handleSizeChange(size) {
|
|
|
+ this.pagination.pageSize = size
|
|
|
+ this.pagination.currentPage = 1
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 当前页改变
|
|
|
+ * @param {number} page - 新的页码
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ handleCurrentChange(page) {
|
|
|
+ this.pagination.currentPage = page
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查看库存详情
|
|
|
+ * @param {import('@/api/dealer/inventory').DealerInventoryRecord} row - 库存记录
|
|
|
+ * @returns {Promise<void>}
|
|
|
+ */
|
|
|
+ async handleViewDetail(row) {
|
|
|
+ try {
|
|
|
+ this.detailLoading = true
|
|
|
+ this.detailDialogVisible = true
|
|
|
+
|
|
|
+ const response = await getInventoryDetail(row.id)
|
|
|
+
|
|
|
+ if (response.data && response.data.success) {
|
|
|
+ this.currentInventoryDetail = response.data.data
|
|
|
+ } else {
|
|
|
+ this.$message.error(response.data?.msg || '获取库存详情失败')
|
|
|
+ this.detailDialogVisible = false
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取库存详情失败:', error)
|
|
|
+ this.$message.error('获取库存详情失败,请稍后重试')
|
|
|
+ this.detailDialogVisible = false
|
|
|
+ } finally {
|
|
|
+ this.detailLoading = false
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 关闭详情对话框
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ handleCloseDetail() {
|
|
|
+ this.detailDialogVisible = false
|
|
|
+ this.currentInventoryDetail = null
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * avue-crud的onLoad事件处理
|
|
|
+ * @param {Object} page - 分页信息
|
|
|
+ * @param {Object} params - 查询参数
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ onLoad(page, params = {}) {
|
|
|
+ this.pagination.currentPage = page.currentPage
|
|
|
+ this.pagination.pageSize = page.pageSize
|
|
|
+ Object.assign(this.searchForm, params)
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * avue-crud的搜索改变事件处理
|
|
|
+ * @param {Object} params - 搜索参数
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ searchChange(params) {
|
|
|
+ // Object.assign(this.searchForm, params)
|
|
|
+ // this.handleSearch()
|
|
|
+ Object.assign(this.searchForm, params)
|
|
|
+ this.pagination.currentPage = 1
|
|
|
+ this.loadTableData().finally(() => {
|
|
|
+ // 调用done回调函数,通知avue-crud搜索完成
|
|
|
+ if (typeof done === 'function') {
|
|
|
+ done()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * avue-crud的搜索重置事件处理
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ searchReset() {
|
|
|
+ // this.handleResetSearch()
|
|
|
+ this.searchForm = {
|
|
|
+ customerCode: '',
|
|
|
+ customerName: '',
|
|
|
+ itemCode: '',
|
|
|
+ itemName: ''
|
|
|
+ }
|
|
|
+ this.pagination.currentPage = 1
|
|
|
+ this.loadTableData().finally(() => {
|
|
|
+ // 调用done回调函数,通知avue-crud重置完成
|
|
|
+ if (typeof done === 'function') {
|
|
|
+ done()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * avue-crud的当前页改变事件处理
|
|
|
+ * @param {number} currentPage - 当前页
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ currentChange(currentPage) {
|
|
|
+ this.handleCurrentChange(currentPage)
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * avue-crud的每页大小改变事件处理
|
|
|
+ * @param {number} pageSize - 每页大小
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ sizeChange(pageSize) {
|
|
|
+ this.handleSizeChange(pageSize)
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * avue-crud的刷新事件处理
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ refreshChange() {
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 格式化库存数量显示
|
|
|
+ * @param {string|number} inventory - 库存数量
|
|
|
+ * @returns {string} 格式化后的库存数量
|
|
|
+ */
|
|
|
+ formatInventory(inventory) {
|
|
|
+ if (inventory === null || inventory === undefined || inventory === '') {
|
|
|
+ return '0'
|
|
|
+ }
|
|
|
+ const num = parseFloat(inventory)
|
|
|
+ return isNaN(num) ? '0' : num.toFixed(4).replace(/\.?0+$/, '')
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取库存状态样式
|
|
|
+ * @param {string|number} inventory - 库存数量
|
|
|
+ * @returns {string} CSS类名
|
|
|
+ */
|
|
|
+ getInventoryClass(inventory) {
|
|
|
+ const num = parseFloat(inventory)
|
|
|
+ if (isNaN(num) || num <= 0) {
|
|
|
+ return 'inventory-zero'
|
|
|
+ } else if (num < 10) {
|
|
|
+ return 'inventory-low'
|
|
|
+ } else {
|
|
|
+ return 'inventory-normal'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|