Преглед изворни кода

Merge remote-tracking branch 'origin/dev_20251130' into dev_20251130

donglang пре 1 месец
родитељ
комит
66b3de3e15
18 измењених фајлова са 132 додато и 23 уклоњено
  1. 4 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/FileUtils.java
  2. 2 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryListResVo.java
  3. 6 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryLogisticListResp.java
  4. 10 11
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractLogisticsService.java
  5. 25 2
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java
  6. 2 2
      sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml
  7. 1 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java
  8. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsRoleController.java
  9. 6 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/KwsRole.java
  10. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/EditRoleReqVo.java
  11. 1 1
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/EntRegisterReqVo.java
  12. 2 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/RoleResVo.java
  13. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java
  14. 19 6
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsRoleService.java
  15. 16 1
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java
  16. 1 0
      sckw-modules/sckw-system/src/main/resources/mapper/KwsRoleDao.xml
  17. 10 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderDetailResp.java
  18. 24 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

+ 4 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/FileUtils.java

@@ -1,6 +1,7 @@
 package com.sckw.core.utils;
 
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.StrUtil;
 import com.aliyun.oss.*;
 import com.aliyun.oss.model.*;
 import com.sckw.core.model.constant.NumberConstant;
@@ -166,6 +167,9 @@ public class FileUtils {
         if (StringUtils.isBlank(replace)) {
             return null;
         }
+        if (StrUtil.startWith(replace, "http")) {
+            return replace;
+        }
         return stringBuilder.append(getOSSAddressPrefix()).append(replace).toString();
     }
 

+ 2 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryListResVo.java

