Files
sgxt_web/src/views/backOfficeSystem/HumanIntelligence/infoCollection/useInfoCollectionPermission.js
2026-04-28 11:26:26 +08:00

262 lines
7.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { reactive, computed } from 'vue'
import { getItem } from '@//utils/storage.js'
/** 流程状态常量 */
export const FlowStatus = {
SUBMIT: '01', // 提交
REPORT_COUNTY: '02', // 上报县局
REPORT_CITY: '03', // 上报市局
ADOPT: '04', // 采纳
ROLLBACK: '05', // 退回
TAG: '06', // 打标签
TRANSFER_SYNTHESIS: '07', // 转合成
TRANSFER_CLUE: '08', // 转线索
TRANSFER_MERCHANT: '09', // 转会商
REPORT_PROVINCE: '10' // 上报区厅
}
/** 按钮权限配置 */
const BUTTON_PERMISSIONS = {
'市情指领导': ['肯定', '采纳', '回退', '分组', '转线索', '转合成', '转会商', '打标签', '修改', '详情', '关注部门'],
'市情指挥人员': ['采纳', '回退', '分组', '转线索', '转合成', '转会商', '打标签', '修改', '详情', '关注部门', '送审'],
'县情指人员': ['上报', '回退', '修改', '详情', '送审'],
'部门': ['上报', '新增', '修改', '续报', '详情']
}
/** 部门级别映射 */
const DEPT_LEVEL_MAP = {
'2': '01', // 市局
'3': '02', // 县局
}
/** 角色代码映射 */
const ROLE_CODE_MAP = {
'JS_666666': '市情指领导',
'JS_777777': '市情指挥人员',
'JS_888888': '县情指人员',
}
/** 采纳后的状态排除回退05 */
const POST_ADOPT_STATUS = [FlowStatus.ADOPT, FlowStatus.TAG, FlowStatus.TRANSFER_SYNTHESIS, FlowStatus.TRANSFER_CLUE, FlowStatus.TRANSFER_MERCHANT, FlowStatus.REPORT_PROVINCE]
/** 按钮可操作的状态配置 */
const BTN_STATUS_RULES = {
// 转合成/转会商 - 需要已采纳
synthesis: [FlowStatus.ADOPT, FlowStatus.TAG, FlowStatus.TRANSFER_SYNTHESIS, FlowStatus.TRANSFER_CLUE, FlowStatus.TRANSFER_MERCHANT],
// 采纳 - 需要上报状态
adopt: [FlowStatus.REPORT_CITY, FlowStatus.ROLLBACK],
// 回退 - 需要上报状态
rollback: [FlowStatus.ADOPT, FlowStatus.ROLLBACK, FlowStatus.TAG, FlowStatus.TRANSFER_SYNTHESIS, FlowStatus.TRANSFER_CLUE, FlowStatus.TRANSFER_MERCHANT],
// 分组 - 需要已采纳或已转
group: [FlowStatus.ADOPT, FlowStatus.TRANSFER_CLUE, FlowStatus.REPORT_PROVINCE],
}
/**
* 情报信息采集权限管理 Composable
*/
export function useInfoCollectionPermission() {
/** 权限状态 */
const state = reactive({
deptBizType: '',
deptLevel: '',
roleCode: false,
depBool: false
})
/** 当前角色 */
const currentRole = computed(() => getRole())
/** 是否为市局 */
const isCityLevel = computed(() => state.deptLevel === '01')
/** 是否为县局 */
const isCountyLevel = computed(() => state.deptLevel === '02')
/** 是否有市情指操作权限JS_666666 或 JS_777777 */
const isShiQzRole = computed(() => {
const roleList = getItem('roleList') || []
return roleList.some(item => item.roleCode === 'JS_666666' || item.roleCode === 'JS_777777')
})
/** 获取当前角色 */
function getRole() {
const roleList = getItem('roleList') || []
for (const role of roleList) {
if (ROLE_CODE_MAP[role.roleCode]) {
return ROLE_CODE_MAP[role.roleCode]
}
}
return '部门'
}
/** 初始化权限 */
function initPermission() {
const deptInfo = getItem('deptId')?.[0]
if (!deptInfo) return
const { deptBizType, deptLevel } = deptInfo
const levelCode = deptLevel?.[0]
// 计算部门级别
state.deptLevel = DEPT_LEVEL_MAP[levelCode] || levelCode
state.deptBizType = deptBizType
// 是否为市情指领导
state.roleCode = getItem('roleList')?.some(item => item.roleCode === 'JS_666666') ?? false
// 是否有市情指操作权限
state.depBool = deptBizType === '23' && state.deptLevel === '01'
}
/**
* 判断按钮是否显示
* @param {string} btnName 按钮名称
* @param {object} row 行数据(可选)
* @returns {boolean}
*/
function canShowBtn(btnName, row = {}) {
const role = currentRole.value
const permissions = BUTTON_PERMISSIONS[role] || []
if (!permissions.includes(btnName)) return false
// 部门角色特殊逻辑
if (role === '部门') {
const lczt = row?.lczt
if (btnName === '续报') return lczt !== FlowStatus.SUBMIT
if (btnName === '修改') return lczt === FlowStatus.SUBMIT
}
return true
}
/**
* 判断按钮是否禁用
* @param {string} btnType 按钮类型
* @param {string} lczt 流程状态
* @returns {boolean}
*/
function isBtnDisabled(btnType, lczt) {
const allowedStatus = BTN_STATUS_RULES[btnType]
return !allowedStatus?.includes(lczt)
}
/**
* 判断单个按钮是否禁用(兼容旧逻辑)
* @param {string} val 类型代码
* @param {string} zt 流程状态
* @returns {boolean}
*/
function butcontroll(val, zt) {
switch (val) {
case '01': // 转合成/转会商
return !BTN_STATUS_RULES.synthesis.includes(zt)
case '02': // 采纳
return !BTN_STATUS_RULES.adopt.includes(zt)
case '03': // 提交
return ![FlowStatus.REPORT_COUNTY, FlowStatus.REPORT_CITY, FlowStatus.ADOPT].includes(zt)
case '04': // 采纳 - 只有01,02,03状态才不禁用
return !['01', '02', '03'].includes(zt)
default:
return false
}
}
/**
* 判断送审按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canSubmitAudit(row) {
return isCityLevel.value && row.lczt === FlowStatus.ADOPT && row.sldshzt === '00'
}
/**
* 判断上报按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canReport(row) {
if (isCityLevel.value) {
return row.lczt === FlowStatus.SUBMIT
}
return row.lczt === FlowStatus.REPORT_COUNTY
}
/**
* 判断是否为采纳后状态(排除回退)
* @param {string} lczt 流程状态
* @returns {boolean}
*/
function isPostAdopt(lczt) {
return POST_ADOPT_STATUS.includes(lczt)
}
/**
* 判断打标签按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canTag(row) {
return isPostAdopt(row.lczt) && isCityLevel.value
}
/**
* 判断关注部门按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canFollowDept(row) {
return row.qbjb === '01' && isPostAdopt(row.lczt)
}
/**
* 判断转线索按钮状态 - 采纳后可转,转过则不再显示
* @param {object} row 行数据
* @returns {boolean}
*/
function canTransferClue(row) {
// 只允许从采纳状态直接转线索,转过则不再显示
return row.lczt === FlowStatus.ADOPT
}
/**
* 判断分组按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canGroup(row) {
return isPostAdopt(row.lczt)
}
/**
* 判断续报按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canFollowUpReport(row) {
return row.lczt === FlowStatus.ADOPT
}
return {
state,
currentRole,
isCityLevel,
isCountyLevel,
isShiQzRole,
initPermission,
canShowBtn,
isBtnDisabled,
butcontroll,
canSubmitAudit,
canReport,
canTag,
canFollowDept,
canTransferClue,
canGroup,
canFollowUpReport,
isPostAdopt,
}
}