xucaiqin před 22 hodinami
rodič
revize
7558abbea7
42 změnil soubory, kde provedl 2232 přidání a 0 odebrání
  1. 318 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/controller/KllController.java
  2. 64 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/entity/ApiLog.java
  3. 61 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/entity/ApiPmi.java
  4. 29 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/entity/ApiProductGoods.java
  5. 58 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/entity/ApiUser.java
  6. 29 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/entity/ApiUserPmi.java
  7. 14 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/mapper/ApiLogMapper.java
  8. 14 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/mapper/ApiPmiMapper.java
  9. 14 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/mapper/ApiProductGoodsMapper.java
  10. 14 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/mapper/ApiUserMapper.java
  11. 19 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/mapper/ApiUserPmiMapper.java
  12. 27 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/pojo/LoadInfo.java
  13. 27 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/pojo/LoadPara.java
  14. 24 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/pojo/LoadUser.java
  15. 65 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/pojo/UnloadCar.java
  16. 38 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/pojo/UserPmiDto.java
  17. 15 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/ApiLogService.java
  18. 14 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/ApiPmiService.java
  19. 17 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/ApiUserPmiService.java
  20. 13 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/ApiUserService.java
  21. 117 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/common/BusinessCheck.java
  22. 79 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/common/HeaderCheck.java
  23. 50 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/common/IBusinessCheck.java
  24. 34 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/common/KllService.java
  25. 63 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/common/KllServiceImpl.java
  26. 26 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/impl/ApiLogServiceImpl.java
  27. 16 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/impl/ApiPmiServiceImpl.java
  28. 23 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/impl/ApiUserPmiServiceImpl.java
  29. 25 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/impl/ApiUserServiceImpl.java
  30. 39 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/ApiPage.java
  31. 42 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/ApiUtil.java
  32. 28 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/DateTimeUtil.java
  33. 21 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/DecimalUtil.java
  34. 41 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/IdUtil.java
  35. 164 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/MD5Util.java
  36. 407 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/OkHttpUtils.java
  37. 73 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/R.java
  38. 19 0
      sckw-modules/sckw-transport/src/main/resources/mapper/ApiLogMapper.xml
  39. 19 0
      sckw-modules/sckw-transport/src/main/resources/mapper/ApiPmiMapper.xml
  40. 18 0
      sckw-modules/sckw-transport/src/main/resources/mapper/ApiUserMapper.xml
  41. 26 0
      sckw-modules/sckw-transport/src/main/resources/mapper/ApiUserPmiMapper.xml
  42. 28 0
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtForkliftWaybillOrderMapper.xml

+ 318 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/controller/KllController.java

