Commit e53eeeda authored by alwayOnlie's avatar alwayOnlie

合同

parent db88053d
......@@ -83,10 +83,24 @@ const contracRoute = {
component: '@/pages/contract/manage/QueryList',
},
{
path: '/memberCenter/contract/manage/QueryListdetails',
path: '/memberCenter/contract/manage/QueryList/QueryListdetails',
name: '合同查询详情',
hideInMenu: true,
component: '@/pages/contract/manage/QueryList/QueryListdetails',
},
{
path: '/memberCenter/contract/manage/add',
name: '待新增合同',
component: '@/pages/contract/manage/add',
},
// 待提交审核合同
{
path: '/memberCenter/contract/manage/examine',
name: '待提交审核合同',
component: '@/pages/contract/manage/examine',
},
],
},
],
......
This diff is collapsed.
......@@ -3,24 +3,26 @@
* @Date: 2020-07-30 17:23:48
* @LastEditors: LeeJiancong
* @LastEditTime: 2020-09-28 16:12:37
*/
*/
export default {
default: {
padding: '2px 5px',
background: 'rgba(244,245,247,1)',
borderRadius: '4px'
borderRadius: '4px',
},
confirm: {
color: '#3F7ED2',
padding: '2px 5px',
background: 'rgba(240, 248, 255, 1)',
borderRadius: '4px'
borderRadius: '4px',
},
success: {
color: '#00B37A',
padding: '2px 5px',
background: 'rgba(235,247,242,1)',
borderRadius: '4px'
borderRadius: '4px',
cursor: 'pointer',
},
// warn: {
// color: '#E63F3B',
......@@ -32,12 +34,20 @@ export default {
color: '#E63F3B',
padding: '2px 5px',
background: 'rgb(255, 235, 230)',
borderRadius: '4px'
borderRadius: '4px',
},
Error: {
color: 'red',
padding: '2px 5px',
background: 'rgba(255,247,227,1)',
borderRadius: '4px'
}
}
\ No newline at end of file
borderRadius: '4px',
},
point: {
width: 10,
height: 10,
background: '#41CC9E',
display: 'inline-block',
borderRadius: '50%',
marginRight: 10,
},
};
.addressList {
padding: 0;
margin: 0;
&-item {
padding: 8px 14px;
width: 549px;
margin-bottom: 20px;
position: relative;
line-height: 28px;
list-style: none;
border: 1px solid #EEF0F3;
color: #303133;
cursor: pointer;
&-detail {
color: #909399;
}
&.active {
border: 1px solid #00B382;
&::after {
content: '';
position: absolute;
width: 0;
height: 0;
border-bottom: 12px solid #00B37A;
border-left: 12px solid transparent;
bottom: 0;
right: 0;
z-index: 5;
}
}
&.disabled {
cursor: not-allowed;
}
&.hide {
display: none;
}
}
}
.more {
text-align: center;
cursor: pointer;
}
\ No newline at end of file
/*
* @Author: XieZhiXiong
* @Date: 2020-11-05 10:30:54
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-01-06 14:18:10
* @Description: 地址 Form Item
*/
import React, { useEffect, useState } from 'react';
import { ISchemaFieldComponentProps } from '@formily/antd';
import { CaretDownOutlined, CaretUpOutlined } from '@ant-design/icons';
import classNames from 'classnames';
import styles from './index.less';
interface AddressItem {
id: string;
// 收件人
receiverName?: string;
// 收件人
shipperName?: string;
// 电话
phone: string;
// 详细地址
fullAddress: string;
};
interface AddressFormItemProps {
value: AddressItem;
dataSource: AddressItem[];
// 默认展示的条数
showCount?: number;
onChange: (id: string) => {};
// 禁用的
disabled?: boolean;
/**
* 只读的
*/
readOnly?: boolean;
};
const AddressFormItem: React.FC<AddressFormItemProps> & { isFieldComponent: boolean } = (props) => {
const {
value,
showCount = 3,
dataSource = [],
onChange,
disabled = false,
readOnly,
} = props;
const [showMore, setShowMore] = useState(false);
// useEffect(() => {
// // 默认选中第一个
// if (dataSource && dataSource.length && !value) {
// if (onChange) {
// onChange(dataSource[0].id);
// }
// }
// }, [dataSource]);
const showDataSource = !showMore && !readOnly ? [...dataSource].splice(0, showCount) : dataSource;
const handleToogleMore = () => {
setShowMore(!showMore)
};
const handleSelectItem = record => {
if (onChange && !disabled) {
onChange(record);
}
};
return (
<div className={styles.addressee}>
<ul className={styles.addressList}>
{showDataSource.map(item => (
<li
className={classNames(styles['addressList-item'], {
[styles.active]: item.id === (value && value.id),
[styles.disabled]: disabled,
[styles.hide]: readOnly && item.id !== (value && value.id),
})}
onClick={() => handleSelectItem(item)}
key={item.id}
>
<div>
{`${item.receiverName || item.shipperName} / ${item.phone}`}
</div>
<div className={styles['addressList-item-detail']}>
{item.fullAddress}
</div>
</li>
))}
</ul>
{(dataSource.length > showCount) && !readOnly && (
<div
className={styles.more}
onClick={handleToogleMore}
>
{!showMore ? '显示更多' : '隐藏更多'}
{!showMore ? <CaretDownOutlined /> : <CaretUpOutlined />}
</div>
)}
</div>
);
};
AddressFormItem.defaultProps = {};
AddressFormItem.isFieldComponent = false;
export default AddressFormItem;
\ No newline at end of file
.anchorWrap :global .ant-anchor {
display: flex;
}
.anchorWrap :global .ant-anchor .ant-anchor-ink {
display: none;
}
.anchorWrap :global .ant-anchor .ant-anchor-link {
padding: 14px 0 !important;
margin: 0 16px;
}
.anchorWrap :global .ant-anchor .ant-anchor-link .ant-anchor-link-title {
font-size: 14px;
color: #909399;
}
.anchorWrap :global .ant-anchor .ant-anchor-link-active {
position: relative;
border-bottom: 2px solid #00B37A;
box-sizing: border-box;
}
.anchorWrap :global .ant-anchor .ant-anchor-link-active .ant-anchor-link-title {
font-weight: 500;
color: #303133;
}
.anchorWrap .titleBox {
padding: 8px 16px;
}
.anchorWrap .anchorBox {
display: flex;
padding: 0 16px;
}
/** 卡片样式 */
.card {
margin: 24px;
}
.card :global .ant-card {
margin-bottom: 24px;
}
.card :global .ant-card .ant-card-head > .ant-card-head-wrapper {
padding: 12px 0;
}
.card :global .ant-card .ant-card-extra {
padding: 0 0;
}
.card :global .ant-card .ant-card-extra .ant-radio-button-wrapper {
height: 24px;
line-height: 23px;
}
.card :global .ant-card .ant-card-extra .ant-radio-button-wrapper:hover {
color: #606266;
}
.card :global .ant-card .ant-card-extra .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {
color: #fff;
background: #6B778C;
border-color: #6B778C;
}
.card :global .god-table-control {
margin-bottom: 0;
}
.card .list {
display: flex;
}
.card .list h5 {
margin-bottom: 2em;
}
.card .list .listLable {
flex: 0 0 25%;
color: #909399;
}
.listItem {
display: flex;
}
.listItem .label {
flex: 0.2;
padding: 0 16px;
background: linear-gradient(270deg, #ffffff 0%, #daf2e7 100%);
}
.listItem .text {
padding: 0px 0px;
flex: 1;
}
.listItem p {
margin-bottom: 0;
}
.warp {
display: flex;
width: 100%;
}
.warp .warp_item {
width: 20%;
border: 1px solid #F4F5F7;
border-radius: 10px;
padding: 16px;
margin-right: 10px;
}
.warp .warp_item .title {
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #909399;
}
.warp .warp_item .proportion {
font-size: 24px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #303133;
padding: 12px 0;
}
.warp .warp_item .Price {
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #303133;
}
.warp .warp_item .warp_List {
margin-top: 32px;
}
.warp .warp_item .warp_List .warp_ListItem {
display: flex;
margin-bottom: 16px;
}
.warp .warp_item .warp_List .warp_ListItem .label {
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #909399;
flex: 0.5;
}
.warp .warp_item .warp_List .warp_ListItem .text {
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #303133;
flex: 1;
}
.upload_item {
margin-bottom: 16px;
display: flex;
align-items: center;
justify-content: space-between;
}
.upload_item .upload_left {
display: flex;
align-items: center;
color: #303133;
background-color: #fafbfc;
}
.upload_item .upload_left :global .anticon-file-word {
color: #4279df;
font-size: 18px;
margin-right: 8px;
}
.upload_item .upload_right {
color: #00b37a;
cursor: pointer;
}
.upload_item .upload_right :global .anticon-delete {
margin-left: 19px;
color: #c0c4cc;
}
.anchorWrap {
:global {
.ant-anchor {
display: flex;
.ant-anchor-ink {
display: none;
}
.ant-anchor-link {
padding: 14px 0 !important;
margin: 0 16px;
.ant-anchor-link-title {
font-size: 14px;
color: #909399;
}
}
.ant-anchor-link-active {
position: relative;
border-bottom: 2px solid #00B37A;
box-sizing: border-box;
.ant-anchor-link-title {
font-weight: 500;
color: #303133;
}
}
}
}
.titleBox {
padding: 8px 16px;
}
.anchorBox {
display: flex;
padding: 0 16px;
}
}
/** 卡片样式 */
.card {
margin: 24px;
:global {
.ant-card {
margin-bottom: 24px;
.ant-card-head {
> .ant-card-head-wrapper {
padding: 12px 0;
}
}
.ant-card-extra {
padding: 0 0;
.ant-radio-button-wrapper {
height: 24px;
line-height: 23px;
}
.ant-radio-button-wrapper:hover {
color: #606266;
}
.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {
color: #fff;
background: #6B778C;
border-color: #6B778C;
}
}
}
.god-table-control {
margin-bottom: 0;
}
}
.list {
display: flex;
h5 {
margin-bottom: 2em;
}
.listLable {
flex: 0 0 25%;
color: #909399;
}
}
}
.listItem {
display: flex;
.label {
flex: 0.2;
padding: 0 16px;
background: linear-gradient(270deg, #ffffff 0%, #daf2e7 100%);
}
.text {
padding: 0px 0px;
flex: 1;
}
p {
margin-bottom: 0;
}
}
.warp{
display: flex;
width: 100%;
.warp_item{
width: 20%;
border: 1px solid #F4F5F7;
border-radius: 10px;
padding: 16px;
margin-right: 10px;
.title{
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #909399;
}
.proportion{
font-size: 24px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #303133;
padding: 12px 0;
}
.Price{
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #303133;
}
.warp_List{
margin-top: 32px;
.warp_ListItem{
display: flex;
margin-bottom: 16px;
.label{
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #909399;
flex: 0.5;
}
.text{
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #303133;
flex: 1;
}
}
}
}
}
.upload_item {
margin-bottom: 16px;
display: flex;
align-items: center;
justify-content: space-between;
.upload_left {
display: flex;
align-items: center;
color: #303133;
background-color: #fafbfc;
:global {
.anticon-file-word {
color: #4279df;
font-size: 18px;
margin-right: 8px;
}
}
}
.upload_right {
color: #00b37a;
cursor: pointer;
:global {
.anticon-delete {
margin-left: 19px;
color: #c0c4cc;
}
}
}
}
import React, { useState, useRef, ReactNode } from 'react'
import React, { useRef } from 'react'
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { Card } from 'antd';
import statuStyle from '../../common/colorTag'
import { ColumnType } from 'antd/lib/table/interface';
import { StandardTable } from 'god';
import { PublicApi } from '@/services/api'
import EyePreview from '@/components/EyePreview'
import { FORM_FILTER_PATH } from '@/formSchema/const'
import { tableListSchema } from '../schema'
import StatusTag from '@/components/StatusTag';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch'
import Submit from '@/components/NiceForm/components/Submit'
import DateRangePickerUnix from '@/components/NiceForm/components/DateRangePickerUnix'
const QueryList = () => {
const ref = useRef<any>({});
const [filterParams, setFilterParams] = useState<any>({})
//表头
const columns: ColumnType<any>[] = [{
title: '需求单号/摘要',
dataIndex: 'id',
dataIndex: 'No',
align: 'center',
render: (text, record) =>
<div>
<EyePreview
url={`/memberCenter/contract/manage/QueryList/QueryListdetails`}
>
{text}
</EyePreview>
<p>{record.name}</p>
</div>
}, {
title: '需求发布时间',
dataIndex: 'name',
title: '投标编号',
dataIndex: 'number',
align: 'center',
}, {
title: '合同乙方',
dataIndex: 'description',
title: '中标会员',
dataIndex: 'memberName',
align: 'center',
},
{
title: '合同总金额',
dataIndex: 'description',
title: '中标通知时间',
dataIndex: 'time',
align: 'center',
},
{
title: '对应单据/寻源类型',
dataIndex: 'description',
title: '中标金额',
dataIndex: 'Price',
align: 'center',
},
{
title: '外部状态',
dataIndex: 'description',
dataIndex: 'status',
align: 'center',
render: (text) => {
let title: any = [
{},
{ name: '已完成', type: "success" },
{ name: '未完成', type: "primary" },
]
return (
<StatusTag type={title[text].type} title={title[text].name} />
)
}
},
{
title: '内部状态',
dataIndex: 'description',
dataIndex: 'insidestatus',
align: 'center',
render: (text) => {
let title: any = [
{},
{ name: '已完成', type: "success" },
{ name: '未完成', type: "primary" },
]
return (
<div>
<span style={statuStyle.point}> </span>
<span>{title[text].name}</span>
</div>
)
}
}, {
title: '操作',
dataIndex: 'state',
align: 'center',
render: (text: any, reconds: any) => {
let component: ReactNode = null;
if (text === 1) {
component = <><span style={statuStyle.success}>有效</span></>
}
return component
render: (record) => {
console.log(record)
return (
<span style={statuStyle.success}>创建采购招标合同</span>
)
}
}]
......@@ -66,9 +95,38 @@ const QueryList = () => {
const fetchData = (params?: any) => {
console.log(params)//可以直接打印参数
return new Promise((resolve, reject) => {
PublicApi.getOrderContractParamPage({ ...filterParams, ...params }).then(res => {
resolve(res.data)
})
let data = {
totalCount: 1,
data: [
{
id: '1',
No: 'ZPTY12',
name: '进口头层黄牛皮荔枝纹',
number: 'ZPTY12',
memberName: '温州龙昌手袋有限公司',
time: '2020-12-25 09:00',
Price: '¥50,000.00',
status: 1,
insidestatus: 1,
addText: '创建采购招标合同',
state: '',
},
{
id: '2',
No: 'ZPTY12',
name: '进口头层黄牛皮荔枝纹',
number: 'ZPTY12',
memberName: '温州龙昌手袋有限公司',
time: '2020-12-25 09:00',
Price: '¥50,000.00',
status: 1,
insidestatus: 1,
addText: '创建采购招标合同',
state: '',
}
]
}
resolve(data)
})
}
return (
......
.box {
width: 100%;
}
.box :global .ant-table-expanded-row-level-1 .ant-table-cell {
padding: 0px !important;
background-color: #ffffff;
}
.box .listItem {
display: flex;
}
.box .listItem .label {
flex: 0.2;
padding: 0 16px;
background: linear-gradient(270deg, #ffffff 0%, #daf2e7 100%);
}
.box .listItem .text {
padding: 0px 0px;
flex: 1;
}
.box .listItem p {
margin-bottom: 0;
}
.flex {
display: flex;
align-items: center;
justify-content: center;
}
.flex span {
background: #e4e6eb;
padding: 7px 12px;
color: #c0c4cc;
}
.upload_item {
margin-bottom: 16px;
display: flex;
align-items: center;
justify-content: space-between;
}
.upload_item .upload_left {
display: flex;
align-items: center;
color: #303133;
background-color: #fafbfc;
}
.upload_item .upload_left :global .anticon-file-word {
color: #4279df;
font-size: 18px;
margin-right: 8px;
}
.upload_item .upload_right {
color: #00b37a;
cursor: pointer;
}
.upload_item .upload_right :global .anticon-delete {
margin-left: 19px;
color: #c0c4cc;
}
.box {
width: 100%;
:global {
.ant-table-expanded-row-level-1 .ant-table-cell {
padding: 0px !important;
background-color: #ffffff;
}
}
.listItem {
display: flex;
.label {
flex: 0.2;
padding: 0 16px;
background: linear-gradient(270deg, #ffffff 0%, #daf2e7 100%);
}
.text {
padding: 0px 0px;
flex: 1;
}
p {
margin-bottom: 0;
}
}
}
.flex {
display: flex;
align-items: center;
justify-content: center;
span {
background: #e4e6eb;
padding: 7px 12px;
color: #c0c4cc;
}
}
.upload_item {
margin-bottom: 16px;
display: flex;
align-items: center;
justify-content: space-between;
.upload_left {
display: flex;
align-items: center;
color: #303133;
background-color: #fafbfc;
:global {
.anticon-file-word {
color: #4279df;
font-size: 18px;
margin-right: 8px;
}
}
}
.upload_right {
color: #00b37a;
cursor: pointer;
:global {
.anticon-delete {
margin-left: 19px;
color: #c0c4cc;
}
}
}
}
import React, { useState } from 'react'
import { Button, Card, message, Table, Input, Select, DatePicker, Form, Checkbox } from 'antd'
import { ArrayTable } from '@formily/antd-components';
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import NiceForm from '@/components/NiceForm';
import StatusTag from '@/components/StatusTag';
import styles from './index.less'
import AddressFormItem from '../../components/AddressFormItem';
import { createFormActions } from '@formily/antd';
import {
SaveOutlined,
PlusOutlined,
FileWordFilled
} from '@ant-design/icons'
import { addBillSchema } from './schema';
const addSchemaAction = createFormActions();
const { Option } = Select;
const { TextArea } = Input
const Add: React.FC<{}> = (props) => {
const [checkNick, setCheckNick] = useState(true);
// ArrayTable自定义渲染
const renderListTableRemove = (index: number) => (
<>
<a
style={{
color: '#ff4d4f',
}}
>
删除
</a>
</>
);
const OuterStatus = (
<StatusTag type="primary" title='外部状态' />
);
const InnerStatus = (
<p>111111</p>
);
const columns: any = [
{ title: '物料编号/名称', dataIndex: 'name', key: 'name', align: 'center', },
{ title: '规格型号', dataIndex: 'age', key: 'age', align: 'center', },
{ title: '品类', dataIndex: 'address', key: 'address', align: 'center', },
{ title: '品牌', dataIndex: 'address', key: 'address', align: 'center', },
{ title: '单位', dataIndex: 'address', key: 'address', align: 'center', },
{
title: '采购数量',
dataIndex: 'address',
key: 'address',
align: 'center',
render: () => <Input
style={{
width: 120,
}}
placeholder=""
/>
},
{
title: '含税', dataIndex: 'address', key: 'address', align: 'center',
render: () =>
<Select
style={{ width: 80 }}
>
<Option value="是" key={1}></Option>
<Option value="否" key={2}></Option>
</Select>
},
{
title: '税率', dataIndex: 'address', key: 'address', align: 'center',
render: () =>
<div className={styles.flex}>
<Input
style={{
width: 80,
}}
placeholder=""
/>
<span>%</span>
</div>
},
{
title: '单价(含税)', dataIndex: 'address', key: 'address', align: 'center',
render: () =>
<div className={styles.flex}>
<span></span>
<Input
style={{
width: 80,
}}
placeholder=""
/>
</div>
},
{
title: '授标数量', dataIndex: 'address', key: 'address', align: 'center',
render: () => <Input
style={{
width: 120,
}}
placeholder=""
/>
},
{ title: '金额(不含税)', dataIndex: 'address', key: 'address', align: 'center', },
{
title: '操作',
dataIndex: '',
align: 'center',
key: 'x',
render: () => <a>Delete</a>,
},
];
const data = [
{
key: 1,
name: 'John Brown',
age: 32,
address: 'New York No. 1 Lake Park',
description: 'My name is John Brown, I am 32 years old, living in New York No. 1 Lake Park.',
},
{
key: 2,
name: 'Jim Green',
age: 42,
address: 'London No. 1 Lake Park',
description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.',
},
{
key: 3,
name: 'Not Expandable',
age: 29,
address: 'Jiangsu No. 1 Lake Park',
description: 'This not expandable',
},
{
key: 4,
name: 'Joe Black',
age: 32,
address: 'Sidney No. 1 Lake Park',
description: 'My name is Joe Black, I am 32 years old, living in Sidney No. 1 Lake Park.',
},
];
/* 下拉的子元素 */
const listItem = (record) => (
<div className={styles.listItem}>
<div className={styles.label}>
<p>{record.name}</p>
<p>{record.name}</p>
</div>
<div className={styles.text}>
<p>{record.name}</p>
<p>{record.name}</p>
</div>
<div className={styles.text}>
<p>{record.name}</p>
<p>{record.name}</p>
</div>
<div className={styles.text}>
<p>{record.name}</p>
</div>
</div>
)
/* 列表 */
const List: any = (
<div className={styles.box}>
<div style={{ paddingTop: 12, paddingBottom: 12, }}>
<Button block type='dashed'><PlusOutlined />选择采购物料</Button>
</div>
<Table
columns={columns}
expandable={{
expandedRowRender: record => listItem(record),
}}
dataSource={data}
style={{
width: "100%"
}}
/>
</div>
)
/* 第三个tab */
const tabcolumns: any = [
{ title: '付款次数', dataIndex: 'name', key: 'name', align: 'center', },
{
title: '付款阶段', dataIndex: 'age', key: 'age', align: 'center',
render: () => <TextArea rows={1} />
},
{
title: '预计付款时间', dataIndex: 'address', key: 'address', align: 'center',
render: () => <DatePicker
style={{ width: '100%' }}
format="YYYY-MM-DD HH:mm:ss"
/>
},
{
title: '付款比例', dataIndex: 'address', key: 'address', align: 'center',
render: () =>
<div className={styles.flex}>
<Input
style={{
width: 150,
}}
placeholder=""
/>
<span>%</span>
</div>
},
{
title: '付款方式', dataIndex: 'address', key: 'address', align: 'center',
render: () =>
<div className={styles.flex}>
<span></span>
<Input
style={{
width: 130,
}}
placeholder=""
/>
</div>
},
{
title: '操作',
dataIndex: '',
align: 'center',
key: 'x',
render: () => <a>Delete</a>,
},
];
const datas = [
{
key: 1,
name: 'John Brown',
age: 32,
address: 'New York No. 1 Lake Park',
description: 'My name is John Brown, I am 32 years old, living in New York No. 1 Lake Park.',
},
{
key: 2,
name: 'Jim Green',
age: 42,
address: 'London No. 1 Lake Park',
description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.',
},
{
key: 3,
name: 'Not Expandable',
age: 29,
address: 'Jiangsu No. 1 Lake Park',
description: 'This not expandable',
},
{
key: 4,
name: 'Joe Black',
age: 32,
address: 'Sidney No. 1 Lake Park',
description: 'My name is Joe Black, I am 32 years old, living in Sidney No. 1 Lake Park.',
},
];
const table: any = (
<Table
columns={tabcolumns}
dataSource={datas}
style={{
width: "100%"
}}
/>
)
const onCheckboxChange = (e: { target: { checked: boolean } }) => {
setCheckNick(e.target.checked);
};
/* 第四个tab */
const FromDom = (
<div
style={{
width: '100%',
}}
>
<Form.Item label="单据摘要" labelAlign="left" labelCol={{ span: 2 }}>
<Select
style={{ width: 600 }}
>
<Option value="是" key={1}></Option>
<Option value="否" key={2}></Option>
</Select>
<Button type='link' >生成合同</Button>
</Form.Item>
<Form.Item label="合同文本" labelAlign="left" labelCol={{ span: 2 }}>
<div className={styles.upload_item} style={{ width: 680 }}>
<div className={styles.upload_left} style={{ width: 600 }}>
<FileWordFilled />
<span>温州龙昌手袋有限公司商品购销合同.pdf</span>
</div>
<Button type='link' >编辑合同</Button>
</div>
</Form.Item>
<Form.Item label="电子合同" labelAlign="left" labelCol={{ span: 2 }}>
<Checkbox checked={checkNick} onChange={onCheckboxChange}>
使用电子合同
</Checkbox>
</Form.Item>
</div>
)
return (
<PageHeaderWrapper
title="新建合同"
extra={[
<Button key="1" type="primary" icon={<SaveOutlined />} > </Button>
]}
>
<Card>
<NiceForm
previewPlaceholder=" "
expressionScope={{
OuterStatus,
InnerStatus,
List,
table,
FromDom,
renderListTableRemove,
}}
components={{
ArrayTable,
AddressFormItem,
}}
effects={($, actions) => {
const { setFieldState } = actions;
}}
actions={addSchemaAction}
schema={addBillSchema}
/>
</Card>
</PageHeaderWrapper>
)
}
export default Add;
This diff is collapsed.
import React, { useState, useRef, ReactNode } from 'react'
import React, { useRef } from 'react'
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { Card } from 'antd';
import statuStyle from '../../common/colorTag'
import { ColumnType } from 'antd/lib/table/interface';
import { StandardTable } from 'god';
import { PublicApi } from '@/services/api'
import EyePreview from '@/components/EyePreview'
import { FORM_FILTER_PATH } from '@/formSchema/const'
import { tableListSchema } from '../schema'
import StatusTag from '@/components/StatusTag';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch'
import Submit from '@/components/NiceForm/components/Submit'
import DateRangePickerUnix from '@/components/NiceForm/components/DateRangePickerUnix'
const BiddingList = () => {
const ref = useRef<any>({});
const [filterParams, setFilterParams] = useState<any>({})
//表头
const columns: ColumnType<any>[] = [{
title: '需求单号/摘要',
dataIndex: 'id',
dataIndex: 'No',
align: 'center',
render: (text, record) =>
<div>
<EyePreview
url={`/memberCenter/payandSettle/capitalAccounts/accountLists/detail?id=${record.id}`}
>
{text}
</EyePreview>
<p>{record.name}</p>
</div>
}, {
title: '需求发布时间',
dataIndex: 'name',
title: '投标编号',
dataIndex: 'number',
align: 'center',
}, {
title: '标会员',
dataIndex: 'description',
title: '标会员',
dataIndex: 'memberName',
align: 'center',
},
{
title: '授标时间',
dataIndex: 'description',
title: '中标通知时间',
dataIndex: 'time',
align: 'center',
},
{
title: '标金额',
dataIndex: 'description',
title: '标金额',
dataIndex: 'Price',
align: 'center',
},
{
title: '外部状态',
dataIndex: 'description',
dataIndex: 'status',
align: 'center',
render: (text) => {
let title: any = [
{},
{ name: '已完成', type: "success" },
{ name: '未完成', type: "primary" },
]
return (
<StatusTag type={title[text].type} title={title[text].name} />
)
}
},
{
title: '内部状态',
dataIndex: 'description',
dataIndex: 'insidestatus',
align: 'center',
render: (text) => {
let title: any = [
{},
{ name: '已完成', type: "success" },
{ name: '未完成', type: "primary" },
]
return (
<div>
<span style={statuStyle.point}> </span>
<span>{title[text].name}</span>
</div>
)
}
}, {
title: '操作',
dataIndex: 'state',
align: 'center',
render: (text: any, reconds: any) => {
let component: ReactNode = null;
if (text === 1) {
component = <><span style={statuStyle.success}>有效</span></>
}
return component
render: (record) => {
return (
<span style={statuStyle.success}>创建采购招标合同</span>
)
}
}]
......@@ -65,9 +95,64 @@ const BiddingList = () => {
const fetchData = (params?: any) => {
console.log(params)//可以直接打印参数
return new Promise((resolve, reject) => {
PublicApi.getOrderContractParamPage({ ...filterParams, ...params }).then(res => {
resolve(res.data)
})
let data = {
totalCount: 1,
data: [
{
id: '1',
No: 'ZPTY12',
name: '进口头层黄牛皮荔枝纹',
number: 'ZPTY12',
memberName: '温州龙昌手袋有限公司',
time: '2020-12-25 09:00',
Price: '¥50,000.00',
status: 1,
insidestatus: 1,
addText: '创建采购招标合同',
state: '',
},
{
id: '2',
No: 'ZPTY12',
name: '进口头层黄牛皮荔枝纹',
number: 'ZPTY12',
memberName: '温州龙昌手袋有限公司',
time: '2020-12-25 09:00',
Price: '¥50,000.00',
status: 1,
insidestatus: 1,
addText: '创建采购招标合同',
state: '',
},
{
id: '1',
No: 'ZPTY12',
name: '进口头层黄牛皮荔枝纹',
number: 'ZPTY12',
memberName: '温州龙昌手袋有限公司',
time: '2020-12-25 09:00',
Price: '¥50,000.00',
status: 1,
insidestatus: 1,
addText: '创建采购招标合同',
state: '',
},
{
id: '3',
No: 'ZPTY12',
name: '进口头层黄牛皮荔枝纹',
number: 'ZPTY12',
memberName: '温州龙昌手袋有限公司',
time: '2020-12-25 09:00',
Price: '¥50,000.00',
status: 1,
insidestatus: 1,
addText: '创建采购招标合同',
state: '',
},
]
}
resolve(data)
})
}
return (
......
import React, { useRef, useState } from 'react'
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { Card, Space, Button } from 'antd';
import statuStyle from '../../common/colorTag'
import { ColumnType } from 'antd/lib/table/interface';
import { StandardTable } from 'god';
import EyePreview from '@/components/EyePreview'
import { FORM_FILTER_PATH } from '@/formSchema/const'
import { tableListSchema } from '../schema'
import StatusTag from '@/components/StatusTag';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch'
import Submit from '@/components/NiceForm/components/Submit'
import DateRangePickerUnix from '@/components/NiceForm/components/DateRangePickerUnix'
const Examine = () => {
const ref = useRef<any>({});
const [selectedRowKeys, setSelectedRowKeys] = useState<Array<string>>([])
const [selectRow, setSelectRow] = useState<any[]>([]) // 模态框选择的行数据
//表头
const columns: ColumnType<any>[] = [{
title: '需求单号/摘要',
dataIndex: 'No',
align: 'center',
render: (text, record) =>
<div>
<EyePreview
url={`/memberCenter/contract/manage/QueryList/QueryListdetails`}
>
{text}
</EyePreview>
<p>{record.name}</p>
</div>
}, {
title: '投标编号',
dataIndex: 'number',
align: 'center',
}, {
title: '中标会员',
dataIndex: 'memberName',
align: 'center',
},
{
title: '中标通知时间',
dataIndex: 'time',
align: 'center',
},
{
title: '中标金额',
dataIndex: 'Price',
align: 'center',
},
{
title: '外部状态',
dataIndex: 'status',
align: 'center',
render: (text) => {
let title: any = [
{},
{ name: '已完成', type: "success" },
{ name: '未完成', type: "primary" },
]
return (
<StatusTag type={title[text].type} title={title[text].name} />
)
}
},
{
title: '内部状态',
dataIndex: 'insidestatus',
align: 'center',
render: (text) => {
let title: any = [
{},
{ name: '已完成', type: "success" },
{ name: '未完成', type: "primary" },
]
return (
<div>
<span style={statuStyle.point}> </span>
<span>{title[text].name}</span>
</div>
)
}
}, {
title: '操作',
dataIndex: 'state',
align: 'center',
render: (record) => {
console.log(record)
return (
<span style={statuStyle.success}>创建采购招标合同</span>
)
}
}]
const handleSubmitBatch = async () => {
}
const controllerBtns = (
<Space>
<Button onClick={handleSubmitBatch}>
批量审核通过
</Button>
</Space>
);
// 列表数据
const fetchData = (params?: any) => {
console.log(params)//可以直接打印参数
return new Promise((resolve, reject) => {
let data = {
totalCount: 1,
data: [
{
id: '1',
No: 'ZPTY12',
name: '进口头层黄牛皮荔枝纹',
number: 'ZPTY12',
memberName: '温州龙昌手袋有限公司',
time: '2020-12-25 09:00',
Price: '¥50,000.00',
status: 1,
insidestatus: 1,
addText: '创建采购招标合同',
state: '',
},
{
id: '2',
No: 'ZPTY12',
name: '进口头层黄牛皮荔枝纹',
number: 'ZPTY12',
memberName: '温州龙昌手袋有限公司',
time: '2020-12-25 09:00',
Price: '¥50,000.00',
status: 1,
insidestatus: 1,
addText: '创建采购招标合同',
state: '',
}
]
}
resolve(data)
})
}
const rowSelection: any = {
selectedRowKeys: selectedRowKeys,
onChange: (selectedRowKeys: any, selectedRows: any) => {
setSelectedRowKeys(selectedRowKeys)
setSelectRow(selectedRows)
console.log(selectedRowKeys, selectedRows, 'rowSelection')
}
};
return (
<PageHeaderWrapper>
<Card>
<StandardTable
tableProps={{
rowKey: 'id',
}}
rowSelection={rowSelection}
columns={columns}
currentRef={ref}
formilyLayouts={{
justify: 'space-between'
}}
fetchTableData={(params: any) => fetchData(params)}
formilyChilds={{
children: <Space>
<Button onClick={handleSubmitBatch}>批量提交审核</Button>
</Space>,
layouts: {
span: 8
}
}}
formilyProps={{
ctx: {
inline: false,
schema: tableListSchema,
effects: ($, actions) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'orderNo',
FORM_FILTER_PATH,
);
},
components: {
DateRangePickerUnix,
Submit
}
}
}}
/>
</Card>
</PageHeaderWrapper>
)
}
export default Examine
import React, { useState, useRef, ReactNode } from 'react'
import React, { useRef } from 'react'
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { Card } from 'antd';
import statuStyle from '../../common/colorTag'
import { ColumnType } from 'antd/lib/table/interface';
import { StandardTable } from 'god';
import { PublicApi } from '@/services/api'
import EyePreview from '@/components/EyePreview'
import { FORM_FILTER_PATH } from '@/formSchema/const'
import { tableListSchema } from '../schema'
import StatusTag from '@/components/StatusTag';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch'
import Submit from '@/components/NiceForm/components/Submit'
import DateRangePickerUnix from '@/components/NiceForm/components/DateRangePickerUnix'
const PurchaseList = () => {
const ref = useRef<any>({});
const [filterParams, setFilterParams] = useState<any>({})
//表头
const columns: ColumnType<any>[] = [{
title: '需求单号/摘要',
dataIndex: 'id',
dataIndex: 'No',
align: 'center',
render: (text, record) =>
<div>
<EyePreview
url={`/memberCenter/payandSettle/capitalAccounts/accountLists/detail?id=${record.id}`}
>
{text}
</EyePreview>
<p>{record.name}</p>
</div>
}, {
title: '需求发布时间',
dataIndex: 'name',
title: '投标编号',
dataIndex: 'number',
align: 'center',
}, {
title: '标会员',
dataIndex: 'description',
title: '标会员',
dataIndex: 'memberName',
align: 'center',
},
{
title: '授标时间',
dataIndex: 'description',
title: '中标通知时间',
dataIndex: 'time',
align: 'center',
},
{
title: '标金额',
dataIndex: 'description',
title: '标金额',
dataIndex: 'Price',
align: 'center',
},
{
title: '外部状态',
dataIndex: 'description',
dataIndex: 'status',
align: 'center',
render: (text) => {
let title: any = [
{},
{ name: '已完成', type: "success" },
{ name: '未完成', type: "primary" },
]
return (
<StatusTag type={title[text].type} title={title[text].name} />
)
}
},
{
title: '内部状态',
dataIndex: 'description',
dataIndex: 'insidestatus',
align: 'center',
render: (text) => {
let title: any = [
{},
{ name: '已完成', type: "success" },
{ name: '未完成', type: "primary" },
]
return (
<div>
<span style={statuStyle.point}> </span>
<span>{title[text].name}</span>
</div>
)
}
}, {
title: '操作',
dataIndex: 'state',
align: 'center',
render: (text: any, reconds: any) => {
let component: ReactNode = null;
if (text === 1) {
component = <><span style={statuStyle.success}>有效</span></>
}
return component
render: (record) => {
return (
<span style={statuStyle.success}>创建采购招标合同</span>
)
}
}]
......@@ -64,9 +94,38 @@ const PurchaseList = () => {
const fetchData = (params?: any) => {
console.log(params)//可以直接打印参数
return new Promise((resolve, reject) => {
PublicApi.getOrderContractParamPage({ ...filterParams, ...params }).then(res => {
resolve(res.data)
})
let data = {
totalCount: 1,
data: [
{
id: '1',
No: 'ZPTY12',
name: '进口头层黄牛皮荔枝纹',
number: 'ZPTY12',
memberName: '温州龙昌手袋有限公司',
time: '2020-12-25 09:00',
Price: '¥50,000.00',
status: 1,
insidestatus: 1,
addText: '创建采购招标合同',
state: '',
},
{
id: '2',
No: 'ZPTY12',
name: '进口头层黄牛皮荔枝纹',
number: 'ZPTY12',
memberName: '温州龙昌手袋有限公司',
time: '2020-12-25 09:00',
Price: '¥50,000.00',
status: 1,
insidestatus: 1,
addText: '创建采购招标合同',
state: '',
}
]
}
resolve(data)
})
}
return (
......
.addcontract_wrap :global .ant-form-item {
width: 748px;
}
.addcontract_wrap :global .ant-form-item .ant-form-item-label {
width: 172px;
text-align: left;
}
.addcontract_wrap :global .ant-form-item .ant-form-item-label > label {
color: #909399;
}
.addcontract_wrap :global .ant-form-item .ant-upload-list-item {
margin-top: 0px;
}
.addcontract_wrap .upload_item {
padding: 5px 8px;
margin-bottom: 16px;
display: flex;
align-items: center;
justify-content: space-between;
background-color: #fafbfc;
}
.addcontract_wrap .upload_item .upload_left {
display: flex;
align-items: center;
color: #303133;
}
.addcontract_wrap .upload_item .upload_left :global .anticon-file-word {
color: #4279df;
font-size: 18px;
margin-right: 8px;
}
.addcontract_wrap .upload_item .upload_right {
color: #00b37a;
cursor: pointer;
}
.addcontract_wrap .upload_item .upload_right :global .anticon-delete {
margin-left: 19px;
color: #c0c4cc;
}
......@@ -22,7 +22,7 @@
display: flex;
align-items: center;
justify-content: space-between;
background-color: #FAFBFC;
background-color: #fafbfc;
.upload_left {
display: flex;
......@@ -31,7 +31,7 @@
:global {
.anticon-file-word {
color: #4279df;
color: #4279df;
font-size: 18px;
margin-right: 8px;
}
......@@ -39,15 +39,15 @@
}
.upload_right {
color: #00B37A;
color: #00b37a;
cursor: pointer;
:global {
.anticon-delete {
margin-left: 19px;
color: #C0C4CC;
color: #c0c4cc;
}
}
}
}
}
\ No newline at end of file
}
......@@ -11,8 +11,8 @@ import BidDetailHeader from '@/pages/procurement/components/bidDetailHeader';
import BidDetailSection from '@/pages/procurement/components/bidDetailSection';
const CallForBidsSearchDetail: React.FC = () => {
const { formContext, id, detailList } = useBidDetail({type: 'purchaseOrder'})
const {data, currentPayInfoId} = formContext
const { formContext, id, detailList } = useBidDetail({ type: 'purchaseOrder' })
const { data, currentPayInfoId } = formContext
const payRef = useRef<any>({})
......@@ -40,14 +40,14 @@ const CallForBidsSearchDetail: React.FC = () => {
formContext={formContext}
anchorList={anchorTitleList}
backLink="/memberCenter/procurementAbility/callForBids/callForBidsSearch"
// extraRight={
// <Button type='primary'>
// 去支付
// </Button>
// }
// extraRight={
// <Button type='primary'>
// 去支付
// </Button>
// }
/>
<OrderDetailWrapper>
<PreLoading loading={!formContext.data} active paragraph={{rows: 6}}>
<PreLoading loading={!formContext.data} active paragraph={{ rows: 6 }}>
<BidDetailSection formContext={formContext} anchorList={anchorTitleList} type="callForBid" />
</PreLoading>
</OrderDetailWrapper>
......
......@@ -18,7 +18,7 @@ export interface BidDetailHeaderProps {
/**
* 招标详情头部
*/
const BidDetailHeader:React.FC<BidDetailHeaderProps> = ({
const BidDetailHeader: React.FC<BidDetailHeaderProps> = ({
extraRight,
detailList = [],
formContext,
......@@ -36,7 +36,7 @@ const BidDetailHeader:React.FC<BidDetailHeaderProps> = ({
useEffect(() => {
window.addEventListener("scroll", onScroll)
return (()=>{
return (() => {
window.removeEventListener('scroll', onScroll)
})
}, [])
......@@ -45,24 +45,24 @@ const BidDetailHeader:React.FC<BidDetailHeaderProps> = ({
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
let floors = document.querySelectorAll(".anchorContent>div")
floors.forEach((floor: any, index: any) => {
if(floor.offsetTop - 100 <= scrollTop) {
if (floor.offsetTop - 100 <= scrollTop) {
setCurrent(index)
}
})
// 锚点导航距离顶端距离
let navDom: any = document.getElementById("anchorTitle")
if(navDom) {
let distance = navDom.offsetTop - document.documentElement.scrollTop
if(!flagRef.current.flag) {
if (navDom) {
let distance = navDom.offsetTop - document.documentElement.scrollTop
if (!flagRef.current.flag) {
flagRef.current.distanceTop = navDom.offsetTop
flagRef.current.flag = true
}
if(distance <= 0) {
if (distance <= 0) {
setIsFixed(true)
}
if(document.documentElement.scrollTop <= flagRef.current.distanceTop) {
if (document.documentElement.scrollTop <= flagRef.current.distanceTop) {
setIsFixed(false)
}
}
......@@ -75,31 +75,31 @@ const BidDetailHeader:React.FC<BidDetailHeaderProps> = ({
behavior: "smooth"
})
let dom = document.documentElement || document.body
if(formContext.offsetTopList[index] - 189 + dom.clientHeight >= dom.scrollHeight) {
if (formContext.offsetTopList[index] - 189 + dom.clientHeight >= dom.scrollHeight) {
setCurrent(index)
}
}
return (
<div className={isFixed ? [style.detailHeader, style.anchorTitleFixed].join(' '): style.detailHeader} id="detailHeader">
<div className={isFixed ? [style.detailHeader, style.anchorTitleFixed].join(' ') : style.detailHeader} id="detailHeader">
{
isLoading ?
<Row>
{
<>
<Col span={22}>
<Row align='middle'>
<Col>
<ArrowLeftOutlined onClick={() => backLink ? history.push(backLink) : history.goBack()}/>
</Col>
<Col>
<div className={style.titleAvatorText}>订单号: {formContext.data.orderNo}</div>
</Col>
</Row>
<Row>
<Col>
<div className={style.anchorTitle} id="anchorTitle">
{/* <ul className={style.anchorUl}>
isLoading ?
<Row>
{
<>
<Col span={22}>
<Row align='middle'>
<Col>
<ArrowLeftOutlined onClick={() => backLink ? history.push(backLink) : history.goBack()} />
</Col>
<Col>
<div className={style.titleAvatorText}>订单号: {formContext.data.orderNo}</div>
</Col>
</Row>
<Row>
<Col>
<div className={style.anchorTitle} id="anchorTitle">
{/* <ul className={style.anchorUl}>
{
anchorList.map((item, index) => (
<li key={index} onClick={()=>clickItem(index)}>
......@@ -109,23 +109,23 @@ const BidDetailHeader:React.FC<BidDetailHeaderProps> = ({
}
</ul> */}
<Anchor onClick={(e)=>e.preventDefault()} showInkInFixed={false} targetOffset={200}>
{
anchorList.map((item, index) => (
<Link key={index} href={`#${item['id']}`} title={item['title']} />
))
}
</Anchor>
</div>
<Anchor onClick={(e) => e.preventDefault()} showInkInFixed={false} targetOffset={200}>
{
anchorList.map((item, index) => (
<Link key={index} href={`#${item['id']}`} title={item['title']} />
))
}
</Anchor>
</div>
</Col>
</Row>
</Col>
</Row>
</Col>
<Col span={2}>{ extraRight }</Col>
</>
}
</Row>
: <Skeleton avatar={{shape: 'square'}} active paragraph={{ rows: 3 }} />
}
<Col span={2}>{extraRight}</Col>
</>
}
</Row>
: <Skeleton avatar={{ shape: 'square' }} active paragraph={{ rows: 3 }} />
}
</div>
)
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment