Browse Source

Merge pull request 'feat(all):修改志邦节点数据推送签收逻辑' (#13) from dev into pre-production

Reviewed-on: #13
master
zhaoqiaobo 11 months ago
parent
commit
4deb962a14
  1. 27
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/dto/orderPackageDTO.java
  2. 69
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodeOrderEntity.java
  3. 32
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryNodeOrderMapper.java
  4. 5
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryNodeOrderMapper.xml
  5. 8
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/OrderPackageMapper.java
  6. 18
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/OrderPackageMapper.xml
  7. 281
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mq/ZbomNodeDataPushListener.java
  8. 33
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IFactoryNodeOrderService.java
  9. 7
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IOrderPackageService.java
  10. 61
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/FactoryNodeOrderServiceImpl.java
  11. 12
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/OrderPackageServiceImpl.java
  12. 137
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/QmSignService.java
  13. 39
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/QmSignUntil.java
  14. 52
      blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/vo/OrderPackageSignDTO.java

27
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/dto/orderPackageDTO.java

@ -0,0 +1,27 @@
package com.logpm.factorydata.zbom.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author zhaoqiaobo
* @create 2024-04-08
*/
@Data
public class orderPackageDTO implements Serializable {
/**
* 包条码
*/
private String packageCode;
/**
* 已推送节点
*/
private String pushNode;
/**
* 签收状态
*/
private Integer signStatus;
}

69
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodeOrderEntity.java

@ -0,0 +1,69 @@
package com.logpm.factorydata.zbom.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springblade.core.mp.base.BaseEntity;
/**
* 加盟商单号+发货单号的节点操作数据
*
* @Author zqb
* @Date 2024/3/26
**/
@Builder
@Data
@TableName("zb_factory_node_order")
@ApiModel(value = "发货单号的节点操作数据", description = "发货单号的节点操作数据")
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class ZbFactoryNodeOrderEntity extends BaseEntity {
/**
* 预留1
*/
@ApiModelProperty(name = "预留1", notes = "")
private String reserve1;
/**
* 预留2
*/
@ApiModelProperty(name = "预留2", notes = "")
private String reserve2;
/**
* 预留3
*/
@ApiModelProperty(name = "预留3", notes = "")
private String reserve3;
/**
* 预留4
*/
@ApiModelProperty(name = "预留4", notes = "")
private String reserve4;
/**
* 预留5
*/
@ApiModelProperty(name = "预留5", notes = "")
private String reserve5;
/**
* 发车单号
*/
@ApiModelProperty(name = "发车单号", notes = "")
private String departCode;
/**
* 加盟商单号
*/
@ApiModelProperty(name = "加盟商单号", notes = "")
private String platformOrderCode;
/**
* 已推送过的节点
*/
@ApiModelProperty(name = "已推送过的节点", notes = "")
private String pushNode;
}

32
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryNodeOrderMapper.java

@ -0,0 +1,32 @@
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package com.logpm.factorydata.zbom.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.logpm.factorydata.zbom.entity.ZbFactoryNodeOrderEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 发货单号的节点操作数据 Mapper
*
* @author zqb
* @since 2024-03-26
*/
@Mapper
public interface FactoryNodeOrderMapper extends BaseMapper<ZbFactoryNodeOrderEntity> {
}

5
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryNodeOrderMapper.xml

@ -0,0 +1,5 @@
<?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.logpm.factorydata.zbom.mapper.FactoryNodeOrderMapper">
</mapper>

8
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/OrderPackageMapper.java

@ -19,7 +19,8 @@ package com.logpm.factorydata.zbom.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.logpm.factorydata.zbom.entity.ZbOrderPackageEntity;
import com.logpm.factorydata.zbom.vo.NoSignNumberDTO;
import com.logpm.factorydata.zbom.vo.NodeConfirmParamDTO;
import com.logpm.factorydata.zbom.vo.OrderPackageDTO;
import com.logpm.factorydata.zbom.vo.OrderPackageSignDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -34,9 +35,12 @@ import java.util.List;
@Mapper
public interface OrderPackageMapper extends BaseMapper<ZbOrderPackageEntity> {
List<NodeConfirmParamDTO> findOrderCodebypackageCodes(@Param("packageList") List<String> packageCodeList);
List<OrderPackageSignDTO> findOrderCodebypackageCodes(@Param("packageList") List<String> packageCodeList);
void updateSignForStatus(@Param("packageCodeList") List<String> packageCodeList);
List<NoSignNumberDTO> findNoSignNumber(@Param("packageCodeList") List<String> packageCodeList);
List<OrderPackageDTO> findByPackageCodes(@Param("packageCodeList") List<String> packageCodeList);
}

18
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/OrderPackageMapper.xml

@ -16,9 +16,10 @@
) packageCodeIds where packageCodeIds.pid = t.package_code)
</update>
<select id="findOrderCodebypackageCodes" resultType="com.logpm.factorydata.zbom.vo.NodeConfirmParamDTO">
<select id="findOrderCodebypackageCodes" resultType="com.logpm.factorydata.zbom.vo.OrderPackageSignDTO">
select re.depart_code,
t.platform_order_code,
group_concat(t.package_code) packageCode,
count(*) signQty
from zb_order_package t
left join zb_receipt re on re.id = t.receipt_id
@ -61,5 +62,20 @@
and t.sign_status = 0
group by re.depart_code, t.platform_order_code
</select>
<select id="findByPackageCodes" resultType="com.logpm.factorydata.zbom.vo.OrderPackageDTO">
select t.package_code,t.sign_status,t.push_status from zb_order_package t
where exists(
select 1 from (
<foreach collection="packageCodeList" index="ind" item="item">
<if test="ind == 0">
select #{item} pid
</if>
<if test="ind != 0">
union all
select #{item} pid
</if>
</foreach>
) packageCodeIds where packageCodeIds.pid = t.package_code)
</select>
</mapper>