@@ -0,0 +1,318 @@
+package com.sckw.transport.five.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.sckw.core.exception.ApiException;
+import com.sckw.transport.five.entity.ApiLog;
+import com.sckw.transport.five.entity.ApiUser;
+import com.sckw.transport.five.pojo.LoadInfo;
+import com.sckw.transport.five.pojo.LoadPara;
+import com.sckw.transport.five.pojo.LoadUser;
+import com.sckw.transport.five.pojo.UnloadCar;
+import com.sckw.transport.five.service.ApiLogService;
+import com.sckw.transport.five.service.common.BusinessCheck;
+import com.sckw.transport.five.service.common.KllService;
+import com.sckw.transport.five.util.ApiUtil;
+import com.sckw.transport.five.util.R;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 09:12:32
+ */
+@RestController
+@RequestMapping("/kll")
+@Slf4j
+public class KllController {
+    @Resource
+    private BusinessCheck businessCheck;
+    @Resource
+    private KllService kllService;
+    @Resource
+    private ApiLogService apiLogService;
+
+
+
+    /**
+     * 定时查询待装载车辆集合
+     *
+     * @param productId 产品id
+     * @param request
+     * @param response
+     * @return
+     */
+    @GetMapping("/category/unload/data")
+    public R<List<UnloadCar>> unloadData(HttpServletRequest request, HttpServletResponse response, @RequestParam("productId") List<Long> productId) {
+        //header校验
+        ApiUser apiUser = businessCheck.headerCheck(request);
+        ApiLog reqId = businessCheck.paraCheck(() -> new HashMap<>() {{
+            put(productId, (d) -> {
+                if (Objects.isNull(d)) {
+                    throw new ApiException("产品id不能为空");
+                }
+            });
+        }}).signCheck(() -> new HashMap<>() {{
+            put("key", apiUser.getPriKey());
+            put("productId", JSONObject.toJSONString(productId));
+        }}, request);
+        final Map<String, String> CHINESE_TO_ARABIC = new HashMap<>();
+        CHINESE_TO_ARABIC.put("一", "1");
+        CHINESE_TO_ARABIC.put("二", "2");
+        CHINESE_TO_ARABIC.put("三", "3");
+        CHINESE_TO_ARABIC.put("四", "4");
+        CHINESE_TO_ARABIC.put("五", "5");
+        CHINESE_TO_ARABIC.put("六", "6");
+        CHINESE_TO_ARABIC.put("七", "7");
+        CHINESE_TO_ARABIC.put("八", "8");
+        CHINESE_TO_ARABIC.put("九", "9");
+        /*业务*/
+        List<UnloadCar> unloadCars = kllService.unloadCar(productId);
+        unloadCars.forEach(d -> {
+            if (StringUtils.contains(d.getModelStr(), "轴车")) {
+                int i = StringUtils.indexOf(d.getModelStr(), "轴车");
+                if (i != -1 && i != 0) {
+                    d.setModelStr(CHINESE_TO_ARABIC.get(StringUtils.substring(d.getModelStr(), i - 1, i)));
+                }
+            }
+        });
+        //返回值增加签名
+        R<List<UnloadCar>> ok = R.ok(unloadCars, "查询成功!");
+        String signType = request.getHeader(ApiUtil.ApiConstant.SignType.getCode());
+        long time = System.currentTimeMillis() / 1000;
+        String account = request.getHeader(ApiUtil.ApiConstant.account.getCode());
+        String sign = businessCheck.resSign(() -> new HashMap<>() {{
+            put("signType", signType);
+            put("account", account);
+            put("time", String.valueOf(time));
+            put("array", JSONObject.toJSONString(unloadCars));
+            put("key", apiUser.getPriKey());
+        }});
+        ok.setSign(sign);
+        response.setHeader("timestamp", String.valueOf(time));
+        reqId.setResData(JSONObject.toJSONString(unloadCars));
+        reqId.setResTime(LocalDateTime.now());
+        /*记录日志*/
+        apiLogService.enqueue(reqId);
+        return ok;
+    }
+
+    /**
+     * 给订单分配装车位置
+     *
+     * @param request
+     * @param response
+     * @param loadInfo
+     * @return
+     */
+    @PostMapping("/category/allocation/location")
+    public R<Object> location(HttpServletRequest request, HttpServletResponse response, @RequestBody LoadInfo loadInfo) {
+        //header校验
+        ApiUser apiUser = businessCheck.headerCheck(request);
+        ApiLog reqId = businessCheck.paraCheck(() -> new HashMap<>() {{
+            put(loadInfo.getForkliftNo(), (d) -> {
+                if (StringUtils.isBlank((String) d)) {
+                    throw new ApiException("装载单号不能为空");
+                }
+            });
+        }}).signCheck(() -> new HashMap<>() {{
+            put("key", apiUser.getPriKey());
+            put("forkliftNo", loadInfo.getForkliftNo());
+            put("remark", loadInfo.getRemark());
+        }}, request);
+        /*业务*/
+        kllService.loadInfo(loadInfo);
+        //返回值增加签名
+        R<Object> ok = R.ok().setMsg("操作成功!");
+        String signType = request.getHeader(ApiUtil.ApiConstant.SignType.getCode());
+        long time = System.currentTimeMillis() / 1000;
+        String account = request.getHeader(ApiUtil.ApiConstant.account.getCode());
+        String sign = businessCheck.resSign(() -> new HashMap<>() {{
+            put("signType", signType);
+            put("account", account);
+            put("time", String.valueOf(time));
+            put("key", apiUser.getPriKey());
+        }});
+        ok.setSign(sign);
+        response.setHeader("timestamp", String.valueOf(time));
+        reqId.setResData("");
+        reqId.setResTime(LocalDateTime.now());
+        /*记录日志*/
+        apiLogService.enqueue(reqId);
+        return ok;
+    }
+
+    /**
+     * 开始装车
+     *
+     * @param request
+     * @param response
+     * @param loadPara
+     * @return
+     */
+    @PostMapping("/category/start/load")
+    public R<Object> startLoad(HttpServletRequest request, HttpServletResponse response, @RequestBody LoadPara loadPara) {
+        //header校验
+        ApiUser apiUser = businessCheck.headerCheck(request);
+        ApiLog reqId = businessCheck.paraCheck(() -> new HashMap<>() {{
+            put(loadPara.getForkliftNo(), (d) -> {
+                if (StringUtils.isBlank((String) d)) {
+                    throw new ApiException("装载单号不能为空");
+                }
+            });
+            put(loadPara.getLoadUser(), (d) -> {
+                if (Objects.isNull(d)) {
+                    throw new ApiException("用户信息不能为空");
+                }
+                if (d instanceof LoadUser user) {
+                    if (Objects.isNull(user.getId())) {
+                        throw new ApiException("用户id不能为空");
+                    }
+                }
+            });
+        }}).signCheck(() -> new HashMap<>() {{
+            put("key", apiUser.getPriKey());
+            put("forkliftNo", loadPara.getForkliftNo());
+            put("loadUser", JSONObject.toJSONString(loadPara.getLoadUser()));
+        }}, request);
+        /*业务*/
+        kllService.startLoad(loadPara);
+        //返回值增加签名
+        R<Object> ok = R.ok().setMsg("操作成功!");
+        String signType = request.getHeader(ApiUtil.ApiConstant.SignType.getCode());
+        long time = System.currentTimeMillis() / 1000;
+        String account = request.getHeader(ApiUtil.ApiConstant.account.getCode());
+        String sign = businessCheck.resSign(() -> new HashMap<>() {{
+            put("signType", signType);
+            put("account", account);
+            put("time", String.valueOf(time));
+            put("key", apiUser.getPriKey());
+        }});
+        ok.setSign(sign);
+        response.setHeader("timestamp", String.valueOf(time));
+        reqId.setResData("");
+        reqId.setResTime(LocalDateTime.now());
+        /*记录日志*/
+        apiLogService.enqueue(reqId);
+        return ok;
+    }
+
+    /**
+     * 装车完毕
+     *
+     * @param request
+     * @param response
+     * @param loadPara
+     * @return
+     */
+    @PostMapping("/category/finish/load")
+    public R<Object> finishLoad(HttpServletRequest request, HttpServletResponse response, @RequestBody LoadPara loadPara) {
+        //header校验
+        ApiUser apiUser = businessCheck.headerCheck(request);
+        ApiLog reqId = businessCheck.paraCheck(() -> new HashMap<>() {{
+            put(loadPara.getForkliftNo(), (d) -> {
+                if (StringUtils.isBlank((String) d)) {
+                    throw new ApiException("装载单号不能为空");
+                }
+            });
+            put(loadPara.getLoadUser(), (d) -> {
+                if (Objects.isNull(d)) {
+                    throw new ApiException("用户信息不能为空");
+                }
+                if (d instanceof LoadUser user) {
+                    if (Objects.isNull(user.getId())) {
+                        throw new ApiException("用户id不能为空");
+                    }
+                }
+            });
+        }}).signCheck(() -> new HashMap<>() {{
+            put("key", apiUser.getPriKey());
+            put("forkliftNo", loadPara.getForkliftNo());
+            put("loadUser", JSONObject.toJSONString(loadPara.getLoadUser()));
+        }}, request);
+        /*业务*/
+        kllService.finishLoad(loadPara);
+        //返回值增加签名
+        R<Object> ok = R.ok().setMsg("操作成功!");
+        String signType = request.getHeader(ApiUtil.ApiConstant.SignType.getCode());
+        long time = System.currentTimeMillis() / 1000;
+        String account = request.getHeader(ApiUtil.ApiConstant.account.getCode());
+        String sign = businessCheck.resSign(() -> new HashMap<>() {{
+            put("signType", signType);
+            put("account", account);
+            put("time", String.valueOf(time));
+            put("key", apiUser.getPriKey());
+        }});
+        ok.setSign(sign);
+        response.setHeader("timestamp", String.valueOf(time));
+        reqId.setResData("");
+        reqId.setResTime(LocalDateTime.now());
+        /*记录日志*/
+        apiLogService.enqueue(reqId);
+        return ok;
+    }
+
+    /**
+     * 取消装载
+     *
+     * @param request
+     * @param response
+     * @param loadPara
+     * @return
+     */
+    @PostMapping("/category/cancel/load")
+    public R<Object> cancelLoad(HttpServletRequest request, HttpServletResponse response, @RequestBody LoadPara loadPara) {
+        //header校验
+        ApiUser apiUser = businessCheck.headerCheck(request);
+        ApiLog reqId = businessCheck.paraCheck(() -> new HashMap<>() {{
+            put(loadPara.getForkliftNo(), (d) -> {
+                if (StringUtils.isBlank((String) d)) {
+                    throw new ApiException("装载单号不能为空");
+                }
+            });
+            put(loadPara.getLoadUser(), (d) -> {
+                if (Objects.isNull(d)) {
+                    throw new ApiException("用户信息不能为空");
+                }
+                if (d instanceof LoadUser user) {
+                    if (Objects.isNull(user.getId())) {
+                        throw new ApiException("用户id不能为空");
+                    }
+                }
+            });
+        }}).signCheck(() -> new HashMap<>() {{
+            put("key", apiUser.getPriKey());
+            put("forkliftNo", loadPara.getForkliftNo());
+            put("loadUser", JSONObject.toJSONString(loadPara.getLoadUser()));
+        }}, request);
+        /*业务*/
+        kllService.cancelLoad(loadPara);
+        //返回值增加签名
+        R<Object> ok = R.ok().setMsg("操作成功!");
+        String signType = request.getHeader(ApiUtil.ApiConstant.SignType.getCode());
+        long time = System.currentTimeMillis() / 1000;
+        String account = request.getHeader(ApiUtil.ApiConstant.account.getCode());
+        String sign = businessCheck.resSign(() -> new HashMap<>() {{
+            put("signType", signType);
+            put("account", account);
+            put("time", String.valueOf(time));
+            put("key", apiUser.getPriKey());
+        }});
+        ok.setSign(sign);
+        response.setHeader("timestamp", String.valueOf(time));
+        reqId.setResData("");
+        reqId.setResTime(LocalDateTime.now());
+        /*记录日志*/
+        apiLogService.enqueue(reqId);
+        return ok;
+    }
+}

+ 64 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/entity/ApiLog.java

@@ -0,0 +1,64 @@
+package com.sckw.transport.five.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * 访问日志
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:15
+ */
+@Getter
+@Setter
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "api_log")
+public class ApiLog {
+    /**
+     * id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 流水号
+     */
+    @TableField(value = "msg_id")
+    private String msgId;
+
+    /**
+     * 账号
+     */
+    @TableField(value = "account")
+    private String account;
+
+    /**
+     * 请求参数
+     */
+    @TableField(value = "req_para")
+    private String reqPara;
+
+    /**
+     * 响应参数
+     */
+    @TableField(value = "res_data")
+    private String resData;
+
+    /**
+     * 请求时间
+     */
+    @TableField(value = "req_time")
+    private LocalDateTime reqTime;
+
+    /**
+     * 响应时间
+     */
+    @TableField(value = "res_time")
+    private LocalDateTime resTime;
+}

+ 61 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/entity/ApiPmi.java

@@ -0,0 +1,61 @@
+package com.sckw.transport.five.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * 权限表
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+@Getter
+@Setter
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "api_pmi")
+public class ApiPmi {
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 接口名称
+     */
+    @TableField(value = "`name`")
+    private String name;
+
+    /**
+     * 接口code码
+     */
+    @TableField(value = "code")
+    private String code;
+
+    /**
+     * 接口地址
+     */
+    @TableField(value = "addr")
+    private String addr;
+
+    /**
+     * 接口描述
+     */
+    @TableField(value = "`desc`")
+    private String desc;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time")
+    private LocalDateTime createTime;
+
+    /**
+     * 启用状态 1-启用 0-停用
+     */
+    @TableField(value = "`status`")
+    private Boolean status;
+}

+ 29 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/entity/ApiProductGoods.java

@@ -0,0 +1,29 @@
+package com.sckw.transport.five.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 用户权限关联
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+@Getter
+@Setter
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "api_product_goods")
+public class ApiProductGoods {
+    /**
+     * id
+     */
+    @TableId(value = "product_id", type = IdType.INPUT)
+    private Long productId;
+
+    @TableField(value = "goods_id")
+    private Long goodsId;
+}

+ 58 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/entity/ApiUser.java

@@ -0,0 +1,58 @@
+package com.sckw.transport.five.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * 用户表
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+@Getter
+@Setter
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "api_user")
+public class ApiUser {
+    /**
+     * id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 昵称
+     */
+    @TableField(value = "nickname")
+    private String nickname;
+
+    /**
+     * 账号
+     */
+    @TableField(value = "account")
+    private String account;
+
+    /**
+     * 密钥
+     */
+    @TableField(value = "pri_key")
+    private String priKey;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time")
+    private LocalDateTime createTime;
+
+    /**
+     * 是否启用 1-启用 0-停用
+     */
+    @TableField(value = "`status`")
+    private int status;
+}

+ 29 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/entity/ApiUserPmi.java

@@ -0,0 +1,29 @@
+package com.sckw.transport.five.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 用户权限关联
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+@Getter
+@Setter
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "api_user_pmi")
+public class ApiUserPmi {
+    /**
+     * id
+     */
+    @TableId(value = "user_id", type = IdType.INPUT)
+    private Integer userId;
+
+    @TableField(value = "pmi_id")
+    private Integer pmiId;
+}

+ 14 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/mapper/ApiLogMapper.java

@@ -0,0 +1,14 @@
+package com.sckw.transport.five.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.transport.five.entity.ApiLog;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:15
+ */
+
+@Mapper
+public interface ApiLogMapper extends BaseMapper<ApiLog> {
+}

+ 14 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/mapper/ApiPmiMapper.java

@@ -0,0 +1,14 @@
+package com.sckw.transport.five.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.transport.five.entity.ApiPmi;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+
+@Mapper
+public interface ApiPmiMapper extends BaseMapper<ApiPmi> {
+}

+ 14 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/mapper/ApiProductGoodsMapper.java

@@ -0,0 +1,14 @@
+package com.sckw.transport.five.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.transport.five.entity.ApiProductGoods;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+
+@Mapper
+public interface ApiProductGoodsMapper extends BaseMapper<ApiProductGoods> {
+}

+ 14 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/mapper/ApiUserMapper.java

@@ -0,0 +1,14 @@
+package com.sckw.transport.five.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.transport.five.entity.ApiUser;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+
+@Mapper
+public interface ApiUserMapper extends BaseMapper<ApiUser> {
+}

+ 19 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/mapper/ApiUserPmiMapper.java

@@ -0,0 +1,19 @@
+package com.sckw.transport.five.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.transport.five.entity.ApiUserPmi;
+import com.sckw.transport.five.pojo.UserPmiDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+
+@Mapper
+public interface ApiUserPmiMapper extends BaseMapper<ApiUserPmi> {
+    List<UserPmiDto> selectPmi(@Param("id") Integer id);
+}

+ 27 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/pojo/LoadInfo.java

