Browse Source

test: 行点击测试用例

lanjianrong 4 years ago
parent
commit
0a259b6e5e

+ 15 - 1
src/pages/Contract/Content/Income/api.ts

@@ -1,6 +1,10 @@
 import request from '@/utils/common/request'
 import request from '@/utils/common/request'
 
 
-
+/**
+ * 标段升降、上下移、增删
+ * @param type - 操作类型
+ * @param payload - 载荷
+ */
 export async function apiResfulContractTree(type: string, payload: object) {
 export async function apiResfulContractTree(type: string, payload: object) {
   let url: string = '', method: string = ''
   let url: string = '', method: string = ''
   switch (type) {
   switch (type) {
@@ -26,3 +30,13 @@ export async function apiResfulContractTree(type: string, payload: object) {
   const { data } = await request[method](url, payload)
   const { data } = await request[method](url, payload)
   return data
   return data
 }
 }
+
+/**
+ * 获取单个合同详情和项目节详情
+ * @param id - 项目节id
+ * @param bidsectionId - 标段id
+ */
+export async function apiGetIncome(id: string, bidsectionId: string) {
+  const { data } = await request.get('/api/contract/income', { id, bidsectionId })
+  return data
+}

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

@@ -1,5 +1,5 @@
 import { contractStore, tenderStore } from '@/store/mobx'
 import { contractStore, tenderStore } from '@/store/mobx'
-import { iIncomeTree } from '@/types/contract'
+import { iContractState, iIncomeTree } from '@/types/contract'
 import { contractConsts } from '@/utils/common/constStatus'
 import { contractConsts } from '@/utils/common/constStatus'
 import consts from '@/utils/consts'
 import consts from '@/utils/consts'
 import { Button, Input, message, Radio, Table, Tabs } from 'antd'
 import { Button, Input, message, Radio, Table, Tabs } from 'antd'
@@ -8,7 +8,7 @@ import { RadioChangeEvent } from 'antd/lib/radio'
 import { ColumnsType } from 'antd/lib/table'
 import { ColumnsType } from 'antd/lib/table'
 import { observer } from 'mobx-react'
 import { observer } from 'mobx-react'
 import React, { useEffect, useRef, useState } from 'react'
 import React, { useEffect, useRef, useState } from 'react'
-import { apiResfulContractTree } from '../../api'
+import { apiGetIncome, apiResfulContractTree } from '../../api'
 import { apiContractIncome, apiSetTemplate } from '../Modal/api'
 import { apiContractIncome, apiSetTemplate } from '../Modal/api'
 import Detail from '../Tabs/Detail'
 import Detail from '../Tabs/Detail'
 import File from '../Tabs/File'
 import File from '../Tabs/File'
@@ -66,6 +66,28 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
       serial: ''
       serial: ''
     }
     }
   })
   })