281
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mq/ZbomNodeDataPushListener.java

@ -2,27 +2,38 @@ package com.logpm.factorydata.zbom.mq;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.logpm.factorydata.enums.BrandEnums;
import com.logpm.factorydata.enums.NodeEnums;
import com.logpm.factorydata.feign.IFactoryDataClient;
import com.logpm.factorydata.vo.NodePushMsg;
import com.logpm.factorydata.vo.SendMsg;
import com.logpm.factorydata.zbom.constants.ZbomConstants;
import com.logpm.factorydata.zbom.entity.ZbFactoryNodeOrderEntity;
import com.logpm.factorydata.zbom.entity.ZbFactoryNodePushEntity;
import com.logpm.factorydata.zbom.entity.ZbFactoryNodePushFailEntity;
import com.logpm.factorydata.zbom.enums.NodeNeedEnums;
import com.logpm.factorydata.zbom.enums.ZbomNodeEnums;
import com.logpm.factorydata.zbom.enums.ZbomNodeMappingEnums;
import com.logpm.factorydata.zbom.pros.ZbFactoryProperties;
import com.logpm.factorydata.zbom.service.IFactoryNodeOrderService;
import com.logpm.factorydata.zbom.service.IFactoryNodePushFailService;
import com.logpm.factorydata.zbom.service.IFactoryNodePushService;
import com.logpm.factorydata.zbom.service.IOrderPackageService;
import com.logpm.factorydata.zbom.util.ZbomUtil;
import com.logpm.factorydata.zbom.vo.NoSignNumberDTO;
import com.logpm.factorydata.zbom.vo.NodeConfirmParamDTO;
import com.logpm.factorydata.zbom.vo.OrderPackageSignDTO;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.factorydata.FactoryDataConstants;
import org.springblade.common.utils.HutoolConfigUtil;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
@ -50,9 +61,29 @@ public class ZbomNodeDataPushListener {
private final IOrderPackageService orderPackageService;
private final IFactoryNodePushFailService nodePushFailService;
private final IFactoryNodePushService nodePushService;
private final IFactoryNodeOrderService nodeOrderService;
private final IFactoryDataClient factoryDataClient;
/**
* 该方法用于监听来自ZBOM节点数据推送的延迟消息
* 通过@RabbitListener注解绑定到特定的队列和交换器以接收特定类型的消息
* 接收到消息后会立即调用nodeDataPush方法处理该消息
*
* @param msg 接收到的消息内容类型为String
*/
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = FactoryDataConstants.Mq.Queues.ZBOM_NODE_DATA_PUSH, durable = "true"),
exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH_DELAYED, type = ExchangeTypes.TOPIC
, delayed = FactoryDataConstants.Mq.DELAYED),
key = FactoryDataConstants.Mq.RoutingKeys.ZBOM_NODE_DATA_PUSH
))
public void nodeDataPushDelayed(String msg) {
// 直接调用nodeDataPush方法处理接收到的消息
nodeDataPush(msg);
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = FactoryDataConstants.Mq.Queues.ZBOM_NODE_DATA_PUSH),
value = @Queue(name = FactoryDataConstants.Mq.Queues.ZBOM_NODE_DATA_PUSH, durable = "true"),
exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, type = ExchangeTypes.TOPIC),
key = FactoryDataConstants.Mq.RoutingKeys.ZBOM_NODE_DATA_PUSH
))
@ -63,9 +94,9 @@ public class ZbomNodeDataPushListener {
if (!checkMsg(msg)) {
return;
}
JSONObject msgEntries = JSONUtil.parseObj(msg);
JSONObject entries = JSONUtil.parseObj(msg);
// 业务数据
List<JSONObject> content = msgEntries.getBeanList("content", JSONObject.class);
List<JSONObject> content = entries.getBeanList("content", JSONObject.class);
List<String> packageCodeList = null;
if (CollUtil.isNotEmpty(content)) {
// 查询这次操作的所有包件和运单号
@ -77,16 +108,102 @@ public class ZbomNodeDataPushListener {
}
}
}
// 处理节点信息
String node = entries.getStr("node");
NodeEnums nodeEnums = EnumUtil.fromString(NodeEnums.class, node);
if (CollUtil.isNotEmpty(packageCodeList)) {
// 根据运单号和自编码分组查询出对应的数量
List<OrderPackageSignDTO> orders = orderPackageService.findOrderCodebypackageCodes(packageCodeList);
// 根据运单号和自编码分组查询出未签收的数量
List<NoSignNumberDTO> noSignNumberDTOS = orderPackageService.findNoSignNumber(packageCodeList);
log.info("未签收数据:{}", JSONUtil.toJsonStr(noSignNumberDTOS));
Map<String, Integer> noSignNumberMap = new HashMap<>();
if (CollUtil.isNotEmpty(noSignNumberDTOS)) {
for (NoSignNumberDTO noSignNumberDTO : noSignNumberDTOS) {
noSignNumberMap.put(noSignNumberDTO.getDepartCode() + noSignNumberDTO.getPlatformOrderCode(), noSignNumberDTO.getNum());
}
}
if (CollUtil.isNotEmpty(orders)) {
for (OrderPackageSignDTO order : orders) {
Boolean flag = Boolean.TRUE;
NodeConfirmParamDTO paramDTO = new NodeConfirmParamDTO();
paramDTO.setDepartCode(order.getDepartCode());
paramDTO.setPlatformOrderCode(order.getPlatformOrderCode());
paramDTO.setSignQty(order.getSignQty());
order.setOperator(entries.getStr("operator"));
paramDTO.setOperator(entries.getStr("operator"));
order.setOperatorTime(entries.getStr("operatorTime"));
paramDTO.setOperatorTime(entries.getStr("operatorTime"));
order.setAddress(entries.getStr("address"));
paramDTO.setAddress(entries.getStr("address"));
// 如果是签收节点,需要判断是否为全部签收和部分签收
if (EnumUtil.equals(NodeEnums.CLERK_REVIEW, node)) {
ZbFactoryNodeOrderEntity nodeOrder = nodeOrderService.getOne(Wrappers.<ZbFactoryNodeOrderEntity>lambdaQuery()
.eq(ZbFactoryNodeOrderEntity::getPlatformOrderCode, paramDTO.getPlatformOrderCode())
.eq(ZbFactoryNodeOrderEntity::getDepartCode, paramDTO.getDepartCode())
);
if (ObjectUtil.isNotEmpty(nodeOrder)) {
flag = Boolean.FALSE;
}
log.info("key:{},签收数量:{}", paramDTO.getDepartCode() + "_" + paramDTO.getPlatformOrderCode(), paramDTO.getSignQty());
Integer signNumber = Convert.toInt(paramDTO.getSignQty());
// 查询当前未签收的数量与当前签收数量比较,如果未签收数较大,则是部分签收
String key = paramDTO.getDepartCode() + paramDTO.getPlatformOrderCode();
// 部分签收
paramDTO.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums, ZbomConstants.Status.SIGN_FOR_SECTION_STATUS).getCode());
if (ObjectUtil.isNotEmpty(noSignNumberMap) && noSignNumberMap.containsKey(key)) {
Integer noSignNum = noSignNumberMap.get(key);
if (noSignNum <= signNumber) {
// 全部签收
paramDTO.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums, ZbomConstants.Status.SIGN_FOR_ALL_STATUS).getCode());
}
} else {
continue;
}
// 第一次签收,节点改为送货抵达
if (flag) {
paramDTO.setRejectQty("");
paramDTO.setSignQty("");
paramDTO.setNode(ZbomNodeEnums.DELIVERY_ARRIVAL.getCode());
}
} else {
paramDTO.setRejectQty("");
paramDTO.setSignQty("");
paramDTO.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums).getCode());
}
// 构建参数对象
List<NodeConfirmParamDTO> nodeConfirmParams = initParam(msgEntries, packageCodeList);
try {
// 推送给志邦
if (CollUtil.isNotEmpty(nodeConfirmParams)) {
for (NodeConfirmParamDTO nodeConfirmParam : nodeConfirmParams) {
String body = JSONUtil.toJsonStr(nodeConfirmParam);
// if (CollUtil.isNotEmpty(nodeConfirmParams)) {
// for (NodeConfirmParamDTO nodeConfirmParam : nodeConfirmParams) {
String body = JSONUtil.toJsonStr(paramDTO);
String result = ZbomUtil.pushZbomSystem(zbProperties, body, ZbomConstants.Method.ROUTE_NODE_CONFIRM);
// JSONObject jsonObject = new JSONObject();
// jsonObject.set("code", "0");
// String result = JSONUtil.toJsonStr(jsonObject);
log.info("zb节点推送数据:参数{},返回值{}。", body, result);
saveResult(entries, packageCodeList, order, body, result, flag);
// }
// }
} catch (Exception e) {
// 处理推送不成功的异常情况
log.error("zb节点推送数据异常:{}", e);
// 保存日志
e.printStackTrace();
}
}
}
// 构建参数对象
// List<NodeConfirmParamDTO> nodeConfirmParams = initParam(msgEntries, packageCodeList);
}
}
private void saveResult(JSONObject msgEntries, List<String> packageCodeList, OrderPackageSignDTO
nodeConfirmParam, String body, String result, Boolean flag) {
if (StrUtil.isNotBlank(result)) {
ZbFactoryNodePushFailEntity build = ZbFactoryNodePushFailEntity.builder().content(body).resultContent(result).build();
if (!StrUtil.contains(result, "code")) {
@ -111,72 +228,106 @@ public class ZbomNodeDataPushListener {
String node = msgEntries.getStr("node");
NodeEnums nodeEnums = EnumUtil.fromString(NodeEnums.class, node);
if (ObjectUtil.equal(nodeEnums, NodeEnums.CLERK_REVIEW)) {
if (!flag) {
// 修改订单包件表的签收状态
orderPackageService.updateSignForStatus(packageCodeList);
List<String> packages = CollUtil.newArrayList(nodeConfirmParam.getPackageCode().split(","));
orderPackageService.updateSignForStatus(packages);
// 修改加盟商单号+发货单号节点数据
nodeOrderService.updateNodeOrder(nodeConfirmParam);
} else {
List<Object> js = new ArrayList<>();
String packageCode = nodeConfirmParam.getPackageCode();
for (String s : packageCode.split(",")) {
JSONObject entries1 = new JSONObject();
entries1.set("packageCode", s);
js.add(entries1);
}
NodePushMsg nodePushMsg = NodePushMsg.builder()
.node(NodeEnums.CLERK_REVIEW)
.operator(nodeConfirmParam.getOperator())
.operatorTime(DateUtil.parseDateTime(nodeConfirmParam.getOperatorTime()))
.address(nodeConfirmParam.getAddress())
.brand(BrandEnums.ZB)
.address(nodeConfirmParam.getAddress())
.content(js)
.build();
SendMsg message = SendMsg.builder()
.delay(30 * 60 * 1000)
.exchange(FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH_DELAYED)
.routingKey(FactoryDataConstants.Mq.RoutingKeys.ZBOM_NODE_DATA_PUSH)
.message(JSONUtil.toJsonStr(nodePushMsg, HutoolConfigUtil.jsonConfigByDataTimeFormat()))
.build();
factoryDataClient.sendMessage(message);
}
}
}
}
}
} catch (Exception e) {
// 处理推送不成功的异常情况
log.error("zb节点推送数据异常:{}", e);
e.printStackTrace();
}
}
private List<NodeConfirmParamDTO> initParam(JSONObject entries, List<String> packageCodeList) {
// 处理节点信息
String node = entries.getStr("node");
NodeEnums nodeEnums = EnumUtil.fromString(NodeEnums.class, node);
if (CollUtil.isNotEmpty(packageCodeList)) {
// 根据运单号和自编码分组查询出对应的数量
List<NodeConfirmParamDTO> orders = orderPackageService.findOrderCodebypackageCodes(packageCodeList);
// 根据运单号和自编码分组查询出未签收的数量
List<NoSignNumberDTO> noSignNumberDTOS = orderPackageService.findNoSignNumber(packageCodeList);
log.info("未签收数据:{}", JSONUtil.toJsonStr(noSignNumberDTOS));
Map<String, Integer> noSignNumberMap = new HashMap<>();
if (CollUtil.isNotEmpty(noSignNumberDTOS)) {
for (NoSignNumberDTO noSignNumberDTO : noSignNumberDTOS) {
noSignNumberMap.put(noSignNumberDTO.getDepartCode() + noSignNumberDTO.getPlatformOrderCode(), noSignNumberDTO.getNum());
}
}
if (CollUtil.isNotEmpty(orders)) {
for (NodeConfirmParamDTO order : orders) {
order.setOperator(entries.getStr("operator"));
order.setOperatorTime(entries.getStr("operatorTime"));
order.setAddress(entries.getStr("address"));
// 如果是签收节点,需要判断是否为全部签收和部分签收
if (EnumUtil.equals(NodeEnums.CLERK_REVIEW, node)) {
log.info("key:{},签收数量:{}", order.getDepartCode() + "_" + order.getPlatformOrderCode(), order.getSignQty());
Integer signNumber = Convert.toInt(order.getSignQty());
// 查询当前未签收的数量与当前签收数量比较,如果未签收数较大,则是部分签收
String key = order.getDepartCode() + order.getPlatformOrderCode();
// 部分签收
order.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums, ZbomConstants.Status.SIGN_FOR_SECTION_STATUS).getCode());
if (ObjectUtil.isNotEmpty(noSignNumberMap) && noSignNumberMap.containsKey(key)) {
Integer noSignNum = noSignNumberMap.get(key);
if (noSignNum <= signNumber) {
// 全部签收
order.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums, ZbomConstants.Status.SIGN_FOR_ALL_STATUS).getCode());
}
} else {
continue;
}
} else {
order.setRejectQty("");
order.setSignQty("");
order.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums).getCode());
}
}
}
return orders;
}
return null;
}
// private List<NodeConfirmParamDTO> initParam(JSONObject entries, List<String> packageCodeList) {
// // 处理节点信息
// String node = entries.getStr("node");
// NodeEnums nodeEnums = EnumUtil.fromString(NodeEnums.class, node);
// if (CollUtil.isNotEmpty(packageCodeList)) {
// // 根据运单号和自编码分组查询出对应的数量
// List<NodeConfirmParamDTO> orders = orderPackageService.findOrderCodebypackageCodes(packageCodeList);
// // 根据运单号和自编码分组查询出未签收的数量
// List<NoSignNumberDTO> noSignNumberDTOS = orderPackageService.findNoSignNumber(packageCodeList);
// log.info("未签收数据:{}", JSONUtil.toJsonStr(noSignNumberDTOS));
// Map<String, Integer> noSignNumberMap = new HashMap<>();
// if (CollUtil.isNotEmpty(noSignNumberDTOS)) {
// for (NoSignNumberDTO noSignNumberDTO : noSignNumberDTOS) {
// noSignNumberMap.put(noSignNumberDTO.getDepartCode() + noSignNumberDTO.getPlatformOrderCode(), noSignNumberDTO.getNum());
// }
// }
// if (CollUtil.isNotEmpty(orders)) {
// for (NodeConfirmParamDTO order : orders) {
// order.setOperator(entries.getStr("operator"));
// order.setOperatorTime(entries.getStr("operatorTime"));
// order.setAddress(entries.getStr("address"));
// // 如果是签收节点,需要判断是否为全部签收和部分签收
// if (EnumUtil.equals(NodeEnums.CLERK_REVIEW, node)) {
// ZbFactoryNodeOrderEntity nodeOrder = nodeOrderService.getOne(Wrappers.<ZbFactoryNodeOrderEntity>lambdaQuery()
// .eq(ZbFactoryNodeOrderEntity::getPlatformOrderCode, order.getPlatformOrderCode())
// .eq(ZbFactoryNodeOrderEntity::getDepartCode, order.getDepartCode())
// );
// Boolean flag = Boolean.FALSE;
// if (ObjectUtil.isNotEmpty(nodeOrder)) {
// flag = Boolean.TRUE;
// }
// log.info("key:{},签收数量:{}", order.getDepartCode() + "_" + order.getPlatformOrderCode(), order.getSignQty());
// Integer signNumber = Convert.toInt(order.getSignQty());
// // 查询当前未签收的数量与当前签收数量比较,如果未签收数较大,则是部分签收
// String key = order.getDepartCode() + order.getPlatformOrderCode();
// // 部分签收
// order.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums, ZbomConstants.Status.SIGN_FOR_SECTION_STATUS).getCode());
// if (ObjectUtil.isNotEmpty(noSignNumberMap) && noSignNumberMap.containsKey(key)) {
// Integer noSignNum = noSignNumberMap.get(key);
// if (noSignNum <= signNumber) {
// // 全部签收
// order.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums, ZbomConstants.Status.SIGN_FOR_ALL_STATUS).getCode());
// }
// } else {
// continue;
// }
// // 第一次签收,节点改为送货抵达
// if (flag) {
// order.setRejectQty("");
// order.setSignQty("");
// order.setNode(ZbomNodeEnums.DELIVERY_ARRIVAL.getCode());
// }
// } else {
// order.setRejectQty("");
// order.setSignQty("");
// order.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums).getCode());
// }
// }
// }
// return orders;
// }
// return null;
// }
private boolean checkMsg(String msg) {
Boolean flag = Boolean.FALSE;

33
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IFactoryNodeOrderService.java

@ -0,0 +1,33 @@
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package com.logpm.factorydata.zbom.service;
import com.logpm.factorydata.zbom.entity.ZbFactoryNodeOrderEntity;
import com.logpm.factorydata.zbom.vo.OrderPackageSignDTO;
import org.springblade.core.mp.base.BaseService;
/**
* 发货单号的节点操作数据 服务类
*
* @author pref
* @since 2023-08-21
*/
public interface IFactoryNodeOrderService extends BaseService<ZbFactoryNodeOrderEntity> {
void updateNodeOrder(OrderPackageSignDTO nodeConfirmParam);
}

7
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IOrderPackageService.java

@ -18,7 +18,8 @@ package com.logpm.factorydata.zbom.service;
import com.logpm.factorydata.zbom.entity.ZbOrderPackageEntity;
import com.logpm.factorydata.zbom.vo.NoSignNumberDTO;
import com.logpm.factorydata.zbom.vo.NodeConfirmParamDTO;
import com.logpm.factorydata.zbom.vo.OrderPackageDTO;
import com.logpm.factorydata.zbom.vo.OrderPackageSignDTO;
import org.springblade.core.mp.base.BaseService;
import java.util.List;
@ -31,9 +32,11 @@ import java.util.List;
*/
public interface IOrderPackageService extends BaseService<ZbOrderPackageEntity> {
List<NodeConfirmParamDTO> findOrderCodebypackageCodes(List<String> packageCodeList);
List<OrderPackageSignDTO> findOrderCodebypackageCodes(List<String> packageCodeList);
void updateSignForStatus(List<String> packageCodeList);
List<NoSignNumberDTO> findNoSignNumber(List<String> packageCodeList);
List<OrderPackageDTO> findByPackageCodes(List<String> packageCodeList);
}

61
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/FactoryNodeOrderServiceImpl.java

@ -0,0 +1,61 @@
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package com.logpm.factorydata.zbom.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.logpm.factorydata.enums.NodeEnums;
import com.logpm.factorydata.zbom.entity.ZbFactoryNodeOrderEntity;
import com.logpm.factorydata.zbom.mapper.FactoryNodeOrderMapper;
import com.logpm.factorydata.zbom.service.IFactoryNodeOrderService;
import com.logpm.factorydata.zbom.vo.OrderPackageSignDTO;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.stereotype.Service;
/**
* 发货单号的节点操作数据 服务实现类
*
* @author zqb
* @since 2024-04-08
*/
@Slf4j
@Service
@AllArgsConstructor
public class FactoryNodeOrderServiceImpl extends BaseServiceImpl<FactoryNodeOrderMapper, ZbFactoryNodeOrderEntity> implements IFactoryNodeOrderService {
@Override
public void updateNodeOrder(OrderPackageSignDTO nodeConfirmParam) {
LambdaQueryWrapper<ZbFactoryNodeOrderEntity> wrapper = Wrappers.<ZbFactoryNodeOrderEntity>lambdaQuery()
.eq(ZbFactoryNodeOrderEntity::getPlatformOrderCode, nodeConfirmParam.getPlatformOrderCode())
.eq(ZbFactoryNodeOrderEntity::getDepartCode, nodeConfirmParam.getDepartCode());
ZbFactoryNodeOrderEntity zbFactoryNodeOrderEntity = this.baseMapper.selectOne(wrapper);
if (ObjectUtil.isEmpty(zbFactoryNodeOrderEntity)) {
zbFactoryNodeOrderEntity = new ZbFactoryNodeOrderEntity();
zbFactoryNodeOrderEntity.setPlatformOrderCode(nodeConfirmParam.getPlatformOrderCode());
zbFactoryNodeOrderEntity.setDepartCode(nodeConfirmParam.getDepartCode());
}
zbFactoryNodeOrderEntity.setPushNode(NodeEnums.CLERK_REVIEW.getCode().toString());
// String pushNode = zbFactoryNodeOrderEntity.getPushNode();
// String join = StrUtil.join(",", pushNode, NodeEnums.CLERK_REVIEW.getCode());
// zbFactoryNodeOrderEntity.setPushNode(join);
this.saveOrUpdate(zbFactoryNodeOrderEntity);
}
}

12
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/OrderPackageServiceImpl.java

@ -20,7 +20,8 @@ import com.logpm.factorydata.zbom.entity.ZbOrderPackageEntity;
import com.logpm.factorydata.zbom.mapper.OrderPackageMapper;
import com.logpm.factorydata.zbom.service.IOrderPackageService;
import com.logpm.factorydata.zbom.vo.NoSignNumberDTO;
import com.logpm.factorydata.zbom.vo.NodeConfirmParamDTO;
import com.logpm.factorydata.zbom.vo.OrderPackageDTO;
import com.logpm.factorydata.zbom.vo.OrderPackageSignDTO;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.stereotype.Service;
@ -36,8 +37,8 @@ import java.util.List;
public class OrderPackageServiceImpl extends BaseServiceImpl<OrderPackageMapper, ZbOrderPackageEntity> implements IOrderPackageService {
@Override
public List<NodeConfirmParamDTO> findOrderCodebypackageCodes(List<String> packageCodeList) {
List<NodeConfirmParamDTO> orders = this.baseMapper.findOrderCodebypackageCodes(packageCodeList);
public List<OrderPackageSignDTO> findOrderCodebypackageCodes(List<String> packageCodeList) {
List<OrderPackageSignDTO> orders = this.baseMapper.findOrderCodebypackageCodes(packageCodeList);
return orders;
}
@ -50,4 +51,9 @@ public class OrderPackageServiceImpl extends BaseServiceImpl<OrderPackageMapper,
public List<NoSignNumberDTO> findNoSignNumber(List<String> packageCodeList) {
return this.baseMapper.findNoSignNumber(packageCodeList);
}
@Override
public List<OrderPackageDTO> findByPackageCodes(List<String> packageCodeList) {
return this.baseMapper.findByPackageCodes(packageCodeList);
}
}

137
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/QmSignService.java

@ -0,0 +1,137 @@
package com.logpm.factorydata.zbom.util;
import org.springframework.stereotype.Service;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Service
class QmSignService {
/**
* @param params 参数
* @param secret 秘钥
* @param signMethod 加密方式
* @param body 消息体
* @return
* @throws Exception
*/
public static String signTopRequest(Map<String, String> params, String secret, String signMethod, String body) throws Exception {
// 第一步:检查参数是否已经排序
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
// 第二步:把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder();
if ("md5".equalsIgnoreCase(signMethod)) {
query.append(secret);
}
for (String key : keys) {
String value = params.get(key);
String[] array = new String[2];
array[0] = key;
array[1] = value;
if (areNotEmpty(array)) {
query.append(key).append(value);
}
}
// 第三步:使用MD5/HMAC加密
byte[] bytes;
if ("hmac".equalsIgnoreCase(signMethod)) {
bytes = encryptHMAC(query.toString(), secret);
} else {
query.append(body.replaceAll("\\s+", "")).append(secret);
bytes = encryptMD5(query.toString());
}
// 第四步:把二进制转化为大写的十六进制(正确签名应该为32大写字符串,此方法需要时使用)
return byte2hex(bytes);
}
public static boolean areNotEmpty(String[] values) {
boolean result = true;
if ((values == null) || (values.length == 0))
result = false;
else {
for (String value : values) {
result &= !isEmpty(value);
}
}
return result;
}
static boolean isEmpty(String value) {
int strLen;
if ((value == null) || ((strLen = value.length()) == 0))
return true;
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(value.charAt(i))) {
return false;
}
}
return true;
}
static byte[] encryptHMAC(String data, String secret) throws IOException {
byte[] bytes = null;
try {
SecretKey secretKey = new SecretKeySpec(secret.getBytes("utf-8"), "HmacMD5");
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
bytes = mac.doFinal(data.getBytes("utf-8"));
} catch (GeneralSecurityException gse) {
throw new IOException(gse.toString());
}
return bytes;
}
public static byte[] encryptMD5(String data) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(data.getBytes("utf-8"));
return bytes;
// return encryptMD5(data.getBytes(Constants.CHARSET_UTF8));
}
public static String byte2hex(byte[] bytes) {
StringBuilder sign = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex.toUpperCase());
}
return sign.toString();
}
public static void main(String[] args) {
Map<String, String> params = new HashMap<>();
params.put("method", "route.node.confirm");
params.put("timestamp", "2024-04-08 17:47:54");
params.put("format", "json");
params.put("app_key", "HT");
params.put("v", "1.0");
params.put("sign_method", "md5");
params.put("customerId", "HT");
try {
String body = "{\"departCode\":\"937961\",\"platformOrderCode\":\"曲靖202312031\",\"node\":\"T20200\",\"address\":\"test\",\"operator\":\"test\",\"operatorTime\":\"2024-04-0805:47:52\",\"signQty\":\"1\",\"rejectQty\":\"\"}";
String newSign = signTopRequest(params, "HT", "md5", body);
System.out.println("==========================================");
System.out.println(newSign);
} catch (Exception e) {
e.printStackTrace();
}
}
}