@@ -0,0 +1,27 @@
+package com.sckw.transport.five.pojo;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * 装载信息
+ *
+ * @Author xucaiqin
+ * @date 2023-06-20 10:36:30
+ */
+@NoArgsConstructor
+@Getter
+@Setter
+@AllArgsConstructor
+public class LoadInfo {
+    /**
+     * 装载单号
+     */
+    private String forkliftNo;
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 27 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/pojo/LoadPara.java

@@ -0,0 +1,27 @@
+package com.sckw.transport.five.pojo;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * 装载信息
+ *
+ * @Author xucaiqin
+ * @date 2023-06-20 10:36:30
+ */
+@NoArgsConstructor
+@Getter
+@Setter
+@AllArgsConstructor
+public class LoadPara {
+    /**
+     * 装载单号
+     */
+    private String forkliftNo;
+    /**
+     * 备注
+     */
+    private LoadUser loadUser;
+}

+ 24 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/pojo/LoadUser.java

@@ -0,0 +1,24 @@
+package com.sckw.transport.five.pojo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author xucaiqin
+ * @date 2024-06-27 15:12:23
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class LoadUser {
+    @JSONField(ordinal = 2)
+    private String mobile;
+    @JSONField(ordinal = 1)
+    private Long id;
+    @JSONField(ordinal = 3)
+    private String name;
+}

+ 65 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/pojo/UnloadCar.java

@@ -0,0 +1,65 @@
+package com.sckw.transport.five.pojo;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 带转载车辆
+ *
+ * @Author xucaiqin
+ * @date 2023-06-20 10:36:30
+ */
+@NoArgsConstructor
+@Getter
+@Setter
+@AllArgsConstructor
+public class UnloadCar {
+    /**
+     * 产品id
+     */
+    private Long productId;
+    /**
+     * skuId
+     */
+    private Long skuId;
+    /**
+     * sku名称
+     */
+    private String skuName;
+    /**
+     * 车牌号
+     */
+    private String licensePlate;
+    /**
+     * 司机姓名
+     */
+    private String driverName;
+
+    /**
+     * 司机电话
+     */
+    private String driverPhone;
+
+    /**
+     * 装载单号
+     */
+    private String forkliftNo;
+    /**
+     * 时间
+     */
+    private String createTime;
+    /**
+     * 待装载量
+     */
+    private BigDecimal unloadAmount;
+    /**
+     * 车辆轴数
+     */
+    private String modelStr;
+
+
+}

+ 38 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/pojo/UserPmiDto.java

@@ -0,0 +1,38 @@
+package com.sckw.transport.five.pojo;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 15:00:58
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserPmiDto {
+    private Integer userId;
+    private Integer pmiId;
+    /**
+     * 接口名称
+     */
+    private String name;
+
+    /**
+     * 接口code码
+     */
+    private String code;
+
+    /**
+     * 接口地址
+     */
+    private String addr;
+
+    /**
+     * 启用状态 1-启用 0-停用
+     */
+    private Boolean status;
+}

+ 15 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/ApiLogService.java

@@ -0,0 +1,15 @@
+package com.sckw.transport.five.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sckw.transport.five.entity.ApiLog;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:15
+ */
+
+public interface ApiLogService extends IService<ApiLog> {
+
+
+    void enqueue(ApiLog reqId);
+}

+ 14 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/ApiPmiService.java

@@ -0,0 +1,14 @@
+package com.sckw.transport.five.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sckw.transport.five.entity.ApiPmi;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+
+public interface ApiPmiService extends IService<ApiPmi>{
+
+
+}

+ 17 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/ApiUserPmiService.java

@@ -0,0 +1,17 @@
+package com.sckw.transport.five.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sckw.transport.five.entity.ApiUserPmi;
+import com.sckw.transport.five.pojo.UserPmiDto;
+
+import java.util.List;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+
+public interface ApiUserPmiService extends IService<ApiUserPmi> {
+
+    List<UserPmiDto> getPmi(Integer id);
+}

+ 13 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/ApiUserService.java

@@ -0,0 +1,13 @@
+package com.sckw.transport.five.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sckw.transport.five.entity.ApiUser;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+
+public interface ApiUserService extends IService<ApiUser> {
+    ApiUser getByAccount(String account);
+}

+ 117 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/common/BusinessCheck.java

@@ -0,0 +1,117 @@
+package com.sckw.transport.five.service.common;
+
+import com.alibaba.fastjson.JSONObject;
+import com.sckw.core.exception.ApiException;
+import com.sckw.transport.five.entity.ApiLog;
+
+import com.sckw.transport.five.util.ApiUtil;
+import com.sckw.transport.five.util.MD5Util;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDateTime;
+import java.util.Map;
+import java.util.Objects;
+import java.util.TreeMap;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 09:47:46
+ */
+@Service
+@Slf4j
+public final class BusinessCheck extends HeaderCheck {
+    @Resource
+    private RedisTemplate<String, Object> redisTemplate;
+
+
+    /**
+     * 参数校验
+     *
+     * @param supplier
+     * @return
+     */
+    public BusinessCheck paraCheck(Supplier<Map<Object, Consumer<Object>>> supplier) {
+        Map<Object, Consumer<Object>> map = supplier.get();
+        if (!CollectionUtils.isEmpty(map)) {
+            for (Map.Entry<Object, Consumer<Object>> mapTmp : map.entrySet()) {
+                mapTmp.getValue().accept(mapTmp.getKey());
+            }
+        }
+        return this;
+    }
+
+    /**
+     * 签名校验
+     *
+     * @param supplier
+     */
+    public ApiLog signCheck(Supplier<Map<Object, Object>> supplier, HttpServletRequest request) {
+        ApiLog apiLog = new ApiLog();
+        apiLog.setReqTime(LocalDateTime.now());
+        String signType = request.getHeader(ApiUtil.ApiConstant.SignType.getCode());
+        String timestamp = request.getHeader(ApiUtil.ApiConstant.timestamp.getCode());
+        String account = request.getHeader(ApiUtil.ApiConstant.account.getCode());
+        String sign = request.getHeader(ApiUtil.ApiConstant.sign.getCode());
+        StringBuilder stringBuilder = new StringBuilder(signType);
+        stringBuilder.append(account);
+        stringBuilder.append(timestamp);
+        Map<Object, Object> map = supplier.get();
+        Object key = map.get("key");
+        map.remove("key");
+        if (!CollectionUtils.isEmpty(map)) {
+            TreeMap<Object, Object> sortMap = new TreeMap<>(map);
+            for (Map.Entry<Object, Object> entry : sortMap.entrySet()) {
+                stringBuilder.append(Objects.isNull(entry.getValue()) ? "" : entry.getValue());
+            }
+        }
+        stringBuilder.append(key);
+        String toSign = stringBuilder.toString();
+        String signNew = MD5Util.md5(toSign);
+
+        log.info("代签名字符串:{}", toSign);
+        log.info("我方签名:{}", signNew);
+        log.info("对方签名:{}", sign);
+
+        if (!StringUtils.equals(signNew, sign)) {
+            throw new ApiException("签名校验异常!");
+        }
+        String cacheKey = account + ":" + signNew;
+        Object o = redisTemplate.opsForValue().get(cacheKey);
+        if (Objects.nonNull(o)) {
+            throw new ApiException("重复消费!");
+        }
+        redisTemplate.opsForValue().set(cacheKey, 1, 1, TimeUnit.DAYS);
+        apiLog.setMsgId(signNew);
+        apiLog.setAccount(account);
+        apiLog.setReqPara(JSONObject.toJSONString(map));
+        return apiLog;
+    }
+
+    @Override
+    public String resSign(Supplier<Map<String, String>> supplier) {
+        Map<String, String> map = supplier.get();
+        String key = map.remove("key");
+        StringBuilder stringBuilder = new StringBuilder(map.remove("signType"));
+        stringBuilder.append(map.remove("account"));
+        stringBuilder.append(map.remove("time"));
+        if (!CollectionUtils.isEmpty(map)) {
+            TreeMap<String, String> sortMap = new TreeMap<>(map);
+            for (Map.Entry<String, String> entry : sortMap.entrySet()) {
+                stringBuilder.append(StringUtils.isBlank(entry.getValue()) ? "" : entry.getValue());
+            }
+        }
+        stringBuilder.append(key);
+        log.info("返回值代签名字符串:{}", stringBuilder);
+        return MD5Util.md5(stringBuilder.toString());
+    }
+
+}

+ 79 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/common/HeaderCheck.java

@@ -0,0 +1,79 @@
+package com.sckw.transport.five.service.common;
+
+import com.sckw.core.exception.ApiException;
+import com.sckw.transport.five.entity.ApiUser;
+import com.sckw.transport.five.pojo.UserPmiDto;
+import com.sckw.transport.five.service.ApiUserPmiService;
+import com.sckw.transport.five.service.ApiUserService;
+import com.sckw.transport.five.util.ApiUtil;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Consumer;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 16:09:42
+ */
+@Slf4j
+public abstract class HeaderCheck implements IBusinessCheck {
+    private final Consumer<HttpServletRequest> consumer = ApiUtil::headerCheck;
+    @Resource
+    private ApiUserService apiUserService;
+    @Resource
+    private ApiUserPmiService apiUserPmiService;
+
+    @Override
+    public ApiUser headerCheck(HttpServletRequest httpServletRequest) {
+        consumer.accept(httpServletRequest);
+        return this.apply(httpServletRequest);
+    }
+
+    @Override
+    public ApiUser apply(HttpServletRequest request) {
+        /*签名校验*/
+        String signType = request.getHeader(ApiUtil.ApiConstant.SignType.getCode());
+        if (!StringUtils.equals(signType, "MD5")) {
+            throw new ApiException("暂不支持除MD5以外的签名!");
+        }
+        /*时间戳校验*/
+        String timestamp = request.getHeader(ApiUtil.ApiConstant.timestamp.getCode());
+        try {
+            long recLong = Long.parseLong(timestamp);
+            long curLong = System.currentTimeMillis() / 1000;
+            long between = 60;
+            if (recLong - curLong > between || curLong - recLong > between) {
+                throw new ApiException("接口时间校验异常!");
+            }
+        } catch (NumberFormatException e) {
+            log.error("时间戳格式化异常:{}", e.getMessage());
+            throw new ApiException("时间戳参数不为数字!");
+        }
+        /*账号校验*/
+        String account = request.getHeader(ApiUtil.ApiConstant.account.getCode());
+        ApiUser byAccount = apiUserService.getByAccount(account);
+        if (Objects.isNull(byAccount)) {
+            throw new ApiException("账号不存在!");
+        }
+        if (byAccount.getStatus() == 0) {
+            throw new ApiException("账号已停用!");
+        }
+        /*接口权限*/
+        List<UserPmiDto> pmi = apiUserPmiService.getPmi(byAccount.getId());
+        String requestURI = request.getRequestURI();
+        if (CollectionUtils.isEmpty(pmi)) {
+            throw new ApiException("权限不足!");
+        }
+        boolean b = pmi.stream().anyMatch(o -> StringUtils.equals(o.getAddr(), requestURI));
+        if (!b) {
+            throw new ApiException("权限不足!");
+        }
+        return byAccount;
+    }
+
+}

+ 50 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/common/IBusinessCheck.java

@@ -0,0 +1,50 @@
+package com.sckw.transport.five.service.common;
+
+import com.sckw.transport.five.entity.ApiLog;
+import com.sckw.transport.five.entity.ApiUser;
+import jakarta.servlet.http.HttpServletRequest;
+
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 16:07:25
+ */
+public interface IBusinessCheck extends Function<HttpServletRequest, ApiUser> {
+    /**
+     * header 校验
+     *
+     * @param httpServletRequest 请求
+     * @return
+     */
+    ApiUser headerCheck(HttpServletRequest httpServletRequest);
+
+    /**
+     * 业务参数校验
+     *
+     * @param supplier
+     * @return
+     */
+
+    BusinessCheck paraCheck(Supplier<Map<Object, Consumer<Object>>> supplier);
+
+    /**
+     * 签名校验
+     *
+     * @param supplier
+     * @param request
+     */
+    ApiLog signCheck(Supplier<Map<Object, Object>> supplier, HttpServletRequest request);
+
+    /**
+     * 返回值增加签名
+     * @param supplier
+     * @return
+     */
+    String resSign(Supplier<Map<String, String>> supplier);
+
+
+}

+ 34 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/common/KllService.java

@@ -0,0 +1,34 @@
+package com.sckw.transport.five.service.common;
+
+import com.sckw.transport.five.pojo.LoadInfo;
+import com.sckw.transport.five.pojo.LoadPara;
+import com.sckw.transport.five.pojo.UnloadCar;
+
+import java.util.List;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-19 16:40:24
+ */
+
+public interface KllService {
+    /**
+     * 定时查询待装载车辆集合
+     * 1.车牌号、司机姓名、司机电话、待装载重量、时间、装载单号
+     * 2.只有待装载才能修改
+     * 3.app开始接单
+     * 4.
+     * 5.取消装载
+     */
+    List<UnloadCar> unloadCar(List<Long>  productId);
+
+    /**
+     * 分配装载信息
+     */
+    void loadInfo(LoadInfo loadInfo);
+
+    void startLoad(LoadPara loadPara);
+    void finishLoad(LoadPara loadPara);
+    void cancelLoad(LoadPara loadPara);
+
+}

+ 63 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/common/KllServiceImpl.java

@@ -0,0 +1,63 @@
+package com.sckw.transport.five.service.common;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sckw.core.exception.ApiException;
+import com.sckw.transport.dao.KwtForkliftWaybillOrderMapper;
+import com.sckw.transport.five.pojo.LoadInfo;
+import com.sckw.transport.five.pojo.LoadPara;
+import com.sckw.transport.five.pojo.UnloadCar;
+import com.sckw.transport.model.KwtForkliftWaybillOrder;
+import com.sckw.transport.service.app.ForkliftOrderService;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-20 09:05:06
+ */
+@Service
+@Slf4j
+public class KllServiceImpl implements KllService {
+    @Resource
+    private KwtForkliftWaybillOrderMapper kwtForkliftWaybillOrderMapper;
+
+    @Resource
+    private ForkliftOrderService forkliftOrderService;
+
+
+
+    @Override
+    public List<UnloadCar> unloadCar(List<Long> productId) {
+        return kwtForkliftWaybillOrderMapper.unloadCar(productId);
+    }
+
+    @Override
+    public void loadInfo(LoadInfo loadInfo) {
+        KwtForkliftWaybillOrder kllOrderTaskForklift = kwtForkliftWaybillOrderMapper.selectOne(new LambdaQueryWrapper<KwtForkliftWaybillOrder>()
+                .eq(KwtForkliftWaybillOrder::getFOrderNo, loadInfo.getForkliftNo()).last("limit 1"));
+        if (Objects.nonNull(kllOrderTaskForklift) && !Objects.equals(kllOrderTaskForklift.getStatus(), 1)) {
+            throw new ApiException("当前叉车运单未处于等待装载状态");
+        }
+        kllOrderTaskForklift.setRemark(loadInfo.getRemark());
+        kwtForkliftWaybillOrderMapper.updateById(kllOrderTaskForklift);
+    }
+
+    @Override
+    public void startLoad(LoadPara loadPara) {
+        forkliftOrderService.acceptOrderTaking(loadPara);
+    }
+
+    @Override
+    public void finishLoad(LoadPara loadPara) {
+
+    }
+
+    @Override
+    public void cancelLoad(LoadPara loadPara) {
+
+    }
+}

+ 26 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/impl/ApiLogServiceImpl.java

@@ -0,0 +1,26 @@
+package com.sckw.transport.five.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.transport.five.entity.ApiLog;
+import com.sckw.transport.five.mapper.ApiLogMapper;
+import com.sckw.transport.five.service.ApiLogService;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:15
+ */
+
+@Service
+public class ApiLogServiceImpl extends ServiceImpl<ApiLogMapper, ApiLog> implements ApiLogService {
+    private final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>(12));
+
+    @Override
+    public void enqueue(ApiLog reqId) {
+        threadPoolExecutor.execute(() -> this.save(reqId));
+    }
+}

