Showing
6 changed files
with
219 additions
and
149 deletions
| 1 | +package com.erry.iclear.dateInterface.api; | ||
| 2 | + | ||
| 3 | +import com.erry.iclear.dateInterface.api.request.Basfc; | ||
| 4 | +import com.erry.iclear.dateInterface.api.request.Mawb; | ||
| 5 | +import com.erry.iclear.dateInterface.api.response.ResultRS; | ||
| 6 | +import com.erry.iclear.dateInterface.entity.IClearApiLog; | ||
| 7 | +import com.erry.iclear.dateInterface.service.BasfService; | ||
| 8 | +import com.erry.iclear.dateInterface.service.IClearApiLogService; | ||
| 9 | +import com.erry.iclear.dateInterface.service.MawbService; | ||
| 10 | +import com.google.gson.Gson; | ||
| 11 | +import io.swagger.annotations.ApiOperation; | ||
| 12 | +import lombok.extern.slf4j.Slf4j; | ||
| 13 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 14 | +import org.springframework.util.StopWatch; | ||
| 15 | +import org.springframework.validation.annotation.Validated; | ||
| 16 | +import org.springframework.web.bind.annotation.*; | ||
| 17 | + | ||
| 18 | +import javax.servlet.http.HttpServletRequest; | ||
| 19 | +import java.util.Date; | ||
| 20 | +import java.util.Objects; | ||
| 21 | + | ||
| 22 | +@RestController | ||
| 23 | +@RequestMapping("/basf") | ||
| 24 | +@Slf4j | ||
| 25 | +public class BasfDataInterface { | ||
| 26 | + private Gson gson = new Gson(); | ||
| 27 | + | ||
| 28 | + @Autowired | ||
| 29 | + private BasfService basfService; | ||
| 30 | + | ||
| 31 | + @Autowired | ||
| 32 | + private IClearApiLogService iClearApiLogService; | ||
| 33 | + | ||
| 34 | + @ApiOperation(value = "BASF推送运单数据", httpMethod = "POST", notes = "ex: http://192.168.1.75:8080/customs/sendMawbBasf") | ||
| 35 | + @PostMapping("/sendMawbBasf") | ||
| 36 | + @ResponseBody | ||
| 37 | + public ResultRS sendMawbBasf(HttpServletRequest request | ||
| 38 | + , @Validated @RequestBody Basfc basfc) { | ||
| 39 | + log.info("接收到请求数据consignmentCode:"+basfc.getConsignmentCode()+" data:" + gson.toJson(basfc)); | ||
| 40 | + ResultRS result = new ResultRS(Boolean.FALSE,"",""); | ||
| 41 | + | ||
| 42 | + if(Objects.equals(basfc,null)){ | ||
| 43 | + result.setCode("-7"); | ||
| 44 | + result.setMsg("请求信息不能为空"); | ||
| 45 | + return result; | ||
| 46 | + } | ||
| 47 | + //1、保存请求信息,保存到iClear的 SQLServer | ||
| 48 | + | ||
| 49 | + StopWatch sw = new StopWatch("receice mawbBasf"); | ||
| 50 | + sw.start("save log"); | ||
| 51 | + | ||
| 52 | + String appId=(String) request.getHeader("Appid"); | ||
| 53 | + String appKey=(String) request.getHeader("Appkey"); | ||
| 54 | + String timeStamp=(String) request.getHeader("TimeStamp"); | ||
| 55 | + IClearApiLog saveIClearApiLogResult = iClearApiLogService.saveIClearApiLog(iClearApiLogService.convertToIClearApiLogC(basfc,appId,appKey,new Date(Long.valueOf(timeStamp)))); | ||
| 56 | + | ||
| 57 | + basfc.setAppId(appId); | ||
| 58 | + Mawb saveMawbBasfResult = null; | ||
| 59 | + if(!Objects.equals(saveIClearApiLogResult,null)){ | ||
| 60 | + log.info("请求保存成功,msgId:"+saveIClearApiLogResult.getMsgId()); | ||
| 61 | + basfc.setMsgId(saveIClearApiLogResult.getMsgId()); | ||
| 62 | + basfc.getBasfcDetailList().forEach(d->{ | ||
| 63 | + d.setMsgId(saveIClearApiLogResult.getMsgId()); | ||
| 64 | + }); | ||
| 65 | + saveMawbBasfResult = basfService.saveMawbBasf(basfc); | ||
| 66 | + if(!Objects.equals(saveMawbBasfResult,null)){ | ||
| 67 | + log.info("请求数据运单号"+basfc.getConsignmentCode()+"保存成功,msgId:"+saveMawbBasfResult.getMsgId()); | ||
| 68 | + }else{ | ||
| 69 | + log.info("请求数据运单号"+basfc.getConsignmentCode()+"保存失败,msgId:"+saveMawbBasfResult.getMsgId()); | ||
| 70 | + } | ||
| 71 | + }else{ | ||
| 72 | + log.info("请求日志保存失败,consignmentCode:"+basfc.getConsignmentCode()); | ||
| 73 | + } | ||
| 74 | + sw.stop(); | ||
| 75 | + | ||
| 76 | + | ||
| 77 | + //2、TODO 校验主单 | ||
| 78 | + /* sw.start("checkMawb"); | ||
| 79 | + result=mawbService.checkMawb(mawb); | ||
| 80 | + if(!result.getSuccess()){ | ||
| 81 | + return result; | ||
| 82 | + } | ||
| 83 | + sw.stop();*/ | ||
| 84 | + | ||
| 85 | +// //3、TODO 校验子单 | ||
| 86 | +// sw.start("checkMawbDetail"); | ||
| 87 | +// result=mawbDetailServicel.checkMawbDetail(mawb); | ||
| 88 | +// if(!result.getSuccess()){ | ||
| 89 | +// return result; | ||
| 90 | +// } | ||
| 91 | +// sw.stop(); | ||
| 92 | + | ||
| 93 | + | ||
| 94 | + //4、保存运单到iclear中 | ||
| 95 | + sw.start("processChmConsignment"); | ||
| 96 | + result = chmConsignmentService.processChmConsignment(saveMawbBasfResult, timeStamp,appId); | ||
| 97 | + if(!result.getSuccess()){ | ||
| 98 | + return result; | ||
| 99 | + } | ||
| 100 | + sw.stop(); | ||
| 101 | + | ||
| 102 | + | ||
| 103 | + //5、更新日志 | ||
| 104 | + sw.start("updateIClearApiLog"); | ||
| 105 | + if(!Objects.equals(saveIClearApiLogResult,null)){ | ||
| 106 | + saveIClearApiLogResult.setReceiveResult(result.getSuccess().toString()); | ||
| 107 | + saveIClearApiLogResult.setErrorCode(result.getCode()); | ||
| 108 | + saveIClearApiLogResult.setResponseTime(new Date()); | ||
| 109 | + saveIClearApiLogResult.setSpendTime(sw.getTotalTimeMillis()); | ||
| 110 | + | ||
| 111 | + iClearApiLogService.updateIClearApiLog(saveIClearApiLogResult); | ||
| 112 | + } | ||
| 113 | + log.info("请求数据consignmentCode:"+basfc.getConsignmentCode() +" 接收结束"); | ||
| 114 | + sw.stop(); | ||
| 115 | + log.info(sw.prettyPrint()); | ||
| 116 | + | ||
| 117 | + //6、return result | ||
| 118 | + result.setSuccess(Boolean.TRUE); | ||
| 119 | + result.setCode("0"); | ||
| 120 | + return result; | ||
| 121 | + } | ||
| 122 | +} |
| ... | @@ -135,95 +135,6 @@ public class CustomsDataInterface { | ... | @@ -135,95 +135,6 @@ public class CustomsDataInterface { |
| 135 | result.setCode("0"); | 135 | result.setCode("0"); |
| 136 | return result; | 136 | return result; |
| 137 | } | 137 | } |
| 138 | - | ||
| 139 | - @ApiOperation(value = "BASF推送运单数据", httpMethod = "POST", notes = "ex: http://192.168.1.75:8080/customs/sendMawbBasf") | ||
| 140 | - @PostMapping("/sendMawbBasf") | ||
| 141 | - @ResponseBody | ||
| 142 | - public ResultRS sendMawbBasf(HttpServletRequest request | ||
| 143 | - ,@Validated @RequestBody Basfc basfc) { | ||
| 144 | - log.info("接收到请求数据consignmentCode:"+basfc.getConsignmentCode()+" data:" + gson.toJson(basfc)); | ||
| 145 | - ResultRS result = new ResultRS(Boolean.FALSE,"",""); | ||
| 146 | - | ||
| 147 | - if(Objects.equals(basfc,null)){ | ||
| 148 | - result.setCode("-7"); | ||
| 149 | - result.setMsg("请求信息不能为空"); | ||
| 150 | - return result; | ||
| 151 | - } | ||
| 152 | - //1、保存请求信息,保存到iClear的 SQLServer | ||
| 153 | - | ||
| 154 | - StopWatch sw = new StopWatch("receice mawbBasf"); | ||
| 155 | - sw.start("save log"); | ||
| 156 | - | ||
| 157 | - String appId=(String) request.getHeader("Appid"); | ||
| 158 | - String appKey=(String) request.getHeader("Appkey"); | ||
| 159 | - String timeStamp=(String) request.getHeader("TimeStamp"); | ||
| 160 | - IClearApiLog saveIClearApiLogResult = iClearApiLogService.saveIClearApiLog(iClearApiLogService.convertToIClearApiLogC(basfc,appId,appKey,new Date(Long.valueOf(timeStamp)))); | ||
| 161 | - | ||
| 162 | - basfc.setAppId(appId); | ||
| 163 | - Mawb saveMawbBasfResult = null; | ||
| 164 | - if(!Objects.equals(saveIClearApiLogResult,null)){ | ||
| 165 | - log.info("请求保存成功,msgId:"+saveIClearApiLogResult.getMsgId()); | ||
| 166 | - basfc.setMsgId(saveIClearApiLogResult.getMsgId()); | ||
| 167 | - basfc.getBasfcDetailList().forEach(d->{ | ||
| 168 | - d.setMsgId(saveIClearApiLogResult.getMsgId()); | ||
| 169 | - }); | ||
| 170 | - saveMawbBasfResult = mawbService.saveMawbBasf(basfc); | ||
| 171 | - if(!Objects.equals(saveMawbBasfResult,null)){ | ||
| 172 | - log.info("请求数据运单号"+basfc.getConsignmentCode()+"保存成功,msgId:"+saveMawbBasfResult.getMsgId()); | ||
| 173 | - }else{ | ||
| 174 | - log.info("请求数据运单号"+basfc.getConsignmentCode()+"保存失败,msgId:"+saveMawbBasfResult.getMsgId()); | ||
| 175 | - } | ||
| 176 | - }else{ | ||
| 177 | - log.info("请求日志保存失败,consignmentCode:"+basfc.getConsignmentCode()); | ||
| 178 | - } | ||
| 179 | - sw.stop(); | ||
| 180 | - | ||
| 181 | - | ||
| 182 | - //2、TODO 校验主单 | ||
| 183 | - /* sw.start("checkMawb"); | ||
| 184 | - result=mawbService.checkMawb(mawb); | ||
| 185 | - if(!result.getSuccess()){ | ||
| 186 | - return result; | ||
| 187 | - } | ||
| 188 | - sw.stop();*/ | ||
| 189 | - | ||
| 190 | -// //3、TODO 校验子单 | ||
| 191 | -// sw.start("checkMawbDetail"); | ||
| 192 | -// result=mawbDetailServicel.checkMawbDetail(mawb); | ||
| 193 | -// if(!result.getSuccess()){ | ||
| 194 | -// return result; | ||
| 195 | -// } | ||
| 196 | -// sw.stop(); | ||
| 197 | - | ||
| 198 | - | ||
| 199 | - //4、保存运单到iclear中 | ||
| 200 | - sw.start("processChmConsignment"); | ||
| 201 | - result = chmConsignmentService.processChmConsignment(saveMawbBasfResult, timeStamp,appId); | ||
| 202 | - if(!result.getSuccess()){ | ||
| 203 | - return result; | ||
| 204 | - } | ||
| 205 | - sw.stop(); | ||
| 206 | - | ||
| 207 | - | ||
| 208 | - //5、更新日志 | ||
| 209 | - sw.start("updateIClearApiLog"); | ||
| 210 | - if(!Objects.equals(saveIClearApiLogResult,null)){ | ||
| 211 | - saveIClearApiLogResult.setReceiveResult(result.getSuccess().toString()); | ||
| 212 | - saveIClearApiLogResult.setErrorCode(result.getCode()); | ||
| 213 | - saveIClearApiLogResult.setResponseTime(new Date()); | ||
| 214 | - saveIClearApiLogResult.setSpendTime(sw.getTotalTimeMillis()); | ||
| 215 | - | ||
| 216 | - iClearApiLogService.updateIClearApiLog(saveIClearApiLogResult); | ||
| 217 | - } | ||
| 218 | - log.info("请求数据consignmentCode:"+basfc.getConsignmentCode() +" 接收结束"); | ||
| 219 | - sw.stop(); | ||
| 220 | - log.info(sw.prettyPrint()); | ||
| 221 | - | ||
| 222 | - //6、return result | ||
| 223 | - result.setSuccess(Boolean.TRUE); | ||
| 224 | - result.setCode("0"); | ||
| 225 | - return result; | ||
| 226 | - } | ||
| 227 | } | 138 | } |
| 228 | 139 | ||
| 229 | 140 | ... | ... |
This diff is collapsed. Click to expand it.
| 1 | +package com.erry.iclear.dateInterface.repository; | ||
| 2 | + | ||
| 3 | +import com.erry.iclear.dateInterface.api.request.BasfMawb; | ||
| 4 | +import org.springframework.data.jpa.repository.JpaRepository; | ||
| 5 | +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; | ||
| 6 | +import org.springframework.stereotype.Repository; | ||
| 7 | +import org.springframework.transaction.annotation.Transactional; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * @author Administrator | ||
| 11 | + */ | ||
| 12 | +@Repository | ||
| 13 | +@Transactional(rollbackFor = Exception.class) | ||
| 14 | +public interface BasfMawbRepository extends JpaRepository<BasfMawb, Integer>, JpaSpecificationExecutor<BasfMawb> { | ||
| 15 | +} |
| 1 | +package com.erry.iclear.dateInterface.service; | ||
| 2 | + | ||
| 3 | +import com.erry.iclear.dateInterface.api.request.*; | ||
| 4 | +import com.erry.iclear.dateInterface.repository.BasfMawbRepository; | ||
| 5 | +import com.erry.iclear.dateInterface.util.NumberUtils; | ||
| 6 | +import lombok.extern.slf4j.Slf4j; | ||
| 7 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 8 | +import org.springframework.stereotype.Service; | ||
| 9 | + | ||
| 10 | +import java.util.ArrayList; | ||
| 11 | +import java.util.List; | ||
| 12 | + | ||
| 13 | +/** | ||
| 14 | + * @author Administrator | ||
| 15 | + */ | ||
| 16 | +@Service | ||
| 17 | +@Slf4j | ||
| 18 | +public class BasfService { | ||
| 19 | + @Autowired | ||
| 20 | + private BasfMawbRepository basfMawbRepository; | ||
| 21 | + | ||
| 22 | + /** | ||
| 23 | + * 保存主单Request --basfc | ||
| 24 | + * @param basfc | ||
| 25 | + */ | ||
| 26 | + public Mawb saveMawbBasf(Basfc basfc){ | ||
| 27 | + Mawb result=null; | ||
| 28 | + try{ | ||
| 29 | + log.info("saveMawb start>>>>>>>>>>>"); | ||
| 30 | + //运单头部信息 | ||
| 31 | + BasfMawb mawb = new BasfMawb(); | ||
| 32 | + mawb.setAppId(basfc.getAppId()); | ||
| 33 | + mawb.setMsgId(basfc.getMsgId()); | ||
| 34 | + mawb.setConsignmentCodeId(basfc.getConsignmentId()); | ||
| 35 | + mawb.setType(basfc.getConsType()); | ||
| 36 | + //TODO 记录时为同一张表,用 '-->' 记录具体存放字段(方便查看,以免误解) | ||
| 37 | + //运单号-->提单号 | ||
| 38 | + mawb.setBillNo(basfc.getConsignmentCode()); | ||
| 39 | + //经营单位 --> 消费使用/生产销售单位名称 | ||
| 40 | + mawb.setOwnerName(basfc.getOperateUnitName()); | ||
| 41 | + //经营单位海关编码 --> 消费使用/生产销售单位代码 | ||
| 42 | + mawb.setOwnerCode(basfc.getOperateUnitCode()); | ||
| 43 | + //经营单位社会信用证代码 --> 消费使用/生产销售单位单位统一编码 | ||
| 44 | + mawb.setOwnerCodeScc(basfc.getOperateSCC()); | ||
| 45 | + //发件人 --> 境内收发货人名称 | ||
| 46 | + mawb.setTradeName(basfc.getSender()); | ||
| 47 | + //发件人海关编码 --> 境内收发货人编号 | ||
| 48 | + mawb.setTradeCode(basfc.getShipperCustomsCode()); | ||
| 49 | + //发件人社会信用证代码 --> 生产核销单位统一信用代码---报关形式类型 | ||
| 50 | + mawb.setTradeCodeScc(basfc.getShipperSCC()); | ||
| 51 | + | ||
| 52 | + mawb.setEANNo(basfc.getEANNo()); | ||
| 53 | + //明细 | ||
| 54 | + List<MawbDetail> mawbDetailList = new ArrayList<>(); | ||
| 55 | + if (basfc.getBasfcDetailList().size()>0){ | ||
| 56 | + for (BasfcDetail basfcDetail : basfc.getBasfcDetailList()){ | ||
| 57 | + MawbDetail mawbDetail = new MawbDetail(); | ||
| 58 | + mawbDetail.setDetailId(basfcDetail.getConsignmentDetailId()); | ||
| 59 | + mawbDetail.setGmodel(basfcDetail.getModel()); | ||
| 60 | + mawbDetail.setCodeTS(basfcDetail.getSkuCode()); | ||
| 61 | + mawbDetail.setGname(basfcDetail.getSkuName()); | ||
| 62 | + mawbDetail.setGqty(basfcDetail.getKnockdownNumber()); | ||
| 63 | + mawbDetail.setGunit(basfcDetail.getKnockdownUnit()); | ||
| 64 | + mawbDetail.setFirstUnit(basfcDetail.getUnitLegalFirst()); | ||
| 65 | + mawbDetail.setFirstQty(NumberUtils.bigDecimalToIntger(basfcDetail.getQtyLegalFirst())); | ||
| 66 | + mawbDetail.setSecondQty(NumberUtils.bigDecimalToIntger(basfcDetail.getQtyLegalSecond())); | ||
| 67 | + mawbDetail.setSecondUnit(basfcDetail.getUnitLegalSecond()); | ||
| 68 | + mawbDetail.setDeclTotal(basfcDetail.getDeclaredAmount()); | ||
| 69 | + mawbDetail.setTradeCurr(basfcDetail.getCurrency()); | ||
| 70 | + mawbDetail.setDeclaredWeight(basfcDetail.getDeclaredWeight()); | ||
| 71 | + mawbDetailList.add(mawbDetail); | ||
| 72 | + } | ||
| 73 | + } | ||
| 74 | + mawb.setMawbDetailList(mawbDetailList); | ||
| 75 | + result = basfMawbRepository.save(mawb); | ||
| 76 | + log.info("saveMawb end>>>>>>>>>>>"); | ||
| 77 | + }catch (Exception e){ | ||
| 78 | + log.error("saveMawb() error:"+e.getMessage()); | ||
| 79 | + } | ||
| 80 | + return result; | ||
| 81 | + } | ||
| 82 | +} |
| ... | @@ -66,66 +66,6 @@ public class MawbService { | ... | @@ -66,66 +66,6 @@ public class MawbService { |
| 66 | 66 | ||
| 67 | 67 | ||
| 68 | /** | 68 | /** |
| 69 | - * 保存主单Request --basfc | ||
| 70 | - * @param basfc | ||
| 71 | - */ | ||
| 72 | - public Mawb saveMawbBasf(Basfc basfc){ | ||
| 73 | - Mawb result=null; | ||
| 74 | - try{ | ||
| 75 | - log.info("saveMawb start>>>>>>>>>>>"); | ||
| 76 | - //运单头部信息 | ||
| 77 | - Mawb mawb = new Mawb(); | ||
| 78 | - mawb.setAppId(basfc.getAppId()); | ||
| 79 | - mawb.setMsgId(basfc.getMsgId()); | ||
| 80 | - mawb.setConsignmentCodeId(basfc.getConsignmentId()); | ||
| 81 | - mawb.setType(basfc.getConsType()); | ||
| 82 | - //TODO 记录时为同一张表,用 '-->' 记录具体存放字段(方便查看,以免误解) | ||
| 83 | - //运单号-->提单号 | ||
| 84 | - mawb.setBillNo(basfc.getConsignmentCode()); | ||
| 85 | - //经营单位 --> 消费使用/生产销售单位名称 | ||
| 86 | - mawb.setOwnerName(basfc.getOperateUnitName()); | ||
| 87 | - //经营单位海关编码 --> 消费使用/生产销售单位代码 | ||
| 88 | - mawb.setOwnerCode(basfc.getOperateUnitCode()); | ||
| 89 | - //经营单位社会信用证代码 --> 消费使用/生产销售单位单位统一编码 | ||
| 90 | - mawb.setOwnerCodeScc(basfc.getOperateSCC()); | ||
| 91 | - //发件人 --> 境内收发货人名称 | ||
| 92 | - mawb.setTradeName(basfc.getSender()); | ||
| 93 | - //发件人海关编码 --> 境内收发货人编号 | ||
| 94 | - mawb.setTradeCode(basfc.getShipperCustomsCode()); | ||
| 95 | - //发件人社会信用证代码 --> 生产核销单位统一信用代码---报关形式类型 | ||
| 96 | - mawb.setTradeCodeScc(basfc.getShipperSCC()); | ||
| 97 | - | ||
| 98 | - mawb.setEANNo(basfc.getEANNo()); | ||
| 99 | - //明细 | ||
| 100 | - List<MawbDetail> mawbDetailList = new ArrayList<>(); | ||
| 101 | - if (basfc.getBasfcDetailList().size()>0){ | ||
| 102 | - for (BasfcDetail basfcDetail : basfc.getBasfcDetailList()){ | ||
| 103 | - MawbDetail mawbDetail = new MawbDetail(); | ||
| 104 | - mawbDetail.setDetailId(basfcDetail.getConsignmentDetailId()); | ||
| 105 | - mawbDetail.setGmodel(basfcDetail.getModel()); | ||
| 106 | - mawbDetail.setCodeTS(basfcDetail.getSkuCode()); | ||
| 107 | - mawbDetail.setGname(basfcDetail.getSkuName()); | ||
| 108 | - mawbDetail.setGqty(basfcDetail.getKnockdownNumber()); | ||
| 109 | - mawbDetail.setGunit(basfcDetail.getKnockdownUnit()); | ||
| 110 | - mawbDetail.setFirstUnit(basfcDetail.getUnitLegalFirst()); | ||
| 111 | - mawbDetail.setFirstQty(NumberUtils.bigDecimalToIntger(basfcDetail.getQtyLegalFirst())); | ||
| 112 | - mawbDetail.setSecondQty(NumberUtils.bigDecimalToIntger(basfcDetail.getQtyLegalSecond())); | ||
| 113 | - mawbDetail.setSecondUnit(basfcDetail.getUnitLegalSecond()); | ||
| 114 | - mawbDetail.setDeclTotal(basfcDetail.getDeclaredAmount()); | ||
| 115 | - mawbDetail.setTradeCurr(basfcDetail.getCurrency()); | ||
| 116 | - mawbDetail.setDeclaredWeight(basfcDetail.getDeclaredWeight()); | ||
| 117 | - mawbDetailList.add(mawbDetail); | ||
| 118 | - } | ||
| 119 | - } | ||
| 120 | - mawb.setMawbDetailList(mawbDetailList); | ||
| 121 | - result = mawbRepository.save(mawb); | ||
| 122 | - log.info("saveMawb end>>>>>>>>>>>"); | ||
| 123 | - }catch (Exception e){ | ||
| 124 | - log.error("saveMawb() error:"+e.getMessage()); | ||
| 125 | - } | ||
| 126 | - return result; | ||
| 127 | - } | ||
| 128 | - /** | ||
| 129 | * 校验主单 | 69 | * 校验主单 |
| 130 | * @param mawb | 70 | * @param mawb |
| 131 | * @return | 71 | * @return | ... | ... |
-
Please register or login to post a comment