shaogen1995 hai 1 mes
pai
achega
1953af5810

+ 3 - 3
后台管理/README.md

@@ -1,9 +1,9 @@
 1.使用 yarn。 npm 有问题
 
-2.测试后端文档地址:待定
+2.测试后端文档地址:https://sit-jiningbwg.4dage.com/api/doc.html#/home
 
-3.测试堡垒机位置:待定
+3.测试堡垒机位置:227/data/data/museum_neimenggu_jining_storage_data
 
-4:测试网址:待定
+4:测试网址:https://sit-jiningbwg.4dage.com/backstage
 
 5:蓝湖地址:https://lanhuapp.com/web/#/item/project/product?tid=de3e5e3e-a489-4b19-862a-7c87ce113467&pid=b9372812-c1fc-4468-b4df-66d479852d37&image_id=64607cd0-37bc-4303-bd30-18ed52cc6b0d&docId=64607cd0-37bc-4303-bd30-18ed52cc6b0d&docType=axure&versionId=002aa9ce-c05b-489d-9908-d2df106c9942&pageId=94d8a5537a30480f93582ce01f79905c&parentId=6d680122-8ca9-4720-b76b-75e22561a31c&share_type=quickShare

+ 3 - 3
后台管理/src/pages/A0addGoods/index.tsx

@@ -191,7 +191,7 @@ function A0addGoods({ sId, closeFu, isEdit, orderId, isEditresubmit }: Props) {
         const res = await B3_APIcreate(obj)
         if (res.code === 0) {
           MessageFu.success('藏品修改提交成功')
-          history.push(`/edit_look/1/${res.data.id}`)
+          history.push(`/edit_look/3/${res.data.id}`)
         }
       } else if (sId > 0) {
         // 藏品修改/藏品登记页面点击重新提交
@@ -200,14 +200,14 @@ function A0addGoods({ sId, closeFu, isEdit, orderId, isEditresubmit }: Props) {
           : await B2_APIresubmit(orderId!, obj)
         if (res.code === 0) {
           MessageFu.success('重新提交成功')
-          history.push(`/${isEditresubmit ? 'edit' : 'register'}_look/1/${res.data.id}`)
+          history.push(`/${isEditresubmit ? 'edit' : 'register'}_look/3/${res.data.id}`)
         }
       } else {
         // 藏品登记新增
         const res = await API_addGoods(obj)
         if (res.code === 0) {
           MessageFu.success('登记成功')
-          history.push(`/register_look/1/${res.data.id}`)
+          history.push(`/register_look/3/${res.data.id}`)
         }
       }
     },

+ 49 - 0
后台管理/src/pages/A1workbench/A1setStock/index.module.scss

@@ -0,0 +1,49 @@
+.A1setStock {
+  :global {
+    .ant-modal-close {
+      display: none;
+    }
+    .ant-modal {
+      width: 800px !important;
+    }
+    .ant-modal-body {
+      border-top: 1px solid #ccc;
+      .A1Smain {
+        margin-top: 20px;
+
+        .Z5eboxrr {
+          width: 100%;
+
+          .Z5eRow2 {
+            width: calc(100% - 80px);
+            font-size: 16px;
+          }
+
+          .Z5eErr {
+            margin-bottom: 20px;
+            text-align: center;
+            color: #ff4d4f;
+            opacity: 0;
+            pointer-events: none;
+            transition: all 0.3s;
+            position: relative;
+            top: -10px;
+          }
+
+          .Z5eErrAc {
+            opacity: 1;
+            top: 0;
+          }
+          .Z5eboxrr_1 {
+            margin-top: 5px;
+          }
+        }
+
+        .A1Sbtn {
+          margin-top: 20px;
+          text-align: center;
+        }
+      }
+    }
+  }
+}

+ 96 - 0
后台管理/src/pages/A1workbench/A1setStock/index.tsx

