user.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. import permision from "@/js_sdk/wa-permission/permission.js";
  2. import {
  3. getMacAddress,
  4. updateFieldPermissions,
  5. updateButtonPermissions,
  6. } from "../../utils/util";
  7. import {
  8. systemList
  9. } from "@/utils/commonDicts.js";
  10. export default {
  11. namespaced: true,
  12. state: {
  13. userInfo: {},
  14. token: "",
  15. belongSystem: null, // 子系统实体类
  16. isDS: false, // 是否处于脱敏状态
  17. path: "", // 请求的前缀
  18. system: {}, // 当前选择的系统
  19. abcModel: false,
  20. spdbModel: false,
  21. ccbModel: false,
  22. dfklModel: false,
  23. publicModel: false,
  24. cibModel: false,
  25. icbcHModel: false,
  26. tjxtModel: false,
  27. homeOff: false, // 居家
  28. isOut: false, // 外访
  29. uuid: null, // 设备id
  30. permissions: [], // 权限列表
  31. netConfig: {
  32. // http://59.42.9.166:9520/proxy
  33. // http://10.0.7.100:9500
  34. ip: "https://crm.nanjingshiyu.com/prod-api/", // ip
  35. // ip: "https://crmtest.nanjingshiyu.com/prod-api", // 测试环境ip
  36. // ip : "/api", // 测试环境ip
  37. // ip : "http://47.113.184.101", // 测试环境ip
  38. // ip: "http://172.16.7.200", // ip
  39. // port: "9500", // 端口
  40. isCallOff: "2", // 开关
  41. folder: "", // 文件夹
  42. webRtcIp: "", // 呼叫中心的ip
  43. webRtcPort: "", // 呼叫中心的端口s
  44. },
  45. systemList: [],
  46. redirectUrl: null,
  47. availableRoles: [], // 可用的角色列表
  48. currentRoleIndex: 0, // 当前选中的角色索引
  49. showRoleSwitch: false, // 是否显示切换权限按钮
  50. warehouseFieldPermissions: [], // 仓库字段权限 [{ fieldName, read, edit }, ...],登录后按当前用户角色合并
  51. warehouseButtonPermissions: [], // 仓库按钮权限
  52. },
  53. mutations: {
  54. SET_REDIRECTURL(state, data) {
  55. state.redirectUrl = data;
  56. },
  57. SET_USER_ONLINE_STATUS: (state, data) => {
  58. state.userInfo.onlineStatus = data;
  59. },
  60. SET_USERINFO: (state, data) => {
  61. state.userInfo = data;
  62. const roles = data.roles || [];
  63. const validRoles = [];
  64. const hasAdminRole = roles.some(role => role.roleKey && role.roleKey.includes('admin' || 'ADMIN'));
  65. const hasCrmRole = roles.some(role => role.roleKey && role.roleKey.includes('CRM'));
  66. const hasWarehouser = roles.some(role => role.roleKey === 'WAREHOUSER');
  67. const hasSalesman = roles.some(role => role.roleKey === 'SALESMAN');
  68. if(hasAdminRole){//管理员
  69. validRoles.push('admin');
  70. state.showRoleSwitch = true;
  71. }else if( (hasCrmRole && hasWarehouser) || (hasCrmRole && hasSalesman)){//crm+仓库、crm+销售
  72. validRoles.push('CRM','WAREandSALE');
  73. state.showRoleSwitch = true;
  74. }else if(hasWarehouser && hasSalesman){
  75. validRoles.push('WAREandSALE');
  76. state.showRoleSwitch = false;
  77. }else if(hasCrmRole){//只有crm
  78. validRoles.push('CRM');
  79. state.showRoleSwitch = false;
  80. }else if(hasWarehouser || hasSalesman){//只有仓库或销售
  81. validRoles.push('WAREandSALE');
  82. state.showRoleSwitch = false;
  83. }
  84. state.availableRoles = validRoles;
  85. state.currentRoleIndex = validRoles.indexOf(uni.getStorageSync('activeTab') || '') || 0;
  86. setTimeout(() => {
  87. const allIndices = [0, 1, 2, 3, 4, 5, 6];
  88. allIndices.forEach(index => {
  89. uni.setTabBarItem({ index, visible: false });
  90. });
  91. const currentRole = validRoles[0] || '';
  92. const activeTab = uni.getStorageSync('activeTab') || currentRole;
  93. switch (activeTab) {
  94. case 'admin':
  95. // 展示首页、线索公海、销售线索、接单中心、我的
  96. uni.setTabBarItem({ index: 0, visible: true }); // 首页
  97. uni.setTabBarItem({ index: 1, visible: true }); // 线索公海
  98. uni.setTabBarItem({ index: 5, visible: true }); // 销售线索
  99. uni.setTabBarItem({ index: 6, visible: true }); // 接单中心
  100. break;
  101. case 'WAREandSALE':
  102. // 展示仓库、核价中心、询价中心、我的
  103. uni.setTabBarItem({ index: 2, visible: true }); // 仓库
  104. uni.setTabBarItem({ index: 3, visible: true }); // 询价中心
  105. uni.setTabBarItem({ index: 4, visible: true }); // 核价中心
  106. break;
  107. case 'CRM':
  108. // 展示首页、线索公海、销售线索、接单中心、我的
  109. uni.setTabBarItem({ index: 0, visible: true }); // 首页
  110. uni.setTabBarItem({ index: 1, visible: true }); // 线索公海
  111. uni.setTabBarItem({ index: 5, visible: true }); // 销售线索
  112. uni.setTabBarItem({ index: 6, visible: true }); // 接单中心
  113. break;
  114. }
  115. uni.setTabBarItem({ index: 7, visible: true }); // 我的
  116. }, 100);
  117. },
  118. SET_TOKEN: (state, data) => {
  119. state.token = data;
  120. },
  121. SET_NETCONFIG: (state, data) => {
  122. state.netConfig = data;
  123. },
  124. SET_BELONGSYSTEM: (state, data) => {
  125. const system = state.userInfo.subsystemList.find(item => (item.systemCode == data.code));
  126. if (system) {
  127. state.belongSystem = system;
  128. data.callback && data.callback(true);
  129. } else {
  130. data.callback && data.callback(false);
  131. }
  132. },
  133. SET_ISDS: (state, value) => {
  134. state.isDS = value
  135. },
  136. SET_HOMEOFF: (state, value) => {
  137. state.homeOff = value
  138. },
  139. SET_ISOUT: (state, value) => {
  140. state.isOut = value
  141. },
  142. SET_SYSTEM(state, data) {
  143. state.path = data.path;
  144. state.system = data;
  145. state.abcModel = data.text == "农行催收";
  146. state.spdbModel = data.text == "浦发催收";
  147. state.ccbModel = data.text == "建行催收";
  148. state.publicModel = data.text == "专业催收";
  149. state.dfklModel = data.text == "商账催收";
  150. state.cibModel = data.text == "兴业催收";
  151. state.icbcHModel = data.text == "工行催收";
  152. state.tjxtModel = data.text == "调催系统";
  153. },
  154. SET_UUID(state, data) {
  155. state.uuid = data;
  156. },
  157. SET_SYSTEM_LIST(state, data) {
  158. state.systemList = data;
  159. },
  160. // 权限相关mutations
  161. SET_AVAILABLE_ROLES(state, roles) {
  162. state.availableRoles = roles;
  163. },
  164. SET_CURRENT_ROLE_INDEX(state, index) {
  165. state.currentRoleIndex = index;
  166. },
  167. SET_SHOW_ROLE_SWITCH(state, show) {
  168. state.showRoleSwitch = show;
  169. },
  170. SET_PERMISSIONS: (state, permissions) => {
  171. state.permissions = permissions || [];
  172. },
  173. SET_WAREHOUSE_FIELD_PERMISSIONS: (state, list) => {
  174. state.warehouseFieldPermissions = Array.isArray(list) ? list : [];
  175. },
  176. SET_WAREHOUSE_BUTTON_PERMISSIONS: (state, list) => {
  177. state.warehouseButtonPermissions = Array.isArray(list) ? list : [];
  178. },
  179. SWITCH_ROLE({}, role) {
  180. setTimeout(() => {
  181. const allIndices = [0, 1, 2, 3, 4, 5, 6];
  182. allIndices.forEach(index => {
  183. uni.setTabBarItem({ index, visible: false });
  184. });
  185. uni.setStorageSync('activeTab', role.value || '');
  186. switch (role.value) {
  187. case 'WAREandSALE':
  188. // 展示仓库、核价中心、询价中心、我的
  189. uni.setTabBarItem({ index: 2, visible: true }); // 仓库
  190. uni.setTabBarItem({ index: 3, visible: true }); // 询价中心
  191. uni.setTabBarItem({ index: 4, visible: true }); // 核价中心
  192. break;
  193. case 'CRM':
  194. // 展示首页、线索公海、销售线索、接单中心、我的
  195. uni.setTabBarItem({ index: 0, visible: true }); // 首页
  196. uni.setTabBarItem({ index: 1, visible: true }); // 线索公海
  197. uni.setTabBarItem({ index: 5, visible: true }); // 销售线索
  198. uni.setTabBarItem({ index: 6, visible: true }); // 接单中心
  199. break;
  200. }
  201. uni.setTabBarItem({ index: 7, visible: true }); // 我的
  202. }, 100);
  203. }
  204. },
  205. actions: {
  206. setSystemlist({
  207. commit,
  208. state
  209. }, systemCodeList) {
  210. state.systemList = systemList.filter(v => systemCodeList.includes(v.value));
  211. },
  212. getUserInfo(store) {
  213. const {
  214. commit,
  215. state,
  216. dispatch
  217. } = store;
  218. return new Promise((resolve, reject) => {
  219. uni.$u.api.getInfo().then(res => {
  220. commit("SET_USERINFO", res.user);
  221. // 保存权限列表
  222. if (res.permissions && res.permissions.length > 0) {
  223. commit("SET_PERMISSIONS", res.permissions);
  224. } else {
  225. commit("SET_PERMISSIONS", []);
  226. }
  227. updateFieldPermissions();
  228. updateButtonPermissions();
  229. commit("SET_BELONGSYSTEM", {
  230. code: state.system.value,
  231. callback: (flag) => {
  232. resolve(res.user);
  233. }
  234. });
  235. });
  236. })
  237. },
  238. login({
  239. commit,
  240. dispatch,
  241. state
  242. }, form) {
  243. return new Promise((resolve, reject) => {
  244. uni.$u.api.login(form).then((loginRes) => {
  245. const token = loginRes.data.access_token;
  246. commit("SET_TOKEN", token);
  247. dispatch("getUserInfo").then((userInfo) => {
  248. const { userId } = userInfo;
  249. resolve(userId);
  250. }).catch(() => {
  251. commit("SET_TOKEN", "");
  252. commit("SET_USERINFO", {});
  253. reject();
  254. })
  255. })
  256. })
  257. },
  258. logout({
  259. commit,
  260. dispatch
  261. }) {
  262. return uni.$u.api.logout().then(() => {
  263. // 停止电话监听
  264. dispatch("call/stopPhoneListener", null, { root: true }).catch(error => {
  265. console.error('退出登录时停止电话监听失败:', error);
  266. });
  267. commit("SET_TOKEN", "");
  268. commit("SET_USERINFO", {});
  269. commit("SET_PERMISSIONS", []); // 清空权限列表
  270. commit("SET_WAREHOUSE_FIELD_PERMISSIONS", []); // 清空仓库字段权限
  271. dispatch("app/logoutCloseData", null, {
  272. root: true
  273. });
  274. Promise.resolve();
  275. }).catch(() => {
  276. Promise.reject();
  277. })
  278. },
  279. }
  280. }
  281. export function setupTabBar(userInfo, availableRoles, currentRoleIndex) {
  282. // 隐藏所有tabbar项,然后根据当前角色显示对应的项
  283. // 下标index从0开始
  284. const allIndices = [0, 1, 2, 3, 4, 5, 6];
  285. allIndices.forEach(index => {
  286. uni.setTabBarItem({ index, visible: false });
  287. });
  288. // 获取当前角色
  289. const currentRole = availableRoles[currentRoleIndex] || '';
  290. const activeTab = uni.getStorageSync('activeTab') || currentRole;
  291. // 根据当前角色显示对应的tabbar
  292. switch (activeTab) {
  293. case 'WAREandSALE':
  294. // 展示仓库、核价中心、询价中心、我的
  295. uni.setTabBarItem({ index: 2, visible: true }); // 仓库
  296. uni.setTabBarItem({ index: 3, visible: true }); // 询价中心
  297. uni.setTabBarItem({ index: 4, visible: true }); // 核价中心
  298. break;
  299. case 'CRM':
  300. // 展示首页、线索公海、销售线索、接单中心、我的
  301. uni.setTabBarItem({ index: 0, visible: true }); // 首页
  302. uni.setTabBarItem({ index: 1, visible: true }); // 线索公海
  303. uni.setTabBarItem({ index: 5, visible: true }); // 销售线索
  304. uni.setTabBarItem({ index: 6, visible: true }); // 接单中心
  305. break;
  306. default:
  307. // 默认情况,显示CRM相关的tabbar
  308. uni.setTabBarItem({ index: 0, visible: true }); // 首页
  309. uni.setTabBarItem({ index: 1, visible: true }); // 线索公海
  310. uni.setTabBarItem({ index: 5, visible: true }); // 销售线索
  311. uni.setTabBarItem({ index: 6, visible: true }); // 接单中心
  312. break;
  313. }
  314. // "我的"tab默认都展示(假设我的tab是index为7的位置)
  315. // 注意:这里需要根据实际的tabbar配置来调整index
  316. // 如果"我的"tab的index不是7,请修改下面的代码
  317. uni.setTabBarItem({ index: 7, visible: true }); // 我的
  318. }
  319. // 导出切换权限的action
  320. export function switchRole({ commit, state }, currentRole) {
  321. commit('SWITCH_ROLE', currentRole);
  322. }