Просмотр исходного кода

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

xucaiqin 2 лет назад
Родитель
Сommit
ede4a9eaa9

+ 1 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppWayBillController.java

@@ -3,7 +3,6 @@ package com.sckw.transport.controller.enterpriseApp;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.transport.model.dto.WaybillListAppDTO;
-import com.sckw.transport.model.dto.WaybillOrderDTO;
 import com.sckw.transport.service.WaybillManagementService;
 import jakarta.validation.Valid;
 import lombok.extern.slf4j.Slf4j;
@@ -51,7 +50,7 @@ public class AppWayBillController {
         try {
             return waybillManagementService.waybillDataApp(waybillOrderDTO);
         } catch (Exception e) {
-            log.error("APP运单列表:订单id {},error {} ", waybillOrderDTO, e.getMessage(), e);
+            log.error("APP运单列表:error-msg: {} ,e: {}", e.getMessage(), e);
             return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, e.getMessage());
         }
     }

+ 108 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/operationManagement/ManagementWaybillOrderController.java

@@ -0,0 +1,108 @@
+package com.sckw.transport.controller.operationManagement;
+
+import com.alibaba.fastjson.JSONObject;
+import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.response.HttpResult;
+import com.sckw.excel.config.easyexcel.RequestHolder;
+import com.sckw.excel.utils.ExcelUtil;
+import com.sckw.transport.model.param.ManagementWaybillOrderQuery;
+import com.sckw.transport.model.vo.execlVo.ManagementLogisticsOrderExcelVo;
+import com.sckw.transport.model.vo.execlVo.ManagementWaybillOrderExcelVO;
+import com.sckw.transport.service.ManagementWaybillOrderService;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author  JC
+ * @description 运营管理端-运单controller
+ * @date 2023/09/12 09:20:21
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/kwtManagementWaybillOrder")
+public class ManagementWaybillOrderController {
+
+    @Autowired
+    ManagementWaybillOrderService managementWaybillOrderService;
+
+
+    /**
+     * 运营管理端-运单-首页条件查询
+     *
+     * @param query 查询参数
+     * @return
+     */
+    @RequestMapping(value = "/select", method = RequestMethod.POST)
+    public HttpResult selectWaybillOrder(@Valid @RequestBody ManagementWaybillOrderQuery query) {
+        try {
+            return managementWaybillOrderService.selectWaybillOrder(query);
+        } catch (Exception e) {
+            log.error("运营管理端-运单-首页条件查询 查询失败:{}", e.getMessage(), e);
+            return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, e.getMessage());
+        }
+    }
+
+
+    /**
+     * 运营管理端-运单-top统计
+     *
+     * @param query 查询参数
+     * @return
+     */
+    @RequestMapping(value = "/statistics", method = RequestMethod.POST)
+    public HttpResult statisticsWaybillOrder(@Valid @RequestBody ManagementWaybillOrderQuery query) {
+        log.error("运营管理端-运单-top统计 查询 :{}", JSONObject.toJSONString(query));
+        try {
+            return managementWaybillOrderService.statisticsWaybillOrder(query);
+        } catch (Exception e) {
+            log.error("运营管理端-运单-top统计 失败 :{}", e.getMessage(), e);
+            return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, e.getMessage());
+        }
+    }
+
+    /**
+     * 运营管理端-运单-导出
+     *
+     * @param query 查询参数
+     * @return
+     */
+    @RequestMapping(value = "/export", method = RequestMethod.POST)
+    public HttpResult exportWaybillOrder(@Validated @RequestBody ManagementWaybillOrderQuery query) {
+        log.error("运营管理端-运单-导出 query :{}", JSONObject.toJSONString(query));
+        HttpServletResponse response = RequestHolder.getResponse();
+        List<ManagementWaybillOrderExcelVO> list = managementWaybillOrderService.exportWaybillOrder(query);
+        if (!org.springframework.util.CollectionUtils.isEmpty(list)) {
+            ExcelUtil.download(response, ManagementWaybillOrderExcelVO.class, list);
+            return null;
+        }
+        return HttpResult.ok("没有可导出的数据");
+    }
+
+
+    /**
+     * 运营端-运单-获取订单详情
+     *
+     * @param id
+     * @return
+     */
+    @RequestMapping(value = "/getOrderDetail", method = RequestMethod.GET)
+    public HttpResult getOrderDetail(@RequestParam("id") Long id) {
+        try {
+            return managementWaybillOrderService.getOrderDetail(id);
+        } catch (Exception e) {
+            log.error("运营端-运单-获取订单详情失败:error :单据id:{}, errorMessage:{}", id, e.getMessage(), e);
+            return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, e.getMessage());
+        }
+    }
+
+}