@@ -0,0 +1,96 @@
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
+import styles from './index.module.scss'
+import { Button, Checkbox, Modal } from 'antd'
+import MyPopconfirm from '@/components/MyPopconfirm'
+import classNmaes from 'classnames'
+import { MessageFu } from '@/utils/message'
+import { RouterTypeRow } from '@/types'
+import { A1_APIsetStock } from '@/store/action/A1workbench'
+
+type Props = {
+  sId: number
+  arr: RouterTypeRow[]
+  closeFu: () => void
+  succFu: () => void
+}
+
+function A1setStock({ arr, closeFu, succFu, sId }: Props) {
+  const [roleArr, setRoleArr] = useState<RouterTypeRow[]>([])
+
+  useEffect(() => {
+    setRoleArr(arr)
+  }, [arr])
+
+  // 多选框变化
+  const onChange = useCallback(
+    (val: boolean, id: number) => {
+      setRoleArr(
+        roleArr.map(v => ({
+          ...v,
+          authority: v.id === id ? val : v.authority
+        }))
+      )
+    },
+    [roleArr]
+  )
+
+  // 二级选中的数组id集合
+  const checkIds = useMemo(() => {
+    const arr: number[] = []
+    roleArr.forEach(v => {
+      if (v.authority && v.name !== '工作台') arr.push(v.id)
+    })
+    return arr
+  }, [roleArr])
+
+  // 点击提交
+  const btnOk = useCallback(async () => {
+    const res = await A1_APIsetStock(sId, JSON.stringify(roleArr))
+    if (res.code === 0) {
+      MessageFu.success('设置成功')
+      succFu()
+      closeFu()
+    }
+  }, [closeFu, roleArr, sId, succFu])
+
+  return (
+    <Modal
+      wrapClassName={styles.A1setStock}
+      open={true}
+      title='常用功能'
+      footer={
+        [] // 设置footer为空,去掉 取消 确定默认按钮
+      }
+    >
+      <div className='A1Smain'>
+        <div className='Z5eboxrr'>
+          {roleArr.map(v => (
+            <div className='Z5eRow2' key={v.id}>
+              {v.name === '工作台' ? null : (
+                <Checkbox checked={v.authority} onChange={e => onChange(e.target.checked, v.id)}>
+                  {v.name}
+                </Checkbox>
+              )}
+            </div>
+          ))}
+
+          <div className={classNmaes('Z5eErr', checkIds.length <= 0 ? 'Z5eErrAc' : '')}>
+            至少选中一个
+          </div>
+        </div>
+
+        <div className='A1Sbtn'>
+          <Button type='primary' disabled={checkIds.length <= 0} onClick={btnOk}>
+            提交
+          </Button>
+          &emsp;
+          <MyPopconfirm txtK='取消' onConfirm={closeFu} />
+        </div>
+      </div>
+    </Modal>
+  )
+}
+
+const MemoA1setStock = React.memo(A1setStock)
+
+export default MemoA1setStock

+ 27 - 0
后台管理/src/pages/A1workbench/data.ts

@@ -0,0 +1,27 @@
+export type A1fromDataType = {
+  auditType: number
+  type: null | string
+  num: string
+  startTime: string
+  endTime: string
+  status: null | string
+  pageNum: number
+  pageSize: number
+}
+
+export const A1fromDataBase: A1fromDataType = {
+  auditType: 1,
+  type: null,
+  num: '',
+
+  startTime: '',
+  endTime: '',
+  status: null,
+  pageNum: 1,
+  pageSize: 10
+}
+
+export const A1TableBtnArr = [
+  { name: '我发起的', key: 1 },
+  { name: '待我审批', key: 2 }
+]

+ 74 - 0
后台管理/src/pages/A1workbench/index.module.scss

@@ -1,4 +1,78 @@
 .A1workbench {
+  background-color: #fff;
+  border-radius: 10px;
+  padding: 20px;
+  font-size: 16px;
+
   :global {
+    .A1tit {
+      font-weight: 700;
+      color: var(--themeColor);
+      padding-right: 15px;
+    }
+
+    .A1top {
+      display: flex;
+      border-bottom: 1px solid #ccc;
+      & > div {
+        padding: 0px 15px 0;
+      }
+
+      .A1top1 {
+        width: calc(100% - 470px);
+        border-right: 1px solid #ccc;
+        display: flex;
+        .A1rowBox {
+          display: flex;
+          flex-wrap: wrap;
+          width: calc(100% - 165px);
+        }
+      }
+      .A1top2 {
+        width: 470px;
+        display: flex;
+        flex-wrap: wrap;
+      }
+
+      .A1row {
+        cursor: pointer;
+        transition: all 0.3s;
+        margin-right: 20px;
+        margin-bottom: 20px;
+        height: 70px;
+        width: 80px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        border: 1px solid var(--themeColor);
+        color: var(--themeColor);
+        border-radius: 10px;
+
+        &:hover {
+          border: 1px solid var(--themeColor2);
+          color: var(--themeColor2);
+        }
+      }
+      .A1rowNo {
+        pointer-events: none;
+      }
+    }
+
+    .A1table {
+      padding-top: 15px;
+      .A1tabTop {
+        margin-bottom: 15px;
+        display: flex;
+        justify-content: space-between;
+        & > div {
+          .ant-btn {
+            margin-right: 15px;
+          }
+        }
+      }
+      .ant-table-cell {
+        padding: 8px !important;
+      }
+    }
   }
 }