+ 16 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/impl/ApiPmiServiceImpl.java

@@ -0,0 +1,16 @@
+package com.sckw.transport.five.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.transport.five.entity.ApiPmi;
+import com.sckw.transport.five.mapper.ApiPmiMapper;
+import com.sckw.transport.five.service.ApiPmiService;
+import org.springframework.stereotype.Service;
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+
+@Service
+public class ApiPmiServiceImpl extends ServiceImpl<ApiPmiMapper, ApiPmi> implements ApiPmiService{
+
+}

+ 23 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/impl/ApiUserPmiServiceImpl.java

@@ -0,0 +1,23 @@
+package com.sckw.transport.five.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.transport.five.entity.ApiUserPmi;
+import com.sckw.transport.five.mapper.ApiUserPmiMapper;
+import com.sckw.transport.five.pojo.UserPmiDto;
+import com.sckw.transport.five.service.ApiUserPmiService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+
+@Service
+public class ApiUserPmiServiceImpl extends ServiceImpl<ApiUserPmiMapper, ApiUserPmi> implements ApiUserPmiService{
+
+    @Override
+    public List<UserPmiDto> getPmi(Integer id) {
+        return this.baseMapper.selectPmi(id);
+    }
+}

+ 25 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/service/impl/ApiUserServiceImpl.java

@@ -0,0 +1,25 @@
+package com.sckw.transport.five.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.transport.five.entity.ApiUser;
+import com.sckw.transport.five.mapper.ApiUserMapper;
+import com.sckw.transport.five.service.ApiUserService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 14:47:32
+ */
+
+@Service
+public class ApiUserServiceImpl extends ServiceImpl<ApiUserMapper, ApiUser> implements ApiUserService {
+
+    @Override
+    public ApiUser getByAccount(String account) {
+        LambdaQueryWrapper<ApiUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ApiUser::getAccount, account)
+                .last("limit 1");
+        return this.baseMapper.selectOne(wrapper);
+    }
+}

+ 39 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/ApiPage.java

@@ -0,0 +1,39 @@
+package com.sckw.transport.five.util;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-14 08:58:34
+ */
+@Getter
+@Setter
+public class ApiPage<T> {
+    private long total;
+    private int page;
+    private int pageSize;
+    private List<T> rows;
+
+    public ApiPage(long total, int page, int pageSize, List<T> rows) {
+        this.total = total;
+        this.page = page;
+        this.pageSize = pageSize;
+        this.rows = rows;
+    }
+
+    public ApiPage() {
+        this(0, 1, 10, new ArrayList<>());
+    }
+
+    public ApiPage(List<T> rows) {
+        this(rows.size(), 1, 10, rows);
+    }
+
+    public ApiPage(int page, int pageSize, List<T> rows) {
+        this(rows.size(), page, pageSize, rows);
+    }
+}

