history.ts 10.0 KB

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