+ 274 - 1
后台管理/src/pages/A1workbench/index.tsx

@@ -1,9 +1,282 @@
-import React from 'react'
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
 import styles from './index.module.scss'
+import { changGetFu, getTokenInfo } from '@/utils/storage'
+import history from '@/utils/history'
+import { authorityFu } from '@/utils/authority'
+import { Button, DatePicker, Input, Select } from 'antd'
+import { useDispatch, useSelector } from 'react-redux'
+import { RootState } from '@/store'
+import { RouterTypeRow } from '@/types'
+import { getUserInfoByIdAPI } from '@/store/action/Z1user'
+import A1setStock from './A1setStock'
+import { A1_APIgetlist } from '@/store/action/A1workbench'
+import { A1fromDataBase, A1TableBtnArr } from './data'
+import { B1listType } from '../B1ledger/data'
+import { statusSelect } from '@/utils/select'
+import MyTable from '@/components/MyTable'
+import tabLeftArr from '../Layout/data'
+import { A1tableC } from '@/utils/tableData'
+const { RangePicker } = DatePicker
+
+const userInfo = getTokenInfo().user || {}
+
 function A1workbench() {
+  // 设置常用功能
+  const userRolePermissions = useSelector((state: RootState) => state.A0Layout.userRolePermissions)
+  const [stockShow, setStockShow] = useState(false)
+  const [stockList, setStockList] = useState<RouterTypeRow[]>([])
+
+  const gettStockFu = useCallback(async () => {
+    const res = await getUserInfoByIdAPI(userInfo.id)
+    if (res.code === 0) {
+      // 设置常用功能
+      if (res.data.permRtf) {
+        setStockList(JSON.parse(res.data.permRtf || '[]'))
+      } else setStockList(userRolePermissions)
+    }
+  }, [userRolePermissions])
+
+  useEffect(() => {
+    gettStockFu()
+  }, [gettStockFu])
+
+  const stockListRes = useMemo(() => {
+    return stockList.filter(v => v.name !== '工作台' && v.authority)
+  }, [stockList])
+
+  // --------------列表表格相关-----------------------
+
+  const dispatch = useDispatch()
+
+  const [formData, setFormData] = useState(A1fromDataBase)
+
+  const getListFu = useCallback(async () => {
+    dispatch(A1_APIgetlist(formData))
+  }, [dispatch, formData])
+
+  useEffect(() => {
+    getListFu()
+  }, [getListFu])
+
+  // 输入框改变
+  const timeRef = useRef(-1)
+  const txtChangeFu = useCallback(
+    (e: React.ChangeEvent<HTMLInputElement>, key: 'num') => {
+      clearTimeout(timeRef.current)
+      timeRef.current = window.setTimeout(() => {
+        setFormData({
+          ...formData,
+          [key]: e.target.value,
+          pageNum: 1
+        })
+      }, 500)
+    },
+    [formData]
+  )
+
+  // 时间选择器改变
+  const timeChange = useCallback(
+    (date: any, dateString: any) => {
+      let startTime = ''
+      let endTime = ''
+      if (dateString[0] && dateString[1]) {
+        startTime = dateString[0] + ' 00:00:00'
+        endTime = dateString[1] + ' 23:59:59'
+      }
+      setFormData({ ...formData, startTime, endTime, pageNum: 1 })
+    },
+    [formData]
+  )
+
+  // 从仓库拿数据
+  const tableInfo = useSelector((state: RootState) => state.A1workbench.tableInfo)
+
+  // 各按钮的操作逻辑
+  // 点击查看
+
+  const tableLastBtn = useMemo(() => {
+    return [
+      {
+        title: '操作',
+        render: (item: B1listType) => {
+          return (
+            <>
+              <Button
+                size='small'
+                type='text'
+                onClick={() => {
+                  console.log(123456, item.type)
+                }}
+              >
+                查看
+              </Button>
+            </>
+          )
+        }
+      }
+    ]
+  }, [])
+
+  // 页码变化
+  const paginationChange = useCallback(
+    (pageNum: number, pageSize: number) => {
+      setFormData({ ...formData, pageNum, pageSize })
+    },
+    [formData]
+  )
+
+  // 业务类型拿出来
+  const pageType = useMemo(() => {
+    const arr: RouterTypeRow[] = []
+    tabLeftArr.forEach(v1 => {
+      v1.son.forEach(v2 => {
+        if (v2.pageType) arr.push(v2)
+      })
+    })
+    return arr
+  }, [])
+
+  const dataChange = useCallback(
+    (item: B1listType) => {
+      const obj = pageType.find(v => v.pageType === item.type)
+      return obj
+    },
+    [pageType]
+  )
+
   return (
     <div className={styles.A1workbench}>
       <div className='pageTitle'>工作台</div>
+
+      <div className='A1top'>
+        <div className='A1top1'>
+          <div className='A1tit'>常用功能</div>
+
+          <div className='A1rowBox'>
+            {stockListRes.length
+              ? stockListRes.map((v, i) => (
+                  <div
+                    key={i}
+                    className='A1row'
+                    onClick={() =>
+                      authorityFu(v.id, `您没有${v.name}页面权限`, () => {
+                        history.push(v.path)
+                      })
+                    }
+                  >
+                    {v.name}
+                  </div>
+                ))
+              : null}
+          </div>
+
+          <Button type='primary' onClick={() => setStockShow(true)}>
+            设置
+          </Button>
+        </div>
+        <div className='A1top2'>
+          <div className='A1tit'>最近使用</div>
+
+          {changGetFu().length ? (
+            changGetFu().map((v, i) => (
+              <div
+                key={i}
+                className='A1row'
+                onClick={() =>
+                  authorityFu(v.id, `您没有${v.name}页面权限`, () => {
+                    history.push(v.path)
+                  })
+                }
+              >
+                {v.name}
+              </div>
+            ))
+          ) : (
+            <div className='A1row A1rowNo'>暂无信息</div>
+          )}
+        </div>
+      </div>
+
+      <div className='A1table'>
+        <div className='A1tabTop'>
+          <div>
+            {A1TableBtnArr.map(v => (
+              <Button
+                key={v.key}
+                type={v.key === formData.auditType ? 'primary' : 'default'}
+                onClick={() => setFormData({ ...formData, auditType: v.key, pageNum: 1 })}
+              >
+                {v.name}
+              </Button>
+            ))}
+          </div>
+          <div>
+            <Select
+              allowClear
+              style={{ width: 200 }}
+              placeholder='业务类型'
+              options={pageType.map(v => ({ value: v.pageType, label: v.name }))}
+              value={formData.type}
+              onChange={e => setFormData({ ...formData, type: e })}
+            />
+            &emsp;
+            <Input
+              placeholder='业务编号'
+              maxLength={30}
+              showCount
+              allowClear
+              onChange={e => txtChangeFu(e, 'num')}
+              style={{ width: 200 }}
+            />
+            &emsp;
+            <RangePicker
+              placeholder={['发起日期起', '发起日期终']}
+              style={{ width: 240 }}
+              onChange={timeChange}
+            />
+            &emsp;
+            <Select
+              allowClear
+              style={{ width: 200 }}
+              placeholder='申请状态'
+              options={statusSelect}
+              value={formData.status}
+              onChange={e => setFormData({ ...formData, status: e })}
+            />
+          </div>
+        </div>
+        {/* 表格 */}
+        <MyTable
+          yHeight={370}
+          list={tableInfo.list}
+          staBtn={[
+            {
+              title: '业务类型',
+              render: (item: B1listType) => {
+                const obj = dataChange(item)
+
+                return obj ? obj.name : '(空)'
+              }
+            }
+          ]}
+          columnsTemp={A1tableC}
+          lastBtn={tableLastBtn}
+          pageNum={formData.pageNum}
+          pageSize={formData.pageSize}
+          total={tableInfo.total}
+          onChange={(pageNum, pageSize) => paginationChange(pageNum, pageSize)}
+        />
+      </div>
+
+      {/* 设置常用功能 */}
+      {stockShow ? (
+        <A1setStock
+          sId={userInfo.id}
+          arr={stockList}
+          closeFu={() => setStockShow(false)}
+          succFu={gettStockFu}
+        />
+      ) : null}
     </div>
   )
 }