+ 74 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ManagementWaybillOrderQuery.java

@@ -0,0 +1,74 @@
+package com.sckw.transport.model.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sckw.core.model.page.PageRequest;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author JC
+ * @version 1.0
+ * @desc TODO
+ * @date 2023/{07}/19 10:20:44
+ **/
+@Data
+@Accessors(chain = true)
+public class ManagementWaybillOrderQuery extends PageRequest implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -7815297050724808472L;
+
+    private String ids;
+    /**
+     * 派车开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startSendCarTime;
+
+    /**
+     * 派车结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endSendCarTime;
+
+    /**
+     * 启送时间-查询开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startStartTime;
+
+    /**
+     * 启送时间-查询结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endStartTime;
+
+    /**
+     * 结束时间-查询开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startEndTime;
+
+    /**
+     * 结束时间-查询结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endEndTime;
+
+    /**
+     * 关键字搜索
+     */
+    private String keywords;
+
+    /**
+     * 运单状态
+     */
+    @JsonProperty("status")
+    @NotNull(message = "订单状态不能为空")
+    private String status;
+}

+ 168 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/ManagementCarWaybillVo.java

@@ -0,0 +1,168 @@
+package com.sckw.transport.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author lfdc
+ * @description 车辆运单
+ * @date 2023-06-27 11:06:08
+ */
+@Data
+@Accessors(chain = true)
+public class ManagementCarWaybillVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 4526063761808958350L;
+    /**
+     * 物流订单id
+     */
+    @JsonProperty(value="wOrderId")
+    private String wOrderId;
+
+    /**
+     * 物流订单号
+     */
+    @JsonProperty(value="wOrderNo")
+    private String wOrderNo;
+
+    /**
+     * 车辆牌照
+     */
+    private String truckNo;
+
+    /**
+     * 司机
+     */
+    private String driverName;
+
+    /**
+     * 运单类型数字
+     */
+    private String type;
+
+    /**
+     * 运单类型字符
+     */
+    private String typeLabel;
+
+    /**
+     * 托量单位
+     */
+    private String unit;
+
+    /**
+     * 托量单位字符
+     */
+    private String unitLabel;
+
+    /**
+     * 运单状态
+     */
+    private String  status;
+
+    /**
+     * 运单状态字符
+     */
+    private String  statusLabel;
+
+    /**
+     * 承运车队
+     */
+    private String firmName;
+
+
+    /**
+     * 派车时间
+     */
+    private String sendCarTime;
+
+    /**
+     * 计划开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startTime;
+
+    /**
+     * 计划结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endTime;
+
+    /**
+     * 派单量/吨
+     */
+    private String entrustAmount;
+
+    /**
+     * 装货地点名称
+     */
+    private String loadName;
+
+    /**
+     * 装货地点
+     */
+    private String loadAddress;
+
+    /**
+     * 卸货地点点名称
+     */
+    private String unloadName;
+
+    /**
+     * 卸货地点
+     */
+    private String unloadAddress;
+
+    /**
+     * 实装量/吨
+     */
+    private String loadAmount;
+
+    /**
+     * 实卸量/吨
+     */
+    private String unloadAmount;
+
+    /**
+     * 装货时间
+     */
+    private String loadDateTime;
+
+    /**
+     * 卸货时间
+     */
+    private String unloadDateTime;
+
+    /**
+     * 亏吨重量
+     */
+    private String deficitAmount;
+
+    /**
+     * 扣亏损值(合理损耗-(实装-实卸))-单位
+     */
+    private String goodsPriceUnit;
+
+    /**
+     * 扣亏量(合理损耗-(实装-实卸))-单位
+     */
+    private String deficitRealAmount;
+
+    /**
+     * 创建时间
+     */
+    private String createTime;
+
+    /**
+     * 更新时间
+     */
+    private String updateTime;
+
+}

