#
zhou zhou
5 天以前 9adc3c142e94bca536b481c8f0a568a047555de3
#
5个文件已添加
8个文件已修改
371 ■■■■■ 已修改文件
.idea/.gitignore 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/misc.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/modules.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/pda-master.iml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/vcs.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/zh-Hans.json 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/StartInTask.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/emptyTray/outBound.vue 95 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/home/index.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/listing/labour.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/listing/matnrPalletising.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/listing/unPakin.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/rece/other.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/.gitignore
New file
@@ -0,0 +1,10 @@
# Default ignored files
/shelf/
/workspace.xml
# Ignored default folder with query files
/queries/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/
.idea/misc.xml
New file
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="KubernetesApiProvider">{}</component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/out" />
  </component>
</project>
.idea/modules.xml
New file
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/.idea/pda-master.iml" filepath="$PROJECT_DIR$/.idea/pda-master.iml" />
    </modules>
  </component>
</project>
.idea/pda-master.iml
New file
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$" />
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>
.idea/vcs.xml
New file
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="" vcs="Git" />
  </component>
</project>
locale/zh-Hans.json
@@ -19,6 +19,8 @@
        "remPwd":"记住密码"
    },
    "index":{
        "in": "入库",
        "out": "出库",
        "GR": "单据收货", 
        "palletizing": "单据组托",
        "palletBuilding":"组托解绑",
pages/AGV/StartInTask.vue
@@ -72,8 +72,8 @@
        <view class="cu-bar btn-group foot">
            <button class="cu-btn text-blue line-blue shadow" @click="clear">清空</button>
            <button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm">入库</button>
            <button v-if="hasButtonPermission('reset')" class="cu-btn text-blue line-blue shadow" @click="clear">清空</button>
            <button v-if="hasButtonPermission('submit')" class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm">入库</button>
        </view>
        
@@ -103,6 +103,7 @@
                curCode: '',
                whAreaId:'',
                repeatClick: false,
                buttonPermissions: [] // 按钮权限列表
                
            }
        },
