瀏覽代碼

feat: 接入收入合同相关接口

lanjianrong 4 年之前
父節點
當前提交
ff0776a3f0

+ 1 - 1
src/components/Navigation/index.tsx

@@ -117,7 +117,7 @@ function LoginHandler(props: { targetRoute: RouteModel, ErrorPage: any }): any {
                     noCache ?
                         <targetRoute.component {...props} routeConfig={targetRoute.childRoutes}></targetRoute.component> :
                         (
-                            <KeepAlive name={path} id={path}>
+                            <KeepAlive id={path}>
                                 <targetRoute.component {...props} routeConfig={targetRoute.childRoutes}></targetRoute.component>
                             </KeepAlive>
                         )

+ 3 - 3
src/components/RuleModal/index.tsx

@@ -75,12 +75,12 @@ const SafeCreateForm: React.FC<iSafeCreateFormProps> = ({
   const [ ruleType, setRuleType ] = useState<string>('3')
   const [ ruleArr, setRuleArr ] = useState<ruleOption[]>([])
   useEffect(() => {
-    form.setFieldsValue({ bidsectionId: tenderStore.bidsectionId })
+    form.setFieldsValue({ bidsectionId: tenderStore.tender.bidsectionId })
   }, [ visible, type ])
   const ruleHandler = () => {
     switch (ruleType) {
       case '0':
-        setRuleArr([ ...ruleArr, { type: 'name', value: tenderStore.name } ])
+        setRuleArr([ ...ruleArr, { type: 'name', value: tenderStore.tender.name } ])
         break
       case '1':
         setRuleArr([ ...ruleArr, { type: 'text', value: form.getFieldValue('ruleText') } ])
@@ -105,7 +105,7 @@ const SafeCreateForm: React.FC<iSafeCreateFormProps> = ({
 
   // 初始化
   const ruleModalIniter = async () => {
-    const { code, data } = await apiGetRule(tenderStore.bidsectionId)
+    const { code, data } = await apiGetRule(tenderStore.tender.bidsectionId)
     if (code === consts.RET_CODE.SUCCESS) {
       if (data[type]) {
         const obj = JSON.parse(data[type])

+ 22 - 0
src/pages/Contract/Content/Income/api.ts

@@ -40,3 +40,25 @@ export async function apiGetIncome(id: string, bidsectionId: string) {
   const { data } = await request.get('/api/contract/income', { id, bidsectionId })
   return data
 }
+
+/**
+ * 修改合同节序号
+ * @param id 项目节id
+ * @param bidsectionId 标段id
+ * @param serial 序号
+ */
+export async function apiUpdateSerial(id: string, bidsectionId: string, serial: string) {
+  const { data } = await request.post('/api/contract/section/serial/update', { id, bidsectionId, serial: parseInt(serial) })
+  return data
+}
+
+/**
+ * 修改合同节名称
+ * @param id 项目节id
+ * @param bidsectionId 标段id
+ * @param name 名称
+ */
+export async function apiUpdateName(id: string, bidsectionId: string, name: string) {
+  const { data } = await request.post('/api/contract/section/save', { id, bidsectionId, name })
+  return data
+}

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

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

+ 46 - 33
src/pages/Contract/Content/Income/components/Modal/index.tsx

@@ -1,12 +1,15 @@
 import DatePicker from '@/components/DatePicker'
+import { apiAutoCode } from '@/pages/Safe/Content/List/api'
+import { tenderStore } from '@/store/mobx'
 import { iModalCommonProps } from '@/types/contract'
-import { Button, Form, Input, InputNumber, message, Modal, Select, Tabs, TreeSelect } from 'antd'
+import consts from '@/utils/consts'
+import { Button, Form, Input, message, Modal, Select, TreeSelect } from 'antd'
 import locale from 'antd/es/date-picker/locale/zh_CN'
-import React from 'react'
-const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible, confirmLoading }, onConfirm, onCancel }) => {
+import React, { useEffect } from 'react'
+import styles from './index.module.scss'
+const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible, confirmLoading }, onConfirm, onCancel, row }) => {
   const { Option } = Select
   const [ form ] = Form.useForm()
-  const { TabPane } = Tabs
   const modalObj = {
     add: {
       title: '新建合同',
@@ -29,6 +32,28 @@ const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible,
       okText: '确认'
     }
   }
+
+  useEffect(() => {
+    visible && (form.setFieldsValue({ treeId: row.id, bidsectionId: row.bidsectionId }))
+  }, [ visible ])
+  const autoCodeHandler = async () => {
+    const { code = -1, data = "" } = await apiAutoCode(tenderStore.tender.bidsectionId, 'contractRule')
+    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}
@@ -48,26 +73,33 @@ const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible,
         }}>{modalObj[type]?.okText}</Button>
     ]}
     >
-      <Form form={form} layout='vertical' style={type === 'edit' ? { maxHeight: '482px', overflowY: 'scroll' } : { overflow: 'hidden' }}>
+      <Form
+        form={form}
+        layout='vertical'
+        style={type === 'edit' ? { maxHeight: '482px', overflowY: 'scroll' } : { overflow: 'hidden' }}
+        >
+        <Form.Item name="bidsectionId" hidden>
+          <Input></Input>
+        </Form.Item>
         {
           type === 'add' ? (
           <>
-            <Form.Item name="id1" label="合同劳务">
-              <TreeSelect></TreeSelect>
+            <Form.Item name="treeId" label="合同劳务" hidden>
+              <Input></Input>
             </Form.Item>
-            <Form.Item name="id2" label="合同编号" rules={[ { required: true, message: '请输入合同编号' } ]}>
-              <Input addonAfter={<span>自动编号</span>}></Input>
+            <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="id3" label="合同名称" rules={[ { required: true, message: '请输入合同名称' } ]}>
+            <Form.Item name="name" label="合同名称" rules={[ { required: true, message: '请输入合同名称' } ]}>
               <Input placeholder="输入合同名称"></Input>
             </Form.Item>
-            <Form.Item name="id4" label="合同类型" rules={[ { required: true, message: '请选择合同类型' } ]}>
+            <Form.Item name="contractsType" label="合同类型" rules={[ { required: true, message: '请选择合同类型' } ]}>
               <Select showSearch>
-                <Option value="0">支出合同</Option>
-                <Option value="1">收入合同</Option>
+                <Option value="1">支出合同</Option>
+                <Option value="2">收入合同</Option>
               </Select>
             </Form.Item>
-            <Form.Item name="id5" label="合同金额" rules={[ { required: true, message: '请输入合同金额' } ]}>
+            <Form.Item name="price" label="合同金额" rules={[ { required: true, message: '请输入合同金额' } ]}>
               <Input placeholder="输入合同金额" addonAfter={<span>元</span>}></Input>
             </Form.Item>
           </>
@@ -117,25 +149,6 @@ const ContractModal: React.FC<iModalCommonProps> = ({ modalObj: { type, visible,
             </>
           ) : ''
         }
-        {
-          type === 'setting' ? (
-            <>
-              <Tabs defaultActiveKey="1" type="card" size="small">
-                <TabPane tab="合同编号规则" key="1">
-                  <Form.Item name="id1" label="添加新规则组件">
-                    <Select size="small"></Select>
-                  </Form.Item>
-                  <Form.Item name="id2" label="自动编号位数">
-                    <InputNumber size="small"></InputNumber>
-                  </Form.Item>
-                  <Form.Item name="id3" label="起始编号">
-                    <Input size="small"></Input>
-                  </Form.Item>
-                </TabPane>
-              </Tabs>
-            </>
-          ) : ''
-        }
       </Form>
     </Modal>
   )

+ 3 - 0
src/pages/Contract/Content/Income/components/TableContent/index.module.scss

@@ -12,6 +12,9 @@
     width: 100%;
     height: 62%;
     overflow: hidden;
+    :global(.ant-input-group-addon) {
+      padding: 0 6px;
+    }
     // :global(.ant-table-tbody > tr > td) {
     //   padding: 0.3rem;
     // }

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

@@ -7,8 +7,8 @@ import Modal from 'antd/lib/modal/Modal'
 import { RadioChangeEvent } from 'antd/lib/radio'
 import { ColumnsType } from 'antd/lib/table'
 import { observer } from 'mobx-react'
-import React, { useEffect, useRef, useState } from 'react'
-import { apiGetIncome, apiResfulContractTree } from '../../api'
+import React, { KeyboardEvent, useEffect, useRef, useState } from 'react'
+import { apiGetIncome, apiResfulContractTree, apiUpdateName, apiUpdateSerial } from '../../api'
 import { apiContractIncome, apiSetTemplate } from '../Modal/api'
 import Detail from '../Tabs/Detail'
 import File from '../Tabs/File'
@@ -93,7 +93,6 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
   useEffect(() => {
     initHandler()
   }, [])
-
   const initHandler = async () => {
     const data  = await apiContractIncome(tenderStore.bid)
     if (data.code === consts.RET_CODE.SUCCESS) {
@@ -120,13 +119,25 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
 
   const newLabelHandler = async (type: string, payload: iLabelHandlerProps) => {
     let RET_CODE: number = -1
-    if (type === 'name') {
+    if (type === 'create') {
       payload.name = inputEl.current?.state.value
       const { code = -1 } = await apiResfulContractTree('add', payload)
       RET_CODE = code
     }
+    if (type === 'edit') {
+      const name = inputEl.current?.state.value
+      const { code = -1 } = await apiUpdateName(payload.id, payload.bidsectionId, name)
+      RET_CODE = code
+    }
     if (RET_CODE === consts.RET_CODE.SUCCESS) {
-      contractStore.resetTree(tenderStore.bidsectionId)
+      contractStore.resetTree(tenderStore.tender.bidsectionId)
+    }
+  }
+
+  const codeChange = async (row: iIncomeTree, value: string) => {
+    const { code = -1 } = await apiUpdateSerial(row.id, row.bidsectionId, value)
+    if (code === consts.RET_CODE.SUCCESS) {
+      initHandler()
     }
   }
   const inputEl = useRef<Input>(null)
@@ -156,7 +167,14 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
       // eslint-disable-next-line react/display-name
       render: (text: string, row: iIncomeTree) => {
         if (row.isEdit) {
-          return <Input value={row.serial} addonBefore={row.attribution} size="small" style={{ width: 30 }}></Input>
+          return (
+          <Input
+            defaultValue={row.serial}
+            addonBefore={row.attribution}
+            size="small"
+            style={{ width: 80 }}
+            onPressEnter={(e: KeyboardEvent<HTMLInputElement>) => codeChange(row, e.currentTarget.value)}
+            />)
         } else {
           return <span>{row.code}</span>
         }
@@ -167,8 +185,17 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
       title: '项目名称',
       dataIndex: 'name',
       render: (text:any, record: iIncomeTree) => {
-        if (record.isEdit) {
-          return <Input defaultValue={record.name} size="small" type="text" ref={inputEl} onPressEnter={() => newLabelHandler('name', { id: record.parentId, bidsectionId: record.bidsectionId })} onBlur={() => newLabelHandler('name', { id: record.parentId, bidsectionId: record.bidsectionId })}></Input>
+        if (record.isEdit || record.isNew) {
+          const type = record.isEdit ? 'edit' : 'create'
+          return (
+          <Input
+            defaultValue={record.name}
+            size="small"
+            type="text"
+            ref={inputEl}
+            onPressEnter={() => newLabelHandler(type, { id: type === 'edit' ? record.id : record.parentId, bidsectionId: record.bidsectionId })}
+            onBlur={() => newLabelHandler(type, { id: type === 'edit' ? record.id : record.parentId, bidsectionId: record.bidsectionId })}
+            />)
         } else {
           return <span>{text}</span>
         }
@@ -218,7 +245,7 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
       })
       return message.error('请选择项目节模板!')
     }
-    const { code = -1 } = await apiSetTemplate(sectionTemplate.template, tenderStore.bidsectionId)
+    const { code = -1 } = await apiSetTemplate(sectionTemplate.template, tenderStore.tender.bidsectionId)
     if (code === consts.RET_CODE.SUCCESS) {
       await initHandler()
     }
@@ -241,10 +268,10 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
   const onClickRow  = (record: iIncomeTree) => {
     return {
       onClick() {
-        setRow(record)
+        rowClickHandler(record.id, record.bidsectionId, record.isEdit)
       },
       onDoubleClick() {
-        rowClickHandler(record.id, record.bidsectionId, record.isEdit)
+        contractStore.rowChange(row.id)
       }
     }
   }
@@ -256,7 +283,6 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
       if (code === consts.RET_CODE.SUCCESS) {
         setRow(section)
         setContract({ ...contract, ...newContract })
-        contractStore.rowChange(id)
       }
     }
   }
@@ -305,7 +331,8 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
         </div>
         <div className={styles.projectTable}>
           {
-            tempalte.template2?.children &&  tempalte.template2?.children.length? <Table
+            tempalte.template2?.children &&  tempalte.template2?.children.length?
+            <Table
             dataSource={tempalte.template2?.children}
             columns={modalColumns}
             bordered
@@ -313,8 +340,8 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
             scroll={{ y: '300px' }}
             rowKey={record => record.id}
             defaultExpandAllRows={true}
-            >
-          </Table> : ''
+            />
+            : ''
           }
 
         </div>
@@ -326,19 +353,19 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
     <div className={styles.spreadSheets}>
       {
         contractStore.showTable ?
-        <Table<iIncomeTree>
-          dataSource={contractStore.tree}
-          columns={TableColumns}
-          bordered
-          pagination={false}
-          rowKey={record => record.id}
-          defaultExpandAllRows={true}
-          onRow={onClickRow}
-          rowClassName={handleRowClass}
-          style={{ height: '100%', overflowY: 'scroll' }}
-        />
-        : ''
-      }
+          <Table<iIncomeTree>
+            dataSource={contractStore.tree}
+            columns={TableColumns}
+            bordered
+            pagination={false}
+            rowKey={record => record.id}
+            defaultExpandAllRows={true}
+            onRow={onClickRow}
+            rowClassName={handleRowClass}
+            style={{ height: '100%', overflowY: 'scroll' }}
+          />
+          : ''
+        }
     </div>
     <div className={styles.extraControl}>
       <Tabs
@@ -347,7 +374,7 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
         defaultActiveKey="1"
         tabBarExtraContent={{ right: <div className="pi-mg-right-5"><Button type="primary" size="small" danger className="pi-mg-right-3" onClick={() => modalHandler('close')}>关闭合同</Button><Button type="primary" size="small" onClick={() => modalHandler('edit')}>编辑合同</Button></div> }}>
         <TabPane key="1" tab="合同详情">
-          <Detail></Detail>
+          <Detail {...contract}></Detail>
         </TabPane>
         <TabPane key="2" tab="合同回款">
           <Receivable></Receivable>

+ 6 - 4
src/pages/Contract/Content/Income/components/Tabs/Detail/index.tsx

@@ -1,13 +1,15 @@
+import { iContractState } from '@/types/contract'
+import { contractConsts } from '@/utils/common/constStatus'
 import React from 'react'
 import styles from './index.module.scss'
-export default function Detail() {
+export default function Detail(props: iContractState) {
   return (
     <div className={styles.detailTab}>
       <table className={styles.detailTable}>
         <tbody>
-          <tr><th style={{ width: '10%' }}>项目内容</th><td style={{ width: '40%' }}>1.2.2 碎石</td><th style={{ width: '10%' }}>合同名称</th><td style={{ width: '40%' }}>台州湾大桥及接线工程TS15标碎石供应合同</td></tr>
-          <tr><th>合同编号</th><td>CD03-CL-2015-118</td><th>状态</th><td><i className="pi-circle-yellow"></i> 履行中</td></tr>
-          <tr><th>合同金额</th><td>6,557,000.00 </td><th>创建时间</th><td>2020-08-02 14:23 </td></tr>
+  <tr><th style={{ width: '10%' }}>项目内容</th><td style={{ width: '40%' }}>{props.content}</td><th style={{ width: '10%' }}>合同名称</th><td style={{ width: '40%' }}>{props.name}</td></tr>
+  <tr><th>合同编号</th><td>{props.code}</td><th>状态</th><td><i className={contractConsts[props.status].class}></i>{contractConsts[props.status].text}</td></tr>
+  <tr><th>合同金额</th><td>{props.price}</td><th>创建时间</th><td>{props.createTime}</td></tr>
           <tr><th>回款金额</th><td>3,787,300.07</td><th>未回款金额</th><td>2,769,700.00</td></tr>
           <tr><th>回款进度</th><td className={styles.progressContainer} colSpan={3}><div className={styles.progressContent}>
             <div className={[ styles.progressBar, 'pi-bg-success' ].join(' ')} style={{ width: '57.7%' }} >57.7%</div>

+ 43 - 5
src/pages/Contract/Content/Income/index.tsx

@@ -1,17 +1,24 @@
 import Header from '@/components/Header'
 import Slot from '@/components/Header/slot'
+import RuleModal from '@/components/RuleModal'
 import SvgIcon from '@/components/SvgIcon'
+import { apiSaveRule } from '@/pages/Safe/Content/List/api'
 import { contractStore, tenderStore } from '@/store/mobx'
 import { iIncomeTree, iModalBooleanProps } from '@/types/contract'
 import { contractTreeBaseId } from '@/utils/common/constStatus'
 import consts from '@/utils/consts'
 import { SettingOutlined } from '@ant-design/icons'
-import { Button, Tooltip } from 'antd'
+import { Button, message, Tooltip } from 'antd'
 import React, { useState } from 'react'
 import { apiResfulContractTree } from './api'
 import ContractModal from './components/Modal'
 import TableContent from './components/TableContent'
 
+interface iModal {
+  visible: boolean
+  loading: boolean
+}
+
 export default function Income() {
   const [ modalObj, setModalObj ] = useState<iModalBooleanProps>({
     type: '',
@@ -43,7 +50,10 @@ export default function Income() {
     serial: 0,
     templateNumber: 0
   })
-
+  const [ ruleModal, setRuleModal ] = useState<iModal>({
+    visible: false,
+    loading: false
+  })
   const onCreate = async (value: any, type: any) => {
     setModalObj({
       ...modalObj,
@@ -71,11 +81,31 @@ export default function Income() {
     if (type === 'add') {
       return contractStore.addRowTree(payload.id)
     }
-    const { code } = await apiResfulContractTree(type, payload)
+    const { code = -1, section = {} } = await apiResfulContractTree(type, payload)
     if ( code === consts.RET_CODE.SUCCESS) {
       contractStore.resetTree(tenderStore.bid)
+      if (type !== 'add' && type !== 'del') {
+        setRow({ ...row, ...section })
+      }
     }
+    // if (type !== 'add' && type !== 'del') {
+    //   const { code = -1, section = {} } = await apiGetIncome(row.id, row.bidsectionId)
+    //   if (code === consts.RET_CODE.SUCCESS) {
+    //     setRow({ ...row, ...section })
+    //   }
+
+    // }
   }
+
+  const onRuleCreate = async (ruleValue: any) => {
+    setRuleModal({ ...ruleModal, loading: true })
+    const { code = -1 } = await apiSaveRule({ bidsectionId: tenderStore.bid, type: 'contract_rule', rule: ruleValue })
+    if (code === consts.RET_CODE.SUCCESS) {
+      message.success("规则更改成功!")
+    }
+    setRuleModal({ ...ruleModal, loading: false, visible: false })
+  }
+
   return (
     <div className="wrap-contaniner">
       <Header title="维护项目节:">
@@ -133,12 +163,20 @@ export default function Income() {
           </div>
         </Slot>
         <Slot position="right">
-          <Button type="ghost" size="small" icon={<SettingOutlined />} className="pi-mg-right-3" style={{ color: '#007bff' }} onClick={() => setModalObj({ ...modalObj, type: 'setting', visible: true })}>设置</Button>
+          <Button type="ghost" size="small" icon={<SettingOutlined />} className="pi-mg-right-3" style={{ color: '#007bff' }} onClick={() => setRuleModal({ ...ruleModal, visible: true })}>设置</Button>
           <Button type="primary" size="small" onClick={() => setModalObj({ ...modalObj, type: 'add', visible: true })}>新建收入合同</Button>
         </Slot>
       </Header>
       <TableContent modalHandler={modalHandler} row={row} setRow={(record: iIncomeTree) => setRow({ ...row, ...record })}></TableContent>
-      <ContractModal modalObj={modalObj} onConfirm={onCreate} onCancel={ () => setModalObj({ ...modalObj, visible: false })}></ContractModal>
+      <RuleModal
+        type={consts.RULE.CONTRACT}
+        title="合同管理编号设置"
+        visible={ruleModal.visible}
+        onCreate={onRuleCreate}
+        loading={ruleModal.loading}
+        onCancel={() => setRuleModal({ ...ruleModal, visible: false })}
+      ></RuleModal>
+      <ContractModal row={row} modalObj={modalObj} onConfirm={onCreate} onCancel={ () => setModalObj({ ...modalObj, visible: false })}></ContractModal>
     </div>
   )
 }

+ 1 - 4
src/pages/Contract/List/index.tsx

@@ -49,10 +49,7 @@ const List: React.FC<RouteComponentProps> = (props) => {
   }
 
   const linkHandler = (id: string, name: string) => {
-    // dropScope(/^\/console\/contract\//)
-    // console.log(getCachingNodes())
-    tenderStore.saveBidsectionId(id)
-    tenderStore.saveName(name)
+    tenderStore.saveTenderInfo({ bidsectionId: id, name })
     props.history.push('/console/contract/content/summary')
   }
 

+ 2 - 2
src/pages/Quality/Content/List/modal.tsx

@@ -21,7 +21,7 @@ const SafeCreateForm: React.FC<iSafeCreateFormProps> = ({
 }) => {
   const [ form ] = Form.useForm()
   const autoCodeHandler = async () => {
-    const { code = -1, data = "" } = await apiAutoCode(tenderStore.bidsectionId, 'safeRule')
+    const { code = -1, data = "" } = await apiAutoCode(tenderStore.tender.bidsectionId, 'safeRule')
     if (code === consts.RET_CODE.SUCCESS) {
       if (data) {
         const ruleArr: string[] = []
@@ -40,7 +40,7 @@ const SafeCreateForm: React.FC<iSafeCreateFormProps> = ({
   }
   useEffect(() => {
     if (visible) {
-      form.setFieldsValue({ bidsectionId: tenderStore.bidsectionId })
+      form.setFieldsValue({ bidsectionId: tenderStore.tender.bidsectionId })
     }
 
   }, [ visible ])

+ 2 - 2
src/pages/Quality/List/index.tsx

@@ -47,8 +47,8 @@ const List: React.FC<RouteComponentProps> = (props) => {
   }
 
   const linkHandler = (id: string, name: string) => {
-    tenderStore.saveBidsectionId(id)
-    tenderStore.saveName(name)
+    tenderStore.saveTenderInfo({ bidsectionId: id, name })
+    // tenderStore.saveName(name)
     props.history.push('/console/safe/content/summary')
     // 清除所有的缓存页面
     // console.log(getCachingNodes())

+ 2 - 2
src/pages/Safe/Content/List/modal.tsx

@@ -21,7 +21,7 @@ const SafeCreateForm: React.FC<iSafeCreateFormProps> = ({
 }) => {
   const [ form ] = Form.useForm()
   const autoCodeHandler = async () => {
-    const { code = -1, data = "" } = await apiAutoCode(tenderStore.bidsectionId, 'safeRule')
+    const { code = -1, data = "" } = await apiAutoCode(tenderStore.tender.bidsectionId, 'safeRule')
     if (code === consts.RET_CODE.SUCCESS) {
       if (data) {
         const ruleArr: string[] = []
@@ -40,7 +40,7 @@ const SafeCreateForm: React.FC<iSafeCreateFormProps> = ({
   }
   useEffect(() => {
     if (visible) {
-      form.setFieldsValue({ bidsectionId: tenderStore.bidsectionId })
+      form.setFieldsValue({ bidsectionId: tenderStore.tender.bidsectionId })
     }
 
   }, [ visible ])

+ 4 - 4
src/pages/Safe/List/index.tsx

@@ -16,6 +16,8 @@ import './index.scss'
 const List: React.FC<RouteComponentProps> = (props) => {
   const { clear } = useAliveController()
   useEffect(() => {
+    // 清除所有的缓存页面
+    clear()
     getTree()
   }, [])
   const [ tree, setTree ] = useState({
@@ -47,11 +49,9 @@ const List: React.FC<RouteComponentProps> = (props) => {
   }
 
   const linkHandler = (id: string, name: string) => {
-    tenderStore.saveBidsectionId(id)
-    tenderStore.saveName(name)
+    tenderStore.saveTenderInfo({ bidsectionId: id, name })
+    // tenderStore.saveName(name)
     props.history.push('/console/safe/content/summary')
-    // 清除所有的缓存页面
-    clear()
   }
   const columns:ColumnsType<ContractTree> = [
     {

+ 3 - 3
src/store/mobx/contract/index.ts

@@ -29,7 +29,7 @@ const initData = [ {
 } ]
 class Contract {
 
-  @observable tree: iIncomeTree[] = initData
+  @observable tree: iIncomeTree[] = []
 
   @action updateTree(tree: iIncomeTree[]) {
     this.tree = tree
@@ -64,9 +64,9 @@ function lookupNode(id: string, tree: iIncomeTree[]) {
     item.isEdit = false
     if (item.id === id) {
       if (Array.isArray(item.children)) {
-        item.children.push({ ...initData[0], isEdit: true, code: item.code + `-${item.children.length + 1 }`, parentId: item.id, bidsectionId: item.bidsectionId })
+        item.children.push({ ...initData[0], isNew: true, code: item.code + `-${item.children.length + 1 }`, parentId: item.id, bidsectionId: item.bidsectionId, attribution: item.code + '-', serial: 1 })
       } else {
-        item.children = [ { ...initData[0], isEdit: true, code: item.code + '-1', parentId: item.id, bidsectionId: item.bidsectionId } ]
+        item.children = [ { ...initData[0], isNew: true, code: item.code + '-1', parentId: item.id, bidsectionId: item.bidsectionId, attribution: item.code + '-', serial: 1 } ]
       }
       return item
     } else if(item.children && item.children.length) {

+ 16 - 13
src/store/mobx/tender/index.ts

@@ -1,26 +1,29 @@
 import { storage } from "@/utils/util"
 import { action, computed, observable } from "mobx"
 
+interface iTenderState {
+  bidsectionId: string
+  name: string
+}
 class Tender {
-  @observable bidsectionId:string = ''
-  @observable name:string = ''
+  @observable tender:iTenderState = {
+    bidsectionId: '',
+    name: ''
+  }
 
-  @action saveBidsectionId(id: string) {
-    this.bidsectionId = id
-    storage.set('bid', id)
+  @action saveTenderInfo(payload: iTenderState) {
+    this.tender = payload
+    storage.set('tenderInfo', payload)
 
   }
-  @action saveName(id: string) {
-    this.name = id
-  }
 
   @computed get bid() {
-    if (!this.bidsectionId) {
-      const bid = storage.get('bid')
-      this.saveBidsectionId(bid)
-      return bid
+    if (!this.tender.bidsectionId) {
+      const tender = storage.get('tenderInfo')
+      this.saveTenderInfo(tender)
+      return tender.bidsectionId
     }
-    return this.bidsectionId
+    return this.tender.bidsectionId
   }
 }
 

+ 2 - 0
src/types/contract.d.ts

@@ -45,6 +45,7 @@ export interface iIncomeTree {
   serial: number;
   templateNumber: number;
   isEdit?: boolean;
+  isNew?: boolean
 }
 export interface iModalBooleanProps {
   type : string
@@ -55,6 +56,7 @@ export interface iModalCommonProps {
   modalObj: iModalBooleanProps
   onConfirm: (values: any, type: string) => void
   onCancel: () => void
+  row: iIncomeTree
 }
 
 export interface iContractState {