From 626741ec94f3a30cdd5f6221831596c09aa5de8d Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期二, 17 十月 2023 09:41:42 +0800
Subject: [PATCH] Merge branch 'dev' of http://139.186.142.91:10010/r/productDev/parkBike into dev

---
 server/platform/src/main/java/com/doumee/api/business/PricingDetailController.java           |    8 ++
 server/platform/src/main/java/com/doumee/api/common/PublicController.java                    |    2 
 server/services/src/main/java/com/doumee/dao/business/web/response/PayOrderDTO.java          |    2 
 server/platform/src/main/java/com/doumee/api/business/PricingParamController.java            |    2 
 server/services/src/main/java/com/doumee/service/business/impl/BaseParamServiceImpl.java     |    2 
 server/services/src/main/java/com/doumee/core/constants/Constants.java                       |    1 
 server/services/src/main/java/com/doumee/dao/business/model/Goodsorder.java                  |    2 
 server/services/src/main/java/com/doumee/service/business/impl/PricingDetailServiceImpl.java |   70 +++++++++++++++++-----
 server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java    |   13 +++-
 server/services/src/main/java/com/doumee/dao/business/model/Ad.java                          |    9 ++
 server/services/src/main/java/com/doumee/service/business/impl/PricingParamServiceImpl.java  |    2 
 server/services/src/main/java/com/doumee/service/business/impl/AdServiceImpl.java            |   36 +++++++++---
 12 files changed, 113 insertions(+), 36 deletions(-)

diff --git a/server/platform/src/main/java/com/doumee/api/business/PricingDetailController.java b/server/platform/src/main/java/com/doumee/api/business/PricingDetailController.java
index 4789b98..4ad08e4 100644
--- a/server/platform/src/main/java/com/doumee/api/business/PricingDetailController.java
+++ b/server/platform/src/main/java/com/doumee/api/business/PricingDetailController.java
@@ -11,6 +11,7 @@
 import com.doumee.service.business.PricingDetailService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -65,7 +66,12 @@
     @PostMapping("/updateById")
     @RequiresPermissions("business:pricingdetail:update")
     public ApiResponse updateById(@RequestBody PricingDetail pricingDetail) {
-        pricingDetailService.updateById(pricingDetail);
+        if (StringUtils.isEmpty(pricingDetail.getId())){
+            pricingDetailService.create(pricingDetail);
+        }else {
+            pricingDetailService.updateById(pricingDetail);
+        }
+
         return ApiResponse.success(null);
     }
 
diff --git a/server/platform/src/main/java/com/doumee/api/business/PricingParamController.java b/server/platform/src/main/java/com/doumee/api/business/PricingParamController.java
index 1a85aac..f45e51b 100644
--- a/server/platform/src/main/java/com/doumee/api/business/PricingParamController.java
+++ b/server/platform/src/main/java/com/doumee/api/business/PricingParamController.java
@@ -63,7 +63,7 @@
     @PostMapping("/updateById")
     @RequiresPermissions("business:pricingparam:update")
     public ApiResponse updateById(@RequestBody PricingParam pricingParam) {
-        pricingParamService.updateById(pricingParam);
+        pricingParamService.update(pricingParam);
         return ApiResponse.success(null);
     }
 
diff --git a/server/platform/src/main/java/com/doumee/api/common/PublicController.java b/server/platform/src/main/java/com/doumee/api/common/PublicController.java
index dea582c..3c5c146 100644
--- a/server/platform/src/main/java/com/doumee/api/common/PublicController.java
+++ b/server/platform/src/main/java/com/doumee/api/common/PublicController.java
@@ -188,6 +188,8 @@
     @ApiOperation(value = "涓婁紶", notes = "涓婁紶", httpMethod = "POST", position = 6)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "folder", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "file", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
+
     })
     @PostMapping(value = "/uploadLocal", headers = "content-type=multipart/form-data")
     public void uploadLocal(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
diff --git a/server/services/src/main/java/com/doumee/core/constants/Constants.java b/server/services/src/main/java/com/doumee/core/constants/Constants.java
index e236ec7..4bdbd4a 100644
--- a/server/services/src/main/java/com/doumee/core/constants/Constants.java
+++ b/server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -33,6 +33,7 @@
     public static final String FORCE_BACK_LOCK = "FORCE_BACK_LOCK";
     public static final String FORCE_BACK_SITE = "FORCE_BACK_SITE";
     public static String REDIS_DEBUG_STR="test_";
+    public static final String AD = "AD";
     public  interface MqttTopic{
 
         String topic_index = "device/lock/";
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Ad.java b/server/services/src/main/java/com/doumee/dao/business/model/Ad.java
index 9117011..aa7d2d7 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Ad.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Ad.java
@@ -1,5 +1,6 @@
 package com.doumee.dao.business.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -70,8 +71,14 @@
     @ExcelColumn(name="鍐呭")
     private String content;
 
-    @ApiModelProperty(value = "鍒楄〃鍥�")
+    @ApiModelProperty(value = "鍒楄〃鍥� ")
     @ExcelColumn(name="鍒楄〃鍥�")
     private String imgurl;
 
+
+    @ApiModelProperty(value = "鍒楄〃鍥� ")
+    @ExcelColumn(name="鍒楄〃鍥�")
+    @TableField(exist = false)
+    private String imgfullurl;
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Goodsorder.java b/server/services/src/main/java/com/doumee/dao/business/model/Goodsorder.java
index 7591719..1571c57 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Goodsorder.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Goodsorder.java
@@ -107,7 +107,7 @@
 
     @ApiModelProperty(value = "鐢ㄦ埛openid" )
     @TableField(exist = false)
-    private String memberOpenid;
+    private String openid;
     @ApiModelProperty(value = "鏌ヨ寮�濮嬫棩鏈燂紙鍖呭惈锛�", example = "2023-10-01 15:12:01")
     @TableField(exist = false)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
diff --git a/server/services/src/main/java/com/doumee/dao/business/web/response/PayOrderDTO.java b/server/services/src/main/java/com/doumee/dao/business/web/response/PayOrderDTO.java
index d013770..9fc12ee 100644
--- a/server/services/src/main/java/com/doumee/dao/business/web/response/PayOrderDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/business/web/response/PayOrderDTO.java
@@ -25,7 +25,7 @@
     @ApiModelProperty(value = "鏀粯鏂瑰紡 0寰俊 1鏀粯瀹�")
     private Integer payWay;
 
-    @ApiModelProperty(value = "閫�娆剧被鍨� 0缁撶畻閫�娆� 1寮哄埗缁撶畻閫�娆� 2缁撶畻鍚庨��娆�")
+    @ApiModelProperty(value = "閫�娆剧被鍨� 0缁撶畻閫�娆� 1寮哄埗缁撶畻閫�娆� 2缁撶畻鍚庨��娆� [99: 铏氭嫙type 鏀粯鎶奸噾]")
     private Integer refundType;
 
     @ApiModelProperty(value = "浜ゆ槗閲戦")
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/AdServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/AdServiceImpl.java
index 0c6d52a..5ed12db 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/AdServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/AdServiceImpl.java
@@ -1,5 +1,7 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
@@ -26,6 +28,9 @@
 
     @Autowired
     private AdMapper adMapper;
+
+    @Autowired
+    SystemDictDataBiz systemDictDataBiz;
 
     @Override
     public String create(Ad ad) {
@@ -54,7 +59,17 @@
 
     @Override
     public void updateById(Ad ad) {
-        adMapper.updateById(ad);
+        UpdateWrapper<Ad> wrapper = new UpdateWrapper<>();
+        wrapper.lambda()
+                .eq(Ad::getId,ad.getId())
+                .set(Ad::getEditor,ad.getEditor())
+                .set(Ad::getEditDate,ad.getEditDate())
+                .set(Ad::getName,ad.getName())
+                .set(Ad::getImgurl,ad.getImgurl())
+                .set(Ad::getSortnum,ad.getSortnum())
+                .set(Ad::getContent,ad.getContent())
+                .set(Ad::getStatus,ad.getStatus());
+        adMapper.update(null,wrapper);
     }
 
     @Override
@@ -83,7 +98,7 @@
         QueryWrapper<Ad> wrapper = new QueryWrapper<>(ad);
         return adMapper.selectList(wrapper);
     }
-  
+
     @Override
     public PageData<Ad> findPage(PageWrap<Ad> pageWrap) {
         IPage<Ad> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
@@ -130,14 +145,17 @@
         if (pageWrap.getModel().getImgurl() != null) {
             queryWrapper.lambda().eq(Ad::getImgurl, pageWrap.getModel().getImgurl());
         }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
+        queryWrapper.lambda().orderByAsc(Ad::getSortnum);
+        String path =systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.FILE_DIR).getCode()+
+                systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.AD).getCode();
+
+        IPage<Ad> adIPage = adMapper.selectPage(page, queryWrapper);
+        if (!CollectionUtils.isEmpty(adIPage.getRecords())){
+            adIPage.getRecords().forEach(s->{
+                s.setImgfullurl(path+s.getImgurl());
+            });
         }
-        return PageData.from(adMapper.selectPage(page, queryWrapper));
+        return PageData.from(adIPage);
     }
 
     @Override
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/BaseParamServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/BaseParamServiceImpl.java
index 6a8a8b5..9819c50 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/BaseParamServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/BaseParamServiceImpl.java
@@ -97,7 +97,7 @@
         wrapper.lambda()
                 .eq(BaseParam::getType,baseParam.getType())
                 .eq(BaseParam::getIsdeleted,Constants.ZERO)
