Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
张雷
/
skboot-zhongye
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
构建
提交
问题看板
文件
提交
网络
比较
分支
标签
68cb9086
由
康伟
编写于
2024-10-25 11:51:38 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
kangwei :药剂入库审核,出库、与入库完善
1 个父辈
68cc9b2c
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
126 行增加
和
85 行删除
sk-module-biz/src/main/java/com/skua/modules/erp/controller/MaterialINController.java
sk-module-biz/src/main/java/com/skua/modules/erp/service/IMaterialINService.java
sk-module-biz/src/main/java/com/skua/modules/erp/service/impl/MaterialINServiceImpl.java
sk-module-equipment/src/main/java/com/skua/modules/equipment/entity/EquipmentInChild.java
sk-module-equipment/src/main/java/com/skua/modules/equipment/entity/EquipmentOutChild.java
sk-module-equipment/src/main/java/com/skua/modules/equipment/service/impl/EquipmentInServiceImpl.java
sk-module-equipment/src/main/java/com/skua/modules/equipment/service/impl/EquipmentOutServiceImpl.java
sk-module-biz/src/main/java/com/skua/modules/erp/controller/MaterialINController.java
查看文件 @
68cb908
...
...
@@ -339,10 +339,12 @@ public class MaterialINController {
Result
<
MaterialINVO
>
result
=
new
Result
<
MaterialINVO
>();
try
{
materialINService
.
auditMaterialINVO
(
materialINVO
);
}
catch
(
Exception
e
)
{
log
.
error
(
"审批失败"
,
e
.
getMessage
());
result
.
setResult
(
materialINVO
);
result
.
setSuccess
(
true
);
}
catch
(
Exception
e
)
{
log
.
error
(
"审批失败"
,
e
.
getMessage
());
result
.
error500
(
"审批失败:"
+
e
.
getMessage
());
}
return
result
;
}
...
...
sk-module-biz/src/main/java/com/skua/modules/erp/service/IMaterialINService.java
查看文件 @
68cb908
...
...
@@ -17,7 +17,7 @@ public interface IMaterialINService extends IService<MaterialIN> {
* 审核药剂入库单
* @param materialINVO
*/
String
auditMaterialINVO
(
MaterialINVO
materialINVO
);
String
auditMaterialINVO
(
MaterialINVO
materialINVO
)
throws
Exception
;
/***
* 列表查询到货记录列表
...
...
sk-module-biz/src/main/java/com/skua/modules/erp/service/impl/MaterialINServiceImpl.java
查看文件 @
68cb908
...
...
@@ -6,20 +6,27 @@ import com.skua.core.context.BaseContextHandler;
import
com.skua.core.context.SpringContextUtils
;
import
com.skua.modules.equipment.dto.EquipmentInDTO
;
import
com.skua.modules.equipment.dto.EquipmentOutDTO
;
import
com.skua.modules.equipment.entity.EquipmentIn
;
import
com.skua.modules.equipment.entity.EquipmentInChild
;
import
com.skua.modules.equipment.entity.EquipmentOutChild
;
import
com.skua.modules.equipment.service.IEquipmentInService
;
import
com.skua.modules.equipment.service.IEquipmentOutService
;
import
com.skua.modules.erp.entity.ApproveRecord
;
import
com.skua.modules.erp.entity.ERPPurchaseContract
;
import
com.skua.modules.erp.entity.MaterialIN
;
import
com.skua.modules.erp.mapper.ApproveRecordMapper
;
import
com.skua.modules.erp.mapper.ERPPurchaseContractMapper
;
import
com.skua.modules.erp.mapper.MaterialINMapper
;
import
com.skua.modules.erp.service.IERPPurchaseContractService
;
import
com.skua.modules.erp.service.IMaterialINService
;
import
com.skua.modules.erp.vo.ArrivalRecordExcelExportVO
;
import
com.skua.modules.erp.vo.MaterialINVO
;
import
com.skua.modules.guest.util.DateUtil
;
import
com.skua.modules.quartz.util.BaseUtil
;
import
com.skua.modules.supplies.entity.SuppliesWarehouse
;
import
com.skua.modules.supplies.service.ISuppliesWarehouseService
;
import
org.apache.commons.lang3.StringUtils
;
import
org.hibernate.service.spi.ServiceException
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.jdbc.core.JdbcTemplate
;
import
org.springframework.stereotype.Service
;
...
...
@@ -41,6 +48,8 @@ public class MaterialINServiceImpl extends ServiceImpl<MaterialINMapper, Materia
@Resource
private
ApproveRecordMapper
recordMapper
;
@Autowired
private
IERPPurchaseContractService
purchaseContractService
;
@Autowired
private
IEquipmentInService
equipmentInService
;
@Autowired
private
IEquipmentOutService
equipmentOutService
;
...
...
@@ -52,7 +61,7 @@ public class MaterialINServiceImpl extends ServiceImpl<MaterialINMapper, Materia
* @param materialINVO
*/
@Transactional
public
String
auditMaterialINVO
(
MaterialINVO
materialINVO
){
public
String
auditMaterialINVO
(
MaterialINVO
materialINVO
)
throws
Exception
{
boolean
inAndOutStock
=
false
;
String
errMsg
=
null
;
QueryWrapper
<
SuppliesWarehouse
>
queryWrapper
=
new
QueryWrapper
<
SuppliesWarehouse
>();
...
...
@@ -68,32 +77,29 @@ public class MaterialINServiceImpl extends ServiceImpl<MaterialINMapper, Materia
return
"所属厂站["
+
departName
+
"]下没有找到仓库信息!"
;
}
//保存
MaterialIN
materialINTemp
=
this
.
baseMapper
.
selectById
(
materialINVO
.
getId
());
//purchasePlan.getApproveState() 审批状态 1通过2不通过
if
(
"1"
.
equals
(
materialINVO
.
getApproveState
()
)){
materialIN
VO
.
setAuditStatus
(
"3"
);
materialIN
Temp
.
setAuditStatus
(
"3"
);
inAndOutStock
=
true
;
}
if
(
"2"
.
equals
(
materialINVO
.
getApproveState
()
)){
materialIN
VO
.
setAuditStatus
(
"2"
);
materialIN
Temp
.
setAuditStatus
(
"2"
);
}
this
.
baseMapper
.
updateById
(
materialINVO
)
;
//审批记录
ApproveRecord
record
=
new
ApproveRecord
(
"YJIN"
,
materialINVO
.
getApplyUser
(),
materialINVO
.
getId
(),
BaseContextHandler
.
getUserId
(),
materialINVO
.
getApproveMessage
(),
materialINVO
.
getApproveState
());
recordMapper
.
insert
(
record
)
;
// 审核通过,生成入库单据、物料单
if
(
inAndOutStock
){
try
{
//出库
syncEquipmentOut
(
materialINVO
);
//入库
syncEquipmentIn
(
materialINVO
,
inWarehouseId
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
//出库
errMsg
=
syncEquipmentOut
(
materialINTemp
);
//入库
errMsg
=
syncEquipmentIn
(
materialINTemp
,
inWarehouseId
);
}
this
.
baseMapper
.
updateById
(
materialINTemp
)
;
//审批记录
ApproveRecord
record
=
new
ApproveRecord
(
"YJIN"
,
materialINVO
.
getApplyUser
(),
materialINVO
.
getId
(),
BaseContextHandler
.
getUserId
(),
materialINVO
.
getApproveMessage
(),
materialINVO
.
getApproveState
());
recordMapper
.
insert
(
record
)
;
return
errMsg
;
}
...
...
@@ -130,12 +136,53 @@ public class MaterialINServiceImpl extends ServiceImpl<MaterialINMapper, Materia
* 出库
* @return
*/
public
int
syncEquipmentOut
(
MaterialINVO
materialINVO
){
public
String
syncEquipmentOut
(
MaterialIN
materialINTemp
)
throws
Exception
{
String
errMsg
=
null
;
EquipmentOutDTO
equipmentOutDTO
=
new
EquipmentOutDTO
();
try
{
ERPPurchaseContract
erpPurchaseContract
=
purchaseContractService
.
getById
(
materialINTemp
.
getPurchaseContractId
());
if
(
erpPurchaseContract
!=
null
){
if
(
StringUtils
.
isNotEmpty
(
erpPurchaseContract
.
getEquipmentInId
())){
EquipmentIn
equipmentIn
=
equipmentInService
.
getById
(
erpPurchaseContract
.
getEquipmentInId
()
);
equipmentOutDTO
.
setDepartId
(
equipmentIn
.
getDepartId
()
)
;
equipmentOutDTO
.
setOutType
(
"9"
);
//
equipmentOutDTO
.
setRemark
(
materialINTemp
.
getRemark
()
);
equipmentOutDTO
.
setChooseTime
(
BaseUtil
.
getCurrentDate
());
//经办时间
equipmentOutDTO
.
setUseBy
(
BaseContextHandler
.
getUserId
()
);
//使用人
equipmentOutDTO
.
setOutDate
(
BaseUtil
.
getCurrentDate
()
);
equipmentOutDTO
.
setInventoryUpdateTimeEnd
(
BaseUtil
.
getCurrentDate
());
equipmentOutDTO
.
setSuppliesWarehouseId
(
equipmentIn
.
getSuppliesWarehouseId
()
);
// this.suppliesWarehouseId = suppliesWarehouseId;//所属仓库
//this.outOrder = outOrder;
// this.recipient = recipient;//领用人
equipmentOutDTO
.
setRecipient
(
materialINTemp
.
getReceiver
());
//收货人,领用人
EquipmentOutChild
equipmentOutChild
=
new
EquipmentOutChild
();
equipmentOutChild
.
setSparepartId
(
materialINTemp
.
getSparepartId
()
);
//
equipmentOutChild
.
setOutNum
(
new
BigDecimal
(
materialINTemp
.
getMaterialNum
()
)
)
;
//出库数量
equipmentOutChild
.
setTotalPrice
(
new
BigDecimal
(
materialINTemp
.
getDistributTotalPrice
()
)
);
//总价格
equipmentOutChild
.
setBatchNum
(
materialINTemp
.
getGoodCode
()
);
//批次号
List
<
EquipmentOutChild
>
outChildList
=
new
ArrayList
<
EquipmentOutChild
>();
outChildList
.
add
(
equipmentOutChild
);
equipmentOutDTO
.
setEquipmentOutChildList
(
outChildList
);
// 创建出库单
equipmentOutService
.
saveEquipmentOut
(
equipmentOutDTO
);
materialINTemp
.
setEquipmentOutId
(
equipmentOutDTO
.
getId
());
}
else
{
throw
new
ServiceException
(
"未找到统购合同的入库信息"
);
}
}
else
{
throw
new
ServiceException
(
"统购合同不存在"
);
}
}
catch
(
ServiceException
e
){
e
.
printStackTrace
();
}
//equipmentOutService.saveEquipmentOut(equipmentOutDTO);
return
1
;
return
errMsg
;
}
/***
...
...
@@ -143,7 +190,8 @@ public class MaterialINServiceImpl extends ServiceImpl<MaterialINMapper, Materia
* @param materialINVO
* @return
*/
public
int
syncEquipmentIn
(
MaterialINVO
materialINVO
,
String
inWarehouseId
)
throws
Exception
{
public
String
syncEquipmentIn
(
MaterialIN
materialINVO
,
String
inWarehouseId
)
throws
Exception
{
String
errMsg
=
null
;
EquipmentInDTO
equipmentInDTO
=
new
EquipmentInDTO
();
// EquipmentIn equipmentIn = new EquipmentIn();
//入库类型
...
...
@@ -160,12 +208,12 @@ public class MaterialINServiceImpl extends ServiceImpl<MaterialINMapper, Materia
EquipmentInChild
equipmentInChild
=
new
EquipmentInChild
();
//
equipmentInChild
.
setSparepartId
(
materialINVO
.
getSparepartId
());
//物料编号
equipmentInChild
.
setInNum
(
new
BigDecimal
(
materialINVO
.
getMaterialNum
()));
//物料数量
equipmentInChild
.
setBatchNum
(
materialINVO
.
getGoodCode
()
)
;
//批次号
equipmentInChildrenList
.
add
(
equipmentInChild
)
;
equipmentInDTO
.
setEquipmentInChildList
(
equipmentInChildrenList
);
//调用接口入库
equipmentInService
.
saveEquipmentIn
(
equipmentInDTO
)
;
...
...
@@ -175,9 +223,10 @@ public class MaterialINServiceImpl extends ServiceImpl<MaterialINMapper, Materia
if(erpPurchaseContract == null ){
throw new Exception("采购合同记录不存在");
}*/
materialINVO
.
setEquipmentInId
(
equipmentInDTO
.
getId
()
)
;
//记录入库单号
materialINVO
.
setEquipmentInId
(
equipmentInDTO
.
getId
()
)
;
//记录入库编号
materialINVO
.
setInOrder
(
equipmentInDTO
.
getInOrder
()
)
;
// 入库单号
log
.
debug
(
"记录入库单号{"
+
equipmentInDTO
.
getId
()+
"},入库单号:"
+
equipmentInDTO
.
getInOrder
());
this
.
baseMapper
.
updateById
(
materialINVO
)
;
return
1
;
return
errMsg
;
}
}
...
...
sk-module-equipment/src/main/java/com/skua/modules/equipment/entity/EquipmentInChild.java
查看文件 @
68cb908
...
...
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
com.skua.core.aspect.annotation.Dict
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
...
...
@@ -42,6 +43,7 @@ public class EquipmentInChild {
*/
@Excel
(
name
=
"备品备件id"
,
width
=
15
)
@ApiModelProperty
(
value
=
"备品备件id"
)
@Dict
(
dictTable
=
"equipment_sparepart_supplies"
,
dicCode
=
"id"
,
dicText
=
"sparepart_name"
)
private
String
sparepartId
;
/**
* 入库数量
...
...
@@ -117,4 +119,4 @@ public class EquipmentInChild {
/**税率*/
private
BigDecimal
taxRate
;
}
\ No newline at end of file
}
...
...
sk-module-equipment/src/main/java/com/skua/modules/equipment/entity/EquipmentOutChild.java
查看文件 @
68cb908
...
...
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
com.skua.core.aspect.annotation.Dict
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
...
...
@@ -42,6 +43,7 @@ public class EquipmentOutChild {
*/
@Excel
(
name
=
"备品备件id"
,
width
=
15
)
@ApiModelProperty
(
value
=
"备品备件id"
)
@Dict
(
dictTable
=
"equipment_sparepart_supplies"
,
dicCode
=
"id"
,
dicText
=
"sparepart_name"
)
private
String
sparepartId
;
/**
* 出库数量
...
...
sk-module-equipment/src/main/java/com/skua/modules/equipment/service/impl/EquipmentInServiceImpl.java
查看文件 @
68cb908
...
...
@@ -115,7 +115,7 @@ public class EquipmentInServiceImpl extends ServiceImpl<EquipmentInMapper, Equip
}*/
for
(
EquipmentInChild
equipmentInChild
:
equipmentInDTO
.
getEquipmentInChildList
())
{
equipmentInChild
.
setInId
(
inId
);
taskExecutor
.
execute
(()
->
{
//
taskExecutor.execute(() -> {
try
{
String
sparepartId
=
equipmentInChild
.
getSparepartId
();
String
suppliesWarehouseId
=
equipmentInDTO
.
getSuppliesWarehouseId
();
...
...
@@ -173,7 +173,7 @@ public class EquipmentInServiceImpl extends ServiceImpl<EquipmentInMapper, Equip
}
finally
{
countDownLatch
.
countDown
();
}
});
//
});
}
countDownLatch
.
await
();
return
1
;
...
...
sk-module-equipment/src/main/java/com/skua/modules/equipment/service/impl/EquipmentOutServiceImpl.java
查看文件 @
68cb908
...
...
@@ -20,9 +20,8 @@ import com.skua.tool.util.UniqIdUtils;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.support.TransactionTemplate
;
import
javax.annotation.Resource
;
...
...
@@ -37,10 +36,6 @@ import java.util.concurrent.CountDownLatch;
*/
@Service
public
class
EquipmentOutServiceImpl
extends
ServiceImpl
<
EquipmentOutMapper
,
EquipmentOut
>
implements
IEquipmentOutService
{
@Autowired
@Qualifier
(
"taskExecutor"
)
private
ThreadPoolTaskExecutor
taskExecutor
;
@Resource
private
EquipmentOutMapper
equipmentOutMapper
;
...
...
@@ -63,6 +58,7 @@ public class EquipmentOutServiceImpl extends ServiceImpl<EquipmentOutMapper, Equ
* @param equipmentOutDTO
* @return
*/
@Transactional
public
String
saveEquipmentOut
(
EquipmentOutDTO
equipmentOutDTO
)
throws
Exception
{
String
errMsg
=
null
;
if
(
equipmentOutDTO
.
getEquipmentOutChildList
()
==
null
||
equipmentOutDTO
.
getEquipmentOutChildList
().
isEmpty
())
{
...
...
@@ -80,61 +76,51 @@ public class EquipmentOutServiceImpl extends ServiceImpl<EquipmentOutMapper, Equ
EquipmentOut
equipmentOut
=
BeanExtUtils
.
bean2Bean
(
equipmentOutDTO
,
EquipmentOut
.
class
);
equipmentOut
.
setInventoryUpdateTime
(
new
Date
());
this
.
baseMapper
.
insert
(
equipmentOut
);
CountDownLatch
countDownLatch
=
new
CountDownLatch
(
equipmentOutDTO
.
getEquipmentOutChildList
().
size
());
//
CountDownLatch countDownLatch = new CountDownLatch(equipmentOutDTO.getEquipmentOutChildList().size());
for
(
EquipmentOutChild
equipmentOutChild
:
equipmentOutDTO
.
getEquipmentOutChildList
())
{
equipmentOutChild
.
setId
(
UniqIdUtils
.
getInstance
().
getUniqID
());
equipmentOutChild
.
setOutId
(
outId
);
taskExecutor
.
execute
(()
->
{
try
{
String
sparepartId
=
equipmentOutChild
.
getSparepartId
();
String
suppliesWarehouseId
=
equipmentOutDTO
.
getSuppliesWarehouseId
();
// taskExecutor.execute(() -> {
String
sparepartId
=
equipmentOutChild
.
getSparepartId
();
String
suppliesWarehouseId
=
equipmentOutDTO
.
getSuppliesWarehouseId
();
//根据物资id和仓库id获取库存
QueryWrapper
<
EquipmentSparepart
>
sparepartQueryWrapper
=
new
QueryWrapper
<>();
sparepartQueryWrapper
.
eq
(
"supplies_id"
,
sparepartId
).
eq
(
"supplies_warehouse_id"
,
suppliesWarehouseId
);
EquipmentSparepart
equipmentSparepart
=
iEquipmentSparepartService
.
getOne
(
sparepartQueryWrapper
);
if
(
ObjectUtil
.
isEmpty
(
equipmentSparepart
))
{
//物料信息
EquipmentSparepartSupplies
supplies
=
sparepartSuppliesService
.
getById
(
sparepartId
);
equipmentSparepart
=
new
EquipmentSparepart
();
BeanUtils
.
copyProperties
(
supplies
,
equipmentSparepart
);
equipmentSparepart
.
setId
(
null
);
equipmentSparepart
.
setStorageNum
(
BigDecimal
.
ZERO
);
equipmentSparepart
.
setSuppliesId
(
sparepartId
);
equipmentSparepart
.
setSuppliesWarehouseId
(
suppliesWarehouseId
);
//如果没有物料库存信息,新增库存信息为0
iEquipmentSparepartService
.
saveOrUpdate
(
equipmentSparepart
);
equipmentSparepart
=
iEquipmentSparepartService
.
getOne
(
sparepartQueryWrapper
);
//根据物资id和仓库id获取库存
QueryWrapper
<
EquipmentSparepart
>
sparepartQueryWrapper
=
new
QueryWrapper
<>();
sparepartQueryWrapper
.
eq
(
"supplies_id"
,
sparepartId
).
eq
(
"supplies_warehouse_id"
,
suppliesWarehouseId
);
EquipmentSparepart
equipmentSparepart
=
iEquipmentSparepartService
.
getOne
(
sparepartQueryWrapper
);
if
(
ObjectUtil
.
isEmpty
(
equipmentSparepart
))
{
//物料信息
EquipmentSparepartSupplies
supplies
=
sparepartSuppliesService
.
getById
(
sparepartId
);
equipmentSparepart
=
new
EquipmentSparepart
();
BeanUtils
.
copyProperties
(
supplies
,
equipmentSparepart
);
equipmentSparepart
.
setId
(
null
);
equipmentSparepart
.
setStorageNum
(
BigDecimal
.
ZERO
);
equipmentSparepart
.
setSuppliesId
(
sparepartId
);
equipmentSparepart
.
setSuppliesWarehouseId
(
suppliesWarehouseId
);
//如果没有物料库存信息,新增库存信息为0
iEquipmentSparepartService
.
saveOrUpdate
(
equipmentSparepart
);
equipmentSparepart
=
iEquipmentSparepartService
.
getOne
(
sparepartQueryWrapper
);
}
BigDecimal
resetStorageNum
=
equipmentSparepart
.
getStorageNum
().
subtract
(
equipmentOutChild
.
getOutNum
());
if
(
resetStorageNum
.
doubleValue
()
<
0
)
{
return
;
}
Integer
version
=
equipmentSparepart
.
getVersion
();
String
id
=
equipmentSparepart
.
getId
();
Integer
executeRes
=
transactionTemplate
.
execute
(
transactionStatus
->
{
int
val0
=
iEquipmentSparepartService
.
updateStorageNumById
(
id
,
resetStorageNum
.
doubleValue
(),
version
);
if
(
val0
==
1
&&
iEquipmentOutChildService
.
saveOrUpdate
(
equipmentOutChild
))
{
return
1
;
}
else
{
transactionStatus
.
setRollbackOnly
();
return
0
;
}
});
// if (executeRes != null && executeRes == 1) {
//
// }
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
//log.error("异常error: {}", e.getMessage());
}
finally
{
countDownLatch
.
countDown
();
}
});
BigDecimal
resetStorageNum
=
equipmentSparepart
.
getStorageNum
().
subtract
(
equipmentOutChild
.
getOutNum
());
if
(
resetStorageNum
.
doubleValue
()
<
0
)
{
continue
;
//return;
}
Integer
version
=
equipmentSparepart
.
getVersion
();
String
id
=
equipmentSparepart
.
getId
();
Integer
executeRes
=
transactionTemplate
.
execute
(
transactionStatus
->
{
int
val0
=
iEquipmentSparepartService
.
updateStorageNumById
(
id
,
resetStorageNum
.
doubleValue
(),
version
);
if
(
val0
==
1
&&
iEquipmentOutChildService
.
saveOrUpdate
(
equipmentOutChild
))
{
return
1
;
}
else
{
transactionStatus
.
setRollbackOnly
();
return
0
;
}
});
// });
}
countDownLatch
.
await
();
//
countDownLatch.await();
return
errMsg
;
}
}
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论