39
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/QmSignUntil.java

@ -7,6 +7,7 @@ import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@ -109,28 +110,28 @@ public class QmSignUntil {
}
// public static void main(String[] args) {
//
// Map<String, String> params = new HashMap<>();
// params.put("app_key","HT");
// params.put("customerid","HT");
// params.put("format","json");
// params.put("method","entry.order.create");
// params.put("sign_method","md5");
// params.put("timestamp","2015-04-26 00:00:07");
// params.put("v","1.0");
//
public static void main(String[] args) {
Map<String, String> params = new HashMap<>();
params.put("app_key","HT");
params.put("customerId","HT");
params.put("format","json");
params.put("method","route.node.confirm");
params.put("sign_method","md5");
params.put("timestamp","2024-04-08 17:47:54");
params.put("v","1.0");
String body = "{\"departCode\":\"937961\",\"platformOrderCode\":\"曲靖202312031\",\"node\":\"T20200\",\"address\":\"test\",\"operator\":\"test\",\"operatorTime\":\"2024-04-0805:47:52\",\"signQty\":\"1\",\"rejectQty\":\"\"}";
// JSONObject jsonObject = new JSONObject();
// jsonObject.put("name","name12345");
// jsonObject.put("age",10);
//
// try {
// String s = QmSignUntil.signTopRequest(params, "test", "md5", jsonObject.toJSONString());
// System.out.println(s);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
try {
String s = QmSignUntil.signTopRequest(params, "HT", "md5", body);
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}

52
blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/vo/OrderPackageSignDTO.java

@ -0,0 +1,52 @@
package com.logpm.factorydata.zbom.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 订单包件签收信息
*
* @author zhaoqiaobo
* @create 2024-03-21 15:04
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrderPackageSignDTO implements Serializable {
/**
* 发运单号
*/
private String departCode;
/**
* 加盟商单号
*/
private String platformOrderCode;
/**
* 包条码
*/
private String packageCode;
/**
* 签收数量
*/
private String signQty;
/**
* 地址 在途节点 需要提供详细的地址
*/
private String address;
/**
* 操作人 必填
*/
private String operator;
/**
* 操作时间 必填
*/
private String operatorTime;
}
Loading…
Cancel
Save