Răsfoiți Sursa

业务数据

18782137998 1 an în urmă
părinte
comite
7fd73c09e7
20 a modificat fișierele cu 1260 adăugiri și 74 ștergeri
  1. 2 0
      src/main/java/com/sckw/freight/FreightApplication.java
  2. 114 71
      src/main/java/com/sckw/freight/controller/IndexController.java
  3. 75 0
      src/main/java/com/sckw/freight/controller/LedgerController.java
  4. 2 1
      src/main/java/com/sckw/freight/entity/freight/KwpLedgerLogistics.java
  5. 1 1
      src/main/java/com/sckw/freight/entity/kll/KllOrder.java
  6. 40 0
      src/main/java/com/sckw/freight/model/enums/DelFlagEnum.java
  7. 43 0
      src/main/java/com/sckw/freight/model/enums/KwpLedgerLogisticsStatusEnum.java
  8. 40 0
      src/main/java/com/sckw/freight/model/enums/LedgerLogisticsOrderStatusEnum.java
  9. 33 0
      src/main/java/com/sckw/freight/model/enums/OrderExecutionStatusEnum.java
  10. 49 0
      src/main/java/com/sckw/freight/model/enums/OrderStatusEnum.java
  11. 43 0
      src/main/java/com/sckw/freight/model/vo/request/RequestLedgerLogisticsPageInfo.java
  12. 43 0
      src/main/java/com/sckw/freight/model/vo/request/RequestSaveLedgerLogisticsInfo.java
  13. 122 0
      src/main/java/com/sckw/freight/model/vo/response/ResponseKllOrderTask.java
  14. 68 0
      src/main/java/com/sckw/freight/model/vo/response/ResponseLedgerLogistics.java
  15. 1 0
      src/main/java/com/sckw/freight/model/vo/response/ResponsePageData.java
  16. 32 0
      src/main/java/com/sckw/freight/service/freight/IKwpLedgerLogisticsService.java
  17. 350 0
      src/main/java/com/sckw/freight/service/freight/impl/KwpLedgerLogisticsServiceImpl.java
  18. 182 0
      src/main/java/com/sckw/freight/util/SnowflakeIdUtil.java
  19. 20 1
      src/main/resources/application-dev.yml
  20. 0 0
      src/main/resources/com/sckw/freight/mapper/freight/ILedgerSettlementService.xml

+ 2 - 0
src/main/java/com/sckw/freight/FreightApplication.java

@@ -1,6 +1,8 @@
 package com.sckw.freight;
 
+import com.sckw.freight.service.freight.IKwpLedgerLogisticsService;
 import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 

+ 114 - 71
src/main/java/com/sckw/freight/controller/IndexController.java

@@ -1,71 +1,114 @@
-package com.sckw.freight.controller;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.sckw.freight.entity.freight.KwpLedgerLogistics;
-import com.sckw.freight.entity.kll.KllOrder;
-import com.sckw.freight.mapper.kll.KllOrderMapper;
-import com.sckw.freight.model.vo.request.RequestPageInfo;
-import com.sckw.freight.model.vo.request.TestModel;
-import com.sckw.freight.model.vo.response.ResponsePageData;
-import com.sckw.freight.service.freight.IKwpLedgerLogisticsService;
-import com.sckw.freight.service.kll.IKllOrderService;
-import com.sckw.freight.util.DateTimeUtil;
-import com.sckw.freight.util.R;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * @Author xucaiqin
- * @date 2023-06-13 09:12:32
- */
-@RestController
-@RequestMapping("/index")
-@Slf4j
-public class IndexController {
-    @Autowired
-    IKwpLedgerLogisticsService iKwpLedgerLogisticsService;
-    @Autowired
-    IKllOrderService iKllOrderService;
-    @Autowired
-    KllOrderMapper kllOrderMapper;
-    @GetMapping("/index")
-    public R<String> index() {
-        return R.ok(DateTimeUtil.formatYMD());
-    }
-
-    @PostMapping("/t1")
-    @ResponseBody
-    public R<TestModel> index(@RequestBody TestModel testModel) {
-        return R.ok(testModel);
-    }
-
-    @GetMapping("/t2")
-    public R<List<KwpLedgerLogistics>> getDbData( ) {
-        List<KwpLedgerLogistics> list = iKwpLedgerLogisticsService.list();
-        return R.ok(list);
-    }
-    @GetMapping("/t3")
-    public R< KllOrder> getkllData( ) {
-         KllOrder  list = iKllOrderService.getById(167);
-        return R.ok(list);
-    }
-
-    @PostMapping("/page")
-    public R<ResponsePageData<KllOrder>> getPageData(@RequestBody RequestPageInfo requestPageInfo) {
-        // 创建分页对象
-        Page<KllOrder> page = new Page<>(requestPageInfo.getPage(), requestPageInfo.getPageSize());
-        // 执行分页查询
-        IPage<KllOrder> orderPage = kllOrderMapper.selectPage(page, null);
-
-        ResponsePageData<KllOrder> responsePageData = new ResponsePageData<>();
-        responsePageData.setPage(orderPage.getCurrent());
-        responsePageData.setPageSize(orderPage.getSize());
-        responsePageData.setList(orderPage.getRecords());
-        responsePageData.setPages(orderPage.getPages());
-        return R.ok(responsePageData);
-    }
-}
+//package com.sckw.freight.controller;
+//
+//import com.baomidou.mybatisplus.core.metadata.IPage;
+//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+//import com.sckw.freight.entity.freight.KwpLedgerLogistics;
+//import com.sckw.freight.entity.kll.KllOrder;
+//import com.sckw.freight.mapper.freight.KwpLedgerLogisticsMapper;
+//import com.sckw.freight.mapper.kll.KllOrderMapper;
+//import com.sckw.freight.model.enums.DelFlagEnum;
+//import com.sckw.freight.model.enums.KwpLedgerLogisticsStatusEnum;
+//import com.sckw.freight.model.vo.request.RequestPageInfo;
+//import com.sckw.freight.model.vo.request.TestModel;
+//import com.sckw.freight.model.vo.response.ResponsePageData;
+//import com.sckw.freight.service.freight.IKwpLedgerLogisticsService;
+//import com.sckw.freight.service.kll.IKllOrderService;
+//import com.sckw.freight.util.DateTimeUtil;
+//import com.sckw.freight.util.R;
+//import com.sckw.freight.util.SnowflakeIdUtil;
+//import io.swagger.v3.oas.annotations.Operation;
+//import io.swagger.v3.oas.annotations.tags.Tag;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.bind.annotation.*;
+//
+//import java.math.BigDecimal;
+//import java.time.LocalDateTime;
+//import java.util.List;
+//
+///**
+// * @Author xucaiqin
+// * @date 2023-06-13 09:12:32
+// */
+//@RestController
+//@RequestMapping("/index")
+//@Slf4j
+//@Tag(name = "测试模块")
+//public class IndexController {
+//    @Autowired
+//    IKwpLedgerLogisticsService iKwpLedgerLogisticsService;
+//    @Autowired
+//    KwpLedgerLogisticsMapper kwpLedgerLogisticsMapper;
+//
+//    @Autowired
+//    IKllOrderService iKllOrderService;
+//    @Autowired
+//    KllOrderMapper kllOrderMapper;
+//
+//    @GetMapping("/index")
+//    public R<String> index() {
+//        KwpLedgerLogistics logistics = iKwpLedgerLogisticsService.getById(275691749186211840l);
+//        KllOrder order = iKllOrderService.getById(871);
+//        return R.ok(DateTimeUtil.formatYMD());
+//    }
+//
+//    @PostMapping("/t1")
+//    @ResponseBody
+//    public R<TestModel> index(@RequestBody TestModel testModel) {
+//        return R.ok(testModel);
+//    }
+//
+//    @GetMapping("/insert")
+//    public R<List<KwpLedgerLogistics>> getDbData() {
+//        KwpLedgerLogistics kwpLedgerLogistics = new KwpLedgerLogistics();
+//        kwpLedgerLogistics.setName("name");
+//        kwpLedgerLogistics.setEntId(1l);
+//        kwpLedgerLogistics.setDeductPrice(BigDecimal.ZERO);
+//        kwpLedgerLogistics.setOrderCount(0);
+//        //运单总额 = 总应收
+//        kwpLedgerLogistics.setTotalPrice(BigDecimal.ZERO);
+//        //不含税金额 = 总应收
+//        kwpLedgerLogistics.setExTaxPrice(kwpLedgerLogistics.getTotalPrice());
+//        //账单结算金额 = 总应收 - 款金额
+//        kwpLedgerLogistics.setSettlePrice(kwpLedgerLogistics.getTotalPrice().subtract(kwpLedgerLogistics.getDeductPrice()));
+//        kwpLedgerLogistics.setLLedgerNo(SnowflakeIdUtil.getInstance().nextStringId());
+//        kwpLedgerLogistics.setRemark("requestSaveLedgerSettlementInfo.getRemark()");
+//        kwpLedgerLogistics.setStatus(KwpLedgerLogisticsStatusEnum.Unpaid.getCode());
+//        //创建人
+//        kwpLedgerLogistics.setCreateBy(1l);
+//        kwpLedgerLogistics.setUpdateBy(1l);
+//        kwpLedgerLogistics.setCreateTime(LocalDateTime.now());
+//        kwpLedgerLogistics.setUpdateTime(LocalDateTime.now());
+//        kwpLedgerLogistics.setDelFlag(DelFlagEnum.NotDelete.getCode());
+//        kwpLedgerLogistics.setId(SnowflakeIdUtil.getInstance().nextId());
+//        int t = kwpLedgerLogisticsMapper.insert(kwpLedgerLogistics);
+//        //boolean isSave = iKwpLedgerLogisticsService.save(kwpLedgerLogistics);
+//
+//
+//        List<KwpLedgerLogistics> list = iKwpLedgerLogisticsService.list();
+//        return R.ok(list);
+//    }
+//
+//    @GetMapping("/t3")
+//    public R<KllOrder> getkllData() {
+//        KllOrder list = iKllOrderService.getById(167);
+//        return R.ok(list);
+//    }
+//
+//    @PostMapping("/page")
+//    @Operation(summary = "分页测试")
+//    public R<ResponsePageData<KllOrder>> getPageData(@RequestBody RequestPageInfo requestPageInfo) {
+//        // 创建分页对象
+//        Page<KllOrder> page = new Page<>(requestPageInfo.getPage(), requestPageInfo.getPageSize());
+//        // 执行分页查询
+//        IPage<KllOrder> orderPage = kllOrderMapper.selectPage(page, null);
+//
+//        ResponsePageData<KllOrder> responsePageData = new ResponsePageData<>();
+//        responsePageData.setPage(orderPage.getCurrent());
+//        responsePageData.setPageSize(orderPage.getSize());
+//        responsePageData.setList(orderPage.getRecords());
+//        responsePageData.setPages(orderPage.getPages());
+//        responsePageData.setTotal(orderPage.getTotal());
+//        return R.ok(responsePageData);
+//    }
+//}

