Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
patzn-cloud-service-hmhj
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wangweidong
patzn-cloud-service-hmhj
Commits
7c715008
Commit
7c715008
authored
Jul 15, 2025
by
jiangxuming
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
style(hmhj): 代码格式化调整
fix(hmhj): 修正SQL查询条件和日志记录问题
parent
453213d6
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
121 additions
and
83 deletions
+121
-83
UserStatsTask.java
...patzn/cloud/service/lims/hmhj/schedule/UserStatsTask.java
+2
-1
EntrustSampleItemServiceImpl.java
.../lims/hmhj/service/impl/EntrustSampleItemServiceImpl.java
+4
-3
OriginalRecordServiceImpl.java
...ice/lims/hmhj/service/impl/OriginalRecordServiceImpl.java
+9
-3
UserInfoServiceImpl.java
...d/service/lims/hmhj/service/impl/UserInfoServiceImpl.java
+14
-1
EntrustMapper.xml
src/main/resources/mapper/hmhj/EntrustMapper.xml
+79
-68
EntrustSampleItemMapper.xml
src/main/resources/mapper/hmhj/EntrustSampleItemMapper.xml
+6
-1
OriginalRecordMapper.xml
src/main/resources/mapper/hmhj/OriginalRecordMapper.xml
+7
-6
No files found.
src/main/java/com/patzn/cloud/service/lims/hmhj/schedule/UserStatsTask.java
View file @
7c715008
...
@@ -24,7 +24,8 @@ public class UserStatsTask {
...
@@ -24,7 +24,8 @@ public class UserStatsTask {
/**
/**
* 每5分钟执行一次
* 每5分钟执行一次
*/
*/
@Scheduled
(
cron
=
"0 */5 * * * ?"
)
// @Scheduled(cron = "0 */5 * * * ?")
@Scheduled
(
cron
=
"0 0 5 * * ?"
)
private
void
configureTasks
()
{
private
void
configureTasks
()
{
System
.
err
.
println
(
"执行同步用户检测量定时任务时间: "
+
LocalDateTime
.
now
());
System
.
err
.
println
(
"执行同步用户检测量定时任务时间: "
+
LocalDateTime
.
now
());
userTestStatisticsService
.
updateUserStatisticsInfo
();
userTestStatisticsService
.
updateUserStatisticsInfo
();
...
...
src/main/java/com/patzn/cloud/service/lims/hmhj/service/impl/EntrustSampleItemServiceImpl.java
View file @
7c715008
...
@@ -337,19 +337,20 @@ public class EntrustSampleItemServiceImpl extends BaseServiceImpl<EntrustSampleI
...
@@ -337,19 +337,20 @@ public class EntrustSampleItemServiceImpl extends BaseServiceImpl<EntrustSampleI
EntrustSampleItemVO
vo
=
unfinishItemList
.
get
(
0
);
EntrustSampleItemVO
vo
=
unfinishItemList
.
get
(
0
);
RestAssert
.
fail
(
String
.
format
(
"样品编号【%s】的检测项目【%s】未填写检测值,无法提交!"
,
vo
.
getSampleCode
(),
vo
.
getName
()));
RestAssert
.
fail
(
String
.
format
(
"样品编号【%s】的检测项目【%s】未填写检测值,无法提交!"
,
vo
.
getSampleCode
(),
vo
.
getName
()));
}
}
logger
.
info
(
"3-1数据录入提交阶段耗时: {}"
,
timeWatch
.
pointTime
());
EntrustSampleItem
sampleItem
=
new
EntrustSampleItem
();
EntrustSampleItem
sampleItem
=
new
EntrustSampleItem
();
sampleItem
.
setTestTime
(
new
Date
());
sampleItem
.
setTestTime
(
new
Date
());
sampleItem
.
setStatus
(
EntrustSampleItemStatusEnum
.
END
);
sampleItem
.
setStatus
(
EntrustSampleItemStatusEnum
.
END
);
sampleItem
.
setProgress
(
EntrustSampleItemStatusEnum
.
END
);
sampleItem
.
setProgress
(
EntrustSampleItemStatusEnum
.
END
);
logger
.
info
(
"3-2数据录入提交阶段耗时: {}"
,
timeWatch
.
pointTime
());
super
.
update
(
sampleItem
,
Condition
.
create
().
in
(
"id"
,
ids
));
super
.
update
(
sampleItem
,
Condition
.
create
().
in
(
"id"
,
ids
));
logger
.
info
(
"3-3数据录入提交阶段耗时: {}"
,
timeWatch
.
pointTime
());
entrustSampleItemRecordService
.
record
(
ids
,
EntrustSampleItemStatusEnum
.
TEST
.
getDisplay
(),
EntrustSampleItemStatusEnum
.
END
.
getDisplay
(),
0
,
"数据录入提交"
,
account
);
entrustSampleItemRecordService
.
record
(
ids
,
EntrustSampleItemStatusEnum
.
TEST
.
getDisplay
(),
EntrustSampleItemStatusEnum
.
END
.
getDisplay
(),
0
,
"数据录入提交"
,
account
);
logger
.
info
(
"4数据录入提交阶段耗时: {}"
,
timeWatch
.
pointTime
());
logger
.
info
(
"4数据录入提交阶段耗时: {}"
,
timeWatch
.
pointTime
());
// 若存在委托下没有完成的检测项目,那么直接返回
// 若存在委托下没有完成的检测项目,那么直接返回
unfinishItemList
=
baseMapper
.
selectUnfinishItemList
(
new
QueryDTO
().
setEntrustId
(
entrustId
).
setNonIds
(
ids
));
//todo 性能优化
unfinishItemList
=
baseMapper
.
selectUnfinishItemList
(
new
QueryDTO
().
setEntrustId
(
entrustId
).
setNonIds
(
ids
));
//todo 性能优化
logger
.
info
(
"5数据录入提交阶段耗时: {}"
,
timeWatch
.
pointTime
());
logger
.
info
(
"5数据录入提交阶段耗时: {}"
,
timeWatch
.
pointTime
());
logger
.
info
(
"unfinishItemList: {}"
,
JacksonUtils
.
toJson
(
unfinishItemList
));
if
(
CollectionUtils
.
isNotEmpty
(
unfinishItemList
))
{
if
(
CollectionUtils
.
isNotEmpty
(
unfinishItemList
))
{
return
true
;
return
true
;
}
}
...
...
src/main/java/com/patzn/cloud/service/lims/hmhj/service/impl/OriginalRecordServiceImpl.java
View file @
7c715008
...
@@ -131,9 +131,15 @@ public class OriginalRecordServiceImpl extends BaseServiceImpl<OriginalRecordMap
...
@@ -131,9 +131,15 @@ public class OriginalRecordServiceImpl extends BaseServiceImpl<OriginalRecordMap
}
}
logger
.
info
(
"7-3阶段耗时:{} ms"
,
timeWatch
.
pointTime
());
logger
.
info
(
"7-3阶段耗时:{} ms"
,
timeWatch
.
pointTime
());
if
(
CollectionUtils
.
isNotEmpty
(
saveList
))
{
if
(
CollectionUtils
.
isNotEmpty
(
saveList
))
{
pool
.
execute
(()
->
{
logger
.
info
(
"7-4阶段耗时:{} ms"
,
timeWatch
.
pointTime
());
itemRelOriginalRecordService
.
saveBatch
(
saveList
);
pool
.
execute
(()
->
{
});
logger
.
info
(
"7-5<UNK>{} ms"
,
timeWatch
.
pointTime
());
logger
.
info
(
"ids: {}"
,
ArrayUtils
.
toString
(
ids
));
itemRelOriginalRecordService
.
remove
(
Condition
.
create
().
in
(
null
!=
ids
,
"item_id"
,
ids
));
itemRelOriginalRecordService
.
saveBatch
(
saveList
);
logger
.
info
(
"7-6<UNK>{} ms"
,
timeWatch
.
pointTime
());
});
logger
.
info
(
"7-7阶段耗时:{} ms"
,
timeWatch
.
pointTime
());
}
}
// if (CollectionUtils.isNotEmpty(saveList)) {
// if (CollectionUtils.isNotEmpty(saveList)) {
// itemRelOriginalRecordService.saveBatch(saveList);
// itemRelOriginalRecordService.saveBatch(saveList);
...
...
src/main/java/com/patzn/cloud/service/lims/hmhj/service/impl/UserInfoServiceImpl.java
View file @
7c715008
package
com
.
patzn
.
cloud
.
service
.
lims
.
hmhj
.
service
.
impl
;
package
com
.
patzn
.
cloud
.
service
.
lims
.
hmhj
.
service
.
impl
;
import
com.baomidou.mybatisplus.toolkit.CollectionUtils
;
import
com.baomidou.mybatisplus.toolkit.CollectionUtils
;
import
com.github.benmanes.caffeine.cache.Cache
;
import
com.github.benmanes.caffeine.cache.Caffeine
;
import
com.patzn.cloud.commons.api.RestAssert
;
import
com.patzn.cloud.commons.api.RestAssert
;
import
com.patzn.cloud.commons.controller.Account
;
import
com.patzn.cloud.commons.controller.Account
;
import
com.patzn.cloud.commons.controller.LoginHelper
;
import
com.patzn.cloud.commons.controller.LoginHelper
;
...
@@ -60,6 +62,9 @@ public class UserInfoServiceImpl {
...
@@ -60,6 +62,9 @@ public class UserInfoServiceImpl {
@Resource
@Resource
private
RedisTemplate
<
String
,
String
>
redisTemplate
;
private
RedisTemplate
<
String
,
String
>
redisTemplate
;
private
final
Cache
<
String
,
List
<
SysOrg
>>
USER_PERIOD
=
Caffeine
.
newBuilder
()
.
expireAfterWrite
(
24
,
TimeUnit
.
HOURS
).
build
();
public
List
<
LmsUserGroup
>
getGroupList
(
Long
userId
)
{
public
List
<
LmsUserGroup
>
getGroupList
(
Long
userId
)
{
if
(
null
==
userId
)
{
if
(
null
==
userId
)
{
return
OTHER_GROUP_LIST
;
return
OTHER_GROUP_LIST
;
...
@@ -229,7 +234,15 @@ public class UserInfoServiceImpl {
...
@@ -229,7 +234,15 @@ public class UserInfoServiceImpl {
}
}
public
String
getUserPeriod
(
Account
account
)
{
public
String
getUserPeriod
(
Account
account
)
{
List
<
SysOrg
>
orgList
=
sysOrgClient
.
getListByUserId
(
account
.
getUserId
()).
getData
();
List
<
SysOrg
>
orgList
=
new
ArrayList
<>();
String
key
=
"userPeriod#%s"
;
List
<
SysOrg
>
ifPresent
=
USER_PERIOD
.
getIfPresent
(
String
.
format
(
key
,
account
.
getUserId
()));
if
(
CollectionUtils
.
isNotEmpty
(
ifPresent
))
{
orgList
=
ifPresent
;
}
else
{
orgList
=
sysOrgClient
.
getListByUserId
(
account
.
getUserId
()).
getData
();
USER_PERIOD
.
put
(
String
.
format
(
key
,
account
.
getUserId
()),
orgList
);
}
if
(
CollectionUtils
.
isEmpty
(
orgList
))
{
if
(
CollectionUtils
.
isEmpty
(
orgList
))
{
return
null
;
return
null
;
}
}
...
...
src/main/resources/mapper/hmhj/EntrustMapper.xml
View file @
7c715008
...
@@ -125,96 +125,107 @@
...
@@ -125,96 +125,107 @@
<select
id=
"selectVOList"
resultType=
"com.patzn.cloud.service.hmhj.vo.EntrustVO"
>
<select
id=
"selectVOList"
resultType=
"com.patzn.cloud.service.hmhj.vo.EntrustVO"
>
with sample as (
WITH sample AS (
SELECT
SELECT
s.company_id,s.entrust_id,max(s.sample_from) "sample_from",
s.company_id,
(case when count(1) = sum(s.send_erp) then 1 else 0 end ) "send_erp"
s.entrust_id,
from entrust_sample s where s.deleted = 0
MAX(s.sample_from) AS "sample_from",
<if
test=
"null != vo.sampleCode"
>
CASE WHEN COUNT(1) = SUM(s.send_erp) THEN 1 ELSE 0 END AS "send_erp"
and s.code like concat('%',#{vo.sampleCode},'%')
FROM
</if>
entrust_sample s
<if
test=
"null != vo.sampleName"
>
WHERE
and s.name like concat('%',#{vo.sampleName},'%')
s.deleted = 0
</if>
<if
test=
"null != vo.sampleCode"
>
<if
test=
"null != vo.sampleStatus"
>
AND s.code LIKE CONCAT('%', #{vo.sampleCode}, '%')
and s.status = #{vo.sampleStatus}
</if>
</if>
<if
test=
"null != vo.sampleName"
>
<if
test=
"null != vo.judgeStatus"
>
AND s.name LIKE CONCAT('%', #{vo.sampleName}, '%')
and s.judge_status = #{vo.judgeStatus}
</if>
</if>
<if
test=
"null != vo.sampleStatus"
>
<if
test=
"null == vo.sampleType"
>
AND s.status = #{vo.sampleStatus}
and s.type = 0
</if>
</if>
<if
test=
"null != vo.judgeStatus"
>
<if
test=
"null != vo.sampleType"
>
AND s.judge_status = #{vo.judgeStatus}
and s.type = #{vo.sampleType}
</if>
</if>
<if
test=
"null == vo.sampleType"
>
<if
test=
"null != vo.judgeStatusList"
>
AND s.type = 0
and s.judge_status IN
</if>
<foreach
collection=
"vo.judgeStatusList"
index=
"index"
item=
"judgeStatus"
open=
"("
separator=
","
close=
")"
>
<if
test=
"null != vo.sampleType"
>
#{judgeStatus}
AND s.type = #{vo.sampleType}
</foreach>
</if>
</if>
<if
test=
"null != vo.judgeStatusList"
>
<if
test=
"null != vo.notSampleStatus"
>
AND s.judge_status IN
and s.status != #{vo.notSampleStatus}
<foreach
collection=
"_judgeStatusList"
index=
"index"
item=
"judgeStatus"
open=
"("
separator=
","
close=
")"
>
#{judgeStatus}
</foreach>
</if>
<if
test=
"null != vo.notSampleStatus"
>
AND s.status != #{vo.notSampleStatus}
</if>
<if
test=
"null != vo.itemStatus || null != vo.testerId"
>
AND EXISTS (
SELECT 1
FROM entrust_sample_item i
WHERE i.deleted = 0 AND i.entrust_sample_id = s.id
<if
test=
"null != vo.itemStatus"
>
AND i.status = #{vo.itemStatus}
</if>
</if>
<if
test=
"null != vo.itemStatus || null != vo.testerId"
>
<if
test=
"null != vo.testerId"
>
AND exists (
AND i.tester_id = #{vo.testerId}
select 1 from entrust_sample_item i where i.deleted = 0 and i.entrust_sample_id = s.id
<if
test=
"null != vo.itemStatus"
>
and i.status = #{vo.itemStatus}
</if>
<if
test=
"null != vo.testerId"
>
and i.tester_id = #{vo.testerId}
</if>
)
</if>
</if>
GROUP BY s.company_id,s.entrust_id
)
</if>
GROUP BY
s.company_id,
s.entrust_id
)
)
SELECT e.*,s.sample_from,r.report_send_time
SELECT
FROM entrust e
e.*,
JOIN sample s on s.entrust_id = e.id
s.sample_from,
LEFT JOIN entrust_report r on r.entrust_id = e.id and r.deleted = 0
r.report_send_time
WHERE e.deleted = 0
FROM
entrust e
JOIN
sample s ON s.entrust_id = e.id
LEFT JOIN
entrust_report r ON r.entrust_id = e.id AND r.deleted = 0
WHERE
e.deleted = 0
<include
refid=
"basicCondition"
/>
<include
refid=
"basicCondition"
/>
<if
test=
"null != vo.userOrgName"
>
<if
test=
"null != vo.userOrgName"
>
AND
exists
(
AND
EXISTS
(
select
1
SELECT
1
from
entrust_sample es
FROM
entrust_sample es
join contract_sample cs on
es.contract_sample_id = cs.id
JOIN contract_sample cs ON
es.contract_sample_id = cs.id
where es.deleted = 0 and
cs.deleted = 0
WHERE es.deleted = 0 AND
cs.deleted = 0
and strpos(#{vo.userOrgName},
cs.factory_area) > 0
AND STRPOS(#{vo.userOrgName},
cs.factory_area) > 0
)
)
</if>
</if>
<if
test=
"null != vo.reportStatus || null != vo.reportNotStatus || null != vo.reportStatusList"
>
<if
test=
"null != vo.reportStatus || null != vo.reportNotStatus || null != vo.reportStatusList"
>
AND exists (
AND EXISTS (
select 1 from entrust_report r where r.deleted = 0 and r.entrust_id = e.id
SELECT 1
FROM entrust_report r
WHERE r.deleted = 0 AND r.entrust_id = e.id
<if
test=
"null != vo.reportStatus"
>
<if
test=
"null != vo.reportStatus"
>
and
r.status = #{vo.reportStatus}
AND
r.status = #{vo.reportStatus}
</if>
</if>
<if
test=
"null != vo.reportNotStatus"
>
<if
test=
"null != vo.reportNotStatus"
>
and
r.status != #{vo.reportNotStatus}
AND
r.status != #{vo.reportNotStatus}
</if>
</if>
<if
test=
"null != vo.reportStatusList"
>
<if
test=
"null != vo.reportStatusList"
>
and r.status IN
AND r.status IN
<foreach
collection=
"vo.reportStatusList"
index=
"index"
item=
"reportStatus"
open=
"("
separator=
","
<foreach
collection=
"vo.reportStatusList"
index=
"index"
item=
"reportStatus"
open=
"("
separator=
","
close=
")"
>
close=
")"
>
#{reportStatus}
#{reportStatus}
</foreach>
</foreach>
</if>
</if>
)
)
</if>
</if>
<if
test=
"null == vo.sortOrder"
>
<if
test=
"null == vo.sortOrder"
>
order by
e.ctime DESC
ORDER BY
e.ctime DESC
</if>
</if>
<if
test=
"null != vo.sortOrder"
>
<if
test=
"null != vo.sortOrder"
>
order by
${vo.sortOrder}
ORDER BY
${vo.sortOrder}
</if>
</if>
</select>
</select>
<!--查询委托历史数据-->
<!--查询委托历史数据-->
...
...
src/main/resources/mapper/hmhj/EntrustSampleItemMapper.xml
View file @
7c715008
...
@@ -46,7 +46,7 @@
...
@@ -46,7 +46,7 @@
i.name,
i.name,
i.status,
i.status,
i.standard,
i.standard,
i.test_value,
i
i
.test_value,
i.tester,
i.tester,
i.tester_id,
i.tester_id,
i.test_time,
i.test_time,
...
@@ -65,6 +65,7 @@
...
@@ -65,6 +65,7 @@
rr.record_id,
rr.record_id,
od.object_key "record_object_key"
od.object_key "record_object_key"
from entrust_sample_item i
from entrust_sample_item i
left join entrust_sample_item_index ii on ii.entrust_sample_item_id = i.id and ii.deleted = 0
join entrust_sample s on s.id = i.entrust_sample_id and s.deleted = 0
join entrust_sample s on s.id = i.entrust_sample_id and s.deleted = 0
join entrust e on e.id = i.entrust_id and e.deleted = 0
join entrust e on e.id = i.entrust_id and e.deleted = 0
left join item_rel_original_record rr on rr.item_id = i.id and rr.deleted = 0
left join item_rel_original_record rr on rr.item_id = i.id and rr.deleted = 0
...
@@ -444,7 +445,11 @@
...
@@ -444,7 +445,11 @@
(case when count(1) = sum(CASE WHEN (ii.test_value IS NULL OR LENGTH(TRIM(ii.test_value)) = 0) THEN 0 ELSE 1
(case when count(1) = sum(CASE WHEN (ii.test_value IS NULL OR LENGTH(TRIM(ii.test_value)) = 0) THEN 0 ELSE 1
END) then 1 else 0 end) "END_INDEX"
END) then 1 else 0 end) "END_INDEX"
FROM entrust_sample_item_index ii
FROM entrust_sample_item_index ii
JOIN entrust_sample_item si on si.id = ii.entrust_sample_item_id
WHERE ii.deleted = 0
WHERE ii.deleted = 0
<if
test=
"null != vo.entrustId"
>
and si.entrust_id = #{vo.entrustId}
</if>
<if
test=
"null != vo.ids"
>
<if
test=
"null != vo.ids"
>
and ii.entrust_sample_item_id in
and ii.entrust_sample_item_id in
<foreach
collection=
"vo.ids"
index=
"index"
item=
"itemId"
open=
"("
separator=
","
close=
")"
>
<foreach
collection=
"vo.ids"
index=
"index"
item=
"itemId"
open=
"("
separator=
","
close=
")"
>
...
...
src/main/resources/mapper/hmhj/OriginalRecordMapper.xml
View file @
7c715008
...
@@ -4,11 +4,13 @@
...
@@ -4,11 +4,13 @@
<select
id=
"selectPageVO"
resultType=
"com.patzn.cloud.service.hmhj.vo.OriginalRecordVO"
>
<select
id=
"selectPageVO"
resultType=
"com.patzn.cloud.service.hmhj.vo.OriginalRecordVO"
>
WITH target_items AS (
WITH target_items AS (
-- 预过滤entrust_sample_item关联数据
SELECT DISTINCT rr.record_id
SELECT DISTINCT rr.record_id
FROM entrust_sample_item i
FROM entrust_sample_item i
JOIN item_rel_original_record rr ON rr.item_id = i.id AND rr.deleted = 0
JOIN item_rel_original_record rr ON rr.item_id = i.id AND rr.deleted = 0
WHERE i.deleted = 0
WHERE i.deleted = 0
<if
test=
"vo.entrustId != null"
>
AND entrust_id = #{vo.entrustId}
</if>
<if
test=
"vo.testerId != null"
>
<if
test=
"vo.testerId != null"
>
AND i.tester_id = #{vo.testerId}
AND i.tester_id = #{vo.testerId}
</if>
</if>
...
@@ -17,16 +19,15 @@
...
@@ -17,16 +19,15 @@
</if>
</if>
),
),
filtered_records AS (
filtered_records AS (
-- 预过滤original_record主表
SELECT id
SELECT id
FROM original_record
FROM original_record
WHERE deleted = 0
WHERE deleted = 0
<if
test=
"vo.title != null"
>
<if
test=
"vo.title != null"
>
AND title LIKE CONCAT('%', #{vo.title}, '%')
AND title LIKE CONCAT('%', #{vo.title}, '%')
</if>
</if>
AND id IN (SELECT record_id FROM target_items)
-- 关联预过滤结果
AND id IN (SELECT record_id FROM target_items)
<if
test=
"vo.entrustId != null"
>
<if
test=
"vo.entrustId != null"
>
AND entrust_id = #{vo.entrustId}
-- 直接过滤entrust_id
AND entrust_id = #{vo.entrustId}
</if>
</if>
)
)
SELECT
SELECT
...
@@ -52,10 +53,10 @@
...
@@ -52,10 +53,10 @@
JOIN entrust e ON e.deleted = 0
JOIN entrust e ON e.deleted = 0
AND (
AND (
e.id = r.entrust_id
e.id = r.entrust_id
OR r.entrust_ids LIKE CONCAT('%', e.id, '%')
-- 替换strpos为LIKE
OR r.entrust_ids LIKE CONCAT('%', e.id, '%')
)
)
<if
test=
"vo.entrustId != null"
>
<if
test=
"vo.entrustId != null"
>
AND e.id = #{vo.entrustId}
-- 二次确认entrust_id
AND e.id = #{vo.entrustId}
</if>
</if>
<if
test=
"vo.entrustCode != null"
>
<if
test=
"vo.entrustCode != null"
>
AND e.code LIKE CONCAT('%', #{vo.entrustCode}, '%')
AND e.code LIKE CONCAT('%', #{vo.entrustCode}, '%')
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment