From db8b368c5fd611732e26425c974dddd16ae09a82 Mon Sep 17 00:00:00 2001
From: liuwh <964324856@qq.com>
Date: Sat, 14 Sep 2024 10:03:22 +0800
Subject: [PATCH] 修改提交
---
gz-customerSystem/src/components/NewTableSearch/index.jsx | 128 +++++++++--------
gz-wxparty/pages/AIAide/index.js | 3
gz-customerSystem/src/styles/theme.less | 2
gz-wxparty/pages/register/index.js | 4
gz-customerSystem/src/views/comprehensive/index.jsx | 171 +++++++-----------------
gz-wxparty/api/api.js | 32 ++--
gz-wxparty/utils/util.js | 2
gz-customerSystem/src/api/appUrl.js | 4
gz-customerSystem/src/views/comprehensive/index.less | 9 +
gz-wxparty/pages/AIAide/index.wxml | 2
gz-wxparty/pages/AIAideDetail/index.wxml | 2
gz-customerSystem/src/components/NewTableSearch/index.less | 3
12 files changed, 155 insertions(+), 207 deletions(-)
diff --git a/gz-customerSystem/src/api/appUrl.js b/gz-customerSystem/src/api/appUrl.js
index 4bf7b10..f28067b 100644
--- a/gz-customerSystem/src/api/appUrl.js
+++ b/gz-customerSystem/src/api/appUrl.js
@@ -10,11 +10,11 @@
export const debug = {
// web服务
// baseUrl: 'http://gz.hugeinfo.com.cn',
- baseUrl: "http://933ymn.natappfree.cc",
+ baseUrl: "http://qbkwa3.natappfree.cc",
// baseUrl: 'http://mdqgnh.natappfree.cc',
// 附件服务
- fileUrl: "http://933ymn.natappfree.cc",
+ fileUrl: "http://qbkwa3.natappfree.cc",
// fileUrl: 'http://gz.hugeinfo.com.cn',
// 文件查看url 后面接附件编号
diff --git a/gz-customerSystem/src/components/NewTableSearch/index.jsx b/gz-customerSystem/src/components/NewTableSearch/index.jsx
index 5964455..c2d55df 100644
--- a/gz-customerSystem/src/components/NewTableSearch/index.jsx
+++ b/gz-customerSystem/src/components/NewTableSearch/index.jsx
@@ -59,68 +59,74 @@
return (
<Form form={form} labelAlign="right" className="tableSearch">
- <Row gutter={[24, 16]}>
- {itemData.map((x, t) => {
- let placeholder = x.placeholder || setPlaceholder(x.name, x.type);
- let allowClear = x.allowClear || true;
- let dom = null;
- let rules = {};
- if (x.type === 'Input') {
- dom = <Input placeholder={placeholder} allowClear {...x} />;
- rules = { max: x.max || 32, message: '搜索内容过长' };
- }
- if (x.type === 'Select') {
- dom = (
- <Select allowClear placeholder={placeholder} {...x}>
- {x.selectdata?.map((y) => (
- <Option key={y.value}>{y.label}</Option>
- ))}
- </Select>
- );
- }
- if (x.type === 'RangePicker') {
- rules = { type: 'array' };
- dom = (
- <RangePicker
- style={{ width: '100%' }}
- ranges={{
- '今日': [$$.myMoment(), $$.myMoment()],
- '本月': [$$.myMoment().startOf('month'), $$.myMoment().endOf('month')],
- }}
- allowClear
- {...x}
- />
- );
- }
- if (x.type === 'TreeSelect') {
- dom = (
- <TreeSelect
- showSearch
- placeholder={placeholder}
- dropdownStyle={{ maxHeight: 500, overflow: 'auto' }}
- treeData={x.treedata}
- treeDefaultExpandAll
- allowClear
- filterTreeNode={(inputValue, treeNode) => (treeNode.label.indexOf(inputValue) !== -1 ? true : false)}
- {...x}
- />
- );
- }
- return (
- <>
- <Col span={8} style={display && { display: searchMore ? 'block' : t < lineNum ? 'block' : 'none' }} key={t + 1}>
- <Form.Item name={x.name} rules={[rules]} label={<div style={{ width: `${fontSize * labelLength}px` }}>{x.label}</div>}>
- {dom}
- </Form.Item>
- </Col>
- <Col span={8}></Col>
- <Col span={8}></Col>
- </>
+
+ {itemData.map((x, t) => {
+ let placeholder = x.placeholder || setPlaceholder(x.name, x.type);
+ let allowClear = x.allowClear || true;
+ let dom = null;
+ let rules = {};
+ if (x.type === 'Input') {
+ dom = <Input placeholder={placeholder} allowClear {...x} />;
+ rules = { max: x.max || 32, message: '搜索内容过长' };
+ }
+ if (x.type === 'Select') {
+ dom = (
+ <Select allowClear placeholder={placeholder} {...x}>
+ {x.selectdata?.map((y) => (
+ <Option key={y.value}>{y.label}</Option>
+ ))}
+ </Select>
);
- })}
- </Row>
+ }
+ if (x.type === 'RangePicker') {
+ rules = { type: 'array' };
+ dom = (
+ <RangePicker
+ style={{ width: '100%' }}
+ ranges={{
+ '今日': [$$.myMoment(), $$.myMoment()],
+ '本月': [$$.myMoment().startOf('month'), $$.myMoment().endOf('month')],
+ }}
+ allowClear
+ {...x}
+ />
+ );
+ }
+ if (x.type === 'TreeSelect') {
+ dom = (
+ <TreeSelect
+ showSearch
+ placeholder={placeholder}
+ dropdownStyle={{ maxHeight: 500, overflow: 'auto' }}
+ treeData={x.treedata}
+ treeDefaultExpandAll
+ allowClear
+ filterTreeNode={(inputValue, treeNode) => (treeNode.label.indexOf(inputValue) !== -1 ? true : false)}
+ {...x}
+ />
+ );
+ }
+ return (
+ <Row className='tableSearch-searchMore-row' gutter={[24, 16]} style={display && { display: searchMore ? 'block' : t < lineNum ? 'block' : 'none' }}>
+ <Col span={x.span || 8} key={t + 1}>
+ <Form.Item name={x.name} rules={[rules]} label={<div style={{ width: `${fontSize * labelLength}px` }}>{x.label}</div>}>
+ {dom}
+ </Form.Item>
+ </Col>
+ </Row>
+ // <div>
+ // <Col span={8} style={display && { display: searchMore ? 'block' : t < lineNum ? 'block' : 'none' }} key={t + 1}>
+ // <Form.Item name={x.name} rules={[rules]} label={<div style={{ width: `${fontSize * labelLength}px` }}>{x.label}</div>}>
+ // {dom}
+ // </Form.Item>
+ // </Col>
+ // <Col span={8}></Col>
+ // <Col span={8}></Col>
+ // </div>
+ );
+ })}
<Row style={{ marginTop: '16px' }}>
- <Col span={24} style={{ textAlign: 'right' }}>
+ <Col span={24} style={{ textAlign: 'left' }}>
<Button className="public-buttonMargin" onClick={handleReset}>
重置
</Button>
@@ -129,7 +135,7 @@
</Button>
{display && (
<span className="tableSearch-searchMore" onClick={() => setSearchMore(!searchMore)}>
- {!searchMore ? '展开' : '折叠'}
+ {!searchMore ? '展开更多' : '收起更多'}
<DownOutlined className={`tableSearch-searchMore-icon ${searchMore && 'tableSearch-searchMore-iconRotate'}`} />
</span>
)}
diff --git a/gz-customerSystem/src/components/NewTableSearch/index.less b/gz-customerSystem/src/components/NewTableSearch/index.less
index 3d00342..1cde11a 100644
--- a/gz-customerSystem/src/components/NewTableSearch/index.less
+++ b/gz-customerSystem/src/components/NewTableSearch/index.less
@@ -13,4 +13,7 @@
&-iconRotate {
transform: rotate(180deg);
}
+ &-row {
+ margin-bottom: 16px;
+ }
}
diff --git a/gz-customerSystem/src/styles/theme.less b/gz-customerSystem/src/styles/theme.less
index df1b3ac..1d6201f 100644
--- a/gz-customerSystem/src/styles/theme.less
+++ b/gz-customerSystem/src/styles/theme.less
@@ -16,7 +16,7 @@
@warning-color: #FA8C16; // 警告色
@warning-bg-color: #fdf6e0; // 警告色背景
@error-color: #F53F3F; // 错误色
-@font-size-base: 16px; // 主字号
+@font-size-base: 14px; // 主字号
@line-height-base: 1.5715;
@heading-color: rgba(0, 0, 0, 0.85); // 标题色
@text-color: rgba(0, 0, 0, 0.85); // 主文本色
diff --git a/gz-customerSystem/src/views/comprehensive/index.jsx b/gz-customerSystem/src/views/comprehensive/index.jsx
index 993e94a..a02d444 100644
--- a/gz-customerSystem/src/views/comprehensive/index.jsx
+++ b/gz-customerSystem/src/views/comprehensive/index.jsx
@@ -8,12 +8,12 @@
import TableView from '../../components/TableView';
import NewTableSearch from '../../components/NewTableSearch';
import MyTabs from '../../components/MyTabs';
-
+import './index.less'
const { Link } = Typography;
// 获取数据
-function getMyMediationDataApi(submitData) {
- return $$.ax.request({ url: 'caseTask/pageMyMediate', type: 'get', data: submitData, service: 'mediate' });
+function getCaseInfoDataApi(submitData) {
+ return $$.ax.request({ url: 'caseInfo/pageQueryAll', type: 'get', data: submitData, service: 'mediate' });
}
function getCacheLatjCaseGuideApi(submitData) {
@@ -34,100 +34,31 @@
let navigate = useNavigate();
// 搜索
- const [search, setSearch] = useState({ page: 1, size: 10, pageType: '1', joinRole: '1' });
+ const [search, setSearch] = useState({ page: 1, size: 10, });
// 数据
const [data, setData] = useState({ tableData: [] });
// 表头
const columns = () => {
- const columnOne =
- search.pageType === '3'
- ? [
- {
- title: '调解结果',
- dataIndex: 'mediResultName',
- record: (text, record) =>
- !text ? '-' : <div className={`public-tag public-tag-${record.mediResult === '22_00025-1' ? 'tagGreen' : 'tagRed'}`}>{text}</div>,
- },
- ]
- : [];
- const columnTwo =
- search.pageType === '3'
- ? [{ title: '调解结束时间', dataIndex: 'mediEndTime' }]
- : [
- // TODO:暂时取消,后续可根据需求改动
- // {
- // title: '处理时限',
- // dataIndex: 'expireTime',
- // render: (text, record) => {
- // let obj = $$.getHours(text);
- // return record.status === '1' ? (
- // <span className={obj.isNegativeNum ? 'tableView-dangerTime' : ''}>{!!text ? `${obj.hours}小时` : '-'}</span>
- // ) : (
- // '-'
- // );
- // },
- // },
- ];
- const columnThree = search.joinRole === '2' ? [{ title: '调解员', dataIndex: 'mediator' }] : [];
const columnsData = [
- {
- title: '调解案号',
- dataIndex: 'caseNo',
- render: (text, record) => (
- <Space size={0}>
- {record.taskType === '2' && <div className="myMediation-tuiTag">退</div>}
- {record.serieStatus === '2' ? (
- <Space size={4}>
- <FolderFilled className="public-folder" />
- <span>系列案</span>
- </Space>
- ) : (
- <Tooltip placement="topLeft" title={text}>
- {text}
- </Tooltip>
- )}
- </Space>
- ),
- },
- { title: '调解进度', dataIndex: 'processName' },
- ...columnOne,
- { title: '申请人', dataIndex: 'plaintiffs' },
- { title: '被申请人', dataIndex: 'defendants' },
- { title: '纠纷发生地', dataIndex: 'addr' },
- { title: '调解类型', dataIndex: 'mediTypeName' },
- { title: '纠纷类型', dataIndex: 'caseTypeName' },
- { title: '申请渠道', dataIndex: 'canalName' },
- { title: '纠纷受理时间', dataIndex: 'acceptTime' },
- ...columnTwo,
- ...columnThree,
- { title: '协助调解员', width: 100, dataIndex: 'otherMediator' },
+ { title: '事项状态', width: 80, dataIndex: 'statusName' },
+ { title: '事项来源', width: 80, dataIndex: 'canalName' },
+ { title: '事项等级', width: 80, dataIndex: 'caseLevel' },
+ { title: '纠纷类型', width: 150, dataIndex: 'caseTypeName' },
+ { title: '承办部门', width: 150, dataIndex: 'mediateDeptName' },
+ { title: '配合部门', width: 150, dataIndex: 'assistUnitName' },
+ { title: '化解结果', width: 80, dataIndex: 'mediResult' },
+ { title: '办结时间', width: 80, dataIndex: 'closeTime' },
+ // { title: '申请方', dataIndex: 'plaintiffList' },
+ // { title: '被申请方', dataIndex: 'defendantList' },
+ { title: '登记机构', dataIndex: 'inputUnitName' },
{
title: '操作',
dataIndex: 'action',
width: 50,
render: (_, record) => {
- let type = 'check';
- if (search.joinRole === '2') {
- type = 'check'
- } else if (search.joinRole === '1') {
- if (search.pageType == '3') {
- type = 'check';
- } else {
- type = 'handle'
- }
- }
- // if (search.joinRole === '1' && (search.pageType === '1' || search.pageType === '2')) {
- // type = 'handle';
- // }
- // if (search.joinRole === '2' && (search.pageType === '1' || search.pageType === '2')) {
- // type = 'feedback';
- // }
- // if (search.joinRole === '2' && search.pageType === '3' && record.feedbackStatus === '1') {
- // type = 'feedback';
- // }
- return <Link onClick={() => handleJump(type, record)}>{type === 'check' ? '查看' : '调解'}</Link>;
+ return <Link onClick={() => handleJump(record)}>详情</Link>;
},
},
];
@@ -191,7 +122,7 @@
function handleChangePage(page, pageSize) {
let paramsObj = Object.assign(search, { page, size: pageSize });
setSearch(paramsObj);
- getMyMediationData(paramsObj);
+ getCaseInfoData(paramsObj);
}
// 搜索 or 重置
@@ -204,7 +135,7 @@
$$.changeTimeFormat(paramsObj, 'mediStartTime', 'mediStartTimeStart', 'mediStartTimeEnd');
}
if (type === 'reset') {
- paramsObj = { page: 1, size: 10, pageType: '1', joinRole: '1' };
+ paramsObj = { page: 1, size: 10 };
form.resetFields();
form.setFieldsValue({ joinRole: '1' });
}
@@ -222,23 +153,19 @@
}
form.setFieldsValue(copyObj);
}
- getMyMediationData(paramsObj, session?.tableActive);
+ getCaseInfoData(paramsObj, session?.tableActive);
}
// 获取数据
- async function getMyMediationData(submitData, tableActive) {
+ async function getCaseInfoData(submitData, tableActive) {
global.setSpinning(true);
- const res = await getMyMediationDataApi(submitData);
+ const res = await getCaseInfoDataApi(submitData);
global.setSpinning(false);
if (res.type) {
setSearch(submitData);
setData({
- total: res.data?.dtoPage?.totalElements,
- tableData: res.data?.dtoPage?.content || [],
- tableActive,
- countDtj: res.data.countDtj,
- countTjz: res.data.countTjz,
- countTjjs: res.data.countTjjs,
+ total: res.data?.totalElements,
+ tableData: res.data?.content || [],
});
}
}
@@ -254,54 +181,56 @@
}
}, []);
- const countDtj = (search.pageType === '1' ? data.total : data.countDtj) || 0;
- const countTjz = (search.pageType === '2' ? data.total : data.countTjz) || 0;
-
- const countTjjs = (search.pageType === '3' ? data.total : data.countTjjs) || 0;
return (
<Page pageHead={{ title: '综合查询', subtitle: '管理员名下综合查询列表' }}>
<div className="myMediation">
<div className="myMediation-search">
+ <div className='comprehensive-title'>查询条件</div>
<NewTableSearch
labelLength={6}
form={form}
itemData={[
- { type: 'RangePicker', name: 'acceptTime', label: '办结时间' },
- { type: 'RangePicker', name: 'acceptTime', label: '归档时间' },
- { type: 'Input', name: 'defendants', label: '被申请人' },
- { type: 'Input', name: 'caseNo', label: '调解案号' },
- { type: 'Input', name: 'addr', label: '纠纷发生地' },
+ { type: 'RangePicker', name: 'acceptTime', label: '办结时间', span: 8 },
+ { type: 'RangePicker', name: 'acceptTime', label: '归档时间', span: 8 },
{
type: 'Select',
name: 'joinRole',
- label: '参与角色',
+ label: '纠纷类型',
+ span: 12,
selectdata: [
{ label: '我负责的', value: '1' },
{ label: '我协助的', value: '2' },
],
},
- { type: 'RangePicker', name: 'mediStartTime', label: '调解开始时间' },
- { type: 'RangePicker', name: 'mediEndTime', label: '调解结束时间' },
- { type: 'Select', name: 'mediResult', label: '调解结果', selectdata: $$.options.mediResult },
+ {
+ type: 'Select',
+ name: 'joinRole',
+ label: '承办部门',
+ selectdata: [
+ { label: '我负责的', value: '1' },
+ { label: '我协助的', value: '2' },
+ ],
+ },
+ {
+ type: 'Select',
+ name: 'joinRole',
+ label: '登记机构',
+ selectdata: [
+ { label: '我负责的', value: '1' },
+ { label: '我协助的', value: '2' },
+ ],
+ },
+ { type: 'Input', name: 'defendants', label: '被申请人' },
+ { type: 'Input', name: 'caseNo', label: '调解案号' },
]}
handleReset={() => handleSearch('reset')}
handleSearch={() => handleSearch('search')}
/>
</div>
- <div className="pageTabs">
- <MyTabs
- tabs={[
- { key: '1', label: `待调解(${$$.showMoreNum(countDtj)})` },
- { key: '2', label: `调解中(${$$.showMoreNum(countTjz)})` },
- { key: '3', label: `调解结束(${$$.showMoreNum(countTjjs)})` },
- ]}
- activeKey={search.pageType}
- onChange={(activeKey) => getMyMediationData({ ...search, page: 1, size: 10, pageType: activeKey })}
- />
- </div>
- <div className="pageTable">
+
+ <div style={{ marginTop: '8px' }} className="pageTable">
<TableView
showHeader
title="查询结果"
diff --git a/gz-customerSystem/src/views/comprehensive/index.less b/gz-customerSystem/src/views/comprehensive/index.less
index e69de29..b39c8f7 100644
--- a/gz-customerSystem/src/views/comprehensive/index.less
+++ b/gz-customerSystem/src/views/comprehensive/index.less
@@ -0,0 +1,9 @@
+.comprehensive {
+ &-title {
+ // margin: 0 16px;
+ font-size: 16px;
+ font-weight: 400;
+ color: rgba(0,0,0,0.85);
+ margin-bottom: 16px;
+ }
+}
diff --git a/gz-wxparty/api/api.js b/gz-wxparty/api/api.js
index a39897a..68cc6b8 100644
--- a/gz-wxparty/api/api.js
+++ b/gz-wxparty/api/api.js
@@ -23,24 +23,24 @@
// 文件下载url 后面接附件编号
// 不同服务接口type
- fileShowUrl: 'dyh-sys',
- fileDownUrl: 'dyh-sys',
- mediate: 'dyh-mediate', // dyh-mediate
- cust: 'dyh-cust', // dyh-cust
- oper: 'dyh-oper', // dyh-oper
- sys: 'dyh-sys', // dyh-sys
- disp: 'dyh-disp', //dyh-disp
- utils: 'dyh-utils', //dyh-utils
+ // fileShowUrl: 'dyh-sys',
+ // fileDownUrl: 'dyh-sys',
+ // mediate: 'dyh-mediate', // dyh-mediate
+ // cust: 'dyh-cust', // dyh-cust
+ // oper: 'dyh-oper', // dyh-oper
+ // sys: 'dyh-sys', // dyh-sys
+ // disp: 'dyh-disp', //dyh-disp
+ // utils: 'dyh-utils', //dyh-utils
// 正式环境
- // fileShowUrl: 'gzdyh-sys',
- // fileDownUrl: 'gzdyh-sys',
- // mediate: 'gzdyh-mediate', // gzdyh-mediate
- // cust: 'gzdyh-cust', // gzdyh-cust
- // oper: 'gzdyh-oper', // gzdyh-oper
- // sys: 'gzdyh-sys', // gzdyh-sys
- // disp: 'gzdyh-disp', //gzdyh-disp
- // utils: 'gzdyh-utils', //gzdyh-utils
+ fileShowUrl: 'gzdyh-sys',
+ fileDownUrl: 'gzdyh-sys',
+ mediate: 'gzdyh-mediate', // gzdyh-mediate
+ cust: 'gzdyh-cust', // gzdyh-cust
+ oper: 'gzdyh-oper', // gzdyh-oper
+ sys: 'gzdyh-sys', // gzdyh-sys
+ disp: 'gzdyh-disp', //gzdyh-disp
+ utils: 'gzdyh-utils', //gzdyh-utils
};
module.exports = {
diff --git a/gz-wxparty/pages/AIAide/index.js b/gz-wxparty/pages/AIAide/index.js
index 8d8c61f..100117d 100644
--- a/gz-wxparty/pages/AIAide/index.js
+++ b/gz-wxparty/pages/AIAide/index.js
@@ -86,9 +86,10 @@
let url = e.currentTarget.dataset.url;
let caseId = e.currentTarget.dataset.caseid;
let caseType = e.currentTarget.dataset.casetype;
+ let caseName = e.currentTarget.dataset.casename;
wx.navigateTo({
- url: url + '?caseId=' + caseId + '&type=' + caseType,
+ url: url + '?caseId=' + caseId + '&type=' + caseType + '&caseName=' + caseName,
});
},
diff --git a/gz-wxparty/pages/AIAide/index.wxml b/gz-wxparty/pages/AIAide/index.wxml
index 86be998..ad5c7ac 100644
--- a/gz-wxparty/pages/AIAide/index.wxml
+++ b/gz-wxparty/pages/AIAide/index.wxml
@@ -8,7 +8,7 @@
<view class="caseList_head">
<van-icon size="22" name="{{imgUrl}}AIAide_1.png" />为您推荐与申请相似的典型案例({{caseData.length}})
</view>
- <view class="caseList" bindtap="caseClick" data-caseId="{{item.caseId}}" data-caseType="{{item.caseType}}" data-url="../../pages/AIAideDetail/index" wx:for="{{caseData}}" wx:key="index">
+ <view class="caseList" bindtap="caseClick" data-caseId="{{item.caseId}}" data-caseName="{{item.caseName}}" data-caseType="{{item.caseType}}" data-url="../../pages/AIAideDetail/index" wx:for="{{caseData}}" wx:key="index">
<view class="caseList_flex">
<text class="ellipsis">{{item.caseName}}</text>
<view class="cell-arrow">
diff --git a/gz-wxparty/pages/AIAideDetail/index.wxml b/gz-wxparty/pages/AIAideDetail/index.wxml
index cde3933..78acd58 100644
--- a/gz-wxparty/pages/AIAideDetail/index.wxml
+++ b/gz-wxparty/pages/AIAideDetail/index.wxml
@@ -1,5 +1,5 @@
<!--pages/AIAideDetail/index.wxml-->
-<view class="title">{{data.caseTitle||'-'}}</view>
+<view class="title">{{lastData.caseName||'-'}}</view>
<view class="line"></view>
<view class="card" wx:if="{{lastData.type==='1'}}">
<view class="subtitle">【案件描述】</view>
diff --git a/gz-wxparty/pages/register/index.js b/gz-wxparty/pages/register/index.js
index b0c0441..c74f81c 100644
--- a/gz-wxparty/pages/register/index.js
+++ b/gz-wxparty/pages/register/index.js
@@ -838,9 +838,9 @@
this.setData({
submitData: {
...this.data.submitData,
- [this.data.twoKey]: this.data.submitData.caseDes + this.data.twoValue,
+ [this.data.twoKey]: this.data.submitData[this.data.twoKey] + this.data.twoValue,
},
- [this.data.twoKey + 'Num']: (this.data.submitData.caseDes + this.data.twoValue).length,
+ [this.data.twoKey + 'Num']: (this.data.submitData[this.data.twoKey] + this.data.twoValue).length,
twoValue: '',
twoKey: ''
})
diff --git a/gz-wxparty/utils/util.js b/gz-wxparty/utils/util.js
index 689ce99..afe96e0 100644
--- a/gz-wxparty/utils/util.js
+++ b/gz-wxparty/utils/util.js
@@ -5,7 +5,7 @@
const url = api.url;
// 是否是开发环境
-const isDebug = true;
+const isDebug = false;
const baseUrl = isDebug ? api.url.debug : api.url.web;
--
Gitblit v1.8.0