Browse Source

feat: 抽出巡检公用代码,优化成员管理代码逻辑。

lanjianrong 4 years ago
parent
commit
6c56e16438

+ 10 - 4
src/components/Authorization/index.tsx

@@ -1,16 +1,22 @@
 import { tenderStore } from '@/store/mobx'
 import { tenderStore } from '@/store/mobx'
-// import { observer } from 'mobx-react'
-import React, { PropsWithChildren } from 'react'
+import React from 'react'
+import { Redirect } from 'react-router'
 interface Authorization {
 interface Authorization {
   type: 'contract' | 'safe' | 'quality'
   type: 'contract' | 'safe' | 'quality'
   auth: 'access' | 'add' | 'delete'
   auth: 'access' | 'add' | 'delete'
   children: React.ReactNode
   children: React.ReactNode
 }
 }
+
 /** auth的格式化为:delete | add | access */
 /** auth的格式化为:delete | add | access */
-const Index: React.FC<Authorization> = ({ type, auth, children }) => {
+const Authorization: React.FC<Authorization> = ({ type, auth, children }) => {
+
   const authPass = 1
   const authPass = 1
   // 获取store存储的权限
   // 获取store存储的权限
   const permission = tenderStore.permission[type]
   const permission = tenderStore.permission[type]
+  // 根本没有权限进入标段
+  if (!permission.access) {
+    return <Redirect to="/"></Redirect>
+  }
   if (permission[auth] === authPass) {
   if (permission[auth] === authPass) {
     return <>{children}</>
     return <>{children}</>
   }
   }
@@ -18,4 +24,4 @@ const Index: React.FC<Authorization> = ({ type, auth, children }) => {
 }
 }
 
 
 
 
-export default Index
+export default Authorization

+ 151 - 120
src/pages/Contract/Content/Income/components/Modal/index.tsx

@@ -1,3 +1,4 @@
+import Authorization from '@/components/Authorization'
 import DatePicker from '@/components/DatePicker'
 import DatePicker from '@/components/DatePicker'
 import { apiAutoCode } from '@/pages/Safe/Content/List/api'
 import { apiAutoCode } from '@/pages/Safe/Content/List/api'
 import { contractReturnStore, tenderStore } from '@/store/mobx'
 import { contractReturnStore, tenderStore } from '@/store/mobx'
@@ -47,17 +48,20 @@ const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible,
     }
     }
   }
   }
 
 
-
   useEffect(() => {
   useEffect(() => {
     if (visible) {
     if (visible) {
       form.setFieldsValue({ treeId: row.id, bidsectionId: row.bidsectionId })
       form.setFieldsValue({ treeId: row.id, bidsectionId: row.bidsectionId })
-      if (type === "update") {
-        const { content="", name="", price="", partyA="", partyB="", partyASigner="",partyBSigner="", signerTime = '', remarks = '' } = contractReturnStore.contract
+      if (type === 'update') {
+        const { content = '', name = '', price = '', partyA = '', partyB = '', partyASigner = '', partyBSigner = '', signerTime = '', remarks = '' } = contractReturnStore.contract
         form.setFieldsValue({ content, name, price, partyA, partyB, partyASigner, partyBSigner, signerTime: dayjs(signerTime), remarks })
         form.setFieldsValue({ content, name, price, partyA, partyB, partyASigner, partyBSigner, signerTime: dayjs(signerTime), remarks })
       } else if (type === 'return') {
       } else if (type === 'return') {
         apiGetReturnWay().then(({ code = -1, data = [] }) => {
         apiGetReturnWay().then(({ code = -1, data = [] }) => {
           if (code === consts.RET_CODE.SUCCESS) {
           if (code === consts.RET_CODE.SUCCESS) {
-            const options = data.map((item: string) => <Option key={item} value={item}>{item}</Option>)
+            const options = data.map((item: string) => (
+              <Option key={item} value={item}>
+                {item}
+              </Option>
+            ))
             setOptions(options)
             setOptions(options)
           }
           }
         })
         })
@@ -68,7 +72,7 @@ const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible,
     }
     }
   }, [ visible ])
   }, [ visible ])
   const autoCodeHandler = async () => {
   const autoCodeHandler = async () => {
-    const { code = -1, data = "" } = await apiAutoCode(tenderStore.tender.bidsectionId, 'contractReturnRule')
+    const { code = -1, data = '' } = await apiAutoCode(tenderStore.tender.bidsectionId, 'contractReturnRule')
     if (code === consts.RET_CODE.SUCCESS) {
     if (code === consts.RET_CODE.SUCCESS) {
       if (data) {
       if (data) {
         const ruleArr: string[] = []
         const ruleArr: string[] = []
@@ -81,7 +85,7 @@ const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible,
             }
             }
           }
           }
         }
         }
-        form.setFieldsValue({ code: ruleArr.join("-") })
+        form.setFieldsValue({ code: ruleArr.join('-') })
       }
       }
     }
     }
   }
   }
@@ -91,50 +95,64 @@ const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible,
       visible={visible}
       visible={visible}
       title={modalObj[type]?.title}
       title={modalObj[type]?.title}
       onCancel={onCancel}
       onCancel={onCancel}
-      footer={<div className="pi-justify-end">
-        {type === 'update' ? <Button type="primary" key="delete" size="small" danger onClick={() => reload('del')}>删除合同</Button> : ''}
-        <Button type="default" size="small" key="cancel" className="pi-btn-secondary" onClick={onCancel}>{modalObj[type]?.cancelText}</Button>
-        <Button
-          type="primary"
-          size="small"
-          key="ok"
-          loading={confirmLoading}
-          danger={type === 'del'}
-          onClick={() => {
-            form.validateFields().then(values => {
-              form.resetFields()
-              if (type === 'update') {
-                values.signerTime = dayjsFormat(values.signerTime, 'YYYY-MM-DD HH:mm:ss')
-              }
-              if (type === 'del') {
-                delete values.warningText
-              }
-              if (type === 'return') {
-                values.time = dayjsFormat(values.time, 'YYYY-MM-DD HH:mm:ss')
-              }
-              onConfirm(values, type)
-            }).catch(info => {
-              console.error('Validate Failed:', info)
-            })
-          }}>{modalObj[type]?.okText}</Button>
-      </div>}
-    >
-      <Form
-        form={form}
-        layout='vertical'
-        style={type === 'update' ? { maxHeight: '482px', overflowY: 'scroll', paddingRight: 5 } : { overflow: 'hidden' }}
-        >
+      footer={
+        <div className="pi-justify-end">
+          {type === 'update' ? (
+            <Authorization type="contract" auth="delete">
+              <Button type="primary" key="delete" size="small" danger onClick={() => reload('del')}>
+                删除合同
+              </Button>
+            </Authorization>
+          ) : null}
+          <Button type="default" size="small" key="cancel" className="pi-btn-secondary" onClick={onCancel}>
+            {modalObj[type]?.cancelText}
+          </Button>
+          <Button
+            type="primary"
+            size="small"
+            key="ok"
+            loading={confirmLoading}
+            danger={type === 'del'}
+            onClick={() => {
+              form
+                .validateFields()
+                .then(values => {
+                  form.resetFields()
+                  if (type === 'update') {
+                    values.signerTime = dayjsFormat(values.signerTime, 'YYYY-MM-DD HH:mm:ss')
+                  }
+                  if (type === 'del') {
+                    delete values.warningText
+                  }
+                  if (type === 'return') {
+                    values.time = dayjsFormat(values.time, 'YYYY-MM-DD HH:mm:ss')
+                  }
+                  onConfirm(values, type)
+                })
+                .catch(info => {
+                  console.error('Validate Failed:', info)
+                })
+            }}>
+            {modalObj[type]?.okText}
+          </Button>
+        </div>
+      }>
+      <Form form={form} layout="vertical" style={type === 'update' ? { maxHeight: '482px', overflowY: 'scroll', paddingRight: 5 } : { overflow: 'hidden' }}>
         <Form.Item name="bidsectionId" hidden>
         <Form.Item name="bidsectionId" hidden>
           <Input></Input>
           <Input></Input>
         </Form.Item>
         </Form.Item>
         <Form.Item name="treeId" label="合同劳务" hidden>
         <Form.Item name="treeId" label="合同劳务" hidden>
           <Input></Input>
           <Input></Input>
         </Form.Item>
         </Form.Item>
-        {
-          type === 'create' ? (
+        {type === 'create' ? (
           <>
           <>
             <Form.Item name="code" label="合同编号" rules={[ { required: true, message: '请输入合同编号' } ]} className={styles.contractFormItem}>
             <Form.Item name="code" label="合同编号" rules={[ { required: true, message: '请输入合同编号' } ]} className={styles.contractFormItem}>
-              <Input addonAfter={<span className="pi-pd-lr-11" onClick={() => autoCodeHandler()}>自动编号</span>}></Input>
+              <Input
+                addonAfter={
+                  <span className="pi-pd-lr-11" onClick={() => autoCodeHandler()}>
+                    自动编号
+                  </span>
+                }></Input>
             </Form.Item>
             </Form.Item>
             <Form.Item name="name" label="合同名称" rules={[ { required: true, message: '请输入合同名称' } ]}>
             <Form.Item name="name" label="合同名称" rules={[ { required: true, message: '请输入合同名称' } ]}>
               <Input placeholder="输入合同名称"></Input>
               <Input placeholder="输入合同名称"></Input>
@@ -149,80 +167,94 @@ const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible,
               <Input type="number" placeholder="输入合同金额" addonAfter={<span>元</span>}></Input>
               <Input type="number" placeholder="输入合同金额" addonAfter={<span>元</span>}></Input>
             </Form.Item>
             </Form.Item>
           </>
           </>
-          ) : ''
-        }
-        {
-          type === 'update' ? (
-            <>
-              <Form.Item name="content" label="项目内容" rules={[ { required: true, message: '请输入项目内容' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="name" label="合同名称" rules={[ { required: true, message: '请输入项目内容' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="price" label="合同金额" rules={[ { required: true, message: '请输入项目金额' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="partyA" label="甲方" rules={[ { required: true, message: '请输入甲方' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="partyASigner" label="甲方签约人" rules={[ { required: true, message: '请输入甲方签约人' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="partyB" label="乙方" rules={[ { required: true, message: '请输入乙方' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="partyBSigner" label="乙方签约人" rules={[ { required: true, message: '请输入乙方签约人' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="signerTime" label="合同签约日期" rules={[ { required: true, message: '请选择签约日期' } ]}>
-                <DatePicker allowClear locale={locale} className="pi-width-100P"></DatePicker>
-              </Form.Item>
-              <Form.Item name="remarks" label="备注">
-                <Input.TextArea maxLength={100}></Input.TextArea >
-              </Form.Item>
-            </>
-          ) : ''
-        }
-        {
-          type === 'close' ? (
-            <>
-              <Form.Item name="id" hidden><Input></Input></Form.Item>
-              <span>关闭后,合同将锁定,无法进行编辑、上传文件等操作。</span>
-            </>
-          ) : ''
-        }
-        {
-          type === 'unlock' ? (
-            <>
-              <Form.Item name="id" hidden><Input></Input></Form.Item>
-              <span>解锁后,合同将锁定,无法进行编辑、上传文件等操作。</span>
-            </>
-          ) : ''
-        }
-        {
-          type === "del" ? (
-            <>
-              <Form.Item name="id" hidden><Input></Input></Form.Item>
-              <p className="mb-2">删除后,数据无法恢复,请谨慎操作。</p>
-              <p className="mb-2">请在下方文本框输入文本「<span className="pi-red">确认删除本合同</span>」,以此确认删除操作。</p>
-              <Form.Item name="warningText"rules={[ () => ({
-                validator(rule, value) {
-                  if (!value || value !== "确认删除本合同") {
-                    return Promise.reject("请按照提示信息进行删除操作!")
+        ) : (
+          ''
+        )}
+        {type === 'update' ? (
+          <>
+            <Form.Item name="content" label="项目内容" rules={[ { required: true, message: '请输入项目内容' } ]}>
+              <Input></Input>
+            </Form.Item>
+            <Form.Item name="name" label="合同名称" rules={[ { required: true, message: '请输入项目内容' } ]}>
+              <Input></Input>
+            </Form.Item>
+            <Form.Item name="price" label="合同金额" rules={[ { required: true, message: '请输入项目金额' } ]}>
+              <Input></Input>
+            </Form.Item>
+            <Form.Item name="partyA" label="甲方" rules={[ { required: true, message: '请输入甲方' } ]}>
+              <Input></Input>
+            </Form.Item>
+            <Form.Item name="partyASigner" label="甲方签约人" rules={[ { required: true, message: '请输入甲方签约人' } ]}>
+              <Input></Input>
+            </Form.Item>
+            <Form.Item name="partyB" label="乙方" rules={[ { required: true, message: '请输入乙方' } ]}>
+              <Input></Input>
+            </Form.Item>
+            <Form.Item name="partyBSigner" label="乙方签约人" rules={[ { required: true, message: '请输入乙方签约人' } ]}>
+              <Input></Input>
+            </Form.Item>
+            <Form.Item name="signerTime" label="合同签约日期" rules={[ { required: true, message: '请选择签约日期' } ]}>
+              <DatePicker allowClear locale={locale} className="pi-width-100P"></DatePicker>
+            </Form.Item>
+            <Form.Item name="remarks" label="备注">
+              <Input.TextArea maxLength={100}></Input.TextArea>
+            </Form.Item>
+          </>
+        ) : (
+          ''
+        )}
+        {type === 'close' ? (
+          <>
+            <Form.Item name="id" hidden>
+              <Input></Input>
+            </Form.Item>
+            <span>关闭后,合同将锁定,无法进行编辑、上传文件等操作。</span>
+          </>
+        ) : (
+          ''
+        )}
+        {type === 'unlock' ? (
+          <>
+            <Form.Item name="id" hidden>
+              <Input></Input>
+            </Form.Item>
+            <span>解锁后,合同将锁定,无法进行编辑、上传文件等操作。</span>
+          </>
+        ) : (
+          ''
+        )}
+        {type === 'del' ? (
+          <>
+            <Form.Item name="id" hidden>
+              <Input></Input>
+            </Form.Item>
+            <p className="mb-2">删除后,数据无法恢复,请谨慎操作。</p>
+            <p className="mb-2">
+              请在下方文本框输入文本「<span className="pi-red">确认删除本合同</span>」,以此确认删除操作。
+            </p>
+            <Form.Item
+              name="warningText"
+              rules={[
+                () => ({
+                  validator(rule, value) {
+                    if (!value || value !== '确认删除本合同') {
+                      return Promise.reject('请按照提示信息进行删除操作!')
+                    }
+                    return Promise.resolve()
                   }
                   }
-                  return Promise.resolve()
-                }
-              }) ]}>
-                <Input placeholder="输入文本, 确认删除"></Input>
-              </Form.Item>
-            </>
-          ) : ''
-        }
-        {
-          type === 'return' ?
+                })
+              ]}>
+              <Input placeholder="输入文本, 确认删除"></Input>
+            </Form.Item>
+          </>
+        ) : (
+          ''
+        )}
+        {type === 'return' ? (
           <>
           <>
-            <Form.Item name="contractsId" hidden><Input></Input></Form.Item>
+            <Form.Item name="contractsId" hidden>
+              <Input></Input>
+            </Form.Item>
             <Form.Item name="time" label="回款日期" rules={[ { required: true, message: '请选择回款日期' } ]}>
             <Form.Item name="time" label="回款日期" rules={[ { required: true, message: '请选择回款日期' } ]}>
               <DatePicker allowClear locale={locale} className="pi-width-100P"></DatePicker>
               <DatePicker allowClear locale={locale} className="pi-width-100P"></DatePicker>
             </Form.Item>
             </Form.Item>
@@ -230,16 +262,15 @@ const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible,
               <Input></Input>
               <Input></Input>
             </Form.Item>
             </Form.Item>
             <Form.Item name="way" label="支付方式" rules={[ { required: true, message: '请选择回款方式' } ]}>
             <Form.Item name="way" label="支付方式" rules={[ { required: true, message: '请选择回款方式' } ]}>
-              <Select>
-                {options}
-              </Select>
+              <Select>{options}</Select>
             </Form.Item>
             </Form.Item>
             <Form.Item name="remarks" label="备注">
             <Form.Item name="remarks" label="备注">
-                <Input.TextArea maxLength={100}></Input.TextArea >
+              <Input.TextArea maxLength={100}></Input.TextArea>
             </Form.Item>
             </Form.Item>
           </>
           </>
-          : ''
-        }
+        ) : (
+          ''
+        )}
       </Form>
       </Form>
     </Modal>
     </Modal>
   )
   )

+ 6 - 6
src/pages/Contract/Content/Income/components/TableContent/index.tsx

@@ -19,13 +19,13 @@ import File from '../Tabs/File'
 import Receivable from '../Tabs/Receivable'
 import Receivable from '../Tabs/Receivable'
 import styles from './index.module.scss'
 import styles from './index.module.scss'
 interface iTableContentPorps {
 interface iTableContentPorps {
-  modalHandler: (type: string) => void
+  changeModalType: (type: string) => void
   row: iIncomeTree
   row: iIncomeTree
   setRow: (record: iIncomeTree) => void
   setRow: (record: iIncomeTree) => void
 }
 }
 
 
 
 
-const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) => {
+const GCsheet: React.FC<iTableContentPorps> = ({ changeModalType, row, setRow }) => {
   const [ sectionTemplate, setSectionTemplate ] = useState<iShowTemplateState>({
   const [ sectionTemplate, setSectionTemplate ] = useState<iShowTemplateState>({
     isShow: false,
     isShow: false,
     template: '',
     template: '',
@@ -363,20 +363,20 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
             {
             {
               contractReturnStore.contract.id && contractReturnStore.contract.status === contractConsts.status.checking ?
               contractReturnStore.contract.id && contractReturnStore.contract.status === contractConsts.status.checking ?
               <>
               <>
-                <Button type="primary" size="small" onClick={() => modalHandler('update')} className="pi-mg-right-5">编辑合同</Button>
-                <Button type="primary" size="small" onClick={() => modalHandler('return')} className="pi-mg-right-5">添加回款</Button>
+                <Button type="primary" size="small" onClick={() => changeModalType('update')} className="pi-mg-right-5">编辑合同</Button>
+                <Button type="primary" size="small" onClick={() => changeModalType('return')} className="pi-mg-right-5">添加回款</Button>
                 <Button type="primary" size="small" onClick={() => setVisible(true)}>上传文件</Button>
                 <Button type="primary" size="small" onClick={() => setVisible(true)}>上传文件</Button>
               </>
               </>
               : ''
               : ''
             }
             }
             {
             {
               contractReturnStore.contract.id && contractReturnStore.contract.status === contractConsts.status.willClose ?
               contractReturnStore.contract.id && contractReturnStore.contract.status === contractConsts.status.willClose ?
-              <Button type="primary" size="small" danger className="pi-mg-right-3" onClick={() => modalHandler('close')}>关闭合同</Button>
+              <Button type="primary" size="small" danger className="pi-mg-right-3" onClick={() => changeModalType('close')}>关闭合同</Button>
               : ''
               : ''
             }
             }
             {
             {
               contractReturnStore.contract.id && contractReturnStore.contract.status === contractConsts.status.closed ?
               contractReturnStore.contract.id && contractReturnStore.contract.status === contractConsts.status.closed ?
-              <ZhSubmitButton type="primary" size="small" danger className="pi-mg-right-3" onClick={() => modalHandler('unlock')}>解锁合同</ZhSubmitButton>
+              <ZhSubmitButton type="primary" size="small" danger className="pi-mg-right-3" onClick={() => changeModalType('unlock')}>解锁合同</ZhSubmitButton>
               : ''
               : ''
             }
             }
           </div>
           </div>

+ 11 - 7
src/pages/Contract/Content/Income/index.tsx

@@ -12,6 +12,7 @@ import React, { useMemo, useState } from 'react'
 import { apiResfulContract, apiResfulContractTree } from './api'
 import { apiResfulContract, apiResfulContractTree } from './api'
 import ContractModal from './components/Modal'
 import ContractModal from './components/Modal'
 import TableContent from './components/TableContent'
 import TableContent from './components/TableContent'
+import Authorization from '@/components/Authorization'
 
 
 interface iModal {
 interface iModal {
   visible: boolean
   visible: boolean
@@ -73,7 +74,7 @@ export default function Income() {
       confirmLoading: false
       confirmLoading: false
     })
     })
   }
   }
-  const modalHandler = (type: string) => {
+  const changeModalType = (type: string) => {
     setModalObj({
     setModalObj({
       ...modalObj,
       ...modalObj,
       visible: true,
       visible: true,
@@ -103,15 +104,15 @@ export default function Income() {
   }
   }
 
 
   // 切换到删除合同弹窗
   // 切换到删除合同弹窗
-  const reloadHandler = (type: string) => {
+  const handleReload = (type: string) => {
     setModalObj({ ...modalObj, visible: false })
     setModalObj({ ...modalObj, visible: false })
     setTimeout(() => {
     setTimeout(() => {
       setModalObj({ ...modalObj, visible: true, type })
       setModalObj({ ...modalObj, visible: true, type })
     }, 300)
     }, 300)
   }
   }
-  const showCBtn = useMemo(() => {
+  const showCBtn = () => {
     return !row.children && !row.contractCode && row.id
     return !row.children && !row.contractCode && row.id
-  }, [ row ])
+  }
 
 
   return (
   return (
     <div className="wrap-contaniner">
     <div className="wrap-contaniner">
@@ -171,12 +172,15 @@ export default function Income() {
         <Slot position="right">
         <Slot position="right">
           <Button type="ghost" size="small" icon={<SvgIcon type="xxh-cog" />} className="pi-mg-right-3" style={{ color: '#007bff' }} onClick={() => setRuleModal({ ...ruleModal, visible: true })}>设置</Button>
           <Button type="ghost" size="small" icon={<SvgIcon type="xxh-cog" />} className="pi-mg-right-3" style={{ color: '#007bff' }} onClick={() => setRuleModal({ ...ruleModal, visible: true })}>设置</Button>
           {
           {
-            showCBtn ? <Button type="primary" size="small" onClick={() => setModalObj({ ...modalObj, type: 'create', visible: true })}>新建收入合同</Button>
+            showCBtn ?
+            <Authorization type="contract" auth="add">
+              <Button type="primary" size="small" onClick={() => setModalObj({ ...modalObj, type: 'create', visible: true })}>新建收入合同</Button>
+            </Authorization>
             : ""
             : ""
           }
           }
         </Slot>
         </Slot>
       </Header>
       </Header>
-      <TableContent modalHandler={modalHandler} row={row} setRow={(record: iIncomeTree) => setRow({ ...row, ...record })}></TableContent>
+      <TableContent changeModalType={changeModalType} row={row} setRow={(record: iIncomeTree) => setRow({ ...row, ...record })}></TableContent>
       <RuleModal
       <RuleModal
         type={consts.RULE.CONTRACT_RETURN}
         type={consts.RULE.CONTRACT_RETURN}
         title="合同管理编号设置"
         title="合同管理编号设置"
@@ -185,7 +189,7 @@ export default function Income() {
         loading={ruleModal.loading}
         loading={ruleModal.loading}
         onCancel={() => setRuleModal({ ...ruleModal, visible: false })}
         onCancel={() => setRuleModal({ ...ruleModal, visible: false })}
       ></RuleModal>
       ></RuleModal>
-      <ContractModal row={row} modalObj={modalObj} onConfirm={onCreate} onCancel={ () => setModalObj({ ...modalObj, visible: false })} reload={(type) => reloadHandler(type)}></ContractModal>
+      <ContractModal row={row} modalObj={modalObj} onConfirm={onCreate} onCancel={ () => setModalObj({ ...modalObj, visible: false })} reload={(type) => handleReload(type)}></ContractModal>
     </div>
     </div>
   )
   )
 }
 }

+ 0 - 13
src/pages/Contract/Content/Spending/components/Modal/index.module.scss

@@ -1,13 +0,0 @@
-.contractFormItem {
-  :global(.ant-input-group-addon) {
-    padding: 0;
-    &:hover {
-      color: #ffffff;
-      background-color: #6c757d;
-      border-color: #6c757d;
-    }
-    &:not(:disabled) {
-      cursor: pointer;
-    }
-  }
-}

+ 0 - 248
src/pages/Contract/Content/Spending/components/Modal/index.tsx

@@ -1,248 +0,0 @@
-import DatePicker from '@/components/DatePicker'
-import { apiAutoCode } from '@/pages/Safe/Content/List/api'
-import { contractPaidStore, tenderStore } from '@/store/mobx'
-import { iModalCommonProps } from '@/types/contract'
-import consts from '@/utils/consts'
-import { dayjsFormat } from '@/utils/util'
-import { Button, Form, Input, Modal, Select } from 'antd'
-import locale from 'antd/es/date-picker/locale/zh_CN'
-import dayjs from 'dayjs'
-import React, { useEffect, useState } from 'react'
-import { apiGetPaidWay } from '../Tabs/Receivable/api'
-import styles from './index.module.scss'
-const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible, confirmLoading }, onConfirm, onCancel, reload, row }) => {
-  const { Option } = Select
-  const [ form ] = Form.useForm()
-  const [ options, setOptions ] = useState<string[]>([])
-  const modalObj = {
-    create: {
-      title: '新建合同',
-      cancelText: '取消',
-      okText: '确认添加'
-    },
-    update: {
-      title: '编辑合同',
-      cancelText: '取消',
-      okText: '确认'
-    },
-    close: {
-      title: '关闭合同',
-      cancelText: '取消',
-      okText: '确认关闭'
-    },
-    del: {
-      title: '删除合同',
-      cancelText: '取消',
-      okText: '确认删除'
-    },
-    unlock: {
-      title: '解锁合同',
-      cancelText: '取消',
-      okText: '确认解锁'
-    },
-    paid: {
-      title: '添加支出',
-      cancelText: '关闭',
-      okText: '确认'
-    }
-  }
-
-
-  useEffect(() => {
-    if (visible) {
-      form.setFieldsValue({ treeId: row.id, bidsectionId: row.bidsectionId })
-      if (type === "update") {
-        const { content="", name="", price="", partyA="", partyB="", partyASigner="",partyBSigner="", signerTime = '', remarks = '' } = contractPaidStore.contract
-        form.setFieldsValue({ content, name, price, partyA, partyB, partyASigner, partyBSigner, signerTime: dayjs(signerTime), remarks })
-      } else if (type === 'paid') {
-        apiGetPaidWay().then(({ code = -1, data = [] }) => {
-          if (code === consts.RET_CODE.SUCCESS) {
-            const options = data.map((item: string) => <Option key={item} value={item}>{item}</Option>)
-            setOptions(options)
-          }
-        })
-        form.setFieldsValue({ contractsId: contractPaidStore.contract.id })
-      } else {
-        form.setFieldsValue({ id: contractPaidStore.contract.id })
-      }
-    }
-  }, [ visible ])
-  const autoCodeHandler = async () => {
-    const { code = -1, data = "" } = await apiAutoCode(tenderStore.tender.bidsectionId, 'contractPaidRule')
-    if (code === consts.RET_CODE.SUCCESS) {
-      if (data) {
-        const ruleArr: string[] = []
-        const code = JSON.parse(data)
-        for (const key in code) {
-          if (Object.prototype.hasOwnProperty.call(code, key)) {
-            const element = code[key]
-            if (element) {
-              ruleArr.push(element)
-            }
-          }
-        }
-        form.setFieldsValue({ code: ruleArr.join("-") })
-      }
-    }
-  }
-  return (
-    <Modal
-      getContainer={false}
-      visible={visible}
-      title={modalObj[type]?.title}
-      onCancel={onCancel}
-      footer={<div className="pi-justify-end">
-        {type === 'update' ? <Button type="primary" key="delete" size="small" danger onClick={() => reload('del')}>删除合同</Button> : ''}
-        <Button type="default" size="small" key="cancel" className="pi-btn-secondary" onClick={onCancel}>{modalObj[type]?.cancelText}</Button>
-        <Button
-          type="primary"
-          size="small"
-          key="ok"
-          loading={confirmLoading}
-          danger={type === 'del'}
-          onClick={() => {
-            form.validateFields().then(values => {
-              form.resetFields()
-              if (type === 'update') {
-                values.signerTime = dayjsFormat(values.signerTime, 'YYYY-MM-DD HH:mm:ss')
-              }
-              if (type === 'del') {
-                delete values.warningText
-              }
-              if (type === 'paid') {
-                values.time = dayjsFormat(values.time, 'YYYY-MM-DD HH:mm:ss')
-              }
-              onConfirm(values, type)
-            }).catch(info => {
-              console.error('Validate Failed:', info)
-            })
-          }}>{modalObj[type]?.okText}</Button>
-      </div>}
-    >
-      <Form
-        form={form}
-        layout='vertical'
-        style={type === 'update' ? { maxHeight: '482px', overflowY: 'scroll', paddingRight: 5 } : { overflow: 'hidden' }}
-        >
-        <Form.Item name="bidsectionId" hidden>
-          <Input></Input>
-        </Form.Item>
-        <Form.Item name="treeId" label="合同劳务" hidden>
-          <Input></Input>
-        </Form.Item>
-        {
-          type === 'create' ? (
-          <>
-            <Form.Item name="code" label="合同编号" rules={[ { required: true, message: '请输入合同编号' } ]} className={styles.contractFormItem}>
-              <Input addonAfter={<span className="pi-pd-lr-11" onClick={() => autoCodeHandler()}>自动编号</span>}></Input>
-            </Form.Item>
-            <Form.Item name="name" label="合同名称" rules={[ { required: true, message: '请输入合同名称' } ]}>
-              <Input placeholder="输入合同名称"></Input>
-            </Form.Item>
-            {/* <Form.Item name="contractsType" label="合同类型" rules={[ { required: true, message: '请选择合同类型' } ]}>
-              <Select showSearch>
-                <Option value={1}>支出合同</Option>
-                <Option value={2}>收入合同</Option>
-              </Select>
-            </Form.Item> */}
-            <Form.Item name="price" label="合同金额" rules={[ { required: true, message: '请输入合同金额' } ]}>
-              <Input placeholder="输入合同金额" addonAfter={<span>元</span>}></Input>
-            </Form.Item>
-          </>
-          ) : ''
-        }
-        {
-          type === 'update' ? (
-            <>
-              <Form.Item name="content" label="项目内容" rules={[ { required: true, message: '请输入项目内容' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="name" label="合同名称" rules={[ { required: true, message: '请输入项目内容' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="price" label="合同金额" rules={[ { required: true, message: '请输入项目金额' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="partyA" label="甲方" rules={[ { required: true, message: '请输入甲方' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="partyASigner" label="甲方签约人" rules={[ { required: true, message: '请输入甲方签约人' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="partyB" label="乙方" rules={[ { required: true, message: '请输入乙方' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="partyBSigner" label="乙方签约人" rules={[ { required: true, message: '请输入乙方签约人' } ]}>
-                <Input></Input>
-              </Form.Item>
-              <Form.Item name="signerTime" label="合同签约日期" rules={[ { required: true, message: '请选择签约日期' } ]}>
-                <DatePicker allowClear locale={locale} className="pi-width-100P"></DatePicker>
-              </Form.Item>
-              <Form.Item name="remarks" label="备注">
-                <Input.TextArea maxLength={100}></Input.TextArea >
-              </Form.Item>
-            </>
-          ) : ''
-        }
-        {
-          type === 'close' ? (
-            <>
-              <Form.Item name="id" hidden><Input></Input></Form.Item>
-              <span>关闭后,合同将锁定,无法进行编辑、上传文件等操作。</span>
-            </>
-          ) : ''
-        }
-        {
-          type === 'unlock' ? (
-            <>
-              <Form.Item name="id" hidden><Input></Input></Form.Item>
-              <span>解锁后,合同将锁定,无法进行编辑、上传文件等操作。</span>
-            </>
-          ) : ''
-        }
-        {
-          type === "del" ? (
-            <>
-              <Form.Item name="id" hidden><Input></Input></Form.Item>
-              <p className="mb-2">删除后,数据无法恢复,请谨慎操作。</p>
-              <p className="mb-2">请在下方文本框输入文本「<span className="pi-red">确认删除本合同</span>」,以此确认删除操作。</p>
-              <Form.Item name="warningText"rules={[ () => ({
-                validator(rule, value) {
-                  if (!value || value !== "确认删除本合同") {
-                    return Promise.reject("请按照提示信息进行删除操作!")
-                  }
-                  return Promise.resolve()
-                }
-              }) ]}>
-                <Input placeholder="输入文本, 确认删除"></Input>
-              </Form.Item>
-            </>
-          ) : ''
-        }
-        {
-          type === 'paid' ?
-          <>
-            <Form.Item name="contractsId" hidden><Input></Input></Form.Item>
-            <Form.Item name="time" label="支出日期" rules={[ { required: true, message: '请选择支出日期' } ]}>
-              <DatePicker allowClear locale={locale} className="pi-width-100P"></DatePicker>
-            </Form.Item>
-            <Form.Item name="price" label="支出金额" rules={[ { required: true, message: '请选择支出金额' } ]}>
-              <Input></Input>
-            </Form.Item>
-            <Form.Item name="way" label="支付方式" rules={[ { required: true, message: '请选择支出方式' } ]}>
-              <Select>
-                {options}
-              </Select>
-            </Form.Item>
-            <Form.Item name="remarks" label="备注">
-                <Input.TextArea maxLength={100}></Input.TextArea >
-            </Form.Item>
-          </>
-          : ''
-        }
-      </Form>
-    </Modal>
-  )
-}
-
-export default ContractModal

src/pages/Contract/Content/Spending/components/Modal/api.ts → src/pages/Contract/Content/Spending/components/TableContent/api.ts


+ 7 - 7
src/pages/Contract/Content/Spending/components/TableContent/index.tsx

@@ -14,19 +14,19 @@ import { observer } from 'mobx-react'
 import React, { KeyboardEvent, useEffect, useRef, useState } from 'react'
 import React, { KeyboardEvent, useEffect, useRef, useState } from 'react'
 import { apiSetTemplate } from '../../../Income/components/Modal/api'
 import { apiSetTemplate } from '../../../Income/components/Modal/api'
 import { apiGetExpenditure, apiResfulContractTree, apiUpdateName, apiUpdateSerial } from '../../api'
 import { apiGetExpenditure, apiResfulContractTree, apiUpdateName, apiUpdateSerial } from '../../api'
-import { apiContractExpenditure } from '../Modal/api'
+import { apiContractExpenditure } from './api'
 import Detail from '../Tabs/Detail'
 import Detail from '../Tabs/Detail'
 import File from '../Tabs/File'
 import File from '../Tabs/File'
 import Receivable from '../Tabs/Receivable'
 import Receivable from '../Tabs/Receivable'
 import styles from './index.module.scss'
 import styles from './index.module.scss'
 interface iTableContentPorps {
 interface iTableContentPorps {
-  modalHandler: (type: string) => void
+  changeModalType: (type: string) => void
   row: iIncomeTree
   row: iIncomeTree
   setRow: (record: iIncomeTree) => void
   setRow: (record: iIncomeTree) => void
 }
 }
 
 
 
 
-const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) => {
+const GCsheet: React.FC<iTableContentPorps> = ({ changeModalType, row, setRow }) => {
   const [ sectionTemplate, setSectionTemplate ] = useState<iShowTemplateState>({
   const [ sectionTemplate, setSectionTemplate ] = useState<iShowTemplateState>({
     isShow: false,
     isShow: false,
     template: '',
     template: '',
@@ -364,20 +364,20 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
             {
             {
               contractPaidStore.contract.id && contractPaidStore.contract.status === contractConsts.status.checking ?
               contractPaidStore.contract.id && contractPaidStore.contract.status === contractConsts.status.checking ?
               <>
               <>
-                <Button type="primary" size="small" onClick={() => modalHandler('update')} className="pi-mg-right-5">编辑合同</Button>
-                <Button type="primary" size="small" onClick={() => modalHandler('return')} className="pi-mg-right-5">添加支出</Button>
+                <Button type="primary" size="small" onClick={() => changeModalType('update')} className="pi-mg-right-5">编辑合同</Button>
+                <Button type="primary" size="small" onClick={() => changeModalType('return')} className="pi-mg-right-5">添加支出</Button>
                 <Button type="primary" size="small" onClick={() => setVisible(true)}>上传文件</Button>
                 <Button type="primary" size="small" onClick={() => setVisible(true)}>上传文件</Button>
               </>
               </>
               : ''
               : ''
             }
             }
             {
             {
               contractPaidStore.contract.id && contractPaidStore.contract.status === contractConsts.status.willClose ?
               contractPaidStore.contract.id && contractPaidStore.contract.status === contractConsts.status.willClose ?
-              <Button type="primary" size="small" danger className="pi-mg-right-3" onClick={() => modalHandler('close')}>关闭合同</Button>
+              <Button type="primary" size="small" danger className="pi-mg-right-3" onClick={() => changeModalType('close')}>关闭合同</Button>
               : ''
               : ''
             }
             }
             {
             {
               contractPaidStore.contract.id && contractPaidStore.contract.status === contractConsts.status.closed ?
               contractPaidStore.contract.id && contractPaidStore.contract.status === contractConsts.status.closed ?
-              <ZhSubmitButton type="primary" size="small" danger className="pi-mg-right-3" onClick={() => modalHandler('unlock')}>解锁合同</ZhSubmitButton>
+              <ZhSubmitButton type="primary" size="small" danger className="pi-mg-right-3" onClick={() => changeModalType('unlock')}>解锁合同</ZhSubmitButton>
               : ''
               : ''
             }
             }
           </div>
           </div>

+ 13 - 9
src/pages/Contract/Content/Spending/index.tsx

@@ -1,3 +1,4 @@
+import Authorization from '@/components/Authorization'
 import Header from '@/components/Header'
 import Header from '@/components/Header'
 import Slot from '@/components/Header/slot'
 import Slot from '@/components/Header/slot'
 import RuleModal from '@/components/RuleModal'
 import RuleModal from '@/components/RuleModal'
@@ -8,9 +9,9 @@ import { iIncomeTree, iModalBooleanProps } from '@/types/contract'
 import { contractTreeBaseId } from '@/utils/common/constStatus'
 import { contractTreeBaseId } from '@/utils/common/constStatus'
 import consts from '@/utils/consts'
 import consts from '@/utils/consts'
 import { Button, message, Tooltip } from 'antd'
 import { Button, message, Tooltip } from 'antd'
-import React, { useMemo, useState } from 'react'
+import React, { useState } from 'react'
 import { apiResfulContract, apiResfulContractTree } from './api'
 import { apiResfulContract, apiResfulContractTree } from './api'
-import ContractModal from './components/Modal'
+import ContractModal from '@/pages/Contract/Content/Income/components/Modal'
 import TableContent from './components/TableContent'
 import TableContent from './components/TableContent'
 
 
 interface iModal {
 interface iModal {
@@ -73,7 +74,7 @@ export default function Expenditure() {
       confirmLoading: false
       confirmLoading: false
     })
     })
   }
   }
-  const modalHandler = (type: string) => {
+  const changeModalType = (type: string) => {
     setModalObj({
     setModalObj({
       ...modalObj,
       ...modalObj,
       visible: true,
       visible: true,
@@ -103,15 +104,15 @@ export default function Expenditure() {
   }
   }
 
 
   // 切换到删除合同弹窗
   // 切换到删除合同弹窗
-  const reloadHandler = (type: string) => {
+  const toggleReloadModal = (type: string) => {
     setModalObj({ ...modalObj, visible: false })
     setModalObj({ ...modalObj, visible: false })
     setTimeout(() => {
     setTimeout(() => {
       setModalObj({ ...modalObj, visible: true, type })
       setModalObj({ ...modalObj, visible: true, type })
     }, 300)
     }, 300)
   }
   }
-  const showCBtn = useMemo(() => {
+  const showCBtn = () => {
     return !row.children && !row.contractCode && row.id
     return !row.children && !row.contractCode && row.id
-  }, [ row ])
+  }
 
 
   return (
   return (
     <div className="wrap-contaniner">
     <div className="wrap-contaniner">
@@ -171,12 +172,15 @@ export default function Expenditure() {
         <Slot position="right">
         <Slot position="right">
           <Button type="ghost" size="small" icon={<SvgIcon type="xxh-cog" />} className="pi-mg-right-3" style={{ color: '#007bff' }} onClick={() => setRuleModal({ ...ruleModal, visible: true })}>设置</Button>
           <Button type="ghost" size="small" icon={<SvgIcon type="xxh-cog" />} className="pi-mg-right-3" style={{ color: '#007bff' }} onClick={() => setRuleModal({ ...ruleModal, visible: true })}>设置</Button>
           {
           {
-            showCBtn ? <Button type="primary" size="small" onClick={() => setModalObj({ ...modalObj, type: 'create', visible: true })}>新建支出合同</Button>
+            showCBtn ?
+            <Authorization type="contract" auth="add">
+              <Button type="primary" size="small" onClick={() => setModalObj({ ...modalObj, type: 'create', visible: true })}>新建支出合同</Button>
+            </Authorization>
             : ""
             : ""
           }
           }
         </Slot>
         </Slot>
       </Header>
       </Header>
-      <TableContent modalHandler={modalHandler} row={row} setRow={(record: iIncomeTree) => setRow({ ...row, ...record })}></TableContent>
+      <TableContent changeModalType={changeModalType} row={row} setRow={(record: iIncomeTree) => setRow({ ...row, ...record })}></TableContent>
       <RuleModal
       <RuleModal
         type={consts.RULE.CONTRACT_PAID}
         type={consts.RULE.CONTRACT_PAID}
         title="合同管理编号设置"
         title="合同管理编号设置"
@@ -185,7 +189,7 @@ export default function Expenditure() {
         loading={ruleModal.loading}
         loading={ruleModal.loading}
         onCancel={() => setRuleModal({ ...ruleModal, visible: false })}
         onCancel={() => setRuleModal({ ...ruleModal, visible: false })}
       ></RuleModal>
       ></RuleModal>
-      <ContractModal row={row} modalObj={modalObj} onConfirm={onCreate} onCancel={ () => setModalObj({ ...modalObj, visible: false })} reload={(type) => reloadHandler(type)}></ContractModal>
+      <ContractModal row={row} modalObj={modalObj} onConfirm={onCreate} onCancel={ () => setModalObj({ ...modalObj, visible: false })} reload={(type) => toggleReloadModal(type)}></ContractModal>
     </div>
     </div>
   )
   )
 }
 }

+ 3 - 6
src/pages/Contract/List/index.tsx

@@ -35,12 +35,9 @@ const List: React.FC<RouteComponentProps> = props => {
   const [ tree, setTree ] = useContractTree()
   const [ tree, setTree ] = useContractTree()
   const [ expandedRowKeys, setRowKeys ] = useTableExpand(tree)
   const [ expandedRowKeys, setRowKeys ] = useTableExpand(tree)
 
 
-  const handleLinkClick = (id: string, name: string) => {
-    tenderStore.saveTenderInfo({ bidsectionId: id, name })
-    const hasPermission = handleIntoBidsection("contract")
-    if (hasPermission) {
-      props.history.push('/console/contract/content/summary')
-    }
+  const handleLinkClick = async (id: string, name: string) => {
+    await tenderStore.saveTenderInfo({ bidsectionId: id, name })
+    handleIntoBidsection("contract")
   }
   }
 
 
   const columns: ColumnsType<ContractTree> = [
   const columns: ColumnsType<ContractTree> = [

+ 0 - 2
src/pages/Management/Tender/List/components/ModalForm.tsx

@@ -80,8 +80,6 @@ const ModalForm: React.FC<iModalFormProps> = ({
       setShowNameInput(false)
       setShowNameInput(false)
     } else {
     } else {
       setShowNameInput(true)
       setShowNameInput(true)
-      console.log(111)
-
       form.setFieldsValue({ depth: type === 'root' ? -1 : 0 })
       form.setFieldsValue({ depth: type === 'root' ? -1 : 0 })
     }
     }
   }, [ type, id ])
   }, [ type, id ])

+ 7 - 8
src/pages/Management/Tender/Member/index.tsx

@@ -10,7 +10,7 @@ import consts from '@/utils/consts'
 import { Button, Input, message, Popover, Table } from 'antd'
 import { Button, Input, message, Popover, Table } from 'antd'
 import { ColumnsType } from 'antd/lib/table'
 import { ColumnsType } from 'antd/lib/table'
 import { observer } from 'mobx-react'
 import { observer } from 'mobx-react'
-import React, { useState, useEffect, ChangeEvent, useMemo } from 'react'
+import React, { useState, useEffect, ChangeEvent, useMemo, useCallback } from 'react'
 import { useActivate } from 'react-activation'
 import { useActivate } from 'react-activation'
 import { RouteComponentProps } from 'react-router'
 import { RouteComponentProps } from 'react-router'
 import { apiCreateBidAccount, apiDelBidAccount, apiGetSettingAccount, apiUpdateBidAccountAuth } from './api'
 import { apiCreateBidAccount, apiDelBidAccount, apiGetSettingAccount, apiUpdateBidAccountAuth } from './api'
@@ -109,13 +109,13 @@ const Member: React.FC<RouteComponentProps> = props => {
           const perm = permission[key]
           const perm = permission[key]
           switch (key) {
           switch (key) {
             case 'access':
             case 'access':
-              perm && (textNode += '<span>创建</span>')
+              perm && (textNode += '<span>查看所有</span>')
               break
               break
             case 'add':
             case 'add':
-              perm && (textNode += '<span>删除</span>')
+              perm && (textNode += '<span>创建</span>')
               break
               break
             case 'delete':
             case 'delete':
-              perm && (textNode += '<span>查看所有</span>')
+              perm && (textNode += '<span>删除</span>')
               break
               break
             default:
             default:
               break
               break
@@ -204,8 +204,7 @@ const Member: React.FC<RouteComponentProps> = props => {
       initGroupList()
       initGroupList()
     }
     }
   }
   }
-
-  const permissionData = useMemo(() => {
+  const calcPermissionData = () => {
     const permissionArr: iPermissionData[] = []
     const permissionArr: iPermissionData[] = []
     if (state.permissionModal.visible) {
     if (state.permissionModal.visible) {
       for (const key in state.permissionModal.permissionObj) {
       for (const key in state.permissionModal.permissionObj) {
@@ -238,7 +237,7 @@ const Member: React.FC<RouteComponentProps> = props => {
       }
       }
     }
     }
     return { permissionArr, visible: state.permissionModal.visible, loading: state.permissionModal.loading }
     return { permissionArr, visible: state.permissionModal.visible, loading: state.permissionModal.loading }
-  }, [ state.permissionModal ])
+  }
 
 
   const itemSelectHandler = async (item: iUserInfo) => {
   const itemSelectHandler = async (item: iUserInfo) => {
     const { code = -1 } = await apiCreateBidAccount(id, item.id)
     const { code = -1 } = await apiCreateBidAccount(id, item.id)
@@ -299,7 +298,7 @@ const Member: React.FC<RouteComponentProps> = props => {
           pagination={{ size: 'small' }}
           pagination={{ size: 'small' }}
           bordered></Table>
           bordered></Table>
       </div>
       </div>
-      <PermissionModal data={permissionData} onCreate={onModalConfirm} onCancel={onModalCancel}></PermissionModal>
+      <PermissionModal data={calcPermissionData()} onCreate={onModalConfirm} onCancel={onModalCancel}></PermissionModal>
     </div>
     </div>
   )
   )
 }
 }

+ 18 - 10
src/pages/Management/Tender/Member/modal.tsx

@@ -4,24 +4,32 @@ import { Button, Checkbox, Form, Modal, Table } from 'antd'
 import { CheckboxOptionType } from 'antd/lib/checkbox'
 import { CheckboxOptionType } from 'antd/lib/checkbox'
 import { Store } from 'antd/lib/form/interface'
 import { Store } from 'antd/lib/form/interface'
 import { ColumnsType } from 'antd/lib/table'
 import { ColumnsType } from 'antd/lib/table'
-import React, { memo } from 'react'
+import React, { memo, useEffect } from 'react'
 
 
+interface iPermissionDataProps {
+  permissionArr: iPermissionData[]
+  visible: boolean
+  loading: boolean
+}
 interface iPermissionSettingProps {
 interface iPermissionSettingProps {
   onCreate: (values: Store) => void
   onCreate: (values: Store) => void
   onCancel: () => void
   onCancel: () => void
-  data: {
-    permissionArr: iPermissionData[]
-    visible: boolean
-    loading: boolean
-  }
+  data: iPermissionDataProps
 }
 }
 const PermissionSettingModal: React.FC<iPermissionSettingProps> = ({ onCreate, onCancel, data: { permissionArr, visible, loading } }) => {
 const PermissionSettingModal: React.FC<iPermissionSettingProps> = ({ onCreate, onCancel, data: { permissionArr, visible, loading } }) => {
+  const [ form ] = Form.useForm()
+  useEffect(() => {
+    if (visible) {
+      permissionArr.forEach(item => {
+        form.setFieldsValue({ [item.type]: item.permissions })
+      })
+    }
+  }, [ visible ])
   const checkboxOptions: CheckboxOptionType[] = [
   const checkboxOptions: CheckboxOptionType[] = [
+    { label: '查看', value: 'access' },
     { label: '创建', value: 'add' },
     { label: '创建', value: 'add' },
-    { label: '删除', value: 'delete' },
-    { label: '查看', value: 'access' }
+    { label: '删除', value: 'delete' }
   ]
   ]
-  const [ form ] = Form.useForm()
   const columns: ColumnsType<iPermissionData> = [
   const columns: ColumnsType<iPermissionData> = [
     {
     {
       title: '栏目',
       title: '栏目',
@@ -36,7 +44,7 @@ const PermissionSettingModal: React.FC<iPermissionSettingProps> = ({ onCreate, o
       // eslint-disable-next-line react/display-name
       // eslint-disable-next-line react/display-name
       render: (_, record) => {
       render: (_, record) => {
         return (
         return (
-          <Form.Item key={record.type} name={record.type} initialValue={record.permissions}>
+          <Form.Item key={record.type} name={record.type}>
             <Checkbox.Group options={checkboxOptions}></Checkbox.Group>
             <Checkbox.Group options={checkboxOptions}></Checkbox.Group>
           </Form.Item>
           </Form.Item>
         )
         )

+ 5 - 7
src/pages/Quality/List/index.tsx

@@ -1,7 +1,7 @@
 import Header from '@/components/Header'
 import Header from '@/components/Header'
 import Slot from '@/components/Header/slot'
 import Slot from '@/components/Header/slot'
 import SvgIcon from '@/components/SvgIcon'
 import SvgIcon from '@/components/SvgIcon'
-import { tenderStore } from '@/store/mobx'
+import { tenderStore, userStore } from '@/store/mobx'
 import { ContractTree } from '@/types/contract'
 import { ContractTree } from '@/types/contract'
 import { apiContractList } from '@/utils/common/api'
 import { apiContractList } from '@/utils/common/api'
 import { useContractTree, useTableExpand } from '@/utils/common/customHooks'
 import { useContractTree, useTableExpand } from '@/utils/common/customHooks'
@@ -34,12 +34,10 @@ const List: React.FC<RouteComponentProps> = props => {
     }
     }
   }
   }
 
 
-  const handleLinkClick = (id: string, name: string) => {
-    tenderStore.saveTenderInfo({ bidsectionId: id, name })
-    const hasPermission = handleIntoBidsection("quality")
-    if (hasPermission) {
-      props.history.push('/console/quality/content/summary')
-    }
+  const handleLinkClick = async (id: string, name: string) => {
+    await tenderStore.saveTenderInfo({ bidsectionId: id, name })
+    handleIntoBidsection("quality")
+
   }
   }
   const columns: ColumnsType<ContractTree> = [
   const columns: ColumnsType<ContractTree> = [
     {
     {

+ 3 - 6
src/pages/Safe/List/index.tsx

@@ -33,12 +33,9 @@ const List: React.FC<RouteComponentProps> = props => {
   const [ tree, setTree ] = useContractTree()
   const [ tree, setTree ] = useContractTree()
   const [ expandedRowKeys, setRowKeys ] = useTableExpand(tree)
   const [ expandedRowKeys, setRowKeys ] = useTableExpand(tree)
 
 
-  const handleLinkClick = (id: string, name: string) => {
-    tenderStore.saveTenderInfo({ bidsectionId: id, name })
-    const hasPermission = handleIntoBidsection("safe")
-    if (hasPermission) {
-      props.history.push('/console/safe/content/summary')
-    }
+  const handleLinkClick = async (id: string, name: string) => {
+    await tenderStore.saveTenderInfo({ bidsectionId: id, name })
+    handleIntoBidsection("safe")
   }
   }
   const columns: ColumnsType<ContractTree> = [
   const columns: ColumnsType<ContractTree> = [
     {
     {

+ 1 - 1
src/store/mobx/contractPaid/index.ts

@@ -1,4 +1,4 @@
-import { apiContractExpenditure } from "@/pages/Contract/Content/Spending/components/Modal/api"
+import { apiContractExpenditure } from "@/pages/Contract/Content/Spending/components/TableContent/api"
 import { iContractState, iIncomeTree } from "@/types/contract"
 import { iContractState, iIncomeTree } from "@/types/contract"
 import consts from "@/utils/consts"
 import consts from "@/utils/consts"
 import { action, computed, observable } from "mobx"
 import { action, computed, observable } from "mobx"

+ 23 - 30
src/store/mobx/tender/index.ts

@@ -7,57 +7,41 @@ import { action, computed, observable } from "mobx"
 interface iTenderState {
 interface iTenderState {
   bidsectionId: string
   bidsectionId: string
   name: string
   name: string
+  permission: AuthState
 }
 }
 
 
-interface ProjectInfo {
-  name: string
-  code: string
-}
-
-interface AuthController {
+interface AuthState {
   contract: iPermission
   contract: iPermission
   quality: iPermission
   quality: iPermission
   safe: iPermission
   safe: iPermission
 }
 }
 class Tender {
 class Tender {
+
   @observable tender:iTenderState = {
   @observable tender:iTenderState = {
     bidsectionId: '',
     bidsectionId: '',
-    name: ''
-  }
-
-  @observable permission:AuthController = {
-    contract: { access: 0, add: 0, delete: 0 },
-    quality: { access: 0, add: 0, delete: 0 },
-    safe: { access: 0, add: 0, delete: 0 }
+    name: '',
+    permission : {
+      contract: { access: 0, add: 0, delete: 0 },
+      quality: { access: 0, add: 0, delete: 0 },
+      safe: { access: 0, add: 0, delete: 0 }
+    }
   }
   }
 
 
-  @action async saveTenderInfo(payload: iTenderState) {
-    const { code = -1, data } = await apiGetPermission(payload.bidsectionId)
+  @action async saveTenderInfo({ bidsectionId, name }: {bidsectionId: string, name: string}) {
+    const { code = -1, data } = await apiGetPermission(bidsectionId)
+    const permissionObj = {} as AuthState
     if (code === consts.RET_CODE.SUCCESS) {
     if (code === consts.RET_CODE.SUCCESS) {
-      const permissionObj = {} as AuthController
       for (const key in data) {
       for (const key in data) {
         if (Object.prototype.hasOwnProperty.call(data, key)) {
         if (Object.prototype.hasOwnProperty.call(data, key)) {
           const permission = data[key] as string
           const permission = data[key] as string
-          console.log(permission)
-          console.log(JSON.parse(permission))
-
           permissionObj[key] = JSON.parse(permission)
           permissionObj[key] = JSON.parse(permission)
         }
         }
       }
       }
-      this.permission = permissionObj
     }
     }
-    this.tender = payload
-    storage.set('tenderInfo', payload)
-
+    this.tender = { bidsectionId, name, permission: permissionObj }
+    storage.set('tenderInfo', this.tender)
   }
   }
 
 
-  @action updatePermission(bid: string) {
-    apiGetPermissionWithBid(bid).then(({ code = -1, data }) => {
-      if (code === consts.RET_CODE.SUCCESS) {
-        this.permission = data
-      }
-    })
-  }
   @computed get bid() {
   @computed get bid() {
     if (!this.tender.bidsectionId) {
     if (!this.tender.bidsectionId) {
       const tender = storage.get('tenderInfo')
       const tender = storage.get('tenderInfo')
@@ -66,6 +50,15 @@ class Tender {
     }
     }
     return this.tender.bidsectionId
     return this.tender.bidsectionId
   }
   }
+
+  @computed get permission(): AuthState {
+    if (!this.tender.bidsectionId) {
+      const tender = storage.get('tenderInfo')
+      this.saveTenderInfo(tender)
+      return tender.permission as AuthState
+    }
+    return this.tender.permission as AuthState
+  }
 }
 }
 
 
 export default new Tender()
 export default new Tender()

+ 7 - 8
src/store/mobx/user/index.ts

@@ -61,14 +61,13 @@ class UserState {
     this.showLeftSide = !this.showLeftSide
     this.showLeftSide = !this.showLeftSide
   }
   }
 
 
-  @action logout() {
-    apiLogout().then(({ code = -1 }) => {
-      if (code === consts.RET_CODE.SUCCESS) {
-        delUserInfo()
-        this.userInfo = this.initUserState
-        history.push('/login')
-      }
-    })
+  @action async logout() {
+    const { code = -1 } = await apiLogout()
+    if (code === consts.RET_CODE.SUCCESS) {
+      await delUserInfo()
+      this.userInfo = this.initUserState
+      history.push('/login')
+    }
   }
   }
 
 
   @action check() {
   @action check() {

+ 5 - 1
src/utils/common/user.ts

@@ -1,9 +1,11 @@
 import { userStore } from '@/store/mobx'
 import { userStore } from '@/store/mobx'
 import { iAccountGroupItem, iGroup, iUserInfo } from '@/types/setting'
 import { iAccountGroupItem, iGroup, iUserInfo } from '@/types/setting'
 import { storage } from '@/utils/util'
 import { storage } from '@/utils/util'
+import { resolve } from 'dns'
 import consts from '../consts'
 import consts from '../consts'
 import { apiGetAccountWithSearch } from './api'
 import { apiGetAccountWithSearch } from './api'
 const USER_INFO = 'user_info' // 用户个人信息
 const USER_INFO = 'user_info' // 用户个人信息
+const TENDER_INFO = 'tender_info' // 标段信息
 /**
 /**
  * 保存用户信息到本地存储中
  * 保存用户信息到本地存储中
  * @param {Object} userInfo - 用户信息
  * @param {Object} userInfo - 用户信息
@@ -23,8 +25,10 @@ export const getUserInfo = (): iUserInfo => {
 /**
 /**
  * 删除用户信息
  * 删除用户信息
  */
  */
-export const delUserInfo = (): void => {
+export const delUserInfo = () => {
+  // 本身是同步的,所以不需要用promise包裹
   storage.del(USER_INFO)
   storage.del(USER_INFO)
+  storage.del(TENDER_INFO)
 }
 }
 
 
 /**
 /**

+ 8 - 7
src/utils/util.ts

@@ -1,6 +1,7 @@
-import { tenderStore } from '@/store/mobx'
+import { tenderStore, userStore } from '@/store/mobx'
 import { message } from 'antd'
 import { message } from 'antd'
 import dayjs from 'dayjs'
 import dayjs from 'dayjs'
+import history from './history'
 
 
 function getCookie(name: string) {
 function getCookie(name: string) {
   const prefix = name + '='
   const prefix = name + '='
@@ -204,17 +205,17 @@ const formatDate = (d: string) => {
 // 数字千分位
 // 数字千分位
 const formatMoney = (num: number | undefined) => {
 const formatMoney = (num: number | undefined) => {
   if (!num) return '0.00'
   if (!num) return '0.00'
-  return (Math.round(num) + '').replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,') + '.00'
+  return (Math.round(num) + '').replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
 }
 }
 
 
 // 控制是否有权限进入标段
 // 控制是否有权限进入标段
-const handleIntoBidsection = (permission_type: 'contract' | 'safe' | 'quality'): boolean => {
-  const permission = !!tenderStore.permission[permission_type].access
-  if (!permission) {
+const handleIntoBidsection = (permission_type: 'contract' | 'safe' | 'quality'): void => {
+  const permission = !!tenderStore.tender.permission[permission_type].access
+  if (permission) {
+    history.push(`/console/${permission_type}/content/summary`)
+  } else {
     message.error('暂无权限进入此标段,请联系管理员!')
     message.error('暂无权限进入此标段,请联系管理员!')
-    return false
   }
   }
-  else return true
 }
 }
 
 
 export { getCookie, storage, throttle, debounce, combinationPath, dayjsFormat, generatePsw, formatDate, formatMoney, handleIntoBidsection }
 export { getCookie, storage, throttle, debounce, combinationPath, dayjsFormat, generatePsw, formatDate, formatMoney, handleIntoBidsection }