mirror of
https://gitee.com/krxd/shuyuan.git
synced 2026-04-08 13:25:54 +08:00
refactor权限控制逻辑
- 移除全局方法getUserBtnRole - 使用hasPermission函数替代checkBtnPermission - 优化权限判断逻辑,减少冗余代码 - 统一权限控制的实现方式
This commit is contained in:
@@ -96,7 +96,6 @@
|
||||
// 判断是否已登录
|
||||
if (getToken()) {
|
||||
const memberStore: any = useMemberStore()
|
||||
memberStore.getUserBtnRole()
|
||||
await memberStore.setToken(getToken(), () => {
|
||||
if (!uni.getStorageSync('openid')) {
|
||||
const memberInfo = useMemberStore().info
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
// 获取系统状态栏的高度
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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 = ""
|
||||
|
||||
@@ -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,没有绑定企业账号,强制跳转绑定
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,没有绑定企业账号,强制跳转绑定
|
||||
|
||||
@@ -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,15 +96,16 @@
|
||||
<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">
|
||||
<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="请输入拒绝原因" />
|
||||
<u-input fontSize="28rpx" v-model.trim="refuseReason" clearable placeholderStyle="color: #888"
|
||||
placeholder="请输入拒绝原因" />
|
||||
</view>
|
||||
</up-modal>
|
||||
</view>
|
||||
@@ -109,9 +120,9 @@
|
||||
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
|
||||
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()
|
||||
@@ -134,16 +145,10 @@
|
||||
// 操作
|
||||
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 = ""
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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([{
|
||||
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'
|
||||
}
|
||||
}, {
|
||||
})
|
||||
}
|
||||
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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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([{
|
||||
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'
|
||||
}
|
||||
}, {
|
||||
})
|
||||
}
|
||||
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>
|
||||
|
||||
@@ -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,没有绑定企业账号,强制跳转绑定
|
||||
|
||||
@@ -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=""
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 摄像头
|
||||
|
||||
20
src/utils/usePermission.ts
Normal file
20
src/utils/usePermission.ts
Normal 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user