Commit 31f5e8d1 authored by 周亚武's avatar 周亚武

Merge remote-tracking branch 'origin/master'

parents 067c7753 b34ad5e9
......@@ -82,6 +82,7 @@ start_service() {
project_deploy() {
writelog "${PROJECT_NAME}_deploy"
systemctl stop ${PROJECT_NAME}
sleep 5
clear_deploy ${PROJECT_SERVICE} ${PROJECT_EXECPATH}
writelog "${PROJECT_NAME}_clear_finish"
tar -zvxf ./${PROJECT_FILENAME} -C ${PUBLISH_PATH}
......
package com.mortals.xhx.module.window.service;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.common.pdu.window.WindowPdu;
import com.mortals.xhx.module.window.model.WindowOwnerEntity;
import com.mortals.xhx.module.window.dao.WindowOwnerDao;
import java.util.List;
/**
* WindowOwnerService
*
......@@ -13,4 +17,11 @@ import com.mortals.xhx.module.window.dao.WindowOwnerDao;
public interface WindowOwnerService extends ICRUDService<WindowOwnerEntity,Long>{
WindowOwnerDao getDao();
/**
* 获取基础平台与考勤绩效系统已分配的窗口差集列表
* @param pdu
* @return
*/
List<WindowPdu> subWindowPduList(WindowPdu pdu);
}
\ No newline at end of file
package com.mortals.xhx.module.window.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.pdu.RespData;
import com.mortals.xhx.common.pdu.window.WindowPdu;
import com.mortals.xhx.feign.window.IWindowFeign;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
......@@ -11,10 +19,14 @@ import com.mortals.xhx.module.window.model.WindowOwnerDetailEntity;
import com.mortals.xhx.module.window.model.WindowOwnerDetailQuery;
import com.mortals.xhx.module.window.service.WindowOwnerDetailService;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.Arrays;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
/**
* WindowOwnerService
* 窗口负责人 service实现
......@@ -25,13 +37,75 @@ import lombok.extern.slf4j.Slf4j;
@Service("windowOwnerService")
@Slf4j
public class WindowOwnerServiceImpl extends AbstractCRUDServiceImpl<WindowOwnerDao, WindowOwnerEntity, Long> implements WindowOwnerService {
@Autowired
private WindowOwnerDetailService windowOwnerDetailService;
@Autowired
private IWindowFeign windowFeign;
@Override
protected void saveAfter(WindowOwnerEntity entity, Context context) throws AppException {
public List<WindowPdu> subWindowPduList(WindowPdu pdu) {
List<WindowPdu> subList = new ArrayList<>();
List<WindowPdu> ownerList = new ArrayList<>();
List<WindowOwnerDetailEntity> ownerDetail = windowOwnerDetailService.getAllList();
if (!CollectionUtils.isEmpty(ownerDetail)) {
Long[] windows = ownerDetail.stream().map(WindowOwnerDetailEntity::getWindowId).toArray(Long[]::new);
pdu.setIdNotList(Arrays.asList(windows));
if (pdu.getSiteId() == null) {
pdu.setSiteId(1l); //默认只查宜宾市民中心
}
pdu.setSize(-1);
Rest<RespData<List<WindowPdu>>> respDataRest = windowFeign.list(pdu);
log.info(JSONObject.toJSONString(respDataRest));
if (respDataRest.getCode() == YesNoEnum.YES.getValue()) {
subList = respDataRest.getData().getData();
}
if(!ObjectUtils.isEmpty(pdu.getStaffId())){
//查询当前负责人负责的窗口
WindowOwnerDetailQuery detailQuery = new WindowOwnerDetailQuery();
detailQuery.setOwnerId(pdu.getStaffId());
Long[] windowIds = windowOwnerDetailService.find(detailQuery).stream().map(WindowOwnerDetailEntity::getId).toArray(Long[]::new);
if(!ObjectUtils.isEmpty(windowIds)){
WindowPdu ownerWindowPdu = new WindowPdu();
ownerWindowPdu.setIdList(Arrays.asList(windowIds));
Rest<RespData<List<WindowPdu>>> ownerRest = windowFeign.list(ownerWindowPdu);
if (ownerRest.getCode() == YesNoEnum.YES.getValue()) {
ownerList=ownerRest.getData().getData();
}
}
}
}
ownerList.addAll(subList);
return ownerList;
}
@Override
protected void saveBefore(WindowOwnerEntity entity, Context context) throws AppException {
super.saveBefore(entity, context);
if(!ObjectUtils.isEmpty(entity.getWindowOwnerDetailList())){
entity.setWindowCount(entity.getWindowOwnerDetailList().size());
}
}
@Override
protected void updateBefore(WindowOwnerEntity entity, Context context) throws AppException {
super.updateBefore(entity, context);
if(!ObjectUtils.isEmpty(entity.getWindowOwnerDetailList())){
entity.getWindowOwnerDetailList().stream().peek(item->{
entity.setWindowCount(entity.getWindowOwnerDetailList().size());
}
}
@Override
protected void saveAfter(WindowOwnerEntity entity, Context context) throws AppException {
if (!ObjectUtils.isEmpty(entity.getWindowOwnerDetailList())) {
entity.getWindowOwnerDetailList().stream().peek(item -> {
item.setOwnerId(entity.getId());
item.setCreateUserId(this.getContextUserId(context));
item.setCreateTime(new Date());
......@@ -43,10 +117,10 @@ public class WindowOwnerServiceImpl extends AbstractCRUDServiceImpl<WindowOwnerD
@Override
protected void updateAfter(WindowOwnerEntity entity, Context context) throws AppException {
if(!ObjectUtils.isEmpty(entity.getWindowOwnerDetailList())){
if (!ObjectUtils.isEmpty(entity.getWindowOwnerDetailList())) {
Long[] windowOwnerDetailIds = windowOwnerDetailService.find(new WindowOwnerDetailQuery().ownerId(entity.getId())).stream().map(WindowOwnerDetailEntity::getId).toArray(Long[]::new);
windowOwnerDetailService.remove(windowOwnerDetailIds,context);
entity.getWindowOwnerDetailList().stream().peek(item ->{
windowOwnerDetailService.remove(windowOwnerDetailIds, context);
entity.getWindowOwnerDetailList().stream().peek(item -> {
item.setOwnerId(entity.getId());
item.setCreateUserId(this.getContextUserId(context));
item.setCreateTime(new Date());
......@@ -61,7 +135,7 @@ public class WindowOwnerServiceImpl extends AbstractCRUDServiceImpl<WindowOwnerD
@Override
protected void removeAfter(Long[] ids, Context context, int result) throws AppException {
List<WindowOwnerDetailEntity> windowOwnerDetaillist = windowOwnerDetailService.find(new WindowOwnerDetailQuery().ownerIdList(Arrays.asList(ids)));
windowOwnerDetailService.removeList(windowOwnerDetaillist,context);
windowOwnerDetailService.removeList(windowOwnerDetaillist, context);
super.removeAfter(ids, context, result);
}
}
\ No newline at end of file
package com.mortals.xhx.module.window.web;
import com.mortals.framework.common.Rest;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService;
import com.mortals.xhx.base.system.user.model.UserQuery;
import com.mortals.xhx.base.system.user.service.UserService;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.pdu.RespData;
import com.mortals.xhx.common.pdu.site.SiteHallPdu;
import com.mortals.xhx.common.pdu.window.WindowPdu;
import com.mortals.xhx.feign.site.ISiteHallFeign;
import com.mortals.xhx.feign.window.IWindowFeign;
import com.mortals.xhx.module.dept.model.DeptQuery;
import com.mortals.xhx.module.dept.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -52,6 +59,12 @@ public class WindowOwnerController extends BaseCRUDJsonBodyMappingController<Win
@Autowired
private DeptService deptService;
@Autowired
private IWindowFeign windowFeign;
@Autowired
private ISiteHallFeign siteHallFeign;
public WindowOwnerController() {
super.setModuleDesc("窗口负责人");
}
......@@ -59,6 +72,14 @@ public class WindowOwnerController extends BaseCRUDJsonBodyMappingController<Win
@Override
protected void init(Map<String, Object> model, Context context) {
SiteHallPdu siteHallPdu = new SiteHallPdu();
siteHallPdu.setSiteId(1L);
Rest<RespData<List<SiteHallPdu>>> rest = siteHallFeign.list(siteHallPdu);
if(YesNoEnum.YES.getValue()==rest.getCode()){
Map<Long, String> hallMap = rest.getData().getData().stream().collect(Collectors.toMap(x -> x.getId(), y -> y.getHallName(), (o, n) -> n));
this.addDict(model, "hallId", hallMap);
}
// Map<String, String> collect = userService.find(new UserQuery(), getContext()).stream()
// .collect(Collectors.toMap(x -> x.getId().toString(), y -> y.getRealName(), (o, n) -> n));
// this.addDict(model, "updateUserId", collect);
......@@ -68,5 +89,33 @@ public class WindowOwnerController extends BaseCRUDJsonBodyMappingController<Win
super.init(model, context);
}
@PostMapping({"subWindowList"})
public Rest<Object> subWindowList(@RequestBody WindowPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
Context context = this.getContext();
String busiDesc = "查询待分配的窗口列表";
int code = 1;
try {
//查询所有可以选择的窗口
List<WindowPdu> result = this.getService().subWindowPduList(query);
//查询当前负责人已经选择的窗口
model.put("data", result);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
this.init(model, context);
ret.setCode(code);
ret.setData(model);
ret.setDict(model.get("dict"));
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
}
\ No newline at end of file
......@@ -20,8 +20,6 @@
<result property="salaName" column="salaName" />
<result property="staffId" column="staffId" />
<result property="staffName" column="staffName" />
<result property="systemUserId" column="systemUserId" />
<result property="systemUserName" column="systemUserName" />
<collection property="windowOwnerDetailList" column="id" ofType="WindowOwnerDetailEntity" javaType="ArrayList" select="getWindowOwnerDetailByOwnerId"></collection>
</resultMap>
<resultMap type="WindowOwnerDetailEntity" id="WindowOwnerDetailEntity-Map">
......@@ -88,12 +86,6 @@
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('staffName') or colPickMode == 1 and data.containsKey('staffName')))">
a.staffName,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('systemUserId') or colPickMode == 1 and data.containsKey('systemUserId')))">
a.systemUserId,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('systemUserName') or colPickMode == 1 and data.containsKey('systemUserName')))">
a.systemUserName,
</if>
</trim>
</sql>
<!-- 子表所有列 -->
......@@ -105,18 +97,18 @@
<!-- 新增 区分主键自增加还是业务插入 -->
<insert id="insert" parameterType="WindowOwnerEntity" useGeneratedKeys="true" keyProperty="id">
insert into mortals_xhx_window_owner
(deptId,deptName,number,phone,windowCount,remark,createTime,createUserId,updateUserId,updateTime,salaId,salaName,staffId,staffName,systemUserId,systemUserName)
(deptId,deptName,number,phone,windowCount,remark,createTime,createUserId,updateUserId,updateTime,salaId,salaName,staffId,staffName)
VALUES
(#{deptId},#{deptName},#{number},#{phone},#{windowCount},#{remark},#{createTime},#{createUserId},#{updateUserId},#{updateTime},#{salaId},#{salaName},#{staffId},#{staffName},#{systemUserId},#{systemUserName})
(#{deptId},#{deptName},#{number},#{phone},#{windowCount},#{remark},#{createTime},#{createUserId},#{updateUserId},#{updateTime},#{salaId},#{salaName},#{staffId},#{staffName})
</insert>
<!-- 批量新增 -->
<insert id="insertBatch" parameterType="paramDto">
insert into mortals_xhx_window_owner
(deptId,deptName,number,phone,windowCount,remark,createTime,createUserId,updateUserId,updateTime,salaId,salaName,staffId,staffName,systemUserId,systemUserName)
(deptId,deptName,number,phone,windowCount,remark,createTime,createUserId,updateUserId,updateTime,salaId,salaName,staffId,staffName)
VALUES
<foreach collection="data.dataList" item="item" index="index" separator="," >
(#{item.deptId},#{item.deptName},#{item.number},#{item.phone},#{item.windowCount},#{item.remark},#{item.createTime},#{item.createUserId},#{item.updateUserId},#{item.updateTime},#{item.salaId},#{item.salaName},#{item.staffId},#{item.staffName},#{item.systemUserId},#{item.systemUserName})
(#{item.deptId},#{item.deptName},#{item.number},#{item.phone},#{item.windowCount},#{item.remark},#{item.createTime},#{item.createUserId},#{item.updateUserId},#{item.updateTime},#{item.salaId},#{item.salaName},#{item.staffId},#{item.staffName})
</foreach>
</insert>
......@@ -186,15 +178,6 @@
<if test="(colPickMode==0 and data.containsKey('staffName')) or (colPickMode==1 and !data.containsKey('staffName'))">
a.staffName=#{data.staffName},
</if>
<if test="(colPickMode==0 and data.containsKey('systemUserId')) or (colPickMode==1 and !data.containsKey('systemUserId'))">
a.systemUserId=#{data.systemUserId},
</if>
<if test="(colPickMode==0 and data.containsKey('systemUserIdIncrement')) or (colPickMode==1 and !data.containsKey('systemUserIdIncrement'))">
a.systemUserId=ifnull(a.systemUserId,0) + #{data.systemUserIdIncrement},
</if>
<if test="(colPickMode==0 and data.containsKey('systemUserName')) or (colPickMode==1 and !data.containsKey('systemUserName'))">
a.systemUserName=#{data.systemUserName},
</if>
</trim>
<trim suffixOverrides="where" suffix="">
where
......@@ -335,25 +318,6 @@
</if>
</foreach>
</trim>
<trim prefix="systemUserId=(case" suffix="ELSE systemUserId end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<choose>
<when test="(colPickMode==0 and item.containsKey('systemUserId')) or (colPickMode==1 and !item.containsKey('systemUserId'))">
when a.id=#{item.id} then #{item.systemUserId}
</when>
<when test="(colPickMode==0 and item.containsKey('systemUserIdIncrement')) or (colPickMode==1 and !item.containsKey('systemUserIdIncrement'))">
when a.id=#{item.id} then ifnull(a.systemUserId,0) + #{item.systemUserIdIncrement}
</when>
</choose>
</foreach>
</trim>
<trim prefix="systemUserName=(case" suffix="ELSE systemUserName end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('systemUserName')) or (colPickMode==1 and !item.containsKey('systemUserName'))">
when a.id=#{item.id} then #{item.systemUserName}
</if>
</foreach>
</trim>
</trim>
where id in
<foreach collection="data.dataList" item="item" index="index" open="(" separator="," close=")">
......@@ -823,54 +787,6 @@
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('systemUserId')">
<if test="conditionParamRef.systemUserId != null ">
${_conditionType_} a.systemUserId = #{${_conditionParam_}.systemUserId}
</if>
<if test="conditionParamRef.systemUserId == null">
${_conditionType_} a.systemUserId is null
</if>
</if>
<if test="conditionParamRef.containsKey('systemUserIdList') and conditionParamRef.systemUserIdList.size() > 0">
${_conditionType_} a.systemUserId in
<foreach collection="conditionParamRef.systemUserIdList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('systemUserIdNotList') and conditionParamRef.systemUserIdNotList.size() > 0">
${_conditionType_} a.systemUserId not in
<foreach collection="conditionParamRef.systemUserIdNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('systemUserIdStart') and conditionParamRef.systemUserIdStart != null">
${_conditionType_} a.systemUserId <![CDATA[ >= ]]> #{${_conditionParam_}.systemUserIdStart}
</if>
<if test="conditionParamRef.containsKey('systemUserIdEnd') and conditionParamRef.systemUserIdEnd != null">
${_conditionType_} a.systemUserId <![CDATA[ <= ]]> #{${_conditionParam_}.systemUserIdEnd}
</if>
<if test="conditionParamRef.containsKey('systemUserName')">
<if test="conditionParamRef.systemUserName != null and conditionParamRef.systemUserName != ''">
${_conditionType_} a.systemUserName like #{${_conditionParam_}.systemUserName}
</if>
<if test="conditionParamRef.systemUserName == null">
${_conditionType_} a.systemUserName is null
</if>
</if>
<if test="conditionParamRef.containsKey('systemUserNameList') and conditionParamRef.systemUserNameList.size() > 0">
${_conditionType_} a.systemUserName in
<foreach collection="conditionParamRef.systemUserNameList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('systemUserNameNotList') and conditionParamRef.systemUserNameNotList.size() > 0">
${_conditionType_} a.systemUserName not in
<foreach collection="conditionParamRef.systemUserNameNotList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
</sql>
<sql id="_orderCols_">
<if test="orderColList != null and !orderColList.isEmpty()">
......@@ -924,13 +840,6 @@
</foreach>
,
</if>
<if test="conditionParamRef.containsKey('systemUserIdList') and conditionParamRef.systemUserIdList.size() > 0">
field(a.systemUserId,
<foreach collection="conditionParamRef.systemUserIdList" open="" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
,
</if>
<trim suffixOverrides="," suffix="">
<foreach collection="orderColList" open="" close="" index="index" item="item" separator=",">
a.${item.colName} ${item.sortKind}
......@@ -988,13 +897,6 @@
</foreach>
,
</if>
<if test="conditionParamRef.containsKey('systemUserIdList') and conditionParamRef.systemUserIdList.size() > 0">
field(a.systemUserId,
<foreach collection="conditionParamRef.systemUserIdList" open="" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
,
</if>
<trim suffixOverrides="," suffix="">
<if test="orderCol.containsKey('id')">
a.id
......@@ -1071,16 +973,6 @@
<if test='orderCol.staffName != null and "DESC".equalsIgnoreCase(orderCol.staffName)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('systemUserId')">
a.systemUserId
<if test='orderCol.systemUserId != null and "DESC".equalsIgnoreCase(orderCol.systemUserId)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('systemUserName')">
a.systemUserName
<if test='orderCol.systemUserName != null and "DESC".equalsIgnoreCase(orderCol.systemUserName)'>DESC</if>
,
</if>
</trim>
</if>
......
package com.mortals.xhx.common.pdu.site;
import com.mortals.framework.model.BaseEntityLong;
import lombok.Data;
/**
* 站点大厅信息Pdu对象
*
* @author zxfei
* @date 2024-01-26
*/
@Data
public class SiteHallPdu extends BaseEntityLong {
private static final long serialVersionUID = 1L;
/**
* 站点ID
*/
private Long siteId;
/**
* 站点名称
*/
private String siteName;
/**
* 大厅名称
*/
private String hallName;
/**
* 地址
*/
private String address;
/**
* 楼层
*/
private Integer floor;
/**
* 楼栋
*/
private Integer build;
/**
* 备注
*/
private String remark;
public void initAttrValue(){
this.siteId = null;
this.siteName = "";
this.hallName = "";
this.address = "";
this.floor = 1;
this.build = 1;
this.remark = "";
}
}
\ No newline at end of file
......@@ -7,6 +7,11 @@ import java.util.List;
@Data
public class WindowPdu extends BaseEntityLong {
/**
* 窗口负责人ID
*/
private Long staffId;
/**
* 站点ID
*/
......@@ -92,4 +97,6 @@ public class WindowPdu extends BaseEntityLong {
/** 序号,主键,自增长排除列表 */
private List<Long> idNotList;
private List<Long> idList;
}
package com.mortals.xhx.feign.site;
import com.mortals.xhx.common.pdu.RespData;
import com.mortals.xhx.common.pdu.site.SiteHallPdu;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.feign.IFeign;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 站点大厅信息 Feign接口
*
* @author zxfei
* @date 2024-01-26
*/
@FeignClient(name = "base-manager", path = "/base", fallbackFactory = SiteHallFeignFallbackFactory.class)
public interface ISiteHallFeign extends IFeign {
/**
* 查看站点大厅信息列表
*
* @param siteHallPdu
* @return
*/
@PostMapping(value = "/site/hall/interlist")
Rest<RespData<List<SiteHallPdu>>> list(@RequestBody SiteHallPdu siteHallPdu);
/**
* 查看站点大厅信息
*
* @param id
* @return
*/
@GetMapping(value = "/site/hall/interinfo")
Rest<SiteHallPdu> info(@RequestParam(value = "id") Long id);
/**
* 删除站点大厅信息
*
* @param ids
* @return
*/
@GetMapping(value = "/site/hall/delete")
Rest<Void> delete(Long[] ids, @RequestHeader("Authorization") String authorization);
/**
* 站点大厅信息保存更新
*
* @param siteHallPdu
* @return
*/
@PostMapping(value = "/site/hall/save")
Rest<RespData<SiteHallPdu>> save(@RequestBody SiteHallPdu siteHallPdu, @RequestHeader("Authorization") String authorization);
}
@Slf4j
@Component
class SiteHallFeignFallbackFactory implements FallbackFactory<ISiteHallFeign> {
@Override
public ISiteHallFeign create(Throwable t) {
return new ISiteHallFeign() {
@Override
public Rest<RespData<List<SiteHallPdu>>> list(SiteHallPdu siteHallPdu) {
return Rest.fail("暂时无法获取站点大厅信息列表,请稍后再试!");
}
@Override
public Rest<SiteHallPdu> info(Long id) {
return Rest.fail("暂时无法获取站点大厅信息详细,请稍后再试!");
}
@Override
public Rest<Void> delete(Long[] ids, String authorization) {
return Rest.fail("暂时无法删除站点大厅信息,请稍后再试!");
}
@Override
public Rest<RespData<SiteHallPdu>> save(SiteHallPdu siteHallPdu, String authorization) {
return Rest.fail("暂时无法保存站点大厅信息,请稍后再试!");
}
};
}
}
......@@ -22,6 +22,11 @@ public interface IWindowFeign extends IFeign {
@PostMapping(value = "/window/interlist")
Rest<RespData<List<WindowPdu>>> list(@RequestBody WindowPdu windowPdu);
}
@Slf4j
......
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