-                .eq(BaseParam::getType,baseParam.getName());
+                .eq(BaseParam::getName,baseParam.getName());
 
         BaseParam baseParam1 = baseParamMapper.selectOne(wrapper.last(" limit 1"));
         if (Objects.nonNull(baseParam1) && !baseParam1.getId().equals(baseParam.getId())){
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
index 2929f7e..24f1698 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -198,19 +198,23 @@
         MPJLambdaWrapper<Goodsorder> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(model);
         queryWrapper.selectAll(Goodsorder.class);
-        queryWrapper.selectAs(Member::getOpenid, Goodsorder::getMemberOpenid);
+        queryWrapper.selectAs(Member::getOpenid, Goodsorder::getOpenid);
         queryWrapper.leftJoin(Member.class, Member::getId  ,Goodsorder::getMemberId);
         queryWrapper.select("(select max(r.done_date) from refund r where r.obj_id=t.id  and r.status=2 ) as refund_date");
         queryWrapper.select("(select sum(r.money) from refund r where r.obj_id=t.id and r.status=2) as refund_money");
         //鏃堕棿娈电瓫閫�
-        queryWrapper.ge(model.getStartDate()!=null, Goodsorder::getPayDate, model.getStartDate());
-        queryWrapper.le(model.getEndDate()!=null, Goodsorder::getPayDate, model.getEndDate());
+        if (Objects.nonNull(model.getStartDate())){
+            queryWrapper.ge(Goodsorder::getPayDate, Utils.Date.getStart(model.getStartDate()));
+        }
+        if (Objects.nonNull(model.getEndDate())){
+            queryWrapper.le( Goodsorder::getPayDate, Utils.Date.getEnd(model.getEndDate()));
+        }
         queryWrapper.eq(model.getPayStatus() !=null,Goodsorder::getPayStatus,model.getPayStatus());
         queryWrapper.like(model.getCode() !=null,Goodsorder::getCode,model.getCode());
         queryWrapper.like(model.getId() !=null,Goodsorder::getId,model.getId());
         queryWrapper.eq(model.getStatus() !=null,Goodsorder::getStatus,model.getStatus());
         queryWrapper.like(model.getOnlineOrderid() !=null,Goodsorder::getOnlineOrderid,model.getOnlineOrderid());
-        queryWrapper.like(model.getMemberOpenid() !=null,Member::getOpenid,model.getMemberOpenid());
+        queryWrapper.like(model.getOpenid() !=null,Member::getOpenid,model.getOpenid());
         queryWrapper.eq(Goodsorder::getIsdeleted,Constants.ZERO);
         queryWrapper.orderByDesc(Goodsorder::getPayDate);
         return  queryWrapper;
@@ -310,6 +314,7 @@
         payOrderDTO.setPayWay(goodsorder.getPayWay());
         payOrderDTO.setMoney(Constants.translateMoney(goodsorder.getMoney()));
         payOrderDTO.setPayDate(goodsorder.getPayDate());
+        payOrderDTO.setRefundType(99);
         payOrderDTO.setOnlineorderId(goodsorder.getOnlineOrderid());
         payOrderDTOList.add(0,payOrderDTO);
         if (!CollectionUtils.isEmpty(refunds)){
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/PricingDetailServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/PricingDetailServiceImpl.java
index 556f60f..559d288 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/PricingDetailServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/PricingDetailServiceImpl.java
@@ -7,10 +7,12 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.BaseParamMapper;
 import com.doumee.dao.business.PricingDetailMapper;
 import com.doumee.dao.business.join.PricingDetailJoinMapper;
 import com.doumee.dao.business.model.BaseParam;
 import com.doumee.dao.business.model.PricingDetail;
+import com.doumee.service.business.BaseParamService;
 import com.doumee.service.business.PricingDetailService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -18,15 +20,17 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import sun.text.resources.et.CollationData_et;
 
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 瀹氫环鏂规鏄庣粏閰嶇疆Service瀹炵幇
@@ -41,6 +45,10 @@
 
     @Autowired
     PricingDetailJoinMapper pricingDetailJoinMapper;
+
+    @Autowired
+    BaseParamMapper baseParamMapper;
+
 
     @Override
     public String create(PricingDetail pricingDetail) {
@@ -65,7 +73,7 @@
         insert.setHolidayUnitPrice(Constants.formatDecimalNum(pricingDetail.getHolidayUnitPrice()).multiply(new BigDecimal(100)));
         insert.setInfo(pricingDetail.getInfo());
         insert.setTitle(pricingDetail.getTitle());
-        pricingDetailMapper.insert(pricingDetail);
+        pricingDetailMapper.insert(insert);
         return pricingDetail.getId();
     }
 
@@ -100,10 +108,11 @@
         wrapper.lambda()
                 .eq(PricingDetail::getIsdeleted,Constants.ZERO)
                 .eq(PricingDetail::getBikeTypeId,pricingDetail.getBikeTypeId())
-                .eq(PricingDetail::getPricePramId,pricingDetail.getPricePramId());
-        Integer exitCount = pricingDetailMapper.selectCount(wrapper);
+                .eq(PricingDetail::getPricePramId,pricingDetail.getPricePramId())
+                .last("limit 1");
+        PricingDetail exitCount = pricingDetailMapper.selectOne(wrapper);
 
-        if (exitCount > Constants.ZERO){
+        if (Objects.nonNull(exitCount) && !Objects.equals(exitCount.getId(),pricingDetail.getId())){
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"璇ヨ溅鍨嬪凡閰嶇疆");
         }
 
@@ -180,20 +189,47 @@
     @Override
     public List<PricingDetail> findList(PricingDetail pricingDetail) {
         MPJLambdaWrapper<PricingDetail> wrapper = new MPJLambdaWrapper<>();
-        wrapper.leftJoin(BaseParam.class,BaseParam::getId,PricingDetail::getBikeTypeId)
-                .eq(BaseParam::getType,Constants.THREE);
+        wrapper.eq(PricingDetail::getPricePramId,pricingDetail.getPricePramId())
+                .eq(PricingDetail::getIsdeleted,Constants.ZERO);
+        wrapper.rightJoin(BaseParam.class,BaseParam::getId,PricingDetail::getBikeTypeId);
         wrapper.selectAll(PricingDetail.class)
+                .selectAs(BaseParam::getId,PricingDetail::getBikeTypeId)
                 .selectAs(BaseParam::getName,PricingDetail::getBikeTypeName);
         List<PricingDetail> result = pricingDetailJoinMapper.selectJoinList(PricingDetail.class,wrapper);
-        if(result!=null){
-            for(PricingDetail model :result){
-                model.setBasePrice(Constants.translateMoney(model.getBasePrice()));
-                model.setHolidayBasePrice(Constants.translateMoney(model.getHolidayBasePrice()));
-                model.setUnitPrice(Constants.translateMoney(model.getUnitPrice()));
-                model.setHolidayUnitPrice(Constants.translateMoney(model.getHolidayUnitPrice()));
-            }
+
+        Map<String, PricingDetail> stringPricingDetailMap = Optional.ofNullable(result)
+                                                                    .map(s -> s.stream().collect(Collectors.toMap(p -> p.getBikeTypeId(), p -> p)))
+                                                                    .orElse(new HashMap<>());
+        QueryWrapper<BaseParam> baseParamQuery = new QueryWrapper();
+        baseParamQuery.lambda()
+                       .eq(BaseParam::getIsdeleted,Constants.ZERO)
+                       .eq(BaseParam::getType,Constants.THREE)
+                        .orderByAsc(BaseParam::getSortnum);
+        List<BaseParam> list = baseParamMapper.selectList(baseParamQuery);
+        if (CollectionUtils.isEmpty(list)){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鍐呯疆鏁版嵁纭疄");
         }
-        return result;
+
+        List<PricingDetail> collect = list.stream().map(s -> {
+            PricingDetail put = stringPricingDetailMap.getOrDefault(s.getId(), new PricingDetail());
+            put.setBikeTypeId(s.getId());
+            put.setPricePramId(pricingDetail.getPricePramId());
+            put.setBikeTypeName(s.getName());
+            put.setBasePrice(Objects.nonNull(put.getBasePrice()) ? Constants.translateMoney(put.getBasePrice()) : null);
+            put.setHolidayBasePrice(Objects.nonNull(put.getHolidayBasePrice()) ? Constants.translateMoney(put.getHolidayBasePrice()):null);
+            put.setUnitPrice(Objects.nonNull(put.getUnitPrice()) ? Constants.translateMoney(put.getUnitPrice()):null);
+            put.setHolidayUnitPrice(Objects.nonNull(put.getHolidayUnitPrice())  ? Constants.translateMoney(put.getHolidayUnitPrice()):null);
+            return put;
+        }).collect(Collectors.toList());
+//        if(result!=null){
+//            for(PricingDetail model :result){
+//                model.setBasePrice(Constants.translateMoney(model.getBasePrice()));
+//                model.setHolidayBasePrice(Constants.translateMoney(model.getHolidayBasePrice()));
+//                model.setUnitPrice(Constants.translateMoney(model.getUnitPrice()));
+//                model.setHolidayUnitPrice(Constants.translateMoney(model.getHolidayUnitPrice()));
+//            }
+//        }
+        return collect;
     }
 
     @Override
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/PricingParamServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/PricingParamServiceImpl.java
index 48cfe8a..9e09b2c 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/PricingParamServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/PricingParamServiceImpl.java
@@ -79,6 +79,7 @@
                 .eq(PricingParam::getId,pricingParam.getId())
                 .set(PricingParam::getEditor,principal.getId())
                 .set(PricingParam::getName,pricingParam.getName())
+                .set(PricingParam::getStatus,pricingParam.getStatus())
                 .set(PricingParam::getStartDate,pricingParam.getStartDate())
                 .set(PricingParam::getEndDate,pricingParam.getEndDate())
                 .set(PricingParam::getSortnum,pricingParam.getSortnum());
@@ -164,6 +165,7 @@
             queryWrapper.lambda().eq(PricingParam::getInfo, pageWrap.getModel().getInfo());
         }
         queryWrapper.lambda().orderByAsc(PricingParam::getSortnum);
+        queryWrapper.lambda().orderByAsc(PricingParam::getStatus);
         return PageData.from(pricingParamMapper.selectPage(page, queryWrapper));
     }
 

--
Gitblit v1.9.3