+ 75 - 0
src/main/java/com/sckw/freight/controller/LedgerController.java

@@ -0,0 +1,75 @@
+package com.sckw.freight.controller;
+
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.sckw.freight.model.vo.request.RequestLedgerLogisticsPageInfo;
+import com.sckw.freight.model.vo.request.RequestSaveLedgerLogisticsInfo;
+import com.sckw.freight.model.vo.response.ResponseKllOrderTask;
+import com.sckw.freight.model.vo.response.ResponseLedgerLogistics;
+import com.sckw.freight.model.vo.response.ResponsePageData;
+import com.sckw.freight.service.freight.IKwpLedgerLogisticsService;
+import com.sckw.freight.util.R;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @BelongsProject: Freight-Settlement-Backend
+ * @BelongsPackage: com.sckw.freight.controller
+ * @Author: xj
+ * @CreateTime: 2025-01-10  10:18
+ * @Description: 对账结算
+ * @Version: 1.0
+ */
+@RestController
+@RequestMapping("/ledger")
+@Slf4j
+@Tag(name = "对账结算")
+public class LedgerController {
+    @Autowired
+    IKwpLedgerLogisticsService iKwpLedgerLogisticsService;
+
+    /**
+     * 保存对账结算 并发起支付
+     *
+     * @return
+     */
+    @PostMapping("/add")
+    @Operation(summary = "保存对账物流单并发起支付")
+    public R<String> add(@RequestBody RequestSaveLedgerLogisticsInfo requestSaveLedgerSettlementInfo) {
+        return iKwpLedgerLogisticsService.saveLedgerLogistics(requestSaveLedgerSettlementInfo);
+    }
+
+    /**
+     * 分页查询对账单
+     *
+     * @return
+     */
+    @PostMapping("/list")
+    @Operation(summary = "分页查询对账单")
+    public R<ResponsePageData<ResponseLedgerLogistics>> list(@RequestBody RequestLedgerLogisticsPageInfo requestPageInfo) {
+        return iKwpLedgerLogisticsService.queryLedgerLogistics(requestPageInfo);
+    }
+
+    /**
+     * 根据对账单id查询运单列表信息
+     *
+     * @return
+     */
+    @GetMapping("/queryOrderTaskListByLedgerLogisticsId")
+    @Operation(summary = "根据对账单id查询运单列表信息")
+    @DynamicResponseParameters(name = "queryOrderTaskListByLedgerLogisticsId",properties = {
+            @DynamicParameter(name = "ledgerLogisticsId",value = "对账单id"),
+            @DynamicParameter(name = "entId",value = "企业id"),
+    })
+    public R<List<ResponseKllOrderTask>> queryOrderTaskListByLedgerLogisticsId(
+            @RequestParam(value = "ledgerLogisticsId", required = true) Long ledgerLogisticsId,
+            @RequestParam(value = "entId", required = true) Long entId) {
+        return iKwpLedgerLogisticsService.queryOrderTaskListByLedgerLogisticsId(ledgerLogisticsId, entId);
+    }
+}

+ 2 - 1
src/main/java/com/sckw/freight/entity/freight/KwpLedgerLogistics.java

