瀏覽代碼

运价管理相关

yzc 1 年之前
父節點
當前提交
da41afe608

+ 73 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/controller/KwmLineFreightRateController.java

@@ -0,0 +1,73 @@
+package com.sckw.manage.controller;
+
+import com.sckw.core.annotation.RepeatSubmit;
+import com.sckw.core.exception.CustomPromptException;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.response.HttpResult;
+import com.sckw.excel.utils.ExcelUtil;
+import com.sckw.manage.model.vo.req.AddLineFreightRateParam;
+import com.sckw.manage.model.vo.req.ExportLineFreightRateParam;
+import com.sckw.manage.model.vo.req.SelectLineFreightRateParam;
+import com.sckw.manage.model.vo.req.UpdateLineFreightRateParam;
+import com.sckw.manage.model.vo.res.LineFreightRateExport;
+import com.sckw.manage.service.KwmLineFreightRateService;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  09:20
+ * @desc: 线路运价管理
+ */
+@RestController
+@RequestMapping(value = "/kwmLineFreightRate")
+@RequiredArgsConstructor
+public class KwmLineFreightRateController {
+
+    private final KwmLineFreightRateService lineFreightRateService;
+
+    @PostMapping(value = "/add", produces = MediaType.APPLICATION_JSON_VALUE)
+    @RepeatSubmit(interval = 1000, message = "前方拥堵,请稍后尝试")
+    public HttpResult add(@RequestBody @Validated AddLineFreightRateParam addLineFreightRateParam) {
+        lineFreightRateService.add(addLineFreightRateParam);
+        return HttpResult.ok(" 新增运价成功");
+    }
+
+    @GetMapping("/detail")
+    public HttpResult detail(@RequestParam Long id) {
+        return HttpResult.ok(lineFreightRateService.detail(id));
+    }
+
+    @PostMapping(value = "/update", produces = MediaType.APPLICATION_JSON_VALUE)
+    @RepeatSubmit(interval = 1000, message = "前方拥堵,请稍后尝试")
+    public HttpResult update(@RequestBody @Validated UpdateLineFreightRateParam updateLineFreightRateParam) {
+        lineFreightRateService.update(updateLineFreightRateParam);
+        return HttpResult.ok(" 编辑运价成功");
+    }
+
+    @PostMapping(value = "/select", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult select(@RequestBody SelectLineFreightRateParam params) {
+        return HttpResult.ok(lineFreightRateService.select(params));
+    }
+
+    @PostMapping(value = "/export", produces = MediaType.APPLICATION_JSON_VALUE)
+    public void export(@RequestBody ExportLineFreightRateParam params, HttpServletResponse response) {
+        List<LineFreightRateExport> list = lineFreightRateService.export(params);
+        if (CollectionUtils.isEmpty(list)) {
+            throw new CustomPromptException(HttpStatus.SUCCESS_CODE, "暂无数据,请确认");
+        }
+        ExcelUtil.downData(response, LineFreightRateExport.class, list);
+    }
+
+    @GetMapping("/batchDelete")
+    public HttpResult batchDelete(@RequestParam List<Long> ids) {
+        lineFreightRateService.batchDelete(ids);
+        return HttpResult.ok("批量删除成功");
+    }
+}

+ 15 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/dao/KwmLineFreightRateMapper.java

@@ -0,0 +1,15 @@
+package com.sckw.manage.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.manage.model.entity.KwmLineFreightRate;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @desc: 线路-运价mapper
+ * @author: yzc
+ * @date: 2023-06-25 14:40
+ */
+@Mapper
+public interface KwmLineFreightRateMapper extends BaseMapper<KwmLineFreightRate> {
+
+}

+ 115 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/entity/KwmLineFreightRate.java

@@ -0,0 +1,115 @@
+package com.sckw.manage.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.sckw.core.model.base.BaseModel;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @desc: 线路-运价
+ * @author: yzc
+ * @date: 2024-03-01 9:04
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@TableName("kwm_line_freight_rate")
+public class KwmLineFreightRate extends BaseModel implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -4571752839456202179L;
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 线路名称
+     */
+    private String name;
+
+    /**
+     * 起始地_名称
+     */
+    private String loadName;
+
+    /**
+     * 起始地-所在地区
+     */
+    private Integer loadCityCode;
+
+    /**
+     * 起始地-所属区域名称
+     */
+    private String loadCityName;
+
+    /**
+     * 起始地-详细地址
+     */
+    private String loadDetailAddress;
+
+    /**
+     * 起始地-纬度
+     */
+    private String loadLat;
+
+    /**
+     * 起始地-经度
+     */
+    private String loadLng;
+
+    /**
+     * 目的地_名称
+     */
+    private String unloadName;
+
+    /**
+     * 目的地-所在地区
+     */
+    private Integer unloadCityCode;
+
+    /**
+     * 目的地-所属区域名称
+     */
+    private String unloadCityName;
+
+    /**
+     * 目的地-详细地址
+     */
+    private String unloadDetailAddress;
+
+    /**
+     * 目的地-纬度
+     */
+    private String unloadLat;
+
+    /**
+     * 目的地-经度
+     */
+    private String unloadLng;
+
+    /**
+     * 运输里程
+     */
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输总价
+     */
+    private BigDecimal transportAmount;
+
+}