+ 6 - 6
后台管理/src/pages/A2statistics/index.module.scss

@@ -21,7 +21,7 @@
         .A2Row1 {
           font-weight: 700;
           text-align: center;
-          width: 700px;
+          width: 1000px;
           border: 1px solid #ccc;
           border-bottom: none;
           border-right: none;
@@ -29,7 +29,7 @@
         }
         .A2Row2 {
           padding: 8px 0;
-          width: calc(100% - 700px);
+          width: calc(100% - 1000px);
           border: 1px solid #ccc;
           border-bottom: none;
         }
@@ -46,7 +46,7 @@
         text-align: center;
         flex-wrap: wrap;
         .A2sonll {
-          width: 350px;
+          width: 300px;
           padding: 8px;
           display: flex;
           justify-content: center;
@@ -56,12 +56,12 @@
           font-weight: 700;
         }
         .A2sonrrBox {
-          width: calc(100% - 350px);
+          width: calc(100% - 300px);
           .A2sonrr {
             display: flex;
             .A2sonrr1 {
               padding: 8px;
-              width: 350px;
+              width: 700px;
               border-top: 1px solid #ccc;
               font-weight: 700;
             }
@@ -69,7 +69,7 @@
               border: 1px solid #ccc;
               border-bottom: none;
               padding: 8px;
-              width: calc(100% - 350px);
+              width: calc(100% - 700px);
             }
           }
         }

