Commit f2ca7a72 by zhiwj

批量导入

parent 704c711e
package com.gic.store.constant;
/**
* @author zhiwj
* @date 2019/7/3
*/
public enum StoreImportEnum {
WAIT("wait", "等待"),
;
private String code;
private String message;
StoreImportEnum(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public String getMessage() {
return message;
}
}
......@@ -112,6 +112,7 @@ public class StoreDTO implements Serializable {
private String cityId;
private String provinces;
private Integer createType;
private List<StoreExtendDTO> storeExtendList;
public Integer getStoreId() {
......@@ -345,4 +346,12 @@ public class StoreDTO implements Serializable {
public void setCompleteStatus(Integer completeStatus) {
this.completeStatus = completeStatus;
}
public void setStoreExtendList(List<StoreExtendDTO> storeExtendList) {
this.storeExtendList = storeExtendList;
}
public List<StoreExtendDTO> getStoreExtendList() {
return storeExtendList;
}
}
package com.gic.store.dto;
import java.io.Serializable;
/**
* @author zhiwj
* @date 2019/7/3
*/
public class StoreExtendDTO implements Serializable {
private static final long serialVersionUID = 6262138651367237464L;
/**
*
*/
private Integer storeExtendId;
/**
*
*/
private Integer storeId;
/**
*
*/
private Integer enterpriseId;
/**
* 字段属性id
*/
private Integer storeFieldId;
/**
* 字段属性值
*/
private String value;
/**
*
*/
private Integer sort;
/**
* 属性名称
*/
private String storeFieldName;
/**
* 属性code
*/
private String storeFieldCode;
/**
* 字段类型;1文本 2单选 3多选 4实数 5时间
*/
private Integer storeFieldType;
/**
* 字段详细配置
*/
private String storeFieldDetail;
/**
* 与ERP映射的门店字段
*/
private String erpRelCode;
public Integer getStoreExtendId() {
return storeExtendId;
}
public void setStoreExtendId(Integer storeExtendId) {
this.storeExtendId = storeExtendId;
}
public Integer getStoreId() {
return storeId;
}
public void setStoreId(Integer storeId) {
this.storeId = storeId;
}
public Integer getEnterpriseId() {
return enterpriseId;
}
public void setEnterpriseId(Integer enterpriseId) {
this.enterpriseId = enterpriseId;
}
public Integer getStoreFieldId() {
return storeFieldId;
}
public void setStoreFieldId(Integer storeFieldId) {
this.storeFieldId = storeFieldId;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public String getStoreFieldName() {
return storeFieldName;
}
public void setStoreFieldName(String storeFieldName) {
this.storeFieldName = storeFieldName;
}
public String getStoreFieldCode() {
return storeFieldCode;
}
public void setStoreFieldCode(String storeFieldCode) {
this.storeFieldCode = storeFieldCode;
}
public Integer getStoreFieldType() {
return storeFieldType;
}
public void setStoreFieldType(Integer storeFieldType) {
this.storeFieldType = storeFieldType;
}
public String getStoreFieldDetail() {
return storeFieldDetail;
}
public void setStoreFieldDetail(String storeFieldDetail) {
this.storeFieldDetail = storeFieldDetail;
}
public String getErpRelCode() {
return erpRelCode;
}
public void setErpRelCode(String erpRelCode) {
this.erpRelCode = erpRelCode;
}
}
package com.gic.store.dto;
import java.io.Serializable;
/**
* @author zhiwj
* @date 2019/7/3
*/
public class StoreTmpDTO implements Serializable {
private static final long serialVersionUID = 5641632947835212465L;
/**
*
*/
private Integer storeTmpId;
/**
*
*/
private Integer enterpriseId;
/**
* 域id
*/
private Integer regionId;
/**
* 域名称
*/
private String regionName;
/**
*
*/
private String storeName;
/**
*
*/
private String storeCode;
/**
*
*/
private String conactsPhone;
/**
*
*/
private String brands;
/**
*
*/
private String province;
/**
*
*/
private String city;
/**
*
*/
private String county;
/**
*
*/
private Integer areaId;
/**
*
*/
private String address;
/**
*
*/
private String longitude;
/**
*
*/
private String latitude;
/**
* 自定义字段导入信息
*/
private String customField;
/**
* 导入状态;-1待导入,1导入成功;2导入失败
*/
private Integer state;
/**
* 导入错误信息
*/
private String errorMessage;
/**
* uuid
*/
private String signKey;
/**
*
*/
private String storeType;
/**
*
*/
private String erpStatus;
private String storeGroupName;
public Integer getStoreTmpId() {
return storeTmpId;
}
public void setStoreTmpId(Integer storeTmpId) {
this.storeTmpId = storeTmpId;
}
public Integer getEnterpriseId() {
return enterpriseId;
}
public void setEnterpriseId(Integer enterpriseId) {
this.enterpriseId = enterpriseId;
}
public Integer getRegionId() {
return regionId;
}
public void setRegionId(Integer regionId) {
this.regionId = regionId;
}
public String getRegionName() {
return regionName;
}
public void setRegionName(String regionName) {
this.regionName = regionName;
}
public String getStoreName() {
return storeName;
}
public void setStoreName(String storeName) {
this.storeName = storeName;
}
public String getStoreCode() {
return storeCode;
}
public void setStoreCode(String storeCode) {
this.storeCode = storeCode;
}
public String getConactsPhone() {
return conactsPhone;
}
public void setConactsPhone(String conactsPhone) {
this.conactsPhone = conactsPhone;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
public Integer getAreaId() {
return areaId;
}
public void setAreaId(Integer areaId) {
this.areaId = areaId;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getLongitude() {
return longitude;
}
public void setLongitude(String longitude) {
this.longitude = longitude;
}
public String getLatitude() {
return latitude;
}
public void setLatitude(String latitude) {
this.latitude = latitude;
}
public String getCustomField() {
return customField;
}
public void setCustomField(String customField) {
this.customField = customField;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public String getSignKey() {
return signKey;
}
public void setSignKey(String signKey) {
this.signKey = signKey;
}
public String getStoreType() {
return storeType;
}
public void setStoreType(String storeType) {
this.storeType = storeType;
}
public String getErpStatus() {
return erpStatus;
}
public void setErpStatus(String erpStatus) {
this.erpStatus = erpStatus;
}
public String getBrands() {
return brands;
}
public void setBrands(String brands) {
this.brands = brands;
}
public String getStoreGroupName() {
return storeGroupName;
}
public void setStoreGroupName(String storeGroupName) {
this.storeGroupName = storeGroupName;
}
}
......@@ -4,6 +4,8 @@ import com.gic.api.base.commons.Page;
import com.gic.api.base.commons.ServiceResponse;
import com.gic.store.dto.StoreDTO;
import java.util.List;
/**
* @author zhiwj
* @date 2019/6/24
......@@ -28,4 +30,5 @@ public interface StoreApiService {
*/
ServiceResponse<Integer> costStoreMove(String storeIds, String toStoreId);
ServiceResponse<List<List<String>>> listImportTitle(Integer enterpriseId, Integer regionId);
}
package com.gic.store.service;
import com.gic.api.base.commons.Page;
import com.gic.api.base.commons.ServiceResponse;
import com.gic.store.dto.StoreTmpDTO;
import com.task.allocation.exception.TaskAllocationException;
import java.util.List;
/**
* @author zhiwj
* @date 2019/7/3
*/
public interface StoreImportApiService {
/**
* 判断当前企业下是否有正在导入的门店,true表示没有 false表示有
* @param enterpriseId
* @return
*/
ServiceResponse<Boolean> hasImportingStore(Integer enterpriseId);
void delStoreTmp(Integer enterpriseId);
ServiceResponse<String> importDataToStore(Integer enterpriseId, String userId, String uuId) throws TaskAllocationException;
void save(StoreTmpDTO bean);
ServiceResponse<Page> listStoreTmp(Integer enterpriseId, boolean isSuccess, Integer currentPage, Integer pageSize);
ServiceResponse<Boolean> validateStoreCode(Integer enterpriseId, String storeCode);
ServiceResponse<String> isExistStoreGroup(Integer enterpriseId, String storeGroupName);
ServiceResponse<List<String>> listBrandByNotExist(Integer enterpriseId, String brands);
}
......@@ -37,4 +37,5 @@ public interface StoreRegionApiService {
*/
ServiceResponse<List<StoreRegionDTO>> listStoreRegion(Integer enterpriseId, String search);
ServiceResponse<StoreRegionDTO> getStoreRegionByRegion(Integer enterpriseId, Integer regionId);
}
\ No newline at end of file
package com.gic.store.dao.mapper;
import com.gic.store.entity.TabStoreExtend;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface TabStoreExtendMapper {
/**
......@@ -50,4 +53,6 @@ public interface TabStoreExtendMapper {
* @return 更新条目数
*/
int updateByPrimaryKey(TabStoreExtend record);
List<TabStoreExtend> list(@Param("enterpriseId") Integer enterpriseId, @Param("storeId") Integer storeId);
}
\ No newline at end of file
package com.gic.store.dao.mapper;
import com.gic.store.entity.TabStoreTmp;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface TabStoreTmpMapper {
/**
......@@ -50,4 +53,10 @@ public interface TabStoreTmpMapper {
* @return 更新条目数
*/
int updateByPrimaryKey(TabStoreTmp record);
int countByStore(@Param("enterpriseId") Integer enterpriseId, @Param("errorMessage") String errorMessage);
void delStoreTmp(@Param("enterpriseId") Integer enterpriseId);
List<TabStoreTmp> listStoreTmp(@Param("enterpriseId") Integer enterpriseId, @Param("isSuccess") Boolean isSuccess, @Param("isWait") Boolean isWait);
}
\ No newline at end of file
......@@ -44,6 +44,11 @@ public class TabStoreTmp {
/**
*
*/
private String brands;
/**
*
*/
private String province;
/**
......@@ -92,6 +97,26 @@ public class TabStoreTmp {
private String errorMessage;
/**
* uuid
*/
private String signKey;
/**
*
*/
private String storeType;
/**
*
*/
private String erpStatus;
/**
*
*/
private String storeGroupName;
/**
*
*/
private Date createTime;
......@@ -157,6 +182,14 @@ public class TabStoreTmp {
this.conactsPhone = conactsPhone;
}
public String getBrands() {
return brands;
}
public void setBrands(String brands) {
this.brands = brands;
}
public String getProvince() {
return province;
}
......@@ -237,6 +270,38 @@ public class TabStoreTmp {
this.errorMessage = errorMessage;
}
public String getSignKey() {
return signKey;
}
public void setSignKey(String signKey) {
this.signKey = signKey;
}
public String getStoreType() {
return storeType;
}
public void setStoreType(String storeType) {
this.storeType = storeType;
}
public String getErpStatus() {
return erpStatus;
}
public void setErpStatus(String erpStatus) {
this.erpStatus = erpStatus;
}
public String getStoreGroupName() {
return storeGroupName;
}
public void setStoreGroupName(String storeGroupName) {
this.storeGroupName = storeGroupName;
}
public Date getCreateTime() {
return createTime;
}
......
package com.gic.store.service;
import com.gic.store.dto.StoreExtendDTO;
import com.gic.store.entity.TabStoreExtend;
import java.util.List;
/**
* @author zhiwj
* @date 2019/7/3
*/
public interface StoreExtendService {
void saveOrUpdate(Integer enterpriseId, Integer storeId, List<StoreExtendDTO> storeExtendList);
List<TabStoreExtend> listByStoreId(Integer enterpriseId, Integer storeId);
List<StoreExtendDTO> convertStoreExtendToDTO(List<TabStoreExtend> extendList);
}
package com.gic.store.service;
import com.gic.store.dto.StoreTmpDTO;
import com.gic.store.entity.TabStoreTmp;
import com.github.pagehelper.Page;
import java.util.List;
/**
* @author zhiwj
* @date 2019/7/3
*/
public interface StoreImportService {
Boolean hasImportingStore(Integer enterpriseId);
void delStoreTmp(Integer enterpriseId);
void save(StoreTmpDTO bean);
Page listStoreTmp(Integer enterpriseId, boolean isSuccess, Integer currentPage, Integer pageSize);
List<TabStoreTmp> listUnImportStore(String enterpriseId);
void updateData(StoreTmpDTO t);
}
......@@ -22,4 +22,6 @@ public interface StoreRegionService {
Page<TabStoreRegion> listStoreRegion(Integer enterpriseId, String search, Integer pageNum, Integer pageSize);
List<TabStoreRegion> listStoreRegion(Integer enterpriseId, String search);
TabStoreRegion getById(Integer enterpriseId, Integer regionId);
}
package com.gic.store.service;
import com.task.allocation.api.TaskAllocationOperation;
import com.task.allocation.exception.TaskAllocationException;
/**
* @author zhiwj
* @date 2019/7/4
*/
public interface StoreTaskService extends TaskAllocationOperation {
String importDataToStore(Integer enterpriseId, String userId, String uuId) throws TaskAllocationException;
}
package com.gic.store.service.impl;
import com.gic.commons.util.EntityUtil;
import com.gic.store.dao.mapper.TabStoreExtendMapper;
import com.gic.store.dto.StoreExtendDTO;
import com.gic.store.entity.TabStoreExtend;
import com.gic.store.entity.TabStoreField;
import com.gic.store.service.StoreExtendService;
import com.gic.store.service.StoreFieldService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* @author zhiwj
* @date 2019/7/3
*/
@Service
public class StoreExtendServiceImpl implements StoreExtendService {
@Autowired
private TabStoreExtendMapper tabStoreExtendMapper;
@Autowired
private StoreFieldService storeFieldService;
@Override
public void saveOrUpdate(Integer enterpriseId, Integer storeId, List<StoreExtendDTO> storeExtendList) {
List<TabStoreExtend> tabStoreExtendList = EntityUtil.changeEntityListByOrika(TabStoreExtend.class, storeExtendList);
for (TabStoreExtend tabStoreExtend : tabStoreExtendList) {
tabStoreExtend.setEnterpriseId(enterpriseId);
tabStoreExtend.setStoreId(storeId);
if (tabStoreExtend.getStoreExtendId() == null) {
tabStoreExtend.setCreateTime(new Date());
tabStoreExtendMapper.insertSelective(tabStoreExtend);
} else {
tabStoreExtendMapper.updateByPrimaryKeySelective(tabStoreExtend);
}
}
}
@Override
public List<TabStoreExtend> listByStoreId(Integer enterpriseId, Integer storeId) {
return tabStoreExtendMapper.list(enterpriseId, storeId);
}
@Override
public List<StoreExtendDTO> convertStoreExtendToDTO(List<TabStoreExtend> extendList) {
List<StoreExtendDTO> extendDTOList = EntityUtil.changeEntityListByOrika(StoreExtendDTO.class, extendList);
for (StoreExtendDTO storeExtendDTO : extendDTOList) {
TabStoreField field = storeFieldService.getStoreFieldById(storeExtendDTO.getStoreFieldId());
storeExtendDTO.setStoreFieldName(field.getStoreFieldName());
storeExtendDTO.setStoreFieldCode(field.getStoreFieldCode());
storeExtendDTO.setStoreFieldType(field.getStoreFieldType());
storeExtendDTO.setStoreFieldDetail(field.getStoreFieldDetail());
storeExtendDTO.setErpRelCode(field.getErpRelCode());
}
return extendDTOList;
}
}
package com.gic.store.service.impl;
import com.gic.commons.util.EntityUtil;
import com.gic.store.constant.StoreImportEnum;
import com.gic.store.dao.mapper.TabStoreTmpMapper;
import com.gic.store.dto.StoreTmpDTO;
import com.gic.store.entity.TabStoreTmp;
import com.gic.store.service.StoreImportService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author zhiwj
* @date 2019/7/3
*/
@Service
public class StoreImportServiceImpl implements StoreImportService {
@Autowired
private TabStoreTmpMapper tabStoreTmpMapper;
@Override
public Boolean hasImportingStore(Integer enterpriseId) {
int count = tabStoreTmpMapper.countByStore(enterpriseId, StoreImportEnum.WAIT.getCode());
return count > 0;
}
@Override
public void delStoreTmp(Integer enterpriseId) {
tabStoreTmpMapper.delStoreTmp(enterpriseId);
}
@Override
public void save(StoreTmpDTO bean) {
TabStoreTmp tabStoreTmp = EntityUtil.changeEntityByOrika(TabStoreTmp.class, bean);
tabStoreTmpMapper.insertSelective(tabStoreTmp);
}
@Override
public Page listStoreTmp(Integer enterpriseId, boolean isSuccess, Integer currentPage, Integer pageSize) {
PageHelper.startPage(currentPage, pageSize);
return (Page) tabStoreTmpMapper.listStoreTmp(enterpriseId, isSuccess, null);
}
@Override
public List<TabStoreTmp> listUnImportStore(String enterpriseId) {
return tabStoreTmpMapper.listStoreTmp(Integer.parseInt(enterpriseId), null, true);
}
@Override
public void updateData(StoreTmpDTO t) {
TabStoreTmp tabStoreTmp = new TabStoreTmp();
tabStoreTmp.setStoreTmpId(t.getStoreTmpId());
tabStoreTmp.setErrorMessage(t.getErrorMessage());
tabStoreTmpMapper.updateByPrimaryKeySelective(tabStoreTmp);
}
}
......@@ -73,4 +73,9 @@ public class StoreRegionServiceImpl implements StoreRegionService {
public List<TabStoreRegion> listStoreRegion(Integer enterpriseId, String search) {
return storeRegionMapper.listStoreRegion(enterpriseId, search);
}
@Override
public TabStoreRegion getById(Integer enterpriseId, Integer regionId) {
return storeRegionMapper.selectByPrimaryKey(regionId);
}
}
package com.gic.store.service.impl;
import com.gic.api.base.commons.ServiceResponse;
import com.gic.commons.util.GlobalInfo;
import com.gic.store.constant.CreateTypeEnum;
import com.gic.store.dto.*;
import com.gic.store.entity.TabStoreBrand;
import com.gic.store.entity.TabStoreGroup;
import com.gic.store.entity.TabStoreTmp;
import com.gic.store.service.*;
import com.google.common.base.Joiner;
import com.task.allocation.api.AbstractTaskAllocationOperation;
import com.task.allocation.exception.TaskAllocationException;
import com.task.allocation.qo.InitTaskQo;
import com.task.allocation.util.TaskAllocationSdkClient;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
/**
* @author zhiwj
* @date 2019/7/4
*/
@Service
public class StoreTaskServiceImpl extends AbstractTaskAllocationOperation implements StoreTaskService {
private static final Logger logger = LogManager.getLogger(StoreTaskServiceImpl.class);
@Autowired
private StoreImportService storeImportService;
@Autowired
private StoreBrandService storeBrandService;
@Autowired
private ProvincesApiService provincesApiService;
@Autowired
private StoreDictApiService storeDictApiService;
@Autowired
private StoreGroupService storeGroupService;
@Autowired
private StoreApiService storeApiService;
@Autowired
private StoreService storeService;
@Override
public List<Object> getListTasks(String params) {
// TODO
List<TabStoreTmp> list = storeImportService.listUnImportStore(params);
List<Object> listTask = new ArrayList<Object>(list);
logger.info("门店批量导入放入队列数据数量:{}", list.size());
return listTask;
}
@Override
public void dealSingle(Object o) throws TaskAllocationException {
StoreTmpDTO t = (StoreTmpDTO) o;
try {
ServiceResponse<Integer> serviceResponse = this.importDataToStore(t);
if (!serviceResponse.isSuccess()) {
t.setErrorMessage(serviceResponse.getMessage());
}
} catch (Exception e) {
logger.warn("写入门店表和成员表异常", e);
t.setErrorMessage("导入异常");
storeImportService.updateData(t);
}
}
public ServiceResponse<Integer> importDataToStore(StoreTmpDTO t) {
StoreDTO storeDTO = new StoreDTO();
storeDTO.setEnterpriseId(t.getEnterpriseId());
storeDTO.setStoreName(t.getStoreName());
if (storeService.countByStoreCode(t.getEnterpriseId(), t.getStoreCode(), null) > 0) {
t.setErrorMessage("门店code已经存在");
storeImportService.updateData(t);
}
storeDTO.setStoreCode(t.getStoreCode());
storeDTO.setRegionId(t.getRegionId());
storeDTO.setConactsPhone(t.getConactsPhone());
storeDTO.setAddress(t.getAddress());
String brands = t.getBrands();
String[] brandArr = brands.split("、");
List<TabStoreBrand> storeBrandList = storeBrandService.listAllStoreBrand(t.getEnterpriseId(), null, null, null);
List<Integer> list = new ArrayList<>();
for (String brandName : brandArr) {
for (TabStoreBrand storeBrand : storeBrandList) {
if (storeBrand.getStoreBrandName().equals(brandName)) {
list.add(storeBrand.getStoreBrandId());
break;
}
}
}
storeDTO.setBrandIds(Joiner.on(GlobalInfo.FLAG_COMMA).join(list));
ServiceResponse<List<ProvinceDTO>> provinceResponse = provincesApiService.selectAllProvince();
ServiceResponse<List<CityDTO>> cityResponse = provincesApiService.selectAllCity();
ServiceResponse<List<CountyDTO>> countyResponse = provincesApiService.selectAllCounty();
if (provinceResponse.isSuccess() && cityResponse.isSuccess() && countyResponse.isSuccess()) {
List<ProvinceDTO> provinceDTOList = provinceResponse.getResult();
Optional<ProvinceDTO> provinceDTO = provinceDTOList.stream().filter(e -> StringUtils.equals(e.getProvinceName(), t.getProvince())).findFirst();
storeDTO.setProvinceId(provinceDTO.get().getProvinceId());
List<CityDTO> cityDTOList = cityResponse.getResult();
Optional<CityDTO> cityDTO = cityDTOList.stream().filter(e -> StringUtils.equals(e.getCityName(), t.getCity())).findFirst();
storeDTO.setCityId(cityDTO.get().getCityId());
List<CountyDTO> countyDTOList = countyResponse.getResult();
Optional<CountyDTO> countyDTO = countyDTOList.stream().filter(e -> StringUtils.equals(e.getCountyName(), t.getCounty())).findFirst();
storeDTO.setAreaId(countyDTO.get().getCountyId());
storeDTO.setProvinces(provinceDTO.get().getProvinceName() + "\\" + cityDTO.get().getCityName() + "\\" + countyDTO.get().getCountyName());
} else {
logger.warn("省市区调用失败");
}
storeDTO.setLongitude(t.getLongitude());
storeDTO.setLatitude(t.getLatitude());
// todo 判断溢出
storeDTO.setOverflowStatus(0);
storeDTO.setStatus(2);
ServiceResponse<List<StoreDictDTO>> erpStatusResponse = storeDictApiService.listStoreStatus(t.getEnterpriseId());
if (erpStatusResponse.isSuccess()) {
List<StoreDictDTO> erpList = erpStatusResponse.getResult();
final String erpStatusTmp = t.getErpStatus().replace("\\s+", "");
Optional<StoreDictDTO> erpStatusDTO = erpList.stream().filter(e -> e.getValue().equals(erpStatusTmp)).findFirst();
storeDTO.setErpStatus(Integer.parseInt(erpStatusDTO.get().getKey()));
} else {
logger.warn("字典模块调用失败");
}
ServiceResponse<List<StoreDictDTO>> storeTypeResponse = storeDictApiService.listStoreType(t.getEnterpriseId());
if (storeTypeResponse.isSuccess()) {
List<StoreDictDTO> typeList = storeTypeResponse.getResult();
final String typeTmp = t.getStoreType().replace("\\s+", "");
Optional<StoreDictDTO> typeTmpDTO = typeList.stream().filter(e -> e.getValue().equals(typeTmp)).findFirst();
storeDTO.setStoreType(Integer.parseInt(typeTmpDTO.get().getKey()));
} else {
logger.warn("字典模块调用失败");
}
TabStoreGroup group = storeGroupService.getStoreGroupByName(t.getStoreGroupName(), t.getEnterpriseId());
storeDTO.setStoreGroupId(group.getStoreGroupId());
storeDTO.setCreateTime(new Date());
storeDTO.setCreateType(CreateTypeEnum.BATCH_IMPORT.getCode());
// todo 扩展信息
// storeDTO.setStoreExtendList(c);
return storeApiService.saveOrUpdate(storeDTO);
}
@Override
public String importDataToStore(Integer enterpriseId, String userId, String uuId) throws TaskAllocationException {
// TODO 队列
String message = "";
InitTaskQo initTaskQo = new InitTaskQo();
initTaskQo.setEnterpriseId(enterpriseId.toString());// 企业id
initTaskQo.setOperationUserId(userId);// 操作人id
initTaskQo.setTaskMqKey(GlobalInfo.MQ_ROUTER_BATCH_TMPSTORE);// 注册的队列名称
initTaskQo.setTaskType(GlobalInfo.TASK_TYPE_BATCH_IMPORT_STORE);// 任务类型
initTaskQo.setParams(enterpriseId.toString());// 你自己处理需要的参数
initTaskQo.setTaskSignKey(uuId);// 任务类型 唯一标识符
TaskAllocationSdkClient instance = TaskAllocationSdkClient.getInstance();// 初始化sdk
try {
instance.initTask(initTaskQo);// 初始化接口
logger.info("门店批量导入队列初始化成功");
} catch (Exception e) {
logger.warn("门店批量导入队列初始化异常", e);
message = "门店批量导入队列初始化异常";
}
return message;
}
}
package com.gic.store.service.outer;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.api.base.commons.Page;
import com.gic.api.base.commons.ServiceResponse;
import com.gic.commons.util.EntityUtil;
import com.gic.commons.util.PageHelperUtils;
import com.gic.store.dao.mapper.TabStoreGroupMapper;
import com.gic.store.dto.StoreBrandDTO;
import com.gic.store.dto.StoreBusinessTimeDTO;
import com.gic.store.dto.StoreDTO;
import com.gic.store.dto.StorePhotoDTO;
import com.gic.store.dto.*;
import com.gic.store.entity.*;
import com.gic.store.service.*;
import com.gic.store.utils.ErrorCode;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
......@@ -39,7 +41,10 @@ public class StoreApiServiceImpl implements StoreApiService {
private StoreBusinessTimeService storeBusinessTimeService;
@Autowired
private TabStoreGroupMapper tabStoreGroupMapper;
@Autowired
private StoreExtendService storeExtendService;
@Autowired
private StoreFieldService storeFieldService;
@Override
@Transactional(rollbackFor = Exception.class)
......@@ -58,6 +63,8 @@ public class StoreApiServiceImpl implements StoreApiService {
} else {
storeService.update(storeDTO);
}
// 自定义属性
storeExtendService.saveOrUpdate(storeDTO.getEnterpriseId(), storeDTO.getStoreId(), storeDTO.getStoreExtendList());
// 门店图片
List<Integer> delPhotos = null;
if (StringUtils.isNotEmpty(storeDTO.getDelPhotos())) {
......@@ -94,16 +101,25 @@ public class StoreApiServiceImpl implements StoreApiService {
if (storeGroup != null) {
storeDTO.setStoreGroupName(storeGroup.getStoreGroupName());
}
// 门店照片
List<TabStorePhoto> tabPhotoList = storePhotoService.listStorePhoto(storeDTO.getEnterpriseId(), storeDTO.getStoreId());
List<StorePhotoDTO> photoDTOList = EntityUtil.changeEntityListByOrika(StorePhotoDTO.class, tabPhotoList);
storeDTO.setPhotoList(photoDTOList);
// 营业时间
List<TabStoreBusinessTime> tabBusinessTimeList = storeBusinessTimeService.listBusinessTime(store.getStoreId());
List<StoreBusinessTimeDTO> businessTimeDTOList = EntityUtil.changeEntityListByOrika(StoreBusinessTimeDTO.class, tabBusinessTimeList);
storeDTO.setBusinessTimeList(businessTimeDTOList);
storeBusinessTimeService.convertBusinessTime(businessTimeDTOList);
// 门店品牌
List<TabStoreBrand> storeBrandList = storeBrandService.listStoreBrandByIds(store.getBrandIds());
List<StoreBrandDTO> brandDTOList = EntityUtil.changeEntityListByOrika(StoreBrandDTO.class, storeBrandList);
storeDTO.setBrandList(brandDTOList);
// 自定义属性
List<TabStoreExtend> extendList = storeExtendService.listByStoreId(enterpriseId, storeId);
List<StoreExtendDTO> extendDTOList = storeExtendService.convertStoreExtendToDTO(extendList);
storeDTO.setStoreExtendList(extendDTOList);
return ServiceResponse.success(storeDTO);
}
......@@ -111,4 +127,32 @@ public class StoreApiServiceImpl implements StoreApiService {
public ServiceResponse<Integer> costStoreMove(String storeIds, String toStoreId) {
return null;
}
@Override
public ServiceResponse<List<List<String>>> listImportTitle(Integer enterpriseId, Integer regionId) {
List<List<String>> list = new ArrayList<>();
String[] rowName = {"序号", "门店名称", "门店代码", "门店类型", "门店状态", "门店电话", "门店所属分组", "关联门店品牌", "省", "市", "区县", "门店地址(不包括省市区)", "经度", "纬度"};
List<String> rowNameList = new ArrayList<>();
Collections.addAll(rowNameList, rowName);
String[] description = {"", "不能超过20个字", "必填,不能超过20个字符,为erp系统中门店唯一识别码", "门店类型描述", "门店状态描述", "门店电话描述", "门店所属分组描述", "用\"、\"隔开", "省描述", "市描述", "区县描述", "门店地址(不包括省市区)描述", "", ""};
List<String> descriptionList = new ArrayList<>();
Collections.addAll(descriptionList, description);
list.add(rowNameList);
list.add(descriptionList);
List<TabStoreField> fields = storeFieldService.listStoreFieldByRegionId(regionId);
if (CollectionUtils.isNotEmpty(fields)) {
for (TabStoreField field : fields) {
rowNameList.add(field.getStoreFieldName());
String storeFieldDetail = field.getStoreFieldDetail();
JSONObject jsonObject = JSON.parseObject(storeFieldDetail);
descriptionList.add(jsonObject.getString("tipMessage"));
}
}
return ServiceResponse.success(list);
}
}
package com.gic.store.service.outer;
import com.gic.api.base.commons.Page;
import com.gic.api.base.commons.ServiceResponse;
import com.gic.commons.util.PageHelperUtils;
import com.gic.store.dto.StoreTmpDTO;
import com.gic.store.entity.TabStoreBrand;
import com.gic.store.entity.TabStoreGroup;
import com.gic.store.service.*;
import com.task.allocation.exception.TaskAllocationException;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author zhiwj
* @date 2019/7/3
*/
@Service("storeImportApiService")
@SuppressWarnings("unchecked")
public class StoreImportApiServiceImpl implements StoreImportApiService {
private static final Logger logger = LogManager.getLogger(StoreBrandApiServiceImpl.class);
@Autowired
private StoreBrandService storeBrandService;
@Autowired
private StoreApiService storeApiService;
@Autowired
private StoreService storeService;
@Autowired
private StoreImportService storeImportService;
@Autowired
private StoreGroupService storeGroupService;
@Autowired
private ProvincesApiService provincesApiService;
@Autowired
private StoreDictApiService storeDictApiService;
@Autowired
private StoreTaskService storeTaskService;
@Override
public ServiceResponse<Boolean> hasImportingStore(Integer enterpriseId) {
return ServiceResponse.success(storeImportService.hasImportingStore(enterpriseId));
}
@Override
public void delStoreTmp(Integer enterpriseId) {
storeImportService.delStoreTmp(enterpriseId);
}
@Override
public void save(StoreTmpDTO bean) {
storeImportService.save(bean);
}
@Override
public ServiceResponse<Page> listStoreTmp(Integer enterpriseId, boolean isSuccess, Integer currentPage, Integer pageSize) {
com.github.pagehelper.Page storeTmpList = storeImportService.listStoreTmp(enterpriseId, isSuccess, currentPage, pageSize);
Page<StoreTmpDTO> page = PageHelperUtils.changePageHelperToCurrentPage(storeTmpList, StoreTmpDTO.class);
return ServiceResponse.success(page);
}
@Override
public ServiceResponse<Boolean> validateStoreCode(Integer enterpriseId, String storeCode) {
return ServiceResponse.success(storeService.countByStoreCode(enterpriseId, storeCode, null) > 0);
}
@Override
public ServiceResponse<String> isExistStoreGroup(Integer enterpriseId, String storeGroupName) {
TabStoreGroup group = storeGroupService.getStoreGroupByName(storeGroupName, enterpriseId);
return ServiceResponse.success(group == null ? null : group.getStoreGroupName());
}
@Override
public ServiceResponse<List<String>> listBrandByNotExist(Integer enterpriseId, String brands) {
if (StringUtils.isBlank(brands)) {
return ServiceResponse.success();
}
List<String> resultList = new ArrayList<>();
List<TabStoreBrand> storeBrandList = storeBrandService.listAllStoreBrand(enterpriseId, null, null, null);
if (CollectionUtils.isEmpty(storeBrandList)) {
return ServiceResponse.success();
}
List<String> storeBrandNameList = storeBrandList.stream().map(TabStoreBrand::getStoreBrandName).collect(Collectors.toList());
String[] brandArr = brands.split("、");
// 这里如果门店品牌很多, 可以改成map 去做
for (String brandName : brandArr) {
if (!storeBrandNameList.contains(brandName)) {
resultList.add(brandName);
}
}
return ServiceResponse.success(resultList);
}
@Override
public ServiceResponse<String> importDataToStore(Integer enterpriseId, String userId, String uuId) throws TaskAllocationException {
return ServiceResponse.success(storeTaskService.importDataToStore(enterpriseId, userId, uuId));
}
}
......@@ -62,4 +62,9 @@ public class StoreRegionApiServiceImpl implements StoreRegionApiService {
List<TabStoreRegion> list = storeRegionService.listStoreRegion(enterpriseId, search);
return ServiceResponse.success(EntityUtil.changeEntityListByOrika(StoreRegionDTO.class, list));
}
@Override
public ServiceResponse<StoreRegionDTO> getStoreRegionByRegion(Integer enterpriseId, Integer regionId) {
return ServiceResponse.success(EntityUtil.changeEntityByOrika(StoreRegionDTO.class, storeRegionService.getById(enterpriseId, regionId)));
}
}
......@@ -34,4 +34,6 @@
<!--分组策略-->
<dubbo:service interface="com.gic.store.service.StoreStrategyApiService" ref="storeStrategyApiService" timeout="60000" />
<!--门店导入-->
<dubbo:service interface="com.gic.store.service.StoreImportApiService" ref="storeImportApiService" timeout="60000" />
</beans>
......@@ -139,4 +139,10 @@
is_search = #{isSearch,jdbcType=INTEGER}
where store_extend_id = #{storeExtendId,jdbcType=INTEGER}
</update>
<select id="list" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from tab_store_extend
where enterprise_id = #{enterpriseId} and store_id = #{storeId}
</select>
</mapper>
\ No newline at end of file
......@@ -9,6 +9,7 @@
<result column="store_name" jdbcType="VARCHAR" property="storeName" />
<result column="store_code" jdbcType="VARCHAR" property="storeCode" />
<result column="conacts_phone" jdbcType="VARCHAR" property="conactsPhone" />
<result column="brands" jdbcType="VARCHAR" property="brands" />
<result column="province" jdbcType="VARCHAR" property="province" />
<result column="city" jdbcType="VARCHAR" property="city" />
<result column="county" jdbcType="VARCHAR" property="county" />
......@@ -19,13 +20,18 @@
<result column="custom_field" jdbcType="VARCHAR" property="customField" />
<result column="state" jdbcType="INTEGER" property="state" />
<result column="error_message" jdbcType="VARCHAR" property="errorMessage" />
<result column="sign_key" jdbcType="VARCHAR" property="signKey" />
<result column="store_type" jdbcType="VARCHAR" property="storeType" />
<result column="erp_status" jdbcType="VARCHAR" property="erpStatus" />
<result column="store_group_name" jdbcType="VARCHAR" property="storeGroupName" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
store_tmp_id, enterprise_id, region_id, region_name, store_name, store_code, conacts_phone,
province, city, county, area_id, address, longitude, latitude, custom_field, state,
error_message, create_time, update_time
brands, province, city, county, area_id, address, longitude, latitude, custom_field,
state, error_message, sign_key, store_type, erp_status, store_group_name, create_time,
update_time
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
......@@ -40,18 +46,22 @@
<insert id="insert" parameterType="com.gic.store.entity.TabStoreTmp">
insert into tab_store_tmp (store_tmp_id, enterprise_id, region_id,
region_name, store_name, store_code,
conacts_phone, province, city,
county, area_id, address,
longitude, latitude, custom_field,
state, error_message, create_time,
update_time)
conacts_phone, brands, province,
city, county, area_id,
address, longitude, latitude,
custom_field, state, error_message,
sign_key, store_type, erp_status,
store_group_name, create_time, update_time
)
values (#{storeTmpId,jdbcType=INTEGER}, #{enterpriseId,jdbcType=INTEGER}, #{regionId,jdbcType=INTEGER},
#{regionName,jdbcType=VARCHAR}, #{storeName,jdbcType=VARCHAR}, #{storeCode,jdbcType=VARCHAR},
#{conactsPhone,jdbcType=VARCHAR}, #{province,jdbcType=VARCHAR}, #{city,jdbcType=VARCHAR},
#{county,jdbcType=VARCHAR}, #{areaId,jdbcType=INTEGER}, #{address,jdbcType=VARCHAR},
#{longitude,jdbcType=VARCHAR}, #{latitude,jdbcType=VARCHAR}, #{customField,jdbcType=VARCHAR},
#{state,jdbcType=INTEGER}, #{errorMessage,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
#{updateTime,jdbcType=TIMESTAMP})
#{conactsPhone,jdbcType=VARCHAR}, #{brands,jdbcType=VARCHAR}, #{province,jdbcType=VARCHAR},
#{city,jdbcType=VARCHAR}, #{county,jdbcType=VARCHAR}, #{areaId,jdbcType=INTEGER},
#{address,jdbcType=VARCHAR}, #{longitude,jdbcType=VARCHAR}, #{latitude,jdbcType=VARCHAR},
#{customField,jdbcType=VARCHAR}, #{state,jdbcType=INTEGER}, #{errorMessage,jdbcType=VARCHAR},
#{signKey,jdbcType=VARCHAR}, #{storeType,jdbcType=VARCHAR}, #{erpStatus,jdbcType=VARCHAR},
#{storeGroupName,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}
)
</insert>
<insert id="insertSelective" parameterType="com.gic.store.entity.TabStoreTmp">
insert into tab_store_tmp
......@@ -77,6 +87,9 @@
<if test="conactsPhone != null">
conacts_phone,
</if>
<if test="brands != null">
brands,
</if>
<if test="province != null">
province,
</if>
......@@ -107,6 +120,18 @@
<if test="errorMessage != null">
error_message,
</if>
<if test="signKey != null">
sign_key,
</if>
<if test="storeType != null">
store_type,
</if>
<if test="erpStatus != null">
erp_status,
</if>
<if test="storeGroupName != null">
store_group_name,
</if>
<if test="createTime != null">
create_time,
</if>
......@@ -136,6 +161,9 @@
<if test="conactsPhone != null">
#{conactsPhone,jdbcType=VARCHAR},
</if>
<if test="brands != null">
#{brands,jdbcType=VARCHAR},
</if>
<if test="province != null">
#{province,jdbcType=VARCHAR},
</if>
......@@ -166,6 +194,18 @@
<if test="errorMessage != null">
#{errorMessage,jdbcType=VARCHAR},
</if>
<if test="signKey != null">
#{signKey,jdbcType=VARCHAR},
</if>
<if test="storeType != null">
#{storeType,jdbcType=VARCHAR},
</if>
<if test="erpStatus != null">
#{erpStatus,jdbcType=VARCHAR},
</if>
<if test="storeGroupName != null">
#{storeGroupName,jdbcType=VARCHAR},
</if>
<if test="createTime != null">
#{createTime,jdbcType=TIMESTAMP},
</if>
......@@ -195,6 +235,9 @@
<if test="conactsPhone != null">
conacts_phone = #{conactsPhone,jdbcType=VARCHAR},
</if>
<if test="brands != null">
brands = #{brands,jdbcType=VARCHAR},
</if>
<if test="province != null">
province = #{province,jdbcType=VARCHAR},
</if>
......@@ -225,6 +268,18 @@
<if test="errorMessage != null">
error_message = #{errorMessage,jdbcType=VARCHAR},
</if>
<if test="signKey != null">
sign_key = #{signKey,jdbcType=VARCHAR},
</if>
<if test="storeType != null">
store_type = #{storeType,jdbcType=VARCHAR},
</if>
<if test="erpStatus != null">
erp_status = #{erpStatus,jdbcType=VARCHAR},
</if>
<if test="storeGroupName != null">
store_group_name = #{storeGroupName,jdbcType=VARCHAR},
</if>
<if test="createTime != null">
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
......@@ -242,6 +297,7 @@
store_name = #{storeName,jdbcType=VARCHAR},
store_code = #{storeCode,jdbcType=VARCHAR},
conacts_phone = #{conactsPhone,jdbcType=VARCHAR},
brands = #{brands,jdbcType=VARCHAR},
province = #{province,jdbcType=VARCHAR},
city = #{city,jdbcType=VARCHAR},
county = #{county,jdbcType=VARCHAR},
......@@ -252,8 +308,33 @@
custom_field = #{customField,jdbcType=VARCHAR},
state = #{state,jdbcType=INTEGER},
error_message = #{errorMessage,jdbcType=VARCHAR},
sign_key = #{signKey,jdbcType=VARCHAR},
store_type = #{storeType,jdbcType=VARCHAR},
erp_status = #{erpStatus,jdbcType=VARCHAR},
store_group_name = #{storeGroupName,jdbcType=VARCHAR},
create_time = #{createTime,jdbcType=TIMESTAMP},
update_time = #{updateTime,jdbcType=TIMESTAMP}
where store_tmp_id = #{storeTmpId,jdbcType=INTEGER}
</update>
<select id="countByStore" resultType="java.lang.Integer">
select count(1) from tab_store_tmp where enterprise_id = #{enterpriseId} and error_message = #{errorMessage}
</select>
<delete id="delStoreTmp">
delete from tab_store_tmp where enterprise_id = #{enterpriseId}
</delete>
<select id="listStoreTmp" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from tab_store_tmp
where enterprise_id = #{enterpriseId}
<if test="isSuccess != null and isSuccess">
and error_message = 'success'
</if>
<if test="isSuccess != null and !isSuccess">
and error_message &lt;&gt; 'success' and error_message &lt;&gt; 'wait'
</if>
<if test="isWait != null and isWait">
and error_message = 'wait'
</if>
</select>
</mapper>
\ No newline at end of file
......@@ -97,6 +97,16 @@
<version>1.23</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.11</version>
</dependency>
</dependencies>
<build>
......
......@@ -8,17 +8,32 @@ import com.gic.commons.webapi.reponse.RestResponse;
import com.gic.store.constant.CreateTypeEnum;
import com.gic.store.dto.StoreBusinessTimeDTO;
import com.gic.store.dto.StoreDTO;
import com.gic.store.dto.StoreExtendDTO;
import com.gic.store.dto.StorePhotoDTO;
import com.gic.store.service.StoreApiService;
import com.gic.store.utils.ErrorCode;
import com.gic.store.web.ExcelUtils;
import com.gic.store.web.qo.PageQO;
import com.gic.store.web.qo.store.StoreQO;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
......@@ -49,6 +64,9 @@ public class StoreController {
storeDTO.setBusinessTimeList(businessTimeList);
}
storeDTO.setCreateType(CreateTypeEnum.BACKGROUND_ADD.getCode());
String fieldJson = storeQO.getFieldJson();
List<StoreExtendDTO> extendList = JSON.parseArray(fieldJson, StoreExtendDTO.class);
storeDTO.setStoreExtendList(extendList);
ServiceResponse<Integer> serviceResponse = storeApiService.saveOrUpdate(storeDTO);
if (serviceResponse.isSuccess()) {
return RestResponse.success(serviceResponse.getResult());
......
......@@ -110,6 +110,7 @@ public class StoreQO implements Serializable {
private String delBusinessTimes;
private String businessTimes;
private String storeGroupName;
private String fieldJson;
public Integer getStoreId() {
return storeId;
......@@ -326,4 +327,12 @@ public class StoreQO implements Serializable {
public void setCreateType(Integer createType) {
this.createType = createType;
}
public String getFieldJson() {
return fieldJson;
}
public void setFieldJson(String fieldJson) {
this.fieldJson = fieldJson;
}
}
......@@ -29,4 +29,8 @@
<!--分组策略-->
<dubbo:reference interface="com.gic.store.service.StoreStrategyApiService" id="storeStrategyApiService" timeout="60000" retries="0"/>
<!--门店导入-->
<dubbo:reference interface="com.gic.store.service.StoreImportApiService" id="storeImportApiService" timeout="60000" />
<dubbo:reference interface="com.gic.store.service.ProvincesApiService" id="provincesApiService" timeout="60000" />
</beans>
\ No newline at end of file
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