+ 42 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/ApiUtil.java

@@ -0,0 +1,42 @@
+package com.sckw.transport.five.util;
+
+import com.sckw.core.exception.ApiException;
+import jakarta.servlet.http.HttpServletRequest;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-13 09:16:10
+ */
+public class ApiUtil {
+
+    public enum ApiConstant {
+        SignType("signType"), timestamp("timestamp"), account("account"), sign("sign");
+        private final String code;
+
+        public String getCode() {
+            return code;
+        }
+
+        private ApiConstant(String code) {
+            this.code = code;
+        }
+
+    }
+
+    /**
+     * 1.非空校验
+     *
+     * @param request
+     */
+    public static void headerCheck(HttpServletRequest request) {
+        for (ApiConstant value : ApiConstant.values()) {
+            String header = request.getHeader(value.getCode());
+            if (StringUtils.isBlank(header)) {
+                throw new ApiException(value.getCode() + "不能为空!");
+            }
+        }
+    }
+
+
+}

+ 28 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/DateTimeUtil.java

@@ -0,0 +1,28 @@
+package com.sckw.transport.five.util;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * @author xcq
+ * @date 2022年07月29日 18:06
+ */
+public class DateTimeUtil {
+    public static String format(LocalDateTime localDateTime, String pattern) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
+        return dateTimeFormatter.format(localDateTime);
+    }
+
+    public static String formatYMD(LocalDateTime localDateTime) {
+        return format(localDateTime, "yyyy-MM-dd HH:mm:ss");
+    }
+
+    public static String formatYMD() {
+        return format(LocalDateTime.now(), "yyyy-MM-dd");
+    }
+
+    public static LocalDateTime parse(String localDateTime) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        return LocalDateTime.parse(localDateTime, dateTimeFormatter);
+    }
+}

+ 21 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/DecimalUtil.java

@@ -0,0 +1,21 @@
+package com.sckw.transport.five.util;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Objects;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-20 14:54:24
+ */
+public class DecimalUtil {
+    public static BigDecimal divide(BigDecimal a, BigDecimal b) {
+        if (Objects.isNull(a)) {
+            return new BigDecimal("0.00");
+        }
+        if (Objects.isNull(b) || BigDecimal.ZERO.compareTo(b) == 0) {
+            b = new BigDecimal("1.00");
+        }
+        return a.divide(b, RoundingMode.CEILING);
+    }
+}

+ 41 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/IdUtil.java

@@ -0,0 +1,41 @@
+package com.sckw.transport.five.util;
+
+import java.util.Random;
+import java.util.UUID;
+
+public class IdUtil {
+    public static String randomUUID() {
+        return UUID.randomUUID().toString();
+    }
+
+    /**
+     * 返回没有-的uuid
+     *
+     * @return
+     */
+    public static String UUID() {
+        return randomUUID().replaceAll("-", "");
+    }
+
+    public static String UUID(int len) {
+        return UUID().substring(0, len);
+    }
+
+    public static int code(int len) {
+        Random random = new Random();
+        int min = (int) Math.pow(10, len - 1);
+        int max = (int) Math.pow(10, len) - 1;
+        return random.nextInt(max - min + 1) + min;
+    }
+
+    /**
+     * 返回随机生成的四位数
+     *
+     * @return 返回随机生成的四位数
+     */
+    public static int code() {
+        return code(4);
+    }
+
+
+}

+ 164 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/MD5Util.java

