瀏覽代碼

[chg] BigDecimal序列化和反序列化器

wcz 5 年之前
父節點
當前提交
aec552b602

+ 19 - 12
lift-business-service/src/main/java/cn/com/ty/lift/business/emergency/controller/EmergencyRepairController.java

@@ -176,7 +176,7 @@ public class EmergencyRepairController {
         Validate.notTrue(repairing > 0, ValuePool.EMERGENCY_HAVE_REPAIRING);
         PlatformCompanyLiftRelevance relevance = platformCompanyLiftRelevanceService.findByMtCompanyAndLift(entity.getMtCompanyId(), entity.getLiftId());
         if (Objects.nonNull(relevance)) {
-            Validate.notTrue(relevance.getLiftCompanyStatus().equals(CommonEnum.LiftStatus.ANNUAL_INSPECTION.getCode()), ValuePool.EMERGENCY_LIFT_IS_IN_INSPECTION);
+            Validate.notTrue(CommonEnum.LiftStatus.ANNUAL_INSPECTION.getCode().equals(relevance.getLiftCompanyStatus()), ValuePool.EMERGENCY_LIFT_IS_IN_INSPECTION);
         }
 
         //派单时间 急修单创建时间
@@ -185,6 +185,7 @@ public class EmergencyRepairController {
         entity.setStatus(0);
         boolean result = emergencyRepairService.save(entity);
         if (result) {
+            //消息推送
             Long id = entity.getId();
             Region region = pushUserService.findRegionByEmergencyRepair(id, mtCompanyId);
             List<Long> userIds = new ArrayList<>();
@@ -251,6 +252,11 @@ public class EmergencyRepairController {
         return pageByCondition(request);
     }
 
+    /**
+     * 急修收款中急修列表,不检查status
+     * @param request RepairRequest
+     * @return RestResponse
+     */
     @PostMapping("pageCost")
     @Validation(fields = {"mtCompanyId"})
     public RestResponse pageCost(@Val @RequestBody RepairRequest request) {
@@ -290,6 +296,7 @@ public class EmergencyRepairController {
 
         boolean result = emergencyRepairService.saveOrUpdate(entity);
         if (result) {
+            //消息推送
             Long id = entity.getId();
             Long mtCompanyId = entity.getMtCompanyId();
             Region region = pushUserService.findRegionByEmergencyRepair(id, mtCompanyId);
@@ -460,15 +467,17 @@ public class EmergencyRepairController {
         EmergencyRepair repair = emergencyRepairService.getById(request.getId());
         Validate.notNull(repair, ValuePool.EMERGENCY_NOT_EXIST);
 
+        List<ErRecordCost> costs = erRecordCostService.listByErRecordId(repair.getId());
         List<ErRecordCost> erRecordCosts = request.getErRecordCosts();
-
-        BigDecimal costTotal = erRecordCosts.stream().filter(cost -> Objects.nonNull(cost.getCostMoney())).map(ErRecordCost::getCostMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if(Objects.isNull(costs)){
+            costs = new ArrayList<>();
+        }
+        costs.addAll(erRecordCosts);
+        BigDecimal costTotal = costs.stream().filter(cost -> Objects.nonNull(cost.getCostMoney())).map(ErRecordCost::getCostMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
         repair.setCostTotal(costTotal);
-
-        BigDecimal payTotal = erRecordCosts.stream().filter(cost -> Objects.nonNull(cost.getPayMoney())).map(ErRecordCost::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal payTotal = costs.stream().filter(cost -> Objects.nonNull(cost.getPayMoney())).map(ErRecordCost::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
         repair.setPayTotal(payTotal);
-
-        BigDecimal invoiceTotal = erRecordCosts.stream().filter(cost -> Objects.nonNull(cost.getInvoiceMoney())).map(ErRecordCost::getInvoiceMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal invoiceTotal = costs.stream().filter(cost -> Objects.nonNull(cost.getInvoiceMoney())).map(ErRecordCost::getInvoiceMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
         repair.setInvoiceTotal(invoiceTotal);
 
         return emergencyRepairService.addCost(repair, erRecordCosts);
@@ -526,21 +535,19 @@ public class EmergencyRepairController {
     @PostMapping("modifyCost")
     @Validation(fields = {"id", "erRecordCosts"})
     public RestResponse modifyCost(@Val @RequestBody RepairRequest request) {
-        EmergencyRepair repair = emergencyRepairService.getById(request.getId());
+        Long recordId = request.getId();
+        EmergencyRepair repair = emergencyRepairService.getById(recordId);
         Validate.notNull(repair, ValuePool.EMERGENCY_NOT_EXIST);
 
         List<ErRecordCost> erRecordCosts = request.getErRecordCosts();
-
         BigDecimal costTotal = erRecordCosts.stream().filter(cost -> Objects.nonNull(cost.getCostMoney())).map(ErRecordCost::getCostMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
         repair.setCostTotal(costTotal);
-
         BigDecimal payTotal = erRecordCosts.stream().filter(cost -> Objects.nonNull(cost.getPayMoney())).map(ErRecordCost::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
         repair.setPayTotal(payTotal);
-
         BigDecimal invoiceTotal = erRecordCosts.stream().filter(cost -> Objects.nonNull(cost.getInvoiceMoney())).map(ErRecordCost::getInvoiceMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
         repair.setInvoiceTotal(invoiceTotal);
 
-        List<ErRecordCost> oldRecordCosts = erRecordCostService.listByErRecordId(request.getId());
+        List<ErRecordCost> oldRecordCosts = erRecordCostService.listByErRecordId(recordId);
 
         return emergencyRepairService.modifyCost(repair, oldRecordCosts, erRecordCosts);
     }

+ 1 - 1
lift-business-service/src/main/java/cn/com/ty/lift/business/emergency/service/EmergencyRepairService.java

@@ -281,7 +281,7 @@ public class EmergencyRepairService extends ServiceImpl<EmergencyRepairMapper, E
         if (!re) {
             return RestResponse.fail("修改急修失败,请稍后重试");
         }
-        boolean im = erRecordImgService.saveBatch(erRecordImgs);
+        boolean im = erRecordImgService.saveBatch(erRecordImgs, erRecordImgs.size());
         if (im) {
             return RestResponse.success(true);
         } else {

+ 36 - 16
lift-business-service/src/main/java/cn/com/ty/lift/business/framework/conf/BigDecimalDeserializer.java

@@ -1,11 +1,12 @@
 package cn.com.ty.lift.business.framework.conf;
 
-import com.alibaba.fastjson.parser.DefaultJSONParser;
-import com.alibaba.fastjson.parser.JSONLexer;
-import com.alibaba.fastjson.parser.JSONToken;
-import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.JsonTokenId;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
 
-import java.lang.reflect.Type;
+import java.io.IOException;
 import java.math.BigDecimal;
 
 /**
@@ -14,19 +15,38 @@ import java.math.BigDecimal;
  * @author wcz
  * @since 2020/4/26
  */
-public class BigDecimalDeserializer implements ObjectDeserializer {
-    @Override
-    public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
-        final JSONLexer lexer = parser.lexer;
-        if(type != BigDecimal.class){
-            return (T) lexer.numberString();
-        }
-        BigDecimal bigDecimal = lexer.decimalValue();
-        return (T) bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
+public class BigDecimalDeserializer extends StdScalarDeserializer<BigDecimal> {
+
+    public static final BigDecimalDeserializer instance = new BigDecimalDeserializer();
+
+    public BigDecimalDeserializer() {
+        super(BigDecimal.class);
     }
 
     @Override
-    public int getFastMatchToken() {
-        return JSONToken.LITERAL_INT;
+    public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+        switch (p.getCurrentTokenId()) {
+            case JsonTokenId.ID_NUMBER_INT:
+            case JsonTokenId.ID_NUMBER_FLOAT:
+                return p.getDecimalValue().setScale(2, BigDecimal.ROUND_HALF_UP);
+            case JsonTokenId.ID_STRING:
+                String text = p.getText().trim();
+                // note: no need to call `coerce` as this is never primitive
+                if (_isEmptyOrTextualNull(text)) {
+                    _verifyNullForScalarCoercion(ctxt, text);
+                    return getNullValue(ctxt).setScale(2, BigDecimal.ROUND_HALF_UP);
+                }
+                _verifyStringForScalarCoercion(ctxt, text);
+                try {
+                    return new BigDecimal(text).setScale(2, BigDecimal.ROUND_HALF_UP);
+                } catch (IllegalArgumentException iae) {
+                }
+                return ((BigDecimal) ctxt.handleWeirdStringValue(_valueClass, text,
+                        "not a valid representation")).setScale(2, BigDecimal.ROUND_HALF_UP);
+            case JsonTokenId.ID_START_ARRAY:
+                return _deserializeFromArray(p, ctxt).setScale(2, BigDecimal.ROUND_HALF_UP);
+        }
+        // Otherwise, no can do:
+        return ((BigDecimal) ctxt.handleUnexpectedToken(_valueClass, p)).setScale(2, BigDecimal.ROUND_HALF_UP);
     }
 }

+ 3 - 0
lift-business-service/src/main/java/cn/com/ty/lift/business/framework/conf/BigDecimalSerializer.java

@@ -15,6 +15,9 @@ import java.util.Objects;
  * @since 2020/4/26
  */
 public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
+
+    public static final BigDecimalSerializer instance = new BigDecimalSerializer();
+
     @Override
     public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
         if(Objects.nonNull(value)){

+ 3 - 0
lift-business-service/src/main/java/cn/com/ty/lift/business/framework/conf/SystemConfiguration.java

@@ -97,6 +97,9 @@ public class SystemConfiguration {
             builder.deserializers(new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)));
 
             builder.serializerByType(Long.class, ToStringSerializer.instance);
+
+            //builder.serializerByType(BigDecimal.class, BigDecimalSerializer.instance);
+            //builder.deserializerByType(BigDecimal.class, BigDecimalDeserializer.instance);
         };
     }
 

+ 6 - 0
lift-push/src/main/java/cn/com/ty/lift/push/app/PushConsumer.java

@@ -12,6 +12,12 @@ import org.springframework.stereotype.Component;
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * 消息推送消费者,监听队列,从队列中取出message执行推送, queue >>> device platform
+ *
+ * @author wcz
+ * @since 2020/4/26
+ */
 @Slf4j
 @Component
 @AllArgsConstructor

+ 6 - 0
lift-push/src/main/java/cn/com/ty/lift/push/app/PushProducer.java

@@ -9,6 +9,12 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.time.LocalDateTime;
 
+/**
+ * 推送消息生产者demo,在具体业务发生点send消息到队列中, message >>> queue
+ *
+ * @author wcz
+ * @since 2020/4/26
+ */
 @RestController
 @AllArgsConstructor
 @RequestMapping("push")

+ 45 - 7
lift-push/src/main/java/cn/com/ty/lift/push/app/XingePush.java

@@ -1,5 +1,6 @@
 package cn.com.ty.lift.push.app;
 
+import cn.com.ty.lift.common.utils.ValuePool;
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
 import com.tencent.xinge.XingeApp;
@@ -25,39 +26,76 @@ public class XingePush {
     private String appId     = "40d4e2e854433";
     private String secretKey = "fa99dc19157b00fc71cf8d7e840273a3";
 
-    //消息推送(>>>)
+    /**
+     * 消息推送 >>>
+     */
     private XingeApp xingeApp;
 
+    /**
+     * 默认配置创建xinge push
+     */
     public XingePush() {
         xingeApp = new XingeApp(appId, secretKey);
     }
 
+    /**
+     * 指定api密钥创建xinge push
+     */
     public XingePush(String appId, String secretKey) {
         this.appId = appId;
         this.secretKey = secretKey;
         xingeApp = new XingeApp(appId, secretKey);
     }
 
+    /**
+     * 推送到android指定的token设备
+     * @param title 消息标题
+     * @param content 消息正文
+     * @param toList 推送的token
+     */
     public boolean pushTokenOnAndroid(String title, String content, List<String> toList) {
         return pushMessage(RequestBuilder.android(title, content, AudienceType.token.getType(), toList));
     }
-
+    /**
+     * 推送到android指定的account设备
+     * @param title 消息标题
+     * @param content 消息正文
+     * @param toList 推送的account
+     */
     public boolean pushAccountOnAndroid(String title, String content, List<String> toList) {
         return pushMessage(RequestBuilder.android(title, content, AudienceType.account.getType(), toList));
     }
-
+    /**
+     * 推送到android的所有设备
+     * @param title 消息标题
+     * @param content 消息正文
+     */
     public boolean pushAllOnAndroid(String title, String content) {
         return pushMessage(RequestBuilder.android(title, content));
     }
-
+    /**
+     * 推送到ios指定的token设备
+     * @param title 消息标题
+     * @param content 消息正文
+     * @param toList 推送的token
+     */
     public boolean pushTokenOnIos(String title, String content, List<String> toList) {
         return pushMessage(RequestBuilder.ios(title, content, AudienceType.token.getType(), toList));
     }
-
+    /**
+     * 推送到android指定的account设备
+     * @param title 消息标题
+     * @param content 消息正文
+     * @param toList 推送的account
+     */
     public boolean pushAccountOnIos(String title, String content, List<String> toList) {
         return pushMessage(RequestBuilder.ios(title, content, AudienceType.account.getType(), toList));
     }
-
+    /**
+     * 推送到ios指定的token设备
+     * @param title 消息标题
+     * @param content 消息正文
+     */
     public boolean pushAllOnIos(String title, String content) {
         return pushMessage(RequestBuilder.ios(title, content));
     }
@@ -272,7 +310,7 @@ public class XingePush {
                     log.error("Failed to Create PushAppRequest: 'toList' is null or empty when 'audienceType' is not 'ALL'.");
                     return null;
                 }
-                if(toList.size() > 1000){
+                if(toList.size() > ValuePool.PUSH_MAX_SIZE){
                     log.error("Failed to Create PushAppRequest: the max size of 'toList' is 1000.");
                     return null;
                 }

+ 0 - 23
upload/src/main/java/com/controller/common/ExceptionInfo.java

@@ -1,23 +0,0 @@
-package com.controller.common;
-
-import org.springframework.http.HttpStatus;
-
-public interface ExceptionInfo {
-    String RES_OK = String.valueOf(HttpStatus.OK.value());
-    String RES_ERROR = String.valueOf(HttpStatus.INTERNAL_SERVER_ERROR.value());
-    String RES_NOT_FOUND = String.valueOf(HttpStatus.NOT_FOUND.value());
-    String RES_FORBIDDEN = String.valueOf(HttpStatus.FORBIDDEN.value());
-    String RES_BAD_REQUEST = String.valueOf(HttpStatus.BAD_REQUEST.value());
-    String RES_METHOD_NOT_ALLOWED = String.valueOf(HttpStatus.METHOD_NOT_ALLOWED.value());
-    String RES_UNAUTHORIZED = String.valueOf(HttpStatus.UNAUTHORIZED.value());
-    String MESSAGE_OK = "SUCCESS";
-    String MESSSGE_ERROR = "SYSTEM ERROR";
-
-    default String getStatusCode() {
-        return RES_OK;
-    }
-
-    default String getMessage() {
-        return "SUCCESS";
-    }
-}

+ 3 - 1
upload/src/main/java/com/controller/common/RestResponse.java

@@ -1,6 +1,8 @@
 package com.controller.common;
 
-public final class RestResponse<T> implements ExceptionInfo {
+import java.io.Serializable;
+
+public final class RestResponse<T> implements Serializable {
     private final T data;
     private final String statusCode;
     private final String message;