+  const [ contract, setContract ] = useState<iContractState>({
+    bidsectionId: "",
+    code: "",
+    content: "",
+    contractsType: 0,
+    createTime: "",
+    id: "",
+    name: "",
+    paid: "",
+    partyA: "",
+    partyASigner: "",
+    partyB: "",
+    partyBSigner: "",
+    price: "",
+    projectId: "",
+    remarks: "",
+    returned: "",
+    signerTime: "",
+    status: 0,
+    treeId: "",
+    updateTime: ""
+  })
   const { TabPane } = Tabs
   const { TabPane } = Tabs
 
 
   useEffect(() => {
   useEffect(() => {
@@ -73,7 +95,7 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
   }, [])
   }, [])
 
 
   const initHandler = async () => {
   const initHandler = async () => {
-    const data  = await apiContractIncome(tenderStore.bidsectionId)
+    const data  = await apiContractIncome(tenderStore.bid)
     if (data.code === consts.RET_CODE.SUCCESS) {
     if (data.code === consts.RET_CODE.SUCCESS) {
       if (data.isTemplate && data.isTemplate === 1) {
       if (data.isTemplate && data.isTemplate === 1) {
         setSectionTemplate({
         setSectionTemplate({
@@ -107,10 +129,6 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
       contractStore.resetTree(tenderStore.bidsectionId)
       contractStore.resetTree(tenderStore.bidsectionId)
     }
     }
   }
   }
-  // const codeEditHandler = (event: KeyboardEvent) => {
-    // event.persist()
-    // console.log(event.currentTarget.getAttribute('value'))
-  // }
   const inputEl = useRef<Input>(null)
   const inputEl = useRef<Input>(null)
   const modalColumns: ColumnsType<iTemplateState> = [
   const modalColumns: ColumnsType<iTemplateState> = [
     {
     {
@@ -136,14 +154,21 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
       dataIndex: 'code',
       dataIndex: 'code',
       width: '15%',
       width: '15%',
       // eslint-disable-next-line react/display-name
       // eslint-disable-next-line react/display-name
-      render: (text: string, row: iIncomeTree) => <span>{row.code}</span>
+      render: (text: string, row: iIncomeTree) => {
+        // if (row.isEdit) {
+        //   return <Input value={row.serial} addonBefore={row.attribution} size="small"></Input>
+        // } else {
+        //   return <span>{row.code}</span>
+        // }
+        return <span>{row.code}</span>
+      }
     },
     },
     {
     {
       title: '项目名称',
       title: '项目名称',
       dataIndex: 'name',
       dataIndex: 'name',
       render: (text:any, record: iIncomeTree) => {
       render: (text:any, record: iIncomeTree) => {
         if (record.isEdit) {
         if (record.isEdit) {
-          return <Input 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>
+          return <Input value={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>
         } else {
         } else {
           return <span>{text}</span>
           return <span>{text}</span>
         }
         }
@@ -210,7 +235,21 @@ const GCsheet: React.FC<iTableContentPorps> = ({ modalHandler, row, setRow }) =>
   const onClickRow  = (record: iIncomeTree) => {
   const onClickRow  = (record: iIncomeTree) => {
     return {
     return {
       onClick() {
       onClick() {
-        setRow(record)
+        console.log(record.id)
+
+        rowClickHandler(record.id, record.bidsectionId, record.isEdit)
+      }
+    }
+  }
+
+  // 行点击回调
+  const rowClickHandler = async (id: string, bid: string, isEdit?: boolean) => {
+    if (!isEdit) {
+      const { code = -1, section = {}, contract: newContract = {} } = await apiGetIncome(id, bid)
+      if (code === consts.RET_CODE.SUCCESS) {
+        setRow(section)
+        setContract({ ...contract, ...newContract })
+        contractStore.rowChange(id)
       }
       }
     }
     }
   }
   }

+ 2 - 2
src/pages/Contract/Content/Income/index.tsx

@@ -72,7 +72,7 @@ export default function Income() {
     }
     }
     const { code } = await apiResfulContractTree(type, payload)
     const { code } = await apiResfulContractTree(type, payload)
     if ( code === consts.RET_CODE.SUCCESS) {
     if ( code === consts.RET_CODE.SUCCESS) {
-      contractStore.resetTree(tenderStore.bidsectionId)
+      contractStore.resetTree(tenderStore.bid)
     }
     }
   }
   }
   return (
   return (
@@ -136,7 +136,7 @@ export default function Income() {
           <Button type="primary" size="small" onClick={() => setModalObj({ ...modalObj, type: 'add', visible: true })}>新建收入合同</Button>
           <Button type="primary" size="small" onClick={() => setModalObj({ ...modalObj, type: 'add', visible: true })}>新建收入合同</Button>
         </Slot>
         </Slot>
       </Header>
       </Header>
-      <TableContent modalHandler={modalHandler} row={row} setRow={(record: iIncomeTree) => setRow(record)}></TableContent>
+      <TableContent modalHandler={modalHandler} row={row} setRow={(record: iIncomeTree) => setRow({ ...row, ...record })}></TableContent>
       <ContractModal modalObj={modalObj} onConfirm={onCreate} onCancel={ () => setModalObj({ ...modalObj, visible: false })}></ContractModal>
       <ContractModal modalObj={modalObj} onConfirm={onCreate} onCancel={ () => setModalObj({ ...modalObj, visible: false })}></ContractModal>
     </div>
     </div>
   )
   )

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

@@ -1,6 +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 { ContractTree } from '@/types/contract'
 import { ContractTree } from '@/types/contract'
 import consts from '@/utils/consts'
 import consts from '@/utils/consts'
 import { CaretDownOutlined } from '@ant-design/icons'
 import { CaretDownOutlined } from '@ant-design/icons'
@@ -8,10 +9,11 @@ import { Button, Dropdown, Menu, message, Table } from 'antd'
 import { ColumnsType } from 'antd/lib/table'
 import { ColumnsType } from 'antd/lib/table'
 import React, { useEffect, useState } from 'react'
 import React, { useEffect, useState } from 'react'
 import { useAliveController } from 'react-activation'
 import { useAliveController } from 'react-activation'
+import { RouteComponentProps, withRouter } from 'react-router-dom'
 import { apiContractList } from './api'
 import { apiContractList } from './api'
 import styles from './index.module.scss'
 import styles from './index.module.scss'
 import './index.scss'
 import './index.scss'
-const List: React.FC<{}> = () => {
+const List: React.FC<RouteComponentProps> = (props) => {
   const { clear } = useAliveController()
   const { clear } = useAliveController()
   useEffect(() => {
   useEffect(() => {
     getTree()
     getTree()
@@ -47,10 +49,11 @@ const List: React.FC<{}> = () => {
   const linkHandler = (id: string, name: string) => {
   const linkHandler = (id: string, name: string) => {
     tenderStore.saveBidsectionId(id)
     tenderStore.saveBidsectionId(id)
     tenderStore.saveName(name)
     tenderStore.saveName(name)
-    props.history.push('/console/safe/content/summary')
+    props.history.push('/console/contract/content/summary')
     // 清除所有的缓存页面
     // 清除所有的缓存页面
     clear()
     clear()
   }
   }
+
   const columns:ColumnsType<ContractTree> = [
   const columns:ColumnsType<ContractTree> = [
     {
     {
       title: '名称',
       title: '名称',
@@ -137,4 +140,4 @@ const List: React.FC<{}> = () => {
     </div>
     </div>
   )
   )
 }
 }
-export default List
+export default withRouter(List)

+ 30 - 0
src/store/mobx/contract/index.ts

@@ -49,6 +49,12 @@ class Contract {
     this.tree = newTree
     this.tree = newTree
   }
   }
 
 
+  // 行点击
+  @action rowChange(id: string) {
+    const colseTree = nodeUnCheck(this.tree)
+    const newTree = nodeCheck(id, colseTree)
+    this.tree = newTree
+  }
   @computed get showTable() {
   @computed get showTable() {
     return this.tree && this.tree.length > 1
     return this.tree && this.tree.length > 1
   }
   }
@@ -69,4 +75,28 @@ function lookupNode(id: string, tree: iIncomeTree[]) {
     return item
     return item
   })
   })
 }
 }
+
+// 项目节被选中更改isEdit的值
+function nodeCheck(id: string, tree: iIncomeTree[]) {
+  return tree.map((item: iIncomeTree) => {
+    if (item.id === id) {
+      item.isEdit = true
+
+    } else if(Array.isArray(item.children)) {
+      item.children = nodeCheck(id, item.children)
+    }
+    return item
+  })
+}
+
+function nodeUnCheck(tree: iIncomeTree[]) {
+  return tree.map((item: iIncomeTree) => {
+    if (item.isEdit) {
+      item.isEdit = false
+    } else if(Array.isArray(item.children)) {
+      item.children = nodeUnCheck(item.children)
+    }
+    return item
+  })
+}
 export default new Contract()
 export default new Contract()

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

@@ -56,3 +56,26 @@ export interface iModalCommonProps {
   onConfirm: (values: any, type: string) => void
   onConfirm: (values: any, type: string) => void
   onCancel: () => void
   onCancel: () => void
 }
 }
+
+export interface iContractState {
+  bidsectionId: string
+  code: string
+  content: string
+  contractsType: number
+  createTime: string
+  id: string
+  name: string
+  paid: string
+  partyA: string
+  partyASigner: string
+  partyB: string
+  partyBSigner: string
+  price: string
+  projectId: string
+  remarks: string
+  returned: string
+  signerTime: string
+  status: number
+  treeId: string
+  updateTime: string
+}