index.ts 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. import router from "../router";
  2. import { wecomTicket } from "../api/indexAI";
  3. declare let wx: any;
  4. export const dateFormat = (fmt: string, x: Date | string) => {
  5. const date = typeof x === "string" ? new Date(x) : x;
  6. let ret;
  7. let opt: IAny = {
  8. "Y+": date.getFullYear().toString(), // 年
  9. "M+": (date.getMonth() + 1).toString(), // 月
  10. "d+": date.getDate().toString(), // 日
  11. "h+": date.getHours().toString(), // 时
  12. "m+": date.getMinutes().toString(), // 分
  13. "s+": date.getSeconds().toString() // 秒
  14. };
  15. for (let k in opt) {
  16. ret = new RegExp("(" + k + ")").exec(fmt);
  17. if (ret) {
  18. fmt = fmt.replace(
  19. ret[1],
  20. ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, "0")
  21. );
  22. }
  23. }
  24. return fmt;
  25. };
  26. export const RegAccount = /^[a-zA-Z0-9]{9,16}$/;
  27. export const Dateformat = (t: string | Date, format: string) => {
  28. let fmt = format;
  29. let ret;
  30. const date = typeof t === "string" ? new Date(t) : t;
  31. const opt: IAny = {
  32. "Y+": date.getFullYear().toString(), // 年
  33. "m+": (date.getMonth() + 1).toString(), // 月
  34. "d+": date.getDate().toString(), // 日
  35. "H+": date.getHours().toString(), // 时
  36. "M+": date.getMinutes().toString(), // 分
  37. "S+": date.getSeconds().toString() // 秒
  38. // 有其他格式化字符需求可以继续添加,必须转化成字符串
  39. };
  40. for (let k in opt) {
  41. ret = new RegExp("(" + k + ")").exec(fmt);
  42. if (ret) {
  43. fmt = fmt.replace(
  44. ret[1],
  45. ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, "0")
  46. );
  47. }
  48. }
  49. return fmt;
  50. };
  51. export const getWecomType = (agentFrom: string) => {
  52. // 用户来源 0随身邦 1好邦手 2服务商随身邦 3金牌店随身邦 4导购 5新零售客服
  53. switch (agentFrom) {
  54. case 'ssb'://经销商
  55. return 0;
  56. case 'hbs'://好邦手
  57. return 1;
  58. case 'stoneLikePaint'://服务商
  59. return 2;
  60. case 'goldShop'://金牌店
  61. return 3;
  62. case 'dg'://导购
  63. return 4;
  64. case 'xlskf'://新零售客服
  65. return 5;
  66. default:
  67. return 5; // 默认为5
  68. }
  69. }
  70. export const getWecomTypeName = (agentFrom: string) => {
  71. switch (agentFrom) {
  72. case 'ssb':
  73. return '经销商随身邦';
  74. case 'hbs':
  75. return '好邦手';
  76. case 'stoneLikePaint':
  77. return '服务商随身邦';
  78. case 'goldShop':
  79. return '金牌店随身邦';
  80. case 'dg':
  81. return '导购运营平台';
  82. case 'xlskf':
  83. return '新零售客服';
  84. default:
  85. return '新零售客服';
  86. }
  87. }
  88. export const getAgentFrom = (WecomType: unknown): string => {
  89. const typeNum = Number(WecomType);
  90. const typeMap = {
  91. 0: 'ssb', // 经销商
  92. 1: 'hbs', // 好邦手
  93. 2: 'stoneLikePaint',// 服务商
  94. 3: 'goldShop', // 金牌店
  95. 4: 'dg', // 导购
  96. 5: 'xlskf' // 新零售客服
  97. };
  98. return typeMap[typeNum as keyof typeof typeMap] || 'xlskf';
  99. };
  100. export const toLBHome = () => {
  101. const loginMode = window.localStorage.getItem("loginMode")
  102. if (loginMode === 'wxidLogin') {
  103. let baseUrl: string = "";
  104. process.env.VUE_APP_BASE_API == "/api/"
  105. ? (baseUrl = process.env.VUE_APP_Target)
  106. : (baseUrl = process.env.VUE_APP_BASE_API);
  107. let agent = window.localStorage.getItem('agentFrom');
  108. let agentFromAI = window.localStorage.getItem('agentFromAI');
  109. let WecomType = sessionStorage.getItem("userWecomType");
  110. // 导购来源和无来源的点击小房子为退出应用,其他为返回到首页
  111. if (WecomType && WecomType == '4') {
  112. // console.log("----导购来源---")
  113. wx.invoke('closeWindow', {}, (res) => {
  114. if (res.err_msg === 'closeWindow:ok') {
  115. console.log("关闭应用成功")
  116. } else {
  117. console.log("关闭应用失败")
  118. }
  119. });
  120. } else if (agentFromAI && agentFromAI === 'dg' || (!agent && !WecomType)) {
  121. // console.log("----导购or无---")
  122. wx.invoke('closeWindow', {}, (res) => {
  123. if (res.err_msg === 'closeWindow:ok') {
  124. console.log("关闭应用成功")
  125. } else {
  126. console.log("关闭应用失败")
  127. }
  128. });
  129. } else {
  130. if (!agent && WecomType) {
  131. agent = getAgentFrom(parseInt(WecomType)) || 'ssb';
  132. }
  133. window.location.href = baseUrl.replace("wxportal-api/", "") + '?agent=' + agent;
  134. }
  135. } else {
  136. router.replace('/');
  137. }
  138. }
  139. export const toXiaoChengxu = (appid) => {
  140. let url = window.location.href.split("#")[0];
  141. const formData = new FormData();
  142. formData.append('url', url);
  143. formData.append('agent', '1');
  144. wecomTicket(formData).then(response => {
  145. if (response.StatusCode == 200) {
  146. let qiyeData = response.Data;
  147. wx.agentConfig({
  148. debug: false,
  149. corpid: qiyeData.appid,
  150. agentid: qiyeData.agentID,
  151. timestamp: qiyeData.timestamp,
  152. nonceStr: qiyeData.noncestr,
  153. signature: qiyeData.signature,
  154. jsApiList: ["launchMiniprogram"],
  155. success: function (res) {
  156. wx.invoke(
  157. "launchMiniprogram",
  158. {
  159. appid: appid, // 需跳转的小程序appid
  160. path: "" // 所需跳转的小程序内页面路径及参数。非必填
  161. },
  162. function (res) {
  163. if (res.err_msg == "launchMiniprogram:ok") {
  164. // 正常
  165. console.log("正常");
  166. } else {
  167. // 错误处理
  168. }
  169. }
  170. );
  171. },
  172. fail: function (res) {
  173. if (res.errMsg.indexOf("function not exist") > -1) {
  174. alert("版本过低请升级");
  175. }
  176. }
  177. });
  178. }
  179. });
  180. }
  181. // 获取微信API授权信息
  182. export const getWxconfig = () => {
  183. if(window.localStorage.getItem('agentFromAI') !== 'xlskf'){
  184. return;
  185. }
  186. // const jsApiList = [ 'downloadFile', 'saveImageToPhotosAlbum', 'closeWindow', 'hideMenuItems'];
  187. let url = window.location.href.split("#")[0];
  188. const formData = new FormData();
  189. formData.append('url', url);
  190. formData.append('agent', '1');
  191. wecomTicket(formData).then(response => {
  192. if (response.StatusCode == 200) {
  193. let qiyeData = response.Data;
  194. wx.agentConfig({
  195. debug: false,
  196. corpid: qiyeData.appid,
  197. agentid: qiyeData.agentID,
  198. timestamp: qiyeData.timestamp,
  199. nonceStr: qiyeData.noncestr,
  200. signature: qiyeData.signature,
  201. jsApiList: ["hideMenuItems"],
  202. success: function (res) {
  203. wx.hideMenuItems({
  204. menuList: [
  205. "menuItem:share:wechat",
  206. "menuItem:openWithBrowser",
  207. "menuItem:share:email", // 通过邮件转发
  208. "menuItem:copyUrl",
  209. "menuItem:share:wechat_friend",
  210. "menuItem:share:timeline",
  211. "menuItem:share:appMessage",
  212. "menuItem:openWithSafari"
  213. ],
  214. success: () => {
  215. // console.log('菜单隐藏成功');
  216. },
  217. fail: (err) => {
  218. // console.log('菜单隐藏失败:', err);
  219. }
  220. });
  221. }
  222. });
  223. }
  224. });
  225. }
  226. // 获取微信API授权信息
  227. export const getWxconfigNew = () => {
  228. return new Promise((resolve, reject) => {
  229. let url = window.location.href.split("#")[0];
  230. const formData = new FormData();
  231. formData.append('url', url);
  232. formData.append('agent', '1');
  233. wecomTicket(formData).then(response => {
  234. if (response.StatusCode == 200) {
  235. let qiyeData = response.Data;
  236. wx.agentConfig({
  237. debug: false,
  238. corpid: qiyeData.appid,
  239. agentid: qiyeData.agentID,
  240. timestamp: qiyeData.timestamp,
  241. nonceStr: qiyeData.noncestr,
  242. signature: qiyeData.signature,
  243. jsApiList: ["chooseImage", "getLocalImgData", "previewImage"],
  244. success: function (res) { }
  245. });
  246. wx.ready(() => {
  247. console.log('企业微信SDK初始化成功');
  248. resolve(true);
  249. });
  250. wx.error((err) => {
  251. console.error('SDK初始化失败:', err);
  252. reject(err);
  253. });
  254. } else {
  255. reject(new Error('获取微信配置参数失败'));
  256. }
  257. }).catch(err => {
  258. console.error('请求wecomTicket接口失败:', err);
  259. reject(err);
  260. });
  261. });
  262. };
  263. /**
  264. * 企业微信H5 环境+缓存双重校验工具
  265. * 校验规则:1.必须是企微APP/客户端环境
  266. * 校验失败自动跳转 /error 页面,无返回值
  267. */
  268. export const checkWxWorkEnvAndUserCache = () => {
  269. try {
  270. const currentHost = window.location.hostname;
  271. const isLocalDev = currentHost === 'localhost' || currentHost.startsWith('192.168.101');
  272. if (isLocalDev) {
  273. return;
  274. }
  275. const userAgent = window.navigator.userAgent.toLowerCase();
  276. const isWxWorkEnv = userAgent.includes('wxwork');
  277. // console.log("userAgent", userAgent)
  278. // console.log("isWxWorkEnv", isWxWorkEnv)
  279. if (!isWxWorkEnv) {
  280. console.error('校验失败:当前环境非企业微信APP/客户端');
  281. sessionStorage.setItem("errorMsgTit", "请在企微客户端打开链接")
  282. router.replace(`/error`);
  283. return;
  284. }
  285. } catch (error) {
  286. console.error('环境校验异常:', error);
  287. sessionStorage.setItem("errorMsgTit", "环境异常")
  288. router.replace(`/error`)
  289. }
  290. }
  291. export const checkAndSaveUserWecomType = () => {
  292. // 已存在则直接返回,避免重复赋值
  293. if (sessionStorage.getItem('userWecomType')) return;
  294. const { WecomType } = router.currentRoute.query;
  295. const originWecomType = String(WecomType);
  296. const validWecomTypes = new Set(['0', '1', '2', '3', '4', '5']);
  297. const userWecomType = validWecomTypes.has(originWecomType) ? originWecomType : '5';
  298. sessionStorage.setItem('userWecomType', userWecomType);
  299. };