+ 84 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/execlVo/ManagementWaybillOrderExcelVO.java

@@ -0,0 +1,84 @@
+package com.sckw.transport.model.vo.execlVo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.sckw.excel.annotation.ExcelContext;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author JC
+ * @version 1.0
+ * @desc TODO
+ * @date 2023/{07}/19 10:20:44
+ **/
+@Data
+@Accessors(chain = true)
+@ExcelContext(fileName = "运单列表信息", sheetName = "运单列表信息")
+public class ManagementWaybillOrderExcelVO implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -2111424783071112237L;
+
+    @ExcelProperty(value = "序号" )
+    private String serialNumber;
+
+    @ExcelProperty(value = "运单" )
+    private String status;
+
+    @ExcelProperty(value = "运单号" )
+    private String wOrderNo;
+
+    @ExcelProperty(value = "车辆车牌" )
+    private String truckNo;
+
+    @ExcelProperty(value = "车辆司机" )
+    private String driverName;
+
+    @ExcelProperty(value = "运单类型")
+    private String type;
+
+    @ExcelProperty(value = "派车时间")
+    private String sendCarTime;
+
+    @ExcelProperty(value = "计划开始时间")
+    private String startTime;
+
+    @ExcelProperty(value = "计划结束时间")
+    private String endTime;
+
+    @ExcelProperty(value = "派车量/吨")
+    private String entrustAmount;
+
+    @ExcelProperty(value = "装货地址名称")
+    private String loadName;
+
+    @ExcelProperty(value = "装货地址明细")
+    private String loadAddress;
+
+    @ExcelProperty(value = "卸货地址名称")
+    private String unloadName;
+
+    @ExcelProperty(value = "卸货地址明细")
+    private String unloadAddress;
+
+    @ExcelProperty(value = "实装量/吨")
+    private String loadAmount;
+
+    @ExcelProperty(value = "实卸量/吨")
+    private String unloadAmount;
+
+    @ExcelProperty(value = "亏吨量/吨")
+    private String deficitAmount;
+
+    @ExcelProperty(value = "装货时间")
+    private String loadDateTime;
+
+    @ExcelProperty(value = "卸货时间")
+    private String unloadDateTime;
+
+    @ExcelProperty(value = "更新时间")
+    private String updateTime;
+
+}

+ 323 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/ManagementWaybillOrderService.java

