Commit 9cf9c7b2 by 李小惠

校准库存数据,报表数据,修改接口文档

parent 10fc714b
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -3,6 +3,7 @@ package com.junmp.jyzb.api.bean.dto;
import lombok.Data;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Data
......@@ -20,6 +21,7 @@ public class OrgDto {
private Integer statusFlag;
private Integer delFlag;
private Integer childCount;
private Date updateTime;
private List<OrgDto> children = new ArrayList<>();
public void addChild(OrgDto child) {
......
......@@ -12,4 +12,6 @@ public class SizeAndTypeDto {
private List<TypeDto> typeList;
private List<OrgDto> orgList;
}
......@@ -21,5 +21,9 @@ public class QueryEquipmentTypeReq {
private String typeName;
private String nickName;
private Date updateTime;
/**
* 是否需要添加组织机构返回
*/
private Boolean flag;
}
......@@ -47,6 +47,13 @@ public class DeviceConfigController {
public ApiRes<Boolean> updateDeviceConfig(@RequestBody UpdateDeivceConfigReq req){
return ApiRes.success(deviceConfigService.updateDeviceConfig(req));
}
//删除配置(通道和本地主机配置)
@PostMapping(path="/delDeviceConfig",name="删除配置#logType=30")
@ApiOperation("删除配置")
public ApiRes<Boolean> delDeviceConfig(@RequestBody UpdateDeivceConfigReq req){
return ApiRes.success(deviceConfigService.delDeviceConfig(req));
}
//查询配置Page(通道和本地主机配置)
@PostMapping(path="/showDeviceConfigPage",name="查询配置Page#enable")
@ApiOperation("查询配置Page")
......@@ -72,6 +79,13 @@ public class DeviceConfigController {
public ApiRes<Boolean> updateWarehouseDev(@RequestBody UpdateWarehouseDevReq req){
return ApiRes.success(warehouseDevService.updateWarehouseDev(req));
}
//删除除湿机配置
@PostMapping(path="/delWarehouseDev",name="删除除湿机配置#logType=30")
@ApiOperation("删除除湿机配置")
public ApiRes<Boolean> delWarehouseDev(@RequestBody UpdateWarehouseDevReq req){
return ApiRes.success(warehouseDevService.delWarehouseDev(req));
}
//查看除湿机配置
@PostMapping(path="/showWarehouseDevList",name="查看除湿机配置#enable")
@ApiOperation("查看除湿机配置")
......
......@@ -19,7 +19,13 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
@RestController
......@@ -110,16 +116,12 @@ public class EquipmentTypeController {
return ApiRes.success(equipmentTypeService.alignTypeInfo(req));
}
@PostMapping(path = "/exportSizeAndType",name = "导出指定时间后的类型号型#enable")
@ApiOperation("导出指定时间后的类型号型")
@PostMapping(path = "/exportSizeAndType",name = "导出指定时间后的类型号型组织机构#enable")
@ApiOperation("导出指定时间后的类型号型组织机构")
public ApiRes<String> exportSizeAndType(@RequestBody QueryEquipmentTypeReq req){
return ApiRes.success(equipmentTypeService.exportSizeAndType(req));
}
@PostMapping(path = "/exportOrgInfo",name = "导出指定时间后的组织机构#enable")
@ApiOperation("导出指定时间后的组织机构")
public ApiRes<String> exportOrgInfo(@RequestBody QueryEquipmentTypeReq req){
return ApiRes.success(equipmentTypeService.exportOrgInfo(req));
}
}
......@@ -91,7 +91,8 @@ public class TjController {
@PostMapping("/TjOrgPrice")
@ApiOperation("/财务统计报表")
public ApiRes<PageResult<TjOrgPriceDto>> TjOrgPrice(@RequestBody TjOrgPriceReq req){
return ApiRes.success(tjService.TjOrgPrice(req));
PageResult<TjOrgPriceDto> tjOrgPriceDtoPageResult = tjService.TjOrgPrice(req);
return ApiRes.success(tjOrgPriceDtoPageResult);
}
@PostMapping("/TjOrgPriceSum")
@ApiOperation("/财务统计报表汇总")
......
......@@ -139,6 +139,7 @@ import static com.junmp.junmpProcess.common.CommonConstants.*;
List<OrderDetail> list = orderDetailService.list(new LambdaQueryWrapper<OrderDetail>()
.eq(OrderDetail::getOrderId, updateOrderReq.getId()));
updateOrderReq.setId(existOrder.getId());
existOrder.setActualQuantity(0);
orderMainService.updateById(existOrder);
// orderMainService.ChangeOrderState(updateOrderReq);
List<UpdateOrderDetailReq> collect = list.stream().map(orderDetail -> {
......@@ -148,8 +149,11 @@ import static com.junmp.junmpProcess.common.CommonConstants.*;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
updateOrderDetailReq.setProductionDate(format.format(orderDetail.getProductionDate()));
}
orderDetail.setActualNum(0);
orderDetail.setModifyQuantity(0);
return updateOrderDetailReq;
}).collect(Collectors.toList());
orderDetailService.updateBatchById(list);
updateOrderReq.setDetailList(collect);
//将单据上传到rabbitmq
orderMainService.AddFinishOrder(updateOrderReq);
......
......@@ -29,4 +29,6 @@ public interface DeviceConfigService extends IService<DeviceConfig> {
List<String> alignDeviceConfigInfo(UpdateDeivceConfigReq req);
boolean delDeviceConfig(UpdateDeivceConfigReq req);
}
......@@ -35,5 +35,4 @@ public interface EquipmentTypeService extends IService<EquipmentType> {
String exportSizeAndType(QueryEquipmentTypeReq req);
String exportOrgInfo(QueryEquipmentTypeReq req);
}
......@@ -21,4 +21,6 @@ public interface WarehouseDevService extends IService<WarehouseDev> {
List<WarehouseDev> showWarehouseDevList(UpdateWarehouseDevReq req);
List<WarehouseDevInfoDto> alignWarehouseDevInfo(UpdateWarehouseDevReq req);
boolean delWarehouseDev(UpdateWarehouseDevReq req);
}
......@@ -10,6 +10,7 @@ import com.junmp.jyzb.api.bean.dto.MQDto;
import com.junmp.jyzb.api.bean.query.QueryDeviceConfigReq;
import com.junmp.jyzb.api.bean.req.UpdateDeivceConfigReq;
import com.junmp.jyzb.api.bean.req.UpdateWarehouseDevReq;
import com.junmp.jyzb.api.exception.enums.CabinetExceptionEnum;
import com.junmp.jyzb.entity.DeviceConfig;
import com.junmp.jyzb.entity.WarehouseDev;
import com.junmp.jyzb.mapper.WarehouseDevMapper;
......@@ -18,6 +19,7 @@ import com.junmp.jyzb.mapper.DeviceConfigMapper;
import com.junmp.jyzb.service.WarehouseDevService;
import com.junmp.jyzb.utils.DateTimeUtil;
import com.junmp.jyzb.utils.RabbitMQSendMsg;
import com.junmp.v2.common.exception.base.ServiceException;
import com.junmp.v2.common.util.BeanPlusUtil;
import com.junmp.v2.db.api.factory.PageFactory;
import com.junmp.v2.db.api.factory.PageResultFactory;
......@@ -124,6 +126,14 @@ public class DeviceConfigServiceImpl extends ServiceImpl<DeviceConfigMapper, Dev
return deviceConfigList;
}
@Override
public boolean delDeviceConfig(UpdateDeivceConfigReq req) {
if (ObjectUtil.isNull(req.getId())){
throw new ServiceException(CabinetExceptionEnum.PARAMETER_ERROR);
}
return this.removeById(req.getId());
}
}
......
......@@ -66,11 +66,18 @@ public class EquipmentTypeServiceImpl extends ServiceImpl<EquipmentTypeMapper, E
private RabbitMQSendMsg MQ;
@Resource
private PubOrgService pubOrgService;
@Resource
private EquipmentSizeService equipmentSizeService;
private static final String REDIS_TYPE = "Type_";
private List<EquipmentTypeDto> typeDto;
private ArrayList<String> ids;
private static final String DES_ALGORITHM = "DES";
private static final String CBC_PADDING = "DES/CBC/PKCS5Padding";
private static final int CHUNK_SIZE = 8;
//查询出类别表中数据的所有装备信息(入库时调用)
public List<EquipmentTypeDto> getEquipmentList(QueryEquipmentTypeReq req) {
List<EquipmentType> list = list(new LambdaQueryWrapper<EquipmentType>()
......@@ -537,6 +544,18 @@ public class EquipmentTypeServiceImpl extends ServiceImpl<EquipmentTypeMapper, E
return sizeDto;
}).collect(Collectors.toList());
sizeAndType.setSizeList(CollectionUtil.isNotEmpty(collect1)?collect1:new ArrayList<>());
if (req.getFlag()){
List<PubOrg> pubList = pubOrgService.list(new LambdaQueryWrapper<PubOrg>().eq(PubOrg::getUpdateTime, req.getUpdateTime())
.eq(PubOrg::getDelFlag,1));
List<OrgDto> collect2 = pubList.stream().map(pubOrg -> {
OrgDto orgDto = new OrgDto();
BeanPlusUtil.copyProperties(pubOrg, orgDto);
return orgDto;
}).collect(Collectors.toList());
sizeAndType.setOrgList(CollectionUtil.isNotEmpty(collect2)?collect2:new ArrayList<>());
}
String jsonString = JSONObject.toJSONString(sizeAndType);
try {
......@@ -562,6 +581,34 @@ public class EquipmentTypeServiceImpl extends ServiceImpl<EquipmentTypeMapper, E
// 对加密结果进行Base64编码并返回
return Base64.getEncoder().encodeToString(encryptedBytes);
// byte[] byKey = Arrays.copyOf("junmp888".getBytes(StandardCharsets.UTF_8), 8);
// byte[] iv = { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x90, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF };
//
// SecretKeySpec secretKeySpec = new SecretKeySpec(byKey, DES_ALGORITHM);
// IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
//
// Cipher desCipher = Cipher.getInstance(CBC_PADDING);
// desCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
//
// byte[] inputByteArray = jsonString.getBytes(StandardCharsets.UTF_8);
// int offset = 0;
//
// StringBuilder encryptedString = new StringBuilder();
//
// while (offset < inputByteArray.length) {
// int length = Math.min(CHUNK_SIZE, inputByteArray.length - offset);
// byte[] chunk = new byte[length];
// System.arraycopy(inputByteArray, offset, chunk, 0, length);
//
// byte[] encryptedChunk = desCipher.doFinal(chunk);
// String base64EncodedChunk = Base64.getEncoder().encodeToString(encryptedChunk);
// encryptedString.append(base64EncodedChunk);
//
// offset += CHUNK_SIZE;
// }
// return encryptedString.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
......@@ -569,10 +616,6 @@ public class EquipmentTypeServiceImpl extends ServiceImpl<EquipmentTypeMapper, E
}
@Override
public String exportOrgInfo(QueryEquipmentTypeReq req) {
return null;
}
}
......@@ -142,6 +142,9 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
private RabbitMQSendMsg MQ;
@Resource
private EquipmentTypeService equipmentTypeService;
@Resource
private WarehouseInventoryService warehouseInventoryService;
......@@ -1061,25 +1064,41 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
if (ObjectUtil.isNull(detailJsonReq.getModifyQuantity())){
detailJsonReq.setModifyQuantity(uploadDetailReq.getModifyQuantity());
}
int subNum=detailJsonReq.getModifyQuantity()-detailJsonReq.getNum();
int subNum=detailJsonReq.getModifyQuantity()-(ObjectUtil.isNull(detailJsonReq.getNum())?0:detailJsonReq.getNum());
detailJsonReq.setSizeName(uploadDetailReq.getSizeName());
detailJsonReq.setTypeName(uploadDetailReq.getTypeName());
//添加list为修改库存Summary
UpdateOrderDetailReq data = new UpdateOrderDetailReq();
data.setActualNum(detailJsonReq.getNum());
data.setActualNum(ObjectUtil.isNull(detailJsonReq.getNum())?0:detailJsonReq.getNum());
data.setWarehouseId(detailJsonReq.getLocationId());
data.setWarehouseName(detailJsonReq.getLocationName());
data.setSizeId(detailJsonReq.getSizeId());
data.setTypeId(detailJsonReq.getTypeId());
data.setPrice(detailJsonReq.getPrice().toString());
data.setProperty(detailJsonReq.getProperty());
data.setSizeId(ObjectUtil.isNull(detailJsonReq.getSizeId())? uploadDetailReq.getSizeId():detailJsonReq.getSizeId());
data.setTypeId(ObjectUtil.isNull(detailJsonReq.getTypeId())? uploadDetailReq.getTypeId():detailJsonReq.getTypeId());
BigDecimal price=BigDecimal.ZERO;
if (ObjectUtil.isNull(detailJsonReq.getPrice())){
price=equipmentTypeService.getOne(new LambdaQueryWrapper<EquipmentType>()
.eq(EquipmentType::getId,uploadDetailReq.getTypeId()))
.getPrice();
}
data.setPrice(ObjectUtil.isNull(detailJsonReq.getPrice())? price.toString() :detailJsonReq.getPrice().toString());
data.setProperty(ObjectUtil.isNull(detailJsonReq.getProperty())?0:detailJsonReq.getProperty());
data.setSizeName(detailJsonReq.getSizeName());
data.setTypeName(detailJsonReq.getTypeName());
data.setModifyQuantity(detailJsonReq.getModifyQuantity());
orderDetailReqList.add(data);
//添加出入库日志记录
if (orderMain.getOrderType().equals("in")){
s = s+detailJsonReq.getLocationName()+"--"+detailJsonReq.getTypeName()+"【"+
detailJsonReq.getSizeName()+"】,单价:"+detailJsonReq.getPrice()+",数量实入:"+detailJsonReq.getNum()+",记账:"+ detailJsonReq.getModifyQuantity()+"\n";
detailJsonReq.getSizeName()+"】,单价:"+(ObjectUtil.isNull(detailJsonReq.getPrice())?price:detailJsonReq.getPrice())
+",数量实入:"+(ObjectUtil.isNull(detailJsonReq.getNum())?0:detailJsonReq.getNum())+",记账:"+ detailJsonReq.getModifyQuantity()+"\n";
}else {
s = s+detailJsonReq.getLocationName()+"--"+detailJsonReq.getTypeName()+"【"+
detailJsonReq.getSizeName()+"】,单价:"+(ObjectUtil.isNull(detailJsonReq.getPrice())?price:detailJsonReq.getPrice())
+",数量实出:"+(ObjectUtil.isNull(detailJsonReq.getNum())?0:detailJsonReq.getNum())+",记账:"+ detailJsonReq.getModifyQuantity()+"\n";
}
if (subNum>0){
//实际出库或者入库数量大于实际数量,则对空数据进行增删改查
......@@ -1087,17 +1106,17 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
for (int j = 0; j < subNum; j++) {
inventory.setEpc("0");
inventory.setLocationId(detailJsonReq.getLocationId());
inventory.setSizeId(detailJsonReq.getSizeId());
inventory.setTypeId(detailJsonReq.getTypeId());
inventory.setSizeId(ObjectUtil.isNull(detailJsonReq.getSizeId())? uploadDetailReq.getSizeId():detailJsonReq.getSizeId());
inventory.setTypeId(ObjectUtil.isNull(detailJsonReq.getTypeId())? uploadDetailReq.getTypeId():detailJsonReq.getTypeId());
inventory.setOrgId(orderMain.getEndOrgId());
inventory.setLocationType(0);
inventory.setPrice(detailJsonReq.getPrice());
inventory.setPrice(ObjectUtil.isNull(detailJsonReq.getPrice())?price:detailJsonReq.getPrice());
inventory.setProperty(0);
addInvList.add(inventory);
warehouseInventory.setOrgId(orderMain.getEndOrgId());
warehouseInventory.setLocationId(detailJsonReq.getLocationId());
warehouseInventory.setTypeId(detailJsonReq.getTypeId());
warehouseInventory.setSizeId(detailJsonReq.getSizeId());
warehouseInventory.setTypeId(ObjectUtil.isNull(detailJsonReq.getTypeId())? uploadDetailReq.getTypeId():detailJsonReq.getTypeId());
warehouseInventory.setSizeId(ObjectUtil.isNull(detailJsonReq.getSizeId())? uploadDetailReq.getSizeId():detailJsonReq.getSizeId());
warehouseInventory.setLocationType("0");
addWareInvList.add(warehouseInventory);
}
......@@ -1105,17 +1124,17 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
List<Inventory> list1 = inventoryService.list(new LambdaQueryWrapper<Inventory>()
.eq(Inventory::getEpc, "0")
.eq(Inventory::getLocationId, detailJsonReq.getLocationId())
.eq(Inventory::getSizeId, detailJsonReq.getSizeId())
.eq(Inventory::getSizeId, ObjectUtil.isNull(detailJsonReq.getSizeId())? uploadDetailReq.getSizeId():detailJsonReq.getSizeId())
.eq(Inventory::getOrgId, orderMain.getStartOrgId())
.eq(Inventory::getTypeId, detailJsonReq.getTypeId())
.eq(Inventory::getTypeId, ObjectUtil.isNull(detailJsonReq.getTypeId())? uploadDetailReq.getTypeId():detailJsonReq.getTypeId())
.eq(Inventory::getPrice, detailJsonReq.getPrice())
.eq(Inventory::getLocationType, "0"));
List<WarehouseInventory> list2 = warehouseInventoryService.list(new LambdaQueryWrapper<WarehouseInventory>()
.eq(WarehouseInventory::getEpc, "0")
.eq(WarehouseInventory::getLocationId, detailJsonReq.getLocationId())
.eq(WarehouseInventory::getOrgId, orderMain.getStartOrgId())
.eq(WarehouseInventory::getSizeId, detailJsonReq.getSizeId())
.eq(WarehouseInventory::getTypeId, detailJsonReq.getTypeId()));
.eq(WarehouseInventory::getSizeId, ObjectUtil.isNull(detailJsonReq.getSizeId())? uploadDetailReq.getSizeId():detailJsonReq.getSizeId())
.eq(WarehouseInventory::getTypeId,ObjectUtil.isNull(detailJsonReq.getTypeId())? uploadDetailReq.getTypeId():detailJsonReq.getTypeId()));
if (list1.size()>0){
......@@ -1329,7 +1348,6 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
}
SysUser sysUser = sysUserService.getById(userId);
orderLog.setCreateUser(sysUser.getNickName());
orderLog.setCreateUser(req.getUserId());
orderLog.setCreateTime(DateTimeUtil.getCurrentDateTime());
orderLog.setProcessType("accounting");
//将记账记录保存
......@@ -1465,10 +1483,10 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
inventorySummary.setOutboundNumber(0);
inventorySummary.setUseNumber(0);
inventorySummary.setStockNumber(upReq.getModifyQuantity());
}
addList.add(inventorySummary);
}
}
}
boolean a=true;
if (addList.size()>0){
......
......@@ -5,11 +5,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.junmp.jyzb.api.bean.dto.FetchingDataDto.WarehouseDevInfoDto;
import com.junmp.jyzb.api.bean.dto.MQDto;
import com.junmp.jyzb.api.bean.req.UpdateWarehouseDevReq;
import com.junmp.jyzb.api.exception.enums.CabinetExceptionEnum;
import com.junmp.jyzb.entity.WarehouseDev;
import com.junmp.jyzb.service.WarehouseDevService;
import com.junmp.jyzb.mapper.WarehouseDevMapper;
import com.junmp.jyzb.utils.DateTimeUtil;
import com.junmp.jyzb.utils.RabbitMQSendMsg;
import com.junmp.v2.common.exception.base.ServiceException;
import com.junmp.v2.common.util.BeanPlusUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -86,6 +88,14 @@ public class WarehouseDevServiceImpl extends ServiceImpl<WarehouseDevMapper, War
return warehouseDevMapper.alignWarehouseDevInfo(req.getOrgId(),date);
}
@Override
public boolean delWarehouseDev(UpdateWarehouseDevReq req) {
if (ObjectUtil.isNull(req.getId())){
throw new ServiceException(CabinetExceptionEnum.PARAMETER_ERROR);
}
return warehouseDevService.removeById(req.getId());
}
}
......
......@@ -31,35 +31,6 @@
<select id="TjOrgPrice" resultType="com.junmp.jyzb.api.bean.dto.TjDto.TjOrgPriceDto">
<!-- select t1.org_id,t1.org_code,t1.org_name,t1.d_name,-->
<!-- t2.start_num,t2.start_price,t2.end_num,t2.end_price,t2.add_num,t2.add_price,t2.destory_num,t2.destory_price-->
<!-- FROM(-->
<!-- SELECT-->
<!-- `org_id`, `org_code`, `org_name`, `d_name`-->
<!-- FROM `pub_org`-->
<!-- WHERE org_id=#{orgId}-->
<!-- ) as t1-->
<!-- CROSS JOIN (select sum(COALESCE(vpss.start_num,0)) as start_num,sum(COALESCE(vpss.start_price,0)) as start_price,-->
<!-- sum(COALESCE(vpss.end_num,0)) as end_num,sum(COALESCE(vpss.end_price,0)) as end_price,-->
<!-- sum(COALESCE(vpss.add_num,0)) as add_num,sum(COALESCE(vpss.destory_num,0)) as destory_num,-->
<!-- sum(COALESCE(vpss.add_price,0)) as add_price,sum(COALESCE(vpss.destory_price,0)) as destory_price-->
<!-- FROM vie_price_sum_summary vpss-->
<!-- left join pub_org po on vpss.org_id_int=po.org_id-->
<!-- where vpss.`year`= #{year} and po.del_flag=1 and (po.org_id=#{orgId} or po.org_parent_ids like CONCAT('%', #{orgId}, '%'))-->
<!-- <if test="typeIdsList!=null and typeIdsList.size() > 0">-->
<!-- and type_id in-->
<!-- <foreach collection="typeIdsList" item="item" open="(" separator="," close=")">-->
<!-- #{item}-->
<!-- </foreach>-->
<!-- </if>-->
<!-- <if test="sizeNameList!=null and sizeNameList.size() > 0">-->
<!-- AND-->
<!-- <foreach collection="sizeNameList " item="item" open="(" separator="or" close=")">-->
<!-- size_name like CONCAT('%', #{item}, '%')-->
<!-- </foreach>-->
<!-- </if>-->
<!-- ) as t2-->
SELECT
t3.org_id,t3.org_code,t3.org_name,t3.d_name,coalesce(t4.start_num,0) as start_num,
......
package com.junmp.police.test;
import org.apache.tomcat.util.digester.DocumentProperties;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Base64Test {
public static void main(String args[]){
// String str = "abc";
// byte[] val = str.getBytes(StandardCharsets.UTF_8);
// String base64EncodedChunk = Base64.getEncoder().encodeToString(val);
// System.out.println(base64EncodedChunk);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论