user.js 12 KB

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