@@ -0,0 +1,164 @@
+package com.sckw.transport.five.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * MD5 消息摘要算法(利用哈希算法来加密的)
+ *
+ * @author xcq
+ * @date 2022年07月27日 20:04
+ */
+@Slf4j
+public class MD5Util {
+    //十六进制下数字到字符的映射数组
+    private final static String[] HEX_DIGITS = {"0", "1", "2", "3", "4",
+            "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
+
+    /**
+     * 计算字符串的MD5值
+     *
+     * @param string 明文
+     * @return md5摘要
+     */
+    public static String encodeByMD5(String string) {
+        if (string != null) {
+            try {
+                //创建具有指定算法名称的信息摘要
+                MessageDigest md = MessageDigest.getInstance("MD5");
+                //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
+                byte[] results = md.digest(string.getBytes());
+                //将得到的字节数组变成字符串返回
+                StringBuilder sb = new StringBuilder();
+                for (int j : results) {
+                    int n = j;
+                    if (n < 0) {
+                        n = 256 + n;
+                    }
+                    int d1 = n / 16;
+                    int d2 = n % 16;
+                    sb.append(HEX_DIGITS[d1]).append(HEX_DIGITS[d2]);
+                }
+                return sb.toString();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 计算字符串的MD5值
+     *
+     * @param string 明文
+     * @return md5摘要
+     */
+    public static String md5(String string) {
+        if (string.isEmpty()) {
+            return "";
+        }
+        MessageDigest md5;
+        try {
+            md5 = MessageDigest.getInstance("MD5");
+            byte[] bytes = md5.digest(string.getBytes(StandardCharsets.UTF_8));
+            StringBuilder result = new StringBuilder();
+            for (byte b : bytes) {
+                /* & 0xff 可以将负数转为正数*/
+                String temp = Integer.toHexString(b & 0xff);
+                // 16进制数 temp小于16
+                if (temp.length() == 1) {
+                    temp = "0" + temp;
+                }
+                result.append(temp);
+            }
+            return result.toString();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /*其它方法*/
+
+    /**
+     * md5摘要
+     *
+     * @param s 需要转换的字符串
+     * @return 返回字节形式的md5摘要数据
+     */
+    public static byte[] byteMD5(String s) {
+        MessageDigest md;
+        try {
+            md = MessageDigest.getInstance("MD5");
+            md.reset();
+            md.update(s.getBytes(StandardCharsets.UTF_8));
+            return md.digest();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 将字节数据转换为16进制的字符串数据
+     *
+     * @param hash 转换后的字节数组
+     * @return 返回16进制的字符串
+     */
+    public static String byteToHex(byte[] hash) {
+        if (hash == null) {
+            return null;
+        }
+        StringBuffer buf = new StringBuffer(hash.length * 2);
+        int i;
+
+        for (i = 0; i < hash.length; i++) {
+            /* & 0xff 可以将负数转为正数*/
+            /* <0x10 表示小于16,需要进行补零*/
+            if ((hash[i] & 0xff) < 0x10) {
+                buf.append("0");
+            }
+            buf.append(Long.toString(hash[i] & 0xff, 16));
+        }
+        return buf.toString();
+    }
+
+    /**
+     * 将字节数组转换为十六进制字符串
+     *
+     * @param data 待转换的字节数组
+     * @return 转换后的十六进制字符串
+     */
+    private static String toHexString(byte[] data) {
+        StringBuilder sb = new StringBuilder();
+        for (byte b : data) {
+            sb.append(String.format("%02X", b));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 验证MD5校验值是否正确
+     *
+     * @param data       待验证的数据
+     * @param md5ToCheck 待验证的MD5校验值
+     * @return true表示校验通过,false表示校验失败
+     */
+    public static boolean verifyMD5(String data, String md5ToCheck) {
+        String check = md5(data);
+        return StringUtils.equals(check, md5ToCheck);
+    }
+
+    public static void main(String[] args) {
+        String a = "MD5zhangsan1686551075bcfgzhang{\"a\":\"a1\"}[\"b\",\"c\"]key123";
+        byte[] bytes = byteMD5(a);
+        String s = byteToHex(bytes);
+        System.out.println(s);
+        System.out.println(encodeByMD5(a));
+        System.out.println(md5(a));
+    }
+}

+ 407 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/OkHttpUtils.java

@@ -0,0 +1,407 @@
+package com.sckw.transport.five.util;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author xcq
+ * @date 2023-02-21 10:42:20
+ **/
+@Slf4j
+public class OkHttpUtils {
+
+    private static volatile OkHttpClient okHttpClient = null;
+    private static volatile Semaphore semaphore = null;
+    private Map<String, String> headerMap;
+    private Map<String, String> paraMap;
+    private Map<String, String> bodyParaMap;
+    //json字符串
+    private String bodyParaString;
+    private String url;
+    private Request.Builder request;
+
+    /**
+     * 初始化okHttpClient,并且允许https访问
+     */
+    private OkHttpUtils() {
+        if (okHttpClient == null) {
+            synchronized (OkHttpUtils.class) {
+                if (okHttpClient == null) {
+                    TrustManager[] trustManagers = buildTrustManagers();
+                    okHttpClient = new OkHttpClient.Builder()
+                            .connectTimeout(15, TimeUnit.SECONDS)
+                            .writeTimeout(20, TimeUnit.SECONDS)
+                            .readTimeout(20, TimeUnit.SECONDS)
+                            .sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])
+                            .hostnameVerifier((hostName, session) -> true)
+                            .retryOnConnectionFailure(true)
+                            .build();
+                    addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
+                }
+            }
+        }
+    }
+
+    /**
+     * 用于异步请求时,控制访问线程数,返回结果
+     *
+     * @return
+     */
+    private static Semaphore getSemaphoreInstance() {
+        //只能1个线程同时访问
+        synchronized (OkHttpUtils.class) {
+            if (semaphore == null) {
+                semaphore = new Semaphore(0);
+            }
+        }
+        return semaphore;
+    }
+
+    /**
+     * 创建OkHttpUtils
+     *
+     * @return
+     */
+    public static OkHttpUtils builder() {
+        return new OkHttpUtils();
+    }
+
+    /**
+     * 添加url
+     *
+     * @param url
+     * @return
+     */
+    public OkHttpUtils url(String url) {
+        this.url = url;
+        return this;
+    }
+
+    /**
+     * 添加参数
+     *
+     * @param key   参数名
+     * @param value 参数值
+     * @return
+     */
+    public OkHttpUtils addPara(String key, String value) {
+        if (paraMap == null) {
+            paraMap = new LinkedHashMap<>(16);
+        }
+        paraMap.put(key, value);
+        return this;
+    }
+
+    /**
+     * 添加参数
+     *
+     * @param key   参数名
+     * @param value 参数值
+     * @return
+     */
+    public OkHttpUtils addBodyPara(String key, String value) {
+        if (bodyParaMap == null) {
+            bodyParaMap = new LinkedHashMap<>(16);
+        }
+        bodyParaMap.put(key, value);
+        return this;
+    }
+
+    public OkHttpUtils addBodyJsonStr(String string) {
+        bodyParaString = string;
+        return this;
+    }
+
+    /**
+     * 添加请求头
+     *
+     * @param key   参数名
+     * @param value 参数值
+     * @return
+     */
+    public OkHttpUtils addHeader(String key, String value) {
+        if (headerMap == null) {
+            headerMap = new LinkedHashMap<>(16);
+        }
+        headerMap.put(key, value);
+        return this;
+    }
+
+    /**
+     * 初始化get方法
+     *
+     * @return
+     */
+    public OkHttpUtils get() {
+        request = new Request.Builder().get();
+        request.url(buildUrl());
+        return this;
+    }
+
+    /**
+     * 初始化post方法
+     */
+    public OkHttpUtils postForm(JSONObject object, MultipartFile file) {
+
+        MultipartBody.Builder formBody = new MultipartBody.Builder();
+        formBody.setType(MultipartBody.FORM);
+
+        for (String s : object.keySet()) {
+            formBody.addFormDataPart(s, StringUtils.isBlank(object.getString(s)) ? "" : object.getString(s));
+        }
+        if (Objects.nonNull(file)) {
+            try {
+                formBody.addFormDataPart("file", file.getOriginalFilename(), RequestBody.create(file.getBytes()));
+            } catch (IOException e) {
+                log.error("文件异常:{}", e.getMessage());
+            }
+        }
+        RequestBody requestBody = formBody.build();
+        // params参数
+        request = new Request.Builder().post(requestBody).url(buildUrl());
+        return this;
+    }
+
+    /**
+     * 初始化post方法
+     *
+     * @param isJsonPost true等于json的方式提交数据,类似postman里post方法的raw
+     *                   false等于普通的表单提交
+     * @return
+     */
+    public OkHttpUtils post(boolean isJsonPost) {
+        RequestBody requestBody;
+        if (isJsonPost) {
+            String json;
+            if (StringUtils.isNotBlank(bodyParaString)) {
+                json = bodyParaString;
+            } else if (!CollectionUtils.isEmpty(bodyParaMap)) {
+                json = JSONObject.toJSONString(bodyParaMap);
+            } else {
+                json = "{}";
+            }
+            requestBody = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));
+        } else {
+            FormBody.Builder formBody = new FormBody.Builder();
+            if (bodyParaMap != null) {
+                bodyParaMap.forEach(formBody::add);
+            }
+            requestBody = formBody.build();
+        }
+        // params参数
+        request = new Request.Builder().post(requestBody).url(buildUrl());
+        return this;
+    }
+
+    private String buildUrl() {
+        StringBuilder urlBuilder = new StringBuilder(url);
+        if (paraMap != null) {
+            urlBuilder.append("?");
+            try {
+                for (Map.Entry<String, String> entry : paraMap.entrySet()) {
+                    urlBuilder.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8)).
+                            append("=").
+                            append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8)).
+                            append("&");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            urlBuilder.deleteCharAt(urlBuilder.length() - 1);
+        }
+        return urlBuilder.toString();
+    }
+
+    /**
+     * 文件下载同步请求
+     *
+     * @return
+     */
+    public byte[] fileSync() {
+        setHeader(request);
+        try {
+            Response response = okHttpClient.newCall(request.build()).execute();
+            if (response.isSuccessful()) {
+                assert response.body() != null;
+                return response.body().bytes();
+            }
+            return new byte[0];
+        } catch (IOException e) {
+            e.printStackTrace();
+            return new byte[0];
+        }
+    }
+
+    /**
+     * 同步请求
+     *
+     * @return
+     */
+    public String sync() {
+        setHeader(request);
+        try {
+            Response response = okHttpClient.newCall(request.build()).execute();
+            assert response.body() != null;
+            return response.body().string();
+        } catch (IOException e) {
+            e.printStackTrace();
+            return "请求失败:" + e.getMessage();
+        }
+    }
+
+    /**
+     * 异步请求,有返回值
+     */
+    public String async() {
+        StringBuilder buffer = new StringBuilder("");
+        setHeader(request);
+        okHttpClient.newCall(request.build()).enqueue(new Callback() {
+            @Override
+            public void onFailure(Call call, IOException e) {
+                buffer.append("请求出错:").append(e.getMessage());
+            }
+
+            @Override
+            public void onResponse(Call call, Response response) throws IOException {
+                assert response.body() != null;
+                buffer.append(response.body().string());
+                getSemaphoreInstance().release();
+            }
+        });
+        try {
+            getSemaphoreInstance().acquire();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return buffer.toString();
+    }
+
+    /**
+     * 异步请求,带有接口回调
+     *
+     * @param callBack
+     */
+    public void async(ICallBack callBack) {
+        setHeader(request);
+        okHttpClient.newCall(request.build()).enqueue(new Callback() {
+            @Override
+            public void onFailure(Call call, IOException e) {
+                callBack.onFailure(call, e.getMessage());
+            }
+
+            @Override
+            public void onResponse(Call call, Response response) throws IOException {
+                assert response.body() != null;
+                callBack.onSuccessful(call, response.body().string());
+            }
+        });
+    }
+
+    /**
+     * 为request添加请求头
+     *
+     * @param request
+     */
+    private void setHeader(Request.Builder request) {
+        if (headerMap != null) {
+            try {
+                for (Map.Entry<String, String> entry : headerMap.entrySet()) {
+                    request.addHeader(entry.getKey(), entry.getValue());
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+    /**
+     * 生成安全套接字工厂,用于https请求的证书跳过
+     *
+     * @return
+     */
+    private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {
+        SSLSocketFactory ssfFactory = null;
+        try {
+            SSLContext sc = SSLContext.getInstance("SSL");
+            sc.init(null, trustAllCerts, new SecureRandom());
+            ssfFactory = sc.getSocketFactory();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ssfFactory;
+    }
+
+    private static TrustManager[] buildTrustManagers() {
+        return new TrustManager[]{
+                new X509TrustManager() {
+                    @Override
+                    public void checkClientTrusted(X509Certificate[] chain, String authType) {
+                    }
+
+                    @Override
+                    public void checkServerTrusted(X509Certificate[] chain, String authType) {
+                    }
+
+                    @Override
+                    public X509Certificate[] getAcceptedIssuers() {
+                        return new X509Certificate[]{};
+                    }
+                }
+        };
+    }
+
+    /**
+     * 自定义一个接口回调
+     */
+    public interface ICallBack {
+
+        void onSuccessful(Call call, String data);
+
+        void onFailure(Call call, String errorMsg);
+
+    }
+
+
+    /**
+     * 使用示例
+     *
+     * @param args
+     * @author xcq
+     * @date 2023-02-21 10:47:28
+     **/
+    public static void main(String[] args) {
+
+//        String sync = OkHttpUtils.builder().url("http://10.10.10.220/api/common/uploadImgCos")
+//                .postForm(new JSONObject(), new byte[0])
+//                .sync();
+//        log.info("交易确认异步通知中台返回->{}", sync);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("1", "123");
+        String sync = OkHttpUtils.builder().url("http://10.10.10.185:9501/contractoa/insertContractOA")
+                .postForm(jsonObject, null)
+                .sync();
+        log.info("返回->{}", sync);
+
+
+    }
+}

+ 73 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/five/util/R.java

@@ -0,0 +1,73 @@
+package com.sckw.transport.five.util;
+
+import lombok.*;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author xcq
+ * @date 2022年06月14日 13:41
+ */
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class R<T> implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Getter
+    @Setter
+    private String msg;
+    @Getter
+    @Setter
+    private Boolean status;
+    @Getter
+    @Setter
+    private String sign;
+    @Getter
+    @Setter
+    private T data;
+
+    public static <T> R<T> ok() {
+        return restResult(null, true, null);
+    }
+
+    public static <T> R<T> ok(T data) {
+        return restResult(data, true, null);
+    }
+
+    public static <T> R<T> ok(T data, String msg) {
+        return restResult(data, true, msg);
+    }
+
+    public static <T> R<T> failed() {
+        return restResult(null, false, null);
+    }
+
+    public static <T> R<T> failed(String msg) {
+        return restResult(null, false, msg);
+    }
+
+    public static <T> R<T> failed(T data) {
+        return restResult(data, false, null);
+    }
+
+    public static <T> R<T> failed(T data, String msg) {
+        return restResult(data, false, msg);
+    }
+
+    public static <T> R<T> failed(T data, String msg, int code) {
+        return restResult(data, false, msg);
+    }
+
+    private static <T> R<T> restResult(T data, Boolean status, String msg) {
+        R<T> apiResult = new R<>();
+        apiResult.setStatus(status);
+        apiResult.setData(data);
+        apiResult.setMsg(msg);
+        return apiResult;
+    }
+}

+ 19 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/ApiLogMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sckw.transport.five.mapper.ApiLogMapper">
+  <resultMap id="BaseResultMap" type="com.sckw.transport.five.entity.ApiLog">
+    <!--@mbg.generated-->
+    <!--@Table api_log-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="msg_id" jdbcType="VARCHAR" property="msgId" />
+    <result column="account" jdbcType="VARCHAR" property="account" />
+    <result column="req_para" jdbcType="LONGVARCHAR" property="reqPara" />
+    <result column="res_data" jdbcType="LONGVARCHAR" property="resData" />
+    <result column="req_time" jdbcType="TIMESTAMP" property="reqTime" />
+    <result column="res_time" jdbcType="TIMESTAMP" property="resTime" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, msg_id, account, req_para, res_data, req_time, res_time
+  </sql>
+</mapper>

+ 19 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/ApiPmiMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sckw.transport.five.mapper.ApiPmiMapper">
+  <resultMap id="BaseResultMap" type="com.sckw.transport.five.entity.ApiPmi">
+    <!--@mbg.generated-->
+    <!--@Table api_pmi-->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="code" jdbcType="VARCHAR" property="code" />
+    <result column="addr" jdbcType="VARCHAR" property="addr" />
+    <result column="desc" jdbcType="VARCHAR" property="desc" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="status" jdbcType="BOOLEAN" property="status" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, `name`, code, addr, `desc`, create_time, `status`
+  </sql>
+</mapper>

+ 18 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/ApiUserMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sckw.transport.five.mapper.ApiUserMapper">
+  <resultMap id="BaseResultMap" type="com.sckw.transport.five.entity.ApiUser">
+    <!--@mbg.generated-->
+    <!--@Table api_user-->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="nickname" jdbcType="VARCHAR" property="nickname" />
+    <result column="account" jdbcType="VARCHAR" property="account" />
+    <result column="pri_key" jdbcType="VARCHAR" property="priKey" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="status" jdbcType="BOOLEAN" property="status" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, nickname, account, pri_key, create_time, `status`
+  </sql>
+</mapper>

+ 26 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/ApiUserPmiMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sckw.transport.five.mapper.ApiUserPmiMapper">
+  <resultMap id="BaseResultMap" type="com.sckw.transport.five.entity.ApiUserPmi">
+    <!--@mbg.generated-->
+    <!--@Table api_user_pmi-->
+    <id column="user_id" jdbcType="INTEGER" property="userId" />
+    <id column="pmi_id" jdbcType="INTEGER" property="pmiId" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    user_id, pmi_id
+  </sql>
+
+  <select id="selectPmi" resultType="com.sckw.transport.five.pojo.UserPmiDto">
+      select aup.user_id userId,
+             aup.pmi_id  pmiId,
+             ap.name,
+             ap.code,
+             ap.addr,
+             ap.status
+      from api_user_pmi aup
+               inner join api_pmi ap on aup.pmi_id = ap.id
+      where aup.user_id = #{id}
+  </select>
+</mapper>

+ 28 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/KwtForkliftWaybillOrderMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sckw.transport.dao.KwtForkliftWaybillOrderMapper">
+    <select id="unloadCar" resultType="com.sckw.transport.five.pojo.UnloadCar">
+        select apg.product_id      as productId,
+               apg.goods_id        as skuId,
+               kfwo.goods_name     as skuName,
+               kfwo.f_order_no     as forkliftNo,
+               kfwo.create_time    as createTime,
+               kfwo.entrust_amount as unloadAmount,
+               kfwo.car_axis       as modelStr,
+               kwo.truck_no        as licensePlate,
+               kwo.driver_name     as driverName,
+               kwo.driver_phone    as driverPhone
+        from kwt_forklift_waybill_order kfwo
+                 inner join api_product_goods apg on kfwo.goods_id = apg.goods_id
+                 inner join kwt_waybill_order kwo on kfwo.w_order_id = kwo.id and kwo.del_flag = 0
+        <where>
+            kfwo.status = 1
+            <if test="productId != null and productId.size != 0">
+                and apg.product_id in
+                <foreach collection="productId" item="item" close=")" open="(" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
+</mapper>