@@ -0,0 +1,323 @@
+package com.sckw.transport.service;
+
+import com.sckw.core.common.enums.NumberConstant;
+import com.sckw.core.common.enums.enums.DictTypeEnum;
+import com.sckw.core.model.enums.CarWaybillEnum;
+import com.sckw.core.model.page.PageResult;
+import com.sckw.core.utils.BeanUtils;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.StringUtils;
+import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.core.web.response.HttpResult;
+import com.sckw.excel.utils.DateUtil;
+import com.sckw.mongo.model.SckwWaybillOrder;
+import com.sckw.mongo.model.TableTops;
+import com.sckw.transport.model.param.ManagementWaybillOrderQuery;
+import com.sckw.transport.model.vo.ManagementCarWaybillVo;
+import com.sckw.transport.model.vo.execlVo.ManagementWaybillOrderExcelVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.AggregationResults;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Pattern;
+
+/**
+ * @author JC
+ * @version 1.0
+ * @desc TODO
+ * @date 2023/09/12 09:20:21
+ **/
+@Slf4j
+@Service
+public class ManagementWaybillOrderService {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Autowired
+    private CommonService commonService;
+
+    @Autowired
+    private WaybillManagementService waybillManagementService;
+
+    /**
+     * 构造运单关联查询条件
+     *
+     * @param query
+     * @return
+     */
+    public Criteria newBuildWaybillOrdersQuery(ManagementWaybillOrderQuery query) {
+        // 模糊匹配
+        // 根据条件查询所有并排序,且分页
+        // 设置模糊查询匹配规则  忽略大小写
+        // 创建条件对象
+        Criteria criteria = new Criteria();
+        criteria.and("entId").is(LoginUserHolder.getEntId());
+        criteria.and("delFlag").is(NumberConstant.ZERO);
+        // 运单状态
+        if (StringUtils.isNotBlank(query.getStatus()) && (!"all".equals(query.getStatus()))) {
+            criteria.and("status").is(Integer.valueOf(query.getStatus()));
+        }
+
+        // 派车时间
+        if (Objects.nonNull(query.getStartSendCarTime()) && Objects.nonNull(query.getEndSendCarTime())) {
+            criteria.and("sendCarTime").gte(query.getStartSendCarTime()).lte(DateUtil.offsetDay(query.getEndSendCarTime(), 1));
+        } else if (Objects.nonNull(query.getStartSendCarTime())) {
+            criteria.and("sendCarTime").gte(query.getStartSendCarTime());
+        } else if (Objects.nonNull(query.getEndSendCarTime())) {
+            criteria.and("sendCarTime").lte(DateUtil.offsetDay(query.getEndSendCarTime(), 1));
+        }
+        // 计划开始时间
+        if (Objects.nonNull(query.getStartStartTime()) && Objects.nonNull(query.getEndStartTime())) {
+            criteria.and("startTime").gte(query.getStartStartTime()).lte(DateUtil.offsetDay(query.getEndStartTime(), 1));
+        } else if (Objects.nonNull(query.getStartStartTime())) {
+            criteria.and("startTime").gte(query.getStartStartTime());
+        } else if (Objects.nonNull(query.getEndStartTime())) {
+            criteria.and("startTime").lte(DateUtil.offsetDay(query.getEndStartTime(), 1));
+        }
+        // 计划结束时间
+        if (Objects.nonNull(query.getStartEndTime()) && Objects.nonNull(query.getEndEndTime())) {
+            criteria.and("endTime").gte(query.getStartEndTime()).lte(DateUtil.offsetDay(query.getEndEndTime(), 1));
+        } else if (Objects.nonNull(query.getStartEndTime())) {
+            criteria.and("endTime").gte(query.getStartEndTime());
+        } else if (Objects.nonNull(query.getEndEndTime())) {
+            criteria.and("endTime").lte(DateUtil.offsetDay(query.getEndEndTime(), 1));
+        }
+        // 多条件模糊查询
+        List<Criteria> orCriteria = new ArrayList<>();
+        if (StringUtils.isNotBlank(query.getKeywords())) {
+            Pattern pattern = Pattern.compile("^.*" + query.getKeywords() + ".*$", Pattern.CASE_INSENSITIVE);
+            orCriteria.add(Criteria.where("wOrderNo").regex(pattern));
+            orCriteria.add(Criteria.where("truckNo").regex(pattern));
+            orCriteria.add(Criteria.where("driverName").regex(pattern));
+            orCriteria.add(Criteria.where("firmName").regex(pattern));
+            criteria.orOperator(orCriteria);
+        }
+        return criteria;
+    }
+
+    /**
+     * 运单列表
+     * @param query
+     * @return
+     */
+    public HttpResult selectWaybillOrder(ManagementWaybillOrderQuery query) {
+        Criteria criteria = newBuildWaybillOrdersQuery(query);
+
+        Query queryFormat = new Query(criteria);
+        // in查询
+        List<Long> wOrderIds = StringUtils.splitStrToList(query.getIds(), ",", Long.class);
+        if (CollectionUtils.isNotEmpty(wOrderIds)) {
+            queryFormat.addCriteria(Criteria.where("wOrderId").in(wOrderIds));
+        }
+        // 总记录数
+        long total = mongoTemplate.count(queryFormat, SckwWaybillOrder.class);
+        queryFormat.with(PageRequest.of(query.getPage() - 1, query.getPageSize(),
+                Sort.by(Sort.Order.desc("createTime"))));
+        // 执行查询
+        List<SckwWaybillOrder> list = mongoTemplate.find(queryFormat, SckwWaybillOrder.class);
+
+        List<ManagementCarWaybillVo> returnList = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(list)) {
+            for (SckwWaybillOrder waybillOrder : list) {
+                ManagementCarWaybillVo vo = new ManagementCarWaybillVo();
+                vo.setWOrderNo(waybillOrder.getWOrderNo() == null ?
+                        null : waybillOrder.getWOrderNo());
+                vo.setWOrderId(waybillOrder.getWOrderId() == null ?
+                        String.valueOf(waybillOrder.get_id()) : String.valueOf(waybillOrder.getWOrderId()));
+                vo.setTruckNo(waybillOrder.getTruckNo());
+                vo.setDriverName(waybillOrder.getDriverName() == null ?
+                        null : String.valueOf(waybillOrder.getDriverName()));
+                vo.setType(String.valueOf(waybillOrder.getType()));
+                String typeString = "";
+                if (waybillOrder.getType().equals(NumberConstant.ONE)) {
+                    typeString = "趟次";
+                }
+                if (waybillOrder.getType().equals(NumberConstant.TWO)) {
+                    typeString = "循环";
+                }
+                vo.setTypeLabel(typeString);
+                vo.setStatus(waybillOrder.getStatus() == null ?
+                        null : String.valueOf(waybillOrder.getStatus()));
+                vo.setStatusLabel(CarWaybillEnum.getName(waybillOrder.getStatus()));
+                // 托量单位
+                vo.setUnit(waybillOrder.getUnit() == null ? null : waybillOrder.getUnit());
+                if(waybillOrder.getUnit() != null) {
+                    Map<String, String> unitType = commonService.getDictData(DictTypeEnum.UNIT_TYPE.getType());
+                    String sysDict = unitType.get(waybillOrder.getUnit());
+                    vo.setUnitLabel(sysDict);
+                }
+                vo.setSendCarTime(waybillOrder.getCreateTime() == null ?
+                        null : DateUtil.getDateTime(waybillOrder.getCreateTime()));
+                vo.setStartTime(waybillOrder.getStartTime() == null ?
+                        null : waybillOrder.getStartTime());
+                vo.setEndTime(waybillOrder.getEndTime() == null ?
+                        null : waybillOrder.getEndTime());
+                vo.setEntrustAmount(String.valueOf(waybillOrder.getEntrustAmount()));
+                vo.setLoadName(waybillOrder.getLoadName() == null ?
+                        null : waybillOrder.getLoadName());
+                vo.setLoadAddress((waybillOrder.getLoadCityName() == null ? "" : waybillOrder.getLoadCityName())
+                        .concat(waybillOrder.getLoadDetailAddress() == null ? "" : waybillOrder.getLoadDetailAddress()));
+                vo.setUnloadName(waybillOrder.getUnloadName() == null ?
+                        null : waybillOrder.getUnloadName());
+                vo.setUnloadAddress((waybillOrder.getUnloadCityName() == null ? "" : waybillOrder.getUnloadCityName())
+                        .concat(waybillOrder.getUnloadDetailAddress() == null ? "" : waybillOrder.getUnloadDetailAddress()));
+                vo.setLoadAmount(waybillOrder.getLoadAmount() == null ?
+                        null : String.valueOf(waybillOrder.getLoadAmount()));
+                vo.setUnloadAmount(waybillOrder.getUnloadAmount() == null ?
+                        null : String.valueOf(waybillOrder.getUnloadAmount()));
+                vo.setLoadDateTime(waybillOrder.getLoadTime() == null ?
+                        null : DateUtil.getDateTime(waybillOrder.getLoadTime()));
+                vo.setUnloadDateTime(waybillOrder.getUnloadTime() == null ?
+                        null : DateUtil.getDateTime(waybillOrder.getUnloadTime()));
+                vo.setCreateTime(waybillOrder.getCreateTime() == null ?
+                        null : DateUtil.getDateTime(waybillOrder.getCreateTime()));
+                vo.setUpdateTime(waybillOrder.getUpdateTime() == null ?
+                        null : DateUtil.getDateTime(waybillOrder.getUpdateTime()));
+                // 货损量
+                BigDecimal deficitAmount = waybillOrder.getDeficitAmount() == null ?
+                        BigDecimal.valueOf(0) : waybillOrder.getDeficitAmount();
+                vo.setDeficitAmount(String.valueOf(deficitAmount));
+                // 存在装卸货差时 计算扣亏量
+                BigDecimal lossAmount = BigDecimal.valueOf(0);
+                BigDecimal loss = waybillOrder.getLoss() == null ? new BigDecimal("0.00") : waybillOrder.getLoss();
+                if (deficitAmount.compareTo(new BigDecimal("0.00")) > 0 && loss.compareTo(new BigDecimal("0.00")) > 0) {
+                    String lossUnit = waybillOrder.getLossUnit();
+                    Map<String, String> LossUnitType = commonService.getDictData(DictTypeEnum.TAX_RATE_TYPE.getType());
+                    String lossUnitString = LossUnitType.get(lossUnit);
+
+                    if (lossUnitString.equals("%")) {
+                        // 百分比
+                        lossAmount = loss.multiply(waybillOrder.getLoadAmount()).divide(BigDecimal.valueOf(100));
+                    } else {
+                        // 千分比
+                        lossAmount = loss.multiply(waybillOrder.getLoadAmount()).divide(BigDecimal.valueOf(1000));
+                    }
+                    lossAmount = deficitAmount.subtract(lossAmount);
+                    if (lossAmount.compareTo(new BigDecimal("0.00")) < 0) {
+                        lossAmount = new BigDecimal("0.00");
+                    }
+                }
+                // 实际扣亏量
+                vo.setDeficitRealAmount(lossAmount.setScale(2).toString());
+                vo.setGoodsPriceUnit(waybillOrder.getGoodsPriceUnit() == null ?
+                        null : String.valueOf(waybillOrder.getGoodsPriceUnit()));
+                returnList.add(vo);
+            }
+        }
+        PageResult build = PageResult.build(query.getPage(), query.getPageSize(), total, returnList);
+        return HttpResult.ok(build);
+    }
+
+    /**
+     * 运单分类统计
+     * @param query
+     * @return
+     */
+    public HttpResult statisticsWaybillOrder(ManagementWaybillOrderQuery query) {
+        Criteria criteria = newBuildWaybillOrdersQuery(query);
+        List<Integer> statuses = new ArrayList<>();
+        statuses.add(CarWaybillEnum.PENDING_ORDER.getCode());
+        statuses.add(CarWaybillEnum.PENDING_VEHICLE.getCode());
+        statuses.add(CarWaybillEnum.EXIT_COMPLETED.getCode());
+        statuses.add(CarWaybillEnum.WAIT_LOADING.getCode());
+        statuses.add(CarWaybillEnum.COMPLETION_LOADING.getCode());
+        statuses.add(CarWaybillEnum.WAIT_UNLOADING.getCode());
+        statuses.add(CarWaybillEnum.COMPLETION_UNLOADING.getCode());
+        statuses.add(CarWaybillEnum.APPROVAL_PASS.getCode());
+        statuses.add(CarWaybillEnum.REJECT_ORDER.getCode());
+        Aggregation aggregation = Aggregation.newAggregation(
+                Aggregation.match(criteria),
+                Aggregation.group("status").count().as("total"),
+                Aggregation.project("total").and("value").previousOperation()
+        );
+        AggregationResults<TableTops> outputTypeCount = mongoTemplate.aggregate(aggregation, SckwWaybillOrder.class, TableTops.class);
+        List<TableTops> results = outputTypeCount.getMappedResults();
+        // 填充默认值
+        Map<String,TableTops> listMap = new HashMap<>();
+        TableTops topTotal = new TableTops();
+        topTotal.setName("全部");
+        topTotal.setValue("all");
+        topTotal.setTotal(NumberConstant.ZERO);
+        listMap.put("all", topTotal);
+        for (Integer status : statuses) {
+            TableTops top = new TableTops();
+            top.setName(CarWaybillEnum.getName(status));
+            top.setValue(status.toString());
+            top.setTotal(NumberConstant.ZERO);
+            listMap.put(status.toString(), top);
+        }
+        Integer allTotal = 0;
+        for (TableTops result : results) {
+            if(listMap.containsKey(result.getValue())) {
+                listMap.get(result.getValue()).setTotal(result.getTotal());
+            }
+            allTotal += result.getTotal();
+        }
+        topTotal.setTotal(allTotal);
+        return HttpResult.ok(listMap.values().stream().toList());
+    }
+
+    /**
+     * 导出运单列表
+     * @param query
+     * @return
+     */
+    public List<ManagementWaybillOrderExcelVO> exportWaybillOrder(ManagementWaybillOrderQuery query) {
+        Criteria criteria = newBuildWaybillOrdersQuery(query);
+        Query queryFormat = new Query(criteria);
+        List<Long> wOrderIds = StringUtils.splitStrToList(query.getIds(), ",", Long.class);
+        if (CollectionUtils.isNotEmpty(wOrderIds)) {
+            queryFormat.addCriteria(Criteria.where("wOrderId").in(wOrderIds));
+        }
+        List<SckwWaybillOrder> wOrders = mongoTemplate.find(queryFormat, SckwWaybillOrder.class);
+        List<ManagementWaybillOrderExcelVO> list = new ArrayList<>();
+        AtomicInteger i = new AtomicInteger(1);
+        wOrders.forEach(e -> {
+            ManagementWaybillOrderExcelVO export = BeanUtils.copyProperties(e, ManagementWaybillOrderExcelVO.class);
+            export.setSerialNumber(String.valueOf(i.getAndIncrement()))
+                    .setStatus(CarWaybillEnum.getName(e.getStatus()))
+                    .setWOrderNo(e.getWOrderNo())
+                    .setTruckNo(e.getTruckNo())
+                    .setDriverName(e.getDriverName())
+                    .setType(e.getType().equals(NumberConstant.ONE) ? "趟次" : "循环")
+                    .setSendCarTime(e.getCreateTime() == null ? null : DateUtil.getDateTime(e.getCreateTime()))
+                    .setStartTime(e.getStartTime() == null ? null : DateUtil.getDateTime(e.getStartTime()))
+                    .setEndTime(e.getEndTime() == null ? null : DateUtil.getDateTime(e.getEndTime()))
+                    .setEntrustAmount(String.valueOf(e.getEntrustAmount()))
+                    .setLoadName(e.getLoadName())
+                    .setLoadAddress((e.getLoadCityName() == null ? "" : e.getLoadCityName())
+                            .concat(e.getLoadDetailAddress() == null ? "" : e.getLoadDetailAddress()))
+                    .setUnloadName(e.getUnloadName())
+                    .setUnloadAddress((e.getUnloadCityName() == null ? "" : e.getUnloadCityName())
+                            .concat(e.getUnloadDetailAddress() == null ? "" : e.getUnloadDetailAddress()))
+                    .setLoadAmount(String.valueOf(e.getLoadAmount()))
+                    .setUnloadAmount(String.valueOf(e.getUnloadAmount()))
+                    .setDeficitAmount(String.valueOf(e.getDeficitAmount()))
+                    .setLoadDateTime(e.getLoadTime() == null ? null : DateUtil.getDateTime(e.getLoadTime()))
+                    .setUnloadDateTime(e.getUnloadTime() == null ? null : DateUtil.getDateTime(e.getUnloadTime()))
+                    .setUpdateTime(e.getUpdateTime() == null ? null : DateUtil.getDateTime(e.getUpdateTime()));
+            list.add(export);
+        });
+        return list;
+    }
+
+    /**
+     * 运单详情
+     * @param id
+     * @return
+     */
+    public HttpResult getOrderDetail(Long id) {
+        return waybillManagementService.waybillData(id);
+    }
+}

