Files
sgxt_web/src/views/backOfficeSystem/HumanIntelligence/infoCollection/useInfoCollectionPermission.js

262 lines
7.2 KiB
JavaScript
Raw Normal View History

2026-04-28 11:26:26 +08:00
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,
}
}