diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/dto/orderPackageDTO.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/dto/orderPackageDTO.java new file mode 100644 index 000000000..959414cf8 --- /dev/null +++ b/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; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodeOrderEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodeOrderEntity.java new file mode 100644 index 000000000..9ea26460b --- /dev/null +++ b/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; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryNodeOrderMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryNodeOrderMapper.java new file mode 100644 index 000000000..4fb724fbd --- /dev/null +++ b/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 { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryNodeOrderMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryNodeOrderMapper.xml new file mode 100644 index 000000000..ae2853be0 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryNodeOrderMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/OrderPackageMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/OrderPackageMapper.java index c7c795dcb..ce8ee4e53 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/OrderPackageMapper.java +++ b/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 { - List findOrderCodebypackageCodes(@Param("packageList") List packageCodeList); + List findOrderCodebypackageCodes(@Param("packageList") List packageCodeList); void updateSignForStatus(@Param("packageCodeList") List packageCodeList); List findNoSignNumber(@Param("packageCodeList") List packageCodeList); + + List findByPackageCodes(@Param("packageCodeList") List packageCodeList); + } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/OrderPackageMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/OrderPackageMapper.xml index 444abdfcf..0a1bf8f63 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/OrderPackageMapper.xml +++ b/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) - 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 + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mq/ZbomNodeDataPushListener.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mq/ZbomNodeDataPushListener.java index bb29aef4b..b00eaf969 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mq/ZbomNodeDataPushListener.java +++ b/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), + 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, 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 content = msgEntries.getBeanList("content", JSONObject.class); + List content = entries.getBeanList("content", JSONObject.class); List packageCodeList = null; if (CollUtil.isNotEmpty(content)) { // 查询这次操作的所有包件和运单号 @@ -77,64 +108,12 @@ public class ZbomNodeDataPushListener { } } } - - // 构建参数对象 - List nodeConfirmParams = initParam(msgEntries, packageCodeList); - try { - // 推送给志邦 - if (CollUtil.isNotEmpty(nodeConfirmParams)) { - for (NodeConfirmParamDTO nodeConfirmParam : nodeConfirmParams) { - String body = JSONUtil.toJsonStr(nodeConfirmParam); - String result = ZbomUtil.pushZbomSystem(zbProperties, body, ZbomConstants.Method.ROUTE_NODE_CONFIRM); - log.info("zb节点推送数据:参数{},返回值{}。", body, result); - if (StrUtil.isNotBlank(result)) { - ZbFactoryNodePushFailEntity build = ZbFactoryNodePushFailEntity.builder().content(body).resultContent(result).build(); - if (!StrUtil.contains(result, "code")) { - // 推送失败 - nodePushFailService.save(build); - } else { - JSONObject entries = JSONUtil.parseObj(result); - String code = entries.getStr("code"); - if (ObjectUtil.equal(code, "1")) { - // 推送失败 - nodePushFailService.save(build); - } - if (ObjectUtil.equal(code, "0")) { - ZbFactoryNodePushEntity pushEntity = ZbFactoryNodePushEntity.builder() - .departCode(nodeConfirmParam.getDepartCode()) - .platformOrderCode(nodeConfirmParam.getPlatformOrderCode()) - .content(body) - .resultContent(result) - .build(); - // 推送成功 - nodePushService.save(pushEntity); - String node = msgEntries.getStr("node"); - NodeEnums nodeEnums = EnumUtil.fromString(NodeEnums.class, node); - if (ObjectUtil.equal(nodeEnums, NodeEnums.CLERK_REVIEW)) { - // 修改订单包件表的签收状态 - orderPackageService.updateSignForStatus(packageCodeList); - } - } - } - } - } - } - - } catch (Exception e) { - // 处理推送不成功的异常情况 - log.error("zb节点推送数据异常:{}", e); - e.printStackTrace(); - } - - } - - private List initParam(JSONObject entries, List packageCodeList) { // 处理节点信息 String node = entries.getStr("node"); NodeEnums nodeEnums = EnumUtil.fromString(NodeEnums.class, node); if (CollUtil.isNotEmpty(packageCodeList)) { // 根据运单号和自编码分组查询出对应的数量 - List orders = orderPackageService.findOrderCodebypackageCodes(packageCodeList); + List orders = orderPackageService.findOrderCodebypackageCodes(packageCodeList); // 根据运单号和自编码分组查询出未签收的数量 List noSignNumberDTOS = orderPackageService.findNoSignNumber(packageCodeList); log.info("未签收数据:{}", JSONUtil.toJsonStr(noSignNumberDTOS)); @@ -145,39 +124,211 @@ public class ZbomNodeDataPushListener { } } if (CollUtil.isNotEmpty(orders)) { - for (NodeConfirmParamDTO order : 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)) { - log.info("key:{},签收数量:{}", order.getDepartCode() + "_" + order.getPlatformOrderCode(), order.getSignQty()); - Integer signNumber = Convert.toInt(order.getSignQty()); + ZbFactoryNodeOrderEntity nodeOrder = nodeOrderService.getOne(Wrappers.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 = order.getDepartCode() + order.getPlatformOrderCode(); + String key = paramDTO.getDepartCode() + paramDTO.getPlatformOrderCode(); // 部分签收 - order.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums, ZbomConstants.Status.SIGN_FOR_SECTION_STATUS).getCode()); + 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) { // 全部签收 - order.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums, ZbomConstants.Status.SIGN_FOR_ALL_STATUS).getCode()); + 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 { - order.setRejectQty(""); - order.setSignQty(""); - order.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums).getCode()); + paramDTO.setRejectQty(""); + paramDTO.setSignQty(""); + paramDTO.setNode(ZbomNodeMappingEnums.getZbomByNodeAndStatus(nodeEnums).getCode()); + } + + try { + // 推送给志邦 +// 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(); } } } - return orders; + + // 构建参数对象 +// List nodeConfirmParams = initParam(msgEntries, packageCodeList); + } - return null; + } + private void saveResult(JSONObject msgEntries, List 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")) { + // 推送失败 + nodePushFailService.save(build); + } else { + JSONObject entries = JSONUtil.parseObj(result); + String code = entries.getStr("code"); + if (ObjectUtil.equal(code, "1")) { + // 推送失败 + nodePushFailService.save(build); + } + if (ObjectUtil.equal(code, "0")) { + ZbFactoryNodePushEntity pushEntity = ZbFactoryNodePushEntity.builder() + .departCode(nodeConfirmParam.getDepartCode()) + .platformOrderCode(nodeConfirmParam.getPlatformOrderCode()) + .content(body) + .resultContent(result) + .build(); + // 推送成功 + nodePushService.save(pushEntity); + String node = msgEntries.getStr("node"); + NodeEnums nodeEnums = EnumUtil.fromString(NodeEnums.class, node); + if (ObjectUtil.equal(nodeEnums, NodeEnums.CLERK_REVIEW)) { + if (!flag) { + // 修改订单包件表的签收状态 + List packages = CollUtil.newArrayList(nodeConfirmParam.getPackageCode().split(",")); + orderPackageService.updateSignForStatus(packages); + // 修改加盟商单号+发货单号节点数据 + nodeOrderService.updateNodeOrder(nodeConfirmParam); + } else { + List 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); + } + } + } + } + } + } + +// private List initParam(JSONObject entries, List packageCodeList) { +// // 处理节点信息 +// String node = entries.getStr("node"); +// NodeEnums nodeEnums = EnumUtil.fromString(NodeEnums.class, node); +// if (CollUtil.isNotEmpty(packageCodeList)) { +// // 根据运单号和自编码分组查询出对应的数量 +// List orders = orderPackageService.findOrderCodebypackageCodes(packageCodeList); +// // 根据运单号和自编码分组查询出未签收的数量 +// List noSignNumberDTOS = orderPackageService.findNoSignNumber(packageCodeList); +// log.info("未签收数据:{}", JSONUtil.toJsonStr(noSignNumberDTOS)); +// Map 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.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; if (StrUtil.isBlank(msg)) { diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IFactoryNodeOrderService.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IFactoryNodeOrderService.java new file mode 100644 index 000000000..460a9a7f0 --- /dev/null +++ b/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 { + + void updateNodeOrder(OrderPackageSignDTO nodeConfirmParam); + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IOrderPackageService.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IOrderPackageService.java index 821ee7f5e..a1d45cc6b 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IOrderPackageService.java +++ b/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 { - List findOrderCodebypackageCodes(List packageCodeList); + List findOrderCodebypackageCodes(List packageCodeList); void updateSignForStatus(List packageCodeList); List findNoSignNumber(List packageCodeList); + + List findByPackageCodes(List packageCodeList); } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/FactoryNodeOrderServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/FactoryNodeOrderServiceImpl.java new file mode 100644 index 000000000..5b6105422 --- /dev/null +++ b/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 implements IFactoryNodeOrderService { + + @Override + public void updateNodeOrder(OrderPackageSignDTO nodeConfirmParam) { + LambdaQueryWrapper wrapper = Wrappers.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); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/OrderPackageServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/OrderPackageServiceImpl.java index bfced1adc..d20fa6d5e 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/OrderPackageServiceImpl.java +++ b/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 implements IOrderPackageService { @Override - public List findOrderCodebypackageCodes(List packageCodeList) { - List orders = this.baseMapper.findOrderCodebypackageCodes(packageCodeList); + public List findOrderCodebypackageCodes(List packageCodeList) { + List orders = this.baseMapper.findOrderCodebypackageCodes(packageCodeList); return orders; } @@ -50,4 +51,9 @@ public class OrderPackageServiceImpl extends BaseServiceImpl findNoSignNumber(List packageCodeList) { return this.baseMapper.findNoSignNumber(packageCodeList); } + + @Override + public List findByPackageCodes(List packageCodeList) { + return this.baseMapper.findByPackageCodes(packageCodeList); + } } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/QmSignService.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/QmSignService.java new file mode 100644 index 000000000..dc1553b54 --- /dev/null +++ b/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 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 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(); + } + + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/QmSignUntil.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/QmSignUntil.java index f43f670ee..abbfc4503 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/QmSignUntil.java +++ b/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 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 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(); + } + } } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/vo/OrderPackageSignDTO.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/vo/OrderPackageSignDTO.java new file mode 100644 index 000000000..88be32b09 --- /dev/null +++ b/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; + +}