+ 8 - 6
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/WaybillManagementService.java

@@ -450,9 +450,9 @@ public class WaybillManagementService {
             // 运单量单位
             waybillBoardListVO.setUnit(sckwWaybillOrder.getUnit());
             if(sckwWaybillOrder.getUnit() != null) {
-                Map<String, SysDictResDto> unitType = remoteSystemService.queryDictMapByType(DictTypeEnum.UNIT_TYPE.getType());
-                SysDictResDto sysDict = unitType.get(sckwWaybillOrder.getUnit());
-                waybillBoardListVO.setUnitLabel(sysDict.getLabel());
+                Map<String, String> unitType = commonService.getDictData(DictTypeEnum.UNIT_TYPE.getType());
+                String sysDict = unitType.get(sckwWaybillOrder.getUnit());
+                waybillBoardListVO.setUnitLabel(sysDict);
             }
             // 运单进度
             List<KwtWaybillOrderTrack> kwtWaybillOrderTracks = kwtWaybillOrderTrackMapper
@@ -832,7 +832,7 @@ public class WaybillManagementService {
         _finish.put("total", "0");
         List<Long> finishStates = getWallBillStatues("finish");
         Long finishCount = kwtWaybillOrderMapper.selectWaybillOrderCountByStatus(entId, finishStates, keyword);
-        _onway.put("total", finishCount.toString());
+        _finish.put("total", finishCount.toString());
         List<Map<String, String>> _list = new ArrayList<>();
         _list.add(_onway);
         _list.add(_finish);
@@ -861,11 +861,11 @@ public class WaybillManagementService {
             orCriteria.add(Criteria.where("firmName").regex(pattern));
             criteria.orOperator(orCriteria);
         }
-        Query queryFormat = new Query(criteria);
         // in查询
         if (CollectionUtils.isNotEmpty(_statuses)) {
-            queryFormat.addCriteria(Criteria.where("status").in(_statuses));
+            criteria.and("status").in(_statuses);
         }
+        Query queryFormat = new Query(criteria);
         // 总记录数
         long total = mongoTemplate.count(queryFormat, SckwWaybillOrder.class);
         queryFormat.with(PageRequest.of(query.getPage() - 1, query.getPageSize(),
@@ -926,6 +926,8 @@ public class WaybillManagementService {
         if (status.equals("finish")) {
             _list.add(CarWaybillEnum.COMPLETION_UNLOADING.getCode().longValue());
             _list.add(CarWaybillEnum.APPROVAL_PASS.getCode().longValue());
+            _list.add(CarWaybillEnum.APPROVAL_NO_PASS.getCode().longValue());
+            _list.add(CarWaybillEnum.APPROVAL_IN.getCode().longValue());
         }
         return _list;
     }