Commit 8140b78c authored by tianhongyang's avatar tianhongyang

Merge branch 'V20230915' of http://192.168.60.201/root/dsk-operate-sys into V20230915

parents 453eac9d 0ee1bbd3
......@@ -77,7 +77,7 @@ public class CustomerController extends BaseController {
@PostMapping("/claim")
@RepeatSubmit
public R<Map<String, Object>> claim(@RequestBody Customer customer) {
if (ObjectUtils.isEmpty(customer.getUipId())) throw new BeanException("城投uipId不能为空");
// if (ObjectUtils.isEmpty(customer.getUipId())) throw new BeanException("城投uipId不能为空");
boolean add = baseService.add(customer);
if (add) {
Map<String, Object> map = new HashMap<>();
......
......@@ -277,7 +277,7 @@ public class EnterpriseProjectService {
}
public TableDataInfo importantList(EnterpriseProjectImportantListDto dto) throws Exception{
if(ObjectUtil.isEmpty(dto.getCompanyId())) throw new BeanException("企业id不能为空!");
if(ObjectUtil.isEmpty(dto.getCid())) throw new BeanException("企业id不能为空!");
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseProject/importantList", BeanUtil.beanToMap(dto, false, false));
return dskOpenApiUtil.responsePage(map);
}
......
......@@ -91,29 +91,27 @@ public class BusinessOpportunityRadarService {
}
ArrayList<String> companyNames = new ArrayList<>();
ArrayList<Long> cIds = new ArrayList<>();
for (Object dataMap : list) {
String name = MapUtils.getString(CommonUtils.assertAsMap(dataMap), "companyName");
String name = MapUtils.getString(CommonUtils.assertAsMap(dataMap), "name");
if (ObjectUtil.isNotEmpty(name) && name.contains("font")) {
name = name.replaceAll("<font color='red'>", "");
name = name.replaceAll("<font color='#FF204E'>", "");
name = name.replaceAll("</font>", "");
companyNames.add(name);
} else {
companyNames.add(name);
}
cIds.add(MapUtils.getLong(CommonUtils.assertAsMap(dataMap), "companyId"));
}
List<CustomerStatusListVo> claimStatusList = iCustomerService.selectStatusListByCompanyName(companyNames);
for (Object enterprise : list) {
Map<String, Object> companyMap = CommonUtils.assertAsMap(enterprise);
String companyName = MapUtils.getString(companyMap, "companyName", "");
String companyName = MapUtils.getString(companyMap, "name", "");
if (ObjectUtil.isNotEmpty(companyName) && companyName.contains("font")) {
companyName = companyName.replace("<font color='red'>", "");
companyName = companyName.replace("<font color='#FF204E'>", "");
companyName = companyName.replace("</font>", "");
}
companyMap.put("claimStatus", null);
companyMap.put("claimStatus", 0);
for (CustomerStatusListVo vo : claimStatusList) {
if (companyName.equals(vo.getCompanyName())) {
companyMap.put("claimStatus", vo.getStatus());
......
......@@ -127,8 +127,8 @@ public class MarketAnalysisService {
if (!ObjectUtils.isEmpty(map.get("data"))) {
List<Map<String, Object>> list = (List<Map<String, Object>>) map.get("data");
list.parallelStream().forEach(res -> {
Integer companyId = MapUtils.getInteger(res, "companyId");
String companyName = MapUtils.getString(res, "companyName");
Integer companyId = MapUtils.getInteger(res, "tendereeId");
String companyName = MapUtils.getString(res, "tenderee");
res.put("uipId", enterpriseService.getUipIdByCompanyNameOrCompanyId(companyName, companyId));
});
}
......@@ -140,8 +140,8 @@ public class MarketAnalysisService {
if (!ObjectUtils.isEmpty(map.get("data"))) {
List<Map<String, Object>> list = (List<Map<String, Object>>) map.get("data");
list.parallelStream().forEach(res -> {
Integer companyId = MapUtils.getInteger(res, "tendereeId");
String companyName = MapUtils.getString(res, "tenderee");
Integer companyId = MapUtils.getInteger(res, "companyId");
String companyName = MapUtils.getString(res, "companyName");
res.put("uipId", enterpriseService.getUipIdByCompanyNameOrCompanyId(companyName, companyId));
});
}
......
......@@ -228,9 +228,12 @@ ul, li {
border-color: #D9D9D9;
color: #232323;
&::placeholder {
color: rgba(35,35,35,0.5);
color: rgba(35,35,35,0.4);
}
}
.el-input__inner::placeholder{
color: rgba(35,35,35,0.4) !important;
}
.el-select .el-input .el-select__caret{
color: #232323;
}
......
......@@ -70,7 +70,7 @@ export const constantRoutes = [
path: 'index',
component: () => import('@/views/index'),
name: 'Index',
meta: { title: '首页', icon: 'index',noCache: true }
meta: { title: '首页', icon: 'index',noCache: false }
}
]
},
......
<template>
<div class="members">
<head-form
<head-form-new
ref="headForm"
title="集团成员"
:form-data="formData"
:query-params="queryParams"
......@@ -44,7 +45,7 @@
</div>
</div>
</template>
</head-form>
</head-form-new>
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables
v-if="!isSkeleton"
......@@ -101,12 +102,12 @@
{label: '企业地区', prop: 'address', minWidth: '200'},
],
formData: [
{ type: 4, fieldName: 'combineMemberLevels', value: '', placeholder: '成员层级', options:[]},
{ type: 1, fieldName: 'businessType', value: '', placeholder: '主营业务', options:[]},
{ type: 7, fieldName: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, placeholder: '地区', options:[]},
{ type: 6, fieldName: 'money', value: '', placeholder: '注册资本', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[] },
{ type: 0, fieldName: 'penalizeReasonType', value: '', placeholder: '筛选', options: []},
{ type: 3, fieldName: 'searchValue', value: '', placeholder: '输入关键词查询'},
{ type: 4, fieldName: 'combineMemberLevels', value: '', placeholder: '成员层级', options:[], uid: this.getUid()},
{ type: 1, fieldName: 'businessType', value: '', placeholder: '主营业务', options:[], uid: this.getUid()},
{ type: 7, fieldName: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, placeholder: '地区', options:[], uid: this.getUid()},
{ type: 6, fieldName: 'money', value: '', placeholder: '注册资本', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[], uid: this.getUid() },
{ type: 0, fieldName: 'penalizeReasonType', value: '', placeholder: '筛选', options: [], uid: this.getUid()},
{ type: 3, fieldName: 'searchValue', value: '', placeholder: '输入关键词查询', uid: this.getUid()},
],
cycj:[
{
......@@ -548,5 +549,6 @@
font-size: 14px;
color:#232323 !important;
}
@import "@/assets/styles/search-common.scss";
}
</style>
<template>
<div class="performance">
<head-form
<head-form-new
ref="headForm"
title="集团业绩"
:form-data="formData"
:query-params="queryParams"
......@@ -12,7 +13,7 @@
<template slot="slot">
</template>
</head-form>
</head-form-new>
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables
v-if="!isSkeleton"
......@@ -84,14 +85,14 @@
{label: '业主单位', prop: 'projectUnit', slot: true,minWidth: '190'},
],
formData: [
{ type: 7, fieldName: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, placeholder: '项目地区', options:[]},
{ type: 5, fieldName: 'time', value: '', placeholder: '中标时间', startTime: 'startBidTime', endTime: 'endBidTime',timeList:[],dateTo:this.formatDate(new Date()) },
{ type: 6, fieldName: 'money', value: '', placeholder: '中标金额', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[] },
{ type: 4, fieldName: 'boundTypes', value: '', placeholder: '业绩类型', options: [],width:150},
{ type: 4, fieldName: 'projectTypes', value: '', placeholder: '项目类型', options: [],width:150},
{ type: 1, fieldName: 'cgbl', value: '', placeholder: '持股比例', options: [],width:100},
{ type: 7, fieldName: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, placeholder: '项目地区', options:[], uid: this.getUid()},
{ type: 5, fieldName: 'time', value: '', placeholder: '中标时间', startTime: 'startBidTime', endTime: 'endBidTime',timeList:[],dateTo:this.formatDate(new Date()) , uid: this.getUid()},
{ type: 6, fieldName: 'money', value: '', placeholder: '中标金额', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[], uid: this.getUid() },
{ type: 4, fieldName: 'boundTypes', value: '', placeholder: '业绩类型', options: [],width:150, uid: this.getUid()},
{ type: 4, fieldName: 'projectTypes', value: '', placeholder: '项目类型', options: [],width:150, uid: this.getUid()},
{ type: 1, fieldName: 'cgbl', value: '', placeholder: '持股比例', options: [],width:100, uid: this.getUid()},
// { type: 3, fieldName: 'searchValue', value: '', placeholder: '搜索中标成员名称/项目名称'},
{ type: 3, fieldName: 'searchValue', value: '', placeholder: '查询'},
{ type: 3, fieldName: 'searchValue', value: '', placeholder: '输入关键词查询', uid: this.getUid()},
],
tableData:[],
tableDataTotal:0,
......@@ -323,5 +324,6 @@
background: #F0F3FA;
}
}
@import "@/assets/styles/search-common.scss";
}
</style>
<template>
<div class="performance">
<head-form
<head-form-new
ref="headForm"
title=""
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="false"
@handle-search="handleSearch"
></head-form>
></head-form-new>
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables
v-if="!isSkeleton"
......@@ -129,13 +130,13 @@
{label: '代理单位', prop: 'agency',minWidth: '160',slot: true},
],
formData: [
{ type: 7, fieldName: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, placeholder: '项目地区', options:[]},
{ type: 5, fieldName: 'time', value: '', placeholder: '招标发布时间', startTime: 'startTime', endTime: 'endTime',timeList:[] },
{ type: 6, fieldName: 'money', value: '', placeholder: '预算金额', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[] },
{ type: 1, fieldName: 'subjectMatters', value: '', placeholder: '招标采购分类', options: [],width:125},
{ type: 4, fieldName: 'projectTypes', value: '', placeholder: '项目类型', options: [],width:150},
{ type: 1, fieldName: 'cgbl', value: '', placeholder: '持股比例', options: [],width:110},
{ type: 3, fieldName: 'keys', value: '', placeholder: '查询'},
{ type: 7, fieldName: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, placeholder: '项目地区', options:[], uid: this.getUid()},
{ type: 5, fieldName: 'time', value: '', placeholder: '招标发布时间', startTime: 'startTime', endTime: 'endTime',timeList:[], uid: this.getUid() },
{ type: 6, fieldName: 'money', value: '', placeholder: '预算金额', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[], uid: this.getUid() },
{ type: 1, fieldName: 'subjectMatters', value: '', placeholder: '招标采购分类', options: [],width:125, uid: this.getUid()},
{ type: 4, fieldName: 'projectTypes', value: '', placeholder: '项目类型', options: [],width:150, uid: this.getUid()},
{ type: 1, fieldName: 'cgbl', value: '', placeholder: '持股比例', options: [],width:110, uid: this.getUid()},
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入关键词查询'},
],
tableData:[],
tableDataTotal:0,
......@@ -373,6 +374,7 @@
<style lang="scss" scoped>
.performance{
@import "@/assets/styles/search-common.scss";
background: #ffffff;
border-radius: 4px;
padding: 16px;
......
......@@ -30,8 +30,10 @@
},
methods: {
handleClick() {
handleClick(key) {
if(key === 'second'){
this.activeName=key
}
}
}
}
......
......@@ -493,7 +493,7 @@ export default {
& > span {
color: #232323;
color: rgba(35, 35, 35, 0.8);
color: rgba(35, 35, 35, 0.4);
font-weight: 400;
margin-left: 8px;
line-height: 22px;
......@@ -549,4 +549,4 @@ export default {
}
}
}
</style>
\ No newline at end of file
</style>
......@@ -21,6 +21,9 @@ export default {
},
methods: {
check(){
this.$parent.handleClick('second');
},
getUid() {
return v4();
},
......
......@@ -10,6 +10,10 @@
v-html="scope.row.projectName"></router-link>
<div v-else v-html="scope.row.projectName || '--'"></div>
</template>
<template slot="agency" slot-scope="scope">
<router-link :to="`/company/${encodeStr(scope.row.agencyId)}`" tag="a" class="a-link" v-if="scope.row.agencyId&&scope.row.agency" v-html="scope.row.agency"></router-link>
<div v-else v-html="scope.row.agency || '--'"></div>
</template>
<template slot="province" slot-scope="scope">
{{scope.row.province}}{{`${scope.row.city?'-'+scope.row.city:''}`}}{{`${scope.row.area?'-'+scope.row.area:''}`}}
</template>
......@@ -40,21 +44,21 @@ export default {
},
defaultSort: { prop: 'issueTime', order: 'descending' },
forData: [
{ label: '项目名称', prop: 'projectName', minWidth: '300', slot: true, fixed: true },
{ label: '发布日期', prop: 'issueTime', sortable: 'custom', descending: '3', ascending: '4', width: '120' },
{ label: '预算金额(万元)', prop: 'projectAmount', sortable: 'custom', descending: '1', ascending: '2', width: '140' },
{ label: '项目类型', prop: 'projectCategory', width: '110' },
{ label: '项目地区', prop: 'province', width: '120', slot: true },
{ label: '招标阶段', prop: 'tenderStage', width: '90' },
{ label: '招采单位联系人', prop: 'contact', width: '120' },
{ label: '招采单位联系方式', prop: 'contactTel', width: '130' },
{ label: '代理单位', prop: 'agency', minWidth: '170' },
{ label: '代理单位联系人', prop: 'agencyContact', width: '120' },
{ label: '代理单位联系方式', prop: 'agencyContactTel', width: '130' },
{ label: '报名截止日期', prop: 'overTime', width: '110' }
{label: '项目名称', prop: 'projectName', minWidth: '300', slot: true, fixed: true},
{label: '发布日期', prop: 'issueTime', sortable: 'custom', descending: '3', ascending: '4', width: '120'},
{label: '预算金额(万元)', prop: 'projectAmount', sortable: 'custom', descending: '1', ascending: '2', width: '140'},
{label: '项目类型', prop: 'projectCategory', width: '110'},
{label: '项目地区', prop: 'province', width: '120', slot: true},
{label: '招标阶段', prop: 'tenderStage', width: '90'},
{label: '招采单位联系人', prop: 'contact', width: '120'},
{label: '招采单位联系方式', prop: 'contactTel', width: '130'},
{label: '代理单位', prop: 'agency', minWidth: '170', slot: true},
{label: '代理单位联系人', prop: 'agencyContact', width: '120'},
{label: '代理单位联系方式', prop: 'agencyContactTel', width: '130'},
{label: '报名截止日期', prop: 'overTime', width: '110'}
],
formData: [
{ type: 7, fieldName: 'province', value: '', props: { multiple: true }, placeholder: '项目地区', options: [], uid: this.getUid() },
{ type: 7, fieldName: 'province', value: '',props: {multiple: true}, placeholder: '项目地区', options: [], uid: this.getUid() },
{ type: 4, fieldName: 'projectCategory', value: '', placeholder: '项目类型', options: [], uid: this.getUid() },
{ type: 4, fieldName: 'tenderStage', value: '', placeholder: '招标阶段', options: [], uid: this.getUid() },
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入关键词查询', options: [], uid: this.getUid() }
......
......@@ -86,7 +86,7 @@
</template>
</head-form-new>
<skeleton v-if="isSkeleton" style="padding: 16px"></skeleton>
<tables v-if="!isSkeleton" :tableLoading="tableLoading" :tableData="tableData" :forData="forData" :tableDataTotal="tableDataTotal"
<tables v-if="!isSkeleton" :indexFixed="true" :tableLoading="tableLoading" :tableData="tableData" :forData="forData" :tableDataTotal="tableDataTotal"
:queryParams="queryParams" @handle-current-change="handleCurrentChange" @sort-change="sortChange">
<template slot="companyName" slot-scope="scope">
<router-link :to="scope.row.uipId?`/enterprise/${encodeStr(scope.row.companyId)}`:`/company/${encodeStr(scope.row.companyId)}`" tag="a"
......@@ -139,7 +139,7 @@ export default {
pageSize: 20
},
forData: [
{ label: '企业名称', prop: 'companyName', width: '369', slot: true },
{ label: '企业名称', prop: 'companyName', width: '369', slot: true,fixed:true },
{ label: '区域', prop: 'area', width: '120', slot: true },
{ label: '招标数量', prop: 'biddingCount', width: '100', sortable: true },
{ label: '城投拿地', prop: 'landInfoCount', width: '100', sortable: true },
......
......@@ -882,6 +882,8 @@ export default {
data.push(list[i])
}
this.$nextTick(()=>{
// 让 指定id 的 div 的_echarts_instance_属性值 为 空状态
document.getElementById("zbtj-echarts").removeAttribute('_echarts_instance_');
let myChart = echarts.init(document.getElementById("zbtj-echarts"))
let option ={
tooltip: {
......@@ -1020,6 +1022,8 @@ export default {
require('@/assets/images/index/10.png'),
]
this.$nextTick(()=>{
// 让 指定id 的 div 的_echarts_instance_属性值 为 空状态
document.getElementById("zbph-echarts").removeAttribute('_echarts_instance_');
let myChart = echarts.init(document.getElementById("zbph-echarts"))
// let option ={
// legend: {
......
......@@ -6,17 +6,18 @@
<span class="common-title">全国经济大全</span>
<el-form ref="queryForm" :model="queryParams" :inline="true" size="small">
<el-form-item prop="year">
<el-select v-model="queryParams.year" filterable class="form-content-width" placeholder="请选择" @change="handleSearch" :popper-append-to-body='false'>
<el-select v-model="queryParams.year" filterable class="form-content-width same-select-com" placeholder="请选择" :class="[`select-adaptive-${inputID1}`]" @change="handleSearch" :popper-append-to-body='false'>
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item.year" :value="item.year" />
</el-select>
</el-form-item>
<el-form-item prop="area">
<el-cascader
ref="address"
:class="[`select-adaptive-${inputID2}`]"
:options="addressList"
:props="props"
v-model="queryParams.address"
@change="handleSearch"
@change="iptAdaptive(inputID2,true)"
placeholder="地区选择"
collapse-tags
clearable></el-cascader>
......@@ -124,6 +125,7 @@
import dataRegion from '@/assets/json/dataRegion'
import economiesDetail from './economies-detail'
import skeleton from '../../component/skeleton'
import { v4 } from "uuid";
export default {
name: 'NationalEconomies',
components: {
......@@ -149,7 +151,9 @@
tableDataTotal: null,
show_page:true,
MaxPage:500,
isSkeleton:true
isSkeleton:true,
inputID1:this.getUid(),
inputID2:this.getUid()
}
},
created() {
......@@ -353,7 +357,89 @@
path: '/macro/economies',
query:params
})
}
},
iptAdaptive(uid, multiple = false) {
multiple ? this.multipleAdaptiveHandle(uid) : this.iptAdaptiveHandle(uid);
},
getUid() {
return v4();
},
// 多选处理
async multipleAdaptiveHandle(uid) {
try {
await this.$nextTick();
const dom = document.querySelector(`.select-adaptive-${uid}`);
const iptChild = dom.querySelector(".el-input__inner");
if (dom) {
const textContainer = document.createElement("span");
const textName = `text-${uid}`;
textContainer.classList.add(textName);
const selectChildren = dom.querySelectorAll(".el-tag");
if (selectChildren.length) {
let width = 0;
selectChildren.forEach(item => {
const text = item.textContent;
const itemInfo = window.getComputedStyle(item);
textContainer.style.setProperty("visibility", "hidden");
textContainer.style.setProperty("display", "inline-block");
textContainer.style.setProperty("font-size", "14px");
textContainer.style.setProperty("padding", itemInfo.padding);
textContainer.style.setProperty("box-sizing", "border-box");
textContainer.textContent = text;
document.body.append(textContainer);
width += textContainer.offsetWidth + parseInt(itemInfo.marginLeft) + parseInt(itemInfo.marginRight);
textContainer.remove();
});
dom.style.setProperty("width", `${width + 20}px`);
this.handleSearch();
return;
}
textContainer.style.setProperty("visibility", "hidden");
textContainer.style.setProperty("display", "inline-block");
textContainer.style.setProperty("font-size", "14px");
textContainer.style.setProperty("padding", "0px 8px");
textContainer.style.setProperty("box-sizing", "border-box");
textContainer.textContent = iptChild.getAttribute("placeholder");
document.body.append(textContainer);
// let containerWidth = textContainer.offsetWidth + 12 + 8;
let containerWidth = 150;
textContainer.remove();
dom.style.setProperty("width", `${containerWidth}px`);
this.handleSearch();
}
} catch (error) {
console.log(error);
}
},
// 单选处理
async iptAdaptiveHandle(uid) {
try {
await this.$nextTick();
const dom = document.querySelector(`.select-adaptive-${uid}`);
const realStyles = window.getComputedStyle(dom);
if (dom) {
const iptChild = dom.querySelector(".el-input__inner");
const textContainer = document.createElement("span");
const textName = `text-${uid}`;
textContainer.classList.add(textName);
textContainer.style.setProperty("visibility", "hidden");
textContainer.style.setProperty("display", "inline-block");
textContainer.style.setProperty("font-size", "14px");
const hasPadding = (parseInt(realStyles.paddingLeft) || parseInt(realStyles.paddingRight)) ? true : false;
hasPadding ? textContainer.style.setProperty("padding", "0px 8px") : null;
textContainer.style.setProperty("box-sizing", "border-box");
textContainer.textContent = iptChild.value ? iptChild.value : iptChild.getAttribute("placeholder");
document.body.append(textContainer);
let containerWidth = textContainer.offsetWidth + 12 + 8;
textContainer.remove();
dom.style.setProperty("width", `${containerWidth}px`);
}
this.handleSearch();
} catch (error) {
}
},
}
}
</script>
......@@ -361,6 +447,7 @@
<style lang="scss" scoped>
.qgjjdq{
@import "@/assets/styles/search-common.scss";
.query-box{
margin: -8px 0 8px 0;
.a-link:hover{
......@@ -370,15 +457,42 @@
.el-form{
margin-left: 24px;
}
::v-deep .el-form{
.el-form-item--small.el-form-item{
margin-top: 0;
margin-bottom: 0;
}
.el-form-item{
height: 32px;
}
.el-form-item__content{
line-height: 32px;
}
.el-input{
line-height: 32px;
.el-input__inner{
height: 32px;
line-height: 32px;
border-radius: 4px;
border: 0;
}
}
.is-focus{
.el-input__inner{
background: #F4F6F9;
}
}
}
.form-content-width{
width: 110px;
width: 90px;
}
::v-deep .el-cascader{
width: 200px;
width: 180px;
.el-cascader__tags{
flex-wrap: inherit;
.el-tag{
max-width: 130px;
/*max-width: 130px;*/
}
}
}
......
......@@ -343,10 +343,11 @@
companyName:"",
// accendant:"",
}
console.log(this.$route.query.projectname)
if(this.thistype == 'project'){
this.queryParam.businessId = this.searchParam.businessId
this.companyName = ""
this.queryParam.companyName=this.$route.query.projectname
this.queryParam.companyName=''
}
if(this.thistype == 'custom'){
this.queryParam.customerId = this.searchParam.customerId
......
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