+ 68 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/AddLineFreightRateParam.java

@@ -0,0 +1,68 @@
+package com.sckw.manage.model.vo.req;
+
+import jakarta.validation.constraints.*;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Length;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  09:24
+ * @desc: 添加运价参数
+ */
+@Getter
+@Setter
+@ToString
+public class AddLineFreightRateParam {
+
+
+    /**
+     * 运价名称
+     */
+    @NotBlank(message = "运价名称不能为空")
+    @Length(max = 40, message = "运价名称最多支持50字")
+    private String name;
+
+    /**
+     * 起始地-地址名称
+     */
+    @NotBlank(message = "路径起始位置不能为空")
+    private String loadName;
+
+    /**
+     * 目的地-地址名称
+     */
+    @NotBlank(message = "路径结束位置不能为空")
+    private String unloadName;
+
+    /**
+     * 行驶里程/公里
+     */
+    @NotNull(message = "行驶里程/公里不能为空")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    @Digits(integer = 10, fraction = 6, message = "运输单价格式错误")
+    @DecimalMin(value = "0", message = "运输单价不能小于零")
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输总价
+     */
+    @Digits(integer = 10, fraction = 6, message = "运输总价格式错误")
+    @DecimalMin(value = "0", message = "运输总价不能小于零")
+    private BigDecimal transportAmount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 54 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/ExportLineFreightRateParam.java

@@ -0,0 +1,54 @@
+package com.sckw.manage.model.vo.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.Digits;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  15:00
+ * @desc: 导出运价列表请求参数
+ */
+
+@Getter
+@Setter
+@ToString
+public class ExportLineFreightRateParam {
+
+    /**
+     * 模糊匹配运价名称、路径起始位置、路径结束位置
+     */
+    private String keywords;
+
+    /**
+     * 创建时间开始(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startCreateTime;
+
+    /**
+     * 创建时间结束(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endCreateTime;
+
+    /**
+     * 行驶里程开始
+     */
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    private BigDecimal startMileage;
+
+    /**
+     * 行驶里程结束
+     */
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    private BigDecimal endMileage;
+}

+ 57 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/SelectLineFreightRateParam.java

@@ -0,0 +1,57 @@
+package com.sckw.manage.model.vo.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.sckw.core.model.page.PageRequest;
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.Digits;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  15:00
+ * @desc: 分页查询运价请求参数
+ */
+@Getter
+@Setter
+@ToString
+@EqualsAndHashCode(callSuper = false)
+public class SelectLineFreightRateParam extends PageRequest {
+
+    /**
+     * 模糊匹配运价名称、路径起始位置、路径结束位置
+     */
+    private String keywords;
+
+    /**
+     * 创建时间开始(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startCreateTime;
+
+    /**
+     * 创建时间结束(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endCreateTime;
+
+    /**
+     * 行驶里程开始
+     */
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    private BigDecimal startMileage;
+
+    /**
+     * 行驶里程结束
+     */
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    private BigDecimal endMileage;
+
+}

+ 75 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/UpdateLineFreightRateParam.java

@@ -0,0 +1,75 @@
+package com.sckw.manage.model.vo.req;
+
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.Digits;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Length;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  14:34
+ * @desc: 编辑运价参数
+ */
+@Getter
+@Setter
+@ToString
+public class UpdateLineFreightRateParam {
+
+    /**
+     * 运价id
+     */
+    @NotNull(message = "运价id不能为空")
+    private Long id;
+
+    /**
+     * 运价名称
+     */
+    @NotBlank(message = "运价名称不能为空")
+    @Length(max = 40, message = "运价名称最多支持50字")
+    private String name;
+
+    /**
+     * 起始地-地址名称
+     */
+    @NotBlank(message = "路径起始位置不能为空")
+    private String loadName;
+
+    /**
+     * 目的地-地址名称
+     */
+    @NotBlank(message = "路径结束位置不能为空")
+    private String unloadName;
+
+    /**
+     * 行驶里程/公里
+     */
+    @NotNull(message = "行驶里程/公里不能为空")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    @Digits(integer = 10, fraction = 6, message = "运输单价格式错误")
+    @DecimalMin(value = "0", message = "运输单价不能小于零")
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输总价
+     */
+    @Digits(integer = 10, fraction = 6, message = "运输总价格式错误")
+    @DecimalMin(value = "0", message = "运输总价不能小于零")
+    private BigDecimal transportAmount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 61 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/LineFreightRateDetail.java

@@ -0,0 +1,61 @@
+package com.sckw.manage.model.vo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  11:16
+ * @desc: 运价详情
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class LineFreightRateDetail {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 线路名称
+     */
+    private String name;
+
+    /**
+     * 起始地_名称
+     */
+    private String loadName;
+
+    /**
+     * 目的地_名称
+     */
+    private String unloadName;
+
+    /**
+     * 运输里程
+     */
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输总价
+     */
+    private BigDecimal transportAmount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 53 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/LineFreightRateExport.java

@@ -0,0 +1,53 @@
+package com.sckw.manage.model.vo.res;
+
+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: yzc
+ * @date: 2024-03-01  15:02
+ * @desc: 运价列表信息
+ */
+@Data
+@Accessors(chain = true)
+@ExcelContext(fileName = "运价列表信息", sheetName = "运价列表信息")
+public class LineFreightRateExport implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 6529061725929970732L;
+
+    @ExcelProperty(value = "运价名称")
+    private String name;
+
+    @ExcelProperty(value = "路径起始位置")
+    private String loadName;
+
+    @ExcelProperty(value = "路径结束位置")
+    private String unloadName;
+
+    @ExcelProperty(value = "行驶里程/公里")
+    private String transportMileage;
+
+    @ExcelProperty(value = "运输单价/元")
+    private String transportPrice;
+
+    @ExcelProperty(value = "运输总价/元")
+    private String transportAmount;
+
+    @ExcelProperty(value = "创建人")
+    private String createByName;
+
+    @ExcelProperty(value = "创建时间")
+    private String createTime;
+
+    @ExcelProperty(value = "更新时间")
+    private String updateTime;
+
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+}

+ 86 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/LineFreightRateListResVO.java

@@ -0,0 +1,86 @@
+package com.sckw.manage.model.vo.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  16:02
+ * @desc: 运价列表响应vo
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class LineFreightRateListResVO {
+
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 线路名称
+     */
+    private String name;
+
+    /**
+     * 起始地_名称
+     */
+    private String loadName;
+
+    /**
+     * 目的地_名称
+     */
+    private String unloadName;
+
+    /**
+     * 运输里程
+     */
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输总价
+     */
+    private BigDecimal transportAmount;
+
+    /**
+     * 创建人id
+     */
+    private Long createBy;
+
+    /**
+     * 创建人姓名
+     */
+    private String createByName;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 21 - 6
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmAddressService.java

@@ -33,7 +33,6 @@ import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.stream.function.StreamBridge;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -94,7 +93,7 @@ public class KwmAddressService {
             }
         }
 
-        List<KwmAddress> kwmAddressList = findList(reqVo,authEntIdList);
+        List<KwmAddress> kwmAddressList = findList(reqVo, authEntIdList);
         if (CollectionUtils.isEmpty(kwmAddressList)) {
             return PageHelperUtil.getPageResult(new PageInfo<>());
         }
@@ -109,10 +108,10 @@ public class KwmAddressService {
      * @author: czh
      * @date: 2023/7/12
      */
-    private List<KwmAddress> findList(AddressQueryReqVo reqVo,List<Long> authEntIdList ) {
+    private List<KwmAddress> findList(AddressQueryReqVo reqVo, List<Long> authEntIdList) {
         LambdaQueryWrapper<KwmAddress> wrapper = new LambdaQueryWrapper<>();
-        if (CollectionUtils.isNotEmpty(authEntIdList)){
-            wrapper.in(KwmAddress::getEntId,authEntIdList);
+        if (CollectionUtils.isNotEmpty(authEntIdList)) {
+            wrapper.in(KwmAddress::getEntId, authEntIdList);
         }
         wrapper.in(Objects.nonNull(reqVo.getCityCode()), KwmAddress::getCityCode, reqVo.getCityCodeList()).
                 eq(Objects.nonNull(reqVo.getType()), KwmAddress::getType, reqVo.getType()).
@@ -398,7 +397,7 @@ public class KwmAddressService {
                 authEntIdList.addAll(ids);
             }
         }
-        List<KwmAddress> kwmAddressList = findList(reqVo,authEntIdList);
+        List<KwmAddress> kwmAddressList = findList(reqVo, authEntIdList);
         if (CollectionUtils.isEmpty(kwmAddressList)) {
             throw new SystemException(HttpStatus.SUCCESS_CODE, "暂无数据,请确认!");
         }
@@ -464,4 +463,20 @@ public class KwmAddressService {
         return addressDetailResVo;
     }
 
+    /**
+     * @desc 根据id及企业id查询未删除的地址信息
+     * @param name
+     * @param entId
+     * @return com.sckw.manage.model.entity.KwmAddress
+     * @author yzc
+     * @date 2024/3/1 10:53
+     */
+    public KwmAddress getByNameAndEntId(String name, Long entId) {
+        LambdaQueryWrapper<KwmAddress> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwmAddress::getName, name)
+                .eq(KwmAddress::getEntId, entId)
+                .eq(KwmAddress::getDelFlag, Global.NO)
+                .last("LIMIT 1");
+        return kwmAddressMapper.selectOne(wrapper);
+    }
 }

+ 313 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmLineFreightRateService.java

@@ -0,0 +1,313 @@
+package com.sckw.manage.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sckw.core.exception.BusinessException;
+import com.sckw.core.model.constant.Global;
+import com.sckw.core.model.page.PageResult;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.StringUtils;
+import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.excel.utils.DateUtil;
+import com.sckw.manage.dao.KwmLineFreightRateMapper;
+import com.sckw.manage.model.entity.KwmAddress;
+import com.sckw.manage.model.entity.KwmLineFreightRate;
+import com.sckw.manage.model.vo.req.AddLineFreightRateParam;
+import com.sckw.manage.model.vo.req.ExportLineFreightRateParam;
+import com.sckw.manage.model.vo.req.SelectLineFreightRateParam;
+import com.sckw.manage.model.vo.req.UpdateLineFreightRateParam;
+import com.sckw.manage.model.vo.res.LineFreightRateDetail;
+import com.sckw.manage.model.vo.res.LineFreightRateExport;
+import com.sckw.manage.model.vo.res.LineFreightRateListResVO;
+import com.sckw.system.api.RemoteSystemService;
+import com.sckw.system.api.model.dto.res.UserCacheResDto;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  09:18
+ * @desc: 线路-运价service
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class KwmLineFreightRateService {
+
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteSystemService remoteSystemService;
+
+    private final KwmLineFreightRateMapper lineFreightRateMapper;
+    private final KwmAddressService addressService;
+
+    /**
+     * @param addLineFreightRateParam
+     * @return void
+     * @desc 新增运价
+     * @author yzc
+     * @date 2024/3/1 11:14
+     */
+    public void add(AddLineFreightRateParam addLineFreightRateParam) {
+        if (Objects.nonNull(addLineFreightRateParam.getTransportPrice()) && Objects.nonNull(addLineFreightRateParam.getTransportAmount())) {
+            BigDecimal amount = addLineFreightRateParam.getTransportMileage().multiply(addLineFreightRateParam.getTransportPrice())
+                    .setScale(6, RoundingMode.HALF_UP);
+            if (amount.compareTo(addLineFreightRateParam.getTransportAmount()) != 0) {
+                throw new BusinessException("运输单价*运输里程不等于运输总价!");
+            }
+        }
+        if (Objects.nonNull(addLineFreightRateParam.getTransportPrice()) && Objects.isNull(addLineFreightRateParam.getTransportAmount())) {
+            throw new BusinessException("运输总价不能为空");
+        }
+        if (Objects.isNull(addLineFreightRateParam.getTransportPrice()) && Objects.nonNull(addLineFreightRateParam.getTransportAmount())) {
+            throw new BusinessException("运输单价不能为空");
+        }
+
+        Long entId = LoginUserHolder.getEntId();
+        Long count = countByEntIdAndName(entId, addLineFreightRateParam.getName(), null);
+        if (count > 0) {
+            throw new BusinessException("运价名称已存在,不可重复!");
+        }
+        KwmAddress load = addressService.getByNameAndEntId(addLineFreightRateParam.getLoadName(), entId);
+        if (Objects.isNull(load)) {
+            throw new BusinessException("路径起始位置信息不存在!");
+        }
+        KwmAddress unload = addressService.getByNameAndEntId(addLineFreightRateParam.getUnloadName(), entId);
+        if (Objects.isNull(unload)) {
+            throw new BusinessException("路径结束位置信息不存在!");
+        }
+        KwmLineFreightRate freightRate = BeanUtil.copyProperties(addLineFreightRateParam, KwmLineFreightRate.class);
+        freightRate.setEntId(entId).setLoadName(load.getName()).setLoadCityCode(load.getCityCode())
+                .setLoadCityName(load.getCityName()).setLoadDetailAddress(load.getDetailAddress())
+                .setLoadLng(load.getLng()).setLoadLat(load.getLat())
+                .setUnloadName(unload.getName()).setUnloadCityCode(unload.getCityCode())
+                .setUnloadCityName(unload.getCityName()).setUnloadDetailAddress(unload.getDetailAddress())
+                .setUnloadLng(unload.getLng()).setUnloadLat(unload.getLat());
+        lineFreightRateMapper.insert(freightRate);
+    }
+
+    /**
+     * @param param
+     * @return void
+     * @desc 编辑运价
+     * @author yzc
+     * @date 2024/3/1 14:37
+     */
+    public void update(UpdateLineFreightRateParam param) {
+        Long entId = LoginUserHolder.getEntId();
+        if (Objects.nonNull(param.getTransportPrice()) && Objects.nonNull(param.getTransportAmount())) {
+            BigDecimal amount = param.getTransportMileage().multiply(param.getTransportPrice())
+                    .setScale(6, RoundingMode.HALF_UP);
+            if (amount.compareTo(param.getTransportAmount()) != 0) {
+                throw new BusinessException("运输单价*运输里程不等于运输总价!");
+            }
+        }
+        if (Objects.nonNull(param.getTransportPrice()) && Objects.isNull(param.getTransportAmount())) {
+            throw new BusinessException("运输总价不能为空");
+        }
+        if (Objects.isNull(param.getTransportPrice()) && Objects.nonNull(param.getTransportAmount())) {
+            throw new BusinessException("运输单价不能为空");
+        }
+        KwmLineFreightRate lineFreightRate = getById(param.getId());
+        if (Objects.isNull(lineFreightRate)) {
+            throw new BusinessException("运价信息不存在!");
+        }
+        Long count = countByEntIdAndName(entId, param.getName(), param.getId());
+        if (count > 0) {
+            throw new BusinessException("运价名称已存在,不可重复!");
+        }
+        KwmLineFreightRate freightRate = BeanUtil.copyProperties(param, KwmLineFreightRate.class);
+        String loadName = param.getLoadName();
+        if (!Objects.equals(loadName, lineFreightRate.getLoadName())) {
+            KwmAddress load = addressService.getByNameAndEntId(param.getLoadName(), entId);
+            if (Objects.isNull(load)) {
+                throw new BusinessException("路径起始位置信息不存在!");
+            }
+            freightRate.setLoadName(load.getName()).setLoadCityCode(load.getCityCode())
+                    .setLoadCityName(load.getCityName()).setLoadDetailAddress(load.getDetailAddress())
+                    .setLoadLng(load.getLng()).setLoadLat(load.getLat());
+        }
+        String unloadName = param.getUnloadName();
+        if (!Objects.equals(unloadName, lineFreightRate.getUnloadName())) {
+            KwmAddress unload = addressService.getByNameAndEntId(param.getUnloadName(), entId);
+            if (Objects.isNull(unload)) {
+                throw new BusinessException("路径结束位置信息不存在!");
+            }
+            freightRate.setUnloadName(unload.getName()).setUnloadCityCode(unload.getCityCode())
+                    .setUnloadCityName(unload.getCityName()).setUnloadDetailAddress(unload.getDetailAddress())
+                    .setUnloadLng(unload.getLng()).setUnloadLat(unload.getLat());
+        }
+        lineFreightRateMapper.updateById(freightRate);
+    }
+
+    /**
+     * @param id
+     * @return com.sckw.manage.model.vo.res.LineFreightRateDetail
+     * @desc 运价详情
+     * @author yzc
+     * @date 2024/3/1 11:18
+     */
+    public LineFreightRateDetail detail(Long id) {
+        LambdaQueryWrapper<KwmLineFreightRate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(KwmLineFreightRate::getId, id)
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO)
+                .last("LIMIT 1");
+        KwmLineFreightRate freightRate = lineFreightRateMapper.selectOne(queryWrapper);
+        if (Objects.isNull(freightRate)) {
+            throw new BusinessException("运价信息不存在");
+        }
+        return BeanUtil.copyProperties(freightRate, LineFreightRateDetail.class);
+    }
+
+
+    /**
+     * @param params
+     * @return com.sckw.core.model.page.PageResult
+     * @desc 运价分页列表
+     * @author yzc
+     * @date 2024/3/1 16:27
+     */
+    public PageResult select(SelectLineFreightRateParam params) {
+        LambdaQueryWrapper<KwmLineFreightRate> wrapper = buildWrapper(BeanUtil.copyProperties(params, ExportLineFreightRateParam.class));
+        Page<KwmLineFreightRate> page = new Page<>(params.getPage(), params.getPageSize());
+        Page<KwmLineFreightRate> ipage = lineFreightRateMapper.selectPage(page, wrapper);
+        List<KwmLineFreightRate> list = ipage.getRecords();
+        if (CollectionUtils.isEmpty(list)) {
+            return PageResult.build(params.getPage(), params.getPageSize(), ipage.getTotal(), Collections.emptyList());
+        }
+        List<Long> createByIds = list.stream().map(KwmLineFreightRate::getCreateBy).toList();
+        Map<Long, UserCacheResDto> userMap = remoteSystemService.queryUserCacheMapByIds(createByIds);
+        List<LineFreightRateListResVO> result = new ArrayList<>();
+        list.forEach(e -> {
+            LineFreightRateListResVO vo = BeanUtil.copyProperties(e, LineFreightRateListResVO.class);
+            UserCacheResDto user = userMap.get(e.getCreateBy());
+            vo.setCreateByName(Objects.nonNull(user) ? user.getName() : "");
+            result.add(vo);
+        });
+        return PageResult.build(params.getPage(), params.getPageSize(), ipage.getTotal(), result);
+    }
+
+    /**
+     * @param params
+     * @return java.util.List<com.sckw.manage.model.vo.res.LineFreightRateExport>
+     * @desc 运价导出
+     * @author yzc
+     * @date 2024/3/1 16:40
+     */
+    public List<LineFreightRateExport> export(ExportLineFreightRateParam params) {
+        LambdaQueryWrapper<KwmLineFreightRate> wrapper = buildWrapper(params);
+        List<KwmLineFreightRate> list = lineFreightRateMapper.selectList(wrapper);
+        if (CollectionUtils.isEmpty(list)) {
+            return Collections.emptyList();
+        }
+        List<Long> createByIds = list.stream().map(KwmLineFreightRate::getCreateBy).toList();
+        Map<Long, UserCacheResDto> userMap = remoteSystemService.queryUserCacheMapByIds(createByIds);
+        List<LineFreightRateExport> result = new ArrayList<>();
+        list.forEach(e -> {
+            LineFreightRateExport vo = BeanUtil.copyProperties(e, LineFreightRateExport.class);
+            UserCacheResDto user = userMap.get(e.getCreateBy());
+            vo.setCreateByName(Objects.nonNull(user) ? user.getName() : "")
+                    .setTransportMileage(Objects.isNull(e.getTransportMileage()) ? null : String.valueOf(e.getTransportMileage()))
+                    .setTransportMileage(Objects.isNull(e.getTransportPrice()) ? null : String.valueOf(e.getTransportPrice()))
+                    .setTransportMileage(Objects.isNull(e.getTransportAmount()) ? null : String.valueOf(e.getTransportAmount()))
+                    .setTransportMileage(Objects.isNull(e.getCreateTime()) ? null : String.valueOf(DateUtil.getDateTime(e.getCreateTime())))
+                    .setTransportMileage(Objects.isNull(e.getUpdateTime()) ? null : String.valueOf(DateUtil.getDateTime(e.getUpdateTime())));
+            result.add(vo);
+        });
+        return result;
+    }
+
+    /**
+     * @param params
+     * @return com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.sckw.manage.model.entity.KwmLineFreightRate>
+     * @desc 构建运价查询条件
+     * @author yzc
+     * @date 2024/3/1 16:40
+     */
+    private LambdaQueryWrapper<KwmLineFreightRate> buildWrapper(ExportLineFreightRateParam params) {
+        LambdaQueryWrapper<KwmLineFreightRate> wrapper = new LambdaQueryWrapper<>();
+        if (Objects.nonNull(params.getStartCreateTime())) {
+            wrapper.ge(KwmLineFreightRate::getCreateTime, params.getStartCreateTime());
+        }
+        if (Objects.nonNull(params.getEndCreateTime())) {
+            wrapper.le(KwmLineFreightRate::getCreateTime, params.getEndCreateTime());
+        }
+        if (Objects.nonNull(params.getStartMileage())) {
+            wrapper.ge(KwmLineFreightRate::getTransportMileage, params.getStartMileage());
+        }
+        if (Objects.nonNull(params.getEndMileage())) {
+            wrapper.le(KwmLineFreightRate::getTransportMileage, params.getEndMileage());
+        }
+        String keywords = params.getKeywords();
+        if (StringUtils.isNotBlank(keywords)) {
+            wrapper.and(e -> e.like(KwmLineFreightRate::getName, keywords)
+                    .or().like(KwmLineFreightRate::getLoadName, keywords)
+                    .or().like(KwmLineFreightRate::getUnloadName, keywords));
+        }
+        wrapper.eq(KwmLineFreightRate::getEntId, LoginUserHolder.getEntId())
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO)
+                .orderByDesc(KwmLineFreightRate::getCreateTime);
+        return wrapper;
+    }
+
+    /**
+     * @param ids
+     * @return void
+     * @desc 批量删除
+     * @author yzc
+     * @date 2024/3/1 16:41
+     */
+    public void batchDelete(List<Long> ids) {
+        LambdaQueryWrapper<KwmLineFreightRate> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(KwmLineFreightRate::getId, ids)
+                .eq(KwmLineFreightRate::getEntId, LoginUserHolder.getEntId())
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO);
+        List<KwmLineFreightRate> list = lineFreightRateMapper.selectList(wrapper);
+        if (!Objects.equals(ids.size(), list.size())) {
+            throw new BusinessException("删除数据与数据库数据不一致");
+        }
+        LambdaUpdateWrapper<KwmLineFreightRate> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(KwmLineFreightRate::getDelFlag, Global.YES).in(KwmLineFreightRate::getId, ids);
+        lineFreightRateMapper.update(null, updateWrapper);
+    }
+
+    /**
+     * @param entId
+     * @param name
+     * @param id
+     * @return java.lang.Long
+     * @desc 根据企业ID和运价名称统计
+     * @author yzc
+     * @date 2024/3/1 14:50
+     */
+    public Long countByEntIdAndName(Long entId, String name, Long id) {
+        LambdaQueryWrapper<KwmLineFreightRate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(KwmLineFreightRate::getEntId, entId)
+                .ne(Objects.nonNull(id), KwmLineFreightRate::getId, id)
+                .eq(KwmLineFreightRate::getName, name)
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO);
+        return lineFreightRateMapper.selectCount(queryWrapper);
+    }
+
+    /**
+     * @param id
+     * @return com.sckw.manage.model.entity.KwmLineFreightRate
+     * @desc 根据id查询运价信息
+     * @author yzc
+     * @date 2024/3/1 16:41
+     */
+    public KwmLineFreightRate getById(Long id) {
+        LambdaQueryWrapper<KwmLineFreightRate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(KwmLineFreightRate::getId, id)
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO);
+        return lineFreightRateMapper.selectOne(queryWrapper);
+    }
+
+}