history.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. import { TypeZ1dict } from '@/pages/Z_system/Z1dict/type'
  2. import { treeLastIdFindFatherFu } from '@/pages/Z_system/Z6user/data'
  3. import store from '@/store'
  4. import { createHashHistory } from 'history'
  5. import { getTokenInfo } from './storage'
  6. import { FourTableType } from '@/pages/B_enterTibet/B3_4page/type'
  7. import { TypeZ4Tree } from '@/pages/Z_system/Z4organization/type'
  8. import { KuIsTreeType } from '@/pages/D_storeManage/D4impStor/type'
  9. import { cascaderArr } from '@/pages/B_enterTibet/B3goodsTable/B3GaddNew/data'
  10. import { baseURL } from './http'
  11. const history = createHashHistory()
  12. export default history
  13. // -------------------所有藏品详情 全部新页面打开-------------------
  14. export const openGoodsInfoFu = (id: number, src?: string) => {
  15. window.open(src ? src : `/#/goodsLook/${id}`, '_blank')
  16. }
  17. // -------------------级联回显-------------------
  18. let dictAll: TypeZ1dict[] = []
  19. export const resJiLianFu = (idTemp: string, isNull?: string) => {
  20. if (idTemp) {
  21. if (dictAll && dictAll.length === 0) {
  22. dictAll = store.getState().Z1dict.dictAll
  23. }
  24. const idArr = idTemp.split(',')
  25. const id = idArr[idArr.length - 1]
  26. let arr = treeLastIdFindFatherFu(dictAll, id, 'name')
  27. if (arr.length >= 3) arr = arr.slice(2)
  28. if (arr && arr.length) return arr.join(' / ')
  29. else return isNull || '(空)'
  30. } else return isNull || '(空)'
  31. }
  32. // -------------------富文本回显-------------------
  33. export const textFu = (val: string) => {
  34. let TxtRes = ''
  35. try {
  36. if (val) {
  37. let txt = JSON.parse(val)
  38. if (txt.txtArr && txt.txtArr.length) {
  39. let txt2: string = txt.txtArr[0].txt
  40. if (txt2) {
  41. const txt3 = txt2.replaceAll('<p></p>', '')
  42. if (txt3) TxtRes = txt2
  43. }
  44. }
  45. }
  46. } catch (error) {}
  47. return TxtRes
  48. }
  49. // -------------------树结构的搜索过滤-------------------
  50. export const filterTreeByName = (tree: TypeZ1dict[], searchTemp: string): TypeZ1dict[] => {
  51. const searchKey = searchTemp.toUpperCase()
  52. const dfs = (node: TypeZ1dict): TypeZ1dict | null => {
  53. // 先递归处理子节点(深度优先)
  54. const filteredChildren = (node.children?.map(dfs).filter(Boolean) as TypeZ1dict[]) || []
  55. // 判断当前节点是否匹配或子节点有匹配项
  56. const txt = node.name.toUpperCase() + (node.num || '').toUpperCase()
  57. const isSelfMatch = txt.includes(searchKey)
  58. // console.log('pppppppp', isSelfMatch, searchKey, node.num)
  59. const hasChildMatch = filteredChildren.length > 0
  60. if (isSelfMatch || hasChildMatch) {
  61. return {
  62. ...node,
  63. children: hasChildMatch ? filteredChildren : undefined
  64. }
  65. }
  66. return null
  67. }
  68. return tree.map(dfs).filter(Boolean) as TypeZ1dict[]
  69. }
  70. // -------------------处理所属部门数据-------------------
  71. let buMenTree: TypeZ4Tree[] = []
  72. export const buMenRes = (list: any[]) => {
  73. if (buMenTree && buMenTree.length === 0) {
  74. buMenTree = store.getState().Z4organization.treeData
  75. }
  76. let arr = list.map((v: any) => ({
  77. ...v,
  78. deptNameRes: v.deptId
  79. ? treeLastIdFindFatherFu(buMenTree, v.deptId + '', 'name').join(' / ')
  80. : '-'
  81. }))
  82. return arr
  83. }
  84. // -------------------列表页面的按钮权限-------------------
  85. export type btnFlagTxtType = '查看' | '编辑' | '删除' | '审批' | '盘点'
  86. export const btnFlagFu = (item: FourTableType) => {
  87. //申请单状态 申请人id 当前节点审批人 历史审批人 抄送人
  88. const { status, creatorId, currentAuditUserIds, auditUserIds, copyUserIds } = item
  89. let flagObj: { [K in btnFlagTxtType]: boolean } = {
  90. 查看: false,
  91. 编辑: false,
  92. 删除: false,
  93. 审批: false,
  94. 盘点: false
  95. }
  96. const myId = (getTokenInfo().user || { id: 0 }).id
  97. // 当前节点审批人
  98. const arr3 = (currentAuditUserIds || '').split(',').map(v => Number(v))
  99. // 历史审批人
  100. const arr4 = (auditUserIds || '').split(',').map(v => Number(v))
  101. // 抄送人
  102. const arr5 = (copyUserIds || '').split(',').map(v => Number(v))
  103. const obj = {
  104. 1: () => {
  105. //草稿
  106. // 申请人是我自己 =》查看 编辑 删除
  107. if (myId === creatorId) flagObj['查看'] = flagObj['编辑'] = flagObj['删除'] = true
  108. },
  109. 6: () => {
  110. //待提交
  111. // 申请人是我自己 =》查看 编辑
  112. if (myId === creatorId) flagObj['查看'] = flagObj['编辑'] = true
  113. },
  114. 2: () => {
  115. //待审批
  116. // 申请人是我自己 =》查看
  117. if (myId === creatorId) flagObj['查看'] = true
  118. // 历史审批人有我 =》查看
  119. if (arr4.includes(myId)) flagObj['查看'] = true
  120. // 当前审批人有我 =》审批
  121. if (arr3.includes(myId)) flagObj['审批'] = true
  122. // 抄送人有我 =》查看
  123. if (arr5.includes(myId)) flagObj['查看'] = true
  124. },
  125. 3: () => {
  126. //审批不通过
  127. // 申请人是我自己 =》查看
  128. if (myId === creatorId) flagObj['查看'] = true
  129. // 历史审批人有我 =》查看
  130. if (arr4.includes(myId)) flagObj['查看'] = true
  131. // 抄送人有我 =》查看
  132. if (arr5.includes(myId)) flagObj['查看'] = true
  133. },
  134. 4: () => {
  135. //已完成
  136. // 申请人是我自己 =》查看
  137. if (myId === creatorId) flagObj['查看'] = true
  138. // 历史审批人有我 =》查看
  139. if (arr4.includes(myId)) flagObj['查看'] = true
  140. // 抄送人有我 =》查看
  141. if (arr5.includes(myId)) flagObj['查看'] = true
  142. },
  143. 5: () => {
  144. //待盘点
  145. // 申请人是我自己 =》查看 编辑 盘点
  146. if (myId === creatorId) flagObj['查看'] = flagObj['编辑'] = flagObj['盘点'] = true
  147. }
  148. }
  149. if (Reflect.get(obj, status)) Reflect.get(obj, status)()
  150. return flagObj
  151. // return { 查看: true, 编辑: true, 删除: true, 审批: true, 盘点: true }
  152. }
  153. // -------------------详情页面的按钮权限-------------------
  154. export type btnFlagTxtType2 =
  155. | '创建'
  156. | '提交'
  157. | '撤回'
  158. | '审批'
  159. | '编辑'
  160. | '重新提交'
  161. | '删除'
  162. | '盘点'
  163. export const btnFlagFu2 = (item: FourTableType) => {
  164. //申请单状态 申请人id 当前节点审批人
  165. const { status, creatorId, currentAuditUserIds } = item
  166. let flagObj: { [K in btnFlagTxtType2]: boolean } = {
  167. 创建: false,
  168. 提交: false,
  169. 撤回: false,
  170. 审批: false,
  171. 编辑: false,
  172. 重新提交: false,
  173. 删除: false,
  174. 盘点: false
  175. }
  176. const myId = (getTokenInfo().user || { id: 0 }).id
  177. // 当前节点审批人
  178. const arr3 = (currentAuditUserIds || '').split(',').map(v => Number(v))
  179. const obj = {
  180. 1: () => {
  181. //草稿
  182. // 我是申请人
  183. if (creatorId === myId) flagObj['创建'] = flagObj['编辑'] = flagObj['删除'] = true
  184. },
  185. 6: () => {
  186. //待提交
  187. // 我是申请人
  188. if (creatorId === myId) flagObj['提交'] = flagObj['编辑'] = flagObj['删除'] = true
  189. },
  190. 2: () => {
  191. //待审批
  192. // 我是申请人
  193. if (creatorId === myId) flagObj['撤回'] = true
  194. // 当前审批人有我 =》审批
  195. if (arr3.includes(myId)) flagObj['审批'] = true
  196. },
  197. 3: () => {
  198. //审批不通过
  199. // 我是申请人
  200. if (creatorId === myId) flagObj['编辑'] = flagObj['重新提交'] = true
  201. },
  202. // 4: () => {
  203. // //已完成
  204. // // 我是申请人
  205. // // if (creatorId === myId) flagObj['导出'] = true
  206. // },
  207. 5: () => {
  208. //待盘点
  209. // 我是申请人
  210. if (creatorId === myId)
  211. flagObj['提交'] = flagObj['盘点'] = flagObj['编辑'] = flagObj['删除'] = true
  212. }
  213. }
  214. if (Reflect.get(obj, status)) Reflect.get(obj, status)()
  215. return flagObj
  216. // return {
  217. // 创建: true,
  218. // 提交: true,
  219. // 撤回: true,
  220. // 审批: true,
  221. // 编辑: true,
  222. // 重新提交: true,
  223. // 删除: true,
  224. // 盘点: true
  225. // }
  226. }
  227. // -------------------排架层数库位平铺转树结构-------------------
  228. export function kuIsTreeChangeFu(arr: any[]): KuIsTreeType[] {
  229. // 第一层缓存:region维度(value用id,label用regionName)
  230. const regionMap = new Map<number, KuIsTreeType>()
  231. // 第二层缓存:layer1维度(value用layer1数值)
  232. const layer1Map = new Map<string, KuIsTreeType>()
  233. // 第三层缓存:layer2维度(value用layer2数值)
  234. const layer2Map = new Map<string, KuIsTreeType>()
  235. arr.forEach(item => {
  236. // 创建/获取区域节点
  237. let regionNode = regionMap.get(item.regionId)
  238. if (!regionNode) {
  239. regionNode = {
  240. value: item.id, // 注意:此处使用元素id作为value
  241. label: item.regionName,
  242. children: []
  243. }
  244. regionMap.set(item.regionId, regionNode)
  245. }
  246. // 创建/获取layer1节点
  247. const layer1Key = `${item.regionId}-${item.layer1}`
  248. let layer1Node = layer1Map.get(layer1Key)
  249. if (!layer1Node) {
  250. layer1Node = {
  251. value: item.layer1,
  252. label: String(item.layer1),
  253. children: []
  254. }
  255. regionNode.children!.push(layer1Node)
  256. layer1Map.set(layer1Key, layer1Node)
  257. }
  258. // 创建/获取layer2节点
  259. const layer2Key = `${layer1Key}-${item.layer2}`
  260. let layer2Node = layer2Map.get(layer2Key)
  261. if (!layer2Node) {
  262. layer2Node = {
  263. value: item.layer2,
  264. label: String(item.layer2),
  265. children: []
  266. }
  267. layer1Node.children!.push(layer2Node)
  268. layer2Map.set(layer2Key, layer2Node)
  269. }
  270. // 创建layer3节点
  271. const layer3Node: KuIsTreeType = {
  272. value: item.layer3,
  273. label: String(item.layer3),
  274. lastId: item.id
  275. }
  276. layer2Node.children!.push(layer3Node)
  277. })
  278. return Array.from(regionMap.values())
  279. }
  280. // 入库-自动分配空置库位
  281. export const ruTransformDataFu = (data: any[]): any[] => {
  282. // 用对象缓存区域基准ID
  283. const regionBaseIdCache: Record<string, number> = {}
  284. // 先遍历建立区域-基准ID映射
  285. data.forEach(item => {
  286. if (!regionBaseIdCache[item.regionName]) {
  287. regionBaseIdCache[item.regionName] = item.id
  288. }
  289. })
  290. // 转换数据结构
  291. return data.map(item => ({
  292. siteId: item.id,
  293. siteStr: `${regionBaseIdCache[item.regionName]},${item.layer1},${item.layer2},${item.layer3}`
  294. }))
  295. }
  296. // ---------------所有级联的数据平铺-------------------
  297. export const cascaderObjFu = (): any => {
  298. if (dictAll && dictAll.length === 0) {
  299. dictAll = store.getState().Z1dict.dictAll
  300. }
  301. let obj: any = {}
  302. if (dictAll && dictAll.length) {
  303. obj = cascaderArr(dictAll)
  304. }
  305. return obj
  306. }
  307. // --------------生成A标签下载--------------------
  308. export const downFileFu = (url: string, back?: () => void) => {
  309. // 动态创建 a 标签
  310. const link = document.createElement('a')
  311. link.href = baseURL + url
  312. link.target = '_blank'
  313. link.style.display = 'none'
  314. // 插入 DOM 并触发点击
  315. document.body.appendChild(link)
  316. link.click()
  317. // 清理
  318. document.body.removeChild(link)
  319. if (back) back()
  320. }