+ 4 - 4
后台管理/src/pages/B2register/B2look/index.tsx

@@ -76,13 +76,13 @@ function B2look() {
 
     if (res.code === 0) {
       MessageFu.success('审批成功')
-      history.replace(`/register_look/1/${id}`)
+      history.replace(`/register_look/3/${id}`)
     }
   }, [auditSta, id, rtfOpinion])
 
   return (
     <div className={styles.B2look} ref={boxRef}>
-      <div className='pageTitle'>藏品登记 - {key === '1' ? '查看' : '审批'}</div>
+      <div className='pageTitle'>藏品登记 - {key === '3' ? '查看' : '审批'}</div>
 
       {info.id ? (
         <>
@@ -96,7 +96,7 @@ function B2look() {
               </div>
             </div>
             <div className='B2lToprr'>
-              {key === '2' ? (
+              {key === '4' ? (
                 <>
                   <Button type='primary' onClick={btnOk}>
                     提交
@@ -123,7 +123,7 @@ function B2look() {
             </div>
 
             {/* 审批相关 */}
-            {key === '2' ? (
+            {key === '4' ? (
               <>
                 <div className='B2lTrow B2lTrowAll'>
                   <div className='B2lTrow1'>

+ 2 - 2
后台管理/src/pages/B2register/index.tsx

@@ -78,7 +78,7 @@ function B2register() {
               <Button
                 size='small'
                 type='text'
-                onClick={() => history.push(`/register_look/1/${item.id}`)}
+                onClick={() => history.push(`/register_look/3/${item.id}`)}
               >
                 查看
               </Button>
@@ -87,7 +87,7 @@ function B2register() {
                 <Button
                   size='small'
                   type='text'
-                  onClick={() => history.push(`/register_look/2/${item.id}`)}
+                  onClick={() => history.push(`/register_look/4/${item.id}`)}
                 >
                   审批
                 </Button>

+ 4 - 4
后台管理/src/pages/B3edit/B3look/index.tsx

@@ -170,7 +170,7 @@ function B3look() {
 
     if (res.code === 0) {
       MessageFu.success('审批成功')
-      history.replace(`/edit_look/1/${id}`)
+      history.replace(`/edit_look/3/${id}`)
     }
   }, [auditSta, id, rtfOpinion])
 
@@ -198,7 +198,7 @@ function B3look() {
 
   return (
     <div className={styles.B3look} ref={boxRef}>
-      <div className='pageTitle'>藏品修改 - {key === '1' ? '查看' : '审批'}</div>
+      <div className='pageTitle'>藏品修改 - {key === '3' ? '查看' : '审批'}</div>
 
       {oldInfo.id && newInfo.id && topInfo.id ? (
         <>
@@ -212,7 +212,7 @@ function B3look() {
               </div>
             </div>
             <div className='B3lToprr'>
-              {key === '2' ? (
+              {key === '4' ? (
                 <>
                   <Button type='primary' onClick={btnOk}>
                     提交
@@ -239,7 +239,7 @@ function B3look() {
             </div>
 
             {/* 审批相关 */}
-            {key === '2' ? (
+            {key === '4' ? (
               <>
                 <div className='B3lTrow B3lTrowAll'>
                   <div className='B3lTrow1'>

+ 2 - 2
后台管理/src/pages/B3edit/index.tsx

@@ -77,7 +77,7 @@ function B3edit() {
               <Button
                 size='small'
                 type='text'
-                onClick={() => history.push(`/edit_look/1/${item.id}`)}
+                onClick={() => history.push(`/edit_look/3/${item.id}`)}
               >
                 查看
               </Button>
@@ -86,7 +86,7 @@ function B3edit() {
                 <Button
                   size='small'
                   type='text'
-                  onClick={() => history.push(`/edit_look/2/${item.id}`)}
+                  onClick={() => history.push(`/edit_look/4/${item.id}`)}
                 >
                   审批
                 </Button>

+ 4 - 4
后台管理/src/pages/B4delete/B4look/index.tsx

@@ -75,13 +75,13 @@ function B4look() {
 
     if (res.code === 0) {
       MessageFu.success('审批成功')
-      history.replace(`/delete_look/1/${id}`)
+      history.replace(`/delete_look/3/${id}`)
     }
   }, [auditSta, id, rtfOpinion])
 
   return (
     <div className={styles.B4look} ref={boxRef}>
-      <div className='pageTitle'>藏品删除 - {key === '1' ? '查看' : '审批'}</div>
+      <div className='pageTitle'>藏品删除 - {key === '3' ? '查看' : '审批'}</div>
 
       {info.id ? (
         <>
@@ -95,7 +95,7 @@ function B4look() {
               </div>
             </div>
             <div className='B4lToprr'>
-              {key === '2' ? (
+              {key === '4' ? (
                 <>
                   <Button type='primary' onClick={btnOk}>
                     提交
@@ -122,7 +122,7 @@ function B4look() {
             </div>
 
             {/* 审批相关 */}
-            {key === '2' ? (
+            {key === '4' ? (
               <>
                 <div className='B4lTrow B4lTrowAll'>
                   <div className='B4lTrow1'>

+ 2 - 2
后台管理/src/pages/B4delete/index.tsx

@@ -97,7 +97,7 @@ function B4delete() {
               <Button
                 size='small'
                 type='text'
-                onClick={() => history.push(`/delete_look/1/${item.id}`)}
+                onClick={() => history.push(`/delete_look/3/${item.id}`)}
               >
                 查看
               </Button>
@@ -106,7 +106,7 @@ function B4delete() {
                 <Button
                   size='small'
                   type='text'
-                  onClick={() => history.push(`/delete_look/2/${item.id}`)}
+                  onClick={() => history.push(`/delete_look/4/${item.id}`)}
                 >
                   审批
                 </Button>

+ 1 - 1
后台管理/src/pages/Layout/data.ts

@@ -139,7 +139,7 @@ const tabLeftArr: RouterType = [
 export default tabLeftArr
 
 // 里面的页面,不是左边的tab栏
-export const routerSon: RouterTypeRow = [
+export const routerSon: RouterTypeRow[] = [
   {
     id: 400,
     name: '藏品登记-查看',

+ 22 - 13
后台管理/src/pages/Layout/index.tsx

@@ -8,7 +8,7 @@ import { Button, Form, Input, Modal } from 'antd'
 import { Base64 } from 'js-base64'
 import encodeStr from '@/utils/pass'
 import { passWordEditAPI } from '@/store/action/layout'
-import { getTokenInfo, removeTokenInfo } from '@/utils/storage'
+import { changSetFu, getTokenInfo, removeTokenInfo } from '@/utils/storage'
 import { MessageFu } from '@/utils/message'
 import NotFound from '@/components/NotFound'
 import classNames from 'classnames'
@@ -51,7 +51,7 @@ function Layout() {
     setPath(pathTemp)
   }, [location])
 
-  const [routerSonRes, setRouterSonRes] = useState<RouterTypeRow>([])
+  const [routerSonRes, setRouterSonRes] = useState<RouterTypeRow[]>([])
 
   // 获取用户权限信息
   const getUserAuthFu = useCallback(async () => {
@@ -64,18 +64,12 @@ function Layout() {
 
       const roleArr: any[] = res.data.permission
 
-      // 只拿后端返回的有权限的id,存到仓库
-      const authorityIds: number[] = []
-
       roleArr.forEach(v => {
         if (v.authority) {
           isOkIdArr.push(v.id)
-          authorityIds.push(v.id)
         }
       })
 
-      store.dispatch({ type: 'layout/authorityIds', payload: authorityIds })
-
       // 详情页,也需要看下有没有页面权限
       setRouterSonRes(routerSon.filter(v => isOkIdArr.includes(v.id)))
 
@@ -86,18 +80,32 @@ function Layout() {
         })
       }
 
-      const tempArr: RouterTypeRow = []
+      // 页面权限id,存到仓库
+      store.dispatch({ type: 'layout/authorityIds', payload: isOkIdArr })
+
+      const tempArr: RouterTypeRow[] = []
+
+      // 权限数据存到仓库
+      const roleArrStoreArr: RouterTypeRow[] = []
 
       tabLeftArr.forEach(v1 => {
         if (v1.son && v1.son[0]) {
           v1.son.forEach(v2 => {
             if (isOkIdArr.includes(v2.id)) {
               tempArr.push(v2)
+
+              // 过滤掉 藏品详情 页
+              if (v2.id < 9901) {
+                roleArrStoreArr.push({ ...v2, authority: true })
+              }
             }
           })
         }
       })
 
+      // 权限数据存到仓库
+      store.dispatch({ type: 'layout/userRolePermissions', payload: roleArrStoreArr })
+
       setRouterCom(tempArr)
 
       // 如果当前页面没有权限了,跳转有权限的第一个页面
@@ -138,15 +146,16 @@ function Layout() {
   const [list, setList] = useState([] as RouterType)
 
   // 路由信息(过滤之后的)
-  const [RouterCom, setRouterCom] = useState<RouterTypeRow>([])
+  const [RouterCom, setRouterCom] = useState<RouterTypeRow[]>([])
 
   // useEffect(() => {
   //   console.log(123, list);
   // }, [list]);
 
   // 点击跳转
-  const pathCutFu = useCallback((path: string) => {
-    history.push(path)
+  const pathCutFu = useCallback((item: RouterTypeRow) => {
+    history.push(item.path)
+    if (item.name !== '工作台') changSetFu(item)
   }, [])
 
   // 修改密码相关
@@ -218,7 +227,7 @@ function Layout() {
                   key={v2.id}
                   hidden={v2.id >= 9901}
                   className={classNames('layoutLRowBoxRow', pathAcFu(v2.path) ? 'active' : '')}
-                  onClick={() => pathCutFu(v2.path)}
+                  onClick={() => pathCutFu(v2)}
                 >
                   {v2.name}
                 </div>

+ 28 - 0
后台管理/src/store/action/A1workbench.ts

@@ -0,0 +1,28 @@
+import http from '@/utils/http'
+import { AppDispatch } from '..'
+
+/**
+ * 工作台-设置常用功能
+ */
+export const A1_APIsetStock = (userId: number, permRtf: string): any => {
+  const obj = { permRtf, userId }
+
+  return http.post('cms/bench/perm/save', obj)
+}
+
+/**
+ * 工作台-列表数据
+ */
+export const A1_APIgetlist = (data: any): any => {
+  return async (dispatch: AppDispatch) => {
+    const res = await http.post('cms/bench/order/page', data)
+    if (res.code === 0) {
+      const obj = {
+        list: res.data.records,
+        total: res.data.total
+      }
+
+      dispatch({ type: 'A1/getList', payload: obj })
+    }
+  }
+}

+ 28 - 0
后台管理/src/store/reducer/A1workbench.ts

@@ -0,0 +1,28 @@
+import { B1listType } from '@/pages/B1ledger/data'
+
+// 初始化状态
+const initState = {
+  // 列表数据
+  tableInfo: {
+    list: [] as B1listType[],
+    total: 0
+  }
+}
+
+// 定义 action 类型
+type Props = {
+  type: 'A1/getList'
+  payload: { list: B1listType[]; total: number }
+}
+
+// reducer
+export default function userReducer(state = initState, action: Props) {
+  switch (action.type) {
+    // 获取列表数据
+    case 'A1/getList':
+      return { ...state, tableInfo: action.payload }
+
+    default:
+      return state
+  }
+}

+ 2 - 0
后台管理/src/store/reducer/index.ts

@@ -3,6 +3,7 @@ import { combineReducers } from 'redux'
 
 // 导入 登录 模块的 reducer
 import A0Layout from './layout'
+import A1workbench from './A1workbench'
 import A2statistics from './A2statistics'
 import B1ledger from './B1ledger'
 import B2register from './B2register'
@@ -21,6 +22,7 @@ import Z2log from './Z2log'
 // 合并 reducer
 const rootReducer = combineReducers({
   A0Layout,
+  A1workbench,
   A2statistics,
   B1ledger,
   B2register,

+ 9 - 2
后台管理/src/store/reducer/layout.ts

@@ -1,4 +1,4 @@
-import { LookDomType } from '@/types'
+import { LookDomType, RouterTypeRow } from '@/types'
 import { MessageType } from '@/utils/message'
 
 // 初始化状态
@@ -26,7 +26,10 @@ const initState = {
     state: false
   },
   // 页面权限id集合
-  authorityIds: [] as number[]
+  authorityIds: [] as number[],
+
+  // 用户工作台常用功能
+  userRolePermissions: [] as RouterTypeRow[]
 }
 
 // 定义 action 类型
@@ -35,6 +38,7 @@ type LayoutActionType =
   | { type: 'layout/lookDom'; payload: LookDomType }
   | { type: 'layout/message'; payload: MessageType }
   | { type: 'layout/authorityIds'; payload: number[] }
+  | { type: 'layout/userRolePermissions'; payload: RouterTypeRow[] }
   | {
       type: 'layout/closeUpFile'
       payload: {
@@ -62,6 +66,9 @@ export default function layoutReducer(state = initState, action: LayoutActionTyp
     // 页面权限id集合
     case 'layout/authorityIds':
       return { ...state, authorityIds: action.payload }
+    // 用户工作台常用功能
+    case 'layout/userRolePermissions':
+      return { ...state, userRolePermissions: action.payload }
 
     default:
       return state

+ 3 - 2
后台管理/src/types/api/layot.d.ts

@@ -11,12 +11,13 @@ export type RouterTypeRow = {
   pathLast?: string
   Com: React.LazyExoticComponent<React.MemoExoticComponent<() => JSX.Element>>
   pageType?: string
-}[]
+  authority?: boolean
+}
 
 export type RouterType = {
   id: number
   name: string
-  son: RouterTypeRow
+  son: RouterTypeRow[]
 }[]
 
 export type FileImgListType = {

+ 2 - 2
后台管理/src/utils/http.ts

@@ -7,8 +7,8 @@ import { domShowFu } from './domShow'
 
 export const envFlag = process.env.NODE_ENV === 'development'
 
-// const baseUrlTemp = 'xxxxxxxxx' // 测试环境
-const baseUrlTemp = 'http://192.168.20.61:8107' // 线下环境
+const baseUrlTemp = 'https://sit-jiningbwg.4dage.com' // 测试环境
+// const baseUrlTemp = 'http://192.168.20.61:8107' // 线下环境
 
 const baseFlag = baseUrlTemp.includes('https://')
 

+ 26 - 0
后台管理/src/utils/storage.ts

@@ -1,5 +1,7 @@
 // ------------------------------------token的本地存储------------------------------------
 
+import { RouterTypeRow } from '@/types'
+
 // 用户 Token 的本地缓存键名,自己定义
 const TOKEN_KEY = 'JILINGGOODS_HOUTAI_USETINFO'
 
@@ -38,3 +40,27 @@ export const hasToken = (): boolean => {
 export const getTokenFu = (): string => {
   return getTokenInfo().token
 }
+
+// --------------------业务中心-常用功能存储
+const CHANG_KEY = 'JILINGGOODS_HT_CHANG_ARR'
+
+// 存
+export const changSetFu = (info: RouterTypeRow): void => {
+  const oldArr = changGetFu()
+
+  let newArr: RouterTypeRow[] = []
+
+  // 已经存在了
+  const oldIds = oldArr.map(v => v.id)
+  if (oldIds.includes(info.id)) newArr = oldArr
+  else {
+    if (oldArr.length <= 2) newArr = [...oldArr, info]
+    else newArr = [...oldArr.slice(-2), info]
+  }
+
+  localStorage.setItem(CHANG_KEY, JSON.stringify(newArr))
+}
+// 取
+export const changGetFu = (): RouterTypeRow[] => {
+  return JSON.parse(localStorage.getItem(CHANG_KEY) || '[]')
+}

+ 6 - 0
后台管理/src/utils/tableData.ts

@@ -57,6 +57,12 @@ export const goodsStorageTableC = [
   ['select', '申请状态', 'status', statusSelect]
 ]
 
+export const A1tableC = [
+  ['txt', '业务编号', 'num'],
+  ['time', '发起日期', 'createTime'],
+  ['select', '申请状态', 'status', statusSelect]
+]
+
 export const B1tableC = [
   ['txt', '藏品编号', 'num'],
   ['txt', '藏品标题', 'name'],