@@ -112,8 +113,15 @@
        mounted() {
            this.getRece()
            this.whAreaId = uni.getStorageSync('whAreaId')
            // 获取按钮权限
            this.buttonPermissions = uni.getStorageSync('buttonPermissions') || [];
            console.log('当前页面按钮权限:', this.buttonPermissions);
        },
        methods: {    
            hasButtonPermission(route) {
                return this.buttonPermissions.includes(route);
            },
            selChange(val) {
                uni.setStorageSync('whAreaId', val)
            },
pages/emptyTray/outBound.vue
@@ -3,37 +3,46 @@
        <form>
            <view class="cu-form-group margin-top">
                <view class="title">接驳站点</view>
                <input placeholder=" 请扫描接驳站点条码" v-model="barcode" ></input>
                <input
                    placeholder=" 请扫描接驳站点条码"
                    v-model="barcode"
                />
            </view>        
            
            <view class="cu-form-group margin-bottom">
                <view class="title">容器类型</view>
                <view style="width: 78%;">
                    <uni-data-select style="min-width: 80%; max-width: 80%;" v-model="palletTypeId" :localdata="range"
                        placement="bottom" @change="selChange"></uni-data-select>
                <view style="width: 78%">
                    <uni-data-select
                        style="min-width: 80%; max-width: 80%"
                        v-model="palletTypeId"
                        :localdata="range"
                        placement="bottom"
                        @change="selChange"
                    ></uni-data-select>
                </view>
            </view>
        </form>
        <view class="cu-bar btn-group foot">
            <button class="cu-btn text-blue line-blue shadow" @click="clear">清空</button>
            <button class="cu-btn bg-blue shadow-blur" @click="confirm">呼叫</button>
            <button
                class="cu-btn text-blue line-blue shadow"
                @click="clear"
            >
                清空
            </button>
            <button
                class="cu-btn bg-blue shadow-blur"
                @click="confirm"
            >
                呼叫
            </button>
        </view>        
    </view>
</template>
<script>
    import {
        request
    } from '../../common/request.js'
    import {
        mapState,
        mapMutations,
        mapActions,
        mapGetters
    } from 'vuex';
import { request } from '../../common/request.js'
import { mapState, mapMutations, mapActions, mapGetters } from 'vuex'
    export default {
        data() {
            return {
@@ -43,15 +52,16 @@
                container: '',
                list: [],
                range: [],
                curCode: ''
            curCode: '',
            palletTypeId: ''
            }
        },
        computed: {
            ...mapState('user', ['dynamicFields']),
        ...mapState('user', ['dynamicFields'])
        },
        mounted() {
            this.getPalletType(),
            this.palletTypeId = uni.getStorageSync('palletTypeId')
            (this.palletTypeId = uni.getStorageSync('palletTypeId'))
        },
        methods: {
            selChange(val) {
@@ -79,7 +89,7 @@
            // },
            remove(index) {
                this.list.splice(index, 1);
            this.list.splice(index, 1)
            },
            clear() {
                this.list = []
@@ -104,39 +114,38 @@
            },
            
            async getPalletType() {
                const {
                    code,
                    data,
                    msg
                } = await request('/info/palletType/list', {}, 'get')
            const { code, data, msg } = await request(
                '/info/palletType/list',
                {},
                'get'
            )
                if (code === 200) {
                    this.range = data.map(item => ({
                this.range = data.map((item) => ({
                        value: item.id,
                        text: item.group === null ? item.label : item.group + "-- " + item.label
                    }));
                    text:
                        item.group === null
                            ? item.label
                            : item.group + '-- ' + item.label
                }))
                }
            },
            async confirm() {
                if(this.barcode === '' || this.barcode === null){
                    uni.showToast({
                        title: "接驳站点不能为空",
                        icon: "none",
                    title: '接驳站点不能为空',
                    icon: 'none'
                    })
                    return ;
                return
                }                
                if(this.palletTypeId === '' || this.palletTypeId === null){
                    uni.showToast({
                        title: "请选择托盘类型",
                        icon: "none",
                    title: '请选择托盘类型',
                    icon: 'none'
                    })
                    return ;
                return
                } else {
                    const {
                        code,
                        data,
                        msg
                    } = await request('/orders/confirm', {
                const { code, data, msg } = await request('/orders/confirm', {
                        receipts: newArr,
                        palletTypeId: this.palletTypeId
                    })
@@ -150,7 +159,7 @@
                    } else {
                        uni.showToast({
                            title: msg,
                            icon: "none",
                        icon: 'none',
                            position: 'top'
                        })
                    }                
@@ -176,8 +185,7 @@
                //         icon: "none",
                //     })
                // }
            },
        }
        }
    }
</script>
@@ -198,7 +206,6 @@
    .text-blue {
        color: #0081ff !important;
    }
    .item {
pages/home/index.vue
@@ -1,47 +1,70 @@
<template>
    <view class="container">
        <view class="user-bg">
            <image src="../../static/img/toux.png" class="tx" mode="widthFix"></image>
            <image
                src="../../static/img/toux.png"
                class="tx"
                mode="widthFix"
            ></image>
            <view class="text-xl margin-top-sm margin-left-lg">
                <view class="text-blue text-bold text-xl">
                    {{user.username}}
                </view>
                <view class="text-gray text-l">{{user.code}}</view>
            </view>
            <view class="cu-btn bg-red margin-tb-sm lg round" style="position: absolute; right: 20px; width: 30%; height: 50%;" @click="equit">{{$t('index.outLogin')}}</view>
            <view
                class="cu-btn bg-red margin-tb-sm lg round"
                style="position: absolute; right: 20px; width: 30%; height: 50%"
                @click="equit"
            >
                {{ $t('index.outLogin') }}
            </view>
        </view>
        
        <!-- 加载中提示 -->
        <view v-if="loading" class="loading-container">
        <view
            v-if="loading"
            class="loading-container"
        >
            <text>加载中...</text>
        </view>
        
        <!-- 动态菜单区域 -->
        <block v-for="category in filteredMenus" :key="category.id">
        <block
            v-for="category in filteredMenus"
            :key="category.id"
        >
            <view class="cu-bar bg-white solid-bottom margin-top-sm">
                <view class="action">
                    <text class="cuIcon-title text-orange "></text> {{category.name}}
                    <text class="cuIcon-title text-orange"></text>
                    {{ $t(category.component) }}
                </view>
            </view>
            <view class="cu-list grid col-4 no-border">
                <view class="cu-item" v-for="menu in category.menus" :key="menu.id" @click="goToPage(menu)">
                <view
                    class="cu-item"
                    v-for="menu in category.menus"
                    :key="menu.id"
                    @click="goToPage(menu)"
                >
                    <view :class="'cuIcon-' + menu.icon + ' text-blue'"></view>
                    <text>{{menu.name}}</text>
                    <text>{{ $t(menu.component) }}</text>
                </view>
            </view>
        </block>
        
        <!-- 无菜单权限时显示提示 -->
        <view v-if="!loading && filteredMenus.length === 0" class="no-permission">
        <view
            v-if="!loading && filteredMenus.length === 0"
            class="no-permission"
        >
            <text>暂无可用菜单</text>
        </view>
    </view>
</template>
<script>
    import {
        request
    } from '../../common/request2.js'
import { request } from '../../common/request2.js'
    
    export default {
        data() {
@@ -54,142 +77,152 @@
            }
        },
        onShow() {
            this.user = uni.getStorageSync('userData');
            this.loadMenusAndPermissions();
        this.user = uni.getStorageSync('userData')
        this.loadMenusAndPermissions()
        },
        methods: {
            // 并行获取菜单和权限数据
            async loadMenusAndPermissions() {
                this.loading = true;
            this.loading = true
                try {
                    const [menuRes, permRes] = await Promise.all([
                        this.fetchMenuTree(),
                        this.fetchPermissions()
                    ]);
                    this.menuTree = menuRes;
                    this.permissionIds = new Set(permRes);
                    this.filterMenus();
                ])
                this.menuTree = menuRes
                this.permissionIds = new Set(permRes)
                this.filterMenus()
                } catch (e) {
                    console.error('加载菜单权限失败:', e);
                console.error('加载菜单权限失败:', e)
                    uni.showToast({
                        title: '加载菜单失败',
                        icon: 'none'
                    });
                })
                } finally {
                    this.loading = false;
                this.loading = false
                }
            },
            
            // 获取菜单树
            async fetchMenuTree() {
                const { code, data, msg } = await request('/menuPda/tree', {});
            const { code, data, msg } = await request('/menuPda/tree', {})
                if (code === 200) {
                    return data || [];
                return data || []
                } else if (code === 403) {
                    uni.showToast({
                        title: msg,
                        icon: 'none'
                    });
                })
                    setTimeout(() => {
                        uni.reLaunch({
                            url: '/pages/login/index'
                        });
                    }, 1000);
                    throw new Error(msg);
                    })
                }, 1000)
                throw new Error(msg)
                } else {
                    throw new Error(msg || '获取菜单失败');
                throw new Error(msg || '获取菜单失败')
                }
            },
            
            // 获取权限(支持多角色)
            async fetchPermissions() {                
                const roleIds = this.user.userRoleIds || [];
                console.log('roleIds:', roleIds);
            console.log('this.user:', this.user)
            const roleIds = this.user.userRoleIds || []
            console.log('roleIds:', roleIds)
                if (roleIds.length === 0) {
                    console.warn('用户没有角色ID');
                    return [];
                console.warn('用户没有角色ID')
                return []
                }
                const allIds = [];
            const allIds = []
                for (const roleId of roleIds) {
                    console.log('请求角色权限, roleId:', roleId);
                    const ids = await this.fetchRolePermission(roleId);
                    console.log('角色权限结果:', ids);
                    allIds.push(...ids);
                const ids = await this.fetchRolePermission(roleId)
                allIds.push(...ids)
                }
                return [...new Set(allIds)]; // 去重合并
            return [...new Set(allIds)] // 去重合并
            },
            
            // 获取单个角色的权限
            async fetchRolePermission(roleId) {
                try {
                    const { code, data } = await request('/rolePda/scope/list', { roleId: roleId },'GET');
                const { code, data } = await request(
                    '/rolePda/scope/list',
                    { roleId: roleId },
                    'GET'
                )
                    if (code === 200) {
                        return data || [];
                    return data || []
                    }
                    return [];
                return []
                } catch (e) {
                    return [];
                return []
                }
            },
            
            // 过滤菜单并按分类组织
            filterMenus() {
                this.filteredMenus = [];
            this.filteredMenus = []
                for (const category of this.menuTree) {
                    if (category.type === 1) continue; // 跳过按钮
                if (category.type === 1) continue // 跳过按钮
                    
                    const menus = this.filterChildren(category.children || []);
                const menus = this.filterChildren(category.children || [])
                    // 只有当分类有可见子菜单时才显示该分类
                    if (menus.length > 0) {
                        this.filteredMenus.push({
                            id: category.id,
                            name: category.name,
                        component: category.component, // 国际化key
                            menus: menus
                        });
                    })
                    }
                }
            },
            
            // 过滤子菜单
            filterChildren(children) {
                return children.filter(item => {
                    if (item.type === 1) return false; // 过滤按钮
                    return this.permissionIds.has(item.id);
                }).map(item => ({
            return children
                .filter((item) => {
                    if (item.type === 1) return false // 过滤按钮
                    return this.permissionIds.has(item.id)
                })
                .map((item) => ({
                    id: item.id,
                    name: item.name,
                    route: '/pages' + item.route,
                    icon: item.component || 'apps', // 默认图标
                    icon: item.icon || 'apps', // 默认图标
                    component: item.component, // 国际化key
                    buttons: this.getButtons(item.children || [])
                }));
                }))
            },
            
            // 获取按钮权限
            getButtons(children) {
                return children.filter(item => item.type === 1 && this.permissionIds.has(item.id))
                    .map(btn => ({
            return children
                .filter(
                    (item) => item.type === 1 && this.permissionIds.has(item.id)
                )
                .map((btn) => ({
                        id: btn.id,
                        name: btn.name,
                        route: btn.route
                    }));
                }))
            },
            
            // 检查权限(供其他地方使用)
            hasPermission(id) {
                return this.permissionIds.has(id);
            return this.permissionIds.has(id)
            },
            
            // 跳转页面并传递按钮权限
            goToPage(menu) {
                // 将按钮权限存入 storage,以 route 为 key
                const buttonRoutes = (menu.buttons || []).map(btn => btn.route);
                uni.setStorageSync('buttonPermissions', buttonRoutes);
                console.log('按钮权限:', buttonRoutes);
            const buttonRoutes = (menu.buttons || []).map((btn) => btn.route)
            uni.setStorageSync('buttonPermissions', buttonRoutes)
            console.log('按钮权限:', buttonRoutes)
                
                // 跳转页面
                uni.navigateTo({
                    url: menu.route
                });
            })
            },
            
            // 退出登录
