Commit 7030c580 by MMF

MMF 2026-04-17 帮扶计划项目改成多选

parent d19b0784
...@@ -53,6 +53,9 @@ public class ZqbfXmzBfxqController extends BaseController { ...@@ -53,6 +53,9 @@ public class ZqbfXmzBfxqController extends BaseController {
public AjaxResult add(@RequestBody ZqbfXmzBfxq zqbfXmzBfxq) { public AjaxResult add(@RequestBody ZqbfXmzBfxq zqbfXmzBfxq) {
try { try {
return toAjax(zqbfXmzBfxqService.add(zqbfXmzBfxq, getUsername())); return toAjax(zqbfXmzBfxqService.add(zqbfXmzBfxq, getUsername()));
} catch (BusinessException e) {
log.warn("最强帮扶-新增帮扶需求失败:" + e.getMessage());
return warn(e.getMessage());
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage()); log.error(e.getMessage());
return error(e.getMessage()); return error(e.getMessage());
...@@ -66,6 +69,9 @@ public class ZqbfXmzBfxqController extends BaseController { ...@@ -66,6 +69,9 @@ public class ZqbfXmzBfxqController extends BaseController {
public AjaxResult edit(@RequestBody ZqbfXmzBfxq zqbfXmzBfxq) { public AjaxResult edit(@RequestBody ZqbfXmzBfxq zqbfXmzBfxq) {
try { try {
return toAjax(zqbfXmzBfxqService.edit(zqbfXmzBfxq, getUsername())); return toAjax(zqbfXmzBfxqService.edit(zqbfXmzBfxq, getUsername()));
} catch (BusinessException e) {
log.warn("最强帮扶-修改帮扶需求失败:" + e.getMessage());
return warn(e.getMessage());
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage()); log.error(e.getMessage());
return error(e.getMessage()); return error(e.getMessage());
...@@ -79,6 +85,9 @@ public class ZqbfXmzBfxqController extends BaseController { ...@@ -79,6 +85,9 @@ public class ZqbfXmzBfxqController extends BaseController {
public AjaxResult delete(@PathVariable Long[] ids) { public AjaxResult delete(@PathVariable Long[] ids) {
try { try {
return toAjax(zqbfXmzBfxqService.delete(ids)); return toAjax(zqbfXmzBfxqService.delete(ids));
} catch (BusinessException e) {
log.warn("最强帮扶-删除帮扶需求失败:" + e.getMessage());
return warn(e.getMessage());
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage()); log.error(e.getMessage());
return error(e.getMessage()); return error(e.getMessage());
......
...@@ -30,6 +30,7 @@ public class ZqbfXmzBfxq implements Serializable { ...@@ -30,6 +30,7 @@ public class ZqbfXmzBfxq implements Serializable {
* 项目ID:zqbf_xmz_bfxm.id * 项目ID:zqbf_xmz_bfxm.id
*/ */
private Long xmid; private Long xmid;
private String xmids;
/** /**
* 帮扶开始时间 * 帮扶开始时间
*/ */
......
...@@ -36,6 +36,8 @@ public class ZqbfXmzBfxqQuery extends BaseEntity { ...@@ -36,6 +36,8 @@ public class ZqbfXmzBfxqQuery extends BaseEntity {
* 基层单位ID * 基层单位ID
*/ */
private Long xmid; private Long xmid;
private String xmids;
private List<String> xmidList;
/** /**
* 项目名称 * 项目名称
*/ */
......
...@@ -36,11 +36,14 @@ public class ZqbfXmzBfxqVo implements Serializable { ...@@ -36,11 +36,14 @@ public class ZqbfXmzBfxqVo implements Serializable {
* 项目ID:zqbf_xmz_bfxm.id * 项目ID:zqbf_xmz_bfxm.id
*/ */
private Long xmid; private Long xmid;
private String xmids;
private String xmmc;
/** /**
* 项目名称 * 项目名称
*/ */
@Excel(name = "项目名称") @Excel(name = "项目名称")
private String xmmc; private String xmmcs;
/** /**
* 项目组别 * 项目组别
*/ */
......
package com.qianhe.zqbf.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ZqbfXmzBfxqxm implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 需求项目ID
*/
private Long xqxmid;
/**
* 需求ID
*/
private Long xqid;
/**
* 项目ID
*/
private Long xmid;
}
package com.qianhe.zqbf.mapper;
import com.qianhe.zqbf.domain.ZqbfXmzBfxqxm;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ZqbfXmzBfxqxmMapper {
/**
* 条件查询
*/
List<ZqbfXmzBfxqxm> list(ZqbfXmzBfxqxm zqbfXmzBfxqxm);
/**
* 新增
*/
int batchAdd(@Param("dataList") List<ZqbfXmzBfxqxm> dataList);
/**
* 删除
*/
int delete(Long[] ids);
}
...@@ -16,6 +16,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -16,6 +16,7 @@ import org.springframework.transaction.annotation.Transactional;
import com.qianhe.common.constant.MtConstant; import com.qianhe.common.constant.MtConstant;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import static com.qianhe.common.utils.PageUtils.startPage; import static com.qianhe.common.utils.PageUtils.startPage;
...@@ -31,6 +32,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -31,6 +32,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
private ZqczXmzBfpzMapper zqczXmzBfpzMapper; private ZqczXmzBfpzMapper zqczXmzBfpzMapper;
@Autowired @Autowired
private ZqczXmzBffkMapper zqczXmzBffkMapper; private ZqczXmzBffkMapper zqczXmzBffkMapper;
@Autowired
private ZqbfXmzBfxqxmMapper zqbfXmzBfxqxmMapper;
/** /**
...@@ -46,6 +49,13 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -46,6 +49,13 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
if (SecurityUtils.hasPermi(MtConstant.SGZQ_XMZ_ZJ)) { if (SecurityUtils.hasPermi(MtConstant.SGZQ_XMZ_ZJ)) {
zqbfXmzBfxqQuery.setUser_id(SecurityUtils.getUserId()); zqbfXmzBfxqQuery.setUser_id(SecurityUtils.getUserId());
} }
String xmids = zqbfXmzBfxqQuery.getXmids();
if (StringUtils.isNotBlank(xmids)) {
List<String> xmidList = Arrays.asList(xmids.split(","));
zqbfXmzBfxqQuery.setXmidList(xmidList);
}
List<ZqbfXmzBfxqVo> dataList = zqbfXmzBfxqMapper.list(zqbfXmzBfxqQuery); List<ZqbfXmzBfxqVo> dataList = zqbfXmzBfxqMapper.list(zqbfXmzBfxqQuery);
return dataList; return dataList;
} }
...@@ -65,6 +75,11 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -65,6 +75,11 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
@Transactional @Transactional
@Override @Override
public int add(ZqbfXmzBfxq zqbfXmzBfxq, String username) { public int add(ZqbfXmzBfxq zqbfXmzBfxq, String username) {
String xmids = zqbfXmzBfxq.getXmids();
if (StringUtils.isEmpty(xmids)) {
throw new BusinessException("帮扶项目不能为空");
}
// 新增帮扶需求 // 新增帮扶需求
zqbfXmzBfxq.setDqzt("1"); zqbfXmzBfxq.setDqzt("1");
zqbfXmzBfxq.setGxr(username); zqbfXmzBfxq.setGxr(username);
...@@ -72,6 +87,15 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -72,6 +87,15 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
zqbfXmzBfxq.setCjsj(new Date()); zqbfXmzBfxq.setCjsj(new Date());
Long xqid = zqbfXmzBfxqMapper.add(zqbfXmzBfxq); Long xqid = zqbfXmzBfxqMapper.add(zqbfXmzBfxq);
// 同步需求项目关联表
zqbfXmzBfxqxmMapper.delete(new Long[]{xqid});
List<ZqbfXmzBfxqxm> dataList = new ArrayList<>();
List<String> xmidList = Arrays.asList(xmids.split(","));
for (String xmid : xmidList) {
dataList.add(ZqbfXmzBfxqxm.builder().xqid(xqid).xmid(xqid).build());
}
zqbfXmzBfxqxmMapper.batchAdd(dataList);
// 新增帮扶记录 // 新增帮扶记录
ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl(); ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl();
zqczXmzBfjl.setXqid(xqid); zqczXmzBfjl.setXqid(xqid);
...@@ -84,18 +108,42 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -84,18 +108,42 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
/** /**
* 修改 * 修改
*/ */
@Transactional
@Override @Override
public int edit(ZqbfXmzBfxq zqbfXmzBfxq, String username) { public int edit(ZqbfXmzBfxq zqbfXmzBfxq, String username) {
Long xqid = zqbfXmzBfxq.getXqid();
String xmids = zqbfXmzBfxq.getXmids();
if (xqid == null) {
throw new BusinessException("需求ID不能为空");
}
if (StringUtils.isEmpty(xmids)) {
throw new BusinessException("帮扶项目不能为空");
}
zqbfXmzBfxq.setGxr(username); zqbfXmzBfxq.setGxr(username);
return zqbfXmzBfxqMapper.edit(zqbfXmzBfxq); zqbfXmzBfxqMapper.edit(zqbfXmzBfxq);
// 同步需求项目关联表
zqbfXmzBfxqxmMapper.delete(new Long[]{xqid});
List<ZqbfXmzBfxqxm> dataList = new ArrayList<>();
List<String> xmidList = Arrays.asList(xmids.split(","));
for (String xmid : xmidList) {
dataList.add(ZqbfXmzBfxqxm.builder().xqid(xqid).xmid(xqid).build());
}
zqbfXmzBfxqxmMapper.batchAdd(dataList);
return 1;
} }
/** /**
* 删除 * 删除
*/ */
@Transactional
@Override @Override
public int delete(Long[] ids) { public int delete(Long[] ids) {
return zqbfXmzBfxqMapper.delete(ids); zqbfXmzBfxqMapper.delete(ids);
zqbfXmzBfxqxmMapper.delete(ids);
return 1;
} }
/** /**
...@@ -117,7 +165,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -117,7 +165,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
// 修改需求 // 修改需求
zqbfXmzBfxq.setDqzt("3"); zqbfXmzBfxq.setDqzt("3");
edit(zqbfXmzBfxq, username); zqbfXmzBfxq.setGxr(username);
zqbfXmzBfxqMapper.edit(zqbfXmzBfxq);
// 新增帮扶记录 // 新增帮扶记录
ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl(); ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl();
...@@ -151,7 +200,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -151,7 +200,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
// 修改需求 // 修改需求
zqbfXmzBfxq.setDqzt("2"); zqbfXmzBfxq.setDqzt("2");
edit(zqbfXmzBfxq, username); zqbfXmzBfxq.setGxr(username);
zqbfXmzBfxqMapper.edit(zqbfXmzBfxq);
// 新增帮扶记录 // 新增帮扶记录
ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl(); ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl();
...@@ -191,7 +241,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -191,7 +241,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
ZqbfXmzBfxq zqbfXmzBfxq = new ZqbfXmzBfxq(); ZqbfXmzBfxq zqbfXmzBfxq = new ZqbfXmzBfxq();
zqbfXmzBfxq.setXqid(xqid); zqbfXmzBfxq.setXqid(xqid);
zqbfXmzBfxq.setDqzt("4"); zqbfXmzBfxq.setDqzt("4");
edit(zqbfXmzBfxq, username); zqbfXmzBfxq.setGxr(username);
zqbfXmzBfxqMapper.edit(zqbfXmzBfxq);
// 新增帮扶记录 // 新增帮扶记录
ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl(); ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl();
...@@ -217,7 +268,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -217,7 +268,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
// 修改需求 // 修改需求
zqbfXmzBfxq.setDqzt("5"); zqbfXmzBfxq.setDqzt("5");
edit(zqbfXmzBfxq, username); zqbfXmzBfxq.setGxr(username);
zqbfXmzBfxqMapper.edit(zqbfXmzBfxq);
// 新增帮扶记录 // 新增帮扶记录
ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl(); ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl();
...@@ -252,7 +304,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -252,7 +304,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
ZqbfXmzBfxq zqbfXmzBfxq = new ZqbfXmzBfxq(); ZqbfXmzBfxq zqbfXmzBfxq = new ZqbfXmzBfxq();
zqbfXmzBfxq.setXqid(xqid); zqbfXmzBfxq.setXqid(xqid);
zqbfXmzBfxq.setDqzt(dqzt); zqbfXmzBfxq.setDqzt(dqzt);
edit(zqbfXmzBfxq, username); zqbfXmzBfxq.setGxr(username);
zqbfXmzBfxqMapper.edit(zqbfXmzBfxq);
// 新增帮扶记录 // 新增帮扶记录
ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl(); ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl();
...@@ -288,7 +341,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -288,7 +341,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
zqbfXmzBfxq.setDqzt("7"); zqbfXmzBfxq.setDqzt("7");
zqbfXmzBfxq.setBfms(bfms); zqbfXmzBfxq.setBfms(bfms);
zqbfXmzBfxq.setWcsj(new Date()); zqbfXmzBfxq.setWcsj(new Date());
edit(zqbfXmzBfxq, username); zqbfXmzBfxq.setGxr(username);
zqbfXmzBfxqMapper.edit(zqbfXmzBfxq);
// 新增帮扶记录 // 新增帮扶记录
ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl(); ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl();
...@@ -318,7 +372,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService { ...@@ -318,7 +372,8 @@ public class ZqbfXmzBfxqServiceImpl implements ZqbfXmzBfxqService {
zqbfXmzBfxq.setXqid(xqid); zqbfXmzBfxq.setXqid(xqid);
zqbfXmzBfxq.setDqzt("8"); zqbfXmzBfxq.setDqzt("8");
zqbfXmzBfxq.setWcsj(new Date()); zqbfXmzBfxq.setWcsj(new Date());
edit(zqbfXmzBfxq, username); zqbfXmzBfxq.setGxr(username);
zqbfXmzBfxqMapper.edit(zqbfXmzBfxq);
// 新增帮扶记录 // 新增帮扶记录
ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl(); ZqczXmzBfjl zqczXmzBfjl = new ZqczXmzBfjl();
......
...@@ -9,7 +9,9 @@ ...@@ -9,7 +9,9 @@
<result property="dwid" column="dwid"/> <result property="dwid" column="dwid"/>
<result property="dwmc" column="dwmc"/> <result property="dwmc" column="dwmc"/>
<result property="xmid" column="xmid"/> <result property="xmid" column="xmid"/>
<result property="xmids" column="xmids"/>
<result property="xmmc" column="xmmc"/> <result property="xmmc" column="xmmc"/>
<result property="xmmcs" column="xmmcs"/>
<result property="xmzb" column="xmzb"/> <result property="xmzb" column="xmzb"/>
<result property="xqms" column="xqms"/> <result property="xqms" column="xqms"/>
<result property="dqzt" column="dqzt"/> <result property="dqzt" column="dqzt"/>
...@@ -27,9 +29,6 @@ ...@@ -27,9 +29,6 @@
bfxq.xqid, bfxq.xqid,
bfxq.dwid, bfxq.dwid,
CONCAT( dept.create_by, dept.dept_name ) AS dwmc, CONCAT( dept.create_by, dept.dept_name ) AS dwmc,
bfxq.xmid,
bfxm.xmmc,
bfxm.xmzb,
bfxq.xqms, bfxq.xqms,
bfxq.dqzt, bfxq.dqzt,
bfxq.bfkssj, bfxq.bfkssj,
...@@ -38,11 +37,15 @@ ...@@ -38,11 +37,15 @@
bfxq.lxdh, bfxq.lxdh,
bfxq.gxsj, bfxq.gxsj,
bfxq.wcsj, bfxq.wcsj,
bfxq.bfms bfxq.bfms,
GROUP_CONCAT(bfxm.xmid) AS xmids,
GROUP_CONCAT(bfxm.xmmc) AS xmmcs,
GROUP_CONCAT(DISTINCT bfxm.xmzb) AS xmzb
FROM FROM
zqbf_xmz_bfxq bfxq zqbf_xmz_bfxq bfxq
LEFT JOIN sys_dept dept ON bfxq.dwid = dept.dept_id LEFT JOIN sys_dept dept ON bfxq.dwid = dept.dept_id
LEFT JOIN zqbf_xmz_bfxm bfxm ON bfxq.xmid = bfxm.xmid LEFT JOIN zqbf_xmz_bfxq_bfxm bfxqxm ON bfxq.xqid = bfxqxm.xqid
LEFT JOIN zqbf_xmz_bfxm bfxm ON bfxqxm.xmid = bfxm.xmid
LEFT JOIN zqcz_xmz_ddzj ddzj ON bfxq.xqid = ddzj.xqid LEFT JOIN zqcz_xmz_ddzj ddzj ON bfxq.xqid = ddzj.xqid
LEFT JOIN zqbf_xmz_bfzj bfzj ON ddzj.ddzj = bfzj.zjid LEFT JOIN zqbf_xmz_bfzj bfzj ON ddzj.ddzj = bfzj.zjid
</sql> </sql>
...@@ -51,9 +54,6 @@ ...@@ -51,9 +54,6 @@
bfxq.xqid, bfxq.xqid,
bfxq.dwid, bfxq.dwid,
CONCAT( dept.create_by, dept.dept_name ), CONCAT( dept.create_by, dept.dept_name ),
bfxq.xmid,
bfxm.xmmc,
bfxm.xmzb,
bfxq.xqms, bfxq.xqms,
bfxq.dqzt, bfxq.dqzt,
bfxq.bfkssj, bfxq.bfkssj,
...@@ -69,7 +69,10 @@ ...@@ -69,7 +69,10 @@
<include refid="selectCommon"></include> <include refid="selectCommon"></include>
<where> <where>
<if test="xqid != null ">AND bfxq.xqid = #{xqid}</if> <if test="xqid != null ">AND bfxq.xqid = #{xqid}</if>
<if test="xmid != null ">AND bfxq.xmid = #{xmid}</if> <if test="xmidList != null and not xmidList.isEmpty()">AND (bfxm.xmid IN
<foreach collection="xmidList" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>)</if>
<if test="user_id != null ">AND bfzj.user_id = #{user_id}</if> <if test="user_id != null ">AND bfzj.user_id = #{user_id}</if>
<if test="dwid != null ">AND (dept.dept_id = #{dwid} OR FIND_IN_SET(#{dwid}, dept.ancestors))</if> <if test="dwid != null ">AND (dept.dept_id = #{dwid} OR FIND_IN_SET(#{dwid}, dept.ancestors))</if>
<if test="xmmc != null and xmmc != ''">AND bfxm.xmmc like concat('%', #{xmmc}, '%')</if> <if test="xmmc != null and xmmc != ''">AND bfxm.xmmc like concat('%', #{xmmc}, '%')</if>
......
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qianhe.zqbf.mapper.ZqbfXmzBfxqxmMapper">
<!-- 返回实体 -->
<resultMap id="ZqbfXmzBfxqxmResult" type="ZqbfXmzBfxqxm">
<result property="xqxmid" column="xqxmid"/>
<result property="xqid" column="xqid"/>
<result property="xmid" column="xmid"/>
</resultMap>
<!-- 通用查询 -->
<sql id="selectCommon">
SELECT xqxmid, xqid, xmid from zqbf_xmz_bfxq_bfxm
</sql>
<!-- 条件查询 -->
<select id="list" parameterType="ZqbfXmzBfxqxm" resultMap="ZqbfXmzBfxqxmResult">
<include refid="selectCommon"></include>
<where>
<if test="xqxmid != null ">AND xqxmid = #{xqxmid}</if>
<if test="xqid != null ">AND xqid = #{xqid}</if>
<if test="xmid != null ">AND xmid = #{xmid}</if>
</where>
ORDER BY xqxmid DESC
</select>
<!-- 新增 -->
<insert id="batchAdd" parameterType="ZqbfXmzBfxqxm">
INSERT INTO ZqbfXmzBfxqxm (xqid, xmid) VALUES
<foreach collection="dataList" item="item" separator=",">
(#{item.xqid}, #{item.xmid})
</foreach>
</insert>
<!-- 删除 -->
<delete id="delete" parameterType="long">
DELETE FROM zqbf_xmz_bfxq_bfxm WHERE xqid IN
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>
\ No newline at end of file
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