diff --git a/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java b/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java index b4bb61ed0..91f0402fb 100644 --- a/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java +++ b/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java @@ -43,10 +43,7 @@ import com.glxp.api.service.inout.*; import com.glxp.api.service.inv.*; import com.glxp.api.service.purchase.SupProductService; import com.glxp.api.service.system.SystemParamConfigService; -import com.glxp.api.util.CustomUtil; -import com.glxp.api.util.DateUtil; -import com.glxp.api.util.GennerOrderUtils; -import com.glxp.api.util.OrderNoTypeBean; +import com.glxp.api.util.*; import com.glxp.api.util.udi.FilterUdiUtils; import com.glxp.api.util.udi.UdiCalCountUtil; import org.apache.commons.lang3.StringUtils; @@ -495,7 +492,7 @@ public class IoCodeTempController extends BaseController { //校验预验收库存是否已存在 if (bussinessTypeEntity.isScanPreIn()) { - if (bussinessTypeEntity.getBackPreinType() == 1) {//按单出库&& bussinessTypeEntity.isPreInBack() + if (bussinessTypeEntity.getBackPreinType() == 1 && bussinessTypeEntity.isPreInBack()) {//按单出库&& bussinessTypeEntity.isPreInBack() String orderIds = addOrderRequest.getCheckPreInOrders(); if (StrUtil.isNotEmpty(orderIds)) { String[] orderIdArray = orderIds.split(","); @@ -1097,8 +1094,8 @@ public class IoCodeTempController extends BaseController { IoOrderDetailCodeEntity orderDetailCodeEntity = ioOrderDetailCodeService.findByUnique(orderEntity.getBillNo(), codeTempEntity.getRelId(), codeTempEntity.getBatchNo()); if (orderDetailCodeEntity != null) { //扫码数量-1 - int orderCount = orderDetailCodeEntity.getCount(); - int orderReCount = orderDetailCodeEntity.getReCount(); + int orderCount = IntUtil.value(orderDetailCodeEntity.getCount()); + int orderReCount = IntUtil.value(orderDetailCodeEntity.getReCount()); if (orderCount > 1) { orderDetailCodeEntity.setCount(orderCount - 1); orderDetailCodeEntity.setReCount(orderReCount - udiCalCountUtil.getActCount(codeTempEntity.getNameCode())); diff --git a/src/main/java/com/glxp/api/controller/inout/IoOrderDetailBizController.java b/src/main/java/com/glxp/api/controller/inout/IoOrderDetailBizController.java index 2b3d3a476..30baa857d 100644 --- a/src/main/java/com/glxp/api/controller/inout/IoOrderDetailBizController.java +++ b/src/main/java/com/glxp/api/controller/inout/IoOrderDetailBizController.java @@ -555,7 +555,8 @@ public class IoOrderDetailBizController extends BaseController { @Log(title = "发票管理", businessType = BusinessType.DELETE) public BaseResponse deleteById(@RequestBody IoOrderInvoiceEntity ioOrderInvoiceEntity) { - ioOrderInvoiceService.deleteByInvId(ioOrderInvoiceEntity.getId()+""); + IoOrderInvoiceResponse ioOrderInvoiceResponse = orderDetailBizService.selectByinvoiceId(ioOrderInvoiceEntity.getId()); + //更改 登记状态 IoOrderDetailCodeEntity ioOrderDetailBizEntity = new IoOrderDetailCodeEntity(); @@ -565,16 +566,16 @@ public class IoOrderDetailBizController extends BaseController { ioOrderDetailBizEntity.setOrderIdFk(ioOrderInvoiceEntity.getOrderIdFk()); - ioOrderDetailBizEntity.setId(ioOrderInvoiceEntity.getRegId()); + ioOrderDetailBizEntity.setId(ioOrderInvoiceResponse.getBizIdFk().intValue()); + ioOrderInvoiceService.deleteByInvId(ioOrderInvoiceEntity.getId()+""); List list = orderDetailBizService.filterListInv(filterOrderDetailBizRequest); - if (list == null && list.size() == 0) { + if(list.size()==0){ ioOrderDetailBizEntity.setRegStatus(false); } orderDetailCodeService.updateOrderDetailBiz(ioOrderDetailBizEntity); return ResultVOUtils.success(); - } /** diff --git a/src/main/java/com/glxp/api/controller/inout/IoOrderReviewController.java b/src/main/java/com/glxp/api/controller/inout/IoOrderReviewController.java index 44c66948d..e0c505218 100644 --- a/src/main/java/com/glxp/api/controller/inout/IoOrderReviewController.java +++ b/src/main/java/com/glxp/api/controller/inout/IoOrderReviewController.java @@ -139,7 +139,7 @@ public class IoOrderReviewController extends BaseController { } if (orderEntity.getFromType() == ConstantStatus.FROM_UDISP) - spGetHttp.reviewOrder(updateExportStatusRequest); + spGetHttp.reviewOrder(updateExportStatusRequest, getUserId() + ""); return updateReview(getUser(), orderEntity); } else if (orderEntity.getStatus() == ConstantStatus.ORDER_STATUS_CHECK_SUCCESS) { return thirdUpdateReview(getUser(), orderEntity); @@ -224,7 +224,6 @@ public class IoOrderReviewController extends BaseController { acceptOrderEntity.setFinishAccept(true); return ResultVOUtils.success(acceptOrderEntity); } - return ResultVOUtils.success(acceptOrderEntity); } @@ -269,12 +268,15 @@ public class IoOrderReviewController extends BaseController { redisUtil.del(ConstantStatus.REDIS_BILLNO + orderEntity.getBillNo()); redisUtil.del(ConstantStatus.REDIS_BILLNO_CODES + orderEntity.getBillNo()); return ResultVOUtils.success("验收成功!"); - } else - + } else { return updateReview(authAdmin, orderEntity); + } } - } else + } else { + return updateReview(authAdmin, orderEntity); + } + } @Resource diff --git a/src/main/java/com/glxp/api/dao/inout/IoOrderDetailBizDao.java b/src/main/java/com/glxp/api/dao/inout/IoOrderDetailBizDao.java index 2d5cceb18..311bbd21e 100644 --- a/src/main/java/com/glxp/api/dao/inout/IoOrderDetailBizDao.java +++ b/src/main/java/com/glxp/api/dao/inout/IoOrderDetailBizDao.java @@ -24,6 +24,8 @@ public interface IoOrderDetailBizDao extends BaseMapperPlus getfilterList(FilterOrderDetailCodeRequest orderDetailBizRequest); List filterListInv(FilterOrderDetailBizRequest orderDetailBizRequest); + IoOrderInvoiceResponse selectByinvoiceId(Long id); + /** * 查询单条单据业务详情 diff --git a/src/main/java/com/glxp/api/entity/basic/BasicBussinessTypeEntity.java b/src/main/java/com/glxp/api/entity/basic/BasicBussinessTypeEntity.java index a2f778bbd..c26197542 100644 --- a/src/main/java/com/glxp/api/entity/basic/BasicBussinessTypeEntity.java +++ b/src/main/java/com/glxp/api/entity/basic/BasicBussinessTypeEntity.java @@ -407,4 +407,9 @@ public class BasicBussinessTypeEntity { private boolean advancePreIn; @TableField(value = "sortNum") private Integer sortNum; + + //是否按货位出库 0:不按货位出库,1:按货位出库 + @TableField(value = "spaceOut") + private int spaceOut; + } diff --git a/src/main/java/com/glxp/api/entity/inout/IoCodeEntity.java b/src/main/java/com/glxp/api/entity/inout/IoCodeEntity.java index 95686f2a1..3a18cc87f 100644 --- a/src/main/java/com/glxp/api/entity/inout/IoCodeEntity.java +++ b/src/main/java/com/glxp/api/entity/inout/IoCodeEntity.java @@ -148,6 +148,7 @@ public class IoCodeEntity implements Serializable { return 0; return count; } + @JsonIgnore public int getMyReCount() { if (reCount == null) { diff --git a/src/main/java/com/glxp/api/entity/inout/IoOrderDetailCodeEntity.java b/src/main/java/com/glxp/api/entity/inout/IoOrderDetailCodeEntity.java index 36bb9008f..2f7635e15 100644 --- a/src/main/java/com/glxp/api/entity/inout/IoOrderDetailCodeEntity.java +++ b/src/main/java/com/glxp/api/entity/inout/IoOrderDetailCodeEntity.java @@ -138,13 +138,13 @@ public class IoOrderDetailCodeEntity { * 单据数量 */ @TableField(value = "`count`") - private int count; + private Integer count; /** * 扫码数量 */ @TableField(value = "reCount") - private int reCount; + private Integer reCount; /** * 备注 diff --git a/src/main/java/com/glxp/api/entity/system/SyncDataBustypeEntity.java b/src/main/java/com/glxp/api/entity/system/SyncDataBustypeEntity.java index 5da370044..52e871640 100644 --- a/src/main/java/com/glxp/api/entity/system/SyncDataBustypeEntity.java +++ b/src/main/java/com/glxp/api/entity/system/SyncDataBustypeEntity.java @@ -24,4 +24,8 @@ public class SyncDataBustypeEntity { private Integer orderStatus; //单据状态 @TableField(value = "`direct`") private int direct; //1:UDI管理系统->SPMS 2:SPMS->UDI管理系统 + @TableField(value = "`syncStatus`") + private Integer syncStatus; //同步后单据状态 + @TableField(value = "`syncChange`") + private boolean syncChange; //同步后是否自动补单 } diff --git a/src/main/java/com/glxp/api/http/sync/SpGetHttpClient.java b/src/main/java/com/glxp/api/http/sync/SpGetHttpClient.java index 2f9705993..fd62d3e9a 100644 --- a/src/main/java/com/glxp/api/http/sync/SpGetHttpClient.java +++ b/src/main/java/com/glxp/api/http/sync/SpGetHttpClient.java @@ -146,9 +146,15 @@ public class SpGetHttpClient { } //验收自助平台单据--直连接口 - public BaseResponse reviewOrder(ReviewFinishRequest reviewFinishRequest) { + public BaseResponse reviewOrder(ReviewFinishRequest reviewFinishRequest, String userId) { + + + List header = (List) Convert.toList(buildHeader()); + header.add("ADMIN_ID"); + header.add(userId); + String json = JSONUtil.toJsonStr(reviewFinishRequest); - String result = okHttpCli.doPostJson(getIpUrl() + "/directToSpms" + "/spms/inout/order/web/updateStatus", json, buildHeader()); + String result = okHttpCli.doPostJson(getIpUrl() + "/directToSpms" + "/spms/inout/order/web/updateStatus", json, Convert.toStrArray(header)); BaseResponse response = JSONObject.parseObject(result, new TypeReference>() { }); @@ -158,6 +164,8 @@ public class SpGetHttpClient { // 最小销售标识获取国家库信息 public BaseResponse> getSyncDi(ProductInfoFilterRequest productInfoFilterRequest) { + + Map paramMap = new HashMap<>(16); paramMap.put("nameCode", productInfoFilterRequest.getNameCode()); paramMap.put("page", productInfoFilterRequest.getPage() + ""); diff --git a/src/main/java/com/glxp/api/res/basic/BasicBussinessTypeResponse.java b/src/main/java/com/glxp/api/res/basic/BasicBussinessTypeResponse.java index 11e0c7fee..587d993eb 100644 --- a/src/main/java/com/glxp/api/res/basic/BasicBussinessTypeResponse.java +++ b/src/main/java/com/glxp/api/res/basic/BasicBussinessTypeResponse.java @@ -1,6 +1,5 @@ package com.glxp.api.res.basic; -import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; /** @@ -151,4 +150,6 @@ public class BasicBussinessTypeResponse { private Integer backPreinType; private Boolean advancePreIn; private Integer sortNum; + + private int spaceOut; } diff --git a/src/main/java/com/glxp/api/res/inout/IoOrderInvoiceResponse.java b/src/main/java/com/glxp/api/res/inout/IoOrderInvoiceResponse.java index a23af6ad8..63a44894d 100644 --- a/src/main/java/com/glxp/api/res/inout/IoOrderInvoiceResponse.java +++ b/src/main/java/com/glxp/api/res/inout/IoOrderInvoiceResponse.java @@ -83,6 +83,8 @@ public class IoOrderInvoiceResponse { private String ggxh; private String licenseUrl; + private Long bizIdFk; + public static final String COL_ID = "id"; diff --git a/src/main/java/com/glxp/api/service/auth/impl/InvSpaceServiceImpl.java b/src/main/java/com/glxp/api/service/auth/impl/InvSpaceServiceImpl.java index e8926ded0..1a1f41b66 100644 --- a/src/main/java/com/glxp/api/service/auth/impl/InvSpaceServiceImpl.java +++ b/src/main/java/com/glxp/api/service/auth/impl/InvSpaceServiceImpl.java @@ -71,7 +71,7 @@ public class InvSpaceServiceImpl extends ServiceImpl impl //获取当前仓库下的最大货位编码 String maxSpaceCode = invSpaceDao.getMaxSpaceCode(null); if (StrUtil.isBlank(maxSpaceCode)) { - maxSpaceCode = "0000"; + maxSpaceCode = "1000"; } String spaceCode = getSpaceCode(maxSpaceCode); invSpace.setCode(spaceCode); diff --git a/src/main/java/com/glxp/api/service/inout/IoChangeInoutService.java b/src/main/java/com/glxp/api/service/inout/IoChangeInoutService.java index ed544dc5e..042809d2c 100644 --- a/src/main/java/com/glxp/api/service/inout/IoChangeInoutService.java +++ b/src/main/java/com/glxp/api/service/inout/IoChangeInoutService.java @@ -86,6 +86,9 @@ public class IoChangeInoutService { //普通出入库单据流转 public void genNewOrder(IoOrderEntity orderEntity, List invProductDetailEntities) { + if (orderEntity.getFromType() == ConstantStatus.FROM_UDISP && (orderEntity.getOutChangeEnable() != null && !orderEntity.getOutChangeEnable())) { + return; + } BasicBusTypePreEntity basicBusTypePreEntity = basicBusTypePreService.findByOriginAction(orderEntity.getAction()); List codeEnttities = codeService.findByOrderId(orderEntity.getBillNo()); if (basicBusTypePreEntity.getSupplementAll()) {//全量补单 diff --git a/src/main/java/com/glxp/api/service/inout/IoOrderDetailBizService.java b/src/main/java/com/glxp/api/service/inout/IoOrderDetailBizService.java index 24892f3c8..4e19d277f 100644 --- a/src/main/java/com/glxp/api/service/inout/IoOrderDetailBizService.java +++ b/src/main/java/com/glxp/api/service/inout/IoOrderDetailBizService.java @@ -44,6 +44,7 @@ public interface IoOrderDetailBizService { List checkOrderList(String orderId); List filterListInv(FilterOrderDetailBizRequest orderDetailBizRequest); + IoOrderInvoiceResponse selectByinvoiceId(Long id); Boolean updateOrderDetailBiz(IoOrderDetailBizEntity ioOrderDetailBizEntity); diff --git a/src/main/java/com/glxp/api/service/inout/impl/IoOrderDetailBizServiceImpl.java b/src/main/java/com/glxp/api/service/inout/impl/IoOrderDetailBizServiceImpl.java index f3f285c4b..841a00aaa 100644 --- a/src/main/java/com/glxp/api/service/inout/impl/IoOrderDetailBizServiceImpl.java +++ b/src/main/java/com/glxp/api/service/inout/impl/IoOrderDetailBizServiceImpl.java @@ -175,6 +175,11 @@ public class IoOrderDetailBizServiceImpl implements IoOrderDetailBizService { return ioOrderDetailBizDao.filterListInv(orderDetailBizRequest); } + @Override + public IoOrderInvoiceResponse selectByinvoiceId(Long id) { + return ioOrderDetailBizDao.selectByinvoiceId(id); + } + @Override public Boolean updateOrderDetailBiz(IoOrderDetailBizEntity ioOrderDetailBizEntity) { return ioOrderDetailBizDao.updateById(ioOrderDetailBizEntity) > 0; diff --git a/src/main/java/com/glxp/api/service/inout/impl/IoOrderServiceImpl.java b/src/main/java/com/glxp/api/service/inout/impl/IoOrderServiceImpl.java index d40a51d97..8d0d264ca 100644 --- a/src/main/java/com/glxp/api/service/inout/impl/IoOrderServiceImpl.java +++ b/src/main/java/com/glxp/api/service/inout/impl/IoOrderServiceImpl.java @@ -739,7 +739,8 @@ public class IoOrderServiceImpl implements IoOrderService { //查询往来单位名称 if (StrUtil.isNotBlank(order.getFromCorp())) { BasicCorpEntity corpEntity = basicCorpDao.selectByErpId(order.getFromCorp()); - response.setFromCorpName(corpEntity.getName()); + if (corpEntity != null) + response.setFromCorpName(corpEntity.getName()); } else if (StrUtil.isNotBlank(order.getFromInvCode())) { String fromInvName = invWarehouseDao.selectNameByCode(order.getFromInvCode()); response.setFromCorpName(fromInvName); diff --git a/src/main/java/com/glxp/api/service/sync/HeartService.java b/src/main/java/com/glxp/api/service/sync/HeartService.java index 5dc0ac0df..1033c259c 100644 --- a/src/main/java/com/glxp/api/service/sync/HeartService.java +++ b/src/main/java/com/glxp/api/service/sync/HeartService.java @@ -1309,6 +1309,8 @@ public class HeartService { return ResultVOUtils.success(); } + @Resource + SyncDataBustypeService syncDataBustypeService; //下载最近更新扫码单据--上级服务 @Transactional(propagation = Propagation.NESTED) @@ -1344,21 +1346,35 @@ public class HeartService { try { List orderEntities = syncDataResponse.getOrderEntities(); for (IoOrderEntity orderEntity : orderEntities) { + + SyncDataBustypeEntity syncDataBustypeEntity = syncDataBustypeService.findByAction(orderEntity.getAction(), 2); orderEntity.setUpdateTime(null); orderEntity.setFromType(ConstantStatus.FROM_UDISP); orderEntity.setProcessStatus(ConstantStatus.ORDER_DEAL_POST); orderEntity.setStatus(ConstantStatus.ORDER_STATUS_PROCESS); + if (syncDataBustypeEntity != null) { + if (syncDataBustypeEntity.getSyncStatus() == 1) { + orderEntity.setProcessStatus(ConstantStatus.ORDER_DEAL_DRAFT); + orderEntity.setStatus(ConstantStatus.ORDER_STATUS_TEMP_SAVE); + } + if (syncDataBustypeEntity.isSyncChange()) { + orderEntity.setOutChangeEnable(syncDataBustypeEntity.isSyncChange()); + } + } IoOrderEntity temp = orderService.findByBillNo(orderEntity.getBillNo()); if (temp == null) { orderEntity.setId(null); orderService.insertOrder(orderEntity); insetOrderDb(syncDataResponse, orderEntity); orderEntity = orderService.findByBillNo(orderEntity.getBillNo()); - addInoutService.dealProcess(orderEntity); - orderEntity = orderService.findByBillNo(orderEntity.getBillNo()); - if (orderEntity.getStatus() != ConstantStatus.ORDER_STATS_ERROR && !ioCheckInoutService.checkManual(orderEntity.getBillNo())) { - ioCheckInoutService.check(orderEntity.getBillNo()); + if (orderEntity.getStatus() != ConstantStatus.ORDER_STATUS_TEMP_SAVE) { + addInoutService.dealProcess(orderEntity); + orderEntity = orderService.findByBillNo(orderEntity.getBillNo()); + if (orderEntity.getStatus() != ConstantStatus.ORDER_STATS_ERROR && !ioCheckInoutService.checkManual(orderEntity.getBillNo())) { + ioCheckInoutService.check(orderEntity.getBillNo()); + } } + } } if (fileJson != null && fileJson.size() > 0) { diff --git a/src/main/java/com/glxp/api/service/sync/SyncDataBustypeService.java b/src/main/java/com/glxp/api/service/sync/SyncDataBustypeService.java index e8e6a19d4..bf28a290e 100644 --- a/src/main/java/com/glxp/api/service/sync/SyncDataBustypeService.java +++ b/src/main/java/com/glxp/api/service/sync/SyncDataBustypeService.java @@ -10,6 +10,9 @@ public interface SyncDataBustypeService extends IService List findAll(Integer direct); + SyncDataBustypeEntity findByAction(String action, Integer direct); + + boolean deleteAll(Integer direct); void inserts(List syncDataBustypeEntities); diff --git a/src/main/java/com/glxp/api/service/sync/impl/SyncDataBustypeServiceImpl.java b/src/main/java/com/glxp/api/service/sync/impl/SyncDataBustypeServiceImpl.java index 3425932d1..9c70be5da 100644 --- a/src/main/java/com/glxp/api/service/sync/impl/SyncDataBustypeServiceImpl.java +++ b/src/main/java/com/glxp/api/service/sync/impl/SyncDataBustypeServiceImpl.java @@ -1,5 +1,6 @@ package com.glxp.api.service.sync.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.glxp.api.dao.sync.SyncDataBustypeDao; @@ -23,6 +24,17 @@ public class SyncDataBustypeServiceImpl extends ServiceImpl().eq("direct", direct)); } + @Override + public SyncDataBustypeEntity findByAction(String action, Integer direct) { + + + List syncDataBustypeEntities = syncDataBustypeDao.selectList(new QueryWrapper().eq(direct != null, "direct", direct).eq("action", action)); + if (CollUtil.isNotEmpty(syncDataBustypeEntities)) { + return syncDataBustypeEntities.get(0); + } + return null; + } + @Override public boolean deleteAll(Integer direct) { return syncDataBustypeDao.delete(new QueryWrapper().eq("direct", direct)) > 0 ? true : false; diff --git a/src/main/java/com/glxp/api/util/IntUtil.java b/src/main/java/com/glxp/api/util/IntUtil.java new file mode 100644 index 000000000..3971e233d --- /dev/null +++ b/src/main/java/com/glxp/api/util/IntUtil.java @@ -0,0 +1,18 @@ +package com.glxp.api.util; + +public class IntUtil { + + public static int value(Integer value) { + if (value == null) + return 0; + else return value.intValue(); + + } + + public static long value(Long value) { + if (value == null) + return 0l; + else return value.longValue(); + + } +} diff --git a/src/main/resources/mybatis/mapper/auth/InvSpaceDao.xml b/src/main/resources/mybatis/mapper/auth/InvSpaceDao.xml index 53315fb10..0605dc18c 100644 --- a/src/main/resources/mybatis/mapper/auth/InvSpaceDao.xml +++ b/src/main/resources/mybatis/mapper/auth/InvSpaceDao.xml @@ -390,11 +390,12 @@ diff --git a/src/main/resources/mybatis/mapper/basic/BasicBussinessTypeDao.xml b/src/main/resources/mybatis/mapper/basic/BasicBussinessTypeDao.xml index 26cb25018..204d8ba14 100644 --- a/src/main/resources/mybatis/mapper/basic/BasicBussinessTypeDao.xml +++ b/src/main/resources/mybatis/mapper/basic/BasicBussinessTypeDao.xml @@ -73,7 +73,7 @@ thrCheckPdaUn, thrCheckPdaEd, thrCheckUdims, thrCheckPc, thrCheckSp, thrCheckChange, thrCheckBalance, thrCheckCopy, fillCodeRel, checkVailDate, checkExpire, checkCertExpire, preInBackAction, backPreinType, - sortNum) + sortNum, spaceOut) values (#{mainAction}, #{action}, #{name}, #{enable}, #{remark}, #{thirdSysFk}, #{genUnit}, #{innerOrder}, #{secCheckEnable}, #{checkEnable}, #{checkUdims}, #{checkPdaEd}, #{checkPdaUn}, #{checkPc}, #{checkWebNew}, #{checkSp}, #{checkChange}, #{secCheckUdims}, #{secCheckPdaEd}, #{secCheckPdaUn}, @@ -86,7 +86,7 @@ #{thrCheckPdaUn}, #{thrCheckPdaEd}, #{thrCheckUdims}, #{thrCheckPc}, #{thrCheckSp}, #{thrCheckChange}, #{thrCheckBalance}, #{thrCheckCopy}, #{fillCodeRel}, #{checkVailDate}, #{checkExpire}, #{checkCertExpire}, #{preInBackAction}, #{backPreinType}, - #{sortNum}) + #{sortNum}, #{spaceOut}) + + +