Commit 0f52741f authored by tangwei's avatar tangwei

Merge branch 'developer' of http://172.16.10.76/moa/amos-boot-biz into developer

parents 0a5259f5 9eef42fe
...@@ -13,5 +13,5 @@ import java.util.List; ...@@ -13,5 +13,5 @@ import java.util.List;
*/ */
public interface RescueEquipmentMapper extends BaseMapper<RescueEquipment> { public interface RescueEquipmentMapper extends BaseMapper<RescueEquipment> {
List<Long> getVehicleCodeCodeList(boolean isDelete); List<Long> getVehicleCodeCodeList(boolean isDelete,Long companyId);
} }
...@@ -16,5 +16,5 @@ public interface SpecialPositionStaffMapper extends BaseMapper<SpecialPositionSt ...@@ -16,5 +16,5 @@ public interface SpecialPositionStaffMapper extends BaseMapper<SpecialPositionSt
List<SpecialPositionStaff> getPositionStaffList(boolean isDelete); List<SpecialPositionStaff> getPositionStaffList(boolean isDelete);
List<Long> getPositionStaffCodeList(boolean isDelete); List<Long> getPositionStaffCodeList(boolean isDelete,Long companyId);
} }
...@@ -5,6 +5,6 @@ ...@@ -5,6 +5,6 @@
<select id="getVehicleCodeCodeList" resultType="java.lang.Long"> <select id="getVehicleCodeCodeList" resultType="java.lang.Long">
select distinct vehicle_type_code select distinct vehicle_type_code
from cb_rescue_equipment from cb_rescue_equipment
where is_delete = #{isDelete} where is_delete = #{isDelete} and company_id = #{companyId}
</select> </select>
</mapper> </mapper>
...@@ -11,6 +11,6 @@ ...@@ -11,6 +11,6 @@
<select id="getPositionStaffCodeList" resultType="java.lang.Long"> <select id="getPositionStaffCodeList" resultType="java.lang.Long">
select distinct position_name_code select distinct position_name_code
from cb_special_position_staff from cb_special_position_staff
where is_delete = #{isDelete} where is_delete = #{isDelete} and company_id = #{companyId}
</select> </select>
</mapper> </mapper>
package com.yeejoin.amos.boot.module.common.biz.controller; package com.yeejoin.amos.boot.module.common.biz.controller;
import com.yeejoin.amos.feign.privilege.model.AgencyUserModel; import com.yeejoin.amos.feign.privilege.model.AgencyUserModel;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -117,8 +118,8 @@ public class ContractController extends BaseController { ...@@ -117,8 +118,8 @@ public class ContractController extends BaseController {
@ApiOperation(httpMethod = "GET", value = "维保合同分页查询", notes = "维保合同分页查询") @ApiOperation(httpMethod = "GET", value = "维保合同分页查询", notes = "维保合同分页查询")
public ResponseModel<Page<ContractDto>> queryForPage(@RequestParam(value = "current") int current, @RequestParam public ResponseModel<Page<ContractDto>> queryForPage(@RequestParam(value = "current") int current, @RequestParam
(value = "size") int size, Long companyId, Long signedCompanyId, String name, Long typeCode, (value = "size") int size, Long companyId, Long signedCompanyId, String name, Long typeCode,
Date signedDate) { String signedDate) {
Page<ContractDto> page = new Page<ContractDto>(); Page<ContractDto> page = new Page<>();
page.setCurrent(current); page.setCurrent(current);
page.setSize(size); page.setSize(size);
AgencyUserModel amosUser = getUserInfo(); AgencyUserModel amosUser = getUserInfo();
......
...@@ -103,11 +103,13 @@ public class RescueEquipmentController extends BaseController { ...@@ -103,11 +103,13 @@ public class RescueEquipmentController extends BaseController {
@ApiOperation(httpMethod = "GET", value = "救援装备分页查询", notes = "救援装备分页查询") @ApiOperation(httpMethod = "GET", value = "救援装备分页查询", notes = "救援装备分页查询")
public ResponseModel<Page<RescueEquipmentDto>> queryForPage(@RequestParam(value = "current") int current, public ResponseModel<Page<RescueEquipmentDto>> queryForPage(@RequestParam(value = "current") int current,
@RequestParam(value = "size") int size, @RequestParam(value = "size") int size,
Long companyId,
String vehicleTypeCode) { String vehicleTypeCode) {
Page<RescueEquipmentDto> page = new Page<RescueEquipmentDto>(); Page<RescueEquipmentDto> page = new Page<RescueEquipmentDto>();
page.setCurrent(current); page.setCurrent(current);
page.setSize(size); page.setSize(size);
return ResponseHelper.buildResponse(rescueEquipmentServiceImpl.queryForRescueEquipmentPage(page, vehicleTypeCode)); return ResponseHelper.buildResponse(rescueEquipmentServiceImpl.queryForRescueEquipmentPage(page, false,
companyId, vehicleTypeCode));
} }
/** /**
...@@ -143,7 +145,7 @@ public class RescueEquipmentController extends BaseController { ...@@ -143,7 +145,7 @@ public class RescueEquipmentController extends BaseController {
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(httpMethod = "GET", value = "查询没有数据的岗位类型", notes = "查询没有数据的岗位类型") @ApiOperation(httpMethod = "GET", value = "查询没有数据的岗位类型", notes = "查询没有数据的岗位类型")
@GetMapping(value = "/vehicle_list") @GetMapping(value = "/vehicle_list")
public ResponseModel<HashMap<Object, Object>> getRescueEquipmentList() throws Exception { public ResponseModel<HashMap<Object, Object>> getRescueEquipmentList(Long companyId) throws Exception {
return ResponseHelper.buildResponse(rescueEquipmentServiceImpl.getRescueEquipmentList()); return ResponseHelper.buildResponse(rescueEquipmentServiceImpl.getRescueEquipmentList(companyId));
} }
} }
...@@ -102,11 +102,14 @@ public class SpecialPositionStaffController extends BaseController { ...@@ -102,11 +102,14 @@ public class SpecialPositionStaffController extends BaseController {
@ApiOperation(httpMethod = "GET", value = "特岗人员分页查询", notes = "特岗人员分页查询") @ApiOperation(httpMethod = "GET", value = "特岗人员分页查询", notes = "特岗人员分页查询")
public ResponseModel<Page<SpecialPositionStaffDto>> queryForPage(@RequestParam(value = "current") int current, public ResponseModel<Page<SpecialPositionStaffDto>> queryForPage(@RequestParam(value = "current") int current,
@RequestParam(value = "size") int size, @RequestParam(value = "size") int size,
Long companyId,
String positionNameCode) { String positionNameCode) {
Page<SpecialPositionStaffDto> page = new Page<SpecialPositionStaffDto>(); Page<SpecialPositionStaffDto> page = new Page<SpecialPositionStaffDto>();
page.setCurrent(current); page.setCurrent(current);
page.setSize(size); page.setSize(size);
return ResponseHelper.buildResponse(specialPositionStaffServiceImpl.queryForSpecialPositionStaffPage(page, return ResponseHelper.buildResponse(specialPositionStaffServiceImpl.queryForSpecialPositionStaffPage(page,
companyId,
false,
positionNameCode)); positionNameCode));
} }
...@@ -143,7 +146,7 @@ public class SpecialPositionStaffController extends BaseController { ...@@ -143,7 +146,7 @@ public class SpecialPositionStaffController extends BaseController {
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(httpMethod = "GET", value = "查询没有数据的岗位类型", notes = "查询没有数据的岗位类型") @ApiOperation(httpMethod = "GET", value = "查询没有数据的岗位类型", notes = "查询没有数据的岗位类型")
@GetMapping(value = "/gwmc_list") @GetMapping(value = "/gwmc_list")
public ResponseModel<HashMap<Object, Object>> getSpecialPositionStaffList() throws Exception { public ResponseModel<HashMap<Object, Object>> getSpecialPositionStaffList(Long companyId) throws Exception {
return ResponseHelper.buildResponse(specialPositionStaffServiceImpl.getSpecialPositionStaffList()); return ResponseHelper.buildResponse(specialPositionStaffServiceImpl.getSpecialPositionStaffList(companyId));
} }
} }
...@@ -47,7 +47,7 @@ public class ContractServiceImpl extends BaseService<ContractDto, Contract, Cont ...@@ -47,7 +47,7 @@ public class ContractServiceImpl extends BaseService<ContractDto, Contract, Cont
* 分页查询 * 分页查询
*/ */
public Page<ContractDto> queryForContractPage(Page<ContractDto> page, Boolean isDelete, Long companyId, public Page<ContractDto> queryForContractPage(Page<ContractDto> page, Boolean isDelete, Long companyId,
Long signedCompanyId, String name, Long typeCode, Date signedDate, Long signedCompanyId, String name, Long typeCode, String signedDate,
String amosUserId) { String amosUserId) {
if (ValidationUtil.isEmpty(companyId)) { if (ValidationUtil.isEmpty(companyId)) {
MaintenanceCompany company = maintenanceCompanyService.getMaintenanceCompany(amosUserId); MaintenanceCompany company = maintenanceCompanyService.getMaintenanceCompany(amosUserId);
...@@ -62,7 +62,7 @@ public class ContractServiceImpl extends BaseService<ContractDto, Contract, Cont ...@@ -62,7 +62,7 @@ public class ContractServiceImpl extends BaseService<ContractDto, Contract, Cont
@Condition(Operator.eq) Long signedCompanyId, @Condition(Operator.eq) Long signedCompanyId,
@Condition(Operator.like) String name, @Condition(Operator.like) String name,
@Condition(Operator.eq) Long typeCode, @Condition(Operator.eq) Long typeCode,
@Condition(Operator.likeLeft) Date signedDate) { @Condition(Operator.likeRight) String signedDate) {
return this.queryForPage(page, null, false, isDelete, companyId, signedCompanyId, name, typeCode, signedDate); return this.queryForPage(page, null, false, isDelete, companyId, signedCompanyId, name, typeCode, signedDate);
} }
......
...@@ -34,8 +34,10 @@ public class RescueEquipmentServiceImpl extends BaseService<RescueEquipmentDto, ...@@ -34,8 +34,10 @@ public class RescueEquipmentServiceImpl extends BaseService<RescueEquipmentDto,
* 分页查询 * 分页查询
*/ */
public Page<RescueEquipmentDto> queryForRescueEquipmentPage(Page<RescueEquipmentDto> page, public Page<RescueEquipmentDto> queryForRescueEquipmentPage(Page<RescueEquipmentDto> page,
@Condition(Operator.eq) Boolean isDelete,
@Condition(Operator.eq) Long companyId,
@Condition(Operator.eq) String vehicleTypeCode) { @Condition(Operator.eq) String vehicleTypeCode) {
return this.queryForPage(page, null, false, vehicleTypeCode); return this.queryForPage(page, null, false, isDelete, companyId, vehicleTypeCode);
} }
/** /**
...@@ -60,11 +62,11 @@ public class RescueEquipmentServiceImpl extends BaseService<RescueEquipmentDto, ...@@ -60,11 +62,11 @@ public class RescueEquipmentServiceImpl extends BaseService<RescueEquipmentDto,
return update; return update;
} }
public HashMap<Object, Object> getRescueEquipmentList() throws Exception { public HashMap<Object, Object> getRescueEquipmentList(Long companyId) throws Exception {
// 查询所有岗位类型 // 查询所有岗位类型
List<MenuFrom> menuList = dataDictionaryService.getGWMCDataDictionary("JYZBLX"); List<MenuFrom> menuList = dataDictionaryService.getGWMCDataDictionary("JYZBLX");
// 查询已有数据的岗位类型 // 查询已有数据的岗位类型
List<Long> vehicleCodeCodeList = this.baseMapper.getVehicleCodeCodeList(false); List<Long> vehicleCodeCodeList = this.baseMapper.getVehicleCodeCodeList(false, companyId);
// 排除已有数据的,返回 // 排除已有数据的,返回
for (int i = 0; i < menuList.size(); i++) { for (int i = 0; i < menuList.size(); i++) {
if (vehicleCodeCodeList.contains(Long.valueOf(menuList.get(i).getKey()))) { if (vehicleCodeCodeList.contains(Long.valueOf(menuList.get(i).getKey()))) {
......
...@@ -33,8 +33,10 @@ public class SpecialPositionStaffServiceImpl extends BaseService<SpecialPosition ...@@ -33,8 +33,10 @@ public class SpecialPositionStaffServiceImpl extends BaseService<SpecialPosition
* 分页查询 * 分页查询
*/ */
public Page<SpecialPositionStaffDto> queryForSpecialPositionStaffPage(Page<SpecialPositionStaffDto> page, public Page<SpecialPositionStaffDto> queryForSpecialPositionStaffPage(Page<SpecialPositionStaffDto> page,
@Condition(Operator.eq) Long companyId,
@Condition(Operator.eq) Boolean isDelete,
@Condition(Operator.eq) String positionNameCode) { @Condition(Operator.eq) String positionNameCode) {
return this.queryForPage(page, null, false, positionNameCode); return this.queryForPage(page, null, false, companyId, isDelete, positionNameCode);
} }
/** /**
...@@ -59,11 +61,11 @@ public class SpecialPositionStaffServiceImpl extends BaseService<SpecialPosition ...@@ -59,11 +61,11 @@ public class SpecialPositionStaffServiceImpl extends BaseService<SpecialPosition
return update; return update;
} }
public HashMap<Object, Object> getSpecialPositionStaffList() throws Exception { public HashMap<Object, Object> getSpecialPositionStaffList(Long companyId) throws Exception {
// 查询所有岗位类型 // 查询所有岗位类型
List<MenuFrom> menuList = dataDictionaryService.getGWMCDataDictionary("GWMC"); List<MenuFrom> menuList = dataDictionaryService.getGWMCDataDictionary("GWMC");
// 查询已有数据的岗位类型 // 查询已有数据的岗位类型
List<Long> positionStaffCodeList = this.baseMapper.getPositionStaffCodeList(false); List<Long> positionStaffCodeList = this.baseMapper.getPositionStaffCodeList(false,companyId);
// 排除已有数据的,返回 // 排除已有数据的,返回
for (int i = 0; i < menuList.size(); i++) { for (int i = 0; i < menuList.size(); i++) {
if (positionStaffCodeList.contains(Long.valueOf(menuList.get(i).getKey()))) { if (positionStaffCodeList.contains(Long.valueOf(menuList.get(i).getKey()))) {
......
...@@ -137,22 +137,22 @@ public class ExcelController extends BaseController { ...@@ -137,22 +137,22 @@ public class ExcelController extends BaseController {
OrgUsrServiceImpl orgUsrService; OrgUsrServiceImpl orgUsrService;
@Autowired @Autowired
IDutyPersonService iDutyPersonService; IDutyPersonService iDutyPersonService;
@Autowired @Autowired
IMaintenanceCompanyService maintenanceCompanyService; IMaintenanceCompanyService maintenanceCompanyService;
@Autowired @Autowired
DynamicFormColumnServiceImpl dynamicFormColumnService; DynamicFormColumnServiceImpl dynamicFormColumnService;
@Autowired @Autowired
Sequence sequence; Sequence sequence;
@Autowired @Autowired
IKeySiteService keySiteService; IKeySiteService keySiteService;
private static final String NOT_DUTY = "休班"; private static final String NOT_DUTY = "休班";
private static final String PERSON = "PERSON"; private static final String PERSON = "PERSON";
private static final String MAINTENANCE_PERSON = "maintenancePerson"; private static final String MAINTENANCE_PERSON = "maintenancePerson";
...@@ -214,14 +214,15 @@ public class ExcelController extends BaseController { ...@@ -214,14 +214,15 @@ public class ExcelController extends BaseController {
firefightersExcelDtoList, FirefightersExcelDto.class, null, false); firefightersExcelDtoList, FirefightersExcelDto.class, null, false);
break; break;
case ExcelEnums.WBRY: case ExcelEnums.WBRY:
List<MaintenancePersonExcleDto> maintenancePersonExcleDtoList = maintenanceCompanyService.exportToMaintenancePersonExcel(); List<MaintenancePersonExcleDto> maintenancePersonExcleDtoList =
maintenanceCompanyService.exportToMaintenancePersonExcel();
ExcelUtil.createTemplate(response, excelDto.getFileName(), excelDto.getSheetName(), ExcelUtil.createTemplate(response, excelDto.getFileName(), excelDto.getSheetName(),
maintenancePersonExcleDtoList, MaintenancePersonExcleDto.class, null, false); maintenancePersonExcleDtoList, MaintenancePersonExcleDto.class, null, false);
break; break;
case ExcelEnums.KEYSITE: case ExcelEnums.KEYSITE:
List<KeySiteExcleDto> keySiteDtoList = keySiteService.exportToExcel(); List<KeySiteExcleDto> keySiteDtoList = keySiteService.exportToExcel();
ExcelUtil.createTemplate(response, excelDto.getFileName(), excelDto.getSheetName(), ExcelUtil.createTemplate(response, excelDto.getFileName(), excelDto.getSheetName(),
keySiteDtoList, KeySiteExcleDto.class, null, false); keySiteDtoList, KeySiteExcleDto.class, null, false);
break; break;
} }
} catch (Exception e) { } catch (Exception e) {
...@@ -266,66 +267,67 @@ public class ExcelController extends BaseController { ...@@ -266,66 +267,67 @@ public class ExcelController extends BaseController {
case ExcelEnums.WBRY: case ExcelEnums.WBRY:
excelImportMaintenancePerson(multipartFile, ExcelEnums.WBRY); excelImportMaintenancePerson(multipartFile, ExcelEnums.WBRY);
case ExcelEnums.KEYSITE: case ExcelEnums.KEYSITE:
excelImportkeySite(multipartFile, ExcelEnums.KEYSITE); excelImportkeySite(multipartFile, ExcelEnums.KEYSITE);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
throw new RuntimeException("系统异常!"); throw new RuntimeException("系统异常!");
} }
} }
/** /**
* @author chenhao
* @param multipartFile * @param multipartFile
* @param wbry * @param wbry
* @throws Exception * @throws Exception
* @author chenhao
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
private void excelImportkeySite(MultipartFile multipartFile, String wbry) throws Exception { private void excelImportkeySite(MultipartFile multipartFile, String wbry) throws Exception {
List<KeySiteExcleDto> excelDtoList = ExcelUtil.readFirstSheetExcel(multipartFile, List<KeySiteExcleDto> excelDtoList = ExcelUtil.readFirstSheetExcel(multipartFile,
KeySiteExcleDto.class, 1); KeySiteExcleDto.class, 1);
keySiteService.saveExcle( excelDtoList); keySiteService.saveExcle(excelDtoList);
} }
/** /**
* @author chenhao
* @param multipartFile * @param multipartFile
* @param wbry * @param wbry
* @throws Exception * @throws Exception
* @author chenhao
*/ */
private void excelImportMaintenancePerson(MultipartFile multipartFile, String wbry) throws Exception { private void excelImportMaintenancePerson(MultipartFile multipartFile, String wbry) throws Exception {
List<MaintenancePersonExcleDto> excelDtoList = ExcelUtil.readFirstSheetExcel(multipartFile, List<MaintenancePersonExcleDto> excelDtoList = ExcelUtil.readFirstSheetExcel(multipartFile,
MaintenancePersonExcleDto.class, 1); MaintenancePersonExcleDto.class, 1);
List<DynamicFormColumn> columns = dynamicFormColumnService.list(new LambdaQueryWrapper<DynamicFormColumn>().eq(DynamicFormColumn::getGroupCode, MAINTENANCE_PERSON)); List<DynamicFormColumn> columns =
List<MaintenanceCompany> maintenanceCompanyList = new ArrayList<MaintenanceCompany>(); dynamicFormColumnService.list(new LambdaQueryWrapper<DynamicFormColumn>().eq(DynamicFormColumn::getGroupCode, MAINTENANCE_PERSON));
List<DynamicFormInstance> dynamicFormInstanceList = new ArrayList<DynamicFormInstance>(); List<MaintenanceCompany> maintenanceCompanyList = new ArrayList<MaintenanceCompany>();
for (MaintenancePersonExcleDto maintenancePersonExcleDto : excelDtoList) { List<DynamicFormInstance> dynamicFormInstanceList = new ArrayList<DynamicFormInstance>();
Long instanceId = sequence.nextId(); for (MaintenancePersonExcleDto maintenancePersonExcleDto : excelDtoList) {
// 先填充主表的属性 Long instanceId = sequence.nextId();
MaintenanceCompany maintenanceCompany = new MaintenanceCompany(); // 先填充主表的属性
maintenanceCompany = Bean.toPo(maintenancePersonExcleDto, maintenanceCompany); MaintenanceCompany maintenanceCompany = new MaintenanceCompany();
maintenanceCompany.setType(PERSON); maintenanceCompany = Bean.toPo(maintenancePersonExcleDto, maintenanceCompany);
if (maintenanceCompany.getParentId() != null) { maintenanceCompany.setType(PERSON);
long getParentId = Long.valueOf(maintenancePersonExcleDto.getParentName().split("@")[1]); if (maintenanceCompany.getParentId() != null) {
maintenanceCompany.setParentId(getParentId); long getParentId = Long.valueOf(maintenancePersonExcleDto.getParentName().split("@")[1]);
} maintenanceCompany.setParentId(getParentId);
if (maintenanceCompanyService.checkPersonCodeExists(maintenancePersonExcleDto.getCode())) { }
maintenanceCompany.setCode(maintenancePersonExcleDto.getCode()); if (maintenanceCompanyService.checkPersonCodeExists(maintenancePersonExcleDto.getCode())) {
} else { maintenanceCompany.setCode(maintenancePersonExcleDto.getCode());
maintenanceCompany.setCode(null); } else {
} maintenanceCompany.setCode(null);
maintenanceCompany.setOrgCode(null); }
maintenanceCompany.setBizCode(sequence.nextId() + ""); maintenanceCompany.setOrgCode(null);
maintenanceCompany.setInstanceId(instanceId); maintenanceCompany.setBizCode(sequence.nextId() + "");
maintenanceCompanyList.add(maintenanceCompany); maintenanceCompany.setInstanceId(instanceId);
maintenanceCompanyService.maintenancePersonExcleDtoToDynamicFormInstanceList(columns,maintenancePersonExcleDto, instanceId, dynamicFormInstanceList); maintenanceCompanyList.add(maintenanceCompany);
} maintenanceCompanyService.maintenancePersonExcleDtoToDynamicFormInstanceList(columns,
maintenanceCompanyService.saveMaintenanceCompanyBatch(maintenanceCompanyList,dynamicFormInstanceList); maintenancePersonExcleDto, instanceId, dynamicFormInstanceList);
} }
maintenanceCompanyService.saveMaintenanceCompanyBatch(maintenanceCompanyList, dynamicFormInstanceList);
private void excelImportDutyPerson(MultipartFile multipartFile, String dutyType) throws Exception { }
private void excelImportDutyPerson(MultipartFile multipartFile, String dutyType) throws Exception {
String fileName = multipartFile.getOriginalFilename(); String fileName = multipartFile.getOriginalFilename();
if (fileName == null) { if (fileName == null) {
...@@ -683,6 +685,15 @@ public class ExcelController extends BaseController { ...@@ -683,6 +685,15 @@ public class ExcelController extends BaseController {
fireExpertsServiceImpl.saveBatch(excelEntityList); fireExpertsServiceImpl.saveBatch(excelEntityList);
} }
/**
* 导出值班模板
*
* @param response
* @param beginDate 值班开始日期
* @param endDate 值班结束日期
* @param excelDto 导出类型参数
* @param ids 部门或队伍的id列表,逗号分隔
*/
@TycloudOperation(needAuth = false, ApiLevel = UserType.AGENCY) @TycloudOperation(needAuth = false, ApiLevel = UserType.AGENCY)
@ApiOperation(value = "导出值班模板", notes = "导出值班模板") @ApiOperation(value = "导出值班模板", notes = "导出值班模板")
@GetMapping(value = "/duty_template") @GetMapping(value = "/duty_template")
......
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