refactor权限控制逻辑

- 移除全局方法getUserBtnRole
- 使用hasPermission函数替代checkBtnPermission
- 优化权限判断逻辑,减少冗余代码
- 统一权限控制的实现方式
This commit is contained in:
郑彪辉
2025-04-26 09:50:55 +08:00
parent 07ac63b5bb
commit 69af422128
28 changed files with 238 additions and 239 deletions

View File

@@ -96,7 +96,6 @@
// 判断是否已登录
if (getToken()) {
const memberStore: any = useMemberStore()
memberStore.getUserBtnRole()
await memberStore.setToken(getToken(), () => {
if (!uni.getStorageSync('openid')) {
const memberInfo = useMemberStore().info

View File

@@ -64,7 +64,7 @@
</view>
</u-form>
<view class="w-full footer">
<view class="w-full footer" v-if="hasPermission('erp_base_customer_add')">
<view class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
<button hover-class="none" class="!bg-[var(--primary-color)] text-[#fff] h-[80rpx] leading-[80rpx] rounded-[100rpx] text-[26rpx] font-500"
@click="handSave" :disabled="loading" :class="{'opacity-50': loading}">{{t('save')}}</button>
@@ -82,8 +82,9 @@
import { addCustomer,getusersList,getWarehouseSelect} from '@/addon/erp/api/base';
import { generatedCode } from '@/addon/erp/utils/common';
import { redirect } from '@/utils/common';
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
interface Warehouse {
id: number;
name: string;
@@ -208,8 +209,6 @@
}
// 保存
const handSave = async() => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_base_customer_add')
if (!hasPermission) return
formRef.value.validate().then(() => {
if (loading.value) return
loading.value = true

View File

@@ -29,7 +29,7 @@
<view><up-button :text="t('info')" size="mini"
@click="redirect({ url: '/addon/erp/pages/base/customer/detail',param:{id: item.id} })"></up-button>
</view>
<view><up-button type="error" @click="hanldeDelete(item.id)" :text="t('delete')"
<view v-if="hasPermission('erp_base_customer_delete')"><up-button type="error" @click="hanldeDelete(item.id)" :text="t('delete')"
size="mini"></up-button></view>
</view>
</view>
@@ -43,7 +43,7 @@
</mescroll-body>
<loading-page :loading="loading"></loading-page>
<view class="fixed bottom-4 right-4 z-2">
<view v-if="hasPermission('erp_base_customer_add')" class="fixed bottom-4 right-4 z-2">
<up-button @click="redirect({ url: '/addon/erp/pages/base/customer/add'})" type="primary" shape="circle"
:customStyle="{borderRadius: '50%',padding: 0,width: '50px',height: '50px'}">
<u-icon size="30" color="#fff" name="plus-circle-fill"></u-icon>
@@ -63,10 +63,10 @@
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
import { getCustomerList, deleteCustomer } from '@/addon/erp/api/base';
import { onShow, onPageScroll, onReachBottom } from '@dcloudio/uni-app';
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const { downCallback, mescrollInit, getMescroll } = useMescroll(onPageScroll, onReachBottom);
const show = ref(false);
// 获取系统状态栏的高度

View File

@@ -72,13 +72,13 @@
</view>
</u-form>
<view class="w-full footer">
<view v-if="hasPermission('erp_base_supplier_add')" class="w-full footer">
<view class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
<button hover-class="none" class="!bg-[var(--primary-color)] text-[#fff] h-[80rpx] leading-[80rpx] rounded-[100rpx] text-[26rpx] font-500"
@click="handSave" :disabled="loading" :class="{'opacity-50': loading}">{{t('save')}}</button>
</view>
</view>
<area-select ref="areaRef" @complete="areaSelectComplete" :area-id="0" />
<!-- <area-select ref="areaRef" @complete="areaSelectComplete" :area-id="0" /> -->
</view>
</template>
@@ -91,9 +91,10 @@
import { getProductTypeSelect} from '@/addon/erp/api/product';
import {uploadImage } from '@/app/api/system'
import { redirect } from '@/utils/common';
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import { img } from '@/utils/common'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const memberStore = useMemberStore()
interface FileItem {
url: string;
@@ -246,8 +247,6 @@
}
// 保存
const handSave = async() => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_base_supplier_add')
if (!hasPermission) return
formRef.value.validate().then(() => {
if (loading.value) return
loading.value = true

View File

@@ -28,7 +28,7 @@
<view><up-button :text="t('info')" size="mini"
@click="redirect({ url: '/addon/erp/pages/base/supplier/detail',param:{id: item.id} })"></up-button>
</view>
<view><up-button type="error" @click="hanldeDelete(item.id)" :text="t('delete')"
<view v-if="hasPermission('erp_base_supplier_delete')"><up-button type="error" @click="hanldeDelete(item.id)" :text="t('delete')"
size="mini"></up-button></view>
</view>
</view>
@@ -42,7 +42,7 @@
</mescroll-body>
<loading-page :loading="loading"></loading-page>
<view class="fixed bottom-4 right-4 z-2">
<view v-if="hasPermission('erp_base_supplier_add')" class="fixed bottom-4 right-4 z-2">
<up-button @click="redirect({ url: '/addon/erp/pages/base/supplier/add'})" type="primary" shape="circle"
:customStyle="{borderRadius: '50%',padding: 0,width: '50px',height: '50px'}">
<u-icon size="30" color="#fff" name="plus-circle-fill"></u-icon>
@@ -62,6 +62,8 @@
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
import { getSupplierList, deleteSupplier } from '@/addon/erp/api/base';
import { onShow, onPageScroll, onReachBottom } from '@dcloudio/uni-app';
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const { downCallback, mescrollInit, getMescroll } = useMescroll(onPageScroll, onReachBottom);

View File

@@ -29,7 +29,7 @@
</view>
</view>
</u-form>
<view class="w-full footer">
<view v-if="hasPermission('erp_base_warehouse_add')" class="w-full footer">
<view class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
<button hover-class="none" class="!bg-[var(--primary-color)] text-[#fff] h-[80rpx] leading-[80rpx] rounded-[100rpx] text-[26rpx] font-500"
@click="handSave" :disabled="loading" :class="{'opacity-50': loading}">{{t('save')}}</button>
@@ -46,9 +46,9 @@
import { addWarehouse } from '@/addon/erp/api/base';
import { generatedCode } from '@/addon/erp/utils/common';
import { redirect } from '@/utils/common';
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const memberStore = useMemberStore()
const formRef: any = ref(null)
const loading = ref(false)
@@ -92,8 +92,6 @@
// 保存
const handSave = async() => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_base_warehouse_add')
if (!hasPermission) return
formRef.value.validate().then(() => {
if (loading.value) return
loading.value = true

View File

@@ -30,7 +30,7 @@
<view><up-button :text="t('info')" size="mini"
@click="redirect({ url: '/addon/erp/pages/base/warehouse/detail',param:{id: item.id} })"></up-button>
</view>
<view><up-button type="error" @click="hanldeDelete(item.id)" :text="t('delete')"
<view v-if="hasPermission('erp_base_warehouse_delete')"><up-button type="error" @click="hanldeDelete(item.id)" :text="t('delete')"
size="mini"></up-button></view>
</view>
</view>
@@ -44,7 +44,7 @@
</mescroll-body>
<loading-page :loading="loading"></loading-page>
<view class="fixed bottom-4 right-4 z-2">
<view v-if="hasPermission('erp_base_warehouse_add')" class="fixed bottom-4 right-4 z-2">
<up-button @click="redirect({ url: '/addon/erp/pages/base/warehouse/add'})" type="primary" shape="circle"
:customStyle="{borderRadius: '50%',padding: 0,width: '50px',height: '50px'}">
<u-icon size="30" color="#fff" name="plus-circle-fill"></u-icon>
@@ -63,6 +63,8 @@
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
import { getWarehouseList, deleteWarehouse } from '@/addon/erp/api/base';
import { onShow, onPageScroll, onReachBottom } from '@dcloudio/uni-app';
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const { downCallback, mescrollInit, getMescroll } = useMescroll(onPageScroll, onReachBottom);

View File

@@ -51,13 +51,13 @@
</up-form-item>
</view>
<view class="mt-[16rpx]">
<up-form-item :label="t('warehouseName')" prop="type" required borderBottom>
<up-form-item :label="t('warehouseName')" prop="warehouse_id" required borderBottom>
<!-- #ifdef H5 -->
<zxz-uni-data-select v-model="formData.warehouse_id" :localdata="warehouseList" dataKey="name" dataValue="id"
:clear="false" disabled placeholder="请选择仓库"/>
:clear="false" placeholder="请选择仓库" @change="warehouseIdChange"/>
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<wht-select v-model="formData.warehouse_id" :options="warehouseList" dataKey="name" dataValue="id" :defaultVal="formData.warehouse_id" disabled placeholder="请选择仓库" backgroundColor="#f5f7fa" :height="38" />
<wht-select v-model="formData.warehouse_id" :options="warehouseList" dataKey="name" dataValue="id" :defaultVal="formData.warehouse_id" placeholder="请选择仓库" :height="38" @change="warehouseIdChange"/>
<!-- #endif -->
</up-form-item>
</view>
@@ -170,7 +170,7 @@
</view>
</up-form>
<view v-if="hasPermission('erp_inbound_return_add')" class="w-full footer">
<view
class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
@@ -192,11 +192,11 @@
import { addManualReturn, getOutboundManualSelect,getOutboundManualInfo} from '@/addon/erp/api/sell';
import { generatedCode } from '@/addon/erp/utils/common';
import {uploadImage } from '@/app/api/system'
import { redirect } from '@/utils/common';
import { redirect } from '@/utils/common';
import useMemberStore from '@/stores/member'
import dayjs from 'dayjs'
import { img } from '@/utils/common'
import { img } from '@/utils/common'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const memberStore = useMemberStore()
@@ -304,6 +304,9 @@
}
const manualIdChange=(e: any) =>{
getOutboundManualInfoFn(e.id)
}
const warehouseIdChange=(e: any) =>{
formData.value.warehouse_id = e?.id ?? ''
}
const getOutboundManualInfoFn = async (id: any) => {
const data = await (await getOutboundManualInfo(id)).data
@@ -384,8 +387,6 @@
// 保存
const handSave = async() => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_inbound_return_add')
const handSave = async() => {
if (loading.value) return
if (!formData.value.manual_id) {
@@ -413,7 +414,7 @@
}
addManualReturn(formData.value).then((res : any) => {
loading.value = false
if (res.code == 1) {
if (res.code == 1) {
redirect({ url: '/addon/erp/pages/index' })
}
}).catch((err) => {

View File

@@ -52,19 +52,19 @@
</view>
<view class="foot border-0 border-t-1 border-solid border-[#ddd]">
<view class="flex justify-end p-[20rpx]">
<view><up-button v-if="item.status == 1" size="mini"
<view v-if="hasPermission('erp_inbound_return_updateStatus')"><up-button v-if="item.status == 1" size="mini"
:customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}"
type="primary" text="通过" @click="handleOperateOrder(item,'audit')"></up-button></view>
<view><up-button v-if="item.status == 1" size="mini"
<view v-if="hasPermission('erp_inbound_return_updateStatus')"><up-button v-if="item.status == 1" size="mini"
:customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}"
type="error" text="拒绝" @click="handleOperateOrder(item,'notAudit')"></up-button></view>
<view><up-button v-if="item.status == 3" size="mini"
<view v-if="hasPermission('erp_inbound_return_updateStorageStatus')"><up-button v-if="item.status == 3" size="mini"
:customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}"
type="primary" text="立即入库" @click="handleOperateOrder(item,'storage')"></up-button></view>
<view><up-button v-if="item.status == 3" size="mini"
<view v-if="hasPermission('erp_inbound_return_updateStorageStatus')"><up-button v-if="item.status == 3" size="mini"
:customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}"
type="error" text="拒绝入库" @click="handleOperateOrder(item,'notStorage')"></up-button></view>
<view><up-button v-if="item.status == 3" size="mini"
<view v-if="hasPermission('erp_inbound_return_anti')"><up-button v-if="item.status == 3" size="mini"
:customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}"
type="error" text="撤销审核" @click="handleOperateOrder(item,'backout')"></up-button></view>
<view><up-button size="mini"
@@ -131,9 +131,9 @@
getManualReturnStatus
} from '@/addon/erp/api/sell';
import { onShow, onPageScroll, onReachBottom, onLoad } from '@dcloudio/uni-app';
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
interface SellReturnItem {
id : number;
}
@@ -181,24 +181,14 @@
// 操作
const handleOperateOrder = async(item : any, type : string) => {
if (type === 'audit') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_inbound_return_updateStatus')
if (!hasPermission) return
auditOrderShow.value = true
} else if (type === 'notAudit') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_inbound_return_updateStatus')
if (!hasPermission) return
notAuditOrderShow.value = true
} else if (type === 'storage') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_inbound_return_updateStorageStatus')
if (!hasPermission) return
storageOrderShow.value = true
} else if (type === 'notStorage') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_inbound_return_updateStorageStatus')
if (!hasPermission) return
notStorageOrderShow.value = true
} else if (type === 'backout') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_inbound_return_anti')
if (!hasPermission) return
backoutOrderShow.value = true
}
refuseReason.value = ""

View File

@@ -189,7 +189,7 @@
</up-form>
<view class="w-full footer">
<view class="w-full footer" v-if="hasPermission('erp_manual_inbound_add')">
<view
class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
<button hover-class="none"
@@ -211,10 +211,10 @@
import { uploadImage } from '@/app/api/system'
import { redirect } from '@/utils/common';
import dayjs from 'dayjs'
import { checkBtnPermission} from '@/utils/auth';
import useMemberStore from '@/stores/member'
import { img } from '@/utils/common'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const memberStore = useMemberStore()
@@ -487,8 +487,6 @@
// 保存
const handSave = async() => {
const hasPermission =await checkBtnPermission(memberStore.btnPermission, 'erp_manual_inbound_add')
if (!hasPermission) return
if (loading.value) return
if (!formData.value.code) {
uni.showToast({ icon: 'none', title: t('codePlaceholderNew') })
@@ -527,7 +525,7 @@
addManual(formData.value).then((res : any) => {
loading.value = false
if (res.code == 1) {
redirect({ url: '/addon/erp/pages/inbound/stockPending/list' })
redirect({ url: '/addon/erp/pages/index' })
}
}).catch((err) => {
// 如果是4001没有绑定企业账号强制跳转绑定

View File

@@ -151,7 +151,7 @@
</view>
</view>
</view>
<view class="w-full footer" v-if="formData.storage_status == 2">
<view class="w-full footer" v-if="formData.storage_status == 2 && hasPermission('erp_manual_inbound_takeOutOfStorage')">
<view
class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
<button hover-class="none"
@@ -171,6 +171,8 @@
import { onLoad } from '@dcloudio/uni-app';
import { getManualInfo,putInStorage } from '@/addon/erp/api/purchase';
import { img } from '@/utils/common'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const formRef : any = ref(null)
const formData = reactive({

View File

@@ -69,7 +69,7 @@
</view>
<view class="foot border-0 border-t-1 border-solid border-[#ddd]">
<view class="flex justify-end p-[20rpx]">
<view><up-button v-if="item.storage_status == 2" size="mini"
<view v-if="hasPermission('erp_manual_inbound_takeOutOfStorage')"><up-button v-if="item.storage_status == 2" size="mini"
:customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx'}"
type="primary" text="立即入库" @click="handleEnteringWarehouse(item)"></up-button>
</view>
@@ -114,10 +114,11 @@
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
import { getManualList, getManualStatus, getManualInfo, putInStorage, setManualImg } from '@/addon/erp/api/purchase';
import { onShow, onPageScroll, onReachBottom, onLoad } from '@dcloudio/uni-app';
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import { uploadImage } from '@/app/api/system'
import { img } from '@/utils/common'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const { downCallback, mescrollInit, getMescroll } = useMescroll(onPageScroll, onReachBottom);
interface FileItem {
url : string;
@@ -161,8 +162,6 @@
})
// 立即入库
const handleEnteringWarehouse = async (item : any) => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_manual_inbound_takeOutOfStorage')
if (!hasPermission) return
enteringWarehouseShow.value = true
enteringWarehouseId.value = item.id
}

View File

@@ -90,7 +90,7 @@
</up-form>
<view class="w-full footer">
<view v-if="hasPermission('erp_inventory_check_add')" class="w-full footer">
<view
class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
<button hover-class="none"
@@ -112,9 +112,9 @@
import { addCheck, getCheckTypeList, getCheckProduct } from '@/addon/erp/api/inventory';
import { redirect } from '@/utils/common';
import dayjs from 'dayjs'
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const memberStore = useMemberStore()
const formRef : any = ref(null)
@@ -239,8 +239,6 @@
// 保存
const handSave = async() => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission,'erp_inventory_check_add')
if (!hasPermission) return
if (loading.value) return
if (!formData.value.warehouse_id) {
uni.showToast({ icon: 'none', title: '请选择仓库' })
@@ -264,7 +262,7 @@
addCheck(formData.value).then((res : any) => {
loading.value = false
if (res.code == 1) {
redirect({ url: '/addon/erp/pages/inventory/inventory/list' })
redirect({ url: '/addon/erp/pages/index' })
}
}).catch((err) => {
// 如果是4001没有绑定企业账号强制跳转绑定

View File

@@ -43,16 +43,14 @@
class="ml-[20rpx] text-[var(--primary-color)]">{{item.surface_num}}</text>
</view>
<view class="flex justify-start mb-[18rpx] text-[12px] text-[#6a6a6a]">
操作数量:<text
class="ml-[20rpx] text-[var(--primary-color)]">{{item.number}}</text>
操作数量:<text class="ml-[20rpx] text-[var(--primary-color)]">{{item.number}}</text>
</view>
<view class="flex justify-start mb-[18rpx] text-[12px] text-[#6a6a6a]">
{{ t('realNum') }}:<text
class="ml-[20rpx] text-[var(--primary-color)]">{{item.real_num}}</text>
</view>
<view class="flex justify-start mb-[18rpx] text-[12px] text-[#6a6a6a]">
状态:<text
class="ml-[20rpx] text-[var(--primary-color)]">{{item.status_text}}</text>
状态:<text class="ml-[20rpx] text-[var(--primary-color)]">{{item.status_text}}</text>
</view>
<view class="flex justify-start mb-[18rpx] text-[12px] text-[#6a6a6a]">
@@ -64,9 +62,21 @@
</view>
<view class="foot border-0 border-t-1 border-solid border-[#ddd]">
<view class="flex justify-end p-[20rpx]">
<view><up-button v-if="item.status == 0" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="primary" text="通过" @click="handleOperateOrder(item,'audit')"></up-button></view>
<view><up-button v-if="item.status == 0" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="error" text="拒绝" @click="handleOperateOrder(item,'notAudit')"></up-button></view>
<view><up-button v-if="item.status == 1" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="primary" text="立即入库" @click="handleOperateOrder(item,'storage')"></up-button></view>
<view v-if="hasPermission('erp_inventory_check_updateStatus')"><up-button
v-if="item.status == 0" size="mini"
:customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}"
type="primary" text="通过" @click="handleOperateOrder(item,'audit')"></up-button>
</view>
<view v-if="hasPermission('erp_inventory_check_updateStatus')"><up-button
v-if="item.status == 0" size="mini"
:customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}"
type="error" text="拒绝" @click="handleOperateOrder(item,'notAudit')"></up-button>
</view>
<view v-if="hasPermission('erp_inventory_check_putInStorage')"><up-button
v-if="item.status == 1" size="mini"
:customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}"
type="primary" text="立即入库"
@click="handleOperateOrder(item,'storage')"></up-button></view>
</view>
</view>
</view>
@@ -86,16 +96,17 @@
<up-modal :show="auditOrderShow" @confirm="auditOrderConfirm" showCancelButton @cancel="auditOrderShow = false"
:title="'提示'" :content="'确定要通过审核该数据吗?'" ref="auditOrderModal"></up-modal>
<!-- 立即入库模态框 -->
<up-modal :show="storageOrderShow" @confirm="storageOrderConfirm" showCancelButton @cancel="storageOrderShow = false"
:title="'提示'" :content="'确定要立即入库该数据吗?'" ref="storageOrderModal"></up-modal>
<up-modal :show="storageOrderShow" @confirm="storageOrderConfirm" showCancelButton
@cancel="storageOrderShow = false" :title="'提示'" :content="'确定要立即入库该数据吗?'"
ref="storageOrderModal"></up-modal>
<!-- 拒绝审核模态框 -->
<up-modal :show="notAuditOrderShow" @confirm="notAuditOrderConfirm" showCancelButton @cancel="notAuditOrderShow = false"
:title="'提示'" ref="notAuditOrderModal">
<view class="slot-content">
<view>确定要拒绝该数据吗</view>
<u-input fontSize="28rpx" v-model.trim="refuseReason" clearable
placeholderStyle="color: #888" placeholder="请输入拒绝原因" />
</view>
<up-modal :show="notAuditOrderShow" @confirm="notAuditOrderConfirm" showCancelButton
@cancel="notAuditOrderShow = false" :title="'提示'" ref="notAuditOrderModal">
<view class="slot-content">
<view>确定要拒绝该数据吗</view>
<u-input fontSize="28rpx" v-model.trim="refuseReason" clearable placeholderStyle="color: #888"
placeholder="请输入拒绝原因" />
</view>
</up-modal>
</view>
</template>
@@ -107,60 +118,54 @@
import MescrollBody from '@/components/mescroll/mescroll-body/mescroll-body.vue';
import MescrollEmpty from '@/components/mescroll/mescroll-empty/mescroll-empty.vue';
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
import { getCheckList,getCheckTypeList,updateCheckStatus,putInStorage} from '@/addon/erp/api/inventory';
import { getCheckList, getCheckTypeList, updateCheckStatus, putInStorage } from '@/addon/erp/api/inventory';
import { onShow, onPageScroll, onReachBottom, onLoad } from '@dcloudio/uni-app';
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const { downCallback, mescrollInit, getMescroll } = useMescroll(onPageScroll, onReachBottom);
const memberStore = useMemberStore()
const auditOrderItem = ref<SellReturnItem | null>(null);
const auditOrderShow = ref(false);
const notAuditOrderShow = ref(false);
const storageOrderShow = ref(false);
const refuseReason=ref("")
const refuseReason = ref("")
const statusList = ref<any[]>([]);
const searchParams = ref<any>({
status: '增加',
});
onLoad(() => {
// 获取状态
getCheckTypeList().then((res:any) => {
getCheckTypeList().then((res : any) => {
statusList.value = Object.values(res.data);
});
})
// 操作
const handleOperateOrder= async(item:any,type:string)=>{
const handleOperateOrder = async (item : any, type : string) => {
if (type === 'audit') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_inventory_check_updateStatus')
if (!hasPermission) return
auditOrderShow.value = true
} else if (type === 'notAudit') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission,'erp_inventory_check_updateStatus')
if (!hasPermission) return
notAuditOrderShow.value = true
} else if (type === 'storage') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_inventory_check_putInStorage')
if (!hasPermission) return
storageOrderShow.value = true
}
refuseReason.value=""
auditOrderItem.value=item
}
refuseReason.value = ""
auditOrderItem.value = item
}
// 确认审核
const auditOrderConfirm = () => {
if (!auditOrderItem.value) {
uni.showToast({
title: '数据不存在',
icon: 'none'
});
return;
uni.showToast({
title: '数据不存在',
icon: 'none'
});
return;
}
updateCheckStatus({ id: auditOrderItem.value.id,type: 'pass' })
.then((res:any) => {
if(res.code ===1){
updateCheckStatus({ id: auditOrderItem.value.id, type: 'pass' })
.then((res : any) => {
if (res.code === 1) {
getMescroll().resetUpScroll();
auditOrderItem.value = null;
auditOrderShow.value = false;
@@ -170,15 +175,15 @@
// 确认立即入库
const storageOrderConfirm = () => {
if (!auditOrderItem.value) {
uni.showToast({
title: '数据不存在',
icon: 'none'
});
return;
uni.showToast({
title: '数据不存在',
icon: 'none'
});
return;
}
putInStorage(auditOrderItem.value.id)
.then((res:any) => {
if(res.code ===1){
.then((res : any) => {
if (res.code === 1) {
getMescroll().resetUpScroll();
auditOrderItem.value = null;
storageOrderShow.value = false;
@@ -188,15 +193,15 @@
// 确认拒绝通过审核
const notAuditOrderConfirm = () => {
if (!auditOrderItem.value) {
uni.showToast({
title: '数据不存在',
icon: 'none'
});
return;
uni.showToast({
title: '数据不存在',
icon: 'none'
});
return;
}
updateCheckStatus({ id: auditOrderItem.value.id,type: 'reject',reject_reason:refuseReason.value })
.then((res:any) => {
if(res.code ===1){
updateCheckStatus({ id: auditOrderItem.value.id, type: 'reject', reject_reason: refuseReason.value })
.then((res : any) => {
if (res.code === 1) {
getMescroll().resetUpScroll();
auditOrderItem.value = null;
notAuditOrderShow.value = false;
@@ -205,10 +210,10 @@
}
// 分段器改变事件
const handleChange = (index : number) => {
searchParams.value.status = index===0?'增加':'减少';
searchParams.value.status = index === 0 ? '增加' : '减少';
getMescroll().resetUpScroll();
}
// 获取系统状态栏的高度
let menuButtonInfo : any = {};
// 如果是小程序,获取右上角胶囊的尺寸信息,避免导航栏右侧内容与胶囊重叠(支付宝小程序非本API尚未兼容)

View File

@@ -202,7 +202,7 @@
</view>
</view>
</up-form>
</up-form>
<view v-if="hasPermission('erp_manual_outbound_add')" class="w-full footer">
<view
class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
@@ -224,8 +224,9 @@
import { generatedCode } from '@/addon/erp/utils/common';
import {uploadImage } from '@/app/api/system'
import { redirect } from '@/utils/common';
import dayjs from 'dayjs'
import dayjs from 'dayjs'
import useMemberStore from '@/stores/member'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
interface FileItem {
url: string;
@@ -489,9 +490,7 @@
return data;
});
// 保存
const handSave = async() => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_manual_outbound_add')
// 保存
const handSave = async() => {s
if (loading.value) return
if (!formData.value.customer_id) {
@@ -526,7 +525,7 @@
}
addManual(formData.value).then((res : any) => {
loading.value = false
if (res.code == 1) {
if (res.code == 1) {
redirect({ url: '/addon/erp/pages/index' })
}
}).catch((err) => {

View File

@@ -134,7 +134,7 @@
</view>
</view>
</view>
<view class="w-full footer" v-if="formData.storage_status == 5">
<view class="w-full footer" v-if="formData.storage_status == 5 && hasPermission('erp_manual_outbound_takeOutOfStorage')">
<view
class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
<button hover-class="none"
@@ -154,6 +154,8 @@
import { onLoad } from '@dcloudio/uni-app';
import { getManualInfo ,takeOutOfStorage} from '@/addon/erp/api/sell';
import { img } from '@/utils/common'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const formRef : any = ref(null)
const formData = reactive({

View File

@@ -64,7 +64,7 @@
</view>
<view class="foot border-0 border-t-1 border-solid border-[#ddd]">
<view class="flex justify-end p-[20rpx]">
<view><up-button v-if="item.storage_status == 5" size="mini"
<view v-if="hasPermission('erp_manual_outbound_takeOutOfStorage')"><up-button v-if="item.storage_status == 5" size="mini"
:customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx'}"
type="primary" text="立即出库" @click="handleoutWarehouse(item)"></up-button></view>
<view><up-button size="mini"
@@ -107,12 +107,12 @@
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
import { getManualList, getManualInfo, takeOutOfStorage, setManualImg } from '@/addon/erp/api/sell';
import { onShow, onPageScroll, onReachBottom, onLoad } from '@dcloudio/uni-app';
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import { uploadImage } from '@/app/api/system'
import { img } from '@/utils/common'
const { downCallback, mescrollInit, getMescroll } = useMescroll(onPageScroll, onReachBottom);
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
interface FileItem {
url : string;
status ?: string;
@@ -312,8 +312,6 @@
}
// 立即出库
const handleoutWarehouse = async (item : any) => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_manual_outbound_takeOutOfStorage')
if (!hasPermission) return
outWarehouseShow.value = true
outWarehouseId.value = item.id
}

View File

@@ -100,7 +100,7 @@
:safeAreaInsetBottom="true" @close="unitSheetShow = false" @select="updateSexUnit"></u-action-sheet>
<view class="w-full footer">
<view v-if="hasPermission('erp_product_add')" class="w-full footer">
<view
class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
<button hover-class="none"
@@ -120,9 +120,9 @@
import { generatedCode } from '@/addon/erp/utils/common';
import {uploadImage } from '@/app/api/system'
import { redirect } from '@/utils/common';
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const memberStore = useMemberStore()
interface FileItem {
url: string;
@@ -273,8 +273,6 @@
// 保存
const handSave = async() => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_product_add')
if (!hasPermission) return
formRef.value.validate().then(() => {
if (loading.value) return
loading.value = true

View File

@@ -46,7 +46,7 @@
<view><up-button :text="t('info')" size="mini"
@click="redirect({ url: '/addon/erp/pages/product/product/detail',param:{id: item.id} })"></up-button>
</view>
<view><up-button type="error" @click="hanldeDelete(item.id)" :text="t('delete')"
<view v-if="hasPermission('erp_product_add')"><up-button type="error" @click="hanldeDelete(item.id)" :text="t('delete')"
size="mini"></up-button></view>
</view>
</view>
@@ -60,7 +60,7 @@
</mescroll-body>
<loading-page :loading="loading"></loading-page>
<view class="fixed bottom-4 right-4 z-2">
<view v-if="hasPermission('erp_product_delete')" class="fixed bottom-4 right-4 z-2">
<up-button @click="redirect({ url: '/addon/erp/pages/product/product/add'})" type="primary" shape="circle"
:customStyle="{borderRadius: '50%',padding: 0,width: '50px',height: '50px'}">
<u-icon size="30" color="#fff" name="plus-circle-fill"></u-icon>
@@ -80,7 +80,8 @@
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
import { getProductList, deleteProduct } from '@/addon/erp/api/product';
import { onShow, onPageScroll, onReachBottom } from '@dcloudio/uni-app';
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const { downCallback, mescrollInit, getMescroll } = useMescroll(onPageScroll, onReachBottom);

View File

@@ -15,7 +15,7 @@
</u-form-item>
</view>
</u-form>
<view class="w-full footer">
<view v-if="hasPermission('erp_product_type_add')" class="w-full footer">
<view class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
<button hover-class="none" class="!bg-[var(--primary-color)] text-[#fff] h-[80rpx] leading-[80rpx] rounded-[100rpx] text-[26rpx] font-500"
@click="handSave" :disabled="loading" :class="{'opacity-50': loading}">{{t('save')}}</button>
@@ -35,9 +35,9 @@
import { onLoad } from '@dcloudio/uni-app';
import { getProductTypeSelect, getProductTypeInfo, addProductType, editProductType } from '@/addon/erp/api/product';
import { redirect } from '@/utils/common';
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const memberStore = useMemberStore()
const formRef: any = ref(null)
@@ -107,8 +107,6 @@
// 保存
const handSave = async() => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_product_type_add')
if (!hasPermission) return
formRef.value.validate().then(() => {
if (loading.value) return
loading.value = true

View File

@@ -22,7 +22,7 @@
</mescroll-body>
<loading-page :loading="loading"></loading-page>
<view class="fixed bottom-4 right-4 z-2">
<view v-if="hasPermission('erp_product_type_add')" class="fixed bottom-4 right-4 z-2">
<up-button @click="redirect({ url: '/addon/erp/pages/product/type/add'})" type="primary" shape="circle"
:customStyle="{borderRadius: '50%',padding: 0,width: '50px',height: '50px'}">
<u-icon size="30" color="#fff" name="plus-circle-fill"></u-icon>
@@ -41,12 +41,19 @@
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
import { getProductTypeList, deleteProductType } from '@/addon/erp/api/product';
import { onShow, onPageScroll, onReachBottom } from '@dcloudio/uni-app';
import usePermission from '@/utils/usePermission'
const { downCallback, mescrollInit, getMescroll } = useMescroll(onPageScroll, onReachBottom);
const { hasPermission } = usePermission()
const show = ref(false);
interface BtnOption {
text: string;
style: {
backgroundColor: string;
};
}
// 获取系统状态栏的高度
let menuButtonInfo : any = {};
// 如果是小程序,获取右上角胶囊的尺寸信息,避免导航栏右侧内容与胶囊重叠(支付宝小程序非本API尚未兼容)
@@ -95,18 +102,28 @@
})
}
const btnOptions = ref([{
text: t('edit'),
style: {
backgroundColor: '#3c9cff'
const btnOptions = ref<BtnOption[]>([]);
const initBtn = () => {
btnOptions.value = []
const hasEdit = hasPermission.value('erp_product_type_edit')
const hasDel = hasPermission.value('erp_product_type_delete')
if (hasEdit) {
btnOptions.value.push({
text: t('edit'),
style: {
backgroundColor: '#3c9cff'
}
})
}
}, {
text: t('delete'),
style: {
backgroundColor: '#f56c6c'
if (hasDel) {
btnOptions.value.push({
text: t('delete'),
style: {
backgroundColor: '#f56c6c'
}
})
}
}])
}
const swipeActionRefs = ref<any[]>([]);
const setSwipeActionRef = (index : number) => (el : any[] | null) => {
@@ -146,6 +163,7 @@
}
}).catch(() => { });
}
initBtn()
</script>
<style>

View File

@@ -8,7 +8,7 @@
</u-form-item>
</view>
</u-form>
<view class="w-full footer">
<view v-if="hasPermission('erp_product_unit_add')" class="w-full footer">
<view class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
<button hover-class="none" class="!bg-[var(--primary-color)] text-[#fff] h-[80rpx] leading-[80rpx] rounded-[100rpx] text-[26rpx] font-500"
@click="handSave" :disabled="loading" :class="{'opacity-50': loading}">{{t('save')}}</button>
@@ -28,9 +28,9 @@
import { onLoad } from '@dcloudio/uni-app';
import { getProductUnitInfo, addProductUnit, editProductUnit } from '@/addon/erp/api/product';
import { redirect } from '@/utils/common';
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const memberStore = useMemberStore()
const formRef: any = ref(null)
@@ -71,8 +71,6 @@
// 保存
const handSave = async() => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_product_unit_add')
if (!hasPermission) return
formRef.value.validate().then(() => {
if (loading.value) return
loading.value = true

View File

@@ -22,7 +22,7 @@
</mescroll-body>
<loading-page :loading="loading"></loading-page>
<view class="fixed bottom-4 right-4 z-2">
<view v-if="hasPermission('erp_product_unit_add')" class="fixed bottom-4 right-4 z-2">
<up-button @click="redirect({ url: '/addon/erp/pages/product/unit/add'})" type="primary" shape="circle"
:customStyle="{borderRadius: '50%',padding: 0,width: '50px',height: '50px'}">
<u-icon size="30" color="#fff" name="plus-circle-fill"></u-icon>
@@ -41,12 +41,17 @@
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
import { getProductUnitList, deleteProductUnit } from '@/addon/erp/api/product';
import { onShow, onPageScroll, onReachBottom } from '@dcloudio/uni-app';
import usePermission from '@/utils/usePermission'
const { downCallback, mescrollInit, getMescroll } = useMescroll(onPageScroll, onReachBottom);
const { hasPermission } = usePermission()
const show = ref(false);
interface BtnOption {
text: string;
style: {
backgroundColor: string;
};
}
// 获取系统状态栏的高度
let menuButtonInfo : any = {};
// 如果是小程序,获取右上角胶囊的尺寸信息,避免导航栏右侧内容与胶囊重叠(支付宝小程序非本API尚未兼容)
@@ -95,17 +100,28 @@
})
}
const btnOptions = ref([{
text: t('edit'),
style: {
backgroundColor: '#3c9cff'
const btnOptions = ref<BtnOption[]>([]);
const initBtn = () => {
btnOptions.value = []
const hasEdit = hasPermission.value('erp_product_unit_edit')
const hasDel = hasPermission.value('erp_product_unit_delete')
if (hasEdit) {
btnOptions.value.push({
text: t('edit'),
style: {
backgroundColor: '#3c9cff'
}
})
}
}, {
text: t('delete'),
style: {
backgroundColor: '#f56c6c'
if (hasDel) {
btnOptions.value.push({
text: t('delete'),
style: {
backgroundColor: '#f56c6c'
}
})
}
}])
}
const swipeActionRefs = ref<any[]>([]);
const setSwipeActionRef = (index : number) => (el : any[] | null) => {
@@ -145,6 +161,7 @@
}
}).catch(() => { });
}
initBtn()
</script>
<style>

View File

@@ -149,7 +149,7 @@
</up-form>
<view class="w-full footer">
<view v-if="hasPermission('erp_outbound_return_add')" class="w-full footer">
<view
class="py-[var(--top-m)] px-[var(--sidebar-m)] footer w-full fixed bottom-0 left-0 right-0 box-border">
<button hover-class="none"
@@ -171,9 +171,10 @@
import {uploadImage } from '@/app/api/system'
import { redirect } from '@/utils/common';
import dayjs from 'dayjs'
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import { img } from '@/utils/common'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
interface FileItem {
url: string;
status?: string;
@@ -386,10 +387,7 @@
// 保存
const handSave = async() => {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_outbound_return_add')
if (!hasPermission) return
if (loading.value) return
if (!formData.value.supplier_id) {
uni.showToast({ icon: 'none', title: t('supplierIdPlaceholder') })
return false;
@@ -416,7 +414,7 @@
addReturn(formData.value).then((res : any) => {
loading.value = false
if (res.code == 1) {
redirect({ url: '/addon/erp/pages/purchase/return/list' })
redirect({ url: '/addon/erp/pages/index' })
}
}).catch((err) => {
// 如果是4001没有绑定企业账号强制跳转绑定

View File

@@ -56,11 +56,11 @@
</view>
<view class="foot border-0 border-t-1 border-solid border-[#ddd]">
<view class="flex justify-end p-[20rpx]">
<view><up-button v-if="item.status == 0" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="primary" text="通过" @click="handleOperateOrder(item,'audit')"></up-button></view>
<view><up-button v-if="item.status == 0" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="error" text="拒绝" @click="handleOperateOrder(item,'notAudit')"></up-button></view>
<view><up-button v-if="item.status == 1" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="primary" text="确认退货" @click="handleOperateOrder(item,'storage')"></up-button></view>
<view><up-button v-if="item.status == 1" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="error" text="拒绝退货" @click="handleOperateOrder(item,'notStorage')"></up-button></view>
<view><up-button v-if="item.status == 1" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="error" text="撤销审核" @click="handleOperateOrder(item,'backout')"></up-button></view>
<view v-if="hasPermission('erp_manual_return_updateStatus')" ><up-button v-if="item.status == 0" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="primary" text="通过" @click="handleOperateOrder(item,'audit')"></up-button></view>
<view v-if="hasPermission('erp_manual_return_updateStatus')" ><up-button v-if="item.status == 0" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="error" text="拒绝" @click="handleOperateOrder(item,'notAudit')"></up-button></view>
<view v-if="hasPermission('erp_manual_return_confirm')" ><up-button v-if="item.status == 1" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="primary" text="确认退货" @click="handleOperateOrder(item,'storage')"></up-button></view>
<view v-if="hasPermission('erp_manual_return_confirm')" ><up-button v-if="item.status == 1" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="error" text="拒绝退货" @click="handleOperateOrder(item,'notStorage')"></up-button></view>
<view v-if="hasPermission('erp_manual_return_anti')" ><up-button v-if="item.status == 1" size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'20rpx',fontSize:'20rpx'}" type="error" text="撤销审核" @click="handleOperateOrder(item,'backout')"></up-button></view>
<view><up-button size="mini" :customStyle="{padding: 0,width: '130rpx',height: '50rpx',marginRight:'10rpx'}" type="success" :text="'详情'" @click="redirect({ url: '/addon/erp/pages/purchase/return/detail',param:{id: item.id} })"></up-button></view>
</view>
</view>
@@ -98,7 +98,7 @@
placeholderStyle="color: #888" placeholder="请输入拒绝原因" />
</view>
</up-modal>
<view class="fixed bottom-4 right-4 z-2">
<view v-if="hasPermission('erp_outbound_return_add')" class="fixed bottom-4 right-4 z-2">
<up-button @click="redirect({ url: '/addon/erp/pages/purchase/return/add'})" type="primary" shape="circle"
:customStyle="{borderRadius: '50%',padding: 0,width: '50px',height: '50px'}">
<u-icon size="30" color="#fff" name="plus-circle-fill"></u-icon>
@@ -117,9 +117,9 @@
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
import { getReturnList, getReturnStatus,updateReturnStatus,confirmReturned,antiReturnStatus} from '@/addon/erp/api/purchase';
import { onShow, onPageScroll, onReachBottom, onLoad } from '@dcloudio/uni-app';
import { checkBtnPermission } from '@/utils/auth';
import useMemberStore from '@/stores/member'
import usePermission from '@/utils/usePermission'
const { hasPermission } = usePermission()
const { downCallback, mescrollInit, getMescroll } = useMescroll(onPageScroll, onReachBottom);
interface RetireItem {
id: number;
@@ -163,24 +163,14 @@
// 操作
const handleOperateOrder= async(item:any,type:string)=>{
if (type === 'audit') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_manual_return_updateStatus')
if (!hasPermission) return
auditOrderShow.value = true
} else if (type === 'notAudit') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_manual_return_updateStatus')
if (!hasPermission) return
notAuditOrderShow.value = true
} else if (type === 'storage') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_manual_return_confirm')
if (!hasPermission) return
storageOrderShow.value = true
} else if (type === 'notStorage') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_manual_return_confirm')
if (!hasPermission) return
notStorageOrderShow.value = true
} else if (type === 'backout') {
const hasPermission = await checkBtnPermission(memberStore.btnPermission, 'erp_manual_return_anti')
if (!hasPermission) return
backoutOrderShow.value = true
}
refuseReason.value=""

View File

@@ -9,7 +9,7 @@ interface Member {
token: string | null
info: any | null
levelList: Array<any> | null
btnPermission: Array<any> | null
btnPermission: Array<any> | []
}
const useMemberStore = defineStore('member', {
@@ -18,13 +18,14 @@ const useMemberStore = defineStore('member', {
token: uni.getStorageSync(import.meta.env.VITE_REQUEST_STORAGE_TOKEN_KEY),
info: null,
levelList: null,
btnPermission:null
btnPermission: uni.getStorageSync('wap_member_btn_permission') || []
}
},
actions: {
setToken(token: string, callback: any = null) {
this.token = token
setToken(token)
this.getUserBtnRole()
this.getMemberInfo(callback)
},
getMemberInfo(callback: any = null) {
@@ -75,12 +76,13 @@ const useMemberStore = defineStore('member', {
isRedirect && redirect({ url: '/app/pages/index/index', mode: 'switchTab' })
})
},
// 获取用户按钮权限
getUserBtnRole() {
getUserRole().then((res:any) => {
this.btnPermission = res.data;
this.btnPermission = Object.values(res.data)
uni.setStorageSync('wap_member_btn_permission', this.btnPermission)
}).catch((err) => {
this.btnPermission=null
this.btnPermission = []
uni.removeStorageSync('wap_member_btn_permission');
// 如果是4001没有绑定企业账号强制跳转绑定
if (err.code == 4001) {

View File

@@ -15,38 +15,6 @@ export function checkNeedLogin(route : AnyObject) {
}, 100)
}
}
/**
* 功能操作权限检查
* @param {string | Array} requiredPermissions 需要检查的权限列表或单个权限
* @param {boolean} [hasMsg=true] 是否显示提示信息
* @param {string} [msg='您没有权限执行此操作'] 提示信息
* @returns {Promise<boolean>}
*/
export async function checkBtnPermission(permissions : any, requiredPermissions : any, hasMsg : boolean = true, msg : any = '你没有权限执行此操作') : Promise<boolean> {
if (!requiredPermissions) {
uni.showToast({ title: '需要检查的权限列表或单个权限不能为空', icon: 'none' })
return false
}
if (!Array.isArray(requiredPermissions)) {
requiredPermissions = [requiredPermissions]
}
if (!Array.isArray(permissions)) {
uni.showToast({ title: '权限错误', icon: 'none' })
return false
}
if (permissions.length === 0) {
return true
}
// 假设 permissions 是一个包含用户所有权限的数组
if (requiredPermissions.every((permission : any) => permissions.includes(`${permission}`))) {
// 有权限,继续执行后续逻辑
return true
} else {
// 没有权限,显示提示信息并终止执行
if (hasMsg) uni.showToast({ title: msg, icon: 'none' })
return false
}
}
// 检查并请求授权
export function checkAndRequestAuth() {
// scope.camera 摄像头

View File

@@ -0,0 +1,20 @@
import useMemberStore from '@/stores/member'
import { storeToRefs } from 'pinia'
import { computed } from 'vue'
export default function usePermission() {
const { btnPermission } = storeToRefs(useMemberStore())
const checkPermission = (code: string | string[]) => {
if (!btnPermission.value?.length) return false
return Array.isArray(code)
? code.some(c => btnPermission.value?.includes(c))
: btnPermission.value.includes(code)
}
const hasPermission = computed(() => (code: string | string[]) => {
return checkPermission(code)
})
return {
checkPermission,
hasPermission
}
}