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, } }