@@ -148,7 +148,8 @@ public class KwpLedgerLogistics implements Serializable {
     private String remark;
 
     /**
-     * 状态(1-已保存、2-待对账、3-已对账、4-已完成、5-已退回 6-已撤回)
+     * 4.0 状态(1-已保存、2-待对账、3-已对账、4-已完成、5-已退回 6-已撤回)
+     * 数货运结 (1-待支付,2-部分支付,3-已支付)
      */
     private Integer status;
 

+ 1 - 1
src/main/java/com/sckw/freight/entity/kll/KllOrder.java

@@ -165,7 +165,7 @@ public class KllOrder implements Serializable {
 2:执行中
 3:开始结算
      */
-    private Boolean executionStatus;
+    private Integer executionStatus;
 
     /**
      * 任务完成率

+ 40 - 0
src/main/java/com/sckw/freight/model/enums/DelFlagEnum.java

@@ -0,0 +1,40 @@
+package com.sckw.freight.model.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @BelongsProject: Freight-Settlement-Backend
+ * @BelongsPackage: com.sckw.freight.model.enums
+ * @Author: xj
+ * @CreateTime: 2025-01-10  15:04
+ * @Description: 删除标记
+ * @Version: 1.0
+ */
+@Getter
+@AllArgsConstructor
+public enum DelFlagEnum {
+    NotDelete(0, "未删除"),
+    Deleted (1, "删除");
+    private final Integer code;
+    private final String msg;
+
+    public static String getMsg(Integer code) {
+        for (DelFlagEnum ele : DelFlagEnum.values()) {
+            if (ele.getCode().equals(code)) {
+                return ele.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<DelFlagEnum> getSortList() {
+        DelFlagEnum[] enums = DelFlagEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(DelFlagEnum::getCode)).collect(Collectors.toList());
+    }
+}

+ 43 - 0
src/main/java/com/sckw/freight/model/enums/KwpLedgerLogisticsStatusEnum.java

@@ -0,0 +1,43 @@
+package com.sckw.freight.model.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @BelongsProject: Freight-Settlement-Backend
+ * @BelongsPackage: com.sckw.freight.model.enums
+ * @Author: xj
+ * @CreateTime: 2025-01-10  15:00
+ * @Description: 对账单状态
+ * @Version: 1.0
+ */
+
+@Getter
+@AllArgsConstructor
+public enum KwpLedgerLogisticsStatusEnum {
+
+    Unpaid (1, "待支付"),
+    PartialPaid (2, "部分支付"),
+    Paid (3, "已支付");
+    private final Integer code;
+    private final String msg;
+
+    public static String getMsg(Integer code) {
+        for (KwpLedgerLogisticsStatusEnum ele : KwpLedgerLogisticsStatusEnum.values()) {
+            if (ele.getCode().equals(code)) {
+                return ele.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<KwpLedgerLogisticsStatusEnum> getSortList() {
+        KwpLedgerLogisticsStatusEnum[] enums = KwpLedgerLogisticsStatusEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(KwpLedgerLogisticsStatusEnum::getCode)).collect(Collectors.toList());
+    }
+}

+ 40 - 0
src/main/java/com/sckw/freight/model/enums/LedgerLogisticsOrderStatusEnum.java

@@ -0,0 +1,40 @@
+package com.sckw.freight.model.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @BelongsProject: Freight-Settlement-Backend
+ * @BelongsPackage: com.sckw.freight.model.enums
+ * @Author: xj
+ * @CreateTime: 2025-01-10  16:32
+ * @Description: 对账物流单关联 订单状态  0正常、1已锁
+ * @Version: 1.0
+ */
+@Getter
+@AllArgsConstructor
+public enum LedgerLogisticsOrderStatusEnum {
+    Normal(0, "正常"),
+    Locked (1, "已锁");
+    private final Integer code;
+    private final String msg;
+
+    public static String getMsg(Integer code) {
+        for (LedgerLogisticsOrderStatusEnum ele : LedgerLogisticsOrderStatusEnum.values()) {
+            if (ele.getCode().equals(code)) {
+                return ele.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<LedgerLogisticsOrderStatusEnum> getSortList() {
+        LedgerLogisticsOrderStatusEnum[] enums = LedgerLogisticsOrderStatusEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(LedgerLogisticsOrderStatusEnum::getCode)).collect(Collectors.toList());
+    }
+}

+ 33 - 0
src/main/java/com/sckw/freight/model/enums/OrderExecutionStatusEnum.java

@@ -0,0 +1,33 @@
+package com.sckw.freight.model.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+@Getter
+@AllArgsConstructor
+public enum OrderExecutionStatusEnum {
+    WaitingExecution(0, "等待执行"),
+    ExecutionSuccess (1, "执行成功"),
+    BeingExecuted (2, "正在执行"),
+    Settlement (3, "开始结算");
+    private final Integer code;
+    private final String msg;
+
+    public static String getMsg(Integer code) {
+        for (OrderExecutionStatusEnum ele : OrderExecutionStatusEnum.values()) {
+            if (ele.getCode().equals(code)) {
+                return ele.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<OrderExecutionStatusEnum> getSortList() {
+        OrderExecutionStatusEnum[] enums = OrderExecutionStatusEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(OrderExecutionStatusEnum::getCode)).collect(Collectors.toList());
+    }
+}

+ 49 - 0
src/main/java/com/sckw/freight/model/enums/OrderStatusEnum.java

@@ -0,0 +1,49 @@
+package com.sckw.freight.model.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @desc: 订单状态枚举
+ * @author: yzc
+ * @date: 2023-09-18 15:32
+ */
+@Getter
+@AllArgsConstructor
+public enum OrderStatusEnum {
+
+    /**
+     * 订单状态枚举
+     */
+    SAVED(0, "已保存"),
+    WAIT_ACCEPTED(1, "待受理"),
+    RETURNED(2, "已退回"),
+    WAIT_SIGNED(3, "待签约"),
+    EXECUTING(4, "执行中"),
+    FINISHED(5, "已完结"),
+    RECONCILED(6, "已对账"),
+    SETTLED(7, "已结算");
+
+    private final Integer code;
+    private final String msg;
+
+    public static String getMsg(Integer code) {
+        for (OrderStatusEnum ele : OrderStatusEnum.values()) {
+            if (ele.getCode().equals(code)) {
+                return ele.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<OrderStatusEnum> getSortList() {
+        OrderStatusEnum[] enums = OrderStatusEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(OrderStatusEnum::getCode)).collect(Collectors.toList());
+    }
+
+}

+ 43 - 0
src/main/java/com/sckw/freight/model/vo/request/RequestLedgerLogisticsPageInfo.java

@@ -0,0 +1,43 @@
+package com.sckw.freight.model.vo.request;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @BelongsProject: Freight-Settlement-Backend
+ * @BelongsPackage: com.sckw.freight.model.vo.request
+ * @Author: xj
+ * @CreateTime: 2025-01-10  16:47
+ * @Description: 对账单分页查询
+ * @Version: 1.0
+ */
+@Data
+public class RequestLedgerLogisticsPageInfo extends RequestPageInfo {
+
+    /**
+     * 物流对账单编号
+     */
+    private String lLedgerNo;
+
+    /**
+     * 对账单名称
+     */
+    private String name;
+    /**
+     * 对账单状态
+     */
+    private Integer status;
+    /**
+     * 创建时间 ["2025-01-09","2025-01-09"]
+     */
+    private LocalDateTime[] createTime;
+    /**
+     * 更新时间 ["2025-01-09","2025-01-09"]
+     */
+    private LocalDateTime[] updateTime;
+    /**
+     * 企业id
+     */
+    private Long entId;
+}

+ 43 - 0
src/main/java/com/sckw/freight/model/vo/request/RequestSaveLedgerLogisticsInfo.java

@@ -0,0 +1,43 @@
+package com.sckw.freight.model.vo.request;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @BelongsProject: Freight-Settlement-Backend
+ * @BelongsPackage: com.sckw.freight.model.vo.request
+ * @Author: xj
+ * @CreateTime: 2025-01-10  10:43
+ * @Description: 新建对账单信息
+ * @Version: 1.0
+ */
+@Data
+public class RequestSaveLedgerLogisticsInfo {
+    /**
+     * 物流订单ID
+     */
+    private List<Long> orderIds;
+    /**
+     * 对账单名称
+     */
+    private String name;
+    /**
+     * 扣款金额
+     */
+    private BigDecimal deductPrice;
+    /**
+     * 企业id
+     */
+    private Long entId;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 当前登录用户id
+     */
+    private Long userId;
+
+}

+ 122 - 0
src/main/java/com/sckw/freight/model/vo/response/ResponseKllOrderTask.java

@@ -0,0 +1,122 @@
+package com.sckw.freight.model.vo.response;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @BelongsProject: Freight-Settlement-Backend
+ * @BelongsPackage: com.sckw.freight.model.vo.response
+ * @Author: xj
+ * @CreateTime: 2025-01-10  14:49
+ * @Description: 运单信息
+ * @Version: 1.0
+ */
+@Data
+public class ResponseKllOrderTask {
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    /**
+     * 运单号
+     */
+    private String taskNo;
+
+    /**
+     * 订单ID
+     */
+    private Integer orderId;
+
+    /**
+     * 物流公司ID
+     */
+    private Integer logisticId;
+
+    /**
+     * 卡车ID
+     */
+    //private Integer truckId;
+
+    /**
+     * 卡车车牌
+     */
+    private String truckLicensePlate;
+
+    /**
+     * 目标载重(货+车)
+     */
+    //private BigDecimal targetLoad;
+
+    /**
+     * 装载重量/预估装载(货)
+     */
+    //private BigDecimal loaderWeight;
+
+    /**
+     * 0:等待进入厂区
+     * 1:等待首次称重
+     * 2:等待装货
+     * 3:等待二次称重
+     * 4:等待出厂
+     * 5:已出厂
+     */
+    //private Integer truckState;
+
+    /**
+     * 卡车司机
+     */
+    private Integer driverId;
+
+    /**
+     * 卡车司机名
+     */
+    private String driverName;
+
+    /**
+     * 卡车司机电话
+     */
+    private String driverPhone;
+
+    /**
+     * 卡车司机身份正
+     */
+    //private String driverIdcard;
+
+    /**
+     * 进厂记录
+     */
+    //private Integer checkinReleaseId;
+
+    /**
+     * 出厂记录
+     */
+    //private Integer checkoutReleaseId;
+
+    /**
+     * 荷载重量
+     */
+    //private BigDecimal licenseWeight;
+
+    /**
+     * 皮重
+     */
+    //private BigDecimal tareWeight;
+
+    /**
+     * 首次称重
+     */
+    private BigDecimal firstWeight;
+
+    /**
+     * 首次称重时间
+     */
+    //private LocalDateTime firstWeightTime;
+
+    /**
+     * 二次称重
+     */
+    private BigDecimal secondWeight;
+}

+ 68 - 0
src/main/java/com/sckw/freight/model/vo/response/ResponseLedgerLogistics.java

@@ -0,0 +1,68 @@
+package com.sckw.freight.model.vo.response;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @BelongsProject: Freight-Settlement-Backend
+ * @BelongsPackage: com.sckw.freight.model.vo.response
+ * @Author: xj
+ * @CreateTime: 2025-01-10  14:48
+ * @Description: 物流对账单信息
+ * @Version: 1.0
+ */
+@Data
+public class ResponseLedgerLogistics {
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 物流对账单编号
+     */
+    private String lLedgerNo;
+
+    /**
+     * 对账单名称
+     */
+    private String name;
+
+    /**
+     * 4.0 状态(1-已保存、2-待对账、3-已对账、4-已完成、5-已退回 6-已撤回)
+     * 数货运结 (1-待支付,2-部分支付,3-已支付)
+     */
+    private Integer status;
+    /**
+     * 状态名称
+     */
+    private String statusName;
+    /**
+     * 支付比例
+     */
+    private String payRatio;
+    /**
+     * 已收款/元
+     */
+    private BigDecimal actualPrice;
+    /**
+     * 总应收/元
+     */
+    private BigDecimal totalPrice;
+    /**
+     * 创建时间
+     */
+    private String createTime;
+    /**
+     * 更新时间
+     */
+    private String updateTime;
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 1 - 0
src/main/java/com/sckw/freight/model/vo/response/ResponsePageData.java

@@ -1,5 +1,6 @@
 package com.sckw.freight.model.vo.response;
 
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
 import lombok.Data;
 
 import java.util.List;

+ 32 - 0
src/main/java/com/sckw/freight/service/freight/IKwpLedgerLogisticsService.java

@@ -2,6 +2,16 @@ package com.sckw.freight.service.freight;
 
 import com.sckw.freight.entity.freight.KwpLedgerLogistics;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.sckw.freight.model.vo.request.RequestLedgerLogisticsPageInfo;
+import com.sckw.freight.model.vo.request.RequestSaveLedgerLogisticsInfo;
+import com.sckw.freight.model.vo.response.ResponseKllOrderTask;
+import com.sckw.freight.model.vo.response.ResponseLedgerLogistics;
+import com.sckw.freight.model.vo.response.ResponsePageData;
+import com.sckw.freight.util.R;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +22,27 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @since 2025-01-09
  */
 public interface IKwpLedgerLogisticsService extends IService<KwpLedgerLogistics> {
+    /**
+     * 保存对账-物流订单
+     *
+     * @param requestSaveLedgerSettlementInfo
+     * @return
+     */
+    R<String> saveLedgerLogistics(@RequestBody RequestSaveLedgerLogisticsInfo requestSaveLedgerSettlementInfo);
+
+    /**
+     * 查询对账-物流订单
+     *
+     * @param requestPageInfo
+     * @return
+     */
+    R<ResponsePageData<ResponseLedgerLogistics>> queryLedgerLogistics(@RequestBody RequestLedgerLogisticsPageInfo requestPageInfo);
 
+    /**
+     * 根据对账单ID查询运单
+     * @param ledgerLogisticsId
+     * @param entId
+     * @return
+     */
+    R<List<ResponseKllOrderTask>> queryOrderTaskListByLedgerLogisticsId(Long ledgerLogisticsId, Long entId);
 }

+ 350 - 0
src/main/java/com/sckw/freight/service/freight/impl/KwpLedgerLogisticsServiceImpl.java

@@ -1,11 +1,39 @@
 package com.sckw.freight.service.freight.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.sckw.freight.entity.freight.KwpLedgerLogistics;
+import com.sckw.freight.entity.freight.KwpLedgerLogisticsOrder;
+import com.sckw.freight.entity.freight.KwpLedgerLogisticsTrack;
+import com.sckw.freight.entity.kll.KllOrder;
+import com.sckw.freight.entity.kll.KllOrderTask;
 import com.sckw.freight.mapper.freight.KwpLedgerLogisticsMapper;
+import com.sckw.freight.mapper.kll.KllOrderTaskMapper;
+import com.sckw.freight.model.enums.*;
+import com.sckw.freight.model.vo.request.RequestLedgerLogisticsPageInfo;
+import com.sckw.freight.model.vo.request.RequestSaveLedgerLogisticsInfo;
+import com.sckw.freight.model.vo.response.ResponseKllOrderTask;
+import com.sckw.freight.model.vo.response.ResponseLedgerLogistics;
+import com.sckw.freight.model.vo.response.ResponsePageData;
+import com.sckw.freight.service.freight.IKwpLedgerLogisticsOrderService;
 import com.sckw.freight.service.freight.IKwpLedgerLogisticsService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.freight.service.freight.IKwpLedgerLogisticsTrackService;
+import com.sckw.freight.service.kll.IKllOrderService;
+import com.sckw.freight.util.DateTimeUtil;
+import com.sckw.freight.util.R;
+import com.sckw.freight.util.SnowflakeIdUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  * 对账-物流订单 服务实现类
@@ -17,4 +45,326 @@ import org.springframework.stereotype.Service;
 @Service
 public class KwpLedgerLogisticsServiceImpl extends ServiceImpl<KwpLedgerLogisticsMapper, KwpLedgerLogistics> implements IKwpLedgerLogisticsService {
 
+    @Autowired
+    IKllOrderService iKllOrderService;
+    @Autowired
+    IKwpLedgerLogisticsOrderService iKwpLedgerLogisticsOrderService;
+    @Autowired
+    IKwpLedgerLogisticsTrackService iKwpLedgerLogisticsTrackService;
+    @Autowired
+    KwpLedgerLogisticsMapper kwpLedgerLogisticsMapper;
+    @Autowired
+    KllOrderTaskMapper kllOrderTaskMapper;
+
+    /**
+     * 根骨对账单id查询运单
+     *
+     * @param ledgerLogisticsId 对账单id
+     * @param entId             企业id
+     * @return R<List < ResponseKllOrderTask>>
+     * @author xj
+     * @since 2025-01-09
+     */
+    @Override
+    public R<List<ResponseKllOrderTask>> queryOrderTaskListByLedgerLogisticsId(Long ledgerLogisticsId, Long entId) {
+        /**
+         * 1:查对账单 下的订单
+         * 2:查所有订单id下的所有运单
+         */
+        LambdaQueryWrapper<KwpLedgerLogistics> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwpLedgerLogistics::getId, ledgerLogisticsId);
+        wrapper.eq(KwpLedgerLogistics::getEntId, entId);
+        List<KwpLedgerLogistics> records = kwpLedgerLogisticsMapper.selectList(wrapper);
+        if (records == null) records = new ArrayList<>();
+        //查对账单 下的订单
+        LambdaQueryWrapper<KwpLedgerLogisticsOrder> wrapper1 = new LambdaQueryWrapper<>();
+        wrapper1.in(KwpLedgerLogisticsOrder::getLLedgerId, records.stream().map(KwpLedgerLogistics::getId).collect(Collectors.toList()));
+        List<KwpLedgerLogisticsOrder> orders = iKwpLedgerLogisticsOrderService.list(wrapper1);
+        if (orders == null) orders = new ArrayList<>();
+
+        //查询运单
+        LambdaQueryWrapper<KllOrderTask> wrapperOrderTask = new LambdaQueryWrapper<>();
+        wrapperOrderTask.in(KllOrderTask::getOrderId, orders.stream().map(order -> {
+            return order.getId().intValue();
+        }).collect(Collectors.toList()));
+
+        List<KllOrderTask> tasks = kllOrderTaskMapper.selectList(wrapperOrderTask);
+        //组装数据
+        List<ResponseKllOrderTask> responseKllOrderTasks = tasks.stream().map(task -> {
+            ResponseKllOrderTask orderTask = new ResponseKllOrderTask();
+            orderTask.setId(task.getId().intValue());
+            orderTask.setTaskNo(task.getTaskNo());
+            orderTask.setOrderId(task.getOrderId().intValue());
+            orderTask.setLogisticId(task.getLogisticId().intValue());
+            orderTask.setTruckLicensePlate(task.getTruckLicensePlate());
+            orderTask.setDriverId(task.getDriverId().intValue());
+            orderTask.setDriverName(task.getDriverName());
+            orderTask.setDriverPhone(task.getDriverPhone());
+            orderTask.setFirstWeight(task.getFirstWeight());
+            orderTask.setSecondWeight(task.getSecondWeight());
+            return orderTask;
+        }).collect(Collectors.toList());
+
+        return R.ok(responseKllOrderTasks);
+    }
+
+    /**
+     * 查询对账-物流订单
+     *
+     * @param requestPageInfo 查询对账-物流订单参数
+     * @return R<List < ResponseLedgerLogistics>>
+     * @author xj
+     * @since 2025-01-09
+     */
+    @Override
+    public R<ResponsePageData<ResponseLedgerLogistics>> queryLedgerLogistics(RequestLedgerLogisticsPageInfo requestPageInfo) {
+        /**
+         * 1:按照条件分页查询对账单
+         * 2:查询运单
+         * 3:组装数据
+         */
+        LambdaQueryWrapper<KwpLedgerLogistics> wrapper = new LambdaQueryWrapper<>();
+        if (!StringUtils.isEmpty(requestPageInfo.getName())) {
+            wrapper.like(KwpLedgerLogistics::getName, requestPageInfo.getName());
+        }
+        if (!StringUtils.isEmpty(requestPageInfo.getLLedgerNo())) {
+            wrapper.eq(KwpLedgerLogistics::getLLedgerNo, requestPageInfo.getLLedgerNo());
+        }
+        if (requestPageInfo.getStatus() != null) {
+            wrapper.eq(KwpLedgerLogistics::getStatus, requestPageInfo.getStatus());
+        }
+        if (requestPageInfo.getCreateTime() != null && requestPageInfo.getCreateTime().length == 2) {
+            wrapper.ge(KwpLedgerLogistics::getCreateTime, requestPageInfo.getCreateTime()[0]);
+            wrapper.le(KwpLedgerLogistics::getCreateTime, requestPageInfo.getCreateTime()[1]);
+        }
+        if (requestPageInfo.getUpdateTime() != null && requestPageInfo.getUpdateTime().length == 2) {
+            wrapper.ge(KwpLedgerLogistics::getUpdateTime, requestPageInfo.getUpdateTime()[0]);
+            wrapper.le(KwpLedgerLogistics::getUpdateTime, requestPageInfo.getUpdateTime()[1]);
+        }
+        wrapper.eq(KwpLedgerLogistics::getDelFlag, 0);
+        wrapper.eq(KwpLedgerLogistics::getEntId, requestPageInfo.getEntId());
+        wrapper.orderByDesc(KwpLedgerLogistics::getCreateTime);
+
+        // 创建分页对象
+        Page<KwpLedgerLogistics> page = new Page<>(requestPageInfo.getPage(), requestPageInfo.getPageSize());
+        Page<KwpLedgerLogistics> selectPage = kwpLedgerLogisticsMapper.selectPage(page, wrapper);
+        //原数据
+        List<KwpLedgerLogistics> records = selectPage.getRecords();
+        if (records == null) records = new ArrayList<>();
+
+
+        //返回给客户端的数据
+        List<ResponseLedgerLogistics> responseLedgerLogisticsList = records.stream().map(item -> {
+
+            ResponseLedgerLogistics responseLedgerLogistics = new ResponseLedgerLogistics();
+            responseLedgerLogistics.setId(item.getId());
+            responseLedgerLogistics.setLLedgerNo(item.getLLedgerNo());
+            responseLedgerLogistics.setName(item.getName());
+            responseLedgerLogistics.setStatusName(KwpLedgerLogisticsStatusEnum.getMsg(item.getStatus()));
+            responseLedgerLogistics.setTotalPrice(item.getTotalPrice());
+            responseLedgerLogistics.setRemark(item.getRemark());
+            responseLedgerLogistics.setActualPrice(item.getActualPrice());
+            responseLedgerLogistics.setPayRatio(item.getActualPrice().divide(item.getTotalPrice(), 2).toString() + "%");
+            responseLedgerLogistics.setCreateTime(DateTimeUtil.format(item.getCreateTime(), "YYYY-MM-dd HH:mm:ss"));
+            responseLedgerLogistics.setUpdateTime(DateTimeUtil.format(item.getUpdateTime(), "YYYY-MM-dd HH:mm:ss"));
+            responseLedgerLogistics.setStatus(item.getStatus());
+
+            return responseLedgerLogistics;
+        }).collect(Collectors.toList());
+        //组装分页数据
+        ResponsePageData<ResponseLedgerLogistics> responsePageData = new ResponsePageData<>();
+        responsePageData.setPage(selectPage.getCurrent());
+        responsePageData.setPageSize(selectPage.getSize());
+        responsePageData.setTotal(selectPage.getTotal());
+        responsePageData.setPages(selectPage.getPages());
+        responsePageData.setList(responseLedgerLogisticsList);
+        return R.ok(responsePageData);
+    }
+
+    /**
+     * 保存 对账-物流订单  并发起支付
+     *
+     * @param requestSaveLedgerSettlementInfo 保存对账-物流订单参数
+     * @return R<String>
+     * @author xj
+     * @since 2025-01-09
+     */
+    @Override
+    public R<String> saveLedgerLogistics(RequestSaveLedgerLogisticsInfo requestSaveLedgerSettlementInfo) {
+        /**
+         * 1:数据验证
+         * 2:保存对账
+         * 3:保存对账订单
+         * 4:保存对账状态
+         * 5:改订单状态
+         * 6:发起支付
+         */
+        //1:数据验证
+        List<KllOrder> kllOrders = verifySaveLedgerLogisticsInfo(requestSaveLedgerSettlementInfo);
+        //2:保存对账
+        KwpLedgerLogistics kwpLedgerLogistics = savaKwpLedgerLogistics(requestSaveLedgerSettlementInfo, kllOrders);
+        //3:保存对账订单
+        List<KwpLedgerLogisticsOrder> kwpLedgerLogisticsOrders = savaKwpLedgerLogisticsOrder(kwpLedgerLogistics, kllOrders);
+        //4:保存对账状态
+        savaKwpLedgerLogisticsTrack(kwpLedgerLogistics);
+        //5:改订单状态
+        updateKllOrderStatus(kllOrders);
+        return R.ok(kwpLedgerLogistics.getLLedgerNo());
+    }
+
+    /**
+     * 数据验证
+     *
+     * @param requestSaveLedgerSettlementInfo 保存对账-物流订单参数
+     * @return void
+     * @author xj
+     * @since 2025-01-09
+     */
+    private List<KllOrder> verifySaveLedgerLogisticsInfo(RequestSaveLedgerLogisticsInfo requestSaveLedgerSettlementInfo) {
+        if (requestSaveLedgerSettlementInfo == null) {
+            throw new RuntimeException("保存对账单参数为空");
+        }
+        if (requestSaveLedgerSettlementInfo.getOrderIds() == null || requestSaveLedgerSettlementInfo.getOrderIds().size() == 0) {
+            throw new RuntimeException("保存对账单的订单为空");
+        }
+        if (requestSaveLedgerSettlementInfo.getEntId() == null) {
+            throw new RuntimeException("保存对账单的企业id为空");
+        }
+        if (requestSaveLedgerSettlementInfo.getName() == null) {
+            throw new RuntimeException("保存对账单的名称为空");
+        }
+        if (requestSaveLedgerSettlementInfo.getDeductPrice() == null) {
+            requestSaveLedgerSettlementInfo.setDeductPrice(BigDecimal.ZERO);
+        }
+        //不能小于0
+        if (requestSaveLedgerSettlementInfo.getDeductPrice().compareTo(BigDecimal.ZERO) < 0) {
+            throw new RuntimeException("对账单的扣减金额不能小于0");
+        }
+        //验证对应的订单是否在该企业下 ,且状态是完结
+        LambdaQueryWrapper<KllOrder> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(KllOrder::getId, requestSaveLedgerSettlementInfo.getOrderIds());
+        wrapper.eq(KllOrder::getCompanyId, requestSaveLedgerSettlementInfo.getEntId());
+        //wrapper.eq(KllOrder::getStatus, OrderStatusEnum.SAVED);
+        wrapper.eq(KllOrder::getStatus, OrderExecutionStatusEnum.ExecutionSuccess.getCode());
+        List<KllOrder> list = iKllOrderService.list(wrapper);
+        if (list == null || list.size() == 0 || list.size() != requestSaveLedgerSettlementInfo.getOrderIds().size()) {
+            if (list.size() == 0) {
+                throw new RuntimeException("保存对账单的物流订单不存在,请检查物流单所属企业和状态。");
+            }
+            if (list.size() != requestSaveLedgerSettlementInfo.getOrderIds().size()) {
+                throw new RuntimeException("保存对账单的物流订单数量和参数数量不一致,请检查物流单所属企业和状态。");
+            }
+        }
+        //扣减金额不能大于 总金额
+        if (requestSaveLedgerSettlementInfo.getDeductPrice().compareTo(list.stream().map(KllOrder::getTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add)) > 0) {
+            throw new RuntimeException("保存对账单的物流订单扣减金额不能大于 总金额");
+        }
+        return list;
+    }
+
+    /**
+     * 保存对账单
+     *
+     * @param requestSaveLedgerSettlementInfo 保存对账单参数
+     * @return void
+     * @author xj
+     * @since 2025-01-09
+     */
+    private KwpLedgerLogistics savaKwpLedgerLogistics(RequestSaveLedgerLogisticsInfo requestSaveLedgerSettlementInfo, List<KllOrder> orderList) {
+        KwpLedgerLogistics kwpLedgerLogistics = new KwpLedgerLogistics();
+        kwpLedgerLogistics.setName(requestSaveLedgerSettlementInfo.getName());
+        kwpLedgerLogistics.setEntId(requestSaveLedgerSettlementInfo.getEntId());
+        kwpLedgerLogistics.setDeductPrice(requestSaveLedgerSettlementInfo.getDeductPrice());
+        kwpLedgerLogistics.setOrderCount(orderList.size());
+        //运单总额 = 总应收
+        kwpLedgerLogistics.setTotalPrice(orderList.stream().map(KllOrder::getTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add));
+        //不含税金额 = 总应收
+        kwpLedgerLogistics.setExTaxPrice(kwpLedgerLogistics.getTotalPrice());
+        //账单结算金额 = 总应收 - 款金额
+        kwpLedgerLogistics.setSettlePrice(kwpLedgerLogistics.getTotalPrice().subtract(kwpLedgerLogistics.getDeductPrice()));
+        kwpLedgerLogistics.setLLedgerNo(SnowflakeIdUtil.getInstance().nextStringId());
+        kwpLedgerLogistics.setRemark(requestSaveLedgerSettlementInfo.getRemark());
+        kwpLedgerLogistics.setStatus(KwpLedgerLogisticsStatusEnum.Unpaid.getCode());
+        kwpLedgerLogistics.setActualPrice(BigDecimal.ZERO);
+        //创建人
+        kwpLedgerLogistics.setCreateBy(requestSaveLedgerSettlementInfo.getUserId());
+        kwpLedgerLogistics.setUpdateBy(requestSaveLedgerSettlementInfo.getUserId());
+        kwpLedgerLogistics.setCreateTime(LocalDateTime.now());
+        kwpLedgerLogistics.setUpdateTime(LocalDateTime.now());
+        kwpLedgerLogistics.setDelFlag(DelFlagEnum.NotDelete.getCode());
+        kwpLedgerLogistics.setId(SnowflakeIdUtil.getInstance().nextId());
+        boolean isSave = this.save(kwpLedgerLogistics);
+        if (isSave) return kwpLedgerLogistics;
+        throw new RuntimeException("保存对账单失败");
+    }
+
+
+    /**
+     * 保存对账单订单 明细
+     *
+     * @param kwpLedgerLogistics 对账单
+     * @param orderList          物流订单列表
+     * @return void
+     * @author xj
+     * @since 2025-01-09
+     */
+    private List<KwpLedgerLogisticsOrder> savaKwpLedgerLogisticsOrder(KwpLedgerLogistics kwpLedgerLogistics, List<KllOrder> orderList) {
+        //数据组装
+        List<KwpLedgerLogisticsOrder> list = orderList.stream().map(order -> {
+            KwpLedgerLogisticsOrder kwpLedgerLogisticsOrder = new KwpLedgerLogisticsOrder();
+            kwpLedgerLogisticsOrder.setId(SnowflakeIdUtil.getInstance().nextId());
+            kwpLedgerLogisticsOrder.setLLedgerId(kwpLedgerLogistics.getId());
+            kwpLedgerLogisticsOrder.setLOrderId(order.getId().longValue());
+            kwpLedgerLogisticsOrder.setCreateBy(kwpLedgerLogistics.getCreateBy());
+            kwpLedgerLogisticsOrder.setUpdateBy(kwpLedgerLogistics.getUpdateBy());
+            kwpLedgerLogisticsOrder.setCreateTime(kwpLedgerLogistics.getCreateTime());
+            kwpLedgerLogisticsOrder.setUpdateTime(kwpLedgerLogistics.getUpdateTime());
+            kwpLedgerLogisticsOrder.setStatus(LedgerLogisticsOrderStatusEnum.Normal.getCode());
+            kwpLedgerLogisticsOrder.setDelFlag(DelFlagEnum.NotDelete.getCode());
+            kwpLedgerLogisticsOrder.setLOrderNo(order.getOrderNo());
+            return kwpLedgerLogisticsOrder;
+        }).collect(Collectors.toList());
+        boolean isSave = iKwpLedgerLogisticsOrderService.saveBatch(list);
+        if (isSave) return list;
+        throw new RuntimeException("保存对账单-订单明细失败");
+    }
+
+    /**
+     * 保存对账单物流单状态
+     *
+     * @param kwpLedgerLogistics 对账单
+     * @return void
+     * @author xj
+     * @since 2025-01-09
+     */
+    private KwpLedgerLogisticsTrack savaKwpLedgerLogisticsTrack(KwpLedgerLogistics kwpLedgerLogistics) {
+        KwpLedgerLogisticsTrack kwpLedgerLogisticsTrack = new KwpLedgerLogisticsTrack();
+        kwpLedgerLogisticsTrack.setId(SnowflakeIdUtil.getInstance().nextId());
+        kwpLedgerLogisticsTrack.setLLedgerId(kwpLedgerLogistics.getId());
+        kwpLedgerLogisticsTrack.setStatus(0);
+        kwpLedgerLogisticsTrack.setCreateBy(kwpLedgerLogistics.getCreateBy());
+        kwpLedgerLogisticsTrack.setUpdateBy(kwpLedgerLogistics.getUpdateBy());
+        kwpLedgerLogisticsTrack.setCreateTime(kwpLedgerLogistics.getCreateTime());
+        kwpLedgerLogisticsTrack.setUpdateTime(kwpLedgerLogistics.getUpdateTime());
+        kwpLedgerLogisticsTrack.setDelFlag(DelFlagEnum.NotDelete.getCode());
+        boolean isSave = iKwpLedgerLogisticsTrackService.save(kwpLedgerLogisticsTrack);
+        if (isSave) return kwpLedgerLogisticsTrack;
+        throw new RuntimeException("保存对账单物流单状态失败");
+    }
+
+    /**
+     * 更新物流订单状态
+     *
+     * @param orderList 物流订单列表
+     * @return void
+     * @author xj
+     * @since 2025-01-09
+     */
+    private void updateKllOrderStatus(List<KllOrder> orderList) {
+        KllOrder newOrder = new KllOrder();
+        newOrder.setExecutionStatus(OrderExecutionStatusEnum.Settlement.getCode());
+        newOrder.setUpdateTime(LocalDateTime.now());
+        boolean isUpdate = iKllOrderService.update(newOrder, new LambdaQueryWrapper<KllOrder>().in(KllOrder::getId, orderList.stream().map(KllOrder::getId).collect(Collectors.toList())));
+        if (!isUpdate) throw new RuntimeException("更新物流订单状态失败");
+    }
 }

+ 182 - 0
src/main/java/com/sckw/freight/util/SnowflakeIdUtil.java

@@ -0,0 +1,182 @@
+package com.sckw.freight.util;
+
+/**
+ * @BelongsProject: Freight-Settlement-Backend
+ * @BelongsPackage: com.sckw.freight.util
+ * @Author: xj
+ * @CreateTime: 2025-01-10  13:02
+ * @Description: TODO
+ * @Version: 1.0
+ */
+import org.apache.commons.lang3.RandomUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.concurrent.atomic.AtomicLong;
+
+public class SnowflakeIdUtil {
+    private static Logger logger = LoggerFactory.getLogger(SnowflakeIdUtil.class.getName());
+    /** 业务系统上线的时间 2024-10-01 0:0:0,41位最多可以表示约69.7年 */
+    private static final long twepoch = 1727712000000L;
+    /** 毫秒内序列 */
+    private long sequence = 0L;
+    /** 机器ID */
+    private int workerId;
+    /** 上次生成ID的时间戳 */
+    private long lastTimestamp = -1L;
+    private volatile static SnowflakeIdUtil instance = null;
+
+    public void setWorkerId(int workerId) {
+        if (workerId > 1023 || workerId < 0)
+            throw new IllegalArgumentException("workerId must be between 0 and 1023");
+        this.workerId = workerId;
+    }
+
+
+    /**
+     * SnowflakeIdUtil 类的构造函数
+     *
+     * @throws IllegalArgumentException 如果传入的 workerId 或 datacenterId 不在 0 到 31 的范围内,则抛出此异常
+     */
+    private SnowflakeIdUtil() {
+        workerId = getWorkId();
+    }
+
+
+    /**
+     * 获取 SnowflakeIdUtil 的单例对象。
+     * 此方法首先获取工作机器ID和数据中心ID,然后使用这两个ID调用另一个 getInstance 方法来获取 SnowflakeIdUtil 的单例对象。
+     * @return 返回 SnowflakeIdUtil 的单例对象。
+     */
+    public static SnowflakeIdUtil getInstance() {
+        if (instance == null) {
+            synchronized (SnowflakeIdUtil.class) {
+                if (instance == null) {
+                    instance = new SnowflakeIdUtil();
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * workId使用IP生成
+     * @return workId
+     */
+    private int getWorkId() {
+        try {
+            String hostAddress = InetAddress.getLocalHost().getHostAddress();
+            int[] ints = StringUtils.toCodePoints(hostAddress);
+            int sums = 0;
+            for (int b : ints) {
+                sums = sums + b;
+            }
+            return (sums % 1024);
+        } catch (UnknownHostException ex) {
+            ex.printStackTrace();
+            // 失败就随机生成
+            return RandomUtils.nextInt(0, 1024);
+        }
+    }
+
+    public String nextStringId(){
+       return String.valueOf( nextId());
+    }
+    /**
+     * 生成下一个唯一的ID
+     *
+     * @return 下一个唯一的ID
+     * @throws RuntimeException 如果系统时钟回退,则抛出RuntimeException异常
+     */
+    public synchronized long nextId() {
+        long now = getTimestamp(); // 获取时间戳
+        // 时钟回退处理:如果当前时间小于上一次ID生成的时间戳
+        if (now < lastTimestamp) {
+            //最多支持1.5秒以内的回拨(1500毫秒),否则抛出异常
+            long offset = lastTimestamp - now;
+            if(offset<=1500) {
+                try {
+                    offset = offset<<2;//等待2两倍的时间
+                    Thread.sleep(offset);
+                    now = getTimestamp();
+                    //还是小,抛异常
+                    if (now < lastTimestamp) {
+                        throw new RuntimeException(String.format("时钟回拨,无法生成ID %d milliseconds", lastTimestamp - now));
+                    }
+                } catch (InterruptedException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+        // 如果是同一时间生成的,则进行毫秒内序列
+        if (lastTimestamp == now) {
+            //毫秒级顺序号,使用掩码4095取低12位的数,限制自增取值在1~4095之间,(掩码4095表示二进制12位均为1的值,即:1111 1111 1111)
+            sequence = (sequence + 1) & 4095;
+            //溢出
+            if (sequence == 0) {
+                //毫秒内序列溢出,等待到下一毫秒再继续
+                now = getNextMillis(now);
+            }
+        } else {
+            //置0之前,序列号在同一时间并发后自增到这里说明时间不同了,版本号所以置0
+            sequence = 0;
+        }
+        lastTimestamp = now;
+        /*
+         * 长度64位,其中:
+         * 1位符号位,0正数,1负数
+         * 41位毫秒级时间戳,41111111111111111111111111111
+         * 10位机器ID,11 1111 1111
+         * 12位序列号,1111 1111 1111
+         * */
+        long id = ((now - twepoch) << 22) | (workerId << 12) | sequence;
+        return id;
+    }
+
+    /**
+     * 将长整型ID解码为字符串格式
+     *
+     * @param id 需要解码的长整型ID
+     * @return 解码后的字符串,格式为"时间戳\t序列号\t工作机ID\t中心ID"
+     */
+    public static String idDecode(long id) {
+        long sequence = id & 4095; //取低12位的数
+        long workerId = (id >> 10) & 1023;//左移后取低10位的数
+        long time = (id >> 22); //左移后取低41位的数
+        return MessageFormat.format("time:{0,number,#}\treq:{1}\twid:{2}\t{3}"
+                , time
+                , sequence
+                , workerId
+                , getDataTime(time));
+    }
+
+    private static String getDataTime(long timeInterval) {
+        var timestamp = twepoch+timeInterval;
+        var date = new Date(timestamp);
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+        var dtStr = format.format(date);
+        return dtStr;
+    }
+
+
+    protected long getTimestamp() {
+        return System.currentTimeMillis();
+    }
+
+    // 等待下一个毫秒,直到获得新的时间戳
+    protected long getNextMillis(long lastTimestamp) {
+        //logger.info("wait until next millis : "+lastTimestamp);
+        long timestamp = getTimestamp();
+        while (timestamp <= lastTimestamp) {
+            timestamp = getTimestamp();
+        }
+        return timestamp;
+    }
+}
+

+ 20 - 1
src/main/resources/application-dev.yml

@@ -5,7 +5,7 @@ spring:
         initial-size: 2
         max-active: 20
         min-idle: 2
-      #primary: freight
+      primary: freight
       datasource:
         freight:
           driver-class-name: com.mysql.cj.jdbc.Driver
@@ -41,3 +41,22 @@ logging:
 mybatis-plus:
   configuration:
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+# 生产环境不需要配置
+# springdoc-openapi项目配置
+springdoc:
+  swagger-ui:
+    path: /swagger-ui.html
+    tags-sorter: alpha
+    operations-sorter: alpha
+  api-docs:
+    path: /v3/api-docs
+  group-configs:
+    - group: 'default'
+      paths-to-match: '/**'
+      packages-to-scan: com.sckw.freight.controller
+# knife4j的增强配置,不需要增强可以不配
+knife4j:
+  enable: true
+  setting:
+    language: zh_cn

+ 0 - 0
src/main/resources/com/sckw/freight/mapper/freight/KwpSettlementLogisticsTrackMapper.xml → src/main/resources/com/sckw/freight/mapper/freight/ILedgerSettlementService.xml