@@ -195,6 +195,8 @@ public class QueryListResVo implements Serializable {
     /**
      * 发起时间
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @Schema(description = "发起时间")
     private Date initiateTime;
 

+ 6 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryLogisticListResp.java

@@ -1,9 +1,11 @@
 package com.sckw.contract.model.vo.res;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.sckw.core.web.request.PageReq;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -94,11 +96,15 @@ public class QueryLogisticListResp implements Serializable {
      * 起始日期
      */
     @Schema(description = "起始日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
     private String startDate;
     /**
      * 终止日期
      */
     @Schema(description = "终止日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
     private String endDate;
     /**
      * 发起人id

+ 10 - 11
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractLogisticsService.java

@@ -794,6 +794,10 @@ public class KwcContractLogisticsService {
 
             if (Objects.nonNull(queryListResVo.getEndTime())) {
                 queryListResVo.setEndTime(DateUtils.getStartOfDay(queryListResVo.getEndTime()));
+                String endDate = DateUtils.format(queryListResVo.getEndTime(), DateUtils.DATE_PATTERN);
+                if (org.apache.commons.lang3.StringUtils.equals(endDate,"9999-12-30")){
+                    queryListResVo.setEndTime(null);
+                }
             }
             list.add(queryListResVo);
         }
@@ -1157,9 +1161,9 @@ public class KwcContractLogisticsService {
              }
 
 
-            String startDate = DateUtils.format(r.getStartTime(), DateUtils.DATE_TIME_PATTERN);
+            String startDate = DateUtils.format(r.getStartTime(), DateUtils.DATE_PATTERN);
             queryLogisticListResp.setStartDate(startDate);
-            String endDate = DateUtils.format(r.getEndTime(), DateUtils.DATE_TIME_PATTERN);
+            String endDate = DateUtils.format(r.getEndTime(), DateUtils.DATE_PATTERN);
             queryLogisticListResp.setEndDate(org.apache.commons.lang3.StringUtils.equals(endDate,"9999-12-30") ? "": endDate);
             queryLogisticListResp.setInitiatorId(r.getCreateBy());
             UserCacheResDto userCacheResDto = finalLongUserCacheResDtoMap.getOrDefault(r.getCreateBy(), new UserCacheResDto());
@@ -1197,14 +1201,11 @@ public class KwcContractLogisticsService {
         saveContractLogistics.setSigningWay(baseInfo.getSigningWay());
         saveContractLogistics.setStartTime(baseInfo.getStartTime());
         if (Objects.isNull(baseInfo.getEndTime())){
-            // 创建 LocalDate 对象
             LocalDate localDate = LocalDate.of(9999, 12, 30);
-
-// 将 LocalDate 转换为 Date
             Date date1 = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
-            saveContractLogistics.setEndTime(date1);
+            saveContractLogistics.setEndTime(DateUtils.getEndOfDay(date1));
         }else {
-            saveContractLogistics.setEndTime(baseInfo.getEndTime());
+            saveContractLogistics.setEndTime(DateUtils.getEndOfDay(baseInfo.getEndTime()));
         }
 
         saveContractLogistics.setStatus(ContractStatusEnum.SUBMIT.getCode());
@@ -1385,10 +1386,8 @@ public class KwcContractLogisticsService {
         tradeBaseInfo.setContractCode(logistics.getContractNo());
         tradeBaseInfo.setContractName(logistics.getName());
         if (Objects.nonNull(logistics.getEndTime())) {
-            LocalDate endTime = logistics.getEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
-            LocalDate specialDate = LocalDate.of(9999, 12, 30);
-            if (endTime.equals(specialDate)) {
-                // 处理逻辑:日期相等
+            String endDate = DateUtils.format(logistics.getEndTime(), DateUtils.DATE_PATTERN);
+            if (org.apache.commons.lang3.StringUtils.equals(endDate,"9999-12-30")){
                 tradeBaseInfo.setEndTime(null);
             }else {
                 tradeBaseInfo.setEndTime(logistics.getEndTime());

+ 25 - 2
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -64,6 +64,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -294,6 +296,10 @@ public class KwcContractTradeService {
             queryListResVo.setPerformedAmountMoney( performedAmountMoney);
             if(Objects.nonNull(queryListResVo.getEndTime())) {
                 queryListResVo.setEndTime(DateUtils.getStartOfDay(queryListResVo.getEndTime()));
+                String endDate = DateUtils.format(queryListResVo.getEndTime(), DateUtils.DATE_PATTERN);
+                if (org.apache.commons.lang3.StringUtils.equals(endDate,"9999-12-30")){
+                    queryListResVo.setEndTime(null);
+                }
             }
             list.add(queryListResVo);
         }
@@ -413,6 +419,10 @@ public class KwcContractTradeService {
         kwcContractTrade.setStartTime(baseInfo.getStartTime());
         if (Objects.nonNull(baseInfo.getEndTime())) {
             kwcContractTrade.setEndTime(DateUtils.getEndOfDay(baseInfo.getEndTime()));
+        }else {
+            LocalDate localDate = LocalDate.of(9999, 12, 30);
+            Date date1 = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
+            kwcContractTrade.setEndTime(DateUtils.getEndOfDay(date1));
         }
         kwcContractTrade.setPerformedAmount(new BigDecimal("0"));
         kwcContractTrade.setContractPid(pid);
@@ -1477,7 +1487,14 @@ public class KwcContractTradeService {
         tradeBaseInfo.setContractName(kwcContractTrade.getName());
         tradeBaseInfo.setContractStatus(String.valueOf(kwcContractTrade.getStatus()));
         tradeBaseInfo.setContractStatusDesc(ContractStatusEnum.getNameByCode(kwcContractTrade.getStatus()));
-        tradeBaseInfo.setEndTime(kwcContractTrade.getEndTime());
+        if (Objects.nonNull(kwcContractTrade.getEndTime())){
+            tradeBaseInfo.setEndTime(kwcContractTrade.getEndTime());
+            String endDate = DateUtils.format(kwcContractTrade.getEndTime(), DateUtils.DATE_PATTERN);
+            if (org.apache.commons.lang3.StringUtils.equals(endDate,"9999-12-30")){
+                tradeBaseInfo.setEndTime(null);
+            }
+        }
+
         tradeBaseInfo.setSigningWay(kwcContractTrade.getSigningWay());
         tradeBaseInfo.setSigningWayDesc(DictEnum.getLabel(DictTypeEnum.SIGNING_WAY.getType(), String.valueOf(kwcContractTrade.getSigningWay())));
         tradeBaseInfo.setStartTime(kwcContractTrade.getStartTime());
@@ -1631,7 +1648,13 @@ public class KwcContractTradeService {
         }
         queryListResVo.setCreateTime(t.getCreateTime());
         queryListResVo.setStartTime(t.getStartTime());
-        queryListResVo.setEndTime(t.getEndTime());
+        if (Objects.nonNull(t.getStartTime())){
+            queryListResVo.setEndTime(t.getEndTime());
+            String endDate = DateUtils.format(t.getEndTime(), DateUtils.DATE_PATTERN);
+            if (org.apache.commons.lang3.StringUtils.equals(endDate,"9999-12-30")){
+                queryListResVo.setEndTime(null);
+            }
+        }
         queryListResVo.setInitiateTime(t.getCreateTime());
         queryListResVo.setRemark(t.getRemark());
         queryListResVo.setSignTime(t.getSignTime());

+ 2 - 2
sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml

@@ -293,8 +293,8 @@
             a.del_flag = 0
               and a.status = 0
               and c.unit_type = 2
-            and a.start_time < #{time}
-            and a.end_time > #{time}
+              and a.start_time < #{time}
+              and (a.end_time > #{time} OR a.end_time IS NULL)
               and c.ent_id = #{entId}
               and b.goods_id = #{goodsId}
             order by a.create_time desc

+ 1 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java

@@ -1408,6 +1408,7 @@ public class KwpGoodsService {
         }
         //组装商品参数
         List<GoodsInfoResp.GoodsInfo> goodsInfos = goods.stream()
+                .filter(e->Objects.equals(e.getStatus(), GoodsStatusEnum.PUT_ON_SHELVES.getCode()))
                 .map(KwpGoodsService::getGoodsInfo)
                 .collect(Collectors.toList());
         GoodsInfoResp goodsInfoResp = new GoodsInfoResp();

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsRoleController.java

@@ -69,6 +69,7 @@ public class KwsRoleController {
      **/
     @PostMapping("/add")
     public HttpResult add(@Valid @RequestBody EditRoleReqVo reqVo) {
+        reqVo.setAdminFlag(2);
         kwsRoleService.add(reqVo);
         return HttpResult.ok(HttpStatus.MSG_003);
     }

+ 6 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/KwsRole.java

@@ -3,8 +3,10 @@ package com.sckw.system.model;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.sckw.core.model.base.BaseModel;
 import lombok.Data;
+
 /**
  * 岗位角色
+ *
  * @author zk
  * @date 2023-05-31
  */
@@ -21,5 +23,9 @@ public class KwsRole extends BaseModel {
      */
     @TableField("ent_id")
     private Long entId;
+    /**
+     * 管理员标识 1-管理员 2-其它
+     */
+    private Integer adminFlag;
 
 }

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/EditRoleReqVo.java

@@ -60,4 +60,5 @@ public class EditRoleReqVo implements Serializable {
      * 是否是管理员
      */
     private Boolean isManage;
+    private Integer adminFlag;
 }

+ 1 - 1
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/EntRegisterReqVo.java

@@ -29,7 +29,7 @@ public class EntRegisterReqVo implements Serializable {
     /**
      * 母公司id(当注册的公司是一家子公司时,entPid必传)
      */
-    private Long pid;
+    private Long entPid;
 
     /**
      * 企业编号

+ 2 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/RoleResVo.java

@@ -85,5 +85,7 @@ public class RoleResVo implements Serializable {
      * 菜单权限ids
      */
     private String menuIds;
+    private Integer adminFlag;
+
 
 }

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java

@@ -367,6 +367,7 @@ public class KwsEnterpriseService {
         kwsEnterprise.setHead(reqVo.getHead());
         kwsEnterprise.setRegSource(LoginUserHolder.getClientType());
         kwsEnterprise.setCityCode(reqVo.getCityCode());
+        kwsEnterprise.setPid(reqVo.getEntPid());
         SysArea sysArea = sysAreaDao.selectById(reqVo.getCityCode());
         if (Objects.nonNull(sysArea)) {
             kwsEnterprise.setCityName(sysArea.getMergerName());

+ 19 - 6
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsRoleService.java

@@ -87,11 +87,11 @@ public class KwsRoleService {
      * @author: czh
      * @date: 2023/6/15
      */
-    public void add(KwsRole params) {
-        if (kwsRoleDao.insert(params) <= 0) {
-            throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
-        }
-    }
+//    public void add(KwsRole params) {
+//        if (kwsRoleDao.insert(params) <= 0) {
+//            throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
+//        }
+//    }
 
     /**
      * @param reqVo 新增角色
@@ -115,6 +115,7 @@ public class KwsRoleService {
         kwsRole.setId(roleId);
         kwsRole.setEntId(reqVo.getEntId());
         kwsRole.setName(reqVo.getName());
+        kwsRole.setAdminFlag(reqVo.getAdminFlag());
         kwsRole.setRemark(reqVo.getRemark());
         if (kwsRoleDao.insert(kwsRole) <= 0) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
@@ -194,6 +195,7 @@ public class KwsRoleService {
      *
      * @param ids 主键
      */
+    @Transactional(rollbackFor = Exception.class)
     public void deleteByKey(String ids) {
         List<Long> idList = Arrays.stream(ids.split(",")).map(Long::parseLong).toList();
         List<KwsRole> kwsRoles = kwsRoleDao.selectBatchByKeys(idList);
@@ -205,6 +207,13 @@ public class KwsRoleService {
         if (CollectionUtils.isNotEmpty(kwsUsers)) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.MSG_011);
         }
+        if (!LoginUserHolder.isManager()) {
+            for (KwsRole kwsRole : kwsRoles) {
+                if (Objects.equals(kwsRole.getAdminFlag(), 1)) {
+                    throw new SystemException("企业管理员角色不允许删除");
+                }
+            }
+        }
         deleteRole(kwsRoles);
     }
 
@@ -257,7 +266,11 @@ public class KwsRoleService {
         if (Objects.isNull(kwsRole)) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.UPDATE_FAIL);
         }
-
+        if (!LoginUserHolder.isManager()) {
+            if (Objects.equals(kwsRole.getAdminFlag(), 1)) {
+                throw new SystemException("企业管理员角色不允许修改");
+            }
+        }
         List<KwsMenuRights> kwsMenuRightsList = kwsMenuRightsDao.selectByRoleIds(Collections.singletonList(kwsRole.getId()));
         if (CollectionUtils.isNotEmpty(kwsMenuRightsList)) {
             for (KwsMenuRights kwsMenuRights : kwsMenuRightsList) {

+ 16 - 1
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.sckw.core.common.enums.enums.DictEnum;
+import com.sckw.core.exception.BusinessException;
 import com.sckw.core.exception.SystemException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.ApprovalEnum;
@@ -233,6 +234,7 @@ public class KwsUserService {
             editRoleReqVo.setMenuIds(String.join(Global.COMMA, kwsMenus.stream().map(KwsMenu::getId).map(String::valueOf).toList()));
             editRoleReqVo.setVisiblePersonal(false);
             editRoleReqVo.setIsManage(true);
+            editRoleReqVo.setAdminFlag(1);
             kwsRoleService.add(editRoleReqVo);
         }
 
@@ -309,6 +311,11 @@ public class KwsUserService {
             }
             KwsUser kwsUser = kwsUserDao.selectByKey(Long.parseLong(id));
             if (null != kwsUser) {
+                if (!LoginUserHolder.isManager()) {
+                    if (Objects.equals(kwsUser.getIsMain(), 1)) {//企业管理员用户,默认用户不允许删除
+                        throw new BusinessException(String.format("默认企业管理员账号[%s]不允许删除", kwsUser.getName()));
+                    }
+                }
                 kwsUser.setDelFlag(Global.YES);
                 if (kwsUserDao.updateById(kwsUser) <= 0) {
                     throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.DELETE_FAIL);
@@ -329,6 +336,14 @@ public class KwsUserService {
         if (Objects.isNull(kwsUser)) {
             throw new SystemException(HttpStatus.QUERY_FAIL_CODE, HttpStatus.ACCOUNT_NOT_EXISTS);
         }
+        if (!LoginUserHolder.isManager()) {
+            if (Objects.equals(kwsUser.getIsMain(), 1)) {//企业管理员用户,只修改名称和备注,归属企业和角色都不允许修改。
+                kwsUser.setRemark(params.getRemark());
+                kwsUser.setName(params.getName());
+                kwsUserDao.updateById(kwsUser);
+                return;
+            }
+        }
         //更换账号后账号唯一性校验
 //        if (StringUtils.isNotBlank(params.getAccount())) {
 //            //用户信息
@@ -367,7 +382,7 @@ public class KwsUserService {
         fillUserRole(params.getRoleIds(), kwsUser.getId(), kwsUser.getSystemType());
 
         /*用户机构关系*/
-        fillUserDept(kwsUser.getId(), params.getDeptId());
+//        fillUserDept(kwsUser.getId(), params.getDeptId());
     }
 
     /**

+ 1 - 0
sckw-modules/sckw-system/src/main/resources/mapper/KwsRoleDao.xml

@@ -141,6 +141,7 @@
                 and kur.role_id = sr.id) as count,
              sr.remark,
              sr.status,
+             sr.admin_flag                  adminFlag,
              su.name                        createBy,
              sr.create_time,
              sr.update_by,

+ 10 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderDetailResp.java

@@ -113,6 +113,16 @@ public class WaybillOrderDetailResp implements Serializable {
      */
     @Schema(description = "承运企业")
    private String carrierEntName;
+    /**
+     * 装货完成率(装货量*任务量)*100%
+     */
+    @Schema(description = "装货完成率")
+    private String loadCompleteRate;
+    /**
+     * 货损率(装货量-卸货量)*装货量*100%
+     */
+    @Schema(description = "货损率")
+    private String lossRate;
     /**
      * 过磅记录
      */

+ 24 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -3400,6 +3400,30 @@ public class KwtWaybillOrderV1Service {
         KwtLogisticsOrderUnit carrierEnt = logisticsOrderUnitMap.getOrDefault(logOrder.getId() + "-" + UnitTypeEnum.CARRIAGE.getCode(), new KwtLogisticsOrderUnit());
         waybillOrderDetailResp.setTransEntName(transEnt.getFirmName());
         waybillOrderDetailResp.setCarrierEntName(carrierEnt.getFirmName());
+        
+        // 计算装货完成率 = (装货量 / 任务量) × 100%
+        String loadCompleteRate = "0.00%";
+        if (Objects.nonNull(subtask.getLoadAmount()) && Objects.nonNull(subtask.getEntrustAmount())
+                && subtask.getEntrustAmount().compareTo(BigDecimal.ZERO) > 0) {
+            BigDecimal rate = subtask.getLoadAmount()
+                    .divide(subtask.getEntrustAmount(), 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100"))
+                    .setScale(2, RoundingMode.HALF_UP);
+            loadCompleteRate = rate.toPlainString() + "%";
+        }
+        waybillOrderDetailResp.setLoadCompleteRate(loadCompleteRate);
+        
+        // 计算货损率 = ((装货量 - 卸货量) / 装货量) × 100%
+        String lossRate = "0.00%";
+        if (Objects.nonNull(subtask.getLoadAmount()) && Objects.nonNull(subtask.getUnloadAmount())
+                && subtask.getLoadAmount().compareTo(BigDecimal.ZERO) > 0) {
+            BigDecimal rate = subtask.getLoadAmount().subtract(subtask.getUnloadAmount())
+                    .divide(subtask.getLoadAmount(), 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100"))
+                    .setScale(2, RoundingMode.HALF_UP);
+            lossRate = rate.toPlainString() + "%";
+        }
+        waybillOrderDetailResp.setLossRate(lossRate);
         if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(nodeList)){
             List<WaybillOrderDetailResp.WeighingRecord> records = nodeList.stream().map(node -> {
                 WaybillOrderDetailResp.WeighingRecord weighingRecord = new WaybillOrderDetailResp.WeighingRecord();