@@ -199,11 +232,11 @@
                    duration: 1000
                })
                setTimeout(() => {
                    uni.removeStorageSync('token');
                uni.removeStorageSync('token')
                    uni.reLaunch({
                        url: "/pages/login/index"
                    });
                }, 1000);
                    url: '/pages/login/index'
                })
            }, 1000)
            }
        }
    }
pages/listing/labour.vue
@@ -62,8 +62,8 @@
        
        <view class="cu-bar btn-group foot">
            <button class="cu-btn text-blue line-blue shadow" @click="clear">清空</button>
            <button class="cu-btn bg-blue shadow-blur" @click="confirm">上架</button>
            <button v-if="hasButtonPermission('reset')" class="cu-btn text-blue line-blue shadow" @click="clear">清空</button>
            <button v-if="hasButtonPermission('submit')" class="cu-btn bg-blue shadow-blur" @click="confirm">上架</button>
        </view>
    </view>
</template>
@@ -86,13 +86,22 @@
                locCode: '',
                container: '',
                list: [],
                buttonPermissions: [] // 按钮权限列表
            }
        },
        computed: {
            ...mapState('user', ['dynamicFields']),
        },
        mounted() {},
        mounted() {
            // 获取按钮权限
            this.buttonPermissions = uni.getStorageSync('buttonPermissions') || [];
            console.log('当前页面按钮权限:', this.buttonPermissions);
        },
        methods: {
            // 检查按钮权限
            hasButtonPermission(route) {
                return this.buttonPermissions.includes(route);
            },
            async search() {
                const {
                    code,
pages/listing/matnrPalletising.vue
@@ -115,8 +115,8 @@
            </block>
        </view>
        <view class="cu-bar btn-group foot">
            <button class="cu-btn text-blue line-blue shadow" @click="clear">清空</button>
            <button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm">组托</button>
            <button v-if="hasButtonPermission('reset')" class="cu-btn text-blue line-blue shadow" @click="clear">清空</button>
            <button v-if="hasButtonPermission('submit')" class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm">组托</button>
        </view>
    </view>
</template>
@@ -144,6 +144,7 @@
                isconfirm: false,                
                matnrCode:'',
                max: 99999999,
                buttonPermissions: [] // 按钮权限列表
            }
        },
        computed: {
@@ -152,8 +153,16 @@
                return this.list.reduce((acc, row) => +row.anfme + acc, 0) || 0
            }
        },
        mounted() {},
        mounted() {
            // 获取按钮权限
            this.buttonPermissions = uni.getStorageSync('buttonPermissions') || [];
            console.log('当前页面按钮权限:', this.buttonPermissions);
        },
        methods: {            
            // 检查按钮权限
            hasButtonPermission(route) {
                return this.buttonPermissions.includes(route);
            },
            async search() {
                const find = this.list.find(el => el.trackCode === this.barcode);
                find ? this.scrollTo() : this.getDet();
pages/listing/unPakin.vue
@@ -99,8 +99,8 @@
            </block>
        </view>
        <view class="cu-bar btn-group foot">
            <button class="cu-btn text-blue line-blue shadow" @click="clear">清空</button>
            <button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm">解绑</button>
            <button v-if="hasButtonPermission('reset')" class="cu-btn text-blue line-blue shadow" @click="clear">清空</button>
            <button v-if="hasButtonPermission('submit')" class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm">解绑</button>
        </view>
    </view>
</template>
@@ -129,6 +129,7 @@
                matnrCode: '',
                max: 99999999,
                pkCode: '',
                buttonPermissions: [] // 按钮权限列表
            }
        },
        computed: {
@@ -137,8 +138,16 @@
                return this.list.reduce((acc, row) => +row.anfme + acc, 0) || 0
            }
        },
        mounted() {},
        mounted() {
            // 获取按钮权限
            this.buttonPermissions = uni.getStorageSync('buttonPermissions') || [];
            console.log('当前页面按钮权限:', this.buttonPermissions);
        },
        methods: {
            // 检查按钮权限
            hasButtonPermission(route) {
                return this.buttonPermissions.includes(route);
            },
            async search() {
                const find = this.list.find(el => el.trackCode === this.barcode);
                find ? this.scrollTo() : this.getDet();
pages/rece/other.vue
@@ -161,13 +161,13 @@
        </view>
        <view class="cu-bar btn-group foot" v-show="!isconfirm">
            <button class="cu-btn text-blue line-blue shadow" @click="clear">清空</button>
            <button class="cu-btn bg-blue shadow-blur" @click="next">下一步</button>
            <button v-if="hasButtonPermission('reset')" class="cu-btn text-blue line-blue shadow" @click="clear">清空</button>
            <button v-if="hasButtonPermission('submit')" class="cu-btn bg-blue shadow-blur" @click="next">下一步</button>
        </view>
        <view class="cu-bar btn-group foot" v-show="isconfirm">
            <button class="cu-btn text-blue line-blue shadow" @click="prev">上一步</button>
            <button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm(false)">收货</button>
            <button v-if="hasButtonPermission('reset')" class="cu-btn text-blue line-blue shadow" @click="prev">上一步</button>
            <button v-if="hasButtonPermission('submit')" class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm(false)">收货</button>
        </view>
    </view>
@@ -194,6 +194,7 @@
                repeatClick: false,
                isconfirm: false,
                max: 99999999,
                buttonPermissions: [] // 按钮权限列表
            }
        },
        computed: {
@@ -209,8 +210,15 @@
        mounted() {
            this.getRece()
            this.whAreaId = uni.getStorageSync('whAreaId')
            // 获取按钮权限
            this.buttonPermissions = uni.getStorageSync('buttonPermissions') || [];
            console.log('当前页面按钮权限:', this.buttonPermissions);
        },
        methods: {
            // 检查按钮权限
            hasButtonPermission(route) {
                return this.buttonPermissions.includes(route);
            },
            async search() {
                const {
                    code,