diff --git a/blade-biz-common/src/main/java/org/springblade/common/annotations/ChangeAsync.java b/blade-biz-common/src/main/java/org/springblade/common/annotations/ChangeAsync.java new file mode 100644 index 000000000..725ff4f6c --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/annotations/ChangeAsync.java @@ -0,0 +1,14 @@ +package org.springblade.common.annotations; + +import org.springframework.scheduling.annotation.Async; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ChangeAsync { + String value() default ""; +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/annotations/LocalServerUser.java b/blade-biz-common/src/main/java/org/springblade/common/annotations/LocalServerUser.java new file mode 100644 index 000000000..00f2276be --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/annotations/LocalServerUser.java @@ -0,0 +1,22 @@ +package org.springblade.common.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 特俗标记 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD}) +public @interface LocalServerUser { + /**‘ + * 匹配值 + * factory:工厂系统 + * 6278683: 租户 + * factory-data: 租户 + * @return + */ + String ds() default ""; +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/annotations/LogpmAsync.java b/blade-biz-common/src/main/java/org/springblade/common/annotations/LogpmAsync.java new file mode 100644 index 000000000..7dd683365 --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/annotations/LogpmAsync.java @@ -0,0 +1,15 @@ +package org.springblade.common.annotations; + +import org.springframework.scheduling.annotation.Async; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Async("asyncExecutor") +public @interface LogpmAsync { + String value(); +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/annotations/RepeatSubmit.java b/blade-biz-common/src/main/java/org/springblade/common/annotations/RepeatSubmit.java new file mode 100644 index 000000000..28f0a4827 --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/annotations/RepeatSubmit.java @@ -0,0 +1,11 @@ +package org.springblade.common.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface RepeatSubmit { +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/cache/CacheNames.java b/blade-biz-common/src/main/java/org/springblade/common/cache/CacheNames.java index 8fd2da967..77adba6a8 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/cache/CacheNames.java +++ b/blade-biz-common/src/main/java/org/springblade/common/cache/CacheNames.java @@ -78,4 +78,14 @@ public interface CacheNames { * 用户能操作的仓库 */ String USER_WAREHOUSE_OWN = "logpm:user:warehouse:own:"; + + /** + * 模拟登录缓存对象 + */ + String LOCAL_SERVER_USER = "logpm:user:local:user:"; + + /** + * 模拟登录缓存对象 + */ + String USER_TABLE_SET = "user:table:set:"; } diff --git a/blade-biz-common/src/main/java/org/springblade/common/component/MockLoginService.java b/blade-biz-common/src/main/java/org/springblade/common/component/MockLoginService.java new file mode 100644 index 000000000..80cadb339 --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/component/MockLoginService.java @@ -0,0 +1,37 @@ +package org.springblade.common.component; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import org.springblade.common.constant.LauncherConstant; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +@Component +@AllArgsConstructor +public class MockLoginService { + private final Environment environment; + public JSONObject mockToken(String tenantId,String account) { + String url = "http://" + LauncherConstant.loginAddr(Objects.requireNonNull(environment.getActiveProfiles()[0])) + "/blade-auth/oauth/token"; + HttpRequest urlRequest = HttpRequest.post(url); +// urlRequest.header("Authorization", "Basic c2FiZXI6c2FiZXJfc2VjcmV0"); + urlRequest.header("Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + urlRequest.header("Tenant-Id", "627683"); + + Map params = new HashMap<>(); + params.put("grant_type", "local_server"); + params.put("scope", "all"); + params.put("username", account); + params.put("tenantId", tenantId); + HttpResponse execute = urlRequest.form(params).execute(); + String body = execute.body(); + JSONObject jsonObject = JSONObject.parseObject(body); + return jsonObject; + } + +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/CodeNumConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/CodeNumConstant.java index 45770e024..0e46c3f52 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/CodeNumConstant.java +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/CodeNumConstant.java @@ -16,5 +16,6 @@ public class CodeNumConstant { public final static int TRUNKLINE_CARS_LOAD = 12;//干线配载批次号 public final static int TRUNKLINE_TRIPARTITE_LOAD = 13;//干线三方中转批次号 public final static int TRUNKLINE_LOAD_SIGN = 14;//干线直发商家签收单号 + public final static int BALANCE_ORDER = 15;//结算单号 } diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/CommonBroadCastMqConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/CommonBroadCastMqConstant.java new file mode 100644 index 000000000..8f6c23740 --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/CommonBroadCastMqConstant.java @@ -0,0 +1,13 @@ +package org.springblade.common.constant; + +public class CommonBroadCastMqConstant { + + //--------------------开单交换机 + public static final String OPEN_WAYBILL_BROADCAST_EXCHANGE = "trunkline.openWaybill.broadcast.exchange"+ModuleNameConstant.DEVAUTH; + + public static final String OPEN_WAYBILL_BROADCAST_QUEUE = "open_waybill_broadcast_queue"+ModuleNameConstant.DEVAUTH; + public static final String UPDATE_WAYBILL_BROADCAST_QUEUE = "update_waybill_broadcast_queue"+ModuleNameConstant.DEVAUTH; + + + +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/DictBizConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/DictBizConstant.java index 42defa89b..1c1c6b5af 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/DictBizConstant.java +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/DictBizConstant.java @@ -94,6 +94,7 @@ public class DictBizConstant { // --------------2023-08-24 --------------------- public static final String RESERVATION_LIST_LOADING_STATUS = "reservation_loading_status";//预约装车状态 public static final String RESERVATION_SIGNFOR_STATUS = "reservation_signfor_status";//预约签收状态 + public static final String YES_NO = "yes_no";//预约签收状态 // --------------2023-09-01 --------------------- public static final String ORDER_PACKAGE_LOADING_STATUS = "order_package_loading_status";//预约签收状态 @@ -113,6 +114,8 @@ public class DictBizConstant { public static final String OPEN_ORDER_URGENCY = "open_order_urgency"; public static final String OPEN_ORDER_RECEIPT = "open_order_receipt"; public static final String OPEN_ORDER_TRANSPORT_TYPE = "open_order_transport_type"; + public static final String OPEN_ORDER_CHARGE_TYPE = "open_order_charge_type"; + public static final String EDIT_WAYBILL_REASON_TYPE = "edit_waybill_reason_type"; /* 异常工单状态 */ public static final String PC_WORK_ORDER = "pc_work_order"; //PC工单异常类型 diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/IncomingTypeEnum.java b/blade-biz-common/src/main/java/org/springblade/common/constant/IncomingTypeEnum.java index eafc906c4..8472919ec 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/IncomingTypeEnum.java +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/IncomingTypeEnum.java @@ -15,13 +15,13 @@ public enum IncomingTypeEnum { UNLOAD_TRAY_INCOMING(8, "托盘卸车入库"), UNLOAD_TRAY_ONE(9, "卸分一体"), OPEN_TO_IN(10, "开单及入库"), - FACTORY_TO_INCOMING(11, "工厂推送数据入库"); - + FACTORY_TO_INCOMING(11, "工厂推送数据入库"), + SUPPLE_INCOMING(12, "数据补录入库"), + ABNORMAL_INCOMING(13, "异常列表入库"); private Integer code; private String value; - IncomingTypeEnum(Integer code, String value) { this.code = code; this.value = value; diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/LauncherConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/LauncherConstant.java index fa94f125b..149f15f06 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/LauncherConstant.java +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/LauncherConstant.java @@ -90,6 +90,37 @@ public interface LauncherConstant { */ String SEATA_TEST_ADDR = "192.168.2.110:8091"; + /** + * 本地登录 dev地址 + */ + String APPLICATION_DEV_LOGIN_ADDR = "127.0.0.1:13000"; + /** + * 本地登录 test地址 + */ + String APPLICATION_TEST_LOGIN_ADDR = "192.168.2.110:9999"; + + /** + * 本地登录 pord地址 + */ + String APPLICATION_PROD_LOGIN_ADDR = "172.16.128.147:8888"; + + + /** + * elk dev 地址 + */ + + String ELK_DEV_ADDR = "192.168.2.46:9000"; + + /** + * elk prod 地址 + */ + String ELK_PROD_ADDR = "172.30.0.72:9000"; + + /** + * elk test 地址 + */ + String ELK_TEST_ADDR = "192.168.2.110:9002"; + /** * dbuuo提供者 @@ -221,4 +252,32 @@ public interface LauncherConstant { } } + static String loginAddr(String profile) { + switch (profile) { + case (AppConstant.DEV_CODE): + return APPLICATION_DEV_LOGIN_ADDR; + case (AppConstant.TEST_CODE): + return APPLICATION_TEST_LOGIN_ADDR; + default: + return APPLICATION_PROD_LOGIN_ADDR; + } + } + + /** + * 动态获取elk地址 + * + * @param profile 环境变量 + * @return addr + */ + static String elkAddr(String profile) { + switch (profile) { + case (AppConstant.PROD_CODE): + return ELK_PROD_ADDR; + case (AppConstant.TEST_CODE): + return ELK_TEST_ADDR; + default: + return ELK_DEV_ADDR; + } + } + } diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/ModuleNameConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/ModuleNameConstant.java index b1d09dedf..108fe8b9e 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/ModuleNameConstant.java +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/ModuleNameConstant.java @@ -79,6 +79,11 @@ public interface ModuleNameConstant { */ String APPLICATION_REPORT_NAME = "logpm-report" + DEVAUTH; + /** + * 报表模块 + */ + String APPLICATION_STATISTICSDATA_NAME = "logpm-statisticsdata" + DEVAUTH; + /** * 数据共享模块 */ @@ -97,6 +102,26 @@ public interface ModuleNameConstant { * 志邦工厂数据模块 */ String LOGPM_FACTORY_DATA_ZBOM_NAME = "logpm-factory-data-zbom" + DEVAUTH; + /** + * 索菲亚工厂数据模块 + */ + String LOGPM_FACTORY_DATA_SUOFEIYA_NAME = "logpm-factory-data-suofeiya" + DEVAUTH; + /** + * 我乐工厂数据模块 + */ + String LOGPM_FACTORY_DATA_OLO_NAME = "logpm-factory-data-olo" + DEVAUTH; + /** + * 林氏工厂数据模块 + */ + String LOGPM_FACTORY_DATA_LINSY_NAME = "logpm-factory-data-linsy" + DEVAUTH; + /** + * 曼好家工厂数据模块 + */ + String LOGPM_FACTORY_DATA_MWH_NAME = "logpm-factory-data-mwh" + DEVAUTH; + /** + * 金牌工厂数据模块 + */ + String LOGPM_FACTORY_DATA_JINPAI_NAME = "logpm-factory-data-jinpai" + DEVAUTH; /** * 诗尼曼工厂数据模块 */ @@ -110,4 +135,9 @@ public interface ModuleNameConstant { */ String LOGPM_FACTORY_DATA_OPPEIN_NAME = "logpm-factory-data-oppein" + DEVAUTH; + /** + * 商家模块 + */ + String LOGPM_BUSINESS_NAME = "logpm-business" + DEVAUTH; + } diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/OldSystemDataPushConfig.java b/blade-biz-common/src/main/java/org/springblade/common/constant/OldSystemDataPushConfig.java index e360f01b5..4826d53a1 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/OldSystemDataPushConfig.java +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/OldSystemDataPushConfig.java @@ -76,14 +76,30 @@ public class OldSystemDataPushConfig { // 宜宾仓 warehourseIds.add("146"); + // 攀枝花 + warehourseIds.add("32"); + // 万州仓 + warehourseIds.add("50"); + + //广元仓 + warehourseIds.add("40"); + + + //广元仓 + warehourseIds.add("40"); + + //双流金牌基地仓 + warehourseIds.add("55"); + + //茂名仓 + warehourseIds.add("152"); } - public static List getWarehourseIdList(){ + public static List getWarehourseIdList() { return warehourseIds; } - } diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/RabbitConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/RabbitConstant.java index aae05e352..2f62971c1 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/RabbitConstant.java +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/RabbitConstant.java @@ -33,15 +33,18 @@ public interface RabbitConstant { /** * 新系统推送信息 */ - String NEW_SYSTEM_RECEIVE_INFO_QUEUE = "new_system_receive_info_queue"+ ModuleNameConstant.DEVAUTH; - String NEW_SYSTEM_RECEIVE_INFO_EXCHANGE = "new_system_receive_info_exchange"+ ModuleNameConstant.DEVAUTH; - String NEW_SYSTEM_RECEIVE_INFO_ROUTING = "new_system_receive_info_routing"+ ModuleNameConstant.DEVAUTH; + String NEW_SYSTEM_RECEIVE_INFO_QUEUE = "new_system_receive_info_queue" + ModuleNameConstant.DEVAUTH; + String NEW_SYSTEM_RECEIVE_INFO_EXCHANGE = "new_system_receive_info_exchange" + ModuleNameConstant.DEVAUTH; + String NEW_SYSTEM_RECEIVE_INFO_ROUTING = "new_system_receive_info_routing" + ModuleNameConstant.DEVAUTH; /** * 卸车完成确认 */ String UNLOAD_CAR_COM_INFO_QUEUE = "unload_car_com_info_quere"; String UNLOAD_CAR_COM_INFO_EXCHANGE = "unload_car_com_info_exchange" + ModuleNameConstant.DEVAUTH; String UNLOAD_CAR_COM_INFO_ROUTING = "unload_car_com_info_routing "; + String HWY_UNLOAD_CAR_COM_INFO_QUEUE = "hwy_unload_car_com_info_quere"; + String HWY_UNLOAD_CAR_COM_INFO_EXCHANGE = "hwy_unload_car_com_info_exchange" + ModuleNameConstant.DEVAUTH; + String HWY_UNLOAD_CAR_COM_INFO_ROUTING = "hwy_unload_car_com_info_routing "; String WAYBILL_DATA_QUEUE = "waybill_data_queue" + ModuleNameConstant.DEVAUTH; @@ -105,6 +108,16 @@ public interface RabbitConstant { /****************文员复合签收推送老系统队列 end *************************/ + /****************文员自提复合签收推送老系统队列 start *************************/ + + String BILL_CLERK_CHECK_PUSH_DATA_QUEUE = "bill_clerk_check_push_data_queue" + ModuleNameConstant.DEVAUTH; + String BILL_CLERK_CHECK_PUSH_DATA_EXCHANGE = "bill_clerk_check_push_data_exchange" + ModuleNameConstant.DEVAUTH; + String BILL_CLERK_CHECK_PUSH_DATA_ROUTING = "bill_clerk_check_push_data_routing" + ModuleNameConstant.DEVAUTH; + + + /****************文员自提复合签收推送老系统队列 end *************************/ + + /****************包件状态变化 start*************************************************/ String ORDER_PACKAGE_STATUS_INFO_QUEUE = "order_package_status_info_queue" + ModuleNameConstant.DEVAUTH; @@ -123,8 +136,6 @@ public interface RabbitConstant { /***************************************梦天签收扫描数据推送 end************************************************/ - - /****************************************梦天签收复核数据推送 start***********************************************/ String MT_BUSINESS_DATA_CLERK_CHECK_2_FACTORY_QUEUE = "mt_business_data_clerk_check_2_factory_queue" + ModuleNameConstant.DEVAUTH; String MT_BUSINESS_DATA_CLERK_CHECK_2_FACTORY_EXCHANGE = "mt_business_data_clerk_check_2_factory_exchange" + ModuleNameConstant.DEVAUTH; @@ -160,4 +171,69 @@ public interface RabbitConstant { String OPEN_ORDER_LOAD_SCAN_ROUTING = "open_order_load_scan_routing" + ModuleNameConstant.DEVAUTH; + + + /****************库内入库推送商家数据start *************************/ + + + + /****************库内入库推送商家数据end *************************/ + + + /****************创建商家配送计划 start *************************/ + + String BUSINESS_PRE_CONVERSION_DATA_QUEUE = "business_pre_conversion_data_queue" + ModuleNameConstant.DEVAUTH; + String BUSINESS_PRE_CONVERSION_DATA_EXCHANGE = "business_pre_conversion_data_exchange" + ModuleNameConstant.DEVAUTH; + String BUSINESS_PRE_CONVERSION_DATA_ROUTING = "business_pre_conversion_data_routing" + ModuleNameConstant.DEVAUTH; + + + /****************创建商家配送计划end *************************/ + + + //新系统订单状态消息队列配置 + String HWY_ORDER_STATUS_QUEUE = "hwy_order_status_queue" + ModuleNameConstant.DEVAUTH; + String HWY_ORDER_STATUS_EXCHANGE = "hwy_order_status_exchange" + ModuleNameConstant.DEVAUTH; + String HWY_ORDER_STATUS_ROUTING = "hwy_order_status_routing" + ModuleNameConstant.DEVAUTH; + + + /****************商家入库完结 start *************************/ + + String BUSINESS_IN_CONVERSION_DATA_QUEUE = "business_in_conversion_data_queue" + ModuleNameConstant.DEVAUTH; + String BUSINESS_IN_CONVERSION_DATA_EXCHANGE = "business_in_conversion_data_exchange" + ModuleNameConstant.DEVAUTH; + String BUSINESS_IN_CONVERSION_DATA_ROUTING = "business_in_conversion_data_routing" + ModuleNameConstant.DEVAUTH; + + + /****************商家入库完结 end *************************/ + + + /****************老系统推送打托数据 start *************************/ + + String OLD_TRAY_TYPE_QUEUE = "old_tray_type_queue" + ModuleNameConstant.DEVAUTH; + String OLD_TRAY_TYPE_EXCHANGE = "old_tray_type_exchange" + ModuleNameConstant.DEVAUTH; + String OLD_TRAY_TYPE_ROUTING = "old_tray_type_routing" + ModuleNameConstant.DEVAUTH; + + /****************老系统推送打托数据 start *************************/ + + + /****************自提扫描信息处理 start *************************/ + + String SELF_PICKUP_SCAN_QUEUE = "self_pickup_scan_queue" + ModuleNameConstant.DEVAUTH; + String SELF_PICKUP_SCAN_EXCHANGE = "self_pickup_scan_exchange" + ModuleNameConstant.DEVAUTH; + String SELF_PICKUP_SCAN_ROUTING = "self_pickup_scan_routing" + ModuleNameConstant.DEVAUTH; + + /****************自提扫描信息处理 start *************************/ + + + /****************推送安装平台 start *************************/ + + String PUSH_INSTALL_PLATFORM_QUEUE = "push_install_platform_queue" + ModuleNameConstant.DEVAUTH; + String PUSH_INSTALL_PLATFORM_EXCHANGE = "push_install_platform_exchange" + ModuleNameConstant.DEVAUTH; + String PUSH_INSTALL_PLATFORM_ROUTING = "push_install_platform_routing" + ModuleNameConstant.DEVAUTH; + + /****************推送安装平台 start *************************/ + + + + + } diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/RedisKeyConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/RedisKeyConstant.java index 6abd63ee5..b592df783 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/RedisKeyConstant.java +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/RedisKeyConstant.java @@ -19,7 +19,16 @@ public class RedisKeyConstant { public static final String TASK_QUEST_CHILD_KEY ="cache:task-quest-child-key:"; public static final String BASIC_DATA_WAREHOUSE_LIST_KEY ="cache:basic-data-warehouse-list:"; - + public static final String USER_NAME_PHONE_KEY ="cache:user:id:"; + public static final String FINAL_CLIENT_CODE ="final:client:code:"; + /** + * 商家端预入库车次数量缓存 + */ + public static final String BUSINESS_IN_CARNUMBER ="business:in:carnumber:"; + /** + * 异常件数 + */ + public static final String BUSINESS_INEXCE_CARNUMBER ="business:inexce:carnumber:"; } diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/WaybillStatusEnum.java b/blade-biz-common/src/main/java/org/springblade/common/constant/WaybillStatusEnum.java new file mode 100644 index 000000000..c0ca6a289 --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/WaybillStatusEnum.java @@ -0,0 +1,50 @@ +package org.springblade.common.constant; + +public enum WaybillStatusEnum { + + + BUFENRUKU("10", "部分入库"), + RUKU("20", "入库"), + BUFENZHONGZHUAN("30", "部分中转"), + ZHONGZHAUN("40", "中转"), + MUDICANGBUFENDAODA("50", "目的仓部分到达"), + MUDICANGDAODA("60", "目的仓到达"), + PEISOSNGBUFENZHUANGCHE("70", "配送部分装车"), + PEISONGZHUANGCHE("80", "配送装车"), + BUFENQIANSHOU("90", "部分签收"), + QIANSHOU("100", "已签收"); + + private String code; + private String value; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + WaybillStatusEnum(String code, String value) { + this.code = code; + this.value = value; + } + + public static String getValue(String code) { + for (WaybillStatusEnum value : WaybillStatusEnum.values()) { + if (value.getCode().equals(code)) { + return value.getValue(); + } + } + return null; + } + +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/WorkNodeEnums.java b/blade-biz-common/src/main/java/org/springblade/common/constant/WorkNodeEnums.java index 07cb4af36..f5d7a9c77 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/WorkNodeEnums.java +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/WorkNodeEnums.java @@ -13,35 +13,70 @@ import java.io.Serializable; @Getter public enum WorkNodeEnums implements Serializable { - INITIAL_DATA_ENTRY(10, "数据入库"), - INITIAL_WAREHOUSE_ENTRY(20, "始发仓入库"), - BILLING(30, "开单"), - INITIAL_WAREHOUSE_LOADING(40, "装车"), - CANCEL_INITIAL_WAREHOUSE_LOADING(50, "取消装车"), - INITIAL_WAREHOUSE_DEPART(60, "始发仓发车"), - CANCEL_INITIAL_WAREHOUSE_DEPART(70, "始发仓取消发车"), - NET_ARRIVE_CAR(80,"网点到车"), - CANCEL_NET_ARRIVE_CAR(90,"网点取消到车"), - UNLOAD_INCOMING_WAREHOUSE(100,"卸车入库"), - TRANSFER_WAREHOUSE_UNLOADING(110, "卸车确认"), - TRANSFER_WAREHOUSE_DEPART(120, "网点发车"), - CANEL_TRANSFER_WAREHOUSE_DEPART(130, "网点取消发车"), - FINAL_NET_ARRIVE_CAR(140,"终点到车"), - CANCEL_FINAL_NET_ARRIVE_CAR(150,"终点取消到车"), - SIGN_DIRECT_SHIPPER(160,"直发商家签收"), - END_WAREHOUSE_UNLOADING(170, "末端仓卸车确认"), - TRIPARTITE_TRANSFER_DEPART(180, "三方中转发车"), - CANCEL_TRIPARTITE_TRANSFER_DEPART(190, "三方中转取消发车"), - ARRICE_TRIPARTITE_TRANSFER_DEPART(200, "三方中转到达"), - SIGN_TRIPARTITE_TRANSFER_DEPART(210, "三方中转签收"), - SORTING_TRAYS(220, "分拣打托"), - UN_SORTING_TRAYS(230, "包件解托"), - PUTAWAY(240, "上架"), - DELIST(250, "下架"), - STOCKING_OPERATION(260, "备货作业"), - DISTRIBUTION_LOADING(270, "配送装车"), - DISTRIBUTION_SIGN_FOR(280, "配送签收"), - CLERK_REVIEW(290, "文员复核"); + INITIAL_DATA_ENTRY(101010, "数据入库"), + INITIAL_WAREHOUSE_ENTRY(101020, "始发仓入库"), + + BILLING(102010, "开单"), + CHANGE_ORDER(102020, "改单"), + REVIEW_ORDER(102030, "审单"), + + LOADING_PLAN(103010, "配载计划"), + CANCEL_LOADING_PLAN(103015, "取消配载计划"), + INITIAL_WAREHOUSE_LOADING(103020, "装车"), + CANCEL_INITIAL_WAREHOUSE_LOADING(103030, "取消装车"), + INITIAL_WAREHOUSE_DEPART(103040, "始发仓发车"), + CANCEL_INITIAL_WAREHOUSE_DEPART(103050, "始发仓取消发车"), + NET_ARRIVE_CAR(103060,"网点到车"), + CANCEL_NET_ARRIVE_CAR(103070,"网点取消到车"), + TRANSFER_WAREHOUSE_DEPART(103080, "网点发车"), + CANEL_TRANSFER_WAREHOUSE_DEPART(103090, "网点取消发车"), + FINAL_NET_ARRIVE_CAR(1030100,"终点到车"), + CANCEL_FINAL_NET_ARRIVE_CAR(1030110,"终点取消到车"), + + TRIPARTITE_TRANSFER_DEPART(104010, "三方中转发车"), + CANCEL_TRIPARTITE_TRANSFER_DEPART(104020, "三方中转取消发车"), + ARRICE_TRIPARTITE_TRANSFER_DEPART(104030, "三方中转到达"), + SIGN_TRIPARTITE_TRANSFER_DEPART(104040, "三方中转签收"), + + UNLOAD_INCOMING_WAREHOUSE(105010,"卸车入库"), + TRANSFER_WAREHOUSE_UNLOADING(105020, "卸车确认"), + SIGN_DIRECT_SHIPPER(105030,"直发商家签收"), + END_WAREHOUSE_UNLOADING(105040, "末端仓卸车确认"), + + SORTING_TRAYS(201010, "分拣打托"), + UN_SORTING_TRAYS(201020, "包件解托"), + PUTAWAY(201030, "上架"), + DELIST(201040, "下架"), + STOCKING_OPERATION(201050, "备货作业"), + STOCKING_AREA_SHELVING(201060, "备货区上架"), + SPLIT_SHIPPING_ORDER(201070, "运单拆单"), + EMPTY_PALLET(201080, "托盘空置"), + STOCK_TRANSFER(201090, "转库存"), + CANCEL_STOCK_TRANSFER(201090, "取消转库存"), + PACKAGE_TRANSFER(2010100, "转包件"), + SPLIT_ORDER(2010110, "拆单"), + INVENTORY_STOCKING(2010120, "库存品入库"), + + PLANNED_RESERVATION(301010, "计划预约"), + PLAN_DELIVERY(301020, "计划配送"), + CANCEL_DELIVERY(301030, "计划取消"), + PLAN_BILLOFLADING(301040, "计划自提"), + CANCEL_BILLOFLADING(301050, "取消自提"), + SIGN_BILLOFLADING(301050, "自提签收"), + PLAN_DISTRIBUTION(301060, "计划配车"), + CANCEL_DISTRIBUTION(301070, "取消配车"), + + DISTRIBUTION_LOADING(302010, "配送装车"), + DISTRIBUTION_ABNORMAL_LOADING(302020, "异常装车"), + DISTRIBUTION_CANCEL_LOADING(302030, "取消装车"), + DISTRIBUTION_CAR_START(302040, "配送发车"), + DISTRIBUTION_CAR_ARRIVED(302050, "配送到达"), + DISTRIBUTION_SIGN_FOR(302060, "配送签收"), + DISTRIBUTION_RETENTION(302070, "配送滞留"), + DISTRIBUTION_ABNORMAL_SIGN_FOR(302080, "异常签收"), + DISTRIBUTION_FAIL(302090, "配送失败"), + + CLERK_REVIEW(303010, "文员复核"); private Integer code; private String value; @@ -51,4 +86,22 @@ public enum WorkNodeEnums implements Serializable { this.value = value; } + public static String getValue(Integer code) { + for (WorkNodeEnums value : WorkNodeEnums.values()) { + if (value.getCode().equals(code)) { + return value.getValue(); + } + } + return null; + } + + public static WorkNodeEnums getByCode(Integer code){ + for (WorkNodeEnums value : WorkNodeEnums.values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + } diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/basiccode/BasicCodeShowConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/basiccode/BasicCodeShowConstant.java new file mode 100644 index 000000000..16d32b9c9 --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/basiccode/BasicCodeShowConstant.java @@ -0,0 +1,44 @@ +package org.springblade.common.constant.basiccode; + +import lombok.Data; + +/** + * 租户编码姐 + * 类型码表 + */ +public enum BasicCodeShowConstant { + + /** + * 二维码 + */ + QR_CODE("qr_code",1), + + /** + * 条形码 + */ + BAR_CODE("bar_code",2); + + + /** + * 状态 + */ + private String name; + + /** + * 值 + */ + private Integer value; + + BasicCodeShowConstant(String name, Integer value) { + this.name = name; + this.value = value; + } + + public String getName() { + return name; + } + + public Integer getValue() { + return value; + } +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/basiccode/BasicCodeTypeConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/basiccode/BasicCodeTypeConstant.java new file mode 100644 index 000000000..6baba2791 --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/basiccode/BasicCodeTypeConstant.java @@ -0,0 +1,68 @@ +package org.springblade.common.constant.basiccode; + +/** + * 租户编码姐 + * 类型码表 + */ +public enum BasicCodeTypeConstant { + + + waybill_code("运单码","1"), + ORDER_CODE("订单码","2"), + ORDER_PACKAGE_CODE("包件码","3"), +// 仓库码 + WAREHOUSE_CODE("仓库码","4"), + // 货区码 + AREA_CODE("货区码","5"), + // 货架码 + SHELF_CODE("货架码","6"), + // 货位码 + POSITION_CODE("货位码","7"), + // 托盘码 + TRAY_CODE("托盘码","8"), + // 客户编码 + CLIENT_CODE("客户编码","9"), + // 提货单 配载计划 三方中转 直发商家签收单 + // 提货单码 + PICKUP_CODE("提货单码","10"), + // 配载计划码 + ALLOCATION_CODE("配载计划码","11"), + // 三方中转码 + THIRD_TRANSFER_CODE("三方中转码","12"), + // 直发商家签收单码 + DIRECT_SIGN_CODE("直发商家签收单码","13"), + + + //配送计划 自提单 预约单 备货码 + DELIVERY_PLAN_CODE("配送计划码","20"), + // 自提单码 + PICKUP_ORDER_CODE("自提单码","21"), + // 预约单码 + APPOINTMENT_CODE("预约单码","22"), + // 备货码 + STOCK_CODE("备货码","23"); + + + /** + * 状态 + */ + private String name; + + /** + * 值 + */ + private String value; + + BasicCodeTypeConstant(String name, String value) { + this.name = name; + this.value = value; + } + + public String getName() { + return name; + } + + public String getValue() { + return value; + } +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/broadcast/FanoutConstants.java b/blade-biz-common/src/main/java/org/springblade/common/constant/broadcast/FanoutConstants.java new file mode 100644 index 000000000..852a02c3a --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/broadcast/FanoutConstants.java @@ -0,0 +1,177 @@ +package org.springblade.common.constant.broadcast; + +import org.springblade.common.constant.ModuleNameConstant; + +/** + * 广播常量 + */ +public abstract class FanoutConstants { + + //干线 + public interface trunkline { + + //开单 + interface OPENWAYBILL{ + + //交换机 + String EXCHANGE = "fanout.trunkline.openWaybill" + ModuleNameConstant.DEVAUTH; + + interface QUEUE { + + String STATISTICSDATA_CREATEPACKAGEINFO = "fanout.trunkline.openWaybill.statisticsdata.createPackageinfo" + ModuleNameConstant.DEVAUTH; + // 开单检测数据 --商家端 + String SEND_BUSINESS_DATA_BY_OPENWAYBILL_DATA = "fanout.trunkline.openWaybill.send_business_data.open" + ModuleNameConstant.DEVAUTH; + // 改单数据 --商家端 + } + + } + + //改单 + interface UPDATEWAYBILL{ + + //交换机 + String EXCHANGE = "fanout.trunkline.updatewaybill" + ModuleNameConstant.DEVAUTH; + + interface QUEUE { + + String STATISTICSDATA_UPDATEPACKAGEINFO = "fanout.trunkline.updatewaybill.statisticsdata.updatePackageinfo" + ModuleNameConstant.DEVAUTH; + String SEND_BUSINESS_DATA_BY_UPDATEWAYBILL_DATA = "fanout.trunkline.openWaybill.send_business_data.update" + ModuleNameConstant.DEVAUTH; + + } + + } + + //包件日志 + interface PACKAGNODE{ + + //交换机 + String EXCHANGE = "fanout.trunkline.packagenode" + ModuleNameConstant.DEVAUTH; + + interface QUEUE { + + String PACKAGE_SIGN = "fanout.trunkline.packagenode.statisticsdata.packagesign" + ModuleNameConstant.DEVAUTH; + + String PACKAGE_INCOMING = "fanout.trunkline.packagenode.statisticsdata.packageincoming" + ModuleNameConstant.DEVAUTH; + + } + + } + + } + + + + //仓库 + public interface warehouse { + + + //打托 + interface TRAYTYPE{ + + //交换机 + String EXCHANGE = "fanout.warehouse.traytype" + ModuleNameConstant.DEVAUTH; + + interface QUEUE { + + String TRAYTYPE_MESSAGE = "fanout.warehouse.traytype.distribution.traytypemessage" + ModuleNameConstant.DEVAUTH; + + } + + } + + +// //解托 +// interface UNBINDTRAY{ +// +// //交换机 +// String EXCHANGE = "fanout.warehouse.unbindtray" + ModuleNameConstant.DEVAUTH; +// +// interface QUEUE { +// +// String UNBINDTRAY_INFO = "fanout.warehouse.unbindtray.distribution.unbindtrayINFO" + ModuleNameConstant.DEVAUTH; +// +// } +// +// } +// +// +// //移托 +// interface MOVETRAY{ +// +// //交换机 +// String EXCHANGE = "fanout.warehouse.movetray" + ModuleNameConstant.DEVAUTH; +// +// interface QUEUE { +// +// String MOVETRAY_INFO = "fanout.warehouse.movetray.distribution.movetrayInfo" + ModuleNameConstant.DEVAUTH; +// +// } +// +// } + + + + //上架 + interface ALLOCATION{ + + //交换机 + String EXCHANGE = "fanout.warehouse.upshelf" + ModuleNameConstant.DEVAUTH; + + interface QUEUE { + + String ALLOCATION_MESSAGE = "fanout.warehouse.upshelf.distribution.allocationmessage" + ModuleNameConstant.DEVAUTH; + + } + + } + + +// //下架 +// interface DOWNSHELF{ +// +// //交换机 +// String EXCHANGE = "fanout.warehouse.downshelf" + ModuleNameConstant.DEVAUTH; +// +// interface QUEUE { +// +// String DOWNSHELF_INFO = "fanout.warehouse.downshelf.distribution.downshelfInfo" + ModuleNameConstant.DEVAUTH; +// +// } +// +// } +// +// +// //移库 +// interface MOVEALLOCATION{ +// +// //交换机 +// String EXCHANGE = "fanout.warehouse.moveallocation" + ModuleNameConstant.DEVAUTH; +// +// interface QUEUE { +// +// String MOVEALLOCATION_INFO = "fanout.warehouse.moveallocation.distribution.moveallocationInfo" + ModuleNameConstant.DEVAUTH; +// +// } +// +// } + + + } + + /** + * 配送 + */ + public interface distribution { + interface signfor{ + String EXCHANGE = "fanout.distribution.signfor" + ModuleNameConstant.DEVAUTH; + interface QUEUE { + String FACTORY_NODE_WORK_DISTRIBUTION_SIGNFOR_QUERY = "fanout.factory.nodework.distribution.signforquery"+ ModuleNameConstant.DEVAUTH; + } + } + + + } + + + +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/carsload/CarsLoadLogTypeConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/carsload/CarsLoadLogTypeConstant.java index 4b89ada7e..4c2447e60 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/carsload/CarsLoadLogTypeConstant.java +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/carsload/CarsLoadLogTypeConstant.java @@ -21,7 +21,12 @@ public enum CarsLoadLogTypeConstant { CANCEL_NET_START_CARS_LOAD("网点取消发车",12), END_ARRIVE_CARS_LOAD("终点到达",13), CANCEL_END_ARRIVE_CARS_LOAD("终点取消到达",14), - END_UNLOAD_CARS_LOAD("终点卸车",15); + END_UNLOAD_CARS_LOAD("终点卸车",15), + TRIPARTITE_TRANSFER_SIGN("三方中转签收",16), + TRIPARTITE_TRANSFER_SETTLEMENT("三方中转结算",17), + SEND_DIRECTLY_SIGN("直发商家签收",18), + SEND_DIRECTLY_SIGNPHOTO("直发商家签收图片",19), + TRIPARTITE_TRANSFER_SIGNPHOTO("三方中转签收图片",20); /** * 描述 diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/factorydata/FactoryDataConstants.java b/blade-biz-common/src/main/java/org/springblade/common/constant/factorydata/FactoryDataConstants.java index beb805bb9..69078511f 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/factorydata/FactoryDataConstants.java +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/factorydata/FactoryDataConstants.java @@ -12,6 +12,11 @@ public abstract class FactoryDataConstants { String DELAYED = "true"; + /** + * 如果不需要 "" + */ + String DEVAUTH = ""; + /** * 定义交换机 */ @@ -20,16 +25,23 @@ public abstract class FactoryDataConstants { /** * 作业节点数据推送 */ - String NODE_DATA_PUSH = "factory.data.exchange.topic.nodeDataPush"; - String NODE_DATA_PUSH_DELAYED = "factory.data.exchange.topic.nodeDataPushDelayed"; + String NODE_DATA_PUSH = "factory.data.exchange.topic.nodeDataPush" + DEVAUTH; + /** + * 推送节点数据延时推送 + */ + String NODE_DATA_PUSH_DELAYED = "factory.data.exchange.topic.nodeDataPushDelayed" + DEVAUTH; /** * 工厂订单数据 */ - String FACTORY_ORDER = "factory.data.exchange.topic.factoryOrder"; + String FACTORY_ORDER = "factory.data.exchange.topic.factoryOrder" + DEVAUTH; /** * 工厂数据转暂存单 */ - String ADVANCE_ORDER = "factory.data.exchange.topic.advanceOrder"; + String ADVANCE_ORDER = "factory.data.exchange.topic.advanceOrder" + DEVAUTH; + /** + * 工厂数据转暂存单-欧派 + */ + String ADVANCE_ORDER_OUPAI = "factory.data.exchange.topic.advanceOrder.oupai" + DEVAUTH; } @@ -42,25 +54,53 @@ public abstract class FactoryDataConstants { /** * 工厂数据转暂存单 */ - String ADVANCE_ORDER = "factory.data.queue.advanceOrder"; + String ADVANCE_ORDER = "factory.data.queue.advanceOrder" + DEVAUTH; + /** + * 工厂数据转暂存单 + */ + String ADVANCE_ORDER_OUPAI = "factory.data.queue.advanceOrder.oupai" + DEVAUTH; /** * 志邦作业节点数据推送 */ - String ZBOM_NODE_DATA_PUSH = "factory.data.queue.zbom.nodeDataPush"; - String ZBOM_FACTORY_ORDER = "factory.data.queue.zbom.factoryOrder"; + String ZBOM_NODE_DATA_PUSH = "factory.data.queue.zbom.nodeDataPush" + DEVAUTH; + String ZBOM_FACTORY_ORDER = "factory.data.queue.zbom.factoryOrder" + DEVAUTH; + /** + * 索菲亚工厂订单 + */ + String SFY_NODE_DATA_PUSH = "factory.data.queue.sfy.nodeDataPush" + DEVAUTH; + String SFY_FACTORY_ORDER = "factory.data.queue.sfy.factoryOrder" + DEVAUTH; + /** + * 我乐工厂订单 + */ + String OLO_NODE_DATA_PUSH = "factory.data.queue.olo.nodeDataPush" + DEVAUTH; + String OLO_FACTORY_ORDER = "factory.data.queue.olo.factoryOrder" + DEVAUTH; + /** + * 林氏工厂订单 + */ + String LINSY_NODE_DATA_PUSH = "factory.data.queue.linsy.nodeDataPush" + DEVAUTH; + String LINSY_FACTORY_ORDER = "factory.data.queue.linsy.factoryOrder" + DEVAUTH; + /** + * 曼好家工厂订单 + */ + String MWH_FACTORY_ORDER = "factory.data.queue.mwh.factoryOrder" + DEVAUTH; + /** + * 金牌工厂订单 + */ + String JP_NODE_DATA_PUSH = "factory.data.queue.jp.nodeDataPush" + DEVAUTH; + String JP_FACTORY_ORDER = "factory.data.queue.jp.factoryOrder" + DEVAUTH; /** * 皮阿诺作业节点数据推送 */ - String PIANO_NODE_DATA_PUSH = "factory.data.queue.piano.nodeDataPush"; + String PIANO_NODE_DATA_PUSH = "factory.data.queue.piano.nodeDataPush" + DEVAUTH; /** * 梦天作业节点数据推送 */ - String MENGTIAN_NODE_DATA_PUSH = "factory.data.queue.mengtian.nodeDataPush"; + String MENGTIAN_NODE_DATA_PUSH = "factory.data.queue.mengtian.nodeDataPush" + DEVAUTH; /** * 欧派作业节点数据推送 */ - String OPPEIN_NODE_DATA_PUSH = "factory.data.queue.oppein.nodeDataPush"; + String OPPEIN_NODE_DATA_PUSH = "factory.data.queue.oppein.nodeDataPush" + DEVAUTH; } /** @@ -70,24 +110,48 @@ public abstract class FactoryDataConstants { /** * 工厂数据转暂存单 */ - String ADVANCE_ORDER = "advanceOrder"; + String ADVANCE_ORDER = "advanceOrder" + DEVAUTH; /** * 志邦作业节点数据推送 */ - String ZBOM_NODE_DATA_PUSH = "zbom.nodeDataPush"; - String ZBOM_FACTORY_ORDER = "zbom.factoryOrder"; + String ZBOM_NODE_DATA_PUSH = "zbom.nodeDataPush" + DEVAUTH; + String ZBOM_FACTORY_ORDER = "zbom.factoryOrder" + DEVAUTH; + /** + * 索菲亚工厂订单 + */ + String SFY_NODE_DATA_PUSH = "sfy.nodeDataPush" + DEVAUTH; + String SFY_FACTORY_ORDER = "sfy.factoryOrder" + DEVAUTH; + /** + * 我乐工厂订单 + */ + String OLO_NODE_DATA_PUSH = "olo.nodeDataPush" + DEVAUTH; + String OLO_FACTORY_ORDER = "olo.factoryOrder" + DEVAUTH; + /** + * 林氏工厂订单 + */ + String LINSY_NODE_DATA_PUSH = "linsy.nodeDataPush" + DEVAUTH; + String LINSY_FACTORY_ORDER = "linsy.factoryOrder" + DEVAUTH; + /** + * 曼好家工厂订单 + */ + String MWH_FACTORY_ORDER = "mwh.factoryOrder" + DEVAUTH; + /** + * 金牌工厂订单 + */ + String JP_NODE_DATA_PUSH = "jp.nodeDataPush" + DEVAUTH; + String JP_FACTORY_ORDER = "jp.factoryOrder" + DEVAUTH; /** * 皮阿诺作业节点数据推送 */ - String PIANO_NODE_DATA_PUSH = "piano.nodeDataPush"; + String PIANO_NODE_DATA_PUSH = "piano.nodeDataPush" + DEVAUTH; /** * 梦天作业节点数据推送 */ - String MENGTIAN_NODE_DATA_PUSH = "mengtian.nodeDataPush"; + String MENGTIAN_NODE_DATA_PUSH = "mengtian.nodeDataPush" + DEVAUTH; /** * 欧派作业节点数据推送 */ - String OPPEIN_NODE_DATA_PUSH = "oppein.nodeDataPush"; + String OPPEIN_NODE_DATA_PUSH = "oppein.nodeDataPush" + DEVAUTH; } } diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/loading/LoadScanSigningTypeStatusConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/loading/LoadScanSigningTypeStatusConstant.java new file mode 100644 index 000000000..c603f9e9e --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/constant/loading/LoadScanSigningTypeStatusConstant.java @@ -0,0 +1,46 @@ +package org.springblade.common.constant.loading; + +/** + * 订单冻结状态枚举 + * 对应码表 freeze_status + * @author pref + */ +public enum LoadScanSigningTypeStatusConstant { + + sijiqianshou("司机扫描签收",1), + sijipiliangqianshou("司机批量签收",2), + wenyuanpiliangqianshou("文员批量签收",3); + + + /** + * 状态 + */ + private String name; + + /** + * 值 + */ + private Integer value; + + + private LoadScanSigningTypeStatusConstant(String name, Integer value) { + this.name = name; + this.value = value; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getValue() { + return value; + } + + public void setValue(Integer value) { + this.value = value; + } +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java b/blade-biz-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java index eb7a75c87..485bc9ce4 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java +++ b/blade-biz-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java @@ -40,6 +40,8 @@ public class LauncherServiceImpl implements LauncherService { PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.server-addr", LauncherConstant.nacosAddr(profile)); PropsUtil.setProperty(props, "spring.cloud.nacos.config.server-addr", LauncherConstant.nacosAddr(profile)); + // 开启elk日志 + PropsUtil.setProperty(props, "blade.log.elk.destination", LauncherConstant.elkAddr(profile)); diff --git a/blade-biz-common/src/main/java/org/springblade/common/model/BroadcastNodeData.java b/blade-biz-common/src/main/java/org/springblade/common/model/BroadcastNodeData.java new file mode 100644 index 000000000..a44f2814b --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/model/BroadcastNodeData.java @@ -0,0 +1,60 @@ +package org.springblade.common.model; + +import com.alibaba.fastjson.JSONObject; + +/** + * 节点作业数据传输对象 + */ +public class BroadcastNodeData extends JSONObject { + + /** + * 当前作业租户ID + */ + private String tenantId; + + /** + * 作业人名称 + */ + private String userName; + + /** + * 操作时间 + */ + private String operationTime; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getOperationTime() { + return operationTime; + } + + public void setOperationTime(String operationTime) { + this.operationTime = operationTime; + } + + @Override + public String toJSONString() { + + + // 需要 将当前类的属性增加的到json的输出 + this.put("tenantId", tenantId); + this.put("userName", userName); + this.put("operationTime", operationTime); + + return super.toJSONString(); + } +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/model/FanoutMsg.java b/blade-biz-common/src/main/java/org/springblade/common/model/FanoutMsg.java new file mode 100644 index 000000000..2d3e77800 --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/model/FanoutMsg.java @@ -0,0 +1,14 @@ +package org.springblade.common.model; + +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +@Builder +@Data +public class FanoutMsg implements Serializable { + + private String msg; + private String exchange; +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/utils/CommonUtil.java b/blade-biz-common/src/main/java/org/springblade/common/utils/CommonUtil.java index 0d61ecfc8..ca8a9aca4 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/utils/CommonUtil.java +++ b/blade-biz-common/src/main/java/org/springblade/common/utils/CommonUtil.java @@ -172,6 +172,17 @@ public class CommonUtil { return null; } + public static Date getDayStart(){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + // 将时分秒,毫秒域清零 + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + return calendar.getTime(); + } + public static Date getDayEnd(){ Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); @@ -183,6 +194,23 @@ public class CommonUtil { return calendar.getTime(); } + public static Date getMonthDayStart(){ + //获取一个Calendar对象 + Calendar cal = Calendar.getInstance(); + //获取当前时间 + cal.setTime(new Date()); + //获取当前月 + cal.add(Calendar.MONTH, 0); + //获取当前月的最后一天 + cal.set(Calendar.DAY_OF_MONTH, 1); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + //得到当前月的最后一天 + Date preMonth=cal.getTime(); + return preMonth; + } public static Date getMonthDayEnd(){ //获取一个Calendar对象 Calendar cal = Calendar.getInstance(); diff --git a/blade-biz-common/src/main/java/org/springblade/common/utils/FileLogsUtil.java b/blade-biz-common/src/main/java/org/springblade/common/utils/FileLogsUtil.java index 36511603c..2478cda41 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/utils/FileLogsUtil.java +++ b/blade-biz-common/src/main/java/org/springblade/common/utils/FileLogsUtil.java @@ -1,11 +1,17 @@ package org.springblade.common.utils; +import cn.hutool.core.lang.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springblade.common.constant.CommonConstant; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Writer; import java.net.HttpURLConnection; import java.net.URL; import java.util.Calendar; @@ -29,16 +35,17 @@ public class FileLogsUtil { String imgPath = CommonConstant.SYSTEMFILEPATH + "logs/"; - //根据当前时间 按照 年/月/日 创建一个文件 + // 根据当前时间 按照 年/月/日 创建一个文件 imgPath = imgPath + dataString; - // 判断文件夹是否存在 + // 判断文件夹是否存在 File imgPathFile = new File(imgPath); if (!imgPathFile.exists()) { imgPathFile.mkdirs(); } // 按照年-月-日 创建一个字符串 - String fileName = System.currentTimeMillis() + ".log"; + // 使用 uuid 作为文件名 确保文件唯一 + String fileName = UUID.randomUUID().toString() + ".log"; Writer writer = null; try { @@ -67,7 +74,7 @@ public class FileLogsUtil { public static String loadFileContent(String urlString) { try { - log.info(">>>> 开始下载 {}",urlString); + log.info(">>>> 开始下载 {}", urlString); URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); @@ -78,7 +85,7 @@ public class FileLogsUtil { content.append(inputLine); } in.close(); - log.info(">>>> 结束下载 {}",urlString); + log.info(">>>> 结束下载 {}", urlString); return content.toString(); } catch (Exception e) { e.printStackTrace(); @@ -90,12 +97,12 @@ public class FileLogsUtil { StringBuilder stringBuffer = new StringBuilder(); Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); //放入Date类型数据 - //获取年份 + calendar.setTime(date); // 放入Date类型数据 + // 获取年份 stringBuffer.append(calendar.get(Calendar.YEAR)).append("/"); - //获取月份 + // 获取月份 stringBuffer.append(calendar.get(Calendar.MONTH) + 1).append("/"); - //获取日份 + // 获取日份 stringBuffer.append(calendar.get(Calendar.DATE)).append("/"); return stringBuffer.toString(); diff --git a/blade-biz-common/src/main/java/org/springblade/common/utils/StringSplitUtil.java b/blade-biz-common/src/main/java/org/springblade/common/utils/StringSplitUtil.java new file mode 100644 index 000000000..f83b8919a --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/utils/StringSplitUtil.java @@ -0,0 +1,30 @@ +package org.springblade.common.utils; + +import org.apache.logging.log4j.util.Strings; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class StringSplitUtil { + + + + public static List StringSplitToList(String string) { + List strs = null; + if (!Objects.isNull(string)) { + String str = string; + if (Strings.isNotBlank(str)) { + if (str.indexOf(",") > 0) { + //存在中文逗号 + str = str.replaceAll(",", ","); + } + strs = Arrays.stream(str.split(",")).collect(Collectors.toList()); + } + + } + return strs; + } + +} diff --git a/blade-biz-common/src/main/java/org/springblade/common/utils/TokenUtil.java b/blade-biz-common/src/main/java/org/springblade/common/utils/TokenUtil.java index 842a59554..16f330d73 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/utils/TokenUtil.java +++ b/blade-biz-common/src/main/java/org/springblade/common/utils/TokenUtil.java @@ -37,31 +37,5 @@ public class TokenUtil { return token; } -// public static boolean verify(String token){ -// /** -// * @desc 验证token,通过返回true -// * @params [token]需要校验的串 -// **/ -// try { -// Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET); -// JWTVerifier verifier = JWT.require(algorithm).build(); -// DecodedJWT jwt = verifier.verify(token); -// return true; -// }catch (Exception e){ -// e.printStackTrace(); -// return false; -// } -// } - public static void main(String[] args) throws NoSuchAlgorithmException { -// String username ="zhangsan"; -// String password = "123"; -// String token = token(username,password,"23123123"); -// System.out.println(token); -// boolean b = verify("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd22yZCI6IjEyMyIsImV4cCI6MTU3ODE5NzQxMywidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.IyTZT0tISQQZhGhsNuaqHGV8LD7idjUYjn3MGbulmJg"); -// System.out.println(b); - String s = MD5Utils.encodeHexString("123456".getBytes(StandardCharsets.UTF_8)); - s = MD5Utils.md5Hex("123456".getBytes(StandardCharsets.UTF_8)); - System.out.println(s); - } } diff --git a/blade-biz-common/src/main/java/org/springblade/common/wrapper/CustomHttpServletRequestWrapper.java b/blade-biz-common/src/main/java/org/springblade/common/wrapper/CustomHttpServletRequestWrapper.java new file mode 100644 index 000000000..70548d3fd --- /dev/null +++ b/blade-biz-common/src/main/java/org/springblade/common/wrapper/CustomHttpServletRequestWrapper.java @@ -0,0 +1,36 @@ +package org.springblade.common.wrapper; + +import org.springframework.http.HttpHeaders; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.util.*; + +public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper { + + private final HttpHeaders headers; + + public CustomHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + headers = new HttpHeaders(); + } + + @Override + public String getHeader(String name) { + String headerValue = headers.getFirst(name); + return headerValue != null ? headerValue : super.getHeader(name); + } + + @Override + public Enumeration getHeaderNames() { + List names = Collections.list(super.getHeaderNames()); + headers.forEach((key, value) -> names.add(key)); + return Collections.enumeration(names); + } + + // 其他需要覆盖的方法... + + public void addHeader(String name, String value) { + headers.add(name, value); + } +} diff --git a/blade-ops/blade-xxljob-admin/Dockerfile b/blade-ops/blade-xxljob-admin/Dockerfile index d12a563c0..74ff2488e 100644 --- a/blade-ops/blade-xxljob-admin/Dockerfile +++ b/blade-ops/blade-xxljob-admin/Dockerfile @@ -1,4 +1,5 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 + MAINTAINER bladejava@qq.com diff --git a/blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/JobAdminApplication.java b/blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/JobAdminApplication.java index cbd785609..f6a1e3e47 100644 --- a/blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/JobAdminApplication.java +++ b/blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/JobAdminApplication.java @@ -12,7 +12,6 @@ public class JobAdminApplication { public static void main(String[] args) { - BladeApplication.run(LauncherConstant.APPLICATION_XXLJOB_ADMIN_NAME, JobAdminApplication.class, args); } diff --git a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersaleSurveyRecordEntity.java b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersaleSurveyRecordEntity.java index af8e51b14..2bad6d597 100644 --- a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersaleSurveyRecordEntity.java +++ b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersaleSurveyRecordEntity.java @@ -127,5 +127,9 @@ public class AftersaleSurveyRecordEntity extends TenantEntity { * 处理方ID */ private Long processorId; + /** + * 处理方名称 + */ + private String processorName; } diff --git a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesAbnormalPackageEntity.java b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesAbnormalPackageEntity.java index 04344ce1c..b81bf7cf4 100644 --- a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesAbnormalPackageEntity.java +++ b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesAbnormalPackageEntity.java @@ -127,6 +127,18 @@ public class AftersalesAbnormalPackageEntity extends TenantEntity { */ @ApiModelProperty(value = "物料编码(库存品)") private String cargoNumber; + + /** + * 一级品 + */ + @ApiModelProperty(value = "一级品") + private String first; + + /** + * 二级品 + */ + @ApiModelProperty(value = "二级品") + private String secondary; /** * 入库批次号(库存品) */ @@ -143,4 +155,6 @@ public class AftersalesAbnormalPackageEntity extends TenantEntity { @ApiModelProperty(value = "关联工单ID") private Long relatedWorkOrdersId; + private Integer packageFinish; + } diff --git a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesAbnormalRecordEntity.java b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesAbnormalRecordEntity.java index 627dcb42f..111825a43 100644 --- a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesAbnormalRecordEntity.java +++ b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesAbnormalRecordEntity.java @@ -42,10 +42,10 @@ public class AftersalesAbnormalRecordEntity extends TenantEntity { private String carType; @ApiModelProperty(name = "上报仓库id",notes = "") - private Long upWarehouseId; + private Long warehouseId; @ApiModelProperty(name = "上报仓库名称",notes = "") - private String upWarehouseName; + private String warehouseName; @ApiModelProperty(name = "车次号",notes = "") private String carsNo; @@ -70,6 +70,9 @@ public class AftersalesAbnormalRecordEntity extends TenantEntity { @ApiModelProperty(name = "异常状态 0待处理 1完结",notes = "") private Integer abnormalStatus; + @ApiModelProperty(name = "发起工单状态 0未发起 1已发起",notes = "") + private Integer sendOrderStatus; + @ApiModelProperty(name = "上报时间",notes = "") private Date upTime; @@ -94,4 +97,5 @@ public class AftersalesAbnormalRecordEntity extends TenantEntity { private Integer associationType; + } diff --git a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesWorkOrderEntity.java b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesWorkOrderEntity.java index 2839dc291..f68ebac53 100644 --- a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesWorkOrderEntity.java +++ b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/entity/AftersalesWorkOrderEntity.java @@ -293,6 +293,11 @@ public class AftersalesWorkOrderEntity extends TenantEntity { * 离职状态 */ private boolean departStatus; + + private Integer packageFinish; + + + /** * 金额总和 */ diff --git a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/feign/IAftersalesAbnormalRecordClient.java b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/feign/IAftersalesAbnormalRecordClient.java index a294c6512..4ce50939c 100644 --- a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/feign/IAftersalesAbnormalRecordClient.java +++ b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/feign/IAftersalesAbnormalRecordClient.java @@ -16,14 +16,17 @@ */ package com.logpm.aftersales.feign; +import com.alibaba.fastjson.JSONObject; import com.logpm.aftersales.entity.AftersalesAbnormalRecordEntity; import org.springblade.common.constant.ModuleNameConstant; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import java.util.List; +import java.util.Map; /** * 货位 Feign接口类 @@ -43,7 +46,15 @@ public interface IAftersalesAbnormalRecordClient { void addAbnormalRecord(@RequestBody AftersalesAbnormalRecordEntity warehouseAbnormalRecordEntity); @GetMapping(API_PREFIX+"/findAbnormalList") - List findAbnormalList(String carsNo); + List findAbnormalList(@RequestParam("carsNo") String carsNo); + @GetMapping(API_PREFIX+"/findListByCarsNoAndUpWarehouseId") + JSONObject findListByCarsNoAndUpWarehouseId(@RequestParam("carsNo") String carsNo, @RequestParam("warehouseId") Long warehouseId); + + @GetMapping(API_PREFIX+"/findOrderPackageAndAbnormalStatus") + List findOrderPackageAndAbnormalStatus(@RequestParam("orderPackageCode") String orderPackageCode, @RequestParam("abnormalStatus") String abnormalStatus); + + @PostMapping(API_PREFIX+"/updateList") + void updateList(@RequestBody List abnormalRecordEntities); } diff --git a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/feign/IAftersalesWorkOrderClient.java b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/feign/IAftersalesWorkOrderClient.java index bb4654ed8..6d42d4ab9 100644 --- a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/feign/IAftersalesWorkOrderClient.java +++ b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/feign/IAftersalesWorkOrderClient.java @@ -36,6 +36,7 @@ public interface IAftersalesWorkOrderClient { String API_PREFIX = "/work/client"; String TOP = API_PREFIX + "/top"; + String UPDATEWORKORDERSTATUS = API_PREFIX + "/updateWorkOrderStatus"; /** * 获取客服异常工单列表 @@ -47,4 +48,13 @@ public interface IAftersalesWorkOrderClient { @GetMapping(TOP) BladePage top(@RequestParam("current") Integer current, @RequestParam("size") Integer size); + + /** + * 修改异常工单上的数据 + * @param orderPackageCode 包件码 + * @param packageFinish 目前默认传 1 + * @return + */ + @GetMapping(UPDATEWORKORDERSTATUS) + Boolean updateWorkOrderStatus(@RequestParam("warehouseId") Long warehouseId,@RequestParam("orderPackageCode") String orderPackageCode, @RequestParam("packageFinish") Integer packageFinish); } diff --git a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesDeliverVO.java b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesDeliverVO.java index ed1840c21..748488021 100644 --- a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesDeliverVO.java +++ b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesDeliverVO.java @@ -11,4 +11,5 @@ public class AftersalesDeliverVO { private Date taskTime; //配送时间 private String driverName; //配送司机 private String vehicleName; //车牌 + private Long id; //车次ID } diff --git a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesProcessorVO.java b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesProcessorVO.java index e90d70ab0..ba68a8298 100644 --- a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesProcessorVO.java +++ b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesProcessorVO.java @@ -32,4 +32,6 @@ import lombok.EqualsAndHashCode; public class AftersalesProcessorVO extends AftersalesProcessorEntity { private static final long serialVersionUID = 1L; + + } diff --git a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesWorkOrderVO.java b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesWorkOrderVO.java index e29de826c..9ed2ca948 100644 --- a/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesWorkOrderVO.java +++ b/blade-service-api/logpm-aftersales-api/src/main/java/com/logpm/aftersales/vo/AftersalesWorkOrderVO.java @@ -32,7 +32,6 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = true) public class AftersalesWorkOrderVO extends AftersalesWorkOrderEntity { - private static final long serialVersionUID = 1L; /** * 工单名称 */ @@ -101,4 +100,10 @@ public class AftersalesWorkOrderVO extends AftersalesWorkOrderEntity { private String ids; private String typeServiceName; + + /** + * 是否能申述 + * 0 不能 1 可以申述 + */ + private Integer canRepresentations; } diff --git a/blade-service-api/logpm-basic-api/src/main/java/com/logpm/basic/entity/BasicTenantCodeEntity.java b/blade-service-api/logpm-basic-api/src/main/java/com/logpm/basic/entity/BasicTenantCodeEntity.java index 76ef9b221..64e445d85 100644 --- a/blade-service-api/logpm-basic-api/src/main/java/com/logpm/basic/entity/BasicTenantCodeEntity.java +++ b/blade-service-api/logpm-basic-api/src/main/java/com/logpm/basic/entity/BasicTenantCodeEntity.java @@ -39,13 +39,7 @@ import java.io.Serializable; public class BasicTenantCodeEntity extends TenantEntity implements Serializable{ private static final long serialVersionUID = 1L; -// /** -// * 主键 -// */ -// @JsonSerialize(using = ToStringSerializer.class) -// @ApiModelProperty(value = "主键") -// @TableId(value = "id", type = IdType.ASSIGN_ID) -// private Long id; + /** * 编码类型 @@ -53,7 +47,7 @@ public class BasicTenantCodeEntity extends TenantEntity implements Serializable @JsonSerialize(using = ToStringSerializer.class) @ApiModelProperty(value = "编码类型") @TableField(value = "code_type") - private Integer codeType; + private String codeType; /** * 编码展示类型 @@ -63,7 +57,6 @@ public class BasicTenantCodeEntity extends TenantEntity implements Serializable @TableField(value = "show_type") private Integer showType; -// private Integer isDeleted; /*** * 编码 @@ -72,6 +65,10 @@ public class BasicTenantCodeEntity extends TenantEntity implements Serializable @ApiModelProperty(value = "编码") private String code; + @JsonSerialize(using = ToStringSerializer.class) + @ApiModelProperty(value = "简称") + private String desName; + @ApiModelProperty(value = "预留1") private String reserve1; /** diff --git a/blade-service-api/logpm-basic-api/src/main/java/com/logpm/basic/feign/IBasicTenantCodeClient.java b/blade-service-api/logpm-basic-api/src/main/java/com/logpm/basic/feign/IBasicTenantCodeClient.java index d8cf2a25a..0a549d345 100644 --- a/blade-service-api/logpm-basic-api/src/main/java/com/logpm/basic/feign/IBasicTenantCodeClient.java +++ b/blade-service-api/logpm-basic-api/src/main/java/com/logpm/basic/feign/IBasicTenantCodeClient.java @@ -64,5 +64,9 @@ public interface IBasicTenantCodeClient { */ @GetMapping(TOP+"/shelfCode") String shelfCode(@RequestParam String tenantId,@RequestParam String codeType); + @GetMapping(TOP+"/findBasicTenantCodeByCodeAndShowType") + BasicTenantCodeEntity findBasicTenantCodeByCodeAndShowType(@RequestParam("codeType") String codeType,@RequestParam("showType")Integer showType); + + } diff --git a/blade-service-api/logpm-basic-api/src/main/java/com/logpm/basic/vo/TableSetVo.java b/blade-service-api/logpm-basic-api/src/main/java/com/logpm/basic/vo/TableSetVo.java new file mode 100644 index 000000000..2fe6d3b70 --- /dev/null +++ b/blade-service-api/logpm-basic-api/src/main/java/com/logpm/basic/vo/TableSetVo.java @@ -0,0 +1,28 @@ +package com.logpm.basic.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 前端页面 表格字段保存对象 + */ +@Data +@ApiModel(value = "TableSetVo", description = "表格设置对象") +public class TableSetVo implements Serializable { + + /** + * 表格key + */ + @ApiModelProperty(value = "表格key") + private String tableKey; + + /** + * 表格表头设置内容 + */ + @ApiModelProperty(value = "表格设置内容") + private String tableSetCongig; + +} diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataClientEntity.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataClientEntity.java index 23bbe8e87..c256b7bb8 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataClientEntity.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataClientEntity.java @@ -138,7 +138,6 @@ public class BasicdataClientEntity extends TenantEntity { * 客户类型;1 C端 2 B端 */ @ApiModelProperty(value = "客户类型;1 C端 2 B端") - @TableField(exist = false) private Integer typeService; /** @@ -206,13 +205,13 @@ public class BasicdataClientEntity extends TenantEntity { * 合同开始时间 */ @ApiModelProperty(value = "合同开始时间") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd", timezone = "GMT+8") private Date contractStartTime; /** * 合同结束时间 */ @ApiModelProperty(value = "合同结束时间") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd", timezone = "GMT+8") private Date contractEntTime; @ApiModelProperty(value = "默认付款方式 1现付 2到付 3月结 4回付 5内部结算 ") diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataFactoryCategoryEntity.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataFactoryCategoryEntity.java index db4de47b3..f757fc7f3 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataFactoryCategoryEntity.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataFactoryCategoryEntity.java @@ -58,8 +58,13 @@ public class BasicdataFactoryCategoryEntity extends TenantEntity { @ApiModelProperty(value = "品牌名称") private String brand; + @ApiModelProperty(value = "物料名称") + private String materielName; + @ApiModelProperty(value = "品牌id") private Long brandId; + + } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataPriceCategoryWarehouseEntity.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataPriceCategoryWarehouseEntity.java index d4002783b..eb171e3ef 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataPriceCategoryWarehouseEntity.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataPriceCategoryWarehouseEntity.java @@ -60,8 +60,10 @@ public class BasicdataPriceCategoryWarehouseEntity extends TenantEntity { private Double withinThirtyPrice; @ApiModelProperty(value = "30-60天") private Double betweenThirtySixtyPrice; - @ApiModelProperty(value = "60天外") + @ApiModelProperty(value = "60-90天外") private Double beyondSixtyPrice; + @ApiModelProperty(value = "90天外") + private Double beyondNinetyPrice; @ApiModelProperty(value = "上限价格") private Double maximumPrice; @ApiModelProperty(value = "操作/装卸费") diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataPriceTemplateEntity.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataPriceTemplateEntity.java index 9ebdc8120..0ce2a8f3e 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataPriceTemplateEntity.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/entity/BasicdataPriceTemplateEntity.java @@ -104,6 +104,8 @@ public class BasicdataPriceTemplateEntity extends TenantEntity { private String warehousePieceCategory; @ApiModelProperty(value = "仓储-附加费计价单位") private Integer warehouseSubjoinFeeUnit; + @ApiModelProperty(value = "仓储-是否附加费") + private Integer warehouseIsAddFee; @ApiModelProperty(value = "仓储-是否有管理费") private Integer warehouseIsManageFee; @ApiModelProperty(value = "仓储-是否有操作/装卸费") @@ -130,6 +132,8 @@ public class BasicdataPriceTemplateEntity extends TenantEntity { private String dispatchWeightCategory; @ApiModelProperty(value = "配送-是否按品类附加费计费") private Integer dispatchIsCategorySubjoin; + @ApiModelProperty(value = "配送-是否附加费") + private Integer dispatchIsAddFee; @ApiModelProperty(value = "配送-是否有分货费") private Integer dispatchIsSortFee; @ApiModelProperty(value = "配送-是否有操作/装卸费") diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataClientClient.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataClientClient.java index 7320af293..d0d1d8858 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataClientClient.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataClientClient.java @@ -19,6 +19,7 @@ package com.logpm.basicdata.feign; import com.alibaba.fastjson.JSONObject; import com.logpm.basicdata.entity.BasicdataClientEntity; import com.logpm.basicdata.entity.BasicdataClientUserEntity; +import com.logpm.basicdata.vo.BasicdataClientVO; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.mp.support.BladePage; import org.springframework.cloud.openfeign.FeignClient; @@ -73,7 +74,10 @@ public interface IBasicdataClientClient { List getBasicdataClientUserEntityListByUserId(@RequestParam("userId") Long userId); @GetMapping(API_PREFIX+"/findEntityById") - BasicdataClientEntity findEntityById(@RequestParam Long clientId); + BasicdataClientEntity findEntityById(@RequestParam Long clientId); + + @GetMapping(API_PREFIX+"/findEntityVoById") + BasicdataClientVO findEntityVoById(@RequestParam Long clientId); @PostMapping(API_PREFIX+"/addReturnId") Long addReturnId(@RequestBody BasicdataClientEntity basicdataClientEntity); @@ -88,4 +92,20 @@ public interface IBasicdataClientClient { */ @GetMapping(API_PREFIX+"/getMallById") BasicdataClientEntity getMallById(Long mallId); + + /** + * 根据名称查询客户 + * @param consigneeUnit + * @return + */ + @GetMapping(API_PREFIX+"/getClientByName") + List getClientByName(String consigneeUnit); + + /** + * 查询多个ID客户信息 + * @param clientIds + * @return + */ + @GetMapping(API_PREFIX+"/findEntityByIds") + List findEntityByIds(@RequestParam List clientIds); } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataCodeClient.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataCodeClient.java index 4d28599c8..9648f2bb6 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataCodeClient.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataCodeClient.java @@ -5,6 +5,8 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; +import java.util.List; + @FeignClient( value = ModuleNameConstant.APPLICATION_BASICDATA_NAME ) @@ -15,4 +17,8 @@ public interface IBasicdataCodeClient { @GetMapping(API_PREFIX+"/getCodeByType") String getCodeByType(@RequestParam Integer type,@RequestParam String warehouseCode,@RequestParam String orderCode); + + @GetMapping(API_PREFIX+"/getBatchPackageCodeByType") + List getBatchPackageCodeByType(@RequestParam String warehouseCode, @RequestParam String orderCode,@RequestParam Integer num); + } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataDriverArteryClient.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataDriverArteryClient.java index f443a4db1..72602fafa 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataDriverArteryClient.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataDriverArteryClient.java @@ -60,4 +60,7 @@ public interface IBasicdataDriverArteryClient { @GetMapping(API_PREFIX+"/findDriverListByName") List findDriverListByName(@RequestParam String driverName); + + @GetMapping(API_PREFIX+"/getDriverArteryById") + BasicdataDriverArteryEntity getDriverArteryById(Long id); } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataFactoryCategoryClient.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataFactoryCategoryClient.java index 99b66793d..f2e2c92c3 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataFactoryCategoryClient.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataFactoryCategoryClient.java @@ -4,6 +4,8 @@ import com.logpm.basicdata.entity.BasicdataFactoryCategoryEntity; import org.springblade.common.constant.ModuleNameConstant; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @FeignClient( @@ -17,4 +19,28 @@ public interface IBasicdataFactoryCategoryClient { @GetMapping(API_PREFIX+"/findEntityByAdvanceDetailIds") BasicdataFactoryCategoryEntity findEntityByAdvanceDetailIds(@RequestParam("current") Integer current, @RequestParam("size") Integer size); + /** + * 查询结算订制品结算品类 + * entity + * @return + */ + @PostMapping(API_PREFIX+"/findEntityByThreeCategory") + BasicdataFactoryCategoryEntity findEntityByThreeCategory(@RequestBody BasicdataFactoryCategoryEntity entity); + + /** + * 查询库存品结算品类 + * @param entity2 + * @return + */ + @PostMapping(API_PREFIX+"/findEntityByMaterielName") + BasicdataFactoryCategoryEntity findEntityByMaterielName(@RequestBody BasicdataFactoryCategoryEntity entity2); + + + /** + * + * @param entity3 + * @return + */ + @PostMapping(API_PREFIX+"/findEntityByCategoryName") + BasicdataFactoryCategoryEntity findEntityByCategoryName(@RequestBody BasicdataFactoryCategoryEntity entity3); } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataGoodsAllocationClient.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataGoodsAllocationClient.java index d0a32149e..a92bc2e66 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataGoodsAllocationClient.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataGoodsAllocationClient.java @@ -72,4 +72,7 @@ public interface IBasicdataGoodsAllocationClient { @GetMapping(API_PREFIX+"/findStockUpAllocationById") BasicdataGoodsAllocationEntity findStockUpAllocationById(@RequestParam Long warehouseId,@RequestParam Long stockUpAllocationId); + + @PostMapping(API_PREFIX+"/updateListAllocationStatus") + void updateListAllocationStatus(@RequestParam List updateAllocationIds, @RequestParam String allocationStatus); } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataPriceClient.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataPriceClient.java index 59b753f90..44ac0cef9 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataPriceClient.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataPriceClient.java @@ -18,11 +18,14 @@ package com.logpm.basicdata.feign; import com.logpm.basicdata.vo.BasicdatPriceApiVO; import com.logpm.basicdata.vo.PriceClientVO; +import com.logpm.basicdata.vo.PriceDispatchAddClientVO; import org.springblade.common.constant.ModuleNameConstant; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import java.util.List; + /** * 基础价格体系 Feign接口类 * @@ -36,8 +39,12 @@ public interface IBasicdataPriceClient { String API_PREFIX = "/basicdataPrice/client"; String PRICE = API_PREFIX + "/pirce"; + String DISPATCH_ADD_PRICE = API_PREFIX + "/dispatchAddPrice"; @PostMapping(PRICE) - PriceClientVO pirce(@RequestBody BasicdatPriceApiVO param); + PriceClientVO price(@RequestBody BasicdatPriceApiVO param); + + @PostMapping(DISPATCH_ADD_PRICE) + List dispatchAddPrice(@RequestBody BasicdatPriceApiVO param); } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataTrayClient.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataTrayClient.java index f79d9a4c2..da210c5cf 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataTrayClient.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataTrayClient.java @@ -71,4 +71,15 @@ public interface IBasicdataTrayClient { @GetMapping(API_PREFIX+"/getTrayByTrayNo") BasicdataTrayEntity getTrayByTrayNo(@RequestParam String trayNo); + + /** + * 查询托盘 + * @param positions + * @return + */ + @GetMapping(API_PREFIX+"/findByTrayName") + BasicdataTrayEntity findByTrayName(@RequestParam String positions); + + @PostMapping(API_PREFIX+"/updateTrayStatusByTrayIds") + void updateTrayStatusByTrayIds(@RequestParam List trayIds, @RequestParam int trayStatus); } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataTripartiteMallClient.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataTripartiteMallClient.java index 479e29220..009de8371 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataTripartiteMallClient.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/feign/IBasicdataTripartiteMallClient.java @@ -51,5 +51,9 @@ public interface IBasicdataTripartiteMallClient { @GetMapping(GETNAMEBRAND) Long getClientIdByNameAndBrand(@RequestParam String name, @RequestParam String brand); + @GetMapping(API_PREFIX+"/getClientIdByNameAndBrandAndCode") + Long getClientIdByNameAndBrandAndCode(@RequestParam String name, @RequestParam String code,@RequestParam String brand); + @GetMapping(API_PREFIX+"/findEntityByDealerNameAndDealerCodeAndBrand") + BasicdataTripartiteMallEntity findEntityByDealerNameAndDealerCodeAndBrand(@RequestParam String dealerName, @RequestParam String dealerCode, @RequestParam String brand); } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdatPriceApiVO.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdatPriceApiVO.java index d77bc9443..82ead77f5 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdatPriceApiVO.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdatPriceApiVO.java @@ -16,11 +16,11 @@ */ package com.logpm.basicdata.vo; -import com.logpm.basicdata.enums.PriceBizTypeApiEnums; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; import lombok.Data; import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; import java.io.Serializable; /** @@ -29,31 +29,32 @@ import java.io.Serializable; * @author cyz * @since 2023-06-08 */ +@Builder @Data public class BasicdatPriceApiVO implements Serializable { private static final long serialVersionUID = 1L; - /** - * 客户id - */ @NotEmpty(message = "客户id不能为空") + @ApiModelProperty(value = "客户id") private String clientId; - /** - * 品牌id - */ @NotEmpty(message = "品牌id不能为空") + @ApiModelProperty(value = "品牌id") private String brandId; - /** - * 发货单位id - */ + @ApiModelProperty(value = "日期") + private String time; + @ApiModelProperty(value = "发货单位id") private String sendOrgId; - /** - * 始发地 - */ - private String startAreaId; - /** - * 目的地 - */ - private String endAreaId; + @ApiModelProperty(value = "始发地省份id") + private Long startProvinceId; + @ApiModelProperty(value = "始发地城市id") + private Long startCityId; + @ApiModelProperty(value = "始发地区县id") + private Long startCountyId; + @ApiModelProperty(value = "目的地省份id") + private Long endProvinceId; + @ApiModelProperty(value = "目的地城市id") + private Long endCityId; + @ApiModelProperty(value = "目的地区县id") + private Long endCountyId; } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataDriverArteryVO.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataDriverArteryVO.java index cc0b60a30..72de2c0ae 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataDriverArteryVO.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataDriverArteryVO.java @@ -42,6 +42,8 @@ public class BasicdataDriverArteryVO extends BasicdataDriverArteryEntity { @ApiModelProperty(value = "车辆信息") private String bindVehicles; + private String carNumbers; + /** * 司机关联车辆列表 */ diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataPriceBasicUpdateVO.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataPriceBasicUpdateVO.java index 394890b56..0b31c035b 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataPriceBasicUpdateVO.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataPriceBasicUpdateVO.java @@ -33,12 +33,15 @@ import java.util.Date; public class BasicdataPriceBasicUpdateVO implements Serializable { private static final long serialVersionUID = 1L; - @NotNull(message = "修改数据id不能为空") @ApiModelProperty(value = "id") private Long id; @NotNull(message = "模板不能为空") @ApiModelProperty(value = "模板id") private Long templateId; + @ApiModelProperty(value = "客户id") + private Long clientId; + @ApiModelProperty(value = "品牌id") + private Long brandId; @NotNull(message = "生效时间不能为空") @ApiModelProperty(value = "生效时间") private Date effectiveTime; diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataPriceImportVO.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataPriceImportVO.java new file mode 100644 index 000000000..7cb2a5949 --- /dev/null +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataPriceImportVO.java @@ -0,0 +1,47 @@ +/* + * 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.basicdata.vo; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.logpm.basicdata.entity.BasicdataPriceEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.util.Date; + +/** + * 基础价格表 实体类 + * + * @author zqb + * @since 2024-04-02 + */ +@Data +@ApiModel(value = "BasicdataPrice对象", description = "基础价格表") +@EqualsAndHashCode(callSuper = true) +public class BasicdataPriceImportVO extends BasicdataPriceEntity { + + @ApiModelProperty(value = "客户名称") + private String clientName; + @ApiModelProperty(value = "客户编码") + private String clientCode; + @ApiModelProperty(value = "品牌名称") + private String brandName; + +} diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataPricePageVO.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataPricePageVO.java index 3ce265f24..bc5c81bf9 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataPricePageVO.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataPricePageVO.java @@ -45,6 +45,9 @@ public class BasicdataPricePageVO implements Serializable { @ApiModelProperty(value = "品牌id") private String brandId; + @ApiModelProperty(value = "客户id") + private String clientId; + @ApiModelProperty(value = "价格模板id") private String templateId; @@ -54,6 +57,9 @@ public class BasicdataPricePageVO implements Serializable { @ApiModelProperty(value = "维护状态") private String maintenanceStatus; + @ApiModelProperty(value = "生效状态") + private String effectiveStatus; + @ApiModelProperty(value = "修改时间") private String updateTime; diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataTrayVO.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataTrayVO.java index b19577a77..b9f3e2261 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataTrayVO.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/BasicdataTrayVO.java @@ -49,4 +49,7 @@ public class BasicdataTrayVO extends BasicdataTrayEntity { @ApiModelProperty(value = "打托方式显示") private String trayTypeString; + @ApiModelProperty(value = "串货条件") + private String filterValue; + } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/ClientInfoVO.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/ClientInfoVO.java index 75c6d7b6d..04e27c7d1 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/ClientInfoVO.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/ClientInfoVO.java @@ -9,8 +9,13 @@ public class ClientInfoVO implements Serializable { private Long clientId; private String clientName; + private String provinceId; + private String cityId; + private String areaId; private String linkMan; private String linkPhone; private String linkAddress; + private Integer defaultPayWay; + private Long brandId; } diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/PriceDispatchAddClientVO.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/PriceDispatchAddClientVO.java new file mode 100644 index 000000000..3cac4285a --- /dev/null +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/PriceDispatchAddClientVO.java @@ -0,0 +1,50 @@ +/* + * 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.basicdata.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + * 基础价格按品类计费 视图实体类 + * + * @author zqb + * @since 2024-04-02 + */ +@Builder +@Data +public class PriceDispatchAddClientVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "品类id") + private Long categoryId; + @ApiModelProperty(value = "分货费") + private Double sortPrice; + @ApiModelProperty(value = "装卸费") + private Double handlingPrice; + @ApiModelProperty(value = "平移费") + private Double relocationPrice; + @ApiModelProperty(value = "上楼费") + private Double upstairsDeliveryPrice; + @ApiModelProperty(value = "配送-上楼费免费楼层") + private Integer dispatchStairsCarryingCharge; + +} diff --git a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/PriceWarehouseBasicVO.java b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/PriceWarehouseBasicVO.java index baccf6292..a360b415e 100644 --- a/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/PriceWarehouseBasicVO.java +++ b/blade-service-api/logpm-basicdata-api/src/main/java/com/logpm/basicdata/vo/PriceWarehouseBasicVO.java @@ -38,8 +38,10 @@ public class PriceWarehouseBasicVO implements Serializable { private Double withinThirtyPrice; @ApiModelProperty(value = "30-60天") private Double betweenThirtySixtyPrice; - @ApiModelProperty(value = "60天外") + @ApiModelProperty(value = "60-90天") private Double beyondSixtyPrice; + @ApiModelProperty(value = "90天外") + private Double beyondNinetyPrice; @ApiModelProperty(value = "上限价格") private Double maximumPrice; diff --git a/blade-service-api/logpm-business-api/pom.xml b/blade-service-api/logpm-business-api/pom.xml new file mode 100644 index 000000000..24c096b69 --- /dev/null +++ b/blade-service-api/logpm-business-api/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + + org.springblade + blade-service-api + 3.2.0.RELEASE + + + org.springblade + logpm-business-api + 3.2.0.RELEASE + + + diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/dto/BusinessPreListDTO.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/dto/BusinessPreListDTO.java new file mode 100644 index 000000000..8a70b1f59 --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/dto/BusinessPreListDTO.java @@ -0,0 +1,12 @@ +package com.logpm.business.dto; + +import lombok.Data; + +@Data +public class BusinessPreListDTO { + + private String reservationCode; + + private Integer inWarehouse; + +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/dto/BusinessPreOrderDTO.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/dto/BusinessPreOrderDTO.java new file mode 100644 index 000000000..e2a75adf8 --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/dto/BusinessPreOrderDTO.java @@ -0,0 +1,12 @@ +package com.logpm.business.dto; + +import com.logpm.business.entity.BusinessPreOrderEntity; + +/** + * + */ +public class BusinessPreOrderDTO extends BusinessPreOrderEntity { + + + +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/dto/BusinessSanDTO.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/dto/BusinessSanDTO.java new file mode 100644 index 000000000..5e006a083 --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/dto/BusinessSanDTO.java @@ -0,0 +1,33 @@ +package com.logpm.business.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.web.bind.annotation.RequestParam; + +@Data +public class BusinessSanDTO { + @ApiModelProperty(value = "配送车次") + private String distrCarNumber; + @ApiModelProperty(value = "包间码") + String orderPackageCode; + @ApiModelProperty(value = "预约单号") + String reservationCode; + @ApiModelProperty(value = "异常入库 0 正常 1 异常") + private Integer inWarehouseException; + + @ApiModelProperty(value = "仓库id") + private Long warehouseId;//仓库id + + @ApiModelProperty(value = "仓库名称") + private String warehouseName;//仓库 + + @ApiModelProperty(value = "入库类型 1提货扫描入库 2直接入库 3批量入库 4 按车次号入库 5按订单入库") + private Integer incomingType;//入库类型 1提货扫描入库 2直接入库 3批量入库 4 按车次号入库 5按订单入库 + + @ApiModelProperty(value = "托盘码") + private String trayCode;//托盘码 + + @ApiModelProperty(value = "打托方式") + private String trayType;//打托方式 + +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/entity/BusinessPreOrderEntity.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/entity/BusinessPreOrderEntity.java new file mode 100644 index 000000000..05df60ba6 --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/entity/BusinessPreOrderEntity.java @@ -0,0 +1,269 @@ +/* + * 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.business.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 商场转换预处理 实体类 + * + * @author cyz + * @since 2023-06-13 + */ +@Data +@TableName("logpm_business_pre_order") +@ApiModel(value = "DistributionBusinessPreOrder对象", description = "商场转换预处理实体") +@EqualsAndHashCode(callSuper = true) +public class BusinessPreOrderEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + /** + * 订单自编号 + */ + @ApiModelProperty(value = "订单自编号") + private String orderCode; + + + + /** + * 配送车牌 + */ + @ApiModelProperty(value = "配送车牌") + private String vehicleName; + + + /** + * 配送司机 + */ + @ApiModelProperty(value = "配送司机") + private String driverName; + + /** + * 仓库 + */ + @ApiModelProperty(value = "仓库") + private String warehouse; + + @ApiModelProperty(value = "仓库ID") + private Long warehouseId; + /** + * 包件类型 1 定制品 2 库存品 3零担 + */ + @ApiModelProperty(value = "状态") + private Integer conditions; + /** + * 包条码 + */ + @ApiModelProperty(value = "包条码") + private String orderPackageCode; + + + /** + * 货位信息 + */ + @ApiModelProperty(value = "货位信息") + private String goodsAllocation; + /** + * 所在托盘 + */ + @ApiModelProperty(value = "所在托盘") + private String pallet; + /** + * 一级品 + */ + @ApiModelProperty(value = "一级品") + private String firsts; + /** + * 二级品 + */ + @ApiModelProperty(value = "二级品") + private String second; + /** + * 三级品 + */ + @ApiModelProperty(value = "三级品") + private String thirdProduct; + /** + * 入库时间 + */ + @ApiModelProperty(value = "入库时间") + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date warehouseEntryTimeEnd; + /** + * 运单号 + */ + @ApiModelProperty(value = "运单号") + private String waybillNumber; + /** + * 运单ID + */ + @ApiModelProperty(value = "运单ID") + private Long waybillId; + + /** + * 物料Id + */ + @ApiModelProperty(value = "物料ID") + private Long materialId; + + /** + * 物料名称 + */ + @ApiModelProperty(value = "物料名称") + private String materialName; + /** + * 物料编号 + */ + @ApiModelProperty(value = "物料编号") + private String materialCode; + /** + * 物料单位 + */ + @ApiModelProperty(value = "物料单位") + private String materialUnit; + /** + * 数量 + */ + @ApiModelProperty(value = "数量") + private Integer quantity; + /** + * 车次号 + */ + @ApiModelProperty(value = "车次号") + private String trainNumber; + /** + * 在库订单ID + */ + @ApiModelProperty(value = "在库订单ID") + private Long stockArticleId; + + /** + * 服务号 + */ + @ApiModelProperty(value = "服务号") + private String serviceNumber; + /** + * 品牌ID + */ + @ApiModelProperty(value = "品牌ID") + private Long brandId; + /** + * 品牌名称 + */ + @ApiModelProperty(value = "品牌名称") + private String brandName; + + /** + * 包件状态 + */ + @ApiModelProperty(value = "包件状态") + private String orderPackageStatus; + + + + @ApiModelProperty(value = "经销商名称") + private String dealerName; + + @ApiModelProperty(value = "经销商编码") + private String dealerCode; + + @ApiModelProperty(value = "发站仓ID") + private Long sendWarehouseId; + + @ApiModelProperty(value = "发站仓ID") + private String sendWarehouseName; + + + @ApiModelProperty(value = "收站仓ID") + private Long acceptWarehouseId; + + @ApiModelProperty(value = "收站仓ID") + private String acceptWarehouseName; + + @ApiModelProperty(value = "装车状态") + private String orderPackageLoadingStatus; + + @ApiModelProperty(value = "重量") + private BigDecimal weight;//重量 + @ApiModelProperty(value = "体积") + private BigDecimal volume;//体积 + + @ApiModelProperty(value = "是否中转") + private Integer isTransfer;//是否中转 + + @ApiModelProperty(value = "暂存单id") + private Long advanceId;//暂存单id + + @ApiModelProperty(value = "配送车次号") + private String distrCarNumber; + + @ApiModelProperty(value = "预约单号") + private String reservationCode; + + @ApiModelProperty(value = "是否入库 0 没有入库 1 已入库") + private Integer inWarehouse;// + + @ApiModelProperty(value = "来源租户") + private String fromTenantId; + + + @ApiModelProperty(value = "操作状态 0 正常操作 1.补录操作") + private Integer operationStatus; + + @ApiModelProperty(value = "发车时间") + private String taskTime; + +// /** +// * 配送状态 +// */ +// @ApiModelProperty(value = "配送状态") +// private String orderPackageStatus; + +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/feign/IBusinessPreOrderClient.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/feign/IBusinessPreOrderClient.java new file mode 100644 index 000000000..ff0e1c16e --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/feign/IBusinessPreOrderClient.java @@ -0,0 +1,28 @@ +package com.logpm.business.feign; + +import com.logpm.business.entity.BusinessPreOrderEntity; +import org.apache.ibatis.annotations.Param; +import org.springblade.common.constant.ModuleNameConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@FeignClient( + value = ModuleNameConstant.LOGPM_BUSINESS_NAME +) +public interface IBusinessPreOrderClient { + String API_PREFIX = "/client"; + String INORDERBYORDERPACKAGECODE = API_PREFIX + "/inOrderByOrderPackageCode"; + String SAVEOTHERDATABASENEW = API_PREFIX + "/saveOtherDataBaseNew"; + + @GetMapping(INORDERBYORDERPACKAGECODE) + Integer inOrderByOrderPackageCode(@RequestParam("orderPackageCode") String orderPackageCode, @RequestParam("carNum") String carNum); + + @PostMapping(SAVEOTHERDATABASENEW) + void saveOtherDataBaseNew(@RequestParam("userId") String tenantId, @RequestBody List dataResult, @RequestParam("mallName") String mallName); + +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/BusinessPreOrderVO.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/BusinessPreOrderVO.java new file mode 100644 index 000000000..f69c5ae26 --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/BusinessPreOrderVO.java @@ -0,0 +1,14 @@ +package com.logpm.business.vo; + +import com.logpm.business.entity.BusinessPreOrderEntity; +import lombok.Data; + +/** + * + */ +@Data +public class BusinessPreOrderVO extends BusinessPreOrderEntity { + + + +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarDetalPackageVO.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarDetalPackageVO.java new file mode 100644 index 000000000..ca8cf57a5 --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarDetalPackageVO.java @@ -0,0 +1,28 @@ +package com.logpm.business.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class DistributionBusinessPreCarDetalPackageVO { + + @ApiModelProperty(value = "包条码") + private String orderPackageCode; + @ApiModelProperty(value = "一级品") + private String firsts; + @ApiModelProperty(value = "二级品") + private String second; + @ApiModelProperty(value = "三级品") + private String third_product; + @ApiModelProperty(value = "物料名称") + private String materialName; + @ApiModelProperty(value = "运单号") + private String waybillNumber; + @ApiModelProperty(value = "订单号") + private String orderCode; + @ApiModelProperty(value = "是否入库 0 没有入库 1 已入库") + private Integer inWarehouse; + @ApiModelProperty(value = "操作状态 0 正常操作 1.补录操作") + private Integer operationStatus; + +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarDetalVO.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarDetalVO.java new file mode 100644 index 000000000..85db99154 --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarDetalVO.java @@ -0,0 +1,42 @@ +package com.logpm.business.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class DistributionBusinessPreCarDetalVO { + + + @ApiModelProperty(value = "配送车次") + private String distrCarNumber; + + + @ApiModelProperty(value = "配送司机") + private String driverName; + + @ApiModelProperty(value = "配送车辆") + private String vehicleName; + + @ApiModelProperty(value = "配送日期") + private String taskTime; + + @ApiModelProperty(value = "订单总数") + private Integer orderCount; + + @ApiModelProperty(value = "计划件数") + private Integer orderPackageCodeCount; + + @ApiModelProperty(value = "装车件数") + private Integer loadCarCount; + + @ApiModelProperty(value = "入库件数") + private Integer inWarehouseCount; + + @ApiModelProperty(value = "车次订单列表") + private List distributionBusinessPreCarOrderDetalVOList; + + + +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarNumberVO.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarNumberVO.java new file mode 100644 index 000000000..3b03f44c0 --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarNumberVO.java @@ -0,0 +1,28 @@ +package com.logpm.business.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class DistributionBusinessPreCarNumberVO { + + @ApiModelProperty(value = "配送车次") + private String distrCarNumber; + + @ApiModelProperty(value = "运单号") + private String waybillNumber; + + @ApiModelProperty(value = "订单号") + private String orderCode; + + + @ApiModelProperty(value = "总件数") + private Integer totalNum; + + @ApiModelProperty(value = "入库件数") + private Integer inNum; + + @ApiModelProperty(value = "待入库件数") + private Integer restNum; + +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarNumerPageQueryVO.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarNumerPageQueryVO.java new file mode 100644 index 000000000..a746d5578 --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarNumerPageQueryVO.java @@ -0,0 +1,16 @@ +package com.logpm.business.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class DistributionBusinessPreCarNumerPageQueryVO { + @ApiModelProperty(value = "开始时间") + private String taskTimeStart; + @ApiModelProperty(value = "结束时间") + private String taskTimeEnd; + @ApiModelProperty(value = "订单号") + private String orderCode; + @ApiModelProperty(value = "配送车次号") + private String distrCarNumber; +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarNumerPageVO.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarNumerPageVO.java new file mode 100644 index 000000000..1f5a6077b --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarNumerPageVO.java @@ -0,0 +1,34 @@ +package com.logpm.business.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class DistributionBusinessPreCarNumerPageVO { + @ApiModelProperty(value = "配送车次") + private String distrCarNumber; + + + @ApiModelProperty(value = "配送司机") + private String driverName; + + @ApiModelProperty(value = "配送车辆") + private String vehicleName; + + @ApiModelProperty(value = "配送日期") + private String taskTime; + + @ApiModelProperty(value = "订单总数") + private Integer orderCount; + + @ApiModelProperty(value = "计划件数") + private Integer orderPackageCodeCount; + + @ApiModelProperty(value = "装车件数") + private Integer loadCarCount; + + @ApiModelProperty(value = "入库件数") + private Integer inWarehouseCount; + + +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarOrderDetalVO.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarOrderDetalVO.java new file mode 100644 index 000000000..aed5ff5fe --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreCarOrderDetalVO.java @@ -0,0 +1,35 @@ +package com.logpm.business.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class DistributionBusinessPreCarOrderDetalVO { + /** + * 订单自编号 + */ + @ApiModelProperty(value = "订单自编号") + private String orderCode; + /** + * 运单号 + */ + @ApiModelProperty(value = "运单号") + private String waybillNumber; + + @ApiModelProperty(value = "计划件数") + private Integer orderPackageCodeCount; + + @ApiModelProperty(value = "装车件数") + private Integer loadCarCount; + + @ApiModelProperty(value = "入库件数") + private Integer inWarehouseCount; + + @ApiModelProperty(value = "异常入库件数") + private Integer inWarehouseExceCount; + + @ApiModelProperty(value = "包件列表") + private List distributionBusinessPreCarDetalPackageList; +} diff --git a/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreOrderListVO.java b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreOrderListVO.java new file mode 100644 index 000000000..4c97541bb --- /dev/null +++ b/blade-service-api/logpm-business-api/src/main/java/com/logpm/business/vo/DistributionBusinessPreOrderListVO.java @@ -0,0 +1,28 @@ +package com.logpm.business.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class DistributionBusinessPreOrderListVO implements Serializable { + + /** + * 总数 + */ + private Integer sumNum; + + + /** + * 入库数量 + */ + private Integer inNum; + + /** + * 列表数据 + */ + private List list; + + +} diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/dto/FindParamterDTO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/dto/FindParamterDTO.java new file mode 100644 index 000000000..3723bb5b2 --- /dev/null +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/dto/FindParamterDTO.java @@ -0,0 +1,19 @@ +package com.logpm.distribution.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Set; + +@Data +public class FindParamterDTO implements Serializable { + + private Set orderCodeSet; + + private Long warehouseId; + + private List orderPackageCodeList; + private List orderCodeList; + +} diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/dto/OrderPackageDTO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/dto/OrderPackageDTO.java new file mode 100644 index 000000000..f1158e8f2 --- /dev/null +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/dto/OrderPackageDTO.java @@ -0,0 +1,14 @@ +package com.logpm.distribution.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class OrderPackageDTO implements Serializable { + + private List strings; + + private Long warehouseId; +} diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionAddvaluePackageEntity.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionAddvaluePackageEntity.java index 91ba6ef5b..8932e3ec5 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionAddvaluePackageEntity.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionAddvaluePackageEntity.java @@ -20,6 +20,8 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; + +import java.math.BigDecimal; import java.util.Date; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -137,4 +139,50 @@ public class DistributionAddvaluePackageEntity extends TenantEntity implements S private String recordType; + /** + * 总数量 + */ + @ApiModelProperty(value = "客户ID") + private Long clientId; + + /** + * 总数量 + */ + @ApiModelProperty(value = "客户名称") + private String clientName; + + /** + * 总数量 + */ + @ApiModelProperty(value = "客户ID") + private Long brandId; + + /** + * 总数量 + */ + @ApiModelProperty(value = "客户名称") + private String brandName; + + /** + * 单价 + */ + @ApiModelProperty(value = "单价") + private BigDecimal unitPrice; + + /** + * 费用 + */ + @ApiModelProperty(value = "费用") + private BigDecimal fee; + + + /** + * 扫描操作人 + */ + @ApiModelProperty(value = "扫描操作人") + private String scanUserName; + + + + } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionBillLadingScanEntity.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionBillLadingScanEntity.java index c6e819ac8..5972804bd 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionBillLadingScanEntity.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionBillLadingScanEntity.java @@ -69,4 +69,10 @@ public class DistributionBillLadingScanEntity extends BaseEntity { @ApiModelProperty(value = "库存品id") private Long stockListId; + @ApiModelProperty(value = "仓库Id") + private Long warehouseId; + + @ApiModelProperty(value = "扫描操作人") + private String scanUser; + } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscanAbnormalEntity.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscanAbnormalEntity.java index af42437a0..754e25106 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscanAbnormalEntity.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscanAbnormalEntity.java @@ -105,7 +105,13 @@ public class DistributionLoadscanAbnormalEntity extends TenantEntity { * 仓库Id */ @ApiModelProperty(value = "仓库Id") - private String warehouseId; + private Long warehouseId; + + /** + * 扫描记录ID + */ + @ApiModelProperty(value = "扫描记录ID") + private Long loadingId; /** * 仓库名称 */ diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscanEntity.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscanEntity.java index b450bd648..e3615b542 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscanEntity.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscanEntity.java @@ -348,9 +348,16 @@ public class DistributionLoadscanEntity extends TenantEntity { @ApiModelProperty(value = "是否异常装车 1-否 2-是") private Integer isAbnormalLoading; + /** * 是否异常装车 1-否 2-是 */ @ApiModelProperty(value = "是否异常装车 1-否 2-是") private Integer isZero; + + /** + * 签收方式 + */ + @ApiModelProperty(value = "签收方式") + private Integer signforType; } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscaninvnEntity.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscaninvnEntity.java index ad98ee83f..0fb8d3aea 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscaninvnEntity.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionLoadscaninvnEntity.java @@ -335,4 +335,10 @@ public class DistributionLoadscaninvnEntity extends TenantEntity { @ApiModelProperty(value = "是否一键签收(1-不是,2-是)") private Long signingUserId; + /** + * 签收方式 + */ + @ApiModelProperty(value = "签收方式") + private Integer signforType; + } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionParcelListEntity.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionParcelListEntity.java index c8a08bab3..673a3e634 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionParcelListEntity.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionParcelListEntity.java @@ -197,7 +197,7 @@ public class DistributionParcelListEntity extends TenantEntity { * 运单ID */ @ApiModelProperty(value = "运单ID") - private String waybillId; + private Long waybillId; /** * 客户id */ @@ -205,6 +205,13 @@ public class DistributionParcelListEntity extends TenantEntity { @TableField(exist = false) private Long marketId; + /** + * 商场id + */ + @ApiModelProperty(value = "商场id") + @TableField(exist = false) + private Long mallId; + /** * 商场名称 */ @@ -223,12 +230,12 @@ public class DistributionParcelListEntity extends TenantEntity { @ApiModelProperty(value = "零担标识") @TableField(exist = false) private String isZero; - /** - * 商场名称 - */ - @ApiModelProperty(value = "商场iD") - @TableField(exist = false) - private Long mallId; +// /** +// * 商场名称 +// */ +// @ApiModelProperty(value = "商场iD") +// @TableField(exist = false) +// private Long mallId; /** * 托盘ID */ diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionReservationEntity.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionReservationEntity.java index 0dd00567e..7cb58f1f8 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionReservationEntity.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionReservationEntity.java @@ -45,6 +45,7 @@ public class DistributionReservationEntity extends TenantEntity { */ @ApiModelProperty(value = "订单自编号;订单自编号,关联订单表") private String stockArticleId; +// private String orderCodes; /** * 收货人 */ @@ -297,6 +298,10 @@ public class DistributionReservationEntity extends TenantEntity { @ApiModelProperty(value = "备货结束时间") private Date endTimeStocking; - + /** + * 是否安装 + */ + @ApiModelProperty(value = "是否安装, 0-否 1- 是") + private Integer isInstall; } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionReservationPackageEntity.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionReservationPackageEntity.java index 5f2cde2a1..cfa938169 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionReservationPackageEntity.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionReservationPackageEntity.java @@ -96,5 +96,12 @@ public class DistributionReservationPackageEntity extends TenantEntity { private Integer cancelStatus; + /** + * 包件任务取消备注 + */ + @ApiModelProperty(value = "包件任务取消备注") + private String cancelRemark; + + } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionStockArticleEntity.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionStockArticleEntity.java index 105d2df4b..ddf0681fb 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionStockArticleEntity.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionStockArticleEntity.java @@ -404,7 +404,7 @@ public class DistributionStockArticleEntity extends TenantEntity { private String orderStatus; @ApiModelProperty(value = "预约状态") - private String reservationStatus; + private String reservationStatus; @ApiModelProperty(value = "备货状态") private String stockupStatus; @@ -475,6 +475,8 @@ public class DistributionStockArticleEntity extends TenantEntity { String consigneePerson = distributionStockArticleEntity.getConsigneePerson(); String consigneeMobile = distributionStockArticleEntity.getConsigneeMobile(); String consigneeAddress = distributionStockArticleEntity.getConsigneeAddress(); + String consigneeUnit = distributionStockArticleEntity.getConsigneeUnit(); + String mallName = distributionStockArticleEntity.getMallName(); StringBuilder stringBuilder = new StringBuilder(); boolean nameFlag = ObjectUtil.equals(this.customerName, customerName); @@ -501,6 +503,14 @@ public class DistributionStockArticleEntity extends TenantEntity { if(!consigneeAddressFlag){ stringBuilder.append("运单收货地址:["+this.consigneeAddress+"]修改为["+consigneeAddress+"];"); } + boolean consigneeUnitFlag = ObjectUtil.equals(this.consigneeUnit, consigneeUnit); + if(!consigneeUnitFlag){ + stringBuilder.append("运单收货单位:["+this.consigneeUnit+"]修改为["+consigneeUnit+"];"); + } + boolean mallNameFlag = ObjectUtil.equals(this.mallName, mallName); + if(!mallNameFlag){ + stringBuilder.append("运单收货单位:["+this.mallName+"]修改为["+mallName+"];"); + } return stringBuilder.toString(); } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionStockEntity.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionStockEntity.java index 69a8fffe2..de240adbb 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionStockEntity.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionStockEntity.java @@ -117,6 +117,11 @@ public class DistributionStockEntity extends TenantEntity { @ApiModelProperty(value = "包件id") @TableField(exist = false) private String parcelsId; + /** + * 扫描操作人 + */ + @ApiModelProperty(value = "扫描操作人") + private String scanUser; /** * 单位 */ @@ -164,6 +169,9 @@ public class DistributionStockEntity extends TenantEntity { @ApiModelProperty(value = "备货区") private String stockupArea; + + @ApiModelProperty(value = "备货区") + private Long stockupAreaId; /** * 货位Id */ diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistrilbutionBillLadingEntity.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistrilbutionBillLadingEntity.java index 281373b14..8e048dade 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistrilbutionBillLadingEntity.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistrilbutionBillLadingEntity.java @@ -83,6 +83,12 @@ public class DistrilbutionBillLadingEntity extends TenantEntity { @ApiModelProperty(value = "提货人") private String consignee; + /** + * 收货单位 + */ + @ApiModelProperty(value = "收货单位") + private String consigneeUnit; + @ApiModelProperty(value = "提货人电话") private String consigneePhone; /** @@ -161,6 +167,18 @@ public class DistrilbutionBillLadingEntity extends TenantEntity { @ApiModelProperty(value = "备货库存品数量") private Integer reserveQuantity; + /** + * 审核人ID + */ + @ApiModelProperty(value = "审核人ID") + private Long examineUserId; + + /** + * 审核人名称 + */ + @ApiModelProperty(value = "审核人名称") + private String examineUserName; + diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionDeliveryListClient.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionDeliveryListClient.java index fd5d8e912..a9499e68a 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionDeliveryListClient.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionDeliveryListClient.java @@ -128,6 +128,12 @@ public interface IDistributionDeliveryListClient { @GetMapping(TOP+"/maintenanceDeliveryInfoByWarehouseId") void maintenanceDeliveryInfoByWarehouseId(@RequestParam("warehouseId")String params); + @GetMapping(TOP+"/pushNotification") + void pushNotification(@RequestParam("warehouseIds")String warehouseIds,@RequestParam("reservationCode")String reservationCode); + + @GetMapping(TOP+"/mallClientSignfor") + void mallClientSignfor(@RequestParam("tenantId") String tenantId,@RequestParam("trainNumber")String trainNumber,@RequestParam("warehouseId")Long warehouseId,@RequestParam("orderPackageCode")String orderPackageCode,@RequestParam("nowTenantId")String nowTenantId); + // /** // * 根据配送任务ID查询配送司机信息 diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelListClient.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelListClient.java index d8a3b2f93..c4e52e963 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelListClient.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelListClient.java @@ -16,6 +16,8 @@ */ package com.logpm.distribution.feign; +import com.logpm.distribution.dto.FindParamterDTO; +import com.logpm.distribution.dto.OrderPackageDTO; import com.logpm.distribution.entity.DistributionParcelListEntity; import com.logpm.distribution.vo.DistributionParcelListVO; import org.springblade.common.constant.ModuleNameConstant; @@ -29,6 +31,7 @@ import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.Map; +import java.util.Set; /** * 在库订单包件清单 Feign接口类 @@ -37,15 +40,15 @@ import java.util.Map; * @since 2023-06-13 */ @FeignClient( - value = ModuleNameConstant.APPLICATION_DISTRIBUTION_NAME + value = ModuleNameConstant.APPLICATION_DISTRIBUTION_NAME ) public interface IDistributionParcelListClient { - String API_PREFIX = "/client"; - String TOP = API_PREFIX + "/top1"; - String TOPPARCELLIST = API_PREFIX + "/getParcelList"; - String GETPARCELLISTID = API_PREFIX + "/getParcelListId"; - String GETPARCELLISTINFO = API_PREFIX + "/getParcelListInfo"; + String API_PREFIX = "/client"; + String TOP = API_PREFIX + "/top1"; + String TOPPARCELLIST = API_PREFIX + "/getParcelList"; + String GETPARCELLISTID = API_PREFIX + "/getParcelListId"; + String GETPARCELLISTINFO = API_PREFIX + "/getParcelListInfo"; @PostMapping(TOPPARCELLIST) List getParcelList(@RequestBody DistributionParcelListEntity parcelListEntity); @@ -54,99 +57,148 @@ public interface IDistributionParcelListClient { @GetMapping(GETPARCELLISTID) DistributionParcelListEntity getParcelListId(@RequestParam String id); - /** - * 获取在库订单包件清单列表 - * - * @param current 页号 - * @param size 页数 - * @return BladePage - */ - @GetMapping(TOP) - BladePage top(@RequestParam("current") Integer current, @RequestParam("size") Integer size); + /** + * 获取在库订单包件清单列表 + * + * @param current 页号 + * @param size 页数 + * @return BladePage + */ + @GetMapping(TOP) + BladePage top(@RequestParam("current") Integer current, @RequestParam("size") Integer size); + + @GetMapping(API_PREFIX + "/findByPacketBarCode") + List findByPacketBarCode(@RequestParam String unitNo); - @GetMapping(API_PREFIX+"/findByPacketBarCode") - DistributionParcelListEntity findByPacketBarCode(@RequestParam String unitNo); + @GetMapping(API_PREFIX + "/findByPacketBarCodeAndWarehouseId") + DistributionParcelListEntity findByPacketBarCodeAndWarehouseId(@RequestParam String unitNo, @RequestParam Long warehouseId); - @GetMapping(API_PREFIX+"/findByPacketBarCodeAndWarehouseId") - DistributionParcelListEntity findByPacketBarCodeAndWarehouseId(@RequestParam String unitNo,@RequestParam Long warehouseId); + @PostMapping(API_PREFIX + "/findByPacketBarCodesAndWarehouseId") + List findByPacketBarCodesAndWarehouseId(@RequestBody OrderPackageDTO orderPackageDTO); - @PostMapping(API_PREFIX+"/addBatch") + @PostMapping(API_PREFIX + "/addBatch") boolean addBatch(@RequestBody List parcelListEntityList); - @PostMapping(API_PREFIX+"/add") + @PostMapping(API_PREFIX + "/add") boolean add(@RequestBody DistributionParcelListEntity entity); - @GetMapping(API_PREFIX+"/submitNumByOrderIdAndName") + @GetMapping(API_PREFIX + "/submitNumByOrderIdAndName") boolean submitNumByOrderIdAndName(@RequestParam Long articleId, @RequestParam String productName, @RequestParam Integer num); - @GetMapping(API_PREFIX+"/findEntityListByOrderCode") - List findEntityListByOrderCode(@RequestParam String orderCode,@RequestParam Long warehouseId); + @GetMapping(API_PREFIX + "/findEntityListByOrderCode") + List findEntityListByOrderCode(@RequestParam String orderCode, @RequestParam Long warehouseId); - @GetMapping(API_PREFIX+"/findALLNoUpShelfPackageByOrderCode") - List findALLNoUpShelfPackageByOrderCode(@RequestParam String orderCode,@RequestParam Long warehouseId); + @GetMapping(API_PREFIX + "/findALLNoUpShelfPackageByOrderCode") + List findALLNoUpShelfPackageByOrderCode(@RequestParam String orderCode, @RequestParam Long warehouseId); - @GetMapping(API_PREFIX+"/updatePackageGroundingStatus") - void updatePackageGroundingStatus(@RequestParam String orderPackageCode, @RequestParam String groundingStatus,@RequestParam Long warehouseId); + @GetMapping(API_PREFIX + "/updatePackageGroundingStatus") + void updatePackageGroundingStatus(@RequestParam String orderPackageCode, @RequestParam String groundingStatus, @RequestParam Long warehouseId); - @GetMapping(API_PREFIX+"/getListByOrderCodeAndgroundingStatus") - List getListByOrderCodeAndgroundingStatus(@RequestParam String orderCode, @RequestParam String groundingStatus,@RequestParam Long warehouseId); - @PostMapping(API_PREFIX+"/update") + @GetMapping(API_PREFIX + "/getListByOrderCodeAndgroundingStatus") + List getListByOrderCodeAndgroundingStatus(@RequestParam String orderCode, @RequestParam String groundingStatus, @RequestParam Long warehouseId); + + @PostMapping(API_PREFIX + "/update") void update(@RequestBody DistributionParcelListEntity distributionParcelListEntity); - @GetMapping(API_PREFIX+"/SumEntityZkByOrderId") - Integer SumEntityByOrderId(@RequestParam Long orderId,@RequestParam Long warehouseId); + @GetMapping(API_PREFIX + "/SumEntityZkByOrderId") + Integer SumEntityByOrderId(@RequestParam Long orderId, @RequestParam Long warehouseId); /** * 查询订单下所有包件信息 + * * @param id * @return */ - @GetMapping(API_PREFIX+"/getParcelListByStockArticleId") + @GetMapping(API_PREFIX + "/getParcelListByStockArticleId") List getParcelListByStockArticleId(@RequestParam Long id); - @PostMapping(API_PREFIX+"/addReturnId") + @PostMapping(API_PREFIX + "/addReturnId") Long addReturnId(@RequestBody DistributionParcelListEntity entity); - @GetMapping(API_PREFIX+"/updateStockArticleIdByOrderCode") + @GetMapping(API_PREFIX + "/updateStockArticleIdByOrderCode") void updateStockArticleIdByOrderCode(@RequestParam Long orderId, @RequestParam String orderCode); @PostMapping(GETPARCELLISTINFO) List getParcelListInfo(@RequestBody DistributionParcelListVO parcelListVO); - @GetMapping(API_PREFIX+"/findByOrderPackageCodeAndStatus") + @GetMapping(API_PREFIX + "/findByOrderPackageCodeAndStatus") DistributionParcelListEntity findByOrderPackageCodeAndStatus(@RequestParam String orderPackageCode); - @GetMapping(API_PREFIX+"/updateOrderPackageCodeById") - void updateOrderPackageCodeById(@RequestParam Long packageId, @RequestParam String orderPackageStatus); + @GetMapping(API_PREFIX + "/updateOrderPackageCodeById") + void updateOrderPackageCodeById(@RequestParam Long packageId, @RequestParam String orderPackageStatus); /** * 根据包条码和仓库ID查询订单相关信息 + * * @param orderPackCode 包条码 - * @param warehouseId 仓库ID + * @param warehouseId 仓库ID * @return */ - @GetMapping(API_PREFIX+"/findByOrderInfoByOrderPackageCodeAndWarehouseId") - Map findByOrderInfoByOrderPackageCodeAndWarehouseId(@RequestParam String orderPackCode,@RequestParam Long warehouseId); + @GetMapping(API_PREFIX + "/findByOrderInfoByOrderPackageCodeAndWarehouseId") + Map findByOrderInfoByOrderPackageCodeAndWarehouseId(@RequestParam String orderPackCode, @RequestParam Long warehouseId); + + @GetMapping(API_PREFIX + "/queryOrderByOrderPackageCode") + R queryOrderByOrderPackageCode(@RequestParam String orderPackageCode); - @GetMapping(API_PREFIX+"/queryOrderByOrderPackageCode") - R queryOrderByOrderPackageCode( @RequestParam String orderPackageCode); - @GetMapping(API_PREFIX+"/updateTransferStatus") - void updateTransferStatus(@RequestParam String orderCode, @RequestParam Long warehouseId, @RequestParam Integer isTransfer); + @GetMapping(API_PREFIX + "/updateTransferStatus") + void updateTransferStatus(@RequestParam String orderCode, @RequestParam Long warehouseId, @RequestParam Integer isTransfer); - @GetMapping(API_PREFIX+"/updateEntityByOpenOrder") + @GetMapping(API_PREFIX + "/updateEntityByOpenOrder") void updateEntityByOpenOrder(@RequestParam Long advanceId, @RequestParam Long waybillId); - @GetMapping(API_PREFIX+"/findByWaybillNumber") + @GetMapping(API_PREFIX + "/findByWaybillNumber") List findByWaybillNumber(@RequestParam String waybillNumber); - @GetMapping(API_PREFIX+"/findEntityListByOrderCodeAndStatus") - List findEntityListByOrderCodeAndStatus(@RequestParam String orderCode, @RequestParam Long warehouseId, @RequestParam String packageStatus); + @GetMapping(API_PREFIX + "/findEntityListByOrderCodeAndStatus") + List findEntityListByOrderCodeAndStatus(@RequestParam String orderCode, @RequestParam Long warehouseId, @RequestParam String packageStatus, @RequestParam String waybillNo); - @GetMapping(API_PREFIX+"/getListByOrderPackageCode") + @GetMapping(API_PREFIX + "/getListByOrderPackageCode") List getListByOrderPackageCode(@RequestParam String orderPackageCode); - @GetMapping(API_PREFIX+"/findAllStockListByOrderPackageCode") + @GetMapping(API_PREFIX + "/findAllStockListByOrderPackageCode") List findAllStockListByOrderPackageCode(String orderPackageCode); + + @PostMapping(API_PREFIX + "/updatePackageStatus") + void updatePackageStatus(@RequestParam List orderPackageCodes, @RequestParam Long warehouseId, @RequestParam String packageStatus); + + @PostMapping(API_PREFIX + "/updateList") + void updateList(@RequestBody List updateParcelList); + + @PostMapping(API_PREFIX + "/updateFreezeStatusByWaybillIds") + void updateFreezeStatusByWaybillIds(@RequestBody List waybillIds); + + @PostMapping(API_PREFIX + "/updateUnFreezeStatusByWaybillIds") + void updateUnFreezeStatusByWaybillIds(@RequestBody List waybillIds); + + @PostMapping(API_PREFIX + "/clearParceListWaybillByAdvanceIds") + void clearParceListWaybillByAdvanceIds(@RequestBody List advanceIds); + + @GetMapping(API_PREFIX + "/findListByWaybillId") + List findListByWaybillId(@RequestParam Long waybillId); + + @PostMapping(API_PREFIX + "/findPackagesByAdvanceIdsAndNoStock") + List findPackagesByAdvanceIdsAndNoStock(@RequestParam List advanceIds, @RequestParam Long warehouseId); + + @PostMapping(API_PREFIX + "/findAllOrderCodesByAdvanceIds") + List findAllOrderCodesAndDeleteByAdvanceIds(@RequestParam List advanceIds, @RequestParam Long warehouseId); + + @GetMapping(API_PREFIX + "/findPackageCodeByCodes") + Map> findPackageCodeByCodes(@RequestBody Set keySet); + + @PostMapping(API_PREFIX + "/saveorUpdateBatchByOP") + void saveorUpdateBatchByOP(@RequestBody List parcelListEntityList); + + @PostMapping(API_PREFIX + "/findListByOrderCodesAndWarehouseId") + List findListByOrderCodesAndWarehouseId(@RequestBody FindParamterDTO findParamterDTO); + + @PostMapping(API_PREFIX + "/findListByOrderPackageCodeList") + List findListByOrderPackageCodeList(@RequestBody FindParamterDTO findParamterDTO); + + @PostMapping(API_PREFIX + "/findALLNoUpShelfPackageByOrderCodeList") + List findALLNoUpShelfPackageByOrderCodeList(@RequestBody FindParamterDTO findParamterDTO); + + @PostMapping(API_PREFIX + "/findAllParcelListByAdvanceIds") + List findAllParcelListByAdvanceIds(@RequestBody List advanceIds); } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionReservationClient.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionReservationClient.java index e305b927f..78e767c3f 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionReservationClient.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionReservationClient.java @@ -61,6 +61,8 @@ public interface IDistributionReservationClient { */ @GetMapping(TOP+"/getReservationList") List getReservationList(@RequestParam("reservationIds") String reservationIds); + @GetMapping(TOP+"/getReservationByCodeAndWarehouseId") + DistributionReservationEntity getReservationByCodeAndWarehouseId(@RequestParam("reservationCode") String reservationCode,@RequestParam("warehouseId") String warehouseId); /** diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionSignforClient.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionSignforClient.java index 94d609ba1..53ca6e01c 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionSignforClient.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionSignforClient.java @@ -19,6 +19,7 @@ package com.logpm.distribution.feign; import com.logpm.distribution.entity.DistributionSignforEntity; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.mp.support.BladePage; +import org.springblade.core.tool.api.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -36,6 +37,7 @@ public interface IDistributionSignforClient { String API_PREFIX = "signfor/client"; String TOP = API_PREFIX + "/top"; + String CLERKCHECKPUSHDATA = API_PREFIX + "/clerkCheckPushData"; /** * 获取签收管理列表 @@ -47,4 +49,17 @@ public interface IDistributionSignforClient { @GetMapping(TOP) BladePage top(@RequestParam("current") Integer current, @RequestParam("size") Integer size); + + + @GetMapping(TOP+"push0ldSystemSignInfo") + void push0ldSystemSignInfo(@RequestParam("current") Long signingId); + + + /** + * 推送老系统签收 + * @param id + * @return + */ + @GetMapping(CLERKCHECKPUSHDATA) + Boolean clerkCheckPushData(@RequestParam("id") Long id); } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionStockArticleClient.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionStockArticleClient.java index 482860443..a6136150c 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionStockArticleClient.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionStockArticleClient.java @@ -18,16 +18,20 @@ package com.logpm.distribution.feign; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.distribution.dto.FindParamterDTO; +import com.logpm.distribution.dto.OrderPackageDTO; import com.logpm.distribution.entity.DistributionStockArticleEntity; import com.logpm.distribution.vo.UpDownStockupAreaVO; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.mp.support.BladePage; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -38,44 +42,44 @@ import java.util.Map; * @since 2023-06-13 */ @FeignClient( - value = ModuleNameConstant.APPLICATION_DISTRIBUTION_NAME + value = ModuleNameConstant.APPLICATION_DISTRIBUTION_NAME ) public interface IDistributionStockArticleClient { - String API_PREFIX = "/client"; - String TOP = API_PREFIX + "/top12"; - String GETSTOCKARTICLEINFO = API_PREFIX + "/getStockArticleInfo"; + String API_PREFIX = "/client"; + String TOP = API_PREFIX + "/top12"; + String GETSTOCKARTICLEINFO = API_PREFIX + "/getStockArticleInfo"; - /** - * 获取配送在库订单列表 - * - * @param current 页号 - * @param size 页数 - * @return BladePage - */ - @GetMapping(TOP) - BladePage top(@RequestParam("current") Integer current, @RequestParam("size") Integer size); + /** + * 获取配送在库订单列表 + * + * @param current 页号 + * @param size 页数 + * @return BladePage + */ + @GetMapping(TOP) + BladePage top(@RequestParam("current") Integer current, @RequestParam("size") Integer size); @PostMapping(API_PREFIX + "/addData") - Long addData(@RequestBody DistributionStockArticleEntity distributionStockArticleEntity); + Long addData(@RequestBody DistributionStockArticleEntity distributionStockArticleEntity); @GetMapping(API_PREFIX + "/findByAdvanceId") - DistributionStockArticleEntity findByAdvanceId(@RequestParam Integer advanceId); + DistributionStockArticleEntity findByAdvanceId(@RequestParam Integer advanceId); @PostMapping(API_PREFIX + "/saveOrUpdate") - void saveOrUpdate(@RequestBody DistributionStockArticleEntity distributionStockArticleEntity); + void saveOrUpdate(@RequestBody DistributionStockArticleEntity distributionStockArticleEntity); @GetMapping(API_PREFIX + "/addHandQuantity") - void addHandQuantity(@RequestParam("id") Long id,@RequestParam("num") int num); + void addHandQuantity(@RequestParam("id") Long id, @RequestParam("num") int num); @GetMapping(API_PREFIX + "/findByOrderSelfNum") - DistributionStockArticleEntity findByOrderSelfNum(@RequestParam String orderCode,@RequestParam Long warehouseId); + DistributionStockArticleEntity findByOrderSelfNum(@RequestParam String orderCode, @RequestParam Long warehouseId); @GetMapping(API_PREFIX + "/deleteById") void deleteById(@RequestParam Long orderId); @GetMapping(API_PREFIX + "/submitHandQuantity") - void submitHandQuantity(@RequestParam Integer allNum,@RequestParam Long articleId); + void submitHandQuantity(@RequestParam Integer allNum, @RequestParam Long articleId); @GetMapping(API_PREFIX + "/findListByOrderCodeLike") List findListByOrderCodeLike(@RequestParam String orderCode); @@ -84,15 +88,20 @@ public interface IDistributionStockArticleClient { DistributionStockArticleEntity findStockArticleByOrderCode(@RequestParam String orderCode); @GetMapping(API_PREFIX + "/findEntityByStockArticleId") - DistributionStockArticleEntity findEntityByStockArticleId(@RequestParam Long stockArticleId); + DistributionStockArticleEntity findEntityByStockArticleId(@RequestParam Long stockArticleId); + @GetMapping(API_PREFIX + "/fingListByServiceNumber") - List fingListByServiceNumber(@RequestParam String serviceNumber,@RequestParam Long warehouseId); + List fingListByServiceNumber(@RequestParam String serviceNumber, @RequestParam Long warehouseId); + @GetMapping(API_PREFIX + "/findListByWaybillNumber") - List findListByWaybillNumber(@RequestParam String waybillNumber); + List findListByWaybillNumber(@RequestParam String waybillNumber); + @GetMapping(API_PREFIX + "/findStockArticleByOrderCodeAndWarehouseId") DistributionStockArticleEntity findStockArticleByOrderCodeAndWarehouseId(@RequestParam String orderCode, @RequestParam Long warehouseId); + @GetMapping(API_PREFIX + "/findListByWaybillNumberAndWarehouseId") List findListByWaybillNumberAndWarehouseId(@RequestParam String waybillNumber, @RequestParam Long warehouseId); + @GetMapping(API_PREFIX + "/updateGroundingStatus") void updateGroundingStatus(@RequestParam String orderCode, @RequestParam String groundingStatus, @RequestParam Long warehouseId); @@ -104,35 +113,39 @@ public interface IDistributionStockArticleClient { @GetMapping(API_PREFIX + "/findStockArticleByCodeAndMarketAndWarehouseId") - List findStockArticleByCodeAndMarketAndWarehouseId(@RequestParam String incomingBatch,@RequestParam String marketNames,@RequestParam Long warehouseId); + List findStockArticleByCodeAndMarketAndWarehouseId(@RequestParam String incomingBatch, @RequestParam String marketNames, @RequestParam Long warehouseId); @GetMapping(API_PREFIX + "/findShelfNumByOrderCodeAndWarehouseId") Map findShelfNumByOrderCodeAndWarehouseId(@RequestParam String orderCode, @RequestParam Long warehouseId); @GetMapping(API_PREFIX + "/submitHandleNumByOrderId") - void submitHandleNumByOrderId(@RequestParam Integer subNum, @RequestParam Long articleId); + void submitHandleNumByOrderId(@RequestParam Integer subNum, @RequestParam Long articleId); /** * 查询订单信息数据 + * * @return */ @PostMapping(GETSTOCKARTICLEINFO) - List getStockArticleInfo(@RequestBody DistributionStockArticleEntity distributionStockArticleEntity); + List getStockArticleInfo(@RequestBody DistributionStockArticleEntity distributionStockArticleEntity); @GetMapping(API_PREFIX + "/updateCustomerInfoByOrderCode") - void updateCustomerInfoByOrderCode(@RequestParam String customerName, @RequestParam String customerPhone, @RequestParam String customerAddress, @RequestParam String orderCode); + void updateCustomerInfoByOrderCode(@RequestParam String customerName, @RequestParam String customerPhone, @RequestParam String customerAddress, @RequestParam String orderCode); @GetMapping(API_PREFIX + "/freezeByOrderCode") - void freezeByOrderCode(@RequestParam String orderCode,@RequestParam String freezeStatus); + void freezeByOrderCode(@RequestParam String orderCode, @RequestParam String freezeStatus); @GetMapping(API_PREFIX + "/addCarsLoadNum") void addCarsLoadNum(@RequestParam Integer planNum, @RequestParam String orderCode, @RequestParam Long warehouseId); @GetMapping(API_PREFIX + "/addIncomingNum") - void addIncomingNum(@RequestParam Long orderId, @RequestParam Integer num); + void addIncomingNum(@RequestParam Long orderId, @RequestParam Integer num); @GetMapping(API_PREFIX + "/updateOrderInfo") - void updateOrderInfo(@RequestParam String orderCode, @RequestParam Long warehouseId); + void updateOrderInfo(@RequestParam String orderCode, @RequestParam Long warehouseId); + + @PostMapping(API_PREFIX + "/updateOrdersInfo") + void updateOrdersInfo(@RequestBody OrderPackageDTO orderPackageDTO); @GetMapping(API_PREFIX + "/findZeroListByWarehouseId") IPage findZeroListByWarehouseId(@RequestParam Long warehouseId, @RequestParam Integer pageNum, @RequestParam Integer pageSize); @@ -144,11 +157,39 @@ public interface IDistributionStockArticleClient { List findListByOrderCode(@RequestParam String orderCode); @GetMapping(API_PREFIX + "/maintenanceOrderStatus") - Boolean maintenanceOrderStatus(String warehouseId); + Boolean maintenanceOrderStatus(String warehouseId); @PostMapping(API_PREFIX + "/updateByBatchId") void updateByBatchId(@RequestBody List stockArticleEntities); @GetMapping(API_PREFIX + "/updateAllOrderTotalNum") - void updateAllOrderTotalNum(@RequestParam String orderCode, @RequestParam Integer total); + void updateAllOrderTotalNum(@RequestParam String orderCode, @RequestParam Integer total); + + + @GetMapping(API_PREFIX + "/maintenanceOrderMall") + Boolean maintenanceOrderMall(@RequestParam String orderIds); + + /** + * 全仓更新未预约的在库定单的客户信息 + * + * @param data 更新信息 + * @return + */ + @PostMapping(value = API_PREFIX + "/updateCustomerAllByOrderCode",consumes = MediaType.APPLICATION_JSON_VALUE) + void updateCustomerAllByOrderCode(@RequestBody String data); + + @PostMapping(value = API_PREFIX + "/findListByOrderCodesAndWarehouseId",consumes = MediaType.APPLICATION_JSON_VALUE) + List findListByOrderCodesAndWarehouseId(@RequestBody FindParamterDTO findParamterDTO); + + @PostMapping(value = API_PREFIX + "/addReturnList",consumes = MediaType.APPLICATION_JSON_VALUE) + List addReturnList(@RequestBody List addStockArticleEntities); + + @PostMapping(value = API_PREFIX + "/findOrderTotalNumByOrderCodes",consumes = MediaType.APPLICATION_JSON_VALUE) + Integer findOrderTotalNumByOrderCodes(@RequestBody JSONObject jsonObject); + + @PostMapping(value = API_PREFIX + "/findOrderTotalNumByOrderPackageCodes",consumes = MediaType.APPLICATION_JSON_VALUE) + Integer findOrderTotalNumByOrderPackageCodes(@RequestBody JSONObject jsonObject); + + @PostMapping(value = API_PREFIX + "/findAllStockArticleListByOrderCodes",consumes = MediaType.APPLICATION_JSON_VALUE) + List findAllStockArticleListByOrderCodes(@RequestBody List orderCodes); } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionStockClient.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionStockClient.java index 2a3a2819b..ce6e84d12 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionStockClient.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionStockClient.java @@ -47,4 +47,6 @@ public interface IDistributionStockClient { @GetMapping(TOP) BladePage top(@RequestParam("current") Integer current, @RequestParam("size") Integer size); + @GetMapping(TOP+"/getCargoStockUpAllocationId") + String getCargoStockUpAllocationId(@RequestParam("code")String code,@RequestParam("warehouseId") Long warehouseId,@RequestParam("taskId") Long taskId); } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistrilbutionBillLadingClient.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistrilbutionBillLadingClient.java index eaaf6609e..5cee28558 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistrilbutionBillLadingClient.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistrilbutionBillLadingClient.java @@ -47,4 +47,19 @@ public interface IDistrilbutionBillLadingClient { @GetMapping(TOP) BladePage top(@RequestParam("current") Integer current, @RequestParam("size") Integer size); + /** + * 推送老系统数据 + * @param id + * @return + */ + @GetMapping(TOP+"/clerkBillCheckPushData") + Boolean clerkBillCheckPushData(@RequestParam("id")Long id); + + /** + * 推送信息至工厂 + * @param ids + * @return + */ + @GetMapping(TOP+"/sendFactorySignforInfo") + Boolean sendFactorySignforInfo(@RequestParam("ids")String ids); } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionAddvaluePackageVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionAddvaluePackageVO.java index ef7d239ff..44488ff7c 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionAddvaluePackageVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionAddvaluePackageVO.java @@ -83,4 +83,6 @@ public class DistributionAddvaluePackageVO extends DistributionAddvaluePackageEn */ private String sku; + + } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionBillOrderVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionBillOrderVO.java index 90e1ab273..bb71ea973 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionBillOrderVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionBillOrderVO.java @@ -2,6 +2,8 @@ package com.logpm.distribution.vo; import lombok.Data; +import java.util.Date; + /** * 提货的订单列表 * @program: LogisticsPlatform-Service @@ -15,6 +17,10 @@ public class DistributionBillOrderVO { private String descriptionGoods; private String stockupStatus; private String stockupStatusName; + /** + * 扫描操作人 + */ + private String scanUser; /** * 应提货件数 */ @@ -38,13 +44,17 @@ public class DistributionBillOrderVO { /** * 提货件数 */ - private String pickUpQuantity; + private Integer pickUpQuantity; /** * 提货状态 */ private String conditions; /** - * 提货状态名稱 + * 提货状态 */ private String conditionsName; + /** + * 签收时间 + */ + private Date signingTime; } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionLoadscanAbnormalVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionLoadscanAbnormalVO.java index 95fb6c0e1..d83a09e72 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionLoadscanAbnormalVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionLoadscanAbnormalVO.java @@ -67,11 +67,17 @@ public class DistributionLoadscanAbnormalVO extends DistributionLoadscanAbnormal private String signingUser; /** - * 是否异常签收 + * 异常签收 */ - @ApiModelProperty(value = "签收人") + @ApiModelProperty(value = "异常签收") private Integer isAbnormalSigning; + /** + * 异常装车 + */ + @ApiModelProperty(value = "异常装车") + private Integer isAbnormalLoading; + /** * 一级品 */ diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionParcelListVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionParcelListVO.java index 40f944836..9aa7df879 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionParcelListVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionParcelListVO.java @@ -80,10 +80,10 @@ public class DistributionParcelListVO extends DistributionParcelListEntity { */ private String trayMsg; - /** - * 装车操作人 - */ - private String scanUser; +// /** +// * 装车操作人 +// */ +// private String scanUser; /** * 装车操作人 @@ -134,6 +134,11 @@ public class DistributionParcelListVO extends DistributionParcelListEntity { * 签收数量 */ private String loadingTime; + + /** + * 配送车次号 + */ + private String deliveryTrainNumber; /** * 实际装车人 */ @@ -141,6 +146,10 @@ public class DistributionParcelListVO extends DistributionParcelListEntity { @TableField(exist = false) private String signingUser; + @ApiModelProperty(value = "签收人") + @TableField(exist = false) + private String signingType; + /** * 预约号 */ diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionReservationVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionReservationVO.java index 1890bd12f..f1b97d8b0 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionReservationVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionReservationVO.java @@ -91,6 +91,12 @@ public class DistributionReservationVO extends DistributionReservationEntity { @ApiModelProperty(value = "签收状态") private String warehouseAddress; + /** + * 是否安装 + */ + @ApiModelProperty(value = "是否安装") + private String isInstallName; + /** * 仓库经度 diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionRetentionScanVo.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionRetentionScanVo.java index ede021734..020045a6f 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionRetentionScanVo.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionRetentionScanVo.java @@ -94,6 +94,22 @@ public class DistributionRetentionScanVo { */ private Long waybillId; + + /** + * 装车ID + */ + private Long loadingId; + + /** + * 仓库Id + */ + private Long warehouseId; + + /** + * 仓库名称 + */ + private String warehouseName; + /** * 零担滞留最大数 */ diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionSignforStockArticleVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionSignforStockArticleVO.java index 80cc63016..5357dca66 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionSignforStockArticleVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionSignforStockArticleVO.java @@ -192,7 +192,7 @@ public class DistributionSignforStockArticleVO implements Serializable { * 审核人 */ @ApiModelProperty(value = "审核人") - private String examineUserNames; + private String examineUserName; /** * 最早入库时间 @@ -213,6 +213,17 @@ public class DistributionSignforStockArticleVO implements Serializable { private Date scanSigningTime; + + /** + * 司机签收时间 + */ + @ApiModelProperty(value = "司机签收时间") + private Date sjsigningTime; + + + + + /** * 创建时间 */ @@ -224,6 +235,30 @@ public class DistributionSignforStockArticleVO implements Serializable { @ApiModelProperty(value = "创建人") private String createUserName; + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建人") + private String reservationIds; + + /** + * 预约编码 + */ + @ApiModelProperty(value = "预约编码") + private String reservationCode; + + /** + * 车次号 + */ + @ApiModelProperty(value = "车次号") + private String trainNumber; + + /** + * 预约数量 + */ + @ApiModelProperty(value = "预约数量") + private Integer reservationNum; + /** * 创建时间 @@ -231,6 +266,25 @@ public class DistributionSignforStockArticleVO implements Serializable { @ApiModelProperty(value = "签收时间") private Date signinTime; + /** + * 签收ID + */ + @ApiModelProperty(value = "签收ID") + private Long signforId; + + /** + * 配送ID + */ + @ApiModelProperty(value = "配送ID") + private Long deliveryId; + + + /** + * 创建时间 + */ + @ApiModelProperty(value = "签收时间") + private List> info; + diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionSignforStockListVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionSignforStockListVO.java new file mode 100644 index 000000000..1973a4b41 --- /dev/null +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionSignforStockListVO.java @@ -0,0 +1,121 @@ +/* + * 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.distribution.vo; + +import com.logpm.distribution.entity.DistributionStockListEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 库存品管理 视图实体类 + * + * @author cyz + * @since 2023-06-15 + */ +@Data +public class DistributionSignforStockListVO implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 批次号 + */ + private String incomingBatch; + + /** + * 物料编码 + */ + private String cargoNumber; + + /** + * 单位 + */ + private String cargoUnit; + + /** + * 商场名称 + */ + private String marketName; + + /** + * 规格 + */ + private String cargoNorms; + + /** + * 装车人 + */ + private String loadingUser; + + /** + * 签收人 + */ + private String signingUser; + + /** + * 装车状态 + */ + private String loadingStatus; + + /** + * 签收状态 + */ + private String signingStatus; + + /** + * 物料名称 + */ + private String descriptionGoods; + + /** + * 计划数量 + */ + private Integer planNum; + + /** + * 备货数量 + */ + private Integer stockupNum; + + /** + * 装车数量 + */ + private Integer loadingNum; + + /** + * 签收数量 + */ + private Integer signingNum; + + /** + * 签收时间 + */ + private String signingTime; + + /** + * 装车时间 + */ + private String loadingTime; + + + + + +} diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionSignforVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionSignforVO.java index 120c99373..5801766a7 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionSignforVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionSignforVO.java @@ -84,7 +84,7 @@ public class DistributionSignforVO extends DistributionSignforEntity { * 装车未扫数 */ @ApiModelProperty(value = "装车未扫数") - private String withoutScanning; + private Integer withoutScanning; /** * 计划总数 @@ -130,7 +130,7 @@ public class DistributionSignforVO extends DistributionSignforEntity { /** * 签收件数 */ - @ApiModelProperty(value = "装车件数") + @ApiModelProperty(value = "签收件数") private Integer signingNum; /** * 复核时间 diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionStockArticleVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionStockArticleVO.java index 5b37b61c9..aebfc01c2 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionStockArticleVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionStockArticleVO.java @@ -170,6 +170,11 @@ public class DistributionStockArticleVO extends DistributionStockArticleEntity { */ private String isZeroString; + /** + * 是否零担显示 + */ + private String reservationCode; + private Integer unreceivedQuantity; diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionStockupListVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionStockupListVO.java index 8c6b6f5dd..3efc83d9c 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionStockupListVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistributionStockupListVO.java @@ -8,7 +8,7 @@ import java.io.Serializable; public class DistributionStockupListVO implements Serializable { private Long id;//预约单id - private Long reservationId;//预约单id(自提Id) + private String reservationId;//预约单id(自提Id) private String reservation;//预约单id private Integer typeService;//服务类型 diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistrilbutionBillLadingViewVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistrilbutionBillLadingViewVO.java index 52022c1c5..a80fe4b6f 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistrilbutionBillLadingViewVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/DistrilbutionBillLadingViewVO.java @@ -20,6 +20,11 @@ public class DistrilbutionBillLadingViewVO { private String consigneeUnit; private String customerName; private String customerTelephone; + private Integer planNum; + private Integer realNum; + private String signforUserName; + private String examineTime; + private String examineUserName; //图片集合 private List printList; diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/OrderCodeDataVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/OrderCodeDataVO.java index 3410ca6c4..1f74fe21b 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/OrderCodeDataVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/OrderCodeDataVO.java @@ -19,5 +19,6 @@ public class OrderCodeDataVO { @ApiModelProperty(value = "模板填充内容") private List> dataList; + private List moldList; } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/OrderPackgeCodeDataVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/OrderPackgeCodeDataVO.java index c51d7c6ee..508e5e841 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/OrderPackgeCodeDataVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/OrderPackgeCodeDataVO.java @@ -20,4 +20,6 @@ public class OrderPackgeCodeDataVO { @ApiModelProperty(value = "模板填充内容") private List dataList; + private List moldList; + } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/SignforPageCountVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/SignforPageCountVO.java new file mode 100644 index 000000000..585ee974e --- /dev/null +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/SignforPageCountVO.java @@ -0,0 +1,25 @@ +package com.logpm.distribution.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +public class SignforPageCountVO { + + /** + * 总件数 + */ + private Long totalNumber; + + /** + * 装车件数 + */ + private Long loadedNumber; + + + /** + * 签收件数 + */ + private Long signeeNumber; + +} diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistributionAppDeliveryListVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistributionAppDeliveryListVO.java index 0a5538edd..4b3ab4bec 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistributionAppDeliveryListVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistributionAppDeliveryListVO.java @@ -134,6 +134,8 @@ public class DistributionAppDeliveryListVO extends DistributionDeliveryListEntit + + /** * 预约客户数据 */ diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistributionAppPackageDetailVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistributionAppPackageDetailVO.java index 02b2c78f8..6ebaec1a6 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistributionAppPackageDetailVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistributionAppPackageDetailVO.java @@ -44,6 +44,24 @@ public class DistributionAppPackageDetailVO implements Serializable { @ApiModelProperty(value = "订单自编号") private Integer isAbnormal; + /** + * 客户 + */ + @ApiModelProperty(value = "客户") + private String client; + + /** + * 电话 + */ + @ApiModelProperty(value = "电话") + private String phone; + + /** + * 地址 + */ + @ApiModelProperty(value = "地址") + private String address; + } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistrilbutionAppBillLadingOrderMainVO.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistrilbutionAppBillLadingOrderMainVO.java index 76c8f9986..307cf52d3 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistrilbutionAppBillLadingOrderMainVO.java +++ b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/vo/app/DistrilbutionAppBillLadingOrderMainVO.java @@ -22,6 +22,7 @@ import lombok.Data; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * 提货单 视图实体类 @@ -42,5 +43,6 @@ public class DistrilbutionAppBillLadingOrderMainVO implements Serializable { private List list = new ArrayList<>(); private List inventoryList = new ArrayList<>(); private List billLadingZeroOrderVOS = new ArrayList<>(); + private List> packageList ; } diff --git a/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/comfac/dto/OrderStatusDTO.java b/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/comfac/dto/OrderStatusDTO.java index ccc3d3129..121562701 100644 --- a/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/comfac/dto/OrderStatusDTO.java +++ b/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/comfac/dto/OrderStatusDTO.java @@ -104,11 +104,8 @@ public class OrderStatusDTO implements Serializable { if(StringUtil.isBlank(status)){ return false; } - if(StringUtil.isBlank(distributionContactId)){ - return false; - } - return true; - } + return !StringUtil.isBlank(distributionContactId); + } } diff --git a/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/dto/MtReceiveContentDTO.java b/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/dto/MtReceiveContentDTO.java index 4a324c686..5d308b680 100644 --- a/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/dto/MtReceiveContentDTO.java +++ b/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/dto/MtReceiveContentDTO.java @@ -24,4 +24,7 @@ public class MtReceiveContentDTO { @JsonProperty("发货单编号") private String invoiceOrderCode;//发货单编号 + @JsonProperty("运单号") + private String waybillNumber;//运单号 + } diff --git a/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/entity/MtFactoryOrderMain.java b/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/entity/MtFactoryOrderMain.java index db91893e1..912c16b92 100644 --- a/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/entity/MtFactoryOrderMain.java +++ b/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/entity/MtFactoryOrderMain.java @@ -14,6 +14,12 @@ import org.springblade.core.mp.base.BaseEntity; @EqualsAndHashCode(callSuper = true) public class MtFactoryOrderMain extends BaseEntity { + @ApiModelProperty(value = "供应基地编号") + private String siteCode; + + @ApiModelProperty(value = "供应基地") + private String siteName; + //@JsonProperty("发货单编号") @ApiModelProperty(value = "发货单编号") private String invoiceOrderCode; diff --git a/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/entity/MtPushData.java b/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/entity/MtPushData.java index 71e746cfc..0ab56159c 100644 --- a/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/entity/MtPushData.java +++ b/blade-service-api/logpm-factory-api/src/main/java/com/logpm/factory/mt/entity/MtPushData.java @@ -65,6 +65,11 @@ public class MtPushData extends BaseEntity { */ @ApiModelProperty(name = "推送状态", notes = " 1 已推送 0 未推送 默认未推送") private Integer pushStatus; + /** + * 推送类型 + */ + @ApiModelProperty(name = "推送类型", notes = "1 签收扫描 2 文员复核") + private Integer pushType; /** 推送时间 */ @ApiModelProperty(name = "推送时间", notes = "") private Date pushTime ; diff --git a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/enums/BrandEnums.java b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/enums/BrandEnums.java index e15b14363..bb50afe4a 100644 --- a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/enums/BrandEnums.java +++ b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/enums/BrandEnums.java @@ -17,15 +17,17 @@ public enum BrandEnums implements Serializable { ZB(1, "志邦"), SNM(2, "诗尼曼"), PAN(3, "皮阿诺"), - MTMM(4, "梦天木门"), + MTMM(4, "梦天"), OP(5, "欧派"), SFY(6, "索菲亚"), JP(7, "金牌"), OLO(8, "我乐"), - MHJ(9, "曼好家"); + MHJ(9, "曼好家"), + LINSY(10, "林氏家居"), + ; - private Integer code; - private String value; + private final Integer code; + private final String value; BrandEnums(Integer code, String value) { this.code = code; diff --git a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/enums/SaxStatusEnums.java b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/enums/SaxStatusEnums.java new file mode 100644 index 000000000..2fa3f1cc2 --- /dev/null +++ b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/enums/SaxStatusEnums.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.enums; + +import org.springblade.common.model.IDict; + +/** + * 日志解析状态 + * + * @author zhaoqiaobo + * @create 2024-04-28 + */ +public enum SaxStatusEnums implements IDict { + + NOMAL(0, "未解析"), + FAIL(1, "解析失败"), + SUCCESS(2, "解析成功"), + ; + + SaxStatusEnums(Integer code, String text) { + init(code, text); + } + +} diff --git a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/enums/SignForStatusEnums.java b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/enums/SignForStatusEnums.java index 209e6196c..b4142c4b2 100644 --- a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/enums/SignForStatusEnums.java +++ b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/enums/SignForStatusEnums.java @@ -17,8 +17,8 @@ public enum SignForStatusEnums implements Serializable { SIGN_FOR_ALL(1, "全部签收"), SIGN_FOR_SECTION(2, "部分签收"); - private Integer code; - private String value; + private final Integer code; + private final String value; SignForStatusEnums(Integer code, String value) { this.code = code; diff --git a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/util/FactoryDataMessageSender.java b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/util/FactoryDataMessageSender.java index ddfbd69e4..843f91dd1 100644 --- a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/util/FactoryDataMessageSender.java +++ b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/util/FactoryDataMessageSender.java @@ -1,11 +1,14 @@ package com.logpm.factorydata.util; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.logpm.factorydata.feign.IFactoryDataClient; import com.logpm.factorydata.vo.NodePushMsg; import com.logpm.factorydata.vo.SendMsg; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.extern.slf4j.Slf4j; import org.springblade.common.constant.factorydata.FactoryDataConstants; import org.springblade.common.utils.HutoolConfigUtil; import org.springframework.stereotype.Component; @@ -17,6 +20,7 @@ import org.springframework.stereotype.Component; @Component @Builder @AllArgsConstructor +@Slf4j public class FactoryDataMessageSender { private final IFactoryDataClient factoryDataClient; @@ -27,9 +31,17 @@ public class FactoryDataMessageSender { * @param data */ public void sendNodeDataByBrand(NodePushMsg data) { - String routingKeyByName = FactoryDataUtil.findRoutingKeyByName(data.getBrand()); - SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH).routingKey(routingKeyByName).message(JSONUtil.toJsonStr(data, HutoolConfigUtil.jsonConfigByDataTimeFormat())).build(); - factoryDataClient.sendMessage(build); + try{ + String routingKeyByName = FactoryDataUtil.findRoutingKeyByName(data.getBrand()); + if(StrUtil.isEmpty(routingKeyByName)){ + return ; + } + SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH).routingKey(routingKeyByName).message(JSONUtil.toJsonStr(data, HutoolConfigUtil.jsonConfigByDataTimeFormat())).build(); + factoryDataClient.sendMessage(build); + }catch (Exception e){ + log.error("sendNodeDataByBrand >>>>" ,e); + } + } } diff --git a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/util/FactoryDataUtil.java b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/util/FactoryDataUtil.java index da57fe852..6b3f206e9 100644 --- a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/util/FactoryDataUtil.java +++ b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/util/FactoryDataUtil.java @@ -16,11 +16,16 @@ import java.util.concurrent.ConcurrentHashMap; public class FactoryDataUtil { static Map factorys = new ConcurrentHashMap(); - private FactoryDataUtil(){ + + private FactoryDataUtil() { } + static { factorys.put(BrandEnums.ZB.getValue(), FactoryDataConstants.Mq.RoutingKeys.ZBOM_NODE_DATA_PUSH); + factorys.put(BrandEnums.LINSY.getValue(), FactoryDataConstants.Mq.RoutingKeys.LINSY_NODE_DATA_PUSH); + factorys.put(BrandEnums.OLO.getValue(), FactoryDataConstants.Mq.RoutingKeys.OLO_NODE_DATA_PUSH); + factorys.put(BrandEnums.SFY.getValue(), FactoryDataConstants.Mq.RoutingKeys.SFY_NODE_DATA_PUSH); } @@ -31,7 +36,7 @@ public class FactoryDataUtil { * @return 指定路由key */ public static String findRoutingKeyByName(BrandEnums brand) { - if (ObjectUtil.hasNull(brand, factorys.get(brand.getValue()))) { + if (ObjectUtil.isEmpty(brand) || ObjectUtil.isEmpty(factorys.get(brand.getValue()))) { // TODO 业务调用不规范,特殊处理 return null; } diff --git a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/NodePushMsg.java b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/NodePushMsg.java index 5eee16854..f2f6ed2e2 100644 --- a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/NodePushMsg.java +++ b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/NodePushMsg.java @@ -55,6 +55,11 @@ public class NodePushMsg implements Serializable { */ private SignForStatusEnums signForStatusEnums; + /** + * 主单数据 + */ + private Object main; + /** * 内容 */ diff --git a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/PushData.java b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/PushData.java new file mode 100644 index 000000000..688462d48 --- /dev/null +++ b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/PushData.java @@ -0,0 +1,39 @@ +package com.logpm.factorydata.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 提送数据 + * + * @author zhaoqiaobo + * @create 2024-03-18 0:45 + */ +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PushData implements Serializable { + + /** + * 包件码 + */ + private String packageCode; + /** + * 订单号 + */ + private String orderCode; + /** + * 运单号 + */ + private String waybillNumber; + /** + * 当前仓库名称 + */ + private String warehouseName; + +} diff --git a/blade-service-api/logpm-factory-data-base-api/src/main/java/com/logpm/factorydata/base/vo/FactoryWarehouseBindVO.java b/blade-service-api/logpm-factory-data-base-api/src/main/java/com/logpm/factorydata/base/vo/FactoryWarehouseBindVO.java index a9262c920..e7c35ed1e 100644 --- a/blade-service-api/logpm-factory-data-base-api/src/main/java/com/logpm/factorydata/base/vo/FactoryWarehouseBindVO.java +++ b/blade-service-api/logpm-factory-data-base-api/src/main/java/com/logpm/factorydata/base/vo/FactoryWarehouseBindVO.java @@ -21,6 +21,14 @@ public class FactoryWarehouseBindVO implements Serializable { * 仓库名称 */ private String warehouseName; + /** + * 老系统仓库id + */ + private Long oldWarehouseId; + /** + * 老系统仓库名称 + */ + private String oldWarehouseName; /** * 租户id */ diff --git a/blade-service-api/logpm-factory-data-zbom-api/pom.xml b/blade-service-api/logpm-factory-data-zbom-api/pom.xml new file mode 100644 index 000000000..80bc8d10a --- /dev/null +++ b/blade-service-api/logpm-factory-data-zbom-api/pom.xml @@ -0,0 +1,16 @@ + +blade-service-apiorg.springblade3.2.0.RELEASE + 4.0.0 + + com.logpm + logpm-factory-data-zbom-api + ${bladex.project.version} + jar + + 8 + 8 + + + diff --git a/blade-service-api/logpm-factory-data-zbom-api/src/main/java/com/logpm/factorydata/zbom/feign/IFactoryDataZbomClient.java b/blade-service-api/logpm-factory-data-zbom-api/src/main/java/com/logpm/factorydata/zbom/feign/IFactoryDataZbomClient.java new file mode 100644 index 000000000..cfcfb0d66 --- /dev/null +++ b/blade-service-api/logpm-factory-data-zbom-api/src/main/java/com/logpm/factorydata/zbom/feign/IFactoryDataZbomClient.java @@ -0,0 +1,30 @@ +package com.logpm.factorydata.zbom.feign; + +import org.springblade.common.constant.ModuleNameConstant; +import org.springblade.core.tool.api.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * @author zhaoqiaobo + * @create 2024-03-16 15:04 + */ +@FeignClient(value = ModuleNameConstant.LOGPM_FACTORY_DATA_ZBOM_NAME) +public interface IFactoryDataZbomClient { + + String API_PREFIX = "/client/factoryDataZbom"; + String ORDER = API_PREFIX + "/order"; + + + /** + * 保存志邦的订单数据 + * + * @param data + * @return org.springblade.core.tool.api.R + * @author zqb 2024/5/25 + **/ + @PostMapping(ORDER) + R order(@RequestBody String data); + +} diff --git a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataContactDTO.java b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataContactDTO.java index 88d03b7ef..05af57c97 100644 --- a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataContactDTO.java +++ b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataContactDTO.java @@ -28,6 +28,20 @@ public class SignPushDataContactDTO { * 配送id */ private Long distributionId; + /** + * 签收人ID + */ + private Long signUserId; + + /** + * 签收人名称 + */ + private String signUserName; + + /** + * 签收人名称 + */ + private String signUserPhone; /** * 计划装车数 */ diff --git a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataDTO.java b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataDTO.java index 41c5180af..2f41008d2 100644 --- a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataDTO.java +++ b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataDTO.java @@ -106,7 +106,7 @@ public class SignPushDataDTO { private Date createTime; /** - * 操作人 + * 操作人ID */ private Long administratorsId; @@ -115,11 +115,26 @@ public class SignPushDataDTO { */ private String administratorsName; + /** + * 操作人电话 + */ + private String administratorsPhone; + /** * 操作人 */ private String kind; + /** + * 操作人 + */ + private String deliveryType; + + /** + * 复核时间 + */ + private Date reviewTime; + /** * 签收客户集合 */ diff --git a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataUnitDTO.java b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataUnitDTO.java index b1e8db802..a08f8d95c 100644 --- a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataUnitDTO.java +++ b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/dto/SignPushDataUnitDTO.java @@ -64,6 +64,10 @@ public class SignPushDataUnitDTO { * 签收时间 */ private Date signTime; + /** + * + */ + private Date operateTime; /** * 0未下架;1已下架 @@ -99,9 +103,19 @@ public class SignPushDataUnitDTO { private int signNum; /** - * 创建人 + * 扫描人ID + */ + private long administratorsId; + + /** + * 扫描人电话 + */ + private String administratorsPhone; + + /** + * 扫描人名称 */ - private long administrators_id; + private String administratorsName; /** * 标识状态:1=标记[无用],2=pda回库,3=pc回库,4=pda签收, 5=pc签收 diff --git a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IAdvanceClient.java b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IAdvanceClient.java index 30caad6c9..701af6358 100644 --- a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IAdvanceClient.java +++ b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IAdvanceClient.java @@ -100,4 +100,7 @@ public interface IAdvanceClient { @PostMapping(API_PREFIX + "/findListByAdvanceIds") List findListByAdvanceIds(@RequestBody List advanceIds); + + @PostMapping(API_PREFIX + "/findListByWaybillNo") + List findListByWaybillNo(@RequestParam String waybillNo); } diff --git a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IAdvanceClientFallbackFactory.java b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IAdvanceClientFallbackFactory.java index 25042612e..c9c0c05c8 100644 --- a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IAdvanceClientFallbackFactory.java +++ b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IAdvanceClientFallbackFactory.java @@ -60,6 +60,11 @@ public class IAdvanceClientFallbackFactory implements FallbackFactory findListByAdvanceIds(List advanceIds) { return null; } + + @Override + public List findListByWaybillNo(String waybillNo) { + return null; + } }; } } diff --git a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IWayBillClient.java b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IWayBillClient.java index e204fba84..8cba15c38 100644 --- a/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IWayBillClient.java +++ b/blade-service-api/logpm-old-project-api/src/main/java/com/logpm/oldproject/feign/IWayBillClient.java @@ -51,4 +51,7 @@ public interface IWayBillClient { @GetMapping(API_PREFIX + "/getByWayBillByOrderCode") WayBillEntity getByWayBillByOrderCode(@RequestParam String orderCode); + + @GetMapping(API_PREFIX + "/findAreaCodeByArriveSiteId") + String findAreaCodeByArriveSiteId(@RequestParam Integer arriveSiteId); } diff --git a/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/dto/SyncInventoryDTO.java b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/dto/SyncInventoryDTO.java index e44b80013..b8b7ca250 100644 --- a/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/dto/SyncInventoryDTO.java +++ b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/dto/SyncInventoryDTO.java @@ -15,5 +15,6 @@ public class SyncInventoryDTO implements Serializable { private Long warehouseId; private String orderCodes; + private Integer syncType; } diff --git a/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/PackageAllocationInfoVO.java b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/PackageAllocationInfoVO.java new file mode 100644 index 000000000..a770570ec --- /dev/null +++ b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/PackageAllocationInfoVO.java @@ -0,0 +1,16 @@ +package com.logpm.patch.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class PackageAllocationInfoVO implements Serializable { + + private String orderPackageCode; + private String orderPackageStatus; + private String allocationName; + private Integer conditions; + private Long warehouseId; + +} diff --git a/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/PackageTrayInfoVO.java b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/PackageTrayInfoVO.java new file mode 100644 index 000000000..2cb7231e3 --- /dev/null +++ b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/PackageTrayInfoVO.java @@ -0,0 +1,19 @@ +package com.logpm.patch.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class PackageTrayInfoVO implements Serializable { + + private Long packageId; + private String orderPackageCode; + private Long orderId; + private String orderCode; + private String orderPackageStatus; + private String trayName; + private Integer conditions; + private Long warehouseId; + +} diff --git a/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/StockAllocationInfoVO.java b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/StockAllocationInfoVO.java new file mode 100644 index 000000000..43fd3a2ed --- /dev/null +++ b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/StockAllocationInfoVO.java @@ -0,0 +1,15 @@ +package com.logpm.patch.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class StockAllocationInfoVO implements Serializable { + + private Long stockListId; + private Long warehouseId; + private String allocationName; + + +} diff --git a/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/StockTrayInfoVO.java b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/StockTrayInfoVO.java new file mode 100644 index 000000000..6041f86a2 --- /dev/null +++ b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/StockTrayInfoVO.java @@ -0,0 +1,14 @@ +package com.logpm.patch.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class StockTrayInfoVO implements Serializable { + + private Long stockListId; + private Long warehouseId; + private String trayName; + +} diff --git a/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/ZeroAllocationInfoVO.java b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/ZeroAllocationInfoVO.java new file mode 100644 index 000000000..664349272 --- /dev/null +++ b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/ZeroAllocationInfoVO.java @@ -0,0 +1,14 @@ +package com.logpm.patch.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ZeroAllocationInfoVO implements Serializable { + + private String orderCode; + private Long warehouseId; + private String allocationName; + +} diff --git a/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/ZeroTrayInfoVO.java b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/ZeroTrayInfoVO.java new file mode 100644 index 000000000..82846b150 --- /dev/null +++ b/blade-service-api/logpm-patch-api/src/main/java/com/logpm/patch/vo/ZeroTrayInfoVO.java @@ -0,0 +1,14 @@ +package com.logpm.patch.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ZeroTrayInfoVO implements Serializable { + + private String orderCode; + private Long warehouseId; + private String trayName; + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/ChangesRecordDTO.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/ChangesRecordDTO.java new file mode 100644 index 000000000..566859eb3 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/ChangesRecordDTO.java @@ -0,0 +1,45 @@ +package com.logpm.statistics.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +@Data +public class ChangesRecordDTO implements Serializable { + + private Long orderInfoId;//订单id + + private String orderCode;//订单号 + + private BigDecimal pickupFee = BigDecimal.ZERO;//提货费 + + private BigDecimal freightFee = BigDecimal.ZERO;//干线费 + + private BigDecimal warehouseFee = BigDecimal.ZERO;//仓储费 + private BigDecimal warehouseManageFee = BigDecimal.ZERO;//仓储管理费 + private BigDecimal warehouseSortingFee = BigDecimal.ZERO;//仓储分拣费 + private BigDecimal warehouseOperatingFee = BigDecimal.ZERO;//仓储操作费 + + private BigDecimal deliveryFee = BigDecimal.ZERO;//配送费 + private BigDecimal deliveryLoadingFee = BigDecimal.ZERO;//配送装卸费 + private BigDecimal deliverySortingFee = BigDecimal.ZERO;//配送分拣费 + private BigDecimal deliveryUpfloorFee = BigDecimal.ZERO;//配送上楼费 + private BigDecimal deliveryMoveFee = BigDecimal.ZERO;//配送平移费 + + private BigDecimal installFee = BigDecimal.ZERO;//安装费 + private BigDecimal quotationFee = BigDecimal.ZERO;//保价费 + private BigDecimal claimingValue = BigDecimal.ZERO;//申明价值 + private BigDecimal otherFee = BigDecimal.ZERO;//其他费用 + private BigDecimal returnFee = BigDecimal.ZERO;//回扣 + private BigDecimal thirdOprationFee = BigDecimal.ZERO;//三方操作费 + + private String changesTimeStr; + + private Long statisticsWarehouseId; + private String statisticsWarehouseName; + + private List changesPhotoUrls; + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/MerchantStatisticsDTO.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/MerchantStatisticsDTO.java new file mode 100644 index 000000000..b9f8ac49b --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/MerchantStatisticsDTO.java @@ -0,0 +1,28 @@ +package com.logpm.statistics.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class MerchantStatisticsDTO implements Serializable { + + private Integer pageSize; + private Integer pageNum; + + private Long waybillInfoId; + + private Long orderInfoId; + + private Integer listType; + + private String consignee; + + private Integer confirmStatisticsOrder;//对账状态 0 1 + + private List orderInfoIds; + + private Long balanceOrderInfoId; + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/StatisticsBalanceAbnormalDTO.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/StatisticsBalanceAbnormalDTO.java new file mode 100644 index 000000000..3e5848870 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/StatisticsBalanceAbnormalDTO.java @@ -0,0 +1,14 @@ +package com.logpm.statistics.dto; + +import com.logpm.statistics.entity.StatisticsBalanceAbnormalEntity; +import com.logpm.statistics.entity.StatisticsBalanceAbnormalPhotoEntity; +import lombok.Data; + +import java.util.List; + +@Data +public class StatisticsBalanceAbnormalDTO extends StatisticsBalanceAbnormalEntity { + + private List abnormalPhotoEntityList; + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/StatisticsBalanceRecordDTO.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/StatisticsBalanceRecordDTO.java new file mode 100644 index 000000000..332887812 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/dto/StatisticsBalanceRecordDTO.java @@ -0,0 +1,15 @@ +package com.logpm.statistics.dto; + +import com.logpm.statistics.entity.StatisticsBalanceRecordEntity; +import com.logpm.statistics.entity.StatisticsBalanceRecordPhotoEntity; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class StatisticsBalanceRecordDTO extends StatisticsBalanceRecordEntity { + + private List recordPhotoEntityList = new ArrayList<>(); + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceAbnormalEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceAbnormalEntity.java new file mode 100644 index 000000000..d96cded9e --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceAbnormalEntity.java @@ -0,0 +1,53 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.math.BigDecimal; + +@Data +@TableName("logpm_statistics_balance_abnormal") +@ApiModel(value = "StatisticsBalanceAbnormal对象", description = "结算异常记录表") +@EqualsAndHashCode(callSuper = true) +public class StatisticsBalanceAbnormalEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + private Long balanceOrderInfoId;//结算单id + + private Integer abnormalType; //异常类型1结算单 2运单 3订单 + private String abnormalValue;//异常值 + private BigDecimal abnormalFee;//异常金额 + private String abnormalRemark;//异常备注 + private String abnormalUserName;//异常操作人 + + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceAbnormalPhotoEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceAbnormalPhotoEntity.java new file mode 100644 index 000000000..46632d725 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceAbnormalPhotoEntity.java @@ -0,0 +1,46 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +@Data +@TableName("logpm_statistics_balance_abnormal_photo") +@ApiModel(value = "StatisticsBalanceAbnormalPhoto对象", description = "结算异常记录图片表") +@EqualsAndHashCode(callSuper = true) +public class StatisticsBalanceAbnormalPhotoEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + + private Long abnormalId; //异常记录id + private String url;//图片地址 + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceOrderInfoEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceOrderInfoEntity.java new file mode 100644 index 000000000..eb0a05e86 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceOrderInfoEntity.java @@ -0,0 +1,128 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@TableName("logpm_statistics_balance_order_info") +@ApiModel(value = "StatisticsBalanceOrderInfo对象", description = "结算单表") +@EqualsAndHashCode(callSuper = true) +public class StatisticsBalanceOrderInfoEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + private String balanceOrderNo;//结算单号 + + private String brand;//品牌 + + private String waybillNo;//运单号 + + private String orderCode;//订单号 + + private String typeService;//服务类型 + + private String productGoods;//货物品类 + + private String productTypeNum;//品类数 + + private Integer totalCount;//总数量 + + private BigDecimal totalWeight;//总重量 + private BigDecimal totalVolume;//总体积 + + private String shipper;//发货单位 + private String shipperPerson;//发货人 + private String shipperMobile;//发货电话 + private String shipperAddress;//发货地址 + private String consignee;//收货单位 + private String consigneePerson;//收货人 + private String consigneeMobile;//收货电话 + private String consigneeAddress;//收货地址 + private String departure;//发站 + private String destination;//到站 + private String departureWarehouseName;//发站仓 + private String destinationWarehouseName;//目的仓 + private String payType;//支付类型 + private String payWay;//支付方式 + + private Integer isAftersale;//是否有售后 + private BigDecimal aftersalesFee;//售后金额 + + private BigDecimal totalBalanceFee;//结算总金额 + + private BigDecimal totalFee; + private BigDecimal openFee; + + private BigDecimal pickupFee;//提货费 + private BigDecimal freightFee;//运费 + private BigDecimal warehouseServiceFee;//仓库服务费 + private BigDecimal warehouseFee;//仓储费 + private BigDecimal warehouseManageFee;//仓储管理费 + private BigDecimal warehouseSortingFee;//仓储分拣费 + private BigDecimal warehouseOperatingFee;//仓储操作费 + + private BigDecimal deliveryServiceFee;//配送服务费 + private BigDecimal deliveryFee;//配送费 + private BigDecimal deliveryLoadingFee;//配送装卸费 + private BigDecimal deliverySortingFee;//配送分拣费 + private BigDecimal deliveryUpfloorFee;//配送上楼费 + private BigDecimal deliveryMoveFee;//配送平移费 + private BigDecimal deliveryCrossingFee;//超区费 + + private BigDecimal installFee;//安装费 + private BigDecimal quotationFee;//保价费 + private BigDecimal claimingValue;//申明价值 + private BigDecimal otherFee;//其他费 + private BigDecimal returnFee;//回扣 + private BigDecimal thirdOprationFee;//三方操作费 + private BigDecimal xPay;//现付 + private BigDecimal dPay;//到付 + private BigDecimal hPay;//回付 + private BigDecimal yPay;//月结 + + private Integer balanceStatus;//0未结算 1部分结算 2已结算 + + private BigDecimal hasBalanceFee;//已结算金额 + private BigDecimal noBalanceFee;//未结算金额 + private Date balanceTime;//结算时间 + private String balanceUserName;//结算人 + private String balanceRemark;//结算备注 + + private Integer abnormalBalanceStatus;//是否有异常结算 + private BigDecimal abnormalBalanceFee;//异常金额 + private Date abnormalTime;//异常时间 + private String abnormalUserName;//异常确认人 + private String abnormalRemark;//异常备注 + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceRecordEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceRecordEntity.java new file mode 100644 index 000000000..7290b84e5 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceRecordEntity.java @@ -0,0 +1,51 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.math.BigDecimal; + +@Data +@TableName("logpm_statistics_balance_record") +@ApiModel(value = "StatisticsBalanceRecord对象", description = "结算记录表") +@EqualsAndHashCode(callSuper = true) +public class StatisticsBalanceRecordEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + private Long balanceOrderInfoId;//结算单id + + private BigDecimal balanceFee;//异常金额 + private String balanceRemark;//异常备注 + private String balanceUserName;//异常操作人 + + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceRecordPhotoEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceRecordPhotoEntity.java new file mode 100644 index 000000000..41e23eb95 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsBalanceRecordPhotoEntity.java @@ -0,0 +1,46 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +@Data +@TableName("logpm_statistics_balance_record_photo") +@ApiModel(value = "StatisticsBalanceRecordPhoto对象", description = "结算记录图片表") +@EqualsAndHashCode(callSuper = true) +public class StatisticsBalanceRecordPhotoEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + + private Long recordId; //异常记录id + private String url;//图片地址 + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsChangesPhotoEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsChangesPhotoEntity.java new file mode 100644 index 000000000..d0ce76255 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsChangesPhotoEntity.java @@ -0,0 +1,47 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +@Data +@TableName("logpm_statistics_changes_photo") +@ApiModel(value = "StatisticsChanges对象", description = "订单异动照片表") +@EqualsAndHashCode(callSuper = true) +public class StatisticsChangesPhotoEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + private Long changesRecordId; + private String url; + private String createUserName; + + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsChangesRecordEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsChangesRecordEntity.java new file mode 100644 index 000000000..5d64419bc --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsChangesRecordEntity.java @@ -0,0 +1,83 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@TableName("logpm_statistics_changes_record") +@ApiModel(value = "StatisticsChangesRecord对象", description = "订单异动记录") +@EqualsAndHashCode(callSuper = true) +public class StatisticsChangesRecordEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + private Long orderInfoId;//订单id + + private String orderCode;//订单号 + + private BigDecimal pickupFee;//提货费 + + private BigDecimal freightFee;//干线费 + + private BigDecimal warehouseFee;//仓储费 + private BigDecimal warehouseManageFee;//仓储管理费 + private BigDecimal warehouseSortingFee;//仓储分拣费 + private BigDecimal warehouseOperatingFee;//仓储操作费 + + private BigDecimal deliveryFee;//配送费 + private BigDecimal deliveryLoadingFee;//配送装卸费 + private BigDecimal deliverySortingFee;//配送分拣费 + private BigDecimal deliveryUpfloorFee;//配送上楼费 + private BigDecimal deliveryMoveFee;//配送平移费 + + private BigDecimal installFee;//安装费 + private BigDecimal quotationFee;//保价费 + private BigDecimal claimingValue;//申明价值 + private BigDecimal otherFee;//其他费用 + private BigDecimal returnFee;//回扣 + private BigDecimal thirdOprationFee;//三方操作费 + + private Date changesTime;//异动时间 + private String changesUserName;//异动人 + + private Long statisticsWarehouseId; + private String statisticsWarehouseName; + + private String remark; + + private String itemRecord; + + private BigDecimal totalFee; + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsDistributionPackageEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsDistributionPackageEntity.java new file mode 100644 index 000000000..bef4baa60 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsDistributionPackageEntity.java @@ -0,0 +1,145 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@TableName("logpm_statistics_distribution_package") +@ApiModel(value = "StatisticsDistributionPackage对象", description = "结算配送包件明细表") +@EqualsAndHashCode(callSuper = true) +public class StatisticsDistributionPackageEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + /** + * 仓库id + */ + @ApiModelProperty(value = "仓库id") + private Long warehouseId; + + /** + * 仓库名称 + */ + @ApiModelProperty(value = "仓库名称") + private String warehouseName; + + /** + * 运单id + */ + @ApiModelProperty(value = "运单id") + private Long waybillId; + + /** + * 运单号 + */ + @ApiModelProperty(value = "运单号") + private String waybillNo; + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + private String orderCode; + + /** + * 包件码 + */ + @ApiModelProperty(value = "包件码") + private String orderPackageCode; + + /** + * 品类名称 + */ + @ApiModelProperty(value = "品类名称") + private String productName; + + /** + * 品类名称 + */ + @ApiModelProperty(value = "品类Id") + private String productId; + + /** + * 配送车次号 + */ + @ApiModelProperty(value = "配送车次号") + private String trainNumber; + + /** + * 件数 + */ + @ApiModelProperty(value = "件数") + private Integer totalNum; + + /** + * 重量 + */ + @ApiModelProperty(value = "重量") + private BigDecimal totalWeight; + + @ApiModelProperty(value = "体积") + private BigDecimal totalVolume; + + private BigDecimal openPrice; + private BigDecimal totalPrice; + private BigDecimal deliveryServiceFee; + private BigDecimal deliveryFee; + private BigDecimal deliveryLoadingFee; + private BigDecimal deliverySortingFee; + private BigDecimal deliveryUpfloorFee; + private BigDecimal deliveryMoveFee; + private BigDecimal deliveryDistance; + private BigDecimal deliveryCrossingFee; + private Integer isAftersales; + private BigDecimal aftersalesPrice; + private Integer hasStatement; + private Long statementCreateTime; + private String statementCreateUser; + private Integer isZero; + private BigDecimal realDeliveryServiceFee; + private BigDecimal realDeliveryFee; + private BigDecimal realDeliveryLoadingFee; + private BigDecimal realDeliverySortingFee; + private BigDecimal realDeliveryUpfloorFee; + private BigDecimal realDeliveryMoveFee; + private BigDecimal realDeliveryDistance; + private BigDecimal realDeliveryCrossingFee; + private Integer goodsType; //1 订制品 2零担 3库存品 + private String typeService; //1 商配 2市配 3自提 4三方中转 + + private Long orderInfoId; + + private Integer isSign;//是否签收 0否 1是 + private Date signTime; //签收时间 +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsOrderInfoEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsOrderInfoEntity.java new file mode 100644 index 000000000..cbb0f054d --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsOrderInfoEntity.java @@ -0,0 +1,74 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@TableName("logpm_statistics_order_info") +@ApiModel(value = "StatisticsOrderInfo对象", description = "结算订单明细表") +@EqualsAndHashCode(callSuper = true) +public class StatisticsOrderInfoEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + /** + * 品牌id + */ + @ApiModelProperty(value = "品牌id") + private Long brandId; + + /** + * 收货单位id + */ + @ApiModelProperty(value = "收货单位id") + private Long consigneeId; + + + private String orderCode; + private Long waybillId; + private String waybillNo; + private String typeService; + private Integer signStatus;// 签收状态 0未签收 1部分签收 2已签收 + + private Integer confirmStatisticsOrder;//0未确认 1已确认 + private String confirmStatisticsUserName;//对账确认人 + private Date confirmStatisticsTime;//对账确认时间 + + private Long waybillInfoId;//运单维度id + private Long balanceOrderId;//结算单id + private String balanceOrderNo;//结算单号 + + private BigDecimal changesFee;//异动金额 + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsTrunklinePackageEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsTrunklinePackageEntity.java new file mode 100644 index 000000000..8bc83562d --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsTrunklinePackageEntity.java @@ -0,0 +1,145 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.math.BigDecimal; + +@Data +@TableName("logpm_statistics_trunkline_package") +@ApiModel(value = "StatisticsTrunklinePackage对象", description = "结算干线包件明细表") +@EqualsAndHashCode(callSuper = true) +public class StatisticsTrunklinePackageEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + /** + * 仓库id + */ + @ApiModelProperty(value = "仓库id") + private Long warehouseId; + + /** + * 仓库名称 + */ + @ApiModelProperty(value = "仓库名称") + private String warehouseName; + + /** + * 运单id + */ + @ApiModelProperty(value = "运单id") + private Long waybillId; + + /** + * 运单号 + */ + @ApiModelProperty(value = "运单号") + private String waybillNo; + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + private String orderCode; + + /** + * 包件码 + */ + @ApiModelProperty(value = "包件码") + private String orderPackageCode; + + /** + * 品类名称 + */ + @ApiModelProperty(value = "品类名称") + private String productName; + + /** + * 品类名称 + */ + @ApiModelProperty(value = "品类id") + private String productId; + + /** + * 件数 + */ + @ApiModelProperty(value = "件数") + private Integer totalNum; + + /** + * 重量 + */ + @ApiModelProperty(value = "重量") + private BigDecimal totalWeight; + + @ApiModelProperty(value = "体积") + private BigDecimal totalVolume; + + private BigDecimal openPrice; + private BigDecimal totalPrice; + private BigDecimal pickupFee; + private BigDecimal freightFee; + private BigDecimal installFee; + private BigDecimal quotationFee; + private BigDecimal claimingValue; + private BigDecimal otherFee; + private BigDecimal returnFee; + private BigDecimal thirdOprationFee; + private BigDecimal xPay; + private BigDecimal dPay; + private BigDecimal hPay; + private BigDecimal yPay; + private Integer isAftersales; + private BigDecimal aftersalesPrice; + private Integer hasStatement; + private Long statementCreateTime; + private String statementCreateUser; + private Integer isZero; + private BigDecimal realPickupFee; + private BigDecimal realFreightFee; + private BigDecimal realInstallFee; + private BigDecimal realQuotationFee; + private BigDecimal realClaimingValue; + private BigDecimal realOtherFee; + private BigDecimal realReturnFee; + private BigDecimal realThirdOprationFee; + private BigDecimal realXPay; + private BigDecimal realDPay; + private BigDecimal realHPay; + private BigDecimal realYPay; + + private Integer goodsType; //1 订制品 2零担 3库存品 + private String typeService; //1 商配 2市配 3自提 4三方中转 + + private Long orderInfoId; + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsWarehousePackageEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsWarehousePackageEntity.java new file mode 100644 index 000000000..a07e655a2 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsWarehousePackageEntity.java @@ -0,0 +1,140 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@TableName("logpm_statistics_warehouse_package") +@ApiModel(value = "StatisticsWarehousePackage对象", description = "结算仓库包件明细表") +@EqualsAndHashCode(callSuper = true) +public class StatisticsWarehousePackageEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + /** + * 仓库id + */ + @ApiModelProperty(value = "仓库id") + private Long warehouseId; + + /** + * 仓库名称 + */ + @ApiModelProperty(value = "仓库名称") + private String warehouseName; + + /** + * 运单id + */ + @ApiModelProperty(value = "运单id") + private Long waybillId; + + /** + * 运单号 + */ + @ApiModelProperty(value = "运单号") + private String waybillNo; + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + private String orderCode; + + /** + * 包件码 + */ + @ApiModelProperty(value = "包件码") + private String orderPackageCode; + + /** + * 品类名称 + */ + @ApiModelProperty(value = "品类名称") + private String productName; + + /** + * 品类名称 + */ + @ApiModelProperty(value = "品类id") + private String productId; + + /** + * 件数 + */ + @ApiModelProperty(value = "件数") + private Integer totalNum; + + /** + * 重量 + */ + @ApiModelProperty(value = "重量") + private BigDecimal totalWeight; + + @ApiModelProperty(value = "体积") + private BigDecimal totalVolume; + + private BigDecimal openPrice; + private BigDecimal totalPrice; + private Date incomingTime; + @ApiModelProperty(value = "签收时间") + private Date signTime; + @ApiModelProperty(value = "末端仓入库时间") + private Date warehouseEntryTimeEnd; + private Date outingTime; + private String warehouseFeeInterval; + private BigDecimal warehouseServiceFee; + private BigDecimal warehouseFee; + private BigDecimal warehouseManageFee; + private BigDecimal warehouseSortingFee; + private BigDecimal warehouseOperatingFee; + private Integer isAftersales; + private BigDecimal aftersalesPrice; + private Integer hasStatement; + private Long statementCreateTime; + private String statementCreateUser; + private Integer isZero; + private String realWarehouseFeeInterval; + private BigDecimal realWarehouseServiceFee; + private BigDecimal realWarehouseFee; + private BigDecimal realWarehouseManageFee; + private BigDecimal realWarehouseSortingFee; + private BigDecimal realWarehouseOperatingFee; + + private Integer goodsType; //1 订制品 2零担 3库存品 + private String typeService; //1 商配 2市配 3自提 4三方中转 + + private Long orderInfoId; + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsWaybillInfoEntity.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsWaybillInfoEntity.java new file mode 100644 index 000000000..40a2e0246 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/entity/StatisticsWaybillInfoEntity.java @@ -0,0 +1,48 @@ +package com.logpm.statistics.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +@Data +@TableName("logpm_statistics_waybill_info") +@ApiModel(value = "StatisticsWaybillInfo对象", description = "结算运单明细表") +@EqualsAndHashCode(callSuper = true) +public class StatisticsWaybillInfoEntity extends TenantEntity { + + /** + * 预留1 + */ + @ApiModelProperty(value = "预留1") + private String reserve1; + /** + * 预留2 + */ + @ApiModelProperty(value = "预留2") + private String reserve2; + /** + * 预留3 + */ + @ApiModelProperty(value = "预留3") + private String reserve3; + /** + * 预留4 + */ + @ApiModelProperty(value = "预留4") + private String reserve4; + /** + * 预留5 + */ + @ApiModelProperty(value = "预留5") + private String reserve5; + + private Long waybillId; + private String waybillNo; + private String typeService; + + private Integer confirmStatisticsOrder;//0未确认 1部分确认 2已确认 + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsBalanceAbnormalVO.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsBalanceAbnormalVO.java new file mode 100644 index 000000000..efed63751 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsBalanceAbnormalVO.java @@ -0,0 +1,13 @@ +package com.logpm.statistics.vo; + +import com.logpm.statistics.entity.StatisticsBalanceAbnormalEntity; +import com.logpm.statistics.entity.StatisticsBalanceAbnormalPhotoEntity; +import lombok.Data; + +import java.util.List; + +@Data +public class StatisticsBalanceAbnormalVO extends StatisticsBalanceAbnormalEntity { + + private List abnormalPhotoEntityList; +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsBalanceOrderInfoVO.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsBalanceOrderInfoVO.java new file mode 100644 index 000000000..64b762662 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsBalanceOrderInfoVO.java @@ -0,0 +1,8 @@ +package com.logpm.statistics.vo; + +import com.logpm.statistics.entity.StatisticsBalanceOrderInfoEntity; +import lombok.Data; + +@Data +public class StatisticsBalanceOrderInfoVO extends StatisticsBalanceOrderInfoEntity { +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsBalanceRecordVO.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsBalanceRecordVO.java new file mode 100644 index 000000000..2eb877a28 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsBalanceRecordVO.java @@ -0,0 +1,14 @@ +package com.logpm.statistics.vo; + +import com.logpm.statistics.entity.StatisticsBalanceRecordEntity; +import com.logpm.statistics.entity.StatisticsBalanceRecordPhotoEntity; +import lombok.Data; + +import java.util.List; + +@Data +public class StatisticsBalanceRecordVO extends StatisticsBalanceRecordEntity { + + private List recordPhotoEntityList; + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsChangesRecordVO.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsChangesRecordVO.java new file mode 100644 index 000000000..db9bd8bb2 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsChangesRecordVO.java @@ -0,0 +1,15 @@ +package com.logpm.statistics.vo; + +import com.logpm.statistics.entity.StatisticsChangesPhotoEntity; +import com.logpm.statistics.entity.StatisticsChangesRecordEntity; +import lombok.Data; + +import java.util.List; + +@Data +public class StatisticsChangesRecordVO extends StatisticsChangesRecordEntity { + + private List changesPhotoEntityList; + + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsOrderInfoVO.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsOrderInfoVO.java new file mode 100644 index 000000000..c8fdaa455 --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsOrderInfoVO.java @@ -0,0 +1,138 @@ +package com.logpm.statistics.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class StatisticsOrderInfoVO implements Serializable { + + private Long orderInfoId; + private String brand;//品牌 + private String waybillNo;//运单号 + private String orderNo;//订单号 + private String typeService;//商家服务类型 + private String shipper;//发货单位 + private String shipperPerson;//发货人 + private String shipperMobile;//发货电话 + private String shipperAddress;//发货地址 + private String consignee;//收货单位 + private String consigneePerson;//收货人 + private String consigneeMobile;//收货电话 + private String consigneeAddress;//收货地址 + private String waybillStatus;//运单状态 + private Integer signStatus;//订单签收状态 + private Integer isCheck;//运单是否审核 + private Date openTime;//开单时间 + private String goodsName;//物料品类 + private String departure;//发站 + private String destination;//到站 + private String departureWarehouseName;//发站仓 + private String destinationWarehouseName;//目的仓 + private String deliveryMethod;//配送方式 + private String customerTrain;//客户车次号 + private String receiptStatus;//回单状态 + private String waybillRemark;//运单备注 + private String statisticsFang; + private String payType;//支付类型 + private String payWay;//支付方式 + private String storeBusiness; + private Integer confirmStatisticsOrder;//0未确认 1已确认 + private String confirmStatisticsUserName;//对账确认人 + private Date confirmStatisticsTime;//对账确认时间 + + private Integer isEdit; + private String goodsTypeNum; + private Integer productTypeNum; + + + private Integer totalcount;//订单数量 + private BigDecimal totalWeight;//订单重量 + private BigDecimal totalVolume;//订单体积 + + + + private BigDecimal totalFee;//总费用 + private BigDecimal openFee;//开单费 + //干线 + private BigDecimal pickupFee;//开单提货费 + private BigDecimal realPickupFee;//实际提货费 + private BigDecimal freightFee;//开单运费 + private BigDecimal realFreightFee;//实际运费 + private BigDecimal installFee;//开单安装费 + private BigDecimal realInstallFee;//实际安装费 + private BigDecimal quotationFee;//保价费 + private BigDecimal realQuotationFee;//实际保价费 + private BigDecimal claimingValue;//开单申明价值 + private BigDecimal realClaimingValue;//实际申明价值 + private BigDecimal otherFee;//开单其他费 + private BigDecimal realOtherFee;//实际其他费 + private BigDecimal returnFee;//开单回扣 + private BigDecimal realReturnFee;//实际回扣 + private BigDecimal thirdOprationFee;//开单三方操作费 + private BigDecimal realThirdOprationFee;//实际三方操作费 + private BigDecimal xPay;//开单现付 + private BigDecimal realXPay;//实际现付 + private BigDecimal dPay;//开单到付 + private BigDecimal realDPay;//实际到付 + private BigDecimal hPay;//开单回付 + private BigDecimal realHPay;//实际回付 + private BigDecimal yPay;//开单月结 + private BigDecimal realYPay;//实际月结 + + + private Date incomingTime;//入库时间 + private Date outingTime;//出库时间 + private String warehouseFeeInterval; + private BigDecimal warehouseServiceFee;//开单仓库服务费 + private BigDecimal realWarehouseServiceFee;//实际仓库服务费 + private BigDecimal warehouseFee;//开单仓储费 + private BigDecimal realWarehouseFee;//实际仓储费 + private BigDecimal warehouseManageFee;//开单仓储管理费 + private BigDecimal realWarehouseManageFee;//实际仓储管理费 + private BigDecimal warehouseSortingFee;//开单仓储分拣费 + private BigDecimal realWarehouseSortingFee;//实际仓储分拣费 + private BigDecimal warehouseOperatingFee;//开单仓储操作费 + private BigDecimal realWarehouseOperatingFee;//实际仓储操作费 + //配送 + private BigDecimal deliveryServiceFee;//开单配送服务费 + private BigDecimal realDeliveryServiceFee;//实际配送服务费 + private BigDecimal deliveryFee;//开单配送费 + private BigDecimal realDeliveryFee;//实际配送费 + private BigDecimal deliveryLoadingFee;//配送装卸费 + private BigDecimal realDeliveryLoadingFee;//实际配送装卸费 + private BigDecimal deliverySortingFee;//配送分拣费 + private BigDecimal realDeliverySortingFee;//实际配送分拣费 + private BigDecimal deliveryUpfloorFee;//开单配送上楼费 + private BigDecimal realDeliveryUpfloorFee;//实际配送上楼费 + private BigDecimal deliveryMoveFee;//开单配送平移费 + private BigDecimal realDeliveryMoveFee;//实际平移费 + private BigDecimal deliveryDistance;//开单配送公里数 + private BigDecimal realDeliveryDistance;//实际配送公里数 + private BigDecimal deliveryCrossingFee;//开单超区费 + private BigDecimal realDeliveryCrossingFee;//实际超区费 + + +// private String isAftersales; +// private BigDecimal aftersalesFee; + private BigDecimal totalStatementFee;//对账总金额 + private String statementStatus; + private BigDecimal hasStatementFee; + private String statementCreateUser; + private Integer isChanges;//是否异动0否 1是 + private BigDecimal changesFee;//异动金额 + private String changesItems;//异动条目 + private String changesRemark;//异动备注 + private Date changesTime;//最晚一条 + private Integer signNum; + private Date signTime;//最晚一条 + private String statisticsStatus;//结算状态 + private BigDecimal totalStatisticsFee;//结算总金额 + private BigDecimal hasStatisticsFee;//已结算金额 + private Integer isAbnormalStatistics;//是否异常结算 0否 1是 + private BigDecimal abnormalFee;//异常金额 + + +} diff --git a/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsWaybillInfoVO.java b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsWaybillInfoVO.java new file mode 100644 index 000000000..39b241fce --- /dev/null +++ b/blade-service-api/logpm-statisticsdata-api/src/main/java/com/logpm/statistics/vo/StatisticsWaybillInfoVO.java @@ -0,0 +1,126 @@ +package com.logpm.statistics.vo; + +import com.logpm.statistics.entity.StatisticsWaybillInfoEntity; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class StatisticsWaybillInfoVO extends StatisticsWaybillInfoEntity { + + private String brand; + private String waybillNo; + private String orderNo; + private String typeService; + private String shipper; + private String shipperPerson; + private String shipperMobile; + private String shipperAddress; + private String consignee; + private String consigneePerson; + private String consigneeMobile; + private String consigneeAddress; + private String departure; + private String destination; + private String departureWarehouseName; + private String destinationWarehouseName; + private String deliveryMethod; + private String customerTrain; + private String receiptStatus; + private String waybillRemark; + private String statisticsFang; + private String payType; + private String payWay; + private String storeBusiness; + private String waybillStatus; + private Integer isEdit; + private Integer isCheck; + private Date openTime; + private String goodsName; + private String goodsTypeNum; + private Integer productTypeNum; + private Integer totalcount; + private BigDecimal totalWeight; + private BigDecimal totalVolume; + + + + private BigDecimal totalFee; + private BigDecimal openFee; + private BigDecimal pickupFee; + private BigDecimal realPickupFee; + private BigDecimal freightFee; + private BigDecimal realFreightFee; + private BigDecimal installFee; + private BigDecimal realInstallFee; + private BigDecimal quotationFee; + private BigDecimal realQuotationFee; + private BigDecimal claimingValue; + private BigDecimal realClaimingValue; + private BigDecimal otherFee; + private BigDecimal realOtherFee; + private BigDecimal returnFee; + private BigDecimal realReturnFee; + private BigDecimal thirdOprationFee; + private BigDecimal realThirdOprationFee; + private BigDecimal xPay; + private BigDecimal realXPay; + private BigDecimal dPay; + private BigDecimal realDPay; + private BigDecimal hPay; + private BigDecimal realHPay; + private BigDecimal yPay; + private BigDecimal realYPay; + private Date incomingTime; + private Date outingTime; + private String warehouseFeeInterval; + private BigDecimal warehouseServiceFee; + private BigDecimal realWarehouseServiceFee; + private BigDecimal warehouseFee; + private BigDecimal realWarehouseFee; + private BigDecimal warehouseManageFee; + private BigDecimal realWarehouseManageFee; + private BigDecimal warehouseSortingFee; + private BigDecimal realWarehouseSortingFee; + private BigDecimal warehouseOperatingFee; + private BigDecimal realWarehouseOperatingFee; + private BigDecimal deliveryServiceFee; + private BigDecimal realDeliveryServiceFee; + private BigDecimal deliveryFee; + private BigDecimal realDeliveryFee; + private BigDecimal deliveryLoadingFee; + private BigDecimal realDeliveryLoadingFee; + private BigDecimal deliverySortingFee; + private BigDecimal realDeliverySortingFee; + private BigDecimal deliveryUpfloorFee; + private BigDecimal realDeliveryUpfloorFee; + private BigDecimal deliveryMoveFee; + private BigDecimal realDeliveryMoveFee; + private BigDecimal deliveryDistance; + private BigDecimal realDeliveryDistance; + private BigDecimal deliveryCrossingFee; + private BigDecimal realDeliveryCrossingFee; + + + private String isAftersales; + private BigDecimal aftersalesFee; + private BigDecimal totalStatementFee; + private String statementStatus; + private BigDecimal hasStatementFee; + private String statementCreateUser; + private Integer isChanges; + private BigDecimal changesFee; + private String changesItems; + private String changesRemark; + private String changesTime;//最晚一条 + private Integer signNum; + private Date signTime;//最晚一条 + private String statisticsStatus;//结算状态 + private BigDecimal totalStatisticsFee;//结算总金额 + private BigDecimal hasStatisticsFee;//已结算金额 + private Integer isAbnormalStatistics;//是否异常结算 0否 1是 + private BigDecimal abnormalFee;//异常金额 + + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/BillladingDTO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/BillladingDTO.java index a48af901c..1b16a83b2 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/BillladingDTO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/BillladingDTO.java @@ -53,4 +53,6 @@ public class BillladingDTO extends TrunklineBillladingEntity { private String remark;//备注 private String destinationWarehouseName;//目的仓 + private Long billladingId; + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/BillladingWaybillDTO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/BillladingWaybillDTO.java index 4848e303d..0e6d0a2a2 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/BillladingWaybillDTO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/BillladingWaybillDTO.java @@ -11,6 +11,6 @@ public class BillladingWaybillDTO implements Serializable { private Long billladingWaybillId; private Integer enterNum = 0;//输入件数 private BigDecimal enterWeight = BigDecimal.ZERO;//输入重量 - private BigDecimal enterVolume = BigDecimal.ZERO;;//输入体积 + private BigDecimal enterVolume = BigDecimal.ZERO;//输入体积 } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/CancelOrderParamVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/CancelOrderParamVO.java new file mode 100644 index 000000000..c8a05102e --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/CancelOrderParamVO.java @@ -0,0 +1,24 @@ +package com.logpm.trunkline.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + +/** + * 取消订单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "取消订单", description = "取消订单") +public class CancelOrderParamVO implements Serializable { + + @ApiModelProperty("订单编号") + @NotEmpty(message = "订单编号不能为空") + private String orderCode; + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/ImportOrderNoPackageExcelDTO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/ImportOrderNoPackageExcelDTO.java index d65165262..c4e7980a2 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/ImportOrderNoPackageExcelDTO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/ImportOrderNoPackageExcelDTO.java @@ -8,35 +8,57 @@ import java.io.Serializable; @Data public class ImportOrderNoPackageExcelDTO implements Serializable { - @ExcelProperty(value = "下单日期") - private String orderTime; - @ExcelProperty(value = "商场名称") - private String dealerName; + @ExcelProperty(value = "服务号") + private String serviceNum ; @ExcelProperty(value = "订单自编号") private String orderCode; + @ExcelProperty(value = "品牌") + private String brand ; + @ExcelProperty(value = "一级品类") + private String firsts; + @ExcelProperty(value = "二级品类") + private String seconds; + @ExcelProperty(value = "三级品类") + private String thirds; + @ExcelProperty(value = "物料名称") + private String materialName; + @ExcelProperty(value = "物料编码") + private String materialCode; + @ExcelProperty(value = "单位") + private String unit; @ExcelProperty(value = "销售数量") private String num; + @ExcelProperty(value = "合计件数") + private String count; + @ExcelProperty(value = "体积") + private String volume; + @ExcelProperty(value = "重量") + private String weight; + @ExcelProperty(value = "车次号") + private String trainNumber ; + @ExcelProperty(value = "商场编码") + private String dealerCode; + @ExcelProperty(value = "商场名称") + private String dealerName; @ExcelProperty(value = "商场收货人") private String consigneePerson; @ExcelProperty(value = "商场收货人电话") private String consigneeMobile; @ExcelProperty(value = "商场收货地址") private String consigneeAddress; + @ExcelProperty(value = "发货人") + private String shipperPerson; + @ExcelProperty(value = "发货人电话") + private String shipperMobile; + @ExcelProperty(value = "发货人地址") + private String shipperAddress; @ExcelProperty(value = "收货人") private String customerName ; @ExcelProperty(value = "联系电话") private String customerPhone ; @ExcelProperty(value = "地址") private String customerAddress ; - @ExcelProperty(value = "车次") - private String trainNumber ; - @ExcelProperty(value = "发货日期") - private String sendDateStr ; - @ExcelProperty(value = "品牌") - private String brand ; @ExcelProperty(value = "配送区域") private String area ; - @ExcelProperty(value = "服务号") - private String serviceNum ; } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/InComingDTO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/InComingDTO.java index cc5a3e2ad..f9adbe245 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/InComingDTO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/InComingDTO.java @@ -32,4 +32,6 @@ public class InComingDTO implements Serializable { private String tenantId; private String nickName; + private String customerTrain; + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/LoadCarsDTO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/LoadCarsDTO.java index cb7d3e6ec..d306ed6ce 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/LoadCarsDTO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/LoadCarsDTO.java @@ -23,17 +23,27 @@ public class LoadCarsDTO implements Serializable { private Integer type; private String startDate; private String endDate; + private Date startTime; + private Date endTime; private Integer pageNum; private Integer pageSize; private String loadCarsNo; + private String loadStatus; + private String carrierName; + private String carrierOrderCode; + private String startWarehouseName; + private String deliveryType; + private String operator; + private String settlementPerson; private Long warehouseId; private Integer startCarType; private Integer loadingType; private Integer unloadType; + private Integer isSettlement; private List carsOrderList = new ArrayList<>(); @@ -55,9 +65,12 @@ public class LoadCarsDTO implements Serializable { private String orderCode; private String trayCode; + private String trayName; private String trayType; private Integer isZero; private String scanCode; + private String scanStatus; + private String payMethod; private List packageList = new ArrayList<>(); private List zeroList = new ArrayList<>(); @@ -120,4 +133,32 @@ public class LoadCarsDTO implements Serializable { private List signPhotoList; + + private Integer isTransfer = 0; + + private String loadingUserName; + private String finalNodeName; + private String unloadNodeName; + private String unloadUserName; + + private Integer isData; + private Integer loadingAbnormal; + private Integer unloadAbnormal; + private Integer isSupple; + + + private String createTimeStartStr; + private String createTimeEndStr; + + private Date createTimeStart; + private Date createTimeEnd; + + private String unloadTimeStartStr; + private String unloadTimeEndStr; + + private Date unloadTimeStart; + private Date unloadTimeEnd; + + private String carsNo; + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/OpenOrderDTO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/OpenOrderDTO.java index c47812b5f..20b2c01e7 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/OpenOrderDTO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/OpenOrderDTO.java @@ -5,17 +5,23 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Date; import java.util.List; @Data public class OpenOrderDTO implements Serializable { + private Integer pageSize; + private Integer pageNum; + private Long waybillId; private Long brandId;//品牌id private String brand;//品牌 private String trainNumber;//客户车次号 private String waybillNo;//运单号 + private String departure;//发站 + private String departureCode; private Long departureWarehouseId;//发站仓id private String departureWarehouseName;//发站仓名称 private String destination;//到站 @@ -26,6 +32,8 @@ public class OpenOrderDTO implements Serializable { private List advanceIds;//暂存单ids private String orderCode;//订单号 private String openOrderDate;//开单时间 + private String dealerCode;//商场编码 + private String dealerName;//商场名称 private Long shipperId;//发货单位id private String shipper;//发货单位 @@ -102,4 +110,51 @@ public class OpenOrderDTO implements Serializable { private String editResonCode;//改单原因编码 private String editReson;//改单原因 + private String abolishReson;//作废原因 + + private Integer pickupCompleteOrNot;//提货是否整车 0否 1是 + + private Integer trunklineCompleteOrNot;//干线是否整车 0否 1是 + + private String trunklineVehicleType;//提货车型 + + private String pickupVehicleType;//提货车型 + + private Integer checkStatus; + + private String agent; + + private String createUserName; + + private String refer; + + private String openWarehouseName; + private String applyWarehouseName; + + private String openTimeStartStr; + private String openTimeEndStr; + + private Date openTimeStart; + private Date openTimeEnd; + + private String applyTimeStartStr; + private String applyTimeEndStr; + + private Date applyTimeStart; + private Date applyTimeEnd; + + private String checkTimeStartStr; + private String checkTimeEndStr; + + private Date checkTimeStart; + private Date checkTimeEnd; + + private List warehouseIds; + + + private List waybillIds; + + private Integer isEdit; + + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/UnloadPackageDTO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/UnloadPackageDTO.java index 16dcc7245..55fe9531f 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/UnloadPackageDTO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/UnloadPackageDTO.java @@ -8,5 +8,5 @@ import java.io.Serializable; public class UnloadPackageDTO implements Serializable { private String orderPackageCode; - + private Long carsLoadScanId; } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/WaybillDetailDTO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/WaybillDetailDTO.java index ee94aeb16..68474e618 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/WaybillDetailDTO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/dto/WaybillDetailDTO.java @@ -20,5 +20,7 @@ public class WaybillDetailDTO implements Serializable { private BigDecimal volume;//体积 private BigDecimal price ;//单价 private BigDecimal subtotalFreight;//小计运费 + private BigDecimal deliveryPrice;//配送单价 + private BigDecimal subtotalDeliveryFee;//小计配送费用 } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineAdvanceDetailEntity.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineAdvanceDetailEntity.java index b3465ce13..e1c252fe6 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineAdvanceDetailEntity.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineAdvanceDetailEntity.java @@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode; import org.springblade.core.tenant.mp.TenantEntity; import java.math.BigDecimal; +import java.util.Date; @Data @TableName("logpm_trunkline_advance_detail") @@ -15,107 +16,178 @@ import java.math.BigDecimal; @EqualsAndHashCode(callSuper = true) public class TrunklineAdvanceDetailEntity extends TenantEntity { - /** 预留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 ; - /** 仓库id */ - @ApiModelProperty(name = "仓库id",notes = "") - private Long warehouseId ; - /** 仓库名称 */ - @ApiModelProperty(name = "仓库名称",notes = "") - private String warehouseName ; - /** 仓库id */ - @ApiModelProperty(name = "导入仓库id",notes = "") - private Long incomingWarehouseId ; - /** 仓库名称 */ - @ApiModelProperty(name = "导入仓库名称",notes = "") - private String incomingWarehouseName ; - /** 暂存单id */ - @ApiModelProperty(name = "暂存单id",notes = "") - private Long advanceId ; - /** 订单自编号 */ - @ApiModelProperty(name = "订单自编号",notes = "") - private String orderCode ; - /** 品牌 */ - @ApiModelProperty(name = "品牌",notes = "") - private String brand ; - /** 订单来源 */ - @ApiModelProperty(name = "订单来源",notes = "") - private String systemType ; - /** 一级品类名称 */ - @ApiModelProperty(name = "一级品类名称",notes = "") - private String firstPackName ; - /** 一级品类编码 */ - @ApiModelProperty(name = "一级品类编码",notes = "") - private String firstPackCode ; - /** 二级品类名称 */ - @ApiModelProperty(name = "二级品类名称",notes = "") - private String secondPackName ; - /** 二级品类编码 */ - @ApiModelProperty(name = "二级品类编码",notes = "") - private String secondPackCode ; - /** 三级品类名称 */ - @ApiModelProperty(name = "三级品类名称",notes = "") - private String thirdPackName ; - /** 三级品类编码 */ - @ApiModelProperty(name = "三级品类编码",notes = "") - private String thirdPackCode ; - /** 基地名称 */ - @ApiModelProperty(name = "基地名称",notes = "") - private String siteName ; - /** 基地编码 */ - @ApiModelProperty(name = "基地编码",notes = "") - private String siteCode ; - /** 数量 */ - @ApiModelProperty(name = "数量",notes = "") - private Integer quantity ; - /** 包件码 */ - @ApiModelProperty(name = "包件码",notes = "") - private String orderPackageCode ; - /** 车次号 */ - @ApiModelProperty(name = "车次号",notes = "") - private String trainNumber ; - /** 服务号 */ - @ApiModelProperty(name = "服务号",notes = "") - private String serviceNum ; - /** 运单号 */ - @ApiModelProperty(name = "运单号",notes = "") - private String waybillNo ; - /** 包件状态 */ - @ApiModelProperty(name = "包件状态 0未入库 1已入库",notes = "") - private String packageStatus ; + /** + * 预留1 金牌包条重复时设置为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; + /** + * 仓库id + */ + @ApiModelProperty(name = "仓库id", notes = "") + private Long warehouseId; + /** + * 仓库名称 + */ + @ApiModelProperty(name = "仓库名称", notes = "") + private String warehouseName; + /** + * 仓库id + */ + @ApiModelProperty(name = "导入仓库id", notes = "") + private Long incomingWarehouseId; + /** + * 仓库名称 + */ + @ApiModelProperty(name = "导入仓库名称", notes = "") + private String incomingWarehouseName; + /** + * 暂存单id + */ + @ApiModelProperty(name = "暂存单id", notes = "") + private Long advanceId; + /** + * 订单自编号 + */ + @ApiModelProperty(name = "订单自编号", notes = "") + private String orderCode; + /** + * 品牌 + */ + @ApiModelProperty(name = "品牌", notes = "") + private String brand; + /** + * 订单来源 + */ + @ApiModelProperty(name = "订单来源", notes = "") + private String systemType; + /** + * 一级品类名称 + */ + @ApiModelProperty(name = "一级品类名称", notes = "") + private String firstPackName; + /** + * 一级品类编码 + */ + @ApiModelProperty(name = "一级品类编码", notes = "") + private String firstPackCode; + /** + * 二级品类名称 + */ + @ApiModelProperty(name = "二级品类名称", notes = "") + private String secondPackName; + /** + * 二级品类编码 + */ + @ApiModelProperty(name = "二级品类编码", notes = "") + private String secondPackCode; + /** + * 三级品类名称 + */ + @ApiModelProperty(name = "三级品类名称", notes = "") + private String thirdPackName; + /** + * 三级品类编码 + */ + @ApiModelProperty(name = "三级品类编码", notes = "") + private String thirdPackCode; + /** + * 基地名称 + */ + @ApiModelProperty(name = "基地名称", notes = "") + private String siteName; + /** + * 基地编码 + */ + @ApiModelProperty(name = "基地编码", notes = "") + private String siteCode; + /** + * 数量 + */ + @ApiModelProperty(name = "数量", notes = "") + private Integer quantity; + /** + * 包件码 + */ + @ApiModelProperty(name = "包件码", notes = "") + private String orderPackageCode; + /** + * 车次号 + */ + @ApiModelProperty(name = "车次号", notes = "") + private String trainNumber; + /** + * 服务号 + */ + @ApiModelProperty(name = "服务号", notes = "") + private String serviceNum; + /** + * 运单id + */ + @ApiModelProperty(name = "运单id", notes = "") + private Long waybillId; + /** + * 运单号 + */ + @ApiModelProperty(name = "运单号", notes = "") + private String waybillNo; + /** + * 包件状态 + */ + @ApiModelProperty(name = "包件状态 0未入库 1已入库", notes = "") + private String packageStatus; - /** 物料id */ - @ApiModelProperty(name = "物料id",notes = "") - private Long materialId ; - /** 物料编码 */ - @ApiModelProperty(name = "物料编码",notes = "") - private String materialCode ; - /** 物料名称 */ - @ApiModelProperty(name = "物料名称",notes = "") - private String materialName ; - /** 重量 */ - @ApiModelProperty(name = "重量",notes = "") - private BigDecimal weight ; - /** 体积 */ - @ApiModelProperty(name = "体积",notes = "") - private BigDecimal volume ; - /** 计价方式 1件 2方 3公斤 */ - @ApiModelProperty(name = "计价方式 1件 2方 3公斤",notes = "") - private Integer chargeType ; - @ApiModelProperty(name = "例放补进",notes = "") + /** + * 物料id + */ + @ApiModelProperty(name = "物料id", notes = "") + private Long materialId; + /** + * 物料编码 + */ + @ApiModelProperty(name = "物料编码", notes = "") + private String materialCode; + /** + * 物料名称 + */ + @ApiModelProperty(name = "物料名称", notes = "") + private String materialName; + /** + * 重量 + */ + @ApiModelProperty(name = "重量", notes = "") + private BigDecimal weight; + /** + * 体积 + */ + @ApiModelProperty(name = "体积", notes = "") + private BigDecimal volume; + /** + * 计价方式 1件 2方 3公斤 + */ + @ApiModelProperty(name = "计价方式 1件 2方 3公斤", notes = "") + private Integer chargeType; + @ApiModelProperty(name = "例放补进", notes = "") private String supple; @ApiModelProperty(name = "货运清单号") private String manifest; @@ -127,4 +199,17 @@ public class TrunklineAdvanceDetailEntity extends TenantEntity { private String carNumber; @ApiModelProperty(name = "货主") private String goodsMan; + @ApiModelProperty(name = "入库时间") + private Date incomingTime; + /** + * 仓库id + */ + @ApiModelProperty(name = "当前所在仓库id", notes = "") + private Long nowWarehouseId; + /** + * 仓库名称 + */ + @ApiModelProperty(name = "当前所在仓库名称", notes = "") + private String nowWarehouseName; + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineAdvanceEntity.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineAdvanceEntity.java index 3b22b75be..e490d3e59 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineAdvanceEntity.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineAdvanceEntity.java @@ -54,7 +54,7 @@ public class TrunklineAdvanceEntity extends TenantEntity { /** 订单总数 */ @ApiModelProperty(name = "订单总数",notes = "") private Integer totalNum ; - /** 订单总数 */ + /** 是否干仓配 */ @ApiModelProperty(name = "是否干仓配",notes = "") private Integer isGcp ; /** 品名 */ diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineBillladingWaybillEntity.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineBillladingWaybillEntity.java index 7de939d18..a887077e4 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineBillladingWaybillEntity.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineBillladingWaybillEntity.java @@ -57,6 +57,9 @@ public class TrunklineBillladingWaybillEntity extends TenantEntity { /** 提货费用 */ @ApiModelProperty(name = "提货费用",notes = "") private BigDecimal billladingFee ; + /** 计划件数 */ + @ApiModelProperty(name = "计划件数",notes = "") + private Integer planNum ; } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadEntity.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadEntity.java index 7cc524197..a3ac3b560 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadEntity.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadEntity.java @@ -198,4 +198,17 @@ public class TrunklineCarsLoadEntity extends TenantEntity { /** 签收时间 */ @ApiModelProperty(name = "签收时间",notes = "") private Date signTime; + + /** 直发商家个数 */ + @ApiModelProperty(name = "直发商家个数",notes = "") + private Integer customerNum; + + /** 司机类型 1-自有,2-加盟,3-外调,4-临调*/ + @ApiModelProperty(name = "直发商家个数",notes = "") + private String driverType; + + /** 外请人*/ + @ApiModelProperty(name = "外请人",notes = "") + private String outDriverPerson; + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadLineEntity.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadLineEntity.java index f317c3605..47a235b7a 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadLineEntity.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadLineEntity.java @@ -156,5 +156,17 @@ public class TrunklineCarsLoadLineEntity extends TenantEntity { /** 路桥费 */ @ApiModelProperty(name = "路桥费",notes = "") private BigDecimal tollFee ; + /** 卸车报告状态0无 1有 */ + @ApiModelProperty(name = "卸车报告状态0无 1有",notes = "") + private Integer unloadReportStatus; + /** 卸车报告第一段 */ + @ApiModelProperty(name = "卸车报告第一段",notes = "") + private String reportOne; + /** 卸车报告第二段 */ + @ApiModelProperty(name = "卸车报告第二段",notes = "") + private String reportTwo; + /** 卸车报告第三段 */ + @ApiModelProperty(name = "卸车报告第三段",notes = "") + private String reportThree; } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadScanEntity.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadScanEntity.java index 908ed6403..cf011241f 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadScanEntity.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineCarsLoadScanEntity.java @@ -109,6 +109,9 @@ public class TrunklineCarsLoadScanEntity extends TenantEntity { @ApiModelProperty(name = "是否补录 0否 1是",notes = "") private Integer isSupple ; + @ApiModelProperty(name = "签收人名称",notes = "") + private String signUserName; + /** 签收时间 */ @ApiModelProperty(name = "签收时间",notes = "") private Date signTime; @@ -127,4 +130,8 @@ public class TrunklineCarsLoadScanEntity extends TenantEntity { @ApiModelProperty(name = "卸车人名称",notes = "") private String unloadUserName; + /** 卸车时间 */ + @ApiModelProperty(name = "卸车时间",notes = "") + private Date unloadTime; + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineWaybillJsonEntity.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineWaybillJsonEntity.java new file mode 100644 index 000000000..e5291a240 --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineWaybillJsonEntity.java @@ -0,0 +1,38 @@ +package com.logpm.trunkline.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +@Data +@TableName("logpm_trunkline_waybill_json") +@ApiModel(value = "TrunklineWaybillJson对象", description = "更新运单记录表") +@EqualsAndHashCode(callSuper = true) +public class TrunklineWaybillJsonEntity extends TenantEntity { + + /** 预留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 = "日志id",notes = "") + private Long trackId; + + @ApiModelProperty(name = "运单更新json",notes = "") + private String waybillJson; + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineWaybillTrackEntity.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineWaybillTrackEntity.java index d60890b55..a176e89a2 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineWaybillTrackEntity.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/entity/TrunklineWaybillTrackEntity.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import org.springblade.core.tenant.mp.TenantEntity; +import java.util.Date; + @Data @TableName("logpm_trunkline_waybill_track") @ApiModel(value = "TrunklineWaybillTrack对象", description = "运单跟踪记录表") @@ -52,5 +54,11 @@ public class TrunklineWaybillTrackEntity extends TenantEntity { /** 操作人名称 */ @ApiModelProperty(name = "操作人名称",notes = "") private String createUserName ; + /** 审核状态 */ + @ApiModelProperty(name = "审核状态0未审核 1已通过",notes = "") + private Integer checkStatus; + /** 审核时间 */ + @ApiModelProperty(name = "审核时间",notes = "") + private Date checkTime; } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/IInComingClient.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/IInComingClient.java new file mode 100644 index 000000000..318591578 --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/IInComingClient.java @@ -0,0 +1,21 @@ +package com.logpm.trunkline.feign; + +import com.logpm.trunkline.dto.InComingDTO; +import org.springblade.common.constant.ModuleNameConstant; +import org.springblade.core.tool.api.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient( + value = ModuleNameConstant.APPLICATION_TRUNKLINE_NAME +) +public interface IInComingClient { + + String API_PREFIX = "inComing/client"; + + + @PostMapping(API_PREFIX+"/incomingPackage") + R incomingPackageByTaryCode(@RequestBody InComingDTO inComingDTO); + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineAdvanceClient.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineAdvanceClient.java index 6cb914ddc..fb3d19099 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineAdvanceClient.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineAdvanceClient.java @@ -1,10 +1,15 @@ package com.logpm.trunkline.feign; +import com.logpm.trunkline.dto.CancelOrderParamVO; import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import org.springblade.common.constant.ModuleNameConstant; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; @FeignClient( value = ModuleNameConstant.APPLICATION_TRUNKLINE_NAME @@ -16,5 +21,12 @@ public interface ITrunklineAdvanceClient { @PostMapping(API_PREFIX+"/addAdvanceReturnId") Long addAdvanceReturnId(@RequestBody TrunklineAdvanceEntity trunklineAdvanceEntity); + @GetMapping(API_PREFIX+"/findAdvanceLimitOneByOrderCode") + TrunklineAdvanceEntity findAdvanceLimitOneByOrderCode(@RequestParam String orderCode); + + @PostMapping(API_PREFIX+"/findListByIds") + List findListByIds(@RequestBody List collect); + @PostMapping(API_PREFIX+"/cancelOrder") + Boolean cancelOrder(@RequestBody CancelOrderParamVO orderCode); } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineAdvanceDetailClient.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineAdvanceDetailClient.java index 9970abe34..1fb266675 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineAdvanceDetailClient.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineAdvanceDetailClient.java @@ -1,10 +1,13 @@ package com.logpm.trunkline.feign; import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; import org.springblade.common.constant.ModuleNameConstant; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @@ -18,4 +21,8 @@ public interface ITrunklineAdvanceDetailClient { @PostMapping(API_PREFIX+"/addAdvanceBatch") void addAdvanceBatch(@RequestBody List advanceDetailEntities); + @PostMapping(API_PREFIX+"/findListByAdvanceIds") + List findListByAdvanceIds(@RequestBody List collect); + @GetMapping(API_PREFIX+"/findEntityByOrderPackageCode") + TrunklineAdvanceDetailEntity findEntityByOrderPackageCode(@RequestParam String orderPackageCode); } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineCarsLoadClient.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineCarsLoadClient.java new file mode 100644 index 000000000..9deb64eac --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineCarsLoadClient.java @@ -0,0 +1,19 @@ +package com.logpm.trunkline.feign; + +import com.logpm.trunkline.entity.TrunklineCarsLoadEntity; +import org.springblade.common.constant.ModuleNameConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient( + value = ModuleNameConstant.APPLICATION_TRUNKLINE_NAME +) +public interface ITrunklineCarsLoadClient { + + String API_PREFIX = "trunklineCarsLoad/client"; + + @GetMapping(API_PREFIX+"/findEntityByCarsNo") + TrunklineCarsLoadEntity findEntityByCarsNo(@RequestParam String carsNo); + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineCarsLoadScanClient.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineCarsLoadScanClient.java index d8fea7ffb..f02a97991 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineCarsLoadScanClient.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineCarsLoadScanClient.java @@ -19,6 +19,9 @@ public interface ITrunklineCarsLoadScanClient { @GetMapping(API_PREFIX+"/incomingPackage") R incomingPackage(@RequestParam Long carsLoadScanId); + @GetMapping(API_PREFIX+"/adnormalHasStock") + R adnormalHasStock(@RequestParam Long carsLoadScanId, @RequestParam Long warehouseId); + // @PostMapping(API_PREFIX+"/addAdvanceReturnId") // Long addAdvanceReturnId(@RequestBody TrunklineAdvanceEntity trunklineAdvanceEntity); diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklinePackageTrackLogClient.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklinePackageTrackLogClient.java new file mode 100644 index 000000000..28474dd13 --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklinePackageTrackLogClient.java @@ -0,0 +1,22 @@ +package com.logpm.trunkline.feign; + +import com.alibaba.fastjson.JSONObject; +import org.springblade.common.constant.ModuleNameConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@FeignClient( + value = ModuleNameConstant.APPLICATION_TRUNKLINE_NAME +) +public interface ITrunklinePackageTrackLogClient { + + String API_PREFIX = "trunklinePackageTrackLog/client"; + + @PostMapping(API_PREFIX+"/addBatchPackageTrackLog") + void addPackageTrackLog(@RequestBody List addPackageTrackLogList); + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineWaybillOrderClient.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineWaybillOrderClient.java index 2d3f997f3..d07fa1344 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineWaybillOrderClient.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineWaybillOrderClient.java @@ -1,6 +1,7 @@ package com.logpm.trunkline.feign; import com.logpm.trunkline.entity.TrunklineWaybillOrderEntity; +import com.logpm.trunkline.vo.TrunklineBillladingVO; import org.springblade.common.constant.ModuleNameConstant; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -22,4 +23,7 @@ public interface ITrunklineWaybillOrderClient { @PostMapping(API_PREFIX+"/addEntityReturnId") Long addEntityReturnId(@RequestBody TrunklineWaybillOrderEntity trunklineWaybillOrderEntity); + + @PostMapping(API_PREFIX+"/findListByWaybillIds") + List findListByWaybillIds(@RequestBody List waybillIds); } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineWaybillPackageClient.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineWaybillPackageClient.java new file mode 100644 index 000000000..e59f16f15 --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/feign/ITrunklineWaybillPackageClient.java @@ -0,0 +1,24 @@ +package com.logpm.trunkline.feign; + +import com.logpm.trunkline.entity.TrunklineWaybillOrderEntity; +import com.logpm.trunkline.entity.TrunklineWaybillPackageEntity; +import org.springblade.common.constant.ModuleNameConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@FeignClient( + value = ModuleNameConstant.APPLICATION_TRUNKLINE_NAME +) +public interface ITrunklineWaybillPackageClient { + + String API_PREFIX = "trunklineWaybillOrderPackage/client"; + + @PostMapping(API_PREFIX+"/findListByWaybillIds") + List findListByWaybillIds(@RequestBody List waybillIds); + + @PostMapping(API_PREFIX+"/addEntity") + void addEntity(@RequestBody TrunklineWaybillPackageEntity trunklineWaybillPackageEntity); +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadAllOrderVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadAllOrderVO.java index 917f9d485..b052ab501 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadAllOrderVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadAllOrderVO.java @@ -11,6 +11,7 @@ public class CarsLoadAllOrderVO implements Serializable { private Long carsOrderId;//id private String orderCode;//订单号 + private Long waybillId;//运单id private String waybillNo;//运单号 private Date createTime;//创建时间 private String destination;//到站 @@ -24,6 +25,7 @@ public class CarsLoadAllOrderVO implements Serializable { private String goodsName;//货物名称 private String customerTrain;//客户车次号 private String remark;//备注好 + private Integer orderNum;//订单件数 private Integer totalNum;//总件数 private Integer stockNum;//在库件数 private Integer planNum;//计划件数 diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadOrderInfoVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadOrderInfoVO.java index 26206e4c3..e088db4ff 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadOrderInfoVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadOrderInfoVO.java @@ -13,6 +13,7 @@ public class CarsLoadOrderInfoVO implements Serializable { private Integer planNum; private Integer loadingNum; private Integer unloadNum; + private Integer signNum; private BigDecimal unloadIncome; private BigDecimal costZhang; private BigDecimal costPiece; diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadScanAbnormalVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadScanAbnormalVO.java new file mode 100644 index 000000000..1c733a263 --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadScanAbnormalVO.java @@ -0,0 +1,15 @@ +package com.logpm.trunkline.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class CarsLoadScanAbnormalVO implements Serializable { + + private String waybillNo; + private String orderCode; + private Integer loadingNum; + private Integer unloadNum; + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadWaybillInfoVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadWaybillInfoVO.java index b4093b94a..cf6a8e124 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadWaybillInfoVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/CarsLoadWaybillInfoVO.java @@ -15,6 +15,7 @@ public class CarsLoadWaybillInfoVO implements Serializable { private Date createTime; private String destination; private String destinationWarehouseName; + private Integer checkStatus; private String shipper; private String shipperName; private String consignee; @@ -22,6 +23,8 @@ public class CarsLoadWaybillInfoVO implements Serializable { private Integer waybillNum; private String openPrice; private String goodsName; + private Integer waybillType; + private Long waybillId; private String remark; private BigDecimal totalFreight; private BigDecimal deliveryFee; diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/EditOrderMsgVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/EditOrderMsgVO.java new file mode 100644 index 000000000..f91f46c00 --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/EditOrderMsgVO.java @@ -0,0 +1,14 @@ +package com.logpm.trunkline.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class EditOrderMsgVO implements Serializable { + + private String itemName; + private String oldValue; + private String newValue; + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/LoadingDetailExportVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/LoadingDetailExportVO.java new file mode 100644 index 000000000..15a0ebc82 --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/LoadingDetailExportVO.java @@ -0,0 +1,75 @@ +package com.logpm.trunkline.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class LoadingDetailExportVO implements Serializable { + + @ExcelProperty(value = "运单号") + private String waybillNo; + + @ExcelProperty(value = "配载批次") + private String carsNo; + + @ExcelProperty(value = "合同号") + private String orderCode; + + @ExcelProperty(value = "包条码-产品名称") + private String scanCode; + + @ExcelProperty(value = "装车人") + private String loadingUserName; + + @ExcelProperty(value = "装车仓库") + private String warehouseNname; + + @ExcelProperty(value = "计划目的仓库") + private String finalNodeName; + + @ExcelProperty(value = "装卸状态") + private String scanStatus; + + @ExcelProperty(value = "托盘名称") + private String trayName; + + @ExcelProperty(value = "托盘码") + private String trayCode; + + @ExcelProperty(value = "卸车仓库") + private String unloadNodeName; + + @ExcelProperty(value = "卸车人") + private String unloadUserName; + + @ExcelProperty(value = "类型") + private String type; + + @ExcelProperty(value = "数量") + private String num; + + @ExcelProperty(value = "有无数据") + private String isData; + + @ExcelProperty(value = "是否装车异常") + private String loadingAbnormal; + + @ExcelProperty(value = "是否卸车异常") + private String unloadAbnormal; + + @ExcelProperty(value = "是否补录") + private String isSupple; + + @ExcelProperty(value = "装车时间") + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date loadingTime; + + @ExcelProperty(value = "卸车时间") + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date unloadTime; + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/OpenOrderVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/OpenOrderVO.java index ed0f0e146..60b9dbf7c 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/OpenOrderVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/OpenOrderVO.java @@ -10,9 +10,12 @@ import java.util.List; @Data public class OpenOrderVO implements Serializable { + private Long brandId; private String brand; private String trainNumber; private String orderCode; + private String dealerCode; + private String dealerName; private List advanceIds = new ArrayList<>(); @@ -22,6 +25,10 @@ public class OpenOrderVO implements Serializable { private String destinationWarehouseName;//目的仓名称 private Long destinationWarehouseId;//目的仓Id + private String departure;//发站 + private String departureCode;//发站编码 + private List departureArray;//发站 + private String destination;//到站 private String destinationCode;//到站编码 private List destinationArray;//到站 @@ -48,6 +55,7 @@ public class OpenOrderVO implements Serializable { private List transportTypeList;//运输方式 private String defaultPayWay; + private String defaultDeliveryWay;//默认送货方式 private String openOrderDate;//开单时间 private String openOrderUserName;//开单人 diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/OrderDetailInfoVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/OrderDetailInfoVO.java new file mode 100644 index 000000000..8f39ae94a --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/OrderDetailInfoVO.java @@ -0,0 +1,44 @@ +package com.logpm.trunkline.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class OrderDetailInfoVO implements Serializable { + + private Long waybillId; + private String waybillNo; + private String nowWarehouseName; + private String trainNumber; + private String packageStatus; + private Integer isGcp; + private String firstPackName; + private String secondPackName; + private String thirdPackName; + private String materialCode; + private String materialName; + private String orderCode; + private String orderPackageCode; + private String brand; + private String serviceNumber; + private Integer quantity; + private String trayCode; + private String trayName; + private BigDecimal weight; + private BigDecimal volume; + private String sendDateStr; + private String trunklineCarsNo; + private String scanStatus; + private Date trunklineLoadingTime; + private Date trunklineSignTime; + private String deliveryTrainNumber; + private Date deliveryLoadingTime; + private Date deliverySignTime; + private String importWarehouseName; + private String createUserName; + private Date createTime; + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/SignOrderDetailVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/SignOrderDetailVO.java index a1a665397..2412eb77c 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/SignOrderDetailVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/SignOrderDetailVO.java @@ -3,6 +3,7 @@ package com.logpm.trunkline.vo; import lombok.Data; import java.io.Serializable; +import java.util.Date; @Data public class SignOrderDetailVO implements Serializable { @@ -21,6 +22,9 @@ public class SignOrderDetailVO implements Serializable { private Integer type; private Integer num; private Integer unloadNum; + private String signUserName; + private Date signTime; + private Date unloadTime; private String remark; private Long signOrderId; diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TripartiteTransferVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TripartiteTransferVO.java index 1523ca279..c99239eb8 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TripartiteTransferVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TripartiteTransferVO.java @@ -5,4 +5,7 @@ import lombok.Data; @Data public class TripartiteTransferVO extends TrunklineCarsLoadEntity { + + private Integer signNum; + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineAdvanceDetailVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineAdvanceDetailVO.java index 932f3d934..f5b0cca4d 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineAdvanceDetailVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineAdvanceDetailVO.java @@ -11,4 +11,7 @@ public class TrunklineAdvanceDetailVO extends TrunklineAdvanceDetailEntity { private String trayCode; private String trayName; + private String goodsName; + private Long goodsId; + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineBillladingNumVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineBillladingNumVO.java new file mode 100644 index 000000000..fb0cef0ca --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineBillladingNumVO.java @@ -0,0 +1,15 @@ +package com.logpm.trunkline.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class TrunklineBillladingNumVO implements Serializable { + + private Integer num; + private BigDecimal weight; + private BigDecimal volume; + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineBillladingWaybillVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineBillladingWaybillVO.java index 05f0b421e..c9b401876 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineBillladingWaybillVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineBillladingWaybillVO.java @@ -32,5 +32,8 @@ public class TrunklineBillladingWaybillVO extends TrunklineBillladingWaybillEnti private Integer stockCount; private Long billladingWaybillId; + private Integer totalPlanNum; + private Integer scanNum; + private Integer noBillladingNum; } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsLoadScanVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsLoadScanVO.java index 26b563a32..a9bee5e6d 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsLoadScanVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsLoadScanVO.java @@ -5,4 +5,10 @@ import lombok.Data; @Data public class TrunklineCarsLoadScanVO extends TrunklineCarsLoadScanEntity { + + private Long signOrderId; + + private String destinationWarehouseName; + + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsLoadVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsLoadVO.java index 3589577ad..5fa063a23 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsLoadVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsLoadVO.java @@ -49,5 +49,7 @@ public class TrunklineCarsLoadVO extends TrunklineCarsLoadEntity { private Integer lastStartCarStatus; private Integer planUnloadNum; + private Integer totalLoadingNum; + private String loadCarsNo; } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsOrderVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsOrderVO.java index edf46b866..5618cc4cf 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsOrderVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineCarsOrderVO.java @@ -5,4 +5,10 @@ import lombok.Data; @Data public class TrunklineCarsOrderVO extends TrunklineCarsOrderEntity { + + private String mallName; + private String mallPerson; + private String mallMobile; + private String mallAddress; + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineLoadSignOrderVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineLoadSignOrderVO.java index da14baefb..92b129a9f 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineLoadSignOrderVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineLoadSignOrderVO.java @@ -11,6 +11,9 @@ public class TrunklineLoadSignOrderVO extends TrunklineLoadSignOrderEntity { private String driverName; private String carsNo; + private String carsLineName; + private String carNumber; + private String driverMobile; private List signPhotoList; diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineWaybillTrackVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineWaybillTrackVO.java index e706d3e65..731472385 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineWaybillTrackVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/TrunklineWaybillTrackVO.java @@ -3,7 +3,21 @@ package com.logpm.trunkline.vo; import com.logpm.trunkline.entity.TrunklineWaybillTrackEntity; import lombok.Data; +import java.util.Date; + @Data public class TrunklineWaybillTrackVO extends TrunklineWaybillTrackEntity { + private String openWarehouseName; + + private String waybillType; + + private String agent; + + private Date openTime; + + private Date applyTime; + + private String applyWarehouseName; + } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/UnloadReportVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/UnloadReportVO.java new file mode 100644 index 000000000..3734e7b04 --- /dev/null +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/UnloadReportVO.java @@ -0,0 +1,17 @@ +package com.logpm.trunkline.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class UnloadReportVO implements Serializable { + + private Integer loadingNum; + private Integer unloadNum; + private Integer noDataNum; + private Integer noPlanNum; + private Integer noUnloadNum; + private Integer manualNum; + +} diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/WaybillCarsLoadVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/WaybillCarsLoadVO.java index b7075a7df..c5091094c 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/WaybillCarsLoadVO.java +++ b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/WaybillCarsLoadVO.java @@ -13,6 +13,7 @@ public class WaybillCarsLoadVO implements Serializable { private String carsLineName; private Date startTime; private Date arriveTime; + private Date signTime; private String carNumber; private String driverName; private String driverMobile; diff --git a/blade-service-api/logpm-warehouse-api/pom.xml b/blade-service-api/logpm-warehouse-api/pom.xml index aef29d830..41edf6a52 100644 --- a/blade-service-api/logpm-warehouse-api/pom.xml +++ b/blade-service-api/logpm-warehouse-api/pom.xml @@ -14,6 +14,10 @@ org.projectlombok lombok + + org.springblade + blade-starter-excel + diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/QuestDetailEntity.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/QuestDetailEntity.java index 8505f66de..4d3c14b41 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/QuestDetailEntity.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/QuestDetailEntity.java @@ -216,6 +216,12 @@ public class QuestDetailEntity extends TenantEntity { @ApiModelProperty(value = "新托盘编码") private String newTrayCode; + /** + * 新托盘名称 + */ + @ApiModelProperty(value = "新托盘名称") + private String newTrayName; + /** * 货位id */ diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/SyncOldTrayTypeLogEntity.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/SyncOldTrayTypeLogEntity.java index 822f50b07..79e890d59 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/SyncOldTrayTypeLogEntity.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/SyncOldTrayTypeLogEntity.java @@ -51,4 +51,7 @@ public class SyncOldTrayTypeLogEntity extends TenantEntity { @ApiModelProperty(value = "同步次数") private Integer syncNum; + @ApiModelProperty(value = "队列状态") + private Integer mqStatus; + } diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseRetentionScanEntity.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseRetentionScanEntity.java index 1902c6bdf..1123f6022 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseRetentionScanEntity.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseRetentionScanEntity.java @@ -26,6 +26,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springblade.core.tenant.mp.TenantEntity; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; @@ -168,6 +169,7 @@ public class WarehouseRetentionScanEntity extends TenantEntity { * 滞留扫描时间 */ @ApiModelProperty(value = "滞留扫描时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date retentionScanTime; /** * 滞留方式 1-PDA、2-PC @@ -241,4 +243,22 @@ public class WarehouseRetentionScanEntity extends TenantEntity { @ApiModelProperty(value = "运单Id") private Long waybillId; + /** + * 装车记录Id + */ + @ApiModelProperty(value = "运单Id") + private Long loadingId; + + /** + * 仓库Id + */ + @ApiModelProperty(value = "运单Id") + private Long warehouseId; + + /** + * 仓库名称 + */ + @ApiModelProperty(value = "运单Id") + private String warehouseName; + } diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseUpdownStockupAreaEntity.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseUpdownStockupAreaEntity.java index c83d3fc30..520d7a4bb 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseUpdownStockupAreaEntity.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseUpdownStockupAreaEntity.java @@ -61,12 +61,14 @@ public class WarehouseUpdownStockupAreaEntity extends TenantEntity { /** 关联值 */ @ApiModelProperty(name = "关联值",notes = "") private String associationValue ; - /** 关联类型;1.订单号 2运单号 3包件码 */ - @ApiModelProperty(name = "关联类型",notes = "1.订单号 2运单号 3包件码 4库存品") + /** 1.包件 2库存品 3订单 4托盘 */ + @ApiModelProperty(name = "关联类型",notes = "1.包件 2库存品 3订单 4托盘") private String associationType ; /** 货物名称 */ @ApiModelProperty(name = "货物名称",notes = "") private String goodsName ; + @ApiModelProperty(name = "货物名称",notes = "") + private String trayName ; /** 数量 */ @ApiModelProperty(name = "数量",notes = "") private Integer num ; diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWarehousingDetailEntity.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWarehousingDetailEntity.java index 0e3b2c4a3..863381b1c 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWarehousingDetailEntity.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWarehousingDetailEntity.java @@ -127,4 +127,35 @@ public class WarehouseWarehousingDetailEntity extends TenantEntity { @ApiModelProperty(value = "品牌ID") private Long brandId; + + /** + * 库位Id + */ + @ApiModelProperty(value = "库位Id") + private Long allocationId; + + /** + * 库位名称 + */ + @ApiModelProperty(value = "库位名称") + private String allocationName; + + /** + * 托盘ID + */ + @ApiModelProperty(value = "托盘ID") + private Long trayId; + + /** + * 托盘名称 + */ + @ApiModelProperty(value = "托盘名称") + private String trayName; + + /** + * 装载类型 + */ + @ApiModelProperty(value = "装载类型") + private Integer loadingType; + } diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWayBillDetail.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWayBillDetail.java index 94479c10c..63b62707e 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWayBillDetail.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWayBillDetail.java @@ -53,4 +53,13 @@ public class WarehouseWayBillDetail extends BaseEntity { @ApiModelProperty(name = "计价方式 1件 2方 3公斤",notes = "") private Integer chargeType; + /** 单价 */ + @ApiModelProperty(name = "配送单价",notes = "") + private BigDecimal deliveryPrice; + + /** 小计运费 */ + @ApiModelProperty(name = "小计配送费用",notes = "") + private BigDecimal subtotalDeliveryFee; + + } diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWaybillEntity.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWaybillEntity.java index c20ce5ff7..a02f1ba66 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWaybillEntity.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/entity/WarehouseWaybillEntity.java @@ -18,6 +18,7 @@ package com.logpm.warehouse.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -373,21 +374,25 @@ public class WarehouseWaybillEntity extends TenantEntity { * 现付金额 */ @ApiModelProperty(value = "现付金额") + @JsonProperty("xPay") private BigDecimal xPay;//现付金额 /** * 到付 */ @ApiModelProperty(value = "到付") + @JsonProperty("dPay") private BigDecimal dPay;//到付 /** * 月结 */ @ApiModelProperty(value = "月结") + @JsonProperty("yPay") private BigDecimal yPay;//月结 /** * 回付 */ @ApiModelProperty(value = "回付") + @JsonProperty("hPay") private BigDecimal hPay;//回付 /** * 三方操作费 @@ -445,4 +450,46 @@ public class WarehouseWaybillEntity extends TenantEntity { @ApiModelProperty(value = "成本件数") private Integer costNum; + @ApiModelProperty(value = "发站") + private String departure; + + @ApiModelProperty(value = "发站编码") + private String departureCode; + + @ApiModelProperty(value = "商场编码") + private String dealerCode; + + @ApiModelProperty(value = "商场名称") + private String dealerName; + + @ApiModelProperty(value = "提货是否整车 0否 1是") + private Integer pickupCompleteOrNot; + + @ApiModelProperty(value = "干线是否整车 0否 1是") + private Integer trunklineCompleteOrNot; + + @ApiModelProperty(value = "干线车型 ") + private String trunklineVehicleType; + + @ApiModelProperty(value = "提货车型 ") + private String pickupVehicleType; + + @ApiModelProperty(value = "作废状态 0否 1是 ") + private Integer abolishStatus; + + @ApiModelProperty(value = "作废人名称 ") + private String abolishUserName; + + @ApiModelProperty(value = "作废时间 ") + private Date abolishTime; + + @ApiModelProperty(value = "冻结人名称 ") + private String freezeUserName; + + @ApiModelProperty(value = "冻结时间 ") + private Date freezeTime; + + @ApiModelProperty(value = "提货件数 ") + private Integer billladingNum; + } diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseGoodsAllocationClient.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseGoodsAllocationClient.java index 53fe7bebb..84da5f512 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseGoodsAllocationClient.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseGoodsAllocationClient.java @@ -62,4 +62,6 @@ public interface IWarehouseGoodsAllocationClient { List getAllocationInforByIds(@RequestParam("ids") String [] ids); + @GetMapping(TOP+ "/findByAllocationQrCode") + WarehouseGoodsAllocationEntity findByAllocationQrCode(@RequestParam String positions); } diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseRetentionScanClient.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseRetentionScanClient.java index 11fc23016..273f2ce38 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseRetentionScanClient.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseRetentionScanClient.java @@ -17,6 +17,7 @@ package com.logpm.warehouse.feign; import com.logpm.warehouse.entity.WarehouseRetentionScanEntity; +import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.mp.support.BladePage; import com.logpm.warehouse.entity.WarehouseRetentionRecordEntity; import org.springblade.core.tool.api.R; @@ -26,6 +27,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; +import java.util.List; + /** * 滞留扫描记录 Feign接口类 * @@ -33,7 +36,7 @@ import org.springframework.web.bind.annotation.RequestParam; * @since 2023-11-03 */ @FeignClient( - value = "warehouseRetentionScan" + value = ModuleNameConstant.APPLICATION_WAREHOUSE_NAME ) public interface IWarehouseRetentionScanClient { @@ -58,4 +61,7 @@ public interface IWarehouseRetentionScanClient { @PostMapping(TOP+"/saveRetentionScan") R saveRetentionScan(@RequestBody WarehouseRetentionScanEntity warehouseRetentionScanEntity); + @PostMapping(TOP+"/saveBatchRetentionScan") + R saveBatchRetentionScan(@RequestBody List warehouseRetentionScanEntities); + } diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseTrayGoodsClient.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseTrayGoodsClient.java index 262ae39c8..cc486e603 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseTrayGoodsClient.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseTrayGoodsClient.java @@ -17,6 +17,7 @@ package com.logpm.warehouse.feign; +import com.alibaba.fastjson.JSONObject; import com.logpm.warehouse.entity.WarehouseTrayGoodsEntity; import org.springblade.common.constant.ModuleNameConstant; import org.springframework.cloud.openfeign.FeignClient; @@ -103,6 +104,9 @@ public interface IWarehouseTrayGoodsClient { @GetMapping(API_PREFIX+"/delTrayGoodsById") void delTrayGoodsById(@RequestParam Long trayGoodsId, @RequestParam Long warehouseId); + @PostMapping(API_PREFIX+"/downZeroTrayById") + void downZeroTrayById( @RequestBody List list); + /** * 查询一批包件所在托盘 * @param map diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseTrayTypeClient.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseTrayTypeClient.java index 03a422aad..f9998f26c 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseTrayTypeClient.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseTrayTypeClient.java @@ -18,6 +18,7 @@ package com.logpm.warehouse.feign; import com.alibaba.fastjson.JSONObject; +import com.logpm.warehouse.entity.WarehouseTrayTypeEntity; import com.logpm.warehouse.vo.TrayTypeDataVO; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.tool.api.R; @@ -74,4 +75,7 @@ public interface IWarehouseTrayTypeClient { @GetMapping(API_PREFIX+"/trayToNull") void trayToNull(@RequestParam String trayCode,@RequestParam String remark); + + @GetMapping(API_PREFIX+"/findTrayTypeEntity") + WarehouseTrayTypeEntity findTrayTypeEntity(@RequestParam String trayCode); } diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseUpdownStockUpAreaClient.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseUpdownStockUpAreaClient.java index dfbbc2b60..3e37ffcaf 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseUpdownStockUpAreaClient.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseUpdownStockUpAreaClient.java @@ -17,6 +17,7 @@ package com.logpm.warehouse.feign; +import com.alibaba.fastjson.JSONObject; import com.logpm.warehouse.entity.WarehouseTrayGoodsEntity; import com.logpm.warehouse.entity.WarehouseUpdownGoodsLogEntity; import org.springblade.common.constant.ModuleNameConstant; @@ -44,6 +45,11 @@ public interface IWarehouseUpdownStockUpAreaClient { String TOP = API_PREFIX + "/top"; - @GetMapping(TOP+"/upStockUpShelf") - Boolean upStockUpShelf(@RequestParam String code,@RequestParam Long stockUpAllocationId,@RequestParam Long warehouseId,@RequestParam Integer type,@RequestParam Integer num); + @PostMapping(TOP+"/upStockUpShelf") + Boolean upStockUpShelf(@RequestBody JSONObject jsonObject); + + + + @PostMapping(TOP+"/downStockUpShelf") + void downStockUpShelf(@RequestBody List jsonObjects); } diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseUpdownTypeClient.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseUpdownTypeClient.java index 70fc1e00d..cd7d991b7 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseUpdownTypeClient.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseUpdownTypeClient.java @@ -61,6 +61,9 @@ public interface IWarehouseUpdownTypeClient { @GetMapping(TOP + "/downPackageOrDelTray") R downPackageOrDelTray(@RequestParam("orderPackageCodes") String orderPackageCodes, @RequestParam("warehouseId") Long warehouseId,@RequestParam("remark") String remark); + @GetMapping(TOP + "/downPackageAndDelTrayAndIsUpdate") + R downPackageAndDelTrayAndIsUpdate(@RequestParam("orderPackageCodes") String orderPackageCodes, @RequestParam("warehouseId") Long warehouseId,@RequestParam("remark") String remark,@RequestParam("isOrNo") boolean isOrNo); + @GetMapping(TOP + "/downTray") R downTray(@RequestParam("trayCode") String trayCode, @RequestParam("warehouseId") Long warehouseId); diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillClient.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillClient.java index 00c198ab5..40de17732 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillClient.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillClient.java @@ -71,4 +71,28 @@ public interface IWarehouseWaybillClient { @GetMapping(API_PREFIX + "/findLastData") Long findLastData(@RequestParam String waybillNo); + + @PostMapping(API_PREFIX + "/findListByWaybillIds") + List findListByWaybillIds(@RequestBody List waybillIds); + + @PostMapping(API_PREFIX + "/updateList") + void updateList(@RequestBody List waybillEntities); + + @PostMapping(API_PREFIX + "/findFreezeOrAbolishByWaybillNos") + List findFreezeOrAbolishByWaybillNos(@RequestBody List waybillNos); + + + @PostMapping(API_PREFIX + "/findWaybillBilllByWaybillNos") + List findWaybillBilllByWaybillNos(@RequestBody List waybillNos); + + + + @PostMapping(API_PREFIX + "/updateWaybillFreezeStatusByWaybillIds") + void updateWaybillFreezeStatusByWaybillIds(@RequestBody List waybillIds); + + @GetMapping(API_PREFIX+"/findWaybillEntityByOrderPackageCode") + WarehouseWaybillEntity findWaybillEntityByOrderPackageCode(@RequestParam String orderPackageCode); + @GetMapping(API_PREFIX+"/deleteByWaybillNo") + void deleteByWaybillNo(String waybillNo); + } diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillDetailClient.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillDetailClient.java index 3bb00911f..02f463493 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillDetailClient.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillDetailClient.java @@ -65,4 +65,8 @@ public interface IWarehouseWaybillDetailClient { @PostMapping(API_PREFIX+"/addEntity") void addEntity(@RequestBody WarehouseWayBillDetail warehouseWayBillDetail); + @PostMapping(API_PREFIX+"/findByWaybillIds") + List findByWaybillIds(@RequestBody List waybillIds); + @PostMapping(API_PREFIX+"/deleteByWaybillNo") + void deleteByWaybillNo(String waybillNo); } diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/ExportWarehouseWaybillVO.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/ExportWarehouseWaybillVO.java new file mode 100644 index 000000000..f787258d1 --- /dev/null +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/ExportWarehouseWaybillVO.java @@ -0,0 +1,191 @@ +package com.logpm.warehouse.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class ExportWarehouseWaybillVO implements Serializable { + + @ExcelProperty(value = "运单号") + private String waybillNo; + + @ExcelProperty(value = "订单号") + private String orderNo; + + @ExcelProperty(value = "发站仓") + private String departureWarehouseName; + + @ExcelProperty(value = "目的仓") + private String destinationWarehouseName; + + @ExcelProperty(value = "客户车次") + private String customerTrain; + + @ExcelProperty(value = "品牌") + private String brand; + + + @ExcelProperty(value = "发货单位") + private String shipper; + + + @ExcelProperty(value = "发货人") + private String shipperName; + + @ExcelProperty(value = "发货方手机号") + private String shipperMobile; + + @ExcelProperty(value = "发货方地址") + private String shipperAddress; + + + @ExcelProperty(value = "收货单位") + private String consignee; + + + @ExcelProperty(value = "收货人") + private String consigneeName; + + @ExcelProperty(value = "收货方手机号") + private String consigneeMobile; + + @ExcelProperty(value = "收货方地址") + private String consigneeAddress; + + @ExcelProperty(value = "到站") + private String destination; + + @ExcelProperty(value = "货物名称") + private String goodsName; + + @ExcelProperty(value = "按件分摊") + private BigDecimal costPiece; + + @ExcelProperty(value = "按比列分摊") + private BigDecimal costZhang; + + @ExcelProperty(value = "成本分摊件数") + private Integer costNum; + + @ExcelProperty(value = "总件数") + private Integer totalCount; + + @ExcelProperty(value = "总重量") + private BigDecimal totalWeight; + + @ExcelProperty(value = "总体积") + private BigDecimal totalVolume; + + @ExcelProperty(value = "运费") + private BigDecimal totalFreight; + + @ExcelProperty(value = "送货费") + private BigDecimal deliveryFee; + + @ExcelProperty(value = "提货费") + private BigDecimal pickupFee; + + @ExcelProperty(value = "仓库管理费") + private BigDecimal warehouseManagementFee; + + @ExcelProperty(value = "仓储费") + private BigDecimal storageFee; + + @ExcelProperty(value = "装卸费") + private BigDecimal handlingFee; + + @ExcelProperty(value = "安装费") + private BigDecimal installFee; + + @ExcelProperty(value = "回扣") + private BigDecimal rebate; + + @ExcelProperty(value = "支付方式") + private String payType; + + @ExcelProperty(value = "付款方式") + private String payWay; + + @ExcelProperty(value = "现付") + private BigDecimal xPay; + + @ExcelProperty(value = "到付") + private BigDecimal dPay; + + @ExcelProperty(value = "回付") + private BigDecimal hPay; + + @ExcelProperty(value = "月结") + private BigDecimal yPay; + + @ExcelProperty(value = "三方操作费") + private BigDecimal thirdOperationFee; + + @ExcelProperty(value = "送货方式") + private String deliveryWay; + + @ExcelProperty(value = "紧急度") + private String urgency; + + @ExcelProperty(value = "回单数") + private Integer receiptNum; + + @ExcelProperty(value = "运输方式") + private String transportType; + + @ExcelProperty(value = "经办人") + private String agent; + + @ExcelProperty(value = "创建时间") + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @ExcelProperty(value = "制单时间") + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date documentMakingTime; + + @ExcelIgnore + private Integer pickupCompleteOrNot; + @ExcelProperty(value = "提货是否整车") + private String pickupCompleteOrNotStr; + + @ExcelIgnore + private Integer trunklineCompleteOrNot; + @ExcelProperty(value = "干线是否整车") + private String trunklineCompleteOrNotStr; + + @ExcelProperty(value = "运单状态") + private String waybillStatus; + + + @ExcelIgnore + private Integer freezeStatus; + @ExcelProperty(value = "是否冻结") + private String freezeStatusStr; + + @ExcelProperty(value = "冻结人") + private String freezeUserName; + + @ExcelProperty(value = "冻结时间") + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date freezeTime; + + @ExcelIgnore + private Integer abolishStatus; + @ExcelProperty(value = "是否作废") + private String abolishStatusStr; + + @ExcelProperty(value = "作废人") + private String abolishUserName; + + @ExcelProperty(value = "作废时间") + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date abolishTime; + +} diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/WarehousePackageTrackLogVO.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/WarehousePackageTrackLogVO.java new file mode 100644 index 000000000..3da6e1fd5 --- /dev/null +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/WarehousePackageTrackLogVO.java @@ -0,0 +1,11 @@ +package com.logpm.warehouse.vo; + +import com.logpm.warehouse.entity.WarehousePackageTrackLogEntity; +import lombok.Data; + +@Data +public class WarehousePackageTrackLogVO extends WarehousePackageTrackLogEntity { + + private String workNodeName; + +} diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/WarehouseRetentionRecordVO.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/WarehouseRetentionRecordVO.java index 0885c3974..df0135c8d 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/WarehouseRetentionRecordVO.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/WarehouseRetentionRecordVO.java @@ -22,6 +22,7 @@ import com.logpm.warehouse.entity.WarehouseRetentionRecordEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import java.io.Serializable; import java.util.List; /** @@ -31,8 +32,7 @@ import java.util.List; * @since 2023-08-09 */ @Data -@EqualsAndHashCode(callSuper = true) -public class WarehouseRetentionRecordVO extends WarehouseRetentionRecordEntity { +public class WarehouseRetentionRecordVO implements Serializable { private static final long serialVersionUID = 1L; diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/WarehouseWaybillVO.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/WarehouseWaybillVO.java index b1cde7216..c2bba391e 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/WarehouseWaybillVO.java +++ b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/vo/WarehouseWaybillVO.java @@ -38,5 +38,11 @@ public class WarehouseWaybillVO extends WarehouseWaybillEntity { List detailList = new ArrayList<>(); private Integer handleNum; + private Integer noBillladingNum; + + private Integer planNum; + private Integer totalPlanNum; + + private Long waybillId; } diff --git a/blade-service-api/pom.xml b/blade-service-api/pom.xml index dc1b047fa..6ff42ac06 100644 --- a/blade-service-api/pom.xml +++ b/blade-service-api/pom.xml @@ -42,6 +42,11 @@ logpm-report-api logpm-factory-data-api logpm-factory-data-base-api + + logpm-factory-data-zbom-api + + + logpm-business-api diff --git a/blade-service/logpm-aftersales/Dockerfile b/blade-service/logpm-aftersales/Dockerfile index 7bab3d05c..2340cbac8 100644 --- a/blade-service/logpm-aftersales/Dockerfile +++ b/blade-service/logpm-aftersales/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-aftersales/pom.xml b/blade-service/logpm-aftersales/pom.xml index 62827fe63..e07240650 100644 --- a/blade-service/logpm-aftersales/pom.xml +++ b/blade-service/logpm-aftersales/pom.xml @@ -83,6 +83,25 @@ 3.2.0.RELEASE compile + + + org.springblade + logpm-warehouse-api + 3.2.0.RELEASE + compile + + + org.springblade + logpm-warehouse-api + 3.2.0.RELEASE + compile + + + org.springblade + logpm-warehouse-api + 3.2.0.RELEASE + compile + diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/AftersalesApplication.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/AftersalesApplication.java index dac63b988..ed1163063 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/AftersalesApplication.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/AftersalesApplication.java @@ -19,9 +19,7 @@ package com.logpm.aftersales; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.cloud.client.BladeCloudApplication; import org.springblade.core.launch.BladeApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.web.socket.config.annotation.EnableWebSocket; -import org.springframework.web.socket.server.standard.ServerEndpointExporter; +import org.springblade.core.transaction.annotation.SeataCloudApplication; /** * Demo启动器 @@ -36,6 +34,7 @@ public class AftersalesApplication { BladeApplication.run(ModuleNameConstant.APPLICATION_AFTERSALES_NAME, AftersalesApplication.class, args); } + /** * 如果直接使用springboot的内置容器,而不是使用独立的servlet容器,就要注入ServerEndpointExporter,外部容器则不需要。 */ diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..385589b92 --- /dev/null +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.aftersales.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/aspect/JobAnnotationAspect.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/aspect/JobAnnotationAspect.java new file mode 100644 index 000000000..9d2d5e5e1 --- /dev/null +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/aspect/JobAnnotationAspect.java @@ -0,0 +1,84 @@ +package com.logpm.aftersales.aspect; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.AllArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Aspect +@Component +@AllArgsConstructor +public class JobAnnotationAspect { + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + + private final MockLoginService mockLoginService; + + @Around("@annotation(com.xxl.job.core.handler.annotation.XxlJob)") + public Object xxlJobAnnotationMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + + JSONObject jsonObject = mockLogin(); + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.addHeader("Blade-Auth", "bearer "+jsonObject.get("access_token")); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(mockRequest)); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+jsonObject.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + DynamicDataSourceContextHolder.push(jsonObject.getString("tenant_id")); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + + return result; + + + } + + private JSONObject mockLogin() throws InterruptedException { + + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + return data; + } + + +} diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/config/ExecutorConfig.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/config/ExecutorConfig.java new file mode 100644 index 000000000..85a791c17 --- /dev/null +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/config/ExecutorConfig.java @@ -0,0 +1,82 @@ +package com.logpm.aftersales.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + String tenantId = AuthUtil.getTenantId(); + Map all = ThreadLocalUtil.getAll(); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + all.keySet().forEach(key -> ThreadLocalUtil.put(key, all.get(key))); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + String tenantId1 = AuthUtil.getTenantId(); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + all.clear(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesAbnormalPackageController.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesAbnormalPackageController.java index 5076f1275..634343fc1 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesAbnormalPackageController.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesAbnormalPackageController.java @@ -16,6 +16,8 @@ */ package com.logpm.aftersales.controller; +import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -61,6 +63,9 @@ public class AftersalesAbnormalPackageController extends BladeController { private final IAftersalesAbnormalPackageService aftersalesAbnormalPackageService; + + private final IBasicdataWarehouseClient warehouseClient; + /** * 异常处理包件记录 详情 */ @@ -88,7 +93,11 @@ public class AftersalesAbnormalPackageController extends BladeController { @GetMapping("/getAbnormalPackage") @ApiOperationSupport(order = 2) @ApiOperation(value = "查询包件是否处理过的信息", notes = "传入aftersalesAbnormalPackage") - public R> getAbnormalPackage(@ApiIgnore @RequestParam Map aftersalesAbnormalPackage, Query query) { + public R getAbnormalPackage(@ApiIgnore @RequestParam Map aftersalesAbnormalPackage, Query query) { + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if (Func.isEmpty(myCurrentWarehouse)){ + return R.fail(403,"未授权!!!"); + } log.info("查询包件的数据》》》{}",aftersalesAbnormalPackage); List pages = aftersalesAbnormalPackageService.getAbnormalPackage( aftersalesAbnormalPackage,Condition.getPage(query)); return R.data(pages); diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesAbnormalRecordController.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesAbnormalRecordController.java index dd105a242..93c42a23d 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesAbnormalRecordController.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesAbnormalRecordController.java @@ -45,7 +45,7 @@ import java.util.Objects; @Api(value = "异常列表", tags = "异常列表接口") public class AftersalesAbnormalRecordController extends BladeController { - private final IBasicdataWarehouseClient basicdataWarehouseClient; + private final IAftersalesAbnormalRecordService aftersalesAbnormalRecordService; @ResponseBody @@ -58,11 +58,6 @@ public class AftersalesAbnormalRecordController extends BladeController { try{ - //当前登录人选择的仓库 - BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); - if(!Objects.isNull(myCurrentWarehouse)){ - abnormalRecordDTO.setWarehouseId(myCurrentWarehouse.getId()); - } return aftersalesAbnormalRecordService.findPageList(abnormalRecordDTO); }catch (CustomerException e){ log.error(e.message,e); @@ -89,11 +84,7 @@ public class AftersalesAbnormalRecordController extends BladeController { return R.fail(405,"异常id为空"); } - //当前登录人选择的仓库 - BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); - if(!Objects.isNull(myCurrentWarehouse)){ - abnormalRecordDTO.setWarehouseId(myCurrentWarehouse.getId()); - } + return aftersalesAbnormalRecordService.dealAbnormal(abnormalRecordDTO); }catch (CustomerException e){ diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesReturnRecordController.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesReturnRecordController.java index 188ea2222..237a5b458 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesReturnRecordController.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesReturnRecordController.java @@ -137,11 +137,26 @@ public class AftersalesReturnRecordController extends BladeController { if(aftersalesReturnRecord.getProcessorList().isEmpty()){ return R.fail("请选择打回的营业部!"); } - aftersalesReturnRecord.setTypesOf(ReturnRecordTypesOfStatusConstant.yibandahui.getValue()); +// aftersalesReturnRecord.setTypesOf(ReturnRecordTypesOfStatusConstant.yibandahui.getValue()); return R.status(aftersalesReturnRecordService.batchRepulse(aftersalesReturnRecord)); } - + /** + * 客服异常工单 已完结数据打回操作 + */ + @PostMapping("/batchRepulseCompleted") + @ApiOperationSupport(order = 4) + @ApiOperation(value = "异常工单 已完结数据打回操作", notes = "传入aftersalesWorkOrder") + public R batchRepulseCompleted(@Valid @RequestBody AftersalesReturnRecordDTO aftersalesReturnRecord) { + if(aftersalesReturnRecord.getWorkOrderIds().isEmpty()){ + return R.fail("请选择工单!"); + } +// if(aftersalesReturnRecord.getProcessorList().isEmpty()){ +// return R.fail("请选择打回的营业部!"); +// } + aftersalesReturnRecord.setTypesOf(ReturnRecordTypesOfStatusConstant.wanjeidahui.getValue()); + return R.status(aftersalesReturnRecordService.batchRepulseCompleted(aftersalesReturnRecord)); + } /** * 客服异常工单 已完结数据打回操作 @@ -153,9 +168,9 @@ public class AftersalesReturnRecordController extends BladeController { if(aftersalesReturnRecord.getWorkOrderIds().isEmpty()){ return R.fail("请选择工单!"); } - if(aftersalesReturnRecord.getProcessorList().isEmpty()){ - return R.fail("请选择打回的营业部!"); - } +// if(aftersalesReturnRecord.getProcessorList().isEmpty()){ +// return R.fail("请选择打回的营业部!"); +// } aftersalesReturnRecord.setTypesOf(ReturnRecordTypesOfStatusConstant.wanjeidahui.getValue()); return R.status(aftersalesReturnRecordService.getCompletedReturned(aftersalesReturnRecord)); } diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesWorkOrderController.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesWorkOrderController.java index aa10c699b..72d9df1d2 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesWorkOrderController.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/controller/AftersalesWorkOrderController.java @@ -19,6 +19,7 @@ package com.logpm.aftersales.controller; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.logpm.aftersales.dto.AftersalesWorkOrderDTO; +import com.logpm.aftersales.dto.AftersalesWorkOrderListExcelDTO; import com.logpm.aftersales.entity.AftersaleSurveyRecordEntity; import com.logpm.aftersales.entity.AftersalesAppealEntity; import com.logpm.aftersales.entity.AftersalesSettlementEntity; @@ -122,18 +123,18 @@ public class AftersalesWorkOrderController extends BladeController { public R> getListOwn(@ApiIgnore @RequestParam Map aftersalesWorkOrder, Query query) { log.info("异常工单查询参数》》》{}",aftersalesWorkOrder); try{ - IPage pages = aftersalesWorkOrderService.pageListOwn(aftersalesWorkOrder, Condition.getPage(query)); - - R> data = R.data(AftersalesWorkOrderWrapper.build().pageVO(pages)); - BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); - if (ObjectUtils.isNotNull(myCurrentWarehouse)){ - data.getData().getRecords().forEach(item -> { - item.setTotalAmount(aftersalesCompletionRecordService.getTotalMoney(item,myCurrentWarehouse.getId())); - }); - }else{ - log.info("查询人不属于某个仓库"); - } - return data; + IPage pages = aftersalesWorkOrderService.pageListOwn(aftersalesWorkOrder, Condition.getPage(query)); + +// R> data = R.data(AftersalesWorkOrderWrapper.build().pageVO(pages)); +// BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); +// if (ObjectUtils.isNotNull(myCurrentWarehouse)){ +// data.getData().getRecords().forEach(item -> { +// item.setTotalAmount(aftersalesCompletionRecordService.getTotalMoney(item,myCurrentWarehouse.getId())); +// }); +// }else{ +// log.info("查询人不属于某个仓库"); +// } + return R.data(pages); }catch (Exception e){ log.error("工单查询系统异常》》》{}",e.getMessage()); return R.fail("系统异常!"); @@ -439,8 +440,10 @@ public class AftersalesWorkOrderController extends BladeController { try { return R.status(aftersalesWorkOrderService.updateCompletionEnd(aftersalesWorkOrder)); } catch (ServiceException s){ + s.printStackTrace(); return R.fail(s.getMessage()); } catch (Exception e){ + e.printStackTrace(); log.error("修改完结处理》》》{}",e.getMessage()); return R.fail("系统异常!!!"); } @@ -654,12 +657,6 @@ public class AftersalesWorkOrderController extends BladeController { if(ObjectUtils.isNull( aftersalesWorkOrder.getOrderCode()) ){ throw new ServiceException("订单自编号未填!"); } - if(ObjectUtils.isNull( aftersalesWorkOrder.getFirst()) ){ - throw new ServiceException("一级品类未填!"); - } -// if(ObjectUtils.isNull( aftersalesWorkOrder.getSecondary()) ){ -// throw new ServiceException("二级品类未填!"); -// } } try { aftersalesWorkOrder.setInitiationIdentification("PC"); @@ -725,6 +722,15 @@ public class AftersalesWorkOrderController extends BladeController { ExcelUtil.export(response, "异常工单数据" + DateUtil.time(), "异常工单数据", list, AftersalesWorkOrderExcel.class); } + @GetMapping("/exportAftersalesWorkOrderList") + @ApiOperationSupport(order = 9) + @ApiOperation(value = "导出数据", notes = "传入aftersalesWorkOrder") + public void exportAftersalesWorkOrderList(HttpServletResponse response) { + + AftersalesWorkOrderListExcelDTO aftersalesWorkOrderListExcelDTO = aftersalesWorkOrderService.exportAftersalesWorkOrderList(); +// ExcelUtil.export(response, "异常工单数据" + DateUtil.time(), "异常工单数据", list, AftersalesWorkOrderExcel.class); + } + /** * 导入 批量修改 钉钉流程号、审核人、审核日期,财务理赔入账日期、操作人 */ diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/dto/AbnormalRecordDTO.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/dto/AbnormalRecordDTO.java index 3894ffbbd..e16d56068 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/dto/AbnormalRecordDTO.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/dto/AbnormalRecordDTO.java @@ -3,15 +3,28 @@ package com.logpm.aftersales.dto; import com.logpm.aftersales.entity.AftersalesAbnormalRecordEntity; import lombok.Data; +import java.util.Date; + @Data public class AbnormalRecordDTO extends AftersalesAbnormalRecordEntity { private Long abnormalRecordId; - private Long warehouseId; private Integer pageNum; private Integer pageSize; private Integer dealType; + private String createDateStartStr; + private String createDateEndStr; + + private Date createDateStart; + private Date createDateEnd; + + private String dealDateStartStr; + private String dealDateEndStr; + + private Date dealDateStart; + private Date dealDateEnd; + } diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/dto/AftersalesAppealDTO.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/dto/AftersalesAppealDTO.java index ae13ab355..d7ab92fe8 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/dto/AftersalesAppealDTO.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/dto/AftersalesAppealDTO.java @@ -61,6 +61,10 @@ public class AftersalesAppealDTO extends AftersalesAppealEntity { * 标识 1 仓库 2 总部客服 */ private String identifying; + /** + * 标识 1 仓库 2 总部客服 + */ + private Long createUserId; } diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/dto/AftersalesWorkOrderListExcelDTO.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/dto/AftersalesWorkOrderListExcelDTO.java new file mode 100644 index 000000000..30a6dde1c --- /dev/null +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/dto/AftersalesWorkOrderListExcelDTO.java @@ -0,0 +1,43 @@ +/* + * 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.aftersales.dto; + +import com.logpm.aftersales.entity.*; +import com.logpm.aftersales.excel.AftersalesWorkOrderExcel; +import com.logpm.aftersales.vo.AftersalesAbnormalPackageVO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.List; + +/** + * 客服异常工单 数据传输对象实体类 + * + * @author BladeX + * @since 2023-11-17 + */ +@Data +public class AftersalesWorkOrderListExcelDTO implements Serializable { + private static final long serialVersionUID = 1L; + + + + private List aftersalesWorkOrderExcels; + + +} diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/feign/AftersalesAbnormalRecordClient.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/feign/AftersalesAbnormalRecordClient.java index 62c7f78a6..3e5e07f78 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/feign/AftersalesAbnormalRecordClient.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/feign/AftersalesAbnormalRecordClient.java @@ -1,5 +1,6 @@ package com.logpm.aftersales.feign; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.logpm.aftersales.entity.AftersalesAbnormalRecordEntity; import com.logpm.aftersales.service.IAftersalesAbnormalRecordService; @@ -28,4 +29,24 @@ public class AftersalesAbnormalRecordClient implements IAftersalesAbnormalRecord .eq("abnormal_status",0); return aftersalesAbnormalRecordService.list(queryWrapper); } + + @Override + public JSONObject findListByCarsNoAndUpWarehouseId(String carsNo, Long warehouseId) { + return aftersalesAbnormalRecordService.findListByCarsNoAndUpWarehouseId(carsNo,warehouseId); + } + + @Override + public List findOrderPackageAndAbnormalStatus(String orderPackageCode, String abnormalStatus) { + //查询AftersalesAbnormalRecordEntity的list通过aftersalesAbnormalRecordService使用orderPackageCode和abnormalStatus + //返回list + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_package_code",orderPackageCode) + .eq("abnormal_status",abnormalStatus); + return aftersalesAbnormalRecordService.list(queryWrapper); + } + + @Override + public void updateList(List abnormalRecordEntities) { + aftersalesAbnormalRecordService.updateBatchById(abnormalRecordEntities); + } } diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/feign/AftersalesWorkOrderClient.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/feign/AftersalesWorkOrderClient.java index 11b216158..7a13068a7 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/feign/AftersalesWorkOrderClient.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/feign/AftersalesWorkOrderClient.java @@ -17,6 +17,7 @@ package com.logpm.aftersales.feign; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.aftersales.service.IAftersalesAbnormalPackageService; import lombok.AllArgsConstructor; import org.springblade.core.mp.support.BladePage; import org.springblade.core.mp.support.Condition; @@ -40,6 +41,8 @@ public class AftersalesWorkOrderClient implements IAftersalesWorkOrderClient { private final IAftersalesWorkOrderService aftersalesWorkOrderService; + private final IAftersalesAbnormalPackageService aftersalesAbnormalPackageService; + @Override @GetMapping(TOP) public BladePage top(Integer current, Integer size) { @@ -50,4 +53,16 @@ public class AftersalesWorkOrderClient implements IAftersalesWorkOrderClient { return BladePage.of(page); } + @Override + @GetMapping(UPDATEWORKORDERSTATUS) + public Boolean updateWorkOrderStatus(Long warehouseId ,String orderPackageCode, Integer packageFinish) { + + + // 需要根据包件码和卸车作业节点找到异常工单的ID 0-F0BU 0-F0BO + aftersalesWorkOrderService.updateWorkOrderPackagFinish(warehouseId,orderPackageCode,packageFinish); + + + + return null; + } } diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/jobhandler/AftersalesXxlJob.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/jobhandler/AftersalesXxlJob.java index 30be26ecb..e30c44e74 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/jobhandler/AftersalesXxlJob.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/jobhandler/AftersalesXxlJob.java @@ -1,14 +1,37 @@ package com.logpm.aftersales.jobhandler; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.logpm.aftersales.dto.AftersalesPersonResponsibleDTO; +import com.logpm.aftersales.dto.AftersalesWorkOrderDTO; +import com.logpm.aftersales.entity.AftersalesAbnormalPackageEntity; +import com.logpm.aftersales.entity.AftersalesAbnormalRecordEntity; +import com.logpm.aftersales.entity.AftersalesProcessorEntity; +import com.logpm.aftersales.service.IAftersalesAbnormalRecordService; import com.logpm.aftersales.service.IAftersalesWorkOrderService; +import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.trunkline.entity.TrunklineCarsLoadEntity; +import com.logpm.trunkline.feign.ITrunklineCarsLoadClient; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; +import com.logpm.warehouse.feign.IWarehouseWaybillClient; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.system.entity.Dept; +import org.springblade.system.entity.User; +import org.springblade.system.feign.IDeptClient; +import org.springblade.system.feign.ISysClient; +import org.springblade.system.feign.IUserClient; import org.springframework.stereotype.Component; +import java.util.*; + /** * @author 12702 */ @@ -19,18 +42,227 @@ public class AftersalesXxlJob { private final IAftersalesWorkOrderService aftersalesWorkOrderService; + private final IAftersalesAbnormalRecordService aftersalesAbnormalRecordService; + + private final IUserClient userClient; + private final ISysClient sysClient; + private final IDeptClient deptClient; + + private final IBasicdataWarehouseClient basicdataWarehouseClient; + + private final IWarehouseWaybillClient wallBillOrderService; + + private final ITrunklineCarsLoadClient trunklineCarsLoadClient; + + @XxlJob("syncWarehouseToNew") public ReturnT getIsItTimeout(String param) throws Exception { - logger.info("查询处理超时的数据>>>>>>>>{}",param); + logger.info("查询处理超时的数据>>>>>>>>{}", param); aftersalesWorkOrderService.getIsItTimeout(); return ReturnT.SUCCESS; } @XxlJob("modifyClaimStatus") - public ReturnT updateModifyClaimStatus(String param) throws Exception { - logger.info("修改预账单工单是否可以申述>>>>>>>>{}",param); + public ReturnT updateModifyClaimStatus(String param) throws Exception { + logger.info("修改预账单工单是否可以申述>>>>>>>>{}", param); aftersalesWorkOrderService.updateModifyClaimStatus(); return ReturnT.SUCCESS; } + + /** + * 根据异常列表创建异常工单 + * + * @param param + * @return + * @throws Exception + */ + @XxlJob("autoCreateWorkOrder") + public ReturnT autoCreateWorkOrder(String param) throws Exception { + + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AftersalesAbnormalRecordEntity::getAbnormalType, 4); + queryWrapper.eq(AftersalesAbnormalRecordEntity::getAbnormalStatus, 0); + queryWrapper.eq(AftersalesAbnormalRecordEntity::getSendOrderStatus, 0); + //当前时间 减少72个小时 + queryWrapper.lt(AftersalesAbnormalRecordEntity::getCreateTime, new Date(System.currentTimeMillis() - 72 * 60 * 60 * 1000L)); + List list = aftersalesAbnormalRecordService.list(queryWrapper); + + for (AftersalesAbnormalRecordEntity aftersalesAbnormalRecordEntity : list) { + // 创建异常工单 + logger.info("创建异常工单>>>>>>>>{}", aftersalesAbnormalRecordEntity); + + + AftersalesWorkOrderDTO aftersalesWorkOrder = BeanUtil.copy(aftersalesAbnormalRecordEntity, AftersalesWorkOrderDTO.class); + aftersalesWorkOrder.setId(null); + // 构建创建异常工单VO + BladeUser bladeUser = new BladeUser(); + bladeUser.setUserId(aftersalesAbnormalRecordEntity.getCreateUser()); + + R userR = userClient.userInfoById(bladeUser.getUserId()); + + if (userR.isSuccess()) { + if (userR.getData() != null) { + bladeUser.setUserName(userR.getData().getRealName()); + } + } + bladeUser.setTenantId(aftersalesAbnormalRecordEntity.getTenantId()); + bladeUser.setDeptId(aftersalesAbnormalRecordEntity.getCreateDept() + ""); + + BasicdataWarehouseEntity basicdataWarehouseEntity = new BasicdataWarehouseEntity(); + basicdataWarehouseEntity.setId(aftersalesAbnormalRecordEntity.getWarehouseId()); + basicdataWarehouseEntity.setName(aftersalesAbnormalRecordEntity.getWarehouseName()); + + BasicdataWarehouseEntity warehouseEntity = basicdataWarehouseClient.getEntityWarehouseId(basicdataWarehouseEntity.getId()); + if (ObjectUtil.isNotEmpty(warehouseEntity)) { + basicdataWarehouseEntity.setWarehouseCode(warehouseEntity.getWarehouseCode()); + } + + // 完善数据 + List packageEntityList = new ArrayList<>(); + + AftersalesAbnormalPackageEntity aftersalesAbnormalPackageEntity = new AftersalesAbnormalPackageEntity(); + aftersalesAbnormalPackageEntity.setTenantId(bladeUser.getTenantId()); + aftersalesAbnormalPackageEntity.setCreateUser(bladeUser.getUserId()); + aftersalesAbnormalPackageEntity.setPackageCode(aftersalesAbnormalRecordEntity.getOrderPackageCode()); + aftersalesAbnormalPackageEntity.setWaybillNumber(aftersalesAbnormalRecordEntity.getWaybillNo()); + aftersalesAbnormalPackageEntity.setOrderCode(aftersalesAbnormalRecordEntity.getOrderCode()); + + + packageEntityList.add(aftersalesAbnormalPackageEntity); + aftersalesWorkOrder.setPackageEntityList(packageEntityList); + + + TrunklineCarsLoadEntity entityByCarsNo = trunklineCarsLoadClient.findEntityByCarsNo(aftersalesAbnormalRecordEntity.getCarsNo()); + + aftersalesWorkOrder.setTrainNumber(aftersalesAbnormalRecordEntity.getCarsNo()); + if (ObjectUtil.isNotEmpty(entityByCarsNo)) { + aftersalesWorkOrder.setVehicleRoute(entityByCarsNo.getCarsLineName()); + } + aftersalesWorkOrder.setInitiationIdentification("PC"); + aftersalesWorkOrder.setWorkOrderType("2"); + aftersalesWorkOrder.setDiscoveryNode("3"); + aftersalesWorkOrder.setWaybillNumber(aftersalesAbnormalRecordEntity.getWaybillNo()); + aftersalesWorkOrder.setOrderCode(aftersalesAbnormalRecordEntity.getOrderCode()); + + WarehouseWaybillEntity byWaybillNo = wallBillOrderService.findByWaybillNo(aftersalesWorkOrder.getWaybillNumber()); + if (byWaybillNo != null) { + aftersalesWorkOrder.setWaybillMall(byWaybillNo.getConsignee()); + } + + // 添加责任方 + + // 默认为干线创建运输的始发仓的仓库 + + List processorEntityList = new ArrayList<>(); + + + + //责任方 + AftersalesProcessorEntity aftersalesProcessorEntity = new AftersalesProcessorEntity(); + aftersalesProcessorEntity.setWarehouseId(warehouseEntity.getId()); + aftersalesProcessorEntity.setBusinessId(entityByCarsNo.getStartWarehouseId()); + + BasicdataWarehouseEntity entityWarehouseId = basicdataWarehouseClient.getEntityWarehouseId(entityByCarsNo.getStartWarehouseId()); + + if(entityWarehouseId!=null){ + aftersalesProcessorEntity.setBusinessName(entityWarehouseId.getName()); + } + + aftersalesProcessorEntity.setTypesOf("1"); + aftersalesProcessorEntity.setTenantId(bladeUser.getTenantId()); + aftersalesProcessorEntity.setCreateUser(bladeUser.getUserId()); + aftersalesProcessorEntity.setConditions("1"); + processorEntityList.add(aftersalesProcessorEntity); + + // 处理方 + AftersalesProcessorEntity aftersalesProcessorEntity1 = new AftersalesProcessorEntity(); + aftersalesProcessorEntity1.setWarehouseId(warehouseEntity.getId()); + aftersalesProcessorEntity1.setBusinessName(warehouseEntity.getName()); + aftersalesProcessorEntity1.setBusinessId(warehouseEntity.getId()); + aftersalesProcessorEntity1.setTypesOf("2"); + aftersalesProcessorEntity1.setTenantId(bladeUser.getTenantId()); + aftersalesProcessorEntity1.setCreateUser(bladeUser.getUserId()); + aftersalesProcessorEntity1.setConditions("1"); + processorEntityList.add(aftersalesProcessorEntity1); + + aftersalesWorkOrder.setProcessorEntityList(processorEntityList); + + + + + + //责任人 + List personResponsibleDTO = new ArrayList<>(); + AftersalesPersonResponsibleDTO aftersalesPersonResponsibleDTO = new AftersalesPersonResponsibleDTO(); + aftersalesPersonResponsibleDTO.setTenantId(bladeUser.getTenantId()); + aftersalesPersonResponsibleDTO.setCreateUser(aftersalesAbnormalRecordEntity.getCreateUser()); + aftersalesPersonResponsibleDTO.setTypesOf("1"); + + // 需要获取到仓库的负责人 + Map wareManagerUser = findWareManagerUser(bladeUser.getTenantId(), warehouseEntity.getDepartment()); + + if (wareManagerUser != null) { + aftersalesPersonResponsibleDTO.setPersonResponsibleId(wareManagerUser.get("userId").toString()); + aftersalesPersonResponsibleDTO.setPersonResponsibleName(wareManagerUser.get("userName").toString()); + } +// warehouseEntity = basicdataWarehouseClient.getEntityWarehouseId(aftersalesProcessorEntity.getWarehouseId()); + aftersalesPersonResponsibleDTO.setResponsibilityRatio("100"); + aftersalesPersonResponsibleDTO.setTypesOf("1"); + aftersalesPersonResponsibleDTO.setDifference("1"); + aftersalesPersonResponsibleDTO.setBusinessId(warehouseEntity.getId()); + aftersalesPersonResponsibleDTO.setBusinessName(warehouseEntity.getName()); + personResponsibleDTO.add(aftersalesPersonResponsibleDTO); + + aftersalesWorkOrder.setPersonResponsibleDTO(personResponsibleDTO); + + + aftersalesWorkOrderService.extractedSaveAndUpdate(aftersalesWorkOrder, bladeUser, basicdataWarehouseEntity); + + + // 更新状态 + aftersalesAbnormalRecordEntity.setSendOrderStatus(1); + aftersalesAbnormalRecordService.updateById(aftersalesAbnormalRecordEntity); + } + + + return ReturnT.SUCCESS; + } + + private Map findWareManagerUser(String teandId, Long deptId) { + Map map = null; + R> listR = userClient.userInfoByDept(teandId, deptId); + Long userId = null; + String userName = null; + + if (listR.isSuccess()) { + Dept dept = deptClient.findEntityById(deptId); + List data = listR.getData(); + R roleIs; + if (dept.getDeptCategory() == 4) { + // 获取仓库经理ID + roleIs = sysClient.getRoleIds(teandId, "仓库经理"); + } else if (dept.getDeptCategory() == 5) { + roleIs = sysClient.getRoleIds(teandId, "总部职能"); + } else { + roleIs = new R<>(); + roleIs.setSuccess(false); + } + if (roleIs.isSuccess()) { + String roleId = roleIs.getData(); + for (User datum : data) { + if (datum.getRoleId().contains(roleId)) { + userId = datum.getId(); + userName = datum.getRealName(); + map = new HashMap<>(); + map.put("userId", userId); + map.put("userName", userName); + } + } + } + } + return map; + } + } diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAbnormalPackageMapper.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAbnormalPackageMapper.java index 7062aba4f..b6900a0da 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAbnormalPackageMapper.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAbnormalPackageMapper.java @@ -58,7 +58,9 @@ public interface AftersalesAbnormalPackageMapper extends BaseMapper getAbnormalPackage(@Param("param") AftersalesAbnormalPackageEntity aftersalesAbnormalPackageEntity); + List getAbnormalPackage(@Param("param") AftersalesAbnormalPackageEntity aftersalesAbnormalPackageEntity,@Param("warehouseIds")List warehouseIds); List getTrunklines(@Param("orderPackageCode") String orderPackageCode); List getDeliver(@Param("orderPackageCode") String orderPackageCode); + + void updateAftersalesAbnormalPackageByWorkOrderIdAndPackCodeAndOtherNodex(@Param("workId") Long workId,@Param("orderPackageCode") String orderPackageCode, @Param("packageFinish") Integer packageFinish); } diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAbnormalPackageMapper.xml b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAbnormalPackageMapper.xml index e63bb31a0..9b2acf20a 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAbnormalPackageMapper.xml +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAbnormalPackageMapper.xml @@ -25,6 +25,9 @@ + + update logpm_aftersales_abnormal_package set package_finish = #{packageFinish} where work_order_id = #{workId} and package_code = #{orderPackageCode} + + + diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAppealMapper.xml b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAppealMapper.xml index 04d16d8a6..025614d3f 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAppealMapper.xml +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesAppealMapper.xml @@ -57,7 +57,9 @@ LEFT JOIN logpm_aftersales_completion_record lacr on laa.work_order_id = lacr.work_order_id LEFT JOIN logpm_aftersales_work_order lawo ON lawo.id = lacr.work_order_id laa.is_deleted = 0 - and lacr.warehouse_id = #{param.warehouseId } + + and (lacr.warehouse_id = #{param.warehouseId } or laa.create_user = #{param.createUserId}) + and laa.appeal_people_name = #{param.appealPeopleName} and laa.claimant = #{param.claimant} and lawo.work_order_number = #{param.workOrderNumber} diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesCompletionRecordMapper.xml b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesCompletionRecordMapper.xml index f7f1c4274..e89c32155 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesCompletionRecordMapper.xml +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesCompletionRecordMapper.xml @@ -36,8 +36,16 @@ SELECT * FROM logpm_aftersales_completion_record ${ew.customSqlSegment} diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.java index 2a315d248..0928abf36 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.java @@ -96,4 +96,16 @@ public interface AftersalesWorkOrderMapper extends BaseMapper findWorkOrderByOrderPackageCodeAndWarehouseIdAndOtherNodex(@Param("warehouseId") Long warehouseId, @Param("orderPackageCode") String orderPackageCode, + @Param("workOrderType")int workOrderType, @Param("discoveryNode")int discoveryNode); + + IPage getListSettlementNew(IPage page,@Param("param") AftersalesSettlementEntity aftersalesSettlementEntity); + + + List selectAllAftersalesWorkOrderList(@Param("warehouseIds")List warehouseListIds); + + + List selectWaitAftersalesWorkOrderList(@Param("warehouseIds")List warehouseListIds); + } diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.xml b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.xml index b4e6a9cea..42b91cd6c 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.xml +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.xml @@ -52,16 +52,19 @@ @@ -315,8 +319,8 @@ law.waybill_number, law.order_code, law.train_number, - law.FIRST, - law.secondary, + laap.FIRST, + laap.secondary, law.vehicle_route, law.deliver_goods_time, law.discovery_time, @@ -338,10 +342,12 @@ law.audit_time, law.entry_time, law.operator, - law.brand_name + laap.brand_name FROM logpm_aftersales_processor lap LEFT JOIN logpm_aftersales_work_order law ON lap.work_order_id = law.id + left join logpm_aftersales_abnormal_package laap on laap.work_order_id=law.id + lap.conditions != '3' and lap.is_deleted = 0 and law.id is not null and lap.processing_status in ('1','3') and lap.types_of = '2' and law.work_order_status in ('10','20','30') and law.work_order_status = #{param.workOrderStatusNameS } @@ -352,8 +358,8 @@ and law.work_order_number like concat('%',#{param.workOrderNumber},'%') and law.waybill_number like concat('%',#{param.waybillNumber},'%') and law.order_code like concat('%',#{param.orderCode},'%') - and law.first like concat('%',#{param.first},'%') - and law.secondary like concat('%',#{param.secondary},'%') + and laap.first like concat('%',#{param.first},'%') + and laap.secondary like concat('%',#{param.secondary},'%') and law.waybill_mall like concat('%',#{param.waybillMall},'%') and law.brand_name like concat('%',#{param.brandName},'%') and law.customer_service_name like concat('%',#{param.customerServiceName},'%') @@ -370,7 +376,7 @@ and date_format(from_unixtime(law.audit_time),'%Y-%m-%d') = date_format(#{param.auditTime},'%Y-%m-%d') and date_format(from_unixtime(law.entry_time),'%Y-%m-%d') = date_format(#{param.entryTime},'%Y-%m-%d') and date_format(from_unixtime(law.over_time),'%Y-%m-%d') = date_format(#{param.overTime}),'%Y-%m-%d') - and law.brand_name like concat('%',#{param.brandName},'%') + and laap.brand_name like concat('%',#{param.brandName},'%') @@ -393,9 +399,9 @@ from logpm_aftersales_settlement las las.processing_status = '4' and las.is_deleted = 0 - and las.business_id LIKE CONCAT('%', #{param.businessId}, '%') - and las.business_name LIKE CONCAT('%', #{param.businessName}, '%') - and las.work_order_number LIKE CONCAT('%', #{param.workOrderNumber}, '%') + and las.business_id =#{param.businessId + and las.business_name LIKE CONCAT( #{param.businessName}, '%') + and las.work_order_number LIKE CONCAT( #{param.workOrderNumber}, '%') and las.brand_name LIKE CONCAT('%', #{param.brandName}, '%') and las.mall_name LIKE CONCAT('%', #{param.mallName}, '%') and las.waybill_number LIKE CONCAT('%', #{param.waybillNumber}, '%') @@ -422,6 +428,186 @@ WHERE ldpl.is_deleted = 0 AND ldpl.order_package_code = #{orderCode} + + + + diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/IAftersalesAbnormalRecordService.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/IAftersalesAbnormalRecordService.java index 3714a652c..b19900864 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/IAftersalesAbnormalRecordService.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/IAftersalesAbnormalRecordService.java @@ -1,5 +1,6 @@ package com.logpm.aftersales.service; +import com.alibaba.fastjson.JSONObject; import com.logpm.aftersales.dto.AbnormalRecordDTO; import com.logpm.aftersales.entity.AftersalesAbnormalRecordEntity; import org.springblade.core.mp.base.BaseService; @@ -10,4 +11,5 @@ public interface IAftersalesAbnormalRecordService extends BaseService pageListOwn(Map aftersalesWorkOrder, IPage page); + IPage pageListOwn(Map aftersalesWorkOrder, IPage page); /** * 查询订单超时是否超时未处理 @@ -284,4 +288,16 @@ public interface IAftersalesWorkOrderService extends BaseService getAbnormalPackage(Map aftersalesAbnormalPackage, IPage page) { - BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + List warehouseIds = new ArrayList<>(); + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); AftersalesAbnormalPackageEntity aftersalesAbnormalPackageEntity = JSONObject.parseObject(JSONObject.toJSONString(aftersalesAbnormalPackage), AftersalesAbnormalPackageEntity.class); if(ObjectUtils.isNotNull(myCurrentWarehouse)){ - aftersalesAbnormalPackageEntity.setWarehouseId(myCurrentWarehouse.getId()); + warehouseIds.add(myCurrentWarehouse.getId()); + }else{ + // 获取全部仓库 + for (BasicdataWarehouseEntity basicdataWarehouseEntity : warehouseClient.getMyWarehouseList()) { + warehouseIds.add(basicdataWarehouseEntity.getId()); + } } - - List abnormalPackage = baseMapper.getAbnormalPackage(aftersalesAbnormalPackageEntity); + List abnormalPackage = baseMapper.getAbnormalPackage(aftersalesAbnormalPackageEntity,warehouseIds); abnormalPackage.forEach(i ->{ if (ObjectUtils.isNotNull(i.getPackageCode())){ i.setTrunklines( baseMapper.getTrunklines(i.getPackageCode())); diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesAbnormalRecordServiceImpl.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesAbnormalRecordServiceImpl.java index 99908c77b..2b490a35a 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesAbnormalRecordServiceImpl.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesAbnormalRecordServiceImpl.java @@ -1,21 +1,28 @@ package com.logpm.aftersales.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.logpm.aftersales.dto.AbnormalRecordDTO; import com.logpm.aftersales.entity.AftersalesAbnormalRecordEntity; import com.logpm.aftersales.mapper.AftersalesAbnormalRecordMapper; import com.logpm.aftersales.service.IAftersalesAbnormalRecordService; +import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; import com.logpm.trunkline.feign.ITrunklineCarsLoadScanClient; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.common.utils.CommonUtil; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; @Slf4j @Service @@ -24,19 +31,45 @@ public class AftersalesAbnormalRecordServiceImpl extends BaseServiceImpl page = new Page<>(); page.setCurrent(abnormalRecordDTO.getPageNum()); page.setSize(abnormalRecordDTO.getPageSize()); - IPage pageList = baseMapper.findPageList(page,abnormalRecordDTO); + List warehouseIdList = null; + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + if(!Objects.isNull(myCurrentWarehouse)){ + abnormalRecordDTO.setWarehouseId(myCurrentWarehouse.getId()); + warehouseIdList = new ArrayList<>(); + warehouseIdList.add(myCurrentWarehouse.getId()); + }else { + List myWarehouseList = basicdataWarehouseClient.getMyWarehouseList(); + warehouseIdList = myWarehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + } + + abnormalRecordDTO.setCreateDateStart(CommonUtil.getStartByDateStr(abnormalRecordDTO.getCreateDateStartStr())); + abnormalRecordDTO.setCreateDateEnd(CommonUtil.getEndByDateStr(abnormalRecordDTO.getCreateDateEndStr())); + + abnormalRecordDTO.setDealDateStart(CommonUtil.getStartByDateStr(abnormalRecordDTO.getDealDateStartStr())); + abnormalRecordDTO.setDealDateEnd(CommonUtil.getEndByDateStr(abnormalRecordDTO.getDealDateEndStr())); + + IPage pageList = baseMapper.findPageList(page,abnormalRecordDTO,warehouseIdList); return R.data(pageList); } @Override public R dealAbnormal(AbnormalRecordDTO abnormalRecordDTO) { + + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + if(!Objects.isNull(myCurrentWarehouse)){ + abnormalRecordDTO.setWarehouseId(myCurrentWarehouse.getId()); + } Long abnormalRecordId = abnormalRecordDTO.getAbnormalRecordId(); AftersalesAbnormalRecordEntity abnormalRecordEntity = baseMapper.selectById(abnormalRecordId); if(!Objects.isNull(abnormalRecordEntity)){ @@ -46,7 +79,7 @@ public class AftersalesAbnormalRecordServiceImpl extends BaseServiceImpl iPage = baseMapper.getListAppeal(page,aftersalesAppealDTO); iPage.getRecords().forEach( i ->{ i.setWorkOrderTypeName(DictBizCache.getValue(DictBizConstant.PC_WORK_ORDER,i.getWorkOrderType())); diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesProcessingResultsServiceImpl.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesProcessingResultsServiceImpl.java index c30d7c640..3f1049595 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesProcessingResultsServiceImpl.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesProcessingResultsServiceImpl.java @@ -17,8 +17,10 @@ package com.logpm.aftersales.service.impl; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.logpm.aftersales.dto.AftersalesProcessingResultsDTO; +import com.logpm.aftersales.entity.AftersalesCompletionRecipientEntity; import com.logpm.aftersales.entity.AftersalesProcessingMoneyEntity; import com.logpm.aftersales.entity.AftersalesProcessingResultsEntity; import com.logpm.aftersales.entity.AftersalesWorkOrderEntity; @@ -35,6 +37,7 @@ import org.springblade.common.constant.DictBizConstant; import org.springblade.common.constant.aftersales.WorkOrderStatusConstant; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.support.Condition; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.system.cache.DictBizCache; import org.springframework.beans.factory.annotation.Autowired; @@ -47,6 +50,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Date; import java.util.List; /** @@ -91,6 +95,11 @@ public class AftersalesProcessingResultsServiceImpl extends BaseServiceImpl completionRecipientEntityLambdaUpdateWrapper = Wrappers.lambdaUpdate() + .set(AftersalesProcessingMoneyEntity::getIsDeleted, 1) + .eq(AftersalesProcessingMoneyEntity::getProcessingResultsId, aftersalesProcessingResults.getId()); + aftersalesProcessingMoneyService.update(completionRecipientEntityLambdaUpdateWrapper); if(ObjectUtil.isNotNull(aftersalesProcessingResults.getProcessingMoneyEntityList())){ aftersalesProcessingResults.getProcessingMoneyEntityList().forEach(i ->{ if(ObjectUtil.isNotNull(i.getId()) ){ @@ -122,10 +135,10 @@ public class AftersalesProcessingResultsServiceImpl extends BaseServiceImpl workOrderIds = aftersalesReturnRecord.getWorkOrderIds(); + String reasonReturn = aftersalesReturnRecord.getReasonReturn(); + List returnRecordEntities = new ArrayList<>(); + List workOrderEntities = new ArrayList<>(); + if(CollUtil.isNotEmpty(workOrderIds)){ + for (Long workOrderId : workOrderIds) { + AftersalesReturnRecordEntity returnRecordEntity = new AftersalesReturnRecordEntity(); + BeanUtil.copyProperties(aftersalesReturnRecord,returnRecordEntity); + returnRecordEntities.add(returnRecordEntity); + AftersalesWorkOrderEntity orderEntity = new AftersalesWorkOrderEntity(); + orderEntity.setId(workOrderId); + orderEntity.setWorkOrderStatus(WorkOrderStatusConstant.yichuli.getValue()); + workOrderEntities.add(orderEntity); + + //增加工单记录 + aftersalesWorkOrderService.addSurveyRecord(AuthUtil.getUser(),workOrderId,aftersalesReturnRecord.getReasonReturn(),"3"); + + } + + + + + } + if(CollUtil.isNotEmpty(returnRecordEntities)){ + this.saveBatch(returnRecordEntities); + } + if(CollUtil.isNotEmpty(workOrderEntities)){ + aftersalesWorkOrderService.updateBatchById(workOrderEntities); + } + return true; + } + } diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesWorkOrderServiceImpl.java b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesWorkOrderServiceImpl.java index 718553d4b..6de7491c0 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesWorkOrderServiceImpl.java +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesWorkOrderServiceImpl.java @@ -18,55 +18,49 @@ package com.logpm.aftersales.service.impl; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.logpm.aftersales.bean.Resp; -import com.logpm.aftersales.dto.AftersalesPackageScanDTO; -import com.logpm.aftersales.dto.AftersalesProcessingResultsDTO; -import com.logpm.aftersales.dto.AftersaleSurveyRecordDTO; -import com.logpm.aftersales.dto.AftersalesPersonResponsibleDTO; -import com.logpm.aftersales.dto.AftersalesWorkOrderDTO; +import com.logpm.aftersales.dto.*; import com.logpm.aftersales.entity.*; +import com.logpm.aftersales.excel.AftersalesWorkOrderExcel; +import com.logpm.aftersales.mapper.AftersalesAbnormalPackageMapper; import com.logpm.aftersales.mapper.AftersalesAppealMapper; import com.logpm.aftersales.mapper.AftersalesCustomerMallMapper; +import com.logpm.aftersales.mapper.AftersalesWorkOrderMapper; import com.logpm.aftersales.service.*; import com.logpm.aftersales.vo.*; -import com.logpm.aftersales.excel.AftersalesWorkOrderExcel; -import com.logpm.aftersales.mapper.AftersalesWorkOrderMapper; -import com.logpm.basicdata.entity.BasicdataStoreBusinessEntity; +import com.logpm.aftersales.wrapper.AftersalesWorkOrderWrapper; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; import com.logpm.basicdata.feign.IBasicdataStoreBusinessClient; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; -import com.logpm.distribution.entity.DistributionDeliveryListEntity; import com.logpm.distribution.feign.IDistributionDeliveryListClient; import com.logpm.distribution.vo.DistributionDeliveryListVO; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; +import org.springblade.common.annotations.LogpmAsync; import org.springblade.common.constant.DictBizConstant; import org.springblade.common.constant.DictTimeoutEnum; import org.springblade.common.constant.aftersales.*; import org.springblade.core.log.exception.ServiceException; -import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; -import org.springblade.core.tool.constant.BladeConstant; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.Func; import org.springblade.system.cache.DictBizCache; import org.springblade.system.entity.DictBiz; import org.springblade.system.entity.User; import org.springblade.system.feign.ISysClient; +import org.springblade.system.feign.IUserClient; import org.springblade.system.feign.IUserSearchClient; -import org.springframework.context.annotation.Lazy; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import com.baomidou.mybatisplus.core.metadata.IPage; -import org.springblade.core.mp.base.BaseServiceImpl; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; @@ -90,6 +84,7 @@ import java.util.stream.Collectors; public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl implements IAftersalesWorkOrderService { private final IAftersalesAbnormalPackageService aftersalesAbnormalPackageService; + private final AftersalesAbnormalPackageMapper aftersalesAbnormalPackageMapper; private final IAftersalesDecreaseImageService aftersalesDecreaseImageService; private final IAftersalesProcessorService aftersalesProcessorService; private final IAftersalesCompletionRecordService completionRecordService; @@ -104,7 +99,6 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl selectAftersalesWorkOrderPage(IPage page, AftersalesWorkOrderVO aftersalesWorkOrder) { return page.setRecords(baseMapper.selectAftersalesWorkOrderPage(page, aftersalesWorkOrder)); @@ -323,13 +318,20 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl 0) { + String string = aftersalesWorkOrder.getVehicleRoute().replaceAll(">", ">"); + aftersalesWorkOrder.setVehicleRoute(string); + } + } + baseMapper.insert(aftersalesWorkOrder); } else { //修改 - if (ObjectUtil.isNotNull(aftersalesWorkOrder.getUnPpackageEntityList())) { - //删除修改包件 - aftersalesAbnormalPackageService.deleteLogic(aftersalesWorkOrder.getUnPpackageEntityList()); - } - if (ObjectUtil.isNotNull(aftersalesWorkOrder.getUnProcessorEntityList())) { - //责任方 处理方 -// List list = new ArrayList<>(); - aftersalesWorkOrder.getUnProcessorEntityList().forEach(i -> { - AftersalesProcessorEntity processorEntity = new AftersalesProcessorEntity(); - processorEntity.setId(i); - processorEntity.setConditions("3"); - if (ObjectUtils.isNotNull(aftersalesWorkOrder.getProcessorEntityList())) { - aftersalesWorkOrder.getProcessorEntityList().stream().collect(Collectors.groupingBy(AftersalesProcessorEntity::getTypesOf)) - .forEach((k, v) -> { - if ("1".equals(k)) { - //责任人 - String collect = v.stream().map(AftersalesProcessorEntity::getBusinessName).collect(Collectors.joining(",")); - aftersalesWorkOrder.setResponsiblePerson(collect); - } else { - String collect = v.stream().map(AftersalesProcessorEntity::getBusinessName).collect(Collectors.joining(",")); - aftersalesWorkOrder.setProcessedBy(collect); - } - - }); - } - aftersalesProcessorService.updateById(processorEntity); -// list.add(processorEntity); - }); -// if(!list.isEmpty()){ -// aftersalesProcessorService.saveOrUpdateBatch(list); -// } - } - if (ObjectUtil.isNotNull(aftersalesWorkOrder.getUnDecreaseImageEntityList()) && !aftersalesWorkOrder.getUnDecreaseImageEntityList().isEmpty()) { - //图片修改 - aftersalesDecreaseImageService.deleteLogic(aftersalesWorkOrder.getUnDecreaseImageEntityList()); - } +// if (ObjectUtil.isNotNull(aftersalesWorkOrder.getUnPpackageEntityList())) { + //删除修改包件 +// aftersalesAbnormalPackageService.deleteLogic(aftersalesWorkOrder.getUnPpackageEntityList()); +// } + LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate() + .set(AftersalesAbnormalPackageEntity::getIsDeleted, 1) + .eq(AftersalesAbnormalPackageEntity::getWorkOrderId, aftersalesWorkOrder.getId()); + aftersalesAbnormalPackageService.update(updateWrapper); +// if (ObjectUtil.isNotNull(aftersalesWorkOrder.getUnProcessorEntityList())) { +// //责任方 处理方 +//// List list = new ArrayList<>(); +// aftersalesWorkOrder.getUnProcessorEntityList().forEach(i -> { +// AftersalesProcessorEntity processorEntity = new AftersalesProcessorEntity(); +// processorEntity.setId(i); +// processorEntity.setConditions("3"); +// if (ObjectUtils.isNotNull(aftersalesWorkOrder.getProcessorEntityList())) { +// aftersalesWorkOrder.getProcessorEntityList().stream().collect(Collectors.groupingBy(AftersalesProcessorEntity::getTypesOf)) +// .forEach((k, v) -> { +// if ("1".equals(k)) { +// //责任人 +// String collect = v.stream().map(AftersalesProcessorEntity::getBusinessName).collect(Collectors.joining(",")); +// aftersalesWorkOrder.setResponsiblePerson(collect); +// } else { +// String collect = v.stream().map(AftersalesProcessorEntity::getBusinessName).collect(Collectors.joining(",")); +// aftersalesWorkOrder.setProcessedBy(collect); +// } +// +// }); +// } +// aftersalesProcessorService.updateById(processorEntity); +//// list.add(processorEntity); +// }); +//// if(!list.isEmpty()){ +//// aftersalesProcessorService.saveOrUpdateBatch(list); +//// } +// } + LambdaUpdateWrapper processorEntityLambdaUpdateWrapper = Wrappers.lambdaUpdate() + .set(AftersalesProcessorEntity::getIsDeleted, 1) + .eq(AftersalesProcessorEntity::getWorkOrderId, aftersalesWorkOrder.getId()); + aftersalesProcessorService.update(processorEntityLambdaUpdateWrapper); +// if (ObjectUtil.isNotNull(aftersalesWorkOrder.getUnDecreaseImageEntityList()) && !aftersalesWorkOrder.getUnDecreaseImageEntityList().isEmpty()) { +// //图片修改 +// aftersalesDecreaseImageService.deleteLogic(aftersalesWorkOrder.getUnDecreaseImageEntityList()); +// } + LambdaUpdateWrapper imageEntityLambdaUpdateWrapper = Wrappers.lambdaUpdate() + .set(AftersalesDecreaseImageEntity::getIsDeleted, 1) + .eq(AftersalesDecreaseImageEntity::getWorkOrderId, aftersalesWorkOrder.getId()); + aftersalesDecreaseImageService.update(imageEntityLambdaUpdateWrapper); //修改调查经过 if (ObjectUtils.isNotNull(aftersalesWorkOrder.getSurveyRecordDTO())) { aftersalesWorkOrder.setInvestigationProcess(aftersalesWorkOrder.getSurveyRecordDTO().getContent()); } //修改责任方 - if (ObjectUtils.isNotNull(aftersalesWorkOrder.getUnPersonResponsibleDTO())) { - aftersalesPersonResponsibleService.deleteLogic(aftersalesWorkOrder.getUnPersonResponsibleDTO()); - } +// if (ObjectUtils.isNotNull(aftersalesWorkOrder.getUnPersonResponsibleDTO())) { +// aftersalesPersonResponsibleService.deleteLogic(aftersalesWorkOrder.getUnPersonResponsibleDTO()); +// } + LambdaUpdateWrapper personResponsibleEntityLambdaUpdateWrapper = Wrappers.lambdaUpdate() + .set(AftersalesPersonResponsibleEntity::getIsDeleted, 1) + .eq(AftersalesPersonResponsibleEntity::getWordOrderId, aftersalesWorkOrder.getId()); + aftersalesPersonResponsibleService.update(personResponsibleEntityLambdaUpdateWrapper); //修改赔款方 - if (ObjectUtils.isNotNull(aftersalesWorkOrder.getUnCompletionRecordEntities())) { - completionRecordService.deleteLogic(aftersalesWorkOrder.getUnCompletionRecordEntities()); - } +// if (ObjectUtils.isNotNull(aftersalesWorkOrder.getUnCompletionRecordEntities())) { +// completionRecordService.deleteLogic(aftersalesWorkOrder.getUnCompletionRecordEntities()); +// } + LambdaUpdateWrapper completionRecordEntityLambdaUpdateWrapper = Wrappers.lambdaUpdate() + .set(AftersalesCompletionRecordEntity::getIsDeleted, 1) + .eq(AftersalesCompletionRecordEntity::getWorkOrderId, aftersalesWorkOrder.getId()); + completionRecordService.update(completionRecordEntityLambdaUpdateWrapper); //修改收款方 - if (ObjectUtils.isNotNull(aftersalesWorkOrder.getUnCompletionRecipientEntities())) { - completionRecipientService.deleteLogic(aftersalesWorkOrder.getUnCompletionRecipientEntities()); - } +// if (ObjectUtils.isNotNull(aftersalesWorkOrder.getUnCompletionRecipientEntities())) { +// completionRecipientService.deleteLogic(aftersalesWorkOrder.getUnCompletionRecipientEntities()); +// } + LambdaUpdateWrapper completionRecipientEntityLambdaUpdateWrapper = Wrappers.lambdaUpdate() + .set(AftersalesCompletionRecipientEntity::getIsDeleted, 1) + .eq(AftersalesCompletionRecipientEntity::getWorkOrderId, aftersalesWorkOrder.getId()); + completionRecipientService.update(completionRecipientEntityLambdaUpdateWrapper); // baseMapper.updateById(aftersalesWorkOrder); - - } //添加包件信息 if (ObjectUtils.isNotNull(aftersalesWorkOrder.getPackageEntityList())) { + List packageEntityList = aftersalesWorkOrder.getPackageEntityList(); + if (!packageEntityList.isEmpty()) { + List collect = packageEntityList.stream().filter(f -> Objects.isNull(f.getFirst())).map(AftersalesAbnormalPackageEntity::getPackageCode).collect(Collectors.toList()); + if (!collect.isEmpty()) { + throw new RuntimeException(collect.stream().collect(Collectors.joining(",")) + "无一级品信息"); + } + } //包件信息 List list = new ArrayList<>(); aftersalesWorkOrder.getPackageEntityList().forEach(i -> { @@ -577,6 +615,8 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpllambdaQuery().eq(AftersalesCompletionRecordEntity::getWorkOrderId, v.getId())); completionRecordService.saveBatch(v.getCompletionRecordEntities()); //添加受款方信息,可以为空 if (ObjectUtils.isNotNull(v.getCompletionRecipientEntities())) { + completionRecipientService.remove(Wrappers.lambdaQuery().eq(AftersalesCompletionRecipientEntity::getWorkOrderId, v.getId())); completionRecipientService.saveBatch(v.getCompletionRecipientEntities()); } //修改工单异常待审核状态 @@ -661,7 +703,7 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl pageListOwn(Map aftersalesWorkOrder, IPage page) { +// //查询用户角色信息 +// BladeUser user = AuthUtil.getUser(); +// String roleName = user.getRoleName(); +// +// String tenantId = user.getTenantId(); +// // 查询 状态条件 +// //查询客服岗位 +// List warehouseType = DictBizCache.getList("after_sales_visits"); +// if (warehouseType.isEmpty()) { +// throw new ServiceException("注意,注意!售后访问字典未配置!请配置!"); +// } else { +// Optional first = warehouseType.stream().filter(i -> { +// if (i.getDictValue().equals(roleName)) { +// return true; +// } +// return false; +// }).findFirst(); +// Object workOrderStatus = aftersalesWorkOrder.get("workOrderStatus"); +// if (first.isPresent()) { +// //存在 +// String dictValue = first.get().getDictKey(); +// +// switch (dictValue) { +// case "1": //客服经理 查询全部待处理工单 +// //待处理 +// if (ObjectUtils.isNotNull(workOrderStatus) && "500".equals(workOrderStatus)) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("customerServiceState", "30"); +// } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.daichuli.getValue().equals(workOrderStatus)) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("customerServiceState", "80"); //55的待审核 +// } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.yichuli.getValue().equals(workOrderStatus)) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("customerServiceState", "60"); //55的待审核 +// } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.yiwanjei.getValue().equals(workOrderStatus)) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("customerServiceState", "10"); +// } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.daishenhe.getValue().equals(workOrderStatus)) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("customerServiceState", "40"); +// } else if (ObjectUtils.isNull(workOrderStatus)) { +// aftersalesWorkOrder.put("customerIdentification", "1"); +// } +// break; +// case "2": // 营业部客服 +// BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); +// if (ObjectUtils.isNotNull(myCurrentWarehouse)) { +// aftersalesWorkOrder.put("warehouseId", myCurrentWarehouse.getId()); +// } else { +// throw new ServiceException("请选择仓库!"); +// } +// //已处理 +// if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yichuli.getValue())) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("handleStatus", "30"); +// } +// //待处理 +// if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.daichuli.getValue())) { +// aftersalesWorkOrder.put("handleStatus", "40"); +// } +// //处理中 +// if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.chulizhong.getValue())) { +// aftersalesWorkOrder.put("handleStatus", "50"); +// } +// //已完结 +// if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yiwanjei.getValue())) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("handleStatus", "20"); +// } +// //全部 +// if (ObjectUtils.isNotNull(workOrderStatus) && "1000".equals(workOrderStatus)) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("handleStatus", "10"); +// } +//// if( ObjectUtils.isNull(workOrderStatus)){ +//// aftersalesWorkOrder.put("handleStatus","10"); +//// } +// +// break; +// case "3": //职能客服 查询自己的待处理工单 +// if (ObjectUtils.isNotNull(workOrderStatus) && "500".equals(workOrderStatus)) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("customerServiceState", "20"); +// aftersalesWorkOrder.put("customerServiceId", user.getUserId()); +// } else if (ObjectUtils.isNull(workOrderStatus)) { +// aftersalesWorkOrder.put("customerIdentification", "1"); +// } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.yiwanjei.getValue().equals(workOrderStatus)) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("customerServiceState", "10"); +// } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.daichuli.getValue().equals(workOrderStatus)) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("customerServiceState", "31"); // 待处理 +// aftersalesWorkOrder.put("customerServiceId", user.getUserId()); +// } +// break; +// } +// } else { +// //不存在 +// BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); +// if (ObjectUtils.isNotNull(myCurrentWarehouse)) { +// aftersalesWorkOrder.put("warehouseId", myCurrentWarehouse.getId()); +// } else { +// throw new ServiceException("请选择仓库!"); +// } +// //已处理 +// if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yichuli.getValue())) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("handleStatus", "30"); +// } +// //待处理 +// if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.daichuli.getValue())) { +// aftersalesWorkOrder.put("handleStatus", "40"); +// } +// //处理中 +// if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.chulizhong.getValue())) { +// aftersalesWorkOrder.put("handleStatus", "50"); +// } +// //已完结 +// if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yiwanjei.getValue())) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("handleStatus", "20"); +// } +// //全部 +// if (ObjectUtils.isNotNull(workOrderStatus) && "1000".equals(workOrderStatus)) { +// aftersalesWorkOrder.remove("workOrderStatus"); +// aftersalesWorkOrder.put("handleStatus", "10"); +// } +// } +// } +// AftersalesWorkOrderEntity workOrderEntity = JSONObject.parseObject(JSONObject.toJSONString(aftersalesWorkOrder), AftersalesWorkOrderEntity.class); +// IPage iPage = baseMapper.pageListOwn(page, workOrderEntity); +// +// +// iPage.getRecords().forEach(i -> { +// if (ObjectUtils.isNotNull(i.getCustomerServiceId())) { +// R> listR = userSearchClient.listByUser(String.valueOf(i.getCustomerServiceId())); +// if (ObjectUtils.isNotNull(listR.getData())) { +// listR.getData().forEach(a -> { +// long time = System.currentTimeMillis() / 1000; //当前时间 +// if (ObjectUtils.isNotNull(a.getDownTime())) { +// long l = a.getDownTime().getTime() / 1000; //停用时间 +// if (l <= time) { +// // 已停用 +// i.setDepartStatus(true); //已离职 +// } +// } +// +// }); +// +// } +// } +// }); +// +// return iPage; +// } + + /** * 查询异常完整数据集合 * @@ -682,162 +889,241 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl pageListOwn(Map aftersalesWorkOrder, IPage page) { - //查询用户角色信息 + public IPage pageListOwn(Map aftersalesWorkOrder, IPage page) { + // 查询用户角色信息 BladeUser user = AuthUtil.getUser(); + if (user == null) { + throw new ServiceException("用户信息获取失败"); + } String roleName = user.getRoleName(); - String tenantId = user.getTenantId(); - // 查询 状态条件 - //查询客服岗位 + + // 查询 状态条件 List warehouseType = DictBizCache.getList("after_sales_visits"); if (warehouseType.isEmpty()) { throw new ServiceException("注意,注意!售后访问字典未配置!请配置!"); - } else { - Optional first = warehouseType.stream().filter(i -> { - if (i.getDictValue().equals(roleName)) { - return true; - } - return false; - }).findFirst(); - Object workOrderStatus = aftersalesWorkOrder.get("workOrderStatus"); - if (first.isPresent()) { - //存在 - String dictValue = first.get().getDictKey(); + } + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); - switch (dictValue) { - case "1": //客服经理 查询全部待处理工单 - //待处理 - if (ObjectUtils.isNotNull(workOrderStatus) && "500".equals(workOrderStatus)) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("customerServiceState", "30"); - } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.daichuli.getValue().equals(workOrderStatus)) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("customerServiceState", "80"); //55的待审核 - }else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.yichuli.getValue().equals(workOrderStatus)) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("customerServiceState", "60"); //55的待审核 - } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.yiwanjei.getValue().equals(workOrderStatus)) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("customerServiceState", "10"); - } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.daishenhe.getValue().equals(workOrderStatus)) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("customerServiceState", "40"); - } else if (ObjectUtils.isNull(workOrderStatus)) { - aftersalesWorkOrder.put("customerIdentification", "1"); - } - break; - case "2": // 营业部客服 - BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); - if (ObjectUtils.isNotNull(myCurrentWarehouse)) { - aftersalesWorkOrder.put("warehouseId", myCurrentWarehouse.getId()); - } else { - throw new ServiceException("请选择仓库!"); - } - //已处理 - if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yichuli.getValue())) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("handleStatus", "30"); - } - //待处理 - if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.daichuli.getValue())) { - aftersalesWorkOrder.put("handleStatus", "40"); - } - //处理中 - if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.chulizhong.getValue())) { - aftersalesWorkOrder.put("handleStatus", "50"); - } - //已完结 - if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yiwanjei.getValue())) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("handleStatus", "20"); - } - //全部 - if (ObjectUtils.isNotNull(workOrderStatus) && "1000".equals(workOrderStatus)) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("handleStatus", "10"); - } -// if( ObjectUtils.isNull(workOrderStatus)){ -// aftersalesWorkOrder.put("handleStatus","10"); -// } + if (Func.isEmpty(myCurrentWarehouse)) { + log.warn(">>>>myCurrentWarehouse {}",myCurrentWarehouse); + } - break; - case "3": //职能客服 查询自己的待处理工单 - if (ObjectUtils.isNotNull(workOrderStatus) && "500".equals(workOrderStatus)) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("customerServiceState", "20"); - aftersalesWorkOrder.put("customerServiceId", user.getUserId()); - } else if (ObjectUtils.isNull(workOrderStatus)) { - aftersalesWorkOrder.put("customerIdentification", "1"); - } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.yiwanjei.getValue().equals(workOrderStatus)) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("customerServiceState", "10"); - } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.daichuli.getValue().equals(workOrderStatus)) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("customerServiceState", "31"); // 待处理 - aftersalesWorkOrder.put("customerServiceId", user.getUserId()); - } - break; - } - } else { - //不存在 - BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); - if (ObjectUtils.isNotNull(myCurrentWarehouse)) { - aftersalesWorkOrder.put("warehouseId", myCurrentWarehouse.getId()); - } else { - throw new ServiceException("请选择仓库!"); - } - //已处理 - if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yichuli.getValue())) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("handleStatus", "30"); - } - //待处理 - if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.daichuli.getValue())) { - aftersalesWorkOrder.put("handleStatus", "40"); - } - //处理中 - if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.chulizhong.getValue())) { - aftersalesWorkOrder.put("handleStatus", "50"); - } - //已完结 - if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yiwanjei.getValue())) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("handleStatus", "20"); - } - //全部 - if (ObjectUtils.isNotNull(workOrderStatus) && "1000".equals(workOrderStatus)) { - aftersalesWorkOrder.remove("workOrderStatus"); - aftersalesWorkOrder.put("handleStatus", "10"); - } + Optional matchingDictBiz = warehouseType.stream() + .filter(i -> i.getDictValue().equals(roleName)) + .findFirst(); + + Object workOrderStatus = aftersalesWorkOrder.get("workOrderStatus"); + if (matchingDictBiz.isPresent()) { + String dictValue = matchingDictBiz.get().getDictKey(); + switch (dictValue) { + case "1": // 客服经理 + updateWorkOrderForManager(aftersalesWorkOrder, workOrderStatus); + break; + case "2": // 营业部客服 + updateWorkOrderForSales(aftersalesWorkOrder, workOrderStatus); + break; + case "3": // 职能客服 + updateWorkOrderForFunctional(aftersalesWorkOrder, workOrderStatus, user.getUserId()); + break; } + } else { + updateWorkOrderForOthers(aftersalesWorkOrder, workOrderStatus); } + AftersalesWorkOrderEntity workOrderEntity = JSONObject.parseObject(JSONObject.toJSONString(aftersalesWorkOrder), AftersalesWorkOrderEntity.class); IPage iPage = baseMapper.pageListOwn(page, workOrderEntity); + if (iPage.getRecords().isEmpty()) { + log.error(">>>>>>>>>>>>>>>>>>查询工单列表为空"); + IPage data = AftersalesWorkOrderWrapper.build().pageVO(iPage); + return data; + } + // 获取售后工单的ID 集合 + List workOrderIds = iPage.getRecords().stream().map(AftersalesWorkOrderEntity::getId).collect(Collectors.toList()); + + + // 查询收款方 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(AftersalesCompletionRecipientEntity::getWorkOrderId,workOrderIds); + List list = completionRecipientService.list(queryWrapper); + + // 收款方分组 + Map> collect = list.stream().collect(Collectors.groupingBy(AftersalesCompletionRecipientEntity::getWorkOrderId)); + + // 查询赔款方 + LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper<>(); + queryWrapper1.in(AftersalesCompletionRecordEntity::getWorkOrderId,workOrderIds); + List list1 = completionRecordService.list(queryWrapper1); + // 赔款方付款分组 + Map> collect1 = list1.stream().collect(Collectors.groupingBy(AftersalesCompletionRecordEntity::getWorkOrderId)); + + + IPage data = AftersalesWorkOrderWrapper.build().pageVO(iPage); + + data.getRecords().forEach(i -> updateDepartStatus(i, user,myCurrentWarehouse,collect,collect1)); - iPage.getRecords().forEach(i -> { - if (ObjectUtils.isNotNull(i.getCustomerServiceId())) { - R> listR = userSearchClient.listByUser(String.valueOf(i.getCustomerServiceId())); - if (ObjectUtils.isNotNull(listR.getData())) { - listR.getData().forEach(a -> { - long time = new Date().getTime() / 1000; //当前时间 - if (ObjectUtils.isNotNull(a.getDownTime())) { - long l = a.getDownTime().getTime() / 1000; //停用时间 - if (l <= time) { - // 已停用 - i.setDepartStatus(true); //已离职 - } - } - }); + + return data; + } + + private void updateWorkOrderForManager(Map aftersalesWorkOrder, Object workOrderStatus) { + // 对客服经理的工单状态更新逻辑 + // 优化后的代码根据实际情况进行填充 + //待处理 + if (ObjectUtils.isNotNull(workOrderStatus) && "500".equals(workOrderStatus)) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("customerServiceState", "30"); + } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.daichuli.getValue().equals(workOrderStatus)) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("customerServiceState", "80"); //55的待审核 + } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.yichuli.getValue().equals(workOrderStatus)) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("customerServiceState", "60"); //55的待审核 + } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.yiwanjei.getValue().equals(workOrderStatus)) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("customerServiceState", "10"); + } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.daishenhe.getValue().equals(workOrderStatus)) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("customerServiceState", "40"); + } else if (ObjectUtils.isNull(workOrderStatus)) { + aftersalesWorkOrder.put("customerIdentification", "1"); + } + + + } + + private void updateWorkOrderForSales(Map aftersalesWorkOrder, Object workOrderStatus) { + // 对营业部客服的工单状态更新逻辑 + // 优化后的代码根据实际情况进行填充 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if (ObjectUtils.isNotNull(myCurrentWarehouse)) { + aftersalesWorkOrder.put("warehouseId", myCurrentWarehouse.getId()); + } else { + throw new ServiceException("请选择仓库!"); + } + //已处理 + if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yichuli.getValue())) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("handleStatus", "30"); + } + //待处理 + if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.daichuli.getValue())) { + aftersalesWorkOrder.put("handleStatus", "40"); + } + //处理中 + if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.chulizhong.getValue())) { + aftersalesWorkOrder.put("handleStatus", "50"); + } + //已完结 + if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yiwanjei.getValue())) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("handleStatus", "20"); + } + //全部 + if (ObjectUtils.isNotNull(workOrderStatus) && "1000".equals(workOrderStatus)) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("handleStatus", "10"); + } + } + + private void updateWorkOrderForFunctional(Map aftersalesWorkOrder, Object workOrderStatus, Long userId) { + // 对职能客服的工单状态更新逻辑 + // 优化后的代码根据实际情况进行填充 + if (ObjectUtils.isNotNull(workOrderStatus) && "500".equals(workOrderStatus)) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("customerServiceState", "20"); + aftersalesWorkOrder.put("customerServiceId", userId); + } else if (ObjectUtils.isNull(workOrderStatus)) { + aftersalesWorkOrder.put("customerIdentification", "1"); + } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.yiwanjei.getValue().equals(workOrderStatus)) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("customerServiceState", "10"); + } else if (ObjectUtils.isNotNull(workOrderStatus) && WorkOrderStatusConstant.daichuli.getValue().equals(workOrderStatus)) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("customerServiceState", "31"); // 待处理 + aftersalesWorkOrder.put("customerServiceId", userId); + } + } + + private void updateWorkOrderForOthers(Map aftersalesWorkOrder, Object workOrderStatus) { + // 对其他情况的工单状态更新逻辑 + // 优化后的代码根据实际情况进行填充 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if (ObjectUtils.isNotNull(myCurrentWarehouse)) { + aftersalesWorkOrder.put("warehouseId", myCurrentWarehouse.getId()); + } else { + throw new ServiceException("请选择仓库!"); + } + //已处理 + if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yichuli.getValue())) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("handleStatus", "30"); + } + //待处理 + if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.daichuli.getValue())) { + aftersalesWorkOrder.put("handleStatus", "40"); + } + //处理中 + if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.chulizhong.getValue())) { + aftersalesWorkOrder.put("handleStatus", "50"); + } + //已完结 + if (ObjectUtils.isNotNull(workOrderStatus) && workOrderStatus.equals(WorkOrderStatusConstant.yiwanjei.getValue())) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("handleStatus", "20"); + } + //全部 + if (ObjectUtils.isNotNull(workOrderStatus) && "1000".equals(workOrderStatus)) { + aftersalesWorkOrder.remove("workOrderStatus"); + aftersalesWorkOrder.put("handleStatus", "10"); + } + } + + private void updateDepartStatus(AftersalesWorkOrderVO workOrder, BladeUser user, BasicdataWarehouseEntity myCurrentWarehouse + ,Map> collect, Map> collect1 + ) { + if (ObjectUtils.isNotNull(workOrder.getCustomerServiceId())) { + R> listR = userSearchClient.listByUser(String.valueOf(workOrder.getCustomerServiceId())); + if (ObjectUtils.isNotNull(listR.getData())) { + long time = System.currentTimeMillis() / 1000; + listR.getData().forEach(a -> { + if (ObjectUtils.isNotNull(a.getDownTime()) && a.getDownTime().getTime() / 1000 <= time) { + workOrder.setDepartStatus(true); + } + }); + } + } + Long id =null; + if(ObjectUtils.isNotNull(myCurrentWarehouse)){ + id=myCurrentWarehouse.getId(); + } + workOrder.setTotalAmount(completionRecordService.getTotalMoney(workOrder,id)); + if(myCurrentWarehouse!=null){ + List aftersalesCompletionRecipientEntities = collect.get(workOrder.getId()); + if(ObjectUtils.isNotNull(aftersalesCompletionRecipientEntities)){ + for (AftersalesCompletionRecipientEntity aftersalesProcessorEntity : aftersalesCompletionRecipientEntities) { + if(myCurrentWarehouse.getId().equals(aftersalesProcessorEntity.getWarehouseId())){ + workOrder.setCanRepresentations(1); + break; + } } } - }); + List aftersalesCompletionRecipientEntities1 = collect1.get(workOrder.getId()); + if(ObjectUtils.isNotNull(aftersalesCompletionRecipientEntities1)){ + for (AftersalesCompletionRecordEntity aftersalesCompletionRecipientEntity : aftersalesCompletionRecipientEntities1) { + if(myCurrentWarehouse.getId().equals(aftersalesCompletionRecipientEntity.getWarehouseId())){ + workOrder.setCanRepresentations(1); + break; + } + } + } + } - return iPage; } + /** * 查询工单超时未处理并添加超时记录 */ @@ -936,116 +1222,8 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl aftersalesWorkOrderEntities = baseMapper.selectList(Wrappers.query().lambda() - .eq(AftersalesWorkOrderEntity::getIsDeleted,0) - .apply("work_order_status in (10,20)") - ); - if(!aftersalesWorkOrderEntities.isEmpty()){ - List workOrderVOList = new ArrayList<>(); - for (AftersalesWorkOrderEntity i : aftersalesWorkOrderEntities) { - // 获取当前时间 - LocalDateTime now = LocalDateTime.now(); - // 获取48小时前的时间 - LocalDateTime before48Hours = now.minusHours(48); - // 获取48小时前的时间戳(秒数) - long timestamp = before48Hours.toEpochSecond(ZoneOffset.ofHours(8)); - long l = i.getCreateTime().getTime() / 1000; - long l1 = timestamp - l; - if (l1 > 0) { - //查询处理方是否处理 - List list = aftersalesProcessorService.list(Wrappers.query().lambda() - .eq(AftersalesProcessorEntity::getWorkOrderId, i.getId()) - .eq(AftersalesProcessorEntity::getTypesOf, "2") - .eq(AftersalesProcessorEntity::getProcessingStatus, "1") - ); - if(list.isEmpty()){ - continue; - } - list.forEach( a ->{ - AftersalesWorkOrderVO aftersalesWorkOrderVO = new AftersalesWorkOrderVO(); - BeanUtil.copyProperties(i,aftersalesWorkOrderVO); - //以超时 - aftersalesWorkOrderVO.setBusinessName(a.getBusinessName()); - aftersalesWorkOrderVO.setBusinessId(a.getBusinessId()); - aftersalesWorkOrderVO.setProcessorId(a.getId()); - workOrderVOList.add(aftersalesWorkOrderVO); - }); - - } else { - continue; - } - } - - if(!workOrderVOList.isEmpty()){ - workOrderVOList.forEach(i ->{ - - // 假设有两个时间戳(秒数) - long timestamp1 = new Date().getTime() / 1000; // 现在时间 - long timestamp2 = i.getCreateTime().getTime() / 1000; // 创建时间 - - // 将时间戳转换为Instant对象 - Instant instant1 = Instant.ofEpochSecond(timestamp1); - Instant instant2 = Instant.ofEpochSecond(timestamp2); - - // 计算两个时间戳之间的小时差 - Duration duration = Duration.between(instant1, instant2); - long hours = duration.toHours(); - Integer number = Integer.valueOf((int)hours); - int i1 = 48; - int ci = 0; - while (number > i1) { - i1 +=48; - ci += 1; - } - //查询超时的记录 - List list = aftersalesOvertimeFineService.list(Wrappers.query().lambda() - .eq(AftersalesOvertimeFineEntity::getWorkOrderId, i.getId()) - ); - int size = list.size(); - for (int q = 0; q < ci ; q++){ - //第一次超时 - if(size == 0 ){ - //处理超时数据 - AftersalesProcessorEntity processor = new AftersalesProcessorEntity(); - processor.setProcessingStatus("3");//回复超时 - processor.setId(i.getProcessorId()); - aftersalesProcessorService.updateById(processor); - //添加超时记录 - AftersalesOvertimeFineEntity overtimeFineEntity = new AftersalesOvertimeFineEntity(); - overtimeFineEntity.setWorkOrderId(i.getId()); - overtimeFineEntity.setMoney(BigDecimal.valueOf(50)); - overtimeFineEntity.setTimeout(String.valueOf(hours)); - overtimeFineEntity.setBusinessId(i.getBusinessId()); - overtimeFineEntity.setBusinessName(i.getBusinessName()); - overtimeFineEntity.setProcessorId(i.getProcessorId()); - aftersalesOvertimeFineService.save(overtimeFineEntity); - }else if(q > size){ - //添加新的超时记录 - AftersalesOvertimeFineEntity overtimeFineEntity = new AftersalesOvertimeFineEntity(); - overtimeFineEntity.setWorkOrderId(i.getId()); - overtimeFineEntity.setMoney(BigDecimal.valueOf(50)); - overtimeFineEntity.setTimeout(String.valueOf(hours)); - overtimeFineEntity.setBusinessId(i.getBusinessId()); - overtimeFineEntity.setBusinessName(i.getBusinessName()); - overtimeFineEntity.setProcessorId(i.getProcessorId()); - aftersalesOvertimeFineService.save(overtimeFineEntity); - - } - } - - }); - - } - - }*/ - } /** @@ -1106,7 +1284,7 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl processorVOS = list.stream().map(i -> { - if (i.getProcessingStatus().equals(ProcessorProcessingStatusStatusConstant.daichuli.getValue()) || i.getProcessingStatus().equals(ProcessorProcessingStatusStatusConstant.yichuli.getValue())) { - AftersalesProcessorVO processorVO = new AftersalesProcessorVO(); - BeanUtil.copyProperties(i, processorVO); - return processorVO; + + List processorVOS = new ArrayList<>(); + if (!list.isEmpty()) { + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + AftersalesProcessorEntity next = iterator.next(); + if (ProcessorProcessingStatusStatusConstant.daichuli.getValue().equals(next.getProcessingStatus()) + || ProcessorProcessingStatusStatusConstant.yichuli.getValue().equals(next.getProcessingStatus())) { + AftersalesProcessorVO processorVO = new AftersalesProcessorVO(); + BeanUtil.copyProperties(next, processorVO); + processorVOS.add(processorVO); + } else { + iterator.remove(); + } } - return null; - }).collect(Collectors.toList()); + + } + aftersalesWorkOrderVO.setProcessorVOList(processorVOS); //查询包件 @@ -1150,8 +1338,8 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl list4 = completionRecordService.list(Wrappers.query().lambda() .eq(AftersalesCompletionRecordEntity::getWorkOrderId, aftersalesWorkOrder.getId()) ); - if (Func.isNotEmpty(list4)){ - list4.forEach(i->{ + if (Func.isNotEmpty(list4)) { + list4.forEach(i -> { BigDecimal bigDecimal = i.getMoney().setScale(2, BigDecimal.ROUND_FLOOR); i.setMoney(bigDecimal); }); @@ -1277,7 +1462,7 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl list = new ArrayList<>(); - data.stream().forEach(k -> { + data.forEach(k -> { //查询工单数据是否存在 AftersalesWorkOrderEntity workOrder = baseMapper.selectOne(Wrappers.query().lambda() .eq(AftersalesWorkOrderEntity::getWorkOrderNumber, k) @@ -1357,7 +1542,7 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl stringList = new ArrayList<>(); - warehouseType.stream().forEach(i -> { + warehouseType.forEach(i -> { //查询这个角色ID R roleId = sysClient.getRoleIds(tenantId, i.getDictValue()); if (ObjectUtils.isNotNull(roleId.getData())) { @@ -1530,12 +1715,13 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl deptName = sysClient.getDeptName(Long.valueOf(user.getDeptId())); surveyRecordEntity.setAddDepartment(deptName.getData()); surveyRecordEntity.setProcessingResults(surveyRecordEntity.getContent()); } //添加回复信息 + surveyRecordEntity.setProcessorId(user.getUserId()); + surveyRecordEntity.setProcessorName(user.getNickName()); surveyRecordEntity.setDifference("1"); surveyRecordEntity.setTypesOf("1"); surveyRecordEntity.setAddPeople(user.getUserName()); @@ -1700,14 +1886,8 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl getListSettlement(Map aftersalesWorkOrder, IPage page) { AftersalesSettlementEntity aftersalesSettlementEntity = JSONObject.parseObject(JSONObject.toJSONString(aftersalesWorkOrder), AftersalesSettlementEntity.class); - IPage iPage = baseMapper.getListSettlement(page, aftersalesSettlementEntity); + IPage iPage = baseMapper.getListSettlementNew(page, aftersalesSettlementEntity); iPage.getRecords().forEach(i -> { i.setWorkOrderTypeName(DictBizCache.getValue(DictBizConstant.PC_WORK_ORDER, i.getWorkOrderType())); i.setDiscoveryNodeName(DictBizCache.getValue(DictBizConstant.PC_DISCOVERY_NODE, i.getDiscoveryNode())); @@ -1917,7 +2097,7 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl completionRecordEntityLambdaUpdateWrapper = Wrappers.lambdaUpdate() + .set(AftersalesCompletionRecordEntity::getIsDeleted, 1) + .eq(AftersalesCompletionRecordEntity::getWorkOrderId, aftersalesWorkOrder.getId()); + completionRecordService.update(completionRecordEntityLambdaUpdateWrapper); //异常工单完结处理结果赔款方 if (!aftersalesWorkOrder.getCompletionRecordEntities().isEmpty()) { aftersalesWorkOrder.getCompletionRecordEntities().forEach(r -> { @@ -1968,10 +2151,15 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl completionRecipientEntityLambdaUpdateWrapper = Wrappers.lambdaUpdate() + .set(AftersalesCompletionRecipientEntity::getIsDeleted, 1) + .eq(AftersalesCompletionRecipientEntity::getWorkOrderId, aftersalesWorkOrder.getId()); + completionRecipientService.update(completionRecipientEntityLambdaUpdateWrapper); //异常工单完结处理结果受款方 if (!aftersalesWorkOrder.getCompletionRecipientEntities().isEmpty()) { aftersalesWorkOrder.getCompletionRecipientEntities().forEach(r -> { @@ -1983,10 +2171,11 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl 0; +// } + /** * 修改申述状态数据 * @@ -2184,21 +2402,52 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl 0; + } catch (Exception e) { + log.error("处理申诉信息时发生异常", e); + // 异常处理:记录日志或抛出自定义异常 + throw new RuntimeException("处理申诉信息时发生异常", e); } - return aftersalesAppealService.updateById(aftersalesAppeal) > 0; } + /** * 修改结束仲裁 * @@ -2251,7 +2500,7 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl workOrderByOrderPackageCodeAndWarehouseIdAndOtherNodex = baseMapper.findWorkOrderByOrderPackageCodeAndWarehouseIdAndOtherNodex(warehouseId, orderPackageCode, 2, 3); + // 对异常工单进行标识 + + for (AftersalesWorkOrderEntity orderByOrderPackageCodeAndWarehouseIdAndOtherNodex : workOrderByOrderPackageCodeAndWarehouseIdAndOtherNodex) { + // 更新这个异常工单下面的包件 + aftersalesAbnormalPackageMapper.updateAftersalesAbnormalPackageByWorkOrderIdAndPackCodeAndOtherNodex(orderByOrderPackageCodeAndWarehouseIdAndOtherNodex.getId(), orderPackageCode, packageFinish); + + orderByOrderPackageCodeAndWarehouseIdAndOtherNodex.setPackageFinish(packageFinish); + baseMapper.updateById(orderByOrderPackageCodeAndWarehouseIdAndOtherNodex); + + } + + } + + @Override + public AftersalesWorkOrderListExcelDTO exportAftersalesWorkOrderList() { + List warehouseList = warehouseClient.getMyWarehouseList(); + List warehouseListIds = null; + if (!warehouseList.isEmpty()) { + warehouseListIds = warehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + } + AftersalesWorkOrderListExcelDTO aftersalesWorkOrderListExcelDTO = new AftersalesWorkOrderListExcelDTO(); + List allAftersalesWorkOrderExcels = baseMapper.selectAllAftersalesWorkOrderList(warehouseListIds); + if (!allAftersalesWorkOrderExcels.isEmpty()) { + aftersalesWorkOrderListExcelDTO.setAftersalesWorkOrderExcels(allAftersalesWorkOrderExcels); + } + List waitAftersalesWorkOrderExcels = baseMapper.selectWaitAftersalesWorkOrderList(warehouseListIds); + + + return null; + } } diff --git a/blade-service/logpm-aftersales/src/main/resources/application-dev.yml b/blade-service/logpm-aftersales/src/main/resources/application-dev.yml index 320f33260..87cf7228b 100644 --- a/blade-service/logpm-aftersales/src/main/resources/application-dev.yml +++ b/blade-service/logpm-aftersales/src/main/resources/application-dev.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -33,12 +33,21 @@ spring: url: ${blade.datasource.aftersales.master.url} username: ${blade.datasource.aftersales.master.username} password: ${blade.datasource.aftersales.master.password} - slave: - druid: - #独立校验配置 - validation-query: select 1 - #oracle校验 - #validation-query: select 1 from dual - url: ${blade.datasource.aftersales.slave.url} - username: ${blade.datasource.aftersales.slave.username} - password: ${blade.datasource.aftersales.slave.password} +# 627683: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.aftersales.627683.url} +# username: ${blade.datasource.aftersales.627683.username} +# password: ${blade.datasource.aftersales.627683.password} +# 703923: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.aftersales.703923.url} +# username: ${blade.datasource.aftersales.703923.username} +# password: ${blade.datasource.aftersales.703923.password} diff --git a/blade-service/logpm-aftersales/src/main/resources/application-prod.yml b/blade-service/logpm-aftersales/src/main/resources/application-prod.yml index 9f5fbf7c4..ca7979c43 100644 --- a/blade-service/logpm-aftersales/src/main/resources/application-prod.yml +++ b/blade-service/logpm-aftersales/src/main/resources/application-prod.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -25,7 +25,7 @@ spring: url: ${blade.datasource.aftersales.master.url} username: ${blade.datasource.aftersales.master.username} password: ${blade.datasource.aftersales.master.password} - slave: - url: ${blade.datasource.aftersales.slave.url} - username: ${blade.datasource.aftersales.slave.username} - password: ${blade.datasource.aftersales.slave.password} + 627683: + url: ${blade.datasource.aftersales.627683.url} + username: ${blade.datasource.aftersales.627683.username} + password: ${blade.datasource.aftersales.627683.password} diff --git a/blade-service/logpm-aftersales/src/main/resources/application-test.yml b/blade-service/logpm-aftersales/src/main/resources/application-test.yml index cf7bcafb9..7508cbc1c 100644 --- a/blade-service/logpm-aftersales/src/main/resources/application-test.yml +++ b/blade-service/logpm-aftersales/src/main/resources/application-test.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -25,7 +25,11 @@ spring: url: ${blade.datasource.aftersales.master.url} username: ${blade.datasource.aftersales.master.username} password: ${blade.datasource.aftersales.master.password} - slave: - url: ${blade.datasource.aftersales.slave.url} - username: ${blade.datasource.aftersales.slave.username} - password: ${blade.datasource.aftersales.slave.password} + 627683: + url: ${blade.datasource.aftersales.627683.url} + username: ${blade.datasource.aftersales.627683.username} + password: ${blade.datasource.aftersales.627683.password} + 695224: + url: ${blade.datasource.aftersales.695224.url} + username: ${blade.datasource.aftersales.695224.username} + password: ${blade.datasource.aftersales.695224.password} diff --git a/blade-service/logpm-basic/Dockerfile b/blade-service/logpm-basic/Dockerfile index 94c38cf32..ce9765db4 100644 --- a/blade-service/logpm-basic/Dockerfile +++ b/blade-service/logpm-basic/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-basic/src/main/java/com/logpm/basic/BasicApplication.java b/blade-service/logpm-basic/src/main/java/com/logpm/basic/BasicApplication.java index 90224f55d..6e7f9693e 100644 --- a/blade-service/logpm-basic/src/main/java/com/logpm/basic/BasicApplication.java +++ b/blade-service/logpm-basic/src/main/java/com/logpm/basic/BasicApplication.java @@ -5,6 +5,7 @@ package com.logpm.basic; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.cloud.client.BladeCloudApplication; import org.springblade.core.launch.BladeApplication; +import org.springblade.core.transaction.annotation.SeataCloudApplication; /** * Basic启动器 @@ -12,6 +13,7 @@ import org.springblade.core.launch.BladeApplication; * @author lmy */ @BladeCloudApplication +@SeataCloudApplication public class BasicApplication { public static void main(String[] args) { diff --git a/blade-service/logpm-basic/src/main/java/com/logpm/basic/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-basic/src/main/java/com/logpm/basic/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..e8024cf24 --- /dev/null +++ b/blade-service/logpm-basic/src/main/java/com/logpm/basic/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.basic.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-basic/src/main/java/com/logpm/basic/config/ExecutorConfig.java b/blade-service/logpm-basic/src/main/java/com/logpm/basic/config/ExecutorConfig.java new file mode 100644 index 000000000..78748a2e8 --- /dev/null +++ b/blade-service/logpm-basic/src/main/java/com/logpm/basic/config/ExecutorConfig.java @@ -0,0 +1,82 @@ +package com.logpm.basic.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + String tenantId = AuthUtil.getTenantId(); + Map all = ThreadLocalUtil.getAll(); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + all.keySet().forEach(key -> ThreadLocalUtil.put(key, all.get(key))); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + String tenantId1 = AuthUtil.getTenantId(); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + all.clear(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-basic/src/main/java/com/logpm/basic/controller/CommonFrontTableController.java b/blade-service/logpm-basic/src/main/java/com/logpm/basic/controller/CommonFrontTableController.java new file mode 100644 index 000000000..6f7e50e7c --- /dev/null +++ b/blade-service/logpm-basic/src/main/java/com/logpm/basic/controller/CommonFrontTableController.java @@ -0,0 +1,50 @@ +package com.logpm.basic.controller; + +import com.logpm.basic.vo.TableSetVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.cache.CacheNames; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.*; + +@RestController +@Slf4j +@AllArgsConstructor +@RequestMapping("/commonTable") +@Api(value = "自定义表格内容", tags = "自定义表格内容") +public class CommonFrontTableController extends BladeController { + + private final BladeRedis bladeRedis; + + @PostMapping("/saveTableSeting") + @ApiOperation(value = "保存表格配置", notes = "传入tableSetVo") + public R saveTableSeting(@RequestBody TableSetVo tableSetVo){ + + + try { + String key = CacheNames.tenantKey(AuthUtil.getTenantId(),CacheNames.USER_TABLE_SET+tableSetVo.getTableKey(),AuthUtil.getUserId().toString()); + bladeRedis.setEx(key, tableSetVo.getTableSetCongig(),3*30*24*60*60L); + return R.success("保存成功"); + } catch (Exception e) { + log.error("saveTableSeting",e); + return R.fail("保存失败"); + } + + } + + @GetMapping ("/getTableSeting") + @ApiOperation(value = "获取表格配置", notes = "tableKey") + public R getTableSeting(@RequestParam("tableKey") String tableKey){ + + String key = CacheNames.tenantKey(AuthUtil.getTenantId(),CacheNames.USER_TABLE_SET+tableKey,AuthUtil.getUserId().toString()); + Object o = bladeRedis.get(key); + return R.data(o); + + } + +} diff --git a/blade-service/logpm-basic/src/main/java/com/logpm/basic/feign/BasicTenantCodeClient.java b/blade-service/logpm-basic/src/main/java/com/logpm/basic/feign/BasicTenantCodeClient.java index af50642dd..e8982c795 100644 --- a/blade-service/logpm-basic/src/main/java/com/logpm/basic/feign/BasicTenantCodeClient.java +++ b/blade-service/logpm-basic/src/main/java/com/logpm/basic/feign/BasicTenantCodeClient.java @@ -67,5 +67,8 @@ public class BasicTenantCodeClient implements IBasicTenantCodeClient { return shelfCode; } - + @Override + public BasicTenantCodeEntity findBasicTenantCodeByCodeAndShowType(String codeType, Integer showType) { + return basicTenantCodeService.findBasicTenantCodeByCodeAndShowType(codeType,showType); + } } diff --git a/blade-service/logpm-basic/src/main/java/com/logpm/basic/mapper/BasicMaterialMapper.xml b/blade-service/logpm-basic/src/main/java/com/logpm/basic/mapper/BasicMaterialMapper.xml index f8ccd50a4..c61c01583 100644 --- a/blade-service/logpm-basic/src/main/java/com/logpm/basic/mapper/BasicMaterialMapper.xml +++ b/blade-service/logpm-basic/src/main/java/com/logpm/basic/mapper/BasicMaterialMapper.xml @@ -49,6 +49,7 @@ where is_deleted = 0 and product_code = #{materialCode} and `name` = #{materialName} + and hide = 1 diff --git a/blade-service/logpm-basic/src/main/java/com/logpm/basic/service/IBasicTenantCodeService.java b/blade-service/logpm-basic/src/main/java/com/logpm/basic/service/IBasicTenantCodeService.java index 51e875ca0..11411b37b 100644 --- a/blade-service/logpm-basic/src/main/java/com/logpm/basic/service/IBasicTenantCodeService.java +++ b/blade-service/logpm-basic/src/main/java/com/logpm/basic/service/IBasicTenantCodeService.java @@ -68,4 +68,6 @@ public interface IBasicTenantCodeService extends BaseService implements IBasicTenantCodeService { - private BasicTenantCodeMapper basicTenantCodeMapper; @Override public IPage list(Map basicTenantCode, IPage page) { - IPage basicTenantCodeEntityIPage = basicTenantCodeMapper.selectTenantCodeList(page,basicTenantCode); + IPage basicTenantCodeEntityIPage = baseMapper.selectTenantCodeList(page,basicTenantCode); return basicTenantCodeEntityIPage; } @@ -54,7 +54,7 @@ public class BasicTenantCodeServiceImpl extends BaseServiceImpl map = new HashMap<>(); map.put("tenantId",tenantId); map.put("codeType",codeType); - String shelfCode = basicTenantCodeMapper.shelfCode(map); + String shelfCode = baseMapper.shelfCode(map); return shelfCode; } @@ -83,14 +83,23 @@ public class BasicTenantCodeServiceImpl extends BaseServiceImpl().eq("code_type", codeType).eq("show_type", showType).eq("is_deleted",0)); + + + return basicTenantCodeEntity; + } + @Override public boolean save(BasicTenantCodeEntity entity) { String code = entity.getCode(); - Integer codeType = entity.getCodeType(); - if (Func.isBlank(code)){ - code = "DA--00"+codeType; - entity.setCode(code); - } + String codeType = entity.getCodeType(); +// if (Func.isBlank(code)){ +// code = "DA--00"+codeType; +// entity.setCode(code); +// } return super.save(entity); } } diff --git a/blade-service/logpm-basic/src/main/resources/application-dev.yml b/blade-service/logpm-basic/src/main/resources/application-dev.yml index 3ff547cac..edd1af818 100644 --- a/blade-service/logpm-basic/src/main/resources/application-dev.yml +++ b/blade-service/logpm-basic/src/main/resources/application-dev.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -33,13 +33,21 @@ spring: url: ${blade.datasource.basic.master.url} username: ${blade.datasource.basic.master.username} password: ${blade.datasource.basic.master.password} - slave: - druid: - #独立校验配置 - validation-query: select 1 - #oracle校验 - #validation-query: select 1 from dual - url: ${blade.datasource.basic.slave.url} - username: ${blade.datasource.basic.slave.username} - password: ${blade.datasource.basic.slave.password} - +# 627683: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.basic.627683.url} +# username: ${blade.datasource.basic.627683.username} +# password: ${blade.datasource.basic.627683.password} +# 703623: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.basic.703623.url} +# username: ${blade.datasource.basic.703623.username} +# password: ${blade.datasource.basic.703623.password} diff --git a/blade-service/logpm-basic/src/main/resources/application-prod.yml b/blade-service/logpm-basic/src/main/resources/application-prod.yml index 3ff547cac..3c754ca3c 100644 --- a/blade-service/logpm-basic/src/main/resources/application-prod.yml +++ b/blade-service/logpm-basic/src/main/resources/application-prod.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -33,13 +33,13 @@ spring: url: ${blade.datasource.basic.master.url} username: ${blade.datasource.basic.master.username} password: ${blade.datasource.basic.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.basic.slave.url} - username: ${blade.datasource.basic.slave.username} - password: ${blade.datasource.basic.slave.password} + url: ${blade.datasource.basic.627683.url} + username: ${blade.datasource.basic.627683.username} + password: ${blade.datasource.basic.627683.password} diff --git a/blade-service/logpm-basic/src/main/resources/application-test.yml b/blade-service/logpm-basic/src/main/resources/application-test.yml index 3ce9c0d67..b85178a5b 100644 --- a/blade-service/logpm-basic/src/main/resources/application-test.yml +++ b/blade-service/logpm-basic/src/main/resources/application-test.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -33,13 +33,32 @@ spring: url: ${blade.datasource.basic.master.url} username: ${blade.datasource.basic.master.username} password: ${blade.datasource.basic.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.basic.slave.url} - username: ${blade.datasource.basic.slave.username} - password: ${blade.datasource.basic.slave.password} + url: ${blade.datasource.basic.627683.url} + username: ${blade.datasource.basic.627683.username} + password: ${blade.datasource.basic.627683.password} + 695224: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.basic.695224.url} + username: ${blade.datasource.basic.695224.username} + password: ${blade.datasource.basic.695224.password} + + 645789: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.basic.645789.url} + username: ${blade.datasource.basic.645789.username} + password: ${blade.datasource.basic.645789.password} diff --git a/blade-service/logpm-basicdata/Dockerfile b/blade-service/logpm-basicdata/Dockerfile index fa0291579..13e72aaf8 100644 --- a/blade-service/logpm-basicdata/Dockerfile +++ b/blade-service/logpm-basicdata/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/BasicDataApplication.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/BasicDataApplication.java index 428a982c1..468f5acd7 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/BasicDataApplication.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/BasicDataApplication.java @@ -4,7 +4,7 @@ package com.logpm.basicdata; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.cloud.client.BladeCloudApplication; import org.springblade.core.launch.BladeApplication; -//import org.springblade.core.transaction.annotation.SeataCloudApplication; +import org.springblade.core.transaction.annotation.SeataCloudApplication; /** * Basic启动器 @@ -13,6 +13,7 @@ import org.springblade.core.launch.BladeApplication; */ @BladeCloudApplication +@SeataCloudApplication public class BasicDataApplication { public static void main(String[] args) { diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..41137ed9c --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.basicdata.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/aspect/JobAnnotationAspect.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/aspect/JobAnnotationAspect.java new file mode 100644 index 000000000..8efaac5fe --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/aspect/JobAnnotationAspect.java @@ -0,0 +1,83 @@ +package com.logpm.basicdata.aspect; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.AllArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Aspect +@Component +@AllArgsConstructor +public class JobAnnotationAspect { + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + + @Around("@annotation(com.xxl.job.core.handler.annotation.XxlJob)") + public Object xxlJobAnnotationMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + + JSONObject jsonObject = mockLogin(); + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.addHeader("Blade-Auth", "bearer "+jsonObject.get("access_token")); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(mockRequest)); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+jsonObject.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + DynamicDataSourceContextHolder.push(jsonObject.getString("tenant_id")); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + + return result; + + + } + + private JSONObject mockLogin() throws InterruptedException { + + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + return data; + } + + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/config/ExecutorConfig.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/config/ExecutorConfig.java new file mode 100644 index 000000000..4e2baec5b --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/config/ExecutorConfig.java @@ -0,0 +1,82 @@ +package com.logpm.basicdata.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + String tenantId = AuthUtil.getTenantId(); + Map all = ThreadLocalUtil.getAll(); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + all.keySet().forEach(key -> ThreadLocalUtil.put(key, all.get(key))); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + String tenantId1 = AuthUtil.getTenantId(); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + all.clear(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/constant/BasicdataConstants.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/constant/BasicdataConstants.java new file mode 100644 index 000000000..824ee2f73 --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/constant/BasicdataConstants.java @@ -0,0 +1,13 @@ +package com.logpm.basicdata.constant; + +/** + * @author zhaoqiaobo + * @create 2024-04-24 + */ +public abstract class BasicdataConstants { + + public interface Price { + String VEHICLE_TYPE = "price_vehicle_type"; + } + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataClientController.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataClientController.java index 95e47d4de..0d81120f2 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataClientController.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataClientController.java @@ -16,6 +16,7 @@ */ package com.logpm.basicdata.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; @@ -106,73 +107,16 @@ public class BasicdataClientController extends BladeController { @GetMapping("/list") @ApiOperationSupport(order = 2) @ApiOperation(value = "分页", notes = "传入basicdataClient") - public R> list(@ApiIgnore @RequestParam Map basicdataClient, Query query) { - Object o = basicdataClient.get("contractStartTime"); - Object o1 = basicdataClient.get("contractEntTime"); - Object o2 = basicdataClient.get("pid"); - basicdataClient.put("contractStartTime", null); - basicdataClient.put("contractEntTime", null); - QueryWrapper queryWrapper = Condition.getQueryWrapper(basicdataClient, BasicdataClientEntity.class); -/* queryWrapper.apply(o != null, - "date_format (contract_start_time,'%Y-%m-%d') >= date_format ({0},'%Y-%m-%d')", o) - .apply(o1 != null, - "date_format (contract_ent_time,'%Y-%m-%d') <= date_format ({0},'%Y-%m-%d')", o1);*/ - if (ObjectUtils.isNotNull(o)) { - queryWrapper.between("contract_start_time", o, o1); - - } - if (ObjectUtils.isNotNull(o2)) { - queryWrapper.eq("pid", o2); - } else { - queryWrapper.eq("pid", "0"); - } - queryWrapper.orderByDesc("create_time"); - IPage pages = basicdataClientService.page(Condition.getPage(query), queryWrapper); - pages.getRecords().forEach(i -> { - List list = basicdataStoreBusinessService.list(Wrappers.query().lambda() - .eq(BasicdataStoreBusinessEntity::getClientId, i.getId())); - i.setTypeServiceBusiness(list); - //查询客户绑定第一位联系人 - List listed = basicdataStoreContactService.list(Wrappers.query().lambda() - .eq(BasicdataStoreContactEntity::getShopId, i.getId())); - if (Func.isNotEmpty(listed)) { - List collect = listed.stream().filter(f -> Func.isEmpty(f.getCreateTime())).collect(Collectors.toList()); - if (Func.isNotEmpty(collect)){ - System.out.println("客户无创建时间"+collect); - } - String string = listed.stream().sorted(Comparator.comparing(BasicdataStoreContactEntity::getCreateTime)).findFirst().map(BasicdataStoreContactEntity::getLinkman).get(); - String phone = listed.stream().sorted(Comparator.comparing(BasicdataStoreContactEntity::getCreateTime)).findFirst().map(BasicdataStoreContactEntity::getPhone).get(); - i.setLinkman(string); - i.setPhone(phone); + public R> list(@ApiIgnore @RequestParam Map basicdataClient, Query query) { + IPage basicdataClientVOIPage = basicdataClientService.pageList(Condition.getPage(query), basicdataClient); + if (!basicdataClientVOIPage.getRecords().isEmpty()) { + for (BasicdataClientVO record : basicdataClientVOIPage.getRecords()) { + List list = basicdataStoreBusinessService.list(Wrappers.query().lambda() + .eq(BasicdataStoreBusinessEntity::getClientId, record.getId())); + record.setTypeServiceBusiness(list); } - List collect = list.stream().filter(f -> Func.isNotEmpty(f.getMold())).map(BasicdataStoreBusinessEntity::getMold).collect(Collectors.toList()); - if (collect.size() > 0) { - //进行 - String s = collect.get(0); - switch (s) { - case "1": - i.setTypeServiceName("商配"); - break; - case "2": - i.setTypeServiceName("市配"); - break; - case "3": - i.setTypeServiceName("自提"); - break; - case "4": - i.setTypeServiceName("三方中转"); - break; - } - } - //处理客户的配送类型 - - -// if(!i.getCreateUser().equals(null)){ -// R userR = userClient.userInfoById(i.getCreateUser()); -// i.setCreateUserName(userR.getData().getName()); -// } - }); - return R.data(pages); + } + return R.data(basicdataClientVOIPage); } /** @@ -186,6 +130,18 @@ public class BasicdataClientController extends BladeController { return R.data(pages); } + /** + * 查询最后一位客户编码 + * @return + */ + @GetMapping("/getFinallyClientCode") + @ApiOperationSupport(order = 3) + @ApiOperation(value = "查询最后一位客户编码", notes = "传入basicdataClient") + public R getFinallyClientCode() { + String code = basicdataClientService.getFinallyClientCode(); + return R.data(code); + } + /** * 基础客户表查询 */ @@ -226,7 +182,7 @@ public class BasicdataClientController extends BladeController { @ApiOperationSupport(order = 4) @ApiOperation(value = "新增", notes = "传入basicdataClient") public R save(@Valid @RequestBody BasicdataClientEntity basicdataClient) { - return R.status(basicdataClientService.save(basicdataClient)); + return R.status(basicdataClientService.saveClient(basicdataClient)); } /** diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataPriceController.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataPriceController.java index eb4c2d601..1839d7e0c 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataPriceController.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataPriceController.java @@ -16,28 +16,55 @@ */ package com.logpm.basicdata.controller; +import cn.hutool.core.date.DateUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.WriteTable; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.basicdata.excel.price.BasicdataPriceCategoryBasicExcel; +import com.logpm.basicdata.excel.price.BasicdataPriceCategoryDispatchExcel; +import com.logpm.basicdata.excel.price.BasicdataPriceCategoryWarehouseExcel; +import com.logpm.basicdata.excel.price.BasicdataPriceExcel; +import com.logpm.basicdata.excel.price.BasicdataPriceFullVehicleExcel; +import com.logpm.basicdata.excel.price.BasicdataPriceGeneralExcel; import com.logpm.basicdata.service.IBasicdataPriceService; +import com.logpm.basicdata.vo.BasicdatPriceApiVO; import com.logpm.basicdata.vo.BasicdataPriceBasicUpdateVO; import com.logpm.basicdata.vo.BasicdataPricePageVO; +import com.logpm.basicdata.vo.PriceClientVO; import com.logpm.basicdata.vo.PriceVO; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; +import org.apache.commons.codec.Charsets; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import springfox.documentation.annotations.ApiIgnore; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Map; /** * 基础价格表 控制器 @@ -75,6 +102,16 @@ public class BasicdataPriceController extends BladeController { IPage pages = basicdataPriceService.selectBasicdataPricePage(Condition.getPage(query), basicdataPrice); return R.data(pages); } + /** + * 基础价格表 历史版本查询 + */ + @GetMapping("hisPage") + @ApiOperationSupport(order = 2) + @ApiOperation(value = "历史版本查询", notes = "历史版本查询") + public R> hisPage(BasicdataPricePageVO basicdataPrice, Query query) { + IPage pages = basicdataPriceService.hisPage(Condition.getPage(query), basicdataPrice); + return R.data(pages); + } /** * 基础价格表 修改 @@ -90,12 +127,89 @@ public class BasicdataPriceController extends BladeController { * 基础价格表 修改 */ @PutMapping - @ApiOperationSupport(order = 3) + @ApiOperationSupport(order = 5) @ApiOperation(value = "修改", notes = "传入basicdataPrice") public R update(@Valid @RequestBody PriceVO vo) { Boolean res = basicdataPriceService.updatePrice(vo); return R.status(res); } + @DeleteMapping("{id}") + @ApiOperationSupport(order = 5) + @ApiOperation(value = "删除待生效的价格", notes = "删除待生效的价格") + public R deletePrice(@PathVariable("id") String id) { + Boolean res = basicdataPriceService.deletePrice(id); + return R.status(res); + } + + /** + * 基础价格表 导入 + */ + @PostMapping("upload") + @ApiOperationSupport(order = 6) + @ApiOperation(value = "导入", notes = "导入") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "文件", dataType = "MultipartFile") + }) + public R upload(@RequestPart("file") MultipartFile file) { + return R.data(basicdataPriceService.upload(file)); + } + /** + * 基础价格表 导入 + */ + @PostMapping("upload/v2") + @ApiOperationSupport(order = 6) + @ApiOperation(value = "导入v2", notes = "导入v2") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "文件", dataType = "MultipartFile") + }) + public R uploadV2(@RequestPart("file") MultipartFile file) { + return R.data(basicdataPriceService.uploadV2(file)); + } + + /** + * 基础价格表 指定查询 + */ + @GetMapping("/custom") + @ApiOperationSupport(order = 7) + @ApiOperation(value = "指定条件查询", notes = "传入basicdataPrice") + public R custom(BasicdatPriceApiVO param) { + PriceClientVO detail = basicdataPriceService.price(param); + return R.data(detail); + } + @GetMapping("/export") + @ApiOperationSupport(order = 8) + @ApiOperation(value = "导出", notes = "导出") + public void export(@ApiIgnore @RequestParam Map map, HttpServletResponse response) { + try { + String fileName = "基础价格表" + DateUtil.today(); + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding(Charsets.UTF_8.name()); + fileName = URLEncoder.encode(fileName, Charsets.UTF_8.name()); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build(); + WriteTable table1 = EasyExcel.writerTable(0).head(BasicdataPriceExcel.class).build(); + WriteTable table2 = EasyExcel.writerTable(1).head(BasicdataPriceCategoryBasicExcel.class).build(); + WriteTable table3 = EasyExcel.writerTable(2).head(BasicdataPriceCategoryWarehouseExcel.class).build(); + WriteTable table4 = EasyExcel.writerTable(3).head(BasicdataPriceCategoryDispatchExcel.class).build(); + WriteTable table5 = EasyExcel.writerTable(4).head(BasicdataPriceFullVehicleExcel.class).build(); + WriteTable table6 = EasyExcel.writerTable(5).head(BasicdataPriceGeneralExcel.class).build(); + WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "客户信息").build(); + WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "提货干线按品类计费").build(); + WriteSheet writeSheet3 = EasyExcel.writerSheet(2, "仓储按品类计费").build(); + WriteSheet writeSheet4 = EasyExcel.writerSheet(3, "配送按品类计费").build(); + WriteSheet writeSheet5 = EasyExcel.writerSheet(4, "最低计费").build(); + WriteSheet writeSheet6 = EasyExcel.writerSheet(5, "整车").build(); + excelWriter.write(new ArrayList(), writeSheet1, table1); + excelWriter.write(new ArrayList(), writeSheet2, table2); + excelWriter.write(new ArrayList(), writeSheet3, table3); + excelWriter.write(new ArrayList(), writeSheet4, table4); + excelWriter.write(new ArrayList(), writeSheet5, table5); + excelWriter.write(new ArrayList(), writeSheet6, table6); + excelWriter.finish(); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataStoreContactController.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataStoreContactController.java index ca910f3ff..4bcc39117 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataStoreContactController.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/controller/BasicdataStoreContactController.java @@ -75,8 +75,9 @@ public class BasicdataStoreContactController extends BladeController { @GetMapping("/list") @ApiOperationSupport(order = 2) @ApiOperation(value = "分页", notes = "传入basicdataStoreContact") - public R> list(@ApiIgnore @RequestParam Map basicdataStoreContact, Query query) { - IPage pages = basicdataStoreContactService.page(Condition.getPage(query), Condition.getQueryWrapper(basicdataStoreContact, BasicdataStoreContactEntity.class)); + public R> list(@ApiIgnore @RequestParam Map basicdataStoreContact, Query query) { + IPage page = Condition.getPage(query); + IPage pages = basicdataStoreContactService.pageList(page,basicdataStoreContact); return R.data(pages); } @@ -101,11 +102,7 @@ public class BasicdataStoreContactController extends BladeController { List storeContactEntities = basicdataStoreContactService.list(Wrappers.query().lambda() .eq(BasicdataStoreContactEntity::getShopId, basicdataStoreContact.getShopId()) ); - if(storeContactEntities.size() > 0){ - basicdataStoreContact.setDefaultType(false); - }else{ - basicdataStoreContact.setDefaultType(true); - } + basicdataStoreContact.setDefaultType(storeContactEntities.size() <= 0); return R.status(basicdataStoreContactService.save(basicdataStoreContact)); } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/dto/BasicdataPriceRouteImportDTO.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/dto/BasicdataPriceRouteImportDTO.java new file mode 100644 index 000000000..9d707993b --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/dto/BasicdataPriceRouteImportDTO.java @@ -0,0 +1,73 @@ +/* + * 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.basicdata.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 基础价格路径 数据传输对象实体类 + * + * @author zqb + * @since 2024-04-08 + */ +@Data +public class BasicdataPriceRouteImportDTO implements Serializable { + + /** + * 客户编码 + */ + private String clientCode; + /** + * 品牌 + */ + private String brand; + /** + * 发货单位 + */ + private String sendOrgCode; + /** + * 发站省 + */ + private String startProvince; + /** + * 发站市 + */ + private String startCity; + /** + * 发站区 + */ + private String startArea; + /** + * 到站省 + */ + private String endProvince; + /** + * 到站市 + */ + private String endCity; + /** + * 到站区 + */ + private String endArea; + /** + * 类型 提货,干线 + */ + private String type; + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/DispatchPricingTypeEnums.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/DispatchPricingTypeEnums.java index 3af7fba8c..2ed67c096 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/DispatchPricingTypeEnums.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/DispatchPricingTypeEnums.java @@ -10,14 +10,14 @@ import org.springblade.common.model.IDict; */ public enum DispatchPricingTypeEnums implements IDict { - PIECE(1, "按件计费"), - WEIGHT(2, "按重量计费"), - CUBE(3, "按方计费"), - COMPLETE_VEHICLE(4, "按整车计费"), - DESTINATIONS_NUMBER(5, "按点位计费"), - TON_PER_KILOMETER(6, "按吨公里计费"), - KILOMETER(7, "按公里计费"), - TON(8, "按吨计费"), + PIECE(1, "按件"), + WEIGHT(2, "按重量"), + CUBE(3, "按方"), + COMPLETE_VEHICLE(4, "按整车"), + DESTINATIONS_NUMBER(5, "按点位"), + TON_PER_KILOMETER(6, "按吨公里"), + KILOMETER(7, "按公里"), + TON(8, "按吨"), ; DispatchPricingTypeEnums(Integer code, String text) { diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/FullVehicleTypeEnums.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/FullVehicleTypeEnums.java index 2ad5f0f67..f523c686b 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/FullVehicleTypeEnums.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/FullVehicleTypeEnums.java @@ -10,9 +10,9 @@ import org.springblade.common.model.IDict; */ public enum FullVehicleTypeEnums implements IDict { - PICK_UP(1, "提货整车"), - TRUNK_LINE(2, "干线整车"), - DISPATCH(4, "配送整车"), + PICK_UP(1, "提货"), + TRUNK_LINE(2, "干线"), + DISPATCH(4, "配送"), ; FullVehicleTypeEnums(Integer code, String text) { diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/WarehousePricingTypeEnums.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/WarehousePricingTypeEnums.java index 430f075ac..f572bda2e 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/WarehousePricingTypeEnums.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/enums/WarehousePricingTypeEnums.java @@ -12,8 +12,8 @@ public enum WarehousePricingTypeEnums implements IDict { PIECE(1, "按件"), CUBE(2, "按方"), - WEIGHT(3, "按重量(Kg)"), - TONNE(4, "按吨(t)"), + WEIGHT(3, "按重量"), + TONNE(4, "按吨"), ; WarehousePricingTypeEnums(Integer code, String text) { diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/BasicdataFactoryCategoryImporter.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/BasicdataFactoryCategoryImporter.java index ee79bbc09..587965f67 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/BasicdataFactoryCategoryImporter.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/BasicdataFactoryCategoryImporter.java @@ -41,6 +41,7 @@ public class BasicdataFactoryCategoryImporter implements ExcelImporter lambdaQueryWrapper1 = new LambdaQueryWrapper<>(); lambdaQueryWrapper1.eq(BasicdataFactoryCategoryEntity::getIsDeleted, 0); List allBasicdataFactoryCategoryEntities = basicdataFactoryCategoryService.list(lambdaQueryWrapper1); + //todo 这里的优化 是最好能进行品牌分组 获取对应的品牌数据 来进行匹配 这样可以减少循环次数 List basicdataFactoryCategoryEntities = new ArrayList<>(); diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceCategoryBasicExcel.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceCategoryBasicExcel.java new file mode 100644 index 000000000..05cb55f59 --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceCategoryBasicExcel.java @@ -0,0 +1,74 @@ +/* + * 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.basicdata.excel.price; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serializable; + + +/** + * 价格 Excel实体类 + * + * @author chao + * @since 2024-04-19 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BasicdataPriceCategoryBasicExcel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = {"客户名称", "客户名称"}, index = 0) + private String client; + @ExcelProperty(value = {"客户编码", "客户编码"}, index = 1) + private String clientCode; + @ExcelProperty(value = {"品牌", "品牌"}, index = 2) + private String brand; + @ExcelProperty(value = {"发站", "省"}, index = 3) + private String startProvince; + @ExcelProperty(value = {"发站", "市"}, index = 4) + private String startCity; + @ExcelProperty(value = {"发站", "区"}, index = 5) + private String startArea; + @ExcelProperty(value = {"到站", "省"}, index = 6) + private String endProvince; + @ExcelProperty(value = {"到站", "市"}, index = 7) + private String endCity; + @ExcelProperty(value = {"到站", "区"}, index = 8) + private String endArea; + @ExcelProperty(value = {"发货单位", "发货单位"}, index = 9) + private String sendOrg; + @ExcelProperty(value = {"发货单位", "发货单位编码"}, index = 10) + private String sendOrgCode; + @ExcelProperty(value = {"类型", "类型"}, index = 11) + private String type; + @ExcelProperty(value = {"计价方式", "计价方式"}, index = 12) + private String costType; + @ExcelProperty(value = {"品类", "品类"}, index = 13) + private String category; + @ExcelProperty(value = {"单价", "单价"}, index = 14) + private String price; + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceCategoryDispatchExcel.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceCategoryDispatchExcel.java new file mode 100644 index 000000000..bd96cb769 --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceCategoryDispatchExcel.java @@ -0,0 +1,68 @@ +/* + * 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.basicdata.excel.price; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serializable; + + +/** + * 价格 Excel实体类 + * + * @author chao + * @since 2024-04-19 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BasicdataPriceCategoryDispatchExcel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = {"客户名称", "客户名称"}, index = 0) + private String client; + @ExcelProperty(value = {"客户编码", "客户编码"}, index = 1) + private String clientCode; + @ExcelProperty(value = {"品牌", "品牌"}, index = 2) + private String brand; + @ExcelProperty(value = {"费用类型", "费用类型"}, index = 3) + private String type; + @ExcelProperty(value = {"品类", "品类"}, index = 4) + private String category; + @ExcelProperty(value = {"一般计费", "计价方式"}, index = 5) + private String costType; + @ExcelProperty(value = {"一般计费", "单价"}, index = 6) + private String price; + @ExcelProperty(value = {"一般计费", "单价"}, index = 7) + private String leaveBehindPrice; + @ExcelProperty(value = {"附加费", "分货费"}, index = 8) + private String sortPrice; + @ExcelProperty(value = {"附加费", "操作/装卸费"}, index = 9) + private String handlingPrice; + @ExcelProperty(value = {"附加费", "平移费"}, index = 10) + private String relocationPrice; + @ExcelProperty(value = {"附加费", "上楼费"}, index = 11) + private String upstairsDeliveryPrice; + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceCategoryWarehouseExcel.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceCategoryWarehouseExcel.java new file mode 100644 index 000000000..c46b93af6 --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceCategoryWarehouseExcel.java @@ -0,0 +1,70 @@ +/* + * 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.basicdata.excel.price; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serializable; + + +/** + * 价格 Excel实体类 + * + * @author chao + * @since 2024-04-19 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BasicdataPriceCategoryWarehouseExcel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = {"客户名称", "客户名称"}, index = 0) + private String client; + @ExcelProperty(value = {"客户编码", "客户编码"}, index = 1) + private String clientCode; + @ExcelProperty(value = {"品牌", "品牌"}, index = 2) + private String brand; + @ExcelProperty(value = {"费用类型", "费用类型"}, index = 3) + private String type; + @ExcelProperty(value = {"计价方式", "计价方式"}, index = 4) + private String costType; + @ExcelProperty(value = {"品类", "品类"}, index = 5) + private String category; + @ExcelProperty(value = {"一般计费", "30天内"}, index = 6) + private String withinThirtyPrice; + @ExcelProperty(value = {"一般计费", "30-60天"}, index = 7) + private String betweenThirtySixtyPrice; + @ExcelProperty(value = {"一般计费", "60天外"}, index = 8) + private String beyondSixtyPrice; + @ExcelProperty(value = {"一般计费", "上限价格"}, index = 9) + private String maximumPrice; + @ExcelProperty(value = {"附加费", "操作/装卸费"}, index = 10) + private String operatePrice; + @ExcelProperty(value = {"附加费", "仓储管理费"}, index = 11) + private String warehouseManagementPrice; + @ExcelProperty(value = {"附加费", "仓储分货费"}, index = 12) + private String warehouseSortPrice; + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceExcel.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceExcel.java new file mode 100644 index 000000000..9ce97cc41 --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceExcel.java @@ -0,0 +1,89 @@ +/* + * 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.basicdata.excel.price; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.logpm.basicdata.util.TrimConverter; +import lombok.Data; + +import java.io.Serializable; + + +/** + * 价格 Excel实体类 + * + * @author chao + * @since 2024-04-19 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BasicdataPriceExcel implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 客户名称 + */ + @ExcelProperty(value = "客户名称", index = 0) + private String client; + @ExcelProperty(value = "客户编码", index = 1) + private String clientCode; + /** + * 品牌 + */ + @ExcelProperty(value = "品牌", index = 2) + private String brand; + /** + * 生效时间 + */ + @ExcelProperty(value = "生效时间", index = 3) + private String effectiveTime; + /** + * 到期时间 + */ + @ExcelProperty(value = "到期时间", index = 4) + private String expiryTime; + /** + * 模版名称 + */ + @ExcelProperty(value = "模版名称", index = 5) + private String templateName; + /** + * 向上判断件数 + */ + @ExcelProperty(value = "向上判断件数", index = 6) + private String dispatchUpwardJudgment; + + /** + * 向上判断加价 + */ + @ExcelProperty(value = "向上判断加价", index = 7) + private String dispatchUpwardJudgmentCost; + + /** + * 上楼费免费楼层 + */ + @ExcelProperty(value = "上楼费免费楼层", index = 8) + private String dispatchStairsCarryingCharge; + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceFullVehicleExcel.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceFullVehicleExcel.java new file mode 100644 index 000000000..f68ac2a9c --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceFullVehicleExcel.java @@ -0,0 +1,72 @@ +/* + * 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.basicdata.excel.price; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serializable; + + +/** + * 价格 Excel实体类 + * + * @author chao + * @since 2024-04-19 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BasicdataPriceFullVehicleExcel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = {"客户名称", "客户名称"}, index = 0) + private String client; + @ExcelProperty(value = "客户编码", index = 1) + private String clientCode; + @ExcelProperty(value = {"品牌", "品牌"}, index = 2) + private String brand; + @ExcelProperty(value = {"发站", "省"}, index = 3) + private String startProvince; + @ExcelProperty(value = {"发站", "市"}, index = 4) + private String startCity; + @ExcelProperty(value = {"发站", "区"}, index = 5) + private String startArea; + @ExcelProperty(value = {"到站", "省"}, index = 6) + private String endProvince; + @ExcelProperty(value = {"到站", "市"}, index = 7) + private String endCity; + @ExcelProperty(value = {"到站", "区"}, index = 8) + private String endArea; + @ExcelProperty(value = {"发货单位", "发货单位"}, index = 9) + private String sendOrg; + @ExcelProperty(value = {"发货单位", "发货单位编码"}, index = 10) + private String sendOrgCode; + @ExcelProperty(value = {"类型", "类型"}, index = 11) + private String type; + @ExcelProperty(value = {"车型", "车型"}, index = 12) + private String vehicleType; + @ExcelProperty(value = {"价格", "价格"}, index = 13) + private String price; + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceGeneralExcel.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceGeneralExcel.java new file mode 100644 index 000000000..6db988da5 --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/price/BasicdataPriceGeneralExcel.java @@ -0,0 +1,72 @@ +/* + * 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.basicdata.excel.price; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serializable; + + +/** + * 价格 Excel实体类 + * + * @author chao + * @since 2024-04-19 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BasicdataPriceGeneralExcel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = {"客户名称", "客户名称"}, index = 0) + private String client; + @ExcelProperty(value = "客户编码", index = 1) + private String clientCode; + @ExcelProperty(value = {"品牌", "品牌"}, index = 2) + private String brand; + @ExcelProperty(value = {"发站", "省"}, index = 3) + private String startProvince; + @ExcelProperty(value = {"发站", "市"}, index = 4) + private String startCity; + @ExcelProperty(value = {"发站", "区"}, index = 5) + private String startArea; + @ExcelProperty(value = {"到站", "省"}, index = 6) + private String endProvince; + @ExcelProperty(value = {"到站", "市"}, index = 7) + private String endCity; + @ExcelProperty(value = {"到站", "区"}, index = 8) + private String endArea; + @ExcelProperty(value = {"发货单位", "发货单位"}, index = 9) + private String sendOrg; + @ExcelProperty(value = {"发货单位", "发货单位编码"}, index = 10) + private String sendOrgCode; + @ExcelProperty(value = {"类型", "类型"}, index = 11) + private String type; + @ExcelProperty(value = {"最低计费值", "最低计费值"}, index = 12) + private String minCost; + @ExcelProperty(value = {"加算价格", "加算价格"}, index = 13) + private String addCost; + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceCategoryV2Excel.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceCategoryV2Excel.java new file mode 100644 index 000000000..1f05060d9 --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceCategoryV2Excel.java @@ -0,0 +1,104 @@ +/* + * 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.basicdata.excel.pricev2; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serializable; + + +/** + * 价格 Excel实体类 + * + * @author chao + * @since 2024-04-19 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BasicdataPriceCategoryV2Excel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = {"商场名称", "商场名称"}, index = 0) + private String client; + @ExcelProperty(value = {"品牌", "品牌"}, index = 1) + private String brand; + @ExcelProperty(value = {"发站", "省"}, index = 2) + private String startProvince; + @ExcelProperty(value = {"发站", "市"}, index = 3) + private String startCity; + @ExcelProperty(value = {"发站", "区"}, index = 4) + private String startArea; + @ExcelProperty(value = {"到站", "省"}, index = 5) + private String endProvince; + @ExcelProperty(value = {"到站", "市"}, index = 6) + private String endCity; + @ExcelProperty(value = {"到站", "区"}, index = 7) + private String endArea; + @ExcelProperty(value = {"发货单位", "发货单位编码"}, index = 8) + private String sendOrgCode; + @ExcelProperty(value = {"发货单位", "发货单位"}, index = 9) + private String sendOrg; + @ExcelProperty(value = {"品类", "品类"}, index = 10) + private String category; + @ExcelProperty(value = {"提货", "单位"}, index = 11) + private String pickupUnit; + @ExcelProperty(value = {"提货", "单价"}, index = 12) + private String pickupPrice; + @ExcelProperty(value = {"干线", "单位"}, index = 13) + private String trunkLineUnit; + @ExcelProperty(value = {"干线", "单价"}, index = 14) + private String trunkLinePrice; + @ExcelProperty(value = {"仓储", "30天内"}, index = 15) + private String withinThirtyPrice; + @ExcelProperty(value = {"仓储", "30-60天"}, index = 16) + private String betweenThirtySixtyPrice; + @ExcelProperty(value = {"仓储", "60-90天"}, index = 17) + private String beyondSixtyPrice; + @ExcelProperty(value = {"仓储", "90天以上"}, index = 18) + private String beyondNinetyPrice; + @ExcelProperty(value = {"仓储附加费", "仓储操作/装卸费"}, index = 19) + private String warehouseOperatePrice; + @ExcelProperty(value = {"仓储附加费", "仓储管理费"}, index = 20) + private String warehouseManagementPrice; + @ExcelProperty(value = {"仓储附加费", "仓储分货费"}, index = 21) + private String warehouseSortPrice; + @ExcelProperty(value = {"配送", "单位"}, index = 22) + private String dispatchUnit; + @ExcelProperty(value = {"配送", "一般单价"}, index = 23) + private String dispatchPrice; + @ExcelProperty(value = {"配送", "遗留单价"}, index = 24) + private String dispatchLeaveBehindPrice; + @ExcelProperty(value = {"配送附加费", "分货费"}, index = 25) + private String dispatchSortPrice; + @ExcelProperty(value = {"配送附加费", "操作/装卸费价格"}, index = 26) + private String dispatchHandlingPrice; + @ExcelProperty(value = {"配送附加费", "平移费价格"}, index = 27) + private String dispatchRelocationPrice; + @ExcelProperty(value = {"配送附加费", "上楼费价格"}, index = 28) + private String dispatchDeliveryPrice; + @ExcelProperty(value = {"配送附加费", "上楼免楼层数"}, index = 29) + private String dispatchStairsCarryingCharge; + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceFullVehicleV2Excel.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceFullVehicleV2Excel.java new file mode 100644 index 000000000..a27bd5b0f --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceFullVehicleV2Excel.java @@ -0,0 +1,72 @@ +/* + * 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.basicdata.excel.pricev2; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serializable; + + +/** + * 价格 Excel实体类 + * + * @author chao + * @since 2024-04-19 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BasicdataPriceFullVehicleV2Excel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = {"商场名称", "商场名称"}, index = 0) + private String client; + @ExcelProperty(value = {"品牌", "品牌"}, index = 1) + private String brand; + @ExcelProperty(value = {"发站", "省"}, index = 2) + private String startProvince; + @ExcelProperty(value = {"发站", "市"}, index = 3) + private String startCity; + @ExcelProperty(value = {"发站", "区"}, index = 4) + private String startArea; + @ExcelProperty(value = {"到站", "省"}, index = 5) + private String endProvince; + @ExcelProperty(value = {"到站", "市"}, index = 6) + private String endCity; + @ExcelProperty(value = {"到站", "区"}, index = 7) + private String endArea; + @ExcelProperty(value = {"发货单位", "发货单位ID"}, index = 8) + private String sendOrgCode; + @ExcelProperty(value = {"发货单位", "发货单位"}, index = 9) + private String sendOrg; + @ExcelProperty(value = {"车型", "车型"}, index = 10) + private String vehicleType; + @ExcelProperty(value = {"提货", "单价"}, index = 11) + private String pickupPrice; + @ExcelProperty(value = {"干线", "单价"}, index = 12) + private String trunkLinePrice; + @ExcelProperty(value = {"配送", "单价"}, index = 13) + private String dispatchPrice; + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceGeneralV2Excel.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceGeneralV2Excel.java new file mode 100644 index 000000000..2a2879b03 --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceGeneralV2Excel.java @@ -0,0 +1,84 @@ +/* + * 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.basicdata.excel.pricev2; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serializable; + + +/** + * 价格 Excel实体类 + * + * @author chao + * @since 2024-04-19 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BasicdataPriceGeneralV2Excel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = {"商场名称", "商场名称"}, index = 0) + private String client; + @ExcelProperty(value = {"品牌", "品牌"}, index = 1) + private String brand; + @ExcelProperty(value = {"发站", "省"}, index = 2) + private String startProvince; + @ExcelProperty(value = {"发站", "市"}, index = 3) + private String startCity; + @ExcelProperty(value = {"发站", "区"}, index = 4) + private String startArea; + @ExcelProperty(value = {"到站", "省"}, index = 5) + private String endProvince; + @ExcelProperty(value = {"到站", "市"}, index = 6) + private String endCity; + @ExcelProperty(value = {"到站", "区"}, index = 7) + private String endArea; + @ExcelProperty(value = {"发货单位", "发货单位ID"}, index = 8) + private String sendOrgCode; + @ExcelProperty(value = {"发货单位", "发货单位"}, index = 9) + private String sendOrg; + @ExcelProperty(value = {"提货", "最低计费"}, index = 10) + private String pickupMinCost; + @ExcelProperty(value = {"提货", "加算价格"}, index = 11) + private String pickupAddCost; + @ExcelProperty(value = {"干线", "最低计费"}, index = 12) + private String trunkLineMinCost; + @ExcelProperty(value = {"干线", "加算价格"}, index = 13) + private String trunkLineAddCost; + @ExcelProperty(value = {"配送", "最低计费"}, index = 14) + private String dispatchMinCost; + @ExcelProperty(value = {"配送", "加算价格"}, index = 15) + private String dispatchAddCost; + @ExcelProperty(value = {"配送", "向上判断件数"}, index = 16) + private String dispatchUpwardJudgment; + @ExcelProperty(value = {"配送", "向上判断加价"}, index = 17) + private String dispatchUpwardJudgmentCost; + @ExcelProperty(value = {"配送", "遗留最低计费"}, index = 18) + private String dispatchLeaveBehindMinCost; + @ExcelProperty(value = {"配送", "遗留加算价格"}, index = 19) + private String dispatchLeaveBehindAddCost; + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceV2Excel.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceV2Excel.java new file mode 100644 index 000000000..d045708fc --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/excel/pricev2/BasicdataPriceV2Excel.java @@ -0,0 +1,86 @@ +/* + * 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.basicdata.excel.pricev2; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serializable; + + +/** + * 价格 Excel实体类 + * + * @author chao + * @since 2024-04-19 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BasicdataPriceV2Excel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = "商场编码(工厂)", index = 0) + private String clientCode; + /** + * 客户名称 + */ + @ExcelProperty(value = "商场名称", index = 1) + private String client; + /** + * 品牌 + */ + @ExcelProperty(value = "品牌", index = 2) + private String brand; + /** + * 生效时间 + */ + @ExcelProperty(value = "生效日期", index = 3) + private String effectiveTime; + /** + * 到期时间 + */ + @ExcelProperty(value = "截止日期", index = 4) + private String expiryTime; + /** + * 配送服务类型 + */ + @ExcelProperty(value = "配送服务类型", index = 5) + private String serviceType; + /** + * 结算方式 + */ + @ExcelProperty(value = "结算方式", index = 6) + private String settlementMethod; + /** + * 付款方 + */ + @ExcelProperty(value = "付款方", index = 7) + private String payingParty; + /** + * 模版名称 + */ + @ExcelProperty(value = "模版名称", index = 8) + private String templateName; + +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataClientClient.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataClientClient.java index 97402e729..3d7cee748 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataClientClient.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataClientClient.java @@ -26,6 +26,7 @@ import com.logpm.basicdata.entity.BasicdataClientEntity; import com.logpm.basicdata.entity.BasicdataClientUserEntity; import com.logpm.basicdata.service.IBasicdataClientService; import com.logpm.basicdata.service.IBasicdataClientUserService; +import com.logpm.basicdata.vo.BasicdataClientVO; import lombok.AllArgsConstructor; import org.springblade.core.mp.support.BladePage; import org.springblade.core.mp.support.Condition; @@ -99,6 +100,11 @@ public class BasicdataClientClient implements IBasicdataClientClient { return basicdataClientService.getById(clientId); } + @Override + public BasicdataClientVO findEntityVoById(Long clientId) { + return basicdataClientService.findEntityVoById(clientId); + } + @Override @PostMapping(API_PREFIX+"/addReturnId") public Long addReturnId(BasicdataClientEntity basicdataClientEntity) { @@ -121,4 +127,18 @@ public class BasicdataClientClient implements IBasicdataClientClient { return basicdataClientService.getById(mallId); } + /** + * @param consigneeUnit + * @return + */ + @Override + public List getClientByName(String consigneeUnit) { + return basicdataClientService.list(Wrappers.query().lambda().eq(BasicdataClientEntity::getClientName,consigneeUnit)); + } + + @Override + public List findEntityByIds(List clientIds) { + return basicdataClientService.listByIds(clientIds); + } + } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataCodeClient.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataCodeClient.java index 11156019c..4d1f5ab0e 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataCodeClient.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataCodeClient.java @@ -1,11 +1,12 @@ package com.logpm.basicdata.feign; -import com.logpm.basicdata.entity.BasicdataClientEntity; import com.logpm.basicdata.service.IBasicdataCodeService; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; +import java.util.List; + @ApiIgnore() @RestController @AllArgsConstructor @@ -18,4 +19,9 @@ public class BasicdataCodeClient implements IBasicdataCodeClient { return basicdataCodeService.getCodeByType(type,warehouseCode,orderCode); } + @Override + public List getBatchPackageCodeByType(String warehouseCode, String orderCode, Integer num) { + return basicdataCodeService.getBatchPackageCodeByType(warehouseCode,orderCode,num); + } + } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataDriverArteryClient.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataDriverArteryClient.java index bc7d5621d..a40942a87 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataDriverArteryClient.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataDriverArteryClient.java @@ -22,15 +22,18 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.logpm.basicdata.entity.BasicdataDriverArteryEntity; import com.logpm.basicdata.mapper.BasicdataDriverArteryMapper; import com.logpm.basicdata.service.IBasicdataDriverArteryService; +import com.logpm.basicdata.vo.BasicdataDriverArteryVO; import lombok.AllArgsConstructor; import org.springblade.core.mp.support.BladePage; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; +import org.springblade.core.tool.utils.StringUtil; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -69,16 +72,29 @@ public class BasicdataDriverArteryClient implements IBasicdataDriverArteryClient @Override public List findDriverListByName(String driverName) { - List ls = basicdataDriverArteryService.findDriverListByName(driverName); + List ls = basicdataDriverArteryService.findDriverListByName(driverName); List list = new ArrayList<>(); - for (BasicdataDriverArteryEntity driverArteryEntity:ls){ + for (BasicdataDriverArteryVO driverArteryEntity:ls){ JSONObject jsonObject = new JSONObject(); jsonObject.put("driverId",driverArteryEntity.getId()); jsonObject.put("driverName",driverArteryEntity.getName()); jsonObject.put("driverPhone",driverArteryEntity.getPhone()); + jsonObject.put("driverType",driverArteryEntity.getType()); + String carNumbers = driverArteryEntity.getCarNumbers(); + List carNumberList = new ArrayList<>(); + if(StringUtil.isNotBlank(carNumbers)){ + String[] split = carNumbers.split(","); + carNumberList.addAll(Arrays.asList(split)); + } + jsonObject.put("carNumberList",carNumberList); list.add(jsonObject); } return list; } + @Override + public BasicdataDriverArteryEntity getDriverArteryById(Long id) { + return basicdataDriverArteryService.getById(id); + } + } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataFactoryCategoryEntityClient.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataFactoryCategoryEntityClient.java index 3f11d92b5..ccb1c6e7b 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataFactoryCategoryEntityClient.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataFactoryCategoryEntityClient.java @@ -1,11 +1,14 @@ package com.logpm.basicdata.feign; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.logpm.basicdata.entity.BasicdataFactoryCategoryEntity; import com.logpm.basicdata.service.IBasicdataFactoryCategoryService; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; +import java.util.concurrent.locks.Condition; + @ApiIgnore() @RestController @AllArgsConstructor @@ -17,4 +20,35 @@ public class BasicdataFactoryCategoryEntityClient implements IBasicdataFactoryCa public BasicdataFactoryCategoryEntity findEntityByAdvanceDetailIds(Integer current, Integer size) { return null; } + + @Override + public BasicdataFactoryCategoryEntity findEntityByThreeCategory(BasicdataFactoryCategoryEntity entity) { + return factoryCategoryService.getOne(Wrappers.query().lambda() + .eq(BasicdataFactoryCategoryEntity::getFirsts,entity.getFirsts()) + .eq(BasicdataFactoryCategoryEntity::getSeconds,entity.getSeconds()) + .eq(BasicdataFactoryCategoryEntity::getThirds,entity.getThirds()) + .eq(BasicdataFactoryCategoryEntity::getMaterielName,entity.getMaterielName()) + .eq(BasicdataFactoryCategoryEntity::getBrandId,entity.getBrandId()) + ); + } + + @Override + public BasicdataFactoryCategoryEntity findEntityByMaterielName(BasicdataFactoryCategoryEntity entity2) { + return factoryCategoryService.getOne(Wrappers.query().lambda() + .isNull(BasicdataFactoryCategoryEntity::getFirsts) + .isNull(BasicdataFactoryCategoryEntity::getSeconds) + .isNull(BasicdataFactoryCategoryEntity::getThirds) + .eq(BasicdataFactoryCategoryEntity::getMaterielName,entity2.getMaterielName()) + ); + } + + @Override + public BasicdataFactoryCategoryEntity findEntityByCategoryName(BasicdataFactoryCategoryEntity entity3) { + return factoryCategoryService.getOne(Wrappers.query().lambda() + .isNull(BasicdataFactoryCategoryEntity::getMaterielName) + .isNull(BasicdataFactoryCategoryEntity::getSeconds) + .isNull(BasicdataFactoryCategoryEntity::getThirds) + .eq(BasicdataFactoryCategoryEntity::getFirsts,entity3.getFirsts()) + ); + } } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataGoodsAllocationClient.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataGoodsAllocationClient.java index e8b6b4354..34c2b95c8 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataGoodsAllocationClient.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataGoodsAllocationClient.java @@ -114,4 +114,12 @@ public class BasicdataGoodsAllocationClient implements IBasicdataGoodsAllocation return BasicdataGoodsAllocationService.findStockUpAllocationById(warehouseId,stockUpAllocationId); } + @Override + public void updateListAllocationStatus(List updateAllocationIds, String allocationStatus) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("allocation_status",allocationStatus) + .in("id",updateAllocationIds); + BasicdataGoodsAllocationService.update(updateWrapper); + } + } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataOpenIncomingClient.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataOpenIncomingClient.java index 984a7324a..5cedadd9f 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataOpenIncomingClient.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataOpenIncomingClient.java @@ -18,10 +18,6 @@ public class BasicdataOpenIncomingClient implements IBasicdataOpenIncomingClient @Override public Boolean checkOpenIncoming(Long warehouseId, Long brandId) { BasicdataOpenIncomingSettingEntity settingEntity = basicdataOpenIncomingSettingService.findEntityByParam(warehouseId,brandId); - if(Objects.isNull(settingEntity)){ - return false; - }else{ - return true; - } + return !Objects.isNull(settingEntity); } } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataPriceClient.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataPriceClient.java index 2a415a4ca..c786df678 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataPriceClient.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataPriceClient.java @@ -19,10 +19,13 @@ package com.logpm.basicdata.feign; import com.logpm.basicdata.service.IBasicdataPriceService; import com.logpm.basicdata.vo.BasicdatPriceApiVO; import com.logpm.basicdata.vo.PriceClientVO; +import com.logpm.basicdata.vo.PriceDispatchAddClientVO; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; +import java.util.List; + /** * 基础价格 Feign实现类 * @@ -37,8 +40,13 @@ public class BasicdataPriceClient implements IBasicdataPriceClient { private final IBasicdataPriceService basicdataPriceService; @Override - public PriceClientVO pirce(BasicdatPriceApiVO param) { + public PriceClientVO price(BasicdatPriceApiVO param) { return basicdataPriceService.price(param); } + @Override + public List dispatchAddPrice(BasicdatPriceApiVO param) { + return basicdataPriceService.dispatchAddPrice(param); + } + } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataTrayClient.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataTrayClient.java index 19344b550..129062373 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataTrayClient.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataTrayClient.java @@ -109,4 +109,20 @@ public class BasicdataTrayClient implements IBasicdataTrayClient { return basicdataTrayService.getOne(queryWrapper); } + @Override + public BasicdataTrayEntity findByTrayName(String positions) { + return basicdataTrayService.list(Wrappers.query().lambda() + .eq(BasicdataTrayEntity::getPalletName,positions) + ).get(0); + } + + @Override + public void updateTrayStatusByTrayIds(List trayIds, int trayStatus) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("tray_status",trayStatus) + .in("id",trayIds) + .eq("is_deleted",0); + basicdataTrayService.update(updateWrapper); + } + } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataTripartiteMallClient.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataTripartiteMallClient.java index 09c3a9190..44ae55521 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataTripartiteMallClient.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataTripartiteMallClient.java @@ -16,6 +16,8 @@ */ package com.logpm.basicdata.feign; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.basicdata.entity.BasicdataTripartiteMallEntity; import com.logpm.basicdata.service.IBasicdataTripartiteMallService; @@ -27,6 +29,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; +import java.util.List; + /** * 客户三方商城 Feign实现类 * @@ -55,4 +59,23 @@ public class BasicdataTripartiteMallClient implements IBasicdataTripartiteMallCl return basicdataTripartiteMallService.getClientIdByNameAndBrand(name,brand); } + @Override + public Long getClientIdByNameAndBrandAndCode(String name, String code, String brand) { + return basicdataTripartiteMallService.getClientIdByNameAndBrandAndCode(name,code,brand); + } + + @Override + public BasicdataTripartiteMallEntity findEntityByDealerNameAndDealerCodeAndBrand(String dealerName, String dealerCode, String brand) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("tripartite_mall",dealerName) + .eq("tripartite_coding",dealerCode) + .eq("brand_name",brand); + List list = basicdataTripartiteMallService.list(queryWrapper); + if(CollUtil.isEmpty(list)){ + return null; + }else{ + return list.get(0); + } + } + } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataVehicleClient.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataVehicleClient.java index 6c5598f94..f438b8c58 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataVehicleClient.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/feign/BasicdataVehicleClient.java @@ -63,6 +63,20 @@ public class BasicdataVehicleClient implements IBasicdataVehicleClient { public List findCarListByName(String carNumber) { List ls = basicdataVehicleService.findCarListByName(carNumber); List list = new ArrayList<>(); + ls.forEach(vehicleEntity -> { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("carId",vehicleEntity.getId()); + jsonObject.put("carNumber",vehicleEntity.getVehicleNub()); + String vehicleSource = vehicleEntity.getVehicleSource(); + if("3".equals(vehicleSource)){ + jsonObject.put("isOut",1); + }else{ + jsonObject.put("isOut",0); + } + list.add(jsonObject); + }); + + for (BasicdataVehicleEntity vehicleEntity:ls){ JSONObject jsonObject = new JSONObject(); jsonObject.put("carId",vehicleEntity.getId()); diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataBrandMapper.xml b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataBrandMapper.xml index 02ed9b94a..91893a6d3 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataBrandMapper.xml +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataBrandMapper.xml @@ -17,7 +17,8 @@ diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataCategoryMapper.xml b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataCategoryMapper.xml index 214df9e81..d05cdb269 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataCategoryMapper.xml +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataCategoryMapper.xml @@ -106,11 +106,10 @@ select id goodsId, `name` goodsName from logpm_basicdata_category - where 1=1 + where 1=1 and is_deleted = 0 and `name` like concat('%',#{goodsName},'%') - limit 10 @@ -59,9 +59,15 @@ lbc.client_name clientName, lbsc.linkman linkMan, lbsc.phone linkPhone, - lbc.detailedly linkAddress + lbc.detailedly linkAddress, + lbc.blade_region_province_id provinceId, + lbc.blade_region_city_id cityId, + lbc.blade_region_area_id areaId, + lbc.default_payment_methods defaultPayWay, + t.brand_id brandId from logpm_basicdata_client lbc left join logpm_basicdata_store_contact lbsc on lbsc.shop_id = lbc.id + left join (select lbsb.client_id,max(lbsb.brand_id) brand_id from logpm_basicdata_store_brand lbsb group by lbsb.client_id) t on t.client_id = lbc.id where lbc.is_deleted = 0 and lbc.client_name like CONCAT('%',#{clientName},'%') @@ -81,4 +87,95 @@ + + + + diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataDriverArteryMapper.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataDriverArteryMapper.java index 30313b661..ef8b4701a 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataDriverArteryMapper.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataDriverArteryMapper.java @@ -57,7 +57,7 @@ public interface BasicdataDriverArteryMapper extends BaseMapper selectBasicdataDictionary(); - List findDriverListByName(@Param("driverName") String driverName); + List findDriverListByName(@Param("driverName") String driverName); void updateIsdeletedByPhone(@Param("phone") String phone); diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataDriverArteryMapper.xml b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataDriverArteryMapper.xml index 3364c88b2..3045fbc95 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataDriverArteryMapper.xml +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataDriverArteryMapper.xml @@ -157,10 +157,20 @@ SELECT id,name,bind_vehicle FROM logpm_basicdata_driver_artery - + select lbda.id id, + lbda.name name, + lbda.phone phone, + lbda.type type, + group_concat(lbv.vehicle_nub) carNumbers + from logpm_basicdata_driver_artery lbda + left join logpm_basicdata_drivermiddle lbdm on lbdm.driver_id = lbda.id + left join logpm_basicdata_vehicle lbv on lbv.id = lbdm.brand_id where `name` like concat('%',#{driverName},'%') + group by lbda.id, + lbda.name, + lbda.phone, + lbda.type limit 10 select t.id, cli.client_name, - t.brand_id, + lbsb.brand_id, + lbsb.client_id, t.template_id, ldb.brand_name, lbpt.service_type, @@ -22,11 +23,13 @@ t.update_time, t.effective_time, t.expiry_time - from logpm_basicdata_price t + from logpm_basicdata_store_brand lbsb + left join logpm_basicdata_client cli on cli.id = lbsb.client_id + left join logpm_basicdata_price t on lbsb.client_id = t.client_id + and lbsb.brand_id = t.brand_id and t.effective_time now() and t.expiry_time >= now() + left join logpm_basicdata_brand ldb on ldb.id = lbsb.brand_id left join logpm_basicdata_price_template lbpt on t.template_id = lbpt.id - left join logpm_basicdata_client cli on cli.id = t.client_id - left join logpm_basicdata_brand ldb on ldb.id = t.brand_id - where t.is_deleted = 0 + where lbsb.is_deleted = 0 and cli.is_deleted = 0 and (t.is_deleted = 0 or t.id is null) and cli.client_name like concat('%',#{basicdataPrice.clientName},'%') @@ -42,11 +45,59 @@ - - - + select t.id, + cli.client_name, + t.brand_id, + t.client_id, + t.template_id, + ldb.brand_name, + lbpt.service_type, + case + when t.maintenance_status = 1 then '未维护' + when t.maintenance_status = 2 then '已维护' + else '' + end maintenance_status, + t.update_time, + t.effective_time, + t.expiry_time + from logpm_basicdata_price t + left join logpm_basicdata_price_template lbpt on t.template_id = lbpt.id + left join logpm_basicdata_client cli on cli.id = t.client_id + left join logpm_basicdata_brand ldb on ldb.id = t.brand_id + where t.is_deleted = 0 + and t.client_id = #{basicdataPrice.clientId} + and t.brand_id = #{basicdataPrice.brandId} + + diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataStoreContactMapper.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataStoreContactMapper.java index 21407d25e..34712963b 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataStoreContactMapper.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataStoreContactMapper.java @@ -25,6 +25,7 @@ import com.logpm.basicdata.vo.BasicdataStoreContactVO; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; /** * 基础门店联系人表 Mapper 接口 @@ -52,4 +53,7 @@ public interface BasicdataStoreContactMapper extends BaseMapper exportBasicdataStoreContact(@Param("ew") Wrapper queryWrapper); + IPage pageList(IPage page,@Param("param") Map basicdataStoreContact); + + } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataStoreContactMapper.xml b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataStoreContactMapper.xml index 9d8ba9b4a..673e24449 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataStoreContactMapper.xml +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataStoreContactMapper.xml @@ -18,5 +18,9 @@ + diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataTrayMapper.xml b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataTrayMapper.xml index 8c43cef07..3ff0cfc9a 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataTrayMapper.xml +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/mapper/BasicdataTrayMapper.xml @@ -61,7 +61,8 @@ tray.tray_status, warehouse.name AS warehouseName, tray.`type`, - lwtt.tray_type + lwtt.tray_type, + lwtt.filter_value FROM logpm_warehouse_tray AS tray left join logpm_warehouse_tray_type lwtt on tray.id = lwtt.tray_id and lwtt.is_deleted=0 @@ -171,23 +172,23 @@ + + diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataClientService.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataClientService.java index a56b0478b..448767517 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataClientService.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataClientService.java @@ -28,6 +28,7 @@ import org.springblade.core.mp.base.BaseService; import java.security.NoSuchAlgorithmException; import java.util.List; +import java.util.Map; /** * 基础客户表 服务类 @@ -99,4 +100,27 @@ public interface IBasicdataClientService extends BaseService findNameByIds(List sendOrgIds); + BasicdataClientVO findEntityVoById(Long clientId); + + + /** + * 客户列表查询 + * @param page + * @param basicdataClient + * @return + */ + IPage pageList(IPage page, Map basicdataClient); + + /** + * 查询客户编码 + * @return + */ + String getFinallyClientCode(); + + /** + * 保存客户信息 + * @param basicdataClient + * @return + */ + boolean saveClient(BasicdataClientEntity basicdataClient); } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataCodeService.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataCodeService.java index 5c71c2826..e9637e558 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataCodeService.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataCodeService.java @@ -1,7 +1,10 @@ package com.logpm.basicdata.service; +import java.util.List; + public interface IBasicdataCodeService { String getCodeByType(Integer type,String warehouseCode,String orderCode); + List getBatchPackageCodeByType(String warehouseCode, String orderCode, Integer num); } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataDriverArteryService.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataDriverArteryService.java index fbbfbcd75..38bf136c9 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataDriverArteryService.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataDriverArteryService.java @@ -70,5 +70,5 @@ public interface IBasicdataDriverArteryService extends BaseService data); - List findDriverListByName(String driverName); + List findDriverListByName(String driverName); } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataPriceService.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataPriceService.java index d01808f7a..4e217179b 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataPriceService.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataPriceService.java @@ -16,16 +16,16 @@ */ package com.logpm.basicdata.service; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.basicdata.entity.BasicdataPriceEntity; -import com.logpm.basicdata.excel.BasicdataPriceExcel; import com.logpm.basicdata.vo.BasicdatPriceApiVO; import com.logpm.basicdata.vo.BasicdataPriceBasicUpdateVO; import com.logpm.basicdata.vo.BasicdataPricePageVO; import com.logpm.basicdata.vo.PriceClientVO; +import com.logpm.basicdata.vo.PriceDispatchAddClientVO; import com.logpm.basicdata.vo.PriceVO; import org.springblade.core.mp.base.BaseService; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -45,15 +45,6 @@ public interface IBasicdataPriceService extends BaseService selectBasicdataPricePage(IPage page, BasicdataPricePageVO basicdataPrice); - - /** - * 导出数据 - * - * @param queryWrapper - * @return - */ - List exportBasicdataPrice(Wrapper queryWrapper); - Boolean basicUpdate(BasicdataPriceBasicUpdateVO vo); Boolean updatePrice(PriceVO vo); @@ -68,4 +59,31 @@ public interface IBasicdataPriceService extends BaseService hisPage(IPage page, BasicdataPricePageVO basicdataPrice); + + /** + * 删除待生效的价格 + * @param id + * @return + */ + Boolean deletePrice(String id); + + /** + * 根据客户品牌获取配送附加费 + * @param param + * @Return com.logpm.basicdata.vo.PriceDispatchAddClientVO + * @Author zqb 2024/7/3 + **/ + List dispatchAddPrice(BasicdatPriceApiVO param); } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataStoreContactService.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataStoreContactService.java index fc4572323..0c0bcb74e 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataStoreContactService.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataStoreContactService.java @@ -24,6 +24,7 @@ import com.logpm.basicdata.vo.BasicdataStoreContactVO; import org.springblade.core.mp.base.BaseService; import java.util.List; +import java.util.Map; /** * 基础门店联系人表 服务类 @@ -51,4 +52,13 @@ public interface IBasicdataStoreContactService extends BaseService exportBasicdataStoreContact(Wrapper queryWrapper); Boolean ownUpdateById(BasicdataStoreContactEntity basicdataStoreContact); + + /** + * 商场联系人查询 + * @param page + * @param basicdataStoreContact + * @return + */ + IPage pageList(IPage page, Map basicdataStoreContact); + } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataTripartiteMallService.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataTripartiteMallService.java index 4f4f2ce8e..d8bfcbaa2 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataTripartiteMallService.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/IBasicdataTripartiteMallService.java @@ -53,4 +53,6 @@ public interface IBasicdataTripartiteMallService extends BaseService getOwn(); + + Long getClientIdByNameAndBrandAndCode(String name, String code, String brand); } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataBrandServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataBrandServiceImpl.java index 5a5af037e..533659598 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataBrandServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataBrandServiceImpl.java @@ -57,6 +57,7 @@ public class BasicdataBrandServiceImpl extends BaseServiceImpl findAllList() { List allList = baseMapper.findAllList(); JSONObject jsonObject = new JSONObject(); + jsonObject.put("brandId",0); jsonObject.put("brandName","零担"); allList.add(0,jsonObject); return allList; diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataClientServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataClientServiceImpl.java index e046609bc..9d4f442b4 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataClientServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataClientServiceImpl.java @@ -17,6 +17,7 @@ package com.logpm.basicdata.service.impl; import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -25,6 +26,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.basic.entity.BasicTenantCodeEntity; +import com.logpm.basic.feign.IBasicTenantCodeClient; import com.logpm.basicdata.entity.BasicdataBrandEntity; import com.logpm.basicdata.entity.BasicdataClientEntity; import com.logpm.basicdata.entity.BasicdataHistoricalContractEntity; @@ -49,9 +52,13 @@ import com.logpm.basicdata.vo.BasicdataClientVO; import com.logpm.basicdata.vo.ClientInfoVO; import lombok.extern.slf4j.Slf4j; import org.springblade.common.constant.DictBizConstant; +import org.springblade.common.constant.RedisKeyConstant; +import org.springblade.common.constant.basiccode.BasicCodeShowConstant; +import org.springblade.common.constant.basiccode.BasicCodeTypeConstant; import org.springblade.common.model.dto.NameDTO; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.BeanUtil; @@ -64,13 +71,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static org.springblade.common.constant.DictBizConstant.OPEN_ORDER_PAY_WAY; @@ -104,9 +105,16 @@ public class BasicdataClientServiceImpl extends BaseServiceImpl selectBasicdataClientPage(IPage page, BasicdataClientVO basicdataClient) { return page.setRecords(baseMapper.selectBasicdataClientPage(page, basicdataClient)); @@ -127,9 +135,11 @@ public class BasicdataClientServiceImpl extends BaseServiceImpl typeServiceBusiness = basicdataClient.getTypeServiceBusiness(); List list = basicdataStoreBusinessService.list(Wrappers.query().lambda() .eq(BasicdataStoreBusinessEntity::getClientId, basicdataClient.getId()) ); @@ -161,7 +171,6 @@ public class BasicdataClientServiceImpl extends BaseServiceImpl list = basicdataHistoricalContractService.list(Wrappers.query().lambda() + .eq(BasicdataHistoricalContractEntity::getClientId, basicdataClient.getId()) + ); + boolean flag; + if (list.isEmpty()) { + flag = true; + } else { + flag = list.stream().anyMatch(f -> !f.getLeaseAccessories().equals(basicdataClient.getLeaseAccessories())); + } + if (flag) { + //添加历史合同 + BasicdataHistoricalContractEntity basicdataHistoricalContract = new BasicdataHistoricalContractEntity(); + basicdataHistoricalContract.setClientId(basicdataClient.getId().toString()); + basicdataHistoricalContract.setContractEntTime(basicdataClient.getContractEntTime()); + basicdataHistoricalContract.setContractStartTime(basicdataClient.getContractStartTime()); + basicdataHistoricalContract.setLeaseAccessories(basicdataClient.getLeaseAccessories()); + basicdataHistoricalContract.setFileName(basicdataClient.getFileName()); + basicdataHistoricalContractService.save(basicdataHistoricalContract); + basicdataHistoricalContractService.removeBatchByIds(list); + } } return true; @@ -256,22 +282,29 @@ public class BasicdataClientServiceImpl extends BaseServiceImpl listName(String name) { return baseMapper.selectList(Wrappers.query().lambda() - .like(StringUtils.isNotBlank(name), BasicdataClientEntity::getClientName, name) + .eq(StringUtils.isNotBlank(name), BasicdataClientEntity::getClientName, name) ); } @Override @Transactional(rollbackFor = Exception.class) public Boolean ownDeleteLogic(List toLongList) { + List clientIds = new ArrayList<>(); toLongList.forEach(i -> { List basicdataClientEntities = baseMapper.selectList(Wrappers.query().lambda() .eq(BasicdataClientEntity::getPid, i) ); if (!basicdataClientEntities.isEmpty()) { baseMapper.deleteBatchIds(basicdataClientEntities); + clientIds.addAll(basicdataClientEntities.stream().map(BasicdataClientEntity::getId).collect(Collectors.toList())); } - + clientIds.add(i); }); + // 删除客户品牌关系 + if (CollUtil.isNotEmpty(clientIds)) { + basicdataStoreBrandService.remove(Wrappers.query().lambda() + .in(BasicdataStoreBrandEntity::getClientId, clientIds)); + } return this.deleteLogic(toLongList); } @@ -359,8 +392,16 @@ public class BasicdataClientServiceImpl extends BaseServiceImpl>>>>> basicdataClient.getClientCode() {}", basicdataClient.getClientCode()); //查询客户编码和客户名称是否存在 - boolean b = basicdataClients.stream().anyMatch(ii -> ii.getClientCode().equals(basicdataClient.getClientCode()) - || ii.getClientName().equals(basicdataClient.getClientName().trim())); + boolean b = basicdataClients.stream().anyMatch(ii -> { + if (ii.getClientCode() != null && !ii.getClientCode().isEmpty()) { + log.info(">>>>>>>>>>>>> 1{}", ii.getClientCode()); + log.info(">>>>>>>>>>>>> 2{}", ii.getClientName()); + + return ii.getClientCode().equals(basicdataClient.getClientCode()) + || ii.getClientName().equals(basicdataClient.getClientName().trim()); + } + return false; + }); if (b) { List basicdataClientEntities = basicdataClients.stream().filter(ii -> ii.getClientCode().equals(basicdataClient.getClientCode()) @@ -379,7 +420,7 @@ public class BasicdataClientServiceImpl extends BaseServiceImpl ls = baseMapper.findListByClientName(clientName, linkMan, linkPhone); List list = new ArrayList<>(); for (ClientInfoVO clientInfoVO : ls) { - list.add(JSONObject.parseObject(JSONObject.toJSONString(clientInfoVO))); + list.add(JSON.parseObject(JSON.toJSONString(clientInfoVO))); } return list; } @@ -623,4 +664,54 @@ public class BasicdataClientServiceImpl extends BaseServiceImpl pageList(IPage page, Map basicdataClient) { + + return baseMapper.pageList(page, basicdataClient); + } + + @Override + public String getFinallyClientCode() { + + String tenantCode ="HT"; + BasicTenantCodeEntity basicTenantCodeByCodeAndShowType = basicTenantCodeClient.findBasicTenantCodeByCodeAndShowType(BasicCodeTypeConstant.CLIENT_CODE.getValue(), BasicCodeShowConstant.QR_CODE.getValue()); + if (ObjectUtils.isNull(basicTenantCodeByCodeAndShowType)) { + log.error("获取货区码失败"); + }else{ + tenantCode = basicTenantCodeByCodeAndShowType.getCode(); + } + + String finaClientCode = redis.get(RedisKeyConstant.FINAL_CLIENT_CODE + AuthUtil.getTenantId()); + if (StringUtils.isBlank(finaClientCode)) { + List str = baseMapper.getFinallyClientCode(tenantCode); + if(!str.isEmpty()){ + finaClientCode = str.get(0); + }else{ + finaClientCode =tenantCode+"0000000"; + } + redis.set(RedisKeyConstant.FINAL_CLIENT_CODE + AuthUtil.getTenantId(), finaClientCode); + + } + String num = finaClientCode.replaceAll(tenantCode, ""); + int anInt = Integer.parseInt(num) + 1; + String formattedNum = String.format("%07d", anInt); + return tenantCode + formattedNum; + } + + @Override + public boolean saveClient(BasicdataClientEntity basicdataClient) { + boolean save = this.save(basicdataClient); + if (save){ + //进行redis的设置 + redis.set(RedisKeyConstant.FINAL_CLIENT_CODE + AuthUtil.getTenantId(), basicdataClient.getClientCode()); + } + return true; + } + + } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataCodeServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataCodeServiceImpl.java index 6dcb25201..f13a262ec 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataCodeServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataCodeServiceImpl.java @@ -1,10 +1,9 @@ package com.logpm.basicdata.service.impl; +import com.logpm.basic.entity.BasicTenantCodeEntity; import com.logpm.basic.feign.IBasicTenantCodeClient; import com.logpm.basicdata.entity.BasicdataCodeRecordEntity; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; -import com.logpm.basicdata.feign.IBasicdataWarehouseClient; -import com.logpm.basicdata.mapper.BasicdataTrayMapper; import com.logpm.basicdata.service.IBasicdataCodeRecordService; import com.logpm.basicdata.service.IBasicdataCodeService; import com.logpm.basicdata.service.IBasicdataWarehouseService; @@ -12,15 +11,15 @@ import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springblade.common.constant.CodeDesEnum; import org.springblade.common.constant.CodeNumConstant; +import org.springblade.common.constant.basiccode.BasicCodeShowConstant; +import org.springblade.common.constant.basiccode.BasicCodeTypeConstant; import org.springblade.common.utils.CommonUtil; import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.StringUtil; import org.springframework.stereotype.Service; -import java.util.Calendar; -import java.util.Date; -import java.util.Objects; +import java.util.*; @Service @AllArgsConstructor @@ -31,14 +30,12 @@ public class BasicdataCodeServiceImpl implements IBasicdataCodeService { private final IBasicTenantCodeClient basicTenantCodeClient; - private final IBasicdataWarehouseClient basicdataWarehouseClient; - private final IBasicdataWarehouseService basicdataWarehouseService; - private final BasicdataTrayMapper basicdataTrayMapper; - private final IBasicdataCodeRecordService basicdataCodeRecordService; + private final IBasicTenantCodeClient tenantCodeClient; + /** * 根据类型生成编号 * @param type @@ -87,12 +84,107 @@ public class BasicdataCodeServiceImpl implements IBasicdataCodeService { case CodeNumConstant.TRUNKLINE_LOAD_SIGN: code = generateTrunklineLoadSignCode(type,warehouseCode,orderCode); break; + case CodeNumConstant.BALANCE_ORDER: + code = generateBalanceOrderCode(type,warehouseCode,orderCode); + break; default: log.info("##################getCodeByType: 暂不支持的编码类型 type={}", CodeDesEnum.getMes(type)); } return code; } + private String generateBalanceOrderCode(Integer type, String warehouseCode, String orderCode) { + if(!"BALANCE_ORDER".equals(warehouseCode)){ + log.warn("#########generateBalanceOrderCode: 仓库编码有误 warehouseCode={}",warehouseCode); + return null; + } + + + Calendar calendar = Calendar.getInstance(); + //获取年份 + Integer year = calendar.get(Calendar.YEAR); + + // 获取月份(注意月份从0开始计数) + Integer month = calendar.get(Calendar.MONTH) + 1; + + + BasicdataCodeRecordEntity basicdataCodeRecordEntity = basicdataCodeRecordService.findEntityByCodeTypeAndWarehouseCodeAndYearAndMonth(CodeNumConstant.PACKAGE,warehouseCode,year+"",month+""); + + if(Objects.isNull(basicdataCodeRecordEntity)){ + basicdataCodeRecordEntity = new BasicdataCodeRecordEntity(); + basicdataCodeRecordEntity.setCodeType(CodeNumConstant.PACKAGE); + basicdataCodeRecordEntity.setWarehouseName("全仓"); + basicdataCodeRecordEntity.setWarehouseCode(warehouseCode); + basicdataCodeRecordEntity.setYear(year+""); + basicdataCodeRecordEntity.setMonth(month+""); + basicdataCodeRecordEntity.setNum(0); + basicdataCodeRecordService.save(basicdataCodeRecordEntity); + } + + Integer oldNum = basicdataCodeRecordEntity.getNum(); + oldNum = oldNum + 1; + String packageCode = "JSD" + year + CommonUtil.geFourNumber(month.longValue(),2) + CommonUtil.geFourNumber(oldNum.longValue(),6); + basicdataCodeRecordEntity.setNum(oldNum); + basicdataCodeRecordService.updateById(basicdataCodeRecordEntity); + + return packageCode; + } + + @Override + public List getBatchPackageCodeByType(String warehouseCode, String orderCode, Integer num) { + if(!StringUtil.hasLength(warehouseCode)){ + log.warn("############getBatchPackageCodeByType: 仓库编码为空warehouseCode={}",warehouseCode); + return null; + } + if(!StringUtil.hasLength(orderCode)){ + log.warn("############getBatchPackageCodeByType: 订单号为空orderCode={}",orderCode); + return null; + } + + //包条 HT+仓库拼音/超管/职能+年月日时分秒+订单索引+包条个数索引 + String haxCodeByLong = CommonUtil.getHaxCodeByLong(orderCode, 8); + + BasicdataWarehouseEntity basicdataWarehouseEntity = basicdataWarehouseService.getWarehouseEntityByWarehouseCode(warehouseCode); + if(Objects.isNull(basicdataWarehouseEntity)){ + log.warn("############getWayBillNo: 仓库信息不存在 warehouseCode={}",warehouseCode); + return null; + } + + Calendar calendar = Calendar.getInstance(); + //获取年份 + Integer year = calendar.get(Calendar.YEAR); + + // 获取月份(注意月份从0开始计数) + Integer month = calendar.get(Calendar.MONTH) + 1; + + + BasicdataCodeRecordEntity basicdataCodeRecordEntity = basicdataCodeRecordService.findEntityByCodeTypeAndWarehouseCodeAndYearAndMonth(CodeNumConstant.PACKAGE,warehouseCode,year+"",month+""); + + if(Objects.isNull(basicdataCodeRecordEntity)){ + basicdataCodeRecordEntity = new BasicdataCodeRecordEntity(); + basicdataCodeRecordEntity.setCodeType(CodeNumConstant.PACKAGE); + basicdataCodeRecordEntity.setWarehouseId(basicdataWarehouseEntity.getId()); + basicdataCodeRecordEntity.setWarehouseName(basicdataWarehouseEntity.getName()); + basicdataCodeRecordEntity.setWarehouseCode(warehouseCode); + basicdataCodeRecordEntity.setYear(year+""); + basicdataCodeRecordEntity.setMonth(month+""); + basicdataCodeRecordEntity.setNum(0); + basicdataCodeRecordService.save(basicdataCodeRecordEntity); + } + + Integer oldNum = basicdataCodeRecordEntity.getNum(); + List packageCodes = new ArrayList<>(); + for (int i = 0; i < num; i++) { + oldNum = oldNum + 1; + String packageCode = "HT" + warehouseCode + year + CommonUtil.geFourNumber(month.longValue(),2) + haxCodeByLong + CommonUtil.geFourNumber(oldNum.longValue(),6); + packageCodes.add(packageCode); + } + basicdataCodeRecordEntity.setNum(oldNum); + basicdataCodeRecordService.updateById(basicdataCodeRecordEntity); + + return packageCodes; + } + private String generateTrunklineLoadSignCode(Integer type, String warehouseCode, String orderCode) { if(!StringUtil.hasLength(warehouseCode)){ @@ -316,6 +408,14 @@ public class BasicdataCodeServiceImpl implements IBasicdataCodeService { } private String generateTraysCode(Integer type, String warehouseCode) { + BasicTenantCodeEntity basicTenantCode = tenantCodeClient.findBasicTenantCodeByCodeAndShowType(BasicCodeTypeConstant.TRAY_CODE.getValue(), BasicCodeShowConstant.QR_CODE.getValue()); + if(Objects.isNull(basicTenantCode)){ + log.warn("############generateTraysCode: 租户信息不存在basicTenantCode={}",basicTenantCode); + return null; + } + String desName = basicTenantCode.getDesName(); + String code = basicTenantCode.getCode(); + if(!StringUtil.hasLength(warehouseCode)){ log.warn("############generateTraysCode: 仓库编码为空warehouseCode={}",warehouseCode); return null; @@ -328,6 +428,9 @@ public class BasicdataCodeServiceImpl implements IBasicdataCodeService { return null; } + String abbreviation = basicdataWarehouseEntity.getAbbreviation(); + + Calendar calendar = Calendar.getInstance(); //获取年份 Integer year = calendar.get(Calendar.YEAR); @@ -346,7 +449,7 @@ public class BasicdataCodeServiceImpl implements IBasicdataCodeService { basicdataCodeRecordEntity.setWarehouseCode(warehouseCode); basicdataCodeRecordEntity.setYear(year+""); basicdataCodeRecordEntity.setMonth(month+""); - basicdataCodeRecordEntity.setNum(0); + basicdataCodeRecordEntity.setNum(100000); basicdataCodeRecordService.save(basicdataCodeRecordEntity); } Integer inrc = basicdataCodeRecordEntity.getNum() + 1; @@ -354,7 +457,10 @@ public class BasicdataCodeServiceImpl implements IBasicdataCodeService { basicdataCodeRecordEntity.setNum(inrc); basicdataCodeRecordService.updateById(basicdataCodeRecordEntity); - return "HT"+warehouseCode+year+CommonUtil.geFourNumber(month.longValue(),2)+CommonUtil.geFourNumber(inrc.longValue(),5); + String trayCode = "T" + code + year + CommonUtil.geFourNumber(month.longValue(), 2) + inrc; + String trayName = desName + abbreviation + inrc; + + return trayCode+"&&"+trayName; } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataDriverArteryServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataDriverArteryServiceImpl.java index 0fcda2c1a..b123c6f35 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataDriverArteryServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataDriverArteryServiceImpl.java @@ -17,6 +17,7 @@ package com.logpm.basicdata.service.impl; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; @@ -49,10 +50,7 @@ import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -144,15 +142,50 @@ public class BasicdataDriverArteryServiceImpl extends BaseServiceImpl basicdataDriverArteryVOS = new ArrayList<>(); List list = baseMapper.selectListByWarehouseId(warehouseId); log.info("################getDriverList list:{}", list); + + if(list.isEmpty()){ + return basicdataDriverArteryVOS; + } + + List ids =list.stream() // 创建一个流 + .map(BasicdataDriverArteryEntity::getId) // 使用map方法获取每个对象的ID + .collect(Collectors.toList()); + + + List list1 = basicdataDrivermiddleService.list(Wrappers.query().lambda() + .in(BasicdataDrivermiddleEntity::getDriverId, ids)); + + Map> groupedEntities = + list1.stream() + .collect(Collectors.groupingBy(BasicdataDrivermiddleEntity::getDriverId)); + + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(BasicdataVehicleEntity::getIsDeleted, 0); + List list2 = basicdataVehicleService.list(queryWrapper); + for (BasicdataDriverArteryEntity driverArteryEntity : list) { BasicdataDriverArteryVO driverArteryVO = Func.copy(driverArteryEntity, BasicdataDriverArteryVO.class); - List vehicleIds = basicdataDrivermiddleService.list(Wrappers.query().lambda() - .eq(BasicdataDrivermiddleEntity::getDriverId, driverArteryEntity.getId())).stream().filter(f -> Func.isNotEmpty(f.getBrandId())).map(BasicdataDrivermiddleEntity::getBrandId).collect(Collectors.toList()); - if (Func.isNotEmpty(vehicleIds)) { - driverArteryVO.setVehicleVOList(basicdataVehicleService.list(Wrappers.query().lambda().in(BasicdataVehicleEntity::getId, vehicleIds))); + + List basicdataDrivermiddleEntities = groupedEntities.get(driverArteryEntity.getId()); + if (Func.isNotEmpty(basicdataDrivermiddleEntities)) { + List vehicleIds = basicdataDrivermiddleEntities.stream().filter(f -> Func.isNotEmpty(f.getBrandId())).map(BasicdataDrivermiddleEntity::getBrandId).collect(Collectors.toList()); + if (Func.isNotEmpty(vehicleIds)) { + List vehicleList = new ArrayList<>(); + for (Long vehicleId : vehicleIds) { + for (BasicdataVehicleEntity basicdataVehicleEntity : list2) { + if (vehicleId.equals(basicdataVehicleEntity.getId())) { + vehicleList.add(basicdataVehicleEntity); + } + } + } + driverArteryVO.setVehicleVOList(vehicleList); + } } + basicdataDriverArteryVOS.add(driverArteryVO); } + return basicdataDriverArteryVOS; } @@ -165,137 +198,136 @@ public class BasicdataDriverArteryServiceImpl extends BaseServiceImpl data) { log.info("传入参数>>>>>>>>>>>>>>>>>>>>>>>{}", data); - outerLoop: - for (BasicdataDriverArteryImproterExcel datum : data) { + for (BasicdataDriverArteryImproterExcel datum : data) { - try { - List driverMiddleEntity = new ArrayList<>(); + try { + List driverMiddleEntity = new ArrayList<>(); - //检查数据是否为空 - if (ObjectUtils.isEmpty(datum.getPhone()) || ObjectUtils.isEmpty(datum.getName()) || ObjectUtils.isEmpty(datum.getWarehouseName()) || ObjectUtils.isEmpty(datum.getCarrierName())) { + //检查数据是否为空 + if (ObjectUtils.isEmpty(datum.getPhone()) || ObjectUtils.isEmpty(datum.getName()) || ObjectUtils.isEmpty(datum.getWarehouseName()) || ObjectUtils.isEmpty(datum.getCarrierName())) { // log.error("必填数据不能为空"); // continue; - throw new ServiceException("必填数据不能为空!"); - } - if (!ObjectUtils.isEmpty(datum.getPhone())) { - String phone = datum.getPhone(); - BasicdataDriverArteryEntity arteryEntity = baseMapper.findEntityByPhone(phone); - if(!Objects.isNull(arteryEntity)){ - throw new ServiceException(phone+"手机号码已存在!"); - } + throw new ServiceException("必填数据不能为空!"); + } + if (!ObjectUtils.isEmpty(datum.getPhone())) { + String phone = datum.getPhone(); + BasicdataDriverArteryEntity arteryEntity = baseMapper.findEntityByPhone(phone); + if (!Objects.isNull(arteryEntity)) { + throw new ServiceException(phone + "手机号码已存在!"); + } - R userR = userClient.userInfoByPhone("627683", datum.getPhone()); - if (userR.getData() == null) { + R userR = userClient.userInfoByPhone("627683", datum.getPhone()); + if (userR.getData() == null) { // log.error("未找到用户"); // continue; - throw new ServiceException("未找到用户!"); - } else { - datum.setUserId(userR.getData().getId()); - } - } - if (!ObjectUtils.isEmpty(datum.getBindVehicle())) { - String[] car = datum.getBindVehicle().split(","); - for (String s : car) { - List carListByName = basicdataVehicleService.findCarListByName(s); + throw new ServiceException("未找到用户!"); + } else { + datum.setUserId(userR.getData().getId()); + } + } + if (!ObjectUtils.isEmpty(datum.getBindVehicle())) { + String[] car = datum.getBindVehicle().split(","); + for (String s : car) { + List carListByName = basicdataVehicleService.findCarListByName(s); - if (carListByName.isEmpty()) { + if (carListByName.isEmpty()) { // log.error("未找到可绑定的车辆"); - throw new ServiceException("未找到可绑定的车辆!"); - } else { - BasicdataDrivermiddleEntity basicdataDrivermiddleEntity = new BasicdataDrivermiddleEntity(); - basicdataDrivermiddleEntity.setBrandId(carListByName.get(0).getId()); - driverMiddleEntity.add(basicdataDrivermiddleEntity); - } - } - } - if (!ObjectUtils.isEmpty(datum.getCarrierName())) { - //找到数据库内的承运商 - List basicdataCarrierEntities = basicdataCarrierService.list(Wrappers.lambdaQuery().eq(BasicdataCarrierEntity::getCarrierName, datum.getCarrierName())); + throw new ServiceException("未找到可绑定的车辆!"); + } else { + BasicdataDrivermiddleEntity basicdataDrivermiddleEntity = new BasicdataDrivermiddleEntity(); + basicdataDrivermiddleEntity.setBrandId(carListByName.get(0).getId()); + driverMiddleEntity.add(basicdataDrivermiddleEntity); + } + } + } + if (!ObjectUtils.isEmpty(datum.getCarrierName())) { + //找到数据库内的承运商 + List basicdataCarrierEntities = basicdataCarrierService.list(Wrappers.lambdaQuery().eq(BasicdataCarrierEntity::getCarrierName, datum.getCarrierName())); - if (ObjectUtils.isEmpty(basicdataCarrierEntities)) { + if (ObjectUtils.isEmpty(basicdataCarrierEntities)) { // log.error("未找到承运商"); // continue; - throw new ServiceException("未找到承运商!"); - } else { - datum.setCarrierId(basicdataCarrierEntities.get(0).getId()); - } - } - List warehouseList = new ArrayList<>(); - if (!ObjectUtils.isEmpty(datum.getWarehouseName())) { - String warehouseNames = datum.getWarehouseName(); - warehouseNames = warehouseNames.replaceAll(",",","); - List warehouseNameList = new ArrayList<>(); - if(warehouseNames.contains(",")){ - warehouseNameList = Arrays.asList(warehouseNames.split(",")); - }else{ - warehouseNameList.add(warehouseNames); - } + throw new ServiceException("未找到承运商!"); + } else { + datum.setCarrierId(basicdataCarrierEntities.get(0).getId()); + } + } + List warehouseList = new ArrayList<>(); + if (!ObjectUtils.isEmpty(datum.getWarehouseName())) { + String warehouseNames = datum.getWarehouseName(); + warehouseNames = warehouseNames.replaceAll(",", ","); + List warehouseNameList = new ArrayList<>(); + if (warehouseNames.contains(",")) { + warehouseNameList = Arrays.asList(warehouseNames.split(",")); + } else { + warehouseNameList.add(warehouseNames); + } - for (String wn : warehouseNameList) { - //在数据库找到仓库名字对应 - BasicdataWarehouseEntity byName = warehouseClient.findByName(wn); - if (ObjectUtils.isEmpty(byName)) { - throw new ServiceException("未找到仓库!"); - } else { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("warehouseId",byName.getId()); - jsonObject.put("warehouseName",wn); - warehouseList.add(jsonObject); - } - } - } - //根据手机号去重 如果有手机号相同 就删除老数据 - if (ObjectUtils.isNotNull(datum) && ObjectUtils.isNotNull(datum.getPhone())) { - List basicdataVehicleEntities = baseMapper.selectList(new QueryWrapper().lambda() - .eq(BasicdataDriverArteryEntity::getPhone, datum.getPhone())); - if (!basicdataVehicleEntities.isEmpty()) { - basicdataDriverArteryMapper.updateIsdeletedByPhone(datum.getPhone()); - } - } - BasicdataDriverArteryEntity copy = Func.copy(datum, BasicdataDriverArteryEntity.class); - //连接到前端后取消注释 - BladeUser user = AuthUtil.getUser(); - copy.setTenantId(user.getTenantId());// 租户号 - copy.setCreateUser(user.getUserId()); // 创建人 - copy.setUpdateUser(user.getUserId());// 更新人 - log.info("复制后>>>>>>>>>>>>{}", copy); - - this.save(copy); - - List driverWarehouseEntities = new ArrayList<>(); - for (JSONObject jsonObject : warehouseList) { - Long warehouseId = jsonObject.getLong("warehouseId"); - BasicdataDriverWarehouseEntity basicdataDriverWarehouseEntity = new BasicdataDriverWarehouseEntity(); - basicdataDriverWarehouseEntity.setTenantId(AuthUtil.getTenantId()); - basicdataDriverWarehouseEntity.setCreateUser(AuthUtil.getUserId()); - basicdataDriverWarehouseEntity.setUpdateUser(AuthUtil.getUserId()); - basicdataDriverWarehouseEntity.setCreateDept(Func.firstLong(AuthUtil.getDeptId())); - basicdataDriverWarehouseEntity.setDriverId(copy.getId()); - basicdataDriverWarehouseEntity.setWarehouseId(warehouseId); - driverWarehouseEntities.add(basicdataDriverWarehouseEntity); - } - basicdataDriverWarehouseService.saveBatch(driverWarehouseEntities); + for (String wn : warehouseNameList) { + //在数据库找到仓库名字对应 + BasicdataWarehouseEntity byName = warehouseClient.findByName(wn); + if (ObjectUtils.isEmpty(byName)) { + throw new ServiceException("未找到仓库!"); + } else { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("warehouseId", byName.getId()); + jsonObject.put("warehouseName", wn); + warehouseList.add(jsonObject); + } + } + } + //根据手机号去重 如果有手机号相同 就删除老数据 + if (ObjectUtils.isNotNull(datum) && ObjectUtils.isNotNull(datum.getPhone())) { + List basicdataVehicleEntities = baseMapper.selectList(new QueryWrapper().lambda() + .eq(BasicdataDriverArteryEntity::getPhone, datum.getPhone())); + if (!basicdataVehicleEntities.isEmpty()) { + basicdataDriverArteryMapper.updateIsdeletedByPhone(datum.getPhone()); + } + } + BasicdataDriverArteryEntity copy = Func.copy(datum, BasicdataDriverArteryEntity.class); + //连接到前端后取消注释 + BladeUser user = AuthUtil.getUser(); + copy.setTenantId(user.getTenantId());// 租户号 + copy.setCreateUser(user.getUserId()); // 创建人 + copy.setUpdateUser(user.getUserId());// 更新人 + log.info("复制后>>>>>>>>>>>>{}", copy); - //车辆和司机绑定关系 - for (BasicdataDrivermiddleEntity basicdataDrivermiddleEntity : driverMiddleEntity) { - basicdataDrivermiddleEntity.setDriverId(copy.getId()); - basicdataDrivermiddleServiceImpl.save(basicdataDrivermiddleEntity); - } - } catch (DataAccessException e) { - throw new ServiceException("用户" + datum.getName() + "数据长度异常"); - } catch (ServiceException e) { - throw new ServiceException("用户" + datum.getName() + e.getMessage()); - } catch (Exception e) { - throw new RuntimeException("用户" + datum.getName() + "数据错误" + e.getMessage()); - } + this.save(copy); - } + List driverWarehouseEntities = new ArrayList<>(); + for (JSONObject jsonObject : warehouseList) { + Long warehouseId = jsonObject.getLong("warehouseId"); + BasicdataDriverWarehouseEntity basicdataDriverWarehouseEntity = new BasicdataDriverWarehouseEntity(); + basicdataDriverWarehouseEntity.setTenantId(AuthUtil.getTenantId()); + basicdataDriverWarehouseEntity.setCreateUser(AuthUtil.getUserId()); + basicdataDriverWarehouseEntity.setUpdateUser(AuthUtil.getUserId()); + basicdataDriverWarehouseEntity.setCreateDept(Func.firstLong(AuthUtil.getDeptId())); + basicdataDriverWarehouseEntity.setDriverId(copy.getId()); + basicdataDriverWarehouseEntity.setWarehouseId(warehouseId); + driverWarehouseEntities.add(basicdataDriverWarehouseEntity); + } + basicdataDriverWarehouseService.saveBatch(driverWarehouseEntities); + + //车辆和司机绑定关系 + for (BasicdataDrivermiddleEntity basicdataDrivermiddleEntity : driverMiddleEntity) { + basicdataDrivermiddleEntity.setDriverId(copy.getId()); + basicdataDrivermiddleServiceImpl.save(basicdataDrivermiddleEntity); + } + } catch (DataAccessException e) { + throw new ServiceException("用户" + datum.getName() + "数据长度异常"); + } catch (ServiceException e) { + throw new ServiceException("用户" + datum.getName() + e.getMessage()); + } catch (Exception e) { + throw new RuntimeException("用户" + datum.getName() + "数据错误" + e.getMessage()); + } + + } } @Override - public List findDriverListByName(String driverName) { + public List findDriverListByName(String driverName) { return baseMapper.findDriverListByName(driverName); } } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataFreightServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataFreightServiceImpl.java index f7473ac95..8a4bd8c50 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataFreightServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataFreightServiceImpl.java @@ -411,7 +411,7 @@ public class BasicdataFreightServiceImpl extends BaseServiceImpl"); message.append(firstMessage); - message.append(rowMessage.toString()); + message.append(rowMessage); message.append("

"); message.append("
"); } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataGoodsAreaServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataGoodsAreaServiceImpl.java index 517690306..ba913e862 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataGoodsAreaServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataGoodsAreaServiceImpl.java @@ -130,8 +130,7 @@ public class BasicdataGoodsAreaServiceImpl extends BaseServiceImpl>>>>>",var6); - return; - } + } //return warehouseGoodsAreaList; } @@ -387,8 +386,7 @@ public class BasicdataGoodsAreaServiceImpl extends BaseServiceImpl>>>>>",var6); - return; - } + } }else if (type ==2){ //sheetOne List basicdatavisualizationSheetKCOnes = baseMapper.exportWarehouseByCKStrip(warehouseId); @@ -440,8 +438,7 @@ public class BasicdataGoodsAreaServiceImpl extends BaseServiceImpl>>>>>",var6); - return; - } + } }else if (type ==3){ //sheetOne @@ -487,8 +484,7 @@ public class BasicdataGoodsAreaServiceImpl extends BaseServiceImpl>>>>>",var6); - return; - } + } } //return warehouseGoodsAreaList; } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataGoodsShelfServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataGoodsShelfServiceImpl.java index 04fa58f0f..41a809d77 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataGoodsShelfServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataGoodsShelfServiceImpl.java @@ -563,7 +563,7 @@ public class BasicdataGoodsShelfServiceImpl extends BaseServiceImpl longs = new ArrayList<>(); for (BasicdataGoodsAllocationEntity basicdataGoodsAllocationEntity : basicdataGoodsAllocationEntitiesDate) { Long id = basicdataGoodsAllocationEntity.getId(); - List longs1 = Arrays.asList(id); + List longs1 = Collections.singletonList(id); //查询有无绑定货物 Integer integer = warehouseUpdownGoodsClient.selectCountByAllo(id.toString()); if (integer > 0) { diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceCategoryBasicServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceCategoryBasicServiceImpl.java index 732bff502..edef25ad1 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceCategoryBasicServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceCategoryBasicServiceImpl.java @@ -41,7 +41,7 @@ public class BasicdataPriceCategoryBasicServiceImpl extends BaseServiceImpl().lambda() + .eq(BasicdataPriceRouteEntity::getId, route.getId()) + .set(BasicdataPriceRouteEntity::getStartProvinceId, route.getStartProvinceId()) + .set(BasicdataPriceRouteEntity::getStartCityId, route.getStartCityId()) + .set(BasicdataPriceRouteEntity::getStartProvinceId, route.getStartProvinceId()) + .set(BasicdataPriceRouteEntity::getEndProvinceId, route.getEndProvinceId()) + .set(BasicdataPriceRouteEntity::getEndCityId, route.getEndCityId()) + .set(BasicdataPriceRouteEntity::getEndCountyId, route.getEndCountyId()) + ); + }else{ + this.saveOrUpdate(route); + } List fullVehicleEntities = new ArrayList<>(); FullVehicleTypeEnums fullVehicleTypeEnums = null; GeneralServiceTypeEnums generalServiceTypeEnums = null; diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceServiceImpl.java index 5e6d79ced..e07873f02 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceServiceImpl.java @@ -21,11 +21,17 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.Wrapper; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.basicdata.constant.BasicdataConstants; +import com.logpm.basicdata.entity.BasicdataBrandEntity; +import com.logpm.basicdata.entity.BasicdataCategoryEntity; +import com.logpm.basicdata.entity.BasicdataClientEntity; import com.logpm.basicdata.entity.BasicdataPriceCategoryBasicEntity; import com.logpm.basicdata.entity.BasicdataPriceCategoryDispatchEntity; import com.logpm.basicdata.entity.BasicdataPriceCategoryWarehouseEntity; @@ -34,6 +40,7 @@ import com.logpm.basicdata.entity.BasicdataPriceFullVehicleEntity; import com.logpm.basicdata.entity.BasicdataPriceGeneralEntity; import com.logpm.basicdata.entity.BasicdataPriceRouteEntity; import com.logpm.basicdata.entity.BasicdataPriceTemplateEntity; +import com.logpm.basicdata.entity.BasicdataStoreBrandEntity; import com.logpm.basicdata.enums.CostTypeEnums; import com.logpm.basicdata.enums.DispatchPricingTypeEnums; import com.logpm.basicdata.enums.FullVehicleTypeEnums; @@ -42,8 +49,20 @@ import com.logpm.basicdata.enums.PickupPricingTypeEnums; import com.logpm.basicdata.enums.ServiceTypeEnums; import com.logpm.basicdata.enums.TrunkLinePricingTypeEnums; import com.logpm.basicdata.enums.WarehousePricingTypeEnums; -import com.logpm.basicdata.excel.BasicdataPriceExcel; +import com.logpm.basicdata.excel.price.BasicdataPriceCategoryBasicExcel; +import com.logpm.basicdata.excel.price.BasicdataPriceCategoryDispatchExcel; +import com.logpm.basicdata.excel.price.BasicdataPriceCategoryWarehouseExcel; +import com.logpm.basicdata.excel.price.BasicdataPriceExcel; +import com.logpm.basicdata.excel.price.BasicdataPriceFullVehicleExcel; +import com.logpm.basicdata.excel.price.BasicdataPriceGeneralExcel; +import com.logpm.basicdata.excel.pricev2.BasicdataPriceCategoryV2Excel; +import com.logpm.basicdata.excel.pricev2.BasicdataPriceFullVehicleV2Excel; +import com.logpm.basicdata.excel.pricev2.BasicdataPriceGeneralV2Excel; +import com.logpm.basicdata.excel.pricev2.BasicdataPriceV2Excel; import com.logpm.basicdata.mapper.BasicdataPriceMapper; +import com.logpm.basicdata.service.IBasicdataBrandService; +import com.logpm.basicdata.service.IBasicdataCategoryService; +import com.logpm.basicdata.service.IBasicdataClientService; import com.logpm.basicdata.service.IBasicdataPriceCategoryBasicService; import com.logpm.basicdata.service.IBasicdataPriceCategoryDispatchService; import com.logpm.basicdata.service.IBasicdataPriceCategoryWarehouseService; @@ -52,12 +71,16 @@ import com.logpm.basicdata.service.IBasicdataPriceGeneralService; import com.logpm.basicdata.service.IBasicdataPriceRouteService; import com.logpm.basicdata.service.IBasicdataPriceService; import com.logpm.basicdata.service.IBasicdataPriceTemplateService; +import com.logpm.basicdata.service.IBasicdataStoreBrandService; +import com.logpm.basicdata.util.EasyExcelUtil; import com.logpm.basicdata.vo.BasicdatPriceApiVO; import com.logpm.basicdata.vo.BasicdataPriceBasicUpdateVO; import com.logpm.basicdata.vo.BasicdataPriceFullVehicleVO; +import com.logpm.basicdata.vo.BasicdataPriceImportVO; import com.logpm.basicdata.vo.BasicdataPricePageVO; import com.logpm.basicdata.vo.PriceBasicVO; import com.logpm.basicdata.vo.PriceClientVO; +import com.logpm.basicdata.vo.PriceDispatchAddClientVO; import com.logpm.basicdata.vo.PriceDispatchAdditionalVO; import com.logpm.basicdata.vo.PriceDispatchBasicVO; import com.logpm.basicdata.vo.PriceDispatchVO; @@ -70,18 +93,28 @@ import com.logpm.basicdata.vo.PriceWarehouseBasicVO; import com.logpm.basicdata.vo.PriceWarehouseVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.Nullable; import org.springblade.common.enums.BooleanZeroOneEnums; import org.springblade.common.model.IDict; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.tool.api.R; +import org.springblade.system.entity.DictBiz; +import org.springblade.system.feign.IDictBizClient; +import org.springblade.system.feign.ISysClient; +import org.springblade.system.vo.RegionAllVO; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; /** @@ -96,6 +129,10 @@ import java.util.stream.Collectors; public class BasicdataPriceServiceImpl extends BaseServiceImpl implements IBasicdataPriceService { private final IBasicdataPriceTemplateService templateService; + private final IBasicdataClientService clientService; + private final IBasicdataBrandService brandService; + private final IBasicdataCategoryService categoryService; + private final IBasicdataStoreBrandService storeBrandService; private final IBasicdataPriceFullVehicleService fullVehicleService; private final IBasicdataPriceCategoryDispatchService categoryDispatchService; @@ -105,6 +142,9 @@ public class BasicdataPriceServiceImpl extends BaseServiceImpl selectBasicdataPricePage(IPage page, BasicdataPricePageVO basicdataPrice) { List basicdataPriceVOS = baseMapper.selectBasicdataPricePage(page, basicdataPrice); @@ -133,36 +173,171 @@ public class BasicdataPriceServiceImpl extends BaseServiceImpl hisPage(IPage page, BasicdataPricePageVO basicdataPrice) { + if (ObjectUtil.hasEmpty(basicdataPrice.getClientId(), basicdataPrice.getBrandId())) { + throw new ServiceException("客户id和品牌id不能为空"); + } + List basicdataPriceVOS = baseMapper.hisPage(page, basicdataPrice); + if (CollUtil.isNotEmpty(basicdataPriceVOS)) { + for (BasicdataPricePageVO basicdataPriceVO : basicdataPriceVOS) { + // 维护状态 + DateTime now = DateUtil.date(); + if (ObjectUtil.isNotEmpty(basicdataPriceVO.getExpiryTime())) { + if (now.isAfter(basicdataPriceVO.getExpiryTime())) { + // 已到期 + basicdataPriceVO.setMaintenanceStatus("已过期"); + basicdataPriceVO.setEffectiveStatus("已失效"); + } + } + if (ObjectUtil.isNotEmpty(basicdataPriceVO.getEffectiveTime())) { + if (now.isBefore(basicdataPriceVO.getEffectiveTime())) { + basicdataPriceVO.setEffectiveStatus("待生效"); + } + } + if (ObjectUtil.isAllNotEmpty(basicdataPriceVO.getEffectiveTime(), basicdataPriceVO.getExpiryTime())) { + if (now.isIn(basicdataPriceVO.getEffectiveTime(), basicdataPriceVO.getExpiryTime())) { + basicdataPriceVO.setEffectiveStatus("生效中"); + } + } + // 服务类型 + String serviceType = basicdataPriceVO.getServiceType(); + if (StrUtil.isNotEmpty(serviceType)) { + List res = new ArrayList<>(); + List split = StrUtil.split(serviceType, ","); + for (String s : split) { + res.add(IDict.getTextByCode(ServiceTypeEnums.class, Convert.toInt(s))); + } + basicdataPriceVO.setServiceType(StrUtil.join("/", res)); + } + } + } + return page.setRecords(basicdataPriceVOS); + } + + @Override + public Boolean deletePrice(String id) { + BasicdataPriceEntity entity = this.getById(id); + if (ObjectUtil.isNotEmpty(entity)) { + if (DateUtil.beginOfDay(new Date()).before(entity.getEffectiveTime())) { + this.removeById(id); + return Boolean.TRUE; + } else { + throw new ServiceException("只能删除待生效的数据"); + } + } else { + throw new ServiceException("价格不存在,删除失败"); + } + } @Override - public List exportBasicdataPrice(Wrapper queryWrapper) { - List basicdataPriceList = baseMapper.exportBasicdataPrice(queryWrapper); - return basicdataPriceList; + public List dispatchAddPrice(BasicdatPriceApiVO param) { + BasicdataPriceEntity priceEntity = getBasicdataPriceEntityByParam(param); + if (ObjectUtil.isEmpty(priceEntity)) { + return null; + } + BasicdataPriceTemplateEntity templateEntity = getBasicdataPriceTemplateEntityByPrice(priceEntity); + if (ObjectUtil.isEmpty(templateEntity)) { + return null; + } + Map> dispatchMap = new HashMap<>(); + initDispatchMap(priceEntity, dispatchMap); + String serviceType = templateEntity.getServiceType(); + // 配送费 + if (StrUtil.contains(serviceType, ServiceTypeEnums.DISPATCH.getCode().toString())) { + Integer dispatchIsAddFee = templateEntity.getDispatchIsAddFee(); + if (ObjectUtil.equals(dispatchIsAddFee, BooleanZeroOneEnums.YES.getCode())) { + List priceDispatchAdditionalVOS = buildDispatchAddFee(dispatchMap); + List res = new ArrayList<>(); + for (PriceDispatchAdditionalVO priceDispatchAdditionalVO : priceDispatchAdditionalVOS) { + res.add(PriceDispatchAddClientVO.builder() + .categoryId(priceDispatchAdditionalVO.getCategoryId()) + .sortPrice(priceDispatchAdditionalVO.getSortPrice()) + .handlingPrice(priceDispatchAdditionalVO.getHandlingPrice()) + .relocationPrice(priceDispatchAdditionalVO.getRelocationPrice()) + .upstairsDeliveryPrice(priceDispatchAdditionalVO.getUpstairsDeliveryPrice()) + .dispatchStairsCarryingCharge(priceEntity.getDispatchStairsCarryingCharge()).build()); + } + return res; + } + } + return null; } @Override + @Transactional(rollbackFor = Exception.class) public Boolean basicUpdate(BasicdataPriceBasicUpdateVO vo) { if (DateUtil.compare(vo.getEffectiveTime(), vo.getExpiryTime()) > 0) { throw new ServiceException("生效时间大于到期时间,请检查。"); } + if (DateUtil.beginOfDay(new Date()).isAfter(vo.getExpiryTime())) { + throw new ServiceException("到期时间不能小于当前时间,请检查。"); + } + // 只能维护当前时间的版本,时间范围必须包含当前时间 + Long clientId1 = vo.getClientId(); + Long brandId1 = vo.getBrandId(); + List list1 = this.list(Wrappers.lambdaQuery() + .eq(BasicdataPriceEntity::getClientId, clientId1) + .eq(BasicdataPriceEntity::getBrandId, brandId1) + .eq(BasicdataPriceEntity::getIsDeleted, 0) + ); + + // 修改的当前版本时间控制 + Date start1 = vo.getEffectiveTime(); + Date end1 = vo.getExpiryTime(); + int flag = 0; + if (CollUtil.isNotEmpty(list1)) { + for (BasicdataPriceEntity priceEntity : list1) { + Date start2 = priceEntity.getEffectiveTime(); + Date end2 = priceEntity.getExpiryTime(); + if (start1.after(priceEntity.getEffectiveTime())) { + // 交换 interval1 的开始和结束时间 + Date temp = start1; + start1 = start2; + start2 = temp; + temp = end1; + end1 = end2; + end2 = temp; + } + // 计算交集 + if (!end1.before(start2)) { + flag += 1; + } + } + } + if (flag > 1) { + throw new ServiceException("生效时间与截至时间范围在系统中存在多个价格体系,请确认"); + } // 如果是切换模版,则删除所有本价格相关的数据 - BasicdataPriceEntity entity = this.getById(vo.getId()); + BasicdataPriceEntity entity = null; + if (ObjectUtil.isNotEmpty(vo.getId())) { + entity = this.getById(vo.getId()); + } else { + if (flag > 0) { + throw new ServiceException("生效时间与截止时间范围在系统中已存在,请确认"); + } + } if (ObjectUtil.isNotEmpty(entity)) { Long templateId = entity.getTemplateId(); if (!ObjectUtil.equal(templateId, vo.getTemplateId())) { // 删除数据 deleteByPriceId(vo.getId()); + entity.setDispatchStairsCarryingCharge(0); + entity.setDispatchUpwardJudgment(0d); + entity.setDispatchUpwardJudgmentCost(0d); log.info("价格体系:{} 切换模版删除数据", vo.getId()); } + } else { + entity = new BasicdataPriceEntity(); + entity.setClientId(vo.getClientId()); + entity.setBrandId(vo.getBrandId()); } - BasicdataPriceEntity basicdataPriceEntity = new BasicdataPriceEntity(); - basicdataPriceEntity.setId(vo.getId()); - basicdataPriceEntity.setTemplateId(vo.getTemplateId()); - basicdataPriceEntity.setEffectiveTime(vo.getEffectiveTime()); - basicdataPriceEntity.setExpiryTime(vo.getExpiryTime()); - basicdataPriceEntity.setMaintenanceStatus(2); - int res = this.baseMapper.updateById(basicdataPriceEntity); - return res > 0; + entity.setTemplateId(vo.getTemplateId()); + entity.setEffectiveTime(vo.getEffectiveTime()); + entity.setExpiryTime(vo.getExpiryTime()); + entity.setMaintenanceStatus(2); + boolean b = this.saveOrUpdate(entity); + return b; } private void deleteByPriceId(Long id) { @@ -272,27 +447,12 @@ public class BasicdataPriceServiceImpl extends BaseServiceImpl priceEntities = this.list(Wrappers.lambdaQuery() - .eq(BasicdataPriceEntity::getClientId, clientId) - .eq(BasicdataPriceEntity::getBrandId, brandId) - .ge(BasicdataPriceEntity::getExpiryTime, new Date()) - ); - if (CollUtil.isNotEmpty(priceEntities)) { - priceEntity = priceEntities.get(0); - } + BasicdataPriceEntity priceEntity = getBasicdataPriceEntityByParam(param); if (ObjectUtil.isEmpty(priceEntity)) { return priceClientVO; } // 根据价格获取模板 - Long templateId = priceEntity.getTemplateId(); - BasicdataPriceTemplateEntity templateEntity = null; - if (ObjectUtil.isNotEmpty(templateId)) { - templateEntity = templateService.getById(templateId); - } + BasicdataPriceTemplateEntity templateEntity = getBasicdataPriceTemplateEntityByPrice(priceEntity); if (ObjectUtil.isEmpty(templateEntity)) { return priceClientVO; } @@ -314,8 +474,8 @@ public class BasicdataPriceServiceImpl extends BaseServiceImpl routeEntities = basicdataPriceRouteService.list(Wrappers.lambdaQuery() .eq(BasicdataPriceRouteEntity::getPriceId, priceEntity.getId()) .eq(BasicdataPriceRouteEntity::getSendOrgId, param.getSendOrgId()) - .eq(BasicdataPriceRouteEntity::getStartCountyId, param.getStartAreaId()) - .eq(BasicdataPriceRouteEntity::getEndCountyId, param.getEndAreaId()) + .eq(BasicdataPriceRouteEntity::getStartCountyId, param.getStartCountyId()) + .eq(BasicdataPriceRouteEntity::getEndCountyId, param.getEndCountyId()) .eq(BasicdataPriceRouteEntity::getServiceType, ServiceTypeEnums.PICK_UP.getCode()) ); if (CollUtil.isNotEmpty(routeEntities)) { @@ -335,7 +495,7 @@ public class BasicdataPriceServiceImpl extends BaseServiceImpl routeEntities = basicdataPriceRouteService.list(Wrappers.lambdaQuery() .eq(BasicdataPriceRouteEntity::getPriceId, priceEntity.getId()) .eq(BasicdataPriceRouteEntity::getSendOrgId, param.getSendOrgId()) - .eq(BasicdataPriceRouteEntity::getStartCountyId, param.getStartAreaId()) - .eq(BasicdataPriceRouteEntity::getEndCountyId, param.getEndAreaId()) + .eq(BasicdataPriceRouteEntity::getStartCountyId, param.getStartCountyId()) + .eq(BasicdataPriceRouteEntity::getEndCountyId, param.getEndCountyId()) .eq(BasicdataPriceRouteEntity::getServiceType, ServiceTypeEnums.TRUNK_LINE.getCode()) ); if (CollUtil.isNotEmpty(routeEntities)) { @@ -373,284 +533,3304 @@ public class BasicdataPriceServiceImpl extends BaseServiceImpl> fullMap, Map> basicMap, Map> warehouseMap, Map> dispatchMap, Map> generalMap) { - // 获取整车数据 - List list = fullVehicleService.list(Wrappers.lambdaQuery() - .eq(BasicdataPriceFullVehicleEntity::getBoId, priceEntity.getId())); - if (CollUtil.isNotEmpty(list)) { - // 按类型分组放到fullMap中 - list.forEach(item -> { - Integer type = item.getType(); - List collect = fullMap.get(type); - if (ObjectUtil.isEmpty(collect)) { - collect = new ArrayList<>(); - } - collect.add(item); - fullMap.put(type, collect); - }); - } - // 获取品类数据 - List basicList = categoryBasicService.list(Wrappers.lambdaQuery() - .eq(BasicdataPriceCategoryBasicEntity::getBoId, priceEntity.getId())); - if (CollUtil.isNotEmpty(basicList)) { - // 按类型分组放到basicMap中 - basicList.forEach(item -> { - Integer type = item.getServiceType(); - List collect = basicMap.get(type); - if (ObjectUtil.isEmpty(collect)) { - collect = new ArrayList<>(); - } - collect.add(item); - basicMap.put(type, collect); - }); + private @Nullable BasicdataPriceTemplateEntity getBasicdataPriceTemplateEntityByPrice(BasicdataPriceEntity priceEntity) { + Long templateId = priceEntity.getTemplateId(); + BasicdataPriceTemplateEntity templateEntity = null; + if (ObjectUtil.isNotEmpty(templateId)) { + templateEntity = templateService.getById(templateId); } + return templateEntity; + } - List warehouseList = categoryWarehouseService.list(Wrappers.lambdaQuery() - .eq(BasicdataPriceCategoryWarehouseEntity::getBoId, priceEntity.getId())); - if (CollUtil.isNotEmpty(warehouseList)) { - // 按类型分组放到warehouseMap中 - warehouseList.forEach(item -> { - Integer type = item.getCostType(); - List collect = warehouseMap.get(type); - if (ObjectUtil.isEmpty(collect)) { - collect = new ArrayList<>(); - } - collect.add(item); - warehouseMap.put(type, collect); - }); + private @Nullable BasicdataPriceEntity getBasicdataPriceEntityByParam(BasicdatPriceApiVO param) { + // 根据客户信息查找价格 + String clientId = param.getClientId(); + String brandId = param.getBrandId(); + if (!ObjectUtil.isAllNotEmpty(clientId, brandId)) { + return null; + } + BasicdataPriceEntity priceEntity = null; + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .eq(BasicdataPriceEntity::getClientId, clientId) + .eq(BasicdataPriceEntity::getBrandId, brandId); + if (StrUtil.isNotEmpty(param.getTime())) { + wrapper.ge(BasicdataPriceEntity::getExpiryTime, DateUtil.parse(param.getTime(), "yyyy-MM-dd")) + .le(BasicdataPriceEntity::getEffectiveTime, DateUtil.parse(param.getTime(), "yyyy-MM-dd")) + ; + } else { + wrapper.ge(BasicdataPriceEntity::getExpiryTime, DateUtil.beginOfDay(new Date())) + .le(BasicdataPriceEntity::getEffectiveTime, DateUtil.beginOfDay(new Date())) + ; } + List priceEntities = this.list(wrapper); + if (CollUtil.isNotEmpty(priceEntities)) { + priceEntity = priceEntities.get(0); + } + return priceEntity; + } - List dispatchList = categoryDispatchService.list(Wrappers.lambdaQuery() - .eq(BasicdataPriceCategoryDispatchEntity::getBoId, priceEntity.getId())); - if (CollUtil.isNotEmpty(dispatchList)) { - // 按类型分组放到dispatchMap中 - dispatchList.forEach(item -> { - Integer type = item.getCostType(); - List collect = dispatchMap.get(type); - if (ObjectUtil.isEmpty(collect)) { - collect = new ArrayList<>(); + @Override + @Transactional(rollbackFor = Exception.class) + public String upload(MultipartFile file) { + StringBuilder message = new StringBuilder(); + try { + // 从build中获取5个sheet的数据 + List priceExcels = EasyExcelUtil.readTrim(file, 0, BasicdataPriceExcel.class); + // 校验数据 + String sheet1 = "客户信息"; + String sheet2 = "提货干线按品类计费"; + String sheet3 = "仓储按品类计费"; + String sheet4 = "配送按品类计费"; + String sheet5 = "最低计费"; + String sheet6 = "整车计费"; + if (CollUtil.isNotEmpty(priceExcels)) { + // 模板名称为key + Map templateEntityMap = new HashMap<>(); + // 客户编码为key + Map clientEntityMap = new HashMap<>(); + // 品牌名称为key + Map brandEntityMap = new HashMap<>(); + // 客户编码 + 品牌名称为key + Map priceEntityMap = new HashMap<>(); + List basicExcels = EasyExcelUtil.readTrim(file, 1, 2, BasicdataPriceCategoryBasicExcel.class); + List generalExcels = EasyExcelUtil.readTrim(file, 4, 2, BasicdataPriceGeneralExcel.class); + List fullVehicleExcels = EasyExcelUtil.readTrim(file, 5, 2, BasicdataPriceFullVehicleExcel.class); + // 初始化导入校验数据 + initImportData(priceExcels, basicExcels, generalExcels, fullVehicleExcels, templateEntityMap, clientEntityMap, brandEntityMap, priceEntityMap); + // 校验数据 + checkPriceData(message, priceExcels, sheet1, templateEntityMap, clientEntityMap, brandEntityMap, priceEntityMap); + // 第一个sheet数据不合格直接返回 + if (StrUtil.isNotEmpty(message.toString())) { + return message.toString(); } - collect.add(item); - dispatchMap.put(type, collect); - }); + // 品类名称为key + Map categoryEntityMap = new HashMap<>(); + // 省市区 + Map provinceMap = new HashMap<>(); + Map provinceCityMap = new HashMap<>(); + Map provinceCityAearMap = new HashMap<>(); + // 初始化行政区划 + initRegion(provinceMap, provinceCityMap, provinceCityAearMap); + List dispatchExcels = EasyExcelUtil.readTrim(file, 3, 2, BasicdataPriceCategoryDispatchExcel.class); + List warehouseExcels = EasyExcelUtil.readTrim(file, 2, 2, BasicdataPriceCategoryWarehouseExcel.class); + // 路径为key 客户编码&&&品牌&&&发货单位编码 || 客户编码&&&品牌&&&发货单位编码&&&发站省市 || 客户编码&&&品牌&&&发货单位编码&&&发站省市&&&发站省市区 + Map routeMap = new HashMap<>(); + initRouteMap(routeMap, basicExcels, generalExcels, fullVehicleExcels); + // 初始化品类 + initCategoryData(basicExcels, dispatchExcels, warehouseExcels, categoryEntityMap); + // 提货干线按品类计费 + checkBasicExcels(message, sheet2, clientEntityMap, priceEntityMap, basicExcels, categoryEntityMap, provinceMap, provinceCityMap, provinceCityAearMap); + // 仓储按品类 + checkWarehouseExcels(warehouseExcels, clientEntityMap, priceEntityMap, categoryEntityMap, message, sheet3); + // 配送按品类 + checkDispatchExcels(dispatchExcels, clientEntityMap, priceEntityMap, categoryEntityMap, message, sheet4); + // 一般计费 + checkGeneralExcels(generalExcels, clientEntityMap, priceEntityMap, provinceMap, provinceCityMap, provinceCityAearMap, message, sheet5); + // 封装整车车型 车型名称为key + Map vehicleTypeMap = new HashMap<>(); + initVehicleTypeMap(vehicleTypeMap); + // 整车 + checkFullExcel(fullVehicleExcels, clientEntityMap, priceEntityMap, provinceMap, provinceCityMap, provinceCityAearMap, vehicleTypeMap, message, sheet6); + if (StrUtil.isNotEmpty(message.toString())) { + return message.toString(); + } + // 保存数据 + // 先处理 + saveExcel(priceExcels, basicExcels, warehouseExcels, dispatchExcels, generalExcels, fullVehicleExcels, + templateEntityMap, clientEntityMap, brandEntityMap, priceEntityMap, categoryEntityMap, provinceMap, + provinceCityMap, provinceCityAearMap, vehicleTypeMap, routeMap); + } else { + message.append("请维护").append(sheet1).append("中的基础数据"); + } + } catch (Exception e) { + log.error("价格导入失败", e); + throw new ServiceException("导入失败"); } - // 获取一般费用 + return message.toString(); + } - List generalList = generalService.list(Wrappers.lambdaQuery() - .eq(BasicdataPriceGeneralEntity::getBoId, priceEntity.getId())); - if (CollUtil.isNotEmpty(generalList)) { - // 按类型分组放到generalMap中 - generalList.forEach(item -> { - Integer type = item.getServiceType(); - List collect = generalMap.get(type); - if (ObjectUtil.isEmpty(collect)) { - collect = new ArrayList<>(); + @Override + public String uploadV2(MultipartFile file) { + StringBuilder message = new StringBuilder(); + try { + // 从build中获取5个sheet的数据 + List priceExcels = EasyExcelUtil.readTrim(file, 0, 2, BasicdataPriceV2Excel.class); + // 校验数据 + String sheet1 = "基础数据"; + String sheet2 = "整车费用"; + String sheet3 = "保底价"; + String sheet4 = "正常计费"; + if (CollUtil.isNotEmpty(priceExcels)) { + + // 模板名称为key + Map templateEntityMap = new HashMap<>(); + // 客户名称 + 品牌名称为key + Map templateMap = new HashMap<>(); + // 客户编码为key + Map clientEntityMap = new HashMap<>(); + // 品牌名称为key + Map brandEntityMap = new HashMap<>(); + // 客户名称 + 品牌名称为key + Map priceEntityMap = new HashMap<>(); + Map> checkPriceEntityMap = new HashMap<>(); + Map clientBrandMap = new HashMap<>(); + List fullVehicleExcels = EasyExcelUtil.readTrim(file, 1, 3, BasicdataPriceFullVehicleV2Excel.class); + List generalExcels = EasyExcelUtil.readTrim(file, 2, 2, BasicdataPriceGeneralV2Excel.class); + List basicExcels = EasyExcelUtil.readTrim(file, 3, 4, BasicdataPriceCategoryV2Excel.class); + // 初始化导入校验数据 + initImportDataV2(priceExcels, basicExcels, generalExcels, fullVehicleExcels, templateEntityMap, clientEntityMap, brandEntityMap, + priceEntityMap, clientBrandMap, checkPriceEntityMap, templateMap); + // 校验数据 + checkPriceDataV2(message, priceExcels, sheet1, templateEntityMap, clientEntityMap, brandEntityMap, priceEntityMap, clientBrandMap, + checkPriceEntityMap); + // 第一个sheet数据不合格直接返回 + if (StrUtil.isNotEmpty(message.toString())) { + return message.toString(); } - collect.add(item); - generalMap.put(type, collect); - }); + // 品类名称为key + Map categoryEntityMap = new HashMap<>(); + // 省市区 + Map provinceMap = new HashMap<>(); + Map provinceCityMap = new HashMap<>(); + Map provinceCityAearMap = new HashMap<>(); + // 初始化行政区划 + initRegion(provinceMap, provinceCityMap, provinceCityAearMap); + // 路径为key 客户编码&&&品牌&&&发货单位编码 || 客户编码&&&品牌&&&发货单位编码&&&发站省市 || 客户编码&&&品牌&&&发货单位编码&&&发站省市&&&发站省市区 + Map routeMap = new HashMap<>(); + initRouteMapV2(routeMap, basicExcels, generalExcels, fullVehicleExcels); + // 初始化品类 + initCategoryDataV2(basicExcels, categoryEntityMap); + // 提货干线按品类计费 + checkBasicExcelsV2(message, sheet4, clientEntityMap, priceEntityMap, basicExcels, categoryEntityMap, provinceMap, + provinceCityMap, provinceCityAearMap, clientBrandMap, templateMap); + // 一般计费 + checkGeneralExcelsV2(generalExcels, clientEntityMap, priceEntityMap, provinceMap, provinceCityMap, + provinceCityAearMap, message, sheet3, clientBrandMap, templateMap); + // 封装整车车型 车型名称为key + Map vehicleTypeMap = new HashMap<>(); + initVehicleTypeMap(vehicleTypeMap); + // 整车 + checkFullExcelV2(fullVehicleExcels, clientEntityMap, priceEntityMap, provinceMap, provinceCityMap, + provinceCityAearMap, vehicleTypeMap, message, sheet2, clientBrandMap, templateMap); + if (StrUtil.isNotEmpty(message.toString())) { + return message.toString(); + } + // 保存数据 + // 先处理 + saveExcelV2(priceExcels, basicExcels, generalExcels, fullVehicleExcels, + templateEntityMap, clientEntityMap, brandEntityMap, priceEntityMap, categoryEntityMap, provinceMap, + provinceCityMap, provinceCityAearMap, vehicleTypeMap, routeMap, clientBrandMap, templateMap); + } else { + message.append("请维护").append(sheet1).append("中的基础数据"); + } + } catch (Exception e) { + log.error("价格导入失败", e); + throw new ServiceException("导入失败"); } + return message.toString(); } - private PriceDispatchVO initDispatch(BasicdataPriceEntity priceEntity, BasicdataPriceTemplateEntity templateEntity, List fullVehicleEntities, Map> dispatchMap, List generalEntities, List generalEntities1) { - PriceDispatchVO priceDispatchVO = new PriceDispatchVO(); - String dispatchPricingType = templateEntity.getDispatchPricingType(); - //品类 - Map> categoryBasicMap = new HashMap<>(); - List dispatchEntities = dispatchMap.get(CostTypeEnums.NOMAL.getCode()); - if (CollUtil.isNotEmpty(dispatchEntities)) { - // 将数据放到categoryBasicMap中 - dispatchEntities.forEach(item -> { - Integer type = item.getServiceType(); - List collect = categoryBasicMap.get(type); - if (ObjectUtil.isEmpty(collect)) { - collect = new ArrayList<>(); + private void initRouteMap(Map routeMap, List basicExcels, List generalExcels, List fullVehicleExcels) { + if (CollUtil.isNotEmpty(basicExcels)) { + for (BasicdataPriceCategoryBasicExcel basicExcel : basicExcels) { + // 发站省,发站市,到站省,到站市,发货单位不为空则说明是一条路径 + if (!ObjectUtil.isAllEmpty(basicExcel.getClientCode(), basicExcel.getBrand(), basicExcel.getSendOrgCode())) { + String key = buildRoutKey(basicExcel.getClientCode(), basicExcel.getBrand(), basicExcel.getStartProvince(), + basicExcel.getStartCity(), basicExcel.getStartArea(), basicExcel.getEndProvince(), basicExcel.getEndCity(), + basicExcel.getEndArea(), basicExcel.getSendOrgCode()); + if (!routeMap.containsKey(key)) { + routeMap.put(key, basicExcel.getClientCode() + "&&&" + basicExcel.getBrand() + "&&&" + basicExcel.getType()); + } } - collect.add(item); - categoryBasicMap.put(type, collect); - }); - } - //整车 - if (dispatchPricingType.contains(DispatchPricingTypeEnums.COMPLETE_VEHICLE.getCode().toString())) { - if (CollUtil.isNotEmpty(fullVehicleEntities)) { - List basicVOList = new ArrayList<>(); - fullVehicleEntities.forEach(item -> { - BasicdataPriceFullVehicleVO basicVO = new BasicdataPriceFullVehicleVO(); - BeanUtil.copyProperties(item, basicVO); - basicVOList.add(basicVO); - }); - priceDispatchVO.setFullVehicle(basicVOList); } } - // 按件 - if (dispatchPricingType.contains(DispatchPricingTypeEnums.PIECE.getCode().toString())) { - List basicVOList = new ArrayList<>(); - List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.PIECE.getCode()); - if (CollUtil.isNotEmpty(basicEntities)) { - basicEntities.forEach(item -> { - PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); - BeanUtil.copyProperties(item, basicVO); - basicVOList.add(basicVO); - }); + if (CollUtil.isNotEmpty(generalExcels)) { + for (BasicdataPriceGeneralExcel generalExcel : generalExcels) { + if (!ObjectUtil.isAllEmpty(generalExcel.getStartProvince(), generalExcel.getStartCity(), generalExcel.getEndProvince(), + generalExcel.getEndCity(), generalExcel.getSendOrgCode())) { + String key = buildRoutKey(generalExcel.getClientCode(), generalExcel.getBrand(), generalExcel.getStartProvince(), generalExcel.getStartCity(), generalExcel.getStartArea(), + generalExcel.getEndProvince(), generalExcel.getEndCity(), generalExcel.getEndArea(), generalExcel.getSendOrgCode()); + if (!routeMap.containsKey(key)) { + routeMap.put(key, generalExcel.getClientCode() + "&&&" + generalExcel.getBrand() + "&&&" + generalExcel.getType()); + } + } } - priceDispatchVO.setPieceCategory(basicVOList); } - // 按重量 - if (dispatchPricingType.contains(DispatchPricingTypeEnums.WEIGHT.getCode().toString())) { - List basicVOList = new ArrayList<>(); - List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.WEIGHT.getCode()); - if (CollUtil.isNotEmpty(basicEntities)) { - basicEntities.forEach(item -> { - PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); - BeanUtil.copyProperties(item, basicVO); - basicVOList.add(basicVO); - }); + if (CollUtil.isNotEmpty(fullVehicleExcels)) { + for (BasicdataPriceFullVehicleExcel fullVehicleExcel : fullVehicleExcels) { + if (!ObjectUtil.isAllEmpty(fullVehicleExcel.getStartProvince(), fullVehicleExcel.getStartCity(), + fullVehicleExcel.getEndProvince(), fullVehicleExcel.getEndCity(), fullVehicleExcel.getSendOrgCode())) { + String key = buildRoutKey(fullVehicleExcel.getClientCode(), fullVehicleExcel.getBrand(), fullVehicleExcel.getStartProvince(), fullVehicleExcel.getStartCity(), fullVehicleExcel.getStartArea(), + fullVehicleExcel.getEndProvince(), fullVehicleExcel.getEndCity(), fullVehicleExcel.getEndArea(), fullVehicleExcel.getSendOrgCode()); + if (!routeMap.containsKey(key)) { + routeMap.put(key, fullVehicleExcel.getClientCode() + "&&&" + fullVehicleExcel.getBrand() + "&&&" + fullVehicleExcel.getType()); + } + } } - priceDispatchVO.setWeightCategory(basicVOList); } - // 按方 - if (dispatchPricingType.contains(DispatchPricingTypeEnums.CUBE.getCode().toString())) { - List basicVOList = new ArrayList<>(); - List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.CUBE.getCode()); - if (CollUtil.isNotEmpty(basicEntities)) { - basicEntities.forEach(item -> { - PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); - BeanUtil.copyProperties(item, basicVO); - basicVOList.add(basicVO); - }); + } + + private void initRouteMapV2(Map routeMap, List basicExcels, List generalExcels, List fullVehicleExcels) { + if (CollUtil.isNotEmpty(basicExcels)) { + for (BasicdataPriceCategoryV2Excel basicExcel : basicExcels) { + // 发站省,发站市,到站省,到站市,发货单位不为空则说明是一条路径 + if (!ObjectUtil.isAllEmpty(basicExcel.getClient(), basicExcel.getBrand(), basicExcel.getSendOrg())) { + if (StrUtil.isNotEmpty(basicExcel.getPickupPrice())) { + // 提货路径 + String pickupKey = buildRoutKeyV2(basicExcel.getClient(), basicExcel.getBrand(), basicExcel.getStartProvince(), + basicExcel.getStartCity(), basicExcel.getStartArea(), basicExcel.getEndProvince(), basicExcel.getEndCity(), + basicExcel.getEndArea(), basicExcel.getSendOrg(), "1"); + if (!routeMap.containsKey(pickupKey)) { + routeMap.put(pickupKey, basicExcel.getClient() + "&&&" + basicExcel.getBrand()); + } + } + if (StrUtil.isNotEmpty(basicExcel.getTrunkLinePrice())) { + // 干线路径 + String trunkLineKey = buildRoutKeyV2(basicExcel.getClient(), basicExcel.getBrand(), basicExcel.getStartProvince(), + basicExcel.getStartCity(), basicExcel.getStartArea(), basicExcel.getEndProvince(), basicExcel.getEndCity(), + basicExcel.getEndArea(), basicExcel.getSendOrg(), "2"); + if (!routeMap.containsKey(trunkLineKey)) { + routeMap.put(trunkLineKey, basicExcel.getClient() + "&&&" + basicExcel.getBrand()); + } + } + } } - priceDispatchVO.setCubeCategory(basicVOList); } - // 按公里 - if (dispatchPricingType.contains(DispatchPricingTypeEnums.KILOMETER.getCode().toString())) { - List basicVOList = new ArrayList<>(); - List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.KILOMETER.getCode()); - if (CollUtil.isNotEmpty(basicEntities)) { - basicEntities.forEach(item -> { - PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); - BeanUtil.copyProperties(item, basicVO); - basicVOList.add(basicVO); - }); + if (CollUtil.isNotEmpty(generalExcels)) { + for (BasicdataPriceGeneralV2Excel generalExcel : generalExcels) { + if (!ObjectUtil.isAllEmpty(generalExcel.getClient(), generalExcel.getBrand(), generalExcel.getSendOrg())) { + if (StrUtil.isNotEmpty(generalExcel.getPickupMinCost())) { + // 提货路径 + String pickupKey = buildRoutKeyV2(generalExcel.getClient(), generalExcel.getBrand(), generalExcel.getStartProvince(), generalExcel.getStartCity(), generalExcel.getStartArea(), + generalExcel.getEndProvince(), generalExcel.getEndCity(), generalExcel.getEndArea(), generalExcel.getSendOrg(), "1"); + if (!routeMap.containsKey(pickupKey)) { + routeMap.put(pickupKey, generalExcel.getClient() + "&&&" + generalExcel.getBrand()); + } + } + if (StrUtil.isNotEmpty(generalExcel.getTrunkLineMinCost())) { + // 干线路径 + String trunkLineKey = buildRoutKeyV2(generalExcel.getClient(), generalExcel.getBrand(), generalExcel.getStartProvince(), generalExcel.getStartCity(), generalExcel.getStartArea(), + generalExcel.getEndProvince(), generalExcel.getEndCity(), generalExcel.getEndArea(), generalExcel.getSendOrg(), "2"); + if (!routeMap.containsKey(trunkLineKey)) { + routeMap.put(trunkLineKey, generalExcel.getClient() + "&&&" + generalExcel.getBrand()); + } + } + } } - priceDispatchVO.setKilometerCost(basicVOList); } - // 按吨 - if (dispatchPricingType.contains(DispatchPricingTypeEnums.TON.getCode().toString())) { - List basicVOList = new ArrayList<>(); - List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.TON.getCode()); - if (CollUtil.isNotEmpty(basicEntities)) { - basicEntities.forEach(item -> { - PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); - BeanUtil.copyProperties(item, basicVO); - basicVOList.add(basicVO); - }); + if (CollUtil.isNotEmpty(fullVehicleExcels)) { + for (BasicdataPriceFullVehicleV2Excel fullVehicleExcel : fullVehicleExcels) { + if (!ObjectUtil.isAllEmpty(fullVehicleExcel.getClient(), fullVehicleExcel.getBrand(), fullVehicleExcel.getSendOrg())) { + if (StrUtil.isNotEmpty(fullVehicleExcel.getPickupPrice())) { + // 提货路径 + String pickupKey = buildRoutKeyV2(fullVehicleExcel.getClient(), fullVehicleExcel.getBrand(), fullVehicleExcel.getStartProvince(), fullVehicleExcel.getStartCity(), fullVehicleExcel.getStartArea(), + fullVehicleExcel.getEndProvince(), fullVehicleExcel.getEndCity(), fullVehicleExcel.getEndArea(), fullVehicleExcel.getSendOrg(), "1"); + if (!routeMap.containsKey(pickupKey)) { + routeMap.put(pickupKey, fullVehicleExcel.getClient() + "&&&" + fullVehicleExcel.getBrand()); + } + } + if (StrUtil.isNotEmpty(fullVehicleExcel.getTrunkLinePrice())) { + // 干线路径 + String trunkLineKey = buildRoutKeyV2(fullVehicleExcel.getClient(), fullVehicleExcel.getBrand(), fullVehicleExcel.getStartProvince(), fullVehicleExcel.getStartCity(), fullVehicleExcel.getStartArea(), + fullVehicleExcel.getEndProvince(), fullVehicleExcel.getEndCity(), fullVehicleExcel.getEndArea(), fullVehicleExcel.getSendOrg(), "2"); + if (!routeMap.containsKey(trunkLineKey)) { + routeMap.put(trunkLineKey, fullVehicleExcel.getClient() + "&&&" + fullVehicleExcel.getBrand()); + } + } + } } - priceDispatchVO.setTonCost(basicVOList); } - //按吨公里 - if (dispatchPricingType.contains(DispatchPricingTypeEnums.TON_PER_KILOMETER.getCode().toString())) { - List basicVOList = new ArrayList<>(); - List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.TON_PER_KILOMETER.getCode()); - if (CollUtil.isNotEmpty(basicEntities)) { - basicEntities.forEach(item -> { - PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); - BeanUtil.copyProperties(item, basicVO); - basicVOList.add(basicVO); - }); + } + + private String buildRoutKey(String clientCode, String brand, String startProvince, String startCity, String startArea, String endProvince, String endCity, String endArea, String sendOrg) { + StringBuilder key = new StringBuilder(); + String split = "&&&"; + key.append(clientCode).append(split).append(brand); + key.append(split).append(sendOrg); + if (!ObjectUtil.isAllEmpty(startProvince, startCity)) { + key.append(split).append(startProvince).append(split).append(startCity); + if (StrUtil.isNotEmpty(startArea)) { + key.append(split).append(startArea); + } + if (!ObjectUtil.isAllEmpty(endProvince, endCity)) { + key.append(split).append(endProvince).append(split).append(endCity); + if (StrUtil.isNotEmpty(endArea)) { + key.append(split).append(endArea); + } } - priceDispatchVO.setTonKilometerCost(basicVOList); - } - //附加费 - List dispatchEntities1 = dispatchMap.get(CostTypeEnums.ADD.getCode()); - if (CollUtil.isNotEmpty(dispatchEntities1)) { - List basicVOList = new ArrayList<>(); - dispatchEntities1.forEach(item -> { - PriceDispatchAdditionalVO basicVO = new PriceDispatchAdditionalVO(); - BeanUtil.copyProperties(item, basicVO); - basicVOList.add(basicVO); - }); - priceDispatchVO.setAdditionalCategory(basicVOList); - } - // 一般费用 generalEntities - if (CollUtil.isNotEmpty(generalEntities)) { - BasicdataPriceGeneralEntity generalEntity = generalEntities.get(0); - priceDispatchVO.setMinCost(generalEntity.getMinCost()); - priceDispatchVO.setAdditionalCost(generalEntity.getAdditionalCost()); - } - if (CollUtil.isNotEmpty(generalEntities1)) { - BasicdataPriceGeneralEntity generalEntity = generalEntities1.get(0); - priceDispatchVO.setLeaveBehindMinCost(generalEntity.getMinCost()); - priceDispatchVO.setLeaveBehindAdditionalCost(generalEntity.getAdditionalCost()); } - // 设置基础费用 - priceDispatchVO.setDispatchUpwardJudgment(priceEntity.getDispatchUpwardJudgment()); - priceDispatchVO.setDispatchUpwardJudgmentCost(priceEntity.getDispatchUpwardJudgmentCost()); - priceDispatchVO.setDispatchStairsCarryingCharge(priceEntity.getDispatchStairsCarryingCharge()); - return priceDispatchVO; + return key.toString(); } - private PriceWarehouseVO initWarehouse(BasicdataPriceEntity priceEntity, BasicdataPriceTemplateEntity templateEntity, Map> warehouseMap) { - PriceWarehouseVO priceWarehouseVO = new PriceWarehouseVO(); - Integer warehousePricingType = templateEntity.getWarehousePricingType(); - Map> categoryBasicMap = new HashMap<>(); - List warehouseEntities = warehouseMap.get(CostTypeEnums.NOMAL.getCode()); - if (CollUtil.isNotEmpty(warehouseEntities)) { - warehouseEntities.forEach(item -> { - Integer type = item.getType(); - List collect = categoryBasicMap.get(type); - if (ObjectUtil.isEmpty(collect)) { - collect = new ArrayList<>(); + private String buildRoutKeyV2(String clientCode, String brand, String startProvince, String startCity, String startArea, + String endProvince, String endCity, String endArea, String sendOrg, String type) { + StringBuilder key = new StringBuilder(); + String split = "&&&"; + key.append(clientCode).append(split).append(brand); + key.append(split).append(sendOrg).append(split).append(type); + if (!ObjectUtil.isAllEmpty(startProvince, startCity)) { + key.append(split).append(startProvince).append(split).append(startCity); + if (StrUtil.isNotEmpty(startArea)) { + key.append(split).append(startArea); + } + if (!ObjectUtil.isAllEmpty(endProvince, endCity)) { + key.append(split).append(endProvince).append(split).append(endCity); + if (StrUtil.isNotEmpty(endArea)) { + key.append(split).append(endArea); } - collect.add(item); - categoryBasicMap.put(type, collect); - }); - } - // 按件 - if (warehousePricingType.equals(WarehousePricingTypeEnums.PIECE.getCode())) { - List warehouseEntities1 = categoryBasicMap.get(WarehousePricingTypeEnums.PIECE.getCode()); - if (CollUtil.isNotEmpty(warehouseEntities1)) { - List basicVOS = warehouseEntities1.stream().map(item -> { - PriceWarehouseBasicVO basicVO = new PriceWarehouseBasicVO(); - BeanUtil.copyProperties(item, basicVO); - return basicVO; - }).collect(Collectors.toList()); - priceWarehouseVO.setCatergory(basicVOS); - } - } else if (warehousePricingType.equals(WarehousePricingTypeEnums.CUBE.getCode())) { - List warehouseEntities2 = categoryBasicMap.get(WarehousePricingTypeEnums.CUBE.getCode()); - if (CollUtil.isNotEmpty(warehouseEntities2)) { - List basicVOS = warehouseEntities2.stream().map(item -> { - PriceWarehouseBasicVO basicVO = new PriceWarehouseBasicVO(); - BeanUtil.copyProperties(item, basicVO); - return basicVO; - }).collect(Collectors.toList()); - priceWarehouseVO.setCatergory(basicVOS); - } - } else if (warehousePricingType.equals(WarehousePricingTypeEnums.WEIGHT.getCode())) { - List warehouseEntities3 = categoryBasicMap.get(WarehousePricingTypeEnums.WEIGHT.getCode()); - if (CollUtil.isNotEmpty(warehouseEntities3)) { - List basicVOS = warehouseEntities3.stream().map(item -> { - PriceWarehouseBasicVO basicVO = new PriceWarehouseBasicVO(); - BeanUtil.copyProperties(item, basicVO); - return basicVO; - }).collect(Collectors.toList()); - priceWarehouseVO.setCatergory(basicVOS); - } - } else if (warehousePricingType.equals(WarehousePricingTypeEnums.TONNE.getCode())) { - List warehouseEntities4 = categoryBasicMap.get(WarehousePricingTypeEnums.TONNE.getCode()); - if (CollUtil.isNotEmpty(warehouseEntities4)) { - List basicVOS = warehouseEntities4.stream().map(item -> { - PriceWarehouseBasicVO basicVO = new PriceWarehouseBasicVO(); - BeanUtil.copyProperties(item, basicVO); - return basicVO; - }).collect(Collectors.toList()); - priceWarehouseVO.setCatergory(basicVOS); } } - // 附加费 - List warehouseEntities1 = warehouseMap.get(CostTypeEnums.ADD.getCode()); - if (CollUtil.isNotEmpty(warehouseEntities1)) { + return key.toString(); + } + + private void saveExcel(List priceExcels, List basicExcels, + List warehouseExcels, + List dispatchExcels, + List generalExcels, List fullVehicleExcels, + Map templateEntityMap, + Map clientEntityMap, Map brandEntityMap, + Map priceEntityMap, Map categoryEntityMap, + Map provinceMap, Map provinceCityMap, + Map provinceCityAearMap, Map vehicleTypeMap, + Map routeMap) { + if (CollUtil.isNotEmpty(priceExcels)) { + List priceEntities = new ArrayList<>(); + List basicEntities = new ArrayList<>(); + List warehouseEntities = new ArrayList<>(); + List dispatchEntities = new ArrayList<>(); + List fullVehicleEntities = new ArrayList<>(); + List generalEntities = new ArrayList<>(); + List routeEntities = new ArrayList<>(); + Map templateMap = new HashMap<>(); + // 保存基本信息 + buildPriceEntitiesExcel(priceExcels, templateEntityMap, priceEntityMap, priceEntities, templateMap); + if (CollUtil.isNotEmpty(priceEntities)) { + this.updateBatchById(priceEntities); + } + // 封装保存好的路径 + Map routeEntityMap = new HashMap<>(); + // 保存路径 + buildSaveRouteEntitiesExcel(clientEntityMap, priceEntityMap, provinceMap, provinceCityMap, provinceCityAearMap, routeMap, routeEntities, routeEntityMap); + if (CollUtil.isNotEmpty(routeEntities)) { + basicdataPriceRouteService.saveBatch(routeEntities); + } + // 处理 提货干线按品类计费 + buildSaveBasicEntitiesExcel(basicExcels, priceEntityMap, categoryEntityMap, basicEntities, templateMap, routeEntityMap); + if (CollUtil.isNotEmpty(basicEntities)) { + categoryBasicService.saveBatch(basicEntities); + } + // 处理仓储费 + buildSaveWarehouseEntitiesExcel(warehouseExcels, priceEntityMap, categoryEntityMap, warehouseEntities); + if (CollUtil.isNotEmpty(warehouseEntities)) { + categoryWarehouseService.saveBatch(warehouseEntities); + } + // 处理配送费 + buildSaveDispatchEntitiesExcel(dispatchExcels, priceEntityMap, categoryEntityMap, dispatchEntities); + if (CollUtil.isNotEmpty(dispatchEntities)) { + categoryDispatchService.saveBatch(dispatchEntities); + } + // 处理整车费用 + buildSaveFullVehicleEntitiesExcel(fullVehicleExcels, priceEntityMap, categoryEntityMap, fullVehicleEntities, templateMap, routeEntityMap, vehicleTypeMap); + if (CollUtil.isNotEmpty(fullVehicleEntities)) { + fullVehicleService.saveBatch(fullVehicleEntities); + } + // 处理一般费用 + buildSaveGeneralEntitiesExcel(generalExcels, priceEntityMap, categoryEntityMap, generalEntities, templateMap, routeEntityMap); + if (CollUtil.isNotEmpty(generalEntities)) { + generalService.saveBatch(generalEntities); + } + } + } + + @Transactional(rollbackFor = Exception.class) + public void saveExcelV2(List priceExcels, List basicExcels, + List generalExcels, List fullVehicleExcels, + Map templateEntityMap, + Map clientEntityMap, Map brandEntityMap, + Map priceEntityMap, Map categoryEntityMap, + Map provinceMap, Map provinceCityMap, + Map provinceCityAearMap, Map vehicleTypeMap, + Map routeMap, Map clientBrandMap, Map templateMap) { + if (CollUtil.isNotEmpty(priceExcels)) { + List priceEntities = new ArrayList<>(); + List basicEntities = new ArrayList<>(); + List warehouseEntities = new ArrayList<>(); + List dispatchEntities = new ArrayList<>(); + List fullVehicleEntities = new ArrayList<>(); + List generalEntities = new ArrayList<>(); + List routeEntities = new ArrayList<>(); +// Map templateMap = new HashMap<>(); + // 保存基本信息 + buildPriceEntitiesExcelV2(priceExcels, templateEntityMap, priceEntityMap, priceEntities, templateMap, generalExcels, basicExcels, clientBrandMap); + if (CollUtil.isNotEmpty(priceEntities)) { + this.saveOrUpdateBatch(priceEntities); + } + // 封装保存好的路径 + Map routeEntityMap = new HashMap<>(); + // 保存路径 + buildSaveRouteEntitiesExcelV2(clientEntityMap, priceEntityMap, provinceMap, provinceCityMap, + provinceCityAearMap, routeMap, routeEntities, routeEntityMap, templateMap); + if (CollUtil.isNotEmpty(routeEntities)) { + basicdataPriceRouteService.saveBatch(routeEntities); + } + // 处理 提货干线按品类计费 + buildSaveBasicEntitiesExcelV2(basicExcels, priceEntityMap, categoryEntityMap, basicEntities, templateMap, routeEntityMap, warehouseEntities, dispatchEntities); + if (CollUtil.isNotEmpty(basicEntities)) { + categoryBasicService.saveBatch(basicEntities); + } + if (CollUtil.isNotEmpty(warehouseEntities)) { + categoryWarehouseService.saveBatch(warehouseEntities); + } + if (CollUtil.isNotEmpty(dispatchEntities)) { + categoryDispatchService.saveBatch(dispatchEntities); + } + // 处理整车费用 + buildSaveFullVehicleEntitiesExcelV2(fullVehicleExcels, priceEntityMap, categoryEntityMap, fullVehicleEntities, templateMap, routeEntityMap, vehicleTypeMap); + if (CollUtil.isNotEmpty(fullVehicleEntities)) { + fullVehicleService.saveBatch(fullVehicleEntities); + } + // 处理一般费用 + buildSaveGeneralEntitiesExcelV2(generalExcels, priceEntityMap, categoryEntityMap, generalEntities, templateMap, routeEntityMap); + if (CollUtil.isNotEmpty(generalEntities)) { + generalService.saveBatch(generalEntities); + } + if (CollUtil.isNotEmpty(priceEntities)) { + this.saveOrUpdateBatch(priceEntities); + } + } + } + + private void buildSaveWarehouseEntitiesExcel(List warehouseExcels, Map priceEntityMap, Map categoryEntityMap, List warehouseEntities) { + if (CollUtil.isNotEmpty(warehouseExcels)) { + for (BasicdataPriceCategoryWarehouseExcel warehouseExcel : warehouseExcels) { + BasicdataPriceCategoryWarehouseEntity warehouseEntity = new BasicdataPriceCategoryWarehouseEntity(); + BasicdataPriceEntity priceEntity = priceEntityMap.get(warehouseExcel.getClientCode() + warehouseExcel.getBrand()); + if (ObjectUtil.isNotEmpty(priceEntity)) { + warehouseEntity.setPriceId(priceEntity.getId()); + warehouseEntity.setBoId(priceEntity.getId()); + } + if (StrUtil.isNotEmpty(warehouseExcel.getCategory())) { + BasicdataCategoryEntity basicdataCategoryEntity = categoryEntityMap.get(warehouseExcel.getCategory()); + if (ObjectUtil.isNotEmpty(basicdataCategoryEntity)) { + warehouseEntity.setCategoryId(basicdataCategoryEntity.getId()); + } + } + if (StrUtil.isNotEmpty(warehouseExcel.getType())) { + warehouseEntity.setCostType(IDict.getCodeByText(CostTypeEnums.class, warehouseExcel.getType())); + } + if (StrUtil.isNotEmpty(warehouseExcel.getCostType())) { + warehouseEntity.setType(IDict.getCodeByText(WarehousePricingTypeEnums.class, warehouseExcel.getCostType())); + } + warehouseEntity.setServiceType(1); + if (StrUtil.isNotEmpty(warehouseExcel.getWithinThirtyPrice())) { + warehouseEntity.setWithinThirtyPrice(Convert.toDouble(warehouseExcel.getWithinThirtyPrice())); + } + if (StrUtil.isNotEmpty(warehouseExcel.getBetweenThirtySixtyPrice())) { + warehouseEntity.setBetweenThirtySixtyPrice(Convert.toDouble(warehouseExcel.getBetweenThirtySixtyPrice())); + } + if (StrUtil.isNotEmpty(warehouseExcel.getBeyondSixtyPrice())) { + warehouseEntity.setBeyondSixtyPrice(Convert.toDouble(warehouseExcel.getBeyondSixtyPrice())); + } + if (StrUtil.isNotEmpty(warehouseExcel.getMaximumPrice())) { + warehouseEntity.setMaximumPrice(Convert.toDouble(warehouseExcel.getMaximumPrice())); + } + if (StrUtil.isNotEmpty(warehouseExcel.getOperatePrice())) { + warehouseEntity.setOperatePrice(Convert.toDouble(warehouseExcel.getOperatePrice())); + } + if (StrUtil.isNotEmpty(warehouseExcel.getWarehouseManagementPrice())) { + warehouseEntity.setWarehouseManagementPrice(Convert.toDouble(warehouseExcel.getWarehouseManagementPrice())); + } + if (StrUtil.isNotEmpty(warehouseExcel.getWarehouseSortPrice())) { + warehouseEntity.setWarehouseSortPrice(Convert.toDouble(warehouseExcel.getWarehouseSortPrice())); + } + warehouseEntities.add(warehouseEntity); + } + } + } + + private void buildSaveDispatchEntitiesExcel(List warehouseExcels, + Map priceEntityMap, + Map categoryEntityMap, + List entities) { + if (CollUtil.isNotEmpty(warehouseExcels)) { + for (BasicdataPriceCategoryDispatchExcel excel : warehouseExcels) { + BasicdataPriceCategoryDispatchEntity entity = new BasicdataPriceCategoryDispatchEntity(); + BasicdataPriceEntity priceEntity = priceEntityMap.get(excel.getClientCode() + excel.getBrand()); + if (ObjectUtil.isNotEmpty(priceEntity)) { + entity.setPriceId(priceEntity.getId()); + entity.setBoId(priceEntity.getId()); + } + if (StrUtil.isNotEmpty(excel.getCategory())) { + BasicdataCategoryEntity basicdataCategoryEntity = categoryEntityMap.get(excel.getCategory()); + if (ObjectUtil.isNotEmpty(basicdataCategoryEntity)) { + entity.setCategoryId(basicdataCategoryEntity.getId()); + } + } + if (StrUtil.isNotEmpty(excel.getType())) { + entity.setCostType(IDict.getCodeByText(CostTypeEnums.class, excel.getType())); + } + if (StrUtil.isNotEmpty(excel.getCostType())) { + entity.setType(IDict.getCodeByText(WarehousePricingTypeEnums.class, excel.getCostType())); + } + entity.setServiceType(1); + if (StrUtil.isNotEmpty(excel.getPrice())) { + entity.setPrice(Convert.toDouble(excel.getPrice())); + } + if (StrUtil.isNotEmpty(excel.getLeaveBehindPrice())) { + entity.setLeaveBehindPrice(Convert.toDouble(excel.getLeaveBehindPrice())); + } + if (StrUtil.isNotEmpty(excel.getSortPrice())) { + entity.setSortPrice(Convert.toDouble(excel.getSortPrice())); + } + if (StrUtil.isNotEmpty(excel.getHandlingPrice())) { + entity.setHandlingPrice(Convert.toDouble(excel.getHandlingPrice())); + } + if (StrUtil.isNotEmpty(excel.getRelocationPrice())) { + entity.setRelocationPrice(Convert.toDouble(excel.getRelocationPrice())); + } + if (StrUtil.isNotEmpty(excel.getUpstairsDeliveryPrice())) { + entity.setUpstairsDeliveryPrice(Convert.toDouble(excel.getUpstairsDeliveryPrice())); + } + entities.add(entity); + } + } + } + + private void buildPriceEntitiesExcel(List priceExcels, Map templateEntityMap, Map priceEntityMap, List priceEntities, Map templateMap) { + for (BasicdataPriceExcel priceExcel : priceExcels) { + BasicdataPriceEntity priceEntity = priceEntityMap.get(priceExcel.getClientCode() + priceExcel.getBrand()); + templateMap.put(priceExcel.getClientCode() + priceExcel.getBrand(), templateEntityMap.get(priceExcel.getTemplateName())); + if (ObjectUtil.isNotEmpty(priceEntity)) { + // 删除数据 + deleteByPriceId(priceEntity.getId()); + priceEntity.setMaintenanceStatus(2); + // 设置值 + setPriceExcel(templateEntityMap, priceExcel, priceEntity); + priceEntities.add(priceEntity); + } + } + } + + private void buildPriceEntitiesExcelV2(List priceExcels, Map templateEntityMap, + Map priceEntityMap, List priceEntities, + Map templateMap, List generalExcels, + List basicExcels, Map clientBrandMap) { + for (BasicdataPriceV2Excel priceExcel : priceExcels) { + BasicdataPriceEntity priceEntity = priceEntityMap.get(priceExcel.getClient() + priceExcel.getBrand()); + if (ObjectUtil.isEmpty(priceEntity)) { + priceEntity = new BasicdataPriceEntity(); + priceEntity.setClientId(clientBrandMap.get(priceExcel.getClient() + priceExcel.getBrand()).getClientId()); + priceEntity.setBrandId(clientBrandMap.get(priceExcel.getClient() + priceExcel.getBrand()).getBrandId()); + priceEntityMap.put(priceExcel.getClient() + priceExcel.getBrand(), priceEntity); + } + BasicdataPriceTemplateEntity templateEntity = templateEntityMap.get(priceExcel.getTemplateName()); + templateMap.put(priceExcel.getClient() + priceExcel.getBrand(), templateEntity); + if (ObjectUtil.isNotEmpty(priceEntity)) { + // 删除数据 + if (ObjectUtil.isNotEmpty(priceEntity.getId())) { + deleteByPriceId(priceEntity.getId()); + } + priceEntity.setMaintenanceStatus(2); + // 设置值 +// setPriceExcelV2(templateEntityMap, priceExcel, priceEntity); + priceEntity.setEffectiveTime(DateUtil.parseDate(priceExcel.getEffectiveTime())); + priceEntity.setExpiryTime(DateUtil.parseDate(priceExcel.getExpiryTime())); + priceEntity.setTemplateId(templateEntity.getId()); + // 是否配置向上判断数 + if (ObjectUtil.equal(templateEntity.getDispatchIsUpwardJudgment(), BooleanZeroOneEnums.YES.getCode())) { + for (BasicdataPriceGeneralV2Excel basicExcel : generalExcels) { + if (ObjectUtil.equal(basicExcel.getClient(), priceExcel.getClient()) + && ObjectUtil.equal(basicExcel.getBrand(), priceExcel.getBrand())) { + if (StrUtil.isNotEmpty(basicExcel.getDispatchUpwardJudgment())) { + priceEntity.setDispatchUpwardJudgmentCost(Convert.toDouble(basicExcel.getDispatchUpwardJudgment())); + } + if (StrUtil.isNotEmpty(basicExcel.getDispatchUpwardJudgmentCost())) { + priceEntity.setDispatchUpwardJudgmentCost(Convert.toDouble(basicExcel.getDispatchUpwardJudgmentCost())); + } + } + } + } + // 是否配置免楼层数 + if (ObjectUtil.equal(templateEntity.getDispatchIsFeeFloor(), BooleanZeroOneEnums.YES.getCode())) { + for (BasicdataPriceCategoryV2Excel basicExcel : basicExcels) { + if (ObjectUtil.equal(basicExcel.getClient(), priceExcel.getClient()) + && ObjectUtil.equal(basicExcel.getBrand(), priceExcel.getBrand())) { + if (StrUtil.isNotEmpty(basicExcel.getDispatchStairsCarryingCharge())) { + priceEntity.setDispatchStairsCarryingCharge(Convert.toInt(basicExcel.getDispatchStairsCarryingCharge())); + } + } + } + } + priceEntities.add(priceEntity); + } + } + } + + private void buildSaveRouteEntitiesExcel(Map clientEntityMap, Map priceEntityMap, Map provinceMap, Map provinceCityMap, Map provinceCityAearMap, Map routeMap, List routeEntities, Map routeEntityMap) { + if (CollUtil.isNotEmpty(routeMap)) { + for (Map.Entry entry : routeMap.entrySet()) { + String value = entry.getValue(); + // 客户编码&&&品牌&&&发货单位编码 || 客户编码&&&品牌&&&发货单位编码&&&发站省市 || 客户编码&&&品牌&&&发货单位编码&&&发站省市&&&发站省市区 + String key = entry.getKey(); + if (StrUtil.isNotEmpty(value)) { + List split = StrUtil.split(value, "&&&"); + if (split.size() == 3) { + String s = split.get(0) + split.get(1); + String s1 = split.get(2); + if (StrUtil.isNotEmpty(s)) { + BasicdataPriceEntity priceEntity = priceEntityMap.get(s); + BasicdataPriceRouteEntity routeEntity = new BasicdataPriceRouteEntity(); + routeEntity.setPriceId(priceEntity.getId()); + routeEntity.setServiceType(IDict.getCodeByText(ServiceTypeEnums.class, s1)); + if (StrUtil.isNotEmpty(key)) { + List regions = StrUtil.split(key, "&&&"); + if (CollUtil.isNotEmpty(regions)) { + setSendOrgExcel(clientEntityMap, routeEntity, regions.get(2)); + // 发货单位-省市 5 + if (regions.size() >= 5) { + setStarProvinceExcel(provinceMap, routeEntity, regions.get(3)); + setStartCityExcel(provinceCityMap, routeEntity, regions.get(3), regions.get(4)); + } + // 发货单位-省市区 6 + if (ObjectUtil.equal(regions.size(), 6)) { + setStartCountExcel(provinceCityAearMap, routeEntity, regions.get(3), regions.get(4), regions.get(5)); + } + // 发货单位-省市-省市 7 + if (ObjectUtil.equal(regions.size(), 7)) { + setEndProvinceExcel(provinceMap, routeEntity, regions.get(5)); + setEndCityExcel(provinceCityMap, routeEntity, regions.get(5) + regions.get(6)); + } + // 发货单位-省市区-省市区 9 + if (ObjectUtil.equal(regions.size(), 9)) { + setStartCountExcel(provinceCityAearMap, routeEntity, regions.get(3), regions.get(4), regions.get(5)); + setEndProvinceExcel(provinceMap, routeEntity, regions.get(6)); + setEndCityExcel(provinceCityMap, routeEntity, regions.get(6) + regions.get(7)); + setEndCountExcel(provinceCityAearMap, routeEntity, regions.get(6), regions.get(7), regions.get(8)); + } + // 发货单位-省市区-省市 8 + if (ObjectUtil.equal(regions.size(), 8)) { + // 如果 s3s4s5 是省市区 则说明 s5 是区 + if (provinceCityAearMap.containsKey(regions.get(3) + regions.get(4) + regions.get(5))) { + setStartCountExcel(provinceCityAearMap, routeEntity, regions.get(3), regions.get(4), regions.get(5)); + setEndProvinceExcel(provinceMap, routeEntity, regions.get(6)); + setEndCityExcel(provinceCityMap, routeEntity, regions.get(6) + regions.get(7)); + } else { + // 发货单位-省市-省市区 8 + setEndProvinceExcel(provinceMap, routeEntity, regions.get(5)); + setEndCityExcel(provinceCityMap, routeEntity, regions.get(5) + regions.get(6)); + setEndCountExcel(provinceCityAearMap, routeEntity, regions.get(5), regions.get(6), regions.get(7)); + } + } + } + } + routeEntityMap.put(key + "&&&" + s1, routeEntity); + routeEntities.add(routeEntity); + } + } + } + } + } + } + + private void buildSaveRouteEntitiesExcelV2(Map clientEntityMap, Map priceEntityMap, + Map provinceMap, Map provinceCityMap, Map provinceCityAearMap, + Map routeMap, List routeEntities, + Map routeEntityMap, Map templateMap) { + if (CollUtil.isNotEmpty(routeMap)) { + for (Map.Entry entry : routeMap.entrySet()) { + // 客户编码&&&品牌&&&发货单位编码 || 客户编码&&&品牌&&&发货单位编码&&&发站省市 || 客户编码&&&品牌&&&发货单位编码&&&发站省市&&&发站省市区 + // + &&&1/&&&2 + String key = entry.getKey(); + if (StrUtil.isNotEmpty(key)) { + List regions = StrUtil.split(key, "&&&"); + if (CollUtil.isNotEmpty(regions)) { + String s = regions.get(0) + regions.get(1); + BasicdataPriceTemplateEntity templateEntity = templateMap.get(s); + String sendOrg = regions.get(2); + String serviceType = regions.get(3); + BasicdataPriceEntity priceEntity = priceEntityMap.get(s); + BasicdataPriceRouteEntity routeEntity = new BasicdataPriceRouteEntity(); + routeEntity.setPriceId(priceEntity.getId()); + routeEntity.setServiceType(Convert.toInt(serviceType)); + setSendOrgExcel(clientEntityMap, routeEntity, sendOrg); + // 发货单位-省市 6 + if (regions.size() >= 6) { + setStarProvinceExcel(provinceMap, routeEntity, regions.get(4)); + setStartCityExcel(provinceCityMap, routeEntity, regions.get(4), regions.get(5)); + } + // 发货单位-省市区 7 + if (ObjectUtil.equal(regions.size(), 7)) { + setStartCountExcel(provinceCityAearMap, routeEntity, regions.get(4), regions.get(5), regions.get(6)); + } + // 发货单位-省市-省市 8 + if (ObjectUtil.equal(regions.size(), 8)) { + setEndProvinceExcel(provinceMap, routeEntity, regions.get(6)); + setEndCityExcel(provinceCityMap, routeEntity, regions.get(6) + regions.get(7)); + } + // 发货单位-省市区-省市区 10 + if (ObjectUtil.equal(regions.size(), 10)) { + setStartCountExcel(provinceCityAearMap, routeEntity, regions.get(4), regions.get(5), regions.get(6)); + setEndProvinceExcel(provinceMap, routeEntity, regions.get(7)); + setEndCityExcel(provinceCityMap, routeEntity, regions.get(7) + regions.get(8)); + setEndCountExcel(provinceCityAearMap, routeEntity, regions.get(7), regions.get(8), regions.get(9)); + } + // 发货单位-省市区-省市 9 + if (ObjectUtil.equal(regions.size(), 9)) { + // 如果 s3s4s5 是省市区 则说明 s5 是区 + if (provinceCityAearMap.containsKey(regions.get(4) + regions.get(5) + regions.get(6))) { + setStartCountExcel(provinceCityAearMap, routeEntity, regions.get(4), regions.get(5), regions.get(6)); + setEndProvinceExcel(provinceMap, routeEntity, regions.get(7)); + setEndCityExcel(provinceCityMap, routeEntity, regions.get(7) + regions.get(8)); + } else { + // 发货单位-省市-省市区 9 + setEndProvinceExcel(provinceMap, routeEntity, regions.get(6)); + setEndCityExcel(provinceCityMap, routeEntity, regions.get(6) + regions.get(7)); + setEndCountExcel(provinceCityAearMap, routeEntity, regions.get(6), regions.get(7), regions.get(8)); + } + } + // 根据模板确定是否创建路径 + if (ObjectUtil.isNotEmpty(templateEntity)) { + if (StrUtil.contains(templateEntity.getServiceType(), "1") && ObjectUtil.equal(templateEntity.getPickupIsUnifyAreaBill(), 0)) { + routeEntityMap.put(key, routeEntity); + routeEntities.add(routeEntity); + } else if (StrUtil.contains(templateEntity.getServiceType(), "2") && ObjectUtil.equal(templateEntity.getTrunklineIsUnifyAreaBill(), 0)) { + routeEntityMap.put(key, routeEntity); + routeEntities.add(routeEntity); + } + } + } + } + } + } + } + + private void buildSaveFullVehicleEntitiesExcel(List excels, + Map priceEntityMap, + Map categoryEntityMap, + List entities, + Map templateMap, + Map routeEntityMap, + Map vehicleTypeMap) { + if (CollUtil.isNotEmpty(excels)) { + for (BasicdataPriceFullVehicleExcel excel : excels) { + BasicdataPriceEntity priceEntity = priceEntityMap.get(excel.getClientCode() + excel.getBrand()); + if (ObjectUtil.isEmpty(priceEntity)) { + log.error("导入价格体系在系统中不存在:{}_{}", excel.getClientCode(), excel.getBrand()); + continue; + } + BasicdataPriceTemplateEntity templateEntity = templateMap.get(excel.getClientCode() + excel.getBrand()); + Integer unifyAreaBill = null; + String type = excel.getType(); + BasicdataPriceFullVehicleEntity entity = new BasicdataPriceFullVehicleEntity(); + // 是否按区域计费 + if (ObjectUtil.equal(type, ServiceTypeEnums.PICK_UP.getText())) { + unifyAreaBill = templateEntity.getPickupIsUnifyAreaBill(); + } else if (ObjectUtil.equal(type, ServiceTypeEnums.TRUNK_LINE.getText())) { + // 服务类型 + unifyAreaBill = templateEntity.getTrunklineIsUnifyAreaBill(); + } + // 按区域计费 + if (ObjectUtil.isNotEmpty(unifyAreaBill) && ObjectUtil.equal(unifyAreaBill, BooleanZeroOneEnums.NO.getCode())) { + if (!ObjectUtil.isAllEmpty(excel.getClientCode(), excel.getBrand(), excel.getSendOrgCode())) { + String key = buildRoutKey(excel.getClientCode(), excel.getBrand(), excel.getStartProvince(), excel.getStartCity(), excel.getStartArea(), excel.getEndProvince(), excel.getEndCity(), excel.getEndArea(), excel.getSendOrgCode()); + BasicdataPriceRouteEntity routeEntity = routeEntityMap.get(key + "&&&" + excel.getType()); + if (ObjectUtil.isNotEmpty(routeEntity)) { + entity.setBoId(routeEntity.getId()); + } + } else { + // TODO 这个放到校验的时候处理 + entity.setBoId(priceEntity.getId()); + log.error("价格体系导入FullVehicle数据无法处理,模板配置的按区域计费,数据不满足路径条件:{}", JSONUtil.toJsonStr(excel)); + continue; + } + } else { + // 统一计费 + entity.setBoId(priceEntity.getId()); + } + entity.setPriceId(priceEntity.getId()); + // 类型 + if (ObjectUtil.isNotEmpty(excel.getType())) { + entity.setType(IDict.getCodeByText(FullVehicleTypeEnums.class, excel.getType())); + } + // 车型 + if (ObjectUtil.isNotEmpty(excel.getVehicleType())) { + String vehicleType = vehicleTypeMap.get(excel.getVehicleType()); + if (StrUtil.isNotEmpty(vehicleType)) { + entity.setVehicleType(Convert.toInt(vehicleType)); + } + } + // 价格 + if (StrUtil.isNotEmpty(excel.getPrice())) { + entity.setPrice(Convert.toDouble(excel.getPrice())); + } + entities.add(entity); + } + } + } + + private void buildSaveFullVehicleEntitiesExcelV2(List excels, + Map priceEntityMap, + Map categoryEntityMap, + List entities, + Map templateMap, + Map routeEntityMap, + Map vehicleTypeMap) { + if (CollUtil.isNotEmpty(excels)) { + Map pickupEntityMap = new HashMap<>(); + Map trunkLineEntityMap = new HashMap<>(); + Map dispatchEntityMap = new HashMap<>(); + for (BasicdataPriceFullVehicleV2Excel excel : excels) { + BasicdataPriceEntity priceEntity = priceEntityMap.get(excel.getClient() + excel.getBrand()); + if (ObjectUtil.isEmpty(priceEntity)) { + log.error("导入价格体系在系统中不存在:{}_{}", excel.getClient(), excel.getBrand()); + continue; + } + BasicdataPriceTemplateEntity templateEntity = templateMap.get(excel.getClient() + excel.getBrand()); + // 是否按区域计费 + Integer pickupIsUnifyAreaBill = templateEntity.getPickupIsUnifyAreaBill(); + Integer trunklineIsUnifyAreaBill = templateEntity.getTrunklineIsUnifyAreaBill(); + String pickupPrice = excel.getPickupPrice(); + String trunkLinePrice = excel.getTrunkLinePrice(); + String dispatchPrice = excel.getDispatchPrice(); + if (StrUtil.isNotEmpty(pickupPrice) && Convert.toDouble(pickupPrice) > 0) { + String pickupPricingType = templateEntity.getPickupPricingType(); + // 提货费的计价方式是否包含整车 + if (StrUtil.isNotEmpty(pickupPricingType) && StrUtil.contains(pickupPricingType, PickupPricingTypeEnums.COMPLETE_VEHICLE.getCode().toString())) { + boolean b = ObjectUtil.isNotEmpty(pickupIsUnifyAreaBill) && ObjectUtil.equal(pickupIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode()); + BasicdataPriceFullVehicleEntity entity = null; + if (b) { + entity = new BasicdataPriceFullVehicleEntity(); + } else { + if (pickupEntityMap.containsKey(excel.getClient() + excel.getBrand() + excel.getVehicleType())) { + entity = pickupEntityMap.get(excel.getClient() + excel.getBrand() + excel.getVehicleType()); + } else { + entity = new BasicdataPriceFullVehicleEntity(); + pickupEntityMap.put(excel.getClient() + excel.getBrand() + excel.getVehicleType(), entity); + } + } + if (b) { + if (!ObjectUtil.isAllEmpty(excel.getClient(), excel.getBrand(), excel.getSendOrg())) { + String key = buildRoutKeyV2(excel.getClient(), excel.getBrand(), excel.getStartProvince(), excel.getStartCity(), + excel.getStartArea(), excel.getEndProvince(), excel.getEndCity(), excel.getEndArea(), excel.getSendOrg(), "1"); + BasicdataPriceRouteEntity routeEntity = routeEntityMap.get(key); + if (ObjectUtil.isNotEmpty(routeEntity)) { + entity.setBoId(routeEntity.getId()); + } + } else { + entity.setBoId(priceEntity.getId()); + log.error("价格体系导入FullVehicle数据无法处理,模板配置的按区域计费,数据不满足路径条件:{}", JSONUtil.toJsonStr(excel)); + continue; + } + } else { + // 统一计费 + entity.setBoId(priceEntity.getId()); + } + entity.setPriceId(priceEntity.getId()); + // 类型 + entity.setType(FullVehicleTypeEnums.PICK_UP.getCode()); + // 车型 + if (ObjectUtil.isNotEmpty(excel.getVehicleType())) { + String vehicleType = vehicleTypeMap.get(excel.getVehicleType()); + if (StrUtil.isNotEmpty(vehicleType)) { + entity.setVehicleType(Convert.toInt(vehicleType)); + } + } + // 价格 + entity.setPrice(Convert.toDouble(pickupPrice)); + if (b) { + entities.add(entity); + } + } + + } + + if (StrUtil.isNotEmpty(trunkLinePrice) && Convert.toDouble(trunkLinePrice) > 0) { + String pricingType = templateEntity.getTrunklinePricingType(); + // 提货费的计价方式是否包含整车 + if (StrUtil.isNotEmpty(pricingType) && StrUtil.contains(pricingType, TrunkLinePricingTypeEnums.COMPLETE_VEHICLE.getCode().toString())) { + boolean b = ObjectUtil.isNotEmpty(trunklineIsUnifyAreaBill) && ObjectUtil.equal(trunklineIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode()); + BasicdataPriceFullVehicleEntity entity = null; + if (b) { + entity = new BasicdataPriceFullVehicleEntity(); + } else { + if (trunkLineEntityMap.containsKey(excel.getClient() + excel.getBrand() + excel.getVehicleType())) { + entity = trunkLineEntityMap.get(excel.getClient() + excel.getBrand() + excel.getVehicleType()); + } else { + entity = new BasicdataPriceFullVehicleEntity(); + trunkLineEntityMap.put(excel.getClient() + excel.getBrand() + excel.getVehicleType(), entity); + } + } + if (ObjectUtil.isNotEmpty(trunklineIsUnifyAreaBill) && ObjectUtil.equal(trunklineIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode())) { + if (!ObjectUtil.isAllEmpty(excel.getClient(), excel.getBrand(), excel.getSendOrg())) { + String key = buildRoutKeyV2(excel.getClient(), excel.getBrand(), excel.getStartProvince(), excel.getStartCity(), + excel.getStartArea(), excel.getEndProvince(), excel.getEndCity(), excel.getEndArea(), excel.getSendOrg(), "2"); + BasicdataPriceRouteEntity routeEntity = routeEntityMap.get(key); + if (ObjectUtil.isNotEmpty(routeEntity)) { + entity.setBoId(routeEntity.getId()); + } + } else { + entity.setBoId(priceEntity.getId()); + log.error("价格体系导入FullVehicle数据无法处理,模板配置的按区域计费,数据不满足路径条件:{}", JSONUtil.toJsonStr(excel)); + continue; + } + } else { + // 统一计费 + entity.setBoId(priceEntity.getId()); + } + entity.setPriceId(priceEntity.getId()); + // 类型 + entity.setType(FullVehicleTypeEnums.TRUNK_LINE.getCode()); + // 车型 + if (ObjectUtil.isNotEmpty(excel.getVehicleType())) { + String vehicleType = vehicleTypeMap.get(excel.getVehicleType()); + if (StrUtil.isNotEmpty(vehicleType)) { + entity.setVehicleType(Convert.toInt(vehicleType)); + } + } + // 价格 + entity.setPrice(Convert.toDouble(trunkLinePrice)); + if (b) { + entities.add(entity); + } + } + } + + if (StrUtil.isNotEmpty(dispatchPrice) && Convert.toDouble(dispatchPrice) > 0) { + String pricingType = templateEntity.getDispatchPricingType(); + // 提货费的计价方式是否包含整车 + if (StrUtil.isNotEmpty(pricingType) && StrUtil.contains(pricingType, DispatchPricingTypeEnums.COMPLETE_VEHICLE.getCode().toString())) { + BasicdataPriceFullVehicleEntity entity = null; + if (dispatchEntityMap.containsKey(excel.getClient() + excel.getBrand() + excel.getVehicleType())) { + entity = dispatchEntityMap.get(excel.getClient() + excel.getBrand() + excel.getVehicleType()); + } else { + entity = new BasicdataPriceFullVehicleEntity(); + dispatchEntityMap.put(excel.getClient() + excel.getBrand() + excel.getVehicleType(), entity); + } + // 统一计费 + entity.setBoId(priceEntity.getId()); + entity.setPriceId(priceEntity.getId()); + // 类型 + entity.setType(FullVehicleTypeEnums.DISPATCH.getCode()); + // 车型 + if (ObjectUtil.isNotEmpty(excel.getVehicleType())) { + String vehicleType = vehicleTypeMap.get(excel.getVehicleType()); + if (StrUtil.isNotEmpty(vehicleType)) { + entity.setVehicleType(Convert.toInt(vehicleType)); + } + } + // 价格 + entity.setPrice(Convert.toDouble(dispatchPrice)); + } + } + + } + if (CollUtil.isNotEmpty(pickupEntityMap)) { + entities.addAll(pickupEntityMap.values()); + } + if (CollUtil.isNotEmpty(dispatchEntityMap)) { + entities.addAll(dispatchEntityMap.values()); + } + if (CollUtil.isNotEmpty(trunkLineEntityMap)) { + entities.addAll(trunkLineEntityMap.values()); + } + } + } + + private void buildSaveGeneralEntitiesExcel(List excels, Map priceEntityMap, Map categoryEntityMap, List entities, Map templateMap, Map routeEntityMap) { + if (CollUtil.isNotEmpty(excels)) { + for (BasicdataPriceGeneralExcel basicExcel : excels) { + BasicdataPriceEntity priceEntity = priceEntityMap.get(basicExcel.getClientCode() + basicExcel.getBrand()); + if (ObjectUtil.isEmpty(priceEntity)) { + log.error("导入价格体系在系统中不存在"); + continue; + } + BasicdataPriceTemplateEntity templateEntity = templateMap.get(basicExcel.getClientCode() + basicExcel.getBrand()); + + Integer unifyAreaBill = null; + String type = basicExcel.getType(); + BasicdataPriceGeneralEntity basicEntity = new BasicdataPriceGeneralEntity(); + // 是否按区域计费 + if (ObjectUtil.equal(type, ServiceTypeEnums.PICK_UP.getText())) { + unifyAreaBill = templateEntity.getPickupIsUnifyAreaBill(); + } else if (ObjectUtil.equal(type, ServiceTypeEnums.TRUNK_LINE.getText())) { + unifyAreaBill = templateEntity.getTrunklineIsUnifyAreaBill(); + } + // 服务类型 + if (StrUtil.isNotEmpty(type)) { + basicEntity.setServiceType(IDict.getCodeByText(GeneralServiceTypeEnums.class, type)); + } + // 按区域计费 + if (ObjectUtil.isNotEmpty(unifyAreaBill) && ObjectUtil.equal(unifyAreaBill, BooleanZeroOneEnums.NO.getCode())) { + if (!ObjectUtil.isAllEmpty(basicExcel.getClientCode(), basicExcel.getBrand(), basicExcel.getSendOrgCode())) { + String key = buildRoutKey(basicExcel.getClientCode(), basicExcel.getBrand(), basicExcel.getStartProvince(), basicExcel.getStartCity(), basicExcel.getStartArea(), basicExcel.getEndProvince(), basicExcel.getEndCity(), basicExcel.getEndArea(), basicExcel.getSendOrgCode()); + BasicdataPriceRouteEntity routeEntity = routeEntityMap.get(key + "&&&" + basicExcel.getType()); + if (ObjectUtil.isNotEmpty(routeEntity)) { + basicEntity.setBoId(routeEntity.getId()); + } + } else { + basicEntity.setBoId(priceEntity.getId()); + log.error("价格体系导入General数据无法处理,模板配置的按区域计费,数据不满足路径条件:{}", JSONUtil.toJsonStr(basicExcel)); + continue; + } + } else { + // 统一计费 + basicEntity.setBoId(priceEntity.getId()); + } + basicEntity.setPriceId(priceEntity.getId()); + // 最低计费 + if (StrUtil.isNotEmpty(basicExcel.getMinCost())) { + basicEntity.setMinCost(Convert.toDouble(basicExcel.getMinCost())); + } + // 加算价格 + if (StrUtil.isNotEmpty(basicExcel.getAddCost())) { + basicEntity.setAdditionalCost(Convert.toDouble(basicExcel.getAddCost())); + } + entities.add(basicEntity); + } + } + } + + private void buildSaveGeneralEntitiesExcelV2(List excels, Map priceEntityMap, + Map categoryEntityMap, List entities, + Map templateMap, Map routeEntityMap) { + if (CollUtil.isNotEmpty(excels)) { + // 不按区域计费时 客户+品牌 唯一 + Map pickupEntityMap = new HashMap<>(); + Map trunkLineEntityMap = new HashMap<>(); + Map dispatchEntityMap = new HashMap<>(); + Map dispatchLeaveBehindEntityMap = new HashMap<>(); + for (BasicdataPriceGeneralV2Excel basicExcel : excels) { + BasicdataPriceEntity priceEntity = priceEntityMap.get(basicExcel.getClient() + basicExcel.getBrand()); + if (ObjectUtil.isEmpty(priceEntity)) { + log.error("导入价格体系在系统中不存在"); + continue; + } + BasicdataPriceTemplateEntity templateEntity = templateMap.get(basicExcel.getClient() + basicExcel.getBrand()); + + // 是否按区域计费 + Integer pickupIsUnifyAreaBill = templateEntity.getPickupIsUnifyAreaBill(); + Integer trunklineIsUnifyAreaBill = templateEntity.getTrunklineIsUnifyAreaBill(); + String pickupMinCost = basicExcel.getPickupMinCost(); + String trunkLineMinCost = basicExcel.getTrunkLineMinCost(); + String dispatchMinCost = basicExcel.getDispatchMinCost(); + String dispatchLeaveBehindMinCost = basicExcel.getDispatchLeaveBehindMinCost(); + if (StrUtil.isNotEmpty(pickupMinCost) && Convert.toDouble(pickupMinCost) > 0) { + Integer isMinCost = templateEntity.getPickupIsMinCost(); + if (ObjectUtil.isNotEmpty(isMinCost) && ObjectUtil.equal(isMinCost, BooleanZeroOneEnums.YES.getCode())) { + boolean b = ObjectUtil.isNotEmpty(pickupIsUnifyAreaBill) && ObjectUtil.equal(pickupIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode()); + // 服务类型 + BasicdataPriceGeneralEntity basicEntity = null; + if (b) { + basicEntity = new BasicdataPriceGeneralEntity(); + } else { + if (pickupEntityMap.containsKey(basicExcel.getClient() + basicExcel.getBrand())) { + basicEntity = pickupEntityMap.get(basicExcel.getClient() + basicExcel.getBrand()); + } else { + basicEntity = new BasicdataPriceGeneralEntity(); + pickupEntityMap.put(basicExcel.getClient() + basicExcel.getBrand(), basicEntity); + } + } + basicEntity.setServiceType(GeneralServiceTypeEnums.PICK_UP.getCode()); + // 按区域计费 + if (b) { + if (!ObjectUtil.isAllEmpty(basicExcel.getClient(), basicExcel.getBrand(), basicExcel.getSendOrg())) { + String key = buildRoutKeyV2(basicExcel.getClient(), basicExcel.getBrand(), basicExcel.getStartProvince(), basicExcel.getStartCity(), + basicExcel.getStartArea(), basicExcel.getEndProvince(), basicExcel.getEndCity(), basicExcel.getEndArea(), basicExcel.getSendOrg(), "1"); + BasicdataPriceRouteEntity routeEntity = routeEntityMap.get(key); + if (ObjectUtil.isNotEmpty(routeEntity)) { + basicEntity.setBoId(routeEntity.getId()); + } + } else { + basicEntity.setBoId(priceEntity.getId()); + log.error("价格体系导入General数据无法处理,模板配置的按区域计费,数据不满足路径条件:{}", JSONUtil.toJsonStr(basicExcel)); + continue; + } + } else { + // 统一计费 + basicEntity.setBoId(priceEntity.getId()); + } + basicEntity.setPriceId(priceEntity.getId()); + // 最低计费 + basicEntity.setMinCost(Convert.toDouble(pickupMinCost)); + // 加算价格 + if (StrUtil.isNotEmpty(basicExcel.getPickupAddCost())) { + basicEntity.setAdditionalCost(Convert.toDouble(basicExcel.getPickupAddCost())); + } + // 按区域计费直接加入保存队列 + if (b) { + entities.add(basicEntity); + } + } + + } + + if (StrUtil.isNotEmpty(trunkLineMinCost) && Convert.toDouble(trunkLineMinCost) > 0) { + Integer isMinCost = templateEntity.getTrunklineIsMinCost(); + if (ObjectUtil.isNotEmpty(isMinCost) && ObjectUtil.equal(isMinCost, BooleanZeroOneEnums.YES.getCode())) { + boolean b = ObjectUtil.isNotEmpty(trunklineIsUnifyAreaBill) && ObjectUtil.equal(trunklineIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode()); + // 服务类型 + BasicdataPriceGeneralEntity basicEntity = null; + if (b) { + basicEntity = new BasicdataPriceGeneralEntity(); + } else { + if (trunkLineEntityMap.containsKey(basicExcel.getClient() + basicExcel.getBrand())) { + basicEntity = trunkLineEntityMap.get(basicExcel.getClient() + basicExcel.getBrand()); + } else { + basicEntity = new BasicdataPriceGeneralEntity(); + trunkLineEntityMap.put(basicExcel.getClient() + basicExcel.getBrand(), basicEntity); + } + } + basicEntity.setServiceType(GeneralServiceTypeEnums.TRUNK_LINE.getCode()); + // 按区域计费 + if (b) { + if (!ObjectUtil.isAllEmpty(basicExcel.getClient(), basicExcel.getBrand(), basicExcel.getSendOrg())) { + String key = buildRoutKeyV2(basicExcel.getClient(), basicExcel.getBrand(), basicExcel.getStartProvince(), basicExcel.getStartCity(), + basicExcel.getStartArea(), basicExcel.getEndProvince(), basicExcel.getEndCity(), basicExcel.getEndArea(), basicExcel.getSendOrg(), "2"); + BasicdataPriceRouteEntity routeEntity = routeEntityMap.get(key); + if (ObjectUtil.isNotEmpty(routeEntity)) { + basicEntity.setBoId(routeEntity.getId()); + } + } else { + basicEntity.setBoId(priceEntity.getId()); + log.error("价格体系导入General数据无法处理,模板配置的按区域计费,数据不满足路径条件:{}", JSONUtil.toJsonStr(basicExcel)); + continue; + } + } else { + // 统一计费 + basicEntity.setBoId(priceEntity.getId()); + } + basicEntity.setPriceId(priceEntity.getId()); + // 最低计费 + basicEntity.setMinCost(Convert.toDouble(trunkLineMinCost)); + // 加算价格 + if (StrUtil.isNotEmpty(basicExcel.getTrunkLineAddCost())) { + basicEntity.setAdditionalCost(Convert.toDouble(basicExcel.getTrunkLineAddCost())); + } + if (b) { + entities.add(basicEntity); + } + } + } + + if (StrUtil.isNotEmpty(dispatchMinCost) && Convert.toDouble(dispatchMinCost) > 0) { + // 服务类型 + Integer isMinCost = templateEntity.getDispatchIsMinCost(); + if (ObjectUtil.isNotEmpty(isMinCost) && ObjectUtil.equal(isMinCost, BooleanZeroOneEnums.YES.getCode())) { + BasicdataPriceGeneralEntity basicEntity = null; + if (dispatchEntityMap.containsKey(basicExcel.getClient() + basicExcel.getBrand())) { + basicEntity = dispatchEntityMap.get(basicExcel.getClient() + basicExcel.getBrand()); + } else { + basicEntity = new BasicdataPriceGeneralEntity(); + dispatchEntityMap.put(basicExcel.getClient() + basicExcel.getBrand(), basicEntity); + } + basicEntity.setServiceType(GeneralServiceTypeEnums.DISPATCH.getCode()); + // 统一计费 + basicEntity.setBoId(priceEntity.getId()); + basicEntity.setPriceId(priceEntity.getId()); + // 最低计费 + basicEntity.setMinCost(Convert.toDouble(dispatchMinCost)); + // 加算价格 + if (StrUtil.isNotEmpty(basicExcel.getDispatchAddCost())) { + basicEntity.setAdditionalCost(Convert.toDouble(basicExcel.getDispatchAddCost())); + } + } + } + + if (StrUtil.isNotEmpty(dispatchLeaveBehindMinCost) && Convert.toDouble(dispatchLeaveBehindMinCost) > 0) { + // 服务类型 + Integer isMinCost = templateEntity.getDispatchIsMinCost(); + if (ObjectUtil.isNotEmpty(isMinCost) && ObjectUtil.equal(isMinCost, BooleanZeroOneEnums.YES.getCode())) { + BasicdataPriceGeneralEntity basicEntity = null; + if (dispatchLeaveBehindEntityMap.containsKey(basicExcel.getClient() + basicExcel.getBrand())) { + basicEntity = dispatchLeaveBehindEntityMap.get(basicExcel.getClient() + basicExcel.getBrand()); + } else { + basicEntity = new BasicdataPriceGeneralEntity(); + dispatchLeaveBehindEntityMap.put(basicExcel.getClient() + basicExcel.getBrand(), basicEntity); + } + basicEntity.setServiceType(GeneralServiceTypeEnums.DISPATCH_LEAVE_BEHIND.getCode()); + // 统一计费 + basicEntity.setBoId(priceEntity.getId()); + basicEntity.setPriceId(priceEntity.getId()); + // 最低计费 + basicEntity.setMinCost(Convert.toDouble(dispatchLeaveBehindMinCost)); + // 加算价格 + if (StrUtil.isNotEmpty(basicExcel.getDispatchLeaveBehindAddCost())) { + basicEntity.setAdditionalCost(Convert.toDouble(basicExcel.getDispatchLeaveBehindAddCost())); + } + } + } + + String dispatchUpwardJudgment = basicExcel.getDispatchUpwardJudgment(); + if (StrUtil.isNotEmpty(dispatchUpwardJudgment)) { + priceEntity.setDispatchUpwardJudgment(Convert.toDouble(dispatchUpwardJudgment)); + } + String dispatchUpwardJudgmentCost = basicExcel.getDispatchUpwardJudgmentCost(); + if (StrUtil.isNotEmpty(dispatchUpwardJudgmentCost)) { + priceEntity.setDispatchUpwardJudgmentCost(Convert.toDouble(dispatchUpwardJudgmentCost)); + } + } + if (CollUtil.isNotEmpty(pickupEntityMap)) { + entities.addAll(pickupEntityMap.values()); + } + if (CollUtil.isNotEmpty(dispatchLeaveBehindEntityMap)) { + entities.addAll(dispatchLeaveBehindEntityMap.values()); + } + if (CollUtil.isNotEmpty(dispatchEntityMap)) { + entities.addAll(dispatchEntityMap.values()); + } + if (CollUtil.isNotEmpty(trunkLineEntityMap)) { + entities.addAll(trunkLineEntityMap.values()); + } + } + } + + private void buildSaveBasicEntitiesExcel(List basicExcels, Map priceEntityMap, + Map categoryEntityMap, List basicEntities, + Map templateMap, Map routeEntityMap) { + if (CollUtil.isNotEmpty(basicExcels)) { + for (BasicdataPriceCategoryBasicExcel basicExcel : basicExcels) { + BasicdataPriceEntity priceEntity = priceEntityMap.get(basicExcel.getClientCode() + basicExcel.getBrand()); + if (ObjectUtil.isEmpty(priceEntity)) { + log.error("导入价格体系在系统中不存在"); + continue; + } + BasicdataPriceTemplateEntity templateEntity = templateMap.get(basicExcel.getClientCode() + basicExcel.getBrand()); + + Integer unifyAreaBill = null; + String type = basicExcel.getType(); + BasicdataPriceCategoryBasicEntity basicEntity = new BasicdataPriceCategoryBasicEntity(); + // 是否按区域计费 + if (ObjectUtil.equal(type, ServiceTypeEnums.PICK_UP.getText())) { + // 服务类型 + basicEntity.setServiceType(ServiceTypeEnums.PICK_UP.getCode()); + unifyAreaBill = templateEntity.getPickupIsUnifyAreaBill(); + } else { + // 服务类型 + basicEntity.setServiceType(ServiceTypeEnums.TRUNK_LINE.getCode()); + unifyAreaBill = templateEntity.getTrunklineIsUnifyAreaBill(); + } + // 按区域计费 + if (ObjectUtil.isNotEmpty(unifyAreaBill) && ObjectUtil.equal(unifyAreaBill, BooleanZeroOneEnums.NO.getCode())) { + if (!ObjectUtil.isAllEmpty(basicExcel.getClientCode(), basicExcel.getBrand(), basicExcel.getSendOrgCode())) { + String key = buildRoutKey(basicExcel.getClientCode(), basicExcel.getBrand(), basicExcel.getStartProvince(), + basicExcel.getStartCity(), basicExcel.getStartArea(), basicExcel.getEndProvince(), + basicExcel.getEndCity(), basicExcel.getEndArea(), basicExcel.getSendOrgCode()); + BasicdataPriceRouteEntity routeEntity = routeEntityMap.get(key + "&&&" + basicExcel.getType()); + if (ObjectUtil.isNotEmpty(routeEntity)) { + basicEntity.setBoId(routeEntity.getId()); + } + } else { + // TODO 这个放到校验的时候处理 + basicEntity.setBoId(priceEntity.getId()); + log.error("价格体系导入CategoryBasic数据无法处理,模板配置的按区域计费,数据不满足路径条件:{}", JSONUtil.toJsonStr(basicExcel)); + continue; + } + } else { + // 统一计费 + basicEntity.setBoId(priceEntity.getId()); + } + // 计费类型 + if (StrUtil.isNotEmpty(basicExcel.getCostType())) { + basicEntity.setType(IDict.getCodeByText(PickupPricingTypeEnums.class, basicExcel.getCostType())); + } + basicEntity.setPriceId(priceEntity.getId()); + // 品类 + if (StrUtil.isNotEmpty(basicExcel.getCategory())) { + if (ObjectUtil.isNotEmpty(categoryEntityMap.get(basicExcel.getCategory()))) { + basicEntity.setCategoryId(categoryEntityMap.get(basicExcel.getCategory()).getId()); + } + } + // 价格 + if (StrUtil.isNotEmpty(basicExcel.getPrice())) { + basicEntity.setPrice(Convert.toDouble(basicExcel.getPrice())); + } + basicEntities.add(basicEntity); + } + } + } + + private void buildSaveBasicEntitiesExcelV2(List basicExcels, Map priceEntityMap, + Map categoryEntityMap, List basicEntities, + Map templateMap, Map routeEntityMap, List warehouseEntities, List dispatchEntities) { + if (CollUtil.isNotEmpty(basicExcels)) { + Map pickupEntityMap = new HashMap<>(); + Map trunkLineEntityMap = new HashMap<>(); + Map warehouseEntityMap = new HashMap<>(); + Map warehouseAddEntityMap = new HashMap<>(); + Map dispatchEntityMap = new HashMap<>(); + Map dispatchAddEntityMap = new HashMap<>(); + for (BasicdataPriceCategoryV2Excel basicExcel : basicExcels) { + BasicdataPriceEntity priceEntity = priceEntityMap.get(basicExcel.getClient() + basicExcel.getBrand()); + if (ObjectUtil.isEmpty(priceEntity)) { + log.error("导入价格体系在系统中不存在"); + continue; + } + BasicdataPriceTemplateEntity templateEntity = templateMap.get(basicExcel.getClient() + basicExcel.getBrand()); + // 是否按区域计费 + Integer pickupIsUnifyAreaBill = templateEntity.getPickupIsUnifyAreaBill(); + Integer trunklineIsUnifyAreaBill = templateEntity.getTrunklineIsUnifyAreaBill(); + String pickupPrice = basicExcel.getPickupPrice(); + String trunkLinePrice = basicExcel.getTrunkLinePrice(); + if (StrUtil.isNotEmpty(pickupPrice) && Convert.toDouble(pickupPrice) > 0) { + buildSaveBasicExcel(categoryEntityMap, routeEntityMap, pickupEntityMap, basicExcel, priceEntity, templateEntity, pickupIsUnifyAreaBill, pickupPrice); + } + if (StrUtil.isNotEmpty(trunkLinePrice) && Convert.toDouble(trunkLinePrice) > 0) { + buildSaveTrunkLineExcel(categoryEntityMap, routeEntityMap, trunkLineEntityMap, basicExcel, priceEntity, templateEntity, trunklineIsUnifyAreaBill, trunkLinePrice); + } + String withinThirtyPrice = basicExcel.getWithinThirtyPrice(); + String betweenThirtySixtyPrice = basicExcel.getBetweenThirtySixtyPrice(); + String beyondSixtyPrice = basicExcel.getBeyondSixtyPrice(); + String beyondNinetyPrice = basicExcel.getBeyondNinetyPrice(); + // 4个仓储费只要有一个不为空则创建 + if ((ObjectUtil.isNotEmpty(withinThirtyPrice) && Convert.toDouble(withinThirtyPrice) > 0) + || (ObjectUtil.isNotEmpty(betweenThirtySixtyPrice) && Convert.toDouble(betweenThirtySixtyPrice) > 0) + || (ObjectUtil.isNotEmpty(beyondSixtyPrice) && Convert.toDouble(beyondSixtyPrice) > 0) + || (ObjectUtil.isNotEmpty(beyondNinetyPrice) && Convert.toDouble(beyondNinetyPrice) > 0)) { + buildSaveWarehouseExcel(categoryEntityMap, warehouseEntityMap, basicExcel, priceEntity, templateEntity); + } + String warehouseOperatePrice = basicExcel.getWarehouseOperatePrice(); + String warehouseManagementPrice = basicExcel.getWarehouseManagementPrice(); + String warehouseSortPrice = basicExcel.getWarehouseSortPrice(); + if ((ObjectUtil.isNotEmpty(warehouseOperatePrice) && Convert.toDouble(warehouseOperatePrice) > 0) + || (ObjectUtil.isNotEmpty(warehouseManagementPrice) && Convert.toDouble(warehouseManagementPrice) > 0) + || (ObjectUtil.isNotEmpty(warehouseSortPrice) && Convert.toDouble(warehouseSortPrice) > 0)) { + buildSaveWarehouseAddExcel(categoryEntityMap, warehouseAddEntityMap, basicExcel, priceEntity, templateEntity); + } + String dispatchPrice = basicExcel.getDispatchPrice(); + if (StrUtil.isNotEmpty(dispatchPrice) && Convert.toDouble(dispatchPrice) > 0) { + buildSaveDispatchExcel(categoryEntityMap, dispatchEntityMap, basicExcel, priceEntity, templateEntity); + } + String dispatchSortPrice = basicExcel.getDispatchSortPrice(); + String dispatchHandlingPrice = basicExcel.getDispatchHandlingPrice(); + String dispatchRelocationPrice = basicExcel.getDispatchRelocationPrice(); + String dispatchDeliveryPrice = basicExcel.getDispatchDeliveryPrice(); + if ((ObjectUtil.isNotEmpty(dispatchSortPrice) && Convert.toDouble(dispatchSortPrice) > 0) + || (ObjectUtil.isNotEmpty(dispatchHandlingPrice) && Convert.toDouble(dispatchHandlingPrice) > 0) + || (ObjectUtil.isNotEmpty(dispatchRelocationPrice) && Convert.toDouble(dispatchRelocationPrice) > 0) + || (ObjectUtil.isNotEmpty(dispatchDeliveryPrice) && Convert.toDouble(dispatchDeliveryPrice) > 0)) { + buildSaveDispatchAddExcel(categoryEntityMap, dispatchAddEntityMap, basicExcel, priceEntity, templateEntity); + } + String dispatchStairsCarryingCharge = basicExcel.getDispatchStairsCarryingCharge(); + if (StrUtil.isNotEmpty(dispatchStairsCarryingCharge)) { + priceEntity.setDispatchStairsCarryingCharge(Convert.toInt(dispatchStairsCarryingCharge)); + } + } + if (CollUtil.isNotEmpty(pickupEntityMap)) { + basicEntities.addAll(pickupEntityMap.values()); + } + if (CollUtil.isNotEmpty(trunkLineEntityMap)) { + basicEntities.addAll(trunkLineEntityMap.values()); + } + if (CollUtil.isNotEmpty(warehouseEntityMap)) { + warehouseEntities.addAll(warehouseEntityMap.values()); + } + if (CollUtil.isNotEmpty(warehouseAddEntityMap)) { + warehouseEntities.addAll(warehouseAddEntityMap.values()); + } + if (CollUtil.isNotEmpty(dispatchEntityMap)) { + dispatchEntities.addAll(dispatchEntityMap.values()); + } + if (CollUtil.isNotEmpty(dispatchAddEntityMap)) { + dispatchEntities.addAll(dispatchAddEntityMap.values()); + } + } + } + + private void buildSaveDispatchAddExcel(Map categoryEntityMap, Map dispatchAddEntityMap, BasicdataPriceCategoryV2Excel basicExcel, BasicdataPriceEntity priceEntity, BasicdataPriceTemplateEntity templateEntity) { + // 配送是否附加费 + Integer dispatchIsAddFee = templateEntity.getDispatchIsAddFee(); + if (ObjectUtil.isEmpty(dispatchIsAddFee) || ObjectUtil.equal(dispatchIsAddFee, BooleanZeroOneEnums.NO.getCode())) { + return; + } + Integer pickupIsByCategory = templateEntity.getDispatchIsByCategory(); + // 按品类计费 + boolean categoryFlag = ObjectUtil.isNotEmpty(pickupIsByCategory) && ObjectUtil.equal(pickupIsByCategory, BooleanZeroOneEnums.YES.getCode()); + BasicdataPriceCategoryDispatchEntity entity = null; + if (categoryFlag) { + String key = basicExcel.getClient() + basicExcel.getBrand() + basicExcel.getCategory(); + if (StrUtil.isNotEmpty(basicExcel.getDispatchUnit())) { + key = key + basicExcel.getDispatchUnit(); + } + if (dispatchAddEntityMap.containsKey(key)) { + entity = dispatchAddEntityMap.get(key); + } else { + entity = new BasicdataPriceCategoryDispatchEntity(); + dispatchAddEntityMap.put(key, entity); + } + } else { + String key = basicExcel.getClient() + basicExcel.getBrand(); + if (StrUtil.isNotEmpty(basicExcel.getDispatchUnit())) { + key = key + basicExcel.getDispatchUnit(); + } + if (dispatchAddEntityMap.containsKey(key)) { + entity = dispatchAddEntityMap.get(key); + } else { + entity = new BasicdataPriceCategoryDispatchEntity(); + dispatchAddEntityMap.put(key, entity); + } + } + if (ObjectUtil.isNotEmpty(priceEntity)) { + entity.setPriceId(priceEntity.getId()); + entity.setBoId(priceEntity.getId()); + } + if (StrUtil.isNotEmpty(basicExcel.getCategory())) { + BasicdataCategoryEntity basicdataCategoryEntity = categoryEntityMap.get(basicExcel.getCategory()); + if (ObjectUtil.isNotEmpty(basicdataCategoryEntity)) { + if (categoryFlag) { + entity.setCategoryId(basicdataCategoryEntity.getId()); + } + } + } + entity.setCostType(CostTypeEnums.ADD.getCode()); + if (StrUtil.isNotEmpty(basicExcel.getDispatchUnit())) { + entity.setType(IDict.getCodeByText(DispatchPricingTypeEnums.class, basicExcel.getDispatchUnit())); + } + entity.setServiceType(1); + if (StrUtil.isNotEmpty(basicExcel.getDispatchSortPrice())) { + entity.setSortPrice(Convert.toDouble(basicExcel.getDispatchSortPrice())); + } + if (StrUtil.isNotEmpty(basicExcel.getDispatchHandlingPrice())) { + entity.setHandlingPrice(Convert.toDouble(basicExcel.getDispatchHandlingPrice())); + } + if (StrUtil.isNotEmpty(basicExcel.getDispatchRelocationPrice())) { + entity.setRelocationPrice(Convert.toDouble(basicExcel.getDispatchRelocationPrice())); + } + if (StrUtil.isNotEmpty(basicExcel.getDispatchDeliveryPrice())) { + entity.setUpstairsDeliveryPrice(Convert.toDouble(basicExcel.getDispatchDeliveryPrice())); + } + } + + private void buildSaveDispatchExcel(Map categoryEntityMap, Map dispatchEntityMap, BasicdataPriceCategoryV2Excel basicExcel, BasicdataPriceEntity priceEntity, BasicdataPriceTemplateEntity templateEntity) { + Integer pickupIsByCategory = templateEntity.getDispatchIsByCategory(); + // 按品类计费 + boolean categoryFlag = ObjectUtil.isNotEmpty(pickupIsByCategory) && ObjectUtil.equal(pickupIsByCategory, BooleanZeroOneEnums.YES.getCode()); + BasicdataPriceCategoryDispatchEntity entity = null; + if (categoryFlag) { + String key = basicExcel.getClient() + basicExcel.getBrand() + basicExcel.getCategory(); + if (StrUtil.isNotEmpty(basicExcel.getDispatchUnit())) { + key = key + basicExcel.getDispatchUnit(); + } + if (dispatchEntityMap.containsKey(key)) { + entity = dispatchEntityMap.get(key); + } else { + entity = new BasicdataPriceCategoryDispatchEntity(); + dispatchEntityMap.put(key, entity); + } + } else { + String key = basicExcel.getClient() + basicExcel.getBrand(); + if (StrUtil.isNotEmpty(basicExcel.getDispatchUnit())) { + key = key + basicExcel.getDispatchUnit(); + } + if (dispatchEntityMap.containsKey(key)) { + entity = dispatchEntityMap.get(key); + } else { + entity = new BasicdataPriceCategoryDispatchEntity(); + dispatchEntityMap.put(key, entity); + } + } + if (ObjectUtil.isNotEmpty(priceEntity)) { + entity.setPriceId(priceEntity.getId()); + entity.setBoId(priceEntity.getId()); + } + if (StrUtil.isNotEmpty(basicExcel.getCategory())) { + BasicdataCategoryEntity basicdataCategoryEntity = categoryEntityMap.get(basicExcel.getCategory()); + if (ObjectUtil.isNotEmpty(basicdataCategoryEntity)) { + if (categoryFlag) { + entity.setCategoryId(basicdataCategoryEntity.getId()); + } + } + } + entity.setCostType(CostTypeEnums.NOMAL.getCode()); + if (StrUtil.isNotEmpty(basicExcel.getDispatchUnit())) { + entity.setType(IDict.getCodeByText(DispatchPricingTypeEnums.class, basicExcel.getDispatchUnit())); + } + entity.setServiceType(1); + if (StrUtil.isNotEmpty(basicExcel.getDispatchPrice())) { + entity.setPrice(Convert.toDouble(basicExcel.getDispatchPrice())); + } + if (StrUtil.isNotEmpty(basicExcel.getDispatchLeaveBehindPrice())) { + entity.setLeaveBehindPrice(Convert.toDouble(basicExcel.getDispatchLeaveBehindPrice())); + } + } + + private void buildSaveWarehouseAddExcel(Map categoryEntityMap, Map warehouseAddEntityMap, BasicdataPriceCategoryV2Excel basicExcel, BasicdataPriceEntity priceEntity, BasicdataPriceTemplateEntity templateEntity) { + // 仓储是否附加费 + Integer warehouseIsAddFee = templateEntity.getWarehouseIsAddFee(); + if (ObjectUtil.isEmpty(warehouseIsAddFee) || ObjectUtil.equal(warehouseIsAddFee, BooleanZeroOneEnums.NO.getCode())) { + return; + } + Integer pickupIsByCategory = templateEntity.getWarehouseIsCategorySubjoin(); + // 按品类计费 + boolean categoryFlag = ObjectUtil.isNotEmpty(pickupIsByCategory) && ObjectUtil.equal(pickupIsByCategory, BooleanZeroOneEnums.YES.getCode()); + BasicdataPriceCategoryWarehouseEntity warehouseEntity = null; + if (categoryFlag) { + String key = basicExcel.getClient() + basicExcel.getBrand() + basicExcel.getCategory(); + if (StrUtil.isNotEmpty(basicExcel.getDispatchUnit())) { + key = key + basicExcel.getDispatchUnit(); + } + if (warehouseAddEntityMap.containsKey(key)) { + warehouseEntity = warehouseAddEntityMap.get(key); + } else { + warehouseEntity = new BasicdataPriceCategoryWarehouseEntity(); + warehouseAddEntityMap.put(key, warehouseEntity); + } + } else { + String key = basicExcel.getClient() + basicExcel.getBrand(); + if (StrUtil.isNotEmpty(basicExcel.getDispatchUnit())) { + key = key + basicExcel.getDispatchUnit(); + } + if (warehouseAddEntityMap.containsKey(key)) { + warehouseEntity = warehouseAddEntityMap.get(key); + } else { + warehouseEntity = new BasicdataPriceCategoryWarehouseEntity(); + warehouseAddEntityMap.put(key, warehouseEntity); + } + } + if (ObjectUtil.isNotEmpty(priceEntity)) { + warehouseEntity.setPriceId(priceEntity.getId()); + warehouseEntity.setBoId(priceEntity.getId()); + } + if (StrUtil.isNotEmpty(basicExcel.getCategory())) { + BasicdataCategoryEntity basicdataCategoryEntity = categoryEntityMap.get(basicExcel.getCategory()); + if (ObjectUtil.isNotEmpty(basicdataCategoryEntity)) { + if (categoryFlag) { + warehouseEntity.setCategoryId(basicdataCategoryEntity.getId()); + } + } + } + warehouseEntity.setCostType(CostTypeEnums.ADD.getCode()); + warehouseEntity.setType(Convert.toInt(templateEntity.getWarehousePricingType())); + warehouseEntity.setServiceType(1); + if (StrUtil.isNotEmpty(basicExcel.getWarehouseOperatePrice())) { + warehouseEntity.setOperatePrice(Convert.toDouble(basicExcel.getWarehouseOperatePrice())); + } + if (StrUtil.isNotEmpty(basicExcel.getWarehouseManagementPrice())) { + warehouseEntity.setWarehouseManagementPrice(Convert.toDouble(basicExcel.getWarehouseManagementPrice())); + } + if (StrUtil.isNotEmpty(basicExcel.getWarehouseSortPrice())) { + warehouseEntity.setWarehouseSortPrice(Convert.toDouble(basicExcel.getWarehouseSortPrice())); + } + } + + private void buildSaveWarehouseExcel(Map categoryEntityMap, Map warehouseEntityMap, BasicdataPriceCategoryV2Excel basicExcel, BasicdataPriceEntity priceEntity, BasicdataPriceTemplateEntity templateEntity) { + Integer pickupIsByCategory = templateEntity.getWarehouseIsByCategory(); + // 按品类计费 + boolean categoryFlag = ObjectUtil.isNotEmpty(pickupIsByCategory) && ObjectUtil.equal(pickupIsByCategory, BooleanZeroOneEnums.YES.getCode()); + BasicdataPriceCategoryWarehouseEntity warehouseEntity = null; + if (categoryFlag) { + if (warehouseEntityMap.containsKey(basicExcel.getClient() + basicExcel.getBrand() + basicExcel.getCategory())) { + warehouseEntity = warehouseEntityMap.get(basicExcel.getClient() + basicExcel.getBrand() + basicExcel.getCategory()); + } else { + warehouseEntity = new BasicdataPriceCategoryWarehouseEntity(); + warehouseEntityMap.put(basicExcel.getClient() + basicExcel.getBrand() + basicExcel.getCategory(), warehouseEntity); + } + } else { + if (warehouseEntityMap.containsKey(basicExcel.getClient() + basicExcel.getBrand())) { + warehouseEntity = warehouseEntityMap.get(basicExcel.getClient() + basicExcel.getBrand()); + } else { + warehouseEntity = new BasicdataPriceCategoryWarehouseEntity(); + warehouseEntityMap.put(basicExcel.getClient() + basicExcel.getBrand(), warehouseEntity); + } + } + + if (ObjectUtil.isNotEmpty(priceEntity)) { + warehouseEntity.setPriceId(priceEntity.getId()); + warehouseEntity.setBoId(priceEntity.getId()); + } + if (StrUtil.isNotEmpty(basicExcel.getCategory())) { + BasicdataCategoryEntity basicdataCategoryEntity = categoryEntityMap.get(basicExcel.getCategory()); + if (ObjectUtil.isNotEmpty(basicdataCategoryEntity)) { + if (categoryFlag) { + warehouseEntity.setCategoryId(basicdataCategoryEntity.getId()); + } + } + } + warehouseEntity.setCostType(CostTypeEnums.NOMAL.getCode()); + warehouseEntity.setType(Convert.toInt(templateEntity.getWarehousePricingType())); + warehouseEntity.setServiceType(1); + if (StrUtil.isNotEmpty(basicExcel.getWithinThirtyPrice())) { + warehouseEntity.setWithinThirtyPrice(Convert.toDouble(basicExcel.getWithinThirtyPrice())); + } + if (StrUtil.isNotEmpty(basicExcel.getBetweenThirtySixtyPrice())) { + warehouseEntity.setBetweenThirtySixtyPrice(Convert.toDouble(basicExcel.getBetweenThirtySixtyPrice())); + } + if (StrUtil.isNotEmpty(basicExcel.getBeyondSixtyPrice())) { + warehouseEntity.setBeyondSixtyPrice(Convert.toDouble(basicExcel.getBeyondSixtyPrice())); + } + if (StrUtil.isNotEmpty(basicExcel.getBeyondNinetyPrice())) { + warehouseEntity.setBeyondNinetyPrice(Convert.toDouble(basicExcel.getBeyondNinetyPrice())); + } + } + + private void buildSaveTrunkLineExcel(Map categoryEntityMap, Map routeEntityMap, Map trunkLineEntityMap, BasicdataPriceCategoryV2Excel basicExcel, BasicdataPriceEntity priceEntity, BasicdataPriceTemplateEntity templateEntity, Integer trunklineIsUnifyAreaBill, String trunkLinePrice) { + Long routeId = null; + Integer pickupIsByCategory = templateEntity.getTrunklineIsByCategory(); + // 按品类计费 + boolean categoryFlag = ObjectUtil.isNotEmpty(pickupIsByCategory) && ObjectUtil.equal(pickupIsByCategory, BooleanZeroOneEnums.YES.getCode()); + // 按区域计费 有路径的 + boolean b = ObjectUtil.isNotEmpty(trunklineIsUnifyAreaBill) && ObjectUtil.equal(trunklineIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode()); + BasicdataPriceCategoryBasicEntity basicEntity = null; + if (b) { + if (!ObjectUtil.isAllEmpty(basicExcel.getClient(), basicExcel.getBrand(), basicExcel.getSendOrg())) { + String key = buildRoutKeyV2(basicExcel.getClient(), basicExcel.getBrand(), basicExcel.getStartProvince(), + basicExcel.getStartCity(), basicExcel.getStartArea(), basicExcel.getEndProvince(), + basicExcel.getEndCity(), basicExcel.getEndArea(), basicExcel.getSendOrg(), "2"); + BasicdataPriceRouteEntity routeEntity = routeEntityMap.get(key); + if (ObjectUtil.isNotEmpty(routeEntity)) { + routeId = routeEntity.getId(); + } + } + } + if (b && categoryFlag) { + // 有路径按品类计费 + String key = basicExcel.getClient() + basicExcel.getBrand() + routeId + basicExcel.getCategory(); + if (StrUtil.isNotEmpty(basicExcel.getTrunkLineUnit())) { + key = key + basicExcel.getTrunkLineUnit(); + } + if (trunkLineEntityMap.containsKey(key)) { + basicEntity = trunkLineEntityMap.get(key); + } else { + basicEntity = new BasicdataPriceCategoryBasicEntity(); + trunkLineEntityMap.put(key, basicEntity); + } + } else if (b && !categoryFlag) { + // 有路径不按品类计费,一个客户一条路径一个价格 + String key = basicExcel.getClient() + basicExcel.getBrand() + routeId; + if (StrUtil.isNotEmpty(basicExcel.getTrunkLineUnit())) { + key = key + basicExcel.getTrunkLineUnit(); + } + if (trunkLineEntityMap.containsKey(key)) { + basicEntity = trunkLineEntityMap.get(key); + } else { + basicEntity = new BasicdataPriceCategoryBasicEntity(); + trunkLineEntityMap.put(key, basicEntity); + } + } else if (!b && categoryFlag) { + // 没路径 按品类计费 一个客户一个品类一个价格 + String key = basicExcel.getClient() + basicExcel.getBrand() + basicExcel.getCategory(); + if (StrUtil.isNotEmpty(basicExcel.getTrunkLineUnit())) { + key = key + basicExcel.getTrunkLineUnit(); + } + if (trunkLineEntityMap.containsKey(key)) { + basicEntity = trunkLineEntityMap.get(key); + } else { + basicEntity = new BasicdataPriceCategoryBasicEntity(); + trunkLineEntityMap.put(key, basicEntity); + } + } else { + // 没路径 不按品类计费 一个客户一个价格 + String key = basicExcel.getClient() + basicExcel.getBrand(); + if (StrUtil.isNotEmpty(basicExcel.getTrunkLineUnit())) { + key = key + basicExcel.getTrunkLineUnit(); + } + if (trunkLineEntityMap.containsKey(key)) { + basicEntity = trunkLineEntityMap.get(key); + } else { + basicEntity = new BasicdataPriceCategoryBasicEntity(); + trunkLineEntityMap.put(key, basicEntity); + } + } + // 按区域计费 + if (b) { + basicEntity.setBoId(routeId); + } else { + basicEntity.setBoId(priceEntity.getId()); + } + basicEntity.setServiceType(ServiceTypeEnums.TRUNK_LINE.getCode()); + // 计费类型 + if (StrUtil.isNotEmpty(basicExcel.getTrunkLineUnit())) { + basicEntity.setType(IDict.getCodeByText(TrunkLinePricingTypeEnums.class, basicExcel.getTrunkLineUnit())); + } + basicEntity.setPriceId(priceEntity.getId()); + // 品类 + if (StrUtil.isNotEmpty(basicExcel.getCategory())) { + if (ObjectUtil.isNotEmpty(categoryEntityMap.get(basicExcel.getCategory()))) { + if (categoryFlag) { + basicEntity.setCategoryId(categoryEntityMap.get(basicExcel.getCategory()).getId()); + } + } + } + // 价格 + basicEntity.setPrice(Convert.toDouble(trunkLinePrice)); + } + + private void buildSaveBasicExcel(Map categoryEntityMap, Map routeEntityMap, Map pickupEntityMap, BasicdataPriceCategoryV2Excel basicExcel, BasicdataPriceEntity priceEntity, BasicdataPriceTemplateEntity templateEntity, Integer pickupIsUnifyAreaBill, String pickupPrice) { + Long routeId = null; + Integer pickupIsByCategory = templateEntity.getPickupIsByCategory(); + // 按品类计费 + boolean categoryFlag = ObjectUtil.isNotEmpty(pickupIsByCategory) && ObjectUtil.equal(pickupIsByCategory, BooleanZeroOneEnums.YES.getCode()); + // 按区域计费 有路径的 + boolean b = ObjectUtil.isNotEmpty(pickupIsUnifyAreaBill) && ObjectUtil.equal(pickupIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode()); + BasicdataPriceCategoryBasicEntity basicEntity = null; + if (b) { + if (!ObjectUtil.isAllEmpty(basicExcel.getClient(), basicExcel.getBrand(), basicExcel.getSendOrg())) { + String key = buildRoutKeyV2(basicExcel.getClient(), basicExcel.getBrand(), basicExcel.getStartProvince(), + basicExcel.getStartCity(), basicExcel.getStartArea(), basicExcel.getEndProvince(), + basicExcel.getEndCity(), basicExcel.getEndArea(), basicExcel.getSendOrg(), "1"); + BasicdataPriceRouteEntity routeEntity = routeEntityMap.get(key); + if (ObjectUtil.isNotEmpty(routeEntity)) { + routeId = routeEntity.getId(); + } + } + } + if (b && categoryFlag) { + // 有路径按品类计费 一个客户一条路径一个品类一种计价方式一个价格 + String key = basicExcel.getClient() + basicExcel.getBrand() + routeId + basicExcel.getCategory(); + if (StrUtil.isNotEmpty(basicExcel.getPickupUnit())) { + key = key + basicExcel.getPickupUnit(); + } + if (pickupEntityMap.containsKey(key)) { + basicEntity = pickupEntityMap.get(key); + } else { + basicEntity = new BasicdataPriceCategoryBasicEntity(); + pickupEntityMap.put(key, basicEntity); + } + } else if (b && !categoryFlag) { + // 有路径不按品类计费,一个客户一条路径一种计价方式一个价格 + String key = basicExcel.getClient() + basicExcel.getBrand() + routeId; + if (StrUtil.isNotEmpty(basicExcel.getPickupUnit())) { + key = key + basicExcel.getPickupUnit(); + } + if (pickupEntityMap.containsKey(key)) { + basicEntity = pickupEntityMap.get(key); + } else { + basicEntity = new BasicdataPriceCategoryBasicEntity(); + pickupEntityMap.put(key, basicEntity); + } + } else if (!b && categoryFlag) { + // 没路径 按品类计费 一个客户一个品类一种计价方式一个价格 + String key = basicExcel.getClient() + basicExcel.getBrand() + basicExcel.getCategory(); + if (StrUtil.isNotEmpty(basicExcel.getPickupUnit())) { + key = key + basicExcel.getPickupUnit(); + } + if (pickupEntityMap.containsKey(key)) { + basicEntity = pickupEntityMap.get(key); + } else { + basicEntity = new BasicdataPriceCategoryBasicEntity(); + pickupEntityMap.put(key, basicEntity); + } + } else { + // 没路径 不按品类计费 一个客户一个计价方式一个价格 + String key = basicExcel.getClient() + basicExcel.getBrand(); + if (StrUtil.isNotEmpty(basicExcel.getPickupUnit())) { + key = key + basicExcel.getPickupUnit(); + } + if (pickupEntityMap.containsKey(key)) { + basicEntity = pickupEntityMap.get(key); + } else { + basicEntity = new BasicdataPriceCategoryBasicEntity(); + pickupEntityMap.put(key, basicEntity); + } + } + // 按区域计费 + if (b) { + basicEntity.setBoId(routeId); + } else { + basicEntity.setBoId(priceEntity.getId()); + } + basicEntity.setServiceType(ServiceTypeEnums.PICK_UP.getCode()); + // 计费类型 + if (StrUtil.isNotEmpty(basicExcel.getPickupUnit())) { + basicEntity.setType(IDict.getCodeByText(PickupPricingTypeEnums.class, basicExcel.getPickupUnit())); + } + basicEntity.setPriceId(priceEntity.getId()); + // 品类 + if (StrUtil.isNotEmpty(basicExcel.getCategory())) { + if (ObjectUtil.isNotEmpty(categoryEntityMap.get(basicExcel.getCategory()))) { + if (categoryFlag) { + basicEntity.setCategoryId(categoryEntityMap.get(basicExcel.getCategory()).getId()); + } + } + } + // 价格 + basicEntity.setPrice(Convert.toDouble(pickupPrice)); + } + + private void setStarProvinceExcel(Map provinceMap, BasicdataPriceRouteEntity routeEntity, String province) { + if (StrUtil.isNotEmpty(provinceMap.get(province))) { + routeEntity.setStartProvinceId(Convert.toLong(provinceMap.get(province))); + } + } + + private void setStartCityExcel(Map provinceCityMap, BasicdataPriceRouteEntity routeEntity, String province, String city) { + if (StrUtil.isNotEmpty(provinceCityMap.get(province + city))) { + routeEntity.setStartCityId(Convert.toLong(provinceCityMap.get(province + city))); + } + } + + private void setStartCountExcel(Map provinceCityAearMap, BasicdataPriceRouteEntity routeEntity, String province, String city, String s2) { + if (StrUtil.isNotEmpty(provinceCityAearMap.get(province + city + s2))) { + routeEntity.setStartCountyId(Convert.toLong(provinceCityAearMap.get(province + city + s2))); + } + } + + private void setEndCountExcel(Map provinceCityAearMap, BasicdataPriceRouteEntity routeEntity, String province, String city, String s2) { + if (StrUtil.isNotEmpty(provinceCityAearMap.get(province + city + s2))) { + routeEntity.setEndCountyId(Convert.toLong(provinceCityAearMap.get(province + city + s2))); + } + } + + private void setSendOrgExcel(Map clientEntityMap, BasicdataPriceRouteEntity routeEntity, String s2) { + if (ObjectUtil.isNotEmpty(clientEntityMap.get(s2))) { + routeEntity.setSendOrgId(clientEntityMap.get(s2).getId()); + } + } + + private void setEndCityExcel(Map provinceCityMap, BasicdataPriceRouteEntity routeEntity, String s3) { + if (StrUtil.isNotEmpty(provinceCityMap.get(s3))) { + routeEntity.setEndCityId(Convert.toLong(provinceCityMap.get(s3))); + } + } + + private void setEndProvinceExcel(Map provinceMap, BasicdataPriceRouteEntity routeEntity, String s2) { + if (StrUtil.isNotEmpty(provinceMap.get(s2))) { + routeEntity.setEndProvinceId(Convert.toLong(provinceMap.get(s2))); + } + } + + private void setPriceExcel(Map templateEntityMap, BasicdataPriceExcel priceExcel, BasicdataPriceEntity priceEntity) { + priceEntity.setEffectiveTime(DateUtil.parseDate(priceExcel.getEffectiveTime())); + priceEntity.setExpiryTime(DateUtil.parseDate(priceExcel.getExpiryTime())); + priceEntity.setTemplateId(templateEntityMap.get(priceExcel.getTemplateName()).getId()); + if (StrUtil.isNotEmpty(priceExcel.getDispatchUpwardJudgment())) { + priceEntity.setDispatchUpwardJudgment(Convert.toDouble(priceExcel.getDispatchUpwardJudgment())); + } else { + priceEntity.setDispatchUpwardJudgment(0d); + } + if (StrUtil.isNotEmpty(priceExcel.getDispatchUpwardJudgmentCost())) { + priceEntity.setDispatchUpwardJudgmentCost(Convert.toDouble(priceExcel.getDispatchUpwardJudgmentCost())); + } else { + priceEntity.setDispatchUpwardJudgmentCost(0d); + } + if (StrUtil.isNotEmpty(priceExcel.getDispatchStairsCarryingCharge())) { + priceEntity.setDispatchStairsCarryingCharge(Convert.toInt(priceExcel.getDispatchStairsCarryingCharge())); + } else { + priceEntity.setDispatchStairsCarryingCharge(0); + } + } + + private void initVehicleTypeMap(Map vehicleTypeMap) { + R> r = dictBizClient.getList(BasicdataConstants.Price.VEHICLE_TYPE); + if (r.isSuccess()) { + List dictBizList = r.getData(); + if (CollUtil.isNotEmpty(dictBizList)) { + for (DictBiz dictBiz : dictBizList) { + vehicleTypeMap.put(dictBiz.getDictValue(), dictBiz.getDictKey()); + } + } + } + } + + private void checkFullExcel(List fullVehicleExcels, Map clientEntityMap, Map priceEntityMap, + Map provinceMap, Map provinceCityMap, + Map provinceCityAearMap, Map vehicleTypeMap, + StringBuilder message, String sheetName) { + if (CollUtil.isNotEmpty(fullVehicleExcels)) { + for (int i = 0; i < fullVehicleExcels.size(); i++) { + BasicdataPriceFullVehicleExcel excel = fullVehicleExcels.get(i); + StringBuilder rowMessage = new StringBuilder(); + int rowNum = i + 3; + String firstMessage = sheetName + "-第" + rowNum + "行:"; + // 校验客户和品牌 + checkClientAndBrand(priceEntityMap, rowMessage, excel.getClientCode(), excel.getBrand()); + // 校验发站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, excel.getStartProvince(), excel.getStartCity(), excel.getStartArea(), "发站"); + // 校验到站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, excel.getEndProvince(), excel.getEndCity(), excel.getEndArea(), "到站"); + // 发货单位 + checkSendOrgExcel(clientEntityMap, rowMessage, excel.getSendOrgCode()); + // 校验一般费用类型 + checkEnumsExcelNotEmpty(rowMessage, excel.getType(), "类型", FullVehicleTypeEnums.class); + // 校验费用 + checkPriceNotEmpty(rowMessage, "价格", excel.getPrice()); + // 校验车型 + if (StrUtil.isNotEmpty(excel.getVehicleType())) { + if (!vehicleTypeMap.containsKey(excel.getVehicleType())) { + rowMessage.append("车型[").append(excel.getVehicleType()).append("]不存在;"); + } + } else { + rowMessage.append("车型不能为空;"); + } + buildErrorMessageExcel(message, rowMessage, firstMessage); + } + } + } + + private void checkFullExcelV2(List fullVehicleExcels, Map clientEntityMap, Map priceEntityMap, + Map provinceMap, Map provinceCityMap, + Map provinceCityAearMap, Map vehicleTypeMap, + StringBuilder message, String sheetName, Map clientBrandMap, Map templateMap) { + if (CollUtil.isNotEmpty(fullVehicleExcels)) { + for (int i = 0; i < fullVehicleExcels.size(); i++) { + BasicdataPriceFullVehicleV2Excel excel = fullVehicleExcels.get(i); + StringBuilder rowMessage = new StringBuilder(); + int rowNum = i + 4; + String firstMessage = sheetName + "-第" + rowNum + "行:"; + // 校验客户和品牌 + checkClientAndBrandV2(clientBrandMap, rowMessage, excel.getClient(), excel.getBrand()); + // 校验发站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, excel.getStartProvince(), excel.getStartCity(), excel.getStartArea(), "发站"); + // 校验到站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, excel.getEndProvince(), excel.getEndCity(), excel.getEndArea(), "到站"); + // 发货单位 + checkSendOrgExcel(clientEntityMap, rowMessage, excel.getSendOrgCode()); + // 提货干线只要一个是不按区域计费的,就必须要填写路径 + if (ObjectUtil.isAllNotEmpty(excel.getClient(), excel.getBrand())) { + if (templateMap.containsKey(excel.getClient() + excel.getBrand())) { + BasicdataPriceTemplateEntity templateEntity = templateMap.get(excel.getClient() + excel.getBrand()); + if (ObjectUtil.isNotEmpty(templateEntity)) { + Integer pickupIsUnifyAreaBill = templateEntity.getPickupIsUnifyAreaBill(); + Integer trunklineIsUnifyAreaBill = templateEntity.getTrunklineIsUnifyAreaBill(); + if (ObjectUtil.equal(pickupIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode()) || ObjectUtil.equal(trunklineIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode())) { + // 路径不能为空 + if (ObjectUtil.isEmpty(excel.getSendOrg())) { + rowMessage.append("模板配置为不按区域计费,路径不能为空,发货单位必填;"); + } + } + } + } + } + // 校验费用 + checkPrice(rowMessage, "【提货-单价】", excel.getPickupPrice()); + checkPrice(rowMessage, "【干线-单价】", excel.getTrunkLinePrice()); + checkPrice(rowMessage, "【配送-单价】", excel.getDispatchPrice()); + // 费用不能都为空 + if (ObjectUtil.isAllEmpty(excel.getPickupPrice(), excel.getTrunkLinePrice(), excel.getDispatchPrice())) { + rowMessage.append("单价不能全部为空,请检查;"); + } + // 校验车型 + if (StrUtil.isNotEmpty(excel.getVehicleType())) { + if (!vehicleTypeMap.containsKey(excel.getVehicleType())) { + rowMessage.append("车型[").append(excel.getVehicleType()).append("]不存在;"); + } + } else { + rowMessage.append("车型不能为空;"); + } + buildErrorMessageExcel(message, rowMessage, firstMessage); + } + } + } + + private void checkGeneralExcels(List generalExcels, Map clientEntityMap, Map priceEntityMap, Map provinceMap, Map provinceCityMap, Map provinceCityAearMap, StringBuilder message, String sheet5) { + if (CollUtil.isNotEmpty(generalExcels)) { + for (int i = 0; i < generalExcels.size(); i++) { + BasicdataPriceGeneralExcel excel = generalExcels.get(i); + StringBuilder rowMessage = new StringBuilder(); + int rowNum = i + 3; + String firstMessage = sheet5 + "-第" + rowNum + "行:"; + // 校验客户和品牌 + checkClientAndBrand(priceEntityMap, rowMessage, excel.getClientCode(), excel.getBrand()); + // 校验发站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, excel.getStartProvince(), excel.getStartCity(), excel.getStartArea(), "发站"); + // 校验到站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, excel.getEndProvince(), excel.getEndCity(), excel.getEndArea(), "到站"); + // 发货单位 + checkSendOrgExcel(clientEntityMap, rowMessage, excel.getSendOrgCode()); + // 校验一般费用类型 + checkEnumsExcelNotEmpty(rowMessage, excel.getType(), "类型", GeneralServiceTypeEnums.class); + // 校验费用 + checkPrice(rowMessage, "加算价格", excel.getAddCost()); + checkPrice(rowMessage, "最低计费值", excel.getMinCost()); + buildErrorMessageExcel(message, rowMessage, firstMessage); + } + } + } + + private void checkGeneralExcelsV2(List generalExcels, Map clientEntityMap, + Map priceEntityMap, Map provinceMap, + Map provinceCityMap, Map provinceCityAearMap, StringBuilder message, + String sheet5, Map clientBrandMap, Map templateMap) { + if (CollUtil.isNotEmpty(generalExcels)) { + for (int i = 0; i < generalExcels.size(); i++) { + BasicdataPriceGeneralV2Excel excel = generalExcels.get(i); + StringBuilder rowMessage = new StringBuilder(); + int rowNum = i + 3; + String firstMessage = sheet5 + "-第" + rowNum + "行:"; + // 校验客户和品牌 + checkClientAndBrandV2(clientBrandMap, rowMessage, excel.getClient(), excel.getBrand()); + // 校验发站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, excel.getStartProvince(), excel.getStartCity(), excel.getStartArea(), "发站"); + // 校验到站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, excel.getEndProvince(), excel.getEndCity(), excel.getEndArea(), "到站"); + // 发货单位 + checkSendOrgExcel(clientEntityMap, rowMessage, excel.getSendOrg()); + if (ObjectUtil.isAllEmpty(excel.getPickupMinCost(), excel.getTrunkLineMinCost(), excel.getDispatchMinCost())) { + rowMessage.append("最低计费不能都为空;"); + } + // 提货干线只要一个是不按区域计费的,就必须要填写路径 + if (ObjectUtil.isAllNotEmpty(excel.getClient(), excel.getBrand())) { + if (templateMap.containsKey(excel.getClient() + excel.getBrand())) { + BasicdataPriceTemplateEntity templateEntity = templateMap.get(excel.getClient() + excel.getBrand()); + if (ObjectUtil.isNotEmpty(templateEntity)) { + Integer pickupIsUnifyAreaBill = templateEntity.getPickupIsUnifyAreaBill(); + Integer trunklineIsUnifyAreaBill = templateEntity.getTrunklineIsUnifyAreaBill(); + if (ObjectUtil.equal(pickupIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode()) || ObjectUtil.equal(trunklineIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode())) { + // 路径不能为空 + if (ObjectUtil.isEmpty(excel.getSendOrg())) { + rowMessage.append("模板配置为不按区域计费,路径不能为空,发货单位必填;"); + } + } + } + } + } + // 校验费用 + checkPrice(rowMessage, "【提货-最低计费】", excel.getPickupMinCost()); + checkPrice(rowMessage, "【提货-加算价格】", excel.getPickupAddCost()); + checkPrice(rowMessage, "【干线-最低计费】", excel.getTrunkLineMinCost()); + checkPrice(rowMessage, "【干线-加算价格】", excel.getTrunkLineAddCost()); + checkPrice(rowMessage, "【配送-最低计费】", excel.getDispatchMinCost()); + checkPrice(rowMessage, "【配送-加算价格】", excel.getDispatchAddCost()); + checkPrice(rowMessage, "【配送-向上判断件数】", excel.getDispatchUpwardJudgment()); + checkPrice(rowMessage, "【配送-向上判断加价】", excel.getDispatchUpwardJudgmentCost()); + checkPrice(rowMessage, "【配送-遗留最低计费】", excel.getDispatchLeaveBehindMinCost()); + checkPrice(rowMessage, "【配送-遗留加算价格】", excel.getDispatchLeaveBehindAddCost()); + buildErrorMessageExcel(message, rowMessage, firstMessage); + } + } + } + + private void checkDispatchExcels(List excels, Map clientEntityMap, Map priceEntityMap, Map categoryEntityMap, StringBuilder message, String sheetName) { + if (CollUtil.isNotEmpty(excels)) { + // 校验sheet2的数据 + for (int i = 0; i < excels.size(); i++) { + BasicdataPriceCategoryDispatchExcel excel = excels.get(i); + StringBuilder rowMessage = new StringBuilder(); + int rowNum = i + 3; + String firstMessage = sheetName + "-第" + rowNum + "行:"; + // 校验客户和品牌 + checkClientAndBrand(priceEntityMap, rowMessage, excel.getClientCode(), excel.getBrand()); + // 校验计费类型 + checkEnumsExcelNotEmpty(rowMessage, excel.getType(), "费用类型", CostTypeEnums.class); + // 校验计价方式 + checkEnumsExcel(rowMessage, excel.getCostType(), "计价方式", DispatchPricingTypeEnums.class); + // 品类 + checkCategoryExcel(categoryEntityMap, rowMessage, excel.getCategory()); + // 校验价格,只能是数字 + checkPrice(rowMessage, "单价", excel.getPrice()); + checkPrice(rowMessage, "遗留单价", excel.getLeaveBehindPrice()); + checkPrice(rowMessage, "分货费", excel.getSortPrice()); + checkPrice(rowMessage, "操作/装卸费", excel.getHandlingPrice()); + checkPrice(rowMessage, "平移费", excel.getRelocationPrice()); + checkPrice(rowMessage, "上楼费", excel.getUpstairsDeliveryPrice()); + buildErrorMessageExcel(message, rowMessage, firstMessage); + } + } + } + + private void checkEnumsExcelNotEmpty(StringBuilder rowMessage, String type, String columnName, Class classz) { + if (StrUtil.isEmpty(type)) { + rowMessage.append(columnName).append("不能为空;"); + } else { + buildEnumsMessage(rowMessage, type, columnName, classz); + } + } + + private void buildEnumsMessage(StringBuilder rowMessage, String type, String columnName, Class classz) { + if (ObjectUtil.isEmpty(IDict.getCodeByText(classz, type))) { + Set textSrt = new HashSet<>(); + IDict.getAll(classz).forEach(item -> { + IDict dict = (IDict) item; + textSrt.add(dict.getText()); + }); + rowMessage.append(columnName).append("只能为:") + .append(CollUtil.join(textSrt, "/")) + .append(";"); + } + } + + private void checkEnumsExcel(StringBuilder rowMessage, String type, String columnName, Class classz) { + if (StrUtil.isNotEmpty(type)) { + buildEnumsMessage(rowMessage, type, columnName, classz); + } + } + + private void checkWarehouseExcels(List excels, Map clientEntityMap, Map priceEntityMap, Map categoryEntityMap, StringBuilder message, String sheetName) { + if (CollUtil.isNotEmpty(excels)) { + // 校验sheet2的数据 + for (int i = 0; i < excels.size(); i++) { + BasicdataPriceCategoryWarehouseExcel excel = excels.get(i); + StringBuilder rowMessage = new StringBuilder(); + int rowNum = i + 3; + String firstMessage = sheetName + "-第" + rowNum + "行:"; + // 校验客户和品牌 + checkClientAndBrand(priceEntityMap, rowMessage, excel.getClientCode(), excel.getBrand()); + // 费用类型 + checkEnumsExcelNotEmpty(rowMessage, excel.getType(), "费用类型", CostTypeEnums.class); + // 校验计价方式 + checkEnumsExcel(rowMessage, excel.getCostType(), "计价方式", WarehousePricingTypeEnums.class); + // 品类 + checkCategoryExcel(categoryEntityMap, rowMessage, excel.getCategory()); + + // 校验价格,只能是数字 + checkPrice(rowMessage, "30天内", excel.getWithinThirtyPrice()); + checkPrice(rowMessage, "30-60天", excel.getBetweenThirtySixtyPrice()); + checkPrice(rowMessage, "60天外", excel.getBeyondSixtyPrice()); + checkPrice(rowMessage, "上限价格", excel.getMaximumPrice()); + checkPrice(rowMessage, "操作/装卸费", excel.getOperatePrice()); + checkPrice(rowMessage, "仓储管理费", excel.getWarehouseManagementPrice()); + checkPrice(rowMessage, "仓储分货费", excel.getWarehouseSortPrice()); + buildErrorMessageExcel(message, rowMessage, firstMessage); + } + } + } + + private void checkBasicExcels(StringBuilder message, String sheetName, Map clientEntityMap, Map priceEntityMap, List basicExcels, Map categoryEntityMap, Map provinceMap, Map provinceCityMap, Map provinceCityAearMap) { + if (CollUtil.isNotEmpty(basicExcels)) { + // 校验sheet2的数据 + for (int i = 0; i < basicExcels.size(); i++) { + BasicdataPriceCategoryBasicExcel basicExcel = basicExcels.get(i); + StringBuilder rowMessage = new StringBuilder(); + int rowNum = i + 3; + String firstMessage = sheetName + "-第" + rowNum + "行:"; + // 校验客户和品牌 + checkClientAndBrand(priceEntityMap, rowMessage, basicExcel.getClientCode(), basicExcel.getBrand()); + if (StrUtil.isEmpty(basicExcel.getType())) { + rowMessage.append("服务类型不能为空;"); + } else { + if (!(ObjectUtil.equal(ServiceTypeEnums.PICK_UP.getText(), basicExcel.getType()) + || ObjectUtil.equal(ServiceTypeEnums.TRUNK_LINE.getText(), basicExcel.getType()))) { + rowMessage.append("服务类型只能为提货或干线;"); + } + } + if (StrUtil.isNotEmpty(basicExcel.getCostType())) { + if (!(ObjectUtil.equal(PickupPricingTypeEnums.PIECE.getText(), basicExcel.getCostType()) + || ObjectUtil.equal(PickupPricingTypeEnums.CUBE.getText(), basicExcel.getCostType()) + || ObjectUtil.equal(PickupPricingTypeEnums.WEIGHT.getText(), basicExcel.getCostType())) + ) { + rowMessage.append("服务类型只能为按件或按方或按重量;"); + } + } + + // 发站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, basicExcel.getStartProvince(), + basicExcel.getStartCity(), basicExcel.getStartArea(), "发站"); + // 到站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, basicExcel.getEndProvince(), + basicExcel.getEndCity(), basicExcel.getEndArea(), "到站"); + // 发货单位 + checkSendOrgExcel(clientEntityMap, rowMessage, basicExcel.getSendOrgCode()); + // 品类 + checkCategoryExcel(categoryEntityMap, rowMessage, basicExcel.getCategory()); + // 校验价格,不能为空,只能是数字 + checkPriceNotEmpty(rowMessage, "价格", basicExcel.getPrice()); + buildErrorMessageExcel(message, rowMessage, firstMessage); + } + } + } + + private void checkBasicExcelsV2(StringBuilder message, String sheetName, Map clientEntityMap, + Map priceEntityMap, List basicExcels, + Map categoryEntityMap, Map provinceMap, + Map provinceCityMap, Map provinceCityAearMap, + Map clientBrandMap, Map templateMap) { + if (CollUtil.isNotEmpty(basicExcels)) { + Map categoryIdMap = new HashMap<>(); + if (CollUtil.isNotEmpty(categoryEntityMap)) { + categoryEntityMap.forEach((k, v) -> { + categoryIdMap.put(v.getId().toString(), v); + }); + } + // 校验sheet2的数据 + for (int i = 0; i < basicExcels.size(); i++) { + BasicdataPriceCategoryV2Excel basicExcel = basicExcels.get(i); + StringBuilder rowMessage = new StringBuilder(); + int rowNum = i + 5; + String firstMessage = sheetName + "-第" + rowNum + "行:"; + // 校验客户和品牌 + checkClientAndBrandV2(clientBrandMap, rowMessage, basicExcel.getClient(), basicExcel.getBrand()); + // 校验单位 + checkEnumsExcel(rowMessage, basicExcel.getPickupUnit(), "【提货-单位】", PickupPricingTypeEnums.class); + checkEnumsExcel(rowMessage, basicExcel.getTrunkLineUnit(), "【干线-单位】", PickupPricingTypeEnums.class); + checkEnumsExcel(rowMessage, basicExcel.getDispatchUnit(), "【配送-单位】", PickupPricingTypeEnums.class); + + // 发站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, basicExcel.getStartProvince(), + basicExcel.getStartCity(), basicExcel.getStartArea(), "发站"); + // 到站 + checkReign(provinceMap, provinceCityMap, provinceCityAearMap, rowMessage, basicExcel.getEndProvince(), + basicExcel.getEndCity(), basicExcel.getEndArea(), "到站"); + // 发货单位 + checkSendOrgExcel(clientEntityMap, rowMessage, basicExcel.getSendOrg()); + // 品类 + checkCategoryExcel(categoryEntityMap, rowMessage, basicExcel.getCategory()); + // 提货干线只要一个是不按区域计费的,就必须要填写路径 + if (ObjectUtil.isAllNotEmpty(basicExcel.getClient(), basicExcel.getBrand())) { + if (templateMap.containsKey(basicExcel.getClient() + basicExcel.getBrand())) { + BasicdataPriceTemplateEntity templateEntity = templateMap.get(basicExcel.getClient() + basicExcel.getBrand()); + if (ObjectUtil.isNotEmpty(templateEntity)) { + Integer pickupIsUnifyAreaBill = templateEntity.getPickupIsUnifyAreaBill(); + Integer trunklineIsUnifyAreaBill = templateEntity.getTrunklineIsUnifyAreaBill(); + if (ObjectUtil.equal(pickupIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode()) || ObjectUtil.equal(trunklineIsUnifyAreaBill, BooleanZeroOneEnums.NO.getCode())) { + // 路径不能为空 + if (ObjectUtil.isEmpty(basicExcel.getSendOrg())) { + rowMessage.append("模板配置为不按区域计费,路径不能为空,发货单位必填;"); + } + } + // 校验模版中是否包含填写的品类 + // 提货 + // 提货是否按品类计费 + Integer pickupIsByCategory = templateEntity.getPickupIsByCategory(); + if (ObjectUtil.isNotEmpty(pickupIsByCategory) && ObjectUtil.equal(pickupIsByCategory, BooleanZeroOneEnums.YES.getCode())) { + String pickupPieceCategory = templateEntity.getPickupPieceCategory(); + String pickupCubeCategory = templateEntity.getPickupCubeCategory(); + String pickupWeightCategory = templateEntity.getPickupWeightCategory(); + if (ObjectUtil.isAllNotEmpty(basicExcel.getPickupUnit(), basicExcel.getPickupPrice())) { + String pickupUnit = basicExcel.getPickupUnit(); + String category = basicExcel.getCategory(); + if (ObjectUtil.equal(PickupPricingTypeEnums.PIECE.getText(), pickupUnit)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, pickupPieceCategory, pickupUnit, "配送"); + } + if (ObjectUtil.equal(PickupPricingTypeEnums.CUBE.getText(), pickupUnit)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, pickupCubeCategory, pickupUnit, "配送"); + } + if (ObjectUtil.equal(PickupPricingTypeEnums.WEIGHT.getText(), pickupUnit)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, pickupWeightCategory, pickupUnit, "配送"); + } + } + } + Integer trunkLineIsByCategory = templateEntity.getTrunklineIsByCategory(); + if (ObjectUtil.isNotEmpty(trunkLineIsByCategory) && ObjectUtil.equal(trunkLineIsByCategory, BooleanZeroOneEnums.YES.getCode())) { + String trunklinePieceCategory = templateEntity.getTrunklinePieceCategory(); + String trunklineCubeCategory = templateEntity.getTrunklineCubeCategory(); + String trunklineWeightCategory = templateEntity.getTrunklineWeightCategory(); + if (ObjectUtil.isAllNotEmpty(basicExcel.getTrunkLineUnit(), basicExcel.getTrunkLinePrice())) { + String pickupUnit = basicExcel.getTrunkLineUnit(); + String category = basicExcel.getCategory(); + if (ObjectUtil.equal(TrunkLinePricingTypeEnums.PIECE.getText(), pickupUnit)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, trunklinePieceCategory, pickupUnit, "干线"); + } + if (ObjectUtil.equal(TrunkLinePricingTypeEnums.CUBE.getText(), pickupUnit)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, trunklineCubeCategory, pickupUnit, "干线"); + } + if (ObjectUtil.equal(TrunkLinePricingTypeEnums.WEIGHT.getText(), pickupUnit)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, trunklineWeightCategory, pickupUnit, "干线"); + } + } + } + Integer warehouseIsByCategory = templateEntity.getWarehouseIsByCategory(); + if (ObjectUtil.isNotEmpty(warehouseIsByCategory) && ObjectUtil.equal(warehouseIsByCategory, BooleanZeroOneEnums.YES.getCode())) { + String warehousePieceCategory = templateEntity.getWarehousePieceCategory(); + if (StrUtil.isNotEmpty(basicExcel.getWithinThirtyPrice()) + || StrUtil.isNotEmpty(basicExcel.getBetweenThirtySixtyPrice()) + || StrUtil.isNotEmpty(basicExcel.getBeyondSixtyPrice()) + || StrUtil.isNotEmpty(basicExcel.getBeyondNinetyPrice())) { + String category = basicExcel.getCategory(); + if (StrUtil.isNotEmpty(category)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, warehousePieceCategory, null, "仓储"); + } + } + } + Integer warehouseIsCategorySubjoin = templateEntity.getWarehouseIsCategorySubjoin(); + if (ObjectUtil.isNotEmpty(warehouseIsCategorySubjoin) && ObjectUtil.equal(warehouseIsCategorySubjoin, BooleanZeroOneEnums.YES.getCode())) { + String warehousePieceCategory = templateEntity.getWarehouseSubjoinCategory(); + if (StrUtil.isNotEmpty(basicExcel.getWarehouseSortPrice()) + || StrUtil.isNotEmpty(basicExcel.getWarehouseManagementPrice()) + || StrUtil.isNotEmpty(basicExcel.getWarehouseOperatePrice())) { + String category = basicExcel.getCategory(); + if (StrUtil.isNotEmpty(category)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, warehousePieceCategory, null, "仓储附加费"); + } + } + } + Integer dispatchIsByCategory = templateEntity.getDispatchIsByCategory(); + if (ObjectUtil.isNotEmpty(dispatchIsByCategory) && ObjectUtil.equal(dispatchIsByCategory, BooleanZeroOneEnums.YES.getCode())) { + String trunklinePieceCategory = templateEntity.getDispatchPieceCategory(); + String trunklineCubeCategory = templateEntity.getDispatchCubeCategory(); + String trunklineWeightCategory = templateEntity.getDispatchWeightCategory(); + if (ObjectUtil.isAllNotEmpty(basicExcel.getDispatchUnit(), basicExcel.getDispatchPrice())) { + String pickupUnit = basicExcel.getDispatchUnit(); + String category = basicExcel.getCategory(); + if (ObjectUtil.equal(DispatchPricingTypeEnums.PIECE.getText(), pickupUnit)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, trunklinePieceCategory, pickupUnit, "配送"); + } + if (ObjectUtil.equal(DispatchPricingTypeEnums.CUBE.getText(), pickupUnit)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, trunklineCubeCategory, pickupUnit, "配送"); + } + if (ObjectUtil.equal(DispatchPricingTypeEnums.WEIGHT.getText(), pickupUnit)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, trunklineWeightCategory, pickupUnit, "配送"); + } + } + } + Integer dispatchIsCategorySubjoin = templateEntity.getDispatchIsCategorySubjoin(); + if (ObjectUtil.isNotEmpty(dispatchIsCategorySubjoin) && ObjectUtil.equal(dispatchIsCategorySubjoin, BooleanZeroOneEnums.YES.getCode())) { + String warehousePieceCategory = templateEntity.getDispatchSubjoinCategory(); + if (StrUtil.isNotEmpty(basicExcel.getDispatchSortPrice()) + || StrUtil.isNotEmpty(basicExcel.getDispatchHandlingPrice()) + || StrUtil.isNotEmpty(basicExcel.getDispatchRelocationPrice()) + || StrUtil.isNotEmpty(basicExcel.getDispatchDeliveryPrice())) { + String category = basicExcel.getCategory(); + if (StrUtil.isNotEmpty(category)) { + checkCategoryByUnit(categoryIdMap, category, rowMessage, warehousePieceCategory, null, "配送附加费"); + } + } + } + } + } + } + // 校验价格,不能为空,只能是数字 + checkPrice(rowMessage, "【提货-单价】只能为数字", basicExcel.getPickupPrice()); + if (StrUtil.isNotEmpty(basicExcel.getPickupPrice())) { + checkDataNotEmpty(rowMessage, "提货-单位", basicExcel.getPickupUnit()); + } + checkPrice(rowMessage, "【干线-单价】只能为数字", basicExcel.getTrunkLinePrice()); + if (StrUtil.isNotEmpty(basicExcel.getPickupPrice())) { + checkDataNotEmpty(rowMessage, "干线-单位", basicExcel.getTrunkLineUnit()); + } + checkPrice(rowMessage, "【仓储-30天内】只能为数字", basicExcel.getWithinThirtyPrice()); + checkPrice(rowMessage, "【仓储-30-60天】只能为数字", basicExcel.getBetweenThirtySixtyPrice()); + checkPrice(rowMessage, "【仓储-60-90天】只能为数字", basicExcel.getBeyondSixtyPrice()); + checkPrice(rowMessage, "【仓储-90天以上】只能为数字", basicExcel.getBeyondNinetyPrice()); + checkPrice(rowMessage, "【仓储附加费-仓储操作/装卸费】只能为数字", basicExcel.getWarehouseOperatePrice()); + checkPrice(rowMessage, "【仓储附加费-仓储管理费】只能为数字", basicExcel.getWarehouseManagementPrice()); + checkPrice(rowMessage, "【仓储附加费-仓储分货费】只能为数字", basicExcel.getWarehouseSortPrice()); + checkPrice(rowMessage, "【配送-一般单价】只能为数字", basicExcel.getDispatchPrice()); + if (StrUtil.isNotEmpty(basicExcel.getDispatchPrice())) { + checkDataNotEmpty(rowMessage, "配送-单位", basicExcel.getDispatchUnit()); + } + checkPrice(rowMessage, "【配送-遗留单价】只能为数字", basicExcel.getDispatchLeaveBehindPrice()); + checkPrice(rowMessage, "【配送附加费-分货费】只能为数字", basicExcel.getDispatchSortPrice()); + checkPrice(rowMessage, "【配送附加费-操作/装卸费价格】只能为数字", basicExcel.getDispatchHandlingPrice()); + checkPrice(rowMessage, "【配送附加费-平移费价格】只能为数字", basicExcel.getDispatchRelocationPrice()); + checkPrice(rowMessage, "【配送附加费-上楼费价格】只能为数字", basicExcel.getDispatchDeliveryPrice()); + checkPrice(rowMessage, "【配送附加费-上楼免楼层数】只能为数字", basicExcel.getDispatchStairsCarryingCharge()); + buildErrorMessageExcel(message, rowMessage, firstMessage); + } + } + } + + private void checkCategoryByUnit(Map categoryIdMap, String category, StringBuilder rowMessage, + String categoryIdStr, String unit, String type) { + if (StrUtil.isNotEmpty(categoryIdStr)) { + List categoryIds = StrUtil.splitTrim(categoryIdStr, ","); + List categoryNamesFromMap = categoryIds.stream() + .map(categoryIdMap::get) + .filter(Objects::nonNull) + .map(BasicdataCategoryEntity::getName) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(categoryNamesFromMap)) { + if (!categoryNamesFromMap.contains(category)) { + rowMessage.append("品类【").append(category).append("】不在模板") + .append(type); + if (StrUtil.isNotEmpty(unit)) { + rowMessage.append(unit); + } + rowMessage.append("品类中,请检查;"); + } + } else { + rowMessage.append("品类【").append(category).append("】不在模板") + .append(type); + if (StrUtil.isNotEmpty(unit)) { + rowMessage.append(unit); + } + rowMessage.append("品类中,请检查;"); + } + } + } + + private void buildErrorMessageExcel(StringBuilder message, StringBuilder rowMessage, String firstMessage) { + if (StrUtil.isNotEmpty(rowMessage.toString())) { + message.append("

"); + message.append(firstMessage); + message.append(rowMessage); + message.append("

"); + message.append("
"); + } + } + + private void checkPriceNotEmpty(StringBuilder rowMessage, String columnName, String price) { + if (StrUtil.isNotEmpty(price)) { + if (!NumberUtil.isNumber(price)) { + rowMessage.append(columnName).append("只能是数字;"); + } + } else { + rowMessage.append(columnName).append("不能为空;"); + } + } + + private void checkDataNotEmpty(StringBuilder rowMessage, String columnName, String data) { + if (StrUtil.isEmpty(data)) { + rowMessage.append(columnName).append("不能为空;"); + } + } + + private void checkCategoryExcel(Map categoryEntityMap, StringBuilder rowMessage, String category) { + if (StrUtil.isNotEmpty(category)) { + if (!categoryEntityMap.containsKey(category)) { + rowMessage.append("品类不存在;"); + } + } + } + + private void checkSendOrgExcel(Map clientEntityMap, StringBuilder rowMessage, String sendOrg) { + if (StrUtil.isNotEmpty(sendOrg)) { + if (!clientEntityMap.containsKey(sendOrg)) { + rowMessage.append("发货单位不存在;"); + } + } + } + + private void checkReign(Map provinceMap, Map provinceCityMap, Map provinceCityAearMap, StringBuilder rowMessage, String startProvince, String startCity, String startArea, String type) { + if (StrUtil.isNotEmpty(startProvince)) { + if (!provinceMap.containsKey(startProvince)) { + rowMessage.append(type).append("(省)不存在;"); + } else { + if (StrUtil.isNotEmpty(startCity)) { + if (!provinceCityMap.containsKey(startProvince + startCity)) { + rowMessage.append(type).append("(市)不存在;"); + } else { + if (StrUtil.isNotEmpty(startArea)) { + if (!provinceCityAearMap.containsKey(startProvince + startCity + startArea)) { + rowMessage.append(type).append("(区)不存在;"); + } + } + } + } + } + } + } + + private void checkClientAndBrand(Map priceEntityMap, StringBuilder rowMessage, String client, String brand) { + if (StrUtil.isEmpty(client)) { + rowMessage.append("客户名称不能为空;"); + } + if (StrUtil.isEmpty(brand)) { + rowMessage.append("品牌不能为空;"); + } + // 客户+品牌必须在sheet1中存在 + if (!ObjectUtil.isAllEmpty(client, brand)) { + if (!priceEntityMap.containsKey(client + brand)) { + rowMessage.append("客户名称+品牌名称不存在;"); + } + } + } + + private void checkClientAndBrandV2(Map priceEntityMap, StringBuilder rowMessage, String client, String brand) { + if (StrUtil.isEmpty(client)) { + rowMessage.append("客户名称不能为空;"); + } + if (StrUtil.isEmpty(brand)) { + rowMessage.append("品牌不能为空;"); + } + // 客户+品牌必须在sheet1中存在 + if (!ObjectUtil.isAllEmpty(client, brand)) { + if (!priceEntityMap.containsKey(client + brand)) { + rowMessage.append("客户名称+品牌名称不存在;"); + } + } + } + + private void initRegion(Map provinceMap, Map provinceCityMap, Map provinceCityAearMap) { + R> regionALL = sysClient.getRegionALL(); + if (regionALL.isSuccess()) { + List data = regionALL.getData(); + if (CollUtil.isNotEmpty(data)) { + for (RegionAllVO datum : data) { + provinceMap.put(datum.getLabel(), datum.getValue()); + List children = datum.getChildren(); + if (CollUtil.isNotEmpty(children)) { + for (RegionAllVO child : children) { + provinceCityMap.put(datum.getLabel() + child.getLabel(), child.getValue()); + List children1 = child.getChildren(); + if (CollUtil.isNotEmpty(children1)) { + for (RegionAllVO regionAllVO : children1) { + provinceCityAearMap.put(datum.getLabel() + child.getLabel() + regionAllVO.getLabel(), regionAllVO.getValue()); + } + } + } + } + } + } + } + } + + private void initCategoryData(List basicExcels, + List dispatchExcels, + List warehouseExcels, + Map categoryEntityMap) { + Set categorySet = new HashSet<>(); + if (CollUtil.isNotEmpty(basicExcels)) { + for (BasicdataPriceCategoryBasicExcel basicExcel : basicExcels) { + if (StrUtil.isNotEmpty(basicExcel.getCategory())) { + categorySet.add(basicExcel.getCategory()); + } + } + } + if (CollUtil.isNotEmpty(dispatchExcels)) { + for (BasicdataPriceCategoryDispatchExcel dispatchExcel : dispatchExcels) { + if (StrUtil.isNotEmpty(dispatchExcel.getCategory())) { + categorySet.add(dispatchExcel.getCategory()); + } + } + } + if (CollUtil.isNotEmpty(warehouseExcels)) { + for (BasicdataPriceCategoryWarehouseExcel warehouseExcel : warehouseExcels) { + if (StrUtil.isNotEmpty(warehouseExcel.getCategory())) { + categorySet.add(warehouseExcel.getCategory()); + } + } + } + if (CollUtil.isNotEmpty(categorySet)) { + List list = categoryService.list(Wrappers.lambdaQuery().in(BasicdataCategoryEntity::getName, categorySet)); + if (CollUtil.isNotEmpty(list)) { + // 将List中的数据方到categoryEntityMap中 + list.forEach(basicdataCategoryEntity -> { + categoryEntityMap.put(basicdataCategoryEntity.getName(), basicdataCategoryEntity); + }); + } + } + } + + private void initCategoryDataV2(List basicExcels, + Map categoryEntityMap) { + Set categorySet = new HashSet<>(); + if (CollUtil.isNotEmpty(basicExcels)) { + for (BasicdataPriceCategoryV2Excel basicExcel : basicExcels) { + if (StrUtil.isNotEmpty(basicExcel.getCategory())) { + categorySet.add(basicExcel.getCategory()); + } + } + } + if (CollUtil.isNotEmpty(categorySet)) { + List list = categoryService.list(Wrappers.lambdaQuery().in(BasicdataCategoryEntity::getName, categorySet)); + if (CollUtil.isNotEmpty(list)) { + // 将List中的数据方到categoryEntityMap中 + list.forEach(basicdataCategoryEntity -> { + categoryEntityMap.put(basicdataCategoryEntity.getName(), basicdataCategoryEntity); + }); + } + } + } + + private void initImportData(List priceExcels, List basicExcels, List generalExcels, List fullVehicleExcels, Map templateEntityMap, Map clientEntityMap, Map brandEntityMap, Map priceEntityMap) { + Set templateNameSet = new HashSet<>(); + Set clientSet = new HashSet<>(); + Set brandSet = new HashSet<>(); + // 将数据封装到set中 + priceExcels.forEach(priceExcel -> { + if (StrUtil.isNotEmpty(priceExcel.getTemplateName())) { + templateNameSet.add(priceExcel.getTemplateName()); + } + if (StrUtil.isNotEmpty(priceExcel.getClientCode())) { + clientSet.add(priceExcel.getClientCode()); + } + if (StrUtil.isNotEmpty(priceExcel.getBrand())) { + brandSet.add(priceExcel.getBrand()); + } + }); + if (CollUtil.isNotEmpty(basicExcels)) { + for (BasicdataPriceCategoryBasicExcel basicExcel : basicExcels) { + if (StrUtil.isNotEmpty(basicExcel.getSendOrgCode())) { + clientSet.add(basicExcel.getSendOrgCode()); + } + } + } + if (CollUtil.isNotEmpty(generalExcels)) { + for (BasicdataPriceGeneralExcel generalExcel : generalExcels) { + if (StrUtil.isNotEmpty(generalExcel.getSendOrgCode())) { + clientSet.add(generalExcel.getSendOrgCode()); + } + } + } + if (CollUtil.isNotEmpty(fullVehicleExcels)) { + for (BasicdataPriceFullVehicleExcel fullVehicleExcel : fullVehicleExcels) { + if (StrUtil.isNotEmpty(fullVehicleExcel.getSendOrgCode())) { + clientSet.add(fullVehicleExcel.getSendOrgCode()); + } + } + } + // 先校验数据完整性 + if (CollUtil.isNotEmpty(templateNameSet)) { + LambdaQueryWrapper templateWrapper = Wrappers.lambdaQuery().in(BasicdataPriceTemplateEntity::getName, templateNameSet); + List templateEntities = templateService.list(templateWrapper); + // 将templateEntities中的数据放到map中 + templateEntities.forEach(templateEntity -> { + templateEntityMap.put(templateEntity.getName(), templateEntity); + }); + } + + if (CollUtil.isNotEmpty(clientSet)) { + LambdaQueryWrapper clientWrapper = Wrappers.lambdaQuery().in(BasicdataClientEntity::getClientCode, clientSet); + List clientEntities = clientService.list(clientWrapper); + // 将clientEntities中的数据放到map中 + clientEntities.forEach(clientEntity -> { + clientEntityMap.put(clientEntity.getClientCode(), clientEntity); + }); + } + + if (CollUtil.isNotEmpty(brandSet)) { + LambdaQueryWrapper brandWrapper = Wrappers.lambdaQuery().in(BasicdataBrandEntity::getBrandName, brandSet); + List brandEntities = brandService.list(brandWrapper); + // 将brandEntities中的数据放到map中 + brandEntities.forEach(brandEntity -> { + brandEntityMap.put(brandEntity.getBrandName(), brandEntity); + }); + } + Boolean flag = Boolean.FALSE; + for (BasicdataPriceExcel priceExcel : priceExcels) { + if (!ObjectUtil.isAllEmpty(priceExcel.getClientCode(), priceExcel.getBrand())) { + flag = Boolean.TRUE; + break; + } + } + if (flag) { + List priceEntities = this.baseMapper.findEntityByClientAndBrand(priceExcels); + if (CollUtil.isNotEmpty(priceEntities)) { + priceEntities.forEach(priceEntity -> { + priceEntityMap.put(priceEntity.getClientCode() + priceEntity.getBrandName(), priceEntity); + }); + } + } + } + + private void initImportDataV2(List priceExcels, List basicExcels, + List generalExcels, List fullVehicleExcels, + Map templateEntityMap, Map clientEntityMap, + Map brandEntityMap, Map priceEntityMap, + Map clientBrandMap, Map> checkPriceMap, + Map templateMap) { + Set templateNameSet = new HashSet<>(); + Set clientSet = new HashSet<>(); + Set brandSet = new HashSet<>(); + // 将数据封装到set中 + priceExcels.forEach(priceExcel -> { + if (StrUtil.isNotEmpty(priceExcel.getTemplateName())) { + templateNameSet.add(priceExcel.getTemplateName()); + } + if (StrUtil.isNotEmpty(priceExcel.getClient())) { + clientSet.add(priceExcel.getClient()); + } + if (StrUtil.isNotEmpty(priceExcel.getBrand())) { + brandSet.add(priceExcel.getBrand()); + } + }); + if (CollUtil.isNotEmpty(basicExcels)) { + for (BasicdataPriceCategoryV2Excel basicExcel : basicExcels) { + if (StrUtil.isNotEmpty(basicExcel.getSendOrg())) { + clientSet.add(basicExcel.getSendOrg()); + } + } + } + if (CollUtil.isNotEmpty(generalExcels)) { + for (BasicdataPriceGeneralV2Excel generalExcel : generalExcels) { + if (StrUtil.isNotEmpty(generalExcel.getSendOrg())) { + clientSet.add(generalExcel.getSendOrg()); + } + } + } + if (CollUtil.isNotEmpty(fullVehicleExcels)) { + for (BasicdataPriceFullVehicleV2Excel fullVehicleExcel : fullVehicleExcels) { + if (StrUtil.isNotEmpty(fullVehicleExcel.getSendOrg())) { + clientSet.add(fullVehicleExcel.getSendOrg()); + } + } + } + // 先校验数据完整性 + if (CollUtil.isNotEmpty(templateNameSet)) { + LambdaQueryWrapper templateWrapper = Wrappers.lambdaQuery().in(BasicdataPriceTemplateEntity::getName, templateNameSet); + List templateEntities = templateService.list(templateWrapper); + // 将templateEntities中的数据放到map中 + templateEntities.forEach(templateEntity -> { + templateEntityMap.put(templateEntity.getName(), templateEntity); + }); + } + + priceExcels.forEach(priceExcel -> { + if (ObjectUtil.isAllNotEmpty(priceExcel.getClient(), priceExcel.getBrand(), priceExcel.getTemplateName())) { + if (templateEntityMap.containsKey(priceExcel.getTemplateName())) { + templateMap.put(priceExcel.getClient() + priceExcel.getBrand(), templateEntityMap.get(priceExcel.getTemplateName())); + } + } + }); + + Map clientMap = new HashMap<>(); + if (CollUtil.isNotEmpty(clientSet)) { + LambdaQueryWrapper clientWrapper = Wrappers.lambdaQuery().in(BasicdataClientEntity::getClientName, clientSet); + List clientEntities = clientService.list(clientWrapper); + // 将clientEntities中的数据放到map中 + clientEntities.forEach(clientEntity -> { + clientEntityMap.put(clientEntity.getClientName(), clientEntity); + clientMap.put(clientEntity.getId().toString(), clientEntity.getClientName()); + }); + } + Map brandMap = new HashMap<>(); + if (CollUtil.isNotEmpty(brandSet)) { + LambdaQueryWrapper brandWrapper = Wrappers.lambdaQuery().in(BasicdataBrandEntity::getBrandName, brandSet); + List brandEntities = brandService.list(brandWrapper); + // 将brandEntities中的数据放到map中 + brandEntities.forEach(brandEntity -> { + brandEntityMap.put(brandEntity.getBrandName(), brandEntity); + brandMap.put(brandEntity.getId().toString(), brandEntity.getBrandName()); + }); + } + + + Boolean flag = Boolean.FALSE; + for (BasicdataPriceV2Excel priceExcel : priceExcels) { + if (!ObjectUtil.isAllEmpty(priceExcel.getClient(), priceExcel.getBrand())) { + flag = Boolean.TRUE; + break; + } + } + if (flag) { + // 封装客户和品牌的关系 + if (!ObjectUtil.isAllEmpty(clientEntityMap, brandEntityMap)) { + List list = storeBrandService.list(Wrappers.lambdaQuery() + .in(BasicdataStoreBrandEntity::getClientId, clientEntityMap.values().stream().map(BasicdataClientEntity::getId).collect(Collectors.toList())) + .in(BasicdataStoreBrandEntity::getBrandId, brandEntityMap.values().stream().map(BasicdataBrandEntity::getId).collect(Collectors.toList())) + .eq(BasicdataStoreBrandEntity::getIsDeleted, 0) + ); + if (CollUtil.isNotEmpty(list)) { + list.forEach(storeBrandEntity -> { + clientBrandMap.put(clientMap.get(storeBrandEntity.getClientId().toString()) + brandMap.get(storeBrandEntity.getBrandId().toString()), storeBrandEntity); + }); + } + List priceEntities = this.list(Wrappers.lambdaQuery() + .in(BasicdataPriceEntity::getClientId, clientEntityMap.values().stream().map(BasicdataClientEntity::getId).collect(Collectors.toList())) + .in(BasicdataPriceEntity::getBrandId, brandEntityMap.values().stream().map(BasicdataBrandEntity::getId).collect(Collectors.toList())) + ); + if (CollUtil.isNotEmpty(priceEntities)) { + // 分组存入map中 + priceEntities.forEach(priceEntity -> { + checkPriceMap.computeIfAbsent(clientMap.get(priceEntity.getClientId().toString()) + brandMap.get(priceEntity.getBrandId().toString()), k -> new ArrayList<>()); + checkPriceMap.get(clientMap.get(priceEntity.getClientId().toString()) + brandMap.get(priceEntity.getBrandId().toString())).add(priceEntity); + }); + } + } + +// List priceEntities = this.baseMapper.findEntityByClientAndBrandV2(priceExcels); +// if (CollUtil.isNotEmpty(priceEntities)) { +// priceEntities.forEach(priceEntity -> { +// priceEntityMap.put(priceEntity.getClientName() + priceEntity.getBrandName(), priceEntity); +// }); +// } + } + } + + private void checkPriceData(StringBuilder message, List priceExcels, String sheet1, Map templateEntityMap, Map clientEntityMap, Map brandEntityMap, Map priceEntityMap) { + if (CollUtil.isNotEmpty(priceExcels)) { + for (int i = 0; i < priceExcels.size(); i++) { + StringBuilder rowMessage = new StringBuilder(); + int rowNum = i + 2; + String firstMessage = sheet1 + "-第" + rowNum + "行:"; + BasicdataPriceExcel priceExcel = priceExcels.get(i); + // 校验必填项 + if (StrUtil.isEmpty(priceExcel.getClientCode())) { + rowMessage.append("客户编码不能为空;"); + } else { + if (!clientEntityMap.containsKey(priceExcel.getClientCode())) { + rowMessage.append("客户编码[").append(priceExcel.getClientCode()).append("]在系统中不存在;"); + } + } + Boolean brandFlag = Boolean.FALSE; + if (StrUtil.isEmpty(priceExcel.getBrand())) { + rowMessage.append("品牌名称名称不能为空;"); + } else { + if (!brandEntityMap.containsKey(priceExcel.getBrand())) { + rowMessage.append("品牌名称[").append(priceExcel.getBrand()).append("]在系统中不存在;"); + } else { + brandFlag = Boolean.TRUE; + } + } + Boolean templateFlag = Boolean.FALSE; + if (StrUtil.isEmpty(priceExcel.getTemplateName())) { + rowMessage.append("模板名称不能为空;"); + } else { + if (!templateEntityMap.containsKey(priceExcel.getTemplateName())) { + rowMessage.append("模板名称[").append(priceExcel.getTemplateName()).append("]在系统中不存在;"); + } else { + templateFlag = Boolean.TRUE; + } + } + if (brandFlag && templateFlag) { + if (!ObjectUtil.equal(brandEntityMap.get(priceExcel.getBrand()).getId(), templateEntityMap.get(priceExcel.getTemplateName()).getBrandId())) { + rowMessage.append("品牌名称[").append(priceExcel.getBrand()).append("]与模板对应的品牌").append("不相同,请填写对应品牌的模板;"); + } + } + if (!ObjectUtil.isAllEmpty(priceExcel.getClientCode(), priceExcel.getClientCode())) { + if (!priceEntityMap.containsKey(priceExcel.getClientCode() + priceExcel.getBrand())) { + rowMessage.append("客户编码[").append(priceExcel.getClientCode()).append("]品牌名称[").append(priceExcel.getBrand()).append("]在系统价格体系中不存在,请维护客户和品牌的关系;"); + } + } + DateTime startTime = null; + DateTime endTime = null; + if (StrUtil.isNotEmpty(priceExcel.getEffectiveTime())) { + // 校验是否为日期格式 + try { + startTime = DateUtil.parseDate(priceExcel.getEffectiveTime()); + } catch (Exception e) { + rowMessage.append("生效时间格式错误,例:2020-01-01;"); + } + } + if (StrUtil.isNotEmpty(priceExcel.getExpiryTime())) { + // 校验是否为日期格式 + try { + endTime = DateUtil.parseDate(priceExcel.getExpiryTime()); + } catch (Exception e) { + rowMessage.append("到期时间格式错误,例:2020-01-01;"); + } + } + if (!ObjectUtil.isAllEmpty(startTime, endTime)) { + // 校验时间大小关系 + if (startTime.isAfter(endTime)) { + rowMessage.append("生效时间不能大于到期时间;"); + } + } + checkPrice(rowMessage, "向上判断件数", priceExcel.getDispatchUpwardJudgment()); + checkPrice(rowMessage, "向上判断加价", priceExcel.getDispatchUpwardJudgmentCost()); + checkPrice(rowMessage, "上楼费免费楼层", priceExcel.getDispatchStairsCarryingCharge()); + buildErrorMessageExcel(message, rowMessage, firstMessage); + } + if (StrUtil.isEmpty(message.toString())) { + if (CollUtil.isNotEmpty(priceEntityMap) && !ObjectUtil.equal(priceExcels.size(), priceEntityMap.size())) { + message.append(sheet1).append("中存在重复数据,请检查;"); + } + } + } + + } + + private void checkPriceDataV2(StringBuilder message, List priceExcels, String sheet1, + Map templateEntityMap, Map clientEntityMap, + Map brandEntityMap, Map priceEntityMap, + Map clientBrandMap, Map> checkPriceEntityMap) { + if (CollUtil.isNotEmpty(priceExcels)) { + Map checkRepeatMap = new HashMap<>(); + for (int i = 0; i < priceExcels.size(); i++) { + StringBuilder rowMessage = new StringBuilder(); + int rowNum = i + 2; + String firstMessage = sheet1 + "-第" + rowNum + "行:"; + BasicdataPriceV2Excel priceExcel = priceExcels.get(i); + // 校验必填项 + Boolean clientFlag = Boolean.FALSE; + if (StrUtil.isEmpty(priceExcel.getClient())) { + rowMessage.append("客户名称不能为空;"); + } else { + if (!clientEntityMap.containsKey(priceExcel.getClient())) { + rowMessage.append("客户名称[").append(priceExcel.getClient()).append("]在系统中不存在;"); + } else { + clientFlag = Boolean.TRUE; + } + } + Boolean brandFlag = Boolean.FALSE; + if (StrUtil.isEmpty(priceExcel.getBrand())) { + rowMessage.append("品牌名称名称不能为空;"); + } else { + if (!brandEntityMap.containsKey(priceExcel.getBrand())) { + rowMessage.append("品牌名称[").append(priceExcel.getBrand()).append("]在系统中不存在;"); + } else { + brandFlag = Boolean.TRUE; + } + } + checkRepeatMap.put(priceExcel.getClient() + priceExcel.getBrand(), priceExcel.getClient() + priceExcel.getBrand()); + Boolean templateFlag = Boolean.FALSE; + if (StrUtil.isEmpty(priceExcel.getTemplateName())) { + rowMessage.append("模板名称不能为空;"); + } else { + if (!templateEntityMap.containsKey(priceExcel.getTemplateName())) { + rowMessage.append("模板名称[").append(priceExcel.getTemplateName()).append("]在系统中不存在;"); + } else { + templateFlag = Boolean.TRUE; + } + } + if (brandFlag && templateFlag) { + if (!ObjectUtil.equal(brandEntityMap.get(priceExcel.getBrand()).getId(), templateEntityMap.get(priceExcel.getTemplateName()).getBrandId())) { + rowMessage.append("品牌名称[").append(priceExcel.getBrand()).append("]与模板对应的品牌").append("不相同,请填写对应品牌的模板;"); + } + } + if (!ObjectUtil.isAllEmpty(priceExcel.getClient(), priceExcel.getBrand())) { + if (!clientBrandMap.containsKey(priceExcel.getClient() + priceExcel.getBrand())) { + rowMessage.append("客户名称[").append(priceExcel.getClient()).append("]下不存在品牌名称[").append(priceExcel.getBrand()).append("],请维护客户和品牌的关系;"); + } + } + DateTime startTime = null; + DateTime endTime = null; + if (StrUtil.isNotEmpty(priceExcel.getEffectiveTime())) { + // 校验是否为日期格式 + try { + startTime = DateUtil.parseDate(priceExcel.getEffectiveTime()); + } catch (Exception e) { + rowMessage.append("生效时间格式错误,例:2020-01-01;"); + } + } + if (StrUtil.isNotEmpty(priceExcel.getExpiryTime())) { + // 校验是否为日期格式 + try { + endTime = DateUtil.parseDate(priceExcel.getExpiryTime()); + } catch (Exception e) { + rowMessage.append("到期时间格式错误,例:2020-01-01;"); + } + } + if (!ObjectUtil.isAllEmpty(startTime, endTime)) { + // 校验时间大小关系 + if (startTime.isAfter(endTime)) { + rowMessage.append("生效时间不能大于到期时间;"); + } else { + // 校验时间是否合法 + // 1 输入的截至时间不能小于当前时间 + if (endTime.isBefore(DateUtil.beginOfDay(DateUtil.date()))) { + rowMessage.append("到期时间不能小于当前时间;"); + } + // 2 当前输入的时间范围不能跨越2个已有的价格体系 + if (clientFlag && brandFlag) { + int dataFlag = 0; + List priceEntities = checkPriceEntityMap.get(priceExcel.getClient() + priceExcel.getBrand()); + if (CollUtil.isNotEmpty(priceEntities)) { + Date start1 = startTime; + Date end1 = endTime; + for (BasicdataPriceEntity priceEntity : priceEntities) { + Date start2 = priceEntity.getEffectiveTime(); + Date end2 = priceEntity.getExpiryTime(); + if (start1.after(priceEntity.getEffectiveTime())) { + // 交换 interval1 的开始和结束时间 + Date temp = start1; + start1 = start2; + start2 = temp; + temp = end1; + end1 = end2; + end2 = temp; + } + // 计算交集 + if (!end1.before(start2)) { + // 如果有交集 + dataFlag += 1; + // 把存在交集的价格体系放到内存中供后续使用 + if (!ObjectUtil.isAllEmpty(priceExcel.getClient(), priceExcel.getBrand())) { + priceEntityMap.put(priceExcel.getClient() + priceExcel.getBrand(), priceEntity); + } + } + + } + } + if (dataFlag > 1) { + rowMessage.append("生效时间与截至时间范围在系统中存在多个价格体系,请确认;"); + } + } + } + } + buildErrorMessageExcel(message, rowMessage, firstMessage); + } + if (StrUtil.isEmpty(message.toString())) { + if (CollUtil.isNotEmpty(checkRepeatMap) && !ObjectUtil.equal(priceExcels.size(), checkRepeatMap.size())) { + message.append(sheet1).append("中存在 客户名称+品牌 重复的数据,请检查;"); + } + } + } + + } + + private void checkPrice(StringBuilder rowMessage, String cloumName, String price) { + if (StrUtil.isNotEmpty(price)) { + if (!NumberUtil.isNumber(price)) { + rowMessage.append(cloumName).append("只能为数字;"); + } + } + } + + private void buildDetailMap(BasicdataPriceEntity priceEntity, Map> fullMap, Map> basicMap, Map> warehouseMap, Map> dispatchMap, Map> generalMap) { + // 获取整车数据 + List list = fullVehicleService.list(Wrappers.lambdaQuery() + .eq(BasicdataPriceFullVehicleEntity::getBoId, priceEntity.getId())); + if (CollUtil.isNotEmpty(list)) { + // 按类型分组放到fullMap中 + list.forEach(item -> { + Integer type = item.getType(); + if (ObjectUtil.isNotNull(fullMap)) { + List collect = fullMap.get(type); + if (ObjectUtil.isEmpty(collect)) { + collect = new ArrayList<>(); + } + collect.add(item); + fullMap.put(type, collect); + } + }); + } + // 获取品类数据 + List basicList = categoryBasicService.list(Wrappers.lambdaQuery() + .eq(BasicdataPriceCategoryBasicEntity::getBoId, priceEntity.getId())); + if (CollUtil.isNotEmpty(basicList)) { + // 按类型分组放到basicMap中 + basicList.forEach(item -> { + Integer type = item.getServiceType(); + List collect = basicMap.get(type); + if (ObjectUtil.isEmpty(collect)) { + collect = new ArrayList<>(); + } + collect.add(item); + basicMap.put(type, collect); + }); + } + + List warehouseList = categoryWarehouseService.list(Wrappers.lambdaQuery() + .eq(BasicdataPriceCategoryWarehouseEntity::getBoId, priceEntity.getId())); + if (CollUtil.isNotEmpty(warehouseList)) { + // 按类型分组放到warehouseMap中 + warehouseList.forEach(item -> { + Integer type = item.getCostType(); + List collect = warehouseMap.get(type); + if (ObjectUtil.isEmpty(collect)) { + collect = new ArrayList<>(); + } + collect.add(item); + warehouseMap.put(type, collect); + }); + } + + initDispatchMap(priceEntity, dispatchMap); + // 获取一般费用 + + List generalList = generalService.list(Wrappers.lambdaQuery() + .eq(BasicdataPriceGeneralEntity::getBoId, priceEntity.getId())); + if (CollUtil.isNotEmpty(generalList)) { + // 按类型分组放到generalMap中 + generalList.forEach(item -> { + Integer type = item.getServiceType(); + List collect = generalMap.get(type); + if (ObjectUtil.isEmpty(collect)) { + collect = new ArrayList<>(); + } + collect.add(item); + generalMap.put(type, collect); + }); + } + } + + private void initDispatchMap(BasicdataPriceEntity priceEntity, Map> dispatchMap) { + List dispatchList = categoryDispatchService.list(Wrappers.lambdaQuery() + .eq(BasicdataPriceCategoryDispatchEntity::getBoId, priceEntity.getId())); + if (CollUtil.isNotEmpty(dispatchList)) { + // 按类型分组放到dispatchMap中 + dispatchList.forEach(item -> { + Integer type = item.getCostType(); + List collect = dispatchMap.get(type); + if (ObjectUtil.isEmpty(collect)) { + collect = new ArrayList<>(); + } + collect.add(item); + dispatchMap.put(type, collect); + }); + } + } + + private PriceDispatchVO initDispatch(BasicdataPriceEntity priceEntity, BasicdataPriceTemplateEntity templateEntity, List fullVehicleEntities, Map> dispatchMap, List generalEntities, List generalEntities1) { + PriceDispatchVO priceDispatchVO = new PriceDispatchVO(); + String dispatchPricingType = templateEntity.getDispatchPricingType(); + // 品类 + Map> categoryBasicMap = new HashMap<>(); + List dispatchEntities = dispatchMap.get(CostTypeEnums.NOMAL.getCode()); + if (CollUtil.isNotEmpty(dispatchEntities)) { + // 将数据放到categoryBasicMap中 + dispatchEntities.forEach(item -> { + Integer type = item.getType(); + List collect = categoryBasicMap.get(type); + if (ObjectUtil.isEmpty(collect)) { + collect = new ArrayList<>(); + } + collect.add(item); + categoryBasicMap.put(type, collect); + }); + } + if (ObjectUtil.isNotEmpty(dispatchPricingType)) { + // 整车 + if (ObjectUtil.contains(dispatchPricingType, DispatchPricingTypeEnums.COMPLETE_VEHICLE.getCode().toString())) { + if (CollUtil.isNotEmpty(fullVehicleEntities)) { + List basicVOList = new ArrayList<>(); + fullVehicleEntities.forEach(item -> { + BasicdataPriceFullVehicleVO basicVO = new BasicdataPriceFullVehicleVO(); + BeanUtil.copyProperties(item, basicVO); + basicVOList.add(basicVO); + }); + priceDispatchVO.setFullVehicle(basicVOList); + } + } + // 按件 + if (ObjectUtil.contains(dispatchPricingType, DispatchPricingTypeEnums.PIECE.getCode().toString())) { + List basicVOList = new ArrayList<>(); + List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.PIECE.getCode()); + if (CollUtil.isNotEmpty(basicEntities)) { + basicEntities.forEach(item -> { + PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); + BeanUtil.copyProperties(item, basicVO); + basicVOList.add(basicVO); + }); + } + priceDispatchVO.setPieceCategory(basicVOList); + } + // 按重量 + if (ObjectUtil.contains(dispatchPricingType, DispatchPricingTypeEnums.WEIGHT.getCode().toString())) { + List basicVOList = new ArrayList<>(); + List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.WEIGHT.getCode()); + if (CollUtil.isNotEmpty(basicEntities)) { + basicEntities.forEach(item -> { + PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); + BeanUtil.copyProperties(item, basicVO); + basicVOList.add(basicVO); + }); + } + priceDispatchVO.setWeightCategory(basicVOList); + } + // 按方 + if (ObjectUtil.contains(dispatchPricingType, DispatchPricingTypeEnums.CUBE.getCode().toString())) { + List basicVOList = new ArrayList<>(); + List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.CUBE.getCode()); + if (CollUtil.isNotEmpty(basicEntities)) { + basicEntities.forEach(item -> { + PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); + BeanUtil.copyProperties(item, basicVO); + basicVOList.add(basicVO); + }); + } + priceDispatchVO.setCubeCategory(basicVOList); + } + // 按公里 + if (ObjectUtil.contains(dispatchPricingType, DispatchPricingTypeEnums.KILOMETER.getCode().toString())) { + List basicVOList = new ArrayList<>(); + List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.KILOMETER.getCode()); + if (CollUtil.isNotEmpty(basicEntities)) { + basicEntities.forEach(item -> { + PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); + BeanUtil.copyProperties(item, basicVO); + basicVOList.add(basicVO); + }); + } + priceDispatchVO.setKilometerCost(basicVOList); + } + // 按吨 + if (ObjectUtil.contains(dispatchPricingType, DispatchPricingTypeEnums.TON.getCode().toString())) { + List basicVOList = new ArrayList<>(); + List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.TON.getCode()); + if (CollUtil.isNotEmpty(basicEntities)) { + basicEntities.forEach(item -> { + PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); + BeanUtil.copyProperties(item, basicVO); + basicVOList.add(basicVO); + }); + } + priceDispatchVO.setTonCost(basicVOList); + } + // 按吨公里 + if (ObjectUtil.contains(dispatchPricingType, DispatchPricingTypeEnums.TON_PER_KILOMETER.getCode().toString())) { + List basicVOList = new ArrayList<>(); + List basicEntities = categoryBasicMap.get(DispatchPricingTypeEnums.TON_PER_KILOMETER.getCode()); + if (CollUtil.isNotEmpty(basicEntities)) { + basicEntities.forEach(item -> { + PriceDispatchBasicVO basicVO = new PriceDispatchBasicVO(); + BeanUtil.copyProperties(item, basicVO); + basicVOList.add(basicVO); + }); + } + priceDispatchVO.setTonKilometerCost(basicVOList); + } + } + + // 附加费 + priceDispatchVO.setAdditionalCategory(buildDispatchAddFee(dispatchMap)); + // 一般费用 generalEntities + if (CollUtil.isNotEmpty(generalEntities)) { + BasicdataPriceGeneralEntity generalEntity = generalEntities.get(0); + if (ObjectUtil.isNotEmpty(generalEntity)) { + priceDispatchVO.setMinCost(generalEntity.getMinCost()); + priceDispatchVO.setAdditionalCost(generalEntity.getAdditionalCost()); + } + } + if (CollUtil.isNotEmpty(generalEntities1)) { + BasicdataPriceGeneralEntity generalEntity = generalEntities1.get(0); + if (ObjectUtil.isNotEmpty(generalEntity)) { + priceDispatchVO.setLeaveBehindMinCost(generalEntity.getMinCost()); + priceDispatchVO.setLeaveBehindAdditionalCost(generalEntity.getAdditionalCost()); + } + } + // 设置基础费用 + if (ObjectUtil.isNotEmpty(priceEntity)) { + priceDispatchVO.setDispatchUpwardJudgment(priceEntity.getDispatchUpwardJudgment()); + priceDispatchVO.setDispatchUpwardJudgmentCost(priceEntity.getDispatchUpwardJudgmentCost()); + priceDispatchVO.setDispatchStairsCarryingCharge(priceEntity.getDispatchStairsCarryingCharge()); + } + return priceDispatchVO; + } + + private static List buildDispatchAddFee(Map> dispatchMap) { + List dispatchEntities1 = dispatchMap.get(CostTypeEnums.ADD.getCode()); + if (CollUtil.isNotEmpty(dispatchEntities1)) { + List basicVOList = new ArrayList<>(); + dispatchEntities1.forEach(item -> { + PriceDispatchAdditionalVO basicVO = new PriceDispatchAdditionalVO(); + BeanUtil.copyProperties(item, basicVO); + basicVOList.add(basicVO); + }); + return basicVOList; + } + return null; + } + + private PriceWarehouseVO initWarehouse(BasicdataPriceEntity priceEntity, BasicdataPriceTemplateEntity templateEntity, Map> warehouseMap) { + PriceWarehouseVO priceWarehouseVO = new PriceWarehouseVO(); + Integer warehousePricingType = templateEntity.getWarehousePricingType(); + Map> categoryBasicMap = new HashMap<>(); + List warehouseEntities = warehouseMap.get(CostTypeEnums.NOMAL.getCode()); + if (CollUtil.isNotEmpty(warehouseEntities)) { + warehouseEntities.forEach(item -> { + Integer type = item.getType(); + List collect = categoryBasicMap.get(type); + if (ObjectUtil.isEmpty(collect)) { + collect = new ArrayList<>(); + } + collect.add(item); + categoryBasicMap.put(type, collect); + }); + } + if (ObjectUtil.isNotEmpty(warehousePricingType)) { + // 按件 + if (ObjectUtil.equal(warehousePricingType, WarehousePricingTypeEnums.PIECE.getCode())) { + List warehouseEntities1 = categoryBasicMap.get(WarehousePricingTypeEnums.PIECE.getCode()); + if (CollUtil.isNotEmpty(warehouseEntities1)) { + List basicVOS = warehouseEntities1.stream().map(item -> { + PriceWarehouseBasicVO basicVO = new PriceWarehouseBasicVO(); + BeanUtil.copyProperties(item, basicVO); + return basicVO; + }).collect(Collectors.toList()); + priceWarehouseVO.setCatergory(basicVOS); + } + } else if (ObjectUtil.equal(warehousePricingType, WarehousePricingTypeEnums.CUBE.getCode())) { + List warehouseEntities2 = categoryBasicMap.get(WarehousePricingTypeEnums.CUBE.getCode()); + if (CollUtil.isNotEmpty(warehouseEntities2)) { + List basicVOS = warehouseEntities2.stream().map(item -> { + PriceWarehouseBasicVO basicVO = new PriceWarehouseBasicVO(); + BeanUtil.copyProperties(item, basicVO); + return basicVO; + }).collect(Collectors.toList()); + priceWarehouseVO.setCatergory(basicVOS); + } + } else if (ObjectUtil.equal(warehousePricingType, WarehousePricingTypeEnums.WEIGHT.getCode())) { + List warehouseEntities3 = categoryBasicMap.get(WarehousePricingTypeEnums.WEIGHT.getCode()); + if (CollUtil.isNotEmpty(warehouseEntities3)) { + List basicVOS = warehouseEntities3.stream().map(item -> { + PriceWarehouseBasicVO basicVO = new PriceWarehouseBasicVO(); + BeanUtil.copyProperties(item, basicVO); + return basicVO; + }).collect(Collectors.toList()); + priceWarehouseVO.setCatergory(basicVOS); + } + } else if (ObjectUtil.equal(warehousePricingType, WarehousePricingTypeEnums.TONNE.getCode())) { + List warehouseEntities4 = categoryBasicMap.get(WarehousePricingTypeEnums.TONNE.getCode()); + if (CollUtil.isNotEmpty(warehouseEntities4)) { + List basicVOS = warehouseEntities4.stream().map(item -> { + PriceWarehouseBasicVO basicVO = new PriceWarehouseBasicVO(); + BeanUtil.copyProperties(item, basicVO); + return basicVO; + }).collect(Collectors.toList()); + priceWarehouseVO.setCatergory(basicVOS); + } + } + } + + // 附加费 + List warehouseEntities1 = warehouseMap.get(CostTypeEnums.ADD.getCode()); + if (CollUtil.isNotEmpty(warehouseEntities1)) { List additionalVOS = warehouseEntities1.stream().map(item -> { PriceWarehouseAdditionalVO additionalVO = new PriceWarehouseAdditionalVO(); BeanUtil.copyProperties(item, additionalVO); @@ -668,50 +3848,52 @@ public class BasicdataPriceServiceImpl extends BaseServiceImpl fullVehicleVOS = fullVehicleEntities.stream().map(item -> { - BasicdataPriceFullVehicleVO basicdataPriceFullVehicleVO = new BasicdataPriceFullVehicleVO(); - BeanUtil.copyProperties(item, basicdataPriceFullVehicleVO); - return basicdataPriceFullVehicleVO; - }).collect(Collectors.toList()); - priceTrunkLineVO.setFullVehicle(fullVehicleVOS); - } - } - // 设置按件 - if (trunklinePricingType.contains(TrunkLinePricingTypeEnums.PIECE.getCode().toString())) { - List categoryBasicEntityList = categoryBasicMap.get(TrunkLinePricingTypeEnums.PIECE.getCode()); - if (CollUtil.isNotEmpty(categoryBasicEntityList)) { - List pieceCategoryVOS = categoryBasicEntityList.stream().map(item -> { - PriceBasicVO priceBasicVO = new PriceBasicVO(); - BeanUtil.copyProperties(item, priceBasicVO); - return priceBasicVO; - }).collect(Collectors.toList()); - priceTrunkLineVO.setPieceCategory(pieceCategoryVOS); - } - } - // 设置按方 - if (trunklinePricingType.contains(TrunkLinePricingTypeEnums.CUBE.getCode().toString())) { - List categoryBasicEntityList = categoryBasicMap.get(TrunkLinePricingTypeEnums.CUBE.getCode()); - if (CollUtil.isNotEmpty(categoryBasicEntityList)) { - List cubeCategoryVOS = categoryBasicEntityList.stream().map(item -> { - PriceBasicVO priceBasicVO = new PriceBasicVO(); - BeanUtil.copyProperties(item, priceBasicVO); - return priceBasicVO; - }).collect(Collectors.toList()); - priceTrunkLineVO.setCubeCategory(cubeCategoryVOS); - } - } - // 设置重量 - if (trunklinePricingType.contains(TrunkLinePricingTypeEnums.WEIGHT.getCode().toString())) { - List categoryBasicEntityList = categoryBasicMap.get(TrunkLinePricingTypeEnums.WEIGHT.getCode()); - if (CollUtil.isNotEmpty(categoryBasicEntityList)) { - List weightCategoryVOS = categoryBasicEntityList.stream().map(item -> { - PriceBasicVO priceBasicVO = new PriceBasicVO(); - BeanUtil.copyProperties(item, priceBasicVO); - return priceBasicVO; - }).collect(Collectors.toList()); - priceTrunkLineVO.setWeightCategory(weightCategoryVOS); + if (StrUtil.isNotEmpty(trunklinePricingType)) { + if (trunklinePricingType.contains(TrunkLinePricingTypeEnums.COMPLETE_VEHICLE.getCode().toString())) { + if (CollUtil.isNotEmpty(fullVehicleEntities)) { + List fullVehicleVOS = fullVehicleEntities.stream().map(item -> { + BasicdataPriceFullVehicleVO basicdataPriceFullVehicleVO = new BasicdataPriceFullVehicleVO(); + BeanUtil.copyProperties(item, basicdataPriceFullVehicleVO); + return basicdataPriceFullVehicleVO; + }).collect(Collectors.toList()); + priceTrunkLineVO.setFullVehicle(fullVehicleVOS); + } + } + // 设置按件 + if (trunklinePricingType.contains(TrunkLinePricingTypeEnums.PIECE.getCode().toString())) { + List categoryBasicEntityList = categoryBasicMap.get(TrunkLinePricingTypeEnums.PIECE.getCode()); + if (CollUtil.isNotEmpty(categoryBasicEntityList)) { + List pieceCategoryVOS = categoryBasicEntityList.stream().map(item -> { + PriceBasicVO priceBasicVO = new PriceBasicVO(); + BeanUtil.copyProperties(item, priceBasicVO); + return priceBasicVO; + }).collect(Collectors.toList()); + priceTrunkLineVO.setPieceCategory(pieceCategoryVOS); + } + } + // 设置按方 + if (trunklinePricingType.contains(TrunkLinePricingTypeEnums.CUBE.getCode().toString())) { + List categoryBasicEntityList = categoryBasicMap.get(TrunkLinePricingTypeEnums.CUBE.getCode()); + if (CollUtil.isNotEmpty(categoryBasicEntityList)) { + List cubeCategoryVOS = categoryBasicEntityList.stream().map(item -> { + PriceBasicVO priceBasicVO = new PriceBasicVO(); + BeanUtil.copyProperties(item, priceBasicVO); + return priceBasicVO; + }).collect(Collectors.toList()); + priceTrunkLineVO.setCubeCategory(cubeCategoryVOS); + } + } + // 设置重量 + if (trunklinePricingType.contains(TrunkLinePricingTypeEnums.WEIGHT.getCode().toString())) { + List categoryBasicEntityList = categoryBasicMap.get(TrunkLinePricingTypeEnums.WEIGHT.getCode()); + if (CollUtil.isNotEmpty(categoryBasicEntityList)) { + List weightCategoryVOS = categoryBasicEntityList.stream().map(item -> { + PriceBasicVO priceBasicVO = new PriceBasicVO(); + BeanUtil.copyProperties(item, priceBasicVO); + return priceBasicVO; + }).collect(Collectors.toList()); + priceTrunkLineVO.setWeightCategory(weightCategoryVOS); + } } } Integer pickupIsMinCost = templateEntity.getPickupIsMinCost(); @@ -736,50 +3918,52 @@ public class BasicdataPriceServiceImpl extends BaseServiceImpl fullVehicleVOS = fullVehicleEntities.stream().map(item -> { - BasicdataPriceFullVehicleVO basicdataPriceFullVehicleVO = new BasicdataPriceFullVehicleVO(); - BeanUtil.copyProperties(item, basicdataPriceFullVehicleVO); - return basicdataPriceFullVehicleVO; - }).collect(Collectors.toList()); - pricePickupVO.setFullVehicle(fullVehicleVOS); + if (StrUtil.isNotEmpty(pickupPricingType)) { + if (pickupPricingType.contains(PickupPricingTypeEnums.COMPLETE_VEHICLE.getCode().toString())) { + if (CollUtil.isNotEmpty(fullVehicleEntities)) { + List fullVehicleVOS = fullVehicleEntities.stream().map(item -> { + BasicdataPriceFullVehicleVO basicdataPriceFullVehicleVO = new BasicdataPriceFullVehicleVO(); + BeanUtil.copyProperties(item, basicdataPriceFullVehicleVO); + return basicdataPriceFullVehicleVO; + }).collect(Collectors.toList()); + pricePickupVO.setFullVehicle(fullVehicleVOS); + } } - } - // 按件 - if (pickupPricingType.contains(PickupPricingTypeEnums.PIECE.getCode().toString())) { - List categoryBasicEntityList = categoryBasicMap.get(PickupPricingTypeEnums.PIECE.getCode()); - if (CollUtil.isNotEmpty(categoryBasicEntityList)) { - List basicVOS = categoryBasicEntities.stream().map(item -> { - PriceBasicVO basicVO = new PriceBasicVO(); - BeanUtil.copyProperties(item, basicVO); - return basicVO; - }).collect(Collectors.toList()); - pricePickupVO.setPieceCategory(basicVOS); + // 按件 + if (pickupPricingType.contains(PickupPricingTypeEnums.PIECE.getCode().toString())) { + List categoryBasicEntityList = categoryBasicMap.get(PickupPricingTypeEnums.PIECE.getCode()); + if (CollUtil.isNotEmpty(categoryBasicEntityList)) { + List basicVOS = categoryBasicEntityList.stream().map(item -> { + PriceBasicVO basicVO = new PriceBasicVO(); + BeanUtil.copyProperties(item, basicVO); + return basicVO; + }).collect(Collectors.toList()); + pricePickupVO.setPieceCategory(basicVOS); + } } - } - // 按方 - if (pickupPricingType.contains(PickupPricingTypeEnums.CUBE.getCode().toString())) { - List categoryBasicEntityList = categoryBasicMap.get(PickupPricingTypeEnums.CUBE.getCode()); - if (CollUtil.isNotEmpty(categoryBasicEntityList)) { - List basicVOS = categoryBasicEntityList.stream().map(item -> { - PriceBasicVO basicVO = new PriceBasicVO(); - BeanUtil.copyProperties(item, basicVO); - return basicVO; - }).collect(Collectors.toList()); - pricePickupVO.setCubeCategory(basicVOS); + // 按方 + if (pickupPricingType.contains(PickupPricingTypeEnums.CUBE.getCode().toString())) { + List categoryBasicEntityList = categoryBasicMap.get(PickupPricingTypeEnums.CUBE.getCode()); + if (CollUtil.isNotEmpty(categoryBasicEntityList)) { + List basicVOS = categoryBasicEntityList.stream().map(item -> { + PriceBasicVO basicVO = new PriceBasicVO(); + BeanUtil.copyProperties(item, basicVO); + return basicVO; + }).collect(Collectors.toList()); + pricePickupVO.setCubeCategory(basicVOS); + } } - } - // 按重量 - if (pickupPricingType.contains(PickupPricingTypeEnums.WEIGHT.getCode().toString())) { - List categoryBasicEntityList = categoryBasicMap.get(PickupPricingTypeEnums.WEIGHT.getCode()); - if (CollUtil.isNotEmpty(categoryBasicEntityList)) { - List basicVOS = categoryBasicEntityList.stream().map(item -> { - PriceBasicVO basicVO = new PriceBasicVO(); - BeanUtil.copyProperties(item, basicVO); - return basicVO; - }).collect(Collectors.toList()); - pricePickupVO.setWeightCategory(basicVOS); + // 按重量 + if (pickupPricingType.contains(PickupPricingTypeEnums.WEIGHT.getCode().toString())) { + List categoryBasicEntityList = categoryBasicMap.get(PickupPricingTypeEnums.WEIGHT.getCode()); + if (CollUtil.isNotEmpty(categoryBasicEntityList)) { + List basicVOS = categoryBasicEntityList.stream().map(item -> { + PriceBasicVO basicVO = new PriceBasicVO(); + BeanUtil.copyProperties(item, basicVO); + return basicVO; + }).collect(Collectors.toList()); + pricePickupVO.setWeightCategory(basicVOS); + } } } Integer pickupIsMinCost = templateEntity.getPickupIsMinCost(); diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceTemplateServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceTemplateServiceImpl.java index f4312e4d2..b52380c4a 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceTemplateServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataPriceTemplateServiceImpl.java @@ -21,7 +21,9 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.logpm.basicdata.entity.BasicdataPriceTemplateEntity; import com.logpm.basicdata.enums.DispatchTypeEnums; import com.logpm.basicdata.enums.MinCostTypeEnums; @@ -160,6 +162,7 @@ public class BasicdataPriceTemplateServiceImpl extends BaseServiceImpl wrapper = Wrappers.lambdaQuery() + .eq(BasicdataPriceTemplateEntity::getName, name); + if (ObjectUtil.isNotEmpty(id)) { + wrapper.ne(BasicdataPriceTemplateEntity::getId, id); + } + BasicdataPriceTemplateEntity one = this.getOne(wrapper + .last("limit 1") + ); + if (ObjectUtil.isNotEmpty(one)) { + throw new ServiceException("模版名称重复,请检查"); + } + } + @Override public BasicdataPriceTemplateVO detail(Long id) { BasicdataPriceTemplateEntity detail = this.getById(id); @@ -224,9 +242,10 @@ public class BasicdataPriceTemplateServiceImpl extends BaseServiceImpl implements IBasicdataStoreContactService { + @Autowired + @Lazy + private IBasicdataClientService basicdataClientService; + + @Override public IPage selectBasicdataStoreContactPage(IPage page, BasicdataStoreContactVO basicdataStoreContact) { return page.setRecords(baseMapper.selectBasicdataStoreContactPage(page, basicdataStoreContact)); @@ -61,14 +72,28 @@ public class BasicdataStoreContactServiceImpl extends BaseServiceImpl storeContactEntities = baseMapper.selectList(Wrappers.query().lambda() .eq(BasicdataStoreContactEntity::getShopId, basicdataStoreContact.getShopId()) ); - storeContactEntities.forEach( i ->{ - if(i.getShopId().equals(basicdataStoreContact.getShopId())){ - this.updateById(basicdataStoreContact); - }else{ - i.setDefaultType(false); - this.updateById(i); + if (!basicdataStoreContact.getDefaultType()){ + boolean flag = storeContactEntities.stream().filter(f->!f.getId().equals(basicdataStoreContact.getId())).allMatch(b -> b.getDefaultType().equals(false)); + if (flag){ + throw new RuntimeException("商场必须存在一个默认联系人"); } - }); + } + List ids = storeContactEntities.stream().filter(f -> !f.getId().equals(basicdataStoreContact.getId())).map(BasicdataStoreContactEntity::getId).collect(Collectors.toList()); + if (!ids.isEmpty()) { + this.update(Wrappers.update().lambda() + .in(BasicdataStoreContactEntity::getId,ids) + .set(BasicdataStoreContactEntity::getDefaultType,false) + ); + } + List collected = storeContactEntities.stream().filter(f -> f.getId().equals(basicdataStoreContact.getId())).collect(Collectors.toList()); + + //修改客户的展示联系人为默认联系人 + basicdataClientService.update(Wrappers.update().lambda() + .eq(BasicdataClientEntity::getId,collected.get(0).getShopId()) + .set(BasicdataClientEntity::getLinkman,collected.get(0).getLinkman()) + .set(BasicdataClientEntity::getPhone,collected.get(0).getPhone()) + ); + this.updateById(basicdataStoreContact); return true; }catch (Exception e){ log.info("报错信息:{}",e.getMessage()); @@ -77,4 +102,9 @@ public class BasicdataStoreContactServiceImpl extends BaseServiceImpl pageList(IPage page, Map basicdataStoreContact) { + return baseMapper.pageList(page,basicdataStoreContact); + } + } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataTrayServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataTrayServiceImpl.java index fe249e30f..d43c25166 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataTrayServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataTrayServiceImpl.java @@ -18,7 +18,6 @@ package com.logpm.basicdata.service.impl; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.alibaba.nacos.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -44,7 +43,6 @@ import com.logpm.warehouse.vo.WarehouseTraybarCode; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springblade.common.constant.CodeNumConstant; -import org.springblade.common.constant.DictBizConstant; import org.springblade.common.utils.QRCodeUtil; import org.springblade.common.utils.TemplateUtil; import org.springblade.core.log.exception.ServiceException; @@ -53,15 +51,10 @@ import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; -import org.springblade.system.cache.DictBizCache; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import sun.misc.BASE64Encoder; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -127,7 +120,7 @@ public class BasicdataTrayServiceImpl extends BaseServiceImpl map = JSONObject.parseObject(JSONObject.toJSONString(trayQRCode), Map.class); String filename = QRCodeUtil.createCodeToFile(trayQRCode.getTrayCode()); - map.put("qrCode", getEmpAutograph(filename)); + map.put("qrCode", QRCodeUtil.getEmpAutograph(filename)); String fileTypeName = QRCodeUtil.createCodeToFileType(trayQRCode.getTrayCode()); - map.put("imgType", getEmpAutograph(fileTypeName)); + map.put("imgType", QRCodeUtil.getEmpAutograph(fileTypeName)); map.put("tenant","汇通物流"); data.add(map); } @@ -243,29 +237,7 @@ public class BasicdataTrayServiceImpl extends BaseServiceImpl getOwn() { return baseMapper.getOwn(); } + + @Override + public Long getClientIdByNameAndBrandAndCode(String name, String code, String brand) { + if("".equals(code)){ + code=null; + } + + return baseMapper.getClientIdByNameAndBrandAndCode(name,code,brand); + } } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataVehicleServiceImpl.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataVehicleServiceImpl.java index bbf71beca..0ee8808a0 100644 --- a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataVehicleServiceImpl.java +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/service/impl/BasicdataVehicleServiceImpl.java @@ -18,6 +18,7 @@ package com.logpm.basicdata.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.BeanUtils; @@ -51,6 +52,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -141,14 +143,49 @@ public class BasicdataVehicleServiceImpl extends BaseServiceImpl getVehicleList() { List list = this.list(); List basicdataVehicleVOS = new ArrayList<>(); + + if(Func.isEmpty(list)){ + return null; + } + // 查询所有的iD + List ids = list.stream() // 创建一个流 + .map(BasicdataVehicleEntity::getId) // 使用map方法获取每个对象的ID + .collect(Collectors.toList()); // 使用collect方法将ID收集到一个新的List中 + + LambdaQueryWrapper queryWrapper = Wrappers.query().lambda().in(BasicdataDrivermiddleEntity::getBrandId, ids); + List list1 = basicdataDrivermiddleService.list(queryWrapper); + + Map> groupedEntities = + list1.stream() + .collect(Collectors.groupingBy(BasicdataDrivermiddleEntity::getBrandId)); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("is_deleted",0); + List basicdataDriverArteryEntities1 = basicdataDriverArteryMapper.selectList(queryWrapper1); + if (Func.isNotEmpty(list)){ list.forEach(l->{ BasicdataVehicleVO vehicleVO = Func.copy(l, BasicdataVehicleVO.class); - List driverIds = basicdataDrivermiddleService.list(Wrappers.query().lambda().eq(BasicdataDrivermiddleEntity::getBrandId, vehicleVO.getId())).stream().filter(f -> Func.isNotEmpty(f.getDriverId())).map(BasicdataDrivermiddleEntity::getDriverId).collect(Collectors.toList()); - if (Func.isNotEmpty(driverIds)){ - List basicdataDriverArteryEntities = basicdataDriverArteryMapper.selectList(Wrappers.query().lambda().in(BasicdataDriverArteryEntity::getId,driverIds)); - vehicleVO.setDriverArteryEntityList(basicdataDriverArteryEntities); + List basicdataDrivermiddleEntities = groupedEntities.get(vehicleVO.getId()); + if(Func.isNotEmpty(basicdataDrivermiddleEntities)){ + List driverIds = basicdataDrivermiddleEntities. + stream().filter(f -> Func.isNotEmpty(f.getDriverId())).map(BasicdataDrivermiddleEntity::getDriverId).collect(Collectors.toList()); + if (Func.isNotEmpty(driverIds)){ + + List basicdataDriverArteryEntities = new ArrayList(); + for (Long driverId : driverIds) { + basicdataDriverArteryEntities1.forEach(e->{ + if (driverId.equals(e.getId())){ + basicdataDriverArteryEntities.add(e); + } + }); + } + + vehicleVO.setDriverArteryEntityList(basicdataDriverArteryEntities); + } } + + basicdataVehicleVOS.add(vehicleVO); }); } @@ -215,8 +252,8 @@ public class BasicdataVehicleServiceImpl extends BaseServiceImpl>>:{}",driverArteryEntity.getPhone()); //绑定用户 basicdataDrivermiddleEntity = new BasicdataDrivermiddleEntity(); - basicdataDrivermiddleEntity.setDriverId(driverArteryEntity.getId());; - } + basicdataDrivermiddleEntity.setDriverId(driverArteryEntity.getId()); + } } } diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/util/EasyExcelUtil.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/util/EasyExcelUtil.java new file mode 100644 index 000000000..a92255ba5 --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/util/EasyExcelUtil.java @@ -0,0 +1,81 @@ +package com.logpm.basicdata.util; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.read.builder.ExcelReaderBuilder; +import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder; +import com.alibaba.excel.read.listener.ReadListener; +import org.springblade.core.excel.listener.DataListener; +import org.springblade.core.excel.support.ExcelException; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +/** + * easyexcel 读数据工具类 + * + * @author zhaoqiaobo + * @create 2024-04-24 + */ +public class EasyExcelUtil { + public static List read(MultipartFile excel, Class clazz) { + DataListener dataListener = new DataListener(); + ExcelReaderBuilder builder = getReaderBuilder(excel, dataListener, clazz); + if (builder == null) { + return null; + } else { + builder.doReadAll(); + return dataListener.getDataList(); + } + } + + public static List read(MultipartFile excel, int sheetNo, Class clazz) { + return read(excel, sheetNo, 1, clazz); + } + + public static List readTrim(MultipartFile excel, int sheetNo, Class clazz) { + return readTrim(excel, sheetNo, 1, clazz); + } + + public static List read(MultipartFile excel, int sheetNo, int headRowNumber, Class clazz) { + DataListener dataListener = new DataListener(); + ExcelReaderBuilder builder = getReaderBuilder(excel, dataListener, clazz); + if (builder == null) { + return null; + } else { + builder.sheet(sheetNo).headRowNumber(headRowNumber).doRead(); + return dataListener.getDataList(); + } + } + public static List readTrim(MultipartFile excel, int sheetNo, int headRowNumber, Class clazz) { + DataListener dataListener = new DataListener(); + ExcelReaderBuilder builder = getReaderBuilder(excel, dataListener, clazz); + if (builder == null) { + return null; + } else { + builder.sheet(sheetNo).headRowNumber(headRowNumber).registerConverter(new TrimConverter()).doRead(); + return dataListener.getDataList(); + } + } + + public static ExcelReaderBuilder getReaderBuilder(MultipartFile excel, ReadListener readListener, Class clazz) { + String filename = excel.getOriginalFilename(); + if (StrUtil.isEmpty(filename)) { + throw new ExcelException("请上传文件!"); + } else if (!StringUtils.endsWithIgnoreCase(filename, ".xls") && !StringUtils.endsWithIgnoreCase(filename, ".xlsx")) { + throw new ExcelException("请上传正确的excel文件!"); + } else { + try { + InputStream inputStream = new BufferedInputStream(excel.getInputStream()); + return EasyExcel.read(inputStream, clazz, readListener); + } catch (IOException var6) { + var6.printStackTrace(); + return null; + } + } + } +} diff --git a/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/util/TrimConverter.java b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/util/TrimConverter.java new file mode 100644 index 000000000..3e25d0ddf --- /dev/null +++ b/blade-service/logpm-basicdata/src/main/java/com/logpm/basicdata/util/TrimConverter.java @@ -0,0 +1,43 @@ +package com.logpm.basicdata.util; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.CellData; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +/** + * 自定义去除cell前后空格转换器 + * + * @author zhaoqiaobo + * @create 2024-04-24 + */ +public class TrimConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return String.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public String convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { + String value = cellData.getStringValue(); + if (StrUtil.isNotEmpty(value)) { + return value.trim(); + } + return value; + } + + @Override + public CellData convertToExcelData(String value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { + if (StrUtil.isEmpty(value)) { + return new CellData(value); + } + return new CellData(value.trim()); + } +} diff --git a/blade-service/logpm-basicdata/src/main/resources/application-dev.yml b/blade-service/logpm-basicdata/src/main/resources/application-dev.yml index bea4f60a6..ad768428d 100644 --- a/blade-service/logpm-basicdata/src/main/resources/application-dev.yml +++ b/blade-service/logpm-basicdata/src/main/resources/application-dev.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -33,24 +33,22 @@ spring: url: ${blade.datasource.basicdata.master.url} username: ${blade.datasource.basicdata.master.username} password: ${blade.datasource.basicdata.master.password} - slave: - druid: - #独立校验配置 - validation-query: select 1 - #oracle校验 - #validation-query: select 1 from dual - url: ${blade.datasource.basicdata.slave.url} - username: ${blade.datasource.basicdata.slave.username} - password: ${blade.datasource.basicdata.slave.password} - -xxl: - job: - accessToken: '' - admin: - addresses: http://127.0.0.1:7009/xxl-job-admin - executor: - appname: logpm-basicdata-xxljob - ip: 127.0.0.1 - logpath: ../data/applogs/logpm-factory-data-xxljob/jobhandler - logretentiondays: -1 - port: 17019 +# 627683: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.basicdata.627683.url} +# username: ${blade.datasource.basicdata.627683.username} +# password: ${blade.datasource.basicdata.627683.password} +# +# 703623: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.basicdata.703623.url} +# username: ${blade.datasource.basicdata.703623.username} +# password: ${blade.datasource.basicdata.703623.password} diff --git a/blade-service/logpm-basicdata/src/main/resources/application-prod.yml b/blade-service/logpm-basicdata/src/main/resources/application-prod.yml index 40f040c5b..1b9d1bd04 100644 --- a/blade-service/logpm-basicdata/src/main/resources/application-prod.yml +++ b/blade-service/logpm-basicdata/src/main/resources/application-prod.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -33,24 +33,12 @@ spring: url: ${blade.datasource.basicdata.master.url} username: ${blade.datasource.basicdata.master.username} password: ${blade.datasource.basicdata.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.basicdata.slave.url} - username: ${blade.datasource.basicdata.slave.username} - password: ${blade.datasource.basicdata.slave.password} - -xxl: - job: - accessToken: '' - admin: - addresses: http://172.16.128.147:7009/xxl-job-admin - executor: - appname: logpm-basicdata-xxljob - ip: 127.0.0.1 - logpath: ../data/applogs/logpm-factory-data-xxljob/jobhandler - logretentiondays: -1 - port: 17018 + url: ${blade.datasource.basicdata.627683.url} + username: ${blade.datasource.basicdata.627683.username} + password: ${blade.datasource.basicdata.627683.password} diff --git a/blade-service/logpm-basicdata/src/main/resources/application-test.yml b/blade-service/logpm-basicdata/src/main/resources/application-test.yml index 0235f16a8..bb06a1b98 100644 --- a/blade-service/logpm-basicdata/src/main/resources/application-test.yml +++ b/blade-service/logpm-basicdata/src/main/resources/application-test.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -33,24 +33,20 @@ spring: url: ${blade.datasource.basicdata.master.url} username: ${blade.datasource.basicdata.master.username} password: ${blade.datasource.basicdata.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.basicdata.slave.url} - username: ${blade.datasource.basicdata.slave.username} - password: ${blade.datasource.basicdata.slave.password} - -xxl: - job: - accessToken: '' - admin: - addresses: http://127.0.0.1:7009/xxl-job-admin - executor: - appname: logpm-basicdata-xxljob - ip: 127.0.0.1 - logpath: ../data/applogs/logpm-factory-data-xxljob/jobhandler - logretentiondays: -1 - port: 17018 + url: ${blade.datasource.basicdata.627683.url} + username: ${blade.datasource.basicdata.627683.username} + password: ${blade.datasource.basicdata.627683.password} + 695224: + url: ${blade.datasource.basicdata.695224.url} + username: ${blade.datasource.basicdata.695224.username} + password: ${blade.datasource.basicdata.695224.password} + 645789: + url: ${blade.datasource.basicdata.645789.url} + username: ${blade.datasource.basicdata.645789.username} + password: ${blade.datasource.basicdata.645789.password} diff --git a/blade-service/logpm-basicdata/src/main/resources/application.yml b/blade-service/logpm-basicdata/src/main/resources/application.yml index a84f9a5a7..e6e74bccb 100644 --- a/blade-service/logpm-basicdata/src/main/resources/application.yml +++ b/blade-service/logpm-basicdata/src/main/resources/application.yml @@ -20,4 +20,14 @@ spring: main: allow-circular-references: true - +xxl: + job: + accessToken: '' + admin: + addresses: http://127.0.0.1:7009/xxl-job-admin + executor: + appname: logpm-basicdata-xxljob + ip: 127.0.0.1 + logpath: ../data/applogs/logpm-factory-data-xxljob/jobhandler + logretentiondays: -1 + port: 17019 diff --git a/blade-service/logpm-business/Dockerfile b/blade-service/logpm-business/Dockerfile new file mode 100644 index 000000000..17b6886da --- /dev/null +++ b/blade-service/logpm-business/Dockerfile @@ -0,0 +1,16 @@ +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 + +MAINTAINER h5u@163.com + +RUN mkdir -p /logpm/business + +WORKDIR /logpm/business + +EXPOSE 8600 + +ADD ./target/logpm-business.jar ./app.jar + +ENV JAVA_OPTS="-Xms512m -Xmx1024m" + +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "-Xms128m","-Xmx512m","app.jar"] +CMD ["--spring.profiles.active=test"] diff --git a/blade-service/logpm-business/pom.xml b/blade-service/logpm-business/pom.xml new file mode 100644 index 000000000..4bbfe01d1 --- /dev/null +++ b/blade-service/logpm-business/pom.xml @@ -0,0 +1,114 @@ + + + 4.0.0 + + + org.springblade + blade-service + 3.2.0.RELEASE + + + org.springblade + logpm-business + ${project.artifactId} + ${bladex.project.version} + jar + + + + org.springblade + blade-core-boot + + + org.springblade + blade-starter-swagger + + + org.springblade + blade-starter-excel + + + org.springblade + blade-core-auto + compile + + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springblade + logpm-business-api + 3.2.0.RELEASE + compile + + + + + org.springblade + logpm-trunkline-api + 3.2.0.RELEASE + compile + + + + org.springblade + logpm-basicdata-api + 3.2.0.RELEASE + compile + + + + org.springblade + logpm-distribution-api + ${bladex.project.version} + + + + org.springblade + logpm-warehouse-api + ${bladex.project.version} + + + + org.springblade + blade-user-api + ${bladex.project.version} + + + org.springblade + blade-system-api + 3.2.0.RELEASE + compile + + + + + + + + com.spotify + dockerfile-maven-plugin + + ${docker.username} + ${docker.password} + ${docker.registry.url}/${docker.namespace}/${project.artifactId} + ${project.version} + true + + target/${project.build.finalName}.jar + + false + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/BusinessApplication.java b/blade-service/logpm-business/src/main/java/com/logpm/business/BusinessApplication.java new file mode 100644 index 000000000..048ae5f84 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/BusinessApplication.java @@ -0,0 +1,17 @@ +package com.logpm.business; + + +import org.springblade.common.constant.ModuleNameConstant; +import org.springblade.core.cloud.client.BladeCloudApplication; +import org.springblade.core.launch.BladeApplication; +import org.springblade.core.transaction.annotation.SeataCloudApplication; + +@BladeCloudApplication +@SeataCloudApplication +public class BusinessApplication { + + public static void main(String[] args) { + BladeApplication.run(ModuleNameConstant.LOGPM_BUSINESS_NAME, BusinessApplication.class, args); + } + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/api/BusinessPreOrderApi.java b/blade-service/logpm-business/src/main/java/com/logpm/business/api/BusinessPreOrderApi.java new file mode 100644 index 000000000..57439787a --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/api/BusinessPreOrderApi.java @@ -0,0 +1,86 @@ +package com.logpm.business.api; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.business.bean.Resp; +import com.logpm.business.dto.BusinessPreListDTO; +import com.logpm.business.dto.BusinessSanDTO; +import com.logpm.business.service.IBusinessPreOrderService; +import com.logpm.business.vo.DistributionBusinessPreCarDetalVO; +import com.logpm.business.vo.DistributionBusinessPreCarNumerPageQueryVO; +import com.logpm.business.vo.DistributionBusinessPreCarNumerPageVO; +import com.logpm.business.vo.DistributionBusinessPreOrderListVO; +import com.logpm.trunkline.dto.InComingDTO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +@RestController +@AllArgsConstructor +@Slf4j +@RequestMapping("/app/businessPreOrder") +@Api(value = "配送管理", tags = "预入库管理") +public class BusinessPreOrderApi { + + private final IBusinessPreOrderService distributionIBusinessPreOrderService; + + @PostMapping("/list") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "模糊查询", notes = "传入trayTypeDTO") + public R list(@RequestBody BusinessPreListDTO queryrderDTO){ + + DistributionBusinessPreOrderListVO data = distributionIBusinessPreOrderService.list(queryrderDTO); + + return R.data(data); + } + + + @PostMapping("/scanOrderPackageCode") + @ApiOperationSupport(order = 1) + public R scanOrderPackageCode(@RequestBody BusinessSanDTO businessSanDTO){ + + Resp resp = null; + try { + resp = distributionIBusinessPreOrderService.inOrderWarehourse(businessSanDTO); + } catch (Exception e) { + throw new RuntimeException(e); + } + + return resp; + } + + + + @GetMapping("/listCarNum") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "条件查询", notes = "传入trayTypeDTO") + public R listCarNum(DistributionBusinessPreCarNumerPageQueryVO distributionBusinessPreCarNumerPageQueryVO, Query query){ + + IPage data = distributionIBusinessPreOrderService.listCarNum(Condition.getPage(query),distributionBusinessPreCarNumerPageQueryVO); + + return R.data(data); + } + + @GetMapping("/preCarInfoDetailByCarNum") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "条件查询", notes = "传入trayTypeDTO") + public R preCarInfoDetailByCarNum(DistributionBusinessPreCarNumerPageQueryVO distributionBusinessPreCarNumerPageQueryVO){ + + DistributionBusinessPreCarDetalVO distributionBusinessPreCarDetalVO = distributionIBusinessPreOrderService.preCarInfoDetailByCarNumber(distributionBusinessPreCarNumerPageQueryVO); + + return R.data(distributionBusinessPreCarDetalVO); + } + + + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-business/src/main/java/com/logpm/business/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..2cabab7a5 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.business.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/aspect/ChangeAsyncAnnotationAspect.java b/blade-service/logpm-business/src/main/java/com/logpm/business/aspect/ChangeAsyncAnnotationAspect.java new file mode 100644 index 000000000..68adae5a1 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/aspect/ChangeAsyncAnnotationAspect.java @@ -0,0 +1,120 @@ +package com.logpm.business.aspect; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.ChangeAsync; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.annotation.Order; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.lang.reflect.Method; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Aspect +@Component +@Slf4j +@Order(-1) +@AllArgsConstructor +public class ChangeAsyncAnnotationAspect { + + private final MockLoginService mockLoginService; + + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final String account = "shujutongbu"; + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.ChangeAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + ChangeAsync myAsync = method.getAnnotation(ChangeAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> ChangeAsync={}", annotationValue); + + // 获取当前拦截方法的入参参数 + Object[] args = joinPoint.getArgs(); + // 获取入参名称 + String[] parameterNames = signature.getParameterNames(); + String tenantId = null; + // 获取参数名称 为tenantId 的值 + for (int i = 0; i < parameterNames.length; i++) { + if ("tenantId".equals(parameterNames[i])) { + tenantId = (String) args[i]; + log.info(">> tenandId {} ", tenantId); + break; + } + } + // 执行模拟登录 + if (StringUtil.isNotBlank(tenantId)) { + JSONObject data = bladeRedis.get(CacheNames.LOCAL_SERVER_USER + tenantId + ":" + account); + if (Objects.isNull(data)) { + boolean flag = redisLockClient.tryLock("local_server_user" + tenantId, LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if (flag) { + data = bladeRedis.get(CacheNames.LOCAL_SERVER_USER + tenantId + ":" + account); + if (Objects.isNull(data)) { + data = mockLoginService.mockToken(tenantId, account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER + tenantId + ":" + account, data, 2591990L); + redisLockClient.unLock("local_server_user" + tenantId, LockType.FAIR); + } + } + } + + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.addHeader("Blade-Auth", "bearer "+data.get("access_token")); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(mockRequest)); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + DynamicDataSourceContextHolder.push(data.getString("tenant_id")); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + }else{ + return joinPoint.proceed(); + } + + +// // 在方法执行前的操作 +// String tenantId = AuthUtil.getTenantId(); +// log.info(">> tenandId {} ",tenantId); +// DynamicDataSourceContextHolder.push("627683"); +// +// // 执行原方法 +// Object result = joinPoint.proceed(); +// +// // 在方法执行后的操作 +// DynamicDataSourceContextHolder.poll(); +// return result; + } + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-business/src/main/java/com/logpm/business/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..0577947a0 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.business.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/bean/Resp.java b/blade-service/logpm-business/src/main/java/com/logpm/business/bean/Resp.java new file mode 100644 index 000000000..96c28f143 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/bean/Resp.java @@ -0,0 +1,48 @@ +package com.logpm.business.bean; + +import lombok.Data; +import org.springblade.core.tool.api.R; + +@Data +public class Resp extends R { + + private String audio; + + public static Resp scanSuccess(String msg,String audio){ + Resp resp = new Resp(); + resp.setCode(200); + resp.setMsg(msg); + resp.setSuccess(true); + resp.setAudio(audio); + return resp; + } + + public static Resp scanSuccessWithData(String msg,String audio,Object data){ + Resp resp = new Resp(); + resp.setCode(200); + resp.setMsg(msg); + resp.setSuccess(true); + resp.setData(data); + resp.setAudio(audio); + return resp; + } + + public static Resp scanFail(String msg,String audio){ + Resp resp = new Resp(); + resp.setCode(3001); + resp.setMsg(msg); + resp.setAudio(audio); + return resp; + } + + public static Resp scanFail(int code,String msg,String audio,Object data){ + Resp resp = new Resp(); + resp.setCode(code); + resp.setMsg(msg); + resp.setData(data); + resp.setAudio(audio); + return resp; + } + + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/config/BusinessProperties.java b/blade-service/logpm-business/src/main/java/com/logpm/business/config/BusinessProperties.java new file mode 100644 index 000000000..b1842f513 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/config/BusinessProperties.java @@ -0,0 +1,38 @@ +/* + * 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.business.config; + + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 配置feign、mybatis包名、properties + * + * @author chaos + */ +@Configuration(proxyBeanMethods = false) +@ComponentScan({"org.springblade", "com.logpm"}) +@EnableFeignClients({"org.springblade", "com.logpm"}) +@MapperScan({"org.springblade.**.mapper.**", "com.logpm.**.mapper.**"}) +@EnableConfigurationProperties(BusinessProperties.class) +public class BusinessProperties { + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/config/CustomMessageConverter.java b/blade-service/logpm-business/src/main/java/com/logpm/business/config/CustomMessageConverter.java new file mode 100644 index 000000000..c8ca3c821 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/config/CustomMessageConverter.java @@ -0,0 +1,155 @@ +package com.logpm.business.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.*; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private final String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength(bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/config/RabbitMqConfiguration.java b/blade-service/logpm-business/src/main/java/com/logpm/business/config/RabbitMqConfiguration.java new file mode 100644 index 000000000..3696eec9c --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/config/RabbitMqConfiguration.java @@ -0,0 +1,191 @@ +package com.logpm.business.config; + +import com.alibaba.nacos.shaded.com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.RabbitConstant; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.rabbit.retry.MessageRecoverer; +import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Map; + +/** + * RabbitMQ配置,主要是配置队列,如果提前存在该队列,可以省略本配置类 + * + * @author yangkai.shen + */ +@Slf4j +@Configuration +public class RabbitMqConfiguration { + + @Bean + public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory){ + RabbitTemplate template = new RabbitTemplate(); + template.setConnectionFactory(connectionFactory); + template.setMandatory(true); + template.setMessageConverter(new CustomMessageConverter()); + template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { + @Override + public void confirm(CorrelationData correlationData, boolean b, String s) { + System.out.println("确认回调-相关数据:"+correlationData); + System.out.println("确认回调-确认情况:"+b); + System.out.println("确认回调-原因:"+s); + } + }); + + template.setReturnsCallback(new RabbitTemplate.ReturnsCallback() { + @Override + public void returnedMessage(ReturnedMessage returnedMessage) { + System.out.println("返回回调-消息:"+returnedMessage.getMessage()); + System.out.println("返回回调-回应码:"+returnedMessage.getReplyCode()); + System.out.println("返回回调-回应信息:"+returnedMessage.getReplyText()); + System.out.println("返回回调-交换机:"+returnedMessage.getExchange()); + System.out.println("返回回调-路由键:"+returnedMessage.getRoutingKey()); + } + }); + return template; + } + + @Bean + public DirectExchange distributionErrorMessageExchange(){ + return new DirectExchange(RabbitConstant.DISTRIBUTION_ERROR_EXCHANGE); + } + @Bean + public Queue distributionErrorQueue(){ + return new Queue(RabbitConstant.DISTRIBUTION_ERROR_QUEUE, true); + } + @Bean + public Binding distributionErrorBinding(Queue distributionErrorQueue, DirectExchange distributionErrorMessageExchange){ + return BindingBuilder.bind(distributionErrorQueue).to(distributionErrorMessageExchange).with(RabbitConstant.DISTRIBUTION_ERROR_ROUTING); + } + + /** + * 消费失败队列 + * @param rabbitTemplate + * @return + */ + @Bean + public MessageRecoverer republishMessageRecoverer(RabbitTemplate rabbitTemplate){ + return new RepublishMessageRecoverer(rabbitTemplate, RabbitConstant.DISTRIBUTION_ERROR_EXCHANGE, RabbitConstant.DISTRIBUTION_ERROR_ROUTING); + } + + + /** + * 备货扫码任务队列 + */ + @Bean + public Queue stockupScanQueue() { + return new Queue(RabbitConstant.STOCKUP_SCAN_QUEUE, true); + } + @Bean + public CustomExchange stockupScanExchange() { + Map args = Maps.newHashMap(); + args.put("x-delayed-type", "direct"); + return new CustomExchange(RabbitConstant.STOCKUP_SCAN_EXCHANGE, "x-delayed-message", true, false, args); + } + @Bean + public Binding stockupScanBinding(Queue stockupScanQueue, CustomExchange stockupScanExchange) { + return BindingBuilder.bind(stockupScanQueue).to(stockupScanExchange).with(RabbitConstant.STOCKUP_SCAN_ROUTING).noargs(); + } + + /** + * 备货判断是否下架任务队列 + */ + @Bean + public Queue stockupStateUpdateQueue() { + return new Queue(RabbitConstant.STOCKUP_STATE_UPDATE_QUEUE, true); + } + @Bean + public CustomExchange stockupStateUpdateExchange() { + Map args = Maps.newHashMap(); + args.put("x-delayed-type", "direct"); + return new CustomExchange(RabbitConstant.STOCKUP_STATE_UPDATE_EXCHANGE, "x-delayed-message", true, false, args); + } + @Bean + public Binding stockupStateUpdateBinding(Queue stockupStateUpdateQueue, CustomExchange stockupStateUpdateExchange) { + return BindingBuilder.bind(stockupStateUpdateQueue).to(stockupStateUpdateExchange).with(RabbitConstant.STOCKUP_STATE_UPDATE_ROUTING).noargs(); + } + + + /** + * 文员签收复合推送老系统队列 + * @return + */ + @Bean + public Queue clerkCheckPushDataQueue() { + return new Queue(RabbitConstant.CLERK_CHECK_PUSH_DATA_QUEUE, true); + } + @Bean + public CustomExchange clerkCheckPushDataExchange() { + Map args = Maps.newHashMap(); + args.put("x-delayed-type", "direct"); + return new CustomExchange(RabbitConstant.CLERK_CHECK_PUSH_DATA_EXCHANGE, "x-delayed-message", true, false, args); + } + @Bean + public Binding clerkCheckPushDataBinding(Queue clerkCheckPushDataQueue, CustomExchange clerkCheckPushDataExchange) { + return BindingBuilder.bind(clerkCheckPushDataQueue).to(clerkCheckPushDataExchange).with(RabbitConstant.CLERK_CHECK_PUSH_DATA_ROUTING).noargs(); + } + + + + @Bean + public Queue orderPackageStatusInfoQueue() { + return new Queue(RabbitConstant.ORDER_PACKAGE_STATUS_INFO_QUEUE, true); + } + @Bean + public CustomExchange orderPackageStatusInfoExchange() { + Map args = Maps.newHashMap(); + args.put("x-delayed-type", "direct"); + return new CustomExchange(RabbitConstant.ORDER_PACKAGE_STATUS_INFO_EXCHANGE, "x-delayed-message", true, false, args); + } + @Bean + public Binding orderPackageStatusInfoBinding(Queue orderPackageStatusInfoQueue, CustomExchange orderPackageStatusInfoExchange) { + return BindingBuilder.bind(orderPackageStatusInfoQueue).to(orderPackageStatusInfoExchange).with(RabbitConstant.ORDER_PACKAGE_STATUS_INFO_ROUTING).noargs(); + } + + + + + /** + * 文员签收复合推送老系统队列 + * @return + */ + @Bean + public Queue billClerkCheckPushDataQueue() { + return new Queue(RabbitConstant.BILL_CLERK_CHECK_PUSH_DATA_QUEUE, true); + } + @Bean + public CustomExchange billClerkCheckPushDataExchange() { + Map args = Maps.newHashMap(); + args.put("x-delayed-type", "direct"); + return new CustomExchange(RabbitConstant.BILL_CLERK_CHECK_PUSH_DATA_EXCHANGE, "x-delayed-message", true, false, args); + } + @Bean + public Binding billCclerkCheckPushDataBinding(Queue billClerkCheckPushDataQueue, CustomExchange billClerkCheckPushDataExchange) { + return BindingBuilder.bind(billClerkCheckPushDataQueue).to(billClerkCheckPushDataExchange).with(RabbitConstant.BILL_CLERK_CHECK_PUSH_DATA_ROUTING).noargs(); + } + + + + + @Bean + public Queue selfPickupScanQueue() { + return new Queue(RabbitConstant.SELF_PICKUP_SCAN_QUEUE, true); + } + @Bean + public CustomExchange selfPickupScanExchange() { + Map args = Maps.newHashMap(); + args.put("x-delayed-type", "direct"); + return new CustomExchange(RabbitConstant.SELF_PICKUP_SCAN_EXCHANGE, "x-delayed-message", true, false, args); + } + @Bean + public Binding selfPickupScanBinding(Queue selfPickupScanQueue, CustomExchange selfPickupScanExchange) { + return BindingBuilder.bind(selfPickupScanQueue).to(selfPickupScanExchange).with(RabbitConstant.SELF_PICKUP_SCAN_ROUTING).noargs(); + } + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/controller/DistributionBusinessPreOrderController.java b/blade-service/logpm-business/src/main/java/com/logpm/business/controller/DistributionBusinessPreOrderController.java new file mode 100644 index 000000000..99aa8b197 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/controller/DistributionBusinessPreOrderController.java @@ -0,0 +1,79 @@ +package com.logpm.business.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.business.service.IBusinessPreOrderService; +import com.logpm.business.vo.DistributionBusinessPreCarNumberVO; +import com.logpm.business.vo.BusinessPreOrderVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.annotations.ApiIgnore; + +import java.util.Map; + +@RestController +@AllArgsConstructor +@Slf4j +@RequestMapping("/businessPreOrder") +@Api(value = "预入库信息控制器", tags = "预入库信息控制器") +public class DistributionBusinessPreOrderController extends BladeController { + + private final IBusinessPreOrderService distributionIBusinessPreOrderService; + + /** + * 预入库信息 分页 + */ + @GetMapping("/page") + @ApiOperationSupport(order = 2) + @ApiOperation(value = "分页", notes = "传入distributionDeliveryList") + public R> page(@ApiIgnore @RequestParam Map distributionBusinessPreOrderDTO, Query query) { + IPage page = Condition.getPage(query); + IPage data= distributionIBusinessPreOrderService.pacgeList(distributionBusinessPreOrderDTO,page); + return R.data(data); + } + + /** + * 预入库信息--配送车次 + */ + @GetMapping("/pageByCarNum") + @ApiOperationSupport(order = 2) + @ApiOperation(value = "分页", notes = "传入distributionDeliveryList") + public R> pageByCarNum(@ApiIgnore @RequestParam Map distributionBusinessPreOrderDTO, Query query) { + IPage page = Condition.getPage(query); + IPage data= distributionIBusinessPreOrderService.pageByCarNum(distributionBusinessPreOrderDTO,page); + return R.data(data); + } + + + + + @GetMapping("/inOrder") + @ApiOperationSupport(order = 2) + @ApiOperation(value = "页面ID", notes = "传入distributionDeliveryList") + public R inOrder(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { +// try { + Boolean isSuccess = distributionIBusinessPreOrderService.inOrder(ids); + return R.data(isSuccess); +// }catch (Exception e){ +// log.error("预入库信息入库失败",e); +// return R.fail(500,e.getMessage()); +// } + + } + + + + + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/feign/BusinessPreOrderClient.java b/blade-service/logpm-business/src/main/java/com/logpm/business/feign/BusinessPreOrderClient.java new file mode 100644 index 000000000..9f1b70a4e --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/feign/BusinessPreOrderClient.java @@ -0,0 +1,28 @@ +package com.logpm.business.feign; + +import com.logpm.business.entity.BusinessPreOrderEntity; +import com.logpm.business.service.IBusinessAsyncService; +import com.logpm.business.service.IBusinessPreOrderService; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.annotations.ApiIgnore; + +import java.util.List; + +@ApiIgnore() +@RestController +@AllArgsConstructor +public class BusinessPreOrderClient implements IBusinessPreOrderClient{ + private final IBusinessPreOrderService distributionIBusinessPreOrderService; + private final IBusinessAsyncService businessAsyncService; + + @Override + public Integer inOrderByOrderPackageCode(String orderPackageCode, String carNum) { + return distributionIBusinessPreOrderService.inOrderByOrderPackageCode(orderPackageCode,carNum); + } + + @Override + public void saveOtherDataBaseNew(String tenantId, List dataResult, String mallName) { + businessAsyncService.saveOtherDataBaseNew(tenantId,dataResult,mallName); + } +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/launcher/BusinessLauncherServiceImpl.java b/blade-service/logpm-business/src/main/java/com/logpm/business/launcher/BusinessLauncherServiceImpl.java new file mode 100644 index 000000000..646e80c9b --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/launcher/BusinessLauncherServiceImpl.java @@ -0,0 +1,60 @@ +/* + * 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.business.launcher; + +import org.springblade.core.auto.service.AutoService; +import org.springblade.core.launch.constant.NacosConstant; +import org.springblade.core.launch.service.LauncherService; +import org.springblade.core.launch.utils.PropsUtil; +import org.springframework.boot.builder.SpringApplicationBuilder; + +import java.util.Properties; + +/** + * 启动参数拓展 + * + * @author Chill + */ +@AutoService(LauncherService.class) +public class BusinessLauncherServiceImpl implements LauncherService { + + @Override + public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) { + Properties props = System.getProperties(); + // 开启多数据源 + PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true"); + // 指定注册配置信息 + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].data-id", NacosConstant.dataId(appName, profile)); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].group", NacosConstant.NACOS_CONFIG_GROUP); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].refresh", NacosConstant.NACOS_CONFIG_REFRESH); + // 指定注册IP + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.ip", "127.0.0.1"); + // 指定注册端口 + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.port", "8200"); + // 自定义命名空间 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.NACOS_NAMESPACE); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.NACOS_NAMESPACE); + // 自定义分组 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.group", NacosConstant.NACOS_CONFIG_GROUP); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.group", NacosConstant.NACOS_CONFIG_GROUP); + } + + @Override + public int getOrder() { + return 20; + } +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/mapper/BusinessPreOrderMapper.java b/blade-service/logpm-business/src/main/java/com/logpm/business/mapper/BusinessPreOrderMapper.java new file mode 100644 index 000000000..f2d814382 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/mapper/BusinessPreOrderMapper.java @@ -0,0 +1,70 @@ +/* + * 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.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.business.dto.BusinessPreListDTO; +import com.logpm.business.dto.BusinessPreOrderDTO; +import com.logpm.business.entity.BusinessPreOrderEntity; +import com.logpm.business.vo.DistributionBusinessPreCarNumberVO; +import com.logpm.business.vo.BusinessPreOrderVO; +import com.logpm.business.vo.DistributionBusinessPreCarNumerPageQueryVO; +import com.logpm.business.vo.DistributionBusinessPreCarNumerPageVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 商家预备导入数据信息 Mapper 接口 + * + * @author cyz + * @since 2023-06-13 + */ +public interface BusinessPreOrderMapper extends BaseMapper { + + + /** + * 查询DistributionBusinessPreOrderVO列表 + * + * @param page + * @param param + * @return + */ + IPage pageList(IPage page, @Param("param") BusinessPreOrderDTO param); + + /** + * 删除商家端数据 + * + * @param k + * @param deletedPackageList + * @return + */ + Integer deleteBusinessPreOrder(String reservationCode, List deletedPackageList); + + List listByBusinessPreListDTO(@Param("queryrderDTO") BusinessPreListDTO queryrderDTO); + + Integer updateBusinessPreOrderByOrderPackageCode(@Param("orderPackageCode") String orderPackageCode); + + IPage pageByCarNum(IPage page, Map distributionBusinessPreOrderDTO); + + IPage listCarNum(IPage page, DistributionBusinessPreCarNumerPageQueryVO distributionBusinessPreCarNumerPageQueryVO); + + DistributionBusinessPreCarNumerPageVO listCarInforByCarNum(@Param("distributionBusinessPreCarNumerPageQueryVO") DistributionBusinessPreCarNumerPageQueryVO distributionBusinessPreCarNumerPageQueryVO); + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/mapper/BusinessPreOrderMapper.xml b/blade-service/logpm-business/src/main/java/com/logpm/business/mapper/BusinessPreOrderMapper.xml new file mode 100644 index 000000000..a80562e12 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/mapper/BusinessPreOrderMapper.xml @@ -0,0 +1,235 @@ + + + + + + + update logpm_business_pre_order set in_warehouse=1 + + where order_package_code=#{orderPackageCode} and is_deleted=0 and in_warehouse=0 + + + + DELETE FROM logpm_business_pre_order WHERE reservation_code = #{reservationCode} + AND order_package_code IN + + #{orderPackageCode} + + + + + + + + + + + + diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/receiver/BusinessInOrderDataQueueHandler.java b/blade-service/logpm-business/src/main/java/com/logpm/business/receiver/BusinessInOrderDataQueueHandler.java new file mode 100644 index 000000000..7069eca34 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/receiver/BusinessInOrderDataQueueHandler.java @@ -0,0 +1,95 @@ +package com.logpm.business.receiver; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.logpm.business.service.IBusinessPreOrderService; +import com.logpm.distribution.entity.DistributionReservationEntity; +import com.logpm.distribution.feign.IDistributionReservationClient; +import com.rabbitmq.client.Channel; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.RabbitConstant; +import org.springblade.core.tool.api.R; +import org.springblade.system.entity.Tenant; +import org.springblade.system.feign.ISysClient; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * 送货师傅签收完结商家端数据 + */ +@Slf4j +@RabbitListener(queues = RabbitConstant.BUSINESS_IN_CONVERSION_DATA_QUEUE) +@Component +@AllArgsConstructor +public class BusinessInOrderDataQueueHandler { + + private final IBusinessPreOrderService businessPreOrderService; + private final IDistributionReservationClient distributionReservationClient; + private final ISysClient sysClient; + @RabbitHandler + public void businessInOrderDataHandler(Map map, Message message, Channel channel) { + // 获取 + JSONObject o = (JSONObject) map.get("messageData"); + + String orderPackageCode = o.getString("orderPackageCode"); + String reservationCode = o.getString("reservationCode"); + String distrCarNumber = o.getString("distrCarNumber"); + String vehicleName = o.getString("vehicleName"); + String driverName = o.getString("driverName"); + String userName = o.getString("userName"); + // 当前作业仓库 + Long warehouseId = o.getLong("warehouseId"); + // 作业 + String tenantId = o.getString("tenantId"); + + //验证参数是否为null或者空串 + if (orderPackageCode == null || orderPackageCode.equals("")) { + log.error("orderPackageCode is null"); + return; + } + if (reservationCode == null || reservationCode.equals("")) { + log.error("reservationCode is null"); + return; + } + if (distrCarNumber == null || distrCarNumber.equals("")) { + log.error("distrCarNumber is null"); + return; + } + if (vehicleName == null || vehicleName.equals("")) { + log.error("vehicleName is null"); + return; + } + if (driverName == null || driverName.equals("")) { + log.error("driverName is null"); + return; + } + // 判断目标租户 + DistributionReservationEntity reservationByCodeAndWarehouseId = distributionReservationClient.getReservationByCodeAndWarehouseId(reservationCode, warehouseId.toString()); + + // 判断是否存在租户 + R> tenantList = sysClient.getTenantList(); + Tenant tenant = null; + if (tenantList.isSuccess()) { + List data = tenantList.getData(); + for (Tenant datum : data) { + if (datum.getTenantType() == 2 && datum.getTenantName().equals(reservationByCodeAndWarehouseId.getMallName().trim())) { + tenant = datum; + break; + } + } + } + if(!ObjectUtil.isEmpty(tenant)){ + // 如果师傅签收 以师傅签收的车次为准 + businessPreOrderService.scanOrderPackageCodeByMaster(orderPackageCode, reservationCode, distrCarNumber, vehicleName, driverName, userName, warehouseId,tenant.getTenantId(),tenant.getTenantName(),tenantId); + } + + + + } +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/service/IBusinessAsyncService.java b/blade-service/logpm-business/src/main/java/com/logpm/business/service/IBusinessAsyncService.java new file mode 100644 index 000000000..e5d6996c8 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/service/IBusinessAsyncService.java @@ -0,0 +1,13 @@ +package com.logpm.business.service; + +import com.logpm.business.entity.BusinessPreOrderEntity; +import org.springblade.common.annotations.ChangeAsync; + +import java.util.List; + +public interface IBusinessAsyncService { + + public void saveOtherDataBaseNew(String tenantId, List dataResult, String mallName); + + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/service/IBusinessPreOrderService.java b/blade-service/logpm-business/src/main/java/com/logpm/business/service/IBusinessPreOrderService.java new file mode 100644 index 000000000..202762810 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/service/IBusinessPreOrderService.java @@ -0,0 +1,109 @@ +package com.logpm.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.business.bean.Resp; +import com.logpm.business.dto.BusinessPreListDTO; +import com.logpm.business.dto.BusinessSanDTO; +import com.logpm.business.entity.BusinessPreOrderEntity; +import com.logpm.business.vo.*; +import com.logpm.trunkline.dto.InComingDTO; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.base.BaseService; +import org.springblade.core.tool.api.R; +import org.springblade.system.entity.Tenant; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +public interface IBusinessPreOrderService extends BaseService { + /** + * 预备入库ID集合 + * @param ids + * @return + */ + Boolean inOrder(String ids) throws ServiceException; + + + /** + * 更新预入库状态 + * @param orderPackageCode 包条码 + * @param carNum 入库的配送车次 + * @return + */ + Integer inOrderByOrderPackageCode(String orderPackageCode,String carNum); + + /** + * 查询DistributionBusinessPreOrder列表 + * @param distributionBusinessPreOrderDTO + * @param page + * @return + */ + IPage pacgeList(Map distributionBusinessPreOrderDTO, IPage page); + + /** + * 删除商家端数据 + * @param k + * @param deletedPackageList + * @return + */ + Integer deleteBusinessPreOrder(String k, List deletedPackageList); + DistributionBusinessPreOrderListVO list(BusinessPreListDTO queryrderDTO); + + /** + * PDA 扫码入库 + * @param businessSanDTO + * @return + * @throws ExecutionException + * @throws InterruptedException + */ + Resp inOrderWarehourse(BusinessSanDTO businessSanDTO) ; + + + DistributionBusinessPreCarDetalVO preCarInfoDetailByCarNumber(DistributionBusinessPreCarNumerPageQueryVO queryVO); + + IPage pageByCarNum(Map distributionBusinessPreOrderDTO, IPage page); + + /** + * 分页查询配送车次 + * @param page + * @return + */ + IPage listCarNum(IPage page, DistributionBusinessPreCarNumerPageQueryVO distributionBusinessPreCarNumerPageQueryVO); + + + /** + * 商家端托盘扫码入库 + * @param inComingDTO + * @return + */ + R incomingPackage(InComingDTO inComingDTO); + + + /** + * 师傅的签收扫描作业 + * + * @param reservationCode 预约单 + * @param orderPackageCode 包条码 + * @param distrCarNumber 配送车次号 + * @param driverName 司机名称 + * @param vehicleName 车牌号码 + * @param warehouseId 当前作业仓库ID + * @param tenantId 目标租户 + * @param userName 作业用户 + * @param sourceTenantId 来源租户 + * @return + */ + R scanOrderPackageCodeByMaster(String orderPackageCode, + String reservationCode, + String distrCarNumber, + String vehicleName, + String driverName, + String userName, + Long warehouseId, + String tenantId, + String tenantName, + String sourceTenantId + ); + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/service/impl/BusinessAsyncServiceImpl.java b/blade-service/logpm-business/src/main/java/com/logpm/business/service/impl/BusinessAsyncServiceImpl.java new file mode 100644 index 000000000..20d00df98 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/service/impl/BusinessAsyncServiceImpl.java @@ -0,0 +1,93 @@ +package com.logpm.business.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.logpm.business.entity.BusinessPreOrderEntity; +import com.logpm.business.service.IBusinessAsyncService; +import com.logpm.business.service.IBusinessPreOrderService; +import com.logpm.distribution.feign.IDistributionDeliveryListClient; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.annotations.ChangeAsync; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.system.entity.Tenant; +import org.springblade.system.feign.ISysClient; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.ListIterator; +import java.util.stream.Collectors; + +@Log4j2 +@Service +@AllArgsConstructor +public class BusinessAsyncServiceImpl implements IBusinessAsyncService { + + private final IBusinessPreOrderService businessPreOrderService; + private final ISysClient sysClient; + private final IDistributionDeliveryListClient distributionDeliveryListClient; + + @ChangeAsync() + @Override + public void saveOtherDataBaseNew(String tenantId, List dataResult, String mallName) { + + List orderCodeList = dataResult.stream() + .map(BusinessPreOrderEntity::getOrderCode) + .collect(Collectors.toList()); + R tenantByName = sysClient.getTenantByName(mallName); + if (tenantByName.isSuccess()) { + Tenant tenant = tenantByName.getData(); + if (ObjectUtil.isEmpty(tenant)) { + log.info(">>>>>>>>>>>>> saveOtherDataBaseNew 租户不存在"); + return; + } + if (dataResult.isEmpty()) { + log.info(" saveOtherDataBaseNew dataResult 参数错误"); + } + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(BusinessPreOrderEntity::getInWarehouse, 0); + lambdaQueryWrapper.in(BusinessPreOrderEntity::getOrderCode, orderCodeList); + List list = businessPreOrderService.list(lambdaQueryWrapper); + + + // 找到已经推送的包件信息 并将其标记为删除状态 + List temsp = new ArrayList<>(); + for (BusinessPreOrderEntity distributionBusinessPreOrderEntity : list) { + + for (int i = 0; i < dataResult.size(); i++) { + BusinessPreOrderEntity businessPreOrderEntity = dataResult.get(i); + + businessPreOrderEntity.setTenantId(tenant.getTenantId()); + if (businessPreOrderEntity.getStockArticleId().equals(distributionBusinessPreOrderEntity.getStockArticleId())) { + // 找到订单 + if (businessPreOrderEntity.getOrderPackageCode().equals(distributionBusinessPreOrderEntity.getOrderPackageCode())) { + //找到包件 并标记为删除状态 + if (distributionBusinessPreOrderEntity.getInWarehouse().equals(1)) { + // 需要删除集合中的数据 + dataResult.remove(i); + } else { + temsp.add(distributionBusinessPreOrderEntity.getId()); + } + } + } + + } + } + if (!temsp.isEmpty()) { + // 更新删除状态 + businessPreOrderService.deleteLogic(temsp); + } + for (BusinessPreOrderEntity distributionBusinessPreOrderEntity : dataResult) { + distributionBusinessPreOrderEntity.setTenantId(tenant.getTenantId()); + } + + // 执行保存操作 + businessPreOrderService.saveBatch(dataResult); + + } + } + + +} diff --git a/blade-service/logpm-business/src/main/java/com/logpm/business/service/impl/BusinessPreOrderServiceImpl.java b/blade-service/logpm-business/src/main/java/com/logpm/business/service/impl/BusinessPreOrderServiceImpl.java new file mode 100644 index 000000000..c485bf9b1 --- /dev/null +++ b/blade-service/logpm-business/src/main/java/com/logpm/business/service/impl/BusinessPreOrderServiceImpl.java @@ -0,0 +1,628 @@ +package com.logpm.business.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.business.bean.Resp; +import com.logpm.business.dto.BusinessPreListDTO; +import com.logpm.business.dto.BusinessPreOrderDTO; +import com.logpm.business.dto.BusinessSanDTO; +import com.logpm.business.entity.BusinessPreOrderEntity; +import com.logpm.business.mapper.BusinessPreOrderMapper; +import com.logpm.business.service.IBusinessAsyncService; +import com.logpm.business.service.IBusinessPreOrderService; +import com.logpm.business.vo.*; +import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.distribution.feign.IDistributionDeliveryListClient; +import com.logpm.distribution.feign.IDistributionParcelListClient; +import com.logpm.trunkline.dto.InComingDTO; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.feign.IInComingClient; +import com.logpm.trunkline.feign.ITrunklineAdvanceDetailClient; +import com.logpm.warehouse.feign.IWarehouseTrayTypeClient; +import com.logpm.warehouse.vo.TrayTypeDataVO; +import lombok.AllArgsConstructor; +import org.jetbrains.annotations.Nullable; +import org.springblade.common.annotations.ChangeAsync; +import org.springblade.common.constant.IncomingTypeEnum; +import org.springblade.common.constant.RedisKeyConstant; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +@Service +@AllArgsConstructor +public class BusinessPreOrderServiceImpl extends BaseServiceImpl implements IBusinessPreOrderService { + + + private final IBasicdataWarehouseClient basicdataWarehouseClient; + private final IInComingClient inComingClient; + private final ITrunklineAdvanceDetailClient trunklineAdvanceDetailClient; + private final BladeRedis bladeRedis; + private final IWarehouseTrayTypeClient warehouseTrayTypeClient; + private final IDistributionDeliveryListClient distributionDeliveryListClient; + + + @Override + public Boolean inOrder(String ids) throws ServiceException { + + + BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + + if (Objects.isNull(myCurrentWarehouse)) { + throw new CustomerException("仓库信息不能为空"); + } + + + // 查询出来需要处理的包条码 + List idArray = Arrays.asList(ids.split(",")); + QueryWrapper wrapper = new QueryWrapper(); + wrapper.in("id", idArray); + + StringBuffer sb = new StringBuffer(); + List list = baseMapper.selectList(wrapper); + + List data = new ArrayList<>(); + for (BusinessPreOrderEntity distributionBusinessPreOrderEntity : list) { + + if (distributionBusinessPreOrderEntity.getInWarehouse() == 1) { + throw new ServiceException("存在已入库的包件"); + } + if (!sb.toString().isEmpty()) { + sb.append(","); + } + sb.append(distributionBusinessPreOrderEntity.getOrderPackageCode()); + data.add(distributionBusinessPreOrderEntity); + + BusinessSanDTO businessSanDTO = new BusinessSanDTO(); + businessSanDTO.setOrderPackageCode(distributionBusinessPreOrderEntity.getOrderPackageCode()); + businessSanDTO.setInWarehouseException(0); + businessSanDTO.setDistrCarNumber(distributionBusinessPreOrderEntity.getDistrCarNumber()); + R r = inOrderWarehourse(businessSanDTO); + if (r.isSuccess()) { + // 更新成功 + // 更新入库状态 + distributionBusinessPreOrderEntity.setInWarehouse(1); + baseMapper.updateById(distributionBusinessPreOrderEntity); + Object o = bladeRedis.get(RedisKeyConstant.BUSINESS_IN_CARNUMBER + distributionBusinessPreOrderEntity.getDistrCarNumber()); + if (!Objects.isNull(o)) { + bladeRedis.set(RedisKeyConstant.BUSINESS_IN_CARNUMBER + distributionBusinessPreOrderEntity.getDistrCarNumber(), null); + } + } + + } + + return true; + } + + + @Override + public Integer inOrderByOrderPackageCode(String orderPackageCode, String carNum) { + + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("order_package_code", orderPackageCode); +// wrapper.eq("in_warehouse",0); + wrapper.eq("is_deleted", "0"); + List list = baseMapper.selectList(wrapper); + if (!list.isEmpty()) { + BusinessPreOrderEntity distributionBusinessPreOrderEntity = list.get(0); + + distributionBusinessPreOrderEntity.setInWarehouse(1); + return baseMapper.updateById(distributionBusinessPreOrderEntity); + } + return 0; + + + } + + + @Override + public IPage pacgeList(Map distributionBusinessPreOrderDTO, IPage page) { + BusinessPreOrderDTO param = JSONObject.parseObject(JSONObject.toJSONString(distributionBusinessPreOrderDTO), BusinessPreOrderDTO.class); + return baseMapper.pageList(page, param); + } + + @Override + public Integer deleteBusinessPreOrder(String k, List deletedPackageList) { + + return baseMapper.deleteBusinessPreOrder(k, deletedPackageList); + } + + + @Override + public DistributionBusinessPreOrderListVO list(BusinessPreListDTO queryrderDTO) { + + DistributionBusinessPreOrderListVO distributionBusinessPreOrderListVO = new DistributionBusinessPreOrderListVO(); + + + List data = baseMapper.listByBusinessPreListDTO(queryrderDTO); + + + // data 分组 + Map> groupedData = data.stream() + .collect(Collectors.groupingBy(BusinessPreOrderEntity::getInWarehouse)); + + // 已入库的 + List distributionBusinessPreOrderEntities = groupedData.get(1); + + + List result = new ArrayList<>(); + for (BusinessPreOrderEntity datum : data) { + + if (datum.getInWarehouse().equals(queryrderDTO.getInWarehouse())) { + BusinessPreOrderVO copy = BeanUtil.copy(datum, BusinessPreOrderVO.class); + result.add(copy); + } + + } + distributionBusinessPreOrderListVO.setList(result); + distributionBusinessPreOrderListVO.setSumNum(data.size()); + distributionBusinessPreOrderListVO.setInNum(ObjectUtils.isEmpty(distributionBusinessPreOrderEntities) ? 0 : distributionBusinessPreOrderEntities.size()); + + + return distributionBusinessPreOrderListVO; + + + } + + private R inOrderWarehourseByFeign(BusinessSanDTO businessSanDTO) { + InComingDTO inComingDTO = new InComingDTO(); + inComingDTO.setOrderPackageCode(businessSanDTO.getOrderPackageCode()); + inComingDTO.setIncomingType(IncomingTypeEnum.LINE_INCOMING.getCode()); + inComingDTO.setTrayCode(businessSanDTO.getTrayCode()); + inComingDTO.setTrayType(businessSanDTO.getTrayType()); + inComingDTO.setWarehouseName(businessSanDTO.getWarehouseName()); + inComingDTO.setWarehouseId(businessSanDTO.getWarehouseId()); + + R r = inComingClient.incomingPackageByTaryCode(inComingDTO); + return r; + + } + + @Override + public Resp inOrderWarehourse(BusinessSanDTO businessSanDTO) { + + + try { + BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + businessSanDTO.setWarehouseId(myCurrentWarehouse.getId()); + businessSanDTO.setWarehouseName(myCurrentWarehouse.getName()); + String orderPackageCode = businessSanDTO.getOrderPackageCode(); + String distrCarNumber = businessSanDTO.getDistrCarNumber(); + + if (Func.isAllEmpty(orderPackageCode, distrCarNumber, businessSanDTO.getInWarehouseException())) { + return Resp.scanFail("扫描失败", "没有包件或者车次"); + } + // 查询配送车次下面所有的包件 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(BusinessPreOrderEntity::getDistrCarNumber, distrCarNumber); + queryWrapper.eq(BusinessPreOrderEntity::getIsDeleted, 0); + List list = baseMapper.selectList(queryWrapper); + if (list.isEmpty()) { + return Resp.scanFail("扫描失败", "车次信息不存在"); + } + + // 异常入库 + if (1 == businessSanDTO.getInWarehouseException()) { + Resp a = handleExceptionalWarehourse(businessSanDTO, list, orderPackageCode, distrCarNumber); + if (a != null) return a; + } else { + //正常入口 + Resp scanFail = handleNormalWarehourse(businessSanDTO, orderPackageCode, list, distrCarNumber); + if (scanFail != null) return scanFail; + + } + } catch (Exception e) { + log.error("系统异常", e); + throw new CustomerException(e.getMessage()); + } + + return Resp.scanFail("扫描失败", "系统错误"); + + + } + + @Nullable + private Resp handleNormalWarehourse(BusinessSanDTO businessSanDTO, String orderPackageCode, List list, String distrCarNumber) { + LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper<>(); + queryWrapper1.eq(BusinessPreOrderEntity::getOrderPackageCode, orderPackageCode); + queryWrapper1.eq(BusinessPreOrderEntity::getInWarehouse, 1); + queryWrapper1.eq(BusinessPreOrderEntity::getIsDeleted, 0); + List list1 = baseMapper.selectList(queryWrapper1); + if (!list1.isEmpty()) { + return Resp.scanFail("扫描失败", "包件已入库"); + } + + + BusinessPreOrderEntity selectD = null; + // 检查包件是否入库 + for (BusinessPreOrderEntity distributionBusinessPreOrderEntity : list) { + + if (distributionBusinessPreOrderEntity.getOrderPackageCode().equals(orderPackageCode)) { + //找到这个包件 + selectD = distributionBusinessPreOrderEntity; + break; + } + } + // 全仓查询 + if (selectD == null) { + LambdaQueryWrapper queryWrapper2 = new LambdaQueryWrapper<>(); + queryWrapper2.eq(BusinessPreOrderEntity::getOrderPackageCode, orderPackageCode); + queryWrapper2.eq(BusinessPreOrderEntity::getIsDeleted, 0); + List list2 = baseMapper.selectList(queryWrapper2); + // 全仓查询 + if (!list2.isEmpty()) { + for (BusinessPreOrderEntity distributionBusinessPreOrderEntity : list2) { + if (distributionBusinessPreOrderEntity.getOrderPackageCode().equals(orderPackageCode) && "20".equals(distributionBusinessPreOrderEntity.getOrderPackageLoadingStatus())) { + return Resp.scanSuccessWithData("已装车", "当前包件已在其它车次装车,请切换后在进行扫描", distributionBusinessPreOrderEntity.getDistrCarNumber()); + } else if (distributionBusinessPreOrderEntity.getOrderPackageCode().equals(orderPackageCode) && "10".equals(distributionBusinessPreOrderEntity.getOrderPackageLoadingStatus())) { + + return Resp.scanSuccessWithData("是否切换车次", "当前包件不在当前车次,是否切换车次?", distributionBusinessPreOrderEntity.getDistrCarNumber()); + } + + selectD = distributionBusinessPreOrderEntity; + break; + } + + } + } + + if (selectD == null) { + // 暂存单查询 + TrunklineAdvanceDetailEntity entityByOrderPackageCode = trunklineAdvanceDetailClient.findEntityByOrderPackageCode(orderPackageCode); + if (Objects.isNull(entityByOrderPackageCode)) { + return Resp.scanFail("扫描失败", "包件信息不存在"); + } + return Resp.scanSuccessWithData("是否异常入库", "当前包件不在配送计划内,是否异常入库", entityByOrderPackageCode); + + + } + R r = inOrderWarehourseByFeign(businessSanDTO); + if (r.isSuccess()) { + selectD.setInWarehouse(1); + this.updateById(selectD); + int a = 0; + + if (StringUtil.isBlank(businessSanDTO.getTrayCode())) { + //记录当前车次的异常件数 + String key = RedisKeyConstant.BUSINESS_IN_CARNUMBER + businessSanDTO.getDistrCarNumber(); + Object o = bladeRedis.get(key); + if (Objects.isNull(o)) { + + // 查询当前车次的异常入库数量 + LambdaQueryWrapper queryWrapper3 = new LambdaQueryWrapper<>(); + queryWrapper3.eq(BusinessPreOrderEntity::getDistrCarNumber, distrCarNumber); + queryWrapper3.eq(BusinessPreOrderEntity::getInWarehouse, 1); + queryWrapper3.eq(BusinessPreOrderEntity::getIsDeleted, 0); + List list3 = baseMapper.selectList(queryWrapper3); + o = 1; + if (!list3.isEmpty()) { + o = list3.size(); + a = (int) o; + } + bladeRedis.setEx(key, o, 60 * 60 * 24L); + + } else { + a = (int) o; + a = a + 1; + bladeRedis.setEx(key, a, 60 * 60 * 24L); + } + } else { + + String key = RedisKeyConstant.BUSINESS_IN_CARNUMBER + businessSanDTO.getTrayCode(); + Object o = bladeRedis.get(key); + + if (Objects.isNull(o)) { + // 获取托盘上的数量 + TrayTypeDataVO trayTypeDataVO = warehouseTrayTypeClient.selectListByTrayCode(businessSanDTO.getTrayCode()); + o = 1; + if (!Objects.isNull(trayTypeDataVO)) { + o = trayTypeDataVO.getTrayNum(); + a = (int) o; + } + bladeRedis.setEx(key, o, 60 * 60 * 24L); + } else { + a = (int) o; + a = a + 1; + bladeRedis.setEx(key, a, 60 * 60 * 24L); + } + + + } + + + // 推送业务系统 + + distributionDeliveryListClient.mallClientSignfor(selectD.getFromTenantId(), businessSanDTO.getDistrCarNumber(), selectD.getAcceptWarehouseId(), orderPackageCode, AuthUtil.getTenantId()); + + + return Resp.scanSuccess("扫描成功", a + "件"); + } + return null; + } + + @Nullable + private Resp handleExceptionalWarehourse(BusinessSanDTO businessSanDTO, List list, String orderPackageCode, String distrCarNumber) { + BusinessPreOrderEntity distributionBusinessPreOrderEntity = list.get(0); + + TrunklineAdvanceDetailEntity entityByOrderPackageCode = trunklineAdvanceDetailClient.findEntityByOrderPackageCode(orderPackageCode); + // 增加异常预入库信息 + // 如找到了 保存在当前的这个配送计划任务中 + BusinessPreOrderEntity t = null; + if (entityByOrderPackageCode != null) { + // 保存包件 + t = BeanUtil.copy(entityByOrderPackageCode, BusinessPreOrderEntity.class); + assert t != null; + t.setWaybillNumber(entityByOrderPackageCode.getWaybillNo()); + t.setFirsts(entityByOrderPackageCode.getFirstPackName()); + t.setSecond(entityByOrderPackageCode.getSecondPackName()); + t.setThirdProduct(entityByOrderPackageCode.getThirdPackName()); + t.setBrandName(entityByOrderPackageCode.getBrand()); + t.setConditions(1); + t.setDriverName(distributionBusinessPreOrderEntity.getDriverName()); + t.setVehicleName(distributionBusinessPreOrderEntity.getVehicleName()); + t.setDistrCarNumber(distributionBusinessPreOrderEntity.getDistrCarNumber()); + t.setFromTenantId(distributionBusinessPreOrderEntity.getFromTenantId()); + t.setOperationStatus(1); + t.setInWarehouse(0); + t.setAcceptWarehouseId(distributionBusinessPreOrderEntity.getAcceptWarehouseId()); + t.setAcceptWarehouseName(distributionBusinessPreOrderEntity.getAcceptWarehouseName()); + t.setSendWarehouseId(distributionBusinessPreOrderEntity.getSendWarehouseId()); + t.setSendWarehouseName(distributionBusinessPreOrderEntity.getSendWarehouseName()); + this.save(t); + } + R r = inOrderWarehourseByFeign(businessSanDTO); + if (r.isSuccess() && t != null) { + t.setInWarehouse(1); + this.updateById(t); + int a = 0; + + + if (StringUtil.isNotBlank(businessSanDTO.getTrayCode())) { + + String key = RedisKeyConstant.BUSINESS_IN_CARNUMBER + businessSanDTO.getTrayCode(); + Object o = bladeRedis.get(key); + + if (Objects.isNull(o)) { + // 获取托盘上的数量 + TrayTypeDataVO trayTypeDataVO = warehouseTrayTypeClient.selectListByTrayCode(businessSanDTO.getTrayCode()); + o = 1; + if (!Objects.isNull(trayTypeDataVO)) { + o = trayTypeDataVO.getTrayNum(); + } + a = (int) o; + bladeRedis.setEx(key, o, 60 * 60 * 24L); + } else { + a = (int) o; + a = a + 1; + bladeRedis.setEx(key, a, 60 * 60 * 24L); + } + + } else { + //记录当前车次的异常件数 + Object o = bladeRedis.get(RedisKeyConstant.BUSINESS_INEXCE_CARNUMBER + businessSanDTO.getDistrCarNumber()); + String key = RedisKeyConstant.BUSINESS_INEXCE_CARNUMBER + businessSanDTO.getTrayCode(); + if (Objects.isNull(o)) { + + // 查询当前车次的异常入库数量 + LambdaQueryWrapper queryWrapper3 = new LambdaQueryWrapper<>(); + queryWrapper3.eq(BusinessPreOrderEntity::getDistrCarNumber, distrCarNumber); + queryWrapper3.eq(BusinessPreOrderEntity::getOperationStatus, 1); + queryWrapper3.eq(BusinessPreOrderEntity::getInWarehouse, 1); + queryWrapper3.eq(BusinessPreOrderEntity::getIsDeleted, 0); + List list3 = baseMapper.selectList(queryWrapper3); + a = 1; + if (!list3.isEmpty()) { + a = list3.size(); + } + bladeRedis.setEx(key, a, 60 * 60 * 24L); + + } else { + a = (int) o; + a = a + 1; + bladeRedis.setEx(key, a, 60 * 60 * 24L); + } + } + + // 推送业务系统 + + distributionDeliveryListClient.mallClientSignfor(t.getFromTenantId(), businessSanDTO.getDistrCarNumber(), t.getAcceptWarehouseId(), orderPackageCode, AuthUtil.getTenantId()); + + return Resp.scanSuccess("扫描成功", "异常" + a + "件"); + } + return null; + } + + @Override + public IPage listCarNum(IPage page, DistributionBusinessPreCarNumerPageQueryVO distributionBusinessPreCarNumerPageQueryVO) { + IPage listCarNum = baseMapper.listCarNum(page, distributionBusinessPreCarNumerPageQueryVO); + return listCarNum; + } + + + @Override + public DistributionBusinessPreCarDetalVO preCarInfoDetailByCarNumber(DistributionBusinessPreCarNumerPageQueryVO queryVO) { + if (queryVO == null || queryVO.getDistrCarNumber() == null) { + throw new IllegalArgumentException("查询参数不能为空"); + } + + List data = new ArrayList<>(); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(BusinessPreOrderEntity::getDistrCarNumber, queryVO.getDistrCarNumber()); + queryWrapper.eq(BusinessPreOrderEntity::getIsDeleted, 0); + List list = this.list(queryWrapper); + + if (list != null) { + Map> groupedData = list.stream() + .collect(Collectors.groupingBy(BusinessPreOrderEntity::getOrderCode)); + + groupedData.forEach((k, v) -> processGroupedData(k, v, data)); + } + DistributionBusinessPreCarNumerPageVO distributionBusinessPreCarNumerPageVO = baseMapper.listCarInforByCarNum(queryVO); + DistributionBusinessPreCarDetalVO distributionBusinessPreCarDetalVO = BeanUtil.copy(distributionBusinessPreCarNumerPageVO, DistributionBusinessPreCarDetalVO.class); + if (distributionBusinessPreCarDetalVO != null) { + distributionBusinessPreCarDetalVO.setDistributionBusinessPreCarOrderDetalVOList(data); + } else { + throw new ServiceException("系统异常"); + } + + return distributionBusinessPreCarDetalVO; + } + + private void processGroupedData(String orderCode, List entities, List data) { + DistributionBusinessPreCarOrderDetalVO t = new DistributionBusinessPreCarOrderDetalVO(); + t.setOrderCode(orderCode); + + int planNum = entities.size(); + int loadNum = (int) entities.stream().filter(e -> "20".equals(e.getOrderPackageLoadingStatus())).count(); + int inNum = (int) entities.stream().filter(e -> e.getInWarehouse() == 1).count(); + int inExceNum = (int) entities.stream().filter(e -> e.getOperationStatus() == 1).count(); + + String wallbillNum = entities.stream().map(BusinessPreOrderEntity::getWaybillNumber).distinct().collect(Collectors.joining(",")); + + t.setWaybillNumber(wallbillNum); + t.setLoadCarCount(loadNum); + t.setInWarehouseCount(inNum); + t.setOrderPackageCodeCount(planNum); + t.setInWarehouseExceCount(inExceNum); + List packageVOS = entities.stream().map(entity -> BeanUtil.copy(entity, DistributionBusinessPreCarDetalPackageVO.class)).collect(Collectors.toList()); + t.setDistributionBusinessPreCarDetalPackageList(packageVOS); + data.add(t); + } + + + @Override + public IPage pageByCarNum(Map distributionBusinessPreOrderDTO, IPage page) { + + IPage pageByCarNum = baseMapper.pageByCarNum(page, distributionBusinessPreOrderDTO); + + return pageByCarNum; + + } + + @Override + public R incomingPackage(InComingDTO inComingDTO) { + + BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + + if (Objects.isNull(myCurrentWarehouse)) { + return R.fail(403, "仓库信息为空"); + } + inComingDTO.setWarehouseId(myCurrentWarehouse.getId()); + inComingDTO.setWarehouseName(myCurrentWarehouse.getName()); + + if (StringUtil.isBlank(inComingDTO.getOrderPackageCode())) { + return R.fail(405, "包件码不能为空"); + } + + + // 调用feign 进行托盘半固定入库 + R r = inComingClient.incomingPackageByTaryCode(inComingDTO); + + if (r.isSuccess()) { + // 入库成功 + // + + + } + + + return r; + } + + + @ChangeAsync + @Override + public R scanOrderPackageCodeByMaster(String orderPackageCode, + String reservationCode, + String distrCarNumber, + String vehicleName, + String driverName, + String userName, + Long warehouseId, + String tenantId, + String tenantName, + String sourceTenantId) { + + + BasicdataWarehouseEntity warehouseEntity = basicdataWarehouseClient.findByName(tenantName + "仓"); + if (ObjectUtils.isNull(warehouseEntity)) { + return R.fail("仓库信息不存在"); + } + + + // 判断当前的包条码是否和当前作业的车次相同 + LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper<>(); + queryWrapper1.eq(BusinessPreOrderEntity::getOrderPackageCode, orderPackageCode); + queryWrapper1.eq(BusinessPreOrderEntity::getIsDeleted, 0); + List list1 = baseMapper.selectList(queryWrapper1); + BusinessPreOrderEntity data = null; + if (list1.isEmpty()) { + // 新增改车次的预入库信息 + TrunklineAdvanceDetailEntity entityByOrderPackageCode = trunklineAdvanceDetailClient.findEntityByOrderPackageCode(orderPackageCode); + + + data = BeanUtil.copy(entityByOrderPackageCode, BusinessPreOrderEntity.class); + data.setWaybillNumber(entityByOrderPackageCode.getWaybillNo()); + data.setFirsts(entityByOrderPackageCode.getFirstPackName()); + data.setSecond(entityByOrderPackageCode.getSecondPackName()); + data.setThirdProduct(entityByOrderPackageCode.getThirdPackName()); + data.setBrandName(entityByOrderPackageCode.getBrand()); + data.setOrderCode(entityByOrderPackageCode.getOrderCode()); + data.setConditions(1); + data.setInWarehouse(0); + data.setDriverName(driverName); + data.setVehicleName(vehicleName); + data.setDistrCarNumber(distrCarNumber); + data.setFromTenantId(sourceTenantId); + data.setOperationStatus(0); + data.setId(null); + data.setTenantId(null); + data.setReservationCode(reservationCode); + baseMapper.insert(data); + } else { + // 判断当前的包条码是否和当前作业的预约单号相同 + for (int i = 0; i < list1.size(); i++) { + if (list1.get(i).getDistrCarNumber().equals(distrCarNumber)) { + data = list1.get(i); + data.setInWarehouse(1); + } + } + if (data == null) { + // 如果没有找到 则标识当前的车次和作业车次不一致 + data = list1.get(0); + data.setDistrCarNumber(distrCarNumber); + } + baseMapper.updateById(data); + + } + + // 通过目标租户确认 目标租户对应的仓库 + + BusinessSanDTO businessSanDTO = new BusinessSanDTO(); + businessSanDTO.setOrderPackageCode(data.getOrderPackageCode()); + businessSanDTO.setDistrCarNumber(distrCarNumber); + businessSanDTO.setInWarehouseException(0); + businessSanDTO.setWarehouseName(warehouseEntity.getName()); + businessSanDTO.setWarehouseId(warehouseEntity.getId()); + R r = inOrderWarehourseByFeign(businessSanDTO); + + return r; + } +} diff --git a/blade-service/logpm-business/src/main/resources/application-dev.yml b/blade-service/logpm-business/src/main/resources/application-dev.yml new file mode 100644 index 000000000..b43dd1d0d --- /dev/null +++ b/blade-service/logpm-business/src/main/resources/application-dev.yml @@ -0,0 +1,53 @@ +#服务器端口 +server: + port: 16010 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.business.master.url} + username: ${blade.datasource.business.master.username} + password: ${blade.datasource.business.master.password} +# 627683: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.business.627683.url} +# username: ${blade.datasource.business.627683.username} +# password: ${blade.datasource.business.627683.password} +# 703623: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.business.703623.url} +# username: ${blade.datasource.business.703623.username} +# password: ${blade.datasource.business.703623.password} + diff --git a/blade-service/logpm-business/src/main/resources/application-prod.yml b/blade-service/logpm-business/src/main/resources/application-prod.yml new file mode 100644 index 000000000..a39d32f64 --- /dev/null +++ b/blade-service/logpm-business/src/main/resources/application-prod.yml @@ -0,0 +1,68 @@ +#服务器端口 +server: + port: 16010 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.prod.url} +# username: ${blade.datasource.prod.username} +# password: ${blade.datasource.prod.password} + +spring: + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + url: ${blade.datasource.warehouse.master.url} + username: ${blade.datasource.warehouse.master.username} + password: ${blade.datasource.warehouse.master.password} + 627683: + url: ${blade.datasource.warehouse.627683.url} + username: ${blade.datasource.warehouse.627683.username} + password: ${blade.datasource.warehouse.627683.password} + #rabbitmq配置 + rabbitmq: + host: 172.16.128.145 + port: 5672 + username: admin + password: Slwk@123654 + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true +xxl: + job: + accessToken: '' + admin: + addresses: http://172.16.128.147:7009/xxl-job-admin + executor: + appname: logpm-factory-xxljob + ip: 127.0.0.1 + logpath: ../data/applogs/logpm-factory-xxljob/jobhandler + logretentiondays: -1 + port: 7018 diff --git a/blade-service/logpm-business/src/main/resources/application-test.yml b/blade-service/logpm-business/src/main/resources/application-test.yml new file mode 100644 index 000000000..77e21d981 --- /dev/null +++ b/blade-service/logpm-business/src/main/resources/application-test.yml @@ -0,0 +1,77 @@ +#服务器端口 +server: + port: 16010 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.test.url} +# username: ${blade.datasource.test.username} +# password: ${blade.datasource.test.password} + +spring: + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + url: ${blade.datasource.business.master.url} + username: ${blade.datasource.business.master.username} + password: ${blade.datasource.business.master.password} + 627683: + url: ${blade.datasource.business.627683.url} + username: ${blade.datasource.business.627683.username} + password: ${blade.datasource.business.627683.password} + 645789: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.business.645789.url} + username: ${blade.datasource.business.645789.username} + password: ${blade.datasource.business.645789.password} + #rabbitmq配置 + rabbitmq: + host: 192.168.2.110 + port: 5672 + username: admin + password: Slwk@123654 + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true +xxl: + job: + accessToken: '' + admin: + addresses: http://127.0.0.1:7009/xxl-job-admin + executor: + appname: logpm-factory-xxljob + ip: 127.0.0.1 + logpath: ../data/applogs/logpm-factory-xxljob/jobhandler + logretentiondays: -1 + port: 7018 diff --git a/blade-service/logpm-business/src/main/resources/application.yml b/blade-service/logpm-business/src/main/resources/application.yml new file mode 100644 index 000000000..70efb75b7 --- /dev/null +++ b/blade-service/logpm-business/src/main/resources/application.yml @@ -0,0 +1,24 @@ +#mybatis-plus配置 +mybatis-plus: + mapper-locations: classpath:com/logpm/**/mapper/*Mapper.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.logpm.**.entity + +#swagger扫描路径配置 +swagger: + base-packages: + - org.springblade + - com.logpm + + +logging: + config: classpath:logback.xml + + +spring: + main: + allow-circular-references: true + + + + diff --git a/blade-service/logpm-business/src/main/resources/logback.xml b/blade-service/logpm-business/src/main/resources/logback.xml new file mode 100644 index 000000000..3c54a2c7f --- /dev/null +++ b/blade-service/logpm-business/src/main/resources/logback.xml @@ -0,0 +1,40 @@ + + + + logback + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf8 + + + + + ${log.path} + + ${log.path}.%d{yyyy-MM-dd}.zip + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + + + + diff --git a/blade-service/logpm-data-sharing/Dockerfile b/blade-service/logpm-data-sharing/Dockerfile index 8be760930..3984b444b 100644 --- a/blade-service/logpm-data-sharing/Dockerfile +++ b/blade-service/logpm-data-sharing/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-data-sharing/src/main/java/com/logpm/datasharing/mapper/MerchantMapper.xml b/blade-service/logpm-data-sharing/src/main/java/com/logpm/datasharing/mapper/MerchantMapper.xml index 925854e8e..04c4f8c33 100644 --- a/blade-service/logpm-data-sharing/src/main/java/com/logpm/datasharing/mapper/MerchantMapper.xml +++ b/blade-service/logpm-data-sharing/src/main/java/com/logpm/datasharing/mapper/MerchantMapper.xml @@ -25,7 +25,7 @@ and t.is_deleted = 0 - SELECT DISTINCT - lda.addvalue_id, - group_concat(DISTINCT ldad.fee) AS fee, - group_concat(DISTINCT ldad.num) AS num, - group_concat(DISTINCT ldad.id) AS addvalueDetailId, - group_concat(DISTINCT ldad.flool_num) AS floolNum, - group_concat(DISTINCT ldad.distance) AS distance, - group_concat( ldap.id SEPARATOR ',' ) AS packageListIds - FROM - logpm_distribution_addvalue lda - INNER JOIN logpm_distribution_addvalue_detail ldad ON lda.id = ldad.addvalue_id - INNER JOIN logpm_distribution_addvalue_package ldap ON ldad.id = ldap.addvalue_detail_id - WHERE lda.ref_id = #{reservationId} - GROUP BY - lda.id + SELECT DISTINCT + lda.addvalue_id, + group_concat(DISTINCT ldad.fee) AS fee, + group_concat(DISTINCT ldad.num) AS num, + group_concat(DISTINCT ldad.id) AS addvalueDetailId, + group_concat(DISTINCT ldad.flool_num) AS floolNum, + group_concat(DISTINCT ldad.distance) AS distance, + group_concat( ldap.id SEPARATOR ',' ) AS packageListIds + FROM + logpm_distribution_addvalue lda + INNER JOIN logpm_distribution_addvalue_detail ldad ON lda.id = ldad.addvalue_id + INNER JOIN logpm_distribution_addvalue_package ldap ON ldad.id = ldap.addvalue_detail_id + WHERE lda.ref_id = #{reservationId} + GROUP BY + lda.id - DELETE FROM logpm_distribution_addvalue WHERE ref_id = #{reservationId} and addvalue_id = #{addvalueType} + DELETE FROM logpm_distribution_addvalue WHERE ref_id = #{reservationId} and addvalue_id = #{addvalueType} @@ -57,219 +57,236 @@ diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryDetailsMapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryDetailsMapper.java index 4d65bdd3c..bdf33e243 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryDetailsMapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryDetailsMapper.java @@ -81,4 +81,6 @@ public interface DistributionDeliveryDetailsMapper extends BaseMapper getBillOrderInventoryExcel(@Param("param") DistributionDeliveryDetailsEntity deliveryDetails); + + List getBillLadingDetailOrderInventoryExcel(@Param("id")Long id); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryDetailsMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryDetailsMapper.xml index ad3645d37..c7b74da5e 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryDetailsMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryDetailsMapper.xml @@ -95,9 +95,8 @@ ldsl.tray_name trayName, lds.allocation_title allocation, lddd.reality_quantity preparedQuantity, lddd.stock_status, - (SELECT count(id) FROM logpm_distribution_bill_lading_scan ldbls WHERE ldbls.stock_list_id = lddd.stock_list_id and ldbls.material_type = 1) AS pick_up_quantity, + (SELECT count(id) FROM logpm_distribution_bill_lading_scan ldbls WHERE ldbls.bill_lading_id = lddd.bill_lading_id AND ldbls.stock_list_id = lddd.stock_list_id and ldbls.material_type = 1 and ldbls.scan_type=1 ) AS pickUpQuantity, CASE - WHEN ( SELECT count( id ) FROM logpm_distribution_bill_lading_scan ldbls WHERE ldbls.stock_list_id = lddd.stock_list_id AND ldbls.material_type = 1 ) = 0 THEN '待提货' WHEN lddd.quantity - ( SELECT count( id ) FROM logpm_distribution_bill_lading_scan ldbls WHERE ldbls.stock_list_id = lddd.stock_list_id AND ldbls.material_type = 1 ) > 0 THEN @@ -117,7 +116,7 @@ LEFT JOIN logpm_distribution_stock_list ldsl on lddd.stock_list_id = ldsl.id LEFT JOIN logpm_distribution_stock lds on lds.bill_lading_id = lddd.bill_lading_id and lddd.stock_list_id = lds.stock_list_id - lddd.bill_lading_id = #{param.billLadingId} and lddd.inventory_status in (1,2) + lddd.bill_lading_id = #{param.billLadingId} and lddd.inventory_status in (1,3) + + + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryInfoMapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryInfoMapper.java index 934c169bc..85c62f3e5 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryInfoMapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryInfoMapper.java @@ -181,5 +181,5 @@ public interface DistributionDeliveryInfoMapper extends BaseMapper selectAppTarysListPage(IPage page,@Param("reservationId") Long id); + List selectAppTarysListPage(@Param("reservationId") Long id); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryInfoMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryInfoMapper.xml index ab317cc83..04284c85c 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryInfoMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryInfoMapper.xml @@ -121,6 +121,8 @@ FROM logpm_distribution_stockup_info AS ldsi LEFT JOIN logpm_distribution_stockup AS ldss ON ldsi.stockup_id = ldss.id + WHERE + ldsi.stock_status != 4 ) AS t ON t.reservation_id = lds.reservation_id lds.is_deleted = 0 and lds.delivery_id = #{id} and ldr.reservation_status != 40 AND (ldr.reservation_num + ldr.reservation_stock_list_num) > 0 @@ -129,7 +131,7 @@ SELECT DISTINCT ldr.id id, - ldr.consignee consignee, - COALESCE ( lds.loaded_number + lds.loadedin_number, 0 ) loadingNub, + GROUP_CONCAT(DISTINCT CONCAT(ldr.receiving_unit,'(',ldr.consignee),')') AS consignee, COALESCE ( ldr.reservation_num + ldr.reservation_stock_list_num, 0 ) reservationNum, ( SELECT COALESCE @@ -573,10 +576,19 @@ AND ldrs.stock_article_status IN ( 1, 3 ) ) ordNub, COALESCE ( lds.received_quantity + lds.receivedin_quantity, 0 ) signNub, - ldsk.stockup_area stockupArea, (SELECT SUM(reservation_num) FROM logpm_distribution_reservation_stocklist WHERE reservation_id = ldr.id ) inventoryNub, - IFNULL((SELECT SUM(loaded_nub) FROM logpm_distribution_loadscan WHERE reservation_id = lds.reservation_id AND is_abnormal_loading != 2 AND is_deleted = 0 ),0) + IFNULL((SELECT SUM(loaded_nub) FROM logpm_distribution_loadscaninvn WHERE reservation_id = lds.reservation_id AND scan_status != 1 AND is_deleted = 0 ),0) AS loadingNub, - IFNULL((SELECT SUM(stock_quantity) FROM logpm_distribution_stock WHERE reservation_id = lds.reservation_id AND is_deleted = 0 ),0) AS stockupNum + IFNULL((SELECT SUM(loaded_nub) FROM logpm_distribution_loadscan WHERE reservation_id = lds.reservation_id AND is_deleted = 0 AND scan_status != 1),0) + IFNULL((SELECT SUM(loaded_nub) FROM logpm_distribution_loadscaninvn WHERE reservation_id = lds.reservation_id AND scan_status != 1 AND is_deleted = 0 ),0) AS loadingNub, + IFNULL((SELECT SUM(stock_quantity) FROM logpm_distribution_stock WHERE reservation_id = lds.reservation_id AND is_deleted = 0 ),0) AS stockupNum, + (SELECT + GROUP_CONCAT( DISTINCT lwga.qr_code ) stockupArea + FROM + logpm_distribution_signfor AS sign + LEFT JOIN logpm_distribution_stock AS lds ON lds.reservation_id = sign.reservation_id + LEFT JOIN logpm_warehouse_goods_allocation AS lwga ON lds.stockup_area_id = lwga.id + WHERE + sign.reservation_id = ldr.id + GROUP BY + sign.delivery_id) AS stockupArea FROM logpm_distribution_signfor lds LEFT JOIN logpm_distribution_reservation ldr ON ldr.id = lds.reservation_id @@ -788,6 +800,7 @@ FROM LEFT JOIN logpm_distribution_stockup AS ldss ON ldsi.stockup_id = ldss.id WHERE ldsi.reservation_id = lds.reservation_id + AND ldsi.stock_status != '4' ) AS forkliftName, CASE WHEN ldr.stockup_status ='10' THEN '待指派' diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryListMapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryListMapper.java index 209a3ed9b..65f50cbbf 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryListMapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryListMapper.java @@ -16,11 +16,9 @@ */ package com.logpm.distribution.mapper; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.logpm.distribution.dto.DistributionDeliveryInfoDTO; import com.logpm.distribution.dto.DistributionDeliveryListDTO; import com.logpm.distribution.dto.DistributionLoadingNumDTO; import com.logpm.distribution.dto.app.DistributionAppDeliveryListDTO; @@ -60,7 +58,7 @@ public interface DistributionDeliveryListMapper extends BaseMapper exportDistributionDeliveryList(@Param("params") Map map); + List exportDistributionDeliveryList(@Param("param") Map map); /** * 商配车次 * @@ -428,7 +426,7 @@ public interface DistributionDeliveryListMapper extends BaseMapper selectSignforByDeliveryId(@Param("deliveryId")Long deliveryId); + /** + * 检查配送任务是否进行发车 + * @return + */ + Boolean checkDeliveryStart(@Param("deliveryId")Long deliveryId); + + } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryListMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryListMapper.xml index de38fcea5..9e7f79f84 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryListMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionDeliveryListMapper.xml @@ -192,14 +192,14 @@ ) inventoryNub, ( SELECT - COALESCE (sum(lds.loaded_number), 0) + COALESCE (sum(lds.loaded_number), 0) + COALESCE (sum(lds.loadedin_number), 0) FROM logpm_distribution_signfor lds WHERE lddl.id = lds.delivery_id ) scannedNumber, (SELECT - COALESCE (sum(lds.received_quantity), 0) + COALESCE (sum(lds.received_quantity), 0) + COALESCE (sum(lds.receivedin_quantity), 0) FROM logpm_distribution_signfor lds WHERE @@ -213,10 +213,18 @@ LEFT JOIN logpm_distribution_reservation ldr on ldr.id = lds.reservation_id LEFT JOIN (SELECT lddl.id,ldsa.order_code FROM logpm_distribution_delivery_list lddl LEFT JOIN logpm_distribution_signfor lds ON lddl.id = lds.delivery_id LEFT JOIN logpm_distribution_reservation_stockarticle AS ldrs ON lds.reservation_id = ldrs.reservation_id AND ldrs.stock_article_status != 2 LEFT JOIN logpm_distribution_stock_article AS ldsa ON ldrs.stock_article_id = ldsa.id ) AS y ON y.id = lddl.id - lddl.is_deleted = 0 AND (IF(lddl.delivery_number is null ,0,lddl.delivery_number) + IF(lddl.inventory_nub is null ,0,lddl.inventory_nub)) > 0 AND (lddl.customers_number > 0 AND ldr.reservation_num + ldr.reservation_stock_list_num) >0 + lddl.is_deleted = 0 + AND (IF(lddl.delivery_number is null ,0,lddl.delivery_number) + IF(lddl.inventory_nub is null ,0,lddl.inventory_nub)) > 0 + AND (lddl.customers_number > 0 AND ldr.reservation_num + ldr.reservation_stock_list_num) >0 and lddl.train_number like concat('%',#{param.trainNumber},'%') + + and lddl.train_number IN + + #{train} + + and lddl.warehouse_id in @@ -268,6 +276,9 @@ and date_format(lddl.task_time,'%y%m%d%') = date_format(#{param.taskTime},'%y%m%d%') + + and date_format(lddl.task_time,'%y%m%d%') BETWEEN date_format( #{param.taskTimeStart}, '%y%m%d%' ) AND date_format( #{param.taskTimeEnd}, '%y%m%d%' ) + GROUP BY lddl.id , lddl.train_number , @@ -305,34 +316,35 @@ - + SELECT + lddl.id id, + lww.NAME AS warehouseName, + lddl.train_number trainNumber, + lddl.warehouse_name warehouseName, + lddl.warehouse_id warehouseId, + lddl.vehicle_name vehicle, + lddl.driver_name driver, + lddl.vehicle_id vehicleId, + lddl.driver_id driverId, + lddl.distribution_company distributionCompany, + lddl.delivery_status deliveryStatus, + lddl.delivery_list_loading_status deliveryListLoadingStatus, + GROUP_CONCAT( y.order_code ) AS orderCode, CASE lddl.kind WHEN 1 THEN '自主配送' WHEN 2 THEN - '三方配送' - END kindName, + '三方配送' ELSE '其他' + END kind, CASE lddl.type WHEN 1 THEN '商配' WHEN 2 THEN '市配' - END deliveryTypeName, - IF - ( lddl.kind = 1, GROUP_CONCAT( DISTINCT ldds.driver_name ), lddt.driver_name ) AS driverName, - IF - ( lddl.kind = 1, GROUP_CONCAT( DISTINCT ldds.driver_phone ), lddt.driver_phone ) AS driverPhone, - IF - ( lddl.kind = 1, GROUP_CONCAT( DISTINCT ldds.vehicle_nub ), lddt.vehicle_num ) AS vehicleNum, - lddl.distribution_company, + END type, CASE lddl.delivery_status WHEN 1 THEN @@ -340,80 +352,255 @@ WHEN 2 THEN '配送中' WHEN 3 THEN - '已完成' - END deliveryStatusName, - lddl.customers_number AS customersNumber, - lddl.order_number AS orderNumber, - lddl.delivery_number AS deliveryNumber, - lddl.inventory_nub AS inventoryNub, + '已完成' ELSE '其他' + END state, + ( + SELECT + GROUP_CONCAT( DISTINCT ldsu.forklift_name SEPARATOR ',' ) + FROM + logpm_distribution_signfor lds + JOIN logpm_distribution_reservation ldr ON lds.reservation_id = ldr.id + JOIN logpm_distribution_stockup_info ldsi ON ldr.id = ldsi.reservation_id + JOIN logpm_distribution_stockup ldsu ON ldsu.id = ldsi.stockup_id + WHERE + lds.delivery_id = lddl.id + ) forkliftName, + lddl.create_time createTime, + ( + SELECT COALESCE + ( COUNT(*), 0 ) + FROM + logpm_distribution_signfor lds + INNER JOIN logpm_distribution_reservation AS ldr ON lds.reservation_id = ldr.id + WHERE + lds.delivery_id = lddl.id + AND ldr.reservation_status != '40' + AND ( ldr.reservation_num + ldr.reservation_stock_list_num ) > 0 + ) customersNumber, + lddl.price price, + lddl.added_services_id addedServicesId, + ( + SELECT COALESCE + ( COUNT(*), 0 ) + FROM + logpm_distribution_signfor lds + JOIN logpm_distribution_reservation ldr ON lds.reservation_id = ldr.id + JOIN logpm_distribution_reservation_stockarticle ldrs ON ldrs.reservation_id = ldr.id + WHERE + lds.delivery_id = lddl.id + AND ldrs.stock_article_status != 2 + ) orderNumber, + ( + SELECT COALESCE + ( sum( ldr.reservation_num ), 0 ) + FROM + logpm_distribution_signfor lds + JOIN logpm_distribution_reservation ldr ON lds.reservation_id = ldr.id + WHERE + lds.delivery_id = lddl.id + AND ldr.reservation_status != '40' + ) deliveryNumber, + ( + SELECT COALESCE + ( sum( ldr.reservation_stock_list_num ), 0 ) + FROM + logpm_distribution_signfor lds + JOIN logpm_distribution_reservation ldr ON lds.reservation_id = ldr.id + WHERE + lds.delivery_id = lddl.id + ) reservationStockListNum, ( SELECT - COALESCE (sum(lds.loaded_number + lds.loadedin_number), 0) + GROUP_CONCAT( DISTINCT lds.loader_name SEPARATOR ',' ) + FROM + logpm_distribution_signfor ldsf + JOIN logpm_distribution_reservation ldr ON ldr.id = ldsf.reservation_id + JOIN logpm_distribution_stockup_info AS ldsi ON ldr.id = ldsi.reservation_id + INNER JOIN logpm_distribution_stockup AS lds ON ldsi.stockup_id = lds.id + WHERE + ldsf.delivery_id = lddl.id + ) loadingTeamName, + ( + SELECT + GROUP_CONCAT( DISTINCT lds.fix_time SEPARATOR ',' ) + FROM + logpm_distribution_signfor ldsf + JOIN logpm_distribution_reservation ldr ON ldr.id = ldsf.reservation_id + JOIN logpm_distribution_stockup_info AS ldsi ON ldr.id = ldsi.reservation_id + INNER JOIN logpm_distribution_stockup AS lds ON ldsi.stockup_id = lds.id + WHERE + ldsf.delivery_id = lddl.id + ) reservationId, + lddl.order_id orderId, + lddl.fee fee, + lddl.task_time taskTime, + lddl.loading_time loadingTime, + lddl.note_number noteNumber, + lddl.source source, + ( + SELECT COALESCE + ( sum( ldr.reservation_stock_list_num ), 0 ) + FROM + logpm_distribution_signfor lds + JOIN logpm_distribution_reservation ldr ON lds.reservation_id = ldr.id + WHERE + lds.delivery_id = lddl.id + ) inventoryNub, + ( + SELECT COALESCE + ( sum( lds.loaded_number ), 0 ) + COALESCE ( sum( lds.loadedin_number ), 0 ) FROM logpm_distribution_signfor lds WHERE lddl.id = lds.delivery_id ) scannedNumber, - (SELECT - COALESCE (sum(lds.received_quantity + receivedin_quantity), 0) + ( + SELECT COALESCE + ( sum( lds.received_quantity ), 0 ) + COALESCE ( sum( lds.receivedin_quantity ), 0 ) FROM logpm_distribution_signfor lds WHERE lddl.id = lds.delivery_id ) signingNumber, - GROUP_CONCAT( lddl.loading_team_name, lddl.unloading_team_name ) AS handlingCrew + GROUP_CONCAT( DISTINCT a.consignee SEPARATOR ',' ) consignee, + GROUP_CONCAT( DISTINCT a.mallName SEPARATOR ',' ) mallName, + ( + SELECT + group_concat( DISTINCT ldsa.order_code SEPARATOR ',' ) FROM - logpm_distribution_delivery_list AS lddl - LEFT JOIN logpm_distribution_signfor AS lds ON lddl.id = lds.delivery_id - LEFT JOIN logpm_distribution_reservation AS ldr ON lds.reservation_id = ldr.id - LEFT JOIN logpm_distribution_delivery_self AS ldds ON ldds.delivery_id = lddl.id - LEFT JOIN logpm_distribution_delivery_tripartite AS lddt ON ldds.delivery_id = lddl.id - - lddl.is_deleted = 0 and lds.is_deleted = 0 and ldr.is_deleted = 0 and ldds.is_deleted = 0 and lddt.is_deleted = 0 - - AND lddl.id in - - #{item} - - - - AND lddl.train_number like concat('%',#{params.trainNumber},'%') - - - AND ldr.consignee like concat('%',#{params.clineName},'%') - - - AND ldr.mall_name like concat('%',#{params.mallName},'%') - - - AND lddl.type = #{params.type} - - - AND lddl.kind = #{params.kind} - - - AND ldds.vehicle_nub like concat('%',#{params.vehicleName},'%') - - - AND ldds.driver_name like concat('%',#{params.driverName},'%') - - - AND ldds.distribution_company like concat('%',#{params.distributionCompany},'%') - - - AND ldds.task_time like concat('%',#{params.taskTime},'%') - - - AND lddl.delivery_status =#{params.deliveryStatus} - - + logpm_distribution_delivery_list lddll + LEFT JOIN logpm_distribution_signfor lds ON lddll.id = lds.delivery_id + LEFT JOIN logpm_distribution_reservation_stockarticle AS ldrs ON lds.reservation_id = ldrs.reservation_id + AND ldrs.stock_article_status != 2 + LEFT JOIN logpm_distribution_stock_article AS ldsa ON ldrs.stock_article_id = ldsa.id + WHERE + lddll.id = lddl.id + GROUP BY + lddl.id + ) AS orderCode + FROM + logpm_distribution_delivery_list lddl + LEFT JOIN ( + SELECT + lddl.id, + ldr.consignee AS consignee, + ldr.mall_name AS mallName + FROM + logpm_distribution_delivery_list lddl + LEFT JOIN logpm_distribution_signfor lds ON lddl.id = lds.delivery_id + LEFT JOIN logpm_distribution_reservation ldr ON ldr.id = lds.reservation_id + WHERE + IF + ( lddl.delivery_number IS NULL, 0, lddl.delivery_number ) + + IF + ( lddl.inventory_nub IS NULL, 0, lddl.inventory_nub ) > 0 + AND ( lddl.customers_number > 0 AND ldr.reservation_num + ldr.reservation_stock_list_num ) > 0 + AND lds.is_deleted = 0 + AND lddl.is_deleted = 0 + AND ldr.is_deleted = 0 GROUP BY lddl.id + ) AS a ON a.id = lddl.id + LEFT JOIN ( + SELECT + lddl.id, + ldsa.order_code + FROM + logpm_distribution_delivery_list lddl + LEFT JOIN logpm_distribution_signfor lds ON lddl.id = lds.delivery_id + LEFT JOIN logpm_distribution_reservation_stockarticle AS ldrs ON lds.reservation_id = ldrs.reservation_id + AND ldrs.stock_article_status != 2 + LEFT JOIN logpm_distribution_stock_article AS ldsa ON ldrs.stock_article_id = ldsa.id + ) AS y ON y.id = lddl.id + LEFT JOIN logpm_warehouse_warehouse AS lww ON lddl.warehouse_id = lww.id + + lddl.is_deleted = 0 + AND (IF(lddl.delivery_number is null ,0,lddl.delivery_number) + IF(lddl.inventory_nub is null ,0,lddl.inventory_nub)) > 0 + AND lddl.customers_number > 0 + + and lddl.id in + + #{item} + + + + and lddl.train_number like concat('%',#{param.trainNumber},'%') + + + and lddl.warehouse_id in + + #{item} + + + + and lddl.warehouse_name like concat('%',#{param.warehouseName},'%') + + + and a.consignee like concat('%',#{param.clineName},'%') + + + and a.mall_name like concat('%',#{param.mallName},'%') + + + and lddl.vehicle_name like concat('%',#{param.vehicleName},'%') + + + and lddl.driver_name like concat('%',#{param.driverName},'%') + + + and lddl.loading_team_name like concat('%',#{param.loadingTeamName},'%') + + + and y.order_code like concat('%',#{param.orderCode},'%') + + + and lddl.kind = #{param.kind} + + + and lddl.distribution_company = #{param.distributionCompany} + + + and lddl.type = #{param.type} + + + and lddl.delivery_status = #{param.deliveryStatus} + + + and date_format(lddl.create_time,'%y%m%d%') = date_format(#{param.createTime_query},'%y%m%d%') + + + and date_format(lddl.lead_time,'%y%m%d%') = date_format(#{param.leadTime},'%y%m%d%') + + + and date_format(lddl.loading_time,'%y%m%d%') = date_format(#{param.loadingTime},'%y%m%d%') + + + and date_format(lddl.task_time,'%y%m%d%') = date_format(#{param.taskTime},'%y%m%d%') + + + and date_format(lddl.task_time,'%y%m%d%') BETWEEN #{param.taskTimeStart} AND #{param.taskTimeEnd} + + + GROUP BY lddl.id , + lddl.train_number, + lddl.warehouse_name , + lddl.warehouse_id , + lddl.type , + lddl.kind , + lddl.vehicle_name , + lddl.driver_name , + lddl.vehicle_id , + lddl.driver_id , + lddl.distribution_company , + lddl.delivery_status , + lddl.delivery_list_loading_status + ORDER BY + lddl.create_time DESC + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionLoadscanMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionLoadscanMapper.xml index dcf611d7d..325dbd2d4 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionLoadscanMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionLoadscanMapper.xml @@ -2,154 +2,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -203,7 +56,7 @@ - select * from logpm_distribution_loadscan where is_deleted = 0 diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.java index 63ac1720d..a0bff054b 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.java @@ -108,7 +108,7 @@ public interface DistributionParcelListMapper extends BaseMapper getParcelListInfo(@Param("param")DistributionParcelListVO parcelListVO); - List exportDistributionParcelList(@Param("paramMap")Map paramMap, @Param("idArr") List idArr); + List exportDistributionParcelList(@Param("param")Map paramMap, @Param("idArr") List idArr); void freezeByOrderCode(@Param("orderCode") String orderCode,@Param("freezeStatus") String freezeStatus); @@ -239,6 +239,13 @@ public interface DistributionParcelListMapper extends BaseMapper selectPackagePlanBillLading(@Param("orderPackageCode")String orderPackageCode,@Param("warehouseId") Long warehouseId); + /** + * 查询自提包件计划记录 + * @param orderPackageCode + * @param id + * @return + */ + /** * 查询自提签收扫描记录 @@ -259,4 +266,34 @@ public interface DistributionParcelListMapper extends BaseMapper类型的集合,包含匹配的包裹列表实体。 */ List findListByIds(@Param("parcelListIds") Set parcelListIds, @Param("warehouseId") Long warehouseId); + + void updatePackageStatus(@Param("orderPackageCodes") List orderPackageCodes, @Param("warehouseId") Long warehouseId, @Param("packageStatus") String packageStatus); + + List findListByOrderPackageCode(@Param("orderPackageCodes") List orderPackageCodes, @Param("warehouseId") Long warehouseId); + + void updateFreezeStatusByWaybillIds(@Param("waybillIds") List waybillIds); + + void updateUnFreezeStatusByWaybillIds(@Param("waybillIds") List waybillIds); + + void clearParceListWaybillByAdvanceIds(@Param("advanceIds") List advanceIds); + + List findPackagesByAdvanceIdsAndNoStock(@Param("advanceIds") List advanceIds, @Param("warehouseId") Long warehouseId); + + List findAllOrderCodesByAdvanceIds(@Param("advanceIds") List advanceIds, @Param("warehouseId") Long warehouseId); + + void removePakcageByAdvanceIds(@Param("advanceIds") List advanceIds, @Param("warehouseId") Long warehouseId); + + List> findPackageCodeByCodes(@Param("keySet") Set keySet); + + List findALLNoUpShelfPackageByOrderCodeList(@Param("orderCodeList") List orderCodeList, @Param("warehouseId") Long warehouseId); + + List findOrderCodesByOrderPackageCodes(@Param("orderPackageCodes") List orderPackageCodes, @Param("warehouseId") Long warehouseId); + + String findAllTraysByNoParcelListIds(@Param("parcelListIdList") List parcelListIdList,@Param("orderCode") String orderCode); + + void clearPalletByIds(@Param("clearTrayList") List clearTrayList); + + String findAllAllocationByNoParcelListIds(@Param("parcelListIdList") List parcelListIdList, @Param("orderCode") String orderCode); + + void clearAllocationByIds(@Param("clearTrayList") List clearTrayList); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.xml index a2656ea9b..be84bce3c 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.xml @@ -61,7 +61,7 @@ @@ -473,7 +543,7 @@ LEFT JOIN logpm_warehouse_tray_goods lwtg on lwtg.association_id = ldpl.id and lwtg.association_type = '3' LEFT JOIN logpm_warehouse_tray lwt on lwtg.tray_id = lwt.id - ldsi.stockup_id =#{id} and ldpl.order_package_code is not null and ldsi.stock_status != 4 + ldsi.stockup_id =#{id} and ldpl.order_package_code is not null and ldsi.stock_status != 4 AND ldrp.packet_bar_status != 2 SELECT - ldpl.warehouse_id warehouseId, - ldpl.id id, - lww.name warehouse, - ldpl.conditions conditions, - ldpl.order_package_code orderPackageCode, - ldpl.firsts firsts, - ldpl.second second, - ldpl.third_product thirdProduct, - ldpl.quantity quantity, - ldpl.train_number trainNumber, - ldpl.stock_article_id stockArticleId, - ldpl.order_code orderCode, - ldpl.service_number serviceNumber, - ldpl.material_id materialId, - ldpl.material_name materialName, - ldpl.brand_name brandName, - ldpl.order_package_freeze_status orderPackageFreezeStatus, - ldpl.order_package_grounding_status orderPackageGroundingStatus, - ldpl.order_package_stockup_status orderPackageStockupStatus, - ldpl.order_package_reservation_status orderPackageReservationStatus, - ldpl.order_package_loading_status orderPackageLoadingStatus, - ldpl.waybill_number waybillNumber, - ldpl.warehouse_entry_time_end warehouseEntryTimeEnd, - ldpl.waybill_number waybillNumber, - lwug.position_code goodsAllocation, - lwtg.tray_code pallet + ldpl.warehouse_id warehouseId, + ldpl.id id, + lww.name warehouse, + CASE ldpl.conditions + WHEN 1 THEN '订制品' + WHEN 2 THEN '库存品' + WHEN 3 THEN '零担' + END conditions, + ldpl.order_package_code orderPackageCode, + ldpl.firsts firsts, + ldpl.second second, + ldpl.third_product thirdProduct, + ldpl.quantity quantity, + ldpl.train_number trainNumber, + ldpl.stock_article_id stockArticleId, + ldpl.order_code orderCode, + ldpl.service_number serviceNumber, + ldpl.material_id materialId, + ldpl.material_name materialName, + ldpl.material_code materialCode, + ldpl.brand_name brandName, + ldpl.order_package_status orderPackageStatus, + ldpl.order_package_freeze_status orderPackageFreezeStatus, + ldpl.order_package_grounding_status orderPackageGroundingStatus, + ldpl.order_package_stockup_status orderPackageStockupStatus, + ldpl.order_package_reservation_status orderPackageReservationStatus, + ldpl.order_package_loading_status orderPackageLoadingStatus, + ldpl.warehouse_entry_time_end warehouseEntryTimeEnd, + ldpl.waybill_number waybillNumber, + ldsa.type_service typeService, + ldpl.order_code, + IF(c.reservation_code is not null,c.reservation_code,IF(b.pickup_batch is not null,b.pickup_batch,a.reservation_code)) AS reservationCode, + IF(c.driver_name is not null,c.driver_name,IF(b.consignee is not null,b.consignee,a.driver_name)) AS driverName, + IF(c.vehicle_name is not null,c.vehicle_name,IF(b.pick_up_plate is not null,b.pick_up_plate,a.vehicle_name)) AS vehicleName, + IF(c.train_number is not null,c.train_number,IF(b.train_number is not null,b.train_number,a.train_number)) AS trainNumber, + IF(c.scan_user is not null,c.scan_user,IF(b.scan_user is not null,b.scan_user,a.scan_user)) AS scanUser, + IF(c.signing_user is not null,c.signing_user,IF(b.signing_user is not null,b.signing_user,a.signing_user)) AS signingUser, + IF(c.scan_time is not null,c.scan_time,IF(b.scan_time is not null,b.scan_time,a.scan_time)) AS loadingTime, + IF(c.signing_time is not null,c.signing_time,IF(b.signing_time is not null,b.signing_time,a.signing_time)) AS signingTime, + m.qr_code AS goodsAllocation, + n.pallet_name AS pallet FROM - logpm_platform.logpm_distribution_parcel_list ldpl - LEFT JOIN logpm_platform.logpm_warehouse_updown_goods lwug ON ldpl.id = lwug.association_id - LEFT JOIN logpm_platform.logpm_warehouse_tray_goods lwtg ON ldpl.id = lwtg.association_id - Left join logpm_platform.logpm_warehouse_warehouse lww on lww.id = ldpl.warehouse_id + logpm_distribution_parcel_list AS ldpl + LEFT JOIN logpm_warehouse_updown_goods lwug ON ldpl.id = lwug.association_id + LEFT JOIN logpm_warehouse_tray_goods lwtg ON ldpl.id = lwtg.association_id + LEFT join logpm_distribution_stock_article ldsa on ldsa.id = ldpl.stock_article_id + LEFT join logpm_warehouse_warehouse lww on lww.id = ldpl.warehouse_id + LEFT JOIN (SELECT lwug.association_id,lwga.qr_code,lwug.is_deleted FROM logpm_warehouse_updown_goods AS lwug LEFT JOIN logpm_warehouse_goods_allocation AS lwga ON lwug.allocation_id = lwga.id ) AS m ON m.association_id = ldpl.id + LEFT JOIN (SELECT lwtg.association_id,lwt.pallet_name,lwtg.is_deleted FROM logpm_warehouse_tray_goods AS lwtg LEFT JOIN logpm_warehouse_tray AS lwt ON lwtg.tray_id = lwt.id) AS n ON n.association_id = ldpl.id + LEFT JOIN + (SELECT + ldrp.parce_list_id, + ldl.scan_time, + lddl.train_number, + lddl.driver_name, + lddl.vehicle_name, + ldl.signing_time, + ldl.scan_user, + ldl.signing_user, + ldr.reservation_code + FROM logpm_distribution_reservation_package ldrp + LEFT JOIN logpm_distribution_loadscan ldl on ldl.package_id = ldrp.parce_list_id and ldl.scan_status !=1 AND ldl.is_deleted = 0 + LEFT JOIN logpm_distribution_reservation ldr on ldr.id = ldrp.reservation_id + LEFT JOIN logpm_distribution_signfor AS lds ON lds.reservation_id = ldr.id + LEFT JOIN logpm_distribution_delivery_list lddl on lds.delivery_id =lddl.id + + ldrp.packet_bar_status != '2' + + and ldr.reservation_code like concat(#{param.reservationCode},'%') + + + and date_format(from_unixtime(ldl.scan_time),'%Y-%m-%d') = date_format(#{param.scanTime}),'%Y-%m-%d') + + + and date_format(from_unixtime(ldl.signing_time),'%Y-%m-%d') = date_format(#{param.signingTime}),'%Y-%m-%d') + + + and lddl.train_number = #{param.dvehicleName} + + + and lddl.vehicle_name like concat('%',#{param.vehicleName},'%') + + + and lddl.vehicle_name like concat('%',#{param.vehicleName},'%') + + + and lddl.driver_name like concat('%',#{param.driverName},'%') + + + and ldl.scan_user like concat('%',#{param.scanUser},'%') + + + and ldl.signing_user like concat('%',#{param.signingUser},'%') + + + ) AS a ON a.parce_list_id = ldpl.id + LEFT JOIN ( + SELECT + ldbp.parce_list_id, + ldbl.pickup_batch, + ldbl.pickup_batch AS train_number, + ldbl.pick_up_plate AS pick_up_plate, + ldbl.consignee AS consignee, + ldbls.create_time AS scan_time, + ldbls.create_time AS signing_time, + ldbls.scan_user AS scan_user, + ldbls.scan_user AS signing_user + FROM + logpm_distrilbution_bill_package AS ldbp + LEFT JOIN logpm_distrilbution_bill_lading ldbl ON ldbl.id = ldbp.bill_lading_id + LEFT JOIN logpm_distribution_bill_lading_scan ldbls ON ldbls.parcel_list_id = ldbp.parce_list_id + + ldbp.packet_bar_status != '2' + + and ldbl.pickup_batch like concat(#{param.reservationCode},'%') + + + and date_format(from_unixtime(ldl.created_time),'%Y-%m-%d') = date_format(#{param.scanTime}),'%Y-%m-%d') + + + and date_format(from_unixtime(ldl.created_time),'%Y-%m-%d') = date_format(#{param.signingTime}),'%Y-%m-%d') + + + and ldbl.pickup_batch = #{param.dvehicleName} + + + and ldbl.pick_up_plate like concat('%',#{param.vehicleName},'%') + + + and lddl.consignee like concat('%',#{param.driverName},'%') + + + and ldbls.scan_user like concat('%',#{param.scanUser},'%') + + + and ldbls.scan_user like concat('%',#{param.signingUser},'%') + + + ) AS b ON b.parce_list_id = ldpl.id + LEFT JOIN ( + SELECT + ldrzp.parcel_list_id, + IF(lddl.train_number is not null,lddl.train_number,ldbl.pickup_batch) AS train_number, + IF(lddl.driver_name is not null,lddl.driver_name,ldbl.consignee) AS driver_name, + IF(lddl.vehicle_name is not null,lddl.vehicle_name,ldbl.pick_up_plate) AS vehicle_name, + IF(ldl.signing_time is not null,ldl.signing_time,ldbls.create_time) AS signing_time, + IF(ldl.scan_time is not null,ldl.scan_time,ldbls.create_time) AS scan_time, + IF(ldl.scan_user is not null,ldl.scan_user,ldbls.scan_user) AS scan_user, + IF(ldl.signing_user is not null,ldl.signing_user,ldbls.scan_user) AS signing_user, + IF(ldr.reservation_code is not null,ldr.reservation_code,ldbl.pickup_batch) AS reservation_code + FROM logpm_distribution_reservation_zero_package ldrzp + LEFT JOIN logpm_distribution_loadscan ldl on ldl.package_id = ldrzp.parcel_list_id and ldl.scan_status !=1 AND ldl.is_deleted = 0 + LEFT JOIN logpm_distribution_reservation ldr on ldr.id = ldrzp.reservation_id + LEFT JOIN logpm_distribution_signfor AS lds ON lds.reservation_id = ldr.id + LEFT JOIN logpm_distribution_delivery_list lddl on lds.delivery_id =lddl.id + LEFT JOIN logpm_distrilbution_bill_lading ldbl ON ldrzp.reservation_id = ldbl.id + LEFT JOIN logpm_distribution_bill_lading_scan ldbls ON ldbls.parcel_list_id = ldrzp.parcel_list_id + ) AS c ON c.parcel_list_id = ldpl.id ldpl.is_deleted = 0 - - and ldpl.warehouse_id = #{paramMap.warehouseId} + + and lww.name like concat('%',#{param.warehouse},'%') + + + and n.pallet_name like concat('%',#{param.warehouse},'%') - - and ldpl.tenant_id = #{paramMap.tenantId} + + and m.qr_code like concat('%',#{param.warehouse},'%') - - and ldpl.service_Number = #{paramMap.serviceNumber} + + and ldpl.order_package_grounding_status = #{param.orderPackageGroundingStatus} + + + and ldpl.warehouse_id in + + #{item} + - + + and ldpl.order_package_code like concat(#{param.orderPackageCode},'%') + + + and ldpl.firsts = #{param.firsts} + + + and ldpl.second = #{param.second} + + + and ldpl.third_product = #{param.thirdProduct} + + + and ldpl.quantity = #{param.quantity} + + + and ldpl.train_number = #{param.trainNumber} + + + and ldpl.stock_article_id like concat('%',#{param.stockArticleId},'%') + + + and ldpl.order_code like concat(#{param.orderCode},'%') + + + and ldpl.service_number like concat('%',#{param.serviceNumber},'%') + + + and ldpl.material_name like concat('%',#{param.materialName},'%') + + + and ldpl.material_code =#{param.materialCode} + + + and ldpl.brand_name like concat('%',#{param.brandName},'%') + + + and ldpl.order_package_freeze_status = #{param.orderPackageFreezeStatus} + + + and ldpl.order_package_loading_status = #{param.orderPackageLoadingStatus} + + + and ldpl.order_package_reservation_status = #{param.orderPackageReservationStatus} + + + and lwtg.tray_code = #{param.pallet} + + + and lwug.position_code = #{param.goodsAllocation} + + + and ldpl.conditions = #{param.conditions} + + + and ldpl.order_package_status = #{param.orderPackageStatus} + + + and ldpl.waybill_number = #{param.waybillNumber} + + + and ldpl.warehouse_entry_time_end BETWEEN #{param.startWarehouseEntryTimeEnd} AND #{param.lastWarehouseEntryTimeEnd} + + and ldpl.id in #{item} @@ -971,7 +1235,11 @@ FROM logpm_distribution_parcel_list AS ldpl WHERE - ldpl.order_package_reservation_status = 10 and ldpl.order_package_freeze_status = 10 AND ldpl.order_package_loading_status = 10 AND order_package_status IN (10,20) + ldpl.order_package_reservation_status = 10 + and ldpl.order_package_freeze_status = 10 + AND ldpl.order_package_loading_status = 10 + AND ldpl.conditions = 1 + AND order_package_status IN (10,20) and ldpl.stock_article_id = #{param.orderId} and ldpl.warehouse_id = #{warehouseId} and ldpl.waybill_number like concat('%',#{param.waybillNumber},'%') @@ -1159,7 +1427,7 @@ ldpl.quantity AS quantity, ldpl.train_number AS tranNumber, ldpl.waybill_number AS waybillNumber, - ldrp.create_time AS nodeTime, + ldrp.update_time AS nodeTime, ldrp.create_user AS nodeControlsUserId, '配送取消' AS nodeName, lwt.pallet_name, @@ -1243,7 +1511,13 @@ ldl.signing_user AS nodeControlsUserName, ldl.signing_user_id AS nodeControlsUserId, IF(ldla.id is not null AND ldl.scan_status = '2','异常签收','扫描签收' )AS nodeName, - CONCAT('签收操作成功') AS description + CASE ldl.scan_status + WHEN '2' THEN CONCAT('扫描签收,签收方式:',IF(ldl.tray_no is not null,'托盘','包件'),IF(ldl.tray_no is null,'',ldl.tray_no)) + WHEN '3' THEN CONCAT('扫描签收,签收方式:订单') + WHEN '4' THEN CONCAT('扫描签收,签收方式:批量确认') + WHEN '5' THEN CONCAT('扫描签收,签收方式:未装车签收') + ELSE CONCAT('扫描装车,装车方式:',IF(ldl.tray_no is not null,'托盘','包件'),IF(ldl.tray_no is null,'',ldl.tray_no)) + END description FROM logpm_distribution_loadscan AS ldl LEFT JOIN logpm_distribution_parcel_list AS ldpl ON ldl.package_id = ldpl.id @@ -1310,7 +1584,7 @@ ldpl.quantity AS quantity, ldpl.train_number AS tranNumber, ldpl.waybill_number AS waybillNumber, - ldbl.create_time AS nodeTime, + ldbp.create_time AS nodeTime, ldbl.create_user AS nodeControlsUserId, '自提配送' AS nodeName, lwt.pallet_name, @@ -1363,7 +1637,7 @@ ldpl.quantity AS quantity, ldpl.train_number AS tranNumber, ldpl.waybill_number AS waybillNumber, - ldbl.update_time AS nodeTime, + ldbp.update_time AS nodeTime, ldbl.update_user AS nodeControlsUserId, '自提取消' AS nodeName, lwt.pallet_name, @@ -1388,4 +1662,181 @@ and warehouse_id = #{warehouseId} + + + update logpm_distribution_parcel_list ldpl + set ldpl.order_package_status = #{packageStatus} + where exists( + select 1 from ( + + + select #{item} pid + + + union all + select #{item} pid + + + ) packageCodes where packageCodes.pid = ldpl.order_package_code) + and ldpl.warehouse_id = #{warehouseId} + + + + + + update logpm_distribution_parcel_list + set order_package_freeze_status = '20' + where waybill_id in + + #{item} + + + + + update logpm_distribution_parcel_list + set order_package_freeze_status = '10' + where waybill_id in + + #{item} + + + + + update logpm_distribution_parcel_list + set waybill_id = null, + waybill_number = null, + send_warehouse_id = null, + send_warehouse_name = null, + accept_warehouse_id = null, + accept_warehouse_name = null, + is_transfer = 1 + where advance_id in + + #{item} + + + + + + + + + + delete from logpm_distribution_parcel_list + where advance_id in + + #{item} + + + + + + + + + + + + + update logpm_distribution_parcel_list + set pallet = null + where id in + + #{item} + + + + + + + update logpm_distribution_parcel_list + set goods_allocation = null, + order_package_grounding_status = '10' + where id in + + #{item} + + + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.java index 144a2f312..20fad06f3 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.java @@ -241,10 +241,10 @@ public interface DistributionReservationMapper extends BaseMapper selectOrderInfoByReservationId(Long parseLong); + List selectOrderInfoByReservationId(@Param("reservationId") Long reservationId); /** * 查询预约零担订单详情 @@ -252,7 +252,7 @@ public interface DistributionReservationMapper extends BaseMapper selectReservationZeroOrderDetail(@Param("stockArticleId") Long id,@Param("reservationId") Long reservationId); + List selectReservationZeroOrderDetail(@Param("stockArticleId") Long stockArticleId,@Param("reservationId") Long reservationId); List getStockListAllocation(@Param("stockListId")Long stockListId, @Param("reservationId")Long reservationId); @@ -405,4 +405,11 @@ public interface DistributionReservationMapper extends BaseMapper selectPackageListByReservationIds(@Param("reservationIds") List reservationIds); List selectPackageByReservations(@Param("reservationIds") List reservationIds, @Param("warehouseId")Long warehouseId); + + /** + * 获取配送任务的预约单 + * @param id + * @return + */ + List selectListByDeliveryId(@Param("id")Long id); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.xml index 72c2c5308..2572e97f0 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.xml @@ -31,8 +31,8 @@ - - + + @@ -82,7 +82,8 @@ AND parcel_list_id = #{orderPackageId} - update logpm_dis_stock_list_detail SET stock_package_status = 2 WHERE reservation_id = #{reservationId} AND id=#{orderPackageId} and is_deleted = 0 + update logpm_dis_stock_list_detail SET stock_package_status = 2 WHERE reservation_id = #{reservationId} AND + id=#{orderPackageId} and is_deleted = 0 UPDATE logpm_distribution_reservation_package SET packet_bar_status = 2 ,cancel_status = 1 @@ -105,15 +106,15 @@ @@ -201,50 +202,54 @@ @@ -534,7 +469,7 @@ left join logpm_distribution_reservation_stocklist ldrs on ldrs.reservation_id = ldr.id and ldrs.is_deleted = 0 where ldr.id = #{reservationId} and ldr.is_deleted = 0 - + - SELECT ldpl.*, ldpl.quantity AS reservationNum @@ -821,12 +761,13 @@ logpm_distribution_signfor AS lds LEFT JOIN logpm_distribution_reservation AS ldr ON lds.reservation_id = ldr.id LEFT JOIN logpm_distribution_reservation_stockarticle AS ldsa ON ldr.id = ldsa.reservation_id - LEFT JOIN logpm_distribution_reservation_package AS ldrp ON ldrp.reservation_id = ldsa.reservation_id and ldrp.stock_article_id = ldsa.stock_article_id + LEFT JOIN logpm_distribution_reservation_package AS ldrp ON ldrp.reservation_id = ldsa.reservation_id and + ldrp.stock_article_id = ldsa.stock_article_id LEFT JOIN logpm_distribution_parcel_list AS ldpl ON ldrp.parce_list_id = ldpl.id - lds.delivery_id = #{deliveryId} and ldrp.packet_bar_status in ('1','3') and ldpl.id is not null + lds.delivery_id = #{deliveryId} and ldrp.packet_bar_status in ('1','3') and ldpl.id is not null - and ldrp.stock_article_id in + and ldrp.stock_article_id in #{id} @@ -893,10 +834,10 @@ ldpl.accept_warehouse_name, ldpl.order_package_delivery_status FROM - logpm_distribution_reservation_package AS ldrp - LEFT JOIN logpm_distribution_parcel_list AS ldpl ON ldpl.order_package_code = ldrp.packet_bar_code - LEFT JOIN logpm_warehouse_tray_goods AS lwtg ON ldpl.id = lwtg.association_id and lwtg.association_type = 3 - LEFT JOIN logpm_warehouse_updown_goods AS lwug ON ldpl.id = lwug.association_id and lwug.association_type = 3 + logpm_distribution_reservation_package AS ldrp + LEFT JOIN logpm_distribution_parcel_list AS ldpl ON ldpl.order_package_code = ldrp.packet_bar_code + LEFT JOIN logpm_warehouse_tray_goods AS lwtg ON ldpl.id = lwtg.association_id and lwtg.association_type = 3 + LEFT JOIN logpm_warehouse_updown_goods AS lwug ON ldpl.id = lwug.association_id and lwug.association_type = 3 and packet_bar_status != 2 @@ -928,384 +869,402 @@ - SELECT - ldpl.* + ldpl.*, + ldsa.mall_id AS mallId FROM - logpm_distribution_reservation_package AS ldrs - INNER JOIN logpm_distribution_parcel_list AS ldpl ON ldrs.parce_list_id = ldpl.id + logpm_distribution_reservation_package AS ldrs + INNER JOIN logpm_distribution_parcel_list AS ldpl ON ldrs.parce_list_id = ldpl.id + LEFT JOIN logpm_distribution_stock_article As ldsa ON ldpl.stock_article_id = ldsa.id WHERE - ldrs.packet_bar_status IN ('1','3') and reservation_id = #{reservationId} AND ldpl.conditions = 1 + ldrs.packet_bar_status IN ('1','3') and reservation_id = #{reservationId} AND ldpl.conditions = 1 @@ -1338,36 +1301,37 @@ select ldr.* from logpm_distribution_reservation ldr where ldr.delivery_type=2 - and ldr.reservation_status = #{distrbutionReservation.reservationStatus} + and ldr.reservation_status = #{distrbutionReservation.reservationStatus} and ldr.mall_id in - + #{item} - - - SELECT id, + SELECT id, tenant_id, create_user, create_time, @@ -1499,7 +1463,7 @@ ldsl.source_type AS sourceType, ldrs.stocklist_id AS stockListId, ldrs.reservation_num AS planNum, - -- count(ldss.id ) AS realNum, + -- count(ldss.id ) AS realNum, (SELECT COUNT(ldss.id) FROM logpm_distribution_stock AS ldss WHERE ldss.stock_list_id = ldsl.id ) AS realNum, CASE ldsl.source_type @@ -1598,8 +1562,8 @@ LEFT JOIN logpm_distribution_parcel_list AS ldpl ON ldrp.parce_list_id = ldpl.id WHERE ldrp.reservation_id = #{param.reservationId} - AND ldrp.stock_article_id = #{param.orderId} - AND ldrp.packet_bar_status != '2' + AND ldrp.stock_article_id = #{param.orderId} + AND ldrp.packet_bar_status != '2' AND ldpl.order_package_freeze_status = 10 AND ldpl.warehouse_id = #{warehouseId} @@ -1679,59 +1643,58 @@ WHERE ldsld.reservation_id = #{param.reservationId} AND ldsld.stock_package_status in ('1','3') - and ldsld.stock_package_code like concat('%',#{param.stockPackageCode},'%') + and ldsld.stock_package_code like concat('%',#{param.stockPackageCode},'%') - and ldsl.cargo_number like concat('%',#{param.cargoNumber},'%') + and ldsl.cargo_number like concat('%',#{param.cargoNumber},'%') - and ldsl.order_code like concat('%',#{param.orderCode},'%') + and ldsl.order_code like concat('%',#{param.orderCode},'%') - and ldsl.incoming_batch like concat('%',#{param.incomingBatch},'%') + and ldsl.incoming_batch like concat('%',#{param.incomingBatch},'%') - and ldsl.description_goods like concat('%',#{param.descriptionGoods},'%') + and ldsl.description_goods like concat('%',#{param.descriptionGoods},'%') - and ldsl.market_name like concat('%',#{param.marketName},'%') + and ldsl.market_name like concat('%',#{param.marketName},'%') - and ldsl.brand_name like concat('%',#{param.brandName},'%') + and ldsl.brand_name like concat('%',#{param.brandName},'%') - and ldl.driver_name like concat('%',#{param.driverName},'%') + and ldl.driver_name like concat('%',#{param.driverName},'%') - and ldl.vehicle_name like concat('%',#{param.vehicleName},'%') + and ldl.vehicle_name like concat('%',#{param.vehicleName},'%') - and ldl.scan_time like concat('%',#{param.scanTime},'%') + and ldl.scan_time like concat('%',#{param.scanTime},'%') - and ldl.scan_user like concat('%',#{param.scanUser},'%') + and ldl.scan_user like concat('%',#{param.scanUser},'%') - and ldl.signing_user like concat('%',#{param.signingUser},'%') + and ldl.signing_user like concat('%',#{param.signingUser},'%') - and ldl.signing_time like concat('%',#{param.signingTime},'%') + and ldl.signing_time like concat('%',#{param.signingTime},'%') - and ldsld.stock_status = #{param.stockStatus} + and ldsld.stock_status = #{param.stockStatus} - and ldsld.stock_locking_status = #{param.stockLockingStatus} + and ldsld.stock_locking_status = #{param.stockLockingStatus} - and ldsld.stock_signfo_status = #{param.stockSignfoStatus} + and ldsld.stock_signfo_status = #{param.stockSignfoStatus} - + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.java index ab576ba84..23af97b38 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.java @@ -20,11 +20,13 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.distribution.dto.DistributionSignforDTO; +import com.logpm.distribution.dto.PushNotificationDTO; import com.logpm.distribution.dto.app.DistributionAppDeliveryListDTO; import com.logpm.distribution.entity.DistributionParcelListEntity; import com.logpm.distribution.entity.DistributionReservationEntity; import com.logpm.distribution.entity.DistributionSignforEntity; import com.logpm.distribution.excel.DistributionSignforExcel; +import com.logpm.distribution.excel.DistributionSignforInventoryExcel; import com.logpm.distribution.excel.DistributionSignforOwnExcel; import com.logpm.distribution.vo.*; import com.logpm.distribution.vo.app.*; @@ -33,6 +35,7 @@ import org.apache.ibatis.annotations.Param; import org.springblade.core.secure.BladeUser; import java.util.List; +import java.util.Map; /** * 签收管理 Mapper 接口 @@ -115,6 +118,7 @@ public interface DistributionSignforMapper extends BaseMapper selectInventory(@Param("signforId")Long signforId); + List selectInventory(@Param("id")Long id); /** * @@ -264,7 +268,17 @@ public interface DistributionSignforMapper extends BaseMapper selectPushOldPackage(@Param("reservationId") Long reservationId,@Param("deliveryId") Long deliveryId); + List selectPushOldPackageLoading(@Param("reservationId") Long reservationId,@Param("deliveryId") Long deliveryId); + List selectPushOldPackageSigning(@Param("reservationId") Long reservationId,@Param("deliveryId") Long deliveryId); + + /** + * 推送老系统库存品包件 + * @param reservationId + * @param deliveryId + * @return + */ + List selectLoadingPushOldInventory(@Param("reservationId")Long reservationId, @Param("deliveryId")Long deliveryId); + /** * 推送老系统库存品包件 @@ -272,7 +286,7 @@ public interface DistributionSignforMapper extends BaseMapper selectPushOldInventory(@Param("reservationId")Long reservationId, @Param("deliveryId")Long deliveryId); + List selectSigningPushOldInventory(@Param("reservationId")Long reservationId, @Param("deliveryId")Long deliveryId); /** * 减少装车数 @@ -330,4 +344,39 @@ public interface DistributionSignforMapper extends BaseMapper selectReservationByDeliveryId(@Param("deliveryId") Long deliveryId); DistributionSignforEntity selectByReservationId(@Param("reservationId") Long reservationId); + + /** + * 已签收订单查询签收信息 + * @param longList + * @return + */ + List> getByReservationIds(@Param("reservationIds") List longList); + + + /** + * 查询需要推送老系统的签收信息 + * @param + * @return + */ + List pushNotification(@Param("warehouseIds") List id,@Param("reservationCodes")List reservationCodes); + + SignforPageCountVO selectDistributionSignforPageCount(@Param("param") DistributionSignforVO distributionSignfor); + + /** + * 查询签收列表导出库存品数据 + * @param id + * @return + */ + List getDistributionSignforInventoryList(@Param("id")Long id); + + /** + * + * @param reservationId + * @param stockArticleId + * @param parceListId + */ + Integer cancelOld(@Param("reservationId") Long reservationId,@Param("stockArticleId") Long stockArticleId,@Param("packageId") Long parceListId); + + void deductionLoadingAndSignforPacjageNum(@Param("reservationId")Long reservationId,@Param("deliveryId") Long deliveryId,@Param("loadingNum") int loadingNum,@Param("signforNum") int signforNum); + } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.xml index 7e7d54eb4..c4237a77b 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.xml @@ -43,34 +43,60 @@ - UPDATE logpm_distribution_signfor lds set lds.loaded_number = ( lds.loaded_number + #{nub} ) WHERE lds.is_deleted =0 and lds.reservation_id = #{reservationId} and lds.delivery_id = #{deliveryId} + UPDATE logpm_distribution_signfor lds set lds.loaded_number = ( lds.loaded_number + #{nub} ) WHERE + lds.is_deleted =0 and lds.reservation_id = #{reservationId} and lds.delivery_id = #{deliveryId} + + UPDATE logpm_distribution_signfor lds set lds.loaded_number = ( lds.loaded_number + #{nub1} ),lds.received_quantity = ( lds.received_quantity + #{nub2} + ) WHERE + lds.is_deleted =0 and lds.reservation_id = #{reservationId} and lds.delivery_id = #{deliveryId} + + - UPDATE logpm_distribution_signfor lds set lds.loadedin_number = ( lds.loadedin_number + #{nub} ) WHERE lds.is_deleted =0 and lds.reservation_id = #{reservationId} and lds.delivery_id = #{deliveryId} + UPDATE logpm_distribution_signfor lds set lds.loadedin_number = ( lds.loadedin_number + #{nub} ) WHERE + lds.is_deleted =0 and lds.reservation_id = #{reservationId} and lds.delivery_id = #{deliveryId} - UPDATE logpm_distribution_signfor lds set lds.loaded_number = ( lds.loaded_number - #{nub} ) WHERE lds.is_deleted =0 and lds.reservation_id = #{reservationId} and loaded_number !=0 and lds.delivery_id = #{deliveryId} + UPDATE logpm_distribution_signfor lds set lds.loaded_number = ( lds.loaded_number - #{nub} ) WHERE + lds.is_deleted =0 and lds.reservation_id = #{reservationId} and loaded_number !=0 and lds.delivery_id = + #{deliveryId} - UPDATE logpm_distribution_signfor lds set lds.received_quantity = ( lds.received_quantity + #{packageNub} ) WHERE lds.is_deleted =0 and lds.reservation_id = #{reservationId} and lds.delivery_id =#{deliveryId} + UPDATE logpm_distribution_signfor lds set lds.received_quantity = ( lds.received_quantity + #{packageNub} ) + WHERE lds.is_deleted =0 and lds.reservation_id = #{reservationId} and lds.delivery_id =#{deliveryId} - UPDATE logpm_distribution_signfor lds set lds.received_quantity = ( lds.received_quantity + #{packageNub} ),lds.loaded_number = ( lds.loaded_number + #{packageNub} ) WHERE lds.is_deleted =0 and lds.reservation_id = #{reservationId} and lds.delivery_id =#{deliveryId} + UPDATE logpm_distribution_signfor lds set lds.received_quantity = ( lds.received_quantity + #{packageNub} + ),lds.loaded_number = ( lds.loaded_number + #{packageNub} ) WHERE lds.is_deleted =0 and lds.reservation_id = + #{reservationId} and lds.delivery_id =#{deliveryId} - UPDATE logpm_distribution_signfor lds set lds.loadedin_number = ( lds.loadedin_number + #{packageNub} ),lds.receivedin_quantity = ( lds.receivedin_quantity + #{packageNub} ) WHERE lds.is_deleted =0 and lds.reservation_id = #{reservationId} and lds.delivery_id =#{deliveryId} + UPDATE logpm_distribution_signfor lds set lds.loadedin_number = ( lds.loadedin_number + #{packageNub} + ),lds.receivedin_quantity = ( lds.receivedin_quantity + #{packageNub} ) WHERE lds.is_deleted =0 and + lds.reservation_id = #{reservationId} and lds.delivery_id =#{deliveryId} - UPDATE logpm_distribution_signfor lds set lds.receivedin_quantity = ( lds.receivedin_quantity + #{packageNub} ) WHERE lds.is_deleted =0 and lds.reservation_id = #{reservationId} and lds.delivery_id =#{deliveryId} + UPDATE logpm_distribution_signfor lds set lds.receivedin_quantity = ( lds.receivedin_quantity + #{packageNub} ) + WHERE lds.is_deleted =0 and lds.reservation_id = #{reservationId} and lds.delivery_id =#{deliveryId} - UPDATE logpm_distribution_signfor lds set lds.loaded_number = ( lds.loaded_number - #{nub} ) WHERE lds.is_deleted =0 and lds.reservation_id = #{reservationId} and loaded_number !=0 and lds.delivery_id = #{deliveryId} + UPDATE logpm_distribution_signfor lds set lds.loaded_number = ( lds.loaded_number - #{nub} ) WHERE + lds.is_deleted =0 and lds.reservation_id = #{reservationId} and loaded_number !=0 and lds.delivery_id = + #{deliveryId} - UPDATE logpm_distribution_signfor lds set lds.loadedin_number = ( lds.loadedin_number - #{nub} ) WHERE lds.is_deleted =0 and lds.reservation_id = #{reservationId} and loadedin_number !=0 and lds.delivery_id = #{deliveryId} + UPDATE logpm_distribution_signfor lds set lds.loadedin_number = ( lds.loadedin_number - #{nub} ) WHERE + lds.is_deleted =0 and lds.reservation_id = #{reservationId} and loadedin_number !=0 and lds.delivery_id = + #{deliveryId} - UPDATE logpm_distribution_signfor SET signee_name = #{user.nickName},signee_id = #{user.userId} WHERE signee_name is null and delivery_id = #{deliveryId} and reservation_id = #{reservationId} + UPDATE logpm_distribution_signfor SET signee_name = #{user.nickName},signee_id = #{user.userId} WHERE + signee_name is null and delivery_id = #{deliveryId} and reservation_id = #{reservationId} + + + UPDATE logpm_distribution_signfor lds set lds.loaded_number = ( lds.loaded_number - #{loadingNum} ),received_quantity = (lds.received_quantity - #{signforNum}) WHERE + lds.is_deleted =0 and lds.reservation_id = #{reservationId} and loaded_number !=0 and lds.delivery_id = + #{deliveryId} DELETE FROM logpm_distribution_signfor @@ -83,208 +109,209 @@ + + UPDATE logpm_distribution_reservation_package SET packet_bar_status = 2 ,cancel_remark = '异常审核取消原计划' + WHERE parce_list_id = #{packageId} ; + + UPDATE logpm_distribution_reservation_stockarticle SET reservation_num = (SELECT count(id) FROM + logpm_distribution_reservation_package WHERE packet_bar_status != 2 AND reservation_id = #{reservationId} AND + stock_article_id = #{stockArticleId} AND is_deleted = 0) WHERE reservation_id = #{reservationId} AND + stock_article_id = #{stockArticleId}; + + UPDATE logpm_distribution_reservation_stockarticle SET stock_article_status = 2 WHERE reservation_num = 0 AND + reservation_id = #{reservationId} AND stock_article_id = #{stockArticleId}; + UPDATE logpm_distribution_reservation SET reservation_num = (SELECT count(id) FROM + logpm_distribution_reservation_package WHERE packet_bar_status != 2 AND reservation_id = #{reservationId} AND + is_deleted =0 ) WHERE id = #{reservationId}; + UPDATE logpm_distribution_reservation SET reservation_status = '40',cancel_reason = '异常审核判定判定取消预约计划' + WHERE id = #{reservationId} AND (reservation_num + reservation_stock_list_num) = 0; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - SELECT DISTINCT lddl.id id, lddl.train_number trainNumber, @@ -757,127 +810,139 @@ (SELECT COALESCE (sum(ldr.reservation_num + ldr.reservation_stock_list_num),0) FROM logpm_distribution_signfor lds - join logpm_distribution_reservation ldr on lds.reservation_id =ldr.id - WHERE lds.delivery_id = lddl.id + join logpm_distribution_reservation ldr on lds.reservation_id =ldr.id + WHERE lds.delivery_id = lddl.id ) deliveryNumber, lddl.delivery_status deliveryStatus, lddl.preparation_time preparationTime, lddl.create_time createTime, - (SELECT COALESCE(COUNT(*), 0) FROM logpm_distribution_signfor lds WHERE lds.delivery_id =lddl.id) customersNumber, + (SELECT COALESCE(COUNT(*), 0) FROM logpm_distribution_signfor lds WHERE lds.delivery_id =lddl.id) + customersNumber, lddl.price price, lddl.added_services_id addedServicesId, (SELECT COALESCE (COUNT(*) ,0) FROM logpm_distribution_signfor lds - join logpm_distribution_reservation ldr on lds.reservation_id =ldr.id + join logpm_distribution_reservation ldr on lds.reservation_id =ldr.id join logpm_distribution_reservation_stockarticle ldrs on ldrs.reservation_id =ldr.id - WHERE lds.delivery_id = lddl.id + WHERE lds.delivery_id = lddl.id ) orderNumber, (SELECT COALESCE(sum(lds.loaded_number+lds.loadedin_number), 0) FROM logpm_distribution_signfor lds WHERE lddl.id = lds.delivery_id) scannedNumber, - (SELECT GROUP_CONCAT(DISTINCT ldsu.loader_name SEPARATOR ',') from logpm_distribution_signfor lds INNER JOIN logpm_distribution_stockup_info AS ldsi ON lds.reservation_id = ldsi.reservation_id - INNER JOIN logpm_distribution_stockup AS ldsu ON ldsu.id = ldsi.stockup_id WHERE lds.delivery_id = lddl.id) loadingTeamName, - lddl.lead_time leadTime, - lddl.loading_time loadingTime, - lddl.task_time taskTime, - (SELECT COALESCE(sum(lds.receivedin_quantity+lds.received_quantity), 0) FROM logpm_distribution_signfor lds WHERE - lddl.id = lds.delivery_id) signNub, - ( (SELECT COALESCE(count(*), 0) FROM logpm_distribution_loadscan ldl WHERE - lddl.id = ldl.delivery_id and ldl.signfor_state =2) + - (SELECT COALESCE(count(*), 0) FROM logpm_distribution_loadscaninvn ldl WHERE - lddl.id = ldl.delivery_id and ldl.signfor_state =2) ) signNubSr, - ( select GROUP_CONCAT(ldr.consignee) from logpm_distribution_reservation ldr - where ldr.id in (select lds.reservation_id from logpm_distribution_signfor lds where lds.delivery_id = lddl.id ) - ) consignee - FROM - logpm_distribution_delivery_list lddl - left join logpm_distribution_delivery_self ldds on lddl.id =ldds.delivery_id - left join logpm_distribution_signfor ldsf on ldsf.delivery_id = lddl.id - LEFT JOIN (SELECT count(ldr.id) AS num,lds.delivery_id FROM logpm_distribution_signfor AS lds LEFT JOIN logpm_distribution_reservation AS ldr ON lds.reservation_id = ldr.id WHERE lds.is_deleted = 0 AND ldr.is_deleted = 0 GROUP BY lds.delivery_id) AS t ON t.delivery_id = lddl.id - - lddl.is_deleted =0 AND t.num > 0 - - and lddl.id in - - #{item} - - - - and lddl.warehouse_id in - - #{item} - - - - and date_format(lddl.create_time,'%y%m%d%') = date_format(#{param.createTime_query},'%y%m%d%') - - - and lddl.type = #{param.type} - - - and date_format(lddl.task_time,'%y%m%d%') >= date_format(#{param.taskTime_start},'%y%m%d%') and date_format(lddl.task_time,'%y%m%d%') <= date_format(#{param.taskTime_end},'%y%m%d%') - - - ORDER BY lddl.task_time DESC + (SELECT GROUP_CONCAT(DISTINCT ldsu.loader_name SEPARATOR ',') from logpm_distribution_signfor lds INNER JOIN + logpm_distribution_stockup_info AS ldsi ON lds.reservation_id = ldsi.reservation_id + INNER JOIN logpm_distribution_stockup AS ldsu ON ldsu.id = ldsi.stockup_id WHERE lds.delivery_id = lddl.id) + loadingTeamName, + lddl.lead_time leadTime, + lddl.loading_time loadingTime, + lddl.task_time taskTime, + (SELECT COALESCE(sum(lds.receivedin_quantity+lds.received_quantity), 0) FROM logpm_distribution_signfor lds + WHERE + lddl.id = lds.delivery_id) signNub, + ( (SELECT COALESCE(count(*), 0) FROM logpm_distribution_loadscan ldl WHERE + lddl.id = ldl.delivery_id and ldl.signfor_state =2) + + (SELECT COALESCE(count(*), 0) FROM logpm_distribution_loadscaninvn ldl WHERE + lddl.id = ldl.delivery_id and ldl.signfor_state =2) ) signNubSr, + ( select GROUP_CONCAT(CONCAT(ldr.receiving_unit,'(',ldr.consignee),')') from logpm_distribution_reservation ldr + where ldr.id in (select lds.reservation_id from logpm_distribution_signfor lds where lds.delivery_id = lddl.id ) + ) consignee + FROM + logpm_distribution_delivery_list lddl + left join logpm_distribution_delivery_self ldds on lddl.id =ldds.delivery_id + left join logpm_distribution_signfor ldsf on ldsf.delivery_id = lddl.id + LEFT JOIN (SELECT count(ldr.id) AS num,lds.delivery_id FROM logpm_distribution_signfor AS lds LEFT JOIN + logpm_distribution_reservation AS ldr ON lds.reservation_id = ldr.id WHERE lds.is_deleted = 0 AND ldr.is_deleted + = 0 GROUP BY lds.delivery_id) AS t ON t.delivery_id = lddl.id + + lddl.is_deleted =0 AND t.num > 0 + + and lddl.id in + + #{item} + + + + and lddl.warehouse_id in + + #{item} + + + + and date_format(lddl.create_time,'%y%m%d%') = date_format(#{param.createTime_query},'%y%m%d%') + + + and lddl.type = #{param.type} + + + and date_format(lddl.task_time,'%y%m%d%') >= date_format(#{param.taskTime_start},'%y%m%d%') and + date_format(lddl.task_time,'%y%m%d%') <= date_format(#{param.taskTime_end},'%y%m%d%') + + + ORDER BY lddl.task_time DESC - - - + SELECT + ldsl.id id, + ldsl.sku sku, + ldsl.cargo_number cargoNumber, + ldsl.description_goods descriptionGoods, + ldl.signfor_state signforState, + ldl.order_package_code orderPackageCode, + lbm.specification specification, + lbm.logpm_unit logpmUnit, + if(ldl.id is not null,IF(ldl.signfor_state = 2,1,0),0) AS signforNub, + ldsld.stock_package_code AS orderPackageCode + FROM + logpm_dis_stock_list_detail AS ldsld + LEFT JOIN logpm_distribution_stock_list AS ldsl ON ldsld.stock_list_id = ldsl.id + LEFT JOIN logpm_distribution_loadscaninvn ldl ON ldsl.id = ldl.inventory_id AND ldsld.id = + ldl.inventory_package_id + LEFT JOIN logpm_basicdata_material lbm ON ldsl.material_id = lbm.id + + ldsld.is_deleted = 0 + AND ldsld.reservation_id = #{param.reservationId} + + + + - SELECT - ldrs.reservation_num AS reservationNum, - ldsl.description_goods AS descriptionGoods, - ldsl.cargo_number AS cargoNumber, - ldsl.cargo_norms AS cargoNorms, - ldsl.cargo_unit AS cargoUnit, - lds.loadedin_number AS loadedinNumber, - lds.signee_name AS signeeName, - ldrs.loading_status AS loadingStatus, - ldrs.signing_status AS signingStatus, - lds.sjsigning_time AS sjsigningTime, - ldsl.sku AS sku, - lds.reservation_id AS reservationId, - ldrs.stocklist_id As stocklistId + ldsl.incoming_batch AS incomingBatch, + ldsl.cargo_number AS cargoNumber, + ldsl.cargo_unit AS cargoUnit, + ldsl.market_name AS marketName, + ldsl.cargo_norms AS cargoNorms, + ldsl.description_goods AS descriptionGoods, + ldrs.reservation_num AS planNum, + (SELECT IFNULL(sum(stock_quantity),0) FROM logpm_distribution_stock WHERE reservation_id = ldr.id AND + stock_list_id = ldsl.id) AS stockupNum, + (SELECT IFNULL(SUM(package_nub),0) FROM logpm_distribution_loadscaninvn WHERE reservation_id = ldr.id AND + inventory_id = ldsl.id) AS loadingNum, + (SELECT IFNULL(SUM(package_nub),0) FROM logpm_distribution_loadscaninvn WHERE reservation_id = ldr.id AND + inventory_id = ldsl.id AND signfor_state = 2) AS signingNum, + (SELECT IFNULL(MAX(signing_time),'') FROM logpm_distribution_loadscaninvn WHERE reservation_id = ldr.id AND + inventory_id = ldsl.id AND signfor_state = 2) AS signingTime, + (SELECT IFNULL(MAX(scan_time),'') FROM logpm_distribution_loadscaninvn WHERE reservation_id = ldr.id AND + inventory_id = ldsl.id ) AS loadingTime, + (SELECT IFNULL(GROUP_CONCAT(DISTINCT scan_user),'') FROM logpm_distribution_loadscaninvn WHERE reservation_id = + ldr.id AND inventory_id = ldsl.id GROUP BY scan_user) AS loadingUser, + (SELECT IFNULL(GROUP_CONCAT(DISTINCT signee_name),'') FROM logpm_distribution_loadscaninvn WHERE reservation_id + = ldr.id AND inventory_id = ldsl.id GROUP BY scan_user) AS signingUser, + IF((SELECT IFNULL(SUM(package_nub),0) FROM logpm_distribution_loadscaninvn WHERE reservation_id = ldr.id AND + inventory_id = ldsl.id) = 0,'未装车',IF((SELECT IFNULL(SUM(package_nub),0) FROM logpm_distribution_loadscaninvn + WHERE reservation_id = ldr.id AND inventory_id = ldsl.id) = ldrs.reservation_num,'已装车','部分装车')) AS + loadingStatus, + + IF((SELECT IFNULL(SUM(package_nub),0) FROM logpm_distribution_loadscaninvn WHERE reservation_id = ldr.id AND + inventory_id = ldsl.id AND signfor_state = 2) = 0,'未签收',IF((SELECT IFNULL(SUM(package_nub),0) FROM + logpm_distribution_loadscaninvn WHERE reservation_id = ldr.id AND inventory_id = ldsl.id AND signfor_state = 2) + = ldrs.reservation_num,'已签收','部分签收')) AS signingStatus FROM - logpm_distribution_signfor AS lds - LEFT JOIN logpm_distribution_reservation_stocklist AS ldrs ON lds.reservation_id = ldrs.reservation_id - AND ldrs.stock_list_status IN ( '1', '3' ) - LEFT JOIN logpm_distribution_stock_list AS ldsl ON ldrs.stocklist_id = ldsl.id + logpm_distribution_signfor AS lds + LEFT JOIN logpm_distribution_reservation AS ldr ON lds.reservation_id = ldr.id + LEFT JOIN logpm_distribution_reservation_stocklist AS ldrs ON ldrs.reservation_id = ldr.id AND + ldrs.stock_list_status != 2 AND ldrs.is_deleted = 0 + LEFT JOIN logpm_distribution_stock_list AS ldsl ON ldrs.stocklist_id = ldsl.id WHERE - lds.id = #{signforId} + lds.id = #{id} AND lds.is_deleted = 0 - SELECT ldpl.id AS id, ldpl.warehouse_id AS warehouse_id, @@ -1175,15 +1264,15 @@ lddl.train_number AS transNo, ldpl.waybill_number AS waybillNo, ldpl.order_code AS orderSelfNum, - ldpl.order_package_code AS unitNo, + IFNULL(ldpl.order_package_code ,'')AS unitNo, ldpl.quantity AS num, ldl.signfor_state AS type, - ldl.scan_time AS loadingTime, - ldl.signing_time AS signTime, + ldl.scan_time AS operateTime, + ldl.create_user AS administratorsId, IF ( ldl.id IS NOT NULL, 1, ldl.id ) AS is_loading, 1 is_out, - ldpl.conditions AS goods_type, + IF(ldpl.conditions = 1, 0 ,ldpl.conditions) AS goods_type, ldl.received_quantity AS signNum, 5 AS broke_state FROM @@ -1198,71 +1287,142 @@ AND ldl.scan_status != 1 AND ldl.is_deleted = 0 - SELECT - ldsl.id AS id, - ldsl.warehouse_id AS warehouse_id, - lddl.id AS distribution_id, - lddl.train_number AS trans_no, - ldsl.incoming_batch AS waybill_no, - lddl.order_code AS orderSelfNum, - ldsld.stock_package_code AS unitNo, - ldl.signfor_state AS type, - IF - ( ldl.id IS NOT NULL, 1, ldl.id ) AS is_loading, - ldl.scan_time AS loading_time, - ldl.signing_time AS sign_time, - 1 AS is_out, - ldsl.quantity_stock AS num, - 3 AS goods_type, - ldl.received_quantity AS sign_num, - 4 AS broke_state + ldpl.id AS id, + ldpl.warehouse_id AS warehouse_id, + lddl.id AS distributionId, + lddl.train_number AS transNo, + ldpl.waybill_number AS waybillNo, + ldpl.order_code AS orderSelfNum, + IFNULL(ldpl.order_package_code ,'')AS unitNo, + ldpl.quantity AS num, + ldl.signfor_state AS type, + ldl.signing_time AS operateTime, + ldl.signing_user_id AS administratorsId, + IF + ( ldl.id IS NOT NULL, 1, ldl.id ) AS is_loading, + 1 is_out, + IF(ldpl.conditions = 1, 0 ,ldpl.conditions) AS goods_type, + ldl.received_quantity AS signNum, + 5 AS broke_state FROM - logpm_distribution_loadscaninvn AS ldl - LEFT JOIN logpm_distribution_delivery_list AS lddl ON ldl.delivery_id = lddl.id - AND lddl.is_deleted = 0 - LEFT JOIN logpm_dis_stock_list_detail AS ldsld ON ldsld.reservation_id = ldl.reservation_id - AND ldl.inventory_id = ldsld.stock_list_id - AND ldsld.is_deleted = 0 - LEFT JOIN logpm_distribution_stock_list AS ldsl ON ldsl.id = ldl.inventory_id - AND ldsl.is_deleted = 0 + logpm_distribution_loadscan AS ldl + INNER JOIN logpm_distribution_delivery_list AS lddl ON lddl.id = ldl.delivery_id + AND lddl.is_deleted = 0 + INNER JOIN logpm_distribution_parcel_list AS ldpl ON ldl.package_id = ldpl.id + AND ldpl.is_deleted = 0 WHERE - ldl.delivery_id = #{deliveryId} - AND ldl.reservation_id = #{reservationId} - AND ldl.scan_status != 1 - AND ldl.signfor_state = 2 + ldl.reservation_id = #{reservationId} + AND ldl.delivery_id = #{deliveryId} + AND ldl.scan_status != 1 + AND ldl.is_deleted = 0 + AND ldl.signfor_state = 2 + + + SELECT * FROM logpm_distribution_signfor WHERE reservation_id = #{reservationId} + + + + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleMapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleMapper.java index fbb1bebc4..cad6a2b4d 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleMapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleMapper.java @@ -53,7 +53,7 @@ public interface DistributionStockArticleMapper extends BaseMapper exportDistributionStockArticle(@Param("paramMap") Map paramMap, @Param("idArr") List idArr); + List exportDistributionStockArticle(@Param("param") Map paramMap); void addHandQuantity(@Param("id") Long id,@Param("num") int num); @@ -85,12 +85,12 @@ public interface DistributionStockArticleMapper extends BaseMapper fingListByServiceNumber(@Param("serviceNumber") String serviceNumber,@Param("warehouseId") Long warehouseId); void updateGroundingStatus(@Param("orderCode") String orderCode, @Param("groundingStatus") String groundingStatus,@Param("warehouseId") Long warehouseId); - IPage pageListOwe(IPage page,@Param("param")DistributionStockArticleOweDTO stockArticleEntity); + IPage pageListOwe(IPage page,@Param("param")DistributionStockArticleOweDTO stockArticleEntity,@Param("warehouseIds")List warehouseIds); queryOrderVO selectOneByWrap(@Param("condition") String condition,@Param("collect") List collect); @@ -190,7 +190,27 @@ public interface DistributionStockArticleMapper extends BaseMapper pageSignforListOwe(IPage page,@Param("param") DistributionStockArticleOweDTO stockArticleEntity); + IPage pageSignforListOwe(IPage page,@Param("param") DistributionStockArticleOweDTO stockArticleEntity,@Param("collect") List warehouseIdList); void updateAllOrderTotalNum(@Param("orderCode") String orderCode, @Param("total") Integer total); + + List> selectAdvance(@Param("orderCode")String orderCode); + + void updateCustomerAllByOrderCode(@Param("data") cn.hutool.json.JSONObject data); + + void updateDistributionStockArticleEntityById(@Param("t") DistributionStockArticleEntity t); + + Integer findOrderTotalNumByOrderCodes(@Param("orderCodes") List orderCodes,@Param("warehouseId") Long warehouseId); + + /** + * 查询签收订单详情 + * @param id + * @return + */ + List signforListDetail(@Param("orderId") Long id); + + void clearTraysByIds(@Param("ids") List clearTraysStockArticleIdList); + + void clearAllocationByIds(@Param("ids") List clearAllocationStockArticleIdList); + } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleMapper.xml index 11f75f72c..5951d024f 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleMapper.xml @@ -52,36 +52,44 @@ - update logpm_distribution_stock_article set hand_quantity = hand_quantity + #{num} where id = #{id} + update logpm_distribution_stock_article + set hand_quantity = hand_quantity + #{num} + where id = #{id} - update logpm_distribution_stock_article set hand_quantity = hand_quantity - #{allNum} where id = #{articleId} and hand_quantity - #{allNum} >= 0 + update logpm_distribution_stock_article + set hand_quantity = hand_quantity - #{allNum} + where id = #{articleId} + and hand_quantity - #{allNum} >= 0 select ldsa.id,ldsa.order_code,ldsa.mall_name ,ldsa.customer_name ,ldsa.customer_telephone , ldsa.customer_address ,ldsa.sending,ldpl.waybill_number waybillNumber, - ldsa.accept_warehouse_name as objective ,ldsa.send_warehouse_name departureStation,ldsa.dealer_name + ldpl.accept_warehouse_name as objective ,ldpl.send_warehouse_name departureStation,ldsa.dealer_name dealerName,ldsa.dealer_code dealerCode,ldsa.total_number totalNumber, CONCAT_WS('/', IFNULL(ldpl.firsts, ''), IFNULL(ldpl.second, ''), IFNULL(ldpl.third_product, '')) AS category, - CONCAT_WS( '',IFNULL(ldpl.material_name, '')) AS materialName ,ldpl.order_package_code qrCode,ldpl.waybill_number, - CONCAT_WS('/', IFNULL(lww.shipper_name, ''), IFNULL(lww.shipper_mobile, '')) AS shipperName,lww.shipper_address shipperAddress + CONCAT_WS( '',IFNULL(ldpl.material_name, '')) AS materialName ,ldpl.order_package_code + qrCode,ldpl.waybill_number, + CONCAT_WS('/', IFNULL(lww.shipper_name, ''), IFNULL(lww.shipper_mobile, '')) AS shipperName,lww.shipper_address + shipperAddress from logpm_distribution_parcel_list ldpl LEFT JOIN logpm_distribution_stock_article ldsa on ldpl.stock_article_id = ldsa.id LEFT JOIN logpm_warehouse_waybill lww on lww.waybill_no= ldsa.waybill_number - ldpl.id = #{o} + + + and ldpl.order_package_code = #{qrCode} + + + and ldpl.id = #{o} + + - select ldsa.id, ldsa.tenant_id, ldsa.create_user, ldsa.create_time, ldsa.update_user, ldsa.update_time, - ldsa.incoming_num AS incomingNum, + ldsa.incoming_num AS incomingNum, ldsa.status, ldsa.is_deleted, ldsa.create_dept, ldsa.reserve1, ldsa.reserve2, ldsa.reserve3, ldsa.reserve4, ldsa.reserve5, ldsa.service_number, ldsa.order_code, @@ -421,17 +435,16 @@ ldsa.sorting_quantity, ldsa.delivery_quantity, ldsa.transfer_quantity, ldsa.signin_quantity, ldsa.resource, ldsa.is_opai, ldsa.inventory_date, ldsa.inventory_person, ldsa.inventory_person_id, - ldsa.available_quantity, ldsa.is_have_data, ldsa.stock_article_code, GROUP_CONCAT( DISTINCT ldpl.dealer_name ) dealerName, ldsa.dealer_code, + ldsa.available_quantity, ldsa.is_have_data, ldsa.stock_article_code, GROUP_CONCAT( DISTINCT ldpl.dealer_name ) + dealerName, ldsa.dealer_code, ldsa.train_number, ldsa.factory_train, ldsa.sending, ldsa.send_warehouse_id, ldsa.send_warehouse_name, ldsa.is_zero, ldsa.accept_warehouse_id, ldsa.accept_warehouse_name, ldsa.order_delivery_status, - GROUP_CONCAT( DISTINCT lwtg.tray_code ) trays, - GROUP_CONCAT( DISTINCT lwug.position_code ) allocation + ldsa.trays trays, + ldsa.allocation allocation from logpm_distribution_stock_article ldsa LEFT JOIN logpm_distribution_parcel_list ldpl on ldsa.id = ldpl.stock_article_id - LEFT JOIN logpm_warehouse_tray_goods lwtg on lwtg.association_id = ldpl.id - LEFT JOIN logpm_warehouse_updown_goods lwug on lwug.association_id = ldpl.id - ldsa.is_deleted = 0 and ldsa.order_status in (10,20,30,40,50,60,70) + ldsa.is_deleted = 0 and ldsa.order_status in ('10','20','30','40','50','60','70') and ldsa.hand_quantity > 0 and ldsa.order_code in @@ -439,11 +452,20 @@ #{a} + + and ldsa.warehouse_id in + + #{s} + + and ldsa.order_code like concat('%',#{param.orderCodeNumLike},'%') + and ldsa.brand like + concat(#{param.brand},'%') + - and ldsa.reservation_status in (10,20) and ldpl.order_package_reservation_status = 10 + and ldsa.reservation_status in (10,20) and ldpl.order_package_reservation_status = 10 and ldpl.waybill_number in @@ -458,16 +480,9 @@ concat('%',#{param.waybillNumLike},'%') - and ldsa.type_service = #{param.typeService} - - and ldsa.warehouse_id in - - #{a} - - - and ldsa.warehouse_id = - #{param.warehouseId} + and ldsa.type_service =#{param.typeService} + and ldsa.id in #{a} @@ -511,19 +526,30 @@ and ldsa.available_quantity like concat('%',#{param.availableQuantity},'%') - and ldsa.grounding_status = #{param.groundingStatus} - and ldsa.genre = #{param.genre} - and ldsa.freeze_status = #{param.freezeStatus} - and ldsa.order_status = #{param.orderStatus} - and ldsa.reservation_status = #{param.reservationStatus} - and ldsa.stockup_status = #{param.stockupStatus} - and ldsa.notification = #{param.notification} - and ldsa.order_receive_status = - #{param.orderReceiveStatus} + and ldsa.grounding_status = + #{param.groundingStatus} + + and ldsa.genre=#{param.genre} + and ldsa.freeze_status = + #{param.freezeStatus} + + and ldsa.order_status = + #{param.orderStatus} - and ldsa.complete_set like concat('%',#{param.completeSet},'%') + and ldsa.reservation_status = + #{param.reservationStatus} + + and ldsa.stockup_status = + #{param.stockupStatus} + + and ldsa.notification = + #{param.notification} + + and ldsa.order_receive_status + = + #{param.orderReceiveStatus} - and ldsa.type_service like concat('%',#{param.typeService},'%') + and ldsa.complete_set =#{param.completeSet} and ldsa.customer_name like concat('%',#{param.customerName},'%') @@ -537,11 +563,11 @@ and ldsa.customer_address like concat('%',#{param.customerAddress},'%') - and lwtg.tray_code like - concat('%',#{param.trays},'%') + + and ldsa.trays like concat('%',#{param.trays},'%') - and lwug.position_code like - concat('%',#{param.allocation},'%') + + and ldsa.allocation like concat('%',#{param.allocation},'%') group by ldsa.id order by ldsa.warehouse_entry_time desc @@ -598,7 +624,7 @@ ldsa.service_number, ldsa.order_code, ldsa.mall_id, ldsa.mall_code, ldsa.mall_name, ldsa.store_name, ldsa.store_code, ldsa.store_id, ldsa.description_goods, ldsa.warehouse_id, - + ldsa.warehouse, ldsa.warehouse_entry_time, ldsa.store_time, ldsa.total_number, ldsa.complete_set, ldsa.brand, ldsa.type_service, ldsa.customer_name, ldsa.customer_telephone, ldsa.customer_address, ldsa.genre, @@ -618,29 +644,28 @@ LEFT JOIN logpm_distribution_parcel_list ldpl on ldsa.id = ldpl.stock_article_id LEFT JOIN logpm_warehouse_tray_goods lwtg on lwtg.association_id = ldpl.id LEFT JOIN logpm_warehouse_updown_goods lwug on lwug.association_id = ldpl.id - LEFT JOIN - (SELECT ldsaa.id,SUM(ldpll.quantity) AS num - FROM logpm_distribution_stock_article ldsaa - LEFT JOIN logpm_distribution_parcel_list ldpll ON ldsaa.id = ldpll.stock_article_id - WHERE ldpll.order_package_loading_status != '20' - AND ldpll.order_package_reservation_status !='20' - AND ldpll.order_package_status != '70' - AND ldpll.conditions != 2 - AND ldsaa.warehouse_id = #{par.warehouseId} - AND ldpll.warehouse_id = #{par.warehouseId} - AND ldsaa.type_service = #{par.typeService} - - and ldsaa.order_code like concat(#{par.orderCode},'%') - - GROUP BY ldsaa.id - ) - AS t ON t.id = ldsa.id ldsa.order_status in ('10','20','30','70') and ldsa.reservation_status in ('10','20') - and t.num > 0 - - AND ldsa.hand_quantity > 0 + AND EXISTS ( + SELECT 1 + FROM logpm_distribution_parcel_list ldpll + WHERE + ldsa.id = ldpll.stock_article_id + + AND ldpll.order_package_loading_status != '20' + AND ldpll.order_package_reservation_status != '20' + AND ldpll.order_package_status != '70' + AND ldpll.conditions != 2 + AND ldpll.warehouse_id = #{par.warehouseId} + AND ldsa.type_service = #{par.typeService} + + and ldpll.order_code like concat(#{par.orderCode},'%') + + GROUP BY ldpll.stock_article_id + HAVING SUM(ldpll.quantity) > 0 + ) + AND ldsa.hand_quantity > 0 and ldsa.warehouse_id = #{par.warehouseId} @@ -655,6 +680,9 @@ and ldsa.mall_name like concat('%',#{par.mallName},'%') + + and ldsa.mall_id = #{par.mallId} + and ldsa.store_name like concat('%',#{par.storeName},'%') @@ -712,21 +740,22 @@ and ldsa.total_number = #{par.totalNumber} - and ldsa.customer_address like concat('%',#{par.customerAddress},'%') + and ldsa.customer_address like concat('%',#{par.customerAddress},'%') ORDER BY ldsa.warehouse_entry_time DESC @@ -891,7 +931,7 @@ AND warehouse_id = #{warehouseId} - + update logpm_distribution_stock_article set hand_quantity = hand_quantity - #{subNum} where id = #{articleId} @@ -901,21 +941,29 @@ update logpm_distribution_stock_article set customer_name = #{customerName}, - customer_telephone = #{customerPhone}, - customer_address = #{customerRoad} + customer_telephone = #{customerPhone}, + customer_address = #{customerRoad} where order_code = #{orderCode} - + update logpm_distribution_stock_article set freeze_status = #{freezeStatus} where order_code = #{orderCode} - UPDATE logpm_distribution_stock_article SET hand_quantity = (hand_quantity - 1) WHERE id=#{orderId} AND is_deleted = 0 AND hand_quantity >= 0 + UPDATE logpm_distribution_stock_article + SET hand_quantity = (hand_quantity - 1) + WHERE id = #{orderId} + AND is_deleted = 0 + AND hand_quantity >= 0 - UPDATE logpm_distribution_stock_article SET hand_quantity = (hand_quantity + #{augmentNum}) WHERE id=#{orderId} AND is_deleted = 0 AND hand_quantity >= 0 + UPDATE logpm_distribution_stock_article + SET hand_quantity = (hand_quantity + #{augmentNum}) + WHERE id = #{orderId} + AND is_deleted = 0 + AND hand_quantity >= 0 @@ -926,47 +974,51 @@ and incoming_num + #{num} <= total_number - UPDATE logpm_distribution_stock_article SET delivery_quantity = #{reservationNum} WHERE id = #{orderId} + UPDATE logpm_distribution_stock_article + SET delivery_quantity = #{reservationNum} + WHERE id = #{orderId} - - select sum(( - select COUNT(ldl.id) - from logpm_distribution_loadscan ldl - where ldl.package_id = ldpl.id and ldl.signfor_state = 2 - ) ) signinQuantity, - sum(( - select COUNT(ldl.id) - from logpm_distribution_loadscan ldl - where ldl.package_id = ldpl.id and ldl.signfor_state = 1 - )) deliveryQuantity - from logpm_distribution_parcel_list ldpl + select sum(( + select COUNT(ldl.id) + from logpm_distribution_loadscan ldl + where ldl.package_id = ldpl.id + and ldl.signfor_state = 2 + )) signinQuantity, + sum(( + select COUNT(ldl.id) + from logpm_distribution_loadscan ldl + where ldl.package_id = ldpl.id + and ldl.signfor_state = 1 + )) deliveryQuantity + from logpm_distribution_parcel_list ldpl where ldpl.stock_article_id = #{id} - + update logpm_distribution_stock_article set total_number = total_number - #{subNum}, - hand_quantity = hand_quantity - #{subNum}, - incoming_num = incoming_num - #{subNum} + hand_quantity = hand_quantity - #{subNum}, + incoming_num = incoming_num - #{subNum} where id = #{articleId} @@ -1126,197 +1183,252 @@ ldsa.id AS id, ldsa.waybill_number AS waybillNumber, ldsa.service_number AS serviceNumber, - ldsa.order_code orderCode, - ldsa.mall_name mallName, - ldsa.warehouse warehouseName, - ldsa.warehouse_entry_time warehouseEntryTime, - ldsa.consignee_unit consigneeUnit, - ldsa.consignee_person consigneePerson, - ldsa.total_number totalNumber, - ldsa.hand_quantity handQuantity, - ldsa.brand brand, - CASE ldsa.order_status - WHEN 70 THEN '部分签收' - WHEN 80 THEN '已签收' - ELSE - '未知' - END orderStatusName, - CASE ldsa.is_zero - WHEN 0 THEN '否' - WHEN 1 THEN '是' - ELSE - '未知' - END isZeroName, - CASE ldsa.reservation_status - WHEN 10 THEN '待预约' - WHEN 20 THEN '部分预约' - WHEN 30 THEN '已预约' - END orderReservationStatusName, - CASE ldsa.is_zero - WHEN 0 THEN IF(ldsa.total_number =(SELECT SUM(quantity) FROM logpm_distribution_parcel_list WHERE stock_article_id = ldsa.id),'是','否') - WHEN 1 THEN IF(ldsa.total_number =(SELECT SUM(quantity) FROM logpm_distribution_parcel_number WHERE stock_article_id = ldsa.id),'是','否') - END isCompleteSet, - CASE ldsa.type_service - WHEN 1 THEN '商配' - WHEN 2 THEN '市配' - WHEN 3 THEN '自提' - WHEN 4 THEN '三方中转' - END typeServiceName, - IFNULL(( SELECT SUM( loaded_nub ) FROM logpm_distribution_loadscan WHERE order_id = ldsa.id AND scan_status != 1 ), 0 ) AS deliveryNumber, - IFNULL(( SELECT SUM( received_quantity ) FROM logpm_distribution_loadscan WHERE order_id = ldsa.id AND scan_status != 1 ), 0 ) AS signForNumber, - IFNULL(( SELECT SUM( stock_quantity ) FROM logpm_distribution_stock WHERE stock_article = ldsa.id ), 0 ) AS stockUpNumber, - IFNULL(( SELECT SUM( reservation_num ) FROM logpm_distribution_reservation_stockarticle WHERE stock_article_id = ldsa.id ), 0 ) AS reservationNumber, - CONCAT(GROUP_CONCAT(DISTINCT IFNULL(t.msg,'')),GROUP_CONCAT(DISTINCT IFNULL(y.msg,''))) AS reservationInfo, - GROUP_CONCAT(DISTINCT IFNULL( m.mssg,'')) AS deliveryListInfo, - ldsa.create_time As createTime, - ldsa.create_user As createUser, - m.signing_time AS signinTime, - GROUP_CONCAT(DISTINCT IFNULL( m.driverName,'')) AS driverName, - GROUP_CONCAT(DISTINCT IFNULL( m.vehicleName,'')) AS vehicleName, - GROUP_CONCAT(DISTINCT IFNULL( m.examine_user_name,'')) AS examineUserNames, - k.earliestWarehouseEntryTime AS earliestWarehouseEntryTime, - j.scanSigningTime AS scanSigningTime - FROM - logpm_distribution_stock_article AS ldsa - LEFT JOIN ( - SELECT - ldrs.stock_article_id, - ldr.id AS reservation_id, - CONCAT( ldr.reservation_code, '(', ldrs.reservation_num, ')' ) AS msg - FROM - logpm_distribution_reservation_stockarticle AS ldrs - LEFT JOIN logpm_distribution_reservation ldr ON ldrs.reservation_id = ldr.id AND ldrs.stock_article_status != 2 AND (ldr.reservation_num + ldr.reservation_stock_list_num) > 0 - ) AS t ON ldsa.id = t.stock_article_id - LEFT JOIN ( - SELECT - ldbs.stock_article_id, - CONCAT( ldbl.pickup_batch, '(', IFNULL( SUM( ldbp.packet_number ), 0 ), ')' ) AS msg - FROM - logpm_distrilbution_bill_stock AS ldbs - LEFT JOIN logpm_distrilbution_bill_lading AS ldbl ON ldbs.bill_lading_id = ldbl.id - LEFT JOIN logpm_distrilbution_bill_package AS ldbp ON ldbp.bill_lading_id = ldbs.bill_lading_id - AND ldbp.stock_article_id = ldbs.stock_article_id - ) AS y ON ldsa.id = y.stock_article_id - LEFT JOIN ( - SELECT - ldrs.stock_article_id, - ldr.id AS reservation_id, - CONCAT( lddl.train_number, '(', ldrs.reservation_num, ')' ) AS mssg, - CONCAT( lds.examine_user_name ) AS examine_user_name, - CONCAT( lddl.driver_name ) AS driverName, - CONCAT( lddl.vehicle_name ) AS vehicleName, - MAX(lds.signing_time) AS signing_time + ldsa.order_code AS orderCode, + ldsa.mall_name AS mallName, + ldsa.warehouse AS warehouseName, + ldsa.consignee_unit AS consigneeUnit, + ldsa.consignee_person AS consigneePerson, + ldsa.total_number AS totalNumber, + ldsa.hand_quantity AS handQuantity, + ldsa.brand AS brand, + ldsa.delivery_quantity as deliveryNumber, + ldsa.signin_quantity AS signForNumber, + IFNULL((SELECT sum(stock_quantity) FROM logpm_distribution_stock WHERE stock_article = ldsa.id),0) AS + stockUpNumber, + ldsa.create_time AS createTime, + ldsa.create_user AS createUser, + CASE + ldsa.order_status + WHEN 70 THEN + '部分签收' + WHEN 80 THEN + '已签收' ELSE '未知' + END AS orderStatusName, + CASE + ldsa.is_zero + WHEN 0 THEN + '否' + WHEN 1 THEN + '是' ELSE '未知' + END AS isZeroName, + CASE + ldsa.reservation_status + WHEN 10 THEN + '待预约' + WHEN 20 THEN + '部分预约' + WHEN 30 THEN + '已预约' + END AS orderReservationStatusName, + CASE + ldsa.is_zero + WHEN 0 THEN + IF + ( ldsa.total_number = ( SELECT sum( quantity ) FROM logpm_distribution_parcel_list WHERE stock_article_id = + ldsa.id ), '是', '否' ) + WHEN 1 THEN + IF + ( ldsa.total_number = ( SELECT sum( quantity ) FROM logpm_distribution_parcel_number WHERE stock_article_id = + ldsa.id ), '是', '否' ) + END AS isCompleteSet, + CASE + ldsa.type_service + WHEN 1 THEN + '商配' + WHEN 2 THEN + '市配' + WHEN 3 THEN + '自提' + WHEN 4 THEN + '三方中转' + END AS typeServiceName, + min( ldpl.create_time ) earliestWarehouseEntryTime, + max( ldpl.create_time ) warehouseEntryTime, + MIN( ldl.signing_time ) scanSigningTime, + MAX( ldl.scan_time ) signinTime FROM - logpm_distribution_reservation_stockarticle AS ldrs - LEFT JOIN logpm_distribution_reservation ldr ON ldrs.reservation_id = ldr.id - AND ldrs.stock_article_status != 2 - AND (ldr.reservation_num + ldr.reservation_stock_list_num) > 0 - LEFT JOIN - logpm_distribution_signfor As lds ON lds.reservation_id = ldr.id - LEFT JOIN logpm_distribution_delivery_list AS lddl ON lds.delivery_id = lddl.id - GROUP BY ldr.id - ) AS m ON ldsa.id = m.stock_article_id AND t.reservation_id = m.reservation_id - LEFT JOIN ( SELECT stock_article_id, min( create_time ) AS earliestWarehouseEntryTime FROM logpm_distribution_parcel_list GROUP BY stock_article_id) AS k ON k.stock_article_id = ldsa.id - LEFT JOIN ( SELECT order_id, max( signing_time ) AS scanSigningTime FROM logpm_distribution_loadscan WHERE scan_status != 1 AND signfor_state = 2 GROUP BY order_id ) AS j ON j.order_id = ldsa.id + logpm_distribution_loadscan ldl + LEFT JOIN logpm_distribution_stock_article ldsa ON ldsa.id = ldl.order_id + LEFT JOIN logpm_distribution_parcel_list ldpl ON ldpl.stock_article_id = ldsa.id + left JOIN logpm_distribution_reservation ldr on ldr.id = ldl.reservation_id - ldsa.order_status in ('70','80') + ldl.signfor_state = 2 + and ldsa.order_status in ('70','80') + + + and ldl.warehouse_id in + + #{item} + + - AND ldsa.waybill_number like concat("%",#{param.waybillNumber},"%") + AND ldsa.waybill_number like concat(#{param.waybillNumber},"%") - AND ldsa.service_number like concat("%",#{param.serviceNumber},"%") + AND ldsa.service_number like concat(#{param.serviceNumber},"%") - AND ldsa.order_code like concat("%",#{param.orderCode},"%") + AND ldsa.order_code like concat(#{param.orderCode},"%") - AND ldsa.warehouse like concat("%",#{param.warehouseName},"%") + AND ldsa.warehouse like concat(#{param.warehouseName},"%") - AND ldsa.mall_name like concat("%",#{param.mallName},"%") + AND ldsa.mall_name like concat(#{param.mallName},"%") AND ldsa.brand like concat("%",#{param.brand},"%") - AND ldsa.consignee_person like concat("%",#{param.consigneePerson},"%") + AND ldsa.consignee_person like concat(#{param.consigneePerson},"%") - AND ldsa.consignee_unit like concat("%",#{param.consigneeUnit},"%") + AND ldsa.consignee_unit like concat(#{param.consigneeUnit},"%") - - AND m.mssg like concat("%",#{param.deliveryListInfo},"%") + + AND date_format(ldpl.create_time ,'%y%m%d%') = date_format(#{param.earliestWarehouseEntryTime},'%y%m%d%') - - AND m.driverName like concat("%",#{param.driverName},"%") + + AND date_format(ldpl.create_time ,'%y%m%d%') = date_format(#{param.warehouseEntryTime},'%y%m%d%') - - AND m.examine_user_name like concat("%",#{param.examineUserNames},"%") + + AND date_format(ldl.signing_time ,'%y%m%d%') = date_format(#{param.scanSigningTime},'%y%m%d%') - - - AND t.msg like concat("%",#{param.reservationInfo},"%") + + AND date_format(ldpl.create_time ,'%y%m%d%') BETWEEN date_format(#{param.warehouseEntryTimeStart},'%y%m%d%') AND date_format(#{param.warehouseEntryTimeEnd},'%y%m%d%') - - AND ldsa.warehouse_id = #{param.warehouseId} + + AND date_format(ldl.signing_time ,'%y%m%d%') BETWEEN date_format(#{param.scanSigningTimeStart},'%y%m%d%') AND date_format(#{param.scanSigningTimeEnd},'%y%m%d%') - - AND ldsa.warehouse_id IN - - #{item} - - - - AND ldsa.order_code in - - #{item} - - - - AND ldsa.waybill_number in - - #{item} - + + GROUP BY + ldl.order_id,ldl.reservation_id + UNION ALL + SELECT + ldsa.id AS id, + ldsa.waybill_number AS waybillNumber, + ldsa.service_number AS serviceNumber, + ldsa.order_code AS orderCode, + ldsa.mall_name AS mallName, + ldsa.warehouse AS warehouseName, + ldsa.consignee_unit AS consigneeUnit, + ldsa.consignee_person AS consigneePerson, + ldsa.total_number AS totalNumber, + ldsa.hand_quantity AS handQuantity, + ldsa.brand AS brand, + ldsa.delivery_quantity as deliveryNumber, + ldsa.signin_quantity AS signForNumber, + IFNULL((SELECT sum(stock_quantity) FROM logpm_distribution_stock WHERE stock_article = ldsa.id),0) AS + stockUpNumber, + ldsa.create_time AS createTime, + ldsa.create_user AS createUser, + CASE + ldsa.order_status + WHEN 70 THEN + '部分签收' + WHEN 80 THEN + '已签收' ELSE '未知' + END AS orderStatusName, + CASE + ldsa.is_zero + WHEN 0 THEN + '否' + WHEN 1 THEN + '是' ELSE '未知' + END AS isZeroName, + CASE + ldsa.reservation_status + WHEN 10 THEN + '待预约' + WHEN 20 THEN + '部分预约' + WHEN 30 THEN + '已预约' + END AS orderReservationStatusName, + CASE + ldsa.is_zero + WHEN 0 THEN + IF + ( ldsa.total_number = ( SELECT sum( quantity ) FROM logpm_distribution_parcel_list WHERE stock_article_id = + ldsa.id ), '是', '否' ) + WHEN 1 THEN + IF + ( ldsa.total_number = ( SELECT sum( quantity ) FROM logpm_distribution_parcel_number WHERE stock_article_id = + ldsa.id ), '是', '否' ) + END AS isCompleteSet, + CASE + ldsa.type_service + WHEN 1 THEN + '商配' + WHEN 2 THEN + '市配' + WHEN 3 THEN + '自提' + WHEN 4 THEN + '三方中转' + END AS typeServiceName, + min( ldpl.create_time ) earliestWarehouseEntryTime, + max( ldpl.create_time ) warehouseEntryTime, + MIN( ldbls.create_time ) scanSigningTime, + MAX( ldbls.create_time ) signinTime + FROM + logpm_distribution_bill_lading_scan AS ldbls + LEFT JOIN logpm_distribution_stock_article ldsa ON ldsa.id = ldbls.stock_article_id + LEFT JOIN logpm_distribution_parcel_list ldpl ON ldpl.stock_article_id = ldsa.id + LEFT JOIN logpm_distrilbution_bill_lading AS ldbl ON ldbls.bill_lading_id = ldbl.id + + ldsa.order_status in ('70','80') + and ldbls.warehouse_id in + + #{item} + + + AND ldsa.waybill_number like concat(#{param.waybillNumber},"%") - and ldsa.warehouse_entry_time between #{param.startDate} and - #{param.entDate} + + AND ldsa.service_number like concat(#{param.serviceNumber},"%") - and DATE(ldsa.warehouse_entry_time) = - #{param.warehouseEntryTime} + + AND ldsa.order_code like concat(#{param.orderCode},"%") - and DATE(ldsa.create_time) = - #{param.createTime} + + AND ldsa.warehouse like concat(#{param.warehouseName},"%") - and DATE(m.signing_time) = - #{param.signinTime} + + AND ldsa.mall_name like concat(#{param.mallName},"%") - and DATE(k.earliestWarehouseEntryTime) = - #{param.earliestWarehouseEntryTime} + + AND ldsa.brand like concat("%",#{param.brand},"%") - and DATE(j.scanSigningTime) = - #{param.scanSigningTime} + + AND ldsa.consignee_person like concat(#{param.consigneePerson},"%") - and DATE(k.earliestWarehouseEntryTime) > - #{param.warehouseEntryTimeStart} + + AND ldsa.consignee_unit like concat(#{param.consigneeUnit},"%") - and DATE(k.earliestWarehouseEntryTime) < - #{param.warehouseEntryTimeEnd} + + AND date_format(ldpl.create_time ,'%y%m%d%') = date_format(#{param.earliestWarehouseEntryTime},'%y%m%d%') - and DATE(m.signing_time) >= - #{param.signingTimeStart} + + AND date_format(ldpl.create_time ,'%y%m%d%') = date_format(#{param.warehouseEntryTime},'%y%m%d%') - and DATE(m.signing_time) <= - #{param.signingTimeEnd} + + AND date_format(ldbls.create_time ,'%y%m%d%') = date_format(#{param.scanSigningTime},'%y%m%d%') - and DATE(j.scanSigningTime) >= - #{param.scanSigningTimeStart} + + AND date_format(ldpl.create_time ,'%y%m%d%') BETWEEN date_format(#{param.warehouseEntryTimeStart},'%y%m%d%') AND date_format(#{param.warehouseEntryTimeEnd},'%y%m%d%') - and DATE(j.scanSigningTime) <= - #{param.scanSigningTimeEnd} + + AND date_format(ldbls.create_time ,'%y%m%d%') BETWEEN date_format(#{param.scanSigningTimeStart},'%y%m%d%') AND date_format(#{param.scanSigningTimeEnd},'%y%m%d%') GROUP BY - ldsa.id + ldbls.stock_article_id,ldbls.bill_lading_id + + @@ -1324,5 +1436,98 @@ set total_number = #{total} where order_code = #{orderCode} + + update logpm_distribution_stock_article + set + customer_name = #{data.customerName}, + customer_telephone=#{data.customerPhone}, + customer_address=#{data.customerAddress} + where reservation_status = '10' + + and order_code = #{data.orderCode} + + + + + update logpm_distribution_stock_article + + + genre = #{t.genre}, + + + order_status = #{t.orderStatus}, + + + reservation_status = #{t.reservationStatus}, + + + hand_quantity = #{t.handQuantity}, + + + delivery_quantity = #{t.deliveryQuantity}, + + + signin_quantity = #{t.signinQuantity}, + + + where id=#{t.id} + + + + + + + + + update logpm_distribution_stock_article + set trays = null + where id in + + #{item} + + + + + update logpm_distribution_stock_article + set allocation = null, + grounding_status = '10' + where id in + + #{item} + + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleStatisticsMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleStatisticsMapper.xml index 7de78c661..89b43a00f 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleStatisticsMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockArticleStatisticsMapper.xml @@ -3,7 +3,7 @@ + + + + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockListMapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockListMapper.java index 514488ca4..01512907a 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockListMapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockListMapper.java @@ -156,4 +156,8 @@ public interface DistributionStockListMapper extends BaseMapper listAllocationOrder(IPage page, @Param("param") DistributionStockListEntity distributionStockListEntity); List getListByMarketIdAndSku(@Param("mallId")Long mallId, @Param("sku")String sku, @Param("warehouseId")Long warehouseId); + + void clearTraysByIds(@Param("stockListIds") List clearTrayStockListIds); + + void clearAllocationByIds(@Param("stockListIds") List clearAllocationStockListIds); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockListMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockListMapper.xml index 77a6c2cf5..02127e1f1 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockListMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockListMapper.xml @@ -39,10 +39,10 @@ CASE WHEN ldsi.pid is null THEN (select sum(l.quantity_stock) from logpm_distribution_stock_list l - where l.market_id = ldsi.market_id and l.material_id = ldsi.material_id and l.pid is null and ldsi.incoming_batch = l.incoming_batch ) + where l.is_deleted =0 AND l.market_id = ldsi.market_id and l.material_id = ldsi.material_id and l.pid is null and ldsi.incoming_batch = l.incoming_batch ) ELSE (select sum(l.quantity_stock) from logpm_distribution_stock_list l - where l.market_id = ldsi.market_id and l.material_id = ldsi.material_id and l.pid = ldsi.pid and l.pid is not null and ldsi.incoming_batch = l.incoming_batch ) + where l.is_deleted =0 AND l.market_id = ldsi.market_id and l.material_id = ldsi.material_id and l.pid = ldsi.pid and l.pid is not null and ldsi.incoming_batch = l.incoming_batch ) END 'quantityStock', CASE WHEN ldsi.pid is null THEN (select sum(l.outbound_quantity) @@ -104,7 +104,8 @@ ldsl.market_id marketId, ldsl.material_id materialId, ldsl.id id, - ldsl.brand_name brandName + ldsl.brand_name brandName, + ldsl.source_type from logpm_distribution_stock_list ldsl ldsl.warehouse_id = #{par.warehouseId} and ldsl.quantity_stock > 0 and ldsl.source_type = 2 @@ -386,6 +387,7 @@ LEFT JOIN logpm_warehouse_updown_goods lwug on ldsi.material_id = lwug.association_id and ldsi.incoming_batch = lwug.incoming_batch and ldsi.market_id = lwug.market_id and lwug.association_type = '4' and lwug.warehouse_id = ldsi.warehouse_id + lwug.id is not null and ldsi.material_id = #{param.materialId} and ldsi.market_id = #{param.marketId} and ldsi.warehouse_id = #{param.warehouseId} @@ -413,6 +415,7 @@ AND ldsi.market_id = ldsli.market_id and ldsli.incoming_batch = ldsi.incoming_batch LEFT JOIN logpm_warehouse_updown_goods lwug ON ldsli.parcel_list_id = lwug.association_id and lwug.association_type = '3' + lwug.id is not null and ldsi.id = #{param.id} group by lwug.allocation_id @@ -613,4 +616,22 @@ and ldsl.warehouse_id = #{warehouseId} + + update logpm_distribution_stock_list + set tray_name = null + where id in + + #{stockListId} + + + + + update logpm_distribution_stock_list + set storage_location = null + where id in + + #{stockListId} + + + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockupMapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockupMapper.java index 754539272..a8dffeb45 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockupMapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionStockupMapper.java @@ -57,7 +57,7 @@ public interface DistributionStockupMapper extends BaseMapper pageList(IPage page,@Param("param") DistributionStockupEntity distributionStockupEntity); + IPage pageList(IPage page,@Param("param") DistributionStockupEntity distributionStockupEntity,@Param("warehouseIdList") List warehouseIdList); IPage selectStockupPage(IPage page, @Param("param") StockupDTO stockupDTO); @@ -77,7 +77,6 @@ public interface DistributionStockupMapper extends BaseMapper detailReservationOwn(IPage page,@Param("param")DistributionStockupVO distributionStockupVO); @@ -169,7 +168,7 @@ public interface DistributionStockupMapper extends BaseMapper pageOweList(IPage page,@Param("param")DistributionStockupEntity distributionStockupEntity); + IPage pageOweList(IPage page,@Param("param")DistributionStockupEntity distributionStockupEntity ,@Param("warehouseIdList") List warehouseIdList); IPage getInventoryOwnSelf(IPage page,@Param("id") Long id); @@ -244,7 +243,6 @@ public interface DistributionStockupMapper extends BaseMapper exportStockUptOrderDetail(@Param("ids") List ids); @@ -258,15 +256,12 @@ public interface DistributionStockupMapper extends BaseMapper - lds.is_deleted = 0 AND aa.aaa > 0 AND ldsi.stock_status != 4 - + lds.is_deleted = 0 AND ldsi.stock_status != 4 + and lds.type_service = #{param.typeService} and @@ -283,9 +272,13 @@ and lds.stockup_user like concat('%',#{param.stockupUser},'%') - and lds.stockip_allocation + and ldpl.goods_allocation like concat('%',#{param.stockipAllocation},'%') + and ldpl.pallet + like concat('%',#{param.pallet},'%') + + and lds.stockup_code like concat('%',#{param.stockupCode},'%') @@ -304,14 +297,14 @@ and lds.loader_name like concat('%', #{param.loaderName},'%') - - - and lds.warehouse_id = - #{param.warehouseId} - - + + and lds.warehouse_id in - + + #{a} + + and ldpl.warehouse_id in + #{a} @@ -356,16 +349,15 @@ lds.loader_name loaderName, lds.forklift_id forkliftId,lds.loader_id loaderId,lds.fix_time fixTime,lds.assign_time assignTime, lds.type_service typeService,lds.outbound_date outboundDate,lds.stockup_code stockupCode, - COALESCE(GROUP_CONCAT(DISTINCT lwug.position_code SEPARATOR ','), '')stockipAllocation, - COALESCE(GROUP_CONCAT(DISTINCT lwtg.tray_code SEPARATOR ','), '') pallet, + COALESCE(GROUP_CONCAT(DISTINCT ldpl.goods_allocation SEPARATOR ','), '')stockipAllocation, + COALESCE(GROUP_CONCAT(DISTINCT ldpl.pallet SEPARATOR ','), '') pallet, COALESCE(group_concat(DISTINCT ldsa.mall_name separator ','), '') as consignee from logpm_distribution_stockup lds LEFT JOIN logpm_distribution_stockup_info ldsi on ldsi.stockup_id = lds.id LEFT JOIN logpm_distrilbution_bill_stock ldbs on ldbs.bill_lading_id = ldsi.reservation_id LEFT JOIN logpm_distribution_stock_article ldsa on ldsa.id = ldbs.stock_article_id and ldbs.order_status in (1,2) LEFT JOIN logpm_distribution_parcel_list ldpl on ldpl.stock_article_id = ldbs.stock_article_id - LEFT JOIN logpm_warehouse_tray_goods lwtg on lwtg.association_id = ldpl.id - LEFT JOIN logpm_warehouse_updown_goods lwug on lwug.association_id = ldpl.id + LEFT JOIN ( SELECT IFNULL(COUNT( b.reservation_id ),0 )AS aaa, @@ -392,9 +384,13 @@ and lds.stockup_user like concat('%',#{param.stockupUser},'%') - and lds.stockip_allocation + and ldpl.goods_allocation like concat('%',#{param.stockipAllocation},'%') + and ldpl.pallet + like concat('%',#{param.pallet},'%') + + and lds.stockup_code like concat('%',#{param.stockupCode},'%') @@ -413,83 +409,90 @@ and lds.loader_name like concat('%', #{param.loaderName},'%') - and lds.type_service = - #{param.typeService} - - and lds.warehouse_id = - #{param.warehouseId} - - + + and lds.warehouse_id in - + #{a} - GROUP BY lds.id ORDER By lds.create_time Desc @@ -724,39 +768,43 @@ @@ -765,10 +813,11 @@ stockupCode,lds.type_service typeService, lds.stockup_status stockupStatus,lds.stockup_area stockupArea from logpm_distribution_stockup lds - LEFT JOIN logpm_distribution_stockup_info ldsi on ldsi.stockup_id = lds.id + LEFT JOIN logpm_distribution_stockup_info ldsi on ldsi.stockup_id = lds.id AND ldsi.stock_status != 4 - lds.id = #{param.stockupId} AND ldsi.stock_status != 4 + lds.id = #{param.stockupId} + @@ -1002,7 +1052,7 @@ from logpm_distribution_stockup_info ldsi left join logpm_distribution_stockup lds on lds.id = ldsi.stockup_id and lds.is_deleted = 0 left join logpm_warehouse_goods_area lwga on lwga.id = lds.goods_area_id and lwga.is_deleted = 0 - where ldsi.reservation_id = #{reservationId} + where ldsi.reservation_id = #{reservationId} AND ldsi.stock_status != 4 and ldsi.is_deleted = 0 - - select dbl.id, - GROUP_CONCAT(DISTINCT dsa.service_number) serviceNumber, - GROUP_CONCAT(DISTINCT dsa.waybill_number) waybillNumber, - GROUP_CONCAT(DISTINCT dsa.consignee_unit) - consigneeUnit,GROUP_CONCAT(DISTINCT dsa.consignee_person) customerName, - GROUP_CONCAT(DISTINCT dsa.customer_telephone) - customerTelephone,dsa.warehouse,dsa.warehouse_entry_time warehouseEntryTime,dsa.storage_fee - storageFee, - IFNULL((SELECT SUM(packet_number) FROM logpm_distrilbution_bill_package WHERE bill_lading_id = dbl.id AND packet_bar_status != 2),0)+IFNULL((SELECT SUM(quantity) FROM logpm_distribution_reservation_zero_package WHERE reservation_id = dbl.id AND zero_package_status !=2),0) + IFNULL((SELECT SUM(quantity) FROM logpm_distribution_delivery_details WHERE bill_lading_id = dbl.id AND inventory_status != 2),0)AS totalNumber, - dbl.certificate_type certificateType, - GROUP_CONCAT(DISTINCT dsa.brand) brand,dsa.type_service typeService, - dbl.pick_up_time pickUpTime,dbl.consignee,dbl.delivery_document - deliveryDocument,dbl.conditions, - dbl.total_cost totalCost, - dbl.pick_up_plate pickUpPlate,dbl.pickup_batch pickupBatch, + SELECT + dbl.id, + t.orderCode, + t.serviceNumber, + t.consigneeUnit, + t.customerName, + t.customerTelephone, + t.waybillNumber, + 3 AS typeService, + t.warehouseEntryTime, + t.storageFee, + IFNULL(( SELECT sum( packet_number ) FROM logpm_distrilbution_bill_package WHERE bill_lading_id = dbl.id AND packet_bar_status != 2 ), 0 ) + IFNULL(( SELECT sum( quantity ) FROM logpm_distribution_reservation_zero_package WHERE reservation_id = dbl.id AND zero_package_status != 2 ), 0 ) + IFNULL(( SELECT sum( quantity ) FROM logpm_distribution_delivery_details WHERE bill_lading_id = dbl.id AND inventory_status != 2 ), 0 ) AS totalNumber, + dbl.certificate_type AS certificateType, + dbl.pick_up_time AS pickUpTime, + dbl.consignee, + dbl.delivery_document AS deliveryDocument, + dbl.conditions, + dbl.total_cost AS totalCost, + dbl.pick_up_plate AS pickUpPlate, + dbl.pickup_batch AS pickupBatch, + ( SELECT count( quantity ) FROM logpm_distribution_bill_lading_scan WHERE bill_lading_id = dbl.id ) AS stopNum, ( - select COUNT(id) - from logpm_distribution_bill_lading_scan - where bill_lading_id = dbl.id - ) stopNum, - GROUP_CONCAT(DISTINCT dsa.order_code) orderCode, - (SELECT - GROUP_CONCAT(splice) - from + SELECT + group_concat( splice ) + FROM ( - SELECT dbl2.id as id, - if(ldpl2.second=null or ldpl2.second='' ,'',CONCAT(ldpl2.second,'(',count(*),')') ) - as splice from logpm_distrilbution_bill_lading dbl2 - LEFT JOIN logpm_distrilbution_bill_package dbp2 ON dbp2.bill_lading_id = dbl2.id AND dbp2.packet_bar_status IN ( 1, 3 ) + SELECT + dbl2.id AS id, + IF + ( + ldpl2.SECOND = NULL + OR ldpl2.SECOND = '', + '', + CONCAT( ldpl2.SECOND, '(', count(*), ')' )) AS splice + FROM + logpm_distrilbution_bill_lading dbl2 + LEFT JOIN logpm_distrilbution_bill_package dbp2 ON dbp2.bill_lading_id = dbl2.id + AND dbp2.packet_bar_status IN ( 1, 3 ) LEFT JOIN logpm_distribution_parcel_list ldpl2 ON dbp2.parce_list_id = ldpl2.id - AND dbp2.tenant_id = '627683' - GROUP BY dbl2.pickup_batch,ldpl2.second - ) as aimdate - WHERE dbl.id=id - GROUP BY id - ) AS productInformation - from logpm_distrilbution_bill_lading dbl - LEFT JOIN logpm_distrilbution_bill_stock AS lds on lds.bill_lading_id = dbl.id - LEFT JOIN logpm_distribution_stock_article dsa on lds.stock_article_id = dsa.id - dbl.is_deleted = 0 AND lds.order_status != 2 - and dsa.service_number like - concat('%',#{param.serviceNumber},'%') - - and dsa.order_code like - concat('%',#{param.orderCode},'%') + 1=1 + + and dbl2.warehouse_id in + + #{item} + + + + GROUP BY + dbl2.pickup_batch, + ldpl2.SECOND + ) aimdate + WHERE + dbl.id = id + GROUP BY + id + ) AS productInformation + FROM + logpm_distrilbution_bill_lading dbl + LEFT JOIN ( + SELECT + CASE + + WHEN + k.id IS NULL THEN + m.id + WHEN m.id IS NULL THEN + k.id ELSE k.id + END id, + CONCAT_WS( ',', k.orderCode, m.orderCode ) AS orderCode, + CONCAT_WS( ',', k.serviceNumber, m.serviceNumber ) AS serviceNumber, + IF(k.customerName is not null, k.customerName, m.customerName) AS customerName, + IF(k.consigneeUnit is not null, k.consigneeUnit, m.consigneeUnit) AS consigneeUnit, + IF(k.customerTelephone is not null, k.customerTelephone, m.customerTelephone) AS customerTelephone, + CONCAT_WS( ',', k.waybillNumber ) AS waybillNumber, + k.warehouse_entry_time AS warehouseEntryTime, + k.storage_fee AS storageFee + FROM + ( + SELECT + aaa.id, + group_concat( DISTINCT dsa.service_number ) AS serviceNumber, + group_concat( DISTINCT dsa.waybill_number ) AS waybillNumber, + group_concat( DISTINCT dsa.consignee_unit ) AS consigneeUnit, + group_concat( DISTINCT dsa.consignee_person ) AS customerName, + group_concat( DISTINCT dsa.customer_telephone ) AS customerTelephone, + group_concat( DISTINCT dsa.brand ) AS brand, + group_concat( DISTINCT dsa.order_code ) AS orderCode, + group_concat( DISTINCT dsa.warehouse ) AS warehouse, + dsa.warehouse_entry_time, + dsa.storage_fee + FROM + logpm_distrilbution_bill_lading aaa + LEFT JOIN logpm_distrilbution_bill_stock lds ON lds.bill_lading_id = aaa.id + LEFT JOIN logpm_distribution_stock_article dsa ON lds.stock_article_id = dsa.id + WHERE + lds.order_status != 2 + + and aaa.warehouse_id in + + #{item} + + + GROUP BY + aaa.id + ) AS k + LEFT JOIN ( + SELECT + bbb.id, + group_concat( DISTINCT ldsl.service_number ) AS serviceNumber, + group_concat( ldsl.incoming_batch ) AS incomingBatch, + group_concat( DISTINCT ldsl.market_name ) AS consigneeUnit, + group_concat( DISTINCT ldsl.order_code ) AS orderCode, + group_concat( DISTINCT lbc.linkman ) AS customerName, + group_concat( DISTINCT lbc.phone ) AS customerTelephone, + group_concat( DISTINCT ldsl.brand_name ) AS brand + FROM + logpm_distrilbution_bill_lading bbb + LEFT JOIN logpm_distribution_delivery_details lddd ON lddd.bill_lading_id = bbb.id + AND lddd.is_deleted = 0 + LEFT JOIN logpm_distribution_stock_list ldsl ON lddd.stock_list_id = ldsl.id + LEFT JOIN logpm_basicdata_client lbc ON ldsl.market_id = lbc.id + WHERE + lddd.inventory_status != 2 + + and bbb.warehouse_id in + + #{item} + + + GROUP BY + bbb.id + ) AS m ON m.id = k.id + ) AS t ON t.id = dbl.id + + dbl.is_deleted=0 and dbl.pickup_batch like concat('%',#{param.pickupBatch},'%') - and dsa.waybill_number like - concat('%',#{param.waybillNumber},'%') - - and dsa.consignee_unit like - concat('%',#{param.consigneeUnit},'%') - - and dsa.customer_name like - concat('%',#{param.customerName},'%') - - and dsa.customer_telephone like - concat('%',#{param.customerTelephone},'%') - - and dsa.warehouse like - concat('%',#{param.warehouse},'%') - - + and dbl.warehouse_id in - + #{item} - and date(dsa.warehouse_entry_time) = + and date(t.warehouseEntryTime) = #{param.warehouseEntryTime} - and dsa.warehouse_entry_time between #{param.startDate} and + and date(dbl.pick_up_time) = + #{param.pickUpTime} + + and t.warehouseEntryTime between #{param.startDate} and #{param.entDate} - and dsa.brand like concat('%',#{param.brand},'%') and dsa.type_service = #{param.typeService} - and dsa.allocation like - concat('%',#{param.productInformation},'%') - and dbl.pickup_phone concat('%',#{param.pickupPhone},'%') and dbl.consignee like concat('%',#{param.consignee},'%') + and t.orderCode like + concat('%',#{param.orderCode},'%') + + and t.waybillNumber like + concat('%',#{param.waybillNumber},'%') + + and t.serviceNumber like + concat('%',#{param.serviceNumber},'%') + + and t.consigneeUnit like + concat('%',#{param.consigneeUnit},'%') + + and t.customerName like + concat('%',#{param.customerName},'%') + + and t.customerTelephone like + concat('%',#{param.customerTelephone},'%') + and dbl.pick_up_plate like concat('%',#{param.pickUpPlate},'%') @@ -135,27 +226,40 @@ and dbl.warehouse_id = #{param.warehouseId} + + and dbl.pickup_batch IN + + #{batch} + + + + and t.orderCode IN + + #{orderCode} + + - GROUP BY dbl.id,dsa.warehouse,dsa.type_service - Order BY dbl.create_time desc + GROUP BY + dbl.id + ORDER BY + dbl.create_time DESC @@ -469,12 +716,14 @@ LEFT JOIN logpm_distribution_stock lds on lds.parcel_list_id = ldbp.parce_list_id LEFT JOIN logpm_distribution_stock_article dsa ON dbl.stock_article_id = dsa.id LEFT JOIN logpm_distribution_stockup_info ldsi on dbl.id = ldsi.reservation_id and ldsi.stock_up_type = #{distrilbutionBillLading.stockupType} - where ldsi.stockup_id = #{distrilbutionBillLading.id}; + where + ldsi.stockup_id = #{distrilbutionBillLading.id} + AND ldbp.packet_bar_status != 2 + + + + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillStockMapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillStockMapper.java index 94b8fd26d..0d162dc76 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillStockMapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillStockMapper.java @@ -19,6 +19,7 @@ package com.logpm.distribution.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.distribution.dto.DistrilbutionBillStockDTO; import com.logpm.distribution.dto.app.StockupDTO; import com.logpm.distribution.entity.DistrilbutionBillStockEntity; import com.logpm.distribution.excel.DistributionBillOrderExcel; @@ -56,9 +57,9 @@ public interface DistrilbutionBillStockMapper extends BaseMapper exportDistrilbutionBillStock(@Param("ew") Wrapper queryWrapper); - IPage getBillOrderDetail(IPage page,@Param("param") DistrilbutionBillStockEntity distrilbutionBillStock); + IPage getBillOrderDetail(IPage page,@Param("param") DistrilbutionBillStockDTO distrilbutionBillStock); - IPage getBillOrderPack(IPage page,@Param("param") DistrilbutionBillStockEntity billStock); + IPage getBillOrderPack(IPage page,@Param("param") DistrilbutionBillStockDTO billStock); List selectDistrilbutionBillSelf(@Param("reservationId")Long reservationId,@Param("isZero") String isZero); @@ -70,7 +71,16 @@ public interface DistrilbutionBillStockMapper extends BaseMapper listPackageSelf(@Param("reservationId")Long reservationId); - List distrilbutionBillStock(@Param("param")DistrilbutionBillStockEntity distrilbutionBillStock); + List getBillStockExcel(@Param("param")DistrilbutionBillStockEntity distrilbutionBillStock); + + /** + * 查询自提订单导出详情 + * @param id + * @return + */ + List getBillLadingDetailStockExcel(@Param("id")Long id); List billOrderPackExcel(@Param("param")DistrilbutionBillStockEntity billStock); + + List getBillLadingDetailOrderPackExcel(@Param("id")Long id); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillStockMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillStockMapper.xml index 5f07aebb5..cdd3f2d37 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillStockMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillStockMapper.xml @@ -115,45 +115,55 @@ - - select DISTINCT ldsa.order_code orderCode,ldsa.total_number,ldsa.description_goods descriptionGoods,ldsa.stockup_status stockupStatus, + select DISTINCT + ldsa.order_code orderCode, + ldsa.total_number, + ldsa.description_goods descriptionGoods, + ldsa.stockup_status stockupStatus, + (SELECT GROUP_CONCAT(material_name) FROM logpm_distribution_parcel_list WHERE is_deleted = 0 AND stock_article_id = ldsa.id GROUP BY stock_article_id) AS materialName, + CASE ldsa.is_zero + WHEN 0 THEN (select COUNT(id) from logpm_distrilbution_bill_package - where stock_article_id = ldsa.id and packet_bar_status in (1,3) and bill_lading_id = #{param.billLadingId} ) handQuantity, - (select COUNT(id) from logpm_distribution_bill_lading_scan - where stock_article_id = ldsa.id ) pick_up_quantity, + where stock_article_id = ldsa.id and packet_bar_status in (1,3) and bill_lading_id = #{param.billLadingId} AND is_deleted = 0 ) + ELSE + (select sum(quantity) from logpm_distribution_reservation_zero_package + where stock_article_id = ldsa.id and zero_package_status in (1,3) AND type =3 and reservation_id = #{param.billLadingId} AND is_deleted = 0 ) + END handQuantity, + (select IFNULL(sum(quantity) ,0) from logpm_distribution_bill_lading_scan + where stock_article_id = ldsa.id AND bill_lading_id = #{param.billLadingId} AND is_deleted = 0 ) pick_up_quantity, CASE - WHEN (SELECT COUNT(id) FROM logpm_distribution_bill_lading_scan WHERE stock_article_id = ldsa.id) - (SELECT COUNT(id) FROM logpm_distrilbution_bill_package WHERE stock_article_id = ldsa.id AND packet_bar_status IN (1,3)) = 0 THEN 20 - WHEN (SELECT COUNT(id) FROM logpm_distribution_bill_lading_scan WHERE stock_article_id = ldsa.id) - (SELECT COUNT(id) FROM logpm_distrilbution_bill_package WHERE stock_article_id = ldsa.id AND packet_bar_status IN (1,3)) > 0 THEN 10 - WHEN (SELECT COUNT(id) FROM logpm_distribution_bill_lading_scan WHERE stock_article_id = ldsa.id) - (SELECT COUNT(id) FROM logpm_distrilbution_bill_package WHERE stock_article_id = ldsa.id AND packet_bar_status IN (1,3)) < 0 THEN 30 + WHEN (SELECT COUNT(id) FROM logpm_distribution_bill_lading_scan WHERE stock_article_id = ldsa.id AND is_deleted = 0) - (SELECT COUNT(id) FROM logpm_distrilbution_bill_package WHERE stock_article_id = ldsa.id AND packet_bar_status IN (1,3) AND is_deleted = 0) = 0 THEN '20' + WHEN (SELECT COUNT(id) FROM logpm_distribution_bill_lading_scan WHERE stock_article_id = ldsa.id AND is_deleted = 0) - (SELECT COUNT(id) FROM logpm_distrilbution_bill_package WHERE stock_article_id = ldsa.id AND packet_bar_status IN (1,3) AND is_deleted = 0) > 0 THEN '10' + WHEN (SELECT COUNT(id) FROM logpm_distribution_bill_lading_scan WHERE stock_article_id = ldsa.id AND is_deleted = 0) - (SELECT COUNT(id) FROM logpm_distrilbution_bill_package WHERE stock_article_id = ldsa.id AND packet_bar_status IN (1,3) AND is_deleted = 0) < 0 THEN '30' END AS conditions, (select GROUP_CONCAT(DISTINCT ldpl.material_name ) from logpm_distribution_parcel_list ldpl where ldpl.material_name is not null and ldpl.stock_article_id = ldbs.stock_article_id) materialName, - (select count(lds.id) + (select IFNULL(sum(lds.stock_quantity),0) from logpm_distribution_stock lds where lds.stock_article = ldbs.stock_article_id ) preparedQuantity , (select COALESCE(GROUP_CONCAT(DISTINCT lwtg.tray_code SEPARATOR ','), '') @@ -277,11 +298,11 @@ LEFT JOIN logpm_warehouse_updown_goods lwug on lwug.association_id = ldpl.id and lwug.association_type = '3' where ldpl.stock_article_id = ldbs.stock_article_id) goodsAllocation, ldsa.service_number serviceNumber,ldsa.waybill_number waybillNumber,ldsa.train_number trainNumber,ldsa.send_warehouse_name sendWarehouseName - - from logpm_distrilbution_bill_stock ldbs + from + logpm_distrilbution_bill_lading AS ldbl + LEFT JOIN logpm_distrilbution_bill_stock ldbs ON ldbs.bill_lading_id = ldbl.id LEFT JOIN logpm_distribution_stock_article ldsa on ldbs.stock_article_id = ldsa.id LEFT JOIN logpm_distribution_stock lds on lds.stock_article = ldbs.stock_article_id - LEFT JOIN logpm_distrilbution_bill_lading ldbl ON lds.stock_article = ldbl.stock_article_id ldbs.is_deleted = 0 and ldbs.bill_lading_id = #{param.billLadingId} and ldbs.order_status in (1,3) @@ -291,12 +312,12 @@ + + + + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/BillLadingScanDataQueueHandler.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/BillLadingScanDataQueueHandler.java new file mode 100644 index 000000000..8af16a3ee --- /dev/null +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/BillLadingScanDataQueueHandler.java @@ -0,0 +1,45 @@ +package com.logpm.distribution.receiver; + +import cn.hutool.core.util.ObjectUtil; +import com.logpm.warehouse.feign.IWarehouseUpdownTypeClient; +import com.rabbitmq.client.Channel; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.RabbitConstant; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.Objects; + +@Slf4j +@RabbitListener(queues = RabbitConstant.SELF_PICKUP_SCAN_QUEUE) +@Component +@AllArgsConstructor +public class BillLadingScanDataQueueHandler { + private final IWarehouseUpdownTypeClient warehouseUpdownTypeClient; + + @RabbitHandler + public void billLadingScanDataHandler(Map map, Message message, Channel channel) { + log.info("自提订单扫描数据接收成功"); + Object o = map.get("coding"); + Object warehouseIdObj = map.get("warehouseId"); + + if (!ObjectUtil.isAllEmpty(o, warehouseIdObj)) { + + String coding = Objects.toString(o); + + Long warehouseId = (Long) warehouseIdObj; + warehouseUpdownTypeClient.downPackageOrDelTray(coding, warehouseId, "签收下架解托"); + + }else{ + log.warn("自提订单扫描数据接收失败"); + } + + + + } + +} diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/BusinessPreOrderDataQueueHandler.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/BusinessPreOrderDataQueueHandler.java new file mode 100644 index 000000000..ee9d567e0 --- /dev/null +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/BusinessPreOrderDataQueueHandler.java @@ -0,0 +1,154 @@ +package com.logpm.distribution.receiver; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.logpm.business.entity.BusinessPreOrderEntity; +import com.logpm.business.feign.IBusinessPreOrderClient; +import com.logpm.distribution.entity.DistributionDeliveryListEntity; +import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.distribution.entity.DistributionReservationEntity; +import com.logpm.distribution.entity.DistributionReservationPackageEntity; +import com.logpm.distribution.service.*; +import com.rabbitmq.client.Channel; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.RabbitConstant; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.system.entity.Tenant; +import org.springblade.system.feign.ISysClient; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +@Slf4j +@RabbitListener(queues = RabbitConstant.BUSINESS_PRE_CONVERSION_DATA_QUEUE) +@Component +@AllArgsConstructor +public class BusinessPreOrderDataQueueHandler { + + private final IDistributionDeliveryListService distributionDeliveryListService; + private final IDistributionReservationService distributionReservationService; + private final IDistributionReservationPackageService distributionReservationPackageService; + private final IDistributionParcelListService distributionParcelListService; + private final ISysClient sysClient; + private final IBusinessPreOrderClient businessPreOrderClient; + + + private final IDistributionAsyncService distributionAsyncService; + + @RabbitHandler + public void businessPreOrderDataHandler(Map map, Message message, Channel channel) { +// plantA(map); + R> tenantList = sysClient.getTenantList(); + if (tenantList.isSuccess()) { + List data = tenantList.getData(); + data.forEach(tenant -> { + if (!ObjectUtil.isEmpty(tenant.getTenantType())) { + if (2 == tenant.getTenantType()) { + String mallName = tenant.getTenantName(); + // 插入暂存单 + // 插入预计表 + plantA(map, mallName); + } + } + }); + } + } + + + private void plantA(Map map, String mallName) { + + if (StringUtil.isBlank(mallName)) { + return; + } + + Long t = (Long) map.get("messageData"); + if (ObjectUtil.isEmpty(t)) { + log.info(">>>>>>>>>>>>> BusinessPreOrderDataQueueHandler 配送ID为空"); + return; + } + + DistributionDeliveryListEntity distributionDeliveryListEntity = distributionDeliveryListService.getById(t); + if (ObjectUtil.isEmpty(distributionDeliveryListEntity)) { + log.info(">>>>>>>>>>>>> BusinessPreOrderDataQueueHandler 配送对象为null"); + return; + } + + List list = distributionReservationService.selectListByDeliveryId(distributionDeliveryListEntity.getId()); + + if (ObjectUtil.isEmpty(list)) { + log.info(">>>>>>>>>>>>> BusinessPreOrderDataQueueHandler 预约列表为空"); + return; + } + + List dataResult = new ArrayList<>(); + for (DistributionReservationEntity distributionReservationEntity : list) { + // 判断需要进行推送商家名称 + log.info(">>>>> mallName TAG {}", mallName); + log.info(">>>>> distributionReservationEntity.getMallName() TAG {}", distributionReservationEntity.getMallName()); + if (mallName.equals(distributionReservationEntity.getMallName())) { + // 将当前的预约单加入到需要推送的列表 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistributionReservationPackageEntity::getReservationId, distributionReservationEntity.getId()); + queryWrapper.ne(DistributionReservationPackageEntity::getPacketBarStatus, 2); + List distributionReservationPackageEntityList = distributionReservationPackageService.list(queryWrapper); + + for (DistributionReservationPackageEntity distributionReservationPackageEntity : distributionReservationPackageEntityList) { + + + DistributionParcelListEntity byId = distributionParcelListService.getById(distributionReservationPackageEntity.getParceListId()); + BusinessPreOrderEntity data = BeanUtil.copy(byId, BusinessPreOrderEntity.class); + + data.setDriverName(distributionDeliveryListEntity.getDriverName()); + data.setVehicleName(distributionDeliveryListEntity.getVehicleName()); + data.setDistrCarNumber(distributionDeliveryListEntity.getTrainNumber()); + data.setFromTenantId(byId.getTenantId()); + data.setOperationStatus(0); + data.setInWarehouse(0); + data.setId(null); + data.setTenantId(null); + data.setReservationCode(distributionReservationEntity.getReservationCode()); + data.setTaskTime(distributionDeliveryListEntity.getTaskTime()); + dataResult.add(data); + } + } + + } + + Tenant tenant = changeDataBase(mallName); + businessPreOrderClient.saveOtherDataBaseNew(tenant.getTenantId(), dataResult, mallName); +// CompletableFuture.supplyAsync(() -> { +//// saveOtherData(tenant.getTenantId(),waybillBilllByWaybillNos, trunklineAdvanceDetailEntities, trunklineAdvanceEntities, trunklineWaybillPackageEntities, trunklineWaybillOrderEntities, warehouseWayBillDetails, distributionParcelListEntities, mallName); +//// distributionAsyncService.saveOtherData(tenant.getTenantId(),waybillBilllByWaybillNos, trunklineAdvanceDetailEntities, trunklineAdvanceEntities, trunklineWaybillPackageEntities, trunklineWaybillOrderEntities, warehouseWayBillDetails, distributionParcelListEntities, mallName); +//// distributionAsyncService.saveOtherDataBaseNew(tenant.getTenantId() ,dataResult, mallName); +// return null; +// }); + + // 查询包间列表 + + log.info("businessPreOrderDataHandler:{}", map); + } + + private Tenant changeDataBase(String maillName) { + R tenantByName = sysClient.getTenantByName(maillName); + if (tenantByName.isSuccess()) { + Tenant tenant = tenantByName.getData(); + if (ObjectUtil.isEmpty(tenant)) { + log.info(">>>>>>>>>>>>> saveOtherDataBaseNew 租户不存在"); + return null; + } + return tenant; + } + return null; + } + + +} diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/ClerkCheckPushBillDataQueueHandler.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/ClerkCheckPushBillDataQueueHandler.java new file mode 100644 index 000000000..09e9c7e5f --- /dev/null +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/ClerkCheckPushBillDataQueueHandler.java @@ -0,0 +1,54 @@ +package com.logpm.distribution.receiver; + +import com.logpm.distribution.service.IDistrilbutionBillLadingService; +import com.rabbitmq.client.Channel; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.RabbitConstant; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import java.util.Map; + + +/** + * 异常消息队列 处理器 + * + * @author zhy + */ +@Slf4j +@RabbitListener(queues = RabbitConstant.BILL_CLERK_CHECK_PUSH_DATA_QUEUE) +@Component +@AllArgsConstructor +public class ClerkCheckPushBillDataQueueHandler { + + private final IDistrilbutionBillLadingService distrilbutionBillLadingService; + + + @RabbitHandler + public void clerkCheckPushBillLLadingDataHandler(Map map, Message message, Channel channel) { + + try { + //得到审核的任务ID + Long t = (Long) map.get("messageData"); + + + if (ObjectUtil.isEmpty(t )) { + log.info(">>>>>>>>>>>>> clerkCheckPushBillLLadingDataHandler 自提ID为空"); + return; + } + Boolean b = distrilbutionBillLadingService.clerkBillCheckPushData(t); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 推送自提到老系统队列 成功状态 {}",b); + + } catch (Exception e) { + log.error(">>>>> 推送老系统自提信息报错", e); + } + + + } + + +} diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/ClerkCheckPushDataQueueHandler.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/ClerkCheckPushDataQueueHandler.java index 4877705f4..e8bc11e97 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/ClerkCheckPushDataQueueHandler.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/ClerkCheckPushDataQueueHandler.java @@ -5,8 +5,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.logpm.basicdata.feign.IBasicdataTripartiteWarehouseClient; import com.logpm.distribution.dto.DistributionSignforDTO; import com.logpm.distribution.entity.*; +import com.logpm.distribution.feign.IDistributionSignforClient; import com.logpm.distribution.mapper.*; +import com.logpm.distribution.service.IDistributionSignforService; import com.logpm.distribution.service.IDistributionStockService; +import com.logpm.distribution.service.IDistrilbutionBillLadingService; import com.logpm.distribution.vo.DistributionSignPrintVO; import com.logpm.oldproject.dto.SignPushDataContactDTO; import com.logpm.oldproject.dto.SignPushDataDTO; @@ -15,9 +18,12 @@ import com.logpm.oldproject.entity.WarehouseEntity; import com.logpm.oldproject.feign.IOldSignPushClient; import com.logpm.oldproject.feign.IWarehouseClient; import com.rabbitmq.client.Channel; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.common.constant.RabbitConstant; +import org.springblade.common.constant.RedisKeyConstant; import org.springblade.common.constant.stockup.StockAssignStatusConstant; +import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.ObjectUtil; @@ -43,162 +49,25 @@ import java.util.stream.Collectors; @Slf4j @RabbitListener(queues = RabbitConstant.CLERK_CHECK_PUSH_DATA_QUEUE) @Component +@AllArgsConstructor public class ClerkCheckPushDataQueueHandler { - @Autowired - private IDistributionStockService distributionStockService; - @Autowired - private IOldSignPushClient oldSystemDataPushClient; - @Autowired - private DistributionSignforMapper distributionSignforMapper; - @Autowired - private DistributionDeliveryListMapper distributionDeliveryListMapper; - @Autowired - private DistributionReservationMapper distributionReservationMapper; - - @Autowired - private DistributionDeliverySelfMapper distributionDeliverySelfMapper; - - @Autowired - private DistributionDeliveryTripartiteMapper distributionDeliveryTripartiteMapper; - @Autowired - private IUserClient userClient; - - @Autowired - private IBasicdataTripartiteWarehouseClient basicdataTripartiteWarehouseClient; - - @Autowired - private IWarehouseClient warehouseClient; - + private final IDistributionSignforService distributionSignforService; @RabbitHandler public void clerkCheckPushDataHandler(Map map, Message message, Channel channel) { try { - log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 推送老系统签收队列"); //得到审核的任务ID - DistributionSignforDTO distributionStockEntity = (DistributionSignforDTO) map.get("messageData"); - Long signfor_id = distributionStockEntity.getId(); - if (ObjectUtil.isEmpty(signfor_id)) { + Long t = (Long) map.get("messageData"); + if (ObjectUtil.isEmpty(t)) { log.info(">>>>>>>>>>>>> clerkCheckPushDataHandler 签收ID为空"); return; } - - //得到签收对象 - DistributionSignforEntity distributionSignforEntity = distributionSignforMapper.selectById(signfor_id); - - //需要检测文员是否进行复核了 - - if (ObjectUtil.isEmpty(distributionSignforEntity)) { - log.info(">>>>>>>>>>>> clerkCheckPushDataHandler distributionSignforEntity {}", distributionSignforEntity); - return; - } - // 得到配送计划 - DistributionDeliveryListEntity distributionDeliveryListEntity = distributionDeliveryListMapper.selectById(distributionSignforEntity.getDeliveryId()); - if (ObjectUtil.isEmpty(distributionDeliveryListEntity)) { - log.info(">>>>>>>>>>> clerkCheckPushDataHandler distributionDeliveryListEntity {}", distributionDeliveryListEntity); - return; - } - - // 得到配送客户 - DistributionReservationEntity distributionReservationEntity = distributionReservationMapper.selectById(distributionSignforEntity.getReservationId()); - if (ObjectUtil.isEmpty(distributionReservationEntity)) { - log.info(">>>>>>>>>>>> clerkCheckPushDataHandler distributionReservationEntity {}", distributionReservationEntity); - return; - } - - - //组合配送信息 - SignPushDataDTO delivery = distributionDeliveryListMapper.selectPushOldDelivery(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); - - WarehouseEntity warehouseEntity = warehouseClient.findByName(distributionReservationEntity.getWarehouseName()); - if (ObjectUtils.isNotNull(warehouseEntity)) { - // 需要增加老系统的仓库ID - delivery.setWarehouseId(Long.parseLong(warehouseEntity.getId()+"")); - delivery.setWarehouseName(warehouseEntity.getTitle()); - } - - - //还需要配送的出库人、配送人、操作人信息 - if (Func.isNotEmpty(delivery)) { - if ("1".equals(delivery.getKind())) { - //自主配送 - DistributionDeliverySelfEntity distributionDeliverySelfEntity = distributionDeliverySelfMapper.selectOne(Wrappers.query().lambda() - .eq(DistributionDeliverySelfEntity::getDeliveryId, delivery.getId()) - .eq(DistributionDeliverySelfEntity::getIsMaster, delivery.getId()) - ); - if (Func.isNotEmpty(distributionDeliverySelfEntity)) { - delivery.setOutId(Long.parseLong(distributionDeliverySelfEntity.getDriverId())); - delivery.setOutName(distributionDeliverySelfEntity.getDriverName()); - delivery.setOutPhone(distributionDeliverySelfEntity.getDriverPhone()); - } - } else { - //外协 - DistributionDeliveryTripartiteEntity distributionDeliveryTripartiteEntity = distributionDeliveryTripartiteMapper.selectOne(Wrappers.query().lambda().eq(DistributionDeliveryTripartiteEntity::getDeliveryId, delivery.getId())); - if (Func.isNotEmpty(distributionDeliveryTripartiteEntity)) { - delivery.setOutName(distributionDeliveryTripartiteEntity.getDriverName()); - delivery.setOutPhone(distributionDeliveryTripartiteEntity.getDriverPhone()); - } - } - R userR = userClient.userInfoById(delivery.getAdministratorsId()); - if (Func.isNotEmpty(userR)) { - User user = userR.getData(); - delivery.setAdministratorsName(user.getName()); - } - DistributionStockupEntity distributionStockupEntity = distributionReservationMapper.selectStockup(distributionSignforEntity.getReservationId()); - if (Func.isNotEmpty(distributionStockupEntity)) { - if (distributionStockupEntity.getAssignStatus().equals(StockAssignStatusConstant.yizhipai.getValue())) { - delivery.setOutToId(distributionStockupEntity.getStockupUserId()); - delivery.setOutToName(distributionStockupEntity.getStockupUser()); - } - - } - - //查询客户信息 - List customer = distributionReservationMapper.selectPushOldCustomer(distributionSignforEntity.getReservationId()); - if (Func.isNotEmpty(customer)) { - //查询客户订单 - List signPushDataUnitDTOS = new ArrayList<>(); - if (distributionReservationEntity.getReservationNum() > 0) { - //查询包件扫描签收 - List pushOldPackage = distributionSignforMapper.selectPushOldPackage(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); - if (Func.isNotEmpty(pushOldPackage)) { - signPushDataUnitDTOS.addAll(pushOldPackage); - } - } - - if (distributionReservationEntity.getReservationStockListNum() > 0) { - //查询库存品扫描签收 - List pushOldInventory = distributionSignforMapper.selectPushOldInventory(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); - if (Func.isNotEmpty(pushOldInventory)) { - signPushDataUnitDTOS.addAll(pushOldInventory); - } - } - //查询签收图片 - List distributionSignPrintVOS = distributionSignforMapper.selectSignImgsUrl(distributionReservationEntity.getId()); - - - if (Func.isNotEmpty(signPushDataUnitDTOS)) { - SignPushDataContactDTO signPushDataContactDTO = customer.get(0); - signPushDataContactDTO.setSignPushDataUnitDTOs(signPushDataUnitDTOS); - if (Func.isNotEmpty(distributionSignPrintVOS)){ - String urls = distributionSignPrintVOS.stream().map(DistributionSignPrintVO::getUrlRoute).collect(Collectors.joining(",")); - signPushDataContactDTO.setImage(urls); - } - if (Func.isNotEmpty(distributionSignforEntity.getClerkSignRemarks())){ - signPushDataContactDTO.setContact(distributionSignforEntity.getClerkSignRemarks()); - } - } - - //完成客户信息添加 - delivery.setSignPushDataContactDTOs(customer); - } - } - - - Boolean b = oldSystemDataPushClient.pushOldSystemSignInfo(delivery); + Boolean b = distributionSignforService.clerkCheckPushData(t); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 推送老系统签收队列 成功状态: {}",b); } catch (Exception e) { - log.error(">>>>> 推送老系统签收信息报错",e); + log.error(">>>>> 推送老系统签收信息报错", e); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/WarehouseTrayAllocationListener.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/WarehouseTrayAllocationListener.java new file mode 100644 index 000000000..d463b4bc2 --- /dev/null +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/receiver/WarehouseTrayAllocationListener.java @@ -0,0 +1,1307 @@ +package com.logpm.distribution.receiver; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.distribution.entity.DistributionStockArticleEntity; +import com.logpm.distribution.entity.DistributionStockListEntity; +import com.logpm.distribution.entity.DistributionStockListInfoEntity; +import com.logpm.distribution.service.IDistributionParcelListService; +import com.logpm.distribution.service.IDistributionStockArticleService; +import com.logpm.distribution.service.IDistributionStockListInfoService; +import com.logpm.distribution.service.IDistributionStockListService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.broadcast.FanoutConstants; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@Component +@AllArgsConstructor +public class WarehouseTrayAllocationListener { + + private final IDistributionParcelListService parcelListService; + private final IDistributionStockArticleService stockArticleService; + private final IDistributionStockListInfoService stockListInfoService; + private final IDistributionStockListService stockListService; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FanoutConstants.warehouse.TRAYTYPE.QUEUE.TRAYTYPE_MESSAGE), + exchange = @Exchange(name = FanoutConstants.warehouse.TRAYTYPE.EXCHANGE, type = ExchangeTypes.FANOUT) + )) + @Transactional(rollbackFor = Exception.class) + public void trayTypeMessage(String msg) { + log.info("##########trayTypeMessage: 配送消费托盘广播 开始 msg={}",msg); + if(StringUtil.isNotBlank(msg)){ + JSONObject jsonObject = JSONUtil.parseObj(msg); + Integer operation = jsonObject.getInt("operation"); + if(operation.equals(1)){ + //打托 + trayTypeInfo(msg); + }else if(operation.equals(2)){ + //解托 + unbindTrayInfo(msg); + }else{ + log.info("##########trayTypeMessage: 配送消费托盘广播 操作类型错误 operation={}",operation); + } + } + log.info("##########trayTypeMessage: 配送消费托盘广播 结束 msg={}",msg); + } + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FanoutConstants.warehouse.ALLOCATION.QUEUE.ALLOCATION_MESSAGE), + exchange = @Exchange(name = FanoutConstants.warehouse.ALLOCATION.EXCHANGE, type = ExchangeTypes.FANOUT) + )) + @Transactional(rollbackFor = Exception.class) + public void allocationMessage(String msg) { + log.info("##########allocationMessage: 配送消费库位广播 开始 msg={}", msg); + if(StringUtil.isNotBlank(msg)){ + JSONObject jsonObject = JSONUtil.parseObj(msg); + Integer operation = jsonObject.getInt("operation"); + if(operation.equals(3)){ + //上架 + upshelfInfo(msg); + }else if(operation.equals(4)){ + //下架 + downshelfInfo(msg); + }else{ + log.info("##########allocationMessage: 配送消费库位广播 操作类型错误 operation={}",operation); + } + } + log.info("##########allocationMessage: 配送消费库位广播 结束 msg={}", msg); + } + + private void trayTypeInfo(String msg) { + log.info("##########trayTypeInfo: 配送消费打托广播 开始 msg={}",msg); + + if(StringUtil.isNotBlank(msg)){ + JSONObject jsonObject = JSONUtil.parseObj(msg); + Integer dataType = jsonObject.getInt("dataType"); + if(dataType.equals(1)){ + //订制品 + Integer conditions = jsonObject.getInt("conditions"); + JSONArray orderPackageCodeArray = jsonObject.getJSONArray("orderPackageCodes"); + List orderPackageCodes = JSONUtil.toList(orderPackageCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String trayName = jsonObject.getStr("trayName"); + + if(conditions.equals(1)){ + //订制品 + updatePackageTrayInfo(orderPackageCodes, trayName, warehouseId); + }else if(conditions.equals(2)){ + //有数据库存品 + updatePackageStockTrayInfo(orderPackageCodes, trayName, warehouseId); + } + }else if(dataType.equals(2)){ + //零担 + JSONArray orderCodeArray = jsonObject.getJSONArray("orderCodes"); + List orderCodes = JSONUtil.toList(orderCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String trayName = jsonObject.getStr("trayName"); + + updateZeroTrayInfo(orderCodes, trayName, warehouseId); + }else if (dataType.equals(3)){ + //无数据库存品 + JSONArray stockListIdArray = jsonObject.getJSONArray("stockListIds"); + List stockListIds = JSONUtil.toList(stockListIdArray, Long.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String trayName = jsonObject.getStr("trayName"); + + updateStockListTrayInfo(stockListIds,warehouseId,trayName); + } + } + + log.info("##########trayTypeInfo: 配送消费打托广播 结束 msg={}",msg); + } + + private void updateStockListTrayInfo(List stockListIds, Long warehouseId, String trayName) { + + List stockListEntities = stockListService.listByIds(stockListIds); + + List updateStockListList = new ArrayList<>(); + stockListEntities.forEach(stockListEntity -> { + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListEntity.getId()); + String trays = stockListEntity.getTrayName(); + if(StringUtil.isBlank(trays)){ + updateStockListEntity.setTrayName(trayName); + updateStockListList.add(updateStockListEntity); + }else{ + if(!trays.contains(trayName)){ + trays = trays + "," + trayName; + updateStockListEntity.setTrayName(trays); + updateStockListList.add(updateStockListEntity); + } + } + }); + if(!updateStockListList.isEmpty()){ + stockListService.updateBatchById(updateStockListList); + } + } + + private void updateZeroTrayInfo(List orderCodes, String trayName, Long warehouseId) { + if(CollUtil.isNotEmpty(orderCodes)){ + QueryWrapper stockArticleEntityQueryWrapper = new QueryWrapper<>(); + stockArticleEntityQueryWrapper.in("order_code", orderCodes) + .eq("warehouse_id", warehouseId); + List stockArticleEntityList = stockArticleService.list(stockArticleEntityQueryWrapper); + + List updateStockArticleList = new ArrayList<>(); + stockArticleEntityList.forEach(stockArticleEntity -> { + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + String trays = stockArticleEntity.getTrays(); + if(StringUtil.isBlank(trays)){ + updateStockArticleEntity.setTrays(trayName); + updateStockArticleList.add(updateStockArticleEntity); + }else{ + if(!trays.contains(trayName)){ + trays = trays + "," + trayName; + updateStockArticleEntity.setTrays(trays); + updateStockArticleList.add(updateStockArticleEntity); + } + } + }); + if(!updateStockArticleList.isEmpty()){ + stockArticleService.updateBatchById(updateStockArticleList); + } + } + } + + private void updatePackageStockTrayInfo(List orderPackageCodes, String trayName, Long warehouseId) { + if(CollUtil.isNotEmpty(orderPackageCodes)){ + QueryWrapper parcelListEntityQueryWrapper = new QueryWrapper<>(); + parcelListEntityQueryWrapper.in("order_package_code", orderPackageCodes) + .eq("warehouse_id", warehouseId); + List parcelListEntityList = parcelListService.list(parcelListEntityQueryWrapper); + + if(!parcelListEntityList.isEmpty()){ + + List updateStockListList = new ArrayList<>(); + List updateParcelListList = new ArrayList<>(); + + //把parcelListEntityList的id存入一个list + List parcelListIdList = parcelListEntityList.stream() + .map(DistributionParcelListEntity::getId) + .collect(Collectors.toList()); + + QueryWrapper stockListInfoEntityQueryWrapper = new QueryWrapper<>(); + stockListInfoEntityQueryWrapper.in("parcel_list_id", parcelListIdList); + List stockListInfoEntities = stockListInfoService.list(stockListInfoEntityQueryWrapper); + //把stockListInfoEntities通过stockListId进行分组 + Map> groupedByStockListId = + stockListInfoEntities.stream() + .collect(Collectors.groupingBy(DistributionStockListInfoEntity::getStockListId)); + Set stockListIds = groupedByStockListId.keySet(); + + List stockListEntityList = stockListService.listByIds(stockListIds); + //把stockListEntityList转化成以id为key的Map + Map stockListEntityMap = stockListEntityList.stream() + .collect(Collectors.toMap(DistributionStockListEntity::getId, stockListEntity -> stockListEntity)); + + parcelListIdList.forEach(parcelListId -> { + DistributionParcelListEntity updateParcelListEntity = new DistributionParcelListEntity(); + updateParcelListEntity.setId(parcelListId); + updateParcelListEntity.setPallet(trayName); + updateParcelListList.add(updateParcelListEntity); + }); + + + stockListEntityMap.keySet().forEach(stockListId -> { + DistributionStockListEntity stockListEntity = stockListEntityMap.get(stockListId); + if(!Objects.isNull(stockListEntity)){ + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListId); + String trays = stockListEntity.getTrayName(); + if(StringUtil.isBlank(trays)){ + updateStockListEntity.setTrayName(trayName); + updateStockListList.add(updateStockListEntity); + }else{ + if(!trays.contains(trayName)){ + trays = trays + "," + trayName; + updateStockListEntity.setTrayName(trays); + updateStockListList.add(updateStockListEntity); + } + } + } + }); + if(!updateParcelListList.isEmpty()){ + parcelListService.updateBatchById(updateParcelListList); + } + if(!updateStockListList.isEmpty()){ + stockListService.updateBatchById(updateStockListList); + } + } + + } + + } + + private void updatePackageTrayInfo(List orderPackageCodes, String trayName, Long warehouseId) { + if(CollUtil.isNotEmpty(orderPackageCodes)){ + QueryWrapper parcelListEntityQueryWrapper = new QueryWrapper<>(); + parcelListEntityQueryWrapper.in("order_package_code", orderPackageCodes) + .eq("warehouse_id", warehouseId); + List parcelListEntityList = parcelListService.list(parcelListEntityQueryWrapper); + + if(!parcelListEntityList.isEmpty()){ + //把parcelListEntityList通过orderCode作为key进行分组 + Map> groupedByOrderCode = + parcelListEntityList.stream() + .collect(Collectors.groupingBy(DistributionParcelListEntity::getOrderCode)); + + Set orderCodeSet = groupedByOrderCode.keySet(); + QueryWrapper stockArticleEntityQueryWrapper = new QueryWrapper<>(); + stockArticleEntityQueryWrapper.in("order_code", orderCodeSet) + .eq("warehouse_id",warehouseId); + + List stockArticleEntities = stockArticleService.list(stockArticleEntityQueryWrapper); + //把stockArticleEntities转化成以orderCOde为key的Map + Map stockArticleEntityMap = stockArticleEntities.stream() + .collect(Collectors.toMap(DistributionStockArticleEntity::getOrderCode, stockArticleEntity -> stockArticleEntity)); + + List updateStockArticleList = new ArrayList<>(); + List updateParcelListList = new ArrayList<>(); + groupedByOrderCode.keySet().forEach(orderCode -> { + List parcelListEntityListByOrderCode = groupedByOrderCode.get(orderCode); + if(!parcelListEntityListByOrderCode.isEmpty()){ + parcelListEntityListByOrderCode.forEach(parcelListEntity -> { + DistributionParcelListEntity updateParcelListEntity = new DistributionParcelListEntity(); + updateParcelListEntity.setId(parcelListEntity.getId()); + updateParcelListEntity.setPallet(trayName); + updateParcelListList.add(updateParcelListEntity); + }); + } + + DistributionStockArticleEntity stockArticleEntity = stockArticleEntityMap.get(orderCode); + if (!Objects.isNull(stockArticleEntity)){ + String trays = stockArticleEntity.getTrays(); + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + if(StringUtil.isBlank(trays)){ + updateStockArticleEntity.setTrays(trayName); + updateStockArticleList.add(updateStockArticleEntity); + }else{ + if(!trays.contains(trayName)){ + trays = trays + "," + trayName; + updateStockArticleEntity.setTrays(trays); + updateStockArticleList.add(updateStockArticleEntity); + } + } + } + }); + if(!updateParcelListList.isEmpty()){ + parcelListService.updateBatchById(updateParcelListList); + } + if(!updateStockArticleList.isEmpty()){ + stockArticleService.updateBatchById(updateStockArticleList); + } + + } + } + } + + + private void unbindTrayInfo(String msg) { + log.info("##########unbindTrayInfo: 配送消费解托广播 开始 msg={}", msg); + if(StringUtil.isNotBlank(msg)){ + JSONObject jsonObject = JSONUtil.parseObj(msg); + Integer dataType = jsonObject.getInt("dataType"); + if(dataType.equals(1)){ + //订制品 + Integer conditions = jsonObject.getInt("conditions"); + JSONArray orderPackageCodeArray = jsonObject.getJSONArray("orderPackageCodes"); + List orderPackageCodes = JSONUtil.toList(orderPackageCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + + if(conditions.equals(1)){ + //订制品 + updatePackageUnbindTrayInfo(orderPackageCodes, warehouseId); + }else if(conditions.equals(2)){ + //有数据库存品 + updatePackageStockUnbindTrayInfo(orderPackageCodes, warehouseId); + } + }else if(dataType.equals(2)){ + //零担 + JSONArray orderCodeArray = jsonObject.getJSONArray("orderCodes"); + List orderCodes = JSONUtil.toList(orderCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String trayName = jsonObject.getStr("trayName"); + + updateZeroUnbindTrayInfo(orderCodes, trayName, warehouseId); + }else if (dataType.equals(3)){ + //无数据库存品 + JSONArray stockListIdArray = jsonObject.getJSONArray("stockListIds"); + List stockListIds = JSONUtil.toList(stockListIdArray, Long.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String trayName = jsonObject.getStr("trayName"); + + updateStockListUnbindTrayInfo(stockListIds,warehouseId,trayName); + } + } + + log.info("##########unbindTrayInfo: 配送消费解托广播 结束后msg={}", msg); + } + + private void updateStockListUnbindTrayInfo(List stockListIds, Long warehouseId, String trayName) { + List stockListEntityList = stockListService.listByIds(stockListIds); + + List clearTrayStockListIds = new ArrayList<>(); + List updateTrayList = new ArrayList<>(); + stockListEntityList.forEach(stockListEntity -> { + if(StringUtil.isNotBlank(stockListEntity.getTrayName())){ + String[] split = stockListEntity.getTrayName().split(","); + List trayList = new ArrayList<>(Arrays.asList(split)); + if(trayList.contains(trayName)){ + trayList.remove(trayName); + if(trayList.isEmpty()){ + clearTrayStockListIds.add(stockListEntity.getId()); + }else{ + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListEntity.getId()); + updateStockListEntity.setTrayName(String.join(",", trayList)); + updateTrayList.add(updateStockListEntity); + } + + } + } + }); + if(!clearTrayStockListIds.isEmpty()){ + stockListService.clearTraysByIds(clearTrayStockListIds); + } + if(!updateTrayList.isEmpty()){ + stockListService.updateBatchById(updateTrayList); + } + + } + + private void updateZeroUnbindTrayInfo(List orderCodes, String trayName, Long warehouseId) { + if(CollUtil.isNotEmpty(orderCodes)){ + QueryWrapper stockArticleEntityQueryWrapper = new QueryWrapper<>(); + stockArticleEntityQueryWrapper.in("order_code", orderCodes) + .eq("warehouse_id", warehouseId); + List stockArticleEntityList = stockArticleService.list(stockArticleEntityQueryWrapper); + + List clearTrayStockArticleIds = new ArrayList<>(); + List updateTrayList = new ArrayList<>(); + stockArticleEntityList.forEach(stockArticleEntity -> { + String trays = stockArticleEntity.getTrays(); + if(trays.contains(trayName)){ + String[] split = trays.split(","); + List trayList = new ArrayList<>(Arrays.asList(split)); + trayList.remove(trayName); + if(trayList.isEmpty()){ + clearTrayStockArticleIds.add(stockArticleEntity.getId()); + }else{ + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + updateStockArticleEntity.setTrays(String.join(",", trayList)); + updateTrayList.add(updateStockArticleEntity); + } + + } + }); + if(!clearTrayStockArticleIds.isEmpty()){ + stockArticleService.clearTraysByIds(clearTrayStockArticleIds); + } + if(!updateTrayList.isEmpty()){ + stockArticleService.updateBatchById(updateTrayList); + } + } + } + + private void updatePackageStockUnbindTrayInfo(List orderPackageCodes, Long warehouseId) { + if(CollUtil.isNotEmpty(orderPackageCodes)){ + QueryWrapper parcelListEntityQueryWrapper = new QueryWrapper<>(); + parcelListEntityQueryWrapper.in("order_package_code", orderPackageCodes) + .eq("warehouse_id", warehouseId); + List parcelListEntityList = parcelListService.list(parcelListEntityQueryWrapper); + + if(!parcelListEntityList.isEmpty()){ + //把parcelListEntityList中所有元素放入一个List + List parcelListIdList = parcelListEntityList.stream() + .map(DistributionParcelListEntity::getId) + .collect(Collectors.toList()); + + QueryWrapper stockListInfoEntityQueryWrapper = new QueryWrapper<>(); + stockListInfoEntityQueryWrapper.in("parcel_list_id", parcelListIdList); + List stockListInfoEntities = stockListInfoService.list(stockListInfoEntityQueryWrapper); + //把stockListInfoEntities通过stockListId进行分组 + Map> groupedByStockListId = + stockListInfoEntities.stream() + .collect(Collectors.groupingBy(DistributionStockListInfoEntity::getStockListId)); + + List clearTrayStockListIds = new ArrayList<>(); + List updateTraysStockListList = new ArrayList<>(); + groupedByStockListId.keySet().forEach(stockListId -> { + List stockListInfoEntityList = groupedByStockListId.get(stockListId); + //把stockListInfoEntityList中所有元素的parcelListId放入一个List + List parcelListIds = stockListInfoEntityList.stream() + .map(DistributionStockListInfoEntity::getParcelListId) + .collect(Collectors.toList()); + + String trayName = stockListInfoService.findAllTraysByNoParcelListIdsAndStockListId(parcelListIds, stockListId); + if(StringUtil.isBlank(trayName)){ + clearTrayStockListIds.add(stockListId); + }else{ + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListId); + updateStockListEntity.setTrayName(trayName); + updateTraysStockListList.add(updateStockListEntity); + } + }); + + if(!parcelListIdList.isEmpty()){ + parcelListService.clearPalletByIds(parcelListIdList); + } + if(!clearTrayStockListIds.isEmpty()){ + stockListService.clearTraysByIds(clearTrayStockListIds); + } + if(!updateTraysStockListList.isEmpty()){ + stockListService.updateBatchById(updateTraysStockListList); + } + } + } + } + + private void updatePackageUnbindTrayInfo(List orderPackageCodes, Long warehouseId) { + if(CollUtil.isNotEmpty(orderPackageCodes)){ + QueryWrapper parcelListEntityQueryWrapper = new QueryWrapper<>(); + parcelListEntityQueryWrapper.in("order_package_code", orderPackageCodes) + .eq("warehouse_id", warehouseId); + List parcelListEntityList = parcelListService.list(parcelListEntityQueryWrapper); + + if(!parcelListEntityList.isEmpty()){ + //把parcelListEntityList通过orderCode作为key进行分组 + Map> groupedByOrderCode = + parcelListEntityList.stream() + .collect(Collectors.groupingBy(DistributionParcelListEntity::getOrderCode)); + + Set orderCodeSet = groupedByOrderCode.keySet(); + QueryWrapper stockArticleEntityQueryWrapper = new QueryWrapper<>(); + stockArticleEntityQueryWrapper.in("order_code", orderCodeSet) + .eq("warehouse_id",warehouseId); + + List stockArticleEntities = stockArticleService.list(stockArticleEntityQueryWrapper); + //把stockArticleEntities转化成以orderCOde为key的Map + Map stockArticleEntityMap = stockArticleEntities.stream() + .collect(Collectors.toMap(DistributionStockArticleEntity::getOrderCode, stockArticleEntity -> stockArticleEntity)); + + List updateTraysStockArticleIdList = new ArrayList<>(); + List clearTraysStockArticleIdList = new ArrayList<>(); + List clearTrayList = new ArrayList<>(); + groupedByOrderCode.keySet().forEach(orderCode -> { + List parcelListEntityListByOrderCode = groupedByOrderCode.get(orderCode); + if(!parcelListEntityListByOrderCode.isEmpty()){ + //把parcelListEntityListByOrderCode中所有元素的id放入一个List集合 + List parcelListIdList = parcelListEntityListByOrderCode.stream() + .map(DistributionParcelListEntity::getId) + .collect(Collectors.toList()); + + clearTrayList.addAll(parcelListIdList); + + String trays = parcelListService.findAllTraysByNoParcelListIds(parcelListIdList,orderCode); + DistributionStockArticleEntity stockArticleEntity = stockArticleEntityMap.get(orderCode); + if(StringUtil.isBlank(trays)){ + clearTraysStockArticleIdList.add(stockArticleEntity.getId()); + }else{ + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + updateStockArticleEntity.setTrays(trays); + updateTraysStockArticleIdList.add(updateStockArticleEntity); + } + } + }); + if(!clearTrayList.isEmpty()){ + parcelListService.clearPalletByIds(clearTrayList); + } + if(!clearTraysStockArticleIdList.isEmpty()){ + stockArticleService.clearTraysByIds(clearTraysStockArticleIdList); + } + if(!updateTraysStockArticleIdList.isEmpty()){ + stockArticleService.updateBatchById(updateTraysStockArticleIdList); + } + } + } + } + + + /** + * 移托方法 + * @param msg + */ + private void moveTrayInfo(String msg) { + log.info("##########unbindTrayInfo: 配送消费移托广播 开始 msg={}", msg); + if(StringUtil.isNotBlank(msg)){ + JSONObject jsonObject = JSONUtil.parseObj(msg); + Integer dataType = jsonObject.getInt("dataType"); + if(dataType.equals(1)){ + //订制品 + Integer conditions = jsonObject.getInt("conditions"); + JSONArray orderPackageCodeArray = jsonObject.getJSONArray("orderPackageCodes"); + List orderPackageCodes = JSONUtil.toList(orderPackageCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String sourceTrayName = jsonObject.getStr("sourceTrayName"); + String targetTrayName = jsonObject.getStr("targetTrayName"); + + if(conditions.equals(1)){ + //订制品 + updatePackageMoveTrayInfo(orderPackageCodes, warehouseId, sourceTrayName, targetTrayName); + }else if(conditions.equals(2)){ + //有数据库存品 + updatePackageStockMoveTrayInfo(orderPackageCodes, warehouseId, sourceTrayName, targetTrayName); + } + }else if(dataType.equals(2)){ + //零担 + JSONArray orderCodeArray = jsonObject.getJSONArray("orderCodes"); + List orderCodes = JSONUtil.toList(orderCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String sourceTrayName = jsonObject.getStr("sourceTrayName"); + String targetTrayName = jsonObject.getStr("targetTrayName"); + + updateZeroMoveTrayInfo(orderCodes, warehouseId, sourceTrayName, targetTrayName); + }else if (dataType.equals(3)){ + //无数据库存品 + JSONArray stockListIdArray = jsonObject.getJSONArray("stockListIds"); + List stockListIds = JSONUtil.toList(stockListIdArray, Long.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String sourceTrayName = jsonObject.getStr("sourceTrayName"); + String targetTrayName = jsonObject.getStr("targetTrayName"); + + updateStockListMoveTrayInfo(stockListIds,warehouseId,sourceTrayName,targetTrayName); + } + } + + log.info("##########unbindTrayInfo: 配送消费移托广播 结束 msg={}", msg); + } + + private void updateStockListMoveTrayInfo(List stockListIds, Long warehouseId, String sourceTrayName, String targetTrayName) { + List stockListEntityList = stockListService.listByIds(stockListIds); + + List updateTrayList = new ArrayList<>(); + stockListEntityList.forEach(stockListEntity -> { + String trayName = stockListEntity.getTrayName(); + if(StringUtil.isBlank(trayName)){ + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListEntity.getId()); + updateStockListEntity.setTrayName(trayName); + updateTrayList.add(updateStockListEntity); + }else{ + String[] split = trayName.split(","); + List trayNameList = new ArrayList<>(Arrays.asList(split)); + trayNameList.remove(sourceTrayName); + trayNameList.add(targetTrayName); + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListEntity.getId()); + updateStockListEntity.setTrayName(String.join(",", trayNameList)); + updateTrayList.add(updateStockListEntity); + } + + }); + if(!updateTrayList.isEmpty()){ + stockListService.updateBatchById(updateTrayList); + } + } + + private void updateZeroMoveTrayInfo(List orderCodes, Long warehouseId, String sourceTrayName, String targetTrayName) { + if(CollUtil.isNotEmpty(orderCodes)){ + QueryWrapper stockArticleEntityQueryWrapper = new QueryWrapper<>(); + stockArticleEntityQueryWrapper.in("order_code", orderCodes) + .eq("warehouse_id", warehouseId); + List stockArticleEntityList = stockArticleService.list(stockArticleEntityQueryWrapper); + + List updateTrayList = new ArrayList<>(); + stockArticleEntityList.forEach(stockArticleEntity -> { + String trays = stockArticleEntity.getTrays(); + if(StringUtil.isBlank(trays)){ + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + updateStockArticleEntity.setTrays(targetTrayName); + updateTrayList.add(updateStockArticleEntity); + }else{ + String[] split = trays.split(","); + List trayNameList = new ArrayList<>(Arrays.asList(split)); + trayNameList.remove(sourceTrayName); + trayNameList.add(targetTrayName); + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + updateStockArticleEntity.setTrays(String.join(",", trayNameList)); + updateTrayList.add(updateStockArticleEntity); + } + }); + if(!updateTrayList.isEmpty()){ + stockArticleService.updateBatchById(updateTrayList); + } + } + } + + private void updatePackageStockMoveTrayInfo(List orderPackageCodes, Long warehouseId, String sourceTrayName, String targetTrayName) { + if(CollUtil.isNotEmpty(orderPackageCodes)){ + //先查询出对应的所有包件信息 + QueryWrapper parcelListEntityQueryWrapper = new QueryWrapper<>(); + parcelListEntityQueryWrapper.in("order_package_code", orderPackageCodes) + .eq("warehouse_id", warehouseId); + List parcelListEntityList = parcelListService.list(parcelListEntityQueryWrapper); + + if(!parcelListEntityList.isEmpty()){ + //把parcelListEntityList中所有元素放入一个List 便于查询所有包件对应的库存品有哪些 + List parcelListIdList = parcelListEntityList.stream() + .map(DistributionParcelListEntity::getId) + .collect(Collectors.toList()); + + QueryWrapper stockListInfoEntityQueryWrapper = new QueryWrapper<>(); + stockListInfoEntityQueryWrapper.in("parcel_list_id", parcelListIdList); + List stockListInfoEntities = stockListInfoService.list(stockListInfoEntityQueryWrapper); + //把stockListInfoEntities通过stockListId进行分组,就能知道所有库存品对应的包件有哪些 + Map> groupedByStockListId = + stockListInfoEntities.stream() + .collect(Collectors.groupingBy(DistributionStockListInfoEntity::getStockListId)); + + List updateTraysParcelListList = new ArrayList<>(); + List updateTraysStockListList = new ArrayList<>(); + groupedByStockListId.keySet().forEach(stockListId -> { + List stockListInfoEntityList = groupedByStockListId.get(stockListId); + //把stockListInfoEntityList中所有元素的parcelListId放入一个List + List parcelListIds = stockListInfoEntityList.stream() + .map(DistributionStockListInfoEntity::getParcelListId) + .collect(Collectors.toList()); + + String trayName = stockListInfoService.findAllTraysByNoParcelListIdsAndStockListId(parcelListIds, stockListId); + if(StringUtil.isBlank(trayName)){ + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListId); + updateStockListEntity.setTrayName(targetTrayName); + updateTraysStockListList.add(updateStockListEntity); + }else{ + if(!trayName.contains(targetTrayName)){ + trayName = trayName + "," + targetTrayName; + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListId); + updateStockListEntity.setTrayName(trayName); + updateTraysStockListList.add(updateStockListEntity); + } + } + }); + + parcelListIdList.forEach(parcelListId -> { + DistributionParcelListEntity updateParcelListEntity = new DistributionParcelListEntity(); + updateParcelListEntity.setId(parcelListId); + updateParcelListEntity.setPallet(targetTrayName); + updateTraysParcelListList.add(updateParcelListEntity); + }); + + + if(!updateTraysParcelListList.isEmpty()){ + parcelListService.updateBatchById(updateTraysParcelListList); + } + if(!updateTraysStockListList.isEmpty()){ + stockListService.updateBatchById(updateTraysStockListList); + } + } + } + } + + private void updatePackageMoveTrayInfo(List orderPackageCodes, Long warehouseId, String sourceTrayName, String targetTrayName) { + if(CollUtil.isNotEmpty(orderPackageCodes)){ + //先查询出对应的所有包件信息 + QueryWrapper parcelListEntityQueryWrapper = new QueryWrapper<>(); + parcelListEntityQueryWrapper.in("order_package_code", orderPackageCodes) + .eq("warehouse_id", warehouseId); + List parcelListEntityList = parcelListService.list(parcelListEntityQueryWrapper); + + if(!parcelListEntityList.isEmpty()){ + //分组获得有哪些订单对应哪些包件 + //把parcelListEntityList中所有元素的orderCode作为key进行分组 + Map> groupedByOrderCode = parcelListEntityList.stream() + .collect(Collectors.groupingBy(DistributionParcelListEntity::getOrderCode)); + + //把所有对应订单的信息查出来 + List stockArticleEntities = stockArticleService.list(new QueryWrapper().in("order_code", groupedByOrderCode.keySet())); + //把stockArticleEntities转化成orderCodeweikey的map + Map stockArticleEntityMap = stockArticleEntities.stream() + .collect(Collectors.toMap(DistributionStockArticleEntity::getOrderCode, stockArticleEntity -> stockArticleEntity)); + + List updateParcelListEntityList = new ArrayList<>(); + List updateStockArticleEntityList = new ArrayList<>(); + + //循环groupedByOrderCode,处理数据 + groupedByOrderCode.keySet().forEach(orderCode -> { + List parcelListEntityListByOrderCode = groupedByOrderCode.get(orderCode); + DistributionStockArticleEntity stockArticleEntity = stockArticleEntityMap.get(orderCode); + //把parcelListEntityListByOrderCode所有元素的id放入一个List,可以进行批量查询 + List parcelListIdList = parcelListEntityListByOrderCode.stream() + .map(DistributionParcelListEntity::getId) + .collect(Collectors.toList()); + + //处理包件更新信息 + parcelListEntityListByOrderCode.forEach(parcelListEntity -> { + DistributionParcelListEntity updateParcelListEntity = new DistributionParcelListEntity(); + updateParcelListEntity.setId(parcelListEntity.getId()); + updateParcelListEntity.setPallet(targetTrayName); + updateParcelListEntityList.add(updateParcelListEntity); + }); + + String trays = parcelListService.findAllTraysByNoParcelListIds(parcelListIdList, orderCode); + if(StringUtil.isBlank(trays)){ + trays = targetTrayName; + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + updateStockArticleEntity.setTrays(trays); + updateStockArticleEntityList.add(updateStockArticleEntity); + }else { + if(!trays.contains(targetTrayName)){ + trays = trays + "," + targetTrayName; + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + updateStockArticleEntity.setTrays(trays); + updateStockArticleEntityList.add(updateStockArticleEntity); + } + } + }); + if(!updateParcelListEntityList.isEmpty()){ + parcelListService.updateBatchById(updateParcelListEntityList); + } + if(!updateStockArticleEntityList.isEmpty()){ + stockArticleService.updateBatchById(updateStockArticleEntityList); + } + } + } + } + + + private void upshelfInfo(String msg) { + log.info("##########upshelfInfo: 配送消费上架广播 开始 msg={}",msg); + + if(StringUtil.isNotBlank(msg)){ + JSONObject jsonObject = JSONUtil.parseObj(msg); + Integer dataType = jsonObject.getInt("dataType"); + if(dataType.equals(1)){ + //订制品 + Integer conditions = jsonObject.getInt("conditions"); + JSONArray orderPackageCodeArray = jsonObject.getJSONArray("orderPackageCodes"); + List orderPackageCodes = JSONUtil.toList(orderPackageCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String allocationName = jsonObject.getStr("allocationName"); + + if(conditions.equals(1)){ + //订制品 + updatePackageAllocationInfo(orderPackageCodes, allocationName, warehouseId); + }else if(conditions.equals(2)){ + //有数据库存品 + updatePackageStockAllocationInfo(orderPackageCodes, allocationName, warehouseId); + } + }else if(dataType.equals(2)){ + //零担 + JSONArray orderCodeArray = jsonObject.getJSONArray("orderCodes"); + List orderCodes = JSONUtil.toList(orderCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String allocationName = jsonObject.getStr("allocationName"); + + updateZeroAllocationInfo(orderCodes, allocationName, warehouseId); + }else if (dataType.equals(3)){ + //无数据库存品 + JSONArray stockListIdArray = jsonObject.getJSONArray("stockListIds"); + List stockListIds = JSONUtil.toList(stockListIdArray, Long.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String allocationName = jsonObject.getStr("allocationName"); + + updateStockListAllocationInfo(stockListIds,warehouseId,allocationName); + } + } + + log.info("##########trayTypeInfo: 配送消费上架广播 结束 msg={}",msg); + } + + private void updateStockListAllocationInfo(List stockListIds, Long warehouseId, String allocationName) { + if(CollUtil.isNotEmpty(stockListIds)){ + List stockListEntities = stockListService.listByIds(stockListIds); + + List updateStockListList = new ArrayList<>(); + stockListEntities.forEach(stockListEntity -> { + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListEntity.getId()); + String storageLocation = stockListEntity.getStorageLocation(); + if(StringUtil.isBlank(storageLocation)){ + updateStockListEntity.setStorageLocation(allocationName); + updateStockListList.add(updateStockListEntity); + }else{ + if(!storageLocation.contains(allocationName)){ + String[] split = storageLocation.split(","); + List allocationList = new ArrayList<>(Arrays.asList(split)); + allocationList.add(allocationName); + updateStockListEntity.setTrayName(StringUtil.join(allocationList,",")); + updateStockListList.add(updateStockListEntity); + } + } + }); + if(!updateStockListList.isEmpty()){ + stockListService.updateBatchById(updateStockListList); + } + } + } + + private void updateZeroAllocationInfo(List orderCodes, String allocationName, Long warehouseId) { + if(CollUtil.isNotEmpty(orderCodes)){ + QueryWrapper stockArticleEntityQueryWrapper = new QueryWrapper<>(); + stockArticleEntityQueryWrapper.in("order_code", orderCodes) + .eq("warehouse_id", warehouseId); + List stockArticleEntityList = stockArticleService.list(stockArticleEntityQueryWrapper); + + List updateStockArticleList = new ArrayList<>(); + stockArticleEntityList.forEach(stockArticleEntity -> { + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + String allocation = stockArticleEntity.getAllocation(); + if(StringUtil.isBlank(allocation)){ + updateStockArticleEntity.setAllocation(allocationName); + updateStockArticleEntity.setGroundingStatus("30"); + updateStockArticleList.add(updateStockArticleEntity); + }else{ + if(!allocation.contains(allocationName)){ + String[] split = allocation.split(","); + List allocationList = new ArrayList<>(Arrays.asList(split)); + allocationList.add(allocationName); + updateStockArticleEntity.setAllocation(StringUtil.join(allocationList,",")); + updateStockArticleEntity.setGroundingStatus("30"); + updateStockArticleList.add(updateStockArticleEntity); + } + } + }); + if(!updateStockArticleList.isEmpty()){ + stockArticleService.updateBatchById(updateStockArticleList); + } + } + } + + private void updatePackageStockAllocationInfo(List orderPackageCodes, String allocationName, Long warehouseId) { + if(CollUtil.isNotEmpty(orderPackageCodes)){ + QueryWrapper parcelListEntityQueryWrapper = new QueryWrapper<>(); + parcelListEntityQueryWrapper.in("order_package_code", orderPackageCodes) + .eq("warehouse_id", warehouseId); + List parcelListEntityList = parcelListService.list(parcelListEntityQueryWrapper); + + if(!parcelListEntityList.isEmpty()){ + + List updateStockListList = new ArrayList<>(); + List updateParcelListList = new ArrayList<>(); + + //把parcelListEntityList的id存入一个list + List parcelListIdList = parcelListEntityList.stream() + .map(DistributionParcelListEntity::getId) + .collect(Collectors.toList()); + + QueryWrapper stockListInfoEntityQueryWrapper = new QueryWrapper<>(); + stockListInfoEntityQueryWrapper.in("parcel_list_id", parcelListIdList); + List stockListInfoEntities = stockListInfoService.list(stockListInfoEntityQueryWrapper); + //把stockListInfoEntities通过stockListId进行分组 + Map> groupedByStockListId = + stockListInfoEntities.stream() + .collect(Collectors.groupingBy(DistributionStockListInfoEntity::getStockListId)); + Set stockListIds = groupedByStockListId.keySet(); + + List stockListEntityList = stockListService.listByIds(stockListIds); + //把stockListEntityList转化成以id为key的Map + Map stockListEntityMap = stockListEntityList.stream() + .collect(Collectors.toMap(DistributionStockListEntity::getId, stockListEntity -> stockListEntity)); + + parcelListIdList.forEach(parcelListId -> { + DistributionParcelListEntity updateParcelListEntity = new DistributionParcelListEntity(); + updateParcelListEntity.setId(parcelListId); + updateParcelListEntity.setGoodsAllocation(allocationName); + updateParcelListEntity.setOrderPackageGroundingStatus("20"); + updateParcelListList.add(updateParcelListEntity); + }); + + + stockListEntityMap.keySet().forEach(stockListId -> { + DistributionStockListEntity stockListEntity = stockListEntityMap.get(stockListId); + if(!Objects.isNull(stockListEntity)){ + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListId); + String storageLocation = stockListEntity.getStorageLocation(); + if(StringUtil.isBlank(storageLocation)){ + updateStockListEntity.setStorageLocation(allocationName); + updateStockListList.add(updateStockListEntity); + }else{ + if(!storageLocation.contains(allocationName)){ + String[] split = storageLocation.split(","); + List allocationList = new ArrayList<>(Arrays.asList(split)); + allocationList.add(allocationName); + updateStockListEntity.setStorageLocation(StringUtil.join(allocationList, ",")); + updateStockListList.add(updateStockListEntity); + } + } + } + }); + if(!updateParcelListList.isEmpty()){ + parcelListService.updateBatchById(updateParcelListList); + } + if(!updateStockListList.isEmpty()){ + stockListService.updateBatchById(updateStockListList); + } + } + } + } + + private void updatePackageAllocationInfo(List orderPackageCodes, String allocationName, Long warehouseId) { + if(CollUtil.isNotEmpty(orderPackageCodes)){ + QueryWrapper parcelListEntityQueryWrapper = new QueryWrapper<>(); + parcelListEntityQueryWrapper.in("order_package_code", orderPackageCodes) + .eq("warehouse_id", warehouseId); + List parcelListEntityList = parcelListService.list(parcelListEntityQueryWrapper); + + if(!parcelListEntityList.isEmpty()){ + //把parcelListEntityList通过orderCode作为key进行分组 + Map> groupedByOrderCode = + parcelListEntityList.stream() + .collect(Collectors.groupingBy(DistributionParcelListEntity::getOrderCode)); + + Set orderCodeSet = groupedByOrderCode.keySet(); + QueryWrapper stockArticleEntityQueryWrapper = new QueryWrapper<>(); + stockArticleEntityQueryWrapper.in("order_code", orderCodeSet) + .eq("warehouse_id",warehouseId); + + List stockArticleEntities = stockArticleService.list(stockArticleEntityQueryWrapper); + //把stockArticleEntities转化成以orderCOde为key的Map + Map stockArticleEntityMap = stockArticleEntities.stream() + .collect(Collectors.toMap(DistributionStockArticleEntity::getOrderCode, stockArticleEntity -> stockArticleEntity)); + + List updateStockArticleList = new ArrayList<>(); + List updateParcelListList = new ArrayList<>(); + groupedByOrderCode.keySet().forEach(orderCode -> { + List parcelListEntityListByOrderCode = groupedByOrderCode.get(orderCode); + if(!parcelListEntityListByOrderCode.isEmpty()){ + parcelListEntityListByOrderCode.forEach(parcelListEntity -> { + DistributionParcelListEntity updateParcelListEntity = new DistributionParcelListEntity(); + updateParcelListEntity.setId(parcelListEntity.getId()); + updateParcelListEntity.setGoodsAllocation(allocationName); + updateParcelListEntity.setOrderPackageGroundingStatus("20"); + updateParcelListList.add(updateParcelListEntity); + }); + } + + DistributionStockArticleEntity stockArticleEntity = stockArticleEntityMap.get(orderCode); + if (!Objects.isNull(stockArticleEntity)){ + String allocation = stockArticleEntity.getAllocation(); + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + updateStockArticleEntity.setOrderCode(orderCode); + if(StringUtil.isBlank(allocation)){ + updateStockArticleEntity.setAllocation(allocationName); + updateStockArticleList.add(updateStockArticleEntity); + }else{ + if(!allocation.contains(allocationName)){ + String[] split = allocation.split(","); + List allocaationList = new ArrayList<>(Arrays.asList(split)); + allocaationList.add(allocationName); + updateStockArticleEntity.setAllocation(String.join(",",allocaationList)); + updateStockArticleList.add(updateStockArticleEntity); + } + } + } + }); + if(!updateParcelListList.isEmpty()){ + parcelListService.updateBatchById(updateParcelListList); + } + if(!updateStockArticleList.isEmpty()){ + stockArticleService.updateBatchById(updateStockArticleList); + updateStockArticleList.forEach(stockArticleEntity -> { + stockArticleService.updateOrderInfo(stockArticleEntity.getOrderCode(),warehouseId); + }); + } + } + } + } + + private void downshelfInfo(String msg) { + log.info("##########downshelfInfo: 配送消费下架广播 开始 msg={}",msg); + + if(StringUtil.isNotBlank(msg)){ + JSONObject jsonObject = JSONUtil.parseObj(msg); + Integer dataType = jsonObject.getInt("dataType"); + if(dataType.equals(1)){ + //订制品 + Integer conditions = jsonObject.getInt("conditions"); + JSONArray orderPackageCodeArray = jsonObject.getJSONArray("orderPackageCodes"); + List orderPackageCodes = JSONUtil.toList(orderPackageCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + + if(conditions.equals(1)){ + //订制品 + updatePackageDownInfo(orderPackageCodes, warehouseId); + }else if(conditions.equals(2)){ + //有数据库存品 + updatePackageStockDownInfo(orderPackageCodes, warehouseId); + } + }else if(dataType.equals(2)){ + //零担 + JSONArray orderCodeArray = jsonObject.getJSONArray("orderCodes"); + List orderCodes = JSONUtil.toList(orderCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String allocationName = jsonObject.getStr("allocationName"); + + updateZeroDownInfo(orderCodes, allocationName, warehouseId); + }else if (dataType.equals(3)){ + //无数据库存品 + JSONArray stockListIdArray = jsonObject.getJSONArray("stockListIds"); + List stockListIds = JSONUtil.toList(stockListIdArray, Long.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String allocationName = jsonObject.getStr("allocationName"); + + updateStockListDownInfo(stockListIds,warehouseId,allocationName); + } + } + + log.info("##########downshelfInfo: 配送消费下架广播 结束 msg={}",msg); + } + + private void updateStockListDownInfo(List stockListIds, Long warehouseId, String allocationName) { + List stockListEntityList = stockListService.listByIds(stockListIds); + + List clearAllocationStockListIds = new ArrayList<>(); + List updateAllocationList = new ArrayList<>(); + stockListEntityList.forEach(stockListEntity -> { + String storageLocation = stockListEntity.getStorageLocation(); + if(StringUtil.isNotBlank(storageLocation)){ + String[] split = storageLocation.split(","); + List allocationList = new ArrayList<>(Arrays.asList(split)); + allocationList.remove(allocationName); + if(allocationList.isEmpty()){ + clearAllocationStockListIds.add(stockListEntity.getId()); + }else{ + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListEntity.getId()); + updateStockListEntity.setStorageLocation(String.join(",", allocationList)); + updateAllocationList.add(updateStockListEntity); + } + + } + }); + if(!clearAllocationStockListIds.isEmpty()){ + stockListService.clearAllocationByIds(clearAllocationStockListIds); + } + if(!updateAllocationList.isEmpty()){ + stockListService.updateBatchById(updateAllocationList); + } + + } + + private void updateZeroDownInfo(List orderCodes, String allocationName, Long warehouseId) { + if(CollUtil.isNotEmpty(orderCodes)){ + QueryWrapper stockArticleEntityQueryWrapper = new QueryWrapper<>(); + stockArticleEntityQueryWrapper.in("order_code", orderCodes) + .eq("warehouse_id", warehouseId); + List stockArticleEntityList = stockArticleService.list(stockArticleEntityQueryWrapper); + + List updateAllocationList = new ArrayList<>(); + List clearAllocationStockArticleIds = new ArrayList<>(); + stockArticleEntityList.forEach(stockArticleEntity -> { + String allocation = stockArticleEntity.getAllocation(); + if(allocation.contains(allocationName)){ + String[] split = allocation.split(","); + List allocationList = new ArrayList<>(Arrays.asList(split)); + allocationList.remove(allocationName); + if(allocationList.isEmpty()){ + clearAllocationStockArticleIds.add(stockArticleEntity.getId()); + }else{ + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + updateStockArticleEntity.setAllocation(String.join(",", allocationList)); + updateAllocationList.add(updateStockArticleEntity); + } + + } + }); + if(!clearAllocationStockArticleIds.isEmpty()){ + stockArticleService.clearAllocationByIds(clearAllocationStockArticleIds); + } + if(!updateAllocationList.isEmpty()){ + stockArticleService.updateBatchById(updateAllocationList); + } + } + } + + private void updatePackageStockDownInfo(List orderPackageCodes, Long warehouseId) { + if(CollUtil.isNotEmpty(orderPackageCodes)){ + QueryWrapper parcelListEntityQueryWrapper = new QueryWrapper<>(); + parcelListEntityQueryWrapper.in("order_package_code", orderPackageCodes) + .eq("warehouse_id", warehouseId); + List parcelListEntityList = parcelListService.list(parcelListEntityQueryWrapper); + + if(!parcelListEntityList.isEmpty()){ + //把parcelListEntityList中所有元素放入一个List + List parcelListIdList = parcelListEntityList.stream() + .map(DistributionParcelListEntity::getId) + .collect(Collectors.toList()); + + QueryWrapper stockListInfoEntityQueryWrapper = new QueryWrapper<>(); + stockListInfoEntityQueryWrapper.in("parcel_list_id", parcelListIdList); + List stockListInfoEntities = stockListInfoService.list(stockListInfoEntityQueryWrapper); + //把stockListInfoEntities通过stockListId进行分组 + Map> groupedByStockListId = + stockListInfoEntities.stream() + .collect(Collectors.groupingBy(DistributionStockListInfoEntity::getStockListId)); + + List clearAllocationStockListIds = new ArrayList<>(); + List updateAllocationStockListList = new ArrayList<>(); + groupedByStockListId.keySet().forEach(stockListId -> { + List stockListInfoEntityList = groupedByStockListId.get(stockListId); + //把stockListInfoEntityList中所有元素的parcelListId放入一个List + List parcelListIds = stockListInfoEntityList.stream() + .map(DistributionStockListInfoEntity::getParcelListId) + .collect(Collectors.toList()); + + String allocations = stockListInfoService.findAllAllocationByNoParcelListIdsAndStockListId(parcelListIds, stockListId); + if(StringUtil.isBlank(allocations)){ + clearAllocationStockListIds.add(stockListId); + }else{ + DistributionStockListEntity updateStockListEntity = new DistributionStockListEntity(); + updateStockListEntity.setId(stockListId); + updateStockListEntity.setStorageLocation(allocations); + updateAllocationStockListList.add(updateStockListEntity); + } + }); + + if(!parcelListIdList.isEmpty()){ + parcelListService.clearAllocationByIds(parcelListIdList); + } + if(!clearAllocationStockListIds.isEmpty()){ + stockListService.clearAllocationByIds(clearAllocationStockListIds); + } + if(!updateAllocationStockListList.isEmpty()){ + stockListService.updateBatchById(updateAllocationStockListList); + } + } + } + } + + private void updatePackageDownInfo(List orderPackageCodes, Long warehouseId) { + if(CollUtil.isNotEmpty(orderPackageCodes)){ + QueryWrapper parcelListEntityQueryWrapper = new QueryWrapper<>(); + parcelListEntityQueryWrapper.in("order_package_code", orderPackageCodes) + .eq("warehouse_id", warehouseId); + List parcelListEntityList = parcelListService.list(parcelListEntityQueryWrapper); + + if(!parcelListEntityList.isEmpty()){ + //把parcelListEntityList通过orderCode作为key进行分组 + Map> groupedByOrderCode = + parcelListEntityList.stream() + .collect(Collectors.groupingBy(DistributionParcelListEntity::getOrderCode)); + + Set orderCodeSet = groupedByOrderCode.keySet(); + QueryWrapper stockArticleEntityQueryWrapper = new QueryWrapper<>(); + stockArticleEntityQueryWrapper.in("order_code", orderCodeSet) + .eq("warehouse_id",warehouseId); + + List stockArticleEntities = stockArticleService.list(stockArticleEntityQueryWrapper); + //把stockArticleEntities转化成以orderCOde为key的Map + Map stockArticleEntityMap = stockArticleEntities.stream() + .collect(Collectors.toMap(DistributionStockArticleEntity::getOrderCode, stockArticleEntity -> stockArticleEntity)); + + List updateAllocationStockArticleList = new ArrayList<>(); + List clearAllocationStockArticleIdList = new ArrayList<>(); + List clearAllocationPraceListIdList = new ArrayList<>(); + Set updateOrderInfoSet = new HashSet<>(); + groupedByOrderCode.keySet().forEach(orderCode -> { + List parcelListEntityListByOrderCode = groupedByOrderCode.get(orderCode); + if(!parcelListEntityListByOrderCode.isEmpty()){ + //把parcelListEntityListByOrderCode中所有元素的id放入一个List集合 + List parcelListIdList = parcelListEntityListByOrderCode.stream() + .map(DistributionParcelListEntity::getId) + .collect(Collectors.toList()); + + clearAllocationPraceListIdList.addAll(parcelListIdList); + + String allocations = parcelListService.findAllAllocationByNoParcelListIds(parcelListIdList,orderCode); + DistributionStockArticleEntity stockArticleEntity = stockArticleEntityMap.get(orderCode); + if(StringUtil.isBlank(allocations)){ + clearAllocationStockArticleIdList.add(stockArticleEntity.getId()); + }else{ + DistributionStockArticleEntity updateStockArticleEntity = new DistributionStockArticleEntity(); + updateStockArticleEntity.setId(stockArticleEntity.getId()); + updateStockArticleEntity.setAllocation(allocations); + updateAllocationStockArticleList.add(updateStockArticleEntity); + } + updateOrderInfoSet.add(orderCode); + } + }); + if(!clearAllocationPraceListIdList.isEmpty()){ + parcelListService.clearAllocationByIds(clearAllocationPraceListIdList); + } + if(!clearAllocationStockArticleIdList.isEmpty()){ + stockArticleService.clearAllocationByIds(clearAllocationStockArticleIdList); + } + if(!updateAllocationStockArticleList.isEmpty()){ + stockArticleService.updateBatchById(updateAllocationStockArticleList); + } + + if(!updateOrderInfoSet.isEmpty()){ + updateOrderInfoSet.forEach(orderCode -> { + stockArticleService.updateOrderInfo(orderCode,warehouseId); + }); + } + } + } + } + + + /** + * 移库操作(逻辑有问题不正确) + * @param msg + */ + private void moveAllocaitonInfo(String msg) { + log.info("##########downshelfInfo: 配送消费移库广播 开始 msg={}",msg); + + if(StringUtil.isNotBlank(msg)){ + JSONObject jsonObject = JSONUtil.parseObj(msg); + Integer dataType = jsonObject.getInt("dataType"); + if(dataType.equals(1)){ + //订制品 + Integer conditions = jsonObject.getInt("conditions"); + JSONArray orderPackageCodeArray = jsonObject.getJSONArray("orderPackageCodes"); + List orderPackageCodes = JSONUtil.toList(orderPackageCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + + if(conditions.equals(1)){ + //订制品 + updatePackageDownInfo(orderPackageCodes, warehouseId); + }else if(conditions.equals(2)){ + //有数据库存品 + updatePackageStockDownInfo(orderPackageCodes, warehouseId); + } + }else if(dataType.equals(2)){ + //零担 + JSONArray orderCodeArray = jsonObject.getJSONArray("orderCodes"); + List orderCodes = JSONUtil.toList(orderCodeArray, String.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String allocationName = jsonObject.getStr("allocationName"); + + updateZeroDownInfo(orderCodes, allocationName, warehouseId); + }else if (dataType.equals(3)){ + //无数据库存品 + JSONArray stockListIdArray = jsonObject.getJSONArray("stockListIds"); + List stockListIds = JSONUtil.toList(stockListIdArray, Long.class); + Long warehouseId = jsonObject.getLong("warehouseId"); + String allocationName = jsonObject.getStr("allocationName"); + + updateStockListDownInfo(stockListIds,warehouseId,allocationName); + } + } + + log.info("##########downshelfInfo: 配送消费移库广播 结束 msg={}",msg); + } + +} diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionAsyncService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionAsyncService.java index f556826a8..c4bbec5f2 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionAsyncService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionAsyncService.java @@ -1,14 +1,17 @@ package com.logpm.distribution.service; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.business.entity.BusinessPreOrderEntity; import com.logpm.distribution.dto.DistributionStockArticleDTO; import com.logpm.distribution.dto.app.DistrilbutionloadingscanDTO; import com.logpm.distribution.dto.app.StockupDTO; import com.logpm.distribution.dto.app.StockupZeroDTO; import com.logpm.distribution.entity.DisStockListDetailEntity; +import com.logpm.distribution.entity.DistributionDeliveryListEntity; import com.logpm.distribution.entity.DistributionParcelListEntity; import com.logpm.distribution.entity.DistributionParcelNumberEntity; -import com.logpm.warehouse.entity.WarehouseWarehouseEntity; +import com.logpm.distribution.entity.DistributionReservationEntity; +import com.logpm.distribution.entity.DistributionStockArticleEntity; import org.springblade.core.secure.BladeUser; import java.util.List; @@ -37,7 +40,7 @@ public interface IDistributionAsyncService { * @param id * @return */ - Boolean getOrderSelfPickup(Long id); + Boolean updateOrderSelfPickup(Long id); /** * 修改扫码状态 * @param id @@ -56,7 +59,7 @@ public interface IDistributionAsyncService { * @param id * @return */ - Boolean getBillStock(Long id); + Boolean updateBillStock(Long id); /** * 修改订单备货状态 @@ -307,7 +310,7 @@ public interface IDistributionAsyncService { * 释放当前客户能够进行资源释放的包件包含库存品 * @param reservationId */ - void releaseSource(Long reservationId,Long warehouseId); + void releaseSource(Long reservationId,BasicdataWarehouseEntity warehouse,BladeUser user,String trainNumber); /** * 进行干线日志保存 @@ -320,4 +323,33 @@ public interface IDistributionAsyncService { * @param l */ void releaseBillLadingResource(Long l,Long warehouseId); + + + DistributionStockArticleEntity findDistributionStockArticleEntityByIdForAsync(String tenantId, Long id); + + + + /** + * 推送预约下包件转配送日志 + * @param + */ + void recordsReservationDeliveryLog(List reservationEntityList, BasicdataWarehouseEntity warehouse, BladeUser user, DistributionDeliveryListEntity deliveryListEntity, Integer node, String content); + + /** + * 自提推送工厂 + * @param s + */ + void sendFactorySignforInfo(String s,BasicdataWarehouseEntity warehouse,BladeUser user); + + /** + * 异步维护取消自提的单子信息 + * @param ids + */ + void maintenanceCancelBillLading(List ids); + + /** + * 查询预约信息推送至安装平台 + * @param id + */ + void sendInstallToPlatform(DistributionReservationEntity reservationEntity); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryDetailsService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryDetailsService.java index 44268aa47..5e7920cfd 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryDetailsService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryDetailsService.java @@ -85,4 +85,6 @@ public interface IDistributionDeliveryDetailsService extends BaseService getBillOrderInventoryExcel(Map distributionDeliveryDetails); + + List getBillLadingDetailOrderInventoryExcel(Long id); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryInfoService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryInfoService.java index ebddd1e65..1f25fa517 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryInfoService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryInfoService.java @@ -58,7 +58,7 @@ public interface IDistributionDeliveryInfoService extends BaseService selectDistributionDeliveryInfowrapPage(Map reservationPackageDTO,IPage page); diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryListService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryListService.java index 6a7882935..6a87f21ac 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryListService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionDeliveryListService.java @@ -21,7 +21,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.aftersales.vo.AftersalesAbnormalPackageVO; import com.logpm.distribution.bean.Resp; import com.logpm.distribution.dto.DistributionDeliveryExcelDTO; -import com.logpm.distribution.dto.DistributionDeliveryInfoDTO; import com.logpm.distribution.dto.DistributionDeliveryListDTO; import com.logpm.distribution.dto.app.DistributionAppDeliveryListDTO; import com.logpm.distribution.dto.app.DistrilbutionloadingscanDTO; @@ -32,6 +31,8 @@ import com.logpm.distribution.excel.DistributionDeliveryListExcel; import com.logpm.distribution.vo.*; import com.logpm.distribution.vo.app.*; import com.logpm.distribution.vo.print.PrintPreviewVO; +import com.logpm.warehouse.entity.WarehouseRetentionRecordEntity; +import com.logpm.warehouse.entity.WarehouseRetentionScanEntity; import org.springblade.core.mp.base.BaseService; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.api.R; @@ -138,7 +139,7 @@ public interface IDistributionDeliveryListService extends BaseService selectDistributionDeliveryinventory(IPage page, Map distributionInventoryDTO); @@ -257,11 +258,10 @@ public interface IDistributionDeliveryListService extends BaseService getAppDeliveryreservationTraysPage(IPage page, DistributionAppDeliveryListDTO distributionDeliveryList); + List getAppDeliveryreservationTraysPage(DistributionAppDeliveryListDTO distributionDeliveryList); /** * 异常装车 @@ -301,6 +301,13 @@ public interface IDistributionDeliveryListService extends BaseService + * 配送作业节点 推送给服务 + *

+ */ +public interface IDistributionNodeWorkService { + + // 签收作业节点 + + /** + * 装车 + */ + void nodeLoad(); + + /** + * 异常装车 + */ + void abnormalLoading(); + + /** + * 取消装车 + */ + void cancelLoading(); + + /** + * 发车 + */ + void carStart(); + + /** + * 配送到达 + */ + void carArrived(); + + + /** + * 签收 + */ + void signFor(DistributionParcelListEntity parcelListEntity, Long taskId, String operationTime, String destinationWarehouse); + + + /** + * 签收复核 + */ + void signForCheck(); + + /** + * 自提签收扫描 + */ + void billofladingSignfor(DistributionParcelListEntity parcelListEntity,Long taskId,String operationTime, String destinationWarehouse); + + /** + * 自提签收复核 + */ + void billofladingSignforCheck(); + + /** + * 滞留 + */ + void retention(); + + /** + * 异常签收 + */ + void abnormalSignfor(); + + /** + * 配送失败 + */ + void fail(); + +} diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelListService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelListService.java index ff71e7816..ea2c3d3c5 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelListService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelListService.java @@ -194,7 +194,7 @@ public interface IDistributionParcelListService extends BaseService findEntityListByOrderCodeAndStatus(String orderCode, Long warehouseId, String packageStatus); + List findEntityListByOrderCodeAndStatus(String orderCode, Long warehouseId, String packageStatus,String waybillNo); /** @@ -219,4 +219,39 @@ public interface IDistributionParcelListService extends BaseService类型的集合,包含匹配的包裹列表实体。 */ List findListByIds(Set parcelListIds, Long warehouseId); + + void updatePackageStatus(List orderPackageCodes, Long warehouseId, String packageStatus); + + List findListByOrderPackageCode(List orderPackageCodes, Long warehouseId); + + void updateFreezeStatusByWaybillIds(List waybillIds); + + void updateUnFreezeStatusByWaybillIds(List waybillIds); + + void clearParceListWaybillByAdvanceIds(List advanceIds); + + List findPackagesByAdvanceIdsAndNoStock(List advanceIds, Long warehouseId); + + List findAllOrderCodesByAdvanceIds(List advanceIds, Long warehouseId); + + void removePakcageByAdvanceIds(List advanceIds, Long warehouseId); + + /** + * 根据包件码查询包件 + * @param keySet + * @return + */ + Map> findPackageCodeByCodes(Set keySet); + + List findALLNoUpShelfPackageByOrderCodeList(List orderCodeList, Long warehouseId); + + List findOrderCodesByOrderPackageCodes(List orderPackageCodes, Long warehouseId); + + String findAllTraysByNoParcelListIds(List parcelListIdList,String orderCode); + + void clearPalletByIds(List clearTrayList); + + String findAllAllocationByNoParcelListIds(List parcelListIdList, String orderCode); + + void clearAllocationByIds(List clearTrayList); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionReservationPackageService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionReservationPackageService.java index 2f1f9746f..3ad65f950 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionReservationPackageService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionReservationPackageService.java @@ -99,7 +99,7 @@ public interface IDistributionReservationPackageService extends BaseService deliveryBusinessTask(DistributionDeliveryAllocationDTO allocationDTO); - /** + void createBusinessPreConversionQueue(Long id); + + /** *取消预约 * @param reservationDTO * @return @@ -251,7 +253,6 @@ public interface IDistributionReservationService extends BaseService selectListByDeliveryId(Long id); + } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionSignforService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionSignforService.java index 9b84521e2..60962172b 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionSignforService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionSignforService.java @@ -20,15 +20,13 @@ import com.logpm.distribution.bean.Resp; import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.distribution.dto.DistributionAddvalueDTO; import com.logpm.distribution.dto.DistributionSignforDTO; +import com.logpm.distribution.dto.DistributionSignforExcelDTO; import com.logpm.distribution.dto.DistrilbutionAppsignforDTO; import com.logpm.distribution.dto.app.DistributionAppDeliveryListDTO; import com.logpm.distribution.entity.DistributionReservationEntity; import com.logpm.distribution.entity.DistributionSignPrintEntity; import com.logpm.distribution.entity.DistributionSignforEntity; -import com.logpm.distribution.excel.DistributionSignforExcel; -import com.logpm.distribution.excel.DistributionSignforOrderExcel; -import com.logpm.distribution.excel.DistributionSignforOwnExcel; -import com.logpm.distribution.excel.DistributionSignforPackageExcel; +import com.logpm.distribution.excel.*; import com.logpm.distribution.vo.*; import com.logpm.distribution.vo.app.DistributionAppDeliveryListVO; import com.logpm.distribution.vo.app.DistributionAppParcelListVO; @@ -70,7 +68,7 @@ public interface IDistributionSignforService extends BaseService exportDistributionSignforOwn(Map distributionSignfor); + List exportDistributionSignforOwn(DistributionSignforVO distributionSignfor); /** * 签收订单统计 * @@ -164,7 +162,7 @@ public interface IDistributionSignforService extends BaseService signforInventoryList(Long signforId); + List signforInventoryList(Long signforId); /** * 查询签收对应的增值服务类型 @@ -245,7 +243,7 @@ public interface IDistributionSignforService extends BaseService> getByReservationIds(List longList); + + /** + * 推送老系统 + * @param signingId + */ + void push0ldSystemSignInfo(Long signingId); + + SignforPageCountVO selectDistributionSignforPageCount( DistributionSignforVO distributionSignfor); + + Boolean clerkCheckPushData(Long id); + + /** + * 导出签收详情列表 + * @param id + * @return + */ + DistributionSignforExcelDTO distributionSignforDetailExcel(Long id); + + /** + * 导出签收库存品详情列表 + * @param id + * @return + */ + List exportDistributionSignforInventoryList(Long id); + + /** + * 异常驳回 + * @param ids + * @return + */ + R loadingAbnormalPackageListTurnDown(String ids,boolean yesOrNo); + } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockArticleService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockArticleService.java index 416cf23ab..78726f34c 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockArticleService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockArticleService.java @@ -195,7 +195,9 @@ public interface IDistributionStockArticleService extends BaseService findZeroListByWarehouseId(Long warehouseId,Integer pageNum,Integer pageSize); + void updateOrdersInfo(List orderCodes, Long warehouseId); + + IPage findZeroListByWarehouseId(Long warehouseId, Integer pageNum, Integer pageSize); /** @@ -205,6 +207,14 @@ public interface IDistributionStockArticleService extends BaseService ids); + /** * 查询备货库位上架的零担信息 * @param orderCode @@ -264,4 +274,34 @@ public interface IDistributionStockArticleService extends BaseService exportSignforDistributionStockArticleList(Map distributionStockArticle, IPage page); + + /** + * 维护指定订单的商场信息 + * @param orderIds + * @return + */ + Boolean maintenanceOrderMall(String orderIds); + + /** + * 全仓更新未预约的订单的客户信息 + * @param orderCode 订单号 + */ + void updateCustomerAllByOrderCode(String orderCode); + + Integer findOrderTotalNumByOrderCodes(List orderCodes,Long warehouseId); + + Integer findOrderTotalNumByOrderPackageCodes(List orderPackageCodes, Long warehouseId); + + /** + * 查询签收订单详情 + * @param id + * @return + */ + List signforListDetail(Long id); + + void clearTraysByIds(List clearTraysStockArticleIdList); + + void clearAllocationByIds(List clearAllocationStockArticleIdList); + + OrderCodeDataVO showOrderCodeByCode(Map params) throws Exception; } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockListInfoService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockListInfoService.java index ccfe25231..a175dd4cf 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockListInfoService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockListInfoService.java @@ -60,4 +60,8 @@ public interface IDistributionStockListInfoService extends BaseService getAllOrderPackageCodes(String incomingBatch, String sku, Long mallId, Long warehouseId); + String findAllTraysByNoParcelListIdsAndStockListId(List parcelListIds, Long stockListId); + + String findAllAllocationByNoParcelListIdsAndStockListId(List parcelListIds, Long stockListId); + } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockListService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockListService.java index b9650dab5..5951d9fab 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockListService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionStockListService.java @@ -214,6 +214,11 @@ public interface IDistributionStockListService extends BaseService clearTrayStockListIds); + + void clearAllocationByIds(List clearAllocationStockListIds); + + // /** // * 查询库存品详情 diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistrilbutionBillLadingService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistrilbutionBillLadingService.java index f4a6836ec..796990e5d 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistrilbutionBillLadingService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistrilbutionBillLadingService.java @@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.distribution.bean.Resp; import com.logpm.distribution.dto.DistrilbutionBillLadingDTO; import com.logpm.distribution.dto.app.BillLadingAppDTO; +import com.logpm.distribution.dto.DistributionBillLadingExcelDTO; import com.logpm.distribution.entity.DistrilbutionBillLadingEntity; import com.logpm.distribution.excel.DistrilbutionBillLadingExcel; import com.logpm.distribution.vo.*; @@ -28,7 +29,6 @@ import com.logpm.distribution.vo.app.DistrilbutionAppBillLadingOrderMainVO; import org.springblade.core.mp.base.BaseService; import org.springblade.core.tool.api.R; -import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -256,4 +256,27 @@ public interface IDistrilbutionBillLadingService extends BaseService distrilbutionBillStock(Map distrilbutionBillStock); + /** + * 查询自提单订单导出详情数据 + * @param id + * @return + */ + List distrilbutionBillDeatilStock(@Param("id") Long id); + List billOrderPackExcel(Map distrilbutionBillStock); + + List billLadingDetailOrderPackExcel(Long id); + /** * 维护自提单订单状态 * @param l */ void maintenanceOrderInfo(Long l); + + /** + * 判断是否能够进行订单移除 + * @param billLadingId + * @param orderId + * @return + */ + boolean judgmentRemove(Long billLadingId, Long orderId); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DisStockOrdercodeRecoServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DisStockOrdercodeRecoServiceImpl.java index 6ef4c2924..ffc5109f0 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DisStockOrdercodeRecoServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DisStockOrdercodeRecoServiceImpl.java @@ -90,14 +90,14 @@ public class DisStockOrdercodeRecoServiceImpl extends BaseServiceImpl locationStockListInformation = warehouseUpdownGoodsClient.getLocationStockListInformation(warehouseUpdownGoodsEntity); if (Func.isNotEmpty(locationStockListInformation)){ List IncomingBatchs = locationStockListInformation.stream().map(WarehouseUpdownGoodsEntity::getIncomingBatch).collect(Collectors.toList()); List distributionStockListEntity = distributionStockListMapper.selectList(Wrappers.query().lambda() .eq(DistributionStockListEntity::getCargoNumber, cargoNumber) - .eq(DistributionStockListEntity::getMarketName,mallName) + .eq(DistributionStockListEntity::getMarketName,mallName) .in(DistributionStockListEntity::getIncomingBatch, IncomingBatchs) - .orderByAsc(DistributionStockListEntity::getCreateTime) ); if (Func.isNotEmpty(distributionStockListEntity)){ diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionAddvalueServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionAddvalueServiceImpl.java index 15a8bb978..06da8f08e 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionAddvalueServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionAddvalueServiceImpl.java @@ -16,12 +16,18 @@ */ package com.logpm.distribution.service.impl; -import cn.hutool.db.Page; -import com.alibaba.druid.sql.visitor.functions.If; +import com.alibaba.fastjson.serializer.BigDecimalCodec; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.basicdata.entity.BasicdataClientEntity; +import com.logpm.basicdata.entity.BasicdataFactoryCategoryEntity; +import com.logpm.basicdata.entity.BasicdataPriceEntity; +import com.logpm.basicdata.feign.IBasicdataClientClient; +import com.logpm.basicdata.feign.IBasicdataFactoryCategoryClient; +import com.logpm.basicdata.feign.IBasicdataPriceClient; +import com.logpm.basicdata.vo.BasicdatPriceApiVO; +import com.logpm.basicdata.vo.PriceDispatchAddClientVO; import com.logpm.distribution.bean.Res; import com.logpm.distribution.bean.Resp; -import com.logpm.distribution.dto.DistributionAddvalueDTO; import com.logpm.distribution.dto.DistributionAddvaluePackageDTO; import com.logpm.distribution.dto.DistributionParcelNumberDTO; import com.logpm.distribution.dto.app.DistributionAppAddvalueDTO; @@ -34,25 +40,26 @@ import com.logpm.distribution.vo.DistributionAddvalueVO; import com.logpm.distribution.vo.app.DistributionAppAddvalueVO; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.util.Strings; import org.springblade.common.constant.loading.LoadingStatusConstant; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; -import org.springblade.core.tool.utils.RandomType; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.concurrent.locks.Condition; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.Stream; /** * 配送增值服务表 服务实现类 @@ -75,6 +82,9 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl packageEntityList = distributionAppAddvalueDTO.getPackageEntityList(); List packageDTOList = packageEntityList.stream().filter(p -> Func.isNotEmpty(p.getQuantity()) && p.getQuantity() > 0).collect(Collectors.toList()); - if (Func.isEmpty(packageDTOList)){ - return Resp.scanFail("操作失败","无可用包件信息"); + if (Func.isEmpty(packageDTOList)) { + return Resp.scanFail("操作失败", "无可用包件信息"); } //查询是否重复添加 DistributionAddvalueEntity addvalueEntity = distributionAddvalueMapper.selectOne(Wrappers.query().lambda() @@ -206,17 +219,17 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl parcelListEntities = distributionReservationMapper.selectPackageListByReservationId(distributionAppAddvalueDTO.getReservationId()); - if (parcelListEntities.size() == packageEntityList.size()){ + if (parcelListEntities.size() == packageEntityList.size()) { distributionAddvalueDetailEntity.setRecordType(1); } distributionAddvalueDetailService.save(distributionAddvalueDetailEntity); List addvaluePackageEntities = new ArrayList<>(); - packageEntityList.stream().forEach(p->{p.setAddvalueDetailId(distributionAddvalueDetailEntity.getId());p.setQuantity(p.getZeroQuantity());addvaluePackageEntities.add(Func.copy(p,DistributionAddvaluePackageEntity.class));}); - distributionAddvaluePackageService.saveBatch(addvaluePackageEntities); - return Resp.scanSuccess("添加成功","添加成功"); - } + BigDecimal totalFee = new BigDecimal(BigInteger.ZERO); + packageEntityList.stream().forEach(p -> { + p.setAddvalueDetailId(distributionAddvalueDetailEntity.getId()); + p.setQuantity(p.getZeroQuantity()); + p.setScanUserName(AuthUtil.getNickName()); + DistributionAddvaluePackageEntity addvaluePackageEntity = Func.copy(p, DistributionAddvaluePackageEntity.class); + //构建增值服务包件的收入 + BigDecimal unitPrice = new BigDecimal(BigInteger.ZERO); + //查询此包件匹配的计划模板 + //获取结算单价 + List priceDispatchAddClientVOS = basicdataPriceClient.dispatchAddPrice(BasicdatPriceApiVO.builder().clientId(p.getClientId().toString()).brandId(p.getBrandId().toString()).build()); + if (Func.isEmpty(priceDispatchAddClientVOS)) { + //此客户品牌下无单价信息 + unitPrice = new BigDecimal(BigInteger.ZERO); + } + switch (p.getConditions()) { + case 1: + //查询订制品结算品类 + BasicdataFactoryCategoryEntity entity1 = new BasicdataFactoryCategoryEntity(); + entity1.setFirsts(p.getFirsts()); + entity1.setSeconds(p.getSecond()); + entity1.setThirds(p.getThirdProduct()); + entity1.setMaterielName(p.getMaterialName()); + entity1.setBrandId(p.getBrandId()); + BasicdataFactoryCategoryEntity factoryCategoryEntity1 = basicdataFactoryCategoryClient.findEntityByThreeCategory(entity1); + if (Func.isEmpty(factoryCategoryEntity1)){ + unitPrice = new BigDecimal(BigInteger.ZERO); + } + if (!Func.isEmpty(priceDispatchAddClientVOS)&&Func.isNotEmpty(factoryCategoryEntity1)){ + //获取单价 + unitPrice = getUnitPrice(priceDispatchAddClientVOS,factoryCategoryEntity1,distributionAppAddvalueDTO); + } + //判定该包件是否属于该客户 + List parcelListEntityList = distributionReservationMapper.selectPackageListByReservationId(distributionAppAddvalueDTO.getReservationId()); +// boolean packageFlag = parcelListEntities.stream().allMatch(pack -> !Func.equals(pack.getId(), p.getPackageId())); + boolean packageFlag = parcelListEntityList.stream().map(DistributionParcelListEntity::getId).collect(Collectors.toList()).contains(p.getPackageId()); + if (!packageFlag) { + throw new RuntimeException("不属于该客户包件"); + } + break; + case 2: + BasicdataFactoryCategoryEntity entity2 = new BasicdataFactoryCategoryEntity(); + entity2.setMaterielName(p.getMaterialName()); + BasicdataFactoryCategoryEntity factoryCategoryEntity2 = basicdataFactoryCategoryClient.findEntityByMaterielName(entity2); + if (Func.isEmpty(factoryCategoryEntity2)){ + unitPrice = new BigDecimal(BigInteger.ZERO); + } + if (!Func.isEmpty(priceDispatchAddClientVOS)&&Func.isNotEmpty(factoryCategoryEntity2)){ + //获取单价 + unitPrice = getUnitPrice(priceDispatchAddClientVOS,factoryCategoryEntity2,distributionAppAddvalueDTO); + } + List detailEntities = distributionReservationMapper.selectInventoryListByReservation(distributionAppAddvalueDTO.getReservationId()); +// boolean inventoryPackageFlag = detailEntities.stream().allMatch(pack -> !Func.equals(pack.getId(), p.getPackageId())); + boolean inventoryPackageFlag = detailEntities.stream().map(DisStockListDetailEntity::getId).collect(Collectors.toList()).contains(p.getPackageId()); + if (!inventoryPackageFlag) { + throw new RuntimeException("不属于该客户包件"); + } + break; + case 3: + BasicdataFactoryCategoryEntity entity3 = new BasicdataFactoryCategoryEntity(); + entity3.setMaterielName(p.getMaterialName()); + BasicdataFactoryCategoryEntity factoryCategoryEntity3 = basicdataFactoryCategoryClient.findEntityByCategoryName(entity3); + if (Func.isEmpty(factoryCategoryEntity3)){ + unitPrice = new BigDecimal(BigInteger.ZERO); + } + if (!Func.isEmpty(priceDispatchAddClientVOS)&&Func.isNotEmpty(factoryCategoryEntity3)){ + //获取单价 + unitPrice = getUnitPrice(priceDispatchAddClientVOS,factoryCategoryEntity3,distributionAppAddvalueDTO); + } + List distributionParcelNumberDTOS = distributionReservationMapper.selectZeroPackageListByReservationId(distributionAppAddvalueDTO.getReservationId()); +// boolean zeroPackageFlag = distributionParcelNumberDTOS.stream().allMatch(pack -> !Func.equals(pack.getId(), p.getPackageId())); + boolean zeroPackageFlag = distributionParcelNumberDTOS.stream().map(DistributionParcelNumberDTO::getId).collect(Collectors.toList()).contains(p.getPackageId()); + if (!zeroPackageFlag) { + throw new RuntimeException("不属于该客户包件"); + } + break; + } + addvaluePackageEntity.setScanUserName(AuthUtil.getNickName()); + addvaluePackageEntity.setUnitPrice(unitPrice); + //计算收入 + addvaluePackageEntity.setFee(unitPrice.multiply(BigDecimal.valueOf(p.getQuantity()))); + addvaluePackageEntities.add(addvaluePackageEntity); + totalFee.add(addvaluePackageEntity.getFee()); + }); + distributionAddvaluePackageService.saveBatch(addvaluePackageEntities); + //最后进行该增值服务项的费用统计 + distributionAddvalueDetailService.update(Wrappers.update().lambda() + .eq(DistributionAddvalueDetailEntity::getId,distributionAddvalueDetailEntity.getId()) + .set(DistributionAddvalueDetailEntity::getFee,totalFee) + ); + return Resp.scanSuccess("添加成功", "添加成功"); + } @Override @@ -311,6 +412,7 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl parcelListEntities = distributionReservationMapper.selectPackageListByReservationId(distributionAppAddvalueDTO.getReservationId()); - if (reservationEntity.getReservationNum() + reservationEntity.getReservationStockListNum() == packageEntityList.size()) { - distributionAddvalueDetailEntity.setRecordType(1); - } distributionAddvalueDetailService.save(distributionAddvalueDetailEntity); +// List parcelListEntities = distributionReservationMapper.selectPackageListByReservationId(distributionAppAddvalueDTO.getReservationId()); +// if (reservationEntity.getReservationNum() + reservationEntity.getReservationStockListNum() == packageEntityList.size()) { +// distributionAddvalueDetailEntity.setRecordType(1); +// } List addvaluePackageEntities = new ArrayList<>(); + //查询客户下此类的增值服务 List packageEntities = distributionAddvalueMapper.selectAddvaluePackageListByAddvalueType(distributionAppAddvalueDTO.getReservationId(), distributionAppAddvalueDTO.getAddvalueType()); Map addvaluePackageEntityMap = packageEntities.stream().collect(Collectors.toMap(DistributionAddvaluePackageEntity::getPackageId, Function.identity(), (k1, k2) -> k2)); packageDTOList.stream().forEach(p -> { if (Func.isEmpty(addvaluePackageEntityMap.get(p.getPackageId()))) { Integer conditions = p.getConditions(); + BigDecimal unitPrice = null; + //获取结算单价 + List priceDispatchAddClientVOS = basicdataPriceClient.dispatchAddPrice(BasicdatPriceApiVO.builder().clientId(p.getClientId().toString()).brandId(p.getBrandId().toString()).build()); + if (Func.isEmpty(priceDispatchAddClientVOS)) { + //此客户品牌下无单价信息 + unitPrice = new BigDecimal(BigInteger.ZERO); + } switch (conditions) { case 1: + //查询订制品结算品类 + BasicdataFactoryCategoryEntity entity1 = new BasicdataFactoryCategoryEntity(); + entity1.setFirsts(p.getFirsts()); + entity1.setSeconds(p.getSecond()); + entity1.setThirds(p.getThirdProduct()); + entity1.setMaterielName(p.getMaterialName()); + entity1.setBrandId(p.getBrandId()); + BasicdataFactoryCategoryEntity factoryCategoryEntity1 = basicdataFactoryCategoryClient.findEntityByThreeCategory(entity1); + if (Func.isEmpty(factoryCategoryEntity1)){ + unitPrice = new BigDecimal(BigInteger.ZERO); + } + if (!Func.isEmpty(priceDispatchAddClientVOS)&&Func.isNotEmpty(factoryCategoryEntity1)){ + //获取单价 + unitPrice = getUnitPrice(priceDispatchAddClientVOS,factoryCategoryEntity1,distributionAppAddvalueDTO); + } //判定该包件是否属于该客户 List parcelListEntities = distributionReservationMapper.selectPackageListByReservationId(distributionAppAddvalueDTO.getReservationId()); // boolean packageFlag = parcelListEntities.stream().allMatch(pack -> !Func.equals(pack.getId(), p.getPackageId())); @@ -396,6 +517,16 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl detailEntities = distributionReservationMapper.selectInventoryListByReservation(distributionAppAddvalueDTO.getReservationId()); // boolean inventoryPackageFlag = detailEntities.stream().allMatch(pack -> !Func.equals(pack.getId(), p.getPackageId())); boolean inventoryPackageFlag = detailEntities.stream().map(DisStockListDetailEntity::getId).collect(Collectors.toList()).contains(p.getPackageId()); @@ -404,6 +535,16 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl distributionParcelNumberDTOS = distributionReservationMapper.selectZeroPackageListByReservationId(distributionAppAddvalueDTO.getReservationId()); // boolean zeroPackageFlag = distributionParcelNumberDTOS.stream().allMatch(pack -> !Func.equals(pack.getId(), p.getPackageId())); boolean zeroPackageFlag = distributionParcelNumberDTOS.stream().map(DistributionParcelNumberDTO::getId).collect(Collectors.toList()).contains(p.getPackageId()); @@ -415,15 +556,75 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl{ + totalFee.add(p.getFee()); + }); + distributionAddvalueDetailEntity.setFee(totalFee); + distributionAddvalueDetailService.updateById(distributionAddvalueDetailEntity); + distributionAddvaluePackageService.saveBatch(addvaluePackageEntities); + return Resp.scanSuccess("添加成功", "添加成功"); + }else { + return Resp.scanFail("添加失败", "添加失败"); + } + + } + + private BigDecimal getUnitPrice(List priceDispatchAddClientVOS, BasicdataFactoryCategoryEntity factoryCategoryEntity, DistributionAppAddvalueDTO distributionAppAddvalueDTO) { + + List collect = priceDispatchAddClientVOS.stream().filter(f -> f.getCategoryId().equals(factoryCategoryEntity.getId())).collect(Collectors.toList()); + BigDecimal unitPrice = null; + if (!collect.isEmpty()){ + if (collect.size() > 1){ + log.info("存在多个相同分类的单价CategoryId:{}",factoryCategoryEntity.getId()); + } + PriceDispatchAddClientVO priceDispatchAddClientVO = collect.get(0); + + switch (distributionAppAddvalueDTO.getAddvalueType()){ + case "1": + //获取上楼费用 + //比对是否超过了楼层 + if (priceDispatchAddClientVO.getDispatchStairsCarryingCharge() >= distributionAppAddvalueDTO.getFloolNum()) { + unitPrice = new BigDecimal(BigInteger.ZERO); + }else { + unitPrice = BigDecimal.valueOf(priceDispatchAddClientVO.getUpstairsDeliveryPrice()); + } + break; + case "2": + //获取超区公里数单价 + unitPrice = new BigDecimal(BigInteger.ZERO); + break; + case "3": + //获取平移单价 + unitPrice = BigDecimal.valueOf(priceDispatchAddClientVO.getRelocationPrice()); + break; + case "4": + //获取搬运单价 + unitPrice = BigDecimal.valueOf(priceDispatchAddClientVO.getHandlingPrice()); + break; + case "5": + //获取搬运单价 + unitPrice = BigDecimal.valueOf(priceDispatchAddClientVO.getSortPrice()); + break; + default: + log.info(">>>>>>>>>>>>>>对应客户未进行单价维护:{}",priceDispatchAddClientVO.getCategoryId()); + unitPrice = new BigDecimal(BigInteger.ZERO); + break; + } + }else { + return BigDecimal.ZERO; + } + return unitPrice; } @Override @@ -678,7 +879,7 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl { - distributionAddvaluePackageMapper.deleteAddvaluePackageByDetailId(distributionAppAddvalueDTO.getReservationId(), id,distributionAppAddvalueDTO.getAddvalueDetailId()); + distributionAddvaluePackageMapper.deleteAddvaluePackageByDetailId(distributionAppAddvalueDTO.getReservationId(), id, distributionAppAddvalueDTO.getAddvalueDetailId()); }); } else { log.error("###########该包件不存在增值服务项包件列表中"); @@ -708,15 +909,27 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl p.getClientId() != null); + if (flag) { + String str = packageEntityList.stream().filter(p -> p.getClientId() != null).map(DistributionAddvaluePackageDTO::getOrderPackageCode).collect(Collectors.joining(",")); + return R.fail(str + "无客户信息"); + } + List clientIds = packageEntityList.stream().map(DistributionAddvaluePackageDTO::getClientId).distinct().collect(Collectors.toList()); + String string = verifyClient(clientIds, packageEntityList); + if (Strings.isBlank(string)) { + log.info("计算成本失败>>>>>>>>>:{}", string); + } if (increasePackage.size() > 0) { + //统计该项增值服务包件数量 int num = detailEntity.getNum() + increasePackage.size(); detailEntity.setNum(num); @@ -763,11 +976,23 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl { + + if (Func.isNotEmpty(packageDTOMap.get(ip))) { //新增包件 DistributionAddvaluePackageDTO distributionAddvaluePackageDTO = packageDTOMap.get(ip); + List priceDispatchAddClientVOS = basicdataPriceClient.dispatchAddPrice(BasicdatPriceApiVO.builder().clientId(distributionAddvaluePackageDTO.getClientId().toString()).brandId(distributionAddvaluePackageDTO.getClientId().toString()).build()); + if (!priceDispatchAddClientVOS.isEmpty()) { + //TODO 结算品类 + } + //查询价格模板 DistributionAddvaluePackageEntity distributionAddvaluePackageEntity = distributionAddvaluePackageMapper.selectOne(Wrappers.query().lambda() .eq(DistributionAddvaluePackageEntity::getReservationId, distributionAddvaluePackageDTO.getReservationId()) .eq(DistributionAddvaluePackageEntity::getPackageId, distributionAddvaluePackageDTO.getPackageId()) @@ -776,17 +1001,17 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl 0){ + if (distributionAddvaluePackageDTO.getZeroQuantity() > 0) { DistributionAddvaluePackageEntity zeroAddvaluePackageEntity = Func.copy(distributionAddvaluePackageDTO, DistributionAddvaluePackageEntity.class); distributionAddvaluePackageEntity.setQuantity(distributionAddvaluePackageDTO.getZeroQuantity()); distributionAddvaluePackageService.updateById(zeroAddvaluePackageEntity); - }else { + } else { log.error("###############零担品类录入数量0:{}", distributionAddvaluePackageDTO.getPackageId()); } - }else { + } else { if (distributionAddvaluePackageDTO.getZeroQuantity() > 0) { distributionAddvaluePackageEntity.setQuantity(distributionAddvaluePackageDTO.getZeroQuantity()); distributionAddvaluePackageService.updateById(distributionAddvaluePackageEntity); @@ -795,6 +1020,7 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl clientIds, List packageEntityList) { + if (!clientIds.isEmpty()) { + //校验客户信息 + List basicdataClientEntityList = basicdataClientClient.findEntityByIds(clientIds); + if (!basicdataClientEntityList.isEmpty()) { + //校验客户数量是否和统计一致,否则存在异常客户信息 + if (!Objects.equals(clientIds.size(), basicdataClientEntityList.size())) { + String collect = clientIds.stream().filter(f -> !basicdataClientEntityList.stream().map(BasicdataClientEntity::getId).collect(Collectors.toList()).contains(f)).map(String::valueOf).collect(Collectors.joining(",")); + log.error("客户信息异常,客户ID:{}", collect); + String unorderPackageCode = packageEntityList.stream() + .filter(f -> clientIds.stream().filter(m -> !basicdataClientEntityList.stream() + .map(BasicdataClientEntity::getId) + .collect(Collectors.toList()) + .contains(m)) + .collect(Collectors.toList()) + .contains(f.getClientId())) + .map(DistributionAddvaluePackageDTO::getOrderPackageCode) + .collect(Collectors.joining(",")); + return unorderPackageCode + "客户信息异常"; + } + } + } + return null; + } // if (Func.isEmpty(detailEntity)) { @@ -835,7 +1085,7 @@ public class DistributionAddvalueServiceImpl extends BaseServiceImpl>>>>>>>>>>>>>>>>>>>>>>>{}", distrilbutionloadingscanDTO); @@ -191,44 +147,6 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { List distributionLoadscanEntities = distributionLoadscanMapper.selectList(new QueryWrapper().lambda() .eq(DistributionLoadscanEntity::getDeliveryId, distrilbutionloadingscanDTO.getDeliveryId()) ); - // 使用流式操作和映射,提取包条Id并创建新的列表 -// List packageIdList = distributionLoadscanEntities.stream().map(DistributionLoadscanEntity::getPackageId).collect(Collectors.toList()); -// for (Long aLong : packageIdList) { -// DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(aLong); -// parcelListEntity.setOrderPackageStatus(OrderPackageLoadingStatusConstant.yizhuangche.getValue()); -// distributionParcelListService.updateById(parcelListEntity); -// //查询到这个包件信息,这里就需要根据包件去对订单状态机进行变更 -// List parcelListEntityList = distributionParcelListService.getBaseMapper().selectList(Wrappers.query().lambda().eq(DistributionParcelListEntity::getStockArticleId, parcelListEntity.getStockArticleId())); -// boolean flag = parcelListEntityList.stream().allMatch(l -> Integer.parseInt(l.getOrderPackageStatus()) > Integer.parseInt(OrderPackageStatusConstant.yizhuangche.getValue())); -// DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(parcelListEntity.getStockArticleId()); -// if (flag){ -// //这里就需要将订单进行已出库的状态修改 -// stockArticleEntity.setOrderStatus(OrderStatusConstant.zhuangche.getValue()); -// }else { -// stockArticleEntity.setOrderStatus(OrderStatusConstant.bufenzhuangche.getValue()); -// //这里就是订单的部分出库 -// } -// distributionStockArticleService.updateById(stockArticleEntity); -// } - -// Long reservationId = distrilbutionloadingscanDTO.getReservationId(); -// -// //TODO 包件状态变更 -// -// //修改状态包条状态 -// distributionParcelListService.update(new UpdateWrapper().lambda() -// .in(DistributionParcelListEntity::getId,packageIdList) -// .set(DistributionParcelListEntity::getOrderPackageStatus, OrderPackageStatusConstant.yizhuangche.getValue()) -// ); -// -// //提取订单Id(去重) -// List OrderList = distributionLoadscanEntities.stream().map(DistributionLoadscanEntity::getOrderId).distinct().collect(Collectors.toList()); -// //查询修改订单状态 -// List distributionParcelListEntities = distributionParcelListMapper.selectList(new QueryWrapper().lambda() -// .in(DistributionParcelListEntity::getStockArticleId, OrderList) -// //.eq(DistributionParcelListEntity::get) -// //todo 修改订单状态 -// ); } /** @@ -238,7 +156,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { * @return */ @Override - @Async + @LogpmAsync("asyncExecutor") @Transactional(rollbackFor = Exception.class) public Boolean getSelfPickup(Long id) { DistributionParcelListEntity entity = new DistributionParcelListEntity(); @@ -254,9 +172,9 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { * @return */ @Override - @Async + @LogpmAsync("asyncExecutor") @Transactional(rollbackFor = Exception.class) - public Boolean getOrderSelfPickup(Long id) { + public Boolean updateOrderSelfPickup(Long id) { DistributionStockArticleEntity entity = new DistributionStockArticleEntity(); entity.setId(id); entity.setOrderStatus(OrderStatusConstant.qianshou.getValue()); @@ -264,7 +182,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } @Override - @Async + @LogpmAsync("asyncExecutor") @Transactional(rollbackFor = Exception.class) public Boolean getInventorySelfPickup(Long id) { DistributionStockEntity distributionStock = new DistributionStockEntity(); @@ -275,7 +193,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } @Override - @Async + @LogpmAsync("asyncExecutor") @Transactional(rollbackFor = Exception.class) public Boolean getInventoryOrderSelfPickup(Long id) { DistributionDeliveryDetailsEntity deliveryDetails = new DistributionDeliveryDetailsEntity(); @@ -291,7 +209,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { * @return */ @Override - public Boolean getBillStock(Long id) { + public Boolean updateBillStock(Long id) { DistrilbutionBillStockEntity distrilbutionBillStock = new DistrilbutionBillStockVO(); distrilbutionBillStock.setId(id); distrilbutionBillStock.setConditions("20"); @@ -303,7 +221,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { * * @param id 订单ID */ - @Async + @LogpmAsync("asyncExecutor") @Override public void updateStockArticleStock(Long id) { log.debug("###查询订单备货状态"); @@ -331,7 +249,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { * * @param ids 订单ID */ - @Async + @LogpmAsync("asyncExecutor") @Override public void updateParcelListReservation(List ids) { log.debug("####修改包件预约状态"); @@ -356,7 +274,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } - @Async + @LogpmAsync("asyncExecutor") @Override public Boolean getInventoryNumUpdate(Long id, Integer num, Integer type) { //查询 @@ -379,7 +297,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } - @Async + @LogpmAsync("asyncExecutor") @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED, rollbackFor = Exception.class) public void changeOrderSignforStatus(DistributionParcelListEntity parcelListEntity) { @@ -400,7 +318,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } - @Async + @LogpmAsync("asyncExecutor") @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED, rollbackFor = Exception.class) public void changeDiscussDeliveryListStatus(String barcode, Long deliveryId) { @@ -460,7 +378,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { }); } - @Async + @LogpmAsync("asyncExecutor") @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED, rollbackFor = Exception.class) public void changeMarketDeliveryListStatus(String barcode, Long deliveryId, Long reservationId) { @@ -506,7 +424,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { checkReservationAndDeliveryLoadingStatus(deliveryId, reservationId); } - @Async + @LogpmAsync("asyncExecutor") @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED, rollbackFor = Exception.class) public void checkDeliverySignStatus(String barcode, Long deliveryId) { @@ -697,7 +615,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { distributionDeliveryListMapper.updateById(deliveryListEntity); } - @Async + @LogpmAsync("asyncExecutor") @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED, rollbackFor = Exception.class) public void checkDeliverySignStatusByReservation(Long deliveryId) { @@ -1503,7 +1421,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } @Override - @Async + @LogpmAsync("asyncExecutor") public void sendFactory(DistributionParcelListEntity distributionParcelListEntity, String signingTime, Long reservationId, String reservationCode, String warehouseName, String userName) { DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(distributionParcelListEntity.getStockArticleId()); log.info(">>>>>>>>>>> 签收推送 对象 {}", distributionParcelListEntity); @@ -1537,9 +1455,9 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { @Override @Transactional(rollbackFor = Exception.class) - @Async + @LogpmAsync("asyncExecutor") public void sendReviewFactory(Long signingId, String warehouseName, Long warehouseId) { - String brands = "梦天,欧派,志邦";//可追加 + String brands = "梦天,欧派,志邦,皮阿诺,我乐";//可追加 log.info(">>>>>>>>>>> 签收推送 对象 {}", "signingId:=" + signingId + "warehouseName:=" + warehouseName + "warehouseId:=" + warehouseId); //查询签收信息 DistributionSignforEntity distributionSignforEntity = distributionSignforMapper.selectById(signingId); @@ -1564,7 +1482,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { //存在订单 List orderIds = distributionReservationStockarticleEntities.stream().filter(f -> f.getIsZero().equals(IsOrNoConstant.no.getValue())).map(DistributionReservationStockarticleEntity::getStockArticleId).collect(Collectors.toList()); - if (ObjectUtils.isNotNull(orderIds) && !orderIds.isEmpty()){ + if (ObjectUtils.isNotNull(orderIds) && !orderIds.isEmpty()) { log.info(">>>brand 进入 orderIds {} ", orderIds); List distributionStockArticleEntities = distributionStockArticleService.listByIds(orderIds); @@ -1617,41 +1535,27 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } if (Func.isNotEmpty(brand.get("欧派"))) { - - // 重新筛选出欧派的包件 - for (DistributionReservationStockarticleEntity distributionReservationStockarticleEntity : distributionReservationStockarticleEntities) { - - // 查询预约单下面的包件信息 - log.info(">>>>>>>>>>>>>>>>>>>>> 欧派循环包件信息 {} ", distributionReservationStockarticleEntity); - List distributionParcelListEntities = buildOpByReservationId(distributionReservationStockarticleEntity); - - - for (DistributionParcelListEntity distributionParcelListEntity : distributionParcelListEntities) { - // todo 查询签收信息 - DistributionSignforEntity distributionSignfor = distributionSignforService.getByReservationId(distributionReservationStockarticleEntity.getReservationId()); - OrderStatusDTO orderStatusDTO = new OrderStatusDTO(); - orderStatusDTO.setUnitNo(distributionParcelListEntity.getOrderPackageCode()); //单号 - orderStatusDTO.setUsername(distributionSignfor.getSigneeName()); //操作人名称 - orderStatusDTO.setStatus("7"); - orderStatusDTO.setOperationTime(distributionSignfor.getSigningTime()); //时间 - ouPaiFactoryClinet.newSystemHandleStatusData(orderStatusDTO); - log.info(">>>>>>>>>>>>>>>>>进入newSystemHandleStatusData orderStatusDTO值 :{}", orderStatusDTO); - } - - + List oupai = brand.get("欧派"); + for (MtReceiveContentDTO mtReceiveContentDTO : oupai) { + OrderStatusDTO orderStatusDTO = new OrderStatusDTO(); + orderStatusDTO.setUnitNo(mtReceiveContentDTO.getUnitNo()); //包条 + orderStatusDTO.setUsername(distributionSignforEntity.getSigneeName()); //操作人名称 + orderStatusDTO.setStatus("7"); + orderStatusDTO.setOperationTime(distributionSignforEntity.getSigningTime()); //时间 + ouPaiFactoryClinet.newSystemHandleStatusData(orderStatusDTO); } - - -// orderMainClinet.sendReceiveInfoByNewSystem(mtReceiveDTO); } if (Func.isNotEmpty(brand.get("志邦"))) { List zb = brand.get("志邦"); List contents = new ArrayList<>(); if (CollUtil.isNotEmpty(zb)) { for (MtReceiveContentDTO mtReceiveContentDTO : zb) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("packageCode", mtReceiveContentDTO.getUnitNo()); - contents.add(jsonObject); + PushData pushData = PushData.builder() + .packageCode(mtReceiveContentDTO.getUnitNo()) + .orderCode(mtReceiveContentDTO.getOrderCode()) + .warehouseName(warehouseName) + .waybillNumber(mtReceiveContentDTO.getWaybillNumber()).build(); + contents.add(pushData); } } NodePushMsg msg = new NodePushMsg(); @@ -1664,11 +1568,55 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { factoryDataMessageSender.sendNodeDataByBrand(msg); } + if (Func.isNotEmpty(brand.get("皮阿诺"))) { + List zb = brand.get("皮阿诺"); + if (CollUtil.isNotEmpty(zb)) { + for (MtReceiveContentDTO mtReceiveContentDTO : zb) { + try { + // 发送入库消息 + OrderStatusDTO orderStatusDTO = new OrderStatusDTO(); + // 通过包件id 查询包件 + orderStatusDTO.setUnitNo(mtReceiveContentDTO.getUnitNo()); + orderStatusDTO.setOrderNo(mtReceiveContentDTO.getOrderCode()); + orderStatusDTO.setStatus("7"); + orderStatusDTO.setOperationTime(DateUtil.now()); + orderStatusDTO.setCurrentWarehouse(warehouseId.toString()); + Map map = new HashMap<>(); + map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO)); + rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map); + } catch (Exception e) { + log.error("入库推送失败", e); + } + } + } + } + if (Func.isNotEmpty(brand.get("我乐"))) { + List zb = brand.get("我乐"); + List contents = new ArrayList<>(); + if (CollUtil.isNotEmpty(zb)) { + for (MtReceiveContentDTO mtReceiveContentDTO : zb) { + PushData pushData = PushData.builder() + .packageCode(mtReceiveContentDTO.getUnitNo()) + .orderCode(mtReceiveContentDTO.getOrderCode()) + .warehouseName(warehouseName) + .waybillNumber(mtReceiveContentDTO.getWaybillNumber()).build(); + contents.add(pushData); + } + } + NodePushMsg msg = new NodePushMsg(); + msg.setNode(WorkNodeEnums.CLERK_REVIEW); + msg.setBrand(BrandEnums.OLO); + msg.setOperator(distributionSignforEntity.getDeliveryDriverName()); + msg.setOperatorTime(new Date()); + msg.setContent(contents); + log.info("推送工厂数据:{}", JSONUtil.toJsonStr(msg)); + factoryDataMessageSender.sendNodeDataByBrand(msg); + } //....工厂 } catch (Exception e) { - log.error("sendReviewFactory ", e); - throw new RuntimeException(e); + log.error("复核推送工厂信息错误 ", e); +// throw new RuntimeException(e); } } @@ -1690,7 +1638,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } @Override - @Async + @LogpmAsync("asyncExecutor") @Transactional public void maintenanceOrderStatus(String orderCode, Long warehouseId) { distributionStockArticleService.updateOrderInfo(orderCode, warehouseId); @@ -1698,8 +1646,8 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { @Override @Transactional - @Async - public void releaseSource(Long reservationId, Long warehouseId) { + @LogpmAsync("asyncExecutor") + public void releaseSource(Long reservationId, BasicdataWarehouseEntity warehouse, BladeUser user, String trainNumber) { String method = "##########################DistributionAsyncServiceImpl.releaseSource"; DistributionReservationEntity reservationEntity = distributionReservationMapper.selectById(reservationId); StringBuilder builder = new StringBuilder(); @@ -1707,10 +1655,12 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { //存在订单 List distributionParcelListEntities = distributionReservationMapper.selectPackageListByReservationId(reservationId); if (Func.isNotEmpty(distributionParcelListEntities)) { + List packageIds = distributionParcelListEntities.stream() .filter(p -> p.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue()) && !p.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())) .map(DistributionParcelListEntity::getId) .collect(Collectors.toList()); + if (Func.isNotEmpty(packageIds)) { //对包件进行批量的修改 //将这些包件恢复到初始状态 @@ -1718,16 +1668,36 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } //维护这些进行包件对应的订单 String orderCodes = distributionParcelListEntities.stream() - .filter(p -> p.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue()) && !p.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())) + .filter(p -> p.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue()) + && !p.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())) .map(DistributionParcelListEntity::getOrderCode) .distinct().collect(Collectors.joining(",")); log.info(method + "维护订制品订单:{}", orderCodes); builder.append(orderCodes); log.info(">>>>>> updatePackageDeliveryStatus,{}, {}", reservationId, packageIds); - //完成对该客户下此包件任务的取消 - int row = distributionReservationMapper.updatePackageDeliveryStatus(reservationId, packageIds); - //维护预约订单状态 + if (!packageIds.isEmpty() && reservationId != null) { + //完成对该客户下此包件任务的取消 + int row = distributionReservationMapper.updatePackageDeliveryStatus(reservationId, packageIds); + + } + List aaa = new ArrayList<>(); + distributionParcelListEntities.forEach(k -> { + if (k.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.yizhuangche.getValue()) + && k.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())) { + String content = "包件在" + warehouse.getName() + "由" + user.getNickName() + "完成复核,配送车次号:" + trainNumber + "预约任务号:" + reservationEntity.getReservationCode(); + JSONObject js = handleLogJSONObject(warehouse, AuthUtil.getUser(), k.getOrderPackageCode(), content, WorkNodeEnums.CLERK_REVIEW.getCode()); + aaa.add(js); + } else { + String content = "包件在" + warehouse.getName() + "由" + user.getNickName() + "复核取消计划无操作包件,配送车次号:" + trainNumber + "预约任务号:" + reservationEntity.getReservationCode(); + JSONObject js = handleLogJSONObject(warehouse, AuthUtil.getUser(), k.getOrderPackageCode(), content, WorkNodeEnums.CANCEL_DISTRIBUTION.getCode()); + aaa.add(js); + } + }); + if (!aaa.isEmpty()) { + trunklinePackageTrackLogClient.addPackageTrackLog(aaa); + } + } List distributionParcelNumberDTOS = distributionReservationMapper.selectZeroPackageListByReservationId(reservationId); if (Func.isNotEmpty(distributionParcelNumberDTOS)) { @@ -1756,8 +1726,8 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { reservationZeroPackageService.recoverZeroPackage(reservationId, packageIds); } } - distributionStockArticleService.maintenanceOrderInfo(builder.toString(), warehouseId); - distributionReservationStockarticleService.maintenanceReservationStockArticle(reservationId, warehouseId); + distributionStockArticleService.maintenanceOrderInfo(builder.toString(), warehouse.getId()); + distributionReservationStockarticleService.maintenanceReservationStockArticle(reservationId, warehouse.getId()); } //存在库存品信息 @@ -1810,7 +1780,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { //统计已装车数量 WarehouseWaybillEntity byWaybillNo = waybillClient.findByWaybillNo(k); AddWaybillTrackDTO addWaybillTrackDTO = new AddWaybillTrackDTO(); - if(ObjectUtils.isNotNull(byWaybillNo)){ + if (ObjectUtils.isNotNull(byWaybillNo)) { addWaybillTrackDTO.setWaybillId(byWaybillNo.getId()); addWaybillTrackDTO.setWaybillNo(byWaybillNo.getWaybillNo()); } @@ -1890,7 +1860,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { * @param stockupDTO */ @Override - @Async + @LogpmAsync("asyncExecutor") public void updateStockupDate(StockupDTO stockupDTO) { Integer scanType = stockupDTO.getScanType();//扫码类型 1 包件 2库存品 @@ -2019,7 +1989,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { * 备货库存品备货时间回显 */ @Override - @Async + @LogpmAsync("asyncExecutor") public void updateStockupStockListDate(StockupDTO stockupDTO) { Integer scanType = stockupDTO.getScanType();//扫码类型 1 包件 2库存品 Long reservationId = stockupDTO.getReservationId();//预约ID @@ -2077,6 +2047,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } DistributionReservationStocklistEntity reservationStocklistEntity = new DistributionReservationStocklistEntity(); reservationStocklistEntity.setId(one1.getId()); + reservationStocklistEntity.setReservationId(one1.getReservationId()); //维护备货时间 if (ObjectUtils.isNull(one1.getStartTimeStocking())) { reservationStocklistEntity.setStockStatus("2"); @@ -2119,6 +2090,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { mtReceiveContentDTO.setUnitNo(distributionParcelListEntity.getOrderPackageCode());// mtReceiveContentDTO.setOperateDate(signingTime);//操作时间 mtReceiveContentDTO.setInvoiceOrderCode(deliveryCode);//发货编号 + mtReceiveContentDTO.setWaybillNumber(distributionParcelListEntity.getWaybillNumber()); mtReceiveContentDTOS.add(mtReceiveContentDTO); } } @@ -2191,7 +2163,9 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } distributionReservationMapper.updateById(distributionReservationEntity); if (distributionReservationEntity.getReservationNum() == 0 && distributionReservationEntity.getReservationStockListNum() == 0) { - distributionReservationMapper.deleteById(distributionReservationEntity); + distributionReservationEntity.setIsDeleted(1); + distributionReservationEntity.setReservationStatus(ReservationStatusConstant.yiquexiao.getValue()); + distributionReservationMapper.updateById(distributionReservationEntity); } } } @@ -2241,7 +2215,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { /** * 自提签收片段是否签收完全 */ - @Async + @LogpmAsync("asyncExecutor") @Override @Transactional(rollbackFor = Exception.class) public void getStockUPstate(Long billLadingId) { @@ -2327,7 +2301,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } - @Async + @LogpmAsync("asyncExecutor") @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED, rollbackFor = Exception.class) public void checkStockArticleSignStatus(DistributionParcelListEntity parcelListEntity) { @@ -2384,7 +2358,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { } - @Async + @LogpmAsync("asyncExecutor") @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED, rollbackFor = Exception.class) public void changeOrderStatus(String barcode, Long deliveryId) { @@ -2403,7 +2377,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { distributionStockArticleService.updateById(stockArticleEntity); } - @Async + @LogpmAsync("asyncExecutor") @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED, rollbackFor = Exception.class) public void changeDeliverySignforListStatus(Long deliveryId, DistributionParcelListEntity parcelListEntity) { @@ -2527,7 +2501,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { distributionStockArticleService.updateById(stockArticleEntity); } - @Async + @LogpmAsync("asyncExecutor") @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED, rollbackFor = Exception.class) public void checkStockArticleLoadingStatus(DistributionParcelListEntity parcelListEntity) { @@ -2818,12 +2792,8 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { queryWrapper1.eq("reservation_id", reservationId); } DistributionStockEntity stockEntity = distributionStockService.selectOne(queryWrapper1); - if (ObjectUtils.isNull(stockEntity)) { - //没有扫 - return true; - } else { - return false; - } + //没有扫 + return ObjectUtils.isNull(stockEntity); } @@ -2847,13 +2817,530 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService { queryWrapper1.eq("reservation_id", reservationId); } List stockEntityList = distributionStockService.selectList(queryWrapper1); - if (!stockEntityList.isEmpty() && stockEntityList.size() >= num) { - return true; //已完成 + //未完成 + return !stockEntityList.isEmpty() && stockEntityList.size() >= num; //已完成 + + } + + @ChangeAsync() + @Override + public DistributionStockArticleEntity findDistributionStockArticleEntityByIdForAsync(String tenantId, Long id) { + DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(id); + + return stockArticleEntity; + } + + + @Override + @LogpmAsync("asyncExecutor") + public void recordsReservationDeliveryLog(List reservationList, BasicdataWarehouseEntity warehouse, BladeUser user, DistributionDeliveryListEntity deliveryListEntity, Integer node, String content) { + List list = reservationList.stream().map(DistributionReservationEntity::getId).collect(Collectors.toList()); + if (!list.isEmpty()) { + List distributionReservationPackageEntities = distributionReservationPackageMapper.selectList(Wrappers.query().lambda() + .in(DistributionReservationPackageEntity::getReservationId, list) + .ne(DistributionReservationPackageEntity::getPacketBarStatus, ReservationPackageStatusConstant.quxiao.getValue()) + ); + // reservationList根据id分组封装成map + Map> map = reservationList.stream().collect(Collectors.groupingBy(DistributionReservationEntity::getId)); + List aaa = new ArrayList<>(); + List pushDatas = new ArrayList<>(); + if (!distributionReservationPackageEntities.isEmpty()) { + // 通过订单id获取订单,然后根据品牌分组 + Map stockArticleEntityMap = new HashMap<>(); + List collect = distributionReservationPackageEntities.stream().map(DistributionReservationPackageEntity::getStockArticleId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(collect)) { + List stockArticleEntities = distributionStockArticleService.list(Wrappers.query().lambda() + .in(DistributionStockArticleEntity::getId, collect) + ); + if (CollUtil.isNotEmpty(stockArticleEntities)) { + stockArticleEntities.forEach(s -> { + stockArticleEntityMap.put(s.getId(), s); + }); + } + } + distributionReservationPackageEntities.forEach(rp -> { + DistributionReservationEntity r = map.get(rp.getReservationId()).get(0); + JSONObject trunklinePackageTrackLog = new JSONObject(); + trunklinePackageTrackLog.put("tenantId", AuthUtil.getTenantId()); + trunklinePackageTrackLog.put("createTime", new Date()); + trunklinePackageTrackLog.put("createUser", user.getUserId()); + trunklinePackageTrackLog.put("updateUser", user.getUserId()); + trunklinePackageTrackLog.put("updateTime", new Date()); + trunklinePackageTrackLog.put("isDeleted", 0); + trunklinePackageTrackLog.put("status", 1); + trunklinePackageTrackLog.put("createDept", warehouse.getDepartment()); + trunklinePackageTrackLog.put("orderPackageCode", rp.getPacketBarCode()); + trunklinePackageTrackLog.put("warehouseId", warehouse.getId()); + trunklinePackageTrackLog.put("warehouseName", warehouse.getName()); + trunklinePackageTrackLog.put("workNode", node); + trunklinePackageTrackLog.put("content", content); + trunklinePackageTrackLog.put("operator", AuthUtil.getUser().getNickName()); + aaa.add(trunklinePackageTrackLog); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("trainNumber", deliveryListEntity.getTrainNumber()); + jsonObject.put("brand", stockArticleEntityMap.get(rp.getStockArticleId()).getBrand()); + jsonObject.put("receiver", r.getConsignee()); + jsonObject.put("receiveAddr", r.getDeliveryAddress()); + jsonObject.put("receiveTel", r.getDeliveryPhone()); + jsonObject.put("planDeliveryDate", deliveryListEntity.getTaskTime()); + jsonObject.put("packageCode", rp.getPacketBarCode()); + pushDatas.add(jsonObject); + }); + } + try { + if (CollUtil.isNotEmpty(pushDatas)) { + // 以trainNumber和receiver 分组 将包件封装成list + Map> collect = pushDatas.stream().collect(Collectors.groupingBy(jsonObject -> jsonObject.getString("trainNumber") + jsonObject.getString("receiver") + jsonObject.getString("brand"))); + if (CollUtil.isNotEmpty(collect)) { + for (Map.Entry> entry : collect.entrySet()) { + List value = entry.getValue(); + if (CollUtil.isNotEmpty(value)) { + JSONObject object = value.get(0); + NodePushMsg msg = new NodePushMsg(); + msg.setNode(WorkNodeEnums.PLAN_DISTRIBUTION); + msg.setBrand(BrandEnums.getByValue(value.get(0).getString("brand"))); + msg.setOperator(AuthUtil.getNickName()); + msg.setOperatorTime(new Date()); + msg.setMain(object); + msg.setContent(value.stream().map(jsonObject -> { + PushData pushData = new PushData(); + pushData.setPackageCode(jsonObject.getString("packageCode")); + return pushData; + }).collect(Collectors.toList())); + log.info("推送工厂数据:{}", JSONUtil.toJsonStr(msg)); + factoryDataMessageSender.sendNodeDataByBrand(msg); + } + } + } + } + } catch (Exception e) { + log.error("推送工程数据失败:{}", e); + } + + if (!aaa.isEmpty()) { + trunklinePackageTrackLogClient.addPackageTrackLog(aaa); + } + } + + } + + @Override + public void sendFactorySignforInfo(String s, BasicdataWarehouseEntity warehouse, BladeUser user) { + try { + MtReceiveDTO mtReceiveDTO = new MtReceiveDTO(); + List list = distrilbutionBillStockService.list(Wrappers.query().lambda() + .eq(DistrilbutionBillStockEntity::getBillLadingId, s) + .apply("order_status in ( '1' , '3')") + ); + if (!list.isEmpty()) { + List orderIds = list.stream().map(DistrilbutionBillStockEntity::getStockArticleId).distinct().collect(Collectors.toList()); + handlePushFactoryOrderIds(orderIds, s, warehouse, user); + } + + } catch (Exception e) { + log.error("回传工厂数据失败", e); + } + } + + @Override + public void maintenanceCancelBillLading(List ids) { + for (Long id : ids) { + List list = billPackageService.list(Wrappers.query().lambda() + .eq(DistrilbutionBillPackageEntity::getBillLadingId, id) + .eq(DistrilbutionBillPackageEntity::getPacketBarStatus, ReservationPackageStatusConstant.quxiao.getValue()) + ); + if (!list.isEmpty()) { + List packageIds = list.stream().map(DistrilbutionBillPackageEntity::getParceListId).collect(Collectors.toList()); + distributionParcelListService.update(Wrappers.update().lambda() + .in(DistributionParcelListEntity::getId, packageIds) + .set(DistributionParcelListEntity::getOrderPackageReservationStatus, OrderPackageReservationStatusConstant.daiyuyue.getValue()) + ); + List orderIds = list.stream().map(DistrilbutionBillPackageEntity::getStockArticleId).distinct().collect(Collectors.toList()); + distributionStockArticleService.maintenanceOrderInfoByIds(orderIds); + } + } + } + + + @Override + public void sendInstallToPlatform(DistributionReservationEntity reservationEntity) { + String method = "###############sendInstallToPlatform推送安装平台"; + //查询预约信息 + PushInstallDTO pushInstallDTO = new PushInstallDTO(); + pushInstallDTO.setName(reservationEntity.getConsignee()); + pushInstallDTO.setTel(reservationEntity.getDeliveryPhone()); + pushInstallDTO.setAddress(reservationEntity.getDeliveryAddress()); + //查询客户 + BasicdataClientEntity client = basicdataClientClient.findByName(reservationEntity.getReceivingUnit()); + if (!Func.isEmpty(client)) { + pushInstallDTO.setBalance_name(client.getClientName()); + pushInstallDTO.setBalance_people("1"); + pushInstallDTO.setBalance_type(client.getDefaultPaymentMethods()); } else { - return false; //未完成 + log.error(method + ">>>>>>>>>>>>>查询客户信息失败" + reservationEntity.getReceivingUnit()); + + } + List orderList = new ArrayList<>(); + List orderDetailList = new ArrayList<>(); + //查询此配送的订单信息 + List distributionReservationStockarticleEntities = distributionReservationMapper.selectStockArticleByReservationId(reservationEntity.getId()); + if (!distributionReservationStockarticleEntities.isEmpty()) { + Map> orderPlanMap = distributionReservationStockarticleEntities.stream().collect(Collectors.groupingBy(DistributionReservationStockarticleEntity::getStockArticleId)); + List orderIds = distributionReservationStockarticleEntities.stream().map(DistributionReservationStockarticleEntity::getStockArticleId).collect(Collectors.toList()); + List distributionStockArticleEntities = distributionStockArticleService.listByIds(orderIds); + if (!distributionStockArticleEntities.isEmpty()) { + for (DistributionStockArticleEntity distributionStockArticleEntity : distributionStockArticleEntities) { + PushInstallDTO.Order order = new PushInstallDTO.Order(); + order.setWaybill_no(distributionStockArticleEntity.getWaybillNumber()); + order.setOrder_no(distributionStockArticleEntity.getOrderCode()); + order.setAll_num(distributionStockArticleEntity.getTotalNumber() + ""); + order.setEnd_num("0"); + //查询签收数量 + List loadscanEntityList = distributionLoadscanMapper.selectList(Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getReservationId, reservationEntity.getId()) + .eq(DistributionLoadscanEntity::getOrderId, distributionStockArticleEntity.getId()) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + .eq(DistributionLoadscanEntity::getSignforState, 2) + ); + if (!loadscanEntityList.isEmpty()) { + order.setEnd_num(loadscanEntityList.stream().mapToInt(DistributionLoadscanEntity::getReceivedQuantity).sum() + ""); + } + orderList.add(order); + + if (distributionStockArticleEntity.getIsZero().equals(IsOrNoConstant.no.getValue())) { + //构建包件信息 + List distributionParcelListEntities = distributionReservationMapper.selectPackageByReservationAndStockArticle(reservationEntity.getId(), distributionStockArticleEntity.getId(), distributionStockArticleEntity.getWarehouseId()); + if (!distributionParcelListEntities.isEmpty()) { + for (DistributionParcelListEntity distributionParcelListEntity : distributionParcelListEntities) { + if (distributionParcelListEntity.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())) { + PushInstallDTO.OrderDetail orderDetail = new PushInstallDTO.OrderDetail(); + orderDetail.setOrder_no(distributionStockArticleEntity.getOrderCode()); + orderDetail.setWaybill_no(distributionStockArticleEntity.getWaybillNumber()); + orderDetail.setMaterials(distributionParcelListEntity.getMaterialName()); + orderDetail.setLevel1_type(distributionParcelListEntity.getFirsts()); + orderDetail.setLevel2_type(distributionParcelListEntity.getSecond()); + orderDetail.setLevel3_type(distributionParcelListEntity.getThirdProduct()); + orderDetail.setPackage_code(distributionParcelListEntity.getOrderPackageCode()); + orderDetail.setNumber(distributionParcelListEntity.getQuantity() + ""); + orderDetailList.add(orderDetail); + } + } + } + } else { + //整理零担的数据 + List distributionParcelNumberVOS = distributionReservationMapper.selectReservationZeroOrderDetail(distributionStockArticleEntity.getId(), reservationEntity.getId()); + if (!distributionParcelNumberVOS.isEmpty()) { + for (DistributionParcelNumberVO distributionParcelNumberVO : distributionParcelNumberVOS) { + PushInstallDTO.OrderDetail orderDetail = new PushInstallDTO.OrderDetail(); + orderDetail.setOrder_no(distributionStockArticleEntity.getOrderCode()); + orderDetail.setWaybill_no(distributionStockArticleEntity.getWaybillNumber()); + orderDetail.setMaterials(distributionParcelNumberVO.getFirsts()); + orderDetail.setLevel1_type(distributionParcelNumberVO.getFirsts()); +// orderDetail.setLevel2_type(distributionParcelListEntity.getSecond()); +// orderDetail.setLevel3_type(distributionParcelListEntity.getThirdProduct()); + orderDetail.setNumber(distributionParcelNumberVO.getReservationNum() + ""); + orderDetail.setPackage_code(distributionStockArticleEntity.getOrderCode()); + orderDetailList.add(orderDetail); + } + } + } + } + } + } + + //查询库存品 + List reservationStocklistEntities = distributionReservationMapper.selectStockListByReservationId(reservationEntity.getId()); + if (!reservationStocklistEntities.isEmpty()) { + List stockListIds = reservationStocklistEntities.stream().map(DistributionReservationStocklistEntity::getStocklistId).collect(Collectors.toList()); + Map> inventoryPlanMap = reservationStocklistEntities.stream().collect(Collectors.groupingBy(DistributionReservationStocklistEntity::getStocklistId)); + if (!stockListIds.isEmpty()) { + List distributionStockListEntities = distributionStockListMapper.selectList(Wrappers.query().lambda() + .in(DistributionStockListEntity::getId, stockListIds) + ); + if (!distributionStockListEntities.isEmpty()) { + for (DistributionStockListEntity distributionStockListEntity : distributionStockListEntities) { + PushInstallDTO.Order order = new PushInstallDTO.Order(); + order.setWaybill_no(distributionStockListEntity.getOrderCode()); + order.setOrder_no(distributionStockListEntity.getIncomingBatch()); + order.setAll_num(distributionStockListEntity.getQuantityStock() + ""); + order.setAll_num("0"); + // + List loadscanEntityList = distributionLoadscaninvnMapper.selectList(Wrappers.query().lambda() + .eq(DistributionLoadscaninvnEntity::getReservationId, reservationEntity.getId()) + .eq(DistributionLoadscaninvnEntity::getInventoryId, distributionStockListEntity.getId()) + .ne(DistributionLoadscaninvnEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + .ne(DistributionLoadscaninvnEntity::getSignforState, 2) + ); + if (!loadscanEntityList.isEmpty()) { + order.setAll_num(loadscanEntityList.stream().mapToInt(DistributionLoadscaninvnEntity::getReceivedQuantity).sum() + ""); + } + //查询库存品包件 + List list = disStockListDetailService.list(Wrappers.query().lambda() + .eq(DisStockListDetailEntity::getReservationId, reservationEntity.getId()) + .eq(DisStockListDetailEntity::getStockListId, distributionStockListEntity.getId()) + .eq(DisStockListDetailEntity::getStockStatus, ReservationPackageStatusConstant.quxiao.getValue()) + ); + if (!list.isEmpty()) { + for (DisStockListDetailEntity disStockListDetailEntity : list) { + PushInstallDTO.OrderDetail orderDetail = new PushInstallDTO.OrderDetail(); + orderDetail.setOrder_no(distributionStockListEntity.getOrderCode()); +// orderDetail.setWaybill_no(distributionStockArticleEntity.getWaybillNumber()); + orderDetail.setMaterials(distributionStockListEntity.getMarketName()); +// orderDetail.setLevel1_type(distributionParcelListEntity.getFirsts()); +// orderDetail.setLevel2_type(distributionParcelListEntity.getSecond()); +// orderDetail.setLevel3_type(distributionParcelListEntity.getThirdProduct()); +// orderDetail.setLevel3_type(distributionParcelListEntity.getThirdProduct()); + orderDetail.setNumber(disStockListDetailEntity.getNum() + ""); + orderDetail.setPackage_code(disStockListDetailEntity.getStockPackageCode()); + orderDetailList.add(orderDetail); + } + } + } + } + } + } + pushInstallDTO.setOrder(orderList); + pushInstallDTO.setOrder_detail(orderDetailList); + log.info(">>>>>>>>>>>>>>安装推送整理数据:{}", JSONObject.toJSON(pushInstallDTO)); + String jsonString = JSONObject.toJSONString(pushInstallDTO); + rabbitTemplate.convertAndSend(RabbitConstant.PUSH_INSTALL_PLATFORM_EXCHANGE, RabbitConstant.PUSH_INSTALL_PLATFORM_ROUTING, jsonString); + + } + + private void handlePushFactoryOrderIds(List orderIds, String s, BasicdataWarehouseEntity warehouse, BladeUser user) { + if (!orderIds.isEmpty()) { + List distributionStockArticleEntities = distributionStockArticleService.list(Wrappers.query().lambda() + .eq(DistributionStockArticleEntity::getWarehouseId, warehouse.getId()) + .in(DistributionStockArticleEntity::getId, orderIds) + ); + if (!distributionStockArticleEntities.isEmpty()) { + List orderList1 = distributionStockArticleEntities.stream().filter(f -> !StringUtils.isBlank(f.getBrand())).collect(Collectors.toList()); + if (!orderList1.isEmpty()) { + Map> orderMap = orderList1.stream().collect(Collectors.groupingBy(DistributionStockArticleEntity::getBrand)); + orderMap.forEach((k, v) -> { + try { + if (k.equals("梦天")) { + MtReceiveDTO mtReceiveDTO = new MtReceiveDTO(); + + //目前处理梦天 + List orderList2 = orderMap.get(k); + //查询此订单所有签收信息 + List ladingScanEntities = distributionBillLadingScanMapper.selectList(Wrappers.query().lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, Long.parseLong(s)) + .in(DistributionBillLadingScanEntity::getStockArticleId, orderList2.stream().map(DistributionStockArticleEntity::getId).collect(Collectors.toList())) + ); + Map> mtOrderMap = orderList2.stream().collect(Collectors.groupingBy(DistributionStockArticleEntity::getId)); + //处理数据构建 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); + List mtReceiveContentDTOList = new ArrayList<>(); + + if (!ladingScanEntities.isEmpty()) { + for (DistributionBillLadingScanEntity ladingScanEntity : ladingScanEntities) { + List orderInfo = mtOrderMap.get(ladingScanEntity.getStockArticleId()); + if (orderInfo.isEmpty()) { + log.error(">>>>>>>>>>>>>>>>自提查询订单信息失败:{}", s); + continue; + } + if (orderInfo.size() > 1) { + log.error(">>>>>>>>>>>>>>>>自提查询订单出现多个订单信息:{}", s); + continue; + } + MtReceiveContentDTO mtReceiveContentDTO = new MtReceiveContentDTO(); + mtReceiveContentDTO.setWarehouse(orderInfo.get(0).getWarehouse()); + mtReceiveContentDTO.setOrderCode(orderInfo.get(0).getOrderCode()); + mtReceiveContentDTO.setUnitNo(ladingScanEntity.getPacketBarCode()); + mtReceiveContentDTO.setOperateDate(simpleDateFormat.format(ladingScanEntity.getCreateTime())); + mtReceiveContentDTO.setWaybillNumber(orderInfo.get(0).getWaybillNumber()); + mtReceiveContentDTOList.add(mtReceiveContentDTO); + } + } + mtReceiveDTO.setSendTaskId(s); + mtReceiveDTO.setReceiver(orderList2.stream().map(DistributionStockArticleEntity::getConsigneePerson).distinct().collect(Collectors.joining(","))); + mtReceiveDTO.setReceiveContentList(mtReceiveContentDTOList); + List mtReceiveImagesDTOS = new ArrayList<>(); + List list1 = distributionPrintService.list(Wrappers.query().lambda() + .eq(DistributionPrintEntity::getBillLadingId, s) + ); + for (DistributionPrintEntity distributionPrintEntity : list1) { + MtReceiveImagesDTO mtReceiveImagesDTO = new MtReceiveImagesDTO(); + if (!distributionPrintEntity.getSite().contains("blob")) { + mtReceiveImagesDTO.setImage(distributionPrintEntity.getSite()); + mtReceiveImagesDTOS.add(mtReceiveImagesDTO); + } + } + if (!mtReceiveImagesDTOS.isEmpty()) { + mtReceiveDTO.setReceiveImagesList(mtReceiveImagesDTOS); + } + orderMainClinet.sendReceiveInfoByNewSystem(mtReceiveDTO); + } + + + if (k.equals("欧派")) { + //查询此订单所有签收信息 + List orderList3 = orderMap.get(k); + + List ladingScanEntities = distributionBillLadingScanMapper.selectList(Wrappers.query().lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, Long.parseLong(s)) + .in(DistributionBillLadingScanEntity::getStockArticleId, orderList3.stream().map(DistributionStockArticleEntity::getId).collect(Collectors.toList())) + ); + if (!ladingScanEntities.isEmpty()) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); + for (DistributionBillLadingScanEntity ladingScanEntity : ladingScanEntities) { + OrderStatusDTO orderStatusDTO = new OrderStatusDTO(); + orderStatusDTO.setUnitNo(ladingScanEntity.getPacketBarCode()); //单号 + orderStatusDTO.setUsername(ladingScanEntity.getScanUser()); //操作人名称 + orderStatusDTO.setStatus("7"); + orderStatusDTO.setOperationTime(sdf.format(ladingScanEntity.getCreateTime())); //时间 + ouPaiFactoryClinet.newSystemHandleStatusData(orderStatusDTO); + } + + } + + } + + if (k.equals("皮阿诺")) { + + List orderList3 = orderMap.get(k); + + List ladingScanEntities = distributionBillLadingScanMapper.selectList(Wrappers.query().lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, Long.parseLong(s)) + .in(DistributionBillLadingScanEntity::getStockArticleId, orderList3.stream().map(DistributionStockArticleEntity::getId).collect(Collectors.toList())) + ); + if (!ladingScanEntities.isEmpty()) { + for (DistributionBillLadingScanEntity ladingScanEntity : ladingScanEntities) { + OrderStatusDTO orderStatusDTO = new OrderStatusDTO(); + // 通过包件id 查询包件 + orderStatusDTO.setUnitNo(ladingScanEntity.getPacketBarCode()); + orderStatusDTO.setOrderNo(ladingScanEntity.getOrderSelfNumbering()); + orderStatusDTO.setStatus("7"); + orderStatusDTO.setOperationTime(DateUtil.now()); + orderStatusDTO.setCurrentWarehouse(warehouse.getId().toString()); + Map map = new HashMap<>(); + map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO)); + rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map); + } + } + } + + if (k.equals("我乐")) { + List orderList3 = orderMap.get(k); + + List ladingScanEntities = distributionBillLadingScanMapper.selectList(Wrappers.query().lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, Long.parseLong(s)) + .in(DistributionBillLadingScanEntity::getStockArticleId, orderList3.stream().map(DistributionStockArticleEntity::getId).collect(Collectors.toList())) + ); + List contents = new ArrayList<>(); + if (!ladingScanEntities.isEmpty()) { + Map> listMap = orderList3.stream().collect(Collectors.groupingBy(DistributionStockArticleEntity::getOrderCode)); + for (DistributionBillLadingScanEntity ladingScanEntity : ladingScanEntities) { + PushData pushData = PushData.builder() + .packageCode(ladingScanEntity.getPacketBarCode()) + .orderCode(ladingScanEntity.getOrderSelfNumbering()) + .warehouseName(warehouse.getName()) + .waybillNumber(listMap.get(ladingScanEntity.getOrderSelfNumbering()).get(0).getWaybillNumber()).build(); + contents.add(pushData); + } + } + NodePushMsg msg = new NodePushMsg(); + msg.setNode(WorkNodeEnums.CLERK_REVIEW); + msg.setBrand(BrandEnums.OLO); + msg.setOperator(user.getNickName()); + msg.setOperatorTime(new Date()); + msg.setContent(contents); + log.info("推送工厂数据:{}", JSONUtil.toJsonStr(msg)); + factoryDataMessageSender.sendNodeDataByBrand(msg); + } + + + if (k.equals("志邦")) { + List orderList3 = orderMap.get(k); + + List ladingScanEntities = distributionBillLadingScanMapper.selectList(Wrappers.query().lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, Long.parseLong(s)) + .in(DistributionBillLadingScanEntity::getStockArticleId, orderList3.stream().map(DistributionStockArticleEntity::getId).collect(Collectors.toList())) + ); + List contents = new ArrayList<>(); + if (!ladingScanEntities.isEmpty()) { + for (DistributionBillLadingScanEntity ladingScanEntity : ladingScanEntities) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("packageCode", ladingScanEntity.getPacketBarCode()); + contents.add(jsonObject); + } + } + NodePushMsg msg = new NodePushMsg(); + msg.setNode(WorkNodeEnums.CLERK_REVIEW); + msg.setBrand(BrandEnums.ZB); + msg.setOperator(user.getNickName()); + msg.setOperatorTime(new Date()); + msg.setContent(contents); + log.info("推送工厂数据:{}", JSONUtil.toJsonStr(msg)); + factoryDataMessageSender.sendNodeDataByBrand(msg); + } + + + } catch (Exception e) { + log.error("推送工厂数据错误,当前工厂:{},异常:{}", k, e); + } + }); + } + } + + } + + } + + private List handlePushFactorySignforInfo(DistributionStockArticleEntity stockArticleEntity, String s) { + //其他品牌用","拼接 + String brand = "梦天"; + List list = Arrays.asList(brand.split(",")); + List mtReceiveContentDTOS = new ArrayList<>(); + if (list.isEmpty()) { + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + String next = iterator.next(); + if (stockArticleEntity.getBrand().contains(next)) { + //查询此订单所有签收信息 + List ladingScanEntities = distributionBillLadingScanMapper.selectList(Wrappers.query().lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, s) + .eq(DistributionBillLadingScanEntity::getStockArticleId, stockArticleEntity.getId()) + ); + //处理数据构建 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); + if (!ladingScanEntities.isEmpty()) { + for (DistributionBillLadingScanEntity ladingScanEntity : ladingScanEntities) { + MtReceiveContentDTO mtReceiveContentDTO = new MtReceiveContentDTO(); + mtReceiveContentDTO.setWarehouse(stockArticleEntity.getWarehouse()); + mtReceiveContentDTO.setOrderCode(stockArticleEntity.getOrderCode()); + mtReceiveContentDTO.setUnitNo(ladingScanEntity.getPacketBarCode()); + mtReceiveContentDTO.setOperateDate(simpleDateFormat.format(ladingScanEntity.getCreateTime())); + mtReceiveContentDTO.setWaybillNumber(stockArticleEntity.getWaybillNumber()); + } + } + } + } } + + return mtReceiveContentDTOS; } + private JSONObject handleLogJSONObject(BasicdataWarehouseEntity warehouse, BladeUser user, String orderPackageCode, String content, Integer node) { + JSONObject trunklinePackageTrackLog = new JSONObject(); + trunklinePackageTrackLog.put("tenantId", user.getTenantId()); + trunklinePackageTrackLog.put("createTime", new Date()); + trunklinePackageTrackLog.put("createUser", user.getUserId()); + trunklinePackageTrackLog.put("updateUser", user.getUserId()); + trunklinePackageTrackLog.put("updateTime", new Date()); + trunklinePackageTrackLog.put("isDeleted", 0); + trunklinePackageTrackLog.put("status", 1); + trunklinePackageTrackLog.put("createDept", warehouse.getDepartment()); + trunklinePackageTrackLog.put("orderPackageCode", orderPackageCode); + trunklinePackageTrackLog.put("warehouseId", warehouse.getId()); + trunklinePackageTrackLog.put("warehouseName", warehouse.getName()); + trunklinePackageTrackLog.put("workNode", node); + trunklinePackageTrackLog.put("content", content); + trunklinePackageTrackLog.put("operator", user.getNickName()); + return trunklinePackageTrackLog; + } } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryDetailsServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryDetailsServiceImpl.java index 23a0d3e48..21deac261 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryDetailsServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryDetailsServiceImpl.java @@ -120,4 +120,27 @@ public class DistributionDeliveryDetailsServiceImpl extends BaseServiceImpl getBillLadingDetailOrderInventoryExcel(Long id) { + List billOrderInventoryExcel = baseMapper.getBillLadingDetailOrderInventoryExcel(id); + for (DistributionBillInventoryExcel distributionBillInventoryExcel : billOrderInventoryExcel) { + if (ObjectUtils.isNotEmpty(distributionBillInventoryExcel.getStockStatus()) && distributionBillInventoryExcel.getStockStatus()==1){ + distributionBillInventoryExcel.setStockStatusName(DeliveryStockStatuConstant.daibeihuo.getName()); + }else if (ObjectUtils.isNotEmpty(distributionBillInventoryExcel.getStockStatus()) && distributionBillInventoryExcel.getStockStatus()==2){ + distributionBillInventoryExcel.setStockStatusName(DeliveryStockStatuConstant.beihuozong.getName()); + }else if (ObjectUtils.isNotEmpty(distributionBillInventoryExcel.getStockStatus()) && distributionBillInventoryExcel.getStockStatus()==3){ + distributionBillInventoryExcel.setStockStatusName(DeliveryStockStatuConstant.beihuowanceng.getName()); + } + + //不确定的字段 前端制为空 + if (ObjectUtils.isNotEmpty(distributionBillInventoryExcel.getPickupStatus()) && distributionBillInventoryExcel.getPickupStatus()==10){ + distributionBillInventoryExcel.setPickupStatusName("已提货"); + }else if (ObjectUtils.isNotEmpty(distributionBillInventoryExcel.getPickupStatus()) && distributionBillInventoryExcel.getPickupStatus()==20){ + distributionBillInventoryExcel.setPickupStatusName("未提货"); + } + + } + return billOrderInventoryExcel; + } } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryInfoServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryInfoServiceImpl.java index 2a9c71024..09f5ddf11 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryInfoServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryInfoServiceImpl.java @@ -17,6 +17,7 @@ package com.logpm.distribution.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -36,6 +37,7 @@ import com.logpm.distribution.wrapper.DistributionParcelListWrapper; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.common.constant.common.IsOrNoConstant; +import org.springblade.common.constant.loading.LoadScanSigningTypeStatusConstant; import org.springblade.common.constant.loading.LoadingStatusConstant; import org.springblade.common.constant.order.OrderStatusConstant; import org.springblade.common.constant.orderpackage.OrderPackageLoadingStatusConstant; @@ -80,6 +82,7 @@ public class DistributionDeliveryInfoServiceImpl extends BaseServiceImpl selectDistributionDeliveryInfoPage(IPage page, DistributionDeliveryInfoVO distributionDeliveryInfo) { List distributionDeliveryInfoVOS = baseMapper.selectDistributionDeliveryInfoPage(page, distributionDeliveryInfo); @@ -98,73 +101,160 @@ public class DistributionDeliveryInfoServiceImpl extends BaseServiceImpl selectDistributionDeliveryInfowrapPage(Map reservationPackageDTO, IPage page) { - if (Func.isEmpty(reservationPackageDTO.get("reservationId"))) { + // 参数非空校验 + if (reservationPackageDTO == null || page == null) { + throw new IllegalArgumentException("ReservationPackageDTO and page cannot be null"); + } + + // reservationId的数据类型转换安全性校验 + String reservationIdStr = (String) reservationPackageDTO.get("reservationId"); + if (Func.isEmpty(reservationIdStr)) { return null; } + long reservationId; + try { + reservationId = Long.parseLong(reservationIdStr); + } catch (NumberFormatException e) { + log.error("Invalid reservationId format: {}", reservationIdStr, e); + throw new IllegalArgumentException("Invalid reservationId format"); + } + // 逻辑保持不变,优化了数据类型转换的安全性检查 if (Func.isNotEmpty(reservationPackageDTO.get("orderPackageStatus"))) { String orderPackageStatus = (String) reservationPackageDTO.get("orderPackageStatus"); - if (Func.isNotBlank(orderPackageStatus)) { - if (!"70".equals(orderPackageStatus)) { - reservationPackageDTO.put("unSigning", "70"); - reservationPackageDTO.remove("orderPackageStatus"); - } + if (Func.isNotBlank(orderPackageStatus) && !"70".equals(orderPackageStatus)) { + reservationPackageDTO.put("unSigning", "70"); + reservationPackageDTO.remove("orderPackageStatus"); } } + List parcelListEntityList = baseMapper.selectDistributionDeliverywrapInfoPage(page, reservationPackageDTO); + + Set ids = new HashSet<>(); + Set orderPackageCodes = new HashSet<>(); + + for (DistributionParcelListEntity distributionParcelListEntity : parcelListEntityList) { + ids.add(distributionParcelListEntity.getId()); + orderPackageCodes.add(distributionParcelListEntity.getOrderPackageCode()); + } + List parcelListVOS = DistributionParcelListWrapper.build().listVO(parcelListEntityList); - parcelListVOS.forEach(p -> { - //查询扫描表, - DistributionLoadscanEntity loadscanEntity = distributionLoadscanService.getOne(Wrappers.query().lambda() - .eq(DistributionLoadscanEntity::getPackageId, p.getId()) - .eq(DistributionLoadscanEntity::getReservationId, Long.parseLong((String) reservationPackageDTO.get("reservationId"))) - .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) - .eq(DistributionLoadscanEntity::getOrderPackageCode, p.getOrderPackageCode()) - ); - if (Func.isNotEmpty(loadscanEntity)) { - try { - p.setLoadingTime(loadscanEntity.getScanTime()); - switch (loadscanEntity.getScanStatus()) { - case "1": - p.setScanStatus(LoadingStatusConstant.quxiao.getName()); - break; - case "2": - p.setScanStatus(LoadingStatusConstant.saomiao.getName()); - break; - case "3": - p.setScanStatus(LoadingStatusConstant.queren.getName()); - break; - case "4": - p.setScanStatus(LoadingStatusConstant.yijianzhuangche.getName()); - break; - case "5": - p.setScanStatus(LoadingStatusConstant.buluzhuangche.getName()); - break; - default: - log.info("selectDistributionDeliveryInfowrapPage >>>loadscanEntity.getScanStatus() 不满足匹配条件 {}",loadscanEntity.getScanStatus()); - break; - } - if (Func.isNotEmpty(loadscanEntity.getSigningTime())) { - p.setSigningTime(loadscanEntity.getSigningTime()); - } - if (Func.isNotEmpty(loadscanEntity.getScanUser())) { - p.setScanUser(loadscanEntity.getScanUser()); - } - if (Func.isNotEmpty(loadscanEntity.getDriverName())) { - p.setDriverName(loadscanEntity.getDriverName()); - } - if (Func.isNotEmpty(loadscanEntity.getSigningUser())) { - p.setSigningUser(loadscanEntity.getSigningUser()); - } - } catch (Exception e) { - log.error(">>> 系统异常",e); - throw new CustomerException("系统异常,请联系管理员"); - } - } - }); + + LambdaQueryWrapper loadscanEntityWrapper = new LambdaQueryWrapper<>(); + loadscanEntityWrapper.eq(DistributionLoadscanEntity::getReservationId, reservationId); + if (!ids.isEmpty()) { + loadscanEntityWrapper.in(DistributionLoadscanEntity::getPackageId, ids); + } + if (!orderPackageCodes.isEmpty()) { + loadscanEntityWrapper.in(DistributionLoadscanEntity::getOrderPackageCode, orderPackageCodes); + } + loadscanEntityWrapper.ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()); + + + // 保持不变,优化性能需要注意的是ids和orderPackageCodes的处理 + List loadscanEntitys = distributionLoadscanService.list(loadscanEntityWrapper); + + // 对加载的VO列表进行处理的逻辑抽取到一个独立的方法 + processParcelListVOS(parcelListVOS, loadscanEntitys, reservationIdStr); + return page.setRecords(parcelListVOS); } + private void processParcelListVOS(List parcelListVOS, List loadscanEntitys, String reservationIdStr) { + parcelListVOS.forEach(p -> { + DistributionLoadscanEntity loadscanEntity = getLoadscanEntity(loadscanEntitys, p); + if (Func.isNotEmpty(loadscanEntity)) { + try { + updateParcelStatus(p, loadscanEntity); + } catch (Exception e) { + log.error("Processing parcel failed for reservationId: {}, Error: {}", reservationIdStr, e.getMessage(), e); + throw new CustomerException("Processing parcel failed. Please contact administrator"); + } + } + }); + } + + private void updateParcelStatus(DistributionParcelListVO parcel, DistributionLoadscanEntity loadscanEntity) { + parcel.setLoadingTime(loadscanEntity.getScanTime()); + switch (loadscanEntity.getScanStatus()) { + case "1": + parcel.setScanStatus(LoadingStatusConstant.quxiao.getName()); + break; + case "2": + parcel.setScanStatus(LoadingStatusConstant.saomiao.getName()); + break; + case "3": + parcel.setScanStatus(LoadingStatusConstant.queren.getName()); + break; + case "4": + parcel.setScanStatus(LoadingStatusConstant.yijianzhuangche.getName()); + break; + case "5": + parcel.setScanStatus(LoadingStatusConstant.buluzhuangche.getName()); + break; + default: + log.info("loadscanEntity.getScanStatus() does not meet matching conditions: {}", loadscanEntity.getScanStatus()); + break; + } + if (Func.isEmpty(loadscanEntity.getIsSignfor())) { + switch (loadscanEntity.getScanStatus()) { + case "1": + parcel.setScanStatus(LoadingStatusConstant.quxiao.getName()); + break; + case "2": + parcel.setScanStatus(LoadingStatusConstant.saomiao.getName()); + break; + case "3": + parcel.setScanStatus(LoadingStatusConstant.queren.getName()); + break; + default: + log.info("loadscanEntity.getIsSignfor() does not meet matching conditions: {}", loadscanEntity.getScanStatus()); + break; + } + } + + if (Func.isNotEmpty(loadscanEntity.getSigningTime())) { + parcel.setSigningTime(loadscanEntity.getSigningTime()); + } + if (Func.isNotEmpty(loadscanEntity.getScanUser())) { + parcel.setScanUser(loadscanEntity.getScanUser()); + } + if (Func.isNotEmpty(loadscanEntity.getDriverName())) { + parcel.setDriverName(loadscanEntity.getDriverName()); + } + if (Func.isNotEmpty(loadscanEntity.getSigningUser())) { + parcel.setSigningUser(loadscanEntity.getSigningUser()); + } + if (Func.isNotEmpty(loadscanEntity.getSignforType())) { + switch (loadscanEntity.getSignforType()) { + case 1: + parcel.setSigningType(LoadScanSigningTypeStatusConstant.sijiqianshou.getName()); + break; + case 2: + parcel.setSigningType(LoadScanSigningTypeStatusConstant.sijipiliangqianshou.getName()); + break; + case 3: + parcel.setSigningType(LoadScanSigningTypeStatusConstant.wenyuanpiliangqianshou.getName()); + break; + default: + log.info("loadscanEntity.getSignforType() does not meet matching conditions: {}", loadscanEntity.getSignforType()); + break; + } + } + + } + + + private DistributionLoadscanEntity getLoadscanEntity(List loadscanEntitys, DistributionParcelListVO p) { + for (DistributionLoadscanEntity loadscanEntity : loadscanEntitys) { + if (loadscanEntity.getPackageId().equals(p.getId()) && loadscanEntity.getOrderPackageCode().equals(p.getOrderPackageCode())) { + return loadscanEntity; + } + } + return null; + + } + @Override public IPage selectDistributionDeliveryInfopackdetail(IPage page, DistributionDeliveryInfoDTO distributionDeliveryInfoDTO) { List distributionDeliveryInfoVOS = baseMapper.selectDistributionDeliverypackdetailPage(page, distributionDeliveryInfoDTO); @@ -188,6 +278,7 @@ public class DistributionDeliveryInfoServiceImpl extends BaseServiceImpl distributionDeliveryInfoVOS = baseMapper.selectDistributionDeliveryOrderPage(page, distributionStockArticle); List loadList = distributionLoadscanService.list(Wrappers.query().lambda() .eq(DistributionLoadscanEntity::getDeliveryId, distributionStockArticle.get("deliveryId")) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) ); Map> orderLoadMap; if (!Objects.isNull(loadList)) { @@ -228,7 +319,7 @@ public class DistributionDeliveryInfoServiceImpl extends BaseServiceImpl distributionDeliveryInfoVOS = baseMapper.selectDistributionDeliveryOrderPageByDeliveryId(Long.parseLong(deliveryId)); List loadList = distributionLoadscanService.list(Wrappers.query().lambda() .eq(DistributionLoadscanEntity::getDeliveryId, distributionStockArticle.get("deliveryId")) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) ); Map> orderLoadMap; if (!Objects.isNull(loadList)) { @@ -289,7 +381,7 @@ public class DistributionDeliveryInfoServiceImpl extends BaseServiceImpl stockArticleVOS = distributionReservationMapper.selectOrderInfoByReservationId(reservationId); @@ -336,7 +428,7 @@ public class DistributionDeliveryInfoServiceImpl extends BaseServiceImpl k2)); } if (ord.getIsZero().equals(IsOrNoConstant.no.getValue())) { - List parcelListEntities = distributionReservationMapper.selectPackageByReservationAndStockArticle(reservationId, ord.getId(),myCurrentWarehouse.getId()); + List parcelListEntities = distributionReservationMapper.selectPackageByReservationAndStockArticle(reservationId, ord.getId(), myCurrentWarehouse.getId()); List ks = new ArrayList<>(); AtomicInteger atomicInteger = new AtomicInteger(); // 装车数量 @@ -345,8 +437,8 @@ public class DistributionDeliveryInfoServiceImpl extends BaseServiceImpl selectDistributionAppDeliveryInventory(DistributionAppDeliveryListDTO distributionAppDeliveryListDTO) { List inventoryList = distributionReservationMapper.selectInventoryListByReservation(Long.parseLong(distributionAppDeliveryListDTO.getReservationId())); if (Func.isEmpty(inventoryList)) { - log.error("##########查询该客户库存品信息为null"); + log.warn("##########查询该客户库存品信息为null"); return null; } List stockListIds = inventoryList.stream().map(DisStockListDetailEntity::getStockListId).distinct().collect(Collectors.toList()); @@ -589,13 +681,12 @@ public class DistributionDeliveryInfoServiceImpl extends BaseServiceImpl getReservationPackageList(Map reservationPackageDTO, IPage page) { String method = "DistributionDeliveryInfoServiceImpl类,getReservationPackageList方法"; - if (Func.isEmpty(reservationPackageDTO.get("reservationId"))){ + if (Func.isEmpty(reservationPackageDTO.get("reservationId"))) { //参数缺失 - log.error(method+"reservationId参数缺失"); + log.error(method + "reservationId参数缺失"); return null; } - IPage reservationInventoryPackageVOIPage = distributionReservationMapper.selectInvenToryPackageByReservationInfo(reservationPackageDTO,page); - + IPage reservationInventoryPackageVOIPage = distributionReservationMapper.selectInvenToryPackageByReservationInfo(reservationPackageDTO, page); return reservationInventoryPackageVOIPage; @@ -605,13 +696,13 @@ public class DistributionDeliveryInfoServiceImpl extends BaseServiceImpl getReservationZeroPackageList(Map reservationPackageDTO, IPage page) { String method = "DistributionDeliveryInfoServiceImpl类,getReservationPackageList方法"; - if (Func.isEmpty(reservationPackageDTO.get("reservationId"))){ + if (Func.isEmpty(reservationPackageDTO.get("reservationId"))) { //参数缺失 - log.error(method+"reservationId参数缺失"); + log.error(method + "reservationId参数缺失"); return null; } - IPage reservationInventoryPackageVOIPage = distributionReservationMapper.selectZeroPackageByReservationInfo(reservationPackageDTO,page); - return reservationInventoryPackageVOIPage; + IPage reservationInventoryPackageVOIPage = distributionReservationMapper.selectZeroPackageByReservationInfo(reservationPackageDTO, page); + return reservationInventoryPackageVOIPage; } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryListServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryListServiceImpl.java index 7a8674c72..5da777f39 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryListServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryListServiceImpl.java @@ -16,7 +16,9 @@ */ package com.logpm.distribution.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -47,15 +49,20 @@ import com.logpm.distribution.vo.app.DistributionAppParcelListVO; import com.logpm.distribution.vo.app.DistributionAppReservationVO; import com.logpm.distribution.vo.print.PrintPreviewVO; import com.logpm.distribution.wrapper.*; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.util.FactoryDataMessageSender; +import com.logpm.factorydata.vo.NodePushMsg; +import com.logpm.factorydata.vo.PushData; +import com.logpm.trunkline.feign.ITrunklinePackageTrackLogClient; +import com.logpm.warehouse.entity.WarehouseRetentionRecordEntity; +import com.logpm.warehouse.entity.WarehouseRetentionScanEntity; import com.logpm.warehouse.entity.WarehouseTrayGoodsEntity; import com.logpm.warehouse.entity.WarehouseWaybillEntity; -import com.logpm.warehouse.feign.IWarehouseTrayGoodsClient; -import com.logpm.warehouse.feign.IWarehouseTrayTypeClient; -import com.logpm.warehouse.feign.IWarehouseUpdownTypeClient; -import com.logpm.warehouse.feign.IWarehouseWaybillClient; +import com.logpm.warehouse.feign.*; import com.logpm.warehouse.vo.TrayTypeDataVO; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang.StringUtils; +import org.apache.logging.log4j.util.Strings; import org.jetbrains.annotations.NotNull; import org.springblade.common.constant.DistributionTypeConstant; import org.springblade.common.constant.Inventory.InventoryLoadingStatusConstant; @@ -63,13 +70,11 @@ import org.springblade.common.constant.Inventory.InventorySigningStatusConstant; import org.springblade.common.constant.Inventory.InventoryStockUpStatusConstant; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.common.constant.RabbitConstant; +import org.springblade.common.constant.WorkNodeEnums; import org.springblade.common.constant.common.IsOrNoConstant; import org.springblade.common.constant.delivery.DeliveryLoadingStatusConstant; import org.springblade.common.constant.delivery.DeliveryStatusConstant; -import org.springblade.common.constant.loading.LoadScanSigningStatusConstant; -import org.springblade.common.constant.loading.LoadingAbnormalAuditingStatusConstant; -import org.springblade.common.constant.loading.LoadingIsInsertConstant; -import org.springblade.common.constant.loading.LoadingStatusConstant; +import org.springblade.common.constant.loading.*; import org.springblade.common.constant.order.OrderStatusConstant; import org.springblade.common.constant.orderpackage.*; import org.springblade.common.constant.printTemplate.PrintTemplateStatusConstant; @@ -81,6 +86,7 @@ import org.springblade.common.exception.CustomerException; import org.springblade.common.serviceConstant.ServiceConstant; import org.springblade.common.utils.CommonUtil; import org.springblade.common.utils.QRCodeUtil; +import org.springblade.common.utils.StringSplitUtil; import org.springblade.common.utils.TemplateUtil; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; @@ -93,7 +99,9 @@ import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.ObjectUtil; import org.springblade.system.cache.DictBizCache; +import org.springblade.system.entity.User; import org.springblade.system.feign.IDictBizClient; +import org.springblade.system.feign.IUserClient; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -230,6 +238,31 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl myWatchWarehouse = warehouseClient.getMyWatchWarehouse(); - List collect = myWatchWarehouse.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); - distributionDeliveryList.setWarehouseIdList(collect); + if (!Func.isEmpty(distributionDeliveryList.getTrainNumbers())) { + List strings = StringSplitUtil.StringSplitToList(distributionDeliveryList.getTrainNumbers()); + if (!strings.isEmpty()) { + distributionDeliveryList.setTrainNumberList(strings); + } + } + + + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if (Func.isEmpty(myCurrentWarehouse)) { + List warehouseList = warehouseClient.getMyWarehouseList(); + if (!warehouseList.isEmpty()) { + List collect = warehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + distributionDeliveryList.setWarehouseIdList(collect); + } + } else { + List ids = new ArrayList<>(); + ids.add(myCurrentWarehouse.getId()); + distributionDeliveryList.setWarehouseIdList(ids); + } List distributionDeliveryListEntities = baseMapper.selectDistributionDeliveryListPage(page, distributionDeliveryList); return page.setRecords(distributionDeliveryListEntities); @@ -259,37 +309,30 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl exportDistributionDeliveryList(Map distributionDeliveryList) { - - if (Func.isNotEmpty(distributionDeliveryList.get("ids"))){ + if (Func.isNotEmpty(distributionDeliveryList.get("ids"))) { //进行勾选操作 List deliveryId = Func.toLongList((String) distributionDeliveryList.get("ids")); - distributionDeliveryList.put("ids",deliveryId); - } - - - - List list = new ArrayList<>(); - List distributionDeliveryListVOS = baseMapper.exportDistributionDeliveryList(distributionDeliveryList); - distributionDeliveryListVOS.forEach(dis -> { - DistributionDeliveryListExcel deliveryListExcel = Func.copy(dis, DistributionDeliveryListExcel.class); - deliveryListExcel.setKind(dis.getKindName()); - deliveryListExcel.setDriver(dis.getDriverName()); - deliveryListExcel.setVehicle(dis.getVehicleNum()); - deliveryListExcel.setType(dis.getDeliveryTypeName()); - deliveryListExcel.setState(dis.getDeliveryStatusName()); - deliveryListExcel.setCustomersNumber(dis.getCustomersNumber()); - deliveryListExcel.setOrderNumber(dis.getOrderNumber()); - deliveryListExcel.setDeliveryNumber(dis.getDeliveryNumber()); - deliveryListExcel.setInventoryNub(dis.getInventoryNub()); - deliveryListExcel.setCustomersNumber(dis.getScannedNumber()); - deliveryListExcel.setScannedNumber(dis.getScannedNumber()); - deliveryListExcel.setSigningNumber(dis.getSigningNumber()); - deliveryListExcel.setLoadingTeam(dis.getHandlingCrew()); - BasicdataWarehouseEntity entityWarehouseId = warehouseClient.getEntityWarehouseId(dis.getWarehouseId()); - deliveryListExcel.setWarehouseName(entityWarehouseId.getName()); - list.add(deliveryListExcel); - }); - return list; + if (!deliveryId.isEmpty()) { + distributionDeliveryList.put("ids", deliveryId); + } + } else { + distributionDeliveryList.remove("ids"); + } + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if (Func.isEmpty(myCurrentWarehouse)) { + //未选择仓库查看当前登录人可以进行操作的仓库 + List warehouseList = warehouseClient.getMyWarehouseList(); + if (!warehouseList.isEmpty()) { + List ids = warehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + distributionDeliveryList.put("warehouseIds", ids); + } + } else { + List ids = new ArrayList<>(); + ids.add(myCurrentWarehouse.getId()); + distributionDeliveryList.put("warehouseIds", ids); + } + List distributionDeliveryListExcels = baseMapper.exportDistributionDeliveryList(distributionDeliveryList); + return distributionDeliveryListExcels; } @Override @@ -297,13 +340,6 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl stripList = distributionDeliveryInfoMapper.selectStripList(detail.getId()); - //distributionDeliveryListVO.setPackadeList(stripList); - //装车件数 - //Integer sum = distributionSignforMapper.selectloadNub(distributionDeliveryListVO.getId()); - // distributionDeliveryListVO.setLoadNub(sum); - // if (detail.getSource() == 1) { //查询客户信息 List customList = distributionDeliveryInfoMapper.selectcustomList(detail.getId()); if (!customList.isEmpty()) { @@ -342,23 +378,23 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl deliverySelfServices = distributionDeliverySelfService.list(Wrappers.query().lambda().eq(DistributionDeliverySelfEntity::getDeliveryId, distributionDeliveryListVO.getId()).eq(DistributionDeliverySelfEntity::getIsMaster, 2)); - if(!deliverySelfServices.isEmpty()){ + if (!deliverySelfServices.isEmpty()) { StringBuffer sb1 = new StringBuffer(); StringBuffer sb2 = new StringBuffer(); StringBuffer sb3 = new StringBuffer(); - deliverySelfServices.forEach(t->{ - if(!sb1.toString().isEmpty()){ + deliverySelfServices.forEach(t -> { + if (!sb1.toString().isEmpty()) { sb1.append("/"); } sb1.append(t.getDriverName()); - if(!sb2.toString().isEmpty()){ + if (!sb2.toString().isEmpty()) { sb2.append("/"); } sb2.append(t.getDriverPhone()); - if(!sb3.toString().isEmpty()){ + if (!sb3.toString().isEmpty()) { sb3.append("/"); } sb3.append(t.getVehicleNub()); @@ -408,9 +444,9 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl packageLockIds = new ArrayList<>(); + List jsonObjects = new ArrayList<>(); + List aaa = new ArrayList<>(); + List orderPackageCodes = new ArrayList<>(); + DistributionDeliverySelfEntity distributionDeliverySelfEntity = new DistributionDeliverySelfEntity(); if ("1".equals(distributionDeliveryListEntity.getKind())) { if (!Objects.isNull(distrilbutionloadingscanDTO.getLoadingId())) { @@ -599,6 +641,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl pushList = new ArrayList<>(); if (distrilbutionloadingscanDTO.getType() == 1) { List list = disStockListDetailService.list(Wrappers.query().lambda() .eq(DisStockListDetailEntity::getStockPackageCode, distrilbutionloadingscanDTO.getBarcode()) @@ -615,20 +658,49 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl abnormalEntities = distributionLoadscanAbnormalService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanAbnormalEntity::getPackageCode, distrilbutionloadingscanDTO.getBarcode()) + .eq(DistributionLoadscanAbnormalEntity::getPackageId, parcelList.getId()) + ); - if (!Objects.isNull(parcelList)) { - if (OrderPackageLoadingStatusConstant.yizhuangche.getValue().equals(parcelList.getOrderPackageLoadingStatus())) { - return Resp.scanFail("包件已装车", "包件已装车"); + if (!abnormalEntities.isEmpty()) { + //判断异常是否属于自身 + boolean flag = abnormalEntities.stream().allMatch(a -> !distributionDeliveryListEntity.getId().equals(a.getDeliveryListId()) || !distrilbutionloadingscanDTO.getReservationId().equals(a.getReservationId())); + if (flag) { + //该异常属于其他车次 + String collect = abnormalEntities.stream().map(DistributionLoadscanAbnormalEntity::getTrainNumber).collect(Collectors.joining(",")); + log.info("包件已在其他车次存在异常 >>>>当前车次:{},其他车次:{}", distributionDeliveryListEntity.getTrainNumber(), collect); + return Resp.scanFail("包件已在其他车次存在异常", "包件已在其他车次存在异常"); + } else { + //这里需要判定文员是否对该异常进行驳回操作 + List collect = abnormalEntities.stream().filter(f -> distributionDeliveryListEntity.getId().equals(f.getDeliveryListId()) && distrilbutionloadingscanDTO.getReservationId().equals(f.getReservationId())).collect(Collectors.toList()); + if (!collect.isEmpty()) { + //存在异常操作 + if (collect.size() == 1) { + //判断是否进行审核以及驳货操作 + DistributionLoadscanAbnormalEntity distributionLoadscanAbnormalEntity = collect.get(0); + if (distributionLoadscanAbnormalEntity.getAuditingStatus().equals(3)) { + return Resp.scanFail("包件异常已驳回,请扫滞留", "包件异常已驳回,请扫滞留"); + } + } + } } } + + List distributionParcelListEntities = distributionDeliveryListMapper.selectPackageListByDeliveryListId(distrilbutionloadingscanDTO.getDeliveryId()); if (Func.isNotEmpty(distrilbutionloadingscanDTO.getReservationId())) { //在客户列表进行装车 @@ -663,6 +735,8 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl info = new HashMap<>(); + info.put("orderPackageCode", parcelListEntity.getOrderPackageCode()); + info.put("warehouseId", myCurrentWarehouse.getId()); + warehouseUpdownTypeClient.downPackageAndDelTrayAndIsUpdate(parcelListEntity.getOrderPackageCode(), myCurrentWarehouse.getId(), "扫描装车进行下架、解托", false); Map map = new HashMap(); String distrilbutionloadingscanDTOJson = JSONObject.toJSONString(distrilbutionloadingscanDTO); @@ -701,66 +780,107 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl>>>>>>>>>>>> 进入延迟队列处理包件相关信息状态"); rabbitTemplate.convertAndSend(RabbitConstant.ORDER_PACKAGE_STATUS_INFO_EXCHANGE, RabbitConstant.ORDER_PACKAGE_STATUS_INFO_ROUTING, map, message -> { message.getMessageProperties() .setHeader("x-delay", 3000); return message; }); + String content = "包件在" + myCurrentWarehouse.getName() + "由" + loadscanEntity.getScanUser() + "扫描装车,配送车次号:" + distributionDeliveryListEntity.getTrainNumber() + "预约任务号:" + reservationEntity.getReservationCode(); + JSONObject trunklinePackageTrackLog = handleLogJSONObject(myCurrentWarehouse, AuthUtil.getUser(), parcelListEntity.getOrderPackageCode(), content, WorkNodeEnums.DISTRIBUTION_LOADING.getCode()); + aaa.add(trunklinePackageTrackLog); + orderPackageCodes.add(loadscanEntity.getOrderPackageCode()); + + pushList.add(parcelListEntity); - //extracteOrderPackageStatus(distrilbutionloadingscanDTO, parcelListEntity, myCurrentWarehouse, reservationEntity); +// extracteOrderPackageStatus(distrilbutionloadingscanDTO, parcelListEntity, myCurrentWarehouse, reservationEntity); } else if (parcelListEntityList.isEmpty()) { + + //查找出该包件信息 - DistributionParcelListEntity parcelListEntity = distributionParcelListService.getOne(Wrappers.query().lambda().eq(DistributionParcelListEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode())); - List reservationEntityList = distributionDeliveryListMapper.selectReservationByDeliveryListId(distrilbutionloadingscanDTO.getDeliveryId()); - boolean shangpeiFlag = reservationEntityList.stream().allMatch(r -> r.getDeliveryType().equals(DistributionTypeConstant.shipie.getValue())); - if (Func.isEmpty(parcelListEntity)) { - return Resp.scanFail("无包件信息", "无包件信息"); - } - DistributionStockArticleEntity stockArticleEntity = distributionStockArticleMapper.selectById(parcelListEntity.getStockArticleId()); - if (shangpeiFlag) { - List reservationEntities = reservationEntityList.stream().filter(r -> Func.isNotEmpty(r.getConsignee()) && r.getConsignee().equals(stockArticleEntity.getCustomerName()) && r.getDeliveryAddress().equals(stockArticleEntity.getCustomerAddress()) && r.getDeliveryPhone().equals(stockArticleEntity.getCustomerTelephone()) && r.getMallName().equals(stockArticleEntity.getMallName())).collect(Collectors.toList()); - //查看是否存在满足条件的预约单 - if (reservationEntities.size() == 1) { - if (Func.isEmpty(distrilbutionloadingscanDTO.getReservationId())) { - log.info("异常装车未指定客户"); - return Resp.scanFail("请指定客户进行异常装车", "请指定客户进行异常装车"); - } - return R.fail(5000, "异常装车"); -// return Resp.scanFail("装车失败","程序出错,请联系彪桑"); - } else { - if (parcelListEntity.getConditions() == 2) { - return Resp.scanFail("此包件不是订制品", "此包件不是订制品"); + DistributionParcelListEntity parcelListEntity = distributionParcelListService.getOne(Wrappers.query().lambda().eq(DistributionParcelListEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode()).eq(DistributionParcelListEntity::getWarehouseId, myCurrentWarehouse.getId())); - } else { - return Resp.scanFail("窜货", "窜货"); + List isMayList = distributionLoadscanAbnormalService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanAbnormalEntity::getPackageCode, distrilbutionloadingscanDTO.getBarcode()) + .eq(DistributionLoadscanAbnormalEntity::getPackageId, parcelListEntity.getId()) + //修改 状态 + ); + if (!isMayList.isEmpty()) { + //这里需要判定文员是否对该异常进行驳回操作 + List LoadscanAbnormalEntityList = isMayList.stream().filter(f -> distributionDeliveryListEntity.getId().equals(f.getDeliveryListId()) && distrilbutionloadingscanDTO.getReservationId().equals(f.getReservationId())).collect(Collectors.toList()); + if (!LoadscanAbnormalEntityList.isEmpty()) { + //存在异常操作 + if (LoadscanAbnormalEntityList.size() == 1) { + //判断是否进行审核以及驳货操作 + DistributionLoadscanAbnormalEntity distributionLoadscanAbnormalEntity = LoadscanAbnormalEntityList.get(0); + if (distributionLoadscanAbnormalEntity.getAuditingStatus().equals(3)) { + return Resp.scanFail("包件异常已驳回,请滞留回库", "包件异常已驳回,请滞留回库"); + } } } - } else { - shangpeiFlag = reservationEntityList.stream().allMatch(r -> r.getDeliveryType().equals(DistributionTypeConstant.shangpei.getValue())); + } + List reservationEntityList = distributionDeliveryListMapper.selectReservationByDeliveryListId(distrilbutionloadingscanDTO.getDeliveryId()); + if (!reservationEntityList.isEmpty()) { + boolean shangpeiFlag = reservationEntityList.stream().allMatch(r -> r.getDeliveryType().equals(DistributionTypeConstant.shipie.getValue())); + if (Func.isEmpty(parcelListEntity)) { + return Resp.scanFail("无包件信息", "无包件信息"); + } + DistributionStockArticleEntity stockArticleEntity = distributionStockArticleMapper.selectById(parcelListEntity.getStockArticleId()); if (shangpeiFlag) { - List reservationEntities = reservationEntityList.stream().filter(r -> r.getReceivingUnit().equals(stockArticleEntity.getConsigneeUnit()) && r.getMallName().equals(stockArticleEntity.getMallName())).collect(Collectors.toList()); - //查询是否满足商配异常装车 - boolean flag = reservationEntityList.stream().anyMatch(r -> r.getReceivingUnit().equals(stockArticleEntity.getConsigneeUnit()) && r.getMallName().equals(stockArticleEntity.getMallName())); - if (reservationEntities.size() == 1) { - if (Func.isEmpty(distrilbutionloadingscanDTO.getReservationId())) { - log.info("异常装车未指定客户"); - return Resp.scanFail("请指定客户进行异常装车", "请指定客户进行异常装车"); - } + List reservationEntities = reservationEntityList.stream().filter(r -> Func.isNotEmpty(r.getConsignee()) && r.getConsignee().equals(stockArticleEntity.getCustomerName()) && r.getDeliveryAddress().equals(stockArticleEntity.getCustomerAddress()) && r.getDeliveryPhone().equals(stockArticleEntity.getCustomerTelephone()) && r.getMallName().equals(stockArticleEntity.getMallName()) && r.getId().equals(distrilbutionloadingscanDTO.getReservationId())).collect(Collectors.toList()); + //查看是否存在满足条件的预约单 + boolean flag = reservationEntityList.stream().anyMatch(r -> Func.isNotEmpty(r.getConsignee()) && r.getConsignee().equals(stockArticleEntity.getCustomerName()) && r.getDeliveryAddress().equals(stockArticleEntity.getCustomerAddress()) && r.getDeliveryPhone().equals(stockArticleEntity.getCustomerTelephone()) && r.getMallName().equals(stockArticleEntity.getMallName()) && r.getId().equals(distrilbutionloadingscanDTO.getReservationId())); + + //存在多个,操作人指定具体客户即可 + if (reservationEntities.size() == 1 && flag) { return R.fail(5000, "异常装车"); } else { - return Resp.scanFail("窜货", "窜货"); + if (flag) { + if (reservationEntities.isEmpty()) { + return Resp.scanFail("请指定客户进行异常装车", "请指定客户进行异常装车"); + } + } else { + return Resp.scanFail("窜货", "窜货"); + } } } else { - log.error("配送计划预约类型错误:{}", reservationEntityList); + shangpeiFlag = reservationEntityList.stream().allMatch(r -> r.getDeliveryType().equals(DistributionTypeConstant.shangpei.getValue())); + if (shangpeiFlag) { + List reservationEntities = reservationEntityList.stream().filter(r -> r.getReceivingUnit().equals(stockArticleEntity.getConsigneeUnit()) && r.getMallName().equals(stockArticleEntity.getMallName()) && r.getId().equals(distrilbutionloadingscanDTO.getReservationId())).collect(Collectors.toList()); + //查询是否满足商配异常装车 + boolean flag = reservationEntityList.stream().anyMatch(r -> r.getReceivingUnit().equals(stockArticleEntity.getConsigneeUnit()) && r.getMallName().equals(stockArticleEntity.getMallName())); + if (reservationEntities.size() == 1 && flag) { + return R.fail(5000, "异常装车"); + + } else { + if (flag) { + if (reservationEntities.isEmpty()) { + return Resp.scanFail("请指定客户进行异常装车", "请指定客户进行异常装车"); + } + } else { + return Resp.scanFail("窜货", "窜货"); + + } + } + } else { + log.error("配送计划预约类型错误:{}", reservationEntityList); + } } } + + log.info("异常装车判定成功>>>>>>packageCode:{},reservationId:{}", distrilbutionloadingscanDTO.getBarcode(), distrilbutionloadingscanDTO.getReservationId()); } } else if (distrilbutionloadingscanDTO.getType() == 2) { log.info("#########!!!!!!!!!!!!!!!!!--------- 000000000 type={}", distrilbutionloadingscanDTO.getType()); @@ -791,10 +911,10 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl parcelListEntityList = distributionReservationMapper.selectPackageListByReservationId(distrilbutionloadingscanDTO.getReservationId()); Map parcelListEntityMap = parcelListEntityList.stream().collect(Collectors.toMap(DistributionParcelListEntity::getId, Function.identity(), (k1, k2) -> k2)); boolean reservationFlag = parcelListEntities.stream().allMatch(p -> Func.isNotEmpty(parcelListEntityMap.get(p.getId()))); log.info("#########!!!!!!!!!!!!!!!!!--------- 6666666666 reservationFlag={}", reservationFlag); @@ -805,15 +925,15 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl reservationLoadscanEntities = new ArrayList<>(); List orderCodes = new ArrayList<>(); - List orderPackageCodes = new ArrayList<>(); for (DistributionParcelListEntity parcelListEntity : parcelListEntities) { log.info("#########!!!!!!!!!!!!!!!!!--------- 88888888888 parcelListEntities={}", parcelListEntities); if (parcelListEntity.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue())) { parcelListEntity.setOrderPackageLoadingStatus(OrderPackageLoadingStatusConstant.yizhuangche.getValue()); parcelListEntity.setOrderPackageStatus(OrderPackageStatusConstant.yichuku.getValue()); - distributionParcelListService.updateById(parcelListEntity); +// distributionParcelListService.updateById(parcelListEntity); DistributionLoadscanEntity loadscanEntity = new DistributionLoadscanEntity(); log.info("#########!!!!!!!!!!!!!!!!!--------- 77777777777 distributionDeliverySelfEntity={}", distributionDeliverySelfEntity); if (Func.isNotEmpty(distributionDeliverySelfEntity.getDeliveryId())) { @@ -860,8 +980,22 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl map = new HashMap<>(); - map.put("orderPackageCode",orderPackages); - map.put("warehouseId",myCurrentWarehouse.getId()); + Map map = new HashMap<>(); + map.put("orderPackageCode", orderPackages); + map.put("warehouseId", myCurrentWarehouse.getId()); warehouseUpdownTypeClient.downDeliveryPackage(map); } //维护预约的信息 @@ -895,32 +1029,55 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl contents = new ArrayList<>(); + PushData pushData = PushData.builder() + .packageCode(parcelListEntity.getOrderPackageCode()) + .orderCode(parcelListEntity.getOrderCode()) + .warehouseName(myCurrentWarehouse.getName()) + .waybillNumber(parcelListEntity.getWaybillNumber()).build(); + contents.add(pushData); + NodePushMsg msg = new NodePushMsg(); + msg.setNode(WorkNodeEnums.DISTRIBUTION_LOADING); + msg.setBrand(BrandEnums.getByValue(parcelListEntity.getBrandName())); + msg.setOperator(AuthUtil.getNickName()); + msg.setOperatorTime(new Date()); + msg.setContent(contents); + log.info("推送工厂数据:{}", JSONUtil.toJsonStr(msg)); + factoryDataMessageSender.sendNodeDataByBrand(msg); + } + } //添加缓存 - if (!packageLockIds.isEmpty()){ + if (!packageLockIds.isEmpty()) { List a = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:"); - if (Func.isNotEmpty(a)){ + if (Func.isNotEmpty(a)) { boolean flag = a.stream().anyMatch(any -> packageLockIds.contains(any)); - if (flag){ + if (flag) { //正在操作,请稍后重试 throw new RuntimeException("该包件正在被操作,请稍后再试!!!"); - }else { + } else { packageLockIds.addAll(a); - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:",packageLockIds,60L); + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:", packageLockIds, 60L); } - }else { - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:" ,packageLockIds,60L); + } else { + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:", packageLockIds, 60L); } } + //备货库位下架 + log.info("备货库位下架>>>>>>>>>>>>>>>>>>>>>>jsonObjects:{}", jsonObjects); + warehouseUpdownStockUpAreaClient.downStockUpShelf(jsonObjects); //查询已装车件数 // String str = getLoadingMsg(distrilbutionloadingscanDTO); + trunklinePackageTrackLogClient.addPackageTrackLog(aaa); Integer carLaodNum = getCarLaodNum(distrilbutionloadingscanDTO.getDeliveryId()); - return Resp.scanSuccessWithData("装车成功", "装车" + carLaodNum + "件", carLaodNum); + return Resp.scanSuccessWithData("装车成功", carLaodNum + "件", carLaodNum); } private void extracteOrderPackageStatus(DistrilbutionloadingscanDTO distrilbutionloadingscanDTO, DistributionParcelListEntity parcelListEntity, BasicdataWarehouseEntity myCurrentWarehouse, DistributionReservationEntity reservationEntity) { - Map map = new HashMap<>(); - map.put("orderPackageCode",parcelListEntity.getOrderPackageCode()); + Map map = new HashMap<>(); + map.put("orderPackageCode", parcelListEntity.getOrderPackageCode()); map.put("warehouseId", myCurrentWarehouse.getId()); //包件配送下架 warehouseUpdownTypeClient.downDeliveryPackage(map); @@ -933,157 +1090,6 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl trayGoodIds = voGoodsLsit.stream().filter(v -> v.getAssociationType().equals("3")).map(WarehouseTrayGoodsEntity::getAssociationId).collect(Collectors.toList()); - //此时经过过滤后的包件ID和托盘上的所有包件ID数量一致,视为该托盘上的均为包件 -// if (voGoodsLsit.size() == trayGoodIds.size()) { -// List parcelListEntities = distributionParcelListService.listByIds(trayGoodIds); -//// if (trayLoadingStatus){ -//// return Resp.scanFail("托盘装车完毕","托盘货物已装车完毕"); -//// } -// -// if (Func.isNotEmpty(loadscanEntityList) && loadscanEntityList.size() > 0 && trayLoadingStatus) { -// return Resp.scanFail("重复扫描", "重复扫描"); -// } -// if (Func.isEmpty(parcelListEntities) || parcelListEntities.size() <= 0) { -// return Resp.scanFail("操作失败", "该托盘上无货物信息"); -// } -//// if (Func.isNotEmpty(distrilbutionloadingscanDTO.getReservationId())) { -//// //存在客户 这里就是针对客户进行的整托装车 -//// List parcelListEntityList = distributionReservationMapper.selectPackageListByReservationId(distrilbutionloadingscanDTO.getReservationId()); -//// Map parcelListEntityMap = parcelListEntityList.stream().collect(Collectors.toMap(DistributionParcelListEntity::getId, Function.identity(), (k1, k2) -> k2)); -//// boolean reservationFlag = parcelListEntities.stream().allMatch(p -> Func.isNotEmpty(parcelListEntityMap.get(p.getId()))); -//// if (reservationFlag) { -//// List reservationLoadscanEntities = new ArrayList<>(); -//// for (DistributionParcelListEntity parcelListEntity : parcelListEntities) { -//// if (parcelListEntity.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue())) { -//// parcelListEntity.setOrderPackageLoadingStatus(OrderPackageLoadingStatusConstant.yizhuangche.getValue()); -//// parcelListEntity.setOrderPackageStatus(OrderPackageStatusConstant.yichuku.getValue()); -//// distributionParcelListService.updateById(parcelListEntity); -//// DistributionLoadscanEntity loadscanEntity = new DistributionLoadscanEntity(); -//// if (Func.isNotEmpty(distributionDeliverySelfEntity.getDeliveryId())) { -//// loadscanEntity.setDriverId(distributionDeliverySelfEntity.getDriverId()); -//// } -//// if (Func.isNotEmpty(distributionDeliverySelfEntity.getDriverName())) { -//// loadscanEntity.setDriverName(distributionDeliverySelfEntity.getDriverName()); -//// } -//// if (Func.isNotEmpty(distributionDeliverySelfEntity.getVehicleNub())) { -//// loadscanEntity.setVehicleName(distributionDeliverySelfEntity.getVehicleNub()); -//// } -//// if (Func.isNotEmpty(distributionDeliverySelfEntity.getVehicleId())) { -//// loadscanEntity.setVehicleId(distributionDeliverySelfEntity.getVehicleId()); -//// } -//// if (Func.isNotEmpty(distributionDeliverySelfEntity.getDriverPhone())) { -//// loadscanEntity.setDriverPhone(distributionDeliverySelfEntity.getDriverPhone()); -//// } -//// loadscanEntity.setOrderId(parcelListEntity.getStockArticleId()); -//// loadscanEntity.setOrderPackageCode(parcelListEntity.getOrderPackageCode()); -//// loadscanEntity.setReservationId(distrilbutionloadingscanDTO.getReservationId()); -//// loadscanEntity.setDeliveryId(distrilbutionloadingscanDTO.getDeliveryId()); -//// loadscanEntity.setTrainNumber(distributionDeliveryListEntity.getTrainNumber()); -//// loadscanEntity.setPackageNub(parcelListEntity.getQuantity()); -//// loadscanEntity.setPackageId(parcelListEntity.getId()); -//// loadscanEntity.setScanTime(new Date()); -//// BladeUser user = AuthUtil.getUser(); -//// loadscanEntity.setScanUser(user.getUserName()); -//// loadscanEntity.setLoadingId(distrilbutionloadingscanDTO.getLoadingId()); -//// loadscanEntity.setOneClick(1); -//// loadscanEntity.setScanType("2"); -//// loadscanEntity.setScanStatus("1"); -//// loadscanEntity.setIsInsert(1); -//// loadscanEntity.setMsg("司机按照预约整托装车"); -//// loadscanEntity.setTrayNo(trayTypeDataVO.getTrayCode()); -//// reservationLoadscanEntities.add(loadscanEntity); -//// Integer i = distributionDeliveryListMapper.updateloadingTimeById(distrilbutionloadingscanDTO.getDeliveryId()); -//// //更新签收表的装车数量 -//// Integer j = distributionSignforMapper.updateloadByReservationId(loadscanEntity.getDeliveryId(), loadscanEntity.getReservationId(), loadscanEntity.getPackageNub()); -////// loadingNum.getAndAdd(loadscanEntity.getPackageNub()); -//// } -//// } -////// str.append("预约客户整托装车"); -//// distributionLoadscanService.saveBatch(reservationLoadscanEntities); -//// //这里则进行整托装车的数据构建 -//// } else { -//// return Resp.scanFail("整托装车失败", "存在其他客户货物"); -//// } -//// } else { -//// //不存在客户 这里就是针对配送任务进行的整托装车 -//// List deliveryPackageList = distributionDeliveryListMapper.selectPackageListByDeliveryListId(distrilbutionloadingscanDTO.getDeliveryId()); -//// Map deliveryPackageMap = deliveryPackageList.stream().collect(Collectors.toMap(DistributionParcelListEntity::getId, Function.identity(), (k1, k2) -> k2)); -//// boolean delivaryFlag = parcelListEntities.stream().allMatch(p -> Func.isNotEmpty(deliveryPackageMap.get(p.getId()))); -//// if (delivaryFlag) { -//// List deliveryLoadscanEntities = new ArrayList<>(); -//// for (DistributionParcelListEntity parcelListEntity : parcelListEntities) { -//// if (parcelListEntity.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue())) { -//// //查询出这个包件属于哪个客户 -//// DistributionReservationEntity reservationEntity = distributionDeliveryListMapper.selectReservationByPackageAndDeliveryId(parcelListEntity.getOrderPackageCode(), distrilbutionloadingscanDTO.getDeliveryId()); -//// parcelListEntity.setOrderPackageLoadingStatus(OrderPackageLoadingStatusConstant.yizhuangche.getValue()); -//// parcelListEntity.setOrderPackageStatus(OrderPackageStatusConstant.yichuku.getValue()); -//// distributionParcelListService.updateById(parcelListEntity); -//// DistributionLoadscanEntity loadscanEntity = new DistributionLoadscanEntity(); -//// if (Func.isNotEmpty(distributionDeliverySelfEntity.getDeliveryId())) { -//// loadscanEntity.setDriverId(distributionDeliverySelfEntity.getDriverId()); -//// } -//// if (Func.isNotEmpty(distributionDeliverySelfEntity.getDriverName())) { -//// loadscanEntity.setDriverName(distributionDeliverySelfEntity.getDriverName()); -//// } -//// if (Func.isNotEmpty(distributionDeliverySelfEntity.getVehicleNub())) { -//// loadscanEntity.setVehicleName(distributionDeliverySelfEntity.getVehicleNub()); -//// } -//// if (Func.isNotEmpty(distributionDeliverySelfEntity.getVehicleId())) { -//// loadscanEntity.setVehicleId(distributionDeliverySelfEntity.getVehicleId()); -//// } -//// if (Func.isNotEmpty(distributionDeliverySelfEntity.getDriverPhone())) { -//// loadscanEntity.setDriverPhone(distributionDeliverySelfEntity.getDriverPhone()); -//// } -//// loadscanEntity.setOrderId(parcelListEntity.getStockArticleId()); -//// loadscanEntity.setOrderPackageCode(parcelListEntity.getOrderPackageCode()); -//// //查询出这个包件属于哪个客户 -//// -//// loadscanEntity.setReservationId(distrilbutionloadingscanDTO.getReservationId()); -//// loadscanEntity.setDeliveryId(distrilbutionloadingscanDTO.getDeliveryId()); -//// loadscanEntity.setTrainNumber(distributionDeliveryListEntity.getTrainNumber()); -//// loadscanEntity.setPackageNub(parcelListEntity.getQuantity()); -//// loadscanEntity.setPackageId(parcelListEntity.getId()); -//// loadscanEntity.setReservationId(reservationEntity.getId()); -//// loadscanEntity.setScanTime(new Date()); -//// BladeUser user = AuthUtil.getUser(); -//// loadscanEntity.setScanUser(user.getUserName()); -//// loadscanEntity.setLoadingId(distrilbutionloadingscanDTO.getLoadingId()); -//// loadscanEntity.setOneClick(1); -//// loadscanEntity.setScanType("2"); -//// loadscanEntity.setScanStatus("1"); -//// loadscanEntity.setIsInsert(1); -//// loadscanEntity.setMsg("司机按照计划整托装车"); -//// loadscanEntity.setTrayNo(trayTypeDataVO.getTrayCode()); -//// deliveryLoadscanEntities.add(loadscanEntity); -//// //更新装车时间 -//// Integer i = distributionDeliveryListMapper.updateloadingTimeById(distrilbutionloadingscanDTO.getDeliveryId()); -//// //更新签收表的装车数量 -//// Integer j = distributionSignforMapper.updateloadByReservationId(loadscanEntity.getDeliveryId(), loadscanEntity.getReservationId(), loadscanEntity.getPackageNub()); -////// loadingNum.getAndAdd(loadscanEntity.getPackageNub()); -//// } -//// } -////// str.append("配送计划整托装车"); -//// distributionLoadscanService.saveBatch(deliveryLoadscanEntities); -//// //这里则进行整托装车的数据构建 -//// } else { -//// return Resp.scanFail("整托装车失败", "存在其他客户货物"); -//// } -//// } -// //进行装车状态维护 -// //TODO 需要一个维护状态的异步方法 -// distributionAsyncService.checkLoadingByDelivery(distrilbutionloadingscanDTO.getDeliveryId()); -// } else { -// log.error("托盘存放货物类型不单一:{}", trayTypeDataVO); -// } -// } -// } -// //查询已装车件数 -// String str = getLoadingMsg(distrilbutionloadingscanDTO); -// return Resp.scanSuccess("装车成功", str); -// } - - private Integer getCarLaodNum(Long deliveryId) { AtomicInteger loadingNum = new AtomicInteger(); Integer contNum_a = distributionLoadscanMapper.getLoadCountNum(deliveryId); @@ -1098,7 +1104,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl map = new HashMap<>(); - map.put("orderPackageCode",updownrOderPackages); - map.put("warehouseId",myCurrentWarehouse.getId()); + Map map = new HashMap<>(); + map.put("orderPackageCode", updownrOderPackages); + map.put("warehouseId", myCurrentWarehouse.getId()); warehouseUpdownTypeClient.downDeliveryPackage(map); } List packageIds = updatePackageList.stream().map(DistributionParcelListEntity::getId).collect(Collectors.toList()); @@ -2001,8 +2007,8 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImplupdate().lambda() + .eq(DistributionParcelListEntity::getOrderPackageCode, disStockListDetailEntity.getStockPackageCode()) + .eq(DistributionParcelListEntity::getWarehouseId, myCurrentWarehouse.getId()) + .eq(DistributionParcelListEntity::getMaterialCode, disStockListDetailEntity.getSku()) + .set(DistributionParcelListEntity::getOrderPackageLoadingStatus, OrderPackageLoadingStatusConstant.yizhuangche.getValue()) + .set(DistributionParcelListEntity::getOrderPackageReservationStatus, OrderPackageReservationStatusConstant.yiyueyue.getValue()) + .set(DistributionParcelListEntity::getOrderPackageStatus, OrderPackageStatusConstant.yichuku.getValue()) + + ); + log.info(">>>>>>>>>>>>>>>>>>>装车修改库存品包件>装车包件码:{},", disStockListDetailEntity.getStockPackageCode()); + DistributionLoadscaninvnEntity distributionLoadscaninvnEntity = getDistributionLoadscaninvnEntity(distrilbutionloadingscanDTO, distributionDeliverySelfEntity, disStockListDetailEntities, myCurrentWarehouse); packageLockIds.add(distributionLoadscaninvnEntity.getInventoryPackageId()); distributionLoadscaninvnService.save(distributionLoadscaninvnEntity); //查询本车次是否第一次扫码,没有则更新上车时间 @@ -2051,36 +2069,36 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImplquery().lambda().eq(DistributionStockListEntity::getId, distributionLoadscaninvnEntity.getInventoryId())); -// BigDecimal quantityStock = new BigDecimal(distributionStockListEntity.getQuantityStock()); -// BigDecimal loadedNub = new BigDecimal(distributionLoadscaninvnEntity.getLoadedNub()); -// int stockListQuantityStock = quantityStock.subtract(loadedNub).intValue(); -// int stockListOutboundQuantity = quantityStock.add(loadedNub).intValue(); -// distributionStockListEntity.setQuantityStock(stockListQuantityStock); -// distributionStockListEntity.setQuantityOccupied(stockListOutboundQuantity); -// distributionStockListEntity.setOutboundQuantity(stockListOutboundQuantity); -// distributionStockListMapper.updateById(distributionStockListEntity); + + //备货库位下架 + List jsonObjects = new ArrayList<>(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", distributionLoadscaninvnEntity.getOrderPackageCode()); + jsonObject.put("warehouseId", myCurrentWarehouse.getId()); + jsonObject.put("taskId", distributionLoadscaninvnEntity.getReservationId()); + jsonObject.put("type", 2); + jsonObject.put("num", 1); + jsonObject.put("remark", "装车下架"); + jsonObjects.add(jsonObject); + warehouseUpdownStockUpAreaClient.downStockUpShelf(jsonObjects); } else { return Resp.scanFail("窜货", "窜货"); } } } - if (!packageLockIds.isEmpty()){ + if (!packageLockIds.isEmpty()) { List a = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:"); - if (Func.isNotEmpty(a)){ + if (Func.isNotEmpty(a)) { boolean flag = a.stream().anyMatch(any -> packageLockIds.contains(any)); - if (flag){ + if (flag) { //正在操作,请稍后重试 throw new RuntimeException("该包件正在被操作,请稍后再试!!!"); - }else { + } else { packageLockIds.addAll(a); - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:",packageLockIds,60L); + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:", packageLockIds, 60L); } - }else { - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:" ,packageLockIds,60L); + } else { + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:", packageLockIds, 60L); } } String msg = getLoadingMsg(distrilbutionloadingscanDTO); @@ -2096,7 +2114,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl disStockListDetailEntities) { + private static DistributionLoadscaninvnEntity getDistributionLoadscaninvnEntity(DistrilbutionloadingscanDTO distrilbutionloadingscanDTO, DistributionDeliverySelfEntity distributionDeliverySelfEntity, List disStockListDetailEntities, BasicdataWarehouseEntity warehouseEntity) { DistributionLoadscaninvnEntity distributionLoadscaninvnEntity = new DistributionLoadscaninvnEntity(); BladeUser user = AuthUtil.getUser(); String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); @@ -2124,6 +2142,8 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl distributionAppDeliveryListVOS = new ArrayList<>(); try { -//获取当前登录人 + //获取当前登录人 BladeUser user = AuthUtil.getUser(); String roleId = user.getRoleId(); //判断当前登录人是否为司机 boolean delivery = false; String value1 = DictBizCache.getValue("role_class", "delivery_driver_new"); - if (roleId.contains(value1)) { - delivery = true; - } + + String[] roleIds = value1.split(","); + String[] roleIdsT = roleId.split(","); + for (String id : roleIds) { + for (String s : roleIdsT) { + if (s.equals(id)) { + delivery = true; + break; + } + } + } + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); // R value = dictBizClient.getValue("role_class", roleId); if (delivery) { @@ -2302,31 +2331,33 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl>>>>>>>>>>>>>>>> distributionAppDeliveryListVOS 司机配送任务列表 {}", distributionAppDeliveryListVOS); //转换字典字段 for (DistributionAppDeliveryListVO distributionAppDeliveryListVO : distributionAppDeliveryListVOS) { - distributionAppDeliveryListVO.setScannedNumber(getCarLaodNum(distributionAppDeliveryListVO.getId())); // 调用下 查询装车件数的方法 //查询备货区 - if (StringUtils.isNotBlank(distributionAppDeliveryListVO.getReservationId())) { - List list = CommonUtil.stringNum(distributionAppDeliveryListVO.getReservationId()); - QueryWrapper queryWrapper = new QueryWrapper(); - - if (list.size() > 1) { - queryWrapper.in("reservation_id", list); - } else { - queryWrapper.eq("reservation_id", distributionAppDeliveryListVO.getReservationId()); - } - List list1 = distributionStockupInfoService.list(queryWrapper); - if (!list1.isEmpty()) { - DistributionStockupInfoEntity distributionStockupInfoEntity = list1.get(0); - DistributionStockupEntity distributionStockupEntity = distributionStockupMapper.selectById(distributionStockupInfoEntity.getStockupId()); - if (ObjectUtils.isNotNull(distributionStockupEntity)) { - distributionAppDeliveryListVO.setStockupArea(distributionStockupEntity.getStockupArea()); - } else { - distributionAppDeliveryListVO.setStockupArea("无数据"); - } - } else { - distributionAppDeliveryListVO.setStockupArea("无数据"); - } +// if (StringUtils.isNotBlank(distributionAppDeliveryListVO.getReservationId())) { +// List list = CommonUtil.stringNum(distributionAppDeliveryListVO.getReservationId()); +// QueryWrapper queryWrapper = new QueryWrapper(); +// +// if (list.size() > 1) { +// queryWrapper.in("reservation_id", list); +// } else { +// queryWrapper.eq("reservation_id", distributionAppDeliveryListVO.getReservationId()); +// } +// List list1 = distributionStockupInfoService.list(queryWrapper); +// if (!list1.isEmpty()) { +// DistributionStockupInfoEntity distributionStockupInfoEntity = list1.get(0); +// DistributionStockupEntity distributionStockupEntity = distributionStockupMapper.selectById(distributionStockupInfoEntity.getStockupId()); +// if (ObjectUtils.isNotNull(distributionStockupEntity)) { +// distributionAppDeliveryListVO.setStockupArea(distributionStockupEntity.getStockupArea()); +// } else { +// distributionAppDeliveryListVO.setStockupArea("无数据"); +// } +// } else { +// distributionAppDeliveryListVO.setStockupArea("无数据"); +// } +// } + if (StringUtils.isBlank(distributionAppDeliveryListVO.getStockupArea())) { + distributionAppDeliveryListVO.setStockupArea("无数据"); } //查询包件签收件数 Integer lad = distributionLoadscanMapper.selectCount(new QueryWrapper().lambda().eq(DistributionLoadscanEntity::getDeliveryId, distributionAppDeliveryListVO.getId()).eq(DistributionLoadscanEntity::getSignforState, 2)).intValue(); @@ -2460,19 +2491,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl { DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(rs.getStockArticleId()); DistributionStockArticleVO distributionStockArticleVO = DistributionStockArticleWrapper.build().entityVO(stockArticleEntity); -// if (rs.getIsZero().equals(IsOrNoConstant.no.getValue())) { -//// List reservationPackageEntityList = distributionReservationPackageService.list(Wrappers.query().lambda().eq(DistributionReservationPackageEntity::getReservationId, rs.getReservationId()).eq(DistributionReservationPackageEntity::getStockArticleId, stockArticleEntity.getId()).ne(DistributionReservationPackageEntity::getPacketBarStatus, ReservationPackageStatusConstant.quxiao.getValue())); -//// if (Func.isNotEmpty(reservationPackageEntityList)) { -//// ArrayList distributionParcelListVOS = new ArrayList<>(); -//// reservationPackageEntityList.forEach(rp -> { -//// DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(rp.getParceListId()); -//// DistributionParcelListVO distributionParcelListVO = DistributionParcelListWrapper.build().entityVO(parcelListEntity); -//// distributionParcelListVOS.add(distributionParcelListVO); -//// }); -//// distributionStockArticleVO.setPackageList(distributionParcelListVOS); -//// distributionStockArticleVO.setParcelListVOS(DistributionParcelListWrapper.build().listVO(distributionParcelListService.getBaseMapper().selectList(Wrappers.query().lambda().eq(DistributionParcelListEntity::getStockArticleId, rs.getStockArticleId())))); -//// } -// } + distributionStockArticleVO.setReservationNum(rs.getReservationNum()); distributionStockArticleVOS.add(distributionStockArticleVO); }); } @@ -2488,16 +2507,17 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl deliverySelfVO = distributionDeliverySelfMapper.getDeliverySelfInfo(id); - deliveryListVO.setDeliverySelfVO(deliverySelfVO); - } else { - //外协配送 - DistributionDeliveryTripartiteVO deliveryTripartiteVO = distributionDeliveryTripartiteMapper.getDeliveryTripartiteInfo(id); - deliveryListVO.setDeliveryTripartiteVO(deliveryTripartiteVO); - } + } + + //3、查询司机信息 + if (deliveryListEntity.getKind().equals(ServiceConstant.DELIVERLIST_KIND_SELF)) { + //自主配送 + List deliverySelfVO = distributionDeliverySelfMapper.getDeliverySelfInfo(id); + deliveryListVO.setDeliverySelfVO(deliverySelfVO); + } else { + //外协配送 + DistributionDeliveryTripartiteVO deliveryTripartiteVO = distributionDeliveryTripartiteMapper.getDeliveryTripartiteInfo(id); + deliveryListVO.setDeliveryTripartiteVO(deliveryTripartiteVO); } return deliveryListVO; } @@ -2572,55 +2592,55 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl customList = distributionDeliveryInfoMapper.selectAppcustomListPage(distributionDeliveryList.getId()); // 查询所有的预约单ID for (DistributionAppReservationVO distributionAppReservationVO : customList) { - if (Objects.equals(distributionAppReservationVO.getReservationNum(), distributionAppReservationVO.getLoadingNub())){ + if (Objects.equals(distributionAppReservationVO.getReservationNum(), distributionAppReservationVO.getLoadingNub())) { distributionAppReservationVO.setIsload("是"); - }else { + } else { distributionAppReservationVO.setIsload("否"); } - if (Objects.equals(distributionAppReservationVO.getReservationNum(), distributionAppReservationVO.getStockupNum())){ + if (Objects.equals(distributionAppReservationVO.getReservationNum(), distributionAppReservationVO.getStockupNum())) { distributionAppReservationVO.setIsstock("是"); - }else { + } else { distributionAppReservationVO.setIsstock("否"); } List trayList = new ArrayList<>(); - //查询满足条件的托盘码 - List distributionParcelListEntities = distributionReservationMapper.selectPackageListByReservationId(distributionAppReservationVO.getId()); - int trayNum = 0; - if (Func.isNotEmpty(distributionParcelListEntities)) { - Map map = new HashMap<>(); - List packageIds = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getId).collect(Collectors.toList()); - map.put("packageIds",packageIds); - map.put("warehouseId",myCurrentWarehouse.getId()); - List packageTrayInfo = warehouseTrayGoodsClient.getPackageTrayInfo(map); - List packageCodeList = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getOrderPackageCode).collect(Collectors.toList()); + //查询满足条件的托盘码 + List distributionParcelListEntities = distributionReservationMapper.selectPackageListByReservationId(distributionAppReservationVO.getId()); + int trayNum = 0; + if (Func.isNotEmpty(distributionParcelListEntities)) { + Map map = new HashMap<>(); + List packageIds = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getId).collect(Collectors.toList()); + map.put("packageIds", packageIds); + map.put("warehouseId", myCurrentWarehouse.getId()); + List packageTrayInfo = warehouseTrayGoodsClient.getPackageTrayInfo(map); + List packageCodeList = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getOrderPackageCode).collect(Collectors.toList()); // List collect = trayList.stream().distinct().collect(Collectors.toList()); - if (Func.isNotEmpty(packageTrayInfo)){ - List trayIds = packageTrayInfo.stream().map(WarehouseTrayGoodsEntity::getTrayId).distinct().collect(Collectors.toList()); - for (Long trayId : trayIds) { - List trayIdList = warehouseTrayGoodsClient.getTrayIdList(trayId.toString(), ""); - //判断该托盘上的货物都存在于计划之中 - boolean isLoadingTrayFlag = trayIdList.stream().map(WarehouseTrayGoodsEntity::getAssociationValue).allMatch(t -> packageCodeList.contains(t)); - if (isLoadingTrayFlag) { - trayNum += 1; - } + if (Func.isNotEmpty(packageTrayInfo)) { + List trayIds = packageTrayInfo.stream().map(WarehouseTrayGoodsEntity::getTrayId).distinct().collect(Collectors.toList()); + for (Long trayId : trayIds) { + List trayIdList = warehouseTrayGoodsClient.getTrayIdList(trayId.toString(), ""); + //判断该托盘上的货物都存在于计划之中 + boolean isLoadingTrayFlag = trayIdList.stream().map(WarehouseTrayGoodsEntity::getAssociationValue).allMatch(t -> packageCodeList.contains(t)); + if (isLoadingTrayFlag) { + trayNum += 1; } } - } - //统计满足条件的托盘 - distributionAppReservationVO.setTrayNum(trayNum); + + } + //统计满足条件的托盘 + distributionAppReservationVO.setTrayNum(trayNum); } return customList; } - private List localFindAllParcelListEntities(List allParcelListEntities, Long stockArticleId) { + private List localFindAllParcelListEntities(List allParcelListEntities, Long stockArticleId) { List temp = new ArrayList<>(); for (DistributionParcelListEntity allParcelListEntity : allParcelListEntities) { - if(allParcelListEntity.getStockArticleId().equals(stockArticleId)){ + if (allParcelListEntity.getStockArticleId().equals(stockArticleId)) { temp.add(allParcelListEntity); } } @@ -2629,6 +2649,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl temp = new ArrayList<>(); for (DistributionReservationStockarticleEntity reservationStockarticleEntityList : reservationStockarticleEntityLists) { - if(reservationStockarticleEntityList.getReservationId().equals(id)){ + if (reservationStockarticleEntityList.getReservationId().equals(id)) { temp.add(reservationStockarticleEntityList); } } @@ -2669,29 +2690,19 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl updateDeliveryListInfo(DistributionDeliveryListDTO deliveryListDTO) { + + private void checkArgs(DistributionDeliveryListDTO deliveryListDTO, BasicdataWarehouseEntity myCurrentWarehouse) { if (Func.isEmpty(deliveryListDTO)) { log.error("deliveryListDTO参数异常+{" + deliveryListDTO + "}"); - return R.fail("服务器正忙!!"); + throw new CustomerException("请求参数异常"); } - BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if (Func.isEmpty(myCurrentWarehouse)) { - return R.fail("无仓库信息!!!"); + throw new CustomerException("无仓库信息"); } -// if (Func.isEmpty(deliveryListDTO.getIsDeliveryDriverUpdate())){ -// return R.fail("服务器正忙!!!"); -// } - //首先对配送任务进行修改 - //查询出配送任务的基本信息 DistributionDeliveryListEntity deliveryListEntity = this.getById(deliveryListDTO.getId()); Long deliveryListEntityId = deliveryListEntity.getId(); -// if (deliveryListEntity.getDeliveryStatus().equals(DeliveryStatusConstant.peisongzhong.getValue())) { -// return R.fail("正在配送中..."); -// } if (deliveryListEntity.getDeliveryStatus().equals(DeliveryStatusConstant.yiwancheng.getValue())) { - return R.fail("配送已完成..."); + throw new CustomerException("配送任务已完成"); } if (IsOrNoConstant.yes.getValue().equals(deliveryListDTO.getIsDeliveryDriverUpdate())) { //查看是否满足进行司机修改 @@ -2703,10 +2714,24 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl 0) { //此配送任务存在装车 无法进行司机切换 log.error("配送任务存在装车数据,无法进行司机切换"); - return R.fail("任务已装车联系司机滞留货物后进行司机切换..."); + throw new CustomerException("任务已装车联系司机滞留货物后进行司机切换..."); } } + } + + + @Override + @Transactional + public R updateDeliveryListInfo(DistributionDeliveryListDTO deliveryListDTO) { + + DistributionDeliveryListEntity deliveryListEntity = this.getById(deliveryListDTO.getId()); + Long deliveryListEntityId = deliveryListEntity.getId(); + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + checkArgs(deliveryListDTO, myCurrentWarehouse); + + List logs = new ArrayList<>(); + List pushDatas = new ArrayList<>(); //查询出原来配送信息的备货任务 DistributionStockupVO deliveryStockupInfo = distributionStockupMapper.getDeliveryStockupInfo(deliveryListEntity.getId()); //这里查询出该备货任务的执行情况,如果该任务处于已完成的状态需要创建新的备货任务,其他的备货状态则是进行备货任务的修改 @@ -2727,13 +2752,6 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl { HashSet orderNumber = new HashSet<>(); //运单号 -// HashSet waybillNo = new HashSet<>(); //运单ID -------这里运单Id后续可能变更为运单号 HashSet waybillId = new HashSet<>(); //订单服务号 @@ -2793,7 +2810,6 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl distributionParcelListEntities = distributionParcelListService.list(Wrappers.query().lambda().eq(DistributionParcelListEntity::getStockArticleId, s.getId()).ne(DistributionParcelListEntity::getOrderPackageLoadingStatus, OrderPackageLoadingStatusConstant.yizhuangche.getValue()).ne(DistributionParcelListEntity::getOrderPackageReservationStatus, OrderPackageReservationStatusConstant.yiyueyue.getValue()).notIn(DistributionParcelListEntity::getOrderPackageStatus, new String[]{OrderPackageStatusConstant.yichuku.getValue(), OrderPackageStatusConstant.yiqianshou.getValue()})); + List distributionParcelListEntities = distributionParcelListService.list(Wrappers.query().lambda() + .eq(DistributionParcelListEntity::getStockArticleId, s.getId()) + .ne(DistributionParcelListEntity::getOrderPackageLoadingStatus, OrderPackageLoadingStatusConstant.yizhuangche.getValue()) + .ne(DistributionParcelListEntity::getOrderPackageReservationStatus, OrderPackageReservationStatusConstant.yiyueyue.getValue()) + .notIn(DistributionParcelListEntity::getOrderPackageStatus, new String[]{OrderPackageStatusConstant.yichuku.getValue(), OrderPackageStatusConstant.yiqianshou.getValue()}) + ); if (Func.isEmpty(distributionParcelListEntities)) { throw new RuntimeException(s.getOrderCode() + "无可用数量"); } @@ -2903,18 +2921,18 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl { orderPackageNum.getAndAdd(p.getQuantity()); @@ -2929,7 +2947,11 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl a = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + s.getOrderCode()); - if (Func.isNotEmpty(a)){ + if (Func.isNotEmpty(a)) { boolean flag = a.stream().anyMatch(f -> packageLockIds.contains(f)); - if (flag){ - throw new RuntimeException(s.getOrderCode()+"正在操作,请刷新后尝试"); - }else { + if (flag) { + throw new RuntimeException(s.getOrderCode() + "正在操作,请刷新后尝试"); + } else { packageLockIds.addAll(a); - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + s.getOrderCode(),packageLockIds,1*60L); + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + s.getOrderCode(), packageLockIds, 60L); } - }else { - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + s.getOrderCode(),packageLockIds,1*60L); + } else { + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + s.getOrderCode(), packageLockIds, 60L); } } }); @@ -3018,8 +3039,6 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImplquery().lambda() .eq(DistributionSignforEntity::getReservationId, reservationEntity.getId()) .eq(DistributionSignforEntity::getDeliveryId, deliveryListEntity.getId()) ); - //查询出该预约下的订单信息 List reservationStockarticleEntityList = distributionReservationStockarticleMapper.selectList(Wrappers.query().lambda().eq(DistributionReservationStockarticleEntity::getReservationId, reservationEntity.getId()).ne(DistributionReservationStockarticleEntity::getStockArticleStatus, ReservationOrderStatusConstant.quxiao.getValue())); Map> oldOrder = reservationStockarticleEntityList.stream().collect(Collectors.groupingBy(DistributionReservationStockarticleEntity::getStockArticleId)); @@ -3077,9 +3096,6 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl packageListInfo = s.getPackageListInfo(); if (Func.isNotEmpty(packageListInfo)) { + if (Func.isNotEmpty(signforEntity) && signforEntity.getSigningStatus().equals(SignforStatusConstant.yiqianshou.getValue())) { + log.error("#############商配文员对已复核预约进行订单追加reservationId:{}", reservationEntity.getId()); + throw new RuntimeException("收货单位:" + reservationEntity.getMallName() + "客户:" + reservationEntity.getConsignee() + "文员完成复核,无法追加订单"); + } + if (Func.isNotEmpty(reservationEntity) && reservationEntity.getSigningStatus().equals(ReservationSigningStatusConstant.yiqianshou.getValue())) { + log.error("#############商配文员对已复核预约进行订单追加reservationId:{}", reservationEntity.getId()); + throw new RuntimeException("收货单位:" + reservationEntity.getMallName() + "客户:" + reservationEntity.getConsignee() + "司机完成签收,无法追加订单"); + } packageListInfo.forEach(p -> { orderPackageNum.getAndAdd(p.getQuantity()); DistributionReservationPackageEntity reservationPackageEntity = new DistributionReservationPackageEntity(); @@ -3129,9 +3149,21 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl distributionReservationPackageEntities = distributionReservationPackageMapper.selectList(new QueryWrapper().lambda() -// .eq(DistributionReservationPackageEntity::getReservationId, reservationEntity.getId()) -// .eq(DistributionReservationPackageEntity::getStockArticleId, s.getId()) -// ); if (Func.isEmpty(list)) { log.error("###########################预约包件查询错误:{}", list); log.error("###########################查询错误预约Id:{}", reservationEntity.getId()); throw new RuntimeException("服务器正忙..."); } - Map> oldPackageList = list.stream().collect(Collectors.groupingBy(DistributionReservationPackageEntity::getParceListId)); + + //list 对这个集合 按照getParceListId 进行分组 + + Map> oldPackageList = list.stream().collect(Collectors.groupingBy(DistributionReservationPackageEntity::getPacketBarCode)); //查看订单包件是否发生变化 - //此订单包件数量统计 + //此订单包件数量统计l if (Func.isNotEmpty(packageListInfo)) { packageListInfo.forEach(p -> { - if (Func.isEmpty(oldPackageList.get(p.getId()))) { + if (Func.isEmpty(oldPackageList.get(p.getOrderPackageCode()))) { if (Func.isNotEmpty(signforEntity) && signforEntity.getSigningStatus().equals(SignforStatusConstant.yiqianshou.getValue())) { log.error("#############商配文员对已复核预约进行订单追加reservationId:{}", reservationEntity.getId()); - throw new RuntimeException("收货单位:" + reservationEntity.getMallName() + "客户:" + reservationEntity.getConsignee() + "完成复核签收,无法追加订单"); + throw new RuntimeException("收货单位:" + reservationEntity.getMallName() + "客户:" + reservationEntity.getConsignee() + "文员完成复核,无法追加订单"); + } + if (Func.isNotEmpty(reservationEntity) && reservationEntity.getSigningStatus().equals(ReservationSigningStatusConstant.yiqianshou.getValue())) { + log.error("#############商配文员对司机完成签收订单追加reservationId:{}", reservationEntity.getId()); + throw new RuntimeException("收货单位:" + reservationEntity.getMallName() + "客户:" + reservationEntity.getConsignee() + "司机完成签收,无法追加订单"); } //为该订单新增了包件 DistributionReservationPackageEntity reservationPackageEntity = new DistributionReservationPackageEntity(); @@ -3267,39 +3302,62 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl>>>> 修改计划 验证包件是否存在 {}", isExit); + if (!isExit) { + list.add(reservationPackageEntity); + distributionReservationPackageService.save(reservationPackageEntity); + distributionAsyncService.checkStockArticleReservationStatus(p); + packageLockIds.add(p.getId()); + String content = "包件在" + myCurrentWarehouse.getName() + "由" + AuthUtil.getUser().getNickName() + "商配计划配车,操作方式:对已有计划订单进行包件勾选新增操作,预约任务号:" + reservationEntity.getReservationCode(); + JSONObject js = handleLogJSONObject(myCurrentWarehouse, AuthUtil.getUser(), reservationPackageEntity.getPacketBarCode(), content, WorkNodeEnums.PLAN_DISTRIBUTION.getCode()); + JSONObject jsonObject = getJsonObject(deliveryListEntity, reservationEntity, reservationPackageEntity.getPacketBarCode()); + pushDatas.add(jsonObject); + logs.add(js); + //包件数量累加 + packageNum.getAndAdd(p.getQuantity()); + } + + } else { //依然存在包件, - oldPackageList.remove(p.getId()); + oldPackageList.remove(p.getOrderPackageCode()); + //包件数量累加 + packageNum.getAndAdd(p.getQuantity()); } - //包件数量累加 - packageNum.getAndAdd(p.getQuantity()); + }); //进行取消包件的数据清理 - oldPackageList.forEach((a, b) -> { - if (Func.isNotEmpty(signforEntity) && signforEntity.getSigningStatus().equals(SignforStatusConstant.yiqianshou.getValue())) { + if (!oldPackageList.isEmpty()) { + if (Func.isNotEmpty(signforEntity) && signforEntity.getSigningStatus().equals(ReservationSigningStatusConstant.yiqianshou.getValue())) { log.error("#############商配文员对已复核预约进行订单追加reservationId:{}", reservationEntity.getId()); - throw new RuntimeException("收货单位:" + reservationEntity.getMallName() + "客户:" + reservationEntity.getConsignee() + "完成复核签收,无法追加订单"); + throw new RuntimeException("收货单位:" + reservationEntity.getMallName() + "客户:" + reservationEntity.getConsignee() + "完成复核签收,无法取消包件"); } - DistributionReservationPackageEntity reservationPackageEntity = b.get(0); - reservationPackageEntity.setPacketBarStatus(ReservationPackageStatusConstant.quxiao.getValue()); - distributionReservationPackageService.updateById(reservationPackageEntity); - //取消包件的预约状态,并且进行整个订单的状态修改 - DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(reservationPackageEntity.getParceListId()); - parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.daiyuyue.getValue()); - distributionParcelListService.updateById(parcelListEntity); - if (Func.isNotEmpty(bladeRedis.get("warehouseId:"+myCurrentWarehouse.getId()+"orderCode:"+parcelListEntity.getOrderCode()))){ - List ids = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + parcelListEntity.getOrderCode()); - int indexOf = ids.indexOf(parcelListEntity.getId()); - if (indexOf>0){ - ids.remove(indexOf); - bladeRedis.set("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + parcelListEntity.getOrderCode(),ids); + oldPackageList.forEach((a, b) -> { + DistributionReservationPackageEntity reservationPackageEntity = b.get(0); + reservationPackageEntity.setPacketBarStatus(ReservationPackageStatusConstant.quxiao.getValue()); + distributionReservationPackageService.updateById(reservationPackageEntity); + //取消包件的预约状态,并且进行整个订单的状态修改 + DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(reservationPackageEntity.getParceListId()); + if (OrderPackageLoadingStatusConstant.yizhuangche.getValue().equals(parcelListEntity.getOrderPackageLoadingStatus())) { + throw new RuntimeException(parcelListEntity.getOrderPackageCode() + "完成装车,请滞留取消"); } - } -// distributionAsyncService.checkStockArticleReservationStatus(parcelListEntity); - }); + parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.daiyuyue.getValue()); + distributionParcelListService.updateById(parcelListEntity); + if (Func.isNotEmpty(bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + parcelListEntity.getOrderCode()))) { + List ids = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + parcelListEntity.getOrderCode()); + int indexOf = ids.indexOf(parcelListEntity.getId()); + if (indexOf > 0) { + ids.remove(indexOf); + bladeRedis.set("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + parcelListEntity.getOrderCode(), ids); + } + } + String content = "包件在" + myCurrentWarehouse.getName() + "由" + AuthUtil.getUser().getNickName() + "取消商配计划配车,操作方式:对已有计划订单进行勾选包件取消操作,预约任务号:" + reservationEntity.getReservationCode(); + JSONObject js = handleLogJSONObject(myCurrentWarehouse, AuthUtil.getUser(), parcelListEntity.getOrderPackageCode(), content, WorkNodeEnums.PLAN_DISTRIBUTION.getCode()); + logs.add(js); + }); + } } else { //查找该订单没有进行包件选择的操作, 但是存在newOrder列表中 视为该订单保持计划选择 packageNum.getAndAdd(reservationStockarticleEntity.getReservationNum()); @@ -3373,35 +3431,32 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl oldPackageList = distributionReservationMapper.selectPackageByReservationAndStockArticle(reservationEntity.getId(), reservationStockarticleEntities.get(0).getStockArticleId()); //进行预约订单中间信息的修改 reservationStockarticleEntity.setReservationNum(packageNum.get()); distributionReservationStockarticleService.updateById(reservationStockarticleEntity); -// oldOrder.remove(s.getId()); //预约订单上的包件数量维护 packageTotal.getAndAdd(reservationStockarticleEntity.getReservationNum()); } - if (!packageLockIds.isEmpty()){ + if (!packageLockIds.isEmpty()) { List a = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + s.getOrderCode()); - if (Func.isNotEmpty(a)){ + if (Func.isNotEmpty(a)) { boolean flag = a.stream().anyMatch(f -> packageLockIds.contains(f)); - if (flag){ - throw new RuntimeException(s.getOrderCode()+"正在操作,请刷新后尝试"); - }else { + if (flag) { + throw new RuntimeException(s.getOrderCode() + "正在操作,请刷新后尝试"); + } else { packageLockIds.addAll(a); - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + s.getOrderCode(),packageLockIds,5*60L); + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + s.getOrderCode(), packageLockIds, 5 * 60L); } } } }); if (Func.isNotEmpty(oldOrder)) { + if (Func.isNotEmpty(signforEntity) && signforEntity.getSigningStatus().equals(ReservationSigningStatusConstant.yiqianshou.getValue())) { + log.error("#############商配文员对已复核预约进行订单追加reservationId:{}", reservationEntity.getId()); + throw new RuntimeException("收货单位:" + reservationEntity.getMallName() + "客户:" + reservationEntity.getConsignee() + "完成复核签收,无法取消包件"); + } oldOrder.forEach((m, n) -> { - if (Func.isNotEmpty(signforEntity) && signforEntity.getSigningStatus().equals(SignforStatusConstant.yiqianshou.getValue())) { - log.error("#############商配文员对已复核预约进行订单追加reservationId:{}", reservationEntity.getId()); - throw new RuntimeException("收货单位:" + reservationEntity.getMallName() + "客户:" + reservationEntity.getConsignee() + "完成复核签收,无法追加订单"); - } DistributionReservationStockarticleEntity reservationStockarticleEntity = n.get(0); if (reservationStockarticleEntity.getIsZero().equals(IsOrNoConstant.no.getValue())) { List reservationPackageEntityList = distributionReservationPackageMapper.selectList(Wrappers.query().lambda().eq(DistributionReservationPackageEntity::getReservationId, reservationEntity.getId()).eq(DistributionReservationPackageEntity::getStockArticleId, reservationStockarticleEntity.getStockArticleId())); @@ -3414,7 +3469,9 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl { DistributionDeliverySelfEntity deliverySelfEntity = Func.copy(a, DistributionDeliverySelfEntity.class); if (a.getDriverName().equals(deliveryListDTO.getMasterDriverName()) && a.getVehicleNub().equals(deliveryListDTO.getMasterVehicleNub())) { deliverySelfEntity.setIsMaster(ServiceConstant.IS_MASTER_YES); driverNames.append(deliverySelfEntity.getDriverName()).append("(主),"); - } else { driverNames.append(deliverySelfEntity.getDriverName()).append(","); } @@ -3576,286 +3638,36 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl> storeClient = stockArticle.stream().collect(Collectors.groupingBy(DistributionStockArticleDTO::getStoreName)); -// List distributionStockArticleDTOS = storeClient.get(""); -// Map> mallClient = null; -// if (!Func.isEmpty(distributionStockArticleDTOS)) { -// mallClient = distributionStockArticleDTOS.stream().collect(Collectors.groupingBy(DistributionStockArticleDTO::getMallName)); -// Map> finalMallClient = mallClient; -// storeClient.forEach((k, v) -> finalMallClient.merge(k, v, (v1, v2) -> v2)); -// } else { -// mallClient = storeClient; -// } -// -// List reservationEntityList = distributionReservationMapper.getDeliveryReservation(deliveryListEntity.getId()); -// //将原客户和新的进行比对,如果有那么则进行客户修改,最后剩下的订单信息都属于是新客户 -// Map> originalClient = reservationEntityList.stream().collect(Collectors.groupingBy(DistributionReservationEntity::getConsignee)); -// //查询原来的备货任务 -//// DistributionStockupVO stockupInfo = distributionStockupMapper.getDeliveryStockupInfo(deliveryListEntity.getId()); -// Date date = new Date(); -// BladeUser user = AuthUtil.getUser(); -// AtomicInteger clientNum = new AtomicInteger(); -// AtomicInteger orderNum = new AtomicInteger(); -// mallClient.forEach((k, v) -> { -// clientNum.getAndIncrement(); -// //判断原始客户中是否存在 -// if (Func.isEmpty(originalClient.get(k))) { -// //不存在,意味这里应该进行客户的新增 -// DistributionReservationDTO reservation = deliveryListDTO.getReservation(); -// DistributionReservationEntity distributionReservationEntity = Func.copy(reservation, DistributionReservationEntity.class); -// distributionReservationEntity.setReservationDate(date); -// distributionReservationEntity.setServeType(deliveryListDTO.getReservation().getServeType()); -// distributionReservationEntity.setConsignee(k); -// distributionReservationEntity.setDeliveryAddress(v.get(0).getCustomerAddress()); -// distributionReservationEntity.setDeliveryPhone(v.get(0).getCustomerTelephone()); -// distributionReservationEntity.setDeliveryWay(deliveryListDTO.getReservation().getDeliveryWay()); -// distributionReservationEntity.setReservationStatus(ReservationStatusConstant.daipeisong.getValue()); -// distributionReservationEntity.setStockupStatus(ReservationStockupStatusConstant.daibeihuo.getValue()); -// distributionReservationEntity.setReservationCode(Func.random(13, RandomType.INT)); -// distributionReservationEntity.setDeliveryType(DistributionTypeConstant.shangpei.getValue()); -// //默认配送时间为全天 -// distributionReservationEntity.setPeriodOfTime(ServiceConstant.RESERVATION_PERIOED_TIME_DAY); -// distributionReservationEntity.setCreateUser(user.getUserId()); -// distributionReservationEntity.setCreateDept(Long.parseLong(user.getDeptId())); -// distributionReservationEntity.setIsDeleted(0); -// distributionReservationEntity.setStatus(1); -// distributionReservationEntity.setTenantId(user.getTenantId()); -// distributionReservationEntity.setCreateTime(new Date()); -// distributionReservationEntity.setUpdateUser(user.getUserId()); -// distributionReservationEntity.setUpdateTime(new Date()); -// distributionReservationMapper.insert(distributionReservationEntity); -// HashSet orderCode = new HashSet<>(); -// HashSet serviceNumber = new HashSet<>(); -// HashSet mallName = new HashSet<>(); -// AtomicInteger packageTotal = new AtomicInteger(); -// -// v.forEach(s -> { -// orderNum.getAndIncrement(); -// mallName.add(s.getMallName()); -// DistributionStockArticleDTO stockArticleDTO = Func.copy(s, DistributionStockArticleDTO.class); -// List packageListInfo = stockArticleDTO.getPackageListInfo(); -// AtomicInteger packageNum = new AtomicInteger(); -// //维护包件信息 -// packageListInfo.forEach(p -> { -// DistributionReservationPackageEntity packageEntity = new DistributionReservationPackageEntity(); -// packageEntity.setStockArticleId(s.getId()); -// packageEntity.setReservationId(distributionReservationEntity.getId()); -// packageEntity.setPacketBarCode(p.getOrderPackageCode()); -// packageEntity.setPacketBarStatus(ReservationPackageStatusConstant.xinzeng.getValue()); -// packageEntity.setParceListId(p.getId()); -// p.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.yiyueyue.getValue()); -// distributionParcelListService.updateById(p); -// distributionReservationPackageService.save(packageEntity); -// //包件统计 -// packageNum.getAndAdd(p.getQuantity()); -// }); -// //修改订单信息 -// s.setReservationStatus(distributionReservationPackageService.judgmentStatus(s)); -// DistributionReservationStockarticleEntity reservationStockarticleEntity = new DistributionReservationStockarticleEntity(); -// reservationStockarticleEntity.setReservationNum(packageNum.get()); -// reservationStockarticleEntity.setReservationId(distributionReservationEntity.getId()); -// reservationStockarticleEntity.setStockArticleId(s.getId()); -// reservationStockarticleEntity.setStockArticleStatus(ReservationOrderStatusConstant.zengjia.getValue()); -// distributionReservationStockarticleService.save(reservationStockarticleEntity); -// distributionStockArticleService.updateById(s); -// orderCode.add(s.getOrderCode()); -// packageTotal.getAndAdd(reservationStockarticleEntity.getReservationNum()); -// serviceNumber.add(s.getServiceNumber()); -// }); -// distributionReservationEntity.setStockArticleId(String.join(",", orderCode)); -// distributionReservationEntity.setReservationNum(packageTotal.get()); -// distributionReservationEntity.setStockupStatus(ReservationStockupStatusConstant.daibeihuo.getValue()); -// distributionReservationEntity.setReservationStatus(ReservationStatusConstant.daipeisong.getValue()); -// distributionReservationEntity.setServiceNumber(String.join(",", serviceNumber)); -// distributionReservationEntity.setMallName(String.join(",",mallName)); -// distributionReservationMapper.updateById(distributionReservationEntity); -// //建立这个预约和配送任务之间的关系 -// DistributionSignforEntity distributionSignforEntity = new DistributionSignforEntity(); -// distributionSignforEntity.setDeliveryId(deliveryListEntityId); -// distributionSignforEntity.setTrainNumber(deliveryListEntity.getTrainNumber()); -// distributionSignforEntity.setReservationId(distributionReservationEntity.getId()); -// distributionSignforService.save(distributionSignforEntity); -// //这里查看这个配送任务的备货任务是否已完成,如果已完成则需要开新的备货任务,否则将这个新的预约和原来的备货任务建立绑定关系 -// DistributionStockupInfoEntity stockupInfoEntity = new DistributionStockupInfoEntity(); -// stockupInfoEntity.setReservationId(distributionReservationEntity.getId()); -// stockupInfoEntity.setStockupId(deliveryStockupInfo.getId()); -// distributionStockupInfoService.save(stockupInfoEntity); -// } else { -// DistributionReservationEntity reservationEntity = baseMapper.selectReservationByDeliveryListIdAndCustomer(deliveryListEntityId, k); -// String stockArticleId = reservationEntity.getStockArticleId(); -// String[] split = stockArticleId.split(","); -// List list = Arrays.asList(split); -// HashSet orderNumber = new HashSet<>(); -// orderNumber.addAll(list); -// AtomicInteger packageTotal = new AtomicInteger(); -// AtomicInteger reduceOrder = new AtomicInteger(); -//// List reservationStockarticleEntityList = distributionReservationMapper.selectStockArticleByReservationId(reservationEntity.getId()); -// List reservationStockarticleEntityList = distributionDeliveryListMapper.selectStockArticleById(deliveryListEntityId,k); -// Map> oldStockArticle = reservationStockarticleEntityList.stream().collect(Collectors.groupingBy(DistributionReservationStockarticleEntity::getStockArticleId)); -// v.forEach(s -> { -// orderNum.getAndIncrement(); -// //根据配送和客户名称查询预约 -// AtomicInteger packageNum = new AtomicInteger(); -// AtomicInteger reduceNum = new AtomicInteger(); -// if (Func.isEmpty(oldStockArticle.get(s.getId()))) { -// //订单新增 -// //维护包件 -// List packageListInfo = s.getPackageListInfo(); -// packageListInfo.forEach(p -> { -// DistributionReservationPackageEntity reservationPackageEntity = new DistributionReservationPackageEntity(); -// reservationPackageEntity.setReservationId(reservationEntity.getId()); -// reservationPackageEntity.setStockArticleId(s.getId()); -// reservationPackageEntity.setPacketBarCode(p.getOrderPackageCode()); -// reservationPackageEntity.setPacketBarStatus(ReservationPackageStatusConstant.xinzeng.getValue()); -// reservationPackageEntity.setParceListId(p.getId()); -// distributionReservationPackageService.save(reservationPackageEntity); -// //统计包件数量 -// packageNum.getAndAdd(p.getQuantity()); -// p.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.yiyueyue.getValue()); -// distributionParcelListService.updateById(p); -// }); -// //查询该订单有效的预约包件数量是否和订单总件数一样,一样订单状态为已预约,否则为部分预约 -//// int number = distributionReservationPackageMapper.selectPackageNum(s.getId()); -//// if (Func.equals(number, s.getTotalNumber())) { -//// s.setReservationStatus(OrderReservationStatusConstant.yiyueyue.getValue()); -//// } else { -//// s.setReservationStatus(OrderReservationStatusConstant.bufenyuyue.getValue()); -//// } -// DistributionReservationStockarticleEntity reservationStockarticleEntity = new DistributionReservationStockarticleEntity(); -// reservationStockarticleEntity.setReservationId(reservationEntity.getId()); -//// reservationStockarticleEntity.setStockArticleStatus(distributionReservationPackageService.judgmentStatus()); -// reservationStockarticleEntity.setStockArticleId(s.getId()); -// reservationStockarticleEntity.setStockArticleStatus(ReservationOrderStatusConstant.zengjia.getValue()); -// reservationStockarticleEntity.setReservationNum(packageNum.get()); -// distributionReservationStockarticleService.save(reservationStockarticleEntity); -// packageTotal.getAndAdd(reservationStockarticleEntity.getReservationNum()); -// //拼接订单自编号 -// orderNumber.add(s.getOrderCode()); -// } else { -// //这里就表示这个订单和这个预约已经存在绑定关系,查看订单是否有修改包件的动作 -// List reservationPackageEntityList = distributionReservationMapper.selectPackageByReservationAndStockArticle(reservationEntity.getId(), s.getId()); -// Map> oldPackage = reservationPackageEntityList.stream().collect(Collectors.groupingBy(DistributionReservationPackageEntity::getParceListId)); -// List packageListInfo = s.getPackageListInfo(); -// Map> newPackage = packageListInfo.stream().collect(Collectors.groupingBy(DistributionParcelListEntity::getId)); -// newPackage.forEach((m, n) -> { -// if (Func.isEmpty(oldPackage.get(m))) { -// //新增包件 -// DistributionReservationPackageEntity reservationPackageEntity = new DistributionReservationPackageEntity(); -// reservationPackageEntity.setParceListId(n.get(0).getId()); -// reservationPackageEntity.setPacketBarCode(n.get(0).getOrderPackageCode()); -// reservationPackageEntity.setPacketBarStatus(ReservationPackageStatusConstant.xinzeng.getValue()); -// reservationPackageEntity.setReservationId(reservationEntity.getId()); -// reservationPackageEntity.setStockArticleId(s.getId()); -// distributionReservationPackageService.save(reservationPackageEntity); -// DistributionParcelListEntity parcelListEntity = n.get(0); -// parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.yiyueyue.getValue()); -// distributionParcelListService.updateById(parcelListEntity); -// packageNum.getAndAdd(parcelListEntity.getQuantity()); -// } else { -// //列表存在这个订单,将它进行移除 -// oldPackage.remove(m); -// } -// }); -// oldPackage.forEach((i, j) -> { -// DistributionReservationPackageEntity distributionReservationPackageEntity = j.get(0); -// distributionReservationPackageEntity.setPacketBarStatus(ReservationPackageStatusConstant.quxiao.getValue()); -// distributionReservationPackageService.updateById(distributionReservationPackageEntity); -// DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(distributionReservationPackageEntity.getParceListId()); -// parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.daiyuyue.getValue()); -// distributionParcelListService.updateById(parcelListEntity); -// //统计减少包件数量 -// reduceNum.getAndAdd(parcelListEntity.getQuantity()); -// //移除订单信息前端不会将取消的包件信息传递至后端,这里需要找出该订单下被选择的包件信息进行全部取消的操作 -// -// //这些数据就是取消的包件 -// }); -// //这里修改结束需要对包件信息进行维护 -// //订单的预约状态判断改变 -// s.setReservationStatus(distributionReservationPackageService.judgmentStatus(s)); -// distributionStockArticleService.updateById(s); -// List reservationStockarticleEntities = oldStockArticle.get(s.getId()); -// DistributionReservationStockarticleEntity reservationStockarticleEntity = reservationStockarticleEntities.get(0); -// reservationStockarticleEntity.setReservationNum(reservationStockarticleEntity.getReservationNum() + packageNum.get() - reduceNum.get()); -// distributionReservationStockarticleService.updateById(reservationStockarticleEntity); -// packageTotal.getAndAdd(reservationStockarticleEntity.getReservationNum()); -// oldStockArticle.remove(s.getId()); -// } -// }); -// //需要进行移除的订单 -// oldStockArticle.forEach((a, b) -> { -// DistributionReservationStockarticleEntity reservationStockarticleEntity = b.get(0); -// DistributionStockArticleEntity articleEntity = distributionStockArticleService.getById(reservationStockarticleEntity.getStockArticleId()); -// DistributionStockArticleDTO articleDTO = Func.copy(articleEntity, DistributionStockArticleDTO.class); -// reservationStockarticleEntity.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); -// distributionReservationStockarticleService.updateById(reservationStockarticleEntity); -// //这里需要对订单的预约状态进行判断后修改 -// articleEntity.setReservationStatus(distributionReservationPackageService.judgmentStatus(articleDTO)); -// distributionStockArticleService.updateById(articleEntity); -// //订单自编号取消 -// orderNumber.remove(articleEntity.getOrderCode()); -// reduceOrder.getAndAdd(reservationStockarticleEntity.getReservationNum()); -// // 这里移除订单还需要对这个订单下存在的包件进行批量取消 -// List reservationPackageEntityList = distributionReservationPackageService.getBaseMapper().selectList( -// Wrappers.query().lambda() -// .eq(DistributionReservationPackageEntity::getReservationId, b.get(0).getReservationId()) -// .eq(DistributionReservationPackageEntity::getStockArticleId, b.get(0).getStockArticleId())); -// reservationPackageEntityList.forEach(rs -> { -// rs.setPacketBarStatus(ReservationPackageStatusConstant.quxiao.getValue()); -// distributionReservationPackageService.updateById(rs); -// }); -// }); -// // 对预约任务进行修改信息完善 -// //对预约进行修改 -// DistributionReservationDTO reservation = deliveryListDTO.getReservation(); -// reservationEntity.setReservationNum(packageTotal.get()); -// reservationEntity.setStockArticleId(String.join(",", orderNumber)); -// reservationEntity.setServeType(reservation.getServeType()); -// reservationEntity.setDeliveryWay(reservation.getDeliveryWay()); -// reservationEntity.setDeliveryType(DistributionTypeConstant.shangpei.getValue()); -// reservationEntity.setOtherFee(reservation.getOtherFee()); -// originalClient.remove(k); -// distributionReservationMapper.updateById(reservationEntity); -// } -// }); -// //TODO 对取消的预约进行标识 -// originalClient.forEach((f, g) -> { -// DistributionReservationEntity reservationEntity = baseMapper.selectReservationByDeliveryListIdAndCustomer(deliveryListEntity.getId(), f); -// reservationEntity.setReservationStatus(ReservationStatusConstant.yiquexiao.getValue()); -// distributionReservationMapper.updateById(reservationEntity); -// //这里还需要将减少的预约单下的所有订单、包件进行取消状态 -// List entities = distributionReservationStockarticleMapper.selectList(Wrappers.query().lambda() -// .ne(DistributionReservationStockarticleEntity::getStockArticleStatus, "2") -// .eq(DistributionReservationStockarticleEntity::getReservationId, reservationEntity.getId())); -// entities.forEach(e->{ -// e.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); -// distributionReservationStockarticleService.updateById(e); -// //这个订单的包件预约进行取消 -// List packageEntityList = distributionReservationPackageMapper.selectList(Wrappers.query().lambda().eq(DistributionReservationPackageEntity::getStockArticleId, e.getStockArticleId()).ne(DistributionReservationPackageEntity::getPacketBarStatus, "2")); -// packageEntityList.forEach(p->{ -// p.setPacketBarStatus(ReservationPackageStatusConstant.quxiao.getValue()); -// distributionReservationPackageService.updateById(p); -// DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(p.getParceListId()); -// parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.daiyuyue.getValue()); -// distributionParcelListService.updateById(parcelListEntity); -// }); -// DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(e.getStockArticleId()); -// stockArticleEntity.setReservationStatus(distributionReservationPackageService.judgmentStatus(Func.copy(stockArticleEntity,DistributionStockArticleDTO.class))); -// distributionStockArticleService.updateById(stockArticleEntity); -// //修改预约状态和包件状态 -// }); -// List reservationEntities = originalClient.get(f); -// reservationEntities.forEach(r->{ -// distributionSignforMapper.deleteByReservationAndDeliveryId(r.getId(),deliveryListEntityId); -// }); -// }); + } + + private boolean checkList(List list, Long id, Long stockArticleId, String orderPackageCode) { + + return list.stream().anyMatch(e -> e.getStockArticleId().equals(stockArticleId) && e.getPacketBarCode().equals(orderPackageCode) && e.getReservationId().equals(id)); + } + @NotNull + private static JSONObject getJsonObject(DistributionDeliveryListEntity deliveryListEntity, DistributionReservationEntity reservationEntity, String reservationPackageEntity) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("trainNumber", deliveryListEntity.getTrainNumber()); + jsonObject.put("receiver", reservationEntity.getConsignee()); + jsonObject.put("receiveAddr", reservationEntity.getDeliveryAddress()); + jsonObject.put("receiveTel", reservationEntity.getDeliveryPhone()); + jsonObject.put("planDeliveryDate", deliveryListEntity.getTaskTime()); + jsonObject.put("packageCode", reservationPackageEntity); + return jsonObject; + } + @Override public R loadinginventoryDe(DistrilbutionloadingscanDTO distrilbutionloadingscanDTO) { //库存品 @@ -4089,9 +3901,11 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl newReservationIds = reservationInfos.stream().map(DistributionReservationDTO::getId).collect(Collectors.toList()); List distributionReservationEntities = distributionReservationMapper.selectList(Wrappers.query().lambda().in(DistributionReservationEntity::getId, newReservationIds)); List needStockUpReservationList = distributionReservationEntities.stream().filter(r -> r.getStockupStatus().equals(ReservationStockupStatusConstant.weibeihuo.getValue())).collect(Collectors.toList()); + DistributionStockupEntity stockupEntity = null; BladeUser user = AuthUtil.getUser(); if (Func.isNotEmpty(needStockUpReservationList)) { + log.info("修改市配配送任务需要进行备货的预约计划>>>reservationCodes:{}", needStockUpReservationList.stream().map(DistributionReservationEntity::getReservationCode).collect(Collectors.joining(","))); //需要进行备货的预约列表 stockupEntity = new DistributionStockupEntity(); stockupEntity.setAssignStatus(StockAssignStatusConstant.weizhipai.getValue()); @@ -4106,10 +3920,12 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl newstockUpIds = new ArrayList<>(); + distributionStockupMapper.insert(stockupEntity); for (DistributionReservationEntity distributionReservationEntity : needStockUpReservationList) { DistributionStockupInfoEntity distributionStockupInfoEntity = new DistributionStockupInfoEntity(); @@ -4117,6 +3933,15 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl>>>>>>>>>>>>>>>>:{}", distributionReservationEntity.getId()); + } + if (!newstockUpIds.isEmpty()) { + log.info("新增预约单至配送计划>>>>>>>>>>>>>>>>>>>>ids:{}", newstockUpIds); + distributionReservationService.update(Wrappers.update().lambda() + .in(DistributionReservationEntity::getId, newstockUpIds) + .set(DistributionReservationEntity::getStockupStatus, ReservationStockupStatusConstant.daibeihuo.getValue()) + ); } } //这里暂时不考虑出现新增的情况 @@ -4130,6 +3955,9 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl newIds = new ArrayList<>(); + List oldIds = new ArrayList<>(); + List newReservationEntities = new ArrayList<>(); newReservation.forEach((k, v) -> { clientTotal.getAndIncrement(); //统计配送包件总数量 @@ -4144,6 +3972,8 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl>>>>>>>>>>>>>>>>>>>ids:{}", newIds); + distributionReservationService.update(Wrappers.update().lambda() + .in(DistributionReservationEntity::getId, newIds) + .set(DistributionReservationEntity::getReservationStatus, ReservationStatusConstant.daipeisong.getValue()) + ); + String content = "包件在" + myCurrentWarehouse.getName() + "由" + AuthUtil.getUser().getNickName() + "转车次任务,操作方式:车次添加预约计划,车次号:" + deliveryListEntity.getTrainNumber(); + String ids = newIds.stream().map(String::valueOf).collect(Collectors.joining(",")); + distributionAsyncService.recordsReservationDeliveryLog(newReservationEntities, myCurrentWarehouse, AuthUtil.getUser(), deliveryListEntity, WorkNodeEnums.PLAN_DISTRIBUTION.getCode(), content); + } + List oldReservationEntities = new ArrayList<>(); oldReservation.forEach((m, n) -> { //这里就是取消的预约单,进行状态回退 DistributionReservationEntity reservationEntity = n.get(0); reservationEntity.setReservationStatus(ReservationStatusConstant.yiqueren.getValue()); + reservationEntity.setStockupStatus(ReservationStockupStatusConstant.weibeihuo.getValue()); distributionReservationMapper.updateById(reservationEntity); //删除配送预约中间表信息 distributionSignforMapper.deleteByReservationAndDeliveryId(reservationEntity.getId(), deliveryListEntity.getId()); //删除Redis中的reservationCode - bladeRedis.del(user.getTenantId()+":"+ ModuleNameConstant.APPLICATION_DISTRIBUTION_NAME+":reservationLock"+reservationEntity.getReservationCode()); + bladeRedis.del(user.getTenantId() + ":" + ModuleNameConstant.APPLICATION_DISTRIBUTION_NAME + ":reservationLock" + reservationEntity.getReservationCode()); + //取消备货中间表 + distributionStockupInfoService.update(Wrappers.update().lambda() + .eq(DistributionStockupInfoEntity::getReservationId, reservationEntity.getId()) + .set(DistributionStockupInfoEntity::getStockStatus, "4") + ); + oldReservationEntities.add(reservationEntity); + oldIds.add(reservationEntity.getId()); }); + if (!oldIds.isEmpty()) { + String content = "包件在" + myCurrentWarehouse.getName() + "由" + AuthUtil.getUser().getNickName() + "取消配车计划,操作方式:车次移除预约计划,车次号:" + deliveryListEntity.getTrainNumber(); + String ids = oldIds.stream().map(String::valueOf).collect(Collectors.joining(",")); + distributionAsyncService.recordsReservationDeliveryLog(oldReservationEntities, myCurrentWarehouse, AuthUtil.getUser(), deliveryListEntity, WorkNodeEnums.CANCEL_DISTRIBUTION.getCode(), content); + } + //修改备货信息 String kind = deliveryListEntity.getKind(); switch (kind) { @@ -4197,6 +4049,11 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl { DistributionDeliverySelfEntity deliverySelfEntity = Func.copy(a, DistributionDeliverySelfEntity.class); if (a.getDriverName().equals(deliveryListDTO.getMasterDriverName()) && a.getVehicleNub().equals(deliveryListDTO.getMasterVehicleNub())) { @@ -4244,14 +4101,6 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl parcelNumberVOS = baseMapper.getZeroPackageListByDeliveryId(distributionDeliveryInfoDTO.getDeliveryId()); List deliveryStockArticleInfo = baseMapper.getDeliveryStockArticleInfo(deliveryId); @@ -4278,7 +4128,9 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl parcelListVOIPage = new Page<>(); - List loadscanEntities = distributionLoadscanMapper.selectList(Wrappers.query().lambda().eq(DistributionLoadscanEntity::getDeliveryId, deliveryId).ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())); + List loadscanEntities = distributionLoadscanMapper.selectList(Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getDeliveryId, deliveryId) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())); Map loadingDataMap = null; if (Func.isNotEmpty(loadscanEntities)) { loadingDataMap = loadscanEntities.stream().collect(Collectors.toMap(DistributionLoadscanEntity::getPackageId, Function.identity(), (k1, k2) -> k2)); @@ -4287,6 +4139,16 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl distributionParcelListVOS = new ArrayList<>(); if (Func.isNotEmpty(reservationStockarticleEntityList)) { List orderIds = reservationStockarticleEntityList.stream().filter(order -> order.getIsZero().equals(IsOrNoConstant.no.getValue())).map(DistributionReservationStockarticleEntity::getStockArticleId).collect(Collectors.toList()); + List reservationId = reservationStockarticleEntityList.stream().map(DistributionReservationStockarticleEntity::getReservationId).collect(Collectors.toList()); + Map map = new HashMap<>(); + if (!reservationId.isEmpty()) { + for (Long l : reservationId) { + List distributionStockArticleVOS = distributionReservationMapper.selectOrderInfoByReservationId(l); + distributionStockArticleVOS.forEach(s -> { + map.put(s.getId(), s.getReservationCode()); + }); + } + } if (Func.isNotEmpty(orderIds)) { //查询该客户的非零但订单包间 IPage parcelListEntityList = distributionReservationMapper.getReservationPackage(page, orderIds, distributionDeliveryInfoDTO); @@ -4296,6 +4158,10 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl parcelListVOList = DistributionParcelListWrapper.build().listVO(parcelListEntityList.getRecords()); for (DistributionParcelListVO distributionParcelListVO : parcelListVOList) { // log.info(">>>>>> distributionParcelListVO {}", distributionParcelListVO); + distributionParcelListVO.setDeliveryTrainNumber(deliveryListEntity.getTrainNumber()); + if (!map.isEmpty()) { + distributionParcelListVO.setReservationCode(map.get(distributionParcelListVO.getStockArticleId())); + } if (Func.isNotEmpty(loadingDataMap)) { DistributionLoadscanEntity loadscanEntity = loadingDataMap.get(distributionParcelListVO.getId()); // log.info(">>>>>> loadscanEntity {}", loadscanEntity); @@ -4340,6 +4206,25 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl parcelNumberVOS = baseMapper.getZeroPackageListByDeliveryId(distributionDeliveryInfoDTO.getDeliveryId()); + DistributionDeliveryListEntity deliveryListEntity = this.getById(deliveryId); + List deliveryStockArticleInfo = baseMapper.getDeliveryStockArticleInfo(deliveryId); if (Func.isEmpty(deliveryStockArticleInfo)) { log.error("配送任务订单查询异常:{}", deliveryStockArticleInfo); @@ -4539,6 +4426,16 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl distributionParcelListVOS = new ArrayList<>(); if (Func.isNotEmpty(reservationStockarticleEntityList)) { List orderIds = reservationStockarticleEntityList.stream().filter(order -> order.getIsZero().equals(IsOrNoConstant.no.getValue())).map(DistributionReservationStockarticleEntity::getStockArticleId).collect(Collectors.toList()); + List reservationId = reservationStockarticleEntityList.stream().map(DistributionReservationStockarticleEntity::getReservationId).collect(Collectors.toList()); + Map map = new HashMap<>(); + if (!reservationId.isEmpty()) { + for (Long l : reservationId) { + List distributionStockArticleVOS = distributionReservationMapper.selectOrderInfoByReservationId(l); + distributionStockArticleVOS.forEach(s -> { + map.put(s.getId(), s.getReservationCode()); + }); + } + } if (Func.isNotEmpty(orderIds)) { //查询该客户的非零但订单包间 List parcelListEntityList = distributionReservationMapper.getReservationPackageByDeliveryId(orderIds, deliveryId); @@ -4548,6 +4445,10 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl parcelListVOList = DistributionParcelListWrapper.build().listVO(parcelListEntityList); for (DistributionParcelListVO distributionParcelListVO : parcelListVOList) { log.info(">>>>>> distributionParcelListVO {}", distributionParcelListVO); + distributionParcelListVO.setDeliveryTrainNumber(deliveryListEntity.getTrainNumber()); + if (!map.isEmpty()) { + distributionParcelListVO.setReservationCode(map.get(distributionParcelListVO.getStockArticleId())); + } if (Func.isNotEmpty(loadingDataMap)) { DistributionLoadscanEntity loadscanEntity = loadingDataMap.get(distributionParcelListVO.getId()); log.info(">>>>>> loadscanEntity {}", loadscanEntity); @@ -4684,14 +4585,17 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl().lambda().eq(DistributionDeliverySelfEntity::getId, loadingId).set(DistributionDeliverySelfEntity::getDepartureTime, format)); + b = distributionDeliverySelfService.update(new UpdateWrapper().lambda() + .eq(DistributionDeliverySelfEntity::getId, loadingId) + .set(DistributionDeliverySelfEntity::getDepartureTime, format) + ); } else { b = distributionDeliveryTripartiteService.update(new UpdateWrapper().lambda().eq(DistributionDeliveryTripartiteEntity::getId, loadingId).set(DistributionDeliveryTripartiteEntity::getDepartureTime, format)); @@ -4734,19 +4638,30 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl { + message.getMessageProperties() + .setHeader("x-delay", 5000); + return message; + }); + } catch (Exception customerException) { + log.error(">>>>>>>>>>>>>>>>>>>>>>>>>> 消息推送失败~ 请联系管理员! ", customerException); - return Resp.scanFail("发车成功", builder.toString()); + } + // 推送数据 + return Resp.scanSuccess("发车成功", builder.toString()); } @Override @@ -4766,7 +4681,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl reservationStockarticleEntityList = distributionReservationStockarticleMapper.selectList(Wrappers.query().lambda().eq(DistributionReservationStockarticleEntity::getReservationId, reservationEntity.getId()).ne(DistributionReservationStockarticleEntity::getStockArticleStatus, ReservationOrderStatusConstant.quxiao.getValue())); reservationStockarticleEntityList.forEach(o -> { @@ -4822,7 +4737,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl collect = list.stream().filter(l -> !l.getScanStatus().equals(LoadingStatusConstant.quxiao.getValue())).map(DistributionLoadscaninvnEntity::getScanUser).collect(Collectors.toList()); // int loadingNum = list.stream().mapToInt(DistributionLoadscaninvnEntity::getLoadedNub).sum(); // rs.setLoadedinNumber(loadingNum); - HashSet strings = new HashSet<>(collect); + HashSet strings = new HashSet<>(collect); rs.setScanUser(String.join(",", strings)); //查询库存品包件列表 List stockListDetailEntityList = disStockListDetailService.list(Wrappers.query().lambda() @@ -4832,37 +4747,37 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl InventoryLoadingStatusConstant.yizhuangche.getValue().equals(f.getStockLockingStatus())).mapToInt(DisStockListDetailEntity::getNum).sum(); rs.setLoadedinNumber(loadingNum); - if (loadingNum == rs.getReservationNum() ){ + if (loadingNum == rs.getReservationNum()) { rs.setLoadingStatusName(DeliveryLoadingStatusConstant.yizhuangche.getName()); - }else { - if (loadingNum > 0){ + } else { + if (loadingNum > 0) { rs.setLoadingStatusName(DeliveryLoadingStatusConstant.bunfenzhuangche.getName()); } - if (loadingNum == 0){ + if (loadingNum == 0) { rs.setLoadingStatusName(DeliveryLoadingStatusConstant.weizhuangche.getName()); } } int signingNum = stockListDetailEntityList.stream().filter(f -> InventorySigningStatusConstant.yiqianshou.getValue().equals(f.getStockSignfoStatus())).mapToInt(DisStockListDetailEntity::getNum).sum(); - if (signingNum == rs.getReservationNum() ){ + if (signingNum == rs.getReservationNum()) { rs.setSigningStatusName(ReservationSigningStatusConstant.yiqianshou.getName()); - }else { - if (signingNum > 0){ + } else { + if (signingNum > 0) { rs.setSigningStatusName(ReservationSigningStatusConstant.bufenqianshou.getName()); } - if (signingNum == 0){ + if (signingNum == 0) { rs.setSigningStatusName(ReservationSigningStatusConstant.daiqianshou.getName()); } } rs.setSignedinNumber(signingNum); int stockupNum = stockListDetailEntityList.stream().filter(f -> InventoryStockUpStatusConstant.yibeihuo.getValue().equals(f.getStockStatus())).mapToInt(DisStockListDetailEntity::getNum).sum(); rs.setStockupNum(stockupNum); - if (stockupNum == rs.getReservationNum()){ + if (stockupNum == rs.getReservationNum()) { rs.setStockUpStatusName(StockupStatusConstant.yibeihuo.getName()); - }else { - if (stockupNum > 0){ + } else { + if (stockupNum > 0) { rs.setStockUpStatusName(StockupStatusConstant.beihuozhong.getName()); } - if (stockupNum == 0){ + if (stockupNum == 0) { rs.setStockUpStatusName(StockupStatusConstant.daibeihuo.getName()); } } @@ -4950,8 +4865,6 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl printBatch(String ids, Integer type) throws Exception { - PrintPreviewVO printPreviewVO = new PrintPreviewVO(); - BasicPrintTemplateEntity template = getPrintTemplate(type); String html = TemplateUtil.getTemplateByUrl(template.getTemplateUrl()); @@ -5006,12 +4919,13 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl distrilbutionBillPackageEntities = distrilbutionBillPackageMapper.selectList(distrilbutionBillStockEntityLambdaQueryWrapper); - Set ids = new HashSet(); - for (DistrilbutionBillPackageEntity distrilbutionBillPackageEntity : distrilbutionBillPackageEntities) { - ids.add(distrilbutionBillPackageEntity.getParceListId()); + List distributionParcelListEntities = new ArrayList<>(); + if (!distrilbutionBillPackageEntities.isEmpty()) { + List ids = distrilbutionBillPackageEntities.stream().map(DistrilbutionBillPackageEntity::getParceListId).collect(Collectors.toList()); + if (!ids.isEmpty()) { + distributionParcelListEntities = distributionParcelListMapper.selectBatchIds(ids); + } } - // 得到所以的订单列表 - List distributionParcelListEntities = distributionParcelListMapper.selectBatchIds(ids); Map map = new HashMap<>(); @@ -5022,6 +4936,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl map, List distrilbutionBillStockEntities, List distributionParcelListEntities, DistrilbutionBillLadingEntity distrilbutionBillLadingEntity) { // 查询订单集合 - Set ids = new HashSet(); - for (DistrilbutionBillStockEntity distrilbutionBillStockEntity : distrilbutionBillStockEntities) { - ids.add(distrilbutionBillStockEntity.getStockArticleId()); - } - // 得到所以的订单列表 - List distributionStockArticleEntities = distributionStockArticleMapper.selectBatchIds(ids); + int a = 1; + List> ls = new ArrayList<>(); + // 获取订单中的商城和收货单位 StringBuilder consigneeUnit = new StringBuilder(); StringBuilder mailNames = new StringBuilder(); - List> ls = new ArrayList<>(); + int hejiNum = 0; + Map m = new HashMap<>(); + + + // 查询库存品信息 + List detailsEntities = distributionDeliveryDetailsService.list(Wrappers.query().lambda() + .eq(DistributionDeliveryDetailsEntity::getBillLadingId, distrilbutionBillLadingEntity.getId()) + .ne(DistributionDeliveryDetailsEntity::getStockStatus, ReservationOrderStatusConstant.quxiao.getValue()) + ); + + - int a = 1; // 构建产品明细的表头 -- 这里目前只处理了定制品和有数据的库存品,对于零担 还没有处理 List> listMapTemp = new ArrayList<>(); - Map m = new HashMap<>(); - int hejiNum = 0; for (DistributionParcelListEntity distributionParcelListEntity : distributionParcelListEntities) { if (StringUtils.isBlank(distributionParcelListEntity.getThirdProduct())) { distributionParcelListEntity.setThirdProduct("其它"); @@ -5107,84 +5026,154 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl ts = new ArrayList<>(); - for (DistributionParcelListEntity distributionParcelListEntity : distributionParcelListEntities) { - if (distributionParcelListEntity.getStockArticleId().equals(distributionStockArticleEntity.getId())) { - ts.add(distributionParcelListEntity); + if (!distrilbutionBillStockEntities.isEmpty()) { + List ids = distrilbutionBillStockEntities.stream().map(DistrilbutionBillStockEntity::getStockArticleId).collect(Collectors.toList()); + // 得到所以的订单列表 + List distributionStockArticleEntities = distributionStockArticleMapper.selectBatchIds(ids); + for (DistributionStockArticleEntity distributionStockArticleEntity : distributionStockArticleEntities) { + Map tempMap = new HashMap<>(); + // 需要从所有的包件的 + List ts = new ArrayList<>(); + for (DistributionParcelListEntity distributionParcelListEntity : distributionParcelListEntities) { + if (distributionParcelListEntity.getStockArticleId().equals(distributionStockArticleEntity.getId())) { + ts.add(distributionParcelListEntity); + } } - } - if (!mailNames.toString().contains(distributionStockArticleEntity.getMallName())) { - if (!mailNames.toString().isEmpty()) { - mailNames.append(","); + if (!mailNames.toString().contains(distributionStockArticleEntity.getMallName())) { + if (!mailNames.toString().isEmpty()) { + mailNames.append(","); + } + mailNames.append(distributionStockArticleEntity.getMallName()); } - mailNames.append(distributionStockArticleEntity.getMallName()); - } - if (!consigneeUnit.toString().contains(distributionStockArticleEntity.getConsigneeUnit())) { - if (!consigneeUnit.toString().isEmpty()) { - consigneeUnit.append(","); + if (!consigneeUnit.toString().contains(distributionStockArticleEntity.getConsigneeUnit())) { + if (!consigneeUnit.toString().isEmpty()) { + consigneeUnit.append(","); + } + consigneeUnit.append(distributionStockArticleEntity.getConsigneeUnit()); } - consigneeUnit.append(distributionStockArticleEntity.getConsigneeUnit()); - } - Map tempMap = new HashMap<>(); - tempMap.put("序号", a); - tempMap.put("运单号", distributionStockArticleEntity.getWaybillNumber()); - tempMap.put("合同号", distributionStockArticleEntity.getOrderCode()); - String materialNameStr = buildMaterialNameStr(distributionParcelListEntities); - tempMap.put("物料名称", materialNameStr); + tempMap.put("序号", a); + tempMap.put("运单号", distributionStockArticleEntity.getWaybillNumber()); + tempMap.put("合同号", distributionStockArticleEntity.getOrderCode()); + String materialNameStr = buildMaterialNameStr(distributionParcelListEntities); + tempMap.put("物料名称", materialNameStr); + tempMap.put("签收件数", 0); - // 构建产品明细 --对于每一个订单 - buildProductDetail(tempMap, m, ts); + // 构建产品明细 --对于每一个订单 + buildProductDetail(tempMap, m, ts); - Map os = (Map) tempMap.get("产品明细"); + Map os = (Map) tempMap.get("产品明细"); - Set strings = os.keySet(); - int sumNum = 0; - for (String string : strings) { - Object o = os.get(string); - sumNum += (o != null) ? (int) o : 0; - } - tempMap.put("小计", sumNum); - hejiNum += sumNum; - // 查询货物货位 - - //通过订单id和预约id查询对应包件的库位信息 - List orderPackageCodes = ts.stream() - .map(DistributionParcelListEntity::getOrderPackageCode) // 获取每个对象的orderPackageCode - .collect(Collectors.toList()); - - - List orderPackageIds = ts.stream() - .map(DistributionParcelListEntity::getId) // 获取每个对象的包件ID - .collect(Collectors.toList()); - if (Func.isNotEmpty(orderPackageCodes)){ - List allocationStrList = distributionParcelListMapper.selectAllocationInforByOrderPackageCode(orderPackageCodes, distrilbutionBillLadingEntity.getWarehouseId()); - String allocationStr = StringUtils.join(allocationStrList, ","); - tempMap.put("货位", allocationStr); - } + Set strings = os.keySet(); + int sumNum = 0; + for (String string : strings) { + Object o = os.get(string); + sumNum += (o != null) ? (int) o : 0; + } + tempMap.put("小计", sumNum); + hejiNum += sumNum; + // 查询货物货位 - //通过订单id和预约id查询对应包件的备货区信息 - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(DistributionStockEntity::getBillLadingId, distrilbutionBillLadingEntity.getId()) - .in(DistributionStockEntity::getParcelListId, orderPackageIds); - List distributionStockEntities = distributionStockMapper.selectList(lambdaQueryWrapper); + //通过订单id和预约id查询对应包件的库位信息 + List orderPackageCodes = ts.stream() + .map(DistributionParcelListEntity::getOrderPackageCode) // 获取每个对象的orderPackageCode + .collect(Collectors.toList()); - Set stockupAreaStrList = distributionStockEntities.stream().map(DistributionStockEntity::getStockupArea).collect(Collectors.toSet()); - String stockupAreaStr = StringUtils.join(stockupAreaStrList, ","); - tempMap.put("备货区", stockupAreaStr); + List orderPackageIds = ts.stream() + .map(DistributionParcelListEntity::getId) // 获取每个对象的包件ID + .collect(Collectors.toList()); + if (Func.isNotEmpty(orderPackageCodes)) { + List allocationStrList = distributionParcelListMapper.selectAllocationInforByOrderPackageCode(orderPackageCodes, distrilbutionBillLadingEntity.getWarehouseId()); + String allocationStr = StringUtils.join(allocationStrList, ","); + tempMap.put("货位", allocationStr); + } + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(DistributionStockEntity::getBillLadingId, distrilbutionBillLadingEntity.getId()); + if (!orderPackageIds.isEmpty()) { + lambdaQueryWrapper.in(DistributionStockEntity::getParcelListId, orderPackageIds); + } + //通过订单id和预约id查询对应包件的备货区信息 + List distributionStockEntities = distributionStockMapper.selectList(lambdaQueryWrapper); + if (!distributionStockEntities.isEmpty()) { + Set stockupAreaStrList = distributionStockEntities.stream().map(DistributionStockEntity::getStockupArea).collect(Collectors.toSet()); + String stockupAreaStr = StringUtils.join(stockupAreaStrList, ","); + tempMap.put("备货区", stockupAreaStr); + } + //查询签收件数 + List ladingScanEntities = distributionBillLadingScanService.list(Wrappers.query().lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, distrilbutionBillLadingEntity.getId()) + .eq(DistributionBillLadingScanEntity::getStockArticleId, distributionStockArticleEntity.getId()) + ); + if (!ladingScanEntities.isEmpty()) { + int sum = ladingScanEntities.stream().mapToInt(DistributionBillLadingScanEntity::getQuantity).sum(); + tempMap.put("签收件数", sum); + } + ls.add(tempMap); + a++; + } - ls.add(tempMap); - a++; + } + if (!detailsEntities.isEmpty()) { + Map> inventoryMap = detailsEntities.stream().collect(Collectors.groupingBy(DistributionDeliveryDetailsEntity::getStockListId)); + List inventoryIds = detailsEntities.stream().map(DistributionDeliveryDetailsEntity::getStockListId).collect(Collectors.toList()); + List distributionStockListEntities = distributionStockListService.listByIds(inventoryIds); + if (!distributionStockListEntities.isEmpty()) { + List> iList = new ArrayList<>(); + for (DistributionStockListEntity distributionStockListEntity : distributionStockListEntities) { + Map tempMap = new HashMap<>(); + tempMap.put("序号", a); + tempMap.put("批次号", distributionStockListEntity.getIncomingBatch()); + tempMap.put("产品名称", distributionStockListEntity.getDescriptionGoods()); + tempMap.put("单位", distributionStockListEntity.getCargoUnit()); + tempMap.put("物料编码", distributionStockListEntity.getCargoNumber()); + tempMap.put("物料单位", distributionStockListEntity.getCargoUnit()); + tempMap.put("物料规格", distributionStockListEntity.getCargoNorms()); + //构建产品明细 + //查询此订制品库位信息 + DistributionDeliveryDetailsEntity distributionDeliveryDetailsEntity = inventoryMap.get(distributionStockListEntity.getId()).get(0); + Integer quantity = distributionDeliveryDetailsEntity.getQuantity(); + //查询签收数量 + List list = disStockListDetailService.list(Wrappers.query().lambda() + .eq(DisStockListDetailEntity::getReservationId, distributionDeliveryDetailsEntity.getBillLadingId()) + .ne(DisStockListDetailEntity::getStockPackageStatus, ReservationPackageStatusConstant.quxiao.getValue()) + ); + tempMap.put("签收件数", 0); + if (!list.isEmpty()) { + int sum = list.stream().filter(l -> InventorySigningStatusConstant.yiqianshou.getValue().equals(l.getStockSignfoStatus())).mapToInt(DisStockListDetailEntity::getNum).sum(); + tempMap.put("签收件数", sum); + } + tempMap.put("数量", quantity); + hejiNum += quantity; + tempMap.put("小计", quantity); + //这里只进行计划指定的批次库位进行整理 + tempMap.put("货位", distributionStockListEntity.getStorageLocation()); + tempMap.put("备货区", ""); + tempMap.put("备货件数",distributionDeliveryDetailsEntity.getRealityQuantity()); + iList.add(tempMap); + a++; + if (!mailNames.toString().contains(distributionStockListEntity.getMarketName())) { + if (!mailNames.toString().isEmpty()) { + mailNames.append(","); + } + mailNames.append(distributionStockListEntity.getMarketName()); + } + if (!consigneeUnit.toString().contains(distributionStockListEntity.getMarketName())) { + if (!consigneeUnit.toString().isEmpty()) { + consigneeUnit.append(","); + } + consigneeUnit.append(distributionStockListEntity.getMarketName()); + } + } + if (!iList.isEmpty()) { + map.put("库存品集合",iList); + } + } } map.put("收货单单位", consigneeUnit.toString()); @@ -5192,13 +5181,18 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl m1 = new HashMap<>(); - m1.put("产品明细", m); + if (!m.isEmpty()) { + m1.put("产品明细", m); + m1.put("产品明细长度", m.size()); + } m1.put("合计数量", hejiNum); + map.put("合计", m1); } + /** * 构建分类明细 * @@ -5279,7 +5273,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl reservationPackageEntityList = distributionReservationPackageMapper.selectList(Wrappers.query().lambda().eq(DistributionReservationPackageEntity::getReservationId, distrilbutionloadingscanDTO.getReservationId()).like(DistributionReservationPackageEntity::getPacketBarCode, distrilbutionloadingscanDTO.getBarcode())); - if (Func.isNotEmpty(reservationPackageEntityList) && reservationPackageEntityList.size() > 0) { + if (Func.isNotEmpty(reservationPackageEntityList) && !reservationPackageEntityList.isEmpty()) { List longs = reservationPackageEntityList.stream().map(DistributionReservationPackageEntity::getParceListId).collect(Collectors.toList()); collect = distributionParcelListService.listByIds(longs); } @@ -5350,13 +5344,16 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl getAppDeliveryreservationTraysPage(IPage page, DistributionAppDeliveryListDTO distributionDeliveryList) { + public List getAppDeliveryreservationTraysPage(DistributionAppDeliveryListDTO distributionDeliveryList) { // ---------------------------------2023-09-25 新增托盘详情--------------------------------------------------------------------------------------- - List customList = distributionDeliveryInfoMapper.selectAppTarysListPage(page, Long.parseLong(distributionDeliveryList.getReservationId())); + List customList = distributionDeliveryInfoMapper.selectAppTarysListPage(Long.parseLong(distributionDeliveryList.getReservationId())); List a = new ArrayList<>(); customList.forEach(c -> { String trayCode = c.getTrayCode(); - List loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda().eq(DistributionLoadscanEntity::getReservationId, distributionDeliveryList.getReservationId()).eq(DistributionLoadscanEntity::getTrayNo, trayCode).ne(DistributionLoadscanEntity::getScanStatus, "1")); + List loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getReservationId, distributionDeliveryList.getReservationId()) + .eq(DistributionLoadscanEntity::getTrayNo, trayCode) + .ne(DistributionLoadscanEntity::getScanStatus, "1")); c.setIsScan(1); if (Func.isNotEmpty(loadscanEntityList) && loadscanEntityList.size() > 0) { c.setIsScan(2); @@ -5381,7 +5378,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl packageLockIds = new ArrayList<>(); + List packageLockIds = new ArrayList<>(); List parcelListEntities = distributionParcelListService.list(Wrappers.query().lambda() .eq(DistributionParcelListEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode()) .eq(DistributionParcelListEntity::getWarehouseId, myCurrentWarehouse.getId()) ); + List orderPackageCodes = new ArrayList<>(); + List aaa = new ArrayList<>(); if (Func.isNotEmpty(parcelListEntities) && parcelListEntities.size() == 1) { DistributionParcelListEntity parcelListEntity = parcelListEntities.get(0); if (OrderPackageLoadingStatusConstant.yizhuangche.getValue().equals(parcelListEntity.getOrderPackageLoadingStatus())) { @@ -5440,6 +5439,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl 1) { return Resp.scanFail("操作失败", "重复添加"); } + String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); BladeUser user = AuthUtil.getUser(); DistributionLoadscanEntity loadscanEntity = new DistributionLoadscanEntity(); @@ -5476,7 +5476,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl jsonObjects = new ArrayList<>(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", loadscanEntity.getOrderPackageCode()); + jsonObject.put("warehouseId", myCurrentWarehouse.getId()); + jsonObject.put("taskId", loadscanEntity.getReservationId()); + jsonObject.put("type", 1); + jsonObject.put("num", 1); + jsonObject.put("remark", "异常装车下架"); + jsonObjects.add(jsonObject); + warehouseUpdownStockUpAreaClient.downStockUpShelf(jsonObjects); //修改包件装车状态 //修改包件状态 维护订单状态 parcelListEntity.setOrderPackageLoadingStatus(OrderPackageLoadingStatusConstant.yizhuangche.getValue()); parcelListEntity.setOrderPackageStatus(OrderPackageStatusConstant.yichuku.getValue()); distributionParcelListService.updateById(parcelListEntity); - Map map = new HashMap<>(); - map.put("orderPackageCode",distrilbutionloadingscanDTO.getBarcode()); - map.put("warehouseId",myCurrentWarehouse.getId()); + Map map = new HashMap<>(); + map.put("orderPackageCode", distrilbutionloadingscanDTO.getBarcode()); + map.put("warehouseId", myCurrentWarehouse.getId()); //出库 warehouseUpdownTypeClient.downDeliveryPackage(map); //查询本车次是否第一次扫码,没有则更新上车时间 @@ -5545,6 +5567,8 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl a = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + deliveryListEntity.getTrainNumber() + "orderPackageCode:" ); - if (Func.isNotEmpty(a)){ + if (!packageLockIds.isEmpty()) { + List a = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + deliveryListEntity.getTrainNumber() + "orderPackageCode:"); + if (Func.isNotEmpty(a)) { boolean flag = a.stream().anyMatch(any -> packageLockIds.contains(any)); - if (flag){ + if (flag) { //正在操作,请稍后重试 throw new RuntimeException("该包件正在被操作,请稍后再试!!!"); - }else { + } else { packageLockIds.addAll(a); - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + deliveryListEntity.getTrainNumber() + "orderPackageCode:" ,packageLockIds,60L); + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + deliveryListEntity.getTrainNumber() + "orderPackageCode:", packageLockIds, 60L); } - }else { - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + deliveryListEntity.getTrainNumber() + "orderPackageCode:",packageLockIds,60L); + } else { + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + deliveryListEntity.getTrainNumber() + "orderPackageCode:", packageLockIds, 60L); } } + trunklinePackageTrackLogClient.addPackageTrackLog(aaa); + + return Resp.scanSuccess("操作成功", "异常" + abnormalTotal + "件"); } @Override public R getPackageListByDeliveryIdAndOrderId(IPage page, Long deliveryId, Long orderId) { + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if (Func.isEmpty(myCurrentWarehouse)) { + return R.fail(403, "未授权!!!"); + } List allPackageList = new ArrayList<>(); List reservationPackageList = baseMapper.getPackageListByDeliveryId(deliveryId, orderId); DistributionReservationOrderPackageVO reservationOrderPackageVO = new DistributionReservationOrderPackageVO(); @@ -5587,6 +5618,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl parcelListEntityLambdaQueryWrapper = Wrappers.query().lambda() .notIn(DistributionParcelListEntity::getOrderPackageStatus, OrderPackageStatusConstant.yiqianshou.getValue(), OrderPackageStatusConstant.yichuku.getValue()) .ne(DistributionParcelListEntity::getOrderPackageLoadingStatus, OrderPackageLoadingStatusConstant.yizhuangche.getValue()) + .eq(DistributionParcelListEntity::getWarehouseId, myCurrentWarehouse.getId()) .eq(DistributionParcelListEntity::getStockArticleId, orderId); if (Func.isNotEmpty(reservationPackageList)) { List packageIds = reservationPackageList.stream().map(DistributionParcelListEntity::getId).collect(Collectors.toList()); @@ -5668,6 +5700,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl packageLockIds = new ArrayList<>(); + List jsonObjects = new ArrayList<>(); if (Func.isNotEmpty(distrilbutionloadingscanDTO.getReservationId())) { //查询该订单是否属于当前配送任务 List reservationStockarticleEntityList = distributionReservationMapper.selectStockArticleByReservationId(distrilbutionloadingscanDTO.getReservationId()); @@ -5698,6 +5731,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl 0) { str.append("异常").append(abnormalLoadingNum.get() + "件"); } - if (!packageLockIds.isEmpty()){ + if (!packageLockIds.isEmpty()) { List a = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:"); - if (Func.isNotEmpty(a)){ + if (Func.isNotEmpty(a)) { boolean aaa = a.stream().anyMatch(any -> packageLockIds.contains(any)); - if (aaa){ + if (aaa) { //正在操作,请稍后重试 throw new RuntimeException("该包件正在被操作,请稍后再试!!!"); - }else { + } else { packageLockIds.addAll(a); - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:" ,packageLockIds,60L); + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:", packageLockIds, 60L); } - }else { - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:",packageLockIds ,60L); + } else { + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + distributionDeliveryListEntity.getTrainNumber() + "orderPackageCode:", packageLockIds, 60L); } } return Resp.scanSuccess("装车成功", str.toString()); @@ -5903,37 +5966,289 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode()) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + .ne(DistributionLoadscanEntity::getSignforState, LoadScanSigningStatusConstant.yiqianshou.getValue()) + ); + if (loadscanEntityList.isEmpty()) { + //查询库存品 + List loadscaninvnEntityList = distributionLoadscaninvnService.list(Wrappers.query().lambda() + .eq(DistributionLoadscaninvnEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode()) + .ne(DistributionLoadscaninvnEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + .ne(DistributionLoadscaninvnEntity::getSignforState, LoadScanSigningStatusConstant.yiqianshou.getValue()) + ); + if (!loadscaninvnEntityList.isEmpty()) { + deliveryId = loadscaninvnEntityList.stream().map(DistributionLoadscaninvnEntity::getDeliveryId).distinct().collect(Collectors.toList()).get(0); + } + } else { + deliveryId = loadscanEntityList.stream().map(DistributionLoadscanEntity::getDeliveryId).distinct().collect(Collectors.toList()).get(0); + } + if (deliveryId == null) { + return Resp.scanFail("此包件无装车记录", "此包件无装车记录"); + } + } else { + deliveryId = distrilbutionloadingscanDTO.getDeliveryId(); + } + DistributionDeliveryListEntity deliveryListEntity = this.getById(deliveryId); List retentionScanVos = new ArrayList<>(); + switch (retentionType) { case 1: //包件--库存品 和包件 List loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda() - .eq(DistributionLoadscanEntity::getDeliveryId, distrilbutionloadingscanDTO.getDeliveryId()) .eq(DistributionLoadscanEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode()) .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + .eq(DistributionLoadscanEntity::getWarehouseId, myCurrentWarehouse.getId()) ); -// List parcelListEntities = baseMapper.selectPackageListByDeliveryListId(distrilbutionloadingscanDTO.getDeliveryId()); if (Func.isNotEmpty(loadscanEntityList)) { if (loadscanEntityList.size() == 1) { //包件存在装车才能进行滞留 //通过配送任务和包件确定预约信息 DistributionLoadscanEntity distributionLoadscanEntity = loadscanEntityList.get(0); - DistributionRetentionScanVo retentionScanVo = baseMapper.selectRetentionPackage(distributionLoadscanEntity.getOrderPackageCode(), distributionLoadscanEntity.getDeliveryId()); +// if (2 == distributionLoadscanEntity.getIsAbnormalLoading()) { +// //异常装车未进行审核 +// return Resp.scanFail("包件存在异常操作,请先处理异常", "包件存在异常操作,请先处理异常"); +// } + if (2 == distributionLoadscanEntity.getSignforState()) { + log.info("滞留扫描失败,包件已签收>>>>>>>>>>>>>>>>>>>>>>>reservationId:{},packageCode:{}", distributionLoadscanEntity.getReservationId(), distributionLoadscanEntity.getOrderPackageCode()); + return Resp.scanFail("包件已签收", "包件已签收"); + } + DistributionRetentionScanVo retentionScanVo = baseMapper.selectRetentionPackage(distributionLoadscanEntity.getOrderPackageCode(), distributionLoadscanEntity.getDeliveryId(), myCurrentWarehouse.getId()); + if (Func.isEmpty(retentionScanVo)){ + //不存在计划之中属于异常驳回的情况 + retentionScanVo = new DistributionRetentionScanVo(); + retentionScanVo.setDeliveryId(distributionLoadscanEntity.getDeliveryId()); + retentionScanVo.setOrderId(distributionLoadscanEntity.getOrderId()); + retentionScanVo.setReservationId(distributionLoadscanEntity.getReservationId()); + retentionScanVo.setTrainNumber(distributionLoadscanEntity.getTrainNumber()); + retentionScanVo.setConditions(1); + retentionScanVo.setScanType(1); + retentionScanVo.setRetentionQuantity(1); + retentionScanVo.setRetentionQuantity(1); + retentionScanVo.setOrderPackageId(distributionLoadscanEntity.getPackageId()); + //查询包件 + DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(distributionLoadscanEntity.getPackageId()); + retentionScanVo.setOrderCode(parcelListEntity.getOrderCode()); + retentionScanVo.setOrderPackageStatus(parcelListEntity.getOrderPackageStatus()); + retentionScanVo.setOrderPackageCode(parcelListEntity.getOrderPackageCode()); + retentionScanVo.setWaybillNumber(parcelListEntity.getWaybillNumber()); + retentionScanVo.setMaterialName(parcelListEntity.getMaterialName()); + retentionScanVo.setMaterialNumber(parcelListEntity.getMaterialCode()); + retentionScanVo.setWaybillId(parcelListEntity.getWaybillId()); + DistributionReservationEntity reservationEntity = distributionReservationMapper.selectById(distributionLoadscanEntity.getReservationId()); + retentionScanVo.setReservationCode(reservationEntity.getReservationCode()); + } + retentionScanVo.setWarehouseId(myCurrentWarehouse.getId()); + retentionScanVo.setWarehouseName(myCurrentWarehouse.getName()); + retentionScanVo.setLoadingId(distributionLoadscanEntity.getId()); retentionScanVos.add(retentionScanVo); } } else { List loadscaninvnEntityList = distributionLoadscaninvnService.list(Wrappers.query().lambda() - .eq(DistributionLoadscaninvnEntity::getDeliveryId, distrilbutionloadingscanDTO.getDeliveryId()) .eq(DistributionLoadscaninvnEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode()) .ne(DistributionLoadscaninvnEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + .eq(DistributionLoadscaninvnEntity::getWarehouseId, myCurrentWarehouse.getId()) ); if (Func.isNotEmpty(loadscaninvnEntityList)) { if (loadscaninvnEntityList.size() == 1) { + //库存品存在装车数据才能进行滞留操作 DistributionLoadscaninvnEntity loadscaninvnEntity = loadscaninvnEntityList.get(0); + if (2 == loadscaninvnEntity.getSignforState()) { + return Resp.scanFail("包件已签收", "包件已签收"); + } + DistributionRetentionScanVo inventoryPackage = baseMapper.selectRetentionInventoryPackage(loadscaninvnEntity.getOrderPackageCode(), loadscaninvnEntity.getDeliveryId()); + inventoryPackage.setWarehouseId(myCurrentWarehouse.getId()); + inventoryPackage.setWarehouseName(myCurrentWarehouse.getName()); + inventoryPackage.setLoadingId(loadscaninvnEntity.getId()); + retentionScanVos.add(inventoryPackage); + } + } + } + break; + case 2: + List distributionRetentionScanVos = baseMapper.selectRetentionZeroPackage(distrilbutionloadingscanDTO.getDeliveryId(), distrilbutionloadingscanDTO.getBarcode()); + if (Func.isNotEmpty(distributionRetentionScanVos)) { + retentionScanVos.addAll(distributionRetentionScanVos); + } + } + if (!Func.isEmpty(retentionScanVos)) { + List list = distributionLoadscanAbnormalService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanAbnormalEntity::getPackageCode, distrilbutionloadingscanDTO.getBarcode()) + ); + if (!list.isEmpty()) { + //存在异常进行是否均完成审核判断 + boolean AuditingStatusFlag = list.stream().anyMatch(l -> l.getAuditingStatus().equals(LoadingAbnormalAuditingStatusConstant.daishenhe.getValue())); + if (AuditingStatusFlag){ + return Resp.scanFail("此包件存在异常未处理", "此包件存在异常未处理"); + } + } +// //如果均不存在则就该判断该货物是否属于当前的配送任务,如果属于则是未装车,如果不属于则此码无效 +// List distributionParcelListEntities = baseMapper.selectPackageListByDeliveryListId(deliveryListEntity.getId()); +// boolean flag = false; +// if (Func.isNotEmpty(distributionParcelListEntities)) { +// List isHave = distributionParcelListEntities.stream().filter(p -> p.getOrderPackageCode().equals(distrilbutionloadingscanDTO.getBarcode())).collect(Collectors.toList()); +// if (Func.isNotEmpty(isHave)) { +// flag = isHave.size() == 1; +// //判断是否存在有待处理的异常 +// } +// } else { +// List disStockListDetailEntities = baseMapper.selectInventoryListByDeliveryListId(distrilbutionloadingscanDTO.getDeliveryId()); +// if (Func.isNotEmpty(disStockListDetailEntities)) { +// List isHaveinven = disStockListDetailEntities.stream().filter(inven -> Func.isNotEmpty(inven.getStockPackageCode()) && inven.getStockPackageCode().equals(distrilbutionloadingscanDTO.getBarcode())).collect(Collectors.toList()); +// if (Func.isNotEmpty(isHaveinven)) { +// flag = isHaveinven.size() == 1; +// } +// } +// } +// +// if (!flag) { +// //存在该订制品或者库存品包件信息但是未进行装车操作 +// return Resp.scanFail("包件未装车", "包件未装车"); +// } + } + return R.data(retentionScanVos); + } + + + @Override + public R retentionPC(DistrilbutionloadingscanDTO distrilbutionloadingscanDTO) { + if (distrilbutionloadingscanDTO.getBarcode().isEmpty()) { + log.error("参数缺失Barcode:{}", distrilbutionloadingscanDTO.getBarcode()); + return R.fail(403, "数据错误"); + } + //查询包件 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if (Func.isEmpty(myCurrentWarehouse)) { + return R.fail(403, "未授权!!!"); + } + List barcode = Func.toStrList(distrilbutionloadingscanDTO.getBarcode()); + List parcelListEntities = distributionParcelListService.list(Wrappers.query().lambda() + .in(DistributionParcelListEntity::getOrderPackageCode, barcode) + .eq(DistributionParcelListEntity::getWarehouseId, myCurrentWarehouse.getId()) + ); + if (!parcelListEntities.isEmpty()) { + boolean flag = parcelListEntities.stream().allMatch(a -> OrderPackageLoadingStatusConstant.yizhuangche.getValue().equals(a.getOrderPackageLoadingStatus()) && !OrderPackageStatusConstant.yiqianshou.getValue().equals(a.getOrderPackageStatus())); + if (!flag){ + String str = parcelListEntities.stream().filter(a -> OrderPackageLoadingStatusConstant.yizhuangche.getValue().equals(a.getOrderPackageLoadingStatus()) && !OrderPackageStatusConstant.yiqianshou.getValue().equals(a.getOrderPackageStatus())).map(DistributionParcelListEntity::getOrderCode).distinct().collect(Collectors.joining(",")); + return R.fail(str+"不满足滞留"); + } + } + Integer retentionType = distrilbutionloadingscanDTO.getRetentionType(); + Long deliveryId = null; + if (Func.isEmpty(distrilbutionloadingscanDTO.getDeliveryId())) { + //不在车次任务内进行扫描 + //查询此包件属于哪个车次 + List loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda() + .in(DistributionLoadscanEntity::getOrderPackageCode, barcode) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + .ne(DistributionLoadscanEntity::getSignforState, LoadScanSigningStatusConstant.yiqianshou.getValue()) + ); + if (loadscanEntityList.isEmpty()) { + //查询库存品 + List loadscaninvnEntityList = distributionLoadscaninvnService.list(Wrappers.query().lambda() + .in(DistributionLoadscaninvnEntity::getOrderPackageCode, barcode) + .ne(DistributionLoadscaninvnEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + .ne(DistributionLoadscaninvnEntity::getSignforState, LoadScanSigningStatusConstant.yiqianshou.getValue()) + ); + if (!loadscaninvnEntityList.isEmpty()) { + deliveryId = loadscaninvnEntityList.stream().map(DistributionLoadscaninvnEntity::getDeliveryId).distinct().collect(Collectors.toList()).get(0); + } else { + deliveryId = null; + } + } else { + deliveryId = loadscanEntityList.stream().map(DistributionLoadscanEntity::getDeliveryId).distinct().collect(Collectors.toList()).get(0); + } + if (deliveryId == null) { + return Resp.scanFail("此包件无装车记录", "此包件无装车记录"); + } + } else { + deliveryId = distrilbutionloadingscanDTO.getDeliveryId(); + } + DistributionDeliveryListEntity deliveryListEntity = this.getById(deliveryId); + List retentionScanVos = new ArrayList<>(); + switch (retentionType) { + case 1: + //包件--库存品 和包件 + List loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode()) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + .eq(DistributionLoadscanEntity::getWarehouseId, myCurrentWarehouse.getId()) + ); + if (Func.isNotEmpty(loadscanEntityList)) { + if (loadscanEntityList.size() == 1) { + //包件存在装车才能进行滞留 + //通过配送任务和包件确定预约信息 + DistributionLoadscanEntity distributionLoadscanEntity = loadscanEntityList.get(0); +// if (2 == distributionLoadscanEntity.getIsAbnormalLoading()) { +// //异常装车未进行审核 +// return Resp.scanFail("包件存在异常操作,请先处理异常", "包件存在异常操作,请先处理异常"); +// } + if (2 == distributionLoadscanEntity.getSignforState()) { + log.info("滞留扫描失败,包件已签收>>>>>>>>>>>>>>>>>>>>>>>reservationId:{},packageCode:{}", distributionLoadscanEntity.getReservationId(), distributionLoadscanEntity.getOrderPackageCode()); + return Resp.scanFail("包件已签收", "包件已签收"); + } + DistributionRetentionScanVo retentionScanVo = baseMapper.selectRetentionPackage(distributionLoadscanEntity.getOrderPackageCode(), distributionLoadscanEntity.getDeliveryId(), myCurrentWarehouse.getId()); + if (Func.isEmpty(retentionScanVo)){ + //不存在计划之中属于异常驳回的情况 + retentionScanVo = new DistributionRetentionScanVo(); + retentionScanVo.setDeliveryId(distributionLoadscanEntity.getDeliveryId()); + retentionScanVo.setOrderId(distributionLoadscanEntity.getOrderId()); + retentionScanVo.setReservationId(distributionLoadscanEntity.getReservationId()); + retentionScanVo.setTrainNumber(distributionLoadscanEntity.getTrainNumber()); + retentionScanVo.setConditions(1); + retentionScanVo.setScanType(1); + retentionScanVo.setRetentionQuantity(1); + retentionScanVo.setOrderPackageId(distributionLoadscanEntity.getPackageId()); + //查询包件 + DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(distributionLoadscanEntity.getPackageId()); + retentionScanVo.setOrderCode(parcelListEntity.getOrderCode()); + retentionScanVo.setOrderPackageStatus(parcelListEntity.getOrderPackageStatus()); + retentionScanVo.setOrderPackageCode(parcelListEntity.getOrderPackageCode()); + retentionScanVo.setWaybillNumber(parcelListEntity.getWaybillNumber()); + retentionScanVo.setWaybillId(parcelListEntity.getWaybillId()); + DistributionReservationEntity reservationEntity = distributionReservationMapper.selectById(distributionLoadscanEntity.getReservationId()); + retentionScanVo.setReservationCode(reservationEntity.getReservationCode()); + } + retentionScanVo.setWarehouseId(myCurrentWarehouse.getId()); + retentionScanVo.setWarehouseName(myCurrentWarehouse.getName()); + retentionScanVo.setLoadingId(distributionLoadscanEntity.getId()); + retentionScanVo.setLoadingId(distributionLoadscanEntity.getId()); + retentionScanVo.setLoadingId(distributionLoadscanEntity.getId()); + retentionScanVos.add(retentionScanVo); + } + } else { + List loadscaninvnEntityList = distributionLoadscaninvnService.list(Wrappers.query().lambda() + .eq(DistributionLoadscaninvnEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode()) + .ne(DistributionLoadscaninvnEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + .eq(DistributionLoadscaninvnEntity::getWarehouseId, myCurrentWarehouse.getId()) + ); + if (Func.isNotEmpty(loadscaninvnEntityList)) { + if (loadscaninvnEntityList.size() == 1) { + + //库存品存在装车数据才能进行滞留操作 + DistributionLoadscaninvnEntity loadscaninvnEntity = loadscaninvnEntityList.get(0); + if (2 == loadscaninvnEntity.getSignforState()) { + return Resp.scanFail("包件已签收", "包件已签收"); + } DistributionRetentionScanVo inventoryPackage = baseMapper.selectRetentionInventoryPackage(loadscaninvnEntity.getOrderPackageCode(), loadscaninvnEntity.getDeliveryId()); + inventoryPackage.setWarehouseId(myCurrentWarehouse.getId()); + inventoryPackage.setWarehouseName(myCurrentWarehouse.getName()); + inventoryPackage.setLoadingId(loadscaninvnEntity.getId()); retentionScanVos.add(inventoryPackage); } } @@ -5945,7 +6260,20 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl list = distributionLoadscanAbnormalService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanAbnormalEntity::getPackageCode, distrilbutionloadingscanDTO.getBarcode()) + .eq(DistributionLoadscanAbnormalEntity::getAuditingStatus, LoadingAbnormalAuditingStatusConstant.daishenhe.getValue()) + ); + if (!list.isEmpty()) { + //存在异常进行是否均完成审核判断 + Long finalDeliveryId = deliveryId; + boolean AuditingStatusFlag = list.stream().anyMatch(f-> finalDeliveryId.equals(f.getDeliveryListId())); + if (AuditingStatusFlag){ + return Resp.scanFail("请先处理包件异常操作", "请先处理包件异常操作"); + } + } //如果均不存在则就该判断该货物是否属于当前的配送任务,如果属于则是未装车,如果不属于则此码无效 List distributionParcelListEntities = baseMapper.selectPackageListByDeliveryListId(deliveryListEntity.getId()); boolean flag = false; @@ -5953,6 +6281,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl isHave = distributionParcelListEntities.stream().filter(p -> p.getOrderPackageCode().equals(distrilbutionloadingscanDTO.getBarcode())).collect(Collectors.toList()); if (Func.isNotEmpty(isHave)) { flag = isHave.size() == 1; + //判断是否存在有待处理的异常 } } else { List disStockListDetailEntities = baseMapper.selectInventoryListByDeliveryListId(distrilbutionloadingscanDTO.getDeliveryId()); @@ -5963,17 +6292,25 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl warehouseRetentionScanEntities = new ArrayList<>(); + if (!retentionScanVos.isEmpty()) { + retentionScanVos.forEach(r->{ + WarehouseRetentionScanEntity warehouseRetntionScanEntity = Func.copy(r, WarehouseRetentionScanEntity.class); + warehouseRetntionScanEntity.setRetentionScanUsername(AuthUtil.getNickName()); + warehouseRetntionScanEntity.setRetentionScanUserId(AuthUtil.getUserId()); + warehouseRetntionScanEntity.setRetentionScanTime(new Date()); + warehouseRetentionScanEntities.add(warehouseRetntionScanEntity); + }); + } + if (!warehouseRetentionScanEntities.isEmpty()) { + //进行批量滞留 + R r = warehouseRetentionScanClient.saveBatchRetentionScan(warehouseRetentionScanEntities); + if (!Objects.equals(r.getCode(),200)){ + throw new RuntimeException(r.getMsg()); + } } } - return R.data(retentionScanVos); + return R.success("滞留操作成功"); } @Override @@ -5985,7 +6322,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl orderIds = reservationStockarticleEntityList.stream().filter(rs -> Func.isNotEmpty(rs.getIsZero()) && rs.getIsZero().equals(IsOrNoConstant.yes.getValue())).map(DistributionReservationStockarticleEntity::getStockArticleId).collect(Collectors.toList()); if (Func.isEmpty(orderIds)) { - log.info("####################配送任务下无零担信息:{}",orderIds); + log.info("####################配送任务下无零担信息:{}", orderIds); return Resp.scanFail("查询错误", "该任务无零担订单"); } List parcelNumberVOS = new ArrayList<>(); @@ -6042,6 +6379,11 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl>>>>>>>>>>>>>>:{}", retentionScanVo.getOrderPackageCode()); @@ -6108,43 +6448,80 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl aaa = new ArrayList<>(); //订制品 //需要对该配送任务下的该包件进行取消状态标识 int row = distributionReservationMapper.cancelReservationPackage(reservationId, orderPackageId); // 查询该包件是否进行装车 + DistributionLoadscanEntity loadscanEntity = distributionLoadscanService.getOne(Wrappers.query().lambda().eq(DistributionLoadscanEntity::getDeliveryId, deliveryId).eq(DistributionLoadscanEntity::getReservationId, reservationId) + .eq(DistributionLoadscanEntity::getPackageId, orderPackageId) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())); + log.info("滞留取消任务条数:{}", row); + if (row == 1) { - DistributionLoadscanEntity loadscanEntity = distributionLoadscanService.getOne(Wrappers.query().lambda().eq(DistributionLoadscanEntity::getDeliveryId, deliveryId).eq(DistributionLoadscanEntity::getReservationId, reservationId) - .eq(DistributionLoadscanEntity::getPackageId, orderPackageId) - .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())); - if (Func.isNotEmpty(loadscanEntity)) { - //修改包件状态 达到回库的状态 - DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(loadscanEntity.getPackageId()); - parcelListEntity.setOrderPackageLoadingStatus(OrderPackageLoadingStatusConstant.weizhuancghe.getValue()); - parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.daiyuyue.getValue()); - parcelListEntity.setOrderPackageStatus(OrderPackageStatusConstant.yiruku.getValue()); - distributionParcelListService.updateById(parcelListEntity); - //已经进行装车 - loadscanEntity.setScanStatus(LoadingStatusConstant.quxiao.getValue()); - distributionLoadscanService.updateById(loadscanEntity); -// 对应签收信息的装车数量要进行扣减 - int a = distributionSignforMapper.deductionLoadingPacjageNum(loadscanEntity.getReservationId(), loadscanEntity.getDeliveryId(), loadscanEntity.getLoadedNub()); - //维护订单状态 - distributionStockArticleService.maintenanceOrderInfo(parcelListEntity.getOrderCode(), parcelListEntity.getWarehouseId()); - } + //存在计划 + //进行了一条包件任务的取消,此时就应该对预约、配送任务进行数量的维护 distributionAsyncService.checkRetentionReservationAndDeliveryInfo(reservationId, deliveryId); - return true; - } else { + } + + //包件未预约 处于异常驳回状态 + //查询异常信息,对异常信息进行清理 + log.info("滞留查询审核列表信息:{}", row); + + DistributionLoadscanAbnormalEntity abnormalEntity = distributionLoadscanAbnormalService.getOne(Wrappers.query().lambda() + .eq(DistributionLoadscanAbnormalEntity::getPackageId, orderPackageId) + .eq(DistributionLoadscanAbnormalEntity::getDeliveryListId, deliveryId) + .eq(DistributionLoadscanAbnormalEntity::getAuditingStatus, 3) + ); + log.info("滞留查询审核列表信息:{}", abnormalEntity); + if (!Objects.isNull(abnormalEntity)){ + //清理异常信息 + distributionLoadscanAbnormalService.removeById(abnormalEntity); + }else { + log.error(">>>>>>>>>>>>>>>查询异常信息错误:{}",orderPackageId); + } //查询出多个包件信息 - log.info("######################,reservationId:{}", reservationId); - log.error("############查询预约包件信息错误:{}", orderPackageId); - return false; + + if (Func.isNotEmpty(loadscanEntity)) { + //修改包件状态 达到回库的状态 + DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(loadscanEntity.getPackageId()); + parcelListEntity.setOrderPackageLoadingStatus(OrderPackageLoadingStatusConstant.weizhuancghe.getValue()); + parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.daiyuyue.getValue()); + parcelListEntity.setOrderPackageStatus(OrderPackageStatusConstant.yiruku.getValue()); + distributionParcelListService.updateById(parcelListEntity); + //已经进行装车 + loadscanEntity.setScanStatus(LoadingStatusConstant.quxiao.getValue()); + distributionLoadscanService.updateById(loadscanEntity); +// 对应签收信息的装车数量要进行扣减 + int a = distributionSignforMapper.deductionLoadingPacjageNum(loadscanEntity.getReservationId(), loadscanEntity.getDeliveryId(), loadscanEntity.getLoadedNub()); + //维护订单状态 + distributionStockArticleService.maintenanceOrderInfo(parcelListEntity.getOrderCode(), parcelListEntity.getWarehouseId()); + //增加滞留信息 + String content = "包件在" + myCurrentWarehouse.getName() + "由" + loadscanEntity.getScanUser() + "取消配车,取消方式:滞留扫描,取消计划,配送车次号:" + loadscanEntity.getTrainNumber() + "预约任务号:" + reservationEntity.getReservationCode(); + JSONObject js = handleLogJSONObject(myCurrentWarehouse, AuthUtil.getUser(), parcelListEntity.getOrderPackageCode(), content, WorkNodeEnums.CANCEL_DISTRIBUTION.getCode()); + aaa.add(js); + //对滞留包件进行签收信息数量减少 + } + if (!aaa.isEmpty()) { + trunklinePackageTrackLogClient.addPackageTrackLog(aaa); } + + return true; } @Override @@ -6368,7 +6745,6 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl customList = distributionDeliveryInfoMapper.selectClientList(deliveryId, distributionReservationDTO); List distributionDeliveryInfoVOS = null; if (!customList.isEmpty()) { - distributionDeliveryInfoVOS = handleClient(customList); + distributionDeliveryInfoVOS = handleClient(customList); } return page.setRecords(distributionDeliveryInfoVOS); } - public List handleClient(List customList){ + public List handleClient(List customList) { customList.forEach(c -> { if (Func.isNotEmpty(c.getLoadingStatus())) { switch (c.getLoadingStatus()) { @@ -6419,8 +6795,6 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl getDriverCar(String kind, Long deliveryListEntityId) { Map map = new HashMap<>(); String dirverName = null; @@ -6543,6 +6917,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl reservationStockarticleList = distributionReservationStockarticleService.list(queryWrapper); List> ls = new ArrayList<>(); BigDecimal totalPrice = BigDecimal.ZERO; + Integer all = 0; for (int i = 0; i < reservationStockarticleList.size(); i++) { DistributionReservationStockarticleEntity reservationStockarticleEntity = reservationStockarticleList.get(i); Long stockArticleId = reservationStockarticleEntity.getStockArticleId();//订单id @@ -6570,6 +6945,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl> mapList = distributionReservationMapper.getCategoryByStockArticleIdAndReservationId(stockArticleId, reservationId); Map numObj = new HashMap<>(); Integer tn = 0; + Integer sn = 0; Set set = totalDetail.keySet(); for (String key : set) { if (!"合计数量".equals(key)) { @@ -6577,17 +6953,33 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl m : mapList) { String thirdProduct = (String) m.get("thirdProduct"); Long num = (Long) m.get("num"); + Long signNum = (Long) m.get("aaa"); if (thirdProduct.equals(key)) { + sn += num.intValue(); numObj.put(key, num); tn = tn + num.intValue(); } } } + + } + //查询签收数 + List loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getReservationId, reservationStockarticleEntity.getReservationId()) + .eq(DistributionLoadscanEntity::getOrderId, reservationStockarticleEntity.getStockArticleId()) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + ); + int sum = 0; + if (!loadscanEntityList.isEmpty()) { + sum = loadscanEntityList.stream().mapToInt(DistributionLoadscanEntity::getReceivedQuantity).sum(); } + all += sum; + orderMap.put("签收件数", sum); orderMap.put("合计数量", tn); + orderMap.put("小计", sn); orderMap.put("产品明细", numObj); orderMap.put("产品明细长度", numObj.size()); - + Map info = (Map) total.get("产品明细"); //通过订单id和预约id查询对应包件的物料信息 List materialNameStrList = distributionReservationMapper.getMaterialNameByStockArticleIdAndReservationId(stockArticleId, reservationId); String materialNameStr = StringUtils.join(materialNameStrList, ","); @@ -6596,6 +6988,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl Integer.parseInt(map1.get("数量").toString())).sum()); - + log.info(">>>>>>>>>>>>>>>>>>预约打印模板查看备货信息》》》》》》》》》》》》:{}", distributionReservationEntity.getRemarks()); map.put("备注", distributionReservationEntity.getRemarks()); } @@ -6854,7 +7247,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl list = Func.toLongList(orderIds); List loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda() .eq(DistributionLoadscanEntity::getDeliveryId, deliveryId) + .in(DistributionLoadscanEntity::getOrderId, list) .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) ); if (Func.isNotEmpty(loadscanEntityList)) { - Map loadingOrderMap = loadscanEntityList.stream().collect(Collectors.toMap(DistributionLoadscanEntity::getOrderId, Function.identity(), (k1, k2) -> k2)); - if (Func.isNotEmpty(loadingOrderMap.get(orderId))) { - return false; + List ids = loadscanEntityList.stream().map(DistributionLoadscanEntity::getOrderId).distinct().collect(Collectors.toList()); + List distributionStockArticleEntities = distributionStockArticleService.listByIds(ids); + if (!distributionStockArticleEntities.isEmpty()) { + String orderCodes = distributionStockArticleEntities.stream().map(DistributionStockArticleEntity::getOrderCode).distinct().collect(Collectors.joining(",\n")); + return R.fail(orderCodes + "当前订单已装车,请滞留后进行移除"); } } - return true; + return R.data(true); } @Override @@ -7096,7 +7493,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl collect = distributionReservationEntities.stream().filter(f -> (f.getReservationNum() + f.getReservationStockListNum()) > 0).collect(Collectors.toList()); - log.info(deliveryListEntity.getTrainNumber()+"#################维护配送任务客户数>>>>>>>,:{}",collect.size()); + log.info(deliveryListEntity.getTrainNumber() + "#################维护配送任务客户数>>>>>>>,:{}", collect.size()); deliveryListEntity.setCustomersNumber(collect.size()); //查询订单数 Integer num = baseMapper.selectOrderNumByDeliveryId(deliveryId); @@ -7111,6 +7508,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl loadscanEntityList = distributionDeliveryListService.selectAbnormalLoadingBydeliveryId(deliveryId); - if (Func.isNotEmpty(loadscanEntityList)) { - log.info(method + "存在异常装车数据:{}", deliveryId); - return R.fail(reservationCodes + "存在异常装车、签收包条!!!"); + DistributionLoadingNumDTO deliveryLoadingNum = distributionDeliveryListMapper.selectDeliveryLoadingNum(deliveryId); + if (deliveryLoadingNum.getPackageLoadingQuantity() + deliveryLoadingNum.getInventoryLoadingQuantity() > 0) { + log.info(method + "存在装车数据 装车件数>>>>>>>>>>:{}", (deliveryLoadingNum.getPackageLoadingQuantity() + deliveryLoadingNum.getInventoryLoadingQuantity())); + return R.fail(deliveryListEntity.getTrainNumber() + "存在装车包件!!!"); } + + List ids = reservationEntities.stream().map(DistributionReservationEntity::getId).collect(Collectors.toList()); + + List packageList = distributionLoadscanService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getReservationId, ids) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + ); + List inventoryList = distributionLoadscaninvnService.list(Wrappers.query().lambda() + .eq(DistributionLoadscaninvnEntity::getReservationId, ids) + .ne(DistributionLoadscaninvnEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + ); + if (!packageList.isEmpty() || !inventoryList.isEmpty()) { + log.info(method + "取消配送存在装车数据:{}", deliveryId); + return R.fail(reservationCodes + "存在装车、签收数据!!!"); + } + + +// //该配送是否存在异常装车或者异常签收数据 +// List loadscanEntityList = distributionDeliveryListService.selectAbnormalLoadingBydeliveryId(deliveryId); +// if (Func.isNotEmpty(loadscanEntityList)) { +// log.info(method + "存在异常装车数据:{}", deliveryId); +// return R.fail(reservationCodes + "存在异常装车、签收包条!!!"); +// } boolean flag = false; for (DistributionReservationEntity reservationEntity : reservationEntities) { DistributionReservationDTO reservationDTO = Func.copy(reservationEntity, DistributionReservationDTO.class); @@ -7161,11 +7581,11 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl distributionDeliveryInfoVOS = distributionDeliveryInfoMapper.selectClientListByDeliveryId(deliveryId); - List deliveryInfoVOS = handleClient(distributionDeliveryInfoVOS); + List deliveryInfoVOS = handleClient(distributionDeliveryInfoVOS); distributionDeliveryExcelDTO.setDeliveryInfoVOS(deliveryInfoVOS); -// EXResource.put("client",deliveryInfoVOS); +// EXResource.put("client",deliveryInfoVOS); List distributionStockArticleVOS = distributionDeliveryInfoMapper.selectDistributionDeliveryOrderPageByDeliveryId(deliveryId); distributionDeliveryExcelDTO.setDistributionStockArticleVOS(distributionStockArticleVOS); // EXResource.put("order",distributionStockArticleVOS); @@ -7216,53 +7636,558 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl wIds = null; + if (Strings.isNotBlank(warehouseIds)) { + wIds = Arrays.stream(warehouseIds.split(",")).map(Long::valueOf).collect(Collectors.toList()); + } + List rCode = null; + if (Strings.isNotBlank(reservationCode)) { + rCode = Arrays.stream(reservationCode.split(",")).collect(Collectors.toList()); + } + List pushNotification = distributionSignforMapper.pushNotification(wIds, rCode); + if (!pushNotification.isEmpty()) { + for (PushNotificationDTO pushNotificationDTO : pushNotification) { + distributionAsyncService.sendReviewFactory(pushNotificationDTO.getId(), pushNotificationDTO.getWarehouseName(), pushNotificationDTO.getWarehouseId()); + } + } + } + + @Override + public R cancelStart(DistrilbutionloadingscanDTO distrilbutionloadingscanDTO) { + //获取当前用户司机 + DistributionDeliveryListEntity distributionDeliveryListEntity = distributionDeliveryListMapper.selectById(distrilbutionloadingscanDTO.getDeliveryId()); + if ("3".equals(distributionDeliveryListEntity.getDeliveryStatus())) { + return Resp.scanFail("该任务已完结!", "该任务已完结!"); + } + String loadingId = distrilbutionloadingscanDTO.getLoadingId(); + + Boolean b = false; + if ("1".equals(distributionDeliveryListEntity.getKind())) { + b = distributionDeliverySelfService.update(new UpdateWrapper().lambda() + .eq(DistributionDeliverySelfEntity::getDeliveryId, distrilbutionloadingscanDTO.getDeliveryId()) + .eq(DistributionDeliverySelfEntity::getIsMaster, "2") + .set(DistributionDeliverySelfEntity::getDepartureTime, null) + ); + } else { + b = distributionDeliveryTripartiteService.update(new UpdateWrapper().lambda() + .eq(DistributionDeliveryTripartiteEntity::getDeliveryId, distrilbutionloadingscanDTO.getDeliveryId()) + .set(DistributionDeliveryTripartiteEntity::getDepartureTime, null) + ); + } + //修改主表状态 + distributionDeliveryListEntity.setDeliveryStatus(DeliveryStatusConstant.daipeisong.getValue()); + baseMapper.updateById(distributionDeliveryListEntity); + return R.success("取消发车成功"); + } + @Override @Transactional - public void maintenanceDeliveryInfo(Long deliveryId) { - log.info(">>>>>>>>>>>>>>> 车次状态维护1 代码执行 deliveryId={}",deliveryId); - String method = "###################DistributionDeliveryListServiceImpl执行方法maintenanceDeliveryInfo,"; - if (Func.isEmpty(deliveryId)) { - log.info(method + "参数缺失deliveryId:{}", deliveryId); - throw new RuntimeException("服务器正忙!!!"); + public void mallClientSignfor(String trainNumber, Long warehouseId, String orderPackageCode) { + //查询包件是否合法 + DistributionParcelListEntity packageObj = distributionParcelListService.getOne(Wrappers.query().lambda() + .eq(DistributionParcelListEntity::getOrderPackageCode, orderPackageCode) + .eq(DistributionParcelListEntity::getWarehouseId, warehouseId) + ); + if (Func.isEmpty(packageObj)) { + //系统无编码 + log.error("系统无编码"); + } + if (OrderPackageStatusConstant.yiqianshou.getValue().equals(packageObj.getOrderPackageStatus())) { + //包件已签收 + log.error("包件已签收"); + } + //查询配送计划 + DistributionDeliveryListEntity deliveryListEntity = this.getOne(Wrappers.query().lambda() + .eq(DistributionDeliveryListEntity::getTrainNumber, trainNumber) + .eq(DistributionDeliveryListEntity::getWarehouseId, warehouseId) + ); + if (Func.isEmpty(deliveryListEntity)) { + //配送计划查询错误 + log.error("配送计划查询错误"); } - DistributionDeliveryListEntity deliveryListEntity = this.getById(deliveryId); - if (ObjectUtil.isEmpty(deliveryListEntity)) { - log.info(method + "查询配送失败,deliveryId:{}", deliveryId); - throw new RuntimeException("服务器正忙!!!"); + //查询仓库是否有效 + BasicdataWarehouseEntity entityWarehouseId = warehouseClient.getEntityWarehouseId(warehouseId); + if (Func.isEmpty(entityWarehouseId)) { + //仓库查询错误 + log.error("仓库查询错误"); + } + + DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(packageObj.getStockArticleId()); + if (Func.isEmpty(stockArticleEntity)) { + //订单查询错误 + log.error("订单查询错误"); + } + //查询配送司机 + DistributionDeliverySelfEntity distributionDeliverySelfEntity = new DistributionDeliverySelfDTO(); + if (deliveryListEntity.getKind().equals(ServiceConstant.DELIVERLIST_KIND_SELF)) { + distributionDeliverySelfEntity = distributionDeliverySelfMapper.selectOne(new QueryWrapper().lambda() + .eq(DistributionDeliverySelfEntity::getIsMaster, ServiceConstant.IS_MASTER_YES) + .eq(DistributionDeliverySelfEntity::getDeliveryId, deliveryListEntity.getId()) + ); + } else { + DistributionDeliveryTripartiteEntity distributionDeliveryTripartiteEntity = distributionDeliveryTripartiteMapper.selectOne(new QueryWrapper().lambda() + .eq(DistributionDeliveryTripartiteEntity::getDeliveryId, deliveryListEntity.getId())); + BeanUtils.copyProperties(distributionDeliveryTripartiteEntity, distributionDeliverySelfEntity); } - //查询指定配送计划装车件数 - DistributionLoadingNumDTO deliveryLoadingNum = distributionDeliveryListMapper.selectDeliveryLoadingNum(deliveryId); - log.info(">>>>>>>>>>>>>>> 车次状态维护2 代码执行 deliveryLoadingNum{}",deliveryLoadingNum); - int loadingNum = 0; - int deliveryQuantity = deliveryListEntity.getDeliveryNumber() + (Objects.isNull(deliveryListEntity.getInventoryNub()) ? 0 : deliveryListEntity.getInventoryNub()); - if (Func.isNotEmpty(deliveryLoadingNum)) { - loadingNum += deliveryLoadingNum.getInventoryLoadingQuantity() + deliveryLoadingNum.getPackageLoadingQuantity(); + if (Func.isEmpty(distributionDeliverySelfEntity)) { + //查询司机信息失败 + log.error("查询司机信息失败"); } - if (deliveryQuantity != 0) { - if (loadingNum == deliveryQuantity) { - deliveryListEntity.setDeliveryListLoadingStatus(DeliveryLoadingStatusConstant.yizhuangche.getValue()); - } else { - deliveryListEntity.setDeliveryListLoadingStatus(DeliveryLoadingStatusConstant.bunfenzhuangche.getValue()); + //查询签收信息 + List signforEntityList = distributionSignforService.list(Wrappers.query().lambda() + .eq(DistributionSignforEntity::getDeliveryId, deliveryListEntity.getId()) + ); + String content = ""; + Long loadingId = 0L; + if (!signforEntityList.isEmpty()) { + List reservationIds = signforEntityList.stream().map(DistributionSignforEntity::getReservationId).collect(Collectors.toList()); + List reservationPackageEntityList = distributionReservationPackageService.list(Wrappers.query().lambda() + .in(DistributionReservationPackageEntity::getReservationId, reservationIds) + .ne(DistributionReservationPackageEntity::getPacketBarStatus, ReservationPackageStatusConstant.quxiao.getValue()) + ); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + if (!reservationPackageEntityList.isEmpty()) { + boolean flag = reservationPackageEntityList.stream().anyMatch(rp -> orderPackageCode.equals(rp.getPacketBarCode())); + if (flag) { + //存在计划中,进行是否装车判断然后完成签收扫描闭环 + List rpList = reservationPackageEntityList.stream().filter(rp -> orderPackageCode.equals(rp.getPacketBarCode())).collect(Collectors.toList()); + if (rpList.size() == 1) { + DistributionReservationEntity reservationEntity = distributionReservationService.getById(rpList.get(0).getReservationId()); + DistributionLoadscanEntity loadscanEntity = distributionLoadscanService.getOne(Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getReservationId, rpList.get(0).getReservationId()) + .eq(DistributionLoadscanEntity::getOrderPackageCode, rpList.get(0).getPacketBarCode()) + .eq(DistributionLoadscanEntity::getWarehouseId, warehouseId) + .eq(DistributionLoadscanEntity::getSignforState, LoadScanSigningStatusConstant.weiqianshou.getValue()) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + ); + if (!Func.isEmpty(loadscanEntity)) { + loadingId = loadscanEntity.getId(); + //存在装车数据 + loadscanEntity.setSigningTime(simpleDateFormat.format(new Date())); + loadscanEntity.setSignforState(2); + loadscanEntity.setScanState(1); + loadscanEntity.setIsInsert(1); + loadscanEntity.setScanState(1); + loadscanEntity.setReceivedQuantity(loadscanEntity.getLoadedNub()); + loadscanEntity.setSigningUser(loadscanEntity.getDriverName()); + loadscanEntity.setSigningUserId(Long.parseLong(loadscanEntity.getDriverId())); + distributionLoadscanService.updateById(loadscanEntity); + //更新签收数量 + Integer j = distributionSignforMapper.updateSignforNum(loadscanEntity.getDeliveryId(), loadscanEntity.getReservationId(), loadscanEntity.getPackageNub()); + //更新签收人 + BladeUser user = AuthUtil.getUser(); + user.setNickName(loadscanEntity.getDriverName()); + Integer m = distributionSignforMapper.updateSignUser(loadscanEntity.getDeliveryId(), loadscanEntity.getReservationId(), user); + content = "包件在" + entityWarehouseId.getName() + "由" + loadscanEntity.getSigningUser() + "扫描签收,签收方式:司机进行装车,由商家端进行签收,配送车次号:" + deliveryListEntity.getTrainNumber() + "预约任务号:" + reservationEntity.getReservationCode(); + } else { + //查询配送计划的计划司机 + DistributionLoadscanEntity distributionLoadscanEntity = new DistributionLoadscanEntity(); + if (StringUtils.isNotBlank(distributionDeliverySelfEntity.getDriverPhone())) { + distributionLoadscanEntity.setDriverPhone(distributionDeliverySelfEntity.getDriverPhone()); + } + if (StringUtils.isNotBlank(distributionDeliverySelfEntity.getVehicleNub())) { + distributionLoadscanEntity.setVehicleName(distributionDeliverySelfEntity.getVehicleNub()); + } + if (StringUtils.isNotBlank(distributionDeliverySelfEntity.getDriverId())) { + distributionLoadscanEntity.setDriverId(distributionDeliverySelfEntity.getDriverId()); + } + if (Func.isNotEmpty(distributionDeliverySelfEntity.getId())) { + distributionLoadscanEntity.setLoadingId(distributionDeliverySelfEntity.getId().toString()); + } + if (Func.isNotEmpty(distributionDeliverySelfEntity.getDriverName())) { + distributionLoadscanEntity.setDriverName(distributionDeliverySelfEntity.getDriverName()); + } + if (StringUtils.isNotBlank(distributionDeliverySelfEntity.getVehicleId())) { + distributionLoadscanEntity.setVehicleId(distributionDeliverySelfEntity.getVehicleId()); + } + Date loadScanTime = new Date(); + distributionLoadscanEntity.setScanTime(simpleDateFormat.format(loadScanTime)); + distributionLoadscanEntity.setPackageId(packageObj.getId()); + distributionLoadscanEntity.setWarehouseId(entityWarehouseId.getId()); + distributionLoadscanEntity.setWarehouseName(entityWarehouseId.getName()); + distributionLoadscanEntity.setOrderPackageCode(packageObj.getOrderPackageCode()); + Date signingTime = new Date(System.currentTimeMillis() + (1000 * 60)); + distributionLoadscanEntity.setSigningTime(simpleDateFormat.format(signingTime)); + distributionLoadscanEntity.setReceivedQuantity(packageObj.getQuantity()); + distributionLoadscanEntity.setReservationId(rpList.get(0).getReservationId()); + distributionLoadscanEntity.setScanState(0); + distributionLoadscanEntity.setIsSignfor(2); + distributionLoadscanEntity.setScanType("1"); + distributionLoadscanEntity.setIsInsert(2); + distributionLoadscanEntity.setSignforState(2); + distributionLoadscanEntity.setTrainNumber(deliveryListEntity.getTrainNumber()); + distributionLoadscanEntity.setPackageNub(packageObj.getQuantity()); + distributionLoadscanEntity.setOrderId(packageObj.getStockArticleId()); + distributionLoadscanEntity.setLoadedNub(packageObj.getQuantity()); + distributionLoadscanEntity.setDeliveryId(deliveryListEntity.getId()); + distributionLoadscanEntity.setScanUser(distributionDeliverySelfEntity.getDriverName()); + distributionLoadscanEntity.setSigningUser(distributionDeliverySelfEntity.getDriverName()); + distributionLoadscanEntity.setSigningUserId(distributionDeliverySelfEntity.getDeliveryId()); + distributionLoadscanEntity.setScanStatus(LoadingStatusConstant.buluzhuangche.getValue()); + distributionLoadscanService.save(distributionLoadscanEntity); + loadingId = distributionLoadscanEntity.getId(); + //进行签收数量的修改 + Integer i = distributionDeliveryListMapper.updateloadingTimeById(deliveryListEntity.getId()); + //更新装车包件数和签收包件数 + Integer j = distributionSignforMapper.updateSignforByReservationId(distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getReservationId(), distributionLoadscanEntity.getPackageNub()); + BladeUser user = AuthUtil.getUser(); + user.setNickName(distributionLoadscanEntity.getDriverName()); + //更新签收人 + Integer m = distributionSignforMapper.updateSignUser(distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getReservationId(), user); + //包件解托下架 + warehouseUpdownTypeClient.downPackageOrDelTray(packageObj.getOrderPackageCode(), warehouseId, "签收下架解托"); + content = "包件在" + entityWarehouseId.getName() + "由" + distributionLoadscanEntity.getSigningUser() + "扫描签收,签收方式:司机未进行装车,由商家端进行签收,配送车次号:" + deliveryListEntity.getTrainNumber() + "预约任务号:" + reservationEntity.getReservationCode(); + } + } + } else { + //异常签收判定 + //查询此包件的订单 + //查询此配送任务的预约列表 + List distributionReservationEntities = baseMapper.selectReservationByDeliveryListId(deliveryListEntity.getId()); + if (!distributionReservationEntities.isEmpty()) { + boolean isSatisfy = distributionReservationEntities.stream().anyMatch(f -> stockArticleEntity.getConsigneeUnit().equals(f.getReceivingUnit()) && stockArticleEntity.getMallName().equals(f.getMallName()) && stockArticleEntity.getConsigneePerson().equals(f.getConsignee())); + if (isSatisfy) { + List reservationList = distributionReservationEntities.stream().filter(f -> stockArticleEntity.getConsigneeUnit().equals(f.getReceivingUnit()) && stockArticleEntity.getMallName().equals(f.getMallName()) && stockArticleEntity.getConsigneePerson().equals(f.getConsignee())).collect(Collectors.toList()); + if (reservationList.size() == 1) { + //查询装车记录 + List loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getOrderPackageCode, packageObj.getOrderPackageCode()) + .eq(DistributionLoadscanEntity::getSignforState, LoadScanSigningStatusConstant.weiqianshou.getValue()) + .eq(DistributionLoadscanEntity::getWarehouseId, warehouseId) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + ); + + if (!loadscanEntityList.isEmpty()) { + //存在装车 + if (loadscanEntityList.size() == 1) { + //判定是否是本车次的装车 + isSatisfy = loadscanEntityList.stream().anyMatch(a -> deliveryListEntity.getId().equals(a.getDeliveryId())); + if (isSatisfy) { + //本车次的异常装车 + DistributionLoadscanEntity distributionLoadscanEntity = loadscanEntityList.get(0); + if (distributionLoadscanEntity.equals("2")) { + //进行异常签收的标识 + //存在装车数据 + distributionLoadscanEntity.setSigningTime(simpleDateFormat.format(new Date())); + distributionLoadscanEntity.setSignforState(2); + distributionLoadscanEntity.setScanState(1); + distributionLoadscanEntity.setIsInsert(1); + distributionLoadscanEntity.setScanState(1); + //异常装车状态下进行签收 + distributionLoadscanEntity.setIsAbnormalSigning(2); + distributionLoadscanEntity.setAbnormalNote("异常签收"); + distributionLoadscanEntity.setReceivedQuantity(distributionLoadscanEntity.getLoadedNub()); + distributionLoadscanEntity.setSigningUser(distributionLoadscanEntity.getDriverName()); + distributionLoadscanEntity.setSigningUserId(Long.parseLong(distributionLoadscanEntity.getDriverId())); + distributionLoadscanEntity.setTrainNumber(deliveryListEntity.getTrainNumber()); + distributionLoadscanService.updateById(distributionLoadscanEntity); + loadingId = distributionLoadscanEntity.getId(); + Integer j = distributionSignforMapper.updateSignforNum(distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getReservationId(), distributionLoadscanEntity.getPackageNub()); + //更新签收人 + BladeUser user = AuthUtil.getUser(); + user.setNickName(distributionLoadscanEntity.getDriverName()); + Integer m = distributionSignforMapper.updateSignUser(distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getReservationId(), user); + content = "包件在" + entityWarehouseId.getName() + "由" + distributionLoadscanEntity.getSigningUser() + "扫描签收,签收方式:司机进行异常装车,由商家端进行签收,配送车次号:" + deliveryListEntity.getTrainNumber() + "预约任务号:" + reservationList.get(0).getReservationCode(); + //进行还未进行审核异常的签收状态标识 + } + } else { + log.error("商家端异常签收存在装车非本车次计划"); + } + } else { + log.error("商家端签收非计划下存在多条装车记录"); + } + } else { + DistributionLoadscanEntity distributionLoadscanEntity = new DistributionLoadscanEntity(); + if (StringUtils.isNotBlank(distributionDeliverySelfEntity.getDriverPhone())) { + distributionLoadscanEntity.setDriverPhone(distributionDeliverySelfEntity.getDriverPhone()); + } + if (StringUtils.isNotBlank(distributionDeliverySelfEntity.getVehicleNub())) { + distributionLoadscanEntity.setVehicleName(distributionDeliverySelfEntity.getVehicleNub()); + } + if (StringUtils.isNotBlank(distributionDeliverySelfEntity.getDriverId())) { + distributionLoadscanEntity.setDriverId(distributionDeliverySelfEntity.getDriverId()); + } + if (Func.isNotEmpty(distributionDeliverySelfEntity.getId())) { + distributionLoadscanEntity.setLoadingId(distributionDeliverySelfEntity.getId().toString()); + } + if (Func.isNotEmpty(distributionDeliverySelfEntity.getDriverName())) { + distributionLoadscanEntity.setDriverName(distributionDeliverySelfEntity.getDriverName()); + } + if (StringUtils.isNotBlank(distributionDeliverySelfEntity.getVehicleId())) { + distributionLoadscanEntity.setVehicleId(distributionDeliverySelfEntity.getVehicleId()); + } + Date loadScanTime = new Date(); + distributionLoadscanEntity.setScanTime(simpleDateFormat.format(loadScanTime)); + distributionLoadscanEntity.setPackageId(packageObj.getId()); + distributionLoadscanEntity.setWarehouseId(entityWarehouseId.getId()); + distributionLoadscanEntity.setWarehouseName(entityWarehouseId.getName()); + distributionLoadscanEntity.setOrderPackageCode(packageObj.getOrderPackageCode()); + Date signingTime = new Date(System.currentTimeMillis() + (1000 * 60)); + distributionLoadscanEntity.setSigningTime(simpleDateFormat.format(signingTime)); + distributionLoadscanEntity.setReceivedQuantity(packageObj.getQuantity()); + distributionLoadscanEntity.setReservationId(reservationList.get(0).getId()); + distributionLoadscanEntity.setScanState(0); + distributionLoadscanEntity.setIsSignfor(2); + distributionLoadscanEntity.setScanType("5"); + distributionLoadscanEntity.setIsInsert(2); + distributionLoadscanEntity.setSignforState(2); + distributionLoadscanEntity.setTrainNumber(deliveryListEntity.getTrainNumber()); + distributionLoadscanEntity.setPackageNub(packageObj.getQuantity()); + distributionLoadscanEntity.setOrderId(packageObj.getStockArticleId()); + distributionLoadscanEntity.setLoadedNub(packageObj.getQuantity()); + distributionLoadscanEntity.setDeliveryId(deliveryListEntity.getId()); + distributionLoadscanEntity.setScanUser(distributionDeliverySelfEntity.getDriverName()); + distributionLoadscanEntity.setSigningUser(distributionDeliverySelfEntity.getDriverName()); + distributionLoadscanEntity.setSigningUserId(distributionDeliverySelfEntity.getDeliveryId()); + distributionLoadscanEntity.setScanStatus(LoadingStatusConstant.buluzhuangche.getValue()); + distributionLoadscanEntity.setIsAbnormalSigning(2); + distributionLoadscanEntity.setAbnormalNote("异常签收"); + distributionLoadscanService.save(distributionLoadscanEntity); + loadingId = distributionLoadscanEntity.getId(); + //进行签收数量的修改 + Integer i = distributionDeliveryListMapper.updateloadingTimeById(deliveryListEntity.getId()); + //更新装车包件数和签收包件数 + Integer j = distributionSignforMapper.updateSignforByReservationId(distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getReservationId(), distributionLoadscanEntity.getPackageNub()); + BladeUser user = AuthUtil.getUser(); + user.setNickName(distributionLoadscanEntity.getDriverName()); + //更新签收人 + Integer m = distributionSignforMapper.updateSignUser(distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getReservationId(), user); + content = "包件在" + entityWarehouseId.getName() + "由" + distributionLoadscanEntity.getSigningUser() + "扫描签收,签收方式:司机未进行装车,由商家端进行异常签收,配送车次号:" + deliveryListEntity.getTrainNumber() + "预约任务号:" + reservationList.get(0).getReservationCode(); + //进行异常数据的创建 + DistributionLoadscanAbnormalEntity distributionLoadscanAbnormalEntity = new DistributionLoadscanAbnormalEntity(); + distributionLoadscanAbnormalEntity.setAuditingStatus(LoadingAbnormalAuditingStatusConstant.daishenhe.getValue()); + distributionLoadscanAbnormalEntity.setStockArticleId(packageObj.getStockArticleId()); + distributionLoadscanAbnormalEntity.setTrainNumber(deliveryListEntity.getTrainNumber()); + distributionLoadscanAbnormalEntity.setDriverName(distributionDeliverySelfEntity.getDriverName()); + distributionLoadscanAbnormalEntity.setDriverId(Long.parseLong(distributionDeliverySelfEntity.getDriverId())); + distributionLoadscanAbnormalEntity.setDriverPhone(distributionDeliverySelfEntity.getDriverPhone()); + distributionLoadscanAbnormalEntity.setDeliveryListId(deliveryListEntity.getId()); + distributionLoadscanAbnormalEntity.setReservationId(reservationList.get(0).getId()); + distributionLoadscanAbnormalEntity.setDeliveryType(deliveryListEntity.getType()); + distributionLoadscanAbnormalEntity.setScanUser(user.getNickName()); + distributionLoadscanAbnormalEntity.setScanTime(new Date()); + distributionLoadscanAbnormalEntity.setLoadingQuantity(packageObj.getQuantity()); + distributionLoadscanAbnormalEntity.setPackageCode(packageObj.getOrderPackageCode()); + distributionLoadscanAbnormalEntity.setPackageId(packageObj.getId()); + distributionLoadscanAbnormalService.save(distributionLoadscanAbnormalEntity); + //进行异常审核的标识 + distributionSignforService.update(Wrappers.update().lambda() + .eq(DistributionSignforEntity::getReservationId, reservationList.get(0).getId()) + .eq(DistributionSignforEntity::getDeliveryId, deliveryListEntity.getId()) + .set(DistributionSignforEntity::getIsHaveAbnormalPackage, 2) + ); + } + } else { + log.error("一个车次内存在两个同样客户"); + } + } else { + log.error("商家签收车次内不存在该客户"); + } + } + } + List logs = handleMallLogJSONObject(entityWarehouseId, Long.parseLong(distributionDeliverySelfEntity.getDriverId()), packageObj.getOrderPackageCode(), content, WorkNodeEnums.DISTRIBUTION_SIGN_FOR.getCode()); + if (!logs.isEmpty()) { + trunklinePackageTrackLogClient.addPackageTrackLog(logs); + } + //进行包件状态维护 + packageObj.setOrderPackageLoadingStatus(OrderPackageLoadingStatusConstant.yizhuangche.getValue()); + packageObj.setOrderPackageStatus(OrderPackageStatusConstant.yiqianshou.getValue()); + distributionParcelListService.updateById(packageObj); + //处理异常驳回未滞留的情况 + handleAbnormalTurnDown(deliveryListEntity.getId(),packageObj.getOrderPackageCode(), entityWarehouseId.getId()); + //下架解托 + warehouseUpdownTypeClient.downPackageAndDelTrayAndIsUpdate(packageObj.getOrderPackageCode(), entityWarehouseId.getId(), "扫描装车进行下架、解托", false); + //维护订单 + distributionStockArticleService.maintenanceOrderInfo(stockArticleEntity.getOrderCode(), warehouseId); + //维护车次任务状态 deliveryListEntity.setDeliveryStatus(DeliveryStatusConstant.peisongzhong.getValue()); + distributionDeliveryListService.updateById(deliveryListEntity); } - if (loadingNum == 0) { - deliveryListEntity.setDeliveryListLoadingStatus(DeliveryLoadingStatusConstant.weizhuangche.getValue()); + + } + + + } + + private void handleAbnormalTurnDown(Long deliveryId, String orderPackageCode, Long warehouseId) { + List list = distributionLoadscanAbnormalService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanAbnormalEntity::getDeliveryListId, deliveryId) + .eq(DistributionLoadscanAbnormalEntity::getPackageCode, orderPackageCode) + .eq(DistributionLoadscanAbnormalEntity::getWarehouseId, warehouseId) + .eq(DistributionLoadscanAbnormalEntity::getAuditingStatus, LoadingAbnormalAuditingStatusConstant.yichang.getValue()) + ); + if (!list.isEmpty()) { + if (list.size() == 1){ + distributionLoadscanAbnormalService.removeById(list.get(0)); + }else { + log.info("查询包件驳回数据存在多个deliveryId:{},orderPackageCode:{},warehouseId:{}",deliveryId,orderPackageCode,warehouseId); } + } + } - } else { - log.error(method + "查询配送无计划数量,deliveryId:{}", deliveryId); + + @Override + @Transactional + public void maintenanceDeliveryInfo(Long deliveryId) { + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> deliveryId {}", deliveryId); + if (Objects.isNull(deliveryId)) { + throw new IllegalArgumentException("deliveryId 不能为空"); } + DistributionDeliveryListEntity old = new DistributionDeliveryListEntity(); + DistributionDeliveryListEntity deliveryListEntity = getById(deliveryId); + + BeanUtils.copyProperties(deliveryListEntity, old); + if (ObjectUtil.isEmpty(deliveryListEntity)) { + throw new RuntimeException("查询配送失败"); + } + + int deliveryQuantity = getDeliveryQuantity(deliveryListEntity); + int loadingNum = getLoadingNum(deliveryId); + + /** + * 更新配送状态。 + * 根据配送清单实体中的信息,更新配送数量和装载数量,以反映配送的实时进展。 + * @param deliveryListEntity 配送清单实体,包含需要更新的配送信息。 + * @param deliveryQuantity 更新的配送数量,用于调整配送状态。 + * @param loadingNum 装载数量,用于进一步细化配送状态的更新。 + */ + updateDeliveryStatus(deliveryListEntity, deliveryQuantity, loadingNum); + + + /** + * 更新配送清单实体。 + * 保存对配送清单实体所做的所有更新,确保数据的一致性和准确性。 + * @param deliveryListEntity 配送清单实体,包含所有需要更新的信息。 + */ + updateDeliveryListEntity(deliveryListEntity, old); + } + + private int getDeliveryQuantity(DistributionDeliveryListEntity deliveryListEntity) { + return deliveryListEntity.getDeliveryNumber() + (Objects.isNull(deliveryListEntity.getInventoryNub()) ? 0 : deliveryListEntity.getInventoryNub()); + } + + private int getLoadingNum(Long deliveryId) { + DistributionLoadingNumDTO deliveryLoadingNum = distributionDeliveryListMapper.selectDeliveryLoadingNum(deliveryId); + return Func.isNotEmpty(deliveryLoadingNum) + ? deliveryLoadingNum.getInventoryLoadingQuantity() + deliveryLoadingNum.getPackageLoadingQuantity() + : 0; + } + + private void updateDeliveryStatus(DistributionDeliveryListEntity deliveryListEntity, int deliveryQuantity, int loadingNum) { + // 检查配送数量是否为0,如果是,则记录错误日志并返回 + if (deliveryQuantity == 0) { + log.error("查询配送无计划数量,deliveryId: {}", deliveryListEntity.getId()); + return; + } + + // 根据装载数量与配送数量的关系,设置配送装载状态 + // 如果装载数量等于配送数量,设置为“已装车”;如果装载数量大于0但小于配送数量,设置为“部分装车”;否则设置为“未装车” + deliveryListEntity.setDeliveryListLoadingStatus( + loadingNum == deliveryQuantity ? DeliveryLoadingStatusConstant.yizhuangche.getValue() + : (loadingNum > 0 ? DeliveryLoadingStatusConstant.bunfenzhuangche.getValue() : DeliveryLoadingStatusConstant.weizhuangche.getValue())); - //查询配送内有效的客户信息 + // 根据装载数量是否等于配送数量且所有配送是否已完成签收,设置配送状态 + // 如果装载数量等于配送数量且所有配送已完成签收,设置为“已完成”;否则设置为“配送中” + deliveryListEntity.setDeliveryStatus(isAllSignforCompleted(deliveryListEntity.getId()) + ? DeliveryStatusConstant.yiwancheng.getValue() + : DeliveryStatusConstant.peisongzhong.getValue()); + log.info(">>>>> deliveryListEntity deliveryStatus :{}", deliveryListEntity.getDeliveryStatus()); + + + } + + private boolean isAllSignforCompleted(Long deliveryId) { List signforEntities = baseMapper.selectSignforByDeliveryId(deliveryId); - boolean flag = signforEntities.stream().allMatch(s -> SignforStatusConstant.yiqianshou.getValue().equals(s.getSigningStatus())); - log.info(method+"维护配送状态>>>>>>>>>>>>deliveryId:{}",deliveryId); - log.info(method+"维护配送状态>>>>>>>>>>>>状态是否满足完成:{}",flag); - if (flag){ - deliveryListEntity.setDeliveryStatus(DeliveryStatusConstant.yiwancheng.getValue()); + return signforEntities.stream().allMatch(s -> SignforStatusConstant.yiqianshou.getValue().equals(s.getSigningStatus())); + } + + + private void updateDeliveryListEntity(DistributionDeliveryListEntity deliveryListEntity, DistributionDeliveryListEntity old) { + + log.info(">>>>>> update deliveryListEntity {}", deliveryListEntity); + log.info(">>>>>> update old {}", old); + // 判断传入的对象是否是否为null + if (Objects.isNull(deliveryListEntity)) { + throw new IllegalArgumentException("deliveryListEntity 不能为空"); } - this.updateById(deliveryListEntity); + if (Objects.isNull(old)) { + throw new IllegalArgumentException("old 不能为空"); + } + + + if (old.getDeliveryStatus() == null || old.getDeliveryListLoadingStatus() == null) { + updateById(deliveryListEntity); + return; + } + + +// boolean isUpdate = false; + // 判断传入的2个对象中的deliveryStatus 是否相同 +// if (deliveryListEntity.getDeliveryStatus().equals(old.getDeliveryStatus())) { +// log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> deliveryStatus 相同,不更新"); +// return; +// } +// //判断传入2个对象中deliveryListLoadingStatus 是否相同 +// if (deliveryListEntity.getDeliveryListLoadingStatus().equals(old.getDeliveryListLoadingStatus())) { +// log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> deliveryListLoadingStatus 相同,不更新"); +// +// return; +// } + + updateById(deliveryListEntity); + log.info("配送信息状态已更新,deliveryId: {}", deliveryListEntity.getId()); + } + + + private JSONObject handleLogJSONObject(BasicdataWarehouseEntity warehouse, BladeUser user, String orderPackageCode, String content, Integer node) { + JSONObject trunklinePackageTrackLog = new JSONObject(); + trunklinePackageTrackLog.put("tenantId", user.getTenantId()); + trunklinePackageTrackLog.put("createTime", new Date()); + trunklinePackageTrackLog.put("createUser", user.getUserId()); + trunklinePackageTrackLog.put("updateUser", user.getUserId()); + trunklinePackageTrackLog.put("updateTime", new Date()); + trunklinePackageTrackLog.put("isDeleted", 0); + trunklinePackageTrackLog.put("status", 1); + trunklinePackageTrackLog.put("createDept", warehouse.getDepartment()); + trunklinePackageTrackLog.put("orderPackageCode", orderPackageCode); + trunklinePackageTrackLog.put("warehouseId", warehouse.getId()); + trunklinePackageTrackLog.put("warehouseName", warehouse.getName()); + trunklinePackageTrackLog.put("workNode", node); + trunklinePackageTrackLog.put("content", content); + trunklinePackageTrackLog.put("operator", user.getNickName()); + return trunklinePackageTrackLog; + } + + + private List handleMallLogJSONObject(BasicdataWarehouseEntity warehouse, Long userId, String orderPackageCode, String content, Integer node) { + List trunklinePackageTrackLog = new ArrayList<>(); + JSONObject js = new JSONObject(); + //查询司机用户 + BasicdataDriverArteryEntity driverArtery = arteryClient.getDriverArteryById(userId); + if (!Func.isEmpty(driverArtery)) { + R userR = userClient.userInfoById(driverArtery.getUserId()); + User user = userR.getData(); + js.put("tenantId", user.getTenantId()); + js.put("createTime", new Date()); + js.put("createUser", user.getId()); + js.put("updateUser", user.getId()); + js.put("updateTime", new Date()); + js.put("isDeleted", 0); + js.put("status", 1); + js.put("createDept", warehouse.getDepartment()); + js.put("orderPackageCode", orderPackageCode); + js.put("warehouseId", warehouse.getId()); + js.put("warehouseName", warehouse.getName()); + js.put("workNode", node); + js.put("content", content); + js.put("operator", user.getName()); + trunklinePackageTrackLog.add(js); + } + return trunklinePackageTrackLog; } } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionNodeWorkServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionNodeWorkServiceImpl.java new file mode 100644 index 000000000..0a678802b --- /dev/null +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionNodeWorkServiceImpl.java @@ -0,0 +1,125 @@ +package com.logpm.distribution.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.distribution.entity.DistributionReservationEntity; +import com.logpm.distribution.service.IDistributionNodeWorkService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.broadcast.FanoutConstants; +import org.springblade.common.model.BroadcastNodeData; +import org.springblade.common.model.FanoutMsg; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +@Slf4j +public class DistributionNodeWorkServiceImpl implements IDistributionNodeWorkService { + + private final RabbitTemplate rabbitTemplate; + + @Override + public void nodeLoad() { + + } + + @Override + public void abnormalLoading() { + + } + + @Override + public void cancelLoading() { + + } + + @Override + public void carStart() { + + } + + @Override + public void carArrived() { + + } + + @Override + public void signFor(DistributionParcelListEntity parcelListEntity, Long taskId, String operationTime, String destinationWarehouse) { + + log.info(">>>>>>>>>> signFor 签收扫描 {}", parcelListEntity.getOrderPackageCode()); + BroadcastNodeData broadcastNodeData = new BroadcastNodeData(); + broadcastNodeData.put("orderPackageCode", parcelListEntity.getOrderPackageCode()); + broadcastNodeData.put("distributionContactId", taskId); +// broadcastNodeData.put("distributionContactCode", distributionReservationEntity.getReservationCode()); + broadcastNodeData.put("destinationWarehouse", destinationWarehouse); + broadcastNodeData.put("brand", parcelListEntity.getBrandName()); + broadcastNodeData.setOperationTime(operationTime); + broadcastNodeData.setUserName(AuthUtil.getUserName()); + broadcastNodeData.setTenantId(AuthUtil.getTenantId()); + + FanoutMsg build = FanoutMsg.builder().msg(broadcastNodeData.toJSONString()) + .exchange(FanoutConstants.distribution.signfor.EXCHANGE).build(); + + sendFanoutMsg(build); + } + + + @Override + public void signForCheck() { + + } + + @Override + public void billofladingSignfor(DistributionParcelListEntity parcelListEntity,Long taskId,String operationTime, String destinationWarehouse) { + log.info(">>>>>>>>>> billofladingSignfor 自提扫描 {}", parcelListEntity.getOrderPackageCode()); + + + BroadcastNodeData broadcastNodeData = new BroadcastNodeData(); + broadcastNodeData.put("orderPackageCode", parcelListEntity.getOrderPackageCode()); + broadcastNodeData.put("distributionContactId", taskId); +// broadcastNodeData.put("distributionContactCode", distributionReservationEntity.getReservationCode()); + broadcastNodeData.put("destinationWarehouse", destinationWarehouse); + broadcastNodeData.put("brand", parcelListEntity.getBrandName()); + broadcastNodeData.setOperationTime(operationTime); + broadcastNodeData.setUserName(AuthUtil.getUserName()); + broadcastNodeData.setTenantId(AuthUtil.getTenantId()); + + FanoutMsg build = FanoutMsg.builder().msg(broadcastNodeData.toJSONString()) + .exchange(FanoutConstants.distribution.signfor.EXCHANGE).build(); + + sendFanoutMsg(build); + + } + + @Override + public void billofladingSignforCheck() { + + } + + @Override + public void retention() { + + } + + @Override + public void abnormalSignfor() { + + } + + @Override + public void fail() { + + } + + + @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(value = 3000, multiplier = 1.5)) + private void sendFanoutMsg(FanoutMsg fanoutMsg) { + + rabbitTemplate.convertAndSend(fanoutMsg.getExchange(), null, fanoutMsg.getMsg()); + + } +} diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelListServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelListServiceImpl.java index 714cd5756..e7f392a7f 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelListServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelListServiceImpl.java @@ -43,18 +43,13 @@ import com.logpm.distribution.entity.DistrilbutionBillPackageEntity; import com.logpm.distribution.excel.DistributionParcelListExcel; import com.logpm.distribution.mapper.DistributionParcelListMapper; import com.logpm.distribution.mapper.DistributionStockArticleMapper; -import com.logpm.distribution.service.IDistributionParcelDetailsService; -import com.logpm.distribution.service.IDistributionParcelListService; -import com.logpm.distribution.service.IDistributionParcelNumberService; -import com.logpm.distribution.service.IDistributionReservationZeroPackageService; -import com.logpm.distribution.service.IDistributionStockListInfoService; -import com.logpm.distribution.service.IDistributionStockListService; -import com.logpm.distribution.service.IDistrilbutionBillPackageService; +import com.logpm.distribution.service.*; import com.logpm.distribution.vo.DistributionParcelListBaseVO; import com.logpm.distribution.vo.DistributionParcelListNodeVO; import com.logpm.distribution.vo.DistributionParcelListVO; import com.logpm.distribution.vo.DistributionParcelListZeroVO; import com.logpm.distribution.vo.PackageStockupVO; +import com.logpm.trunkline.feign.ITrunklinePackageTrackLogClient; import com.logpm.warehouse.entity.WarehouseUpdownGoodsEntity; import com.logpm.warehouse.entity.WarehouseWaybillEntity; import com.logpm.warehouse.feign.IWarehouseTrayGoodsClient; @@ -62,6 +57,7 @@ import com.logpm.warehouse.feign.IWarehouseUpdownGoodsClient; import com.logpm.warehouse.feign.IWarehouseWaybillClient; import lombok.extern.slf4j.Slf4j; import org.springblade.common.constant.DictBizConstant; +import org.springblade.common.constant.WorkNodeEnums; import org.springblade.common.constant.order.OrderStockupStatusConstant; import org.springblade.common.constant.orderpackage.OrderPackageLoadingStatusConstant; import org.springblade.common.constant.orderpackage.OrderPackageReservationStatusConstant; @@ -71,6 +67,7 @@ import org.springblade.common.node.PackageNode; import org.springblade.common.utils.CommonUtil; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.BeanUtil; @@ -82,20 +79,12 @@ import org.springblade.system.feign.IUserClient; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; import java.util.stream.Collectors; /** @@ -131,6 +120,9 @@ public class DistributionParcelListServiceImpl extends BaseServiceImpl list1 = baseMapper.selectList(queryWrapper); + boolean flag = list1.stream().anyMatch(p -> OrderPackageReservationStatusConstant.yiyueyue.getValue().equals(p.getOrderPackageReservationStatus())); + if (flag){ + String collect = list1.stream().map(DistributionParcelListEntity::getOrderPackageCode).collect(Collectors.joining(",")); + throw new ServiceException(collect+"包件已预约,无法转为库存品"); + } boolean b = list1.stream().anyMatch(i -> ObjectUtils.isNull(i.getMaterialId())); if (b) { throw new ServiceException("有包件未维护物料信息,请维护后在进行操作!!"); } if (!list1.isEmpty()) { + List aaa = new ArrayList<>(); Set listString = new HashSet<>(); log.info("###############包件信息>>>>>>>>>>>>,{}", list1); Map> listMap = list1.stream().collect(Collectors.groupingBy(DistributionParcelListEntity::getMaterialId)); @@ -548,6 +548,10 @@ public class DistributionParcelListServiceImpl extends BaseServiceImpl warehouseList = warehouseClient.getMyWarehouseList(); + if (!warehouseList.isEmpty()) { + List warehouseIds = warehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + paramMap.put("warehouseIds", warehouseIds); + } + }else { + paramMap.put("warehouseId", myCurrentWarehouse.getId()); } // 用户勾选数据的ids Object ids = paramMap.get("ids"); @@ -682,12 +695,17 @@ public class DistributionParcelListServiceImpl extends BaseServiceImpl list = baseMapper.exportDistributionParcelList(paramMap, idArr); list.forEach(li -> { li.setOrderPackageGroundingStatus(DictBizCache.getValue(DictBizConstant.ORDER_PACKAGE_GROUNDING_STATUS, li.getOrderPackageGroundingStatus())); + li.setOrderPackageStatus(DictBizCache.getValue(DictBizConstant.ORDER_PACKAGE_STATUS, li.getOrderPackageStatus())); + li.setOrderPackageReservationStatus(DictBizCache.getValue(DictBizConstant.ORDER_RESERVATION_STATUS, li.getOrderPackageReservationStatus())); +// li.setOrderPackageFreezeStatus(DictBizCache.getValue(DictBizConstant.ORDER_PACKAGE_FREEZE_STATUS, li.getOrderPackageFreezeStatus())); + li.setOrderPackageStockupStatus(DictBizCache.getValue(DictBizConstant.ORDER_PACKAGE_STOCKUP_STATUS, li.getOrderPackageStockupStatus())); + li.setOrderPackageLoadingStatus(DictBizCache.getValue(DictBizConstant.ORDER_PACKAGE_LOADING_STATUS, li.getOrderPackageLoadingStatus())); + li.setTypeService(DictBizCache.getValue(DictBizConstant.DISTRIBUTION_TYPE, li.getTypeService())); }); return list; } @@ -737,7 +755,7 @@ public class DistributionParcelListServiceImpl extends BaseServiceImpl orderCodes = new TreeSet<>(); for (DistributionParcelListEntity parcelListEntity : listEntityList) { Long packageWarehouseId = parcelListEntity.getWarehouseId(); - parcelListEntity.setWaybillId(waybillId + ""); + parcelListEntity.setWaybillId(waybillId); parcelListEntity.setWaybillNumber(waybillNo); parcelListEntity.setSendWarehouseId(departureWarehouseId); parcelListEntity.setSendWarehouseName(departureWarehouseName); @@ -775,8 +793,8 @@ public class DistributionParcelListServiceImpl extends BaseServiceImpl materialId = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getMaterialId).distinct().collect(Collectors.toList()); List materialCode = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getMaterialCode).distinct().collect(Collectors.toList()); List materialUnit = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getMaterialUnit).distinct().collect(Collectors.toList()); - List mallId = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getMallId).distinct().collect(Collectors.toList()); + List mallId = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getMarketId).distinct().collect(Collectors.toList()); List materialName = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getMaterialName).distinct().collect(Collectors.toList()); List brandId = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getBrandId).distinct().collect(Collectors.toList()); if (materialId.size() != 1 || materialCode.size() != 1 || materialUnit.size() != 1 || mallId.size() != 1 || materialName.size() != 1 || brandId.size() != 1) { @@ -1120,11 +1138,12 @@ public class DistributionParcelListServiceImpl extends BaseServiceImpl findEntityListByOrderCodeAndStatus(String orderCode, Long warehouseId, String packageStatus) { + public List findEntityListByOrderCodeAndStatus(String orderCode, Long warehouseId, String packageStatus,String waybillNo) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_code", orderCode) .eq("warehouse_id", warehouseId) .eq("order_package_status", packageStatus) + .eq("waybill_number",waybillNo) .eq("is_transfer", 1) .eq("is_deleted", 0); return baseMapper.selectList(queryWrapper); @@ -1214,4 +1233,114 @@ public class DistributionParcelListServiceImpl extends BaseServiceImpl orderPackageCodes, Long warehouseId, String packageStatus) { + baseMapper.updatePackageStatus(orderPackageCodes,warehouseId,packageStatus); + } + + @Override + public List findListByOrderPackageCode(List orderPackageCodes, Long warehouseId) { + return baseMapper.findListByOrderPackageCode(orderPackageCodes,warehouseId); + } + + @Override + public void updateFreezeStatusByWaybillIds(List waybillIds) { + baseMapper.updateFreezeStatusByWaybillIds(waybillIds); + } + + @Override + public void updateUnFreezeStatusByWaybillIds(List waybillIds) { + baseMapper.updateUnFreezeStatusByWaybillIds(waybillIds); + } + + @Override + public void clearParceListWaybillByAdvanceIds(List advanceIds) { + baseMapper.clearParceListWaybillByAdvanceIds(advanceIds); + } + + @Override + public List findPackagesByAdvanceIdsAndNoStock(List advanceIds, Long warehouseId) { + return baseMapper.findPackagesByAdvanceIdsAndNoStock(advanceIds,warehouseId); + } + + @Override + public List findAllOrderCodesByAdvanceIds(List advanceIds, Long warehouseId) { + return baseMapper.findAllOrderCodesByAdvanceIds(advanceIds,warehouseId); + } + + @Override + public void removePakcageByAdvanceIds(List advanceIds, Long warehouseId) { + baseMapper.removePakcageByAdvanceIds(advanceIds,warehouseId); + } + + @Override + public Map> findPackageCodeByCodes(Set keySet) { + Map> resultMap = new HashMap<>(); + List> map = baseMapper.findPackageCodeByCodes(keySet); + if(CollUtil.isNotEmpty(map)){ + for (Map stringStringMap : map) { + String code = stringStringMap.get("code"); + String id = stringStringMap.get("id"); + if(resultMap.containsKey(code)){ + resultMap.get(code).add(id); + }else{ + Set set = new HashSet<>(); + set.add(id); + resultMap.put(code,set); + } + } + } + return resultMap; + } + + @Override + public List findALLNoUpShelfPackageByOrderCodeList(List orderCodeList, Long warehouseId) { + return baseMapper.findALLNoUpShelfPackageByOrderCodeList(orderCodeList,warehouseId); + } + + @Override + public List findOrderCodesByOrderPackageCodes(List orderPackageCodes, Long warehouseId) { + return baseMapper.findOrderCodesByOrderPackageCodes(orderPackageCodes,warehouseId); + } + + @Override + public String findAllTraysByNoParcelListIds(List parcelListIdList,String orderCode) { + return baseMapper.findAllTraysByNoParcelListIds(parcelListIdList,orderCode); + } + + @Override + public void clearPalletByIds(List clearTrayList) { + baseMapper.clearPalletByIds(clearTrayList); + } + + @Override + public String findAllAllocationByNoParcelListIds(List parcelListIdList, String orderCode) { + return baseMapper.findAllAllocationByNoParcelListIds(parcelListIdList,orderCode); + } + + @Override + public void clearAllocationByIds(List clearTrayList) { + baseMapper.clearAllocationByIds(clearTrayList); + } + + + private JSONObject handleLogJSONObject(BasicdataWarehouseEntity warehouse, BladeUser user, String orderPackageCode, String content, Integer node) { + JSONObject trunklinePackageTrackLog = new JSONObject(); + trunklinePackageTrackLog.put("tenantId",user.getTenantId()); + trunklinePackageTrackLog.put("createTime",new Date()); + trunklinePackageTrackLog.put("createUser",user.getUserId()); + trunklinePackageTrackLog.put("updateUser",user.getUserId()); + trunklinePackageTrackLog.put("updateTime",new Date()); + trunklinePackageTrackLog.put("isDeleted",0); + trunklinePackageTrackLog.put("status",1); + trunklinePackageTrackLog.put("createDept",warehouse.getDepartment()); + trunklinePackageTrackLog.put("orderPackageCode",orderPackageCode); + trunklinePackageTrackLog.put("warehouseId",warehouse.getId()); + trunklinePackageTrackLog.put("warehouseName",warehouse.getName()); + trunklinePackageTrackLog.put("workNode",node); + trunklinePackageTrackLog.put("content",content); + trunklinePackageTrackLog.put("operator",user.getNickName()); + return trunklinePackageTrackLog; + } + } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionReservationPackageServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionReservationPackageServiceImpl.java index 22d47bc7a..163ef987b 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionReservationPackageServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionReservationPackageServiceImpl.java @@ -32,18 +32,24 @@ import com.logpm.distribution.service.IDistributionReservationPackageService; import com.logpm.distribution.vo.*; import com.logpm.distribution.vo.app.DistributionAppParcelListVO; import com.logpm.distribution.wrapper.DistributionParcelListWrapper; +import com.logpm.trunkline.feign.ITrunklinePackageTrackLogClient; import lombok.AllArgsConstructor; import org.springblade.common.constant.DictBizConstant; +import org.springblade.common.constant.WorkNodeEnums; import org.springblade.common.constant.order.OrderReservationStatusConstant; import org.springblade.common.constant.orderpackage.OrderPackageReservationStatusConstant; import org.springblade.common.constant.orderpackage.OrderPackageStatusConstant; import org.springblade.common.constant.reservation.ReservationPackageStatusConstant; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.Func; import org.springblade.system.cache.DictBizCache; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Map; @@ -59,6 +65,7 @@ public class DistributionReservationPackageServiceImpl extends BaseServiceImpl packageEntityList = this.list(Wrappers.query().lambda() .eq(DistributionReservationPackageEntity::getReservationId, reservationId) @@ -169,10 +180,15 @@ public class DistributionReservationPackageServiceImpl extends BaseServiceImpl aaa = new ArrayList<>(); DistributionReservationPackageEntity distributionReservationPackageEntity = packageEntityList.get(0); distributionReservationPackageEntity.setCancelStatus(1); + distributionReservationPackageEntity.setCancelRemark(AuthUtil.getNickName()+"进行配车计划取消订制品"); distributionReservationPackageEntity.setPacketBarStatus(ReservationPackageStatusConstant.quxiao.getValue()); this.updateById(distributionReservationPackageEntity); + String content = "包件在"+myCurrentWarehouse.getName()+"由"+AuthUtil.getUser().getNickName()+"取消配车计划,操作方式:配送详情进行客户包件批量选中取消,预约任务号:"+reservationCode; + aaa.add(handleLogJSONObject(myCurrentWarehouse,AuthUtil.getUser(),distributionReservationPackageEntity.getPacketBarCode(),content, WorkNodeEnums.CANCEL_DISTRIBUTION.getCode())); + trunklinePackageTrackLogClient.addPackageTrackLog(aaa); }else { //计划出现查询该包件记录错误, return false; @@ -192,5 +208,23 @@ public class DistributionReservationPackageServiceImpl extends BaseServiceImpl idsList = distributionReservationEntities.stream().map(DistributionReservationEntity::getId).collect(Collectors.toList()); + List entityList = distributionStockupInfoService.list(Wrappers.query().lambda() + .in(DistributionStockupInfoEntity::getReservationId, idsList) + .ne(DistributionStockupInfoEntity::getStockStatus, "4") + ); + if (!entityList.isEmpty()){ + List stockIds = entityList.stream().map(DistributionStockupInfoEntity::getStockupId).collect(Collectors.toList()); + log.info("批量转备货任务勾选预约存在备货任务>>>>>>>>>>>>>>>>>>>>>>>>>>>>reservationIds:{},stockIds:{}",idsList,stockIds); + List distributionStockupEntities = distributionStockupService.listByIds(stockIds); + String code = distributionStockupEntities.stream().map(DistributionStockupEntity::getStockupCode).collect(Collectors.joining(",")); + return R.fail("勾选预约存在备货任务:"+code); + } + } try { //获取前端携带批量转备货的id @@ -1138,35 +1161,10 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl ids = Func.toLongList(reservationIds); -// DistributionStockupEntity distributionStockupEntity = Func.copy(stockup, DistributionStockupEntity.class); Integer stockListTotal = distributionReservationStocklistMapper.getStockListTotal(ids); - //这里判断是否选择了司机 -// if (Func.isEmpty(stockupentity.getForkliftId())) { -// //这里就是米有选择司机 -// distributionStockupEntity.setAssignStatus(StockAssignStatusConstant.weizhipai.getValue()); -// distributionStockupEntity.setStockupStatus(StockupStatusConstant.weibeihuo.getValue()); -// } else { -// distributionStockupEntity.setAssignTime(new Date()); -// distributionStockupEntity.setAssignStatus(StockAssignStatusConstant.yizhipai.getValue()); -// distributionStockupEntity.setStockupStatus(StockupStatusConstant.daibeihuo.getValue()); -// distributionStockupEntity.if (Func.equals(reservationEntity.getStockupStatus(), ReservationStockupStatusConstant.weibeihuo.getValue())) { -// //如果预约已经备货 -// DistributionStockupInfoEntity stockupInfoEntity = new DistributionStockupInfoEntity(); -// stockupInfoEntity.setStockUpType(StockupTypeConstant.shipei.getValue()); -// stockupInfoEntity.setReservationId(ids.get(i)); -// stockupInfoEntity.setStockupId(distributionStockupEntity.getId()); -// distributionStockupInfoService.save(stockupInfoEntity); -// reservationEntity.setStockupStatus(ReservationStockupStatusConstant.daibeihuo.getValue()); -// }(stockup.getForkliftId()); -// distributionStockupEntity.setForkliftName(stockup.getForkliftName()); -// } DistributionDeliveryListEntity distributionDeliveryListEntity = new DistributionDeliveryListEntity(); - //设置车次号 -// String today = DateUtil.today(); -// String random = Func.random(7, RandomType.ALL); String numberMa = trainNumberMa(); distributionDeliveryListEntity.setTrainNumber(numberMa); distributionDeliveryListEntity.setFee(BigDecimal.ZERO); @@ -1201,35 +1199,11 @@ public class DistributionReservationServiceImpl extends BaseServiceImplquery().lambda().eq(DistributionReservationStocklistEntity::getReservationId, reservationEntity.getId())); Integer orderCount = baseMapper.selectStockArticleCount(reservationEntity.getId()); //查询出该预约下的订单数量 //预约订单数量 @@ -1272,7 +1245,6 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl q = Condition.getQueryWrapper(new HashMap(), DistributionReservationStockarticleEntity.class); @@ -1298,8 +1270,6 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl allocationInfo = allocationDTO.getAllocationInfo(); @@ -1411,30 +1371,18 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl 1) { -// distributionDeliveryListEntity.setOrderId(orderIds.deleteCharAt(orderIds.length() - 1).toString()); -// } -// distributionDeliveryListEntity.setReservationId(reservationIds); - distributionDeliveryListEntity.setDeliveryNumber(packageNum.get()); distributionDeliveryListEntity.setInventoryNub(inventoryNum.get()); distributionDeliveryListService.updateById(distributionDeliveryListEntity); + String content = "包件在"+myCurrentWarehouse.getName()+"由"+ AuthUtil.getUser().getNickName()+"转车次任务,操作方式:批量预约任务转配送,车次号:"+distributionDeliveryListEntity.getTrainNumber(); + distributionAsyncService.recordsReservationDeliveryLog(reservationEntityList,myCurrentWarehouse,user,distributionDeliveryListEntity,WorkNodeEnums.PLAN_DISTRIBUTION.getCode(),content); return R.status(true); } @@ -1464,6 +1412,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl packageVOList = distributionReservationPackageMapper.selectPackageVOList(reservationEntity.getId(), s.getId()); s.setPackageList(DistributionParcelListWrapper.build().listVO(packageVOList)); + s.setReservationNum(pageVOList.size()); } else { List parcelNumberVOS = baseMapper.selectReservationZeroOrderDetail(s.getId(), Long.parseLong(reservationId)); s.setParcelNumberVOS(parcelNumberVOS); @@ -1491,6 +1440,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl distributionReservationStockarticleEntities = distributionReservationStockarticleService.getBaseMapper().selectList(Wrappers.query().lambda().eq(DistributionReservationStockarticleEntity::getReservationId, id).ne(DistributionReservationStockarticleEntity::getStockArticleStatus, ReservationOrderStatusConstant.quxiao.getValue())); Map> oldStockArticle = distributionReservationStockarticleEntities.stream().collect(Collectors.groupingBy(DistributionReservationStockarticleEntity::getStockArticleId)); @@ -1503,6 +1453,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl mallId = new ArrayList<>(); HashSet storeName = new HashSet<>(); HashSet receivingUnit = new HashSet<>(); + List aaa = new ArrayList<>(); newStockArticle.forEach((k, v) -> { List packageLockIds = new ArrayList<>(); if (Func.isEmpty(oldStockArticle.get(k))) { @@ -1526,6 +1477,10 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl ids = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + parcelListEntity.getOrderCode()); int indexOf = ids.indexOf(parcelListEntity.getId()); if (indexOf>0){ ids.remove(indexOf); - bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + parcelListEntity.getOrderCode(),ids,1*60L); + bladeRedis.setEx("warehouseId:" + myCurrentWarehouse.getId() + "orderCode:" + parcelListEntity.getOrderCode(),ids, 60L); } } - //移除缓存 }); reservationStockarticleEntity.setReservationNum(packageNum.get()); distributionReservationStockarticleService.updateById(reservationStockarticleEntity); packTotal.getAndAdd(reservationStockarticleEntity.getReservationNum()); -// distributionAsyncService.changeOrderReservationStatus(distributionStockArticleDTO); oldStockArticle.remove(k); //维护订单信息 distributionStockArticleService.maintenanceOrderInfo(distributionStockArticleDTO.getOrderCode(),myCurrentWarehouse.getId()); @@ -1788,7 +1745,6 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl { //这里就是需要进行取消的订单信息 DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(i); - DistributionReservationStockarticleEntity reservationStockarticleEntity = j.get(0); if (reservationStockarticleEntity.getIsZero().equals(IsOrNoConstant.no.getValue())) { reservationStockarticleEntity.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); @@ -1834,6 +1786,9 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl { p.setPacketBarStatus(ReservationPackageStatusConstant.quxiao.getValue()); distributionReservationPackageService.updateById(p); + String content = "包件在"+myCurrentWarehouse.getName()+"由"+AuthUtil.getUser().getNickName()+"取消计划市配配送,操作方式:取消订单,预约任务号:"+reservationEntity.getReservationCode(); + JSONObject js = handleLogJSONObject(myCurrentWarehouse, AuthUtil.getUser(), p.getPacketBarCode(), content,WorkNodeEnums.CANCEL_DELIVERY.getCode()); + aaa.add(js); reduceTotal.getAndAdd(distributionParcelListService.getById(p.getParceListId()).getQuantity()); DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(p.getParceListId()); parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.daiyuyue.getValue()); @@ -1867,17 +1822,12 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl reservationStocklistEntities = distributionReservationStocklistService.getBaseMapper().selectList(Wrappers.query().lambda() @@ -1910,10 +1860,6 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl l.setStockPackageStatus(InventoryPackageStatusConstant.quxiao.getValue())); disStockListDetailService.updateBatchById(list); }); - DistributionReservationEntity reservationEntity = this.getById(id); + //推送日志 + Integer reservationNum = reservationEntity.getReservationNum(); reservationEntity.setOtherFee(distributionReservationDTO.getOtherFee()); reservationEntity.setConsignee(distributionReservationDTO.getConsignee()); @@ -2040,6 +1987,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl stockArticle = allocationDTO.getStockArticle(); //根据运单号进行分组 - //TODO 这里先根据运单号进行运单信息查询,后期根据运单进行 Map> mallClient = stockArticle.stream().collect(Collectors.groupingBy(DistributionStockArticleDTO::getConsigneeUnit)); //配送任务仓库名称 HashSet deliveryWarehouseName = new HashSet<>(); @@ -2112,13 +2057,13 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl aaa = new ArrayList<>(); mallClient.forEach((k, v) -> { clientTotal.getAndIncrement(); -// AtomicInteger receivingUnit = new AtomicInteger(); - //这里查询有问题 DistributionReservationDTO reservation = allocationDTO.getReservation(); DistributionReservationEntity reservationEntity = Func.copy(reservation, DistributionReservationEntity.class); reservationEntity.setWaybillNo(k); + reservationEntity.setReservationCode(reservationMa()); reservationEntity.setWarehouseId(myCurrentWarehouse.getId()); reservationEntity.setReservationStatus(ReservationStatusConstant.daipeisong.getValue()); //这里采用订单上的收货信息 @@ -2127,10 +2072,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl orderNumber = new HashSet<>(); //运单号 -// HashSet waybillNo = new HashSet<>(); - //运单ID -------这里运单Id后续可能变更为运单号 HashSet waybillId = new HashSet<>(); - HashSet waybillNo = new HashSet<>(); //订单服务号 HashSet serviceNumber = new HashSet<>(); @@ -2159,14 +2101,6 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl { List packageLockIds = new ArrayList<>(); DistributionStockArticleDTO stockArticleDTO = Func.copy(s, DistributionStockArticleDTO.class); -// WarehouseWaybillEntity warehouseWaybillEntity = warehouseWaybillClient.findByWaybillNo(s.getWaybillNumber()); -// if (Func.isNotEmpty(warehouseWaybillEntity.getConsigneeMobile())){ -// marketPhone.add(warehouseWaybillEntity.getConsigneeMobile()); -// } -// if (Func.isNotEmpty(warehouseWaybillEntity.getConsigneeAddress())){ -// consigneeAddress.add(warehouseWaybillEntity.getConsigneeMobile()); -// } - WarehouseWaybillEntity wayBillEntity = warehouseWaybillClient.findByWaybillNo(s.getWaybillNumber()); if (Func.isNotEmpty(wayBillEntity)) { waybillId.add(wayBillEntity.getId().toString()); @@ -2190,15 +2124,9 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl allocationInfo = allocationDTO.getAllocationInfo(); + if (Strings.isBlank(allocationDTO.getMasterDriverName())){ + //无主司机信息 进行主司机默认赋予 + allocationDTO.setMasterDriverName(allocationInfo.get(0).getDriverName()); + } allocationInfo.forEach(a -> { DistributionDeliverySelfEntity distributionDeliverySelfEntity = Func.copy(a, DistributionDeliverySelfEntity.class); //设置车辆编号 @@ -2522,151 +2452,33 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl> storeClient = stockArticle.stream().collect(Collectors.groupingBy(DistributionStockArticleDTO::getStoreName)); -// List distributionStockArticleDTOS = storeClient.get(""); -// Map> mallClient = null; -// if (!Func.isEmpty(distributionStockArticleDTOS)) { -// mallClient = distributionStockArticleDTOS.stream().collect(Collectors.groupingBy(DistributionStockArticleDTO::getMallName)); -// //3、维护订单和客户 -// Map> finalMallClient = mallClient; -// storeClient.forEach((k, v) -> finalMallClient.merge(k, v, (v1, v2) -> v2)); -// } else { -// mallClient = storeClient; -// } -// -// //统计客户数. -// AtomicInteger clientNum = new AtomicInteger(); -//// ////统计包件总数 -//// AtomicInteger packageTotal = new AtomicInteger(); -// ////统计包件总数 -// AtomicInteger orderTotal = new AtomicInteger(); -// //订单拼接 -//// StringBuilder orderSelfNumbering = new StringBuilder(); -// HashSet orderNumber = new HashSet<>(); -// HashSet orderIds = new HashSet<>(); -// HashSet serviceNumber = new HashSet<>(); -// HashSet warehouseName = new HashSet<>(); -// HashSet deliveryWarehouseName = new HashSet<>(); -// HashSet mallName = new HashSet<>(); -// HashSet storeName = new HashSet<>(); -// mallClient.forEach((k, v) -> { -// if (!Func.isBlank(k)) { -// ////统计客户数 -// //预约任务是在客户的维度上进行数据维护 -// //TODO 这里需要将运单上的收货人、联系电话、收获地址进行查询后进行数据冗余 -// DistributionReservationDTO reservation = allocationDTO.getReservation(); -// DistributionReservationEntity reservationEntity = Func.copy(reservation, DistributionReservationEntity.class); -// Date date = new Date(); -// reservationEntity.setReservationDate(date); -// reservationEntity.setConsignee(k); -// reservationEntity.setDeliveryAddress(v.get(0).getCustomerAddress()); -// reservationEntity.setDeliveryPhone(v.get(0).getCustomerTelephone()); -// reservationEntity.setDeliveryType(DistributionTypeConstant.shangpei.getValue()); -// reservationEntity.setReservationStatus(ReservationStatusConstant.daipeisong.getValue()); -// reservationEntity.setStockupStatus(ReservationStockupStatusConstant.daibeihuo.getValue()); -// reservationEntity.setReservationCode(Func.random(13, RandomType.INT)); -// //默认配送时间为全天 -// reservationEntity.setPeriodOfTime(ServiceConstant.RESERVATION_PERIOED_TIME_DAY); -// this.save(reservationEntity); -// clientNum.getAndIncrement(); -// //维护预约和备货的关系 -// DistributionStockupInfoEntity stockupInfoEntity = new DistributionStockupInfoEntity(); -// stockupInfoEntity.setStockUpType(StockupTypeConstant.shangpei.getValue()); -// stockupInfoEntity.setReservationId(reservationEntity.getId()); -// stockupInfoEntity.setStockupId(stockupEntity.getId()); -// distributionStockupInfoService.save(stockupInfoEntity); -// // TODO 计算总费用 -//// AtomicReference initTotal = new AtomicReference<>(BigDecimal.ZERO); -// //统计包件数量 -// AtomicInteger packageTotal = new AtomicInteger(); -// v.forEach(a -> { -// orderTotal.getAndIncrement(); -// DistributionStockArticleDTO stockArticleEntity = Func.copy(a, DistributionStockArticleDTO.class); -//// if (stockArticleEntity.getMallId() == -1) { -//// stockArticleEntity.setMallId(null); -//// } -//// if (stockArticleEntity.getStoreId() == -1) { -//// stockArticleEntity.setStoreId(null); -//// } -// warehouseName.add(stockArticleEntity.getWarehouse()); -// mallName.add(stockArticleEntity.getMallName()); -// storeName.add(stockArticleEntity.getStoreName()); -// //维护订单数据,订单状态直接变更未待配送 -//// stockArticleEntity.setOrderStatus(); -//// distributionStockArticleService.updateById(stockArticleEntity); -// orderNumber.add(stockArticleEntity.getOrderCode()); -// serviceNumber.add(stockArticleEntity.getServiceNumber()); -//// orderSelfNumbering.append().append(","); -// //订单数量累加 -// AtomicInteger packageNum = new AtomicInteger(); -// //订单存在数据源,维护订单包件信息 -// //维护预约和订单关系 -// DistributionReservationStockarticleEntity reservationStockarticleEntity = new DistributionReservationStockarticleEntity(); -// List packageList = a.getPackageListInfo(); -// if (Func.isNotEmpty(packageList) || packageList.size() > 0) { -// packageList.forEach(p -> { -// packageNum.getAndAdd(p.getQuantity()); -// DistributionReservationPackageEntity reservationPackageEntity = new DistributionReservationPackageEntity(); -// reservationPackageEntity.setReservationId(reservationEntity.getId()); -// reservationPackageEntity.setPacketBarCode(p.getOrderPackageCode()); -// reservationPackageEntity.setStockArticleId(stockArticleEntity.getId()); -// reservationPackageEntity.setParceListId(p.getId()); -// distributionReservationPackageService.save(reservationPackageEntity); -// p.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.yiyueyue.getValue()); -// distributionParcelListService.updateById(p); -// }); -// } else { -// log.error("packageList包件参数有误+{" + packageList + "}"); -// } -// String status = distributionReservationPackageService.judgmentStatus(stockArticleEntity); -// stockArticleEntity.setReservationStatus(status); -// distributionStockArticleService.updateById(stockArticleEntity); -// //查询出这个预约单下订单所备选取的包件数量 -//// List parcelListEntityList = distributionReservationStocklistMapper.selectReservationPackageNum(reservationEntity.getId(), stockArticleEntity.getId()); -//// if (packageList.size() != parcelListEntityList.size()) { -//// stockArticleEntity.setReservationStatus(OrderReservationStatusConstant.bufenyuyue.getValue()); -//// } else { -//// stockArticleEntity.setReservationStatus(OrderReservationStatusConstant.yiyueyue.getValue()); -//// } -// reservationStockarticleEntity.setReservationNum(packageNum.get()); -// reservationStockarticleEntity.setIsHaveData(ServiceConstant.ORDER_HAVE_DATA); -// //对订单下的包件进行累加 -// reservationStockarticleEntity.setStockArticleId(stockArticleEntity.getId()); -// reservationStockarticleEntity.setReservationId(reservationEntity.getId()); -// distributionReservationStockarticleService.save(reservationStockarticleEntity); -// packageTotal.getAndAdd(reservationStockarticleEntity.getReservationNum()); -// }); -// //这里将预约信息进行完善 -// reservationEntity.setStockArticleId(String.join(",", orderNumber)); -// reservationEntity.setServiceNumber(String.join(",", serviceNumber)); -// reservationEntity.setWarehouseName(String.join(",", warehouseName)); -// reservationEntity.setMallName(String.join(",", mallName)); -// reservationEntity.setStoreName(String.join(",", storeName)); -// //预约添加订单数量 -// reservationEntity.setReservationNum(packageTotal.get()); -// this.updateById(reservationEntity); -// DistributionSignforEntity distributionSignforEntity = new DistributionSignforEntity(); -// distributionSignforEntity.setReservationId(reservationEntity.getId()); -// distributionSignforEntity.setTrainNumber(str); -// distributionSignforEntity.setDeliveryId(distributionDeliveryListEntity.getId()); -// distributionSignforService.save(distributionSignforEntity); -// deliveryWarehouseName.add(reservationEntity.getWarehouseName()); -// } -// }); + @Override + public void createBusinessPreConversionQueue(Long id) { + Map mapState = new HashMap(); + mapState.put("messageId", CommonUtil.getUUID()); + mapState.put("messageData", id); + mapState.put("createTime", System.currentTimeMillis()); + try { + rabbitTemplate.convertAndSend(RabbitConstant.BUSINESS_PRE_CONVERSION_DATA_EXCHANGE, RabbitConstant.BUSINESS_PRE_CONVERSION_DATA_ROUTING, mapState, message -> { + message.getMessageProperties() + .setHeader("x-delay", 5000); + return message; + }); + } catch (Exception customerException) { + log.error(">>>>>>>>>>>>>>>>>>>>>>>>>> 消息推送失败~ 请联系管理员! ", customerException); -// SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); -// Date parse = null; -// try { -// parse = format.parse(taskTime); -// } catch (ParseException e) { -// e.printStackTrace(); -// } -// distributionDeliveryListEntity.setTaskTime(taskTime); - //完善配送信息 + } + } @Override @@ -2697,6 +2509,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl 0) { + List aaa = new ArrayList<>(); reservationStockarticleEntityList.forEach(rs -> { rs.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); // distributionReservationStockarticleService.updateById(rs); @@ -2717,10 +2530,16 @@ public class DistributionReservationServiceImpl extends BaseServiceImplquery().lambda() .eq(DistributionParcelNumberEntity::getParcelListId, rzp.getParcelListId())); if (Func.isNotEmpty(parcelNumberEntity)) { -// parcelNumberEntity.setHandQuantity(parcelNumberEntity.getHandQuantity() + rzp.getQuantity()); parcelNumberEntity.setDeliveryQuantity(parcelNumberEntity.getDeliveryQuantity() - rzp.getQuantity()); distributionParcelNumberService.updateById(parcelNumberEntity); -// distributionAsyncService.checkZeroStockArticleReservationStatus(parcelNumberEntity); } distributionParcelListService.maintenanceZerpPackageInfo(rzp.getParcelListId()); @@ -2781,7 +2598,12 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl entityList = distributionStockupInfoService.list(Wrappers.query().lambda() + .eq(DistributionStockupInfoEntity::getStockupId, stockupEntity.getId()) + .ne(DistributionStockupInfoEntity::getStockStatus, "4") + ); + if (stockupEntity.getAssignStatus().equals(StockAssignStatusConstant.weizhipai.getValue()) && entityList.size() == 1) { //物理删除关于预约的所有信息 distributionReservationStocklistMapper.deleteReservationStocklist(reservationEntity.getId()); distributionReservationPackageMapper.deleteReservationPackage(reservationEntity.getId()); @@ -2808,106 +2630,10 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl stockupInfoEntityList = distributionStockupInfoService.list(Wrappers.query().lambda() -// .eq(DistributionStockupInfoEntity::getStockupId, stockupEntity.getId())); -// boolean flag = stockupInfoEntityList.stream().allMatch(info -> Func.equals(info.getReservationId(), reservationEntity.getId())); -// if (flag){ -// //删除中间表和备货表 -// DistributionStockupInfoEntity stockupInfoEntity = stockupInfoEntityList.get(0); -// distributionStockupInfoMapper.deleteByReservationId(stockupInfoEntity.getReservationId()); -// distributionStockupMapper.deleteStockUpById(stockupInfoEntity.getStockupId()); -// }else { -// //只删除中间表 -// distributionStockupInfoMapper.deleteByReservationId(reservationEntity.getId()); -// } -// } -// //这里取消还需要对订单、包件、库存品的数据进行维护 -//// -------------------------------------------维护订单—————————————————————————————————————————————————————————————————————————— -// List reservationStockarticleEntityList = distributionReservationMapper.selectStockArticleByReservationId(reservationEntity.getId()); -// if (Func.isNotEmpty(reservationStockarticleEntityList)&&reservationStockarticleEntityList.size()>0){ -// List stockArticleList = distributionReservationMapper.getStockArticleList(reservationEntity.getId()); -// stockArticleList.forEach(s->{ -// if (s.getIsZero().equals(IsOrNoConstant.no.getValue())){ -// s.setReservationStatus(OrderReservationStatusConstant.daiyuyue.getValue()); -// distributionStockArticleService.updateById(s); -// }else { -// List reservationZeroPackageEntities = distributionReservationZeroPackageService.list(Wrappers.query().lambda() -// .eq(DistributionReservationZeroPackageEntity::getReservationId, reservationEntity.getId()) -// .eq(DistributionReservationZeroPackageEntity::getStockArticleId, s.getId()) -// .ne(DistributionReservationZeroPackageEntity::getZeroPackageStatus, ReservationOrderStatusConstant.quxiao.getValue())); -// } -// -// }); -// reservationStockarticleEntityList.forEach(rs->{ -// rs.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); -// distributionReservationStockarticleService.updateById(rs); -// }); -// } -//// ----------------------------------------维护包件———————————————————————————————————————————————————————————————————————————————————— -// List reservationPackageEntityList = distributionReservationMapper.selectReservationPackageByReservationId(reservationEntity.getId()); -// if (Func.isNotEmpty(reservationPackageEntityList) && reservationPackageEntityList.size() > 0){ -// List parcelListEntities = distributionReservationMapper.selectPackageListByReservationId(reservationEntity.getId()); -// parcelListEntities.forEach(p->{ -// p.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.daiyuyue.getValue()); -// distributionParcelListService.updateById(p); -// }); -// reservationPackageEntityList.forEach(rp->{ -// rp.setPacketBarStatus(ReservationPackageStatusConstant.quxiao.getValue()); -// distributionReservationPackageService.updateById(rp); -// }); -// -// } -// -//// ——————————————————————————————————————————————————维护库存品——————————————————————————————————————————————————————————————————————————— -// -// -// }else { -// //仅仅标注该客户的预约计划取消 -//// -------------------------------------------维护订单—————————————————————————————————————————————————————————————————————————— -// List reservationStockarticleEntityList = distributionReservationMapper.selectStockArticleByReservationId(reservationEntity.getId()); -// if (Func.isNotEmpty(reservationStockarticleEntityList)&&reservationStockarticleEntityList.size()>0){ -// reservationStockarticleEntityList.forEach(rs->{ -// rs.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); -// distributionReservationStockarticleService.updateById(rs); -// }); -// } -//// ----------------------------------------维护包件———————————————————————————————————————————————————————————————————————————————————— -// List reservationPackageEntityList = distributionReservationMapper.selectReservationPackageByReservationId(reservationEntity.getId()); -// if (Func.isNotEmpty(reservationPackageEntityList) && reservationPackageEntityList.size() > 0){ -// reservationPackageEntityList.forEach(rp->{ -// rp.setPacketBarStatus(ReservationPackageStatusConstant.quxiao.getValue()); -// distributionReservationPackageService.updateById(rp); -// }); -// } -// -//// ——————————————————————————————————————————————————维护库存品——————————————————————————————————————————————————————————————————————————— -// List distributionReservationStocklistEntities = distributionReservationMapper.selectStockListByReservationId(reservationEntity.getId()); -// if (Func.isNotEmpty(distributionReservationStocklistEntities) && distributionReservationStocklistEntities.size() > 0){ -// //进行库存品库存数量的维护 -// distributionReservationStocklistEntities.forEach(i->{ -// DistributionStockListEntity stockListEntity = distributionStockListService.getById(i.getStocklistId()); -// stockListEntity.setQuantityOccupied(stockListEntity.getQuantityOccupied() - i.getReservationNum()); -// distributionStockListService.updateById(stockListEntity); -// i.setStockListStatus(ReservationInventoryStatusConstant.quxiao.getValue()); -// distributionReservationStocklistService.updateById(i); -// }); -// } -// } -// -// reservationEntity.setCancelReason(reservationDTO.getCancelReason()); -// reservationEntity.setReservationStatus(ReservationStatusConstant.yiquexiao.getValue()); -// this.updateById(reservationEntity); -// return true; -// } @Override public R getReservationPackage(String reservationId, String id) { @@ -3122,6 +2848,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl packageList = s.getPackageListInfo(); + List orderPackageCodes = new ArrayList<>(); + List aaa = new ArrayList<>(); if (Func.isEmpty(packageList)) { //添加订单下的所有在库订单的包件 List distributionParcelListEntities = distributionParcelListService.list(Wrappers.query().lambda().eq(DistributionParcelListEntity::getStockArticleId, s.getId()) @@ -3244,19 +2973,14 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl packageIds = packageList.stream().map(DistributionParcelListEntity::getId).collect(Collectors.toList()); @@ -3272,30 +2996,19 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl qw = new QueryWrapper().lambda().eq(DistributionParcelListEntity::getStockArticleId, s.getId()); -// List parcelListEntities = distributionParcelListService.getBaseMapper().selectList(qw); -// if (packageList.size() == parcelListEntities.size()) { -// //这里就是表示进行了包件选取的操作,但是选取的包件数量为全部 -// s.setReservationStatus(OrderReservationStatusConstant.yiyueyue.getValue()); -// } else { -// s.setReservationStatus(OrderReservationStatusConstant.bufenyuyue.getValue()); -// } } distributionReservationStockarticleEntity.setReservationNum(packageNum.get()); + //日志记录 + trunklinePackageTrackLogClient.addPackageTrackLog(aaa); //维护对应订单的配送件数 -// Integer i = distributionStockArticleMapper.augmentDeliveryQuantity(distributionReservationStockarticleEntity.getStockArticleId(),distributionReservationStockarticleEntity.getReservationNum()); -// distributionStockArticleService.maintenanceOrderInfo(s.getOrderCode(),myCurrentWarehouse.getId()); } else if ("1".equals(s.getIsZero())) { //零担订单处理 if (Func.isNotBlank(s.getServiceNumber())) { @@ -3387,15 +3100,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl a = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() +"orderCode:"+ s.getOrderCode()); @@ -3422,10 +3124,10 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl { //如果库存品存在占用数量,这里就直接进行累加 //对库存品的数量进行维护,将预约单的库存品数量进行冻结 -// int count = i.getOutboundQuantity() + i.getReservationNum(); -// i.setQuantityOccupied(count); DistributionStockListEntity stockListEntity = distributionStockListService.getById(i.getId()); int keyongshuliang = stockListEntity.getQuantityStock() - stockListEntity.getQuantityOccupied(); if (i.getReservationNum() > keyongshuliang) { @@ -3504,7 +3204,6 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl p.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.yizhuangche.getValue())); - signStatus = distributionParcelListEntities.stream().allMatch(p->p.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())); +// signStatus = distributionParcelListEntities.stream().allMatch(p->p.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())); stockUpStatus = distributionParcelListEntities.stream().allMatch(p->p.getOrderPackageStockupStatus().equals(OrderPackageStockupStatusConstant.yibeihu.getValue())); } if (Func.isNotEmpty(disStockListDetailEntities)){ loadStatus = disStockListDetailEntities.stream().allMatch(p -> p.getStockLockingStatus().equals(OrderPackageLoadingStatusConstant.yizhuangche.getValue())); - signStatus = disStockListDetailEntities.stream().anyMatch(p->p.getStockSignfoStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())); +// signStatus = disStockListDetailEntities.stream().anyMatch(p->p.getStockSignfoStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())); stockUpStatus = disStockListDetailEntities.stream().allMatch(p->p.getStockStatus().equals(OrderPackageStockupStatusConstant.yibeihu.getValue())); } @@ -3761,7 +3457,13 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl>>>>>>>>>>>>>>>>>reservationId:{}",distributionCancelReservationPackageDTO.getReservationId()); + return R.fail("请联系管理员...."); + } List list = Func.toLongList(distributionCancelReservationPackageDTO.getPackageIds()); + log.info(method+"取消包件>>>>:{}",distributionCancelReservationPackageDTO.getPackageIds()); switch (distributionCancelReservationPackageDTO.getType()){ case 1: //取消包件 @@ -3778,6 +3480,15 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl loadscanEntityList = distributionLoadscanMapper.selectList(Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getPackageId, parcelListEntity.getId()) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + ); + if (!loadscanEntityList.isEmpty()){ + log.info(method+"检测当前取消包件存在装车或者签收操作:packageId{}",distributionCancelReservationPackageDTO.getPackageIds()); + throw new RuntimeException("包件存在装车、签收,无法进行取消"); + } //修改包件状态 parcelListEntity.setOrderPackageStatus(OrderPackageStatusConstant.yiruku.getValue()); parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.daiyuyue.getValue()); @@ -3785,7 +3496,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl selectListByDeliveryId(Long id) { + return baseMapper.selectListByDeliveryId(id); + } + + + + private JSONObject handleLogJSONObject(BasicdataWarehouseEntity warehouse,BladeUser user,String orderPackageCode,String content,Integer node) { + JSONObject trunklinePackageTrackLog = new JSONObject(); + trunklinePackageTrackLog.put("tenantId",user.getTenantId()); + trunklinePackageTrackLog.put("createTime",new Date()); + trunklinePackageTrackLog.put("createUser",user.getUserId()); + trunklinePackageTrackLog.put("updateUser",user.getUserId()); + trunklinePackageTrackLog.put("updateTime",new Date()); + trunklinePackageTrackLog.put("isDeleted",0); + trunklinePackageTrackLog.put("status",1); + trunklinePackageTrackLog.put("createDept",warehouse.getDepartment()); + trunklinePackageTrackLog.put("orderPackageCode",orderPackageCode); + trunklinePackageTrackLog.put("warehouseId",warehouse.getId()); + trunklinePackageTrackLog.put("warehouseName",warehouse.getName()); + trunklinePackageTrackLog.put("workNode",node); + trunklinePackageTrackLog.put("content",content); + trunklinePackageTrackLog.put("operator",user.getNickName()); + return trunklinePackageTrackLog; + } } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionReservationStockarticleServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionReservationStockarticleServiceImpl.java index 9641ba8f0..5d2ff5086 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionReservationStockarticleServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionReservationStockarticleServiceImpl.java @@ -56,95 +56,95 @@ import java.util.stream.Collectors; public class DistributionReservationStockarticleServiceImpl extends BaseServiceImpl implements IDistributionReservationStockarticleService { - private final DistributionReservationMapper distributionReservationMapper; + private final DistributionReservationMapper distributionReservationMapper; + @Override + public IPage selectDistributionReservationStockarticlePage(IPage page, DistributionReservationStockarticleVO distributionReservationStockarticle) { + return page.setRecords(baseMapper.selectDistributionReservationStockarticlePage(page, distributionReservationStockarticle)); + } - @Override - public IPage selectDistributionReservationStockarticlePage(IPage page, DistributionReservationStockarticleVO distributionReservationStockarticle) { - return page.setRecords(baseMapper.selectDistributionReservationStockarticlePage(page, distributionReservationStockarticle)); - } - - @Override - public List exportDistributionReservationStockarticle(Map distributionReservationStockarticle) { + @Override + public List exportDistributionReservationStockarticle(Map distributionReservationStockarticle) { // QueryWrapper queryWrapper = Condition.getQueryWrapper(distributionReservationStockarticle, DistributionReservationStockarticleEntity.class); // queryWrapper.lambda().eq(DistributionReservationStockarticleEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED); // queryWrapper.apply("stock_article_status in (1,3)"); - DistributionReservationStockarticleDTO reservationStockarticleDTO = JSONObject.parseObject(JSONObject.toJSONString(distributionReservationStockarticle), DistributionReservationStockarticleDTO.class); + DistributionReservationStockarticleDTO reservationStockarticleDTO = JSONObject.parseObject(JSONObject.toJSONString(distributionReservationStockarticle), DistributionReservationStockarticleDTO.class); - List distributionReservationStockarticleList = baseMapper.exportDistributionReservationStockarticle(reservationStockarticleDTO); - distributionReservationStockarticleList.forEach(d -> { - d.setDeliveryType(DictBizCache.getValue(DictBizConstant.DISTRIBUTION_TYPE,d.getDeliveryType())); + List distributionReservationStockarticleList = baseMapper.exportDistributionReservationStockarticle(reservationStockarticleDTO); + distributionReservationStockarticleList.forEach(d -> { + d.setDeliveryType(DictBizCache.getValue(DictBizConstant.DISTRIBUTION_TYPE, d.getDeliveryType())); // distributionReservationStockarticle.setTypeName(DictCache.getValue(DictEnum.YES_NO, DistributionReservationStockarticle.getType())); - }); - return distributionReservationStockarticleList; - } - - @Override - public IPage selectDistributionReservationStockarticleorderPage(IPage page, DistributionReservationStockarticleVO distributionReservationStockarticle) { - return page.setRecords(baseMapper.selectDistributionReservationStockarticleorderPage(page, distributionReservationStockarticle)); - } - - @Override - public void maintenanceReservationStockArticle(Long reservationId,Long warehouseId) { - List reservationStockarticleEntities = this.list(Wrappers.query().lambda() - .eq(DistributionReservationStockarticleEntity::getReservationId, reservationId) - .ne(DistributionReservationStockarticleEntity::getStockArticleStatus, ReservationOrderStatusConstant.quxiao.getValue()) - ); - if (Func.isNotEmpty(reservationStockarticleEntities)){ - List reservationOrderList = reservationStockarticleEntities.stream().filter(order -> order.getIsZero().equals(IsOrNoConstant.no.getValue())).collect(Collectors.toList()); - if (Func.isNotEmpty(reservationOrderList)){ - for (DistributionReservationStockarticleEntity reservationStockarticleEntity : reservationOrderList) { - if (IsOrNoConstant.yes.getValue().equals(reservationStockarticleEntity.getIsZero())){ - List distributionParcelListEntities = distributionReservationMapper.selectPackageByReservationAndStockArticle(reservationId, reservationStockarticleEntity.getStockArticleId(),warehouseId); - if (Func.isNotEmpty(distributionParcelListEntities)){ - int sum = distributionParcelListEntities.stream().mapToInt(DistributionParcelListEntity::getQuantity).sum(); - if (sum == 0){ - reservationStockarticleEntity.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); - //标识任务取消 - reservationStockarticleEntity.setCancelStatus(1); - this.updateById(reservationStockarticleEntity); - } - } - }else { - List distributionParcelNumberVOS = distributionReservationMapper.selectReservationZeroOrderDetail(reservationStockarticleEntity.getStockArticleId(), reservationId); - if (Func.isNotEmpty(distributionParcelNumberVOS)){ - int sum = distributionParcelNumberVOS.stream().mapToInt(DistributionParcelNumberVO::getReservationNum).sum(); - if (0 == sum){ - reservationStockarticleEntity.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); - reservationStockarticleEntity.setCancelStatus(1); - this.updateById(reservationStockarticleEntity); - } - } - } - } - } - } - } - - @Override - public void maintenanceReservationStockArticleNum(Long reservationId, Long orderId,Long warehouseId) { - - DistributionReservationStockarticleEntity reservationStockarticleEntity = this.getOne(Wrappers.query().lambda() - .eq(DistributionReservationStockarticleEntity::getReservationId, reservationId) - .eq(DistributionReservationStockarticleEntity::getStockArticleId, orderId) - .ne(DistributionReservationStockarticleEntity::getStockArticleStatus, ReservationOrderStatusConstant.quxiao.getValue()) - ); - if (Func.isNotEmpty(reservationStockarticleEntity)){ - List distributionParcelListEntities = distributionReservationMapper.selectPackageByReservationAndStockArticle(reservationId, orderId, warehouseId); - if (Func.isNotEmpty(distributionParcelListEntities)){ - int sum = distributionParcelListEntities.stream().mapToInt(DistributionParcelListEntity::getQuantity).sum(); - reservationStockarticleEntity.setReservationNum(sum); - }else { - reservationStockarticleEntity.setReservationNum(0); - reservationStockarticleEntity.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); - reservationStockarticleEntity.setCancelStatus(1); - } - this.updateById(reservationStockarticleEntity); - - } - } + }); + return distributionReservationStockarticleList; + } + + @Override + public IPage selectDistributionReservationStockarticleorderPage(IPage page, DistributionReservationStockarticleVO distributionReservationStockarticle) { + return page.setRecords(baseMapper.selectDistributionReservationStockarticleorderPage(page, distributionReservationStockarticle)); + } + + @Override + public void maintenanceReservationStockArticle(Long reservationId, Long warehouseId) { + List reservationStockarticleEntities = this.list(Wrappers.query().lambda() + .eq(DistributionReservationStockarticleEntity::getReservationId, reservationId) + .ne(DistributionReservationStockarticleEntity::getStockArticleStatus, ReservationOrderStatusConstant.quxiao.getValue()) + ); + if (Func.isNotEmpty(reservationStockarticleEntities)) { + List reservationOrderList = reservationStockarticleEntities.stream().filter(order -> order.getIsZero().equals(IsOrNoConstant.no.getValue())).collect(Collectors.toList()); + if (Func.isNotEmpty(reservationOrderList)) { + for (DistributionReservationStockarticleEntity reservationStockarticleEntity : reservationOrderList) { + if (IsOrNoConstant.no.getValue().equals(reservationStockarticleEntity.getIsZero())) { + List distributionParcelListEntities = distributionReservationMapper.selectPackageByReservationAndStockArticle(reservationId, reservationStockarticleEntity.getStockArticleId(), warehouseId); + int sum = 0; + if (!distributionParcelListEntities.isEmpty()) { + sum = distributionParcelListEntities.stream().mapToInt(DistributionParcelListEntity::getQuantity).sum(); + } + if (sum == 0) { + reservationStockarticleEntity.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); + //标识任务取消 + reservationStockarticleEntity.setCancelStatus(1); + this.updateById(reservationStockarticleEntity); + } + } else { + List distributionParcelNumberVOS = distributionReservationMapper.selectReservationZeroOrderDetail(reservationStockarticleEntity.getStockArticleId(), reservationId); + if (Func.isNotEmpty(distributionParcelNumberVOS)) { + int sum = distributionParcelNumberVOS.stream().mapToInt(DistributionParcelNumberVO::getReservationNum).sum(); + if (0 == sum) { + reservationStockarticleEntity.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); + reservationStockarticleEntity.setCancelStatus(1); + this.updateById(reservationStockarticleEntity); + } + } + } + } + } + } + } + + @Override + public void maintenanceReservationStockArticleNum(Long reservationId, Long orderId, Long warehouseId) { + + DistributionReservationStockarticleEntity reservationStockarticleEntity = this.getOne(Wrappers.query().lambda() + .eq(DistributionReservationStockarticleEntity::getReservationId, reservationId) + .eq(DistributionReservationStockarticleEntity::getStockArticleId, orderId) + .ne(DistributionReservationStockarticleEntity::getStockArticleStatus, ReservationOrderStatusConstant.quxiao.getValue()) + ); + if (Func.isNotEmpty(reservationStockarticleEntity)) { + List distributionParcelListEntities = distributionReservationMapper.selectPackageByReservationAndStockArticle(reservationId, orderId, warehouseId); + if (Func.isNotEmpty(distributionParcelListEntities)) { + int sum = distributionParcelListEntities.stream().mapToInt(DistributionParcelListEntity::getQuantity).sum(); + reservationStockarticleEntity.setReservationNum(sum); + } else { + reservationStockarticleEntity.setReservationNum(0); + reservationStockarticleEntity.setStockArticleStatus(ReservationOrderStatusConstant.quxiao.getValue()); + reservationStockarticleEntity.setCancelStatus(1); + } + this.updateById(reservationStockarticleEntity); + + } + } } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java index 99f4f7438..38dd67d8a 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java @@ -16,7 +16,12 @@ */ package com.logpm.distribution.service.impl; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -34,18 +39,23 @@ import com.logpm.distribution.bean.Resp; import com.logpm.distribution.dto.*; import com.logpm.distribution.dto.app.DistributionAppDeliveryListDTO; import com.logpm.distribution.entity.*; -import com.logpm.distribution.excel.DistributionSignforExcel; -import com.logpm.distribution.excel.DistributionSignforOrderExcel; -import com.logpm.distribution.excel.DistributionSignforOwnExcel; -import com.logpm.distribution.excel.DistributionSignforPackageExcel; +import com.logpm.distribution.excel.*; import com.logpm.distribution.mapper.*; import com.logpm.distribution.service.*; import com.logpm.distribution.vo.*; import com.logpm.distribution.vo.app.*; -import com.logpm.distribution.wrapper.DistributionDisStockListWrapper; import com.logpm.distribution.wrapper.DistributionParcelListAppWrapper; import com.logpm.distribution.wrapper.DistributionParcelListWrapper; import com.logpm.distribution.wrapper.DistributionStockArticleWrapper; +import com.logpm.factory.comfac.dto.OrderStatusDTO; +import com.logpm.oldproject.dto.SignPushDataContactDTO; +import com.logpm.oldproject.dto.SignPushDataDTO; +import com.logpm.oldproject.dto.SignPushDataUnitDTO; +import com.logpm.oldproject.entity.WarehouseEntity; +import com.logpm.oldproject.feign.IOldSignPushClient; +import com.logpm.oldproject.feign.IWarehouseClient; +import com.logpm.trunkline.feign.ITrunklinePackageTrackLogClient; +import com.logpm.warehouse.feign.IWarehouseUpdownStockUpAreaClient; import com.logpm.warehouse.feign.IWarehouseUpdownTypeClient; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; @@ -54,14 +64,13 @@ import org.springblade.common.constant.DistributionTypeConstant; import org.springblade.common.constant.Inventory.InventoryLoadingStatusConstant; import org.springblade.common.constant.Inventory.InventorySigningStatusConstant; import org.springblade.common.constant.RabbitConstant; +import org.springblade.common.constant.RedisKeyConstant; +import org.springblade.common.constant.WorkNodeEnums; import org.springblade.common.constant.billLading.BillLadingStatusConstant; import org.springblade.common.constant.common.IsOrNoConstant; import org.springblade.common.constant.delivery.DeliveryLoadingStatusConstant; import org.springblade.common.constant.delivery.DeliveryStatusConstant; -import org.springblade.common.constant.loading.LoadScanSigningStatusConstant; -import org.springblade.common.constant.loading.LoadingAbnormalAuditingStatusConstant; -import org.springblade.common.constant.loading.LoadingIsInsertConstant; -import org.springblade.common.constant.loading.LoadingStatusConstant; +import org.springblade.common.constant.loading.*; import org.springblade.common.constant.orderpackage.*; import org.springblade.common.constant.reservation.*; import org.springblade.common.constant.signing.SignforDriverSigningStatusConstant; @@ -83,6 +92,7 @@ import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.system.cache.DictBizCache; import org.springblade.system.entity.User; import org.springblade.system.feign.IDictBizClient; import org.springblade.system.feign.IUserClient; @@ -100,8 +110,10 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.math.BigDecimal; +import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @@ -124,6 +136,7 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl selectDistributionSignforPage(IPage page, DistributionSignforVO distributionSignfor) { - //转换创建时间 - SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); + + + // 转换创建时间 if (null != distributionSignfor.getCreateTime()) { - distributionSignfor.setCreateTime_query(sdf.format(distributionSignfor.getCreateTime())); + distributionSignfor.setCreateTime_query(DateUtil.format(distributionSignfor.getCreateTime(), "yyyy:MM:dd HH:mm:ss")); } - //获取当前登录人仓库 - List myWatchWarehouse = basicdataWarehouseClient.getMyWatchWarehouse(); - //取出id - List collect = myWatchWarehouse.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); - distributionSignfor.setWarehouseIdList(collect); - List distributionSignforVOS = baseMapper.selectDistributionSignforPage(page, distributionSignfor); + // 获取当前登录人仓库 + + BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + if (null == myCurrentWarehouse) { + List myWatchWarehouse = basicdataWarehouseClient.getMyWatchWarehouse(); + List collect = myWatchWarehouse.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + distributionSignfor.setWarehouseIdList(collect); + } else { + List collect = new ArrayList<>(); + collect.add(myCurrentWarehouse.getId()); + distributionSignfor.setWarehouseIdList(collect); + } + + + List distributionSignforVOS; + try { + distributionSignforVOS = baseMapper.selectDistributionSignforPage(page, distributionSignfor); + } catch (Exception e) { + log.error(">>> selectDistributionSignforPage", e); + // 这里应该记录日志或者进行一些错误处理 + return page.setRecords(Collections.emptyList()); + } + if (Func.isNotEmpty(distributionSignforVOS)) { List reservationIds = distributionSignforVOS.stream().map(DistributionSignforVO::getReservationId).collect(Collectors.toList()); - List distributionParcelListEntities = distributionReservationMapper.selectPackageListByReservationIds(reservationIds); - List list = disStockListDetailService.list(Wrappers.query().lambda() - .in(DisStockListDetailEntity::getReservationId, reservationIds) - .ne(DisStockListDetailEntity::getStockPackageStatus, ReservationPackageStatusConstant.quxiao.getValue()) - ); - //查询零担计划 - List reservationZeroPackageEntities = distributionReservationZeroPackageService.list(Wrappers.query().lambda() - .in(DistributionReservationZeroPackageEntity::getReservationId, reservationIds) - .ne(DistributionReservationZeroPackageEntity::getZeroPackageStatus, ReservationPackageStatusConstant.quxiao.getValue()) - ); + processReservationIds(distributionSignforVOS, reservationIds); + } + return page.setRecords(distributionSignforVOS); - Map> packageMap; - if (Func.isNotEmpty(distributionParcelListEntities)) { - packageMap = distributionParcelListEntities.stream().collect(Collectors.groupingBy(DistributionParcelListVO::getReservationId)); - } else { - packageMap = null; - } - Map> inventoryMap; - if (Func.isNotEmpty(distributionParcelListEntities)) { - inventoryMap = list.stream().collect(Collectors.groupingBy(DisStockListDetailEntity::getReservationId)); - } else { - inventoryMap = null; - } - Map> zeroPackageMap; - if (Func.isNotEmpty(reservationZeroPackageEntities)) { - zeroPackageMap = reservationZeroPackageEntities.stream().collect(Collectors.groupingBy(DistributionReservationZeroPackageEntity::getReservationId)); - } else { - zeroPackageMap = null; - } - distributionSignforVOS.forEach(d -> { - if (d.getDeliveryType().equals(DistributionTypeConstant.shipie.getValue())) { - d.setDeliveryTypeName(DistributionTypeConstant.shipie.getName()); - } else if (d.getDeliveryType().equals(DistributionTypeConstant.shangpei.getValue())) { - d.setDeliveryTypeName(DistributionTypeConstant.shangpei.getName()); - } else { - d.setDeliveryTypeName(""); - } -// List distributionParcelListEntities = distributionReservationMapper.selectPackageListByReservationId(d.getReservationId()); -// //查询库存品信息 -// List list = disStockListDetailService.list(Wrappers.query().lambda() -// .eq(DisStockListDetailEntity::getReservationId, d.getReservationId()) -// ); - int weizhuangchejianshu = 0; - int weiqianshoujianshu = 0; - int zhuangchejianshu = 0; - int qianshoujianshu = 0; - if (Func.isNotEmpty(packageMap)) { - List distributionParcelListVOS = packageMap.get(d.getReservationId()); - if (Func.isNotEmpty(distributionParcelListVOS)) { - weizhuangchejianshu += distributionParcelListVOS.stream().filter(f -> f.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue())).mapToInt(DistributionParcelListEntity::getQuantity).sum(); - zhuangchejianshu += distributionParcelListVOS.stream().filter(f -> f.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.yizhuangche.getValue())).mapToInt(DistributionParcelListEntity::getQuantity).sum(); - weiqianshoujianshu += distributionParcelListVOS.stream().filter(f -> !f.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())).mapToInt(DistributionParcelListEntity::getQuantity).sum(); - qianshoujianshu += distributionParcelListVOS.stream().filter(f -> f.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())).mapToInt(DistributionParcelListEntity::getQuantity).sum(); - } - } - if (Func.isNotEmpty(zeroPackageMap)) { - List zeroPackageEntities = zeroPackageMap.get(d.getReservationId()); - if (Func.isNotEmpty(zeroPackageEntities)) { - List zeroPackageIds = zeroPackageEntities.stream().map(DistributionReservationZeroPackageEntity::getParcelListId).collect(Collectors.toList()); - //查询这些单子的装车信息 - List loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda() - .eq(DistributionLoadscanEntity::getReservationId, d.getReservationId()) - .in(DistributionLoadscanEntity::getPackageId, zeroPackageIds) - .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) - ); - //此预约单的零担计划总数 - int sum = zeroPackageEntities.stream().mapToInt(DistributionReservationZeroPackageEntity::getQuantity).sum(); - if (loadscanEntityList.isEmpty()) { - //统计装车 - int loadingNum = loadscanEntityList.stream().mapToInt(DistributionLoadscanEntity::getLoadedNub).sum(); - //统计签收 - int signforNUm = loadscanEntityList.stream().filter(f -> LoadScanSigningStatusConstant.yiqianshou.getValue().equals(f.getSignforState())).mapToInt(DistributionLoadscanEntity::getReceivedQuantity).sum(); - - //计算未装车 - weizhuangchejianshu += (sum - loadingNum); - zhuangchejianshu += loadingNum; - //计算未签收 - weiqianshoujianshu += (sum - signforNUm); - qianshoujianshu += signforNUm; + } - } - } - } - if (Func.isNotEmpty(inventoryMap)) { - List listDetailEntityList = inventoryMap.get(d.getReservationId()); - if (Func.isNotEmpty(listDetailEntityList)) { - zhuangchejianshu += listDetailEntityList.stream().filter(f -> f.getStockLockingStatus().equals(InventoryLoadingStatusConstant.yizhuangche.getValue())).mapToInt(DisStockListDetailEntity::getNum).sum(); -// weizhuangchejianshu += list.stream().filter(f -> f.getStockLockingStatus().equals(InventoryLoadingStatusConstant.weizhuangche.getValue())).mapToInt(DisStockListDetailEntity::getNum).sum(); - qianshoujianshu += listDetailEntityList.stream().filter(f -> f.getStockSignfoStatus().equals(InventorySigningStatusConstant.yiqianshou.getValue())).mapToInt(DisStockListDetailEntity::getNum).sum(); -// weiqianshoujianshu += list.stream().filter(f -> f.getStockSignfoStatus().equals(InventorySigningStatusConstant.weiqianshou.getValue())).mapToInt(DisStockListDetailEntity::getNum).sum(); - } - } + private void processReservationIds(List distributionSignforVOS, List reservationIds) { + List distributionParcelListEntities = distributionReservationMapper.selectPackageListByReservationIds(reservationIds); +// List list = disStockListDetailService.list(Wrappers.query().lambda() +// .in(DisStockListDetailEntity::getReservationId, reservationIds) +// .ne(DisStockListDetailEntity::getStockPackageStatus, ReservationPackageStatusConstant.quxiao.getValue()) +// ); + List reservationZeroPackageEntities = distributionReservationZeroPackageService.list(Wrappers.query().lambda() + .in(DistributionReservationZeroPackageEntity::getReservationId, reservationIds) + .ne(DistributionReservationZeroPackageEntity::getZeroPackageStatus, ReservationPackageStatusConstant.quxiao.getValue()) + ); + Map> packageMap = distributionParcelListEntities.stream().collect(Collectors.groupingBy(DistributionParcelListVO::getReservationId)); +// Map> inventoryMap = list.stream().collect(Collectors.groupingBy(DisStockListDetailEntity::getReservationId)); + Map> zeroPackageMap = reservationZeroPackageEntities.stream().collect(Collectors.groupingBy(DistributionReservationZeroPackageEntity::getReservationId)); - //该客户的异常装车件数 - Integer abnormalLoading = distributionLoadscanMapper.selectAbnormalLoadingByReservationId(d.getReservationId()); - //该客户的异常签收件数 - Integer abnormalSigning = distributionLoadscanMapper.selectAbnormalSigningByReservationId(d.getReservationId()); -// DistributionLoadingNumDTO reservationSigningNum = distributionReservationMapper.selectReservationSigningNum(d.getReservationId()); - if (d.getDeliveryType().equals(DistributionTypeConstant.shipie.getValue())) { - List disStockListDetailEntities = distributionReservationMapper.selectInventoryListByReservation(d.getReservationId()); - if (Func.isNotEmpty(disStockListDetailEntities)) { - //查询库存品未装车数 - int inventoryuweizhuancghe = disStockListDetailEntities.stream().filter(f -> f.getStockLockingStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue())).mapToInt(DisStockListDetailEntity::getNum).sum(); - weizhuangchejianshu += inventoryuweizhuancghe; - //查询库存品为签收数 - int inventoryweiqianshou = disStockListDetailEntities.stream().filter(f -> f.getStockSignfoStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue())).mapToInt(DisStockListDetailEntity::getNum).sum(); - weiqianshoujianshu += inventoryweiqianshou; - } - } - //设置计划未装车数 - d.setUnloadedNumber(weizhuangchejianshu); - d.setAbnormalLoadedNumber(abnormalLoading); - d.setLoadedNumber(zhuangchejianshu); - d.setUnreceivedQuantity(weiqianshoujianshu); - d.setReceivedQuantity(qianshoujianshu); - d.setAbnormalReceivedQuantity(abnormalSigning); - }); + distributionSignforVOS.forEach(d -> { + d.setDeliveryTypeName(getDeliveryTypeName(d.getDeliveryType())); + + int weizhuangchejianshu = getWeizhuangchejianshu(packageMap, d); + int zhuangchejianshu = getZhuangchejianshu(packageMap, d); + int qianshoujianshu = getQianshoujianshu(packageMap, zeroPackageMap, d); + int weiqianshoujianshu = getWeiqianshoujianshu(packageMap, zeroPackageMap, d); + + d.setUnloadedNumber(weizhuangchejianshu); + d.setAbnormalLoadedNumber(getAbnormalLoading(d)); + d.setLoadedNumber(zhuangchejianshu); + d.setUnreceivedQuantity(weiqianshoujianshu); + d.setReceivedQuantity(qianshoujianshu); + d.setAbnormalReceivedQuantity(getAbnormalSigning(d)); + }); + } + + private int getWeiqianshoujianshu(Map> packageMap, Map> zeroPackageMap, DistributionSignforVO d) { + + int fromParcelList = packageMap.getOrDefault(d.getReservationId(), Collections.emptyList()).stream().filter(f -> !f.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())).mapToInt(DistributionParcelListVO::getQuantity).sum(); + int fromZeroPackage = calculateWeiqianshouFromZeroPackage(zeroPackageMap, d); + + return fromParcelList + fromZeroPackage; + } + + private int calculateWeiqianshouFromZeroPackage(Map> zeroPackageMap, DistributionSignforVO d) { + if (!zeroPackageMap.containsKey(d.getReservationId())) return 0; + List entities = zeroPackageMap.get(d.getReservationId()); + List zeroPackageIds = entities.stream().map(DistributionReservationZeroPackageEntity::getParcelListId).collect(Collectors.toList()); + + List loadscanEntities = distributionLoadscanService.list( + Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getReservationId, d.getReservationId()) + .in(DistributionLoadscanEntity::getPackageId, zeroPackageIds) + ); + + int totalQuantity = entities.stream().mapToInt(DistributionReservationZeroPackageEntity::getQuantity).sum(); + int loadedQuantity = loadscanEntities.stream().mapToInt(DistributionLoadscanEntity::getLoadedNub).sum(); + + return totalQuantity - loadedQuantity; + } + + + private int getWeizhuangchejianshu(Map> packageMap, DistributionSignforVO d) { + return packageMap.getOrDefault(d.getReservationId(), Collections.emptyList()).stream().filter(f -> f.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue())).mapToInt(DistributionParcelListVO::getQuantity).sum(); + } + + private int getZhuangchejianshu(Map> packageMap, DistributionSignforVO d) { + return packageMap.getOrDefault(d.getReservationId(), Collections.emptyList()).stream().filter(f -> f.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.yizhuangche.getValue())).mapToInt(DistributionParcelListVO::getQuantity).sum(); + } + + + private int getQianshoujianshu(Map> packageMap, Map> zeroPackageMap, DistributionSignforVO d) { + int fromParcelList = packageMap.getOrDefault(d.getReservationId(), Collections.emptyList()).stream().filter(f -> f.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())).mapToInt(DistributionParcelListVO::getQuantity).sum(); + int fromZeroPackage = calculateQianshouFromZeroPackage(zeroPackageMap, d); + + return fromParcelList + fromZeroPackage; + } + + private int calculateQianshouFromZeroPackage(Map> zeroPackageMap, DistributionSignforVO d) { + if (!zeroPackageMap.containsKey(d.getReservationId())) return 0; + List entities = zeroPackageMap.get(d.getReservationId()); + List zeroPackageIds = entities.stream().map(DistributionReservationZeroPackageEntity::getParcelListId).collect(Collectors.toList()); + + List loadscanEntities = distributionLoadscanService.list( + Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getReservationId, d.getReservationId()) + .in(DistributionLoadscanEntity::getPackageId, zeroPackageIds) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + ); + + return loadscanEntities.stream() + .filter(entity -> LoadScanSigningStatusConstant.yiqianshou.getValue().equals(entity.getSignforState())) + .mapToInt(DistributionLoadscanEntity::getReceivedQuantity) + .sum(); + + + } + + private String getDeliveryTypeName(String type) { + switch (type) { + case "1": + return DistributionTypeConstant.shangpei.getName(); + case "2": + return DistributionTypeConstant.shipie.getName(); + case "3": + return DistributionTypeConstant.ziti.getName(); + default: + return ""; } + } - return page.setRecords(distributionSignforVOS); + private Integer getAbnormalLoading(DistributionSignforVO d) { + return distributionLoadscanMapper.selectAbnormalLoadingByReservationId(d.getReservationId()); } + private Integer getAbnormalSigning(DistributionSignforVO d) { + return distributionLoadscanMapper.selectAbnormalSigningByReservationId(d.getReservationId()); + } + + @Override public IPage selectDistributionSignforPageByClient(IPage page, DistributionSignforVO distributionSignfor) { @@ -601,6 +650,18 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl signNum) { + log.info("复核签收装车数和签收数不一致,装车数:{},签收数:{}", loadingNum, signNum); + return R.fail("存在装车还未签收数据!!!"); + } + DistributionDeliveryListEntity deliveryListEntity = distributionDeliveryListService.getById(distributionSignfor.getDeliveryId()); + if (Func.isEmpty(deliveryListEntity)) { + log.error("文员复核查询配送计划失败,deliveryId:{}", distributionSignfor.getDeliveryId()); + return R.fail("操作失败,请核对计划信息!!!"); + } BladeUser user = AuthUtil.getUser(); distributionSignfor.setExamineUserId(user.getUserId()); distributionSignfor.setSigningStatus(SignforStatusConstant.yiqianshou.getValue()); @@ -611,7 +672,12 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl detailEntities = distributionReservationMapper.selectInventoryListByReservation(distrilbutionloadingscanDTO.getReservationId()); - + List jsonObjects = new ArrayList<>(); if (Func.isNotEmpty(split)) { for (String s : split) { List inventoryPackage = detailEntities.stream().filter(f -> Func.isNotEmpty(f.getStockPackageCode()) && f.getStockPackageCode().equals(s)).collect(Collectors.toList()); @@ -690,7 +774,7 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl().lambda().eq(DistributionLoadscanEntity::getReservationId, signforEntity.getReservationId())).intValue(); + Integer lad = distributionLoadscanMapper.selectCount(new QueryWrapper().lambda() + .eq(DistributionLoadscanEntity::getReservationId, signforEntity.getReservationId()) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())) + .intValue(); - Integer nad = distributionLoadscaninvnMapper.selectCount(new QueryWrapper().lambda().eq(DistributionLoadscaninvnEntity::getReservationId, signforEntity.getReservationId())).intValue(); + Integer nad = distributionLoadscaninvnMapper.selectCount(new QueryWrapper().lambda() + .eq(DistributionLoadscaninvnEntity::getReservationId, signforEntity.getReservationId()) + .ne(DistributionLoadscaninvnEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())) + .intValue(); signforEntity.setLoadedNumber(lad); signforEntity.setLoadedinNumber(nad); //统计客户签收数 @@ -881,6 +984,11 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl details = baseMapper.signingPackageDetail(reservationId); + DistributionReservationEntity reservationEntity = distributionReservationService.getById(reservationId); + String str = reservationEntity.getReceivingUnit() + "(" + reservationEntity.getConsignee() + ")"; + details.get(0).setClient(str); + details.get(0).setAddress(reservationEntity.getDeliveryAddress()); + details.get(0).setPhone(reservationEntity.getDeliveryPhone()); return R.data(details); } @@ -998,6 +1106,7 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl jsonObjects = new ArrayList<>(); BladeUser user = AuthUtil.getUser(); //查询零担计划 DistributionReservationZeroPackageEntity reservationZeroPackageEntities = distributionReservationZeroPackageService.getOne(Wrappers.query().lambda() @@ -1203,6 +1329,8 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl> getByReservationIds(List longList) { + return baseMapper.getByReservationIds(longList); + } + + /** + * @param signingId + */ + @Override + public void push0ldSystemSignInfo(Long signingId) { + try { + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 推送老系统签收队列"); + //得到审核的任务ID + if (ObjectUtil.isEmpty(signingId)) { + log.info(">>>>>>>>>>>>> clerkCheckPushDataHandler 签收ID为空"); + return; + } + + //得到签收对象 + DistributionSignforEntity distributionSignforEntity = distributionSignforMapper.selectById(signingId); + + //需要检测文员是否进行复核了 + + if (ObjectUtil.isEmpty(distributionSignforEntity)) { + log.info(">>>>>>>>>>>> clerkCheckPushDataHandler distributionSignforEntity {}", distributionSignforEntity); + return; + } + // 得到配送计划 + DistributionDeliveryListEntity distributionDeliveryListEntity = distributionDeliveryListMapper.selectById(distributionSignforEntity.getDeliveryId()); + if (ObjectUtil.isEmpty(distributionDeliveryListEntity)) { + log.info(">>>>>>>>>>> clerkCheckPushDataHandler distributionDeliveryListEntity {}", distributionDeliveryListEntity); + return; + } + + // 得到配送客户 + DistributionReservationEntity distributionReservationEntity = distributionReservationMapper.selectById(distributionSignforEntity.getReservationId()); + if (ObjectUtil.isEmpty(distributionReservationEntity)) { + log.info(">>>>>>>>>>>> clerkCheckPushDataHandler distributionReservationEntity {}", distributionReservationEntity); + return; + } + + + //组合配送信息 + SignPushDataDTO delivery = distributionDeliveryListMapper.selectPushOldDelivery(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); + + WarehouseEntity warehouseEntity = warehouseClient.findByName(distributionReservationEntity.getWarehouseName()); + if (ObjectUtils.isNotNull(warehouseEntity)) { + // 需要增加老系统的仓库ID + delivery.setWarehouseId(Long.parseLong(warehouseEntity.getId() + "")); + delivery.setWarehouseName(warehouseEntity.getTitle()); + } + + + //还需要配送的出库人、配送人、操作人信息 + if (Func.isNotEmpty(delivery)) { + if ("1".equals(delivery.getKind())) { + //自主配送 + DistributionDeliverySelfEntity distributionDeliverySelfEntity = distributionDeliverySelfMapper.selectOne(Wrappers.query().lambda() + .eq(DistributionDeliverySelfEntity::getDeliveryId, delivery.getId()) + .eq(DistributionDeliverySelfEntity::getIsMaster, 2) + ); + if (Func.isNotEmpty(distributionDeliverySelfEntity)) { + delivery.setOutId(Long.parseLong(distributionDeliverySelfEntity.getDriverId())); + delivery.setOutName(distributionDeliverySelfEntity.getDriverName()); + delivery.setOutPhone(distributionDeliverySelfEntity.getDriverPhone()); + } + } else { + //外协 + DistributionDeliveryTripartiteEntity distributionDeliveryTripartiteEntity = distributionDeliveryTripartiteMapper.selectOne(Wrappers.query().lambda().eq(DistributionDeliveryTripartiteEntity::getDeliveryId, delivery.getId())); + if (Func.isNotEmpty(distributionDeliveryTripartiteEntity)) { + delivery.setOutName(distributionDeliveryTripartiteEntity.getDriverName()); + delivery.setOutPhone(distributionDeliveryTripartiteEntity.getDriverPhone()); + } + } + R userR = userClient.userInfoById(delivery.getAdministratorsId()); + if (Func.isNotEmpty(userR)) { + User user = userR.getData(); + delivery.setAdministratorsName(user.getName()); + delivery.setAdministratorsPhone(user.getPhone()); + } + DistributionStockupEntity distributionStockupEntity = distributionReservationMapper.selectStockup(distributionSignforEntity.getReservationId()); + if (Func.isNotEmpty(distributionStockupEntity)) { + if (distributionStockupEntity.getAssignStatus().equals(StockAssignStatusConstant.yizhipai.getValue())) { + delivery.setOutToId(distributionStockupEntity.getStockupUserId()); + delivery.setOutToName(distributionStockupEntity.getStockupUser()); + } + + } + + //查询客户信息 + List customer = distributionReservationMapper.selectPushOldCustomer(distributionSignforEntity.getReservationId()); + if (Func.isNotEmpty(customer)) { + //查询客户订单 + List signPushDataUnitDTOS = new ArrayList<>(); + if (distributionReservationEntity.getReservationNum() > 0) { + //查询包件扫描签收 + //查询包件扫描签收 + List pushOldPackageLoading = distributionSignforMapper.selectPushOldPackageLoading(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); + List pushOldPackageSigning = distributionSignforMapper.selectPushOldPackageSigning(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); + if (Func.isNotEmpty(pushOldPackageLoading)) { + buildNameAndPhone(pushOldPackageLoading); + signPushDataUnitDTOS.addAll(pushOldPackageLoading); + } + if (Func.isNotEmpty(pushOldPackageSigning)) { + buildNameAndPhone(pushOldPackageSigning); + signPushDataUnitDTOS.addAll(pushOldPackageSigning); + } + } + + if (distributionReservationEntity.getReservationStockListNum() > 0) { + //查询库存品扫描签收 + List loadingPushOldInventory = distributionSignforMapper.selectLoadingPushOldInventory(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); + List signingPushOldInventory = distributionSignforMapper.selectSigningPushOldInventory(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); + if (Func.isNotEmpty(loadingPushOldInventory)) { + buildNameAndPhone(loadingPushOldInventory); + signPushDataUnitDTOS.addAll(loadingPushOldInventory); + } + + if (Func.isNotEmpty(signingPushOldInventory)) { + buildNameAndPhone(signingPushOldInventory); + signPushDataUnitDTOS.addAll(signingPushOldInventory); + } + } + //查询签收图片 + List distributionSignPrintVOS = distributionSignforMapper.selectSignImgsUrl(distributionReservationEntity.getId()); + + if (Func.isNotEmpty(signPushDataUnitDTOS)) { + SignPushDataContactDTO signPushDataContactDTO = customer.get(0); + signPushDataContactDTO.setSignPushDataUnitDTOs(signPushDataUnitDTOS); + if (Func.isNotEmpty(distributionSignPrintVOS)) { + String urls = distributionSignPrintVOS.stream().map(DistributionSignPrintVO::getUrlRoute).collect(Collectors.joining(",")); + signPushDataContactDTO.setImage(urls); + } + if (Func.isNotEmpty(distributionSignforEntity.getClerkSignRemarks())) { + signPushDataContactDTO.setContact(distributionSignforEntity.getClerkSignRemarks()); + } + } + + //完成客户信息添加 + delivery.setSignPushDataContactDTOs(customer); + } + } + + + Boolean b = oldSystemDataPushClient.pushOldSystemSignInfo(delivery); + } catch (Exception e) { + log.error(">>>>> 推送老系统签收信息报错", e); + } + + + } + + private List handleStockUp(DistributionStockupEntity distributionStockupEntity) { List nodeVos = new ArrayList<>(); try { @@ -2093,44 +2395,84 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl exportDistributionSignforOwn(Map distributionSignfor) { + public List exportDistributionSignforOwn(DistributionSignforVO distributionSignforVO) { - Object o = distributionSignfor.get("ids"); - if (ObjectUtils.isNotNull(o)) { - distributionSignfor.remove("ids"); - } - BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); - if (Func.isNotEmpty(myCurrentWarehouse)) { - distributionSignfor.put("warehouseId", myCurrentWarehouse.getId()); - } + try { + // 转换创建时间 + distributionSignforVO.setCreateTime_query(DateUtil.format(distributionSignforVO.getCreateTime(), "yyyy:MM:dd HH:mm:ss")); + // 获取当前登录人仓库 + + BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + if (null == myCurrentWarehouse) { + List myWatchWarehouse = basicdataWarehouseClient.getMyWatchWarehouse(); + List collect = myWatchWarehouse.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + distributionSignforVO.setWarehouseIdList(collect); + } else { + List collect = new ArrayList<>(); + collect.add(myCurrentWarehouse.getId()); + distributionSignforVO.setWarehouseIdList(collect); + } - DistributionSignforVO distributionSignforVO = JSON.parseObject(JSON.toJSONString(distributionSignfor), DistributionSignforVO.class); - if (ObjectUtils.isNotNull(o)) { - String id = (String) o; - String[] split = id.split(","); - distributionSignforVO.setIds(Arrays.asList(split)); + + List distributionSignforVOS; + try { + distributionSignforVOS = baseMapper.selectDistributionSignforPage(null, distributionSignforVO); + } catch (Exception e) { + log.error(">>> selectDistributionSignforPage", e); + // 这里应该记录日志或者进行一些错误处理 + return Collections.emptyList(); + } + + if (Func.isNotEmpty(distributionSignforVOS)) { + List reservationIds = distributionSignforVOS.stream().map(DistributionSignforVO::getReservationId).collect(Collectors.toList()); + processReservationIds(distributionSignforVOS, reservationIds); + } + + List a = new ArrayList<>(); + distributionSignforVOS.forEach(d -> { + d.setDeliveryTypeName(getDeliveryTypeName(d.getDeliveryType())); + + DistributionSignforOwnExcel signforExcel = new DistributionSignforOwnExcel(); +// BeanUtils.copyProperties(d, signforExcel); + signforExcel.setTrainNumber(d.getTrainNumber()); + signforExcel.setReservationCode(d.getReservationCode()); + signforExcel.setDeliveryDriverName(d.getDriverName()); + signforExcel.setDeliveryDriverPhone(d.getDriverPhone()); + signforExcel.setVehicleName(d.getVehicleName()); + signforExcel.setTaskTime(d.getTaskTime()); + signforExcel.setOrderCode(d.getStockArticleId()); + signforExcel.setDeliveryTypeName(d.getDeliveryTypeName()); + signforExcel.setSigningStatusName(d.getSigningStatusName()); + signforExcel.setSigningTime(d.getSigningTime()); + signforExcel.setDeliveryStatusName(d.getDeliveryStatusName()); + signforExcel.setDeliveryPhone(d.getDriverPhone()); + signforExcel.setLoadedNumber(d.getLoadedNumber()); + signforExcel.setReceivedQuantity(d.getReceivedQuantity()); + signforExcel.setReservationNum(d.getReservationNum()); + signforExcel.setDeliveryAddress(d.getDeliveryAddress()); + signforExcel.setWithoutScanning(d.getWithoutScanning()); + signforExcel.setLoadingTime(d.getSigningTime()); + signforExcel.setConsignee(d.getConsignee()); + signforExcel.setDeliveryPhone(d.getDeliveryPhone()); + + signforExcel.setDeliveryTypeName(d.getDeliveryTypeName()); + signforExcel.setSjsigningTime(d.getSjsigningTime()); + signforExcel.setSigneeName(d.getSigneeName()); + signforExcel.setSigningStatusName(d.getSigningStatus()); + signforExcel.setDeliveryStatusName(d.getSijiSigningStatus()); + signforExcel.setExamineUserName(d.getExamineUserName()); + signforExcel.setWarehouseName(d.getWarehouseName()); + int unsigneds =d.getReservationNum() - d.getReceivedQuantity(); + signforExcel.setUnsigneds(unsigneds); + + a.add(signforExcel); + }); + return a; + } catch (Exception e) { + e.printStackTrace(); } + return null; - List distributionSignforList = baseMapper.exportDistributionSignforSigningOwn(distributionSignforVO); - - List list = new ArrayList<>(); - distributionSignforList.forEach(d -> { - DistributionSignforOwnExcel signforExcel = Func.copy(d, DistributionSignforOwnExcel.class); - assert signforExcel != null; - signforExcel.setLoadingTime(d.getLoadingTime()); - signforExcel.setDeliveryDriverPhone(d.getDriverPhone()); - signforExcel.setDeliveryDriverName(d.getDriverName()); - signforExcel.setReservationNum(d.getTotalNum()); - signforExcel.setLoadedNumber(d.getPackageLoadingNum() + d.getInventoryLoadingNum()); - signforExcel.setReceivedQuantity(d.getPackageSigningNum() + d.getInventorySigningNum()); - signforExcel.setDeliveryStatusName(d.getDeliveryStatusName()); - signforExcel.setDeliveryPhone(d.getDeliveryPhone()); - signforExcel.setWithoutScanning(d.getTotalNum() - (d.getPackageLoadingNum() + d.getInventoryLoadingNum())); - signforExcel.setUnsigneds(d.getTotalNum() - (d.getPackageSigningNum() + d.getInventorySigningNum())); - signforExcel.setConsignee(d.getConsignee()); - list.add(signforExcel); - }); - return list; } @Override @@ -2158,6 +2500,8 @@ public class DistributionSignforServiceImpl extends BaseServiceImplquery().lambda() + .eq(DistributionSignforEntity::getReservationId, distrilbutionloadingscanDTO.getReservationId()) + ); + if (Objects.isNull(signforEntity)) { + //查询签收信息错误 + log.error("签收扫描查询签收表信息错误reservationId:{}", distrilbutionloadingscanDTO.getReservationId()); return R.fail(403, "配送任务错误"); } + if (SignforStatusConstant.yiqianshou.getValue().equals(signforEntity.getSigningStatus())) { + return Resp.scanFail("此任务已完成复核", "此任务已完成复核"); + } + + List packageLockIds = new ArrayList<>(); try { @@ -2177,13 +2532,13 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl orderPackageCodes = new ArrayList<>(); + List aaa = new ArrayList<>(); List parcelListEntityList = distributionReservationMapper.selectPackageListByReservationId(distrilbutionloadingscanDTO.getReservationId()); //查询该客户是否存在该包件信息 List collect = parcelListEntityList.stream().filter(p -> p.getOrderPackageCode().equals(distrilbutionloadingscanDTO.getBarcode())).collect(Collectors.toList()); if (Func.isNotEmpty(collect) && collect.size() == 1) { + List abnormalEntities = distributionLoadscanAbnormalService.list(Wrappers.query().lambda() + .eq(DistributionLoadscanAbnormalEntity::getPackageCode, distrilbutionloadingscanDTO.getBarcode()) + .eq(DistributionLoadscanAbnormalEntity::getPackageId, collect.get(0).getId()) + //修改 状态 + ); + if (!abnormalEntities.isEmpty()) { + //判断此包件的异常是否是当前扫描车次和客户 + //首先判断存在异常是否不属于当前车次和客户 + boolean flag = abnormalEntities.stream().allMatch(a -> !deliveryListEntity.getId().equals(a.getDeliveryListId()) || !distrilbutionloadingscanDTO.getReservationId().equals(a.getReservationId())); + if (flag) { + //该异常属于其他车次 + String info = abnormalEntities.stream().map(DistributionLoadscanAbnormalEntity::getTrainNumber).collect(Collectors.joining(",")); + log.info("包件已在其他车次存在异常 >>>>当前车次:{},其他车次:{}", deliveryListEntity.getTrainNumber(), info); + return Resp.scanFail("包件已在其他车次存在异常", "包件已在其他车次存在异常"); + } + //判断具体的装车信息 + } + + //存在则查询该包件是否进行装车 DistributionLoadscanEntity loadscanEntity = distributionLoadscanMapper.selectOne(Wrappers.query().lambda() .ne(DistributionLoadscanEntity::getScanStatus, 1) @@ -2219,10 +2596,15 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl jsonObjects = new ArrayList<>(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", updatePackage.getOrderPackageCode()); + jsonObject.put("warehouseId", myCurrentWarehouse.getId()); + jsonObject.put("taskId", distributionReservationEntity.getId()); + jsonObject.put("type", 1); + jsonObject.put("num", 1); + jsonObject.put("remark", "签收下架"); + jsonObjects.add(jsonObject); + warehouseUpdownStockUpAreaClient.downStockUpShelf(jsonObjects); } else if (Func.isEmpty(collect)) { //这里就需要对该包件信息是否属于该配送计划进行判定。如果属于该配送计划则是串货。不是那么则需要提示是否异常签收或者返回的操作 //查询配送计划中是否存在该包件 - DistributionParcelListEntity one = distributionParcelListService.getOne(Wrappers.query().lambda() - .eq(DistributionParcelListEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode()) - .eq(DistributionParcelListEntity::getWarehouseId, myCurrentWarehouse.getId()) - ); - if (Func.isNotEmpty(one) && one.getConditions() == 2) { - log.warn("#####################此包件不是定制品 {}", one.getConditions()); + if (Func.isNotEmpty(parcelListEntity) && parcelListEntity.getConditions() == 2) { + log.warn("#####################此包件不是定制品 {}", parcelListEntity.getConditions()); return Resp.scanFail("此包件不是定制品", "此包件不是定制品"); } List parcelListEntities = distributionDeliveryListMapper.selectPackageListByDeliveryListId(distrilbutionloadingscanDTO.getDeliveryId()); @@ -2350,6 +2752,19 @@ public class DistributionSignforServiceImpl extends BaseServiceImplquery().lambda() + .eq(DistributionLoadscanAbnormalEntity::getDeliveryListId, distrilbutionloadingscanDTO.getDeliveryId()) + .eq(DistributionLoadscanAbnormalEntity::getReservationId, distrilbutionloadingscanDTO.getReservationId()) + .eq(DistributionLoadscanAbnormalEntity::getPackageCode, distrilbutionloadingscanDTO.getBarcode()) + ); + //查询是否存在驳回操作 + if (!Func.isEmpty(abnormalEntity)) { + if (abnormalEntity.getAuditingStatus().equals(3)) { + return Resp.scanFail("包件异常已驳回,请扫滞留", "包件异常已驳回,请扫滞留"); + } + } + return R.fail(3006, null); } } else { @@ -2382,10 +2797,72 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl>>>> 签收异常报错", e); - throw new CustomerException("当前登录信息不已失效,请重新登录"); + throw new CustomerException("当前登录信息已失效,请重新登录"); + } + } + + private void sendNodeWorkDataBroadcast(DistributionParcelListEntity parcelListEntity, DistributionReservationEntity distributionReservationEntity, String singleTime, BasicdataWarehouseEntity myCurrentWarehouse) { + try { + //推送信息至工厂 +// distributionAsyncService.sendFactory(parcelListEntity, singleTime, distributionReservationEntity.getId(), distributionReservationEntity.getReservationCode(), myCurrentWarehouse.getName(), nickName); +// sendMessage(distrilbutionloadingscanDTO.getBarcode(), distributionReservationEntity.getReservationCode(), +// deliveryListEntity.getTrainNumber(), deliveryListEntity.getVehicleName(), deliveryListEntity.getDriverName(), +// AuthUtil.getUserName(), myCurrentWarehouse.getId(), AuthUtil.getTenantId()); + iDistributionNodeWorkService.signFor(parcelListEntity, distributionReservationEntity.getId(), singleTime, myCurrentWarehouse.getName()); + } catch (Exception e) { +// throw new RuntimeException(e); + log.error(">>>> 签收作业节点广播报错", e); + } + } + + /** + * @param orderPackageCode + * @param reservationCode + * @param distrCarNumber + * @param vehicleName + * @param driverName + * @param userName + * @param warehouseId + * @param tenantId 当前的租户 + */ + private void sendMessage(String orderPackageCode, + String reservationCode, + String distrCarNumber, + String vehicleName, + String driverName, + String userName, + Long warehouseId, + String tenantId + ) { + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("orderPackageCode", orderPackageCode); + jsonObject.put("reservationCode", reservationCode); + jsonObject.put("distrCarNumber", distrCarNumber); + jsonObject.put("vehicleName", vehicleName); + jsonObject.put("driverName", driverName); + jsonObject.put("userName", userName); + jsonObject.put("warehouseId", warehouseId); + jsonObject.put("tenantId", tenantId); + // 发送入库消息 + Map mapState = new HashMap(); + mapState.put("messageId", CommonUtil.getUUID()); + mapState.put("createTime", System.currentTimeMillis()); + Map map = new HashMap<>(); + map.put("messageData", jsonObject); + rabbitTemplate.convertAndSend(RabbitConstant.BUSINESS_IN_CONVERSION_DATA_EXCHANGE, RabbitConstant.BUSINESS_IN_CONVERSION_DATA_ROUTING, map); + } catch (Exception e) { + log.error("签收商家推送:{}", e); } } @@ -2441,6 +2918,23 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl ids = parcelListEntities.stream().map(DistributionParcelListEntity::getId).collect(Collectors.toList()); + List abnormalEntities = distributionLoadscanAbnormalService.list(Wrappers.query().lambda() + .in(DistributionLoadscanAbnormalEntity::getPackageId, ids) + ); + if (!abnormalEntities.isEmpty()) { + //判断此包件的异常是否是当前扫描车次和客户 + //首先判断存在异常是否不属于当前车次和客户 + boolean a = abnormalEntities.stream().allMatch(b -> !deliveryListEntity.getId().equals(b.getDeliveryListId()) || !distrilbutionloadingscanDTO.getReservationId().equals(b.getReservationId())); + if (a) { + //该异常属于其他车次 + String code = abnormalEntities.stream().filter(c -> !deliveryListEntity.getId().equals(c.getDeliveryListId()) || !distrilbutionloadingscanDTO.getReservationId().equals(c.getReservationId())).map(DistributionLoadscanAbnormalEntity::getPackageCode).collect(Collectors.joining(",")); + log.info("包件已在其他车次存在异常 >>>>包条码:{}", code); + log.info("包件已在其他车次存在异常 >>>>当前车次:{},异常车次:{}", deliveryListEntity.getTrainNumber(), abnormalEntities.stream().map(DistributionLoadscanAbnormalEntity::getTrainNumber).collect(Collectors.joining(","))); + return R.fail(code + "已在其他车次执行异常!!"); + } + //判断具体的装车信息 + } } List parcelListEntityList = distributionReservationMapper.selectPackageListByReservationId(distrilbutionloadingscanDTO.getReservationId()); //查询该客户是否存在该包件信息 @@ -2452,39 +2946,51 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl orderpackages = new ArrayList<>(); List packageLockIds = new ArrayList<>(); + List jsonObjects = new ArrayList<>(); + List aaa = new ArrayList<>(); for (String orderPackageCode : orderPackageCodes) { List collect = parcelListEntityList.stream().filter(p -> p.getOrderPackageCode().equals(orderPackageCode)).collect(Collectors.toList()); + String content = ""; if (Func.isNotEmpty(collect) && collect.size() == 1) { //存在则查询该包件是否进行装车 - DistributionLoadscanEntity loadscanEntity = distributionLoadscanMapper.selectOne(Wrappers.query().lambda() + DistributionParcelListEntity parcelListEntity = collect.get(0); + JSONObject trunklinePackageTrackLog = new JSONObject(); + DistributionLoadscanEntity distributionLoadscanEntity = distributionLoadscanMapper.selectOne(Wrappers.query().lambda() .ne(DistributionLoadscanEntity::getScanStatus, 1) .eq(DistributionLoadscanEntity::getReservationId, distrilbutionloadingscanDTO.getReservationId()) .eq(DistributionLoadscanEntity::getDeliveryId, distrilbutionloadingscanDTO.getDeliveryId()) - .eq(DistributionLoadscanEntity::getOrderPackageCode, collect.get(0).getOrderPackageCode())); - if (Func.isNotEmpty(loadscanEntity)) { - if (loadscanEntity.getSignforState().equals(2)) { + .eq(DistributionLoadscanEntity::getOrderPackageCode, parcelListEntity.getOrderPackageCode())); + if (Func.isNotEmpty(distributionLoadscanEntity)) { + if (distributionLoadscanEntity.getSignforState().equals(2)) { return Resp.scanFail("重复扫描", "重复扫描"); } //存在装车记录,进行修改即可 //进行签收记录数据的维护 - loadscanEntity.setSigningTime(simpleDateFormat.format(new Date())); - loadscanEntity.setSignforState(2); - loadscanEntity.setReceivedQuantity(loadscanEntity.getLoadedNub()); + distributionLoadscanEntity.setSigningTime(simpleDateFormat.format(new Date())); + distributionLoadscanEntity.setSignforState(2); + distributionLoadscanEntity.setReceivedQuantity(distributionLoadscanEntity.getLoadedNub()); - loadscanEntity.setSigningUser(nickName); - loadscanEntity.setSigningUserId(userId); + distributionLoadscanEntity.setSigningUser(nickName); + distributionLoadscanEntity.setSigningUserId(userId); + distributionLoadscanEntity.setSignforType(LoadScanSigningTypeStatusConstant.wenyuanpiliangqianshou.getValue()); - distributionLoadscanService.updateById(loadscanEntity); - packageLockIds.add(loadscanEntity.getPackageId()); + distributionLoadscanService.updateById(distributionLoadscanEntity); + packageLockIds.add(distributionLoadscanEntity.getPackageId()); //缺少一个异步维护包件签收的方法 // distributionAsyncService.changeOrderSignforStatus(collect.get(0)); - Integer j = distributionSignforMapper.updateSignforNum(loadscanEntity.getDeliveryId(), loadscanEntity.getReservationId(), loadscanEntity.getPackageNub()); + Integer j = distributionSignforMapper.updateSignforNum(distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getReservationId(), distributionLoadscanEntity.getPackageNub()); //更新签收人 - Integer m = distributionSignforMapper.updateSignUser(loadscanEntity.getDeliveryId(), loadscanEntity.getReservationId(), AuthUtil.getUser()); + Integer m = distributionSignforMapper.updateSignUser(distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getReservationId(), AuthUtil.getUser()); //下架解托 - warehouseUpdownTypeClient.downPackageOrDelTray(loadscanEntity.getOrderPackageCode(), myCurrentWarehouse.getId(), "签收下架解托"); - //维护订单状态 + warehouseUpdownTypeClient.downPackageOrDelTray(distributionLoadscanEntity.getOrderPackageCode(), myCurrentWarehouse.getId(), "签收下架解托"); + content = "包件在" + myCurrentWarehouse.getName() + "由" + AuthUtil.getNickName() + "后台签收,装车方式:扫描装车,配送车次号:" + deliveryListEntity.getTrainNumber() + "预约任务号:" + distributionReservationEntity.getReservationCode(); + try { + trunklinePackageTrackLog = handleLogJSONObject(myCurrentWarehouse, AuthUtil.getUser(), distributionLoadscanEntity.getOrderPackageCode(), content, WorkNodeEnums.DISTRIBUTION_SIGN_FOR.getCode(), deliveryListEntity.getTrainNumber(), parcelListEntity.getWarehouseEntryTimeEnd()); + } catch (Exception e) { + log.error("装车日志数据错误", e); + } + aaa.add(trunklinePackageTrackLog); } else { //这里装车的数据需要进行补录 DistributionDeliverySelfEntity distributionDeliverySelfEntity = new DistributionDeliverySelfDTO(); @@ -2504,7 +3010,7 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl>>> 签收推送报错", e); +// } + } else { //一个客户下出现重复包条码 log.error("############出现重复包条码:{}", collect); throw new RuntimeException("包件数据异常,请联系管理员!!!"); } } + trunklinePackageTrackLogClient.addPackageTrackLog(aaa); + //添加缓存 if (!packageLockIds.isEmpty()) { List a = bladeRedis.get("warehouseId:" + myCurrentWarehouse.getId() + "trainNumber:" + deliveryListEntity.getTrainNumber() + "orderPackageCode:"); if (Func.isNotEmpty(a)) { + assert a != null; boolean flag = a.stream().anyMatch(any -> packageLockIds.contains(any)); if (flag) { //正在操作,请稍后重试 @@ -2601,17 +3141,9 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl distributionLoadscanEntities = distributionLoadscanMapper.selectList(new QueryWrapper().lambda() -// .ne(DistributionLoadscanEntity::getScanStatus, 1) -// .eq(DistributionLoadscanEntity::getReservationId, distrilbutionloadingscanDTO.getReservationId()) -// .eq(DistributionLoadscanEntity::getDeliveryId, distrilbutionloadingscanDTO.getDeliveryId()) -// .eq(DistributionLoadscanEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode()) -// ); -// if (Func.isEmpty(distributionLoadscanEntities) || distributionLoadscanEntities.size() == 0) { -// //这里就是出现多货的情况 -// } -// //需要将这个方法抽取到异步Service中 -// //这里就应该对签收的包件进行状态变更 -// Long deliveryId = distrilbutionloadingscanDTO.getDeliveryId(); -// distributionLoadscanEntities.forEach(l -> { -// DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(l.getPackageId()); -//// distributionAsyncService.changeOrderSignforStatus(parcelListEntity); -// distributionAsyncService.changeDeliverySignforListStatus(deliveryId, parcelListEntity); -// distributionLoadscanEntity.setSigningTime(simpleDateFormat.format(new Date())); -// distributionLoadscanEntity.setSignforState(2); -// distributionLoadscanEntity.setReceivedQuantity(distributionLoadscanEntity.getLoadedNub()); -// distributionLoadscaninvnMapper.updateById(distributionLoadscanEntity); -// }); - //这里签收还需要进行管乐配送任务的签收状态修改 - //查询出这个配送任务的所有订单 - -// List distributionLoadscaninvnEntities = distributionLoadscaninvnMapper.selectList(new QueryWrapper().lambda() -// .ne(DistributionLoadscaninvnEntity::getScanStatus, 1) -// .eq(DistributionLoadscaninvnEntity::getPacketBarCode, distrilbutionloadingscanDTO.getBarcode()) -// ); -// if (distributionLoadscanEntities.size() <= 0) { - //TODO 查询库存品 - //无拆包 -// List distributionLoadscanvnEntities = new ArrayList<>(); -// distributionLoadscanvnEntities = baseMapper.selectdeliveryworkVnScan(distrilbutionloadingscanDTO.getBarcode(), distrilbutionloadingscanDTO.getDeliveryId()); -// if (distributionLoadscanvnEntities.size() <= 0) { -// //拆包从备货查询 -// distributionLoadscanvnEntities = baseMapper.selectdeliveryworkVnScanStock(distrilbutionloadingscanDTO.getBarcode(), distrilbutionloadingscanDTO.getDeliveryId()); -// if (distributionLoadscanvnEntities.size()<=0){ -// return R.fail(3007, "没有该货物"); -// } -// } -// if (distributionLoadscanvnEntities.size()>0){ -// //修改装车表状态 -// boolean b =false; -// for (DistributionLoadscaninvnEntity distributionLoadscanEntity : distributionLoadscanvnEntities) { -// distributionLoadscanEntity.setSigningTime(simpleDateFormat.format(new Date())); -// distributionLoadscanEntity.setSignforState(2); -// distributionLoadscanEntity.setReceivedQuantity(distributionLoadscanEntity.getLoadedNub()); -// distributionLoadscaninvnMapper.updateById(distributionLoadscanEntity); -// //修改签收表司机签收数量 -// this.update(new UpdateWrapper().lambda() -// .eq(DistributionSignforEntity::getReservationId,distributionLoadscanEntity.getReservationId()) -// .setSql("received_quantity = received_quantity + "+distributionLoadscanEntity.getLoadedNub()) -// ); -// } -// } -// return R.fail(3006, "客户的该货物并未装车处理"); -// } -// //修改装车表状态 -// boolean b = false; -// for (DistributionLoadscanEntity distributionLoadscanEntity : distributionLoadscanEntities) { -// if (ObjectUtils.isNotNull(distributionLoadscanEntity.getSignforState()) && distributionLoadscanEntity.getSignforState() == 2) { -// continue; -// } -// distributionLoadscanEntity.setSigningTime(simpleDateFormat.format(new Date())); -// distributionLoadscanEntity.setSignforState(2); -// distributionLoadscanEntity.setReceivedQuantity(1); -// b = distributionLoadscanService.updateById(distributionLoadscanEntity); -// //修改签收表司机签收数量 -// this.update(new UpdateWrapper().lambda() -// .eq(DistributionSignforEntity::getReservationId, distributionLoadscanEntity.getReservationId()) -// .setSql("received_quantity = received_quantity + " + distributionLoadscanEntity.getPackageNub()) -// ); -// } -// distributionLoadscanService.update(new UpdateWrapper().lambda() -// .ne(DistributionLoadscanEntity::getScanStatus, 1) -// .eq(DistributionLoadscanEntity::getPacketBarCode, distrilbutionloadingscanDTO.getBarcode()) -// .set(DistributionLoadscanEntity::getSigningTime,simpleDateFormat.format(new Date())) -// .set(DistributionLoadscanEntity::gets) -// ) - -// return R.status(b); -// } @Override public DistributionSignforVO getOneCustom(Long id) { @@ -2811,11 +3261,13 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl packageLockIds = new ArrayList<>(); + List aaa = new ArrayList<>(); if (Func.isNotEmpty(parcelListEntityList) && parcelListEntityList.size() == 1) { DistributionParcelListEntity parcelListEntity = parcelListEntityList.get(0); if (parcelListEntity.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())) { return Resp.scanFail("操作失败", "该包件已签收"); } + //确认该包件确实不属于该配送任务 List parcelListEntities = distributionDeliveryListMapper.selectPackageListByDeliveryListId(distrilbutionloadingscanDTO.getDeliveryId()); boolean flag = parcelListEntities.stream().anyMatch(p -> p.getOrderPackageStatus().equals(distrilbutionloadingscanDTO.getBarcode())); @@ -2840,16 +3292,36 @@ public class DistributionSignforServiceImpl extends BaseServiceImplquery().lambda() - .eq(DistributionLoadscanEntity::getDeliveryId, distrilbutionloadingscanDTO.getDeliveryId()) - .eq(DistributionLoadscanEntity::getReservationId, distrilbutionloadingscanDTO.getReservationId()) + List loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda() .eq(DistributionLoadscanEntity::getOrderPackageCode, distrilbutionloadingscanDTO.getBarcode()) .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())); + + DistributionLoadscanEntity loadscanEntity = null; + if (!loadscanEntityList.isEmpty()) { + + if (loadscanEntityList.size() == 1) { + if (loadscanEntityList.get(0).getReservationId().equals(distrilbutionloadingscanDTO.getReservationId())) { + loadscanEntity = loadscanEntityList.get(0); + } else { + log.error("##############异常签收包件在其他车次进行装车reservationId:{}", loadscanEntityList.stream().map(DistributionLoadscanEntity::getReservationId).map(String::valueOf).collect(Collectors.joining(","))); + return Resp.scanFail("操作失败", "该包件已在其它车次进行装车"); + } + } + + if (loadscanEntityList.size() > 1) { + log.error("##############异常签收包件在其他车次进行装车reservationId:{}", loadscanEntityList.stream().map(DistributionLoadscanEntity::getReservationId).map(String::valueOf).collect(Collectors.joining(","))); + return Resp.scanFail("操作失败", "该包件已在其它车次进行装车"); + } + + } + if (Func.isNotEmpty(loadscanEntity)) { - if (loadscanEntity.getSignforState().equals(LoadScanSigningStatusConstant.yiqianshou.getValue())) { - return Resp.scanFail("重复操作!!", "重复操作"); + if (LoadScanSigningStatusConstant.yiqianshou.getValue().equals(loadscanEntity.getSignforState())) { + return Resp.scanFail("重复操作!!", "重复扫码"); } } + String content = "包件在" + myCurrentWarehouse.getName() + "由" + AuthUtil.getNickName() + "扫描异常签收,装车方式:补录装车,配送车次号:" + distributionDeliveryListEntity.getTrainNumber() + "预约任务号:" + reservationEntity.getReservationCode(); + Long loadingId = 0L; switch (reservationEntity.getDeliveryType()) { case "1": //商配 @@ -2859,6 +3331,7 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl>>>>>>>>>>>>>>reservationId:{},deliveryId:{},orderPackageCode:{}", distributionLoadscanEntity.getReservationId(), distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getOrderPackageCode()); //进行签收数量的修改 Integer i = distributionDeliveryListMapper.updateloadingTimeById(distrilbutionloadingscanDTO.getDeliveryId()); //修改签收数量 //包件下架解托 warehouseUpdownTypeClient.downPackageOrDelTray(parcelListEntity.getOrderPackageCode(), myCurrentWarehouse.getId(), "签收下架解托"); - + List jsonObjects = new ArrayList<>(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", distributionLoadscanEntity.getOrderPackageCode()); + jsonObject.put("warehouseId", myCurrentWarehouse.getId()); + jsonObject.put("taskId", distributionLoadscanEntity.getReservationId()); + jsonObject.put("type", 1); + jsonObject.put("num", 1); + jsonObject.put("remark", "异常签收下架"); + jsonObjects.add(jsonObject); + warehouseUpdownStockUpAreaClient.downStockUpShelf(jsonObjects); // Integer j = distributionSignforMapper.updateSignforNum(distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getReservationId(), distributionLoadscanEntity.getPackageNub()); if (Func.isEmpty(loadscanEntity)) { //更新装车包件数和签收包件数 distributionLoadscanService.save(distributionLoadscanEntity); + loadingId = distributionLoadscanEntity.getId(); Integer j = distributionSignforMapper.updateSignforByReservationId(distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getReservationId(), distributionLoadscanEntity.getPackageNub()); } else { + loadingId = distributionLoadscanEntity.getId(); + content = "包件在" + myCurrentWarehouse.getName() + "由" + loadscanEntity.getSigningUser() + "扫描异常签收,装车方式:扫描装车,配送车次号:" + distributionDeliveryListEntity.getTrainNumber() + "预约任务号:" + reservationEntity.getReservationCode(); distributionLoadscanService.updateById(distributionLoadscanEntity); distributionSignforMapper.updateSignforNum(distributionLoadscanEntity.getDeliveryId(), distributionLoadscanEntity.getReservationId(), distributionLoadscanEntity.getPackageNub()); } + JSONObject trunklinePackageTrackLog = handleLogJSONObject(myCurrentWarehouse, AuthUtil.getUser(), parcelListEntity.getOrderPackageCode(), content, WorkNodeEnums.DISTRIBUTION_ABNORMAL_SIGN_FOR.getCode(), distributionDeliveryListEntity.getTrainNumber(), parcelListEntity.getWarehouseEntryTimeEnd()); + aaa.add(trunklinePackageTrackLog); + assert loadscanEntity != null; + } else { return Resp.scanFail("操作失败", "不属于该客户"); } + break; case "2": //市配 @@ -2972,8 +3468,11 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl jsonObjects = new ArrayList<>(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", distributionLoadscaninvnEntity.getOrderPackageCode()); + jsonObject.put("warehouseId", myCurrentWarehouse.getId()); + jsonObject.put("taskId", distributionLoadscaninvnEntity.getReservationId()); + jsonObject.put("type", 2); + jsonObject.put("num", 1); + jsonObject.put("remark", "签收下架"); + jsonObjects.add(jsonObject); + warehouseUpdownStockUpAreaClient.downStockUpShelf(jsonObjects); } //进行库存品包件状态维护 DisStockListDetailEntity disStockListDetailEntity = new DisStockListDetailEntity(); @@ -3414,8 +3929,10 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl getAppDeliveryorderListPage(DistributionAppDeliveryListDTO distributionDeliveryList) { + List orderVos = new ArrayList<>(); if (Func.isEmpty(distributionDeliveryList.getReservationId())) { log.error("参数缺失reservationId:{}", distributionDeliveryList.getReservationId()); + return orderVos; } //查询该客户装车 @@ -3441,32 +3958,39 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl> reservationOrderMap = reservationStockarticleEntityList.stream().collect(Collectors.groupingBy(DistributionReservationStockarticleEntity::getStockArticleId)); Map> loadingOrderMap = distributionLoadscanEntities.stream().collect(Collectors.groupingBy(DistributionLoadscanEntity::getOrderId)); - List orderVos = new ArrayList<>(); + if (Func.isNotEmpty(orderIds)) { orderIds = orderIds.stream().distinct().collect(Collectors.toList()); - for (Long orderId : orderIds) { - DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(orderId); - DistributionAppStockArticleVO distributionAppStockArticleVO = Func.copy(stockArticleEntity, DistributionAppStockArticleVO.class); - distributionAppStockArticleVO.setTotalNumber(stockArticleEntity.getTotalNumber()); - distributionAppStockArticleVO.setStockArticleId(stockArticleEntity.getId()); + + List distributionStockArticleEntities = distributionStockArticleService.listByIds(orderIds); + + + List reservationOrders = distributionReservationStockarticleService.list(Wrappers.query().lambda() + .eq(DistributionReservationStockarticleEntity::getReservationId, distributionDeliveryList.getReservationId()) + .in(DistributionReservationStockarticleEntity::getStockArticleId, orderIds) + .ne(DistributionReservationStockarticleEntity::getStockArticleStatus, ReservationOrderStatusConstant.quxiao.getValue()) + ); + + for (DistributionStockArticleEntity distributionStockArticleEntity : distributionStockArticleEntities) { + + +// DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(orderId); + DistributionAppStockArticleVO distributionAppStockArticleVO = Func.copy(distributionStockArticleEntity, DistributionAppStockArticleVO.class); + assert distributionAppStockArticleVO != null; distributionAppStockArticleVO.setLoadingNub(0); distributionAppStockArticleVO.setSignforNub(0); distributionAppStockArticleVO.setReservationNum(0); //查询预约该订单计划数量 - DistributionReservationStockarticleEntity reservationOrder = distributionReservationStockarticleService.getOne(Wrappers.query().lambda() - .eq(DistributionReservationStockarticleEntity::getReservationId, distributionDeliveryList.getReservationId()) - .eq(DistributionReservationStockarticleEntity::getStockArticleId, orderId) - .ne(DistributionReservationStockarticleEntity::getStockArticleStatus, ReservationOrderStatusConstant.quxiao.getValue()) - ); + DistributionReservationStockarticleEntity reservationOrder = findReservationOrders(reservationOrders, distributionStockArticleEntity.getId()); if (Func.isNotEmpty(reservationOrder)) { distributionAppStockArticleVO.setReservationNum(reservationOrder.getReservationNum()); } - if (stockArticleEntity.getIsZero().equals(IsOrNoConstant.no.getValue())) { + if (distributionStockArticleEntity.getIsZero().equals(IsOrNoConstant.no.getValue())) { //判断此订单是是否是异常装车 - if (Func.isEmpty(reservationOrderMap.get(orderId))) { + if (Func.isEmpty(reservationOrderMap.get(distributionStockArticleEntity.getId()))) { //不存在计划之中的订单装车 - List loadscanEntityList = loadingOrderMap.get(orderId); + List loadscanEntityList = loadingOrderMap.get(distributionStockArticleEntity.getId()); List abnormalPackageIds = loadscanEntityList.stream().map(DistributionLoadscanEntity::getPackageId).collect(Collectors.toList()); List distributionParcelListEntities = distributionParcelListService.listByIds(abnormalPackageIds); List distributionAppParcelListVOS = DistributionParcelListAppWrapper.build().listVO(distributionParcelListEntities); @@ -3488,7 +4012,7 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl reservationPackage = distributionReservationPackageService.list(Wrappers.query().lambda() .eq(DistributionReservationPackageEntity::getReservationId, distributionDeliveryList.getReservationId()) - .eq(DistributionReservationPackageEntity::getStockArticleId, orderId) + .eq(DistributionReservationPackageEntity::getStockArticleId, distributionStockArticleEntity.getId()) .ne(DistributionReservationPackageEntity::getPacketBarStatus, ReservationPackageStatusConstant.quxiao.getValue()) ); List packageIds = new ArrayList<>(); @@ -3498,8 +4022,8 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl collect = null; - if (Func.isNotEmpty(loadingOrderMap.get(orderId))) { - List loadscanEntityList = loadingOrderMap.get(orderId); + if (Func.isNotEmpty(loadingOrderMap.get(distributionStockArticleEntity.getId()))) { + List loadscanEntityList = loadingOrderMap.get(distributionStockArticleEntity.getId()); List loadingPackageIds = loadscanEntityList.stream().map(DistributionLoadscanEntity::getPackageId).collect(Collectors.toList()); packageIds.addAll(loadingPackageIds); collect = loadscanEntityList.stream().collect(Collectors.toMap(DistributionLoadscanEntity::getPackageId, Function.identity(), (k1, k2) -> k2)); @@ -3511,11 +4035,13 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl packageVOS = new ArrayList<>(); if (Func.isNotEmpty(packageIds)) { packageIds = packageIds.stream().distinct().collect(Collectors.toList()); - for (Long packageId : packageIds) { - DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(packageId); + + List parcelListEntitys = distributionParcelListService.listByIds(packageIds); + for (DistributionParcelListEntity parcelListEntity : parcelListEntitys) { +// DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(packageId); DistributionAppParcelListVO distributionAppParcelListVO = DistributionParcelListAppWrapper.build().entityVO(parcelListEntity); if (Func.isNotEmpty(collect)) { - DistributionLoadscanEntity distributionLoadscanEntity = collect.get(packageId); + DistributionLoadscanEntity distributionLoadscanEntity = collect.get(parcelListEntity.getId()); if (Func.isNotEmpty(distributionLoadscanEntity)) { distributionAppParcelListVO.setMaterialName(parcelListEntity.getMaterialName()); if (distributionLoadscanEntity.getIsAbnormalLoading().equals(2)) { @@ -3542,16 +4068,16 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl reservationZeroPackageEntityList = distributionReservationZeroPackageService.list(Wrappers.query().lambda() .eq(DistributionReservationZeroPackageEntity::getReservationId, distributionDeliveryList.getReservationId()) - .eq(DistributionReservationZeroPackageEntity::getStockArticleId, orderId) + .eq(DistributionReservationZeroPackageEntity::getStockArticleId, distributionStockArticleEntity.getId()) .ne(DistributionReservationZeroPackageEntity::getZeroPackageStatus, ReservationPackageStatusConstant.quxiao.getValue())); if (Func.isNotEmpty(reservationZeroPackageEntityList)) { int reservationTotal = reservationZeroPackageEntityList.stream().mapToInt(DistributionReservationZeroPackageEntity::getQuantity).sum(); distributionAppStockArticleVO.setReservationNum(reservationTotal); - List parcelNumberVOS = distributionReservationMapper.selectReservationZeroOrderDetail(orderId, Long.parseLong(distributionDeliveryList.getReservationId())); + List parcelNumberVOS = distributionReservationMapper.selectReservationZeroOrderDetail(distributionStockArticleEntity.getId(), Long.parseLong(distributionDeliveryList.getReservationId())); distributionAppStockArticleVO.setSignforNub(0); if (Func.isNotEmpty(parcelNumberVOS)) { parcelNumberVOS.forEach(p -> { - DistributionLoadscanEntity loadscanEntity = distributionLoadscanService.getOne(Wrappers.query().lambda().eq(DistributionLoadscanEntity::getReservationId, distributionDeliveryList.getReservationId()).eq(DistributionLoadscanEntity::getOrderId, orderId).eq(DistributionLoadscanEntity::getPackageId, p.getParcelListId()).ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())); + DistributionLoadscanEntity loadscanEntity = distributionLoadscanService.getOne(Wrappers.query().lambda().eq(DistributionLoadscanEntity::getReservationId, distributionDeliveryList.getReservationId()).eq(DistributionLoadscanEntity::getOrderId, distributionStockArticleEntity.getId()).eq(DistributionLoadscanEntity::getPackageId, p.getParcelListId()).ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())); p.setLoadingNum(0); p.setSigningNum(0); if (Func.isNotEmpty(loadscanEntity)) { @@ -3572,11 +4098,21 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl reservationOrders, Long id) { + return reservationOrders.stream().filter(f -> f.getStockArticleId().equals(id)).findFirst().orElse(null); + } + // Map> orderMap = distributionLoadscanEntities.stream().collect(Collectors.groupingBy(DistributionLoadscanEntity::getOrderId)); // List distributionAppStockArticleVOS = new ArrayList<>(); @@ -3673,12 +4209,15 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl distributionAppDeliveryListVOS = new ArrayList<>(); - R value = dictBizClient.getValue("role_class", "delivery_driver_new"); +// R value = dictBizClient.getValue("role_class", "delivery_driver_new"); + + String value1 = DictBizCache.getValue("role_class", "delivery_driver_new"); - log.info(">>>>>> 获取配置的司机角色 {}", value.getData()); + + log.info(">>>>>> 获取配置的司机角色 {}", value1); // 得到配置的多个配送角色 - String[] split = value.getData().split(","); + String[] split = value1.split(","); boolean isDriver = false; for (String s : split) { @@ -4322,9 +4861,11 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl jsonObjects = new ArrayList<>(); // ------------------------------------2023-09-08 一键签收调整------------------------------------------ //1、查询本次一键签收操作是否有效 ---- > 这里一件签收针对的就是制定的任务下的包件和库存品 @@ -4416,12 +4958,12 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl detailEntities = distributionReservationMapper.selectInventoryListByReservation(distributionSignforEntity.getReservationId()); - if (detailEntities.size() > 0 && Func.isNotEmpty(detailEntities)) { + if (!detailEntities.isEmpty() && Func.isNotEmpty(detailEntities)) { loadingInventoryNum += detailEntities.stream().mapToInt(DisStockListDetailEntity::getNum).sum(); signingInventoryNum += detailEntities.stream().mapToInt(DisStockListDetailEntity::getNum).sum(); boolean flag = detailEntities.stream().allMatch(s -> Func.isNotEmpty(s.getStockPackageCode())); @@ -4524,6 +5066,8 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl packageIds = new ArrayList<>(); List packageCodes = new ArrayList<>(); + List aaa = new ArrayList<>(); if (Func.isNotEmpty(parcelListEntityList)) { loadingPackageNum += parcelListEntityList.stream().mapToInt(DistributionParcelListEntity::getQuantity).sum(); signingPackageNum += parcelListEntityList.stream().mapToInt(DistributionParcelListEntity::getQuantity).sum(); @@ -4691,7 +5267,10 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl signforInventoryList(Long signforId) { - List distributionReservationStocklistVOS = distributionSignforMapper.selectInventory(signforId); - boolean flag = distributionReservationStocklistVOS.stream().allMatch(i -> Func.isEmpty(i.getStocklistId())); - if (flag) { - return null; - } else { - distributionReservationStocklistVOS.forEach(i -> { - if (Func.isNotEmpty(i)) { - List list = disStockListDetailService.list(Wrappers.query().lambda().eq(DisStockListDetailEntity::getReservationId, i.getReservationId()).eq(DisStockListDetailEntity::getStockListId, i.getStocklistId())); - if (Func.isNotEmpty(list)) { - boolean loadingFlag = list.stream().allMatch(l -> l.getStockLockingStatus().equals(OrderPackageLoadingStatusConstant.yizhuangche.getValue())); - i.setLoadingStatusName(ReservationInventoryLoadingStatusConstant.bufenzhuangche.getName()); - if (loadingFlag) { - //全部都装车 - i.setLoadingStatusName(ReservationInventoryLoadingStatusConstant.yizhuangche.getName()); - } else { - //全部未装车 - i.setLoadingStatusName(ReservationInventoryLoadingStatusConstant.weizhuangche.getName()); - } - boolean signingFlag = list.stream().allMatch(l -> l.getStockSignfoStatus().equals(OrderPackageLoadingStatusConstant.yizhuangche.getValue())); - i.setSigningStatusName(ReservationInventorySigningStatusConstant.bufenqianshou.getName()); - if (signingFlag) { - //全部签收 - i.setSigningStatusName(ReservationInventorySigningStatusConstant.yiqianshou.getName()); - } else { - //全部未签收 - i.setSigningStatusName(ReservationInventorySigningStatusConstant.weiqianshou.getName()); - } - } - i.setDetailVOS(DistributionDisStockListWrapper.build().listVO(list)); - } - }); - } + public List signforInventoryList(Long signforId) { + List distributionReservationStocklistVOS = distributionSignforMapper.selectInventory(signforId); return distributionReservationStocklistVOS; } @@ -5131,6 +5701,23 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl packageIds = distributionLoadscanAbnormalEntities.stream().filter(f -> LoadingAbnormalAuditingStatusConstant.daishenhe.getValue().equals(f.getAuditingStatus())).map(DistributionLoadscanAbnormalEntity::getPackageId).distinct().collect(Collectors.toList()); + + //查询审核的是否存在计划 + List packageEntityList = distributionReservationPackageService.list(Wrappers.query().lambda() + .in(DistributionReservationPackageEntity::getParceListId, packageIds) + .ne(DistributionReservationPackageEntity::getPacketBarStatus, ReservationPackageStatusConstant.quxiao.getValue()) + ); + if (!packageEntityList.isEmpty()) { + //找出审核的包件中存在计划的包件 + for (DistributionReservationPackageEntity distributionReservationPackageEntity : packageEntityList) { + log.info("异常审核取消原计划包件"); + log.info("异常审核取消原计划包件参数>>>>>>>>>reservationId:{},orderId:{},packageId:{}", distributionReservationPackageEntity.getReservationId(), distributionReservationPackageEntity.getStockArticleId(), distributionReservationPackageEntity.getParceListId()); + Integer a = baseMapper.cancelOld(distributionReservationPackageEntity.getReservationId(), distributionReservationPackageEntity.getStockArticleId(), distributionReservationPackageEntity.getParceListId()); + log.info("异常审核取消原计划包件执行条数row:{}", a); + } + } + List reservationId = distributionLoadscanAbnormalEntities.stream().distinct().map(DistributionLoadscanAbnormalEntity::getReservationId).collect(Collectors.toList()); if (distributionLoadscanAbnormalEntities.size() == 1) { DistributionLoadscanAbnormalEntity distributionLoadscanAbnormalEntity = distributionLoadscanAbnormalEntities.get(0); @@ -5243,6 +5830,7 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl>> 预约单 {}删除之前的图片 start",distributionSignfor.getReservationId()); + log.info(">>> 预约单 {}删除之前的图片 start", distributionSignfor.getReservationId()); iDistributionSignPrintService.deleteLogic(list.stream().map(DistributionSignPrintEntity::getId).collect(Collectors.toList())); - log.info(">>> 预约单 {}删除之前的图片 start",distributionSignfor.getReservationId()); + log.info(">>> 预约单 {}删除之前的图片 start", distributionSignfor.getReservationId()); } v.forEach(i -> { @@ -5312,16 +5900,21 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl>> 需要重新保存的数据 {}",distributionSignPrint); + log.info(">>> 需要重新保存的数据 {}", distributionSignPrint); }); }); if (!distributionSignPrintList.isEmpty()) { //添加 - log.info("执行批量保存 {}",distributionSignPrintList); + log.info("执行批量保存 {}", distributionSignPrintList); return iDistributionSignPrintService.saveBatch(distributionSignPrintList); } + this.update(Wrappers.update().lambda() + .eq(DistributionSignforEntity::getReservationId, distributionSignfor.getReservationId()) + .set(DistributionSignforEntity::getDriverSigning, "2") + .set(!Objects.isNull(distributionSignfor.getDriverRemarks()), DistributionSignforEntity::getDriverRemarks, "2") + ); } return false; @@ -5440,7 +6033,7 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl jsonObjects = new ArrayList<>(); for (DistributionParcelNumberDTO parcelNumberDTO : parcelNumberDTOS) { List zeroPackageEntities = reservationMap.get(parcelNumberDTO.getParcelListId()); DistributionParcelNumberEntity distributionParcelNumberEntity = distributionParcelNumberService.getOne(Wrappers.query().lambda() @@ -5465,10 +6058,12 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl distributionReservationZeroPackageEntity.getQuantity()) { log.info("#############零担签收超过计划数量ParcelListId:{},计划:{}录入,:{}", parcelNumberDTO.getParcelListId(), distributionReservationZeroPackageEntity.getQuantity(), parcelNumberDTO.getSigningNum()); } + int a = 0; if (distributionLoadscanEntity.getLoadedNub() < parcelNumberDTO.getSigningNum()) { //将装车和签收进行统一数量 distributionLoadscanEntity.setLoadedNub(parcelNumberDTO.getSigningNum()); distributionLoadscanEntity.setPackageNub(parcelNumberDTO.getSigningNum()); + a = parcelNumberDTO.getSigningNum() - distributionLoadscanEntity.getLoadedNub(); } deliveryNumber = distributionParcelNumberEntity.getDeliveryQuantity() + distributionLoadscanEntity.getReceivedQuantity() - parcelNumberDTO.getSigningNum(); @@ -5481,10 +6076,22 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl>>>>>>>>>>>>>>>>>> 推送老系统 的签收数据 {} ", mapState); - rabbitTemplate.convertAndSend(RabbitConstant.CLERK_CHECK_PUSH_DATA_EXCHANGE, RabbitConstant.CLERK_CHECK_PUSH_DATA_ROUTING, mapState); + rabbitTemplate.convertAndSend(RabbitConstant.CLERK_CHECK_PUSH_DATA_EXCHANGE, RabbitConstant.CLERK_CHECK_PUSH_DATA_ROUTING, mapState, message -> { + message.getMessageProperties() + .setHeader("x-delay", 5000); + return message; + }); } catch (Exception customerException) { log.error(">>>>>>>>>>>>>>>>>>>>>>>>>> 消息推送失败~ 请联系管理员! {}", customerException.getMessage()); @@ -5779,4 +6398,484 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl myWatchWarehouse = basicdataWarehouseClient.getMyWatchWarehouse(); + //取出id + List collect = myWatchWarehouse.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + distributionSignfor.setWarehouseIdList(collect); + SignforPageCountVO selectDistributionSignforPageCount = baseMapper.selectDistributionSignforPageCount(distributionSignfor); + + + return selectDistributionSignforPageCount; + + + } + + @Override + public Boolean clerkCheckPushData(Long id) { + try { + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 推送老系统签收队列"); + //得到审核的任务ID + if (ObjectUtil.isEmpty(id)) { + log.info(">>>>>>>>>>>>> clerkCheckPushDataHandler 签收ID为空"); + return false; + } + + //得到签收对象 + DistributionSignforEntity distributionSignforEntity = distributionSignforMapper.selectById(id); + + //需要检测文员是否进行复核了 + + if (ObjectUtil.isEmpty(distributionSignforEntity)) { + log.info(">>>>>>>>>>>> clerkCheckPushDataHandler distributionSignforEntity {}", distributionSignforEntity); + return false; + } + // 得到配送计划 + DistributionDeliveryListEntity distributionDeliveryListEntity = distributionDeliveryListMapper.selectById(distributionSignforEntity.getDeliveryId()); + if (ObjectUtil.isEmpty(distributionDeliveryListEntity)) { + log.info(">>>>>>>>>>> clerkCheckPushDataHandler distributionDeliveryListEntity {}", distributionDeliveryListEntity); + return false; + } + + // 得到配送客户 + DistributionReservationEntity distributionReservationEntity = distributionReservationMapper.selectById(distributionSignforEntity.getReservationId()); + if (ObjectUtil.isEmpty(distributionReservationEntity)) { + log.info(">>>>>>>>>>>> clerkCheckPushDataHandler distributionReservationEntity {}", distributionReservationEntity); + return false; + } + + + //组合配送信息 + SignPushDataDTO delivery = distributionDeliveryListMapper.selectPushOldDelivery(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); + + WarehouseEntity warehouseEntity = warehouseClient.findByName(distributionReservationEntity.getWarehouseName()); + if (ObjectUtils.isNotNull(warehouseEntity)) { + // 需要增加老系统的仓库ID + delivery.setWarehouseId(Long.parseLong(warehouseEntity.getId() + "")); + delivery.setWarehouseName(warehouseEntity.getTitle()); + } + + + //还需要配送的出库人、配送人、操作人信息 + if (Func.isNotEmpty(delivery)) { + if ("1".equals(delivery.getKind())) { + //自主配送 + DistributionDeliverySelfEntity distributionDeliverySelfEntity = distributionDeliverySelfMapper.selectOne(Wrappers.query().lambda() + .eq(DistributionDeliverySelfEntity::getDeliveryId, delivery.getId()) + .eq(DistributionDeliverySelfEntity::getIsMaster, 2) + ); + if (Func.isNotEmpty(distributionDeliverySelfEntity)) { + delivery.setOutId(Long.parseLong(distributionDeliverySelfEntity.getDriverId())); + delivery.setOutName(distributionDeliverySelfEntity.getDriverName()); + delivery.setOutPhone(distributionDeliverySelfEntity.getDriverPhone()); + } + } else { + //外协 + DistributionDeliveryTripartiteEntity distributionDeliveryTripartiteEntity = distributionDeliveryTripartiteMapper.selectOne(Wrappers.query().lambda().eq(DistributionDeliveryTripartiteEntity::getDeliveryId, delivery.getId())); + if (Func.isNotEmpty(distributionDeliveryTripartiteEntity)) { + delivery.setOutName(distributionDeliveryTripartiteEntity.getDriverName()); + delivery.setOutPhone(distributionDeliveryTripartiteEntity.getDriverPhone()); + } + } + R userR = userClient.userInfoById(delivery.getAdministratorsId()); + if (Func.isNotEmpty(userR)) { + User user = userR.getData(); + delivery.setAdministratorsName(user.getName()); + delivery.setAdministratorsPhone(user.getPhone()); + } + DistributionStockupEntity distributionStockupEntity = distributionReservationMapper.selectStockup(distributionSignforEntity.getReservationId()); + if (Func.isNotEmpty(distributionStockupEntity)) { + if (distributionStockupEntity.getAssignStatus().equals(StockAssignStatusConstant.yizhipai.getValue())) { + delivery.setOutToId(distributionStockupEntity.getStockupUserId()); + delivery.setOutToName(distributionStockupEntity.getStockupUser()); + } + + } + + //查询客户信息 + List customer = distributionReservationMapper.selectPushOldCustomer(distributionSignforEntity.getReservationId()); + if (Func.isNotEmpty(customer)) { + //查询客户订单 + List signPushDataUnitDTOS = new ArrayList<>(); + if (distributionReservationEntity.getReservationNum() > 0) { + //查询包件扫描签收 + //查询包件扫描签收 + List pushOldPackageLoading = distributionSignforMapper.selectPushOldPackageLoading(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); + List pushOldPackageSigning = distributionSignforMapper.selectPushOldPackageSigning(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); + if (Func.isNotEmpty(pushOldPackageLoading)) { + buildNameAndPhone(pushOldPackageLoading); + signPushDataUnitDTOS.addAll(pushOldPackageLoading); + } + if (Func.isNotEmpty(pushOldPackageSigning)) { + buildNameAndPhone(pushOldPackageSigning); + signPushDataUnitDTOS.addAll(pushOldPackageSigning); + } + } + + if (distributionReservationEntity.getReservationStockListNum() > 0) { + //查询库存品扫描签收 + List loadingPushOldInventory = distributionSignforMapper.selectLoadingPushOldInventory(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); + List signingPushOldInventory = distributionSignforMapper.selectSigningPushOldInventory(distributionSignforEntity.getReservationId(), distributionSignforEntity.getDeliveryId()); + if (Func.isNotEmpty(loadingPushOldInventory)) { + buildNameAndPhone(loadingPushOldInventory); + signPushDataUnitDTOS.addAll(loadingPushOldInventory); + } + + if (Func.isNotEmpty(signingPushOldInventory)) { + buildNameAndPhone(signingPushOldInventory); + signPushDataUnitDTOS.addAll(signingPushOldInventory); + } + } + //查询签收图片 + List distributionSignPrintVOS = distributionSignforMapper.selectSignImgsUrl(distributionReservationEntity.getId()); + + if (Func.isNotEmpty(signPushDataUnitDTOS)) { + SignPushDataContactDTO signPushDataContactDTO = customer.get(0); + signPushDataContactDTO.setSignPushDataUnitDTOs(signPushDataUnitDTOS); + if (Func.isNotEmpty(distributionSignPrintVOS)) { + String urls = distributionSignPrintVOS.stream().map(DistributionSignPrintVO::getUrlRoute).collect(Collectors.joining(",")); + signPushDataContactDTO.setImage(urls); + } + if (Func.isNotEmpty(distributionSignforEntity.getClerkSignRemarks())) { + signPushDataContactDTO.setContact(distributionSignforEntity.getClerkSignRemarks()); + } + } + buildReservationNameAndPhone(customer); + //完成客户信息添加 + delivery.setSignPushDataContactDTOs(customer); + } + } + + + log.info(">>>> clerkCheckPushData SignPushDataDTO :{}", delivery); + Boolean b = oldSystemDataPushClient.pushOldSystemSignInfo(delivery); + return b; + } catch (Exception e) { + log.error(">>>>> 推送老系统签收信息报错", e); + } + + + return false; + } + + @Override + public DistributionSignforExcelDTO distributionSignforDetailExcel(Long id) { + DistributionSignforExcelDTO distributionSignforExcelDTO = new DistributionSignforExcelDTO(); + List distributionSignforOrderExcels = this.exportDistributionSignforOrderList(id); + if (!distributionSignforOrderExcels.isEmpty()) { + distributionSignforExcelDTO.setSignforOrderExcelList(distributionSignforOrderExcels); + } + List distributionSignforPackageExcels = this.exportDistributionSignforPackageList(id); + if (!distributionSignforPackageExcels.isEmpty()) { + distributionSignforExcelDTO.setSignforPackageExcelList(distributionSignforPackageExcels); + } + List distributionSignforInventoryExcels = this.exportDistributionSignforInventoryList(id); + if (!distributionSignforInventoryExcels.isEmpty()) { + distributionSignforExcelDTO.setSignforInventoryExcelList(distributionSignforInventoryExcels); + } + + return distributionSignforExcelDTO; + } + + @Override + public List exportDistributionSignforInventoryList(Long id) { + + return baseMapper.getDistributionSignforInventoryList(id); + } + + @Override + public R loadingAbnormalPackageListTurnDown(String ids, boolean yesOrNo) { + + //异常驳回进行异常信息的删除,对于装车记录的清理,对于已装车和签收的数量扣减 + String method = "####################异常驳回loadingAbnormalPackageListTurnDown"; + if (Func.isEmpty(ids)) { + log.error(method + "ids参数缺失:{}", ids); + } + List list = Func.toLongList(ids); + List abnormalEntities = distributionLoadscanAbnormalService.listByIds(list); + + List packageIdList = new ArrayList<>(); + List orderIds = new ArrayList<>(); + Long reservationId = null; + Long deliveryId = null; + if (!abnormalEntities.isEmpty()) { + List rIds = abnormalEntities.stream().map(DistributionLoadscanAbnormalEntity::getReservationId).distinct().collect(Collectors.toList()); + List dIds = abnormalEntities.stream().map(DistributionLoadscanAbnormalEntity::getDeliveryListId).distinct().collect(Collectors.toList()); + List packageIds = abnormalEntities.stream().map(DistributionLoadscanAbnormalEntity::getPackageId).distinct().collect(Collectors.toList()); + if (rIds.size() > 1) { + log.error(method + "查询出多个reservatyionId:{}", rIds); + return R.fail("数据错误,请联系管理员"); + } + if (dIds.size() > 1) { + log.error(method + "查询出多个deliveryId:{}", dIds); + return R.fail("数据错误,请联系管理员"); + } + reservationId = rIds.get(0); + deliveryId = dIds.get(0); + List loadscanEntityList = distributionLoadscanService.list(Wrappers.query().lambda() + .in(DistributionLoadscanEntity::getPackageId, packageIds) + .eq(DistributionLoadscanEntity::getReservationId, reservationId) + .eq(DistributionLoadscanEntity::getDeliveryId, deliveryId) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + ); + List updateList = new ArrayList<>(); + if (!loadscanEntityList.isEmpty()) { + Map loadscanMap = loadscanEntityList.stream().collect(Collectors.toMap(DistributionLoadscanEntity::getPackageId, Function.identity(), (k, v) -> k)); + //存在异常列表 + //进行异常列表的清理 + for (DistributionLoadscanAbnormalEntity abnormalEntity : abnormalEntities) { + //存在异常操作为进行审核操作才可进行驳回 + if (!Objects.isNull(abnormalEntity.getAuditingStatus()) && LoadingAbnormalAuditingStatusConstant.daishenhe.getValue().equals(abnormalEntity.getAuditingStatus())) { + //驳回视为进行审核,审核结果为驳回 + abnormalEntity.setAuditingStatus(3); + abnormalEntity.setAuditingUser(AuthUtil.getNickName()); + abnormalEntity.setAuditingTime(new Date()); + updateList.add(abnormalEntity); + //收集需要进行维护的包件 + packageIdList.add(abnormalEntity.getPackageId()); + //查询是否进行签收 +// 统计需要进行扣减的签收数量 + if (Func.isNotEmpty(loadscanMap.get(abnormalEntity.getPackageId()))) { + //获取装车记录 + DistributionLoadscanEntity distributionLoadscanEntity = loadscanMap.get(abnormalEntity.getPackageId()); + orderIds.add(distributionLoadscanEntity.getOrderId()); + distributionLoadscanEntity.setIsAbnormalLoading(LoadingAbnormalAuditingStatusConstant.daishenhe.getValue()); + //对异常装车记录进行异常标识的取消 + distributionLoadscanService.updateById(distributionLoadscanEntity); + + } else { + //异常驳回无装车记录 + log.error(method + "异常驳回无装车记录"); + throw new RuntimeException("异常驳货列表存在无装车信息"); + } + } + + } + if (!updateList.isEmpty()) { + distributionLoadscanAbnormalService.updateBatchById(updateList); + } + } + //进行装车记录的统计 + } + if (yesOrNo) { + //恢复包件数据 + distributionParcelListService.update(Wrappers.update().lambda() + .in(DistributionParcelListEntity::getId, packageIdList) + .set(DistributionParcelListEntity::getOrderPackageReservationStatus, OrderPackageReservationStatusConstant.daiyuyue.getValue()) + .set(DistributionParcelListEntity::getOrderPackageLoadingStatus, OrderPackageLoadingStatusConstant.weizhuancghe.getValue()) + .set(DistributionParcelListEntity::getOrderPackageStatus, OrderPackageStatusConstant.yiruku.getValue()) + .set(DistributionParcelListEntity::getOrderPackageStockupStatus, OrderPackageStockupStatusConstant.daibeihuo.getValue()) + ); + } + //维护相关的订单信息 + distributionStockArticleService.maintenanceOrderInfoByIds(orderIds); + return R.success("异常驳回成功"); + } + + private void buildNameAndPhone(List pushOldPackageSigning) { + for (SignPushDataUnitDTO signPushDataUnitDTO : pushOldPackageSigning) { + User user = bladeRedis.get(RedisKeyConstant.USER_NAME_PHONE_KEY + signPushDataUnitDTO.getAdministratorsId()); + log.info("buildNameAndPhone >>> 获取缓存的中的用户信息{}", user); + if (user == null) { + R userT = userClient.userInfoById(signPushDataUnitDTO.getAdministratorsId()); + if (userT.isSuccess()) { + user = userT.getData(); + bladeRedis.setEx(RedisKeyConstant.USER_NAME_PHONE_KEY + signPushDataUnitDTO.getAdministratorsId(), user, 3600L); + } + } + if (ObjectUtils.isNotNull(user)) { + assert user != null; + signPushDataUnitDTO.setAdministratorsName(user.getName()); + if (ObjectUtils.isNotEmpty(user.getAccount())) { + signPushDataUnitDTO.setAdministratorsPhone(user.getAccount()); + } else { + if (ObjectUtils.isNotEmpty(user.getAccount())) { + signPushDataUnitDTO.setAdministratorsPhone(user.getAccount()); + } else { + log.info("用户无电话号码且账号信息为空>>用户名称:{}", user.getName()); + } + } + } + + } + } + + + private void buildReservationNameAndPhone(List customers) { + for (SignPushDataContactDTO signPushDataUnitDTO : customers) { + User user = bladeRedis.get(RedisKeyConstant.USER_NAME_PHONE_KEY + signPushDataUnitDTO.getSignUserId()); + log.info("buildNameAndPhone >>> 获取缓存的中的用户信息{}", user); + if (user == null) { + R userT = userClient.userInfoById(signPushDataUnitDTO.getSignUserId()); + if (userT.isSuccess()) { + user = userT.getData(); + bladeRedis.setEx(RedisKeyConstant.USER_NAME_PHONE_KEY + signPushDataUnitDTO.getSignUserId(), user, 3600L); + } + } + if (ObjectUtils.isNotNull(user)) { + assert user != null; + signPushDataUnitDTO.setSignUserName(user.getName()); + if (ObjectUtils.isNotEmpty(user.getPhone())) { + signPushDataUnitDTO.setSignUserPhone(user.getPhone()); + } else { + if (ObjectUtils.isNotEmpty(user.getAccount())) { + signPushDataUnitDTO.setSignUserPhone(user.getAccount()); + } else { + log.info("用户无电话号码且账号信息为空>>用户名称:{}", user.getName()); + } + } + } + + } + } + + + public void releaseSource(Long reservationId, BasicdataWarehouseEntity warehouse, BladeUser user, String trainNumber) { + String method = "##########################DistributionAsyncServiceImpl.releaseSource"; + DistributionReservationEntity reservationEntity = distributionReservationMapper.selectById(reservationId); + StringBuilder builder = new StringBuilder(); + if (reservationEntity.getReservationNum() > 0) { + //存在订单 + List distributionParcelListEntities = distributionReservationMapper.selectPackageListByReservationId(reservationId); + if (Func.isNotEmpty(distributionParcelListEntities)) { + + List packageIds = distributionParcelListEntities.stream() + .filter(p -> p.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue()) && !p.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())) + .map(DistributionParcelListEntity::getId) + .collect(Collectors.toList()); + + if (Func.isNotEmpty(packageIds)) { + //对包件进行批量的修改 + //将这些包件恢复到初始状态 + int row = distributionParcelListMapper.updateOrderPackageInceptionStatus(packageIds); + } + //维护这些进行包件对应的订单 + String orderCodes = distributionParcelListEntities.stream() + .filter(p -> p.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.weizhuancghe.getValue()) + && !p.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())) + .map(DistributionParcelListEntity::getOrderCode) + .distinct().collect(Collectors.joining(",")); + log.info(method + "维护订制品订单:{}", orderCodes); + builder.append(orderCodes); + + log.info(">>>>>> updatePackageDeliveryStatus,{}, {}", reservationId, packageIds); + if (!packageIds.isEmpty() && reservationId != null) { + //完成对该客户下此包件任务的取消 + int row = distributionReservationMapper.updatePackageDeliveryStatus(reservationId, packageIds); + + } + List aaa = new ArrayList<>(); + distributionParcelListEntities.forEach(k -> { + if (k.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.yizhuangche.getValue()) + && k.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())) { + String content = "包件在" + warehouse.getName() + "由" + user.getNickName() + "完成复核,配送车次号:" + trainNumber + "预约任务号:" + reservationEntity.getReservationCode(); + JSONObject js = handleLogJSONObject(warehouse, AuthUtil.getUser(), k.getOrderPackageCode(), content, WorkNodeEnums.CLERK_REVIEW.getCode(),trainNumber,new Date()); + aaa.add(js); + } else { + String content = "包件在" + warehouse.getName() + "由" + user.getNickName() + "复核取消计划无操作包件,配送车次号:" + trainNumber + "预约任务号:" + reservationEntity.getReservationCode(); + JSONObject js = handleLogJSONObject(warehouse, AuthUtil.getUser(), k.getOrderPackageCode(), content, WorkNodeEnums.CANCEL_DISTRIBUTION.getCode(),trainNumber,new Date()); + aaa.add(js); + } + }); + if (!aaa.isEmpty()) { + trunklinePackageTrackLogClient.addPackageTrackLog(aaa); + } + + } + List distributionParcelNumberDTOS = distributionReservationMapper.selectZeroPackageListByReservationId(reservationId); + if (Func.isNotEmpty(distributionParcelNumberDTOS)) { + //查询此预约单下未进行装车且签收的零担包件 + List packageIds = distributionParcelNumberDTOS.stream().map(DistributionParcelNumberDTO::getParcelListId).collect(Collectors.toList()); + List loadscanEntityList = distributionLoadscanMapper.selectList(Wrappers.query().lambda() + .eq(DistributionLoadscanEntity::getReservationId, reservationId) + .in(DistributionLoadscanEntity::getPackageId, packageIds) + .ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue()) + ); + if (Func.isNotEmpty(loadscanEntityList)) { + //查看是否存在需要进行回库的零担 + List collect = loadscanEntityList.stream().filter(f -> !packageIds.contains(f.getPackageId())).map(DistributionLoadscanEntity::getPackageId).collect(Collectors.toList()); + if (Func.isNotEmpty(collect)) { + String orderCode = distributionParcelNumberDTOS.stream().filter(f -> collect.contains(f.getParcelListId())).map(DistributionParcelNumberDTO::getOrderCode).collect(Collectors.joining(",")); + log.info(method + "维护零担订单:{}", orderCode); + builder.append(orderCode); + //这些单子就是需要进行状态回退的零担包件 + distributionReservationZeroPackageService.recoverZeroPackage(reservationId, collect); + } + } else { + //计划数量全部回退 + String orderCode = distributionParcelNumberDTOS.stream().map(DistributionParcelNumberDTO::getOrderCode).distinct().collect(Collectors.joining(",")); + log.info(method + "维护零担订单:{}", orderCode); + builder.append(orderCode); + distributionReservationZeroPackageService.recoverZeroPackage(reservationId, packageIds); + } + } + distributionStockArticleService.maintenanceOrderInfo(builder.toString(), warehouse.getId()); + distributionReservationStockarticleService.maintenanceReservationStockArticle(reservationId, warehouse.getId()); + + } + //存在库存品信息 + if (reservationEntity.getReservationStockListNum() > 0) { + //进行库存品的资源释放 + List disStockListDetailEntities = distributionReservationMapper.selectInventoryListByReservation(reservationId); + if (Func.isNotEmpty(disStockListDetailEntities)) { + //未签收并且未装车 + List inventoryList = disStockListDetailEntities.stream().filter(inven -> inven.getStockLockingStatus().equals(InventoryLoadingStatusConstant.weizhuangche.getValue()) && inven.getStockLockingStatus().equals(InventorySigningStatusConstant.weiqianshou.getValue())).collect(Collectors.toList()); + if (Func.isNotEmpty(inventoryList)) { + Map> stockListMap = inventoryList.stream().collect(Collectors.groupingBy(DisStockListDetailEntity::getStockListId)); + stockListMap.forEach((k, v) -> { + //扣减对应批次库存品的冻结数量 + distributionStockListMapper.decreaseStockListQuantityOccupied(k, v.size()); + //维护对应的客户库存品的 + for (DisStockListDetailEntity disStockListDetailEntity : v) { + //取消对应的库存品包件信息 + disStockListDetailEntity.setStockPackageStatus(ReservationPackageStatusConstant.quxiao.getValue()); + disStockListDetailService.updateById(disStockListDetailEntity); + } + }); + } + } + + //维护对应的库存品计划状态 + distributionReservationStocklistService.maintenanceReservationStockList(reservationId); + + } + + } + + + + + private JSONObject handleLogJSONObject(BasicdataWarehouseEntity warehouse, BladeUser user, String orderPackageCode, String content, Integer node, String trainNumber, Date warehouseEntryTimeEnd) { + JSONObject trunklinePackageTrackLog = new JSONObject(); + trunklinePackageTrackLog.put("tenantId", user.getTenantId()); + trunklinePackageTrackLog.put("createTime", new Date()); + trunklinePackageTrackLog.put("createUser", user.getUserId()); + trunklinePackageTrackLog.put("updateUser", user.getUserId()); + trunklinePackageTrackLog.put("updateTime", new Date()); + trunklinePackageTrackLog.put("isDeleted", 0); + trunklinePackageTrackLog.put("status", 1); + trunklinePackageTrackLog.put("createDept", warehouse.getDepartment()); + trunklinePackageTrackLog.put("orderPackageCode", orderPackageCode); + trunklinePackageTrackLog.put("warehouseId", warehouse.getId()); + trunklinePackageTrackLog.put("warehouseName", warehouse.getName()); + trunklinePackageTrackLog.put("workNode", node); + trunklinePackageTrackLog.put("content", content); + trunklinePackageTrackLog.put("trainNumber", trainNumber); + trunklinePackageTrackLog.put("warehouseEntryTimeEnd", DateUtil.format(warehouseEntryTimeEnd, DatePattern.NORM_DATETIME_PATTERN)); + trunklinePackageTrackLog.put("operator", user.getNickName()); + return trunklinePackageTrackLog; + } + + + + } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockArticleServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockArticleServiceImpl.java index 63cb8f5ef..23cb05820 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockArticleServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockArticleServiceImpl.java @@ -16,6 +16,7 @@ */ package com.logpm.distribution.service.impl; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -28,7 +29,9 @@ import com.logpm.basic.entity.BasicMaterialEntity; import com.logpm.basic.entity.BasicPrintTemplateEntity; import com.logpm.basic.feign.IBasicMaterialClient; import com.logpm.basic.feign.IBasicPrintTemplateClient; +import com.logpm.basicdata.entity.BasicdataClientEntity; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataClientClient; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; import com.logpm.distribution.dto.DistributionStockArticleDTO; import com.logpm.distribution.dto.DistributionStockArticleOweDTO; @@ -43,8 +46,6 @@ import com.logpm.distribution.vo.app.queryOrderVO; import com.logpm.distribution.wrapper.DistributionParcelListWrapper; import com.logpm.distribution.wrapper.DistributionStockArticleNewWrapper; import com.logpm.distribution.wrapper.DistributionStockArticleWrapper; -import com.logpm.warehouse.entity.WarehouseTrayGoodsEntity; -import com.logpm.warehouse.entity.WarehouseUpdownGoodsEntity; import com.logpm.warehouse.feign.IWarehouseTrayGoodsClient; import com.logpm.warehouse.feign.IWarehouseUpdownGoodsClient; import lombok.AllArgsConstructor; @@ -138,6 +139,8 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl selectDistributionStockArticlePage(IPage page, DistributionStockArticleVO distributionStockArticle) { @@ -161,34 +164,43 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl warehouseList = warehouseClient.getMyWarehouseList(); + if (!warehouseList.isEmpty()) { + List warehouseListIds = warehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + paramMap.put("warehouseIds", warehouseListIds); + } + } else { + paramMap.put("warehouseId", myCurrentWarehouse.getId()); } // 用户勾选数据的ids Object ids = paramMap.get("ids"); - List idArr = null; + List idArr = null; if (null != ids && !"".equals(ids.toString())) { - idArr = Arrays.asList(paramMap.get("ids").toString().split(",")); +// idArr = Arrays.asList(paramMap.get("ids").toString().split(",")); + idArr = Func.toLongList((String) paramMap.get("ids")); + } String tenantId = AuthUtil.getTenantId(); - paramMap.put("warehouseId", myCurrentWarehouse.getId()); paramMap.put("tenantId", tenantId); + paramMap.put("orderIds", idArr); - List list = baseMapper.exportDistributionStockArticle(paramMap, idArr); + List list = baseMapper.exportDistributionStockArticle(paramMap); List excelList = new ArrayList<>(); // list.forEach(li -> { DistributionStockArticleVO distributionStockArticleVO = buildVo(li); DistributionStockArticleExcel excel = new DistributionStockArticleExcel(); - assert distributionStockArticleVO != null; - if (distributionStockArticleVO.getTotalNumber() != null && + assert distributionStockArticleVO != null; + if (distributionStockArticleVO.getTotalNumber() != null && distributionStockArticleVO.getIncomingNum() != null) { distributionStockArticleVO.setUnreceivedQuantity( distributionStockArticleVO.getTotalNumber() - distributionStockArticleVO.getIncomingNum() ); } - excel.setIsZeroString("1".equals(distributionStockArticleVO.getIsZero())?"是":"否"); BeanUtil.copyProperties(distributionStockArticleVO, excel); + excel.setIsZeroString("1".equals(distributionStockArticleVO.getIsZero()) ? "是" : "否"); excelList.add(excel); }); @@ -199,6 +211,7 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl map = orderNoList.toMap(); // 创建一个新的Map,并将map1和map2合并到其中 Map mergedMap = new HashMap<>(); @@ -777,9 +790,22 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl moldList = new ArrayList<>(); + data.forEach(map -> { + try { + String popHtml = TemplateUtil.popTemplate("包件码", map, html); + moldList.add(popHtml); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + orderPackgeCodeDataVO.setMoldList(moldList); + return orderPackgeCodeDataVO; } + + @Override public IPage handlePackage(IPage pageVO) { @@ -913,48 +939,19 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl myWarehouseList = warehouseClient.getMyWatchWarehouse(); - List collect = myWarehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); - if (collect.size() > 1) { - stockArticleEntity.setWarehouseIdList(collect); - } else if (collect.size() == 1) { - stockArticleEntity.setWarehouseId(collect.get(0)); - } - IPage distributionStockArticleEntityIPage = baseMapper.pageListOwe(page, stockArticleEntity); - distributionStockArticleEntityIPage.getRecords().stream().forEach(i -> { -/* DistributionStockArticleEntity distributionStockArticleEntity = baseMapper.getStockArticleQueryQuantity(i.getId()); - i.setDeliveryQuantity(distributionStockArticleEntity.getDeliveryQuantity()); - List list = distributionParcelListService.list(Wrappers.query().lambda() - .eq(DistributionParcelListEntity::getStockArticleId, i.getId()) - .eq(DistributionParcelListEntity::getOrderPackageStatus, OrderPackageStatusConstant.yiqianshou.getValue()) - ); - i.setSigninQuantity(distributionStockArticleEntity.getSigninQuantity() + list.size() );*/ - if ("1".equals(i.getIsZero())) { - //查询托盘 - WarehouseTrayGoodsEntity warehouseTrayGoods = new WarehouseTrayGoodsEntity(); - warehouseTrayGoods.setAssociationId(i.getId()); - warehouseTrayGoods.setAssociationType("1"); - warehouseTrayGoods.setAssociationValue(i.getOrderCode()); - warehouseTrayGoods.setWarehouseId(collect.get(0)); - List trayList = warehouseTrayGoodsClient.getTrayList(warehouseTrayGoods); - if (!trayList.isEmpty()) { - String collect1 = trayList.stream().map(WarehouseTrayGoodsEntity::getTrayCode).collect(Collectors.joining(",")); - i.setTrays(collect1); - } - //查询货位 - WarehouseUpdownGoodsEntity updownGoodsEntity = new WarehouseUpdownGoodsEntity(); - updownGoodsEntity.setAssociationId(i.getId()); - updownGoodsEntity.setAssociationType("1"); - updownGoodsEntity.setWarehouseId(collect.get(0)); - updownGoodsEntity.setAssociationValue(i.getOrderCode()); - List information = warehouseUpdownGoodsClient.getLocationStockListInformation(updownGoodsEntity); - if (ObjectUtils.isNotNull(information) && !information.isEmpty()) { - String collect1 = information.stream().map(WarehouseUpdownGoodsEntity::getPositionCode).collect(Collectors.joining(",")); - i.setAllocation(collect1); - } - } - }); +// } + List warehouseIdList = new ArrayList<>(); + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Func.isEmpty(myCurrentWarehouse)){ + List myWarehouseList = warehouseClient.getMyWarehouseList(); + List collect = myWarehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + warehouseIdList.addAll(collect); + }else{ + warehouseIdList.add(myCurrentWarehouse.getId()); + } + + IPage distributionStockArticleEntityIPage = baseMapper.pageListOwe(page, stockArticleEntity,warehouseIdList); return distributionStockArticleEntityIPage; } @@ -1067,8 +1064,7 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl stockArticleEntityList = baseMapper.selectAllDistributionOrder(page, stockArticleEntity); List stockArticleVOS = DistributionStockArticleNewWrapper.build().listVO(stockArticleEntityList.getRecords()); for (DistributionStockArticleVO stockArticleVO : stockArticleVOS) { - if (IsOrNoConstant.no.getValue().equals(stockArticleVO.getIsZero())){ + if (IsOrNoConstant.no.getValue().equals(stockArticleVO.getIsZero())) { stockArticleVO.setReservationNum(stockArticleVO.getHandQuantity()); - }else { + } else { List distributionParcelNumberVOS = distributionParcelNumberMapper.selectZeroPackage(stockArticleVO.getId()); // 零担查询当前操作计划可用数量 int reservationNum = distributionParcelNumberVOS.stream().mapToInt(DistributionParcelNumberVO::getHandQuantity).sum() - distributionParcelNumberVOS.stream().mapToInt(DistributionParcelNumberVO::getDeliveryQuantity).sum(); @@ -1359,27 +1354,26 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("order_code", orderCode) - .eq("warehouse_id", warehouseId) + queryWrapper.eq("order_code", stockArticleEntity.getOrderCode()) + .eq("warehouse_id", stockArticleEntity.getWarehouseId()) .eq("conditions", 1) .eq("is_deleted", 0); List list = distributionParcelListService.list(queryWrapper); @@ -1529,6 +1523,327 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl orderCodes, Long warehouseId) { + + log.info(">>>>> T updateOrdersInfo start"); + log.info(">>>>> updateOrdersInfo orderCodes :{},warehouseId:{}", orderCodes, warehouseId); + if (orderCodes.isEmpty()) { + return; + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("order_code", orderCodes); + queryWrapper.eq("warehouse_id", warehouseId); +// .eq("is_zero",1) + queryWrapper.eq("is_deleted", 0); + + List distributionStockArticleEntities = baseMapper.selectList(queryWrapper); + + + for (DistributionStockArticleEntity stockArticleEntity : distributionStockArticleEntities) { + + if (Objects.isNull(stockArticleEntity)) { + throw new CustomerException(405, "订单信息不存在"); + } + + String isZero = stockArticleEntity.getIsZero(); + if ("1".equals(isZero)) { + log.warn("##############updateOrderInfo: 零担不更新 orderCode={} warehouseId={}", stockArticleEntity.getOrderCode(), warehouseId); + return; + } + + //查询入库件数 +// updateStockArticleByextracted(warehouseId, stockArticleEntity); + updateOrderInfoByDistributionStockArticleEntity(stockArticleEntity); + log.info(">>>>> T updateOrdersInfo end"); + } + + + } + + private void updateStockArticleByextracted(Long warehouseId, DistributionStockArticleEntity stockArticleEntity) { + Integer totalNumber = stockArticleEntity.getTotalNumber(); + boolean isChange = false; + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("order_code", stockArticleEntity.getOrderCode()) + .eq("warehouse_id", warehouseId) + .eq("conditions", 1) + .eq("is_deleted", 0); + List list = distributionParcelListService.list(queryWrapper1); + + Integer incomingNum = 0; + Integer handleNum = 0; + Integer outNum = 0; + Integer signNum = 0; + Integer reservationNum = 0; + Integer groundingNum = 0; + + Long firstEntryTime = 0L; + Long lastEntryTime = 0L; + Set waybillNoSet = new TreeSet<>(); + for (DistributionParcelListEntity parcelListEntity : list) { + incomingNum = incomingNum + 1; + Date warehouseEntryTimeEnd = parcelListEntity.getWarehouseEntryTimeEnd(); + if (Objects.isNull(warehouseEntryTimeEnd)) { + warehouseEntryTimeEnd = parcelListEntity.getCreateTime(); + } + long time = warehouseEntryTimeEnd.getTime(); + + if (firstEntryTime == 0L) { + firstEntryTime = time; + } else { + if (firstEntryTime > time) { + firstEntryTime = time; + } + } + + if (lastEntryTime == 0L) { + lastEntryTime = time; + } else { + if (lastEntryTime < time) { + lastEntryTime = time; + } + } + + Integer conditions = parcelListEntity.getConditions(); + if (conditions.equals(1)) { + String orderPackageStatus = parcelListEntity.getOrderPackageStatus(); + String orderPackageReservationStatus = parcelListEntity.getOrderPackageReservationStatus(); + String orderPackageGroundingStatus = parcelListEntity.getOrderPackageGroundingStatus(); + String waybillNumber = parcelListEntity.getWaybillNumber(); + if (StringUtils.isNotBlank(waybillNumber)) { + waybillNoSet.add(parcelListEntity.getWaybillNumber()); + } + + if ("20".equals(orderPackageGroundingStatus)) { + groundingNum = groundingNum + 1; + } + + if ("20".equals(orderPackageReservationStatus)) { + reservationNum = reservationNum + 1; + } + + if (!"60".equals(orderPackageStatus) && !"70".equals(orderPackageStatus)) { + handleNum = handleNum + 1; + } else if ("60".equals(orderPackageStatus)) { + outNum = outNum + 1; + } else if ("70".equals(orderPackageStatus)) { + signNum = signNum + 1; + } + } + } + + String orderWaybillNo = null; + for (String waybillNo : waybillNoSet) { + if (StringUtils.isBlank(orderWaybillNo)) { + orderWaybillNo = waybillNo; + } else { + orderWaybillNo = orderWaybillNo + "," + waybillNo; + } + } + + if (!orderWaybillNo.equals(stockArticleEntity.getWaybillNumber())) { + stockArticleEntity.setWaybillNumber(orderWaybillNo); + isChange = true; + } + + if (stockArticleEntity.getWarehouseEntryTime().getTime() != firstEntryTime) { + stockArticleEntity.setWarehouseEntryTime(new Date(firstEntryTime)); + isChange = true; + } + + if (stockArticleEntity.getWarehouseEntryTimeEnd().getTime() != lastEntryTime) { + stockArticleEntity.setWarehouseEntryTimeEnd(new Date(lastEntryTime)); + isChange = true; + } + + if (incomingNum == 0) { + + if (!"10".equals(stockArticleEntity.getOrderReceiveStatus())) { + stockArticleEntity.setOrderReceiveStatus("10"); + isChange = true; + } + + if (1 != stockArticleEntity.getCompleteSet()) { + stockArticleEntity.setCompleteSet(1); + isChange = true; + } + + if (!"0".equals(stockArticleEntity.getOrderStatus())) { + stockArticleEntity.setOrderStatus("0"); + isChange = true; + } + + + } else if (0 < incomingNum && incomingNum < totalNumber) { + + + if (!"20".equals(stockArticleEntity.getOrderReceiveStatus())) { + stockArticleEntity.setOrderReceiveStatus("20"); + isChange = true; + } + + + if (1 != stockArticleEntity.getCompleteSet()) { + stockArticleEntity.setCompleteSet(1); + isChange = true; + } + + if (!"10".equals(stockArticleEntity.getOrderStatus())) { + stockArticleEntity.setOrderStatus("10"); + isChange = true; + } + + if (reservationNum == 0) { + if (!"10".equals(stockArticleEntity.getReservationStatus())) { + stockArticleEntity.setReservationStatus("10"); + isChange = true; + } + } else { + if (!"20".equals(stockArticleEntity.getReservationStatus())) { + stockArticleEntity.setReservationStatus("20"); + isChange = true; + } + } + + if (groundingNum == 0) { + if (!"10".equals(stockArticleEntity.getGroundingStatus())) { + stockArticleEntity.setGroundingStatus("10"); + isChange = true; + } + } else { + if (!"20".equals(stockArticleEntity.getGroundingStatus())) { + stockArticleEntity.setGroundingStatus("20"); + isChange = true; + } + } + + if (signNum == 0) { + if (outNum == 0) { + if (!"10".equals(stockArticleEntity.getOrderStatus())) { + stockArticleEntity.setOrderStatus("10"); + isChange = true; + } + } else { + if (!"30".equals(stockArticleEntity.getOrderStatus())) { + stockArticleEntity.setOrderStatus("30"); + isChange = true; + } + } + } else { + if (!"70".equals(stockArticleEntity.getOrderStatus())) { + stockArticleEntity.setOrderStatus("70"); + isChange = true; + } + } + } else { + + if (!"30".equals(stockArticleEntity.getOrderReceiveStatus())) { + stockArticleEntity.setOrderReceiveStatus("30"); + isChange = true; + } + if (2 != stockArticleEntity.getCompleteSet()) { + stockArticleEntity.setCompleteSet(2); + isChange = true; + } + if (!"20".equals(stockArticleEntity.getOrderStatus())) { + stockArticleEntity.setOrderStatus("20"); + isChange = true; + } + + if (reservationNum.equals(0)) { + if (!"10".equals(stockArticleEntity.getReservationStatus())) { + stockArticleEntity.setReservationStatus("10"); + isChange = true; + } + } else if (reservationNum > 0 && reservationNum < totalNumber) { + if (!"20".equals(stockArticleEntity.getReservationStatus())) { + stockArticleEntity.setReservationStatus("20"); + isChange = true; + } + } else { + if (!"30".equals(stockArticleEntity.getReservationStatus())) { + stockArticleEntity.setReservationStatus("30"); + isChange = true; + } + } + + if (groundingNum.equals(0)) { + if (!"10".equals(stockArticleEntity.getGroundingStatus())) { + stockArticleEntity.setGroundingStatus("10"); + isChange = true; + } + + } else if (groundingNum > 0 && groundingNum < totalNumber) { + if (!"20".equals(stockArticleEntity.getGroundingStatus())) { + stockArticleEntity.setGroundingStatus("20"); + isChange = true; + } + } else { + if (!"30".equals(stockArticleEntity.getGroundingStatus())) { + stockArticleEntity.setGroundingStatus("30"); + isChange = true; + } + } + + if (signNum.equals(0)) { + if (outNum.equals(0)) { + if (!"20".equals(stockArticleEntity.getOrderStatus())) { + stockArticleEntity.setOrderStatus("20"); + isChange = true; + } + } else { + if (outNum.equals(totalNumber)) { + if (!"40".equals(stockArticleEntity.getOrderStatus())) { + stockArticleEntity.setOrderStatus("40"); + isChange = true; + } + } else { + if (!"30".equals(stockArticleEntity.getOrderStatus())) { + stockArticleEntity.setOrderStatus("30"); + isChange = true; + } + } + } + } else { + if (signNum.equals(totalNumber)) { + if (!"80".equals(stockArticleEntity.getOrderStatus())) { + stockArticleEntity.setOrderStatus("80"); + isChange = true; + } + } else { + if (!"70".equals(stockArticleEntity.getOrderStatus())) { + stockArticleEntity.setOrderStatus("70"); + isChange = true; + } + } + } + } + + if (!stockArticleEntity.getHandQuantity().equals(handleNum)) { + stockArticleEntity.setHandQuantity(handleNum); + isChange = true; + } + if (!stockArticleEntity.getIncomingNum().equals(incomingNum)) { + stockArticleEntity.setIncomingNum(incomingNum); + isChange = true; + } + if (isChange) { + updateById(stockArticleEntity); + } } @Override @@ -1543,6 +1858,7 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl 0) { - stockArticleEntity.setGenre(1); + t.setGenre(1); } - this.updateById(stockArticleEntity); + + // 这里在和原始对象进行比较 + check2ObjSome(t, stockArticleEntity); + if (!cn.hutool.core.util.ObjectUtil.isAllEmpty(t.getGenre(), t.getReservationStatus(), + t.getHandQuantity(), t.getDeliveryQuantity(), t.getOrderStatus(), t.getSigninQuantity())) { + baseMapper.updateDistributionStockArticleEntityById(t); + } + + } } else if (IsOrNoConstant.yes.getValue().equals(stockArticleEntity.getIsZero())) { //零担订单维护 @@ -1715,19 +2040,218 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl ids) { + String method = "###############方法:maintenanceOrderInfo,"; + if (Func.isEmpty(ids)) { + log.error(method + "参数缺失ids:{}", ids); + return; + } + for (Long s : ids) { + //查询订单 + DistributionStockArticleEntity stockArticleEntity = this.getById(s); + if (Func.isEmpty(stockArticleEntity)) { + log.error(method + "订单不存在orderCode:{}", s); + throw new RuntimeException("订单不存在"); + } + if (IsOrNoConstant.no.getValue().equals(stockArticleEntity.getIsZero())) { + //查询包件列表 + List parcelListEntities = distributionParcelListService.list(Wrappers.query().lambda() + .eq(DistributionParcelListEntity::getConditions, 1) + .eq(DistributionParcelListEntity::getStockArticleId, stockArticleEntity.getId()) + ); + if (Func.isEmpty(parcelListEntities)) { + log.error(method + "查询包件列表空orderCode:{}", s); + throw new RuntimeException("包件列表为空"); + } + //在库数量 + int inWarehouseQuantity = 0; + //装车数量 + int loadingQuantity = 0; + //配送件数 + int deliveryQuantity = 0; + //签收件数 + int signingQuantity = 0; + //订单总件数 + int totalNumber = stockArticleEntity.getTotalNumber().intValue(); + for (DistributionParcelListEntity parcelListEntity : parcelListEntities) { + //统计订单相关的状态节点数量 + if (parcelListEntity.getOrderPackageReservationStatus().equals(OrderPackageReservationStatusConstant.yiyueyue.getValue())) { + deliveryQuantity += parcelListEntity.getQuantity(); + } + if (parcelListEntity.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.yizhuangche.getValue())) { + loadingQuantity += parcelListEntity.getQuantity(); + } + if (parcelListEntity.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())) { + signingQuantity += parcelListEntity.getQuantity(); + } + + } +// int sum = parcelListEntities.stream().filter(f -> !OrderPackageStatusConstant.yiqianshou.getValue().equals(f.getOrderPackageStatus()) +// || OrderPackageLoadingStatusConstant.weizhuancghe.getValue().equals(f.getOrderPackageLoadingStatus()) +// || OrderPackageReservationStatusConstant.daiyuyue.getValue().equals(f.getOrderPackageReservationStatus()) +// ).mapToInt(DistributionParcelListEntity::getQuantity).sum(); + int a = parcelListEntities.stream().filter(f -> !OrderPackageStatusConstant.yiqianshou.getValue().equals(f.getOrderPackageStatus()) && OrderPackageLoadingStatusConstant.weizhuancghe.getValue().equals(f.getOrderPackageLoadingStatus())) + .mapToInt(DistributionParcelListEntity::getQuantity).sum(); + inWarehouseQuantity = a; + + stockArticleEntity.setHandQuantity(inWarehouseQuantity); + stockArticleEntity.setDeliveryQuantity(deliveryQuantity); + stockArticleEntity.setSigninQuantity(signingQuantity); + if (totalNumber != 0) { + + if (totalNumber == deliveryQuantity) { + stockArticleEntity.setReservationStatus(OrderReservationStatusConstant.yiyueyue.getValue()); + } else { + stockArticleEntity.setReservationStatus(OrderReservationStatusConstant.bufenyuyue.getValue()); + } + if (deliveryQuantity == 0) { + stockArticleEntity.setReservationStatus(OrderReservationStatusConstant.daiyuyue.getValue()); + } + + + //未签收的情况下分析订单的装车状态,此时该订单未有包件进行其拿手 + if (signingQuantity == 0) { + if (totalNumber == loadingQuantity) { + stockArticleEntity.setOrderStatus(OrderStatusConstant.chuku.getValue()); + } else { + stockArticleEntity.setOrderStatus(OrderStatusConstant.bufenchuku.getValue()); + } + if (loadingQuantity == 0) { + if (totalNumber == inWarehouseQuantity) { + stockArticleEntity.setOrderStatus(OrderStatusConstant.ruku.getValue()); + } else { + stockArticleEntity.setOrderStatus(OrderStatusConstant.bufenruku.getValue()); + } + } + } else { + //订单存在签收数据了,此时就需要进行签收状态的判断 + if (totalNumber == signingQuantity) { + stockArticleEntity.setOrderStatus(OrderStatusConstant.qianshou.getValue()); + } else { + stockArticleEntity.setOrderStatus(OrderStatusConstant.bufenqianshou.getValue()); + } + } + if (inWarehouseQuantity > 0) { + stockArticleEntity.setGenre(1); + } + this.updateById(stockArticleEntity); + } + } else if (IsOrNoConstant.yes.getValue().equals(stockArticleEntity.getIsZero())) { + //零担订单维护 + List parcelNumberEntities = distributionParcelNumberMapper.selectList(Wrappers.query().lambda() + .eq(DistributionParcelNumberEntity::getStockArticleId, s) + ); + //在库数量 + int inWarehouseQuantity = 0; + //装车数量 + int loadingQuantity = 0; + //配送件数 + int deliveryQuantity = 0; + //签收件数 + int signingQuantity = 0; + + if (Func.isNotEmpty(parcelNumberEntities)) { + //在库数量 + inWarehouseQuantity = parcelNumberEntities.stream().mapToInt(DistributionParcelNumberEntity::getHandQuantity).sum(); + deliveryQuantity = parcelNumberEntities.stream().mapToInt(DistributionParcelNumberEntity::getDeliveryQuantity).sum(); + loadingQuantity = parcelNumberEntities.stream().mapToInt(DistributionParcelNumberEntity::getOutboundQuantity).sum(); + signingQuantity = parcelNumberEntities.stream().mapToInt(DistributionParcelNumberEntity::getSigninQuantity).sum(); + log.info("############维护零担数量deliveryQuantity:{}", deliveryQuantity); + log.info("############维护零担数量loadingQuantity:{}", loadingQuantity); + log.info("############维护零担数量inWarehouseQuantity:{}", inWarehouseQuantity); + log.info("############维护零担数量signingQuantity:{}", signingQuantity); + log.info("############维护零担数量TotalNumber:{}", stockArticleEntity.getTotalNumber()); + if (stockArticleEntity.getTotalNumber() == loadingQuantity) { + //此时的出库和总数一致,该零担此时全部进行出库 + stockArticleEntity.setOrderStatus(OrderStatusConstant.chuku.getValue()); + } else if (stockArticleEntity.getTotalNumber() > loadingQuantity) { + stockArticleEntity.setOrderStatus(OrderStatusConstant.bufenchuku.getValue()); + } else { + stockArticleEntity.setOrderStatus(OrderStatusConstant.ruku.getValue()); + } + if ((loadingQuantity + deliveryQuantity) == 0) { + if (stockArticleEntity.getTotalNumber() == inWarehouseQuantity) { + stockArticleEntity.setOrderStatus(OrderStatusConstant.ruku.getValue()); + } else if (inWarehouseQuantity > 0) { + stockArticleEntity.setOrderStatus(OrderStatusConstant.bufenruku.getValue()); + } + } else { + if ((loadingQuantity + deliveryQuantity) == stockArticleEntity.getTotalNumber()) { + //无在库数量则无法进行预约 + stockArticleEntity.setReservationStatus(OrderReservationStatusConstant.yiyueyue.getValue()); + } else if ((loadingQuantity + deliveryQuantity) > 0) { + stockArticleEntity.setReservationStatus(OrderReservationStatusConstant.bufenyuyue.getValue()); + } + + } + if (signingQuantity == 0) { + stockArticleEntity.setOrderStatus(OrderStatusConstant.ruku.getValue()); + } else { + if (stockArticleEntity.getTotalNumber() == signingQuantity) { + stockArticleEntity.setOrderStatus(OrderStatusConstant.qianshou.getValue()); + } else if (stockArticleEntity.getTotalNumber() > signingQuantity) { + stockArticleEntity.setOrderStatus(OrderStatusConstant.bufenqianshou.getValue()); + } + } + + //维护订单的在库件数 + stockArticleEntity.setHandQuantity(inWarehouseQuantity); + //维护订单的配送件数 +// deliveryQuantity = parcelNumberEntities.stream().mapToInt(DistributionParcelNumberEntity::getDeliveryQuantity).sum() + parcelNumberEntities.stream().mapToInt(DistributionParcelNumberEntity::getSigninQuantity).sum() + parcelNumberEntities.stream().mapToInt(DistributionParcelNumberEntity::getOutboundQuantity).sum(); + stockArticleEntity.setDeliveryQuantity(loadingQuantity); + stockArticleEntity.setSigninQuantity(signingQuantity); +// stockArticleEntity.setDeliveryQuantity(deliveryQuantity); + if (inWarehouseQuantity > 0) { + stockArticleEntity.setGenre(1); + } + this.updateById(stockArticleEntity); + } + + } + + } + } + + /** + * @param orderCode + * @param warehouseId + * @return + */ + @Override + public UpDownStockupAreaVO findUpDownStockupZeroByOrderCodeAndWarehouseId(String orderCode, Long warehouseId) { + + return baseMapper.findUpDownStockupZeroByOrderCodeAndWarehouseId(orderCode, warehouseId); + } + + /** + * @param type * @param code * @return */ @@ -1956,6 +2480,93 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl moldList = new ArrayList<>(); + data.forEach(map -> { + try { + String popHtml = TemplateUtil.popTemplate("订单码", map, html); + moldList.add(popHtml); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + orderCodeDataVO.setMoldList(moldList); + + + return orderCodeDataVO; + } + + + @Override + public OrderCodeDataVO showOrderCodeByCode(Map params) throws Exception { + OrderCodeDataVO orderCodeDataVO = new OrderCodeDataVO(); + List> data = new ArrayList<>(); + BasicPrintTemplateEntity template = basicPrintTemplateClient.getPrintTemplate(PrintTemplateStatusConstant.daiqueren_14.getValue()); + if (ObjectUtil.isEmpty(template)) { + throw new ServiceException("模板内容未找到"); + } + + String html = TemplateUtil.getTemplateByUrl(template.getTemplateUrl()); + orderCodeDataVO.setTemplateHtml(html); + orderCodeDataVO.setTemplateId(template.getId()); + Long warehouseId = (Long) params.get("warehouseId"); + String orderCodes = (String) params.get("orderCodes"); + + String[] orderCodesArray = orderCodes.split(","); + if (ObjectUtils.isNull(orderCodesArray)) { + throw new ServiceException("参数错误"); + + } + for (String orderCode : orderCodesArray) { + DistributionStockArticleEntity stockArticleEntity = findStockArticleByOrderCodeAndWarehouseId(orderCode, warehouseId); + if(Objects.isNull(stockArticleEntity)){ + continue; + } + + Long orderId = stockArticleEntity.getId(); + String waybillNo = stockArticleEntity.getWaybillNumber(); + String descriptionGoods = stockArticleEntity.getDescriptionGoods(); + Integer totalNumber = stockArticleEntity.getTotalNumber(); + + Map map = new HashMap<>(); + map.put("id", orderId); + String filename = QRCodeUtil.createCodeToFile(orderCode); + map.put("orderCodeImage", QRCodeUtil.getEmpAutograph(filename)); + // 订单号 生成二维码 + String fileTypeName = QRCodeUtil.createCodeToFile(orderCode); + map.put("imgType", QRCodeUtil.getEmpAutograph(fileTypeName)); + if (orderCode.equals(waybillNo)) { + map.put("product", descriptionGoods + "(" + totalNumber + ")"); + } else { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("stock_article_id", orderId); + List list = distributionParcelListService.list(queryWrapper); + StringBuilder product = new StringBuilder(); + for (DistributionParcelListEntity parcelListEntity : list) { + String firsts = parcelListEntity.getFirsts(); + Integer quantity = parcelListEntity.getQuantity(); + if (StringUtils.isBlank(product)) { + product.append(firsts).append("(").append(quantity).append(")"); + } else { + product.append(",").append(firsts).append("(").append(quantity).append(")"); + } + } + map.put("product", product.toString()); + } + + data.add(map); + } + orderCodeDataVO.setDataList(data); + + List moldList = new ArrayList<>(); + data.forEach(map -> { + try { + String popHtml = TemplateUtil.popTemplate("订单码", map, html); + moldList.add(popHtml); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + return orderCodeDataVO; } @@ -1998,29 +2609,31 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl myWarehouseList = warehouseClient.getMyWarehouseList(); BasicdataWarehouseEntity currentWarehouse = warehouseClient.getMyCurrentWarehouse(); - List collect = myWarehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + List collect = null; - if (collect.size() > 1) { - stockArticleEntity.setWarehouseIdList(collect); - } else if (collect.size() == 1) { - stockArticleEntity.setWarehouseId(collect.get(0)); - } - if (Func.isNotEmpty(currentWarehouse)){ - stockArticleEntity.setWarehouseIdList(null); - stockArticleEntity.setWarehouseId(currentWarehouse.getId()); + if(ObjectUtils.isNotNull(currentWarehouse)){ + collect = new ArrayList<>(); + collect.add(currentWarehouse.getId()); + }else{ + collect = myWarehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); } - IPage distributionStockArticleEntityIPage = baseMapper.pageSignforListOwe(page, stockArticleEntity); + log.info(">>>>>>>>>>>>>当前仓库:{}",collect); + IPage distributionStockArticleEntityIPage = baseMapper.pageSignforListOwe(page, stockArticleEntity,collect); //处理创建人 distributionStockArticleEntityIPage.getRecords().forEach(a -> { if (Func.isNotEmpty(a.getCreateUser())) { R userR = userClient.userInfoById(a.getCreateUser()); a.setCreateUserName(userR.getData().getName()); } + if (!Func.isEmpty(a.getReservationIds())) { + //构建签收信息 + List> mapList = distributionSignforMapper.getByReservationIds(Func.toLongList(a.getReservationIds())); + if (!mapList.isEmpty()) { + a.setInfo(mapList); + } + } }); return distributionStockArticleEntityIPage; @@ -2028,7 +2641,7 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl myWarehouseList = warehouseClient.getMyWarehouseList(); BasicdataWarehouseEntity currentWarehouse = warehouseClient.getMyCurrentWarehouse(); - List collect = myWarehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + List warehouseIdList = null; - if (collect.size() > 1) { - stockArticleEntity.setWarehouseIdList(collect); - } else if (collect.size() == 1) { - stockArticleEntity.setWarehouseId(collect.get(0)); + if (ObjectUtils.isNotNull(currentWarehouse)){ + warehouseIdList = new ArrayList<>(); + warehouseIdList.add(currentWarehouse.getId()); + }else{ + warehouseIdList=myWarehouseList.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); } - if (Func.isNotEmpty(currentWarehouse)){ - stockArticleEntity.setWarehouseIdList(null); - stockArticleEntity.setWarehouseId(currentWarehouse.getId()); - } - IPage distributionStockArticleEntityIPage = baseMapper.pageSignforListOwe(page, stockArticleEntity); + +// if (collect.size() > 1) { +// stockArticleEntity.setWarehouseIdList(collect); +// } else if (collect.size() == 1) { +// stockArticleEntity.setWarehouseId(collect.get(0)); +// } +// if (Func.isNotEmpty(currentWarehouse)) { +// stockArticleEntity.setWarehouseIdList(null); +// stockArticleEntity.setWarehouseId(currentWarehouse.getId()); +// } + IPage distributionStockArticleEntityIPage = baseMapper.pageSignforListOwe(page, stockArticleEntity,warehouseIdList); //处理创建人 List signForStockArticleExcels = new ArrayList<>(); distributionStockArticleEntityIPage.getRecords().forEach(a -> { @@ -2090,6 +2710,7 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl userR = userClient.userInfoById(a.getCreateUser()); a.setCreateUserName(userR.getData().getName()); } + DistributionSignForStockArticleExcel stockArticleExcel = BeanUtil.copy(a, DistributionSignForStockArticleExcel.class); signForStockArticleExcels.add(stockArticleExcel); }); @@ -2098,6 +2719,88 @@ public class DistributionStockArticleServiceImpl extends BaseServiceImpl distributionStockArticleEntities = this.listByIds(Func.toLongList(orderIds)); + List list = new ArrayList<>(); + for (DistributionStockArticleEntity distributionStockArticleEntity : distributionStockArticleEntities) { + DistributionStockArticleEntity stockArticleEntity = new DistributionStockArticleEntity(); + stockArticleEntity.setId(distributionStockArticleEntity.getId()); + if (Func.isNotEmpty(distributionStockArticleEntity.getConsigneeUnit())) { + //查询客户 + List clientByName = basicdataClientClient.getClientByName(distributionStockArticleEntity.getConsigneeUnit()); + if (!clientByName.isEmpty()) { + BasicdataClientEntity basicdataClientEntity = clientByName.get(0); + stockArticleEntity.setMallId(basicdataClientEntity.getId()); + stockArticleEntity.setMallName(basicdataClientEntity.getClientName()); + stockArticleEntity.setMallCode(basicdataClientEntity.getClientCode()); + } else { + List> maps = baseMapper.selectAdvance(distributionStockArticleEntity.getOrderCode()); + if (!maps.isEmpty()) { + String dealerName = (String) maps.get(0).get("dealer_name"); + String dealerCode = (String) maps.get(0).get("dealer_code"); + stockArticleEntity.setMallName(dealerName); + stockArticleEntity.setMallCode(dealerCode); + } else { + stockArticleEntity.setMallName(distributionStockArticleEntity.getConsigneeUnit()); + } + } + list.add(stockArticleEntity); + } else { + + + } + + + } + + boolean flag = this.updateBatchById(list); + log.info(">>>>>>>>>>>>>>>>>>>维护订单商场信息,:{}", flag); + return null; + } + + @Override + public void updateCustomerAllByOrderCode(String data) { + log.info("欧派工厂推送数据更新订单客户信息:{}", data); + this.baseMapper.updateCustomerAllByOrderCode(JSONUtil.parseObj(data)); + } + + @Override + public Integer findOrderTotalNumByOrderCodes(List orderCodes,Long warehouseId) { + return baseMapper.findOrderTotalNumByOrderCodes(orderCodes,warehouseId); + } + + @Override + public Integer findOrderTotalNumByOrderPackageCodes(List orderPackageCodes, Long warehouseId) { + List orderCodes = distributionParcelListService.findOrderCodesByOrderPackageCodes(orderPackageCodes,warehouseId); + + return baseMapper.findOrderTotalNumByOrderCodes(orderCodes,warehouseId); + } + + @Override + public List signforListDetail(Long id) { + return baseMapper.signforListDetail(id); + } + + @Override + public void clearTraysByIds(List clearTraysStockArticleIdList) { + baseMapper.clearTraysByIds(clearTraysStockArticleIdList); + } + + @Override + public void clearAllocationByIds(List clearAllocationStockArticleIdList) { + baseMapper.clearAllocationByIds(clearAllocationStockArticleIdList); + } + @Override public R findEditCustomerLog(Long orderId) { diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockArticleStatisticsServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockArticleStatisticsServiceImpl.java index cbdec4339..d3be8b2b7 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockArticleStatisticsServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockArticleStatisticsServiceImpl.java @@ -25,9 +25,9 @@ import java.util.stream.Collectors; @Slf4j public class DistributionStockArticleStatisticsServiceImpl implements IDistributionStockArticleStatisticsService { - private DistributionStockArticleStatisticsMapper distributionStockArticleStatisticsMapper; + private final DistributionStockArticleStatisticsMapper distributionStockArticleStatisticsMapper; - private IBasicdataWarehouseClient warehouseClient; + private final IBasicdataWarehouseClient warehouseClient; @Override public DistributionStockArticleStatisticsDTO collect(DistributionStockArticleOweDTO distributionStockArticleOweDTO) { diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockListInfoServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockListInfoServiceImpl.java index 62dfb2586..83f08f0e1 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockListInfoServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockListInfoServiceImpl.java @@ -16,7 +16,6 @@ */ package com.logpm.distribution.service.impl; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.distribution.entity.DistributionStockListInfoEntity; @@ -89,4 +88,14 @@ public class DistributionStockListInfoServiceImpl extends BaseServiceImpl parcelListIds, Long stockListId) { + return baseMapper.findAllTraysByNoParcelListIdsAndStockListId(parcelListIds,stockListId); + } + + @Override + public String findAllAllocationByNoParcelListIdsAndStockListId(List parcelListIds, Long stockListId) { + return baseMapper.findAllAllocationByNoParcelListIdsAndStockListId(parcelListIds,stockListId); + } + } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockListServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockListServiceImpl.java index 1830c79b0..0cb196dda 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockListServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockListServiceImpl.java @@ -40,6 +40,7 @@ import com.logpm.distribution.service.*; import com.logpm.distribution.vo.*; import com.logpm.distribution.vo.app.DistributionMerchantStockListVO; import com.logpm.distribution.vo.app.StockMallVO; +import com.logpm.trunkline.feign.ITrunklinePackageTrackLogClient; import com.logpm.warehouse.entity.WarehouseGoodsAllocationEntity; import com.logpm.warehouse.entity.WarehouseTrayGoodsEntity; import com.logpm.warehouse.entity.WarehouseUpdownGoodsEntity; @@ -48,6 +49,7 @@ import com.logpm.warehouse.feign.IWarehouseTrayGoodsClient; import com.logpm.warehouse.feign.IWarehouseUpdownGoodsClient; import lombok.extern.slf4j.Slf4j; import org.springblade.common.constant.DictBizConstant; +import org.springblade.common.constant.WorkNodeEnums; import org.springblade.common.constant.orderpackage.OrderPackageStockupStatusConstant; import org.springblade.common.constant.printTemplate.PrintTemplateStatusConstant; import org.springblade.common.utils.QRCodeUtil; @@ -120,6 +122,9 @@ public class DistributionStockListServiceImpl extends BaseServiceImpl clearTrayStockListIds) { + baseMapper.clearTraysByIds(clearTrayStockListIds); + } + + @Override + public void clearAllocationByIds(List clearAllocationStockListIds) { + baseMapper.clearAllocationByIds(clearAllocationStockListIds); + } + @Override public OrderPackgeCodeDataVO showInventorySourcePackageCode(String incomingBatch, Long packageIds) throws Exception { @@ -1071,6 +1100,10 @@ public class DistributionStockListServiceImpl extends BaseServiceImpl aaa = new ArrayList<>(); + //增加撤销转库存品日志 + parcelListEntities.forEach(p->{ + String content = "包件在"+myCurrentWarehouse.getName()+"由"+AuthUtil.getNickName()+"撤销转库存品,"+"批次号:"+stockListEntity.getIncomingBatch()+"物料名称:"+stockListEntity.getDescriptionGoods()+"物料编码:"+stockListEntity.getCargoNumber(); + JSONObject js = handleLogJSONObject(myCurrentWarehouse, AuthUtil.getUser(), p.getOrderPackageCode(), content, WorkNodeEnums.CANCEL_STOCK_TRANSFER.getCode()); + aaa.add(js); + }); + if (!aaa.isEmpty()) { + trunklinePackageTrackLogClient.addPackageTrackLog(aaa); + } return R.success("操作成功"); } + + + + private JSONObject handleLogJSONObject(BasicdataWarehouseEntity warehouse, BladeUser user, String orderPackageCode, String content, Integer node) { + JSONObject trunklinePackageTrackLog = new JSONObject(); + trunklinePackageTrackLog.put("tenantId",user.getTenantId()); + trunklinePackageTrackLog.put("createTime",new Date()); + trunklinePackageTrackLog.put("createUser",user.getUserId()); + trunklinePackageTrackLog.put("updateUser",user.getUserId()); + trunklinePackageTrackLog.put("updateTime",new Date()); + trunklinePackageTrackLog.put("isDeleted",0); + trunklinePackageTrackLog.put("status",1); + trunklinePackageTrackLog.put("createDept",warehouse.getDepartment()); + trunklinePackageTrackLog.put("orderPackageCode",orderPackageCode); + trunklinePackageTrackLog.put("warehouseId",warehouse.getId()); + trunklinePackageTrackLog.put("warehouseName",warehouse.getName()); + trunklinePackageTrackLog.put("workNode",node); + trunklinePackageTrackLog.put("content",content); + trunklinePackageTrackLog.put("operator",user.getNickName()); + return trunklinePackageTrackLog; + } } // @Override diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockServiceImpl.java index 026f92a9c..b6643d762 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockServiceImpl.java @@ -33,6 +33,7 @@ import com.logpm.distribution.vo.DistributionStockAllocationVO; import com.logpm.distribution.vo.DistributionStockVO; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; +import org.apache.logging.log4j.util.Strings; import org.springblade.common.constant.order.OrderStockupStatusConstant; import org.springblade.common.constant.orderpackage.OrderPackageStockupStatusConstant; import org.springblade.common.constant.stockup.StockupStatusConstant; @@ -67,7 +68,7 @@ public class DistributionStockServiceImpl extends BaseServiceImplquery().lambda() .eq(DistributionStockupEntity::getId, distributionStockEntity.getStockupId()) ); - if("3".equals(distributionStockupEntity.getTypeService())){ + if ("3".equals(distributionStockupEntity.getTypeService())) { //自提 // DistrilbutionBillLadingEntity byId = distrilbutionBillLadingService.getById(reservationId); // distributionStockEntity. - }else{ + } else { DistributionReservationEntity reservationEntity = distributionReservationService.getById(reservationId); distributionStockEntity.setReservationCode(reservationEntity.getReservationCode()); } - log.info("#############repairPackageScanInfo: 补全包件扫码信息开始 coding={}",coding); + log.info("#############repairPackageScanInfo: 补全包件扫码信息开始 coding={}", coding); //查询包件信息 QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("order_package_code",coding); + queryWrapper.eq("order_package_code", coding); DistributionParcelListEntity parcelListEntity = distributionParcelListService.getOne(queryWrapper);//包件信息 - if(!Objects.isNull(parcelListEntity)){ + if (!Objects.isNull(parcelListEntity)) { DistributionStockArticleEntity byId = distributionStockArticleService.getById(parcelListEntity.getStockArticleId()); String cargoTitle = parcelListEntity.getCargoTitle();//货区 String shelfTitle = parcelListEntity.getShelfTitle();//货位 String goodsAllocation = parcelListEntity.getGoodsAllocation();//货架 - distributionStockEntity.setGoodsAllocation(cargoTitle+"-"+shelfTitle+"-"+goodsAllocation); + if (!Strings.isBlank(cargoTitle) && !Strings.isBlank(shelfTitle) && !Strings.isBlank(goodsAllocation)) { + distributionStockEntity.setGoodsAllocation(cargoTitle + "-" + shelfTitle + "-" + goodsAllocation); + } distributionStockEntity.setStockArticle(parcelListEntity.getStockArticleId()); distributionStockEntity.setGoodsName(parcelListEntity.getFirsts()); distributionStockEntity.setParcelListId(parcelListEntity.getId()); distributionStockEntity.setStockupArea(distributionStockupEntity.getStockupArea()); distributionStockEntity.setMaterialId(parcelListEntity.getMaterialId()); - if(ObjectUtils.isNotNull(byId.getMallId())){ + if (ObjectUtils.isNotNull(byId.getMallId())) { Long mallId = byId.getMallId(); distributionStockEntity.setMarketId(Optional.ofNullable(mallId).orElse(null)); } } distributionStockEntity.setConditions("1"); baseMapper.updateById(distributionStockEntity); - log.info("#############repairPackageScanInfo: 补全包件扫码信息完成 coding={}",coding); + log.info("#############repairPackageScanInfo: 补全包件扫码信息完成 coding={}", coding); } /** * MQ备货库存品扫描 + * * @param distributionStockEntity */ @Override @@ -154,21 +159,21 @@ public class DistributionStockServiceImpl extends BaseServiceImplquery().lambda() .eq(DistributionStockupEntity::getId, distributionStockEntity.getStockupId()) ); - if("3".equals(distributionStockupEntity.getTypeService())){ + if ("3".equals(distributionStockupEntity.getTypeService())) { //自提 // DistrilbutionBillLadingEntity byId = distrilbutionBillLadingService.getById(reservationId); // distributionStockEntity. - }else{ + } else { DistributionReservationEntity reservationEntity = distributionReservationService.getById(reservationId); distributionStockEntity.setReservationCode(reservationEntity.getReservationCode()); } - log.info("#############repairPackageScanInfo: 补全库存品扫码信息完成 stockListId={}",stockListId); + log.info("#############repairPackageScanInfo: 补全库存品扫码信息完成 stockListId={}", stockListId); //查询包件信息 QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("id",stockListId); + queryWrapper.eq("id", stockListId); DistributionStockListEntity stockListEntity = distributionStockListService.getOne(queryWrapper);//包件信息 DistributionReservationEntity reservationEntity = distributionReservationService.getById(reservationId); - if(!Objects.isNull(stockListEntity)){ + if (!Objects.isNull(stockListEntity)) { distributionStockEntity.setGoodsAllocation(stockListEntity.getStorageLocation()); distributionStockEntity.setGoodsName(stockListEntity.getDescriptionGoods()); distributionStockEntity.setUnpackingQuantity(stockListEntity.getUnpackingQuantity()); @@ -184,13 +189,10 @@ public class DistributionStockServiceImpl extends BaseServiceImpl stockVOList = baseMapper.selectReservationDelivery(String.valueOf(distributionStocks.getStockupId())); if (stockVOList.isEmpty()) { continue; } - if(ObjectUtils.isNotNull(distributionStocks.getStockupType()) && "ZT".equals(distributionStocks.getStockupType())){ + if (ObjectUtils.isNotNull(distributionStocks.getStockupType()) && "ZT".equals(distributionStocks.getStockupType())) { List list1 = distrilbutionBillPackageService.list(Wrappers.query().lambda() .eq(DistrilbutionBillPackageEntity::getParceListId, i) .apply("packet_bar_status in (1,3)") .orderByDesc(DistrilbutionBillPackageEntity::getCreateTime) ); stockEntity.setBillLadingId(list1.get(0).getBillLadingId()); - }else{ + } else { List list1 = distributionReservationPackageService.list(Wrappers.query().lambda() .eq(DistributionReservationPackageEntity::getParceListId, i) .apply("packet_bar_status in (1,3)") @@ -257,31 +259,31 @@ public class DistributionStockServiceImpl extends BaseServiceImplquery().lambda().eq()); //添加备货数据 - if(ObjectUtils.isNotNull(distributionStocks.getStockupType()) && "ZT".equals(distributionStocks.getStockupType())){ + if (ObjectUtils.isNotNull(distributionStocks.getStockupType()) && "ZT".equals(distributionStocks.getStockupType())) { //自提 - DistrilbutionBillLadingEntity billLadingEntity = distrilbutionBillLadingMapper.selectById(stockEntity.getBillLadingId()); - if(ObjectUtils.isNotNull(billLadingEntity)){ - DistrilbutionBillLadingEntity billLading = new DistrilbutionBillLadingEntity(); - billLading.setId(billLadingEntity.getId()); - billLading.setStockOrderQuantity(billLadingEntity.getStockOrderQuantity()+1); - distrilbutionBillLadingMapper.updateById(billLading); - } - }else{ + DistrilbutionBillLadingEntity billLadingEntity = distrilbutionBillLadingMapper.selectById(stockEntity.getBillLadingId()); + if (ObjectUtils.isNotNull(billLadingEntity)) { + DistrilbutionBillLadingEntity billLading = new DistrilbutionBillLadingEntity(); + billLading.setId(billLadingEntity.getId()); + billLading.setStockOrderQuantity(billLadingEntity.getStockOrderQuantity() + 1); + distrilbutionBillLadingMapper.updateById(billLading); + } + } else { //商 市 DistributionReservationEntity byId2 = distributionReservationService.getById(stockEntity.getReservationId()); - if(ObjectUtils.isNotNull(byId2)){ + if (ObjectUtils.isNotNull(byId2)) { DistributionReservationEntity reservationEntity = new DistributionReservationEntity(); reservationEntity.setId(byId2.getId()); - int yu =byId2.getReservationNum() + byId2.getReservationStockListNum(); - int bei = byId2.getStockOrderQuantity()+1 + byId2.getReserveQuantity(); - if(bei >= yu){ - reservationEntity.setStockOrderQuantity(byId2.getStockOrderQuantity()+1); + int yu = byId2.getReservationNum() + byId2.getReservationStockListNum(); + int bei = byId2.getStockOrderQuantity() + 1 + byId2.getReserveQuantity(); + if (bei >= yu) { + reservationEntity.setStockOrderQuantity(byId2.getStockOrderQuantity() + 1); reservationEntity.setStockStatus("3"); reservationEntity.setEndTimeStocking(new Date()); - }else{ - reservationEntity.setStockOrderQuantity(byId2.getStockOrderQuantity()+1); + } else { + reservationEntity.setStockOrderQuantity(byId2.getStockOrderQuantity() + 1); reservationEntity.setStockStatus("2"); - if(ObjectUtils.isNull(reservationEntity.getStartTimeStocking())){ + if (ObjectUtils.isNull(reservationEntity.getStartTimeStocking())) { reservationEntity.setStartTimeStocking(new Date()); } } @@ -289,35 +291,35 @@ public class DistributionStockServiceImpl extends BaseServiceImpl stockVOptional = Optional.ofNullable(distributionStockVO); - if(stockVOptional.isPresent()){ + if (stockVOptional.isPresent()) { //已经备货完成 - if(distributionStockVO.getScanned() == 0){ + if (distributionStockVO.getScanned() == 0) { //修改 DistributionStockArticleEntity distributionStockArticle = new DistributionStockArticleEntity(); distributionStockArticle.setId(distributionStockVO.getStockArticleId()); @@ -325,74 +327,74 @@ public class DistributionStockServiceImpl extends BaseServiceImpl= ii){ + if (i >= ii) { //查询备货状态 - getUpdateStockup(pageId,2); + getUpdateStockup(pageId, 2); } - }else{ + } else { //查询备货状态 - getUpdateStockup(pageId,2); + getUpdateStockup(pageId, 2); } } } - break; + break; case 3://自提 DistributionStockupInfoEntity one = distributionStockupInfoService.getOne(Wrappers.query().lambda() - .eq(DistributionStockupInfoEntity::getStockupId, pageId) + .eq(DistributionStockupInfoEntity::getStockupId, pageId) ); DistributionStockVO distributionStockSelf = baseMapper.selectStockupInfoSelf(pageId); //查询库存品 DistributionDeliveryDetailsVO distributionSelf = distributionDeliveryDetailsService.selectCount(pageId); - int ys = 0; //已扫 - int qb = 0; //全部 - if(ObjectUtils.isNotNull(distributionSelf)){ - Integer wholeNum = 0 ; - if(ObjectUtils.isNull(distributionSelf.getWholeNum())){ + int ys = 0; //已扫 + int qb = 0; //全部 + if (ObjectUtils.isNotNull(distributionSelf)) { + Integer wholeNum = 0; + if (ObjectUtils.isNull(distributionSelf.getWholeNum())) { qb += 0; - }else{ + } else { qb += distributionSelf.getWholeNum(); } //有库存品 ys += distributionSelf.getEsauNum(); } - if(ObjectUtils.isNotNull(distributionStockSelf)){ + if (ObjectUtils.isNotNull(distributionStockSelf)) { //有订单 ys += distributionStockSelf.getScanned(); qb += distributionStockSelf.getWhole(); } - if(ys + num >= qb){ + if (ys + num >= qb) { //修改备货任务 - getUpdateStockup(pageId,2); + getUpdateStockup(pageId, 2); DistrilbutionBillLadingEntity billLadingEntity = distrilbutionBillLadingMapper.selectById(one.getReservationId()); DistrilbutionBillLadingEntity billLading = new DistrilbutionBillLadingEntity(); billLading.setId(billLadingEntity.getId()); billLading.setStockStatus("3"); billLading.setEndTimeStocking(new Date()); distrilbutionBillLadingMapper.updateById(billLading); - }else{ + } else { //没有完成 - getUpdateStockup(pageId,1); + getUpdateStockup(pageId, 1); } - break; + break; } @@ -400,13 +402,14 @@ public class DistributionStockServiceImpl extends BaseServiceImpl stockEntityList = baseMapper.selectList(Wrappers.query().lambda() .eq(ObjectUtils.isNotNull(id), DistributionStockEntity::getStockArticle, id) .eq(DistributionStockEntity::getStockupId, parseLong) @@ -434,12 +438,12 @@ public class DistributionStockServiceImpl extends BaseServiceImpl entityList = this.list(Wrappers.query().lambda() .eq(DistributionStockupInfoEntity::getReservationId, reservationId) - .ne(DistributionStockupInfoEntity::getStockUpType, 3) .ne(DistributionStockupInfoEntity::getStockStatus, "4") ); if (entityList.size()==1){ @@ -131,7 +130,6 @@ public class DistributionStockupInfoServiceImpl extends BaseServiceImpl billLadingentityList = this.list(Wrappers.query().lambda() .eq(DistributionStockupInfoEntity::getReservationId, reservationId) - .eq(DistributionStockupInfoEntity::getStockUpType, 3) .ne(DistributionStockupInfoEntity::getStockStatus, "4") ); if (billLadingentityList.size() == 1){ @@ -139,6 +137,7 @@ public class DistributionStockupInfoServiceImpl extends BaseServiceImpl distributionStockListSelfNumVOS = distributionStockupInfoService.selectStockListSelfNum(s); - - if (!distributionStockListSelfNumVOS.isEmpty()) { - List listDetailEntities = new ArrayList<>(); - - distributionStockListSelfNumVOS.forEach(i -> { - if (ObjectUtils.isNotNull(i)) { - Integer quantity = i.getQuantity(); - while (quantity > 0) { - DisStockListDetailEntity disStockListDetail = new DisStockListDetailEntity(); - disStockListDetail.setNum(1); - disStockListDetail.setSku(i.getSku()); - disStockListDetail.setWarehouseId(i.getWarehouseId()); - disStockListDetail.setWarehouseName(i.getWarehouseName()); - disStockListDetail.setReservationId(i.getBillLadingId()); - disStockListDetail.setStockPackageStatus("1"); - disStockListDetail.setStockListId(i.getStockListId()); - disStockListDetail.setStockLockingStatus(StockLockingStatusConstant.wuzhuangche.getValue()); - disStockListDetail.setStockStatus(StockStatusConstant.daibangding.getValue()); - disStockListDetail.setStockSignfoStatus(StockSignfoStatusConstant.daiqianshou.getValue()); - disStockListDetail.setStockType("10"); - listDetailEntities.add(disStockListDetail); - quantity--; - } - } - }); - if (!listDetailEntities.isEmpty()) { - disStockListDetailService.saveBatch(listDetailEntities); - } - - } - - } +// DistributionStockupEntity stockupEntity = distributionStockupService.selectById(s); +// if ("3".equals(stockupEntity.getTypeService())) { +// //自提 添加库存平信息 +// List distributionStockListSelfNumVOS = distributionStockupInfoService.selectStockListSelfNum(s); +// +// if (!distributionStockListSelfNumVOS.isEmpty()) { +// List listDetailEntities = new ArrayList<>(); +// +// distributionStockListSelfNumVOS.forEach(i -> { +// if (ObjectUtils.isNotNull(i)) { +// Integer quantity = i.getQuantity(); +// while (quantity > 0) { +// DisStockListDetailEntity disStockListDetail = new DisStockListDetailEntity(); +// disStockListDetail.setNum(1); +// disStockListDetail.setSku(i.getSku()); +// disStockListDetail.setWarehouseId(i.getWarehouseId()); +// disStockListDetail.setWarehouseName(i.getWarehouseName()); +// disStockListDetail.setReservationId(i.getBillLadingId()); +// disStockListDetail.setStockPackageStatus("1"); +// disStockListDetail.setStockListId(i.getStockListId()); +// disStockListDetail.setStockLockingStatus(StockLockingStatusConstant.wuzhuangche.getValue()); +// disStockListDetail.setStockStatus(StockStatusConstant.daibangding.getValue()); +// disStockListDetail.setStockSignfoStatus(StockSignfoStatusConstant.daiqianshou.getValue()); +// disStockListDetail.setStockType("10"); +// listDetailEntities.add(disStockListDetail); +// quantity--; +// } +// } +// }); +// if (!listDetailEntities.isEmpty()) { +// disStockListDetailService.saveBatch(listDetailEntities); +// } +// +// } +// +// } // else{ // //商 市 // distributionStockupInfoService.selectStockListNum(s); @@ -290,27 +291,26 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl pageList(IPage page, Map distributionStockup) { DistributionStockupEntity distributionStockupEntity = JSON.parseObject(JSON.toJSONString(distributionStockup), DistributionStockupEntity.class); BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + + List warehouseIdList = new ArrayList<>(); if (ObjectUtils.isNotNull(myCurrentWarehouse)) { //获取当前登录人仓库 - distributionStockupEntity.setWarehouseId(myCurrentWarehouse.getId()); + warehouseIdList.add(myCurrentWarehouse.getId()); } else { //获取当前登录人仓库 List myWatchWarehouse = basicdataWarehouseClient.getMyWatchWarehouse(); //取出id List collect = myWatchWarehouse.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); - distributionStockupEntity.setWarehouseIdList(collect); + warehouseIdList.addAll(collect); } - distributionStockupEntity.setTenantId(AuthUtil.getTenantId()); if ("3".equals(distributionStockupEntity.getTypeService())) { //自 - return baseMapper.pageOweList(page, distributionStockupEntity); + return baseMapper.pageOweList(page, distributionStockupEntity,warehouseIdList); } else { //商 市 - return baseMapper.pageList(page, distributionStockupEntity); + return baseMapper.pageList(page, distributionStockupEntity,warehouseIdList); } - - } @Override @@ -344,7 +344,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl list = baseMapper.selectStockupClientInfoSelf(stockupDTO); + list.forEach(i -> { QueryWrapper queryWrapper = new QueryWrapper<>(); //查询有没有零担数据 @@ -416,8 +423,10 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl list2 = distrilbutionBillStockService.listPackageSelf(i.getReservationId()); - i.setPlanNum(i.getPlanNum() + list2.size()); + for (String s : split) { + List list2 = distrilbutionBillStockService.listPackageSelf(Long.parseLong(s)); + i.setPlanNum(i.getPlanNum() + list2.size()); + } List listStock = distributionStockService.list(Wrappers.query().lambda() .eq(DistributionStockEntity::getBillLadingId, i.getReservationId()) .eq(DistributionStockEntity::getStockupId, stockupDTO.getStockupId()) @@ -429,7 +438,10 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); @@ -461,7 +473,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl list1 = reservationZeroPackageService.list(queryWrapper); intToStrDistributionStockupListVO(distributionStockupListVO); - distributionStockupListVO.setReservationId(Long.parseLong(split[i])); + distributionStockupListVO.setReservationId(stockupDTO.getReservationId() + ""); distributionStockupListVO.setPlanNum(distributionStockupListVO.getPlanNum() + list1.stream().mapToInt(DistributionReservationZeroPackageEntity::getQuantity).sum()); List list2 = distributionStockService.list(Wrappers.query().lambda() .eq(DistributionStockEntity::getReservationId, stockupDTO.getReservationId()) @@ -483,7 +495,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl packagePallet, List stockListPallet) { - Set set = new HashSet<>(packagePallet); + Set set = new HashSet<>(packagePallet); for (String pallet : stockListPallet) { if (StringUtil.isBlank(pallet)) { @@ -508,7 +520,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl packageAllocation, List stockListAllocation) { - Set set = new HashSet<>(packageAllocation); + Set set = new HashSet<>(packageAllocation); for (String allocation : stockListAllocation) { if (StringUtil.isBlank(allocation)) { @@ -720,7 +732,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl zeroOrderList = distrilbutionBillLadingService.selectBillLadingZeroPackageList(reservationId); - if (Func.isNotEmpty(zeroOrderList)){ + if (Func.isNotEmpty(zeroOrderList)) { // List zeroTrayInfo = getZeroTrayInfo(zeroOrderList); // if (!zeroTrayInfo.isEmpty()) { // list = zeroTrayInfo; @@ -834,11 +846,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl selectStockupStockList(StockupDTO stockupDTO) { BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); - if (Func.isEmpty(myCurrentWarehouse)){ - log.error("###########myCurrentWarehouse:{}",myCurrentWarehouse); + if (Func.isEmpty(myCurrentWarehouse)) { + log.error("###########myCurrentWarehouse:{}", myCurrentWarehouse); return null; } @@ -1174,7 +1166,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl allocationInforByIds = warehouseGoodsAllocationClient.getAllocationInforByIds(ids); @@ -1194,29 +1186,29 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl list = distributionReservationService.selectStockupStockList(reservationId,myCurrentWarehouse.getId(),mallName); - for (DistributionStockupStockListVO distributionStockupStockListVO : list) { - if (distributionStockupStockListVO.getPlanNum().equals(distributionStockupStockListVO.getRealNum())) { - distributionStockupStockListVO.setCompleteStact(true); - } - if (Func.isNotEmpty(distributionStockupStockListVO.getAllocations())) { + List list = distributionReservationService.selectStockupStockList(reservationId, myCurrentWarehouse.getId(), mallName); + for (DistributionStockupStockListVO distributionStockupStockListVO : list) { + if (distributionStockupStockListVO.getPlanNum().equals(distributionStockupStockListVO.getRealNum())) { + distributionStockupStockListVO.setCompleteStact(true); + } + if (Func.isNotEmpty(distributionStockupStockListVO.getAllocations())) { - String[] ids = distributionStockupStockListVO.getAllocations().split(","); + String[] ids = distributionStockupStockListVO.getAllocations().split(","); HashSet strings = new HashSet(CollUtil.newArrayList(ids)); String res = strings.stream().map(Object::toString).collect(Collectors.joining(",")); @@ -1224,19 +1216,19 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl allocationInforByIds = warehouseGoodsAllocationClient.getAllocationInforByIds(newIds); - for (WarehouseGoodsAllocationEntity allocationInforById : allocationInforByIds) { - if (distributionStockupStockListVO.getAllocationList() == null) { - distributionStockupStockListVO.setAllocationList(new ArrayList<>()); - } - Map map = new HashMap<>(); - map.put("id", allocationInforById.getId()); - map.put("name", allocationInforById.getQrCode()); - distributionStockupStockListVO.getAllocationList().add(map); - } - } + for (WarehouseGoodsAllocationEntity allocationInforById : allocationInforByIds) { + if (distributionStockupStockListVO.getAllocationList() == null) { + distributionStockupStockListVO.setAllocationList(new ArrayList<>()); + } + Map map = new HashMap<>(); + map.put("id", allocationInforById.getId()); + map.put("name", allocationInforById.getQrCode()); + distributionStockupStockListVO.getAllocationList().add(map); + } + } - } + } return list; } @@ -1649,7 +1641,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl { i.setStockupStatusName(DictBizCache.getValue(DictBizConstant.STOCKUP_STATUS, i.getStockupStatus())); - if(ObjectUtils.isNotNull(i.getStockStatus())){ - switch (i.getStockStatus()){ + if (ObjectUtils.isNotNull(i.getStockStatus())) { + switch (i.getStockStatus()) { case "10": i.setStockStatusName("待备货"); break; @@ -1709,7 +1701,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImplquery().lambda() .eq(DistributionStockupInfoEntity::getReservationId, reservationId) + .ne(DistributionStockupInfoEntity::getStockStatus, "4") ); if (ObjectUtils.isNotNull(one) && "3".equals(one.getStockUpType())) { @@ -1835,6 +1828,10 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl stock = new AtomicReference<>(false); + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if (Func.isEmpty(myCurrentWarehouse.getId())) { + return Resp.scanFail("未授权!!!", "未授权"); + } DistributionStockupInfoEntity one = distributionStockupInfoService.getOne(Wrappers.query().lambda() .eq(DistributionStockupInfoEntity::getReservationId, stockupDTO.getReservationId()) @@ -1935,6 +1932,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl getRoleList() { //获取当前登录用户 BladeUser user = AuthUtil.getUser(); - log.info(">>>>>>>>>>>>>>>user:{}",user); - String tenantId = user.getTenantId(); + log.info(">>>>>>>>>>>>>>>user:{}", user); + String tenantId = user.getTenantId(); // String deptId = user.getDeptId(); //查询备货岗位 List warehouseType = DictBizCache.getList("stock_personnel"); @@ -2406,13 +2416,13 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl> listR = userSearchClient.listByRole(roleIds); //查询角色下的所有人员数据 - log.info(">>>>>>>>>>>>>>>>>>>>>listR,:{}",listR); + log.info(">>>>>>>>>>>>>>>>>>>>>listR,:{}", listR); BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); //有没有选择仓库信息 if (ObjectUtils.isNotNull(myCurrentWarehouse)) { if (!listR.getData().isEmpty()) { List collect = listR.getData().stream().filter(i -> - ObjectUtils.isNotNull(i.getDeptId()) && i.getDeptId().contains(myCurrentWarehouse.getDepartment().toString()) + ObjectUtils.isNotNull(i.getDeptId()) && i.getDeptId().contains(myCurrentWarehouse.getDepartment().toString()) ).collect(Collectors.toList()); return collect; } else { @@ -2477,194 +2487,408 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl entityList = distributionStockupInfoService.list(Wrappers.query().lambda() + .eq(DistributionStockupInfoEntity::getReservationId, stockupDTO.getReservationId()) + .eq(DistributionStockupInfoEntity::getStockupId, stockupDTO.getStockupId()) + ); + if (!entityList.isEmpty()) { + boolean flag = entityList.stream().allMatch(a -> "4".equals(a.getStockStatus())); + if (flag) { + log.error(method + "备货任务已取消:{}", stockupDTO.getReservationId()); + return Resp.scanFail("备货任务已取消", "备货任务已取消"); + } + } else { + return Resp.scanFail("备货任务已取消", "备货任务已取消"); - //判断是否备货完成 - for (StockupZeroVO i : stockupDTO.getList()) { - //查询是否备货完成 - DistributionReservationZeroPackageEntity one = reservationZeroPackageService.getOne(Wrappers.query().lambda() - .eq(DistributionReservationZeroPackageEntity::getZeroPackageStatus, "1") - .eq(DistributionReservationZeroPackageEntity::getId, i.getId()) - ); - + } + //查询订单在库数量是否满足备货 + DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(stockupDTO.getStockArticleId()); + if (ObjectUtils.isNull(stockArticleEntity)) { + log.error(method + "查询订单信息错误OrderId:{}", stockupDTO.getStockArticleId()); + return R.fail(3002, "订单信息错误 !"); + } + //查询库内数量是否满足此次操作数量 + if (stockArticleEntity.getHandQuantity() < stockupDTO.getNum()) { + log.error(method + stockArticleEntity.getOrderCode() + "在库数量不足:{}", stockupDTO.getStockArticleId()); + return R.fail(3002, stockArticleEntity.getOrderCode() + "在库数量不足"); + } + //查询计划数量 + List reservationZeroPackageEntities = reservationZeroPackageService.list(Wrappers.query().lambda() + .eq(DistributionReservationZeroPackageEntity::getReservationId, stockupDTO.getReservationId()) + .ne(DistributionReservationZeroPackageEntity::getZeroPackageStatus, ReservationPackageStatusConstant.quxiao.getValue()) + .apply("quantity > 0") + ); + Integer planNum = 0; + Integer stockupNum = 0; + if (!reservationZeroPackageEntities.isEmpty()) { + //查询此次备货是否在计划之中 + List plan = reservationZeroPackageEntities.stream().filter(f -> stockArticleEntity.getId().equals(f.getStockArticleId())).collect(Collectors.toList()); + if (!plan.isEmpty()) { + planNum = plan.stream().mapToInt(DistributionReservationZeroPackageEntity::getQuantity).sum(); - if (ObjectUtils.isNull()) { - return Resp.scanFail(i.getCategoryName() + "备货信息未找到!", i.getCategoryName() + "备货信息未找到!"); } - if (one.getQuantity().equals(one.getRealityQuantity())) { - return Resp.scanFail(i.getCategoryName() + "备货已完成!!", i.getCategoryName() + "备货已完成!!"); + //查询以备数量 + List stockEntityList = distributionStockService.list(Wrappers.query().lambda() + .eq(DistributionStockEntity::getReservationId, stockupDTO.getReservationId()) + .eq(DistributionStockEntity::getStockupId, stockupDTO.getStockupId()) + .eq(DistributionStockEntity::getStockArticle, stockupDTO.getStockArticleId()) + ); + if (!stockEntityList.isEmpty()) { + stockupNum = stockEntityList.stream().mapToInt(DistributionStockEntity::getStockQuantity).sum(); } } - //把数据取出来 - List zeroStockUpData; - + //比计划是否超出计划备货数量 + int i = planNum - stockupNum - stockupDTO.getNum(); + if (i < 0) { + log.error(method + "超出计划备货,当前备货数量:{},计划数量:{},以备数量:{}", stockupDTO.getNum(), planNum, stockupNum); + return Resp.scanFail("超出备货数量", "超出备货数量"); + } + DistributionStockEntity stockEntity = new DistributionStockEntity(); + stockEntity.setStockArticle(stockArticleEntity.getId()); + stockEntity.setStockupId(stockupDTO.getStockupId()); + stockEntity.setScanUser(AuthUtil.getUser().getNickName()); if ("3".equals(stockupDTO.getTypeService())) { - //自提 - if (ObjectUtils.isNull(stockupDTO.getAllocationId())) { - //没有货位 - //自提 - zeroStockUpData = distributionStockupService.getZeroStockUpDataMeiSelf(stockupDTO); - } else { - //有 - zeroStockUpData = distributionStockupService.getZeroStockUpDataYouSelf(stockupDTO); - } + stockEntity.setConditions("2"); + stockEntity.setBillLadingId(stockupDTO.getReservationId()); + stockEntity.setOutboundType("3"); } else { - //商 ,市 - if (ObjectUtils.isNull(stockupDTO.getAllocationId())) { - //没有货位 - zeroStockUpData = distributionStockupService.getZeroStockUpDataMei(stockupDTO); - } else { - //有 - zeroStockUpData = distributionStockupService.getZeroStockUpDataYou(stockupDTO); - } - } - int xiugai = 0; - List collect = stockupDTO.getList().stream().filter( //可以 - a -> zeroStockUpData.stream().anyMatch(q -> q.getStockArticleId().equals(a.getStockArticleId()) && a.getQuantity() <= q.getQuantity() && a.getQuantity() > 0) - ).collect(Collectors.toList()); - //添加备货信息 - List stockEntityList = new ArrayList<>(); - List jsonObjectList = new ArrayList<>(); - for (StockupZeroVO i : collect) { + stockEntity.setOutboundType(reservationEntity.getDeliveryType()); + } + stockEntity.setType(3); + stockEntity.setStockQuantity(stockupDTO.getNum()); + stockEntity.setStockupId(stockupDTO.getStockupId()); + stockEntity.setReservationId(stockupDTO.getReservationId()); + stockEntity.setStockArticle(stockArticleEntity.getId()); + stockEntity.setOrderSelfNumbering(stockArticleEntity.getOrderCode()); + stockEntity.setCoding(stockArticleEntity.getOrderCode()); + stockEntity.setGoodsName(stockArticleEntity.getDescriptionGoods()); + stockEntity.setMarketId(stockArticleEntity.getMallId()); + stockEntity.setReservationCode(reservationEntity.getReservationCode()); + if (Func.isNotEmpty(stockupDTO.getAllocationId())) { + log.info(method + "库位备货"); + //查询库位零担 + WarehouseUpdownGoodsEntity warehouseUpdownGoodsEntity = new WarehouseUpdownGoodsEntity(); + warehouseUpdownGoodsEntity.setAssociationValue(stockArticleEntity.getOrderCode()); + warehouseUpdownGoodsEntity.setAssociationId(stockArticleEntity.getId()); + warehouseUpdownGoodsEntity.setAssociationType("1"); + warehouseUpdownGoodsEntity.setAllocationId(stockupDTO.getAllocationId()); + List locationStockListInformation = warehouseUpdownGoodsClient.getLocationStockListInformation(warehouseUpdownGoodsEntity); + if (locationStockListInformation.isEmpty()) { + log.error(method + "查询库位信息失败orderCode:{},id:{},type:{}", stockArticleEntity.getOrderCode(), stockArticleEntity.getId(), "1"); + return Resp.scanFail("库位信息查询失败", "库位信息查询失败"); + } + //记录货位 + if (locationStockListInformation.size() == 1) { + WarehouseUpdownGoodsEntity updownGoodsEntity = locationStockListInformation.get(0); + stockEntity.setAllocationId(updownGoodsEntity.getAllocationId()); + stockEntity.setAllocationTitle(updownGoodsEntity.getAllocationTitle()); + } + List list = new ArrayList<>(); JSONObject jsonObject = new JSONObject(); jsonObject.put("warehouseId", myCurrentWarehouse.getId()); - //查询是不是当前包件 - DistributionReservationZeroPackageEntity byId1 = reservationZeroPackageService.getById(i.getId()); - if (ObjectUtils.isNull(byId1)) { - continue; - } - DistributionStockArticleEntity stockArticle = distributionStockArticleService.getById(byId1.getStockArticleId()); - if (ObjectUtils.isNull(stockArticle)) { - throw new ServiceException("订单数据不存在!!"); - } - jsonObject.put("orderCode", stockArticle.getOrderCode()); - jsonObject.put("waybillCode", stockArticle.getWaybillNumber()); - - //查询备货信息 - QueryWrapper queryWrapper = new QueryWrapper<>(); - if ("3".equals(stockupDTO.getTypeService())) { - queryWrapper.eq("bill_lading_id", stockupDTO.getReservationId()); - } else { - queryWrapper.eq("reservation_id", stockupDTO.getReservationId()); - } - //查询有没有备货过 - queryWrapper.eq("stock_article", i.getStockArticleId()); - queryWrapper.eq("stockup_id", stockupDTO.getStockupId()); - queryWrapper.eq("parcel_list_id", byId1.getParcelListId()); - DistributionStockEntity one = distributionStockService.getOne(queryWrapper); - //查询备货数量 -// DistributionReservationZeroPackageEntity byId = reservationZeroPackageService.getById(i.getId()); - if (i.getQuantity() > byId1.getQuantity()) { - return Resp.scanFail(i.getCategoryName() + "备货数量大于待备货数量!", i.getCategoryName() + "备货数量大于待备货数量!"); - } - Optional first = stockupDTO.getList().stream().filter(q -> i.getStockArticleId().equals(q.getStockArticleId()) && q.getQuantity() <= i.getQuantity() && q.getQuantity() > 0).findFirst(); - - if (ObjectUtils.isNotNull(one)) { - //修改数量 - DistributionStockEntity stockEntity = new DistributionStockEntity(); - stockEntity.setId(one.getId()); - stockEntity.setStockQuantity(first.get().getQuantity()); - int i1 = first.get().getQuantity() - first.get().getRealityQuantity(); //这次备货的数量 - jsonObject.put("enterNum", i1); - distributionStockService.updateById(stockEntity); - } else { - DistributionStockEntity stockEntity = new DistributionStockEntity(); - stockEntity.setStockArticle(i.getStockArticleId()); - stockEntity.setStockupId(stockupDTO.getStockupId()); - stockEntity.setParcelListId(byId1.getParcelListId()); - if ("3".equals(stockupDTO.getTypeService())) { - stockEntity.setBillLadingId(stockupDTO.getReservationId()); - } else { - stockEntity.setReservationId(stockupDTO.getReservationId()); - } - stockEntity.setConditions("2"); - stockEntity.setGoodsName(i.getCategoryName()); - stockEntity.setOutboundType("3"); - stockEntity.setType(3); - stockEntity.setAllocationId(stockupDTO.getAllocationId()); - //查询货位信息 - stockEntity.setAllocationTitle(getAllocationInfo(stockupDTO.getAllocationId(), stockArticle.getOrderCode(), myCurrentWarehouse.getId()).getAllocationTitle()); - DistributionStockupEntity distributionStockupEntity = distributionStockupService.selectById(stockupDTO.getStockupId()); - stockEntity.setStockupArea(ObjectUtils.isNotNull(distributionStockupEntity) ? distributionStockupEntity.getStockupArea() : null); - stockEntity.setStockQuantity(first.get().getQuantity());// 备货数量 - jsonObject.put("enterNum", i.getQuantity()); - stockEntityList.add(stockEntity); - } - //修改备货数量 - DistributionReservationZeroPackageEntity reservationZeroPackageEntity = new DistributionReservationZeroPackageEntity(); - reservationZeroPackageEntity.setRealityQuantity(first.get().getQuantity()); - reservationZeroPackageEntity.setId(i.getId()); - boolean b = reservationZeroPackageService.updateById(reservationZeroPackageEntity); - if (!b) { - return Resp.scanFail("修改失败!!", "修改失败!!"); - } else { - xiugai += 1; - } - //有货位下架 + jsonObject.put("orderCode", stockArticleEntity.getOrderCode()); + jsonObject.put("waybillCode", stockArticleEntity.getWaybillNumber()); + jsonObject.put("enterNum", stockupDTO.getNum()); jsonObject.put("allocationId", stockupDTO.getAllocationId()); - jsonObject.put("remark","备货零担下架"); - jsonObjectList.add(jsonObject); - - } - if (!jsonObjectList.isEmpty()) { - if (ObjectUtils.isNotNull(stockupDTO.getAllocationId())) { - R r = warehouseUpdownTypeClient.downZeroOrder(jsonObjectList); - if (r.getCode() != 200) { - return Resp.scanFail("货架下架失败!请联系管理员!", "货架下架失败!请联系管理员!"); + jsonObject.put("remark", "备货下架零担" + stockupDTO.getNum() + "件"); + list.add(jsonObject); + //进行下架 + warehouseUpdownTypeClient.downZeroOrder(list); + stockEntity.setAllocationId(stockupDTO.getAllocationId()); + } else if (Func.isNotEmpty(stockupDTO.getTrayId())) { + log.info(method + "托盘备货"); + //查询托盘 + WarehouseTrayGoodsEntity warehouseTrayGoodsEntity = new WarehouseTrayGoodsEntity(); + warehouseTrayGoodsEntity.setAssociationValue(stockArticleEntity.getOrderCode()); + warehouseTrayGoodsEntity.setAssociationId(stockArticleEntity.getId()); + warehouseTrayGoodsEntity.setAssociationType("1"); + warehouseTrayGoodsEntity.setTrayId(Long.parseLong(stockupDTO.getTrayId())); + List trayList = warehouseTrayGoodsClient.getTrayList(warehouseTrayGoodsEntity); + if (!trayList.isEmpty()) { + if (trayList.size() == 1) { + //托盘解托 + WarehouseTrayGoodsEntity trayGoodsEntity = trayList.get(0); + log.info(method + "downZeroTrayById>>>>>>>>>>>>>>>trayId:{},orderId:{},warehouseId:{},num:{}", trayGoodsEntity.getTrayId(), stockArticleEntity.getId(), myCurrentWarehouse.getId(), stockupDTO.getNum()); + List list = new ArrayList<>(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("warehouseId", myCurrentWarehouse.getId()); + jsonObject.put("trayId", stockupDTO.getTrayId()); + jsonObject.put("orderId", stockArticleEntity.getId()); + jsonObject.put("num", stockupDTO.getNum()); + jsonObject.put("remark", "备货解托零担" + stockupDTO.getNum() + "件"); + list.add(jsonObject); + warehouseTrayGoodsClient.downZeroTrayById(list); + } else { + //查询托盘存在多条记录 + log.error(method + "查询库托盘信息失败orderCode:{},id:{},type:{}", stockArticleEntity.getOrderCode(), stockArticleEntity.getId(), "1"); + throw new RuntimeException("查询托盘信息失败"); } - } - } - if (!stockEntityList.isEmpty()) { - boolean b = distributionStockService.saveBatch(stockEntityList); - if (b) { - //修改备货状态 - distributionAsyncService.stockZero(stockupDTO); - //下架零担 - - return Resp.scanSuccess("备货成功!", "备货成功!"); } else { - // - return Resp.scanFail("修改失败!!", "修改失败!!"); + log.error(method + "查询库托盘信息失败orderCode:{},id:{},type:{}", stockArticleEntity.getOrderCode(), stockArticleEntity.getId(), "1"); + //查询托盘信息错误 + throw new RuntimeException("查询托盘信息失败"); } } else { - if (collect.size() == xiugai) { - //修改备货状态 - distributionAsyncService.stockZero(stockupDTO); - //下架零担 - return Resp.scanSuccess("备货成功!", "备货成功!"); - } - return Resp.scanFail("备货失败!", "备货失败!"); + log.info(method + "无库位无托盘备货"); } - + if (!Func.isEmpty(stockupDTO.getStockupAllocationId())) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("warehouseId", myCurrentWarehouse.getId()); + jsonObject.put("code", stockArticleEntity.getOrderCode()); + jsonObject.put("stockUpAllocationId", stockupDTO.getStockupAllocationId()); + jsonObject.put("type", 3); + jsonObject.put("num", stockupDTO.getNum()); + //备货库位上架 + warehouseUpdownStockUpAreaClient.upStockUpShelf(jsonObject); + stockEntity.setStockupAreaId(stockupDTO.getStockupAllocationId()); + } + distributionStockService.save(stockEntity); + return Resp.scanSuccess("备货成功", "本次成功备货" + stockupDTO.getNum() + "件"); } + +// @Override +// @Transactional(rollbackFor = Exception.class) +// public R zeroStockUp(StockupZeroDTO stockupDTO) { +// if (stockupDTO.getList().isEmpty()) { +// return R.fail("基础数据为空"); +// } +// if (ObjectUtils.isNull(stockupDTO.getAllocationId())) { +// return Resp.scanFail("当前货物未上架,请上架!", "当前货物未上架,请上架!"); +// } +// //有没有多个订单数据 +// if (stockupDTO.getStockArticleId().contains(",")) { +// stockupDTO.setStockArticleIdList(stockupDTO.getStockArticleId().split(",")); +// stockupDTO.setStockArticleId(null); +// } +// BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); +// if (ObjectUtils.isNull(myCurrentWarehouse)) { +// throw new ServiceException("请选择仓库!!"); +// } +// //查询货位是否有货 +// WarehouseUpdownGoodsEntity allocationInfo = getAllocationInfo(stockupDTO.getAllocationId(), null, myCurrentWarehouse.getId()); +// if (ObjectUtils.isNotNull(allocationInfo)) { +// int sum = stockupDTO.getList().stream().mapToInt(StockupZeroVO::getQuantity).sum(); +// if (allocationInfo.getNum() < sum) { +// return Resp.scanFail("备货数量大于该货架的数量!", "备货数量大于该货架的数量!"); +// } +// } else { +// return Resp.scanFail("当前货物未上架,请上架!", "当前货物未上架,请上架!"); +// } +// +// //判断是否备货完成 +// for (StockupZeroVO i : stockupDTO.getList()) { +// //查询是否备货完成 +// DistributionReservationZeroPackageEntity one = reservationZeroPackageService.getOne(Wrappers.query().lambda() +// .eq(DistributionReservationZeroPackageEntity::getZeroPackageStatus, "1") +// .eq(DistributionReservationZeroPackageEntity::getId, i.getId()) +// ); +// +// +// if (ObjectUtils.isNull()) { +// return Resp.scanFail(i.getCategoryName() + "备货信息未找到!", i.getCategoryName() + "备货信息未找到!"); +// } +// if (one.getQuantity().equals(one.getRealityQuantity())) { +// return Resp.scanFail(i.getCategoryName() + "备货已完成!!", i.getCategoryName() + "备货已完成!!"); +// } +// } +// +// //把数据取出来 +// List zeroStockUpData; +// +// +// if ("3".equals(stockupDTO.getTypeService())) { +// //自提 +// if (ObjectUtils.isNull(stockupDTO.getAllocationId())) { +// //没有货位 +// //自提 +// zeroStockUpData = distributionStockupService.getZeroStockUpDataMeiSelf(stockupDTO); +// } else { +// //有 +// zeroStockUpData = distributionStockupService.getZeroStockUpDataYouSelf(stockupDTO); +// } +// } else { +// //商 ,市 +// if (ObjectUtils.isNull(stockupDTO.getAllocationId())) { +// //没有货位 +// zeroStockUpData = distributionStockupService.getZeroStockUpDataMei(stockupDTO); +// } else { +// //有 +// zeroStockUpData = distributionStockupService.getZeroStockUpDataYou(stockupDTO); +// } +// } +// int xiugai = 0; +// List collect = stockupDTO.getList().stream().filter( //可以 +// a -> zeroStockUpData.stream().anyMatch(q -> q.getStockArticleId().equals(a.getStockArticleId()) && a.getQuantity() <= q.getQuantity() && a.getQuantity() > 0) +// ).collect(Collectors.toList()); +// //添加备货信息 +// List stockEntityList = new ArrayList<>(); +// List jsonObjectList = new ArrayList<>(); +// for (StockupZeroVO i : collect) { +// JSONObject jsonObject = new JSONObject(); +// jsonObject.put("warehouseId", myCurrentWarehouse.getId()); +// //查询是不是当前包件 +// DistributionReservationZeroPackageEntity byId1 = reservationZeroPackageService.getById(i.getId()); +// if (ObjectUtils.isNull(byId1)) { +// continue; +// } +// DistributionStockArticleEntity stockArticle = distributionStockArticleService.getById(byId1.getStockArticleId()); +// if (ObjectUtils.isNull(stockArticle)) { +// throw new ServiceException("订单数据不存在!!"); +// } +// jsonObject.put("orderCode", stockArticle.getOrderCode()); +// jsonObject.put("waybillCode", stockArticle.getWaybillNumber()); +// +// //查询备货信息 +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// if ("3".equals(stockupDTO.getTypeService())) { +// queryWrapper.eq("bill_lading_id", stockupDTO.getReservationId()); +// } else { +// queryWrapper.eq("reservation_id", stockupDTO.getReservationId()); +// } +// //查询有没有备货过 +// queryWrapper.eq("stock_article", i.getStockArticleId()); +// queryWrapper.eq("stockup_id", stockupDTO.getStockupId()); +// queryWrapper.eq("parcel_list_id", byId1.getParcelListId()); +// DistributionStockEntity one = distributionStockService.getOne(queryWrapper); +// //查询备货数量 +//// DistributionReservationZeroPackageEntity byId = reservationZeroPackageService.getById(i.getId()); +// if (i.getQuantity() > byId1.getQuantity()) { +// return Resp.scanFail(i.getCategoryName() + "备货数量大于待备货数量!", i.getCategoryName() + "备货数量大于待备货数量!"); +// } +// Optional first = stockupDTO.getList().stream().filter(q -> i.getStockArticleId().equals(q.getStockArticleId()) && q.getQuantity() <= i.getQuantity() && q.getQuantity() > 0).findFirst(); +// +// if (ObjectUtils.isNotNull(one)) { +// //修改数量 +// DistributionStockEntity stockEntity = new DistributionStockEntity(); +// stockEntity.setId(one.getId()); +// stockEntity.setStockQuantity(first.get().getQuantity()); +// int i1 = first.get().getQuantity() - first.get().getRealityQuantity(); //这次备货的数量 +// jsonObject.put("enterNum", i1); +// distributionStockService.updateById(stockEntity); +// } else { +// DistributionStockEntity stockEntity = new DistributionStockEntity(); +// stockEntity.setStockArticle(i.getStockArticleId()); +// stockEntity.setStockupId(stockupDTO.getStockupId()); +// stockEntity.setParcelListId(byId1.getParcelListId()); +// if ("3".equals(stockupDTO.getTypeService())) { +// stockEntity.setBillLadingId(stockupDTO.getReservationId()); +// } else { +// stockEntity.setReservationId(stockupDTO.getReservationId()); +// } +// stockEntity.setConditions("2"); +// stockEntity.setGoodsName(i.getCategoryName()); +// stockEntity.setOutboundType("3"); +// stockEntity.setType(3); +// stockEntity.setAllocationId(stockupDTO.getAllocationId()); +// //查询货位信息 +// stockEntity.setAllocationTitle(getAllocationInfo(stockupDTO.getAllocationId(), stockArticle.getOrderCode(), myCurrentWarehouse.getId()).getAllocationTitle()); +// DistributionStockupEntity distributionStockupEntity = distributionStockupService.selectById(stockupDTO.getStockupId()); +// stockEntity.setStockupArea(ObjectUtils.isNotNull(distributionStockupEntity) ? distributionStockupEntity.getStockupArea() : null); +// stockEntity.setStockQuantity(first.get().getQuantity());// 备货数量 +// jsonObject.put("enterNum", i.getQuantity()); +// stockEntityList.add(stockEntity); +// } +// //修改备货数量 +// DistributionReservationZeroPackageEntity reservationZeroPackageEntity = new DistributionReservationZeroPackageEntity(); +// reservationZeroPackageEntity.setRealityQuantity(first.get().getQuantity()); +// reservationZeroPackageEntity.setId(i.getId()); +// boolean b = reservationZeroPackageService.updateById(reservationZeroPackageEntity); +// if (!b) { +// return Resp.scanFail("修改失败!!", "修改失败!!"); +// } else { +// xiugai += 1; +// } +// //有货位下架 +// jsonObject.put("allocationId", stockupDTO.getAllocationId()); +// jsonObject.put("remark","备货零担下架"); +// jsonObjectList.add(jsonObject); +// +// } +// if (!jsonObjectList.isEmpty()) { +// if (ObjectUtils.isNotNull(stockupDTO.getAllocationId())) { +// R r = warehouseUpdownTypeClient.downZeroOrder(jsonObjectList); +// if (r.getCode() != 200) { +// return Resp.scanFail("货架下架失败!请联系管理员!", "货架下架失败!请联系管理员!"); +// } +// } +// } +// if (!stockEntityList.isEmpty()) { +// boolean b = distributionStockService.saveBatch(stockEntityList); +// if (b) { +// //修改备货状态 +// distributionAsyncService.stockZero(stockupDTO); +// //下架零担 +// +// return Resp.scanSuccess("备货成功!", "备货成功!"); +// } else { +// // +// return Resp.scanFail("修改失败!!", "修改失败!!"); +// } +// } else { +// if (collect.size() == xiugai) { +// //修改备货状态 +// distributionAsyncService.stockZero(stockupDTO); +// //下架零担 +// return Resp.scanSuccess("备货成功!", "备货成功!"); +// } +// return Resp.scanFail("备货失败!", "备货失败!"); +// } + +// return null; +// } + /** * 查询零担的数据 * @@ -2675,36 +2899,36 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl list = new ArrayList<>(); - Map zeroMap = new HashMap<>(); + Map zeroMap = new HashMap<>(); //查询计划数量 List reservationZeroPackageEntities = reservationZeroPackageService.list(Wrappers.query().lambda() .eq(DistributionReservationZeroPackageEntity::getReservationId, stockupDTO.getReservationId()) .ne(DistributionReservationZeroPackageEntity::getZeroPackageStatus, ReservationPackageStatusConstant.quxiao.getValue()) .eq(DistributionReservationZeroPackageEntity::getStockArticleId, stockupDTO.getStockArticleId()) ); - zeroMap.put("scanNum",0); - zeroMap.put("planNum",0); - if (!reservationZeroPackageEntities.isEmpty()){ + zeroMap.put("scanNum", 0); + zeroMap.put("planNum", 0); + if (!reservationZeroPackageEntities.isEmpty()) { int sum = reservationZeroPackageEntities.stream().mapToInt(DistributionReservationZeroPackageEntity::getQuantity).sum(); - zeroMap.put("planNum",sum); + zeroMap.put("planNum", sum); //查询以备数量 List collect = reservationZeroPackageEntities.stream().map(DistributionReservationZeroPackageEntity::getParcelListId).collect(Collectors.toList()); List stockEntityList = distributionStockService.list(Wrappers.query().lambda() .eq(DistributionStockEntity::getReservationId, stockupDTO.getReservationId()) .eq(DistributionStockEntity::getStockArticle, stockupDTO.getStockArticleId()) - .in(DistributionStockEntity::getParcelListId, collect) ); - if (!stockEntityList.isEmpty()){ + if (!stockEntityList.isEmpty()) { int scanNum = stockEntityList.stream().mapToInt(DistributionStockEntity::getStockQuantity).sum(); - zeroMap.put("scanNum",scanNum); + zeroMap.put("scanNum", scanNum); } } //查询订单信息 DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(stockupDTO.getStockArticleId()); - if (IsOrNoConstant.no.getValue().equals(stockArticleEntity.getIsZero())){ - log.error(method+"订单类型错误"); + if (IsOrNoConstant.no.getValue().equals(stockArticleEntity.getIsZero())) { + log.error(method + "订单类型错误"); return R.data("订单数据错误"); } + zeroMap.put("orderId", stockArticleEntity.getId()); Integer handQuantity = stockArticleEntity.getHandQuantity(); //查询此订单所在库位 @@ -2714,54 +2938,57 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl locationStockListInformation = warehouseUpdownGoodsClient.getLocationStockListInformation(warehouseUpdownGoodsEntity); - List> allocationMapList = new ArrayList<>(); + List> allocationMapList = new ArrayList<>(); if (!locationStockListInformation.isEmpty()) { int sum = locationStockListInformation.stream().mapToInt(WarehouseUpdownGoodsEntity::getNum).sum(); handQuantity = handQuantity - sum; for (WarehouseUpdownGoodsEntity updownGoodsEntity : locationStockListInformation) { - Map map = new HashMap<>(); - map.put("allocation",updownGoodsEntity.getPositionCode()); - map.put("num",updownGoodsEntity.getNum()); + Map map = new HashMap<>(); + map.put("allocationName", updownGoodsEntity.getPositionCode()); + map.put("allocationid", updownGoodsEntity.getAllocationId()); + map.put("num", updownGoodsEntity.getNum()); allocationMapList.add(map); } //存在上架数据 //整理数据 } //查询零担打托信息 - List trayGoodsEntities = warehouseTrayGoodsClient.findZeroByOrderCode(stockArticleEntity.getOrderCode(),stockArticleEntity.getWarehouseId()); - List> trayMapList = new ArrayList<>(); + List trayGoodsEntities = warehouseTrayGoodsClient.findZeroByOrderCode(stockArticleEntity.getOrderCode(), stockArticleEntity.getWarehouseId()); + List> trayMapList = new ArrayList<>(); if (!trayGoodsEntities.isEmpty()) { - int sum = trayGoodsEntities.stream().mapToInt(WarehouseTrayGoodsEntity::getNum).sum(); - handQuantity = handQuantity - sum; +// int sum = trayGoodsEntities.stream().mapToInt(WarehouseTrayGoodsEntity::getNum).sum(); Iterator iterator = trayGoodsEntities.iterator(); - while (iterator.hasNext()){ + while (iterator.hasNext()) { //查询是否进行上架 WarehouseTrayGoodsEntity next = iterator.next(); - if (Func.isNotEmpty(warehouseTaryAllocationClient.findAllocationByTrayId(next.getTrayId()))){ + if (Func.isNotEmpty(warehouseTaryAllocationClient.findAllocationByTrayId(next.getTrayId()))) { iterator.remove(); - }else { + } else { + handQuantity = handQuantity - next.getNum(); + //查询托盘名称 BasicdataTrayEntity trayByTrayCode = basicdataTrayClient.getTrayByTrayCode(next.getTrayCode()); - Map map = new HashMap<>(); - map.put("trayCode",next.getTrayCode()); - map.put("trayName",trayByTrayCode.getPalletName()); - map.put("num",next.getNum()); + Map map = new HashMap<>(); + map.put("trayCode", next.getTrayCode()); + map.put("trayId", next.getTrayId()); + map.put("trayName", trayByTrayCode.getPalletName()); + map.put("num", next.getNum()); trayMapList.add(map); } } } //整理剩下的数量信息 - Map map = new HashMap<>(); - map.put("num",handQuantity); - if (!allocationMapList.isEmpty()){ - zeroMap.put("allocationList",allocationMapList); + Map map = new HashMap<>(); + map.put("num", handQuantity); + if (!allocationMapList.isEmpty()) { + zeroMap.put("allocationList", allocationMapList); } - if (!trayMapList.isEmpty()){ - zeroMap.put("trayList",trayMapList); + if (!trayMapList.isEmpty()) { + zeroMap.put("trayList", trayMapList); } - if (!map.isEmpty()){ - zeroMap.put("other",map); + if (!map.isEmpty()) { + zeroMap.put("other", map); } return R.data(zeroMap); @@ -2901,9 +3128,9 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl { // List di = new ArrayList<>(); // AtomicReference s = new AtomicReference<>(0); //已扫数量 - v.stream().forEach(i -> { + v.forEach(i -> { DistributionParcelListEntity byId = distributionParcelListService.getById(i.getAssociationId()); - if(ObjectUtils.isNotNull(byId)){ + if (ObjectUtils.isNotNull(byId)) { if (!vo.getStockArticleId().contains(byId.getStockArticleId().toString())) { f.set(false); } @@ -2938,11 +3165,11 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl map =distributionStockListInfoMapper.selectDistributionStockByOrderPackageCodeAndWarehourseIdAndCargoNumber(warehouseUpdownGoodsEntity.getAssociationValue(),warehouseUpdownGoodsEntity.getWarehouseId(),cargoNumber); - if(ObjectUtils.isNotNull(map)){ - incomingBatches=map.get("incoming_batch").toString(); + Map map = distributionStockListInfoMapper.selectDistributionStockByOrderPackageCodeAndWarehourseIdAndCargoNumber(warehouseUpdownGoodsEntity.getAssociationValue(), warehouseUpdownGoodsEntity.getWarehouseId(), cargoNumber); + if (ObjectUtils.isNotNull(map)) { + incomingBatches = map.get("incoming_batch").toString(); break; } } @@ -2970,26 +3197,61 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl list = distrilbutionBillStockService.list(Wrappers.query().lambda(). eq(DistrilbutionBillStockEntity::getBillLadingId, reservationId) - .apply("order_status in (1,2)") + .apply("order_status in (1,3)") );//预约信息 - if(!list.isEmpty()){ + if (!list.isEmpty()) { DistributionStockArticleEntity byId = distributionStockArticleService.getById(list.get(0).getStockArticleId()); - mallId = byId.getMallId(); - mallName = byId.getMallName(); + if (!Func.isEmpty(byId)) { + BasicdataClientEntity byName = basicdataClientClient.findByName(byId.getMallName()); + if (!Func.isEmpty(byName)) { + mallId = byId.getMallId(); + mallName = byId.getMallName(); + } + } + } + if (Objects.isNull(mallId) || Objects.isNull(mallName)) { + List detailsEntities = distributionDeliveryDetailsService.list(Wrappers.query().lambda() + .eq(DistributionDeliveryDetailsEntity::getBillLadingId, reservationId) + .ne(DistributionDeliveryDetailsEntity::getInventoryStatus, "2") + ); + if (!detailsEntities.isEmpty()) { + List ids = detailsEntities.stream().map(DistributionDeliveryDetailsEntity::getStockListId).distinct().collect(Collectors.toList()); + List distributionStockListEntities = distributionStockListService.listByIds(ids); + if (!distributionStockListEntities.isEmpty()) { + if (distributionStockListEntities.stream().map(DistributionStockListEntity::getMarketId).distinct().collect(Collectors.toList()).size() == 1 && distributionStockListEntities.stream().map(DistributionStockListEntity::getMallName).distinct().collect(Collectors.toList()).size() == 1) { + mallId = distributionStockListEntities.stream().map(DistributionStockListEntity::getMarketId).distinct().collect(Collectors.toList()).get(0); + mallName = distributionStockListEntities.stream().map(DistributionStockListEntity::getMarketName).distinct().collect(Collectors.toList()).get(0); + } else { + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>自提单错误库存品计划,多个商场信息reservationId:{}", reservationId); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>自提单错误库存品计划,多个商场信息商场ID:{}", distributionStockListEntities.stream().map(DistributionStockListEntity::getMarketId).distinct().collect(Collectors.toList())); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>自提单错误库存品计划,多个商场信息商场名称:{}", distributionStockListEntities.stream().map(DistributionStockListEntity::getMarketName).distinct().collect(Collectors.toList())); + } + } else { + log.info(">>>>>>>>>>>>>>>>自提单无定制品和库存品 无效字体计划billLadingId:{}", reservationId); + } + } + } - }else{ + + } else { // 查询预约单上的商城 DistributionReservationEntity distributionReservationEntity = distributionReservationMapper.selectById(reservationId); - mallId = distributionReservationEntity.getMallId(); - mallName = distributionReservationEntity.getMallName(); - + if (!Func.isEmpty(distributionReservationEntity)) { + BasicdataClientEntity byName = basicdataClientClient.findByName(distributionReservationEntity.getMallName()); + if (!Func.isEmpty(byName)) { + mallId = distributionReservationEntity.getMallId(); + mallName = distributionReservationEntity.getMallName(); + } + } else { + log.info("查询预约单客户信息失败reservationId:{}", reservationId); + } } //查询货位上物料信息 @@ -3042,13 +3304,13 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl parcelListEntities = distributionParcelListService.list(Wrappers.query().lambda() .eq(DistributionParcelListEntity::getOrderCode, distributionStockListEntity.getIncomingBatch()) .eq(DistributionParcelListEntity::getWarehouseId, distributionStockListEntity.getWarehouseId()) .eq(DistributionParcelListEntity::getConditions, 2) ); - if (Func.isNotEmpty(parcelListEntities)){ + if (Func.isNotEmpty(parcelListEntities)) { for (DistributionParcelListEntity parcelListEntity : parcelListEntities) { WarehouseUpdownGoodsEntity warehouseUpdownGoodsEntity = new WarehouseUpdownGoodsEntity(); warehouseUpdownGoodsEntity.setAllocationId(stockupDTO.getAllocationId()); @@ -3077,41 +3339,46 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl locationStockListInformation = warehouseUpdownGoodsClient.getLocationStockListInformation(warehouseUpdownGoodsEntity); - if (Func.isNotEmpty(locationStockListInformation)){ + if (Func.isNotEmpty(locationStockListInformation)) { int sum = locationStockListInformation.stream().mapToInt(WarehouseUpdownGoodsEntity::getNum).sum(); youshuju += sum; } } } - }else if ("2".equals(distributionStockListEntity.getSourceType())){ + } else if ("2".equals(distributionStockListEntity.getSourceType())) { WarehouseUpdownGoodsEntity warehouseUpdownGoodsEntity = new WarehouseUpdownGoodsEntity(); warehouseUpdownGoodsEntity.setAssociationValue(stockupDTO.getCargoNumber()); warehouseUpdownGoodsEntity.setAssociationType("4"); warehouseUpdownGoodsEntity.setWarehouseId(myCurrentWarehouse.getId()); warehouseUpdownGoodsEntity.setAllocationId(stockupDTO.getAllocationId()); List locationStockListInformation = warehouseUpdownGoodsClient.getLocationStockListInformation(warehouseUpdownGoodsEntity); - if (Func.isNotEmpty(locationStockListInformation)){ + if (Func.isNotEmpty(locationStockListInformation)) { int sum = locationStockListInformation.stream().mapToInt(WarehouseUpdownGoodsEntity::getNum).sum(); wushuju += sum; } - }else { - log.info("###################库存品source_type字段缺失:{}",distributionStockListEntity.getIncomingBatch()); + } else { + log.info("###################库存品source_type字段缺失:{}", distributionStockListEntity.getIncomingBatch()); } } StockConfigInfoVO stockConfigInfoVO = new StockConfigInfoVO(); //过滤出同物料库存品的ID信息 List stockListIds = distributionStockListEntities.stream().map(DistributionStockListEntity::getId).collect(Collectors.toList()); + if (stockListIds.isEmpty()) { + log.info("###################仓库查询物料信息错误物料编号:{},warehouseId:{}", stockupDTO.getCargoNumber(), myCurrentWarehouse.getId()); + + return null; + } List ls = new ArrayList<>(); - if(typeService.equals(StockupTypeConstant.ziti.getValue())){ + if (typeService.equals(StockupTypeConstant.ziti.getValue())) { //自提 // 查询预约单的上的信息 List list = distrilbutionBillStockService.list(Wrappers.query().lambda(). eq(DistrilbutionBillStockEntity::getBillLadingId, stockupDTO.getReservationId()) - .apply("order_status in (1,2)") + .apply("order_status in (1,3)") );//预约信息 - if(!list.isEmpty()){ + if (!list.isEmpty()) { DistributionStockArticleEntity byId = distributionStockArticleService.getById(list.get(0).getStockArticleId()); - if(ObjectUtils.isNotNull(byId)){ + if (ObjectUtils.isNotNull(byId)) { stockConfigInfoVO.setCustomer(byId.getCustomerName()); //客户0 stockConfigInfoVO.setAddress(byId.getCustomerAddress()); //地址 } @@ -3121,15 +3388,15 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl detailsEntityList = distributionDeliveryDetailsService.list(Wrappers.query().lambda() .eq(DistributionDeliveryDetailsEntity::getBillLadingId, stockupDTO.getReservationId()) .in(DistributionDeliveryDetailsEntity::getStockListId, stockListIds) - .apply("inventory_status in (1,2)") + .apply("inventory_status in (1,3)") ); stockConfigInfoVO.setRealityNum(0); - if (Func.isNotEmpty(detailsEntityList)){ + if (Func.isNotEmpty(detailsEntityList)) { int realityNum = detailsEntityList.stream().mapToInt(DistributionDeliveryDetailsEntity::getRealityQuantity).sum(); stockConfigInfoVO.setRealityNum(realityNum); //已备数量 } - }else{ + } else { // 查询预约单的上的信息 DistributionReservationEntity reservationEntity = distributionReservationService.getById(stockupDTO.getReservationId()); //预约信息 stockConfigInfoVO.setCustomer(reservationEntity.getConsignee()); //客户0 @@ -3143,7 +3410,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl locationStockListInformation = warehouseUpdownGoodsClient.getLocationStockListInformation(warehouseUpdownGoods); - if(locationStockListInformation.isEmpty() || ObjectUtils.isNull(locationStockListInformation)){ + if (locationStockListInformation.isEmpty() || ObjectUtils.isNull(locationStockListInformation)) { //不是该货位库存品包件信息; return R.fail("不是该货位库存品包件信息"); } //查询属于那个批次的库存品 DistributionParcelListEntity byId = distributionParcelListService.getById(locationStockListInformation.get(0).getAssociationId()); - if(ObjectUtils.isNull(byId)){ + if (ObjectUtils.isNull(byId)) { return R.fail("订单信息不存在!"); } DistributionStockListEntity distributionStockListEntity = distributionStockListMapper.selectOne(Wrappers.query().lambda() .eq(DistributionStockListEntity::getIncomingBatch, byId.getOrderCode()) - .eq(DistributionStockListEntity::getWarehouseId,myCurrentWarehouse.getId()) - .eq(DistributionStockListEntity::getCargoNumber,stockupDTO.getCargoNumber()) + .eq(DistributionStockListEntity::getWarehouseId, myCurrentWarehouse.getId()) + .eq(DistributionStockListEntity::getCargoNumber, stockupDTO.getCargoNumber()) ); - if(ObjectUtils.isNull(distributionStockListEntity)){ + if (ObjectUtils.isNull(distributionStockListEntity)) { return R.fail("该包件不是库存品!"); } //查询该预约的库存品信息 @@ -3228,31 +3496,31 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl first = list.stream().filter(i -> i.getStocklistId().equals(distributionStockListEntity.getId())).findFirst(); - if(!first.isPresent()){ + if (!first.isPresent()) { //没有一样的库存品数据 return R.fail("没有一样的库存品数据"); } //判断数量是否可以直接备货 DistributionReservationStocklistEntity reservationStocklistEntity1 = first.get(); - if(reservationStocklistEntity1.getRealityNum() < reservationStocklistEntity1.getReservationNum()){ + if (reservationStocklistEntity1.getRealityNum() < reservationStocklistEntity1.getReservationNum()) { return R.success("可以直接备货!"); } List keYi = new ArrayList<>(); //可以操作的库存品 //取出一样的库存品信息 - list.forEach( i -> { + list.forEach(i -> { DistributionStockListEntity distributionStockListEntity1 = distributionStockListMapper.selectById(i.getStocklistId()); - if(distributionStockListEntity1.getDescriptionGoods().equals(distributionStockListEntity.getDescriptionGoods()) + if (distributionStockListEntity1.getDescriptionGoods().equals(distributionStockListEntity.getDescriptionGoods()) && distributionStockListEntity1.getCargoNumber().equals(distributionStockListEntity.getCargoNumber()) - && i.getRealityNum() < i.getReservationNum() ){ + && i.getRealityNum() < i.getReservationNum()) { keYi.add(i); } }); - if(keYi.isEmpty()){ + if (keYi.isEmpty()) { return R.fail("没有可以操作的库存品数据"); } //获取数据 @@ -3264,7 +3532,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl collect2 = keYi.stream().filter(i -> i.getStocklistId().equals(distributionStockListEntities.get(0).getId())).findFirst(); - if(collect2.isPresent()){ + if (collect2.isPresent()) { DistributionReservationStocklistEntity distributionReservationStocklistEntity = collect2.get(); Integer reservationNum = distributionReservationStocklistEntity.getReservationNum() - 1; @@ -3277,7 +3545,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl list1 = disStockListDetailService.list(Wrappers.query().lambda() @@ -3285,7 +3553,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl stockupPackageListDetailExcels = baseMapper.exportStockUptOrderDetail(list); - if (Func.isNotEmpty(stockupPackageListDetailExcels)){ + if (Func.isNotEmpty(stockupPackageListDetailExcels)) { for (DistributionStockupPackageListDetailExcel stockupPackageListDetailExcel : stockupPackageListDetailExcels) { - if (stockupPackageListDetailExcel.getIsZero().equals(IsOrNoConstant.no.getValue())){ + if (stockupPackageListDetailExcel.getIsZero().equals(IsOrNoConstant.no.getValue())) { //订制品订单 查询托盘和库位 - String trayName = warehouseTrayGoodsClient.getTrayNameByOrderPackageCode(stockupPackageListDetailExcel.getOrderPackageCode(),3); - if (Func.isNotBlank(trayName)){ + String trayName = warehouseTrayGoodsClient.getTrayNameByOrderPackageCode(stockupPackageListDetailExcel.getOrderPackageCode(), 3); + if (Func.isNotBlank(trayName)) { stockupPackageListDetailExcel.setTrayNames(trayName); } - String allocationName = warehouseUpdownGoodsClient.getAllocationNameByOrderPackageCode(stockupPackageListDetailExcel.getOrderPackageCode(),3); - if (Func.isNotBlank(allocationName)){ + String allocationName = warehouseUpdownGoodsClient.getAllocationNameByOrderPackageCode(stockupPackageListDetailExcel.getOrderPackageCode(), 3); + if (Func.isNotBlank(allocationName)) { stockupPackageListDetailExcel.setAllocationNames(allocationName); } - }else { + } else { //零担 - String trayName = warehouseTrayGoodsClient.getTrayNameByOrderPackageCode(stockupPackageListDetailExcel.getOrderCode(),1); - if (Func.isNotBlank(trayName)){ + String trayName = warehouseTrayGoodsClient.getTrayNameByOrderPackageCode(stockupPackageListDetailExcel.getOrderCode(), 1); + if (Func.isNotBlank(trayName)) { stockupPackageListDetailExcel.setTrayNames(trayName); } - String allocationName = warehouseUpdownGoodsClient.getAllocationNameByOrderPackageCode(stockupPackageListDetailExcel.getOrderCode(),1); - if (Func.isNotBlank(allocationName)){ + String allocationName = warehouseUpdownGoodsClient.getAllocationNameByOrderPackageCode(stockupPackageListDetailExcel.getOrderCode(), 1); + if (Func.isNotBlank(allocationName)) { stockupPackageListDetailExcel.setAllocationNames(allocationName); } } @@ -3357,38 +3625,38 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl stockupInventoryListDetailExcels = baseMapper.exportStockUptInventoryDetail(list); boolean flag = stockupInventoryListDetailExcels.stream().allMatch(r -> Func.isNotEmpty(r.getId())); - if (flag){ - if (Func.isNotEmpty(stockupInventoryListDetailExcels)){ + if (flag) { + if (Func.isNotEmpty(stockupInventoryListDetailExcels)) { for (DistributionStockupPackageListDetailExcel stockupInventoryListDetailExcel : stockupInventoryListDetailExcels) { //查询库存品托盘信息 DistributionStockListEntity distributionStockLisEntity = distributionStockListMapper.selectById(stockupInventoryListDetailExcel.getId()); - if ("1".equals(distributionStockLisEntity.getSourceType())){ + if ("1".equals(distributionStockLisEntity.getSourceType())) { //转 List parcelListEntities = distributionParcelListService.list(Wrappers.query().lambda() .eq(DistributionParcelListEntity::getOrderCode, distributionStockLisEntity.getIncomingBatch()) .eq(DistributionParcelListEntity::getOrderPackageStockupStatus, OrderPackageStockupStatusConstant.daibeihuo.getValue()) .eq(DistributionParcelListEntity::getOrderPackageStatus, OrderPackageStatusConstant.yiruku.getValue()) ); - if (Func.isNotEmpty(parcelListEntities)){ + if (Func.isNotEmpty(parcelListEntities)) { String orderpackageCode = parcelListEntities.stream().map(DistributionParcelListEntity::getOrderPackageCode).collect(Collectors.joining(",")); //订制品订单 查询托盘和库位 - String trayName = warehouseTrayGoodsClient.getTrayNameByOrderPackageCode(orderpackageCode,3); - if (Func.isNotBlank(trayName)){ + String trayName = warehouseTrayGoodsClient.getTrayNameByOrderPackageCode(orderpackageCode, 3); + if (Func.isNotBlank(trayName)) { stockupInventoryListDetailExcel.setTrayNames(trayName); } - String allocationName = warehouseUpdownGoodsClient.getAllocationNameByOrderPackageCode(orderpackageCode,3); - if (Func.isNotBlank(allocationName)){ + String allocationName = warehouseUpdownGoodsClient.getAllocationNameByOrderPackageCode(orderpackageCode, 3); + if (Func.isNotBlank(allocationName)) { stockupInventoryListDetailExcel.setAllocationNames(allocationName); } } - }else { + } else { //导 - String trayName = warehouseTrayGoodsClient.getTrayInfoByInventory(distributionStockLisEntity.getMarketId(),distributionStockLisEntity.getCargoNumber()); - if (Func.isNotBlank(trayName)){ + String trayName = warehouseTrayGoodsClient.getTrayInfoByInventory(distributionStockLisEntity.getMarketId(), distributionStockLisEntity.getCargoNumber()); + if (Func.isNotBlank(trayName)) { stockupInventoryListDetailExcel.setTrayNames(trayName); } - String allocationName = warehouseUpdownGoodsClient.getAllocationNameByInventory(distributionStockLisEntity.getMarketId(),distributionStockLisEntity.getCargoNumber()); - if (Func.isNotBlank(allocationName)){ + String allocationName = warehouseUpdownGoodsClient.getAllocationNameByInventory(distributionStockLisEntity.getMarketId(), distributionStockLisEntity.getCargoNumber()); + if (Func.isNotBlank(allocationName)) { stockupInventoryListDetailExcel.setAllocationNames(allocationName); } @@ -3410,11 +3678,11 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl detailVOS = baseMapper.selectInventoryDetailByBillLadingIdAndStockListId(billLadingId,stockListId); + List detailVOS = baseMapper.selectInventoryDetailByBillLadingIdAndStockListId(billLadingId, stockListId); return R.data(detailVOS); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistrilbutionBillLadingServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistrilbutionBillLadingServiceImpl.java index 9775d9c1e..5807c3e76 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistrilbutionBillLadingServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistrilbutionBillLadingServiceImpl.java @@ -17,7 +17,7 @@ package com.logpm.distribution.service.impl; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.Wrapper; @@ -32,25 +32,55 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; import com.logpm.distribution.bean.Resp; +import com.logpm.distribution.dto.DistributionBillLadingExcelDTO; import com.logpm.distribution.dto.DistributionParcelListDTO; import com.logpm.distribution.dto.DistributionStockListDTO; import com.logpm.distribution.dto.DistrilbutionBillLadingDTO; +import com.logpm.distribution.dto.OrderStatusDTO; import com.logpm.distribution.dto.app.BillLadingAppDTO; import com.logpm.distribution.entity.*; +import com.logpm.distribution.excel.DistributionBillInventoryExcel; +import com.logpm.distribution.excel.DistributionBillOrderExcel; +import com.logpm.distribution.excel.DistributionBillOrderPackExcel; import com.logpm.distribution.excel.DistrilbutionBillLadingExcel; import com.logpm.distribution.mapper.DistributionStockListMapper; import com.logpm.distribution.mapper.DistrilbutionBillLadingMapper; import com.logpm.distribution.service.*; -import com.logpm.distribution.vo.*; -import com.logpm.distribution.vo.app.*; +import com.logpm.distribution.vo.DistributionDeliveryDetailsVO; +import com.logpm.distribution.vo.DistributionParcelNumberVO; +import com.logpm.distribution.vo.DistributionStockArticleVO; +import com.logpm.distribution.vo.DistributionStockListVO; +import com.logpm.distribution.vo.DistributionStockupOrderListVO; +import com.logpm.distribution.vo.DistrilbutionBillLadingAppVO; +import com.logpm.distribution.vo.DistrilbutionBillLadingDetailsVO; +import com.logpm.distribution.vo.DistrilbutionBillLadingOwnVO; +import com.logpm.distribution.vo.DistrilbutionBillLadingVO; +import com.logpm.distribution.vo.DistrilbutionBillLadingViewVO; +import com.logpm.distribution.vo.DistrilbutionBillStockVO; +import com.logpm.distribution.vo.app.DistrilbutionAppBillLadingDetailVO; +import com.logpm.distribution.vo.app.DistrilbutionAppBillLadingOrderMainVO; +import com.logpm.distribution.vo.app.DistrilbutionAppBillLadingOrderVO; +import com.logpm.distribution.vo.app.DistrilbutionAppBillLadingZeroOrderVO; +import com.logpm.distribution.vo.app.DistrilbutionAppBillLadingZeroVO; +import com.logpm.distribution.vo.app.DistrilbutionBillLadingInventoryAppVO; import com.logpm.distribution.wrapper.DistributionStockArticleWrapper; import com.logpm.factorydata.enums.BrandEnums; import com.logpm.factorydata.util.FactoryDataMessageSender; import com.logpm.factorydata.vo.NodePushMsg; +import com.logpm.factorydata.vo.PushData; +import com.logpm.oldproject.dto.SignPushDataContactDTO; +import com.logpm.oldproject.dto.SignPushDataDTO; +import com.logpm.oldproject.dto.SignPushDataUnitDTO; +import com.logpm.oldproject.feign.IOldSignPushClient; +import com.logpm.trunkline.feign.ITrunklinePackageTrackLogClient; import com.logpm.warehouse.feign.IWarehouseUpdownTypeClient; import lombok.extern.log4j.Log4j2; +import org.apache.logging.log4j.util.Strings; +import org.jetbrains.annotations.NotNull; import org.springblade.common.constant.DictBizConstant; import org.springblade.common.constant.Inventory.InventoryStockUpStatusConstant; +import org.springblade.common.constant.RabbitConstant; +import org.springblade.common.constant.RedisKeyConstant; import org.springblade.common.constant.WorkNodeEnums; import org.springblade.common.constant.billLading.BillLadingStatusConstant; import org.springblade.common.constant.common.IsOrNoConstant; @@ -65,6 +95,7 @@ import org.springblade.common.constant.reservation.ReservationPackageStatusConst import org.springblade.common.constant.stockup.StockAssignStatusConstant; import org.springblade.common.constant.stockup.StockupStatusConstant; import org.springblade.common.constant.stockup.StockupTypeConstant; +import org.springblade.common.utils.CommonUtil; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.redis.cache.BladeRedis; @@ -75,6 +106,9 @@ import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.system.cache.DictBizCache; +import org.springblade.system.entity.User; +import org.springblade.system.feign.IUserClient; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -85,7 +119,18 @@ import javax.annotation.Resource; import java.io.Serializable; import java.math.BigDecimal; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -101,56 +146,76 @@ import java.util.stream.Collectors; public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl implements IDistrilbutionBillLadingService { @Autowired - private IDistributionDeliveryChargeService distributionDeliveryChargeService; + private IDistributionDeliveryChargeService distributionDeliveryChargeService; @Autowired - private IDistributionDeliveryDetailsService distributionDeliveryDetailsService; + private IDistributionDeliveryDetailsService distributionDeliveryDetailsService; @Autowired - private IDistributionReservationService distributionReservationService; + private IDistributionReservationService distributionReservationService; @Autowired - private IDistributionPrintService distributionPrintService; + private IDistributionPrintService distributionPrintService; @Autowired - private IDistributionStockArticleService distributionStockArticleService; + private IDistributionStockArticleService distributionStockArticleService; @Autowired - private IDistributionParcelListService distributionParcelListService; + private IDistributionParcelListService distributionParcelListService; @Autowired - private IDistributionBillLadingScanService distributionBillLadingScanService; + private IDistributionBillLadingScanService distributionBillLadingScanService; @Autowired - private IDistrilbutionBillStockService distrilbutionBillStockService; + private DistrilbutionBillLadingMapper distrilbutionBillLadingMapper; + + @Autowired + private IDistrilbutionBillStockService distrilbutionBillStockService; @Autowired - private IDistributionStockupScanService distributionStockupScanService; + private IDistributionStockupScanService distributionStockupScanService; @Autowired - private IDistributionStockListService distributionStockListService; + private IDistributionStockListService distributionStockListService; @Autowired - private DistributionStockListMapper distributionStockListMapper; + private DistributionStockListMapper distributionStockListMapper; @Autowired - private IDistributionAsyncService distributionAsyncService; + private IDistributionAsyncService distributionAsyncService; @Autowired - private IDistributionStockService distributionStockService; + private IDistributionStockService distributionStockService; @Autowired @Lazy - private IDistributionStockupService distributionStockupService; + private IDistributionStockupService distributionStockupService; @Autowired - private IDistributionStockupInfoService distributionStockupInfoService; + private IDistributionStockupInfoService distributionStockupInfoService; @Autowired - private IBasicdataWarehouseClient basicdataWarehouseClient; + private IBasicdataWarehouseClient basicdataWarehouseClient; + @Autowired + private IDistributionReservationZeroPackageService distributionZeroPackageService; //零担配送记录 + @Autowired + private IDistributionParcelNumberService distributionParcelNumberService; //零担配送数量记录 @Autowired - private IDistributionReservationZeroPackageService distributionZeroPackageService; //零担配送记录 + private IDistrilbutionBillPackageService distrilbutionBillPackageService; @Autowired - private IDistributionParcelNumberService distributionParcelNumberService; //零担配送数量记录 + private IBasicdataWarehouseClient warehouseClient; @Autowired - private IDistrilbutionBillPackageService distrilbutionBillPackageService; + private IWarehouseUpdownTypeClient warehouseUpdownTypeClient; @Autowired - private IBasicdataWarehouseClient warehouseClient; + private IDisStockListDetailService disStockListDetailService; @Autowired - private IWarehouseUpdownTypeClient warehouseUpdownTypeClient; + private BladeRedis redis; + @Autowired - private IDisStockListDetailService disStockListDetailService; + private IUserClient userClient; + @Autowired - private BladeRedis redis; @Resource private FactoryDataMessageSender factoryDataMessageSender; + @Resource + private RabbitTemplate rabbitTemplate; + + @Autowired + private IOldSignPushClient oldSystemDataPushClient; + + @Autowired + private ITrunklinePackageTrackLogClient trunklinePackageTrackLogClient; + + @Autowired + private IDistributionNodeWorkService iDistributionNodeWorkService; + @Override @@ -287,6 +352,12 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl logs = new ArrayList<>(); + BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + if (Func.isEmpty(myCurrentWarehouse)) { + log.error("自提操作未进行仓库选择"); + return false; + } if (ObjectUtils.isNotNull(distrilbutionBillLading.getId())) { //判断是否已签收 DistrilbutionBillLadingEntity billLadingEntity = baseMapper.selectById(distrilbutionBillLading.getId()); @@ -298,13 +369,20 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl jsonObjects = updateBillPackeg(distrilbutionBillLading, myCurrentWarehouse, billLadingEntity.getPickupBatch()); + if (!jsonObjects.isEmpty()) { + logs.addAll(jsonObjects); + } } //修改零担数据 updetaParcelNum(distrilbutionBillLading); //修改图片 List printEntityList = distributionPrintService.list(Wrappers.query().lambda().eq(DistributionPrintEntity::getBillLadingId, distrilbutionBillLading.getId())); if (!printEntityList.isEmpty()) { + boolean blobFlag = printEntityList.stream().anyMatch(p -> p.getSite().contains("blob")); + if (blobFlag) { + throw new RuntimeException("图片上传失败!!!"); + } if (distrilbutionBillLading.getMark()) { //要删除 List collect = printEntityList.stream().map(DistributionPrintEntity::getId).collect(Collectors.toList()); @@ -324,139 +402,159 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl list = distributionDeliveryChargeService.list(Wrappers.query().lambda() .eq(DistributionDeliveryChargeEntity::getBillLading, distrilbutionBillLading.getId()) ); -// List deliveryChargeEntities = new ArrayList<>(); -// if (!list.isEmpty()) { -// list.forEach(i -> { -// String s = distrilbutionBillLading.getFei().get(i.getCost()); -// if (StringUtils.isNotBlank(s)) { -// //修改 -// DistributionDeliveryChargeEntity distributionDeliveryCharge = new DistributionDeliveryChargeEntity(); -// distributionDeliveryCharge.setId(i.getId()); -// distributionDeliveryCharge.setMoney(new BigDecimal(s)); -// distributionDeliveryCharge.setCost(i.getCost()); -// deliveryChargeEntities.add(distributionDeliveryCharge); -//// distributionDeliveryChargeService.updateById(distributionDeliveryCharge); -// distrilbutionBillLading.getFei().remove(i.getCost()); -// } else { -// //删除 -// distributionDeliveryChargeService.removeById(i.getId()); -// } -// }); -// } -// if (!deliveryChargeEntities.isEmpty()){ -// distributionDeliveryChargeService.updateBatchById(deliveryChargeEntities); -// } //修改订单数据 if (!distrilbutionBillLading.getStockArticleList().isEmpty()) { - boolean flag = handleOrder(distrilbutionBillLading); -// boolean order = getOrder(distrilbutionBillLading.getStockArticleList(), distrilbutionBillLading.getId()); - String orderIds = distrilbutionBillLading.getStockArticleList().stream().map(DistributionStockArticleEntity::getId).map(String::valueOf).collect(Collectors.joining(",")); - distrilbutionBillLading.setStockArticleId(orderIds); - this.updateById(distrilbutionBillLading); - - if (!flag) { - throw new ServiceException("修改失败!!"); - } - } - - /* else{ - updateOrder(distrilbutionBillLading); + List jsonObjects = handleOrder(distrilbutionBillLading, billLadingEntity.getPickupBatch()); + if (!jsonObjects.isEmpty()) { + logs.addAll(jsonObjects); + } + String orderIds = distrilbutionBillLading.getStockArticleList().stream().map(DistributionStockArticleEntity::getId).map(String::valueOf).collect(Collectors.joining(",")); + distrilbutionBillLading.setStockArticleId(orderIds); + this.updateById(distrilbutionBillLading); } - if(distrilbutionBillLading.getStockArticleList().isEmpty() && distrilbutionBillLading.getStockDTOList().isEmpty()){ - //取消全部订单 - updateOrder(distrilbutionBillLading); - updateStockBill(distrilbutionBillLading); - //取消自提任务 - baseMapper.deleteById(billLadingEntity.getId()); - }*/ //修改库存品 if (!distrilbutionBillLading.getStockDTOList().isEmpty()) { + List stockDTOList = distrilbutionBillLading.getStockDTOList(); + boolean flag = stockDTOList.stream().anyMatch(distributionStockListDTO -> Func.isEmpty(distributionStockListDTO.getInventoryQuantity()) || distributionStockListDTO.getInventoryQuantity().equals(0)); + if (flag) { + String collect = stockDTOList.stream().filter(distributionStockListDTO -> Func.isEmpty(distributionStockListDTO.getInventoryQuantity())).map(DistributionStockListDTO::getIncomingBatch).collect(Collectors.joining(",")); + log.info("自提修改库存品未填写数量>>>未填写库存品批次号:{}", collect); + throw new RuntimeException("请填写正确的库存品数量"); + } //全部库存品数据 List listDetails = distributionDeliveryDetailsService.list(Wrappers.query().lambda() .eq(DistributionDeliveryDetailsEntity::getBillLadingId, distrilbutionBillLading.getId()) + .ne(DistributionDeliveryDetailsEntity::getInventoryStatus, "2") ); + Map> map = new HashMap<>(); if (!listDetails.isEmpty()) { - List ids = new ArrayList<>(); - //有 - //修改 - listDetails.forEach(i -> { - boolean b = distrilbutionBillLading.getStockDTOList().stream().anyMatch(a -> i.getStockListId().equals(a.getId())); - //查询是否存签收扫描数量 + map = listDetails.stream().collect(Collectors.groupingBy(DistributionDeliveryDetailsEntity::getStockListId)); + } + for (DistributionStockListDTO distributionStockListDTO : stockDTOList) { + if (!map.isEmpty()) { + DistributionDeliveryDetailsEntity distributionDeliveryDetailsEntity = map.get(distributionStockListDTO.getId()).get(0); + Integer quantity = distributionDeliveryDetailsEntity.getQuantity(); + int i = quantity - distributionStockListDTO.getInventoryQuantity(); + DistributionDeliveryDetailsEntity deliveryDetails = new DistributionDeliveryDetailsEntity(); + deliveryDetails.setId(distributionDeliveryDetailsEntity.getId()); List list1 = distributionStockService.list(Wrappers.query().lambda() .eq(DistributionStockEntity::getBillLadingId, distrilbutionBillLading.getId()) - .eq(DistributionStockEntity::getStockListId, i.getStockListId()) + .eq(DistributionStockEntity::getStockListId, distributionDeliveryDetailsEntity.getStockListId()) .eq(DistributionStockEntity::getType, "2") ); - - - - if (b) { - //有 - Iterator iterator = distrilbutionBillLading.getStockDTOList().iterator(); - while (iterator.hasNext()) { - DistributionStockListDTO next = iterator.next(); - if (i.getStockListId().equals(next.getId())) { - DistributionDeliveryDetailsEntity deliveryDetails = new DistributionDeliveryDetailsEntity(); - deliveryDetails.setQuantity(next.getInventoryQuantity()); - deliveryDetails.setId(i.getId()); - distributionDeliveryDetailsService.updateById(deliveryDetails); - Integer inventoryQuantity = next.getInventoryQuantity(); //修改数量 - Integer quantity = i.getQuantity();//原来的数量 - int num = 0; - - if (inventoryQuantity > quantity) { - num = inventoryQuantity - quantity; //多 添加了数量 - //修改库存占用数量 - distributionAsyncService.getInventoryNumUpdate(i.getStockListId(), num, 1); - //kk备货 - if ("20".equals(i.getConditions())) { - //xiugai - DistributionDeliveryDetailsEntity d = new DistributionDeliveryDetailsEntity(); - d.setId(i.getId()); - d.setConditions(BillLadingStatusConstant.daitihuo.getValue()); - distributionDeliveryDetailsService.updateById(d); - } - } else if (inventoryQuantity < quantity) { - num = quantity - inventoryQuantity; //少 减少了数量 - /*if(list1.size() < 1){ - - }else{ - //有备货 - }*/ - - if ("20".equals(i.getConditions())) { - //todo 已完成 - - } else { - //todo 未完成 - int size = list1.size(); //扫描的数量 - int i1 = quantity - size; //未扫的数量 - if (i1 > num) { - //可以减少 - //修改库存占用数量 - distributionAsyncService.getInventoryNumUpdate(i.getStockListId(), num, 2); - } else { - //todo 未扫小于减少 - - } - - } + if (i != 0) { + deliveryDetails.setStockStatus("1"); + if (i > 0) { + deliveryDetails.setQuantity(distributionDeliveryDetailsEntity.getQuantity() - i); + + //减少 + //查询原有包件 + List stockListDetailEntities = disStockListDetailService.list(Wrappers.query().lambda() + .eq(DisStockListDetailEntity::getStockListId, distributionStockListDTO.getId()) + .eq(DisStockListDetailEntity::getReservationId, distrilbutionBillLading.getId()) + .ne(DisStockListDetailEntity::getStockPackageStatus, "2") + ); + boolean a = false; + if (!stockListDetailEntities.isEmpty()) { + int sum = stockListDetailEntities.stream().filter(f -> !Func.isEmpty(f.getStockPackageCode())).mapToInt(DisStockListDetailEntity::getNum).sum(); + log.info("自提修改库存品>>>>>>>>当前计划数量:{},备货数量:{}", deliveryDetails.getQuantity(), sum); +// 优先取消未备货 + if (sum > 0) { + //存在备货 + throw new RuntimeException("该库存品已备货无法减少"); + + } else { + //对于包件进行随机删除 + List ids = stockListDetailEntities.subList(0, i).stream().map(DisStockListDetailEntity::getId).collect(Collectors.toList()); + disStockListDetailService.removeBatchByIds(ids); + distributionAsyncService.getInventoryNumUpdate(distributionStockListDTO.getId(), i, 2); } - iterator.remove(); } - - } - } else { - - if (list1.isEmpty()) { - //取消库存占用数量 - distributionAsyncService.getInventoryNumUpdate(i.getStockListId(), i.getQuantity(), 2); + //回复对应库存品的冻结数量 + //删除对应的包件维度数据 + if (!list1.isEmpty()) { + int sum = list1.stream().mapToInt(DistributionStockEntity::getStockQuantity).sum(); + if (sum == deliveryDetails.getQuantity()) { + deliveryDetails.setStockStatus("3"); + } else { + deliveryDetails.setStockStatus("1"); + } + } + } else { + //增加 + //生成包件 + deliveryDetails.setQuantity(distributionDeliveryDetailsEntity.getQuantity() - i); + List disStockListDetailEntities = new ArrayList<>(); + for (int i1 = 0; i1 < -i; i1++) { + DisStockListDetailEntity disStockListDetailEntity = new DisStockListDetailEntity(); + disStockListDetailEntity.setReservationId(distrilbutionBillLading.getId()); + disStockListDetailEntity.setStockListId(distributionStockListDTO.getId()); + disStockListDetailEntity.setNum(1); + disStockListDetailEntity.setWarehouseId(distributionStockListDTO.getWarehouseId()); + disStockListDetailEntity.setWarehouseName(distributionStockListDTO.getWarehouseName()); + disStockListDetailEntity.setStockPackageStatus("3"); + disStockListDetailEntity.setStockLockingStatus("10"); + disStockListDetailEntity.setStockStatus("10"); + disStockListDetailEntity.setStockSignfoStatus("10"); + disStockListDetailEntity.setSku(distributionStockListDTO.getCargoNumber()); + disStockListDetailEntity.setStockType("10"); + disStockListDetailEntities.add(disStockListDetailEntity); + } + disStockListDetailService.saveBatch(disStockListDetailEntities); + //对于该库存品冻结数量进行增加 + distributionAsyncService.getInventoryNumUpdate(distributionStockListDTO.getId(), i, 2); + if (!list1.isEmpty()) { + deliveryDetails.setStockStatus("2"); + } } - //没有 删除 - ids.add(i.getId()); - + distributionDeliveryDetailsService.updateById(deliveryDetails); + } + } else { + DistributionDeliveryDetailsEntity deliveryDetails = new DistributionDeliveryDetailsEntity(); + deliveryDetails.setBillLadingId(distrilbutionBillLading.getId()); + deliveryDetails.setStockListId(distributionStockListDTO.getId()); + deliveryDetails.setQuantity(distributionStockListDTO.getInventoryQuantity()); + deliveryDetails.setInventoryStatus("3"); + deliveryDetails.setConditions("10"); + deliveryDetails.setStockStatus("1"); + distributionDeliveryDetailsService.save(deliveryDetails); + distributionAsyncService.getInventoryNumUpdate(deliveryDetails.getStockListId(), deliveryDetails.getQuantity(), 1); + //增加 + List disStockListDetailEntities = new ArrayList<>(); + for (int i1 = 0; i1 < deliveryDetails.getQuantity(); i1++) { + DisStockListDetailEntity disStockListDetailEntity = new DisStockListDetailEntity(); + disStockListDetailEntity.setReservationId(distrilbutionBillLading.getId()); + disStockListDetailEntity.setStockListId(distributionStockListDTO.getId()); + disStockListDetailEntity.setNum(1); + disStockListDetailEntity.setWarehouseId(distributionStockListDTO.getWarehouseId()); + disStockListDetailEntity.setWarehouseName(distributionStockListDTO.getWarehouseName()); + disStockListDetailEntity.setStockPackageStatus("3"); + disStockListDetailEntity.setStockLockingStatus("10"); + disStockListDetailEntity.setStockStatus("10"); + disStockListDetailEntity.setStockSignfoStatus("10"); + disStockListDetailEntity.setSku(distributionStockListDTO.getCargoNumber()); + disStockListDetailEntity.setStockType("10"); + disStockListDetailEntities.add(disStockListDetailEntity); } + disStockListDetailService.saveBatch(disStockListDetailEntities); + //进行包件维度的构建 + } + map.remove(distributionStockListDTO.getId()); + } + + if (!map.isEmpty()) { + List ids = new ArrayList<>(); + //进行删除 + map.forEach((k, v) -> { + ids.add(v.get(0).getId()); + distributionAsyncService.getInventoryNumUpdate(k, v.get(0).getQuantity(), 2); + //删除 + disStockListDetailService.remove(Wrappers.query().lambda() + .eq(DisStockListDetailEntity::getReservationId, distrilbutionBillLading.getId()) + .eq(DisStockListDetailEntity::getStockListId, k) + .eq(DisStockListDetailEntity::getStockPackageStatus, "2") + ); }); //删除没有的库存品 if (!ids.isEmpty()) { @@ -467,7 +565,9 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl list = distrilbutionBillStockService.list(Wrappers.query().lambda() - .eq(!distrilbutionBillLading.getStockArticleId().contains(","), DistrilbutionBillStockEntity::getStockArticleId, distrilbutionBillLading.getStockArticleId()) - .in(distrilbutionBillLading.getStockArticleId().contains(","), DistrilbutionBillStockEntity::getStockArticleId, distrilbutionBillLading.getStockArticleId().split(",")) - ); - if (!list.isEmpty()) { - for (DistrilbutionBillStockEntity i : list) { - DistributionStockArticleEntity byId = distributionStockArticleService.getById(i.getStockArticleId()); - if (byId.getStockupStatus().equals(OrderReservationStatusConstant.daiyuyue.getValue())) { - break; - } + if (Func.isNotEmpty(distrilbutionBillLading.getStockArticleId())) { + List list = distrilbutionBillStockService.list(Wrappers.query().lambda() + .eq(!distrilbutionBillLading.getStockArticleId().contains(","), DistrilbutionBillStockEntity::getStockArticleId, distrilbutionBillLading.getStockArticleId()) + .in(distrilbutionBillLading.getStockArticleId().contains(","), DistrilbutionBillStockEntity::getStockArticleId, distrilbutionBillLading.getStockArticleId().split(",")) + ); + if (!list.isEmpty()) { + for (DistrilbutionBillStockEntity i : list) { + DistributionStockArticleEntity byId = distributionStockArticleService.getById(i.getStockArticleId()); + if (byId.getStockupStatus().equals(OrderReservationStatusConstant.daiyuyue.getValue())) { + break; + } - List list1 = distributionParcelListService.list(Wrappers.query().lambda() - .eq(DistributionParcelListEntity::getStockArticleId, i.getStockArticleId())); - int sum = list1.stream().filter(ii -> ii.getOrderPackageReservationStatus().equals(OrderPackageReservationStatusConstant.daiyuyue.getValue())).collect(Collectors.toList()).stream().mapToInt(DistributionParcelListEntity::getQuantity).sum(); - if (sum == 0) { - log.debug("####{}当前订单备货包件为空,无法创建任务!", byId.getOrderCode()); - throw new ServiceException(byId.getOrderCode() + "当前订单备货包件为空,无法创建任务!"); + List list1 = distributionParcelListService.list(Wrappers.query().lambda() + .eq(DistributionParcelListEntity::getStockArticleId, i.getStockArticleId())); + int sum = list1.stream().filter(ii -> ii.getOrderPackageReservationStatus().equals(OrderPackageReservationStatusConstant.daiyuyue.getValue())).collect(Collectors.toList()).stream().mapToInt(DistributionParcelListEntity::getQuantity).sum(); + if (sum == 0) { + log.debug("####{}当前订单备货包件为空,无法创建任务!", byId.getOrderCode()); + throw new ServiceException(byId.getOrderCode() + "当前订单备货包件为空,无法创建任务!"); + } } - } + } } + + //新增 // distrilbutionBillLading.setConditions("1"); distrilbutionBillLading.setStockupCode(distributionReservationService.bianMa()); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String format = dateFormat.format(new Date()); distrilbutionBillLading.setPickupBatch("ZT" + format);//批次号 - BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); if (ObjectUtils.isNull(myCurrentWarehouse)) { throw new ServiceException("请选择仓库在操作!!!"); } distrilbutionBillLading.setWarehouseId(myCurrentWarehouse.getId()); // List parcelLisList = distrilbutionBillLading.getParcelLisList(); - Map> packageMap =null; - if (Func.isNotEmpty( distrilbutionBillLading.getBillPackageEntityList())){ - List packageEntityList= distrilbutionBillLading.getBillPackageEntityList(); + Map> packageMap = null; + if (Func.isNotEmpty(distrilbutionBillLading.getBillPackageEntityList())) { + List packageEntityList = distrilbutionBillLading.getBillPackageEntityList(); List packageisd = packageEntityList.stream().map(DistrilbutionBillPackageEntity::getParceListId).collect(Collectors.toList()); List distributionParcelListEntities = distributionParcelListService.listByIds(packageisd); - if (Func.isNotEmpty(distributionParcelListEntities)){ + if (Func.isNotEmpty(distributionParcelListEntities)) { packageMap = distributionParcelListEntities.stream().collect(Collectors.groupingBy(DistributionParcelListEntity::getStockArticleId)); - } } Map> zeroPackageMap = null; - if (Func.isNotEmpty( distrilbutionBillLading.getParcelLisList())){ + if (Func.isNotEmpty(distrilbutionBillLading.getParcelLisList())) { List zeroPackageList = distrilbutionBillLading.getParcelLisList(); zeroPackageMap = zeroPackageList.stream().collect(Collectors.groupingBy(DistributionParcelListDTO::getStockArticleId)); } this.saveDistrilbutionBillLading(distrilbutionBillLading); - - - //修改订单状态 -// if (StringUtils.isNotBlank(distrilbutionBillLading.getStockArticleId())) { -// String[] split = distrilbutionBillLading.getStockArticleId().split(","); -//// for (String s : split) { -//// //查询订单信息 -//// DistributionStockArticleEntity byId = distributionStockArticleService.getById(s); -//// //查询是否创建过 -//// DistributionStockArticleEntity distributionStockArticle = new DistributionStockArticleEntity(); -//// //添加订单和提货单关联 -//// DistrilbutionBillStockEntity distrilbutionBillStock = new DistrilbutionBillStockVO(); -//// distrilbutionBillStock.setBillLadingId(distrilbutionBillLading.getId()); -//// distrilbutionBillStock.setStockArticleId(Long.parseLong(s)); -//// distrilbutionBillStock.setConditions(BillLadingStatusConstant.daitihuo.getValue()); -//// distrilbutionBillStock.setOrderStatus("1"); -//// distrilbutionBillStockService.save(distrilbutionBillStock); -//// List packageEntityList = new ArrayList<>(); -//// if (ObjectUtils.isNotNull(distrilbutionBillLading.getBillPackageEntityList())) { -//// //添加自提包件信息 -////// List collect = new ArrayList<>(); -//// List collect = distrilbutionBillLading.getBillPackageEntityList().stream().filter(qqq -> qqq.getStockArticleId().toString().equals(s)).collect(Collectors.toList()); -//// if (!collect.isEmpty()) { -//// //有包件 -//// collect.stream().forEach(ss -> { -//// DistrilbutionBillPackageEntity billPackageEntity = new DistrilbutionBillPackageEntity(); -//// billPackageEntity.setBillLadingId(distrilbutionBillLading.getId()); -//// billPackageEntity.setPacketBarCode(ss.getPacketBarCode()); -//// billPackageEntity.setPacketBarStatus(1); -//// billPackageEntity.setParceListId(ss.getParceListId()); -//// billPackageEntity.setStockArticleId(ss.getStockArticleId()); -//// billPackageEntity.setPacketNumber(1); -//// billPackageEntity.setBillType(byId.getIsZero().equals("1") ? "2" : "1"); -//// packageEntityList.add(billPackageEntity); -//// }); -//// -//// List collect1 = collect.stream().map(DistrilbutionBillPackageEntity::getParceListId).collect(Collectors.toList()); -//// distributionAsyncService.updateParcelListReservation(collect1); -//// -////// //判断是否全部修改 -////// int i = byId.getHandQuantity() - collect.size(); -////// if (i > 0) { -////// //部分 -////// distributionStockArticle.setReservationStatus(OrderReservationStatusConstant.bufenyuyue.getValue()); -////// } -//// } else { -//// //没有包件 查询包件信息 -//// List packageEntityList1 = billPackInfo(s, distrilbutionBillLading.getId(), parcelLisList, byId); -//// if (packageEntityList1.isEmpty()) { -//// throw new ServiceException(byId.getOrderCode() + "没有可用包件信息!"); -//// } -//// packageEntityList.addAll(packageEntityList1); -//// -////// distributionStockArticle.setReservationStatus(OrderReservationStatusConstant.yiyueyue.getValue()); -//// } -//// } else { -//// //没有包件 查询包件信息 -//// List packageEntityList1 = billPackInfo(s, distrilbutionBillLading.getId(), parcelLisList, byId); -//// if (packageEntityList1.isEmpty()) { -//// throw new ServiceException(byId.getOrderCode() + "没有可用包件信息!"); -//// } -//// packageEntityList.addAll(packageEntityList1); -//// -////// distributionStockArticle.setReservationStatus(OrderReservationStatusConstant.yiyueyue.getValue()); -//// } -//// -////// int i1 = byId.getHandQuantity() + byId.getSigninQuantity(); //总数 -//// if (byId.getCompleteSet() == 2) { -//// //全部 -//// distributionStockArticle.setReservationStatus(OrderReservationStatusConstant.yiyueyue.getValue()); -//// -//// } else { -//// //部分 -//// distributionStockArticle.setReservationStatus(OrderReservationStatusConstant.bufenyuyue.getValue()); -//// } -//// -//// //判断是否改为已预约 -//// List parcelNumberList = distributionParcelNumberService.list(Wrappers.query().lambda() -//// .eq(DistributionParcelNumberEntity::getStockArticleId, s) -//// ); -//// if (!parcelNumberList.isEmpty()) { -//// //零担 -//// int handQuantity = parcelNumberList.stream().mapToInt(DistributionParcelNumberEntity::getHandQuantity).sum(); //在库总数量 -//// int sum = parcelNumberList.stream().mapToInt(DistributionParcelNumberEntity::getDeliveryQuantity).sum(); //配送数量 -//// int i = handQuantity - sum; -//// if (i > 0) { -//// //部分 -//// distributionStockArticle.setReservationStatus(OrderReservationStatusConstant.bufenyuyue.getValue()); -//// } else if (i == 0) { -//// //全部 -//// distributionStockArticle.setReservationStatus(OrderReservationStatusConstant.yiyueyue.getValue()); -//// } -//// } -//// distrilbutionBillPackageService.saveBatch(packageEntityList); -////// distributionStockArticle.setId(Long.parseLong(s)); -////// distributionStockArticleService.updateById(distributionStockArticle); -//// distributionStockArticleService.maintenanceOrderInfo(distributionStockArticle.getOrderCode(),myCurrentWarehouse.getId()); -//// } -// } - - List packageEntityList = new ArrayList<>(); if (StringUtils.isNotBlank(distrilbutionBillLading.getStockArticleId())) { String[] split = distrilbutionBillLading.getStockArticleId().split(","); @@ -646,11 +642,11 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl parcelListEntities = distributionParcelListService.list(Wrappers.query().lambda() .eq(DistributionParcelListEntity::getOrderPackageReservationStatus, OrderPackageReservationStatusConstant.daiyuyue.getValue()) @@ -675,25 +676,23 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl parcelListEntities = distributionParcelListService.list(Wrappers.query().lambda() .eq(DistributionParcelListEntity::getOrderPackageReservationStatus, OrderPackageReservationStatusConstant.daiyuyue.getValue()) @@ -704,35 +703,32 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl 0 || Func.isEmpty(distributionParcelListDTO.getQuantity()) ){ + if (distributionParcelListDTO.getQuantity() > 0 || Func.isEmpty(distributionParcelListDTO.getQuantity())) { DistributionReservationZeroPackageEntity distributionReservationZeroPackageEntity = new DistributionReservationZeroPackageEntity(); distributionReservationZeroPackageEntity.setParcelListId(distributionParcelListDTO.getId()); distributionReservationZeroPackageEntity.setCategoryName(distributionParcelListDTO.getFirsts()); @@ -751,16 +747,16 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl zeroOrderDetail = distributionStockArticleService.getZeroOrderDetail(Long.parseLong(s)); - if (Func.isNotEmpty(zeroOrderDetail)){ + if (Func.isNotEmpty(zeroOrderDetail)) { for (DistributionParcelNumberVO distributionParcelNumberVO : zeroOrderDetail) { DistributionReservationZeroPackageEntity distributionReservationZeroPackageEntity = new DistributionReservationZeroPackageEntity(); distributionReservationZeroPackageEntity.setRealityQuantity(0); @@ -780,18 +776,18 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl parcelNumberEntityList = distributionParcelNumberService.list(Wrappers.query().lambda() .in(DistributionParcelNumberEntity::getParcelListId, zeroPackageIds) ); List ids = parcelNumberEntityList.stream().filter(f -> f.getQuantity() == (f.getOutboundQuantity() + f.getDeliveryQuantity())).map(DistributionParcelNumberEntity::getParcelListId).collect(Collectors.toList()); packageIds.addAll(ids); } - if (!Func.isEmpty(packageIds)){ + if (!Func.isEmpty(packageIds)) { distributionParcelListService.update(new UpdateWrapper().lambda() - .in(DistributionParcelListEntity::getId,packageIds) - .set(DistributionParcelListEntity::getOrderPackageReservationStatus,OrderPackageReservationStatusConstant.yiyueyue.getValue()) + .in(DistributionParcelListEntity::getId, packageIds) + .set(DistributionParcelListEntity::getOrderPackageReservationStatus, OrderPackageReservationStatusConstant.yiyueyue.getValue()) ); } - distributionStockArticleService.maintenanceOrderInfo(stockArticleEntity.getOrderCode(),stockArticleEntity.getWarehouseId()); + distributionStockArticleService.maintenanceOrderInfo(stockArticleEntity.getOrderCode(), stockArticleEntity.getWarehouseId()); } - if (Func.isNotEmpty(packageEntityList)){ + if (Func.isNotEmpty(packageEntityList)) { distrilbutionBillPackageService.saveBatch(packageEntityList); } } - - //操作图片 if (!distrilbutionBillLading.getPrintList().isEmpty()) { addPrint(distrilbutionBillLading); } - + if (!distrilbutionBillLading.getStockDTOList().isEmpty()) { + boolean flag = distrilbutionBillLading.getStockDTOList().stream().anyMatch(distributionStockListDTO -> Func.isEmpty(distributionStockListDTO.getInventoryQuantity()) || distributionStockListDTO.getInventoryQuantity().equals(0)); + if (flag) { + String collect = distrilbutionBillLading.getStockDTOList().stream().filter(distributionStockListDTO -> Func.isEmpty(distributionStockListDTO.getInventoryQuantity())).map(DistributionStockListDTO::getIncomingBatch).collect(Collectors.joining(",")); + log.info("自提添加库存品未填写数量>>>未填写库存品批次号:{}", collect); + throw new RuntimeException("请填写正确的库存品数量"); + } + //没有 + List detailsEntities = new ArrayList<>(); + Boolean finalLas = las; + distrilbutionBillLading.getStockDTOList().forEach(i -> { + DistributionDeliveryDetailsEntity details = new DistributionDeliveryDetailsEntity(); + details.setBillLadingId(distrilbutionBillLading.getId()); + details.setStockListId(i.getId()); + details.setQuantity(i.getInventoryQuantity()); + details.setConditions(BillLadingStatusConstant.daitihuo.getValue()); + details.setRealityQuantity(0); + details.setInventoryStatus("1"); + List list = new ArrayList<>(); + for (int i1 = 0; i1 < details.getQuantity(); i1++) { + DisStockListDetailEntity disStockListDetailEntity = new DisStockListDetailEntity(); + disStockListDetailEntity.setReservationId(distrilbutionBillLading.getId()); + disStockListDetailEntity.setStockListId(details.getStockListId()); + disStockListDetailEntity.setNum(1); + disStockListDetailEntity.setWarehouseId(i.getWarehouseId()); + disStockListDetailEntity.setWarehouseName(i.getWarehouseName()); + disStockListDetailEntity.setStockPackageStatus("1"); + disStockListDetailEntity.setStockLockingStatus("10"); + disStockListDetailEntity.setStockStatus("10"); + disStockListDetailEntity.setStockSignfoStatus("10"); + disStockListDetailEntity.setSku(i.getCargoNumber()); + disStockListDetailEntity.setStockType("10"); + list.add(disStockListDetailEntity); + } + disStockListDetailService.saveBatch(list); + detailsEntities.add(details); + //修改库存数量 + distributionAsyncService.getInventoryNumUpdate(i.getId(), i.getInventoryQuantity(), 1); + }); + distributionDeliveryDetailsService.saveBatch(detailsEntities); + } } - //添加库存品信息 - if (!distrilbutionBillLading.getStockDTOList().isEmpty()) { - //没有 - List detailsEntities = new ArrayList<>(); - Boolean finalLas = las; - distrilbutionBillLading.getStockDTOList().forEach(i -> { - DistributionDeliveryDetailsEntity details = new DistributionDeliveryDetailsEntity(); - details.setBillLadingId(distrilbutionBillLading.getId()); - details.setStockListId(i.getId()); - details.setQuantity(i.getInventoryQuantity()); - details.setConditions(BillLadingStatusConstant.daitihuo.getValue()); - details.setRealityQuantity(0); - if (finalLas) { - details.setInventoryStatus("2"); - } else { - details.setInventoryStatus("1"); - } - detailsEntities.add(details); - //修改库存数量 - distributionAsyncService.getInventoryNumUpdate(i.getId(), i.getInventoryQuantity(), 1); - }); - distributionDeliveryDetailsService.saveBatch(detailsEntities); - } //添加费用 if (!distrilbutionBillLading.getFei().isEmpty()) { //删除和自提相关的所有费用 distributionDeliveryChargeService.update(Wrappers.update().lambda() - .eq(DistributionDeliveryChargeEntity::getBillLading,distrilbutionBillLading.getId()) - .set(DistributionDeliveryChargeEntity::getIsDeleted,1) + .eq(DistributionDeliveryChargeEntity::getBillLading, distrilbutionBillLading.getId()) + .set(DistributionDeliveryChargeEntity::getIsDeleted, 1) ); List listEntity = new ArrayList<>(); distrilbutionBillLading.getFei().forEach((k, v) -> { @@ -876,10 +887,62 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl parcelListEntities, BasicdataWarehouseEntity myCurrentWarehouse, DistrilbutionBillLadingDTO distrilbutionBillLading) { + // 包件按品牌分组 + try { + Map> parcelListMap = parcelListEntities.stream().collect(Collectors.groupingBy(DistributionParcelListEntity::getBrandName)); + if(CollUtil.isNotEmpty(parcelListMap)){ + for (Map.Entry> entry : parcelListMap.entrySet()) { + String key = entry.getKey(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("trainNumber", distrilbutionBillLading.getPickupBatch()); + jsonObject.put("receiver", distrilbutionBillLading.getConsignee()); + jsonObject.put("receiveAddr", myCurrentWarehouse.getName()); + jsonObject.put("receiveTel", distrilbutionBillLading.getCustomerTelephone()); + jsonObject.put("planDeliveryDate", DateUtil.formatDateTime(distrilbutionBillLading.getPickUpTime())); + List listEntities = entry.getValue(); + NodePushMsg msg = new NodePushMsg(); + msg.setNode(WorkNodeEnums.PLAN_BILLOFLADING); + msg.setBrand(BrandEnums.getByValue(key)); + msg.setOperator(AuthUtil.getNickName()); + msg.setOperatorTime(new Date()); + msg.setMain(jsonObject.toString()); + msg.setContent(listEntities.stream().map(item->{ + return PushData.builder() + .orderCode(item.getOrderCode()) + .packageCode(item.getOrderPackageCode()) + .warehouseName(myCurrentWarehouse.getName()) + .waybillNumber(item.getWaybillNumber()) + .build(); + }).collect(Collectors.toList())); + log.info("推送工厂数据:{}", JSONUtil.toJsonStr(msg)); + factoryDataMessageSender.sendNodeDataByBrand(msg); + + } + } + } catch (Exception e) { + log.error("推送签收数据给工厂失败 {}", e); + } + } + @NotNull + private static DistrilbutionBillPackageEntity getDistrilbutionBillPackageEntity(DistrilbutionBillLadingDTO distrilbutionBillLading, DistributionParcelListEntity parcelListEntity) { + DistrilbutionBillPackageEntity billPackageEntity = new DistrilbutionBillPackageEntity(); + billPackageEntity.setBillLadingId(distrilbutionBillLading.getId()); + billPackageEntity.setPacketBarStatus(1); + billPackageEntity.setBillType("1"); + billPackageEntity.setPacketNumber(parcelListEntity.getQuantity()); + billPackageEntity.setParceListId(parcelListEntity.getId()); + billPackageEntity.setStockArticleId(parcelListEntity.getStockArticleId()); + billPackageEntity.setPacketBarCode(parcelListEntity.getOrderPackageCode()); + return billPackageEntity; + } @Override @@ -940,13 +1003,15 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl list = Func.toLongList(distrilbutionBillLading.getPackageIds()); List distributionParcelListEntities = distributionParcelListService.listByIds(list); - if (distributionParcelListEntities.isEmpty()){ + if (distributionParcelListEntities.isEmpty()) { //查询包件信息失败 - log.error(method+"查询包件信息失败PackageIds:{}",distrilbutionBillLading.getPackageIds()); + log.error(method + "查询包件信息失败PackageIds:{}", distrilbutionBillLading.getPackageIds()); return R.fail("当前勾选存在包件数据错误,请联系管理员处理"); } //校验包件是否具备被签收的性质 - if (distributionParcelListEntities.stream().anyMatch(p-> !OrderPackageStatusConstant.yiruku.getValue().equals(p.getOrderPackageStatus()))) { + if (distributionParcelListEntities.stream().allMatch(p -> !OrderPackageStatusConstant.yiruku.getValue().equals(p.getOrderPackageStatus()))) { String collect = distributionParcelListEntities.stream().filter(p -> !OrderPackageStatusConstant.yiruku.getValue().equals(p.getOrderPackageStatus())).map(DistributionParcelListEntity::getOrderPackageCode).collect(Collectors.joining(",")); - log.error(method+"自提签收包件失败,不在库包件进行签收orderPackageCode:{}",collect); + log.error(method + "自提签收包件失败,不在库包件进行签收orderPackageCode:{}", collect); return R.fail("当前勾选存在包件不在库,请核对和进行操作"); } //进行订制品和零担的区分 Map> packageMap = distributionParcelListEntities.stream().collect(Collectors.groupingBy(DistributionParcelListEntity::getConditions)); List ladingScanEntities = new ArrayList<>(); - if (!packageMap.isEmpty()){ -// packageMap.forEach((k,v)->{ -// switch (k){ -// case 1: -// //定制品 -// for (DistributionParcelListEntity parcelListEntity : v) { -// DistributionBillLadingScanEntity distributionBillLadingScanEntity = new DistributionBillLadingScanEntity(); -// distributionBillLadingScanEntity.setPacketBarCode(parcelListEntity.getOrderPackageCode()); -// distributionBillLadingScanEntity.setScanType(3); -// distributionBillLadingScanEntity.setParcelListId(parcelListEntity.getId()); -// distributionBillLadingScanEntity.setOrderSelfNumbering(parcelListEntity.getOrderCode()); -// distributionBillLadingScanEntity.setStockArticleId(parcelListEntity.getStockArticleId()); -// distributionBillLadingScanEntity.setBillLadingId(distrilbutionBillLading.getId()); -// distributionBillLadingScanEntity.setMaterialType("2"); -// distributionBillLadingScanEntity.setQuantity(parcelListEntity.getQuantity()); -// ladingScanEntities.add(distributionBillLadingScanEntity); -// //修改包件状态 -// distributionParcelListService.update(Wrappers.update().lambda() -// .eq(DistributionParcelListEntity::getId,parcelListEntity.getId()) -// .set(DistributionParcelListEntity::getOrderPackageReservationStatus,OrderPackageReservationStatusConstant.yiyueyue.getValue()) -// .set(DistributionParcelListEntity::getOrderPackageLoadingStatus,OrderPackageLoadingStatusConstant.yizhuangche.getValue()) -// .set(DistributionParcelListEntity::getOrderPackageStatus,OrderPackageStatusConstant.yiqianshou.getValue()) -// ); -// //维护订单 -// orderCodes.add(parcelListEntity.getOrderCode()); -// } -// break; -// case 2: -// //零担 -// for (DistributionParcelListEntity parcelListEntity : v) { -// //查询计划零担数量 -// DistributionReservationZeroPackageEntity packageEntity = distributionZeroPackageService.getOne(Wrappers.query().lambda() -// .eq(DistributionReservationZeroPackageEntity::getReservationId, distrilbutionBillLading.getId()) -// .eq(DistributionReservationZeroPackageEntity::getType, "3") -// .eq(DistributionReservationZeroPackageEntity::getParcelListId, parcelListEntity.getId()) -// .ne(DistributionReservationZeroPackageEntity::getZeroPackageStatus, ReservationPackageStatusConstant.quxiao.getValue()) -// ); -// //维护零担品类在库信息 -// DistributionParcelNumberEntity distributionParcelNumberEntity = distributionParcelNumberService.getOne(Wrappers.query().lambda() -// .eq(DistributionParcelNumberEntity::getParcelListId, parcelListEntity.getId()) -// .eq(DistributionParcelNumberEntity::getStockArticleId, parcelListEntity.getStockArticleId()) -// ); -// //零担在库数不足进行签收 -// if (distributionParcelNumberEntity.getHandQuantity() < packageEntity.getQuantity()){ -// log.info(method+"零担签收数量不足,计划数量:{},在库数量:{}",packageEntity.getQuantity(),distributionParcelNumberEntity.getHandQuantity()); -// throw new RuntimeException("零担在库数不足此次签收!!"); -// } -// DistributionBillLadingScanEntity distributionBillLadingScanEntity = new DistributionBillLadingScanEntity(); -// distributionBillLadingScanEntity.setPacketBarCode(parcelListEntity.getOrderPackageCode()); -// distributionBillLadingScanEntity.setScanType(3); -// distributionBillLadingScanEntity.setParcelListId(parcelListEntity.getId()); -// distributionBillLadingScanEntity.setOrderSelfNumbering(parcelListEntity.getOrderCode()); -// distributionBillLadingScanEntity.setStockArticleId(parcelListEntity.getStockArticleId()); -// distributionBillLadingScanEntity.setBillLadingId(distrilbutionBillLading.getId()); -// distributionBillLadingScanEntity.setMaterialType("3"); -// distributionBillLadingScanEntity.setQuantity(packageEntity.getQuantity()); -// ladingScanEntities.add(distributionBillLadingScanEntity); -// //维护零担在库信息 -// int newHandQuantity = distributionParcelNumberEntity.getHandQuantity() - packageEntity.getQuantity(); -// int newDeliveryQuantity = distributionParcelNumberEntity.getDeliveryQuantity() - packageEntity.getQuantity(); -// int newOutboundQuantity = distributionParcelNumberEntity.getOutboundQuantity() + packageEntity.getQuantity(); -// int newSigninQuantity = distributionParcelNumberEntity.getSigninQuantity() + packageEntity.getQuantity(); -// log.info(method+"维护前零担品类在库数量,在库数量:{},冻结数量:{},出库数量:{},签收数量:{}", -// distributionParcelNumberEntity.getHandQuantity(), -// distributionParcelNumberEntity.getDeliveryQuantity(), -// distributionParcelNumberEntity.getOutboundQuantity(), -// distributionParcelNumberEntity.getSigninQuantity()); -// //修改零担品类 -// distributionParcelNumberEntity.setHandQuantity(newHandQuantity); -// distributionParcelNumberEntity.setDeliveryQuantity(newDeliveryQuantity); -// distributionParcelNumberEntity.setOutboundQuantity(newOutboundQuantity); -// distributionParcelNumberEntity.setSigninQuantity(newSigninQuantity); -// log.info(method+"维护后零担品类在库数量,在库数量:{},冻结数量:{},出库数量:{},签收数量:{}", -// distributionParcelNumberEntity.getHandQuantity(), -// distributionParcelNumberEntity.getDeliveryQuantity(), -// distributionParcelNumberEntity.getOutboundQuantity(), -// distributionParcelNumberEntity.getSigninQuantity()); -// distributionParcelNumberService.updateById(distributionParcelNumberEntity); -// if (newOutboundQuantity == parcelListEntity.getQuantity()){ -// //全部出库 -// parcelListEntity.setOrderPackageStatus(OrderPackageStatusConstant.yichuku.getValue()); -// parcelListEntity.setOrderPackageLoadingStatus(OrderPackageLoadingStatusConstant.yizhuangche.getValue()); -// parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.yiyueyue.getValue()); -// } -// if (newSigninQuantity == parcelListEntity.getQuantity()){ -// //全部签收 -// parcelListEntity.setOrderPackageStatus(OrderPackageStatusConstant.yiqianshou.getValue()); -// parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.yiyueyue.getValue()); -// } -// distributionParcelListService.updateById(parcelListEntity); -// orderCodes.add(parcelListEntity.getOrderCode()); -// } -// break; -// } -// -// }); - ladingScanEntities = handleSignPackage(packageMap, distrilbutionBillLading.getId(), myCurrentWarehouse.getId()); - - if (!ladingScanEntities.isEmpty()){ + if (!packageMap.isEmpty()) { + ladingScanEntities = handleSignPackage(packageMap, distrilbutionBillLading.getId(), myCurrentWarehouse); + if (!ladingScanEntities.isEmpty()) { // 进行签收扫描数据补录 distributionBillLadingScanService.saveBatch(ladingScanEntities); + String collect = ladingScanEntities.stream().map(DistributionBillLadingScanEntity::getPacketBarCode).collect(Collectors.joining(",")); + warehouseUpdownTypeClient.downPackageAndDelTrayAndIsUpdate(collect,myCurrentWarehouse.getId(),"后台PC自提签收下架",false); + } } + //维护自提单状态 + distrilbutionBillLading.setConditions(BillLadingStatusConstant.yitihuo.getValue()); + distributionBillLadingScanService.list(Wrappers.query().lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, distrilbutionBillLading.getId()) + ); return R.success("操作成功"); } + @Override + public Boolean clerkBillCheckPushData(Long billId) { + + try { + //得到审核的任务ID + + //得到签收对象 + DistrilbutionBillLadingEntity billLadingEntity = distrilbutionBillLadingMapper.selectById(billId); + + //需要检测文员是否进行复核了 + + if (org.springblade.core.tool.utils.ObjectUtil.isEmpty(billLadingEntity)) { + log.info(">>>>>>>>>>>> clerkBillCheckPushData billLadingEntity {}", billLadingEntity); + return false; + } + + //组合配送信息 + SignPushDataDTO delivery = distrilbutionBillLadingMapper.getSignPushDataDTO(billId); + + //还需要配送的出库人、配送人、操作人信息 + if (Func.isNotEmpty(delivery)) { + R userR = userClient.userInfoById(delivery.getAdministratorsId()); + if (Func.isNotEmpty(userR)) { + User user = userR.getData(); + delivery.setAdministratorsName(user.getName()); + delivery.setAdministratorsPhone(user.getPhone()); + delivery.setOutPhone(user.getPhone()); + delivery.setOutId(user.getId()); + delivery.setOutName(user.getName()); + } + //查询客户信息 + List customer = distrilbutionBillLadingMapper.selectPushOldCustomer(billId); + if (Func.isNotEmpty(customer)) { + //查询客户订单 + List signPushDataUnitDTOS = new ArrayList<>(); + //查询包件扫描签收 + //查询包件扫描签收 + List pushOldPackageSigning = distrilbutionBillLadingMapper.selectPushOldPackageSigning(billId); + List pushOldInventorySigning = distrilbutionBillLadingMapper.selectPushOldInventorySigning(billId); + if (Func.isNotEmpty(pushOldPackageSigning)) { + buildNameAndPhone(pushOldPackageSigning); + signPushDataUnitDTOS.addAll(pushOldPackageSigning); + } + if (Func.isNotEmpty(pushOldInventorySigning)) { + buildNameAndPhone(pushOldPackageSigning); + signPushDataUnitDTOS.addAll(pushOldPackageSigning); + } + buildClientNameAndPhone(customer); + customer.get(0).setSignPushDataUnitDTOs(signPushDataUnitDTOS); + //完成客户信息添加 + delivery.setSignPushDataContactDTOs(customer); + + } + } + // 转换仓库ID +// modifyWarehouseId(delivery); + + Boolean b = oldSystemDataPushClient.pushOldSystemSignInfo(delivery); + return b; + } catch (Exception e) { + log.error(">>>>> 推送老系统自提签收信息报错", e); + return false; + } + } + + @Override + public DistributionBillLadingExcelDTO exportDistributionBillLadingDetail(Long id) { + String method = "################# 导出配送单明细 #################exportDistributionBillLadingDetail"; + if (Objects.isNull(id)) { + log.error(method + "ids参数缺失:{}", id); + } + DistributionBillLadingExcelDTO distributionBillLadingExcelDTO = new DistributionBillLadingExcelDTO(); + List distributionBillOrderExcels = distrilbutionBillStockService.distrilbutionBillDeatilStock(id); + if (!distributionBillOrderExcels.isEmpty()) { + distributionBillLadingExcelDTO.setBillOrderExcelList(distributionBillOrderExcels); + } + List distributionBillOrderPackExcels = distrilbutionBillStockService.billLadingDetailOrderPackExcel(id); + if (!distributionBillOrderPackExcels.isEmpty()) { + distributionBillLadingExcelDTO.setBillOrderPackExcelList(distributionBillOrderPackExcels); + } + List billInventoryExcelList = distributionDeliveryDetailsService.getBillLadingDetailOrderInventoryExcel(id); + if (!billInventoryExcelList.isEmpty()) { + distributionBillLadingExcelDTO.setBillInventoryExcelList(billInventoryExcelList); + } + return distributionBillLadingExcelDTO; + } + + @Override + public R getBillLadingPackageIds(Long id, Long orderId) { + List list = distrilbutionBillPackageService.list(Wrappers.query().lambda() + .eq(DistrilbutionBillPackageEntity::getBillLadingId, id) + .eq(DistrilbutionBillPackageEntity::getStockArticleId, orderId) + .ne(DistrilbutionBillPackageEntity::getPacketBarStatus, "2") + ); + if (list.isEmpty()) { + return null; + } + return R.data(list.stream().map(DistrilbutionBillPackageEntity::getParceListId).collect(Collectors.toList())); + } + + @Override + public void sendFactory(String string) { + List list = Func.toLongList(string); + BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + if (Func.isEmpty(myCurrentWarehouse)) { + log.error("自提推送工厂为进行仓库选择?>>>>>>>>>>>>>>>>>>>>warehouse:{}", myCurrentWarehouse); + } + if (!list.isEmpty()) { + for (Long l : list) { + DistrilbutionBillLadingEntity billLadingEntity = this.getById(l); + BasicdataWarehouseEntity entityWarehouse= warehouseClient.getEntityWarehouseId(billLadingEntity.getWarehouseId()); + distributionAsyncService.sendFactorySignforInfo(l + "", entityWarehouse, AuthUtil.getUser()); + + } + } + } + + /** + * 转换老系统的ID + * + * @param delivery + */ + private void modifyWarehouseId(SignPushDataDTO delivery) { + + if (!Objects.isNull(delivery.getWarehouseId())) { + // 查询老系统的ID + BasicdataWarehouseEntity entityWarehouseId = warehouseClient.getEntityWarehouseId(delivery.getWarehouseId()); + if (Objects.nonNull(entityWarehouseId)) { + delivery.setWarehouseId(Long.parseLong(entityWarehouseId.getOldId() + "")); + } + } + + } + + + /** + * 构建名称和电话号码 + * + * @param pushOldPackageSigning + */ + private void buildNameAndPhone(List pushOldPackageSigning) { + for (SignPushDataUnitDTO signPushDataUnitDTO : pushOldPackageSigning) { + User user = redis.get(RedisKeyConstant.USER_NAME_PHONE_KEY + signPushDataUnitDTO.getAdministratorsId()); + log.info("buildNameAndPhone >>> 获取缓存的中的用户信息{}", user); + if (user == null) { + R userT = userClient.userInfoById(signPushDataUnitDTO.getAdministratorsId()); + if (userT.isSuccess()) { + user = userT.getData(); + redis.setEx(RedisKeyConstant.USER_NAME_PHONE_KEY + signPushDataUnitDTO.getAdministratorsId(), user, 3600L); + } + } + if (ObjectUtils.isNotNull(user)) { + assert user != null; + signPushDataUnitDTO.setAdministratorsName(user.getName()); + if (ObjectUtils.isNotEmpty(user.getPhone())) { + signPushDataUnitDTO.setAdministratorsPhone(user.getPhone()); + } else { + if (ObjectUtils.isNotEmpty(user.getAccount())) { + signPushDataUnitDTO.setAdministratorsPhone(user.getAccount()); + } else { + log.info("用户无电话号码且账号信息为空>>用户名称:{}", user.getName()); + } + } + } + + } + } + + /** + * 构建名称和电话号码 + * + * @param customer + */ + private void buildClientNameAndPhone(List customer) { + for (SignPushDataContactDTO signPushDataUnitDTO : customer) { + User user = redis.get(RedisKeyConstant.USER_NAME_PHONE_KEY + signPushDataUnitDTO.getSignUserId()); + log.info("buildNameAndPhone >>> 获取缓存的中的用户信息{}", user); + if (user == null) { + R userT = userClient.userInfoById(signPushDataUnitDTO.getSignUserId()); + if (userT.isSuccess()) { + user = userT.getData(); + redis.setEx(RedisKeyConstant.USER_NAME_PHONE_KEY + signPushDataUnitDTO.getSignUserId(), user, 3600L); + } + } + if (ObjectUtils.isNotNull(user)) { + assert user != null; + signPushDataUnitDTO.setSignUserName(user.getName()); + if (ObjectUtils.isNotEmpty(user.getPhone())) { + signPushDataUnitDTO.setSignUserPhone(user.getPhone()); + signPushDataUnitDTO.setPhone(user.getPhone()); + } else { + if (ObjectUtils.isNotEmpty(user.getAccount())) { + signPushDataUnitDTO.setSignUserPhone(user.getAccount()); + signPushDataUnitDTO.setPhone(user.getPhone()); + } else { + log.info("用户无电话号码且账号信息为空>>用户名称:{}", user.getName()); + } + } + } + } + } - public List handleSignPackage(Map> packageMap,Long id,Long warehouseId){ + public List handleSignPackage(Map> packageMap, Long id, BasicdataWarehouseEntity myCurrentWarehouse) { String method = "###################DistributionBillLadingServiceImpl.handleSignPackage"; List ladingScanEntities = new ArrayList<>(); List orderCodes = new ArrayList<>(); - packageMap.forEach((k,v)->{ - switch (k){ + packageMap.forEach((k, v) -> { + switch (k) { case 1: //定制品 for (DistributionParcelListEntity parcelListEntity : v) { + if (OrderPackageStatusConstant.yiqianshou.getValue().equals(parcelListEntity.getOrderPackageStatus())) { + continue; + } DistributionBillLadingScanEntity distributionBillLadingScanEntity = new DistributionBillLadingScanEntity(); distributionBillLadingScanEntity.setPacketBarCode(parcelListEntity.getOrderPackageCode()); distributionBillLadingScanEntity.setScanType(3); + distributionBillLadingScanEntity.setScanUser(AuthUtil.getUser().getNickName()); distributionBillLadingScanEntity.setParcelListId(parcelListEntity.getId()); distributionBillLadingScanEntity.setOrderSelfNumbering(parcelListEntity.getOrderCode()); distributionBillLadingScanEntity.setStockArticleId(parcelListEntity.getStockArticleId()); distributionBillLadingScanEntity.setBillLadingId(id); + distributionBillLadingScanEntity.setWarehouseId(myCurrentWarehouse.getId()); distributionBillLadingScanEntity.setMaterialType("2"); distributionBillLadingScanEntity.setQuantity(parcelListEntity.getQuantity()); ladingScanEntities.add(distributionBillLadingScanEntity); //修改包件状态 distributionParcelListService.update(Wrappers.update().lambda() - .eq(DistributionParcelListEntity::getId,parcelListEntity.getId()) - .set(DistributionParcelListEntity::getOrderPackageReservationStatus,OrderPackageReservationStatusConstant.yiyueyue.getValue()) - .set(DistributionParcelListEntity::getOrderPackageLoadingStatus,OrderPackageLoadingStatusConstant.yizhuangche.getValue()) - .set(DistributionParcelListEntity::getOrderPackageStatus,OrderPackageStatusConstant.yiqianshou.getValue()) + .eq(DistributionParcelListEntity::getId, parcelListEntity.getId()) + .set(DistributionParcelListEntity::getOrderPackageReservationStatus, OrderPackageReservationStatusConstant.yiyueyue.getValue()) + .set(DistributionParcelListEntity::getOrderPackageLoadingStatus, OrderPackageLoadingStatusConstant.yizhuangche.getValue()) + .set(DistributionParcelListEntity::getOrderPackageStatus, OrderPackageStatusConstant.yiqianshou.getValue()) ); //维护订单 orderCodes.add(parcelListEntity.getOrderCode()); + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); +// ---------------------------------2023-09-09 包件签收调整--------------------------------------------------------------- + String singleTime = simpleDateFormat.format(new Date()); + // 推送自提作业节点数据 + sendNodeWorkDataBroadcast(parcelListEntity,id,singleTime,myCurrentWarehouse); } break; case 2: @@ -1219,13 +1408,14 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl packageIds = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getId).collect(Collectors.toList()); //将这些包件还原成可操作状态 Integer num = distributionParcelListService.restorePakcageByIds(packageIds); - log.info("######################取消自提单释放包件>>>>>:{}",num); - ids.forEach(id ->{ + log.info("######################取消自提单释放包件>>>>>:{}", num); + ids.forEach(id -> { //查询自提单存在的零担订单 List reservationZeroPackageEntities = distributionZeroPackageService.list(Wrappers.query().lambda() .eq(DistributionReservationZeroPackageEntity::getReservationId, id) .ne(DistributionReservationZeroPackageEntity::getZeroPackageStatus, "2") ); - if (Func.isNotEmpty(reservationZeroPackageEntities)){ + if (Func.isNotEmpty(reservationZeroPackageEntities)) { List collect = reservationZeroPackageEntities.stream().map(DistributionReservationZeroPackageEntity::getStockArticleId).distinct().collect(Collectors.toList()); //释放零担资源 - distributionZeroPackageService.recoverZeroPackage(id,collect); + distributionZeroPackageService.recoverZeroPackage(id, collect); } }); //维护订单状态 @@ -1417,14 +1607,16 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl updateBillPackeg(DistrilbutionBillLadingDTO distrilbutionBillLading, BasicdataWarehouseEntity warehouse, String pickupBatch) { List packageIds = new ArrayList<>(); List finalPackageIds = packageIds; + List aaa = new ArrayList<>(); distrilbutionBillLading.getBillPackageEntityList().stream().collect(Collectors.groupingBy(DistrilbutionBillPackageEntity::getStockArticleId)) .forEach((k, v) -> { List list = distrilbutionBillPackageService.list(Wrappers.query().lambda() .eq(DistrilbutionBillPackageEntity::getBillLadingId, distrilbutionBillLading.getId()) .eq(DistrilbutionBillPackageEntity::getStockArticleId, k) + .ne(DistrilbutionBillPackageEntity::getPacketBarStatus, "2") ); //没有数据 if (list.isEmpty()) { @@ -1452,9 +1644,13 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl collect = packageEntityList.stream().map(i -> i.getParceListId()).collect(Collectors.toList()); @@ -1463,6 +1659,13 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl distributionParcelListEntities = distributionParcelListService.listByIds(collect); + if(CollUtil.isNotEmpty(distributionParcelListEntities)){ + sendFactoryPlan(distributionParcelListEntities, warehouse, distrilbutionBillLading); + } + } } }); @@ -1477,31 +1680,41 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl distributionParcelListEntities = distributionParcelListService.listByIds(collect); + for (DistributionParcelListEntity distributionParcelListEntity : distributionParcelListEntities) { + String content = "包件在" + warehouse.getName() + "由" + AuthUtil.getNickName() + "取消计划自提,操作方式:订单取消勾选包件,自提批次号:" + pickupBatch; + JSONObject js = handleLogJSONObject(warehouse, AuthUtil.getUser(), distributionParcelListEntity.getOrderPackageCode(), content, WorkNodeEnums.CANCEL_BILLOFLADING.getCode()); + aaa.add(js); + } packageIds.addAll(collect); if (!update) { throw new ServiceException("修改失败!!!"); } + //维护对应的订单状态 + List orderIds = distrilbutionBillLading.getUnBillPackageEntityList().stream().map(e -> e.getStockArticleId()).distinct().collect(Collectors.toList()); + + distributionStockArticleService.maintenanceOrderInfoByIds(orderIds); } //维护订单状态 - if (!packageIds.isEmpty()){ + if (!packageIds.isEmpty()) { //查询所有的包件 packageIds = packageIds.stream().distinct().collect(Collectors.toList()); List distributionParcelListEntities = distributionParcelListService.listByIds(packageIds); String orderCodes = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getOrderCode).collect(Collectors.joining(",")); List warehouseIds = distributionParcelListEntities.stream().map(DistributionParcelListEntity::getWarehouseId).distinct().collect(Collectors.toList()); - if (!warehouseIds.isEmpty()){ - if (warehouseIds.size() == 1){ - distributionStockArticleService.maintenanceOrderInfo(orderCodes,warehouseIds.get(0)); - }else { - log.error("#################自提订制品包件缺失warehouseId错误warehouseIds:{}",warehouseIds); + if (!warehouseIds.isEmpty()) { + if (warehouseIds.size() == 1) { + distributionStockArticleService.maintenanceOrderInfo(orderCodes, warehouseIds.get(0)); + } else { + log.error("#################自提订制品包件缺失warehouseId错误warehouseIds:{}", warehouseIds); throw new ServiceException("修改失败!!!"); } - }else { - log.error("#################自提订制品包件缺失warehouseId信息packageIds:{}",packageIds); + } else { + log.error("#################自提订制品包件缺失warehouseId信息packageIds:{}", packageIds); throw new ServiceException("修改失败!!!"); } } - return true; + return aaa; } @@ -1540,17 +1753,17 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl 0) { //减少了 distributionParcelNumberService.updateBillNum(i.getParcelListId(), i1, 1); } else if (i1 < 0) { //增加了 - distributionParcelNumberService.updateBillNum(i.getParcelListId(),i1, 1); + distributionParcelNumberService.updateBillNum(i.getParcelListId(), i1, 1); } else { //不做操作! iterator.remove(); @@ -1567,26 +1780,26 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl distributionStockArticleEntities = collect.get(i.getStockArticleId()); - if (Func.isEmpty(distributionStockArticleEntities)){ + if (Func.isEmpty(distributionStockArticleEntities)) { longs.add(i.getParcelListId()); } } } List distributionStockArticleEntities = collect.get(i.getStockArticleId()); - if (!Func.isEmpty(distributionStockArticleEntities)){ + if (!Func.isEmpty(distributionStockArticleEntities)) { String orderCode = distributionStockArticleEntities.get(0).getOrderCode(); Long warehouseId = distributionStockArticleEntities.get(0).getWarehouseId(); - log.info("#############维护零担订单信息:{},:{}",orderCode,warehouseId); - distributionStockArticleService.maintenanceOrderInfo(orderCode,warehouseId); + log.info("#############维护零担订单信息:{},:{}", orderCode, warehouseId); + distributionStockArticleService.maintenanceOrderInfo(orderCode, warehouseId); } }); if (!longs.isEmpty()) { // distributionZeroPackageService.deleteLogic(longs); //进行零担在库数量恢复 - distributionZeroPackageService.recoverZeroPackage(distrilbutionBillLadingDTO.getId(),longs); + distributionZeroPackageService.recoverZeroPackage(distrilbutionBillLadingDTO.getId(), longs); // distributionZeroPackageService.cancelZeroPackage(longs); } @@ -1617,11 +1830,12 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl handleOrder(DistrilbutionBillLadingDTO distrilbutionBillLading, String pickupBatch) { BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); - if (Func.isEmpty(myCurrentWarehouse)){ - return false; + if (Func.isEmpty(myCurrentWarehouse)) { + throw new RuntimeException("未授权!!!"); } + List aaa = new ArrayList<>(); List stockArticleList = distrilbutionBillLading.getStockArticleList(); //查询此自提单已经存在的包件信息 List entityList = distrilbutionBillStockService.list(Wrappers.query().lambda() @@ -1631,77 +1845,72 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl orderIds = new ArrayList<>(); //订制品选择包件 Map> packageMap = null; - if (Func.isNotEmpty(distrilbutionBillLading.getBillPackageEntityList())){ - packageMap = distrilbutionBillLading.getBillPackageEntityList().stream().collect(Collectors.groupingBy(DistrilbutionBillPackageEntity::getStockArticleId)); + if (Func.isNotEmpty(distrilbutionBillLading.getBillPackageEntityList())) { + packageMap = distrilbutionBillLading.getBillPackageEntityList().stream().collect(Collectors.groupingBy(DistrilbutionBillPackageEntity::getStockArticleId)); } //零担包件信息 - Map> zerpPackageMap = null; - if (Func.isNotEmpty( distrilbutionBillLading.getParcelLisList())){ - zerpPackageMap = distrilbutionBillLading.getParcelLisList().stream().collect(Collectors.groupingBy(DistributionParcelListDTO::getStockArticleId)); + Map> zerpPackageMap = null; + if (Func.isNotEmpty(distrilbutionBillLading.getParcelLisList())) { + zerpPackageMap = distrilbutionBillLading.getParcelLisList().stream().collect(Collectors.groupingBy(DistributionParcelListDTO::getStockArticleId)); } //收集需要进行维护的订单 List orderCodes = new ArrayList<>(); - stockArticleList.forEach(s->{ - if (!entityList.isEmpty()){ + stockArticleList.forEach(s -> { + if (!entityList.isEmpty()) { boolean flag = entityList.stream().anyMatch(a -> s.getId().equals(a.getStockArticleId())); - if (flag){ + if (flag) { //存在计划中 Iterator iterator = entityList.iterator(); - while (iterator.hasNext()){ + while (iterator.hasNext()) { DistrilbutionBillStockEntity next = iterator.next(); - if (next.getStockArticleId().equals(s.getId())){ + if (next.getStockArticleId().equals(s.getId())) { iterator.remove(); } } - }else { + } else { orderIds.add(s.getId()); } - }else { + } else { //整单新增 orderIds.add(s.getId()); } }); - //取消订单 - if (!entityList.isEmpty()){ + //取消订单 + if (!entityList.isEmpty()) { for (DistrilbutionBillStockEntity distrilbutionBillStock : entityList) { DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(distrilbutionBillStock.getStockArticleId()); - if (Func.isEmpty(stockArticleEntity)){ + if (Func.isEmpty(stockArticleEntity)) { //订单数据错误 - log.error(">>>>>>>>>>>>>>>>>>>>>自提取消订单错误stockArticleEntityId:{}",distrilbutionBillStock.getStockArticleId()); - return false; + log.error(">>>>>>>>>>>>>>>>>>>>>自提取消订单错误stockArticleEntityId:{}", distrilbutionBillStock.getStockArticleId()); } //查询是取消零担还是取消订制品 - if (IsOrNoConstant.no.getValue().equals(stockArticleEntity.getIsZero())){ - distrilbutionBillPackageService.update(Wrappers.update() - .eq("stock_article_id", distrilbutionBillStock.getStockArticleId()) - .eq("bill_lading_id", distrilbutionBillStock.getBillLadingId()) - .set("packet_bar_status", ReservationPackageStatusConstant.quxiao.getValue()) + if (IsOrNoConstant.no.getValue().equals(stockArticleEntity.getIsZero())) { + List list = distrilbutionBillPackageService.list(Wrappers.query().lambda() + .eq(DistrilbutionBillPackageEntity::getBillLadingId, distrilbutionBillLading.getId()) + .eq(DistrilbutionBillPackageEntity::getStockArticleId, distrilbutionBillStock.getStockArticleId()) + .ne(DistrilbutionBillPackageEntity::getPacketBarStatus, "2") ); + + if (!list.isEmpty()) { + for (DistrilbutionBillPackageEntity billPackageEntity : list) { + String content = "包件在" + myCurrentWarehouse.getName() + "由" + AuthUtil.getNickName() + "取消计划自提,操作方式:移除订单,自提批次号:" + pickupBatch; + JSONObject js = handleLogJSONObject(myCurrentWarehouse, AuthUtil.getUser(), billPackageEntity.getPacketBarCode(), content, WorkNodeEnums.CANCEL_BILLOFLADING.getCode()); + aaa.add(js); + + billPackageEntity.setPacketBarStatus(2); + distrilbutionBillPackageService.updateById(billPackageEntity); + List packageIds = list.stream().map(DistrilbutionBillPackageEntity::getParceListId).collect(Collectors.toList()); + distributionParcelListService.update(Wrappers.update().lambda() + .in(DistributionParcelListEntity::getId, packageIds) + .set(DistributionParcelListEntity::getOrderPackageReservationStatus, OrderPackageReservationStatusConstant.daiyuyue.getValue()) + ); + } + } + + } -// else if (IsOrNoConstant.yes.getValue().equals(stockArticleEntity.getIsZero())){ -// //维护零担品类的数量 -// //查询零担信息 -// List reservationZeroPackageEntities = distributionZeroPackageService.list(Wrappers.query().lambda() -// .eq(DistributionReservationZeroPackageEntity::getReservationId, distrilbutionBillStock.getBillLadingId()) -// .eq(DistributionReservationZeroPackageEntity::getStockArticleId, distrilbutionBillStock.getStockArticleId()) -// .ne(DistributionReservationZeroPackageEntity::getZeroPackageStatus, ReservationPackageStatusConstant.quxiao.getValue()) -// ); -// if (!reservationZeroPackageEntities.isEmpty()){ -// List collect = reservationZeroPackageEntities.stream().map(DistributionReservationZeroPackageEntity::getParcelListId).collect(Collectors.toList()); -// distributionZeroPackageService.recoverZeroPackage(distrilbutionBillStock.getBillLadingId(),collect); -// distributionZeroPackageService.update(Wrappers.update().lambda() -// .eq(DistributionReservationZeroPackageEntity::getReservationId,distrilbutionBillStock.getBillLadingId()) -// .eq(DistributionReservationZeroPackageEntity::getStockArticleId,distrilbutionBillStock.getStockArticleId()) -// .set(DistributionReservationZeroPackageEntity::getZeroPackageStatus,ReservationPackageStatusConstant.quxiao.getValue()) -// .set(DistributionReservationZeroPackageEntity::getQuantity,0) -// ); -// } -// }else { -// log.error(">>>>>>>>>>>>>>>>>>>>>自提取消订单错误stockArticleEntityId:{}",distrilbutionBillStock.getStockArticleId()); -// return false; -// } distrilbutionBillStock.setOrderStatus("2"); distrilbutionBillStockService.updateById(distrilbutionBillStock); orderCodes.add(stockArticleEntity.getOrderCode()); @@ -1713,39 +1922,39 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl packageEntityList = new ArrayList<>(); //剩下的计划内就是需要进行取消的 //订单新增 - if (!orderIds.isEmpty()){ + if (!orderIds.isEmpty()) { List addOrderIds = new ArrayList<>(); List zeroOrderIds = new ArrayList<>(); for (Long orderId : orderIds) { DistributionStockArticleEntity stockArticleEntity = distributionStockArticleService.getById(orderId); - if (Func.isEmpty(stockArticleEntity)){ - return false; + if (Func.isEmpty(stockArticleEntity)) { + throw new RuntimeException("查询订单信息失败"); } - if (IsOrNoConstant.no.getValue().equals(stockArticleEntity.getIsZero())){ + if (IsOrNoConstant.no.getValue().equals(stockArticleEntity.getIsZero())) { //定制品 - if (Func.isNotEmpty(packageMap)){ + if (Func.isNotEmpty(packageMap)) { //订制品都未进行包件的选择,需要对新增的订单进行可用包件全部添加 - if (Func.isEmpty(packageMap.get(stockArticleEntity.getId()))){ + if (Func.isEmpty(packageMap.get(stockArticleEntity.getId()))) { //对该订单下所有包件进行计划的添加 addOrderIds.add(stockArticleEntity.getId()); } - }else { + } else { //对该订单下所有包件进行计划的添加 addOrderIds.add(stockArticleEntity.getId()); } - }else if (IsOrNoConstant.yes.getValue().equals(stockArticleEntity.getIsZero())){ + } else if (IsOrNoConstant.yes.getValue().equals(stockArticleEntity.getIsZero())) { //零担 - if (Func.isNotEmpty(zerpPackageMap)){ - if (Func.isEmpty(zerpPackageMap.get(stockArticleEntity.getId()))){ + if (Func.isNotEmpty(zerpPackageMap)) { + if (Func.isEmpty(zerpPackageMap.get(stockArticleEntity.getId()))) { //未进行数量录入操作 zeroOrderIds.add(stockArticleEntity.getId()); } - }else { + } else { zeroOrderIds.add(stockArticleEntity.getId()); } - }else{ - log.info("####################3订单缺失IsZero字段:{}",stockArticleEntity.getId()); - return false; + } else { + log.info("####################3订单缺失IsZero字段:{}", stockArticleEntity.getId()); + throw new RuntimeException(stockArticleEntity.getOrderCode() + "订单数据异常"); } DistrilbutionBillStockEntity distrilbutionBillStock = new DistrilbutionBillStockVO(); distrilbutionBillStock.setBillLadingId(distrilbutionBillLading.getId()); @@ -1756,7 +1965,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl parcelListEntities = distributionParcelListService.list(Wrappers.query().lambda() @@ -1766,8 +1975,9 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl{ + + if (!Func.isEmpty(parcelListEntities)) { + parcelListEntities.forEach(p -> { DistrilbutionBillPackageEntity billPackageEntity = new DistrilbutionBillPackageEntity(); billPackageEntity.setBillLadingId(distrilbutionBillLading.getId()); billPackageEntity.setParceListId(p.getId()); @@ -1777,30 +1987,34 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl collect = parcelListEntities.stream().map(DistributionParcelListEntity::getId).collect(Collectors.toList()); distributionParcelListService.update(Wrappers.update() .in("id", collect) - .set("order_package_reservation_status", OrderPackageReservationStatusConstant.daiyuyue.getValue()) + .set("order_package_reservation_status", OrderPackageReservationStatusConstant.yiyueyue.getValue()) ); - }else { - log.error("#########################无可用包件orderIds:{}",addOrderIds); - return false; + } else { + log.error("#########################无可用包件orderIds:{}", addOrderIds); + throw new RuntimeException(addOrderIds + "无可用包件"); } } List zeroPackageEntities = new ArrayList<>(); - if (!zeroOrderIds.isEmpty()){ + if (!zeroOrderIds.isEmpty()) { //查询所有的零担信息 List parcelNumberEntityList = distributionParcelNumberService.list(Wrappers.query().lambda() .in(DistributionParcelNumberEntity::getStockArticleId, zeroOrderIds) .apply("(hand_quantity - delivery_quantity) >0") ); - if (Func.isEmpty(parcelNumberEntityList)){ - log.error("#########################无可用包件orderIds:{}",zeroOrderIds); - return false; + if (Func.isEmpty(parcelNumberEntityList)) { + log.error("#########################无可用包件orderIds:{}", zeroOrderIds); + throw new RuntimeException(zeroOrderIds + "无可用包件"); } - parcelNumberEntityList.forEach(zp->{ + parcelNumberEntityList.forEach(zp -> { //查询包件 DistributionParcelListEntity parcelListEntity = distributionParcelListService.getById(zp.getParcelListId()); DistributionReservationZeroPackageEntity distributionReservationZeroPackageEntity = new DistributionReservationZeroPackageEntity(); @@ -1810,8 +2024,8 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl>>>>>>>>>>>>>>>>>>>>>>>零担品类增加计划数量getHandQuantity:{}getDeliveryQuantity:{}(zp.getHandQuantity() - zp.getDeliveryQuantity()):{}",zp.getHandQuantity(),zp.getDeliveryQuantity(),(zp.getHandQuantity() - zp.getDeliveryQuantity())); - distributionParcelNumberService.updateBillNum(zp.getParcelListId(),(zp.getHandQuantity() - zp.getDeliveryQuantity()),1); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>零担品类增加计划数量getHandQuantity:{}getDeliveryQuantity:{}(zp.getHandQuantity() - zp.getDeliveryQuantity()):{}", zp.getHandQuantity(), zp.getDeliveryQuantity(), (zp.getHandQuantity() - zp.getDeliveryQuantity())); + distributionParcelNumberService.updateBillNum(zp.getParcelListId(), (zp.getHandQuantity() - zp.getDeliveryQuantity()), 1); }); List collect = parcelNumberEntityList.stream().map(DistributionParcelNumberEntity::getParcelListId).collect(Collectors.toList()); distributionParcelListService.update(Wrappers.update() @@ -1819,36 +2033,20 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImplupdate() .eq("bill_lading_id", id) .eq("stock_article_id", i.getStockArticleId()) - .apply("packet_bar_status in ( 1 , 3 )") + .apply("packet_bar_status in ( '1' , '3' )") .set("packet_bar_status", 2) ); //还原预约包件信息 @@ -1982,22 +2180,22 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl distributionStockArticleEntities = distributionStockArticleService.listByIds(cancelOrderIds); - if (Func.isEmpty(distributionStockArticleEntities)){ - log.info("#####################查询订单失败,orderIds:{}",cancelOrderIds); + if (Func.isEmpty(distributionStockArticleEntities)) { + log.info("#####################查询订单失败,orderIds:{}", cancelOrderIds); } String orderCodes = distributionStockArticleEntities.stream().map(DistributionStockArticleEntity::getOrderCode).collect(Collectors.joining(",")); List collect = distributionStockArticleEntities.stream().map(DistributionStockArticleEntity::getWarehouseId).distinct().collect(Collectors.toList()); - if (collect.isEmpty()){ - log.info("#####################订单列表warehouseId字段缺失,orderIds:{}",cancelOrderIds); + if (collect.isEmpty()) { + log.info("#####################订单列表warehouseId字段缺失,orderIds:{}", cancelOrderIds); return false; } - if (collect.size()>1){ - log.info("#####################自提操作多个仓库订单,orderIds:{}",cancelOrderIds); + if (collect.size() > 1) { + log.info("#####################自提操作多个仓库订单,orderIds:{}", cancelOrderIds); return false; } - distributionStockArticleService.maintenanceOrderInfo(orderCodes,collect.get(0)); + distributionStockArticleService.maintenanceOrderInfo(orderCodes, collect.get(0)); } return true; } @@ -2005,37 +2203,102 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl pageList(IPage page, Map distrilbutionBillLading) { DistrilbutionBillLadingDTO distrilbutionBillLadingDTO = JSONObject.parseObject(JSONObject.toJSONString(distrilbutionBillLading), DistrilbutionBillLadingDTO.class); + List strs = null; + if (!Objects.isNull(distrilbutionBillLading.get("pickupBatchs"))) { + String str = (String) distrilbutionBillLading.get("pickupBatchs"); + if (Strings.isNotBlank(str)) { + if (str.indexOf(",") > 0) { + //存在中文逗号 + str = str.replaceAll(",", ","); + } + strs = Arrays.stream(str.split(",")).collect(Collectors.toList()); + } + } + List orderCodes = null; + if (!Objects.isNull(distrilbutionBillLading.get("orderCodes"))) { + String str = (String) distrilbutionBillLading.get("orderCodes"); + if (Strings.isNotBlank(str)) { + if (str.indexOf(",") > 0) { + //存在中文逗号 + str = str.replaceAll(",", ","); + } + orderCodes = Arrays.stream(str.split(",")).collect(Collectors.toList()); + } + } + distrilbutionBillLadingDTO.setPickupBatchs(strs); + distrilbutionBillLadingDTO.setOrderCodes(orderCodes); //获取当前登录人仓库 List warehouseList = basicdataWarehouseClient.getMyWarehouseList(); - List collect = warehouseList.stream() - .map(BasicdataWarehouseEntity::getId) - .collect(Collectors.toList()); BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); - distrilbutionBillLadingDTO.setWarehouseIdList(collect); - if (Func.isNotEmpty(myCurrentWarehouse)){ - distrilbutionBillLadingDTO.setWarehouseIdList(null); - distrilbutionBillLadingDTO.setWarehouseId(myCurrentWarehouse.getId()); - } - IPage distrilbutionBillLadingVOIPage = baseMapper.pageList(page, distrilbutionBillLadingDTO); - List records = distrilbutionBillLadingVOIPage.getRecords(); + + List collect = null; + + + if (Func.isNotEmpty(myCurrentWarehouse)) { + collect = new ArrayList<>(); + collect.add(myCurrentWarehouse.getId()); + } else { + collect = warehouseList.stream() + .map(BasicdataWarehouseEntity::getId) + .collect(Collectors.toList()); + } + + + IPage distrilbutionBillLadingVOIPage = baseMapper.pageList(page, distrilbutionBillLadingDTO,collect); + List records = distrilbutionBillLadingVOIPage.getRecords(); + + // 获取所有的提货单ID + List billIds = records.stream() + .map(DistrilbutionBillLadingVO::getId) // 假设getId()方法返回提货单ID + .collect(Collectors.toList()); + if (billIds.isEmpty()) { + return distrilbutionBillLadingVOIPage; + } + List distributionDeliveryChargeEntityList = distributionDeliveryChargeService.list(Wrappers.query().lambda() + .in(DistributionDeliveryChargeEntity::getBillLading, billIds) + ); + Map> groupedEntities; + if (ObjectUtils.isNotNull(distributionDeliveryChargeEntityList)) { + groupedEntities = + distributionDeliveryChargeEntityList.stream() + .collect(Collectors.groupingBy(DistributionDeliveryChargeEntity::getBillLading)); + } else { + groupedEntities = null; + } + + List DistributionPrintEntitys = distributionPrintService.list(Wrappers.query().lambda() + .in(DistributionPrintEntity::getBillLadingId, billIds) + ); + + Map> groupDistributionPrintEntityEntities; + if (ObjectUtils.isNotNull(DistributionPrintEntitys)) { + groupDistributionPrintEntityEntities = + DistributionPrintEntitys.stream() + .collect(Collectors.groupingBy(DistributionPrintEntity::getBillLadingId)); + } else { + groupDistributionPrintEntityEntities = null; + } + + records.forEach(i -> { - List list = distributionDeliveryChargeService.list(Wrappers.query().lambda() - .eq(DistributionDeliveryChargeEntity::getBillLading, i.getId()) - ); - list.forEach(ii -> ii.setCostName(DictBizCache.getValue(DictBizConstant.DELIVERY_COST, ii.getCost()))); - i.setList(list); - //查询是不是上传图片 - List list1 = distributionPrintService.list(Wrappers.query().lambda() - .eq(DistributionPrintEntity::getBillLadingId, i.getId()) - ); - int count = (int) list1.stream().filter(ii -> "1".equals(ii.getGenre().toString())).count(); - int count1 = (int) list1.stream().filter(ii -> "2".equals(ii.getGenre().toString())).count(); - int count2 = (int) list1.stream().filter(ii -> "3".equals(ii.getGenre().toString())).count(); - if (count1 >= 1 && count >= 1 && count2 >= 1) { - i.setPrintState(true); + if (groupedEntities != null) { + List list = groupedEntities.get(i.getId()); + list.forEach(ii -> ii.setCostName(DictBizCache.getValue(DictBizConstant.DELIVERY_COST, ii.getCost()))); + i.setList(list); + } + if (groupDistributionPrintEntityEntities != null) { + List list1 = groupDistributionPrintEntityEntities.get(i.getId()); + if (list1 != null) { + int count = (int) list1.stream().filter(ii -> "1".equals(ii.getGenre().toString())).count(); + int count1 = (int) list1.stream().filter(ii -> "2".equals(ii.getGenre().toString())).count(); + int count2 = (int) list1.stream().filter(ii -> "3".equals(ii.getGenre().toString())).count(); + i.setPrintState(count1 >= 1 && count >= 1 && count2 >= 1); + } + } else { i.setPrintState(false); } + }); distrilbutionBillLadingVOIPage.setRecords(records); return distrilbutionBillLadingVOIPage; @@ -2050,14 +2313,14 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl idArr = null; - if (null != ids && !ids.toString().isEmpty()) { - idArr = Arrays.asList(param.get("ids").toString().split(",")); + String ids = (String) param.get("ids"); + List idArr = null; + if (null != ids && !ids.isEmpty()) { + idArr = Func.toLongList(ids); } param.put("warehouseId", myCurrentWarehouse.getId()); - List list = baseMapper.exportDistributionBillLading(param, idArr); + List list = baseMapper.exportDistributionBillLading(param); List listExcel = new ArrayList<>(); list.forEach(s -> { DistrilbutionBillLadingExcel excel = new DistrilbutionBillLadingExcel(); @@ -2089,18 +2352,23 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl list2 = new ArrayList<>(); distrilbutionBillLadingDTO.getPrintList().forEach(print -> { - DistributionPrintEntity distributionPrintEntity = new DistributionPrintEntity(); - distributionPrintEntity.setBillLadingId(distrilbutionBillLadingDTO.getId()); - distributionPrintEntity.setGenre(Integer.parseInt(print.getState())); - distributionPrintEntity.setSite(print.getUrl()); - distributionPrintEntity.setSiteName(print.getName()); - list2.add(distributionPrintEntity); + if (!print.getUrl().contains("blob")){ + DistributionPrintEntity distributionPrintEntity = new DistributionPrintEntity(); + distributionPrintEntity.setBillLadingId(distrilbutionBillLadingDTO.getId()); + distributionPrintEntity.setGenre(Integer.parseInt(print.getState())); + distributionPrintEntity.setSite(print.getUrl()); + distributionPrintEntity.setSiteName(print.getName()); + list2.add(distributionPrintEntity); + } }); - return distributionPrintService.saveBatch(list2); + if (!list2.isEmpty()){ + flag.set(distributionPrintService.saveBatch(list2)); + } + return flag.get(); } @@ -2120,17 +2388,35 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("stock_article_id", Long.parseLong(s)) + .eq("is_deleted", 0); + queryWrapper.isNotNull("order_package_code"); +// List list = distributionParcelListService.list(queryWrapper); + List list = distrilbutionBillPackageService.list(Wrappers.query().lambda() + .eq(DistrilbutionBillPackageEntity::getBillLadingId, vo.getBillLadingId()) + .eq(DistrilbutionBillPackageEntity::getStockArticleId, s) + .apply("packet_bar_status in (1,3)") + ); + } + } + List list1 = distributionZeroPackageService.list(Wrappers.query().lambda() .eq(DistributionReservationZeroPackageEntity::getReservationId, vo.getBillLadingId()) .eq(DistributionReservationZeroPackageEntity::getIsDeleted, 0) - .in(DistributionReservationZeroPackageEntity::getZeroPackageStatus, "1", "2") + .in(DistributionReservationZeroPackageEntity::getZeroPackageStatus, "1", "3") ); if (!list1.isEmpty()) { //有零担 @@ -2145,39 +2431,6 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("stock_article_id", Long.parseLong(s)) - .eq("is_deleted", 0); - queryWrapper.isNotNull("order_package_code"); -// List list = distributionParcelListService.list(queryWrapper); - List list = distrilbutionBillPackageService.list(Wrappers.query().lambda() - .eq(DistrilbutionBillPackageEntity::getBillLadingId, vo.getBillLadingId()) - .eq(DistrilbutionBillPackageEntity::getStockArticleId, s) - .apply("packet_bar_status in (1,3)") - ); -// int pn = list.size(); //包件数量 -// planNum = planNum + pn; - //通过订单id查询扫描表中有多少数据 -// QueryWrapper qw = new QueryWrapper<>(); -// qw.eq("stock_article_id", Long.parseLong(s)) -// .eq("is_deleted", 0); -// List ls = distributionBillLadingScanService.list(qw); -// QueryWrapper qw = new QueryWrapper<>(); -// qw.eq("bill_lading_id", Long.parseLong(s)) -// .eq("is_deleted", 0); -// List ls = distributionBillLadingScanService.list(qw); -// if (!ls.isEmpty()) { -// int sum = ls.stream().mapToInt(DistributionBillLadingScanEntity::getQuantity).sum(); -// signedNum = signedNum + sum; -// } - - } //查询库存品的件数量 DistributionDeliveryDetailsVO list = distributionDeliveryDetailsService.oneListNum(vo.getBillLadingId()); if (ObjectUtils.isNotNull(list)) { @@ -2206,15 +2459,53 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl entityList = distrilbutionBillStockService.list(Wrappers.query().lambda() + .eq(DistrilbutionBillStockEntity::getBillLadingId, billLadingId) + .ne(DistrilbutionBillStockEntity::getOrderStatus, "2") + ); + if (entityList.isEmpty()) { + mainVO.setList(null); + return mainVO; + }else { + List packageEntities = distrilbutionBillPackageService.list(Wrappers.query().lambda() + .eq(DistrilbutionBillPackageEntity::getBillLadingId, billLadingId) + .ne(DistrilbutionBillPackageEntity::getPacketBarStatus, ReservationPackageStatusConstant.quxiao.getValue()) + ); + if (!packageEntities.isEmpty()) { + List packageIds = packageEntities.stream().map(DistrilbutionBillPackageEntity::getParceListId).collect(Collectors.toList()); + List distributionParcelListEntities = distributionParcelListService.listByIds(packageIds); + if (!distributionParcelListEntities.isEmpty()) { + List> mapList = new ArrayList<>(); + distributionParcelListEntities.forEach(p->{ + Map map = new HashMap<>(); + map.put("orderPackageCode",p.getOrderPackageCode()); + map.put("isSign",p.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())); + map.put("thirdProduct",p.getThirdProduct()); + map.put("fisrt",p.getThirdProduct()); + map.put("second",p.getSecond()); + map.put("materiel",p.getMaterialName()); + map.put("orderId",p.getStockArticleId()); + map.put("num",p.getQuantity()); + mapList.add(map); + }); + if (!mapList.isEmpty()) { + mainVO.setPackageList(mapList); + } + } + } + + } + + List num = baseMapper.getCompleteNum(billLadingId); - if (Func.isNotEmpty(num)){ + if (Func.isNotEmpty(num)) { int size = num.stream().filter(f -> f.equals(true)).collect(Collectors.toList()).size(); mainVO.setCompleteNum(size); } @@ -2226,25 +2517,32 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl listZero = distributionZeroPackageService.list(Wrappers.query().lambda() -// .eq(DistributionReservationZeroPackageEntity::getReservationId, main.getBillLadingId()) -// .eq(DistributionReservationZeroPackageEntity::getIsDeleted, 0) -// .in(DistributionReservationZeroPackageEntity::getZeroPackageStatus, "1", "3") -// ); -// if (!listZero.isEmpty()) { -// int sum = listZero.stream().mapToInt(DistributionReservationZeroPackageEntity::getQuantity).sum(); -// planNum += sum; -// } String[] split = stockArticleId.split(","); List l = new ArrayList<>(); + + + List ids = new ArrayList<>(); + + for (String s : split) { + ids.add(Long.parseLong(s)); + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("stock_article_id", ids) + .eq("is_deleted", 0) + .isNotNull("order_package_code"); + if (!StringUtil.isBlank(orderSelfNumbering)) { + queryWrapper.ne("order_self_numbering", orderSelfNumbering); + } + List list2 = distributionParcelListService.list(queryWrapper); + + + QueryWrapper qw = new QueryWrapper<>(); + qw.in("stock_article_id", ids) + .eq("is_deleted", 0); + qw.eq("bill_lading_id", main.getBillLadingId()); + List list3 = distributionBillLadingScanService.list(qw); for (String s : split) { if (StringUtil.isBlank(s)) { continue; @@ -2254,14 +2552,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("stock_article_id", Long.parseLong(s)) - .eq("is_deleted", 0) - .isNotNull("order_package_code"); - if (!StringUtil.isBlank(orderSelfNumbering)) { - queryWrapper.ne("order_self_numbering", orderSelfNumbering); - } - List list = distributionParcelListService.list(queryWrapper); + List list = list2.stream().filter(f -> f.getStockArticleId().equals(Long.parseLong(s))).collect(Collectors.toList()); int pn = 0; if (!list.isEmpty() && ObjectUtils.isNotNull(list.get(0))) { vo.setOrderSelfNumbering(list.get(0).getOrderCode()); @@ -2270,11 +2561,8 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl qw = new QueryWrapper<>(); - qw.eq("stock_article_id", Long.parseLong(s)) - .eq("is_deleted", 0); - qw.eq("bill_lading_id", main.getBillLadingId()); - List ls = distributionBillLadingScanService.list(qw); + + List ls = list3.stream().filter(f -> f.getStockArticleId().equals(Long.parseLong(s))).collect(Collectors.toList()); int sn = ls.stream().mapToInt(DistributionBillLadingScanEntity::getQuantity).sum(); vo.setSignedNum(sn); // signedNum = signedNum + sn; @@ -2562,7 +2850,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl list = distrilbutionBillStockService.list(Wrappers.query().lambda() .eq(DistrilbutionBillStockEntity::getBillLadingId, distrilbutionBillLadingEntity.getId()) - .eq(DistrilbutionBillStockEntity::getOrderStatus, "1") + .in(DistrilbutionBillStockEntity::getOrderStatus, "1", "3") .or(eq -> eq.eq(DistrilbutionBillStockEntity::getBillLadingId, distrilbutionBillLadingEntity.getId()).eq(DistrilbutionBillStockEntity::getOrderStatus, "3")) ); list.forEach(i -> { @@ -2571,28 +2859,28 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl distributionStockArticleVOS = DistributionStockArticleWrapper.build().listVO(list2); for (DistributionStockArticleVO distributionStockArticleVO : distributionStockArticleVOS) { //查询自身订单的计划数量是多少 - if (IsOrNoConstant.no.getValue().equals(distributionStockArticleVO.getIsZero())){ + if (IsOrNoConstant.no.getValue().equals(distributionStockArticleVO.getIsZero())) { //查询订制品数量 List list3 = distrilbutionBillPackageService.list(Wrappers.query().lambda() .eq(DistrilbutionBillPackageEntity::getBillLadingId, distrilbutionBillLadingEntity.getId()) .ne(DistrilbutionBillPackageEntity::getPacketBarStatus, "2") .eq(DistrilbutionBillPackageEntity::getStockArticleId, distributionStockArticleVO.getId()) ); - if (!list3.isEmpty()){ + if (!list3.isEmpty()) { distributionStockArticleVO.setReservationNum(list3.size()); - }else { + } else { distributionStockArticleVO.setReservationNum(0); } - }else { + } else { List reservationZeroPackageEntities = distributionZeroPackageService.list(Wrappers.query().lambda() .eq(DistributionReservationZeroPackageEntity::getReservationId, distrilbutionBillLadingEntity.getId()) .eq(DistributionReservationZeroPackageEntity::getStockArticleId, distributionStockArticleVO.getId()) .ne(DistributionReservationZeroPackageEntity::getZeroPackageStatus, "2") .eq(DistributionReservationZeroPackageEntity::getType, "3") ); - if (!reservationZeroPackageEntities.isEmpty()){ + if (!reservationZeroPackageEntities.isEmpty()) { distributionStockArticleVO.setReservationNum(reservationZeroPackageEntities.stream().mapToInt(DistributionReservationZeroPackageEntity::getQuantity).sum()); - }else { + } else { distributionStockArticleVO.setReservationNum(0); } @@ -2607,6 +2895,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl list2 = distributionPrintService.list(Wrappers.query().lambda() .eq(DistributionPrintEntity::getBillLadingId, distrilbutionBillLadingEntity.getId()) + .eq(DistributionPrintEntity::getIsDeleted, 0) ); detailOne.setPrintVOS(list2); //查询库存品 @@ -2639,14 +2928,14 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl distrilbutionBillLading) { + public DistrilbutionAppBillLadingOrderMainVO getInventory(Map distrilbutionBillLading) { String method = "##################DistributionBillLadingServiceImpl.getInventory"; - if (Func.isEmpty(distrilbutionBillLading.get("id"))){ - log.error(method+"自提Id缺失"); + if (Func.isEmpty(distrilbutionBillLading.get("id"))) { + log.error(method + "自提Id缺失"); return null; } String id = (String) distrilbutionBillLading.get("id"); - DistrilbutionAppBillLadingOrderMainVO mainVO =baseMapper.getBillLadingOrderMainVO(Long.parseLong(id)); + DistrilbutionAppBillLadingOrderMainVO mainVO = baseMapper.getBillLadingOrderMainVO(Long.parseLong(id)); //查询订单数量, //查询齐套数 //查询字体件数 @@ -2654,7 +2943,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl num = baseMapper.getCompleteNum(Long.parseLong(id)); - if (Func.isNotEmpty(num)){ + if (Func.isNotEmpty(num)) { int size = num.stream().filter(f -> f.equals(true)).collect(Collectors.toList()).size(); mainVO.setCompleteNum(size); } @@ -2666,271 +2955,388 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl InventoryStockUpStatusConstant.yibeihuo.getValue().equals(f.getStockStatus()) && Func.isNotEmpty(f.getStockPackageCode())).mapToInt(DisStockListDetailEntity::getNum).sum(); - log.info(i.getDescriptionGoods()+">>>>>>>>>>>>>>自提客户备货库存数量:",sum); - if (sum == i.getQuantity()){ + log.info(i.getDescriptionGoods() + ">>>>>>>>>>>>>>自提客户备货库存数量:", sum); + if (sum == i.getQuantity()) { i.setEsauInventoryNum(sum); - }else { + } else { i.setEsauInventoryNum(-1); } - }else { + } else { i.setEsauInventoryNum(-1); } -// if (i.getQuantity().equals(i.getDeliveryNum())) { - //已备货 -// List list = distributionBillLadingScanService.list(Wrappers.query().lambda() -// .eq(DistributionBillLadingScanEntity::getBillLadingId, distrilbutionBillLadingEntity.getId()) -// .eq(DistributionBillLadingScanEntity::getMaterialType, '1') -// ); - -// i.setEsauInventoryNum(list.size()); - - - -// } else { - //没有备货完成 -// i.setEsauInventoryNum(-1); -// } }); mainVO.setInventoryList(inventory); return mainVO; } - /** - * pda扫描 - * - * @param distrilbutionBillLading - * @return - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Resp getScan(Map distrilbutionBillLading) { - Object billLadingId = distrilbutionBillLading.get("id"); //提货ID - Object coding = distrilbutionBillLading.get("coding"); //包条码 - Object type = distrilbutionBillLading.get("type"); //类型 2 订单 1 库存品 - if (Func.isNull(billLadingId) || ObjectUtil.isEmpty(coding) || Func.isNull(type)) { - return Resp.scanFail("3000", "参数不完整!!"); - } else { + public Resp getScanNew(Map distributionBillLading) { + // 参数校验 + if (!isValidParameters(distributionBillLading)) { + return Resp.scanFail("3000", "参数不完整或无效!!"); + } + + Object billLadingId = distributionBillLading.get("id"); + String coding = distributionBillLading.get("coding").toString(); + String type = distributionBillLading.get("type").toString(); + + + try { DistrilbutionBillLadingEntity billLadingEntity1 = baseMapper.selectById((Serializable) billLadingId); - DistrilbutionAppBillLadingOrderMainVO billLadingOrderMainVO = baseMapper.getBillLadingOrderMainVO(Long.parseLong((String) billLadingId)); - Integer planNum = billLadingOrderMainVO.getPlanNum(); - Integer signedNum = billLadingOrderMainVO.getSignedNum(); - if ((planNum+billLadingOrderMainVO.getInventoryNub()) == signedNum){ - return Resp.scanFail("提货任务扫描已完成!", "提货任务扫描已完成!"); - } - if (ObjectUtils.isNotNull(billLadingEntity1) && "30".equals(billLadingEntity1.getConditions())) { + DistrilbutionAppBillLadingOrderMainVO billLadingOrderMainVO = baseMapper.getBillLadingOrderMainVO(Long.parseLong(billLadingId.toString())); + + if (isTaskCompleted(billLadingOrderMainVO, billLadingEntity1)) { return Resp.scanFail("提货任务已完成!", "提货任务已完成!"); } BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); - if (ObjectUtils.isNull(myCurrentWarehouse)) { + if (myCurrentWarehouse == null) { return Resp.scanFail("请选择仓库!", "请选择仓库!"); } - //查询是否签收 - List list3 = distributionBillLadingScanService.list(Wrappers.query().lambda() - .eq(DistributionBillLadingScanEntity::getBillLadingId, billLadingId) - .eq(DistributionBillLadingScanEntity::getMaterialType, type) - .eq(DistributionBillLadingScanEntity::getPacketBarCode, coding) - ); - if (!list3.isEmpty()) { + + + if (isAlreadySigned(billLadingId, coding, type)) { return Resp.scanFail("该包件已签收!", "该包件已签收!"); } - //添加扫描记录 + // 添加扫描记录 DistributionBillLadingScanEntity distributionBillLadingScan = new DistributionBillLadingScanEntity(); - distributionBillLadingScan.setMaterialType((String) type); + distributionBillLadingScan.setMaterialType(type); distributionBillLadingScan.setBillLadingId(Long.parseLong(billLadingId.toString())); distributionBillLadingScan.setScanType(1); - //扫描 - if ("1".equals(type)) { - //查询该自提单存在几种品类的库存品 - List inventoryAppVO = distributionDeliveryDetailsService.listCode(String.valueOf(billLadingId)); - if (ObjectUtils.isNotNull(inventoryAppVO)) { - List stocklistIds = inventoryAppVO.stream().map(DistrilbutionBillLadingInventoryAppVO::getStockListId).collect(Collectors.toList()); - //查询该自提单所有的库存品包件信息 - List inventoryPackage = disStockListDetailService.list(Wrappers.query().lambda() - .eq(DisStockListDetailEntity::getReservationId, billLadingId) - .in(DisStockListDetailEntity::getStockListId, stocklistIds) - .ne(DisStockListDetailEntity::getStockPackageStatus, ReservationPackageStatusConstant.quxiao.getValue()) - ); - Long stockListId = 0L; - if (Func.isNotEmpty(inventoryPackage)){ - //检测库存品包件是否都已经完成备货 - boolean flag = inventoryPackage.stream().anyMatch(f -> Func.isEmpty(f.getStockPackageCode())); - if (flag){ - return Resp.scanFail("库存品备货未完成,请联系库管人员!", "库存品备货未完成,请联系库管人员"); - } - //校验包件李彪是否存在满足码值的包件 - List collect = inventoryPackage.stream().filter(f -> coding.equals(f.getStockPackageCode())).collect(Collectors.toList()); - if (collect.size() == 1){ - //满足签收 - distributionBillLadingScan.setPacketBarCode((String) coding); - distributionBillLadingScan.setStockListId(collect.get(0).getStockListId()); - distributionBillLadingScan.setQuantity(1); - distributionBillLadingScanService.save(distributionBillLadingScan); - stockListId = collect.get(0).getStockListId(); - //扣减库存 - distributionStockListMapper.deductionQuantityStock(collect.get(0).getStockListId(),collect.get(0).getNum()); - - - }else { - //不满足签收,记录为什么不满足 - if (collect.size() > 1){ - //已备货库存品包件存在多条一样的 - - log.info("########################PDA签收库存品包件存在多条一样的备货码值:{}",coding); - return Resp.scanFail("系统无此编码!", "系统无此编码"); - }else { - //备货库存品不存在 - return Resp.scanFail("系统无此编码!", "系统无此编码"); + distributionBillLadingScan.setWarehouseId(myCurrentWarehouse.getId()); + distributionBillLadingScan.setScanUser(AuthUtil.getUser().getNickName()); - } - } - Map> stockListMap = inventoryAppVO.stream().collect(Collectors.groupingBy(DistrilbutionBillLadingInventoryAppVO::getStockListId)); - //查询签收数量 - List list = distributionBillLadingScanService.list(Wrappers.query().lambda() - .eq(DistributionBillLadingScanEntity::getBillLadingId, billLadingId) - .eq(DistributionBillLadingScanEntity::getMaterialType, "1") - .eq(DistributionBillLadingScanEntity::getStockListId, stockListId) - ); - List billLadingInventoryAppVOS = stockListMap.get(stockListId); - if (Func.isNotEmpty(billLadingInventoryAppVOS)){ - DistrilbutionBillLadingInventoryAppVO distrilbutionBillLadingInventoryAppVO = billLadingInventoryAppVOS.get(0); - if (list.size() == distrilbutionBillLadingInventoryAppVO.getQuantity()) { - //修改完成状态 - distributionAsyncService.getInventoryOrderSelfPickup(distrilbutionBillLadingInventoryAppVO.getLdddId()); - } - if (list.size() > distrilbutionBillLadingInventoryAppVO.getQuantity()) { - return Resp.scanFail("已完成!", "已完成!!"); - } - //修改库存品签收 - distributionAsyncService.getInventorySelfPickup(distrilbutionBillLadingInventoryAppVO.getStockArticleId()); - } - }else { - return Resp.scanFail("库存品暂未备货请联系库管人员!", "库存品暂未备货请联系库管人员"); + return processScan(type, distributionBillLadingScan.getBillLadingId(), coding, distributionBillLadingScan, myCurrentWarehouse, billLadingEntity1.getPickupBatch()); - } +// return Resp.scanSuccess("签收成功", "签收成功"); + } catch (Exception e) { + log.error("自提扫描异常", e); + return Resp.scanFail("系统异常!", "系统异常,请联系管理员"); + } + } - } else { - return Resp.scanFail("包件信息不存在", "包件信息不存在"); - } - } else { + private boolean isValidParameters(Map distributionBillLading) { + return Func.isNotEmpty(distributionBillLading.get("id")) && + Func.isNotEmpty(distributionBillLading.get("coding")) && + Func.isNotEmpty(distributionBillLading.get("type")); + } - //查询订单是否已签收 - List list4 = distributionParcelListService.list(Wrappers.query().lambda() - .eq(DistributionParcelListEntity::getOrderPackageCode, coding) - .eq(DistributionParcelListEntity::getWarehouseId, myCurrentWarehouse.getId()) - ); - if (list4.isEmpty()) { - return Resp.scanFail(PdaAudioLingoStatus.baojianbucunzai.getName(), PdaAudioLingoStatus.baojianbucunzai.getName()); - } - if (list4.size() > 1) { - return Resp.scanFail("包件信息错误", "包件信息错误"); - } + private boolean isTaskCompleted(DistrilbutionAppBillLadingOrderMainVO billLadingOrderMainVO, DistrilbutionBillLadingEntity billLadingEntity1) { + return (billLadingOrderMainVO.getPlanNum() + billLadingOrderMainVO.getInventoryNub()) == billLadingOrderMainVO.getSignedNum() || + ("30".equals(billLadingEntity1.getConditions())); + } - DistrilbutionBillStockEntity one2 = distrilbutionBillStockService.getOne(Wrappers.query().lambda() - .eq(DistrilbutionBillStockEntity::getBillLadingId, billLadingId) - .apply("order_status in (1 , 3)") - .eq(DistrilbutionBillStockEntity::getStockArticleId, list4.get(0).getStockArticleId()) - ); + private boolean isAlreadySigned(Object billLadingId, String coding, String type) { + List list3 = distributionBillLadingScanService.list(Wrappers.query() + .lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, billLadingId) + .eq(DistributionBillLadingScanEntity::getMaterialType, type) + .eq(DistributionBillLadingScanEntity::getPacketBarCode, coding) + ); + return !list3.isEmpty(); + } - DistrilbutionBillPackageEntity one3 = distrilbutionBillPackageService.getOne(Wrappers.query().lambda() - .eq(DistrilbutionBillPackageEntity::getBillLadingId, billLadingId) - .ne(DistrilbutionBillPackageEntity::getPacketBarStatus, 2) - .eq(DistrilbutionBillPackageEntity::getParceListId, list4.get(0).getId()) - ); - if (ObjectUtils.isNull(one3)) { - return Resp.scanFail("不在本次自提计划!", "不在本次自提计划!"); + private Resp processScan(String type, Long billLadingId, String coding, DistributionBillLadingScanEntity distributionBillLadingScan, BasicdataWarehouseEntity warehouse, String pickupBatch) { + if ("1".equals(type)) { + // 处理库存品包件逻辑 + return handleOrderProduct(type, billLadingId, coding, distributionBillLadingScan, warehouse, pickupBatch); + } else { + // 处理库定制包件逻辑 + return handleInventoryProduct(type, billLadingId, coding, distributionBillLadingScan); + } + } + + private Resp handleOrderProduct(String type, Object billLadingId, String coding, DistributionBillLadingScanEntity distributionBillLadingScan, BasicdataWarehouseEntity warehouse, String pickupBatch) { + List inventoryAppVO = distributionDeliveryDetailsService.listCode(String.valueOf(billLadingId)); + List aaa = new ArrayList<>(); + + if (inventoryAppVO == null) { + return Resp.scanFail("包件信息不存在", "包件信息不存在"); + } + + List stocklistIds = inventoryAppVO.stream().map(DistrilbutionBillLadingInventoryAppVO::getStockListId).collect(Collectors.toList()); + if (stocklistIds.isEmpty()) { + return Resp.scanFail("库存品暂未备货,请联系库管人员!", "库存品暂未备货,请联系库管人员"); + } + List inventoryPackage = disStockListDetailService.list(Wrappers.query() + .lambda() + .eq(DisStockListDetailEntity::getReservationId, billLadingId) + .in(DisStockListDetailEntity::getStockListId, stocklistIds) + .ne(DisStockListDetailEntity::getStockPackageStatus, ReservationPackageStatusConstant.quxiao.getValue()) + ); + + if (inventoryPackage == null || inventoryPackage.isEmpty()) { + return Resp.scanFail("库存品暂未备货,请联系库管人员!", "库存品暂未备货,请联系库管人员"); + } + + // 检查库存品包件是否完成备货 + boolean flag = inventoryPackage.stream().anyMatch(f -> StringUtils.isBlank(f.getStockPackageCode())); + if (flag) { + return Resp.scanFail("库存品备货未完成,请联系库管人员!", "库存品备货未完成,请联系库管人员"); + } + + DisStockListDetailEntity matchedPackage = inventoryPackage.stream() + .filter(f -> coding.equals(f.getStockPackageCode())) + .findFirst() + .orElse(null); + + if (matchedPackage == null) { + return Resp.scanFail("系统无此编码!", "系统无此编码"); + } + + distributionBillLadingScan.setPacketBarCode(coding); + distributionBillLadingScan.setStockListId(matchedPackage.getStockListId()); + distributionBillLadingScan.setQuantity(1); + String content = "包件在" + warehouse.getName() + "由" + AuthUtil.getNickName() + "自提扫描签收,操作方式:扫描签收,自提批次号:" + pickupBatch; + JSONObject js = handleLogJSONObject(warehouse, AuthUtil.getUser(), coding, content, WorkNodeEnums.SIGN_BILLOFLADING.getCode()); + aaa.add(js); + trunklinePackageTrackLogClient.addPackageTrackLog(aaa); + + distributionBillLadingScanService.save(distributionBillLadingScan); + distributionStockListMapper.deductionQuantityStock(matchedPackage.getStockListId(), matchedPackage.getNum()); + + Map> stockListMap = inventoryAppVO.stream().collect(Collectors.groupingBy(DistrilbutionBillLadingInventoryAppVO::getStockListId)); + //查询签收数量 + List list = distributionBillLadingScanService.list(Wrappers.query().lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, billLadingId) + .eq(DistributionBillLadingScanEntity::getMaterialType, "1") + .eq(DistributionBillLadingScanEntity::getStockListId, matchedPackage.getStockListId()) + ); + List billLadingInventoryAppVOS = stockListMap.get(matchedPackage.getStockListId()); + if (Func.isNotEmpty(billLadingInventoryAppVOS)) { + DistrilbutionBillLadingInventoryAppVO distrilbutionBillLadingInventoryAppVO = billLadingInventoryAppVOS.get(0); + if (list.size() == distrilbutionBillLadingInventoryAppVO.getQuantity()) { + //修改完成状态 + distributionAsyncService.getInventoryOrderSelfPickup(distrilbutionBillLadingInventoryAppVO.getLdddId()); + } + if (list.size() > distrilbutionBillLadingInventoryAppVO.getQuantity()) { + return Resp.scanFail("已完成!", "已完成!!"); + } + //修改库存品签收 + distributionAsyncService.getInventorySelfPickup(distrilbutionBillLadingInventoryAppVO.getStockArticleId()); + } + + // 其他逻辑... + return Resp.scanSuccess("签收成功", "签收成功"); + } + + + private Resp handleInventoryProduct(String type, Long billLadingId, String coding, DistributionBillLadingScanEntity distributionBillLadingScan) { + + BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + if (ObjectUtils.isNull(myCurrentWarehouse)) { + return Resp.scanFail("请选择仓库!", "请选择仓库!"); + } + // 查询订单是否已签收 + List list4 = distributionParcelListService.list(Wrappers.query() + .lambda() + .eq(DistributionParcelListEntity::getOrderPackageCode, coding) + .eq(DistributionParcelListEntity::getWarehouseId, myCurrentWarehouse.getId()) + ); + + if (list4.isEmpty()) { + return Resp.scanFail(PdaAudioLingoStatus.baojianbucunzai.getName(), PdaAudioLingoStatus.baojianbucunzai.getName()); + } + + if (list4.size() > 1) { + return Resp.scanFail("包件信息错误", "包件信息错误"); + } + + DistrilbutionBillStockEntity one2 = distrilbutionBillStockService.getOne(Wrappers.query().lambda() + .eq(DistrilbutionBillStockEntity::getBillLadingId, billLadingId) + .apply("order_status in ('1' , '3')") + .eq(DistrilbutionBillStockEntity::getStockArticleId, list4.get(0).getStockArticleId()) + ); + + DistrilbutionBillPackageEntity one3 = distrilbutionBillPackageService.getOne(Wrappers.query().lambda() + .eq(DistrilbutionBillPackageEntity::getBillLadingId, billLadingId) + .ne(DistrilbutionBillPackageEntity::getPacketBarStatus, 2) + .eq(DistrilbutionBillPackageEntity::getParceListId, list4.get(0).getId()) + ); + if (ObjectUtils.isNull(one3)) { + return Resp.scanFail("不是本客户的货!", "不是本客户的货!"); + } + if ("20".equals(one2.getConditions())) { + return Resp.scanFail("当前提货任务," + list4.get(0).getOrderCode() + "已齐套!", "当前提货任务," + list4.get(0).getOrderCode() + "已齐套!"); + } + + //查询订单存在吗 + List list = distrilbutionBillStockService.list(Wrappers.query().lambda() + .eq(DistrilbutionBillStockEntity::getBillLadingId, billLadingId) + .ne(DistrilbutionBillStockEntity::getOrderStatus, "2") + ); + + if (list.isEmpty()) { + return Resp.scanFail("当前提货任务,订单不存在!", "当前提货任务,订单不存在!"); + } + + AtomicBoolean n = new AtomicBoolean(false); + // 获取订单的ID + List ls = list.stream() // 转换为Stream + .map(DistrilbutionBillStockEntity::getStockArticleId) // 提取每个元素的orderId + .collect(Collectors.toList()); // 收集到新的List + + + List distributionStockArticleEntityList = distributionStockArticleService.list(Wrappers.query().lambda() + .in(DistributionStockArticleEntity::getId, ls) + .ne(DistributionStockArticleEntity::getIsZero, "1") + ); + + List list1 = distributionParcelListService.list(Wrappers.query().lambda() + .in(DistributionParcelListEntity::getStockArticleId, ls) + .eq(DistributionParcelListEntity::getConditions, 1) + ); + + + List distributionBillLadingScanEntities = distributionBillLadingScanService.list(Wrappers.query().lambda() + .in(DistributionBillLadingScanEntity::getStockArticleId, ls) + .eq(DistributionBillLadingScanEntity::getMaterialType, "2") + .eq(DistributionBillLadingScanEntity::getBillLadingId, billLadingId) + ); + + + list.forEach(so -> { + //查询包件信息 + + DistributionParcelListEntity distributionParcelListEntity = null; + + for (DistributionParcelListEntity parcelListEntity : list1) { + log.debug("getScan parcelListEntity >>>> {}", parcelListEntity); + log.debug("getScan so >>>> {}", so); + log.debug("getScan coding >>>> {}", coding); + if (parcelListEntity.getStockArticleId().equals(so.getStockArticleId()) && parcelListEntity.getOrderPackageCode().equals(coding)) { + distributionParcelListEntity = parcelListEntity; + break; } + } - if ("20".equals(one2.getConditions())) { - return Resp.scanFail("当前提货任务," + list4.get(0).getOrderCode() + "已齐套!", "当前提货任务," + list4.get(0).getOrderCode() + "已齐套!"); + + if (distributionParcelListEntity != null) { + n.set(true); + //查询订单包件数量签收的信息 + DistributionStockArticleEntity one = distributionStockArticleEntityList.stream().filter(s -> s.getId().equals(so.getStockArticleId())).findFirst().orElse(null); + + + List list2 = new ArrayList<>(); + for (DistributionBillLadingScanEntity distributionBillLadingScanEntity : distributionBillLadingScanEntities) { + if (distributionBillLadingScanEntity.getStockArticleId().equals(so.getStockArticleId())) { + list2.add(distributionBillLadingScanEntity); + } } - //查询订单存在吗 - List list = distrilbutionBillStockService.list(Wrappers.query().lambda() - .eq(DistrilbutionBillStockEntity::getBillLadingId, billLadingId) - ); - if (list.isEmpty()) { - return Resp.scanFail("当前提货任务,订单不存在!", "当前提货任务,订单不存在!"); - } else { - AtomicBoolean n = new AtomicBoolean(false); - list.forEach(so -> { - //查询包件信息 - List list1 = distributionParcelListService.list(Wrappers.query().lambda() - .eq(DistributionParcelListEntity::getStockArticleId, so.getStockArticleId()) - .eq(DistributionParcelListEntity::getOrderPackageCode, coding) - ); - if (!list1.isEmpty()) { - n.set(true); - //查询订单包件数量签收的信息 - DistributionStockArticleEntity one = distributionStockArticleService.getOne(Wrappers.query().lambda() - .eq(DistributionStockArticleEntity::getId, so.getStockArticleId()) - ); - List list2 = distributionBillLadingScanService.list(Wrappers.query().lambda() - .eq(DistributionBillLadingScanEntity::getStockArticleId, so.getStockArticleId()) - .eq(DistributionBillLadingScanEntity::getMaterialType, "2") - .eq(DistributionBillLadingScanEntity::getBillLadingId, billLadingId) - ); - //判断当前签收数 修改订单和备货订单状态 - if (one.getTotalNumber().equals(list2.size() + 1)) { + one.setOrderStatus(OrderStatusConstant.bufenqianshou.getValue()); - DistrilbutionBillStockEntity one1 = distrilbutionBillStockService.getOne(Wrappers.query().lambda() - .eq(DistrilbutionBillStockEntity::getBillLadingId, billLadingId) - .eq(DistrilbutionBillStockEntity::getStockArticleId, one.getId()) - .eq(DistrilbutionBillStockEntity::getConditions, BillLadingStatusConstant.daitihuo.getValue()) - ); - //修改订单状态 - distributionAsyncService.getOrderSelfPickup(list1.get(0).getId()); - //修改备货订单状态 - distributionAsyncService.getBillStock(one1.getId()); - } - //修改在库数量 - if (ObjectUtils.isNotNull(one.getHandQuantity()) && one.getHandQuantity() > 0) { - int i = one.getHandQuantity() - 1; - int i2 = ObjectUtils.isNull(one.getSigninQuantity()) ? 1 : one.getSigninQuantity() + 1; - distributionStockArticleService.update(Wrappers.update() - .eq("id", one.getId()) - .set("hand_quantity", i) - .set("signin_quantity", i2) - ); - } - //修改包件状态 - distributionAsyncService.getSelfPickup(list1.get(0).getId()); - distributionBillLadingScan.setParcelListId(list1.get(0).getId()); - distributionBillLadingScan.setPacketBarCode(String.valueOf(coding)); - //订单 - distributionBillLadingScan.setStockArticleId(one.getId()); - distributionBillLadingScan.setQuantity(1); - distributionBillLadingScan.setBillLadingId(Long.parseLong((String) billLadingId)); - //包件解脱 -// try { -// warehouseUpdownTypeClient.downPackageOrDelTray((String) coding, myCurrentWarehouse.getId(),"签收下架解托"); -// } catch (Exception e) { -// log.info("自提签收包件解托报错:" + e.getMessage()); -// } + //判断当前签收数 修改订单和备货订单状态 + if (one.getTotalNumber().equals(list2.size() + 1)) { +// + DistrilbutionBillStockEntity one1 = null; + for (DistrilbutionBillStockEntity distrilbutionBillStockEntity : list) { + if (distrilbutionBillStockEntity.getStockArticleId().equals(so.getStockArticleId()) && distrilbutionBillStockEntity.getConditions().equals(BillLadingStatusConstant.daitihuo.getValue())) { + one1 = distrilbutionBillStockEntity; + break; } - }); + } - if (n.get()) { - distributionBillLadingScanService.save(distributionBillLadingScan); - } else { - return Resp.scanFail("当前订单,包件不存在!!", "当前订单,包件不存在!!"); + if (one1 != null) { + distributionAsyncService.updateBillStock(one1.getId()); } + one.setOrderStatus(OrderStatusConstant.qianshou.getValue()); + + } + //修改在库数量 + if (ObjectUtils.isNotNull(one.getHandQuantity()) && one.getHandQuantity() > 0) { + int i = one.getHandQuantity() - 1; + int i2 = ObjectUtils.isNull(one.getSigninQuantity()) ? 1 : one.getSigninQuantity() + 1; + one.setHandQuantity(i); + one.setSigninQuantity(i2); } + // 修改订单状态 + distributionStockArticleService.updateById(one); + + //修改包件状态 + distributionAsyncService.getSelfPickup(distributionParcelListEntity.getId()); + distributionBillLadingScan.setParcelListId(distributionParcelListEntity.getId()); + distributionBillLadingScan.setPacketBarCode(coding); + //订单 + distributionBillLadingScan.setStockArticleId(one.getId()); + distributionBillLadingScan.setQuantity(1); + distributionBillLadingScan.setBillLadingId( billLadingId); + + String signTime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()); + + sendNodeWorkDataBroadcast(distributionParcelListEntity,billLadingId,signTime, myCurrentWarehouse); + + //推送梦天 +// if (distributionParcelListEntity.getBrandName().equals("梦天")){ +// Map pushMap = new HashMap<>(); +// pushMap.put("orderPackageCode", coding); +// pushMap.put("operationTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); +// pushMap.put("distributionContactId", billLadingId); +// pushMap.put("destinationWarehouse", myCurrentWarehouse.getName()); +// +// rabbitTemplate.convertAndSend(RabbitConstant.MT_BUSINESS_DATA_2_FACTORY_EXCHANGE, RabbitConstant.MT_BUSINESS_DATA_2_FACTORY_ROUTING, pushMap, message -> { +// message.getMessageProperties() +// .setHeader("x-delay", 3000); +// return message; +// }); +// } + } - //判断当前自提任务完成没有 - String a = String.valueOf(billLadingId); - distributionAsyncService.getStockUPstate(Long.parseLong(a)); + }); - log.info(coding + " > > 签收成功!!"); - return Resp.scanSuccess("签收成功", "签收成功"); + if (n.get()) { + distributionBillLadingScanService.save(distributionBillLadingScan); + } else { + return Resp.scanFail("当前订单,包件不存在!!", "当前订单,包件不存在!!"); } + + Map mapState = new HashMap<>(); + mapState.put("coding", coding); + mapState.put("warehouseId", myCurrentWarehouse.getId()); + + rabbitTemplate.convertAndSend(RabbitConstant.SELF_PICKUP_SCAN_EXCHANGE, RabbitConstant.SELF_PICKUP_SCAN_ROUTING, mapState, message -> { + message.getMessageProperties() + .setHeader("x-delay", 3000); + return message; + }); + + + + return Resp.scanSuccess("签收成功", "签收成功"); + } + + /** + * 自提签收节点作业推送 + * @param parcelListEntity + * @param billLadingId + * @param singleTime + * @param myCurrentWarehouse + */ + private void sendNodeWorkDataBroadcast(DistributionParcelListEntity parcelListEntity, Long billLadingId, String singleTime, BasicdataWarehouseEntity myCurrentWarehouse) { + try { + iDistributionNodeWorkService.billofladingSignfor(parcelListEntity, billLadingId, singleTime, myCurrentWarehouse.getName()); + } catch (Exception e) { +// throw new RuntimeException(e); + log.error(">>>> 自提签收作业节点广播报错", e); + } + } + + /** + * pda扫描 + * + * @param distrilbutionBillLading + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Resp getScan(Map distrilbutionBillLading) { + return this.getScanNew(distrilbutionBillLading); } /** @@ -2944,7 +3350,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl getInventoryNum(IPage page, Map distrilbutionBillLading) { DistrilbutionBillLadingEntity distrilbutionBillLadingEntity = JSONObject.parseObject(JSONObject.toJSONString(distrilbutionBillLading), DistrilbutionBillLadingEntity.class); // List inventory = baseMapper.getInventory(distrilbutionBillLadingEntity); - Page inventory = baseMapper.getInventoryPage(page,distrilbutionBillLadingEntity); + Page inventory = baseMapper.getInventoryPage(page, distrilbutionBillLadingEntity); inventory.getRecords().forEach(i -> { if (i.getQuantity().equals(i.getDeliveryNum())) { //已备货 @@ -2992,83 +3398,132 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl parcelListIds = new HashSet<>(); - for (int i = 0; i < split.length; i++) { - String s = split[i]; - //查询是不是上传图片 - List list1 = distributionPrintService.list(Wrappers.query().lambda() - .eq(DistributionPrintEntity::getBillLadingId, s) - ); - if (list1.isEmpty()) { - throw new ServiceException("请上传签收图片!!"); - } - int count = (int) list1.stream().filter(ii -> "1".equals(ii.getGenre().toString())).count(); - int count1 = (int) list1.stream().filter(ii -> "2".equals(ii.getGenre().toString())).count(); - int count2 = (int) list1.stream().filter(ii -> "3".equals(ii.getGenre().toString())).count(); - if (count1 < 1 || count < 1 || count2 < 1) { - throw new ServiceException("请上传完整签收图片!!"); - } - //修改提货状态 - DistrilbutionBillLadingEntity billLadingEntity = new DistrilbutionBillLadingEntity(); - billLadingEntity.setConditions(BillLadingStatusConstant.yiqianshou.getValue()); - billLadingEntity.setId(Long.parseLong(s)); - this.updateById(billLadingEntity); - //完成备货状态 - distributionStockupInfoService.maintenanceStockUp(Long.parseLong(s),2); - //查询自提单是否完成扫描 - Integer integer = this.selectBillLadingPlanNum(Long.parseLong(s)); - List ladingScanEntities = distributionBillLadingScanService.list(Wrappers.query().lambda().eq(DistributionBillLadingScanEntity::getBillLadingId, Long.parseLong(s))); - if (Func.isNotEmpty(ladingScanEntities)){ - int sum = ladingScanEntities.stream().mapToInt(DistributionBillLadingScanEntity::getQuantity).sum(); - if (integer != sum){ - //存在资源释放操作 - distributionAsyncService.releaseBillLadingResource(Long.parseLong(s),myCurrentWarehouse.getId()); - } - parcelListIds.addAll(ladingScanEntities.stream().map(DistributionBillLadingScanEntity::getParcelListId).collect(Collectors.toSet())); - }else { - distributionAsyncService.releaseBillLadingResource(Long.parseLong(s),myCurrentWarehouse.getId()); - } - - //修改订单状态 - List list = distrilbutionBillStockService.list(Wrappers.query().lambda() - .eq(DistrilbutionBillStockEntity::getBillLadingId, s) - .apply("order_status in ( 1 , 2)") -// .or(ew -> ew.eq(DistrilbutionBillStockEntity::getBillLadingId, s).apply(DistrilbutionBillStockEntity::getOrderStatus, "2")) - ); - if (!list.isEmpty()) { - list.forEach(li -> { - DistributionStockArticleEntity stockArticleEntity = new DistributionStockArticleEntity(); - stockArticleEntity.setId(li.getStockArticleId()); - List list2 = distributionParcelListService.list(Wrappers.query().lambda() - .eq(DistributionParcelListEntity::getStockArticleId, li.getStockArticleId()) - .apply("order_package_status != 70 ") - ); - if (list2.isEmpty()) { - stockArticleEntity.setOrderStatus(OrderStatusConstant.qianshou.getValue()); - } else { - stockArticleEntity.setOrderStatus(OrderStatusConstant.bufenqianshou.getValue()); + try { + for (int i = 0; i < split.length; i++) { + String s = split[i]; + //查询是不是上传图片 + List list1 = distributionPrintService.list(Wrappers.query().lambda() + .eq(DistributionPrintEntity::getBillLadingId, s) + ); + if (list1.isEmpty()) { + throw new ServiceException("请上传签收图片!!"); + } + int count = (int) list1.stream().filter(ii -> "1".equals(ii.getGenre().toString())).count(); + int count1 = (int) list1.stream().filter(ii -> "2".equals(ii.getGenre().toString())).count(); + int count2 = (int) list1.stream().filter(ii -> "3".equals(ii.getGenre().toString())).count(); + if (count1 < 1 || count < 1 || count2 < 1) { + throw new ServiceException("请上传完整签收图片!!"); + } + //修改提货状态 + DistrilbutionBillLadingEntity billLadingEntity = new DistrilbutionBillLadingEntity(); + billLadingEntity.setConditions(BillLadingStatusConstant.yiqianshou.getValue()); + billLadingEntity.setId(Long.parseLong(s)); + billLadingEntity.setExamineUserName(AuthUtil.getNickName()); + billLadingEntity.setExamineUserId(AuthUtil.getUserId()); + this.updateById(billLadingEntity); + //完成备货状态 + distributionStockupInfoService.maintenanceStockUp(Long.parseLong(s), 2); + //查询自提单是否完成扫描 + Integer integer = this.selectBillLadingPlanNum(Long.parseLong(s)); + List ladingScanEntities = distributionBillLadingScanService.list(Wrappers.query().lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, Long.parseLong(s)) + .eq(DistributionBillLadingScanEntity::getMaterialType, "2") + ); + if (Func.isNotEmpty(ladingScanEntities)) { + int sum = ladingScanEntities.stream().mapToInt(DistributionBillLadingScanEntity::getQuantity).sum(); + if (integer != sum) { + //存在资源释放操作 + distributionAsyncService.releaseBillLadingResource(Long.parseLong(s), myCurrentWarehouse.getId()); } - //回退包件数据 - Integer i1 = updatePack(li.getStockArticleId(), Long.valueOf(s)); - if (i1 > 0) { - stockArticleEntity.setOrderStatus(OrderStatusConstant.bufenqianshou.getValue()); + parcelListIds.addAll(ladingScanEntities.stream().map(DistributionBillLadingScanEntity::getParcelListId).collect(Collectors.toSet())); + for (DistributionBillLadingScanEntity ladingScanEntity : ladingScanEntities) { + // 签收发送消息到工厂 + pushFactoryOrderData(myCurrentWarehouse.getId(), ladingScanEntity.getParcelListId().toString(), ladingScanEntity.getOrderSelfNumbering()); } - distributionStockArticleService.updateById(stockArticleEntity); - }); - } - //处理库存品签收数据 - updateStock(s); + } else { + distributionAsyncService.releaseBillLadingResource(Long.parseLong(s), myCurrentWarehouse.getId()); + } + + //修改订单状态 + List list = distrilbutionBillStockService.list(Wrappers.query().lambda() + .eq(DistrilbutionBillStockEntity::getBillLadingId, s) + .apply("order_status in ( '1' , '3')") +// .or(ew -> ew.eq(DistrilbutionBillStockEntity::getBillLadingId, s).apply(DistrilbutionBillStockEntity::getOrderStatus, "2")) + ); + if (!list.isEmpty()) { + + list.forEach(li -> { + DistributionStockArticleEntity stockArticleEntity = new DistributionStockArticleEntity(); + stockArticleEntity.setId(li.getStockArticleId()); + + List list2 = distributionParcelListService.list(Wrappers.query().lambda() + .eq(DistributionParcelListEntity::getStockArticleId, li.getStockArticleId()) + .apply("order_package_status != 70 ") + ); + if (list2.isEmpty()) { + stockArticleEntity.setOrderStatus(OrderStatusConstant.qianshou.getValue()); + } else { + stockArticleEntity.setOrderStatus(OrderStatusConstant.bufenqianshou.getValue()); + } + //回退包件数据 + Integer i1 = updatePack(li.getStockArticleId(), Long.valueOf(s)); + if (i1 > 0) { + stockArticleEntity.setOrderStatus(OrderStatusConstant.bufenqianshou.getValue()); + } + distributionStockArticleService.updateById(stockArticleEntity); + + + }); + distributionAsyncService.sendFactorySignforInfo(s, myCurrentWarehouse, AuthUtil.getUser()); + + + } + //处理库存品签收数据 + updateStock(s); + // 回传老系统自提数据 + sendOldSystem(Long.parseLong(s)); + } + } catch (Exception e) { + log.error(">>>>>", e); + return false; } + // 回传工厂数据 sendFactory(myCurrentWarehouse, parcelListIds); + return true; } + /** + * 自提签收推淞老系统 + * + * @param id + */ + private void sendOldSystem(Long id) { + + Map mapState = new HashMap(); + mapState.put("messageId", CommonUtil.getUUID()); + mapState.put("messageData", id); + mapState.put("createTime", System.currentTimeMillis()); + try { + log.info(">>>>>>>>>>>>>>>>>>> 推送老系统 的自提数据 {} ", mapState); + rabbitTemplate.convertAndSend(RabbitConstant.BILL_CLERK_CHECK_PUSH_DATA_EXCHANGE, RabbitConstant.BILL_CLERK_CHECK_PUSH_DATA_ROUTING, mapState, message -> { + message.getMessageProperties() + .setHeader("x-delay", 5000); + return message; + }); + } catch (Exception customerException) { + log.error(">>>>>>>>>>>>>>>>>>>>>>>>>> 消息推送失败~ 请联系管理员! {}", customerException.getMessage()); + + } + } + private void sendFactory(BasicdataWarehouseEntity myCurrentWarehouse, Set parcelListIds) { try { // ladingScanEntities中的包件id数据封装为set @@ -3083,9 +3538,12 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl contents = new ArrayList<>(); if (CollUtil.isNotEmpty(value)) { for (DistributionParcelListEntity distributionParcelListEntity : value) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("packageCode", distributionParcelListEntity.getOrderPackageCode()); - contents.add(jsonObject); + PushData pushData = PushData.builder() + .packageCode(distributionParcelListEntity.getOrderPackageCode()) + .orderCode(distributionParcelListEntity.getOrderCode()) + .warehouseName(myCurrentWarehouse.getName()) + .waybillNumber(distributionParcelListEntity.getWaybillNumber()).build(); + contents.add(pushData); } } NodePushMsg msg = new NodePushMsg(); @@ -3101,7 +3559,25 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl map = new HashMap<>(); + map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO)); + rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map); + } catch (Exception e) { + log.error("入库推送失败:", e); } } @@ -3146,7 +3622,6 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl scanEntityList = new ArrayList<>(); AtomicReference num = new AtomicReference<>(0); if (ObjectUtils.isNotNull(list) && !list.isEmpty()) { //签收记录 @@ -3157,41 +3632,31 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl iterator = list.iterator(); while (iterator.hasNext()) { DistrilbutionBillPackageEntity next = iterator.next(); - boolean b = list1.stream().anyMatch(q -> q.getParcelListId().equals(next.getParceListId())); - if (b) { - //删除包件 - iterator.remove(); - } - } - - //添加包件签收记录 -// list.stream().forEach(i ->{ -// distributionParcelListService.lambdaUpdate() -// .set(DistributionParcelListEntity::getOrderPackageStatus, OrderPackageStatusConstant.yiqianshou.getValue()) -// .eq(DistributionParcelListEntity::getId, i); -// DistributionBillLadingScanEntity billLadingScan = new DistributionBillLadingScanEntity(); -// billLadingScan.setMaterialType("2"); -// billLadingScan.setScanType(2); -// billLadingScan.setParcelListId(i.getParceListId()); -// billLadingScan.setStockArticleId(i.getStockArticleId()); -// billLadingScan.setBillLadingId(billId); -// billLadingScan.setPacketBarCode( i.getPacketBarCode()); -// billLadingScan.setQuantity(i.getPacketNumber()); -// scanEntityList.add(billLadingScan); -// }); + if (ObjectUtils.isNotNull(next.getParceListId())) { + boolean b = list1.stream().anyMatch(q -> { + + if (ObjectUtils.isNotNull(q.getParcelListId())) { + return q.getParcelListId().equals(next.getParceListId()); + } + return false; + }); + if (b) { + //删除包件 + iterator.remove(); + } + + + } + + } //回退包件信息 - list.stream().forEach(i -> { + list.forEach(i -> { DistributionParcelListEntity parcelListEntity = new DistributionParcelListEntity(); parcelListEntity.setId(i.getParceListId()); parcelListEntity.setOrderPackageReservationStatus(OrderPackageReservationStatusConstant.daiyuyue.getValue()); distributionParcelListService.updateById(parcelListEntity); num.getAndSet(num.get() + 1); }); - - -// if(!scanEntityList.isEmpty()){ -// distributionBillLadingScanService.saveBatch(scanEntityList); -// } } return num.get(); } @@ -3465,6 +3930,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl completeNum = baseMapper.getCompleteNum(billLadingAppDTO.getBillLadingId()); - if (Func.isNotEmpty(completeNum)){ + if (Func.isNotEmpty(completeNum)) { int size = completeNum.stream().filter(f -> f.equals(true)).collect(Collectors.toList()).size(); billLadingOrderMainVO.setCompleteNum(size); - }else { + } else { billLadingOrderMainVO.setCompleteNum(0); } //查询订单 @@ -3533,13 +3999,13 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl list1 = distributionBillLadingScanService.list(Wrappers.query().lambda() - .eq(DistributionBillLadingScanEntity::getBillLadingId, billLadingAppDTO.getBillLadingId()) - .eq(DistributionBillLadingScanEntity::getStockArticleId, k) + .eq(DistributionBillLadingScanEntity::getBillLadingId, billLadingAppDTO.getBillLadingId()) + .eq(DistributionBillLadingScanEntity::getStockArticleId, k) // .eq(DistributionBillLadingScanEntity::getParcelListId, k) ); if (!list1.isEmpty()) { zeroOrderVO.setSignforQuantity(list1.stream().mapToInt(DistributionBillLadingScanEntity::getQuantity).sum()); - }else { + } else { zeroOrderVO.setSignforQuantity(0); } billLadingZeroOrderVOS.add(zeroOrderVO); @@ -3613,6 +4079,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl selectDistrilbutionBillStockPage(IPage page, DistrilbutionBillStockVO distrilbutionBillStock) { return page.setRecords(baseMapper.selectDistrilbutionBillStockPage(page, distrilbutionBillStock)); @@ -76,7 +87,7 @@ public class DistrilbutionBillStockServiceImpl extends BaseServiceImpl getBillOrderDetail(Map distrilbutionBillStock, IPage page) { - DistrilbutionBillStockEntity billStock = JSON.parseObject(JSON.toJSONString(distrilbutionBillStock), DistrilbutionBillStockEntity.class); + DistrilbutionBillStockDTO billStock = JSON.parseObject(JSON.toJSONString(distrilbutionBillStock), DistrilbutionBillStockDTO.class); IPage billOrderDetail = baseMapper.getBillOrderDetail(page, billStock); billOrderDetail.getRecords().forEach( i ->{ if(StringUtils.isNotBlank(i.getStockupStatus())){ @@ -84,6 +95,8 @@ public class DistrilbutionBillStockServiceImpl extends BaseServiceImpl getBillOrderPack(Map distrilbutionBillStock, IPage page) { - DistrilbutionBillStockEntity billStock = JSON.parseObject(JSON.toJSONString(distrilbutionBillStock), DistrilbutionBillStockEntity.class); + + DistrilbutionBillStockDTO billStock = JSON.parseObject(JSON.toJSONString(distrilbutionBillStock), DistrilbutionBillStockDTO.class); + IPage billOrderPack = baseMapper.getBillOrderPack(page, billStock); billOrderPack.getRecords().forEach(i -> { if(ObjectUtils.isNotNull(i.getStockupCreateUser())){ @@ -110,7 +125,6 @@ public class DistrilbutionBillStockServiceImpl extends BaseServiceImpl distributionBillOrderExcels = baseMapper.distrilbutionBillStock(billStock); + List distributionBillOrderExcels = baseMapper.getBillStockExcel(billStock); distributionBillOrderExcels.forEach( i ->{ if(StringUtils.isNotBlank(i.getStockupStatus())){ @@ -157,9 +171,28 @@ public class DistrilbutionBillStockServiceImpl extends BaseServiceImpl distrilbutionBillDeatilStock(Long id) { + List distributionBillOrderExcels = baseMapper.getBillLadingDetailStockExcel(id); + + distributionBillOrderExcels.forEach( i ->{ + if(StringUtils.isNotBlank(i.getStockupStatus())){ + i.setStockupStatusName(DictBizCache.getValue(DictBizConstant.STOCKUP_STATUS,i.getStockupStatus())); } + if(ObjectUtils.isNotNull(i.getConditions())){ + i.setConditionsName(DictBizCache.getValue(DictBizConstant.BILL_CONDITIONS_STATUS,i.getConditions())); + } +// if (StringUtils.isNotBlank(i.getHandQuantity())){ +// i.setStockUpQuantity(i.getHandQuantity()); +// } }); return distributionBillOrderExcels; } @@ -180,6 +213,20 @@ public class DistrilbutionBillStockServiceImpl extends BaseServiceImpl billLadingDetailOrderPackExcel(Long id) { + List distributionBillOrderPackExcels = baseMapper.getBillLadingDetailOrderPackExcel(id); + distributionBillOrderPackExcels.forEach(i -> { + if(ObjectUtils.isNotNull(i.getStockupCreateUser())){ + R userR = userClient.userInfoById(Long.valueOf(i.getStockupCreateUser())); + if(userR.isSuccess() && ObjectUtils.isNotNull(userR.getData())){ + i.setStockupCreateUser(userR.getData().getRealName()); + } + } + }); + return distributionBillOrderPackExcels; + } + /** * @param l */ @@ -216,4 +263,15 @@ public class DistrilbutionBillStockServiceImpl extends BaseServiceImpl ladingScanEntities = distributionBillLadingScanService.list(Wrappers.query().lambda() + .eq(DistributionBillLadingScanEntity::getBillLadingId, billLadingId) + .eq(DistributionBillLadingScanEntity::getStockArticleId, orderId) + ); + return ladingScanEntities.isEmpty(); + } + } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/wrapper/DistributionReservationWrapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/wrapper/DistributionReservationWrapper.java index 741728f3d..71e1fc119 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/wrapper/DistributionReservationWrapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/wrapper/DistributionReservationWrapper.java @@ -51,6 +51,7 @@ public class DistributionReservationWrapper extends BaseEntityWrapper { - private IUserClient userCliient = SpringUtil.getBean(IUserClient.class); - private IDistributionParcelListService distributionParcelListService = SpringUtil.getBean(IDistributionParcelListService.class); - private IDistributionLoadscanService distributionLoadscanService = SpringUtil.getBean(IDistributionLoadscanService.class); + private final IUserClient userCliient = SpringUtil.getBean(IUserClient.class); + private final IDistributionParcelListService distributionParcelListService = SpringUtil.getBean(IDistributionParcelListService.class); + private final IDistributionLoadscanService distributionLoadscanService = SpringUtil.getBean(IDistributionLoadscanService.class); public static DistributionStockArticleNewWrapper build() { diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/wrapper/DistributionStockArticleWrapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/wrapper/DistributionStockArticleWrapper.java index 3a20b319c..9057448a0 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/wrapper/DistributionStockArticleWrapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/wrapper/DistributionStockArticleWrapper.java @@ -22,9 +22,9 @@ import java.util.Objects; */ @Log4j2 public class DistributionStockArticleWrapper extends BaseEntityWrapper { - private IUserClient userCliient = SpringUtil.getBean(IUserClient.class); - private IDistributionParcelListService distributionParcelListService = SpringUtil.getBean(IDistributionParcelListService.class); - private IDistributionLoadscanService distributionLoadscanService = SpringUtil.getBean(IDistributionLoadscanService.class); + private final IUserClient userCliient = SpringUtil.getBean(IUserClient.class); + private final IDistributionParcelListService distributionParcelListService = SpringUtil.getBean(IDistributionParcelListService.class); + private final IDistributionLoadscanService distributionLoadscanService = SpringUtil.getBean(IDistributionLoadscanService.class); public static DistributionStockArticleWrapper build() { @@ -38,8 +38,8 @@ public class DistributionStockArticleWrapper extends BaseEntityWrapper { - private IDistributionStockListService stockListService = SpringUtil.getBean(IDistributionStockListService.class); - private IDistributionSignforService signforService = SpringUtil.getBean(IDistributionSignforService.class); - private IDistributionDeliveryListService deliveryListService = SpringUtil.getBean(IDistributionDeliveryListService.class); - private IDistrilbutionBillLadingService billLadingService = SpringUtil.getBean(IDistrilbutionBillLadingService.class); + private final IDistributionStockListService stockListService = SpringUtil.getBean(IDistributionStockListService.class); + private final IDistributionSignforService signforService = SpringUtil.getBean(IDistributionSignforService.class); + private final IDistributionDeliveryListService deliveryListService = SpringUtil.getBean(IDistributionDeliveryListService.class); + private final IDistrilbutionBillLadingService billLadingService = SpringUtil.getBean(IDistrilbutionBillLadingService.class); public static DistributionStockWrapper build(){ return new DistributionStockWrapper(); diff --git a/blade-service/logpm-distribution/src/main/resources/application-dev.yml b/blade-service/logpm-distribution/src/main/resources/application-dev.yml index a4b50cf30..5900ebb32 100644 --- a/blade-service/logpm-distribution/src/main/resources/application-dev.yml +++ b/blade-service/logpm-distribution/src/main/resources/application-dev.yml @@ -41,7 +41,7 @@ spring: mandatory: true #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -62,12 +62,21 @@ spring: url: ${blade.datasource.distribution.master.url} username: ${blade.datasource.distribution.master.username} password: ${blade.datasource.distribution.master.password} - slave: - druid: - #独立校验配置 - validation-query: select 1 - #oracle校验 - #validation-query: select 1 from dual - url: ${blade.datasource.distribution.slave.url} - username: ${blade.datasource.distribution.slave.username} - password: ${blade.datasource.distribution.slave.password} +# 627683: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.distribution.627683.url} +# username: ${blade.datasource.distribution.627683.username} +# password: ${blade.datasource.distribution.627683.password} +# 703623: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.distribution.703623.url} +# username: ${blade.datasource.distribution.703623.username} +# password: ${blade.datasource.distribution.703623.password} diff --git a/blade-service/logpm-distribution/src/main/resources/application-prod.yml b/blade-service/logpm-distribution/src/main/resources/application-prod.yml index 1406c5b7a..0056973f3 100644 --- a/blade-service/logpm-distribution/src/main/resources/application-prod.yml +++ b/blade-service/logpm-distribution/src/main/resources/application-prod.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -25,10 +25,10 @@ spring: url: ${blade.datasource.distribution.master.url} username: ${blade.datasource.distribution.master.username} password: ${blade.datasource.distribution.master.password} - slave: - url: ${blade.datasource.distribution.slave.url} - username: ${blade.datasource.distribution.slave.username} - password: ${blade.datasource.distribution.slave.password} + 627683: + url: ${blade.datasource.distribution.627683.url} + username: ${blade.datasource.distribution.627683.username} + password: ${blade.datasource.distribution.627683.password} #rabbitmq配置 rabbitmq: host: 172.16.128.145 diff --git a/blade-service/logpm-distribution/src/main/resources/application-test.yml b/blade-service/logpm-distribution/src/main/resources/application-test.yml index c65175203..cd0503369 100644 --- a/blade-service/logpm-distribution/src/main/resources/application-test.yml +++ b/blade-service/logpm-distribution/src/main/resources/application-test.yml @@ -39,7 +39,7 @@ spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -60,12 +60,30 @@ spring: url: ${blade.datasource.distribution.master.url} username: ${blade.datasource.distribution.master.username} password: ${blade.datasource.distribution.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.distribution.slave.url} - username: ${blade.datasource.distribution.slave.username} - password: ${blade.datasource.distribution.slave.password} + url: ${blade.datasource.distribution.627683.url} + username: ${blade.datasource.distribution.627683.username} + password: ${blade.datasource.distribution.627683.password} + 695224: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.distribution.695224.url} + username: ${blade.datasource.distribution.695224.username} + password: ${blade.datasource.distribution.695224.password} + 645789: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.distribution.645789.url} + username: ${blade.datasource.distribution.645789.username} + password: ${blade.datasource.distribution.645789.password} diff --git a/blade-service/logpm-distribution/src/test/java/com/logpm/distribution/TestService.java b/blade-service/logpm-distribution/src/test/java/com/logpm/distribution/TestService.java index c427db8be..2a81579ed 100644 --- a/blade-service/logpm-distribution/src/test/java/com/logpm/distribution/TestService.java +++ b/blade-service/logpm-distribution/src/test/java/com/logpm/distribution/TestService.java @@ -6,24 +6,26 @@ import com.logpm.distribution.dto.DistributionSignforDTO; import com.logpm.distribution.entity.DistributionParcelListEntity; import com.logpm.distribution.entity.DistributionStockArticleEntity; import com.logpm.distribution.feign.IDistributionParcelListClient; -import com.logpm.distribution.service.IDistributionDeliveryListService; -import com.logpm.distribution.service.IDistributionParcelListService; -import com.logpm.distribution.service.IDistributionSignforService; -import com.logpm.distribution.service.IDistributionStockArticleService; +import com.logpm.distribution.service.*; import com.logpm.distribution.service.impl.DistributionSignforServiceImpl; import com.logpm.distribution.vo.print.PrintPreviewVO; import com.logpm.factory.comfac.dto.OrderStatusDTO; import com.logpm.factory.oupai.entity.FactoryOrderEntity; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.springblade.common.constant.RabbitConstant; +import org.springblade.common.utils.CommonUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.test.BladeBootTest; import org.springblade.core.test.BladeSpringExtension; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; +import java.util.HashMap; import java.util.List; +import java.util.Map; @ExtendWith(BladeSpringExtension.class) @BladeBootTest(appName = "logpm-distribution-pref", enableLoader = true) @@ -37,6 +39,10 @@ public class TestService { @Autowired private DistributionSignforServiceImpl iDistributionSignforService; + @Autowired + private IDistrilbutionBillLadingService distrilbutionBillLadingService; + @Autowired + private IDistributionReservationService distributionReservationService; @Test public void test2() throws Exception { @@ -157,5 +163,19 @@ public class TestService { System.out.println(byWaybillId); } + @Test + public void test199(){ + distrilbutionBillLadingService.clerkBillCheckPushData(1788142166947786754L); + } + + + @Test + public void test200(){ + distributionReservationService.createBusinessPreConversionQueue(1790195831916580866L); + } + + + + } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-base/Dockerfile b/blade-service/logpm-factory-data/logpm-factory-data-base/Dockerfile index e1a165665..d707d4d86 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-base/Dockerfile +++ b/blade-service/logpm-factory-data/logpm-factory-data-base/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/config/CustomMessageConverter.java b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/config/CustomMessageConverter.java new file mode 100644 index 000000000..b86b247a7 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/config/CustomMessageConverter.java @@ -0,0 +1,161 @@ +package com.logpm.factorydata.base.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength((long) bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/config/RabbitConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/config/RabbitConfig.java new file mode 100644 index 000000000..31b0350c5 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/config/RabbitConfig.java @@ -0,0 +1,17 @@ +package com.logpm.factorydata.base.config; + +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory factory) { + RabbitTemplate template = new RabbitTemplate(factory); + template.setMessageConverter(new CustomMessageConverter()); + return template; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/entity/FactoryWarehouseBindEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/entity/FactoryWarehouseBindEntity.java index 08a601097..9b9c85767 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/entity/FactoryWarehouseBindEntity.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/entity/FactoryWarehouseBindEntity.java @@ -40,6 +40,16 @@ public class FactoryWarehouseBindEntity extends BaseEntity { */ @ApiModelProperty(name = "仓库名称", notes = "") private String warehouseName; + /** + * 老系统仓库id + */ + @ApiModelProperty(name = "老系统仓库id", notes = "") + private Long oldWarehouseId; + /** + * 老系统仓库名称 + */ + @ApiModelProperty(name = "老系统仓库名称", notes = "") + private String oldWarehouseName; /** * 租户id */ diff --git a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/feign/FactoryDataBaseClient.java b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/feign/FactoryDataBaseClient.java index ed6498a4f..b9e3c7531 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/feign/FactoryDataBaseClient.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/feign/FactoryDataBaseClient.java @@ -12,6 +12,7 @@ import com.logpm.factorydata.base.service.FactoryWarehouseBindService; import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; import lombok.AllArgsConstructor; import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springframework.web.bind.annotation.RestController; @@ -34,7 +35,7 @@ public class FactoryDataBaseClient implements IFactoryDataBaseClient { public R getWarehouseByBrandAndSiteName(String brand, String siteName) { String rediskey = FactoryDatabaseConstants.FACTORY_DATA_BASE_WAREHOUSE_BIND + ":" + brand + "_" + siteName; String obj = bladeRedis.get(rediskey); - if(StrUtil.isNotBlank(obj)){ + if (StrUtil.isNotBlank(obj)) { FactoryWarehouseBindVO redisBindVO = JSONUtil.toBean(obj, FactoryWarehouseBindVO.class); if (ObjectUtil.isNotNull(redisBindVO)) { return R.data(redisBindVO); @@ -43,12 +44,15 @@ public class FactoryDataBaseClient implements IFactoryDataBaseClient { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(FactoryWarehouseBindEntity::getBrand, brand); queryWrapper.eq(FactoryWarehouseBindEntity::getSiteName, siteName); + String tenantId = AuthUtil.getTenantId(); List warehouseList = bindService.list(queryWrapper); if (CollUtil.isNotEmpty(warehouseList)) { FactoryWarehouseBindEntity entity = warehouseList.get(0); FactoryWarehouseBindVO vo = new FactoryWarehouseBindVO(); vo.setWarehouseName(entity.getWarehouseName()); vo.setWarehouseId(entity.getWarehouseId()); + vo.setOldWarehouseId(entity.getOldWarehouseId()); + vo.setOldWarehouseName(entity.getOldWarehouseName()); vo.setTenantId(entity.getTenantId()); bladeRedis.setEx(rediskey, JSONUtil.toJsonStr(vo), Convert.toLong(60 * 60)); return R.data(vo); diff --git a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/service/impl/MqServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/service/impl/MqServiceImpl.java index d09709901..dc0e3b8cd 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/service/impl/MqServiceImpl.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/service/impl/MqServiceImpl.java @@ -11,17 +11,24 @@ import com.logpm.factorydata.base.exception.MsgException; import com.logpm.factorydata.base.service.FailMsgService; import com.logpm.factorydata.base.service.MqService; import lombok.extern.slf4j.Slf4j; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springblade.core.tool.utils.WebUtil; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageBuilder; import org.springframework.amqp.core.MessageDeliveryMode; import org.springframework.amqp.rabbit.connection.CorrelationData; import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.http.HttpHeaders; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Recover; import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestContextHolder; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * @author zhaoqiaobo @@ -97,6 +104,21 @@ public class MqServiceImpl implements MqService { try { // 5.发送消息 this.rabbitTemplate.convertAndSend(exchange, routingKey, message, messagePostProcessor -> { + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messagePostProcessor.getMessageProperties().setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messagePostProcessor.getMessageProperties().setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); //设置延时发送时间,delay小于0,实时发送 messagePostProcessor.getMessageProperties().setDelay(delay); return messagePostProcessor; diff --git a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-dev.yml b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-dev.yml index 8273125b2..64d569938 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-dev.yml +++ b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-dev.yml @@ -38,7 +38,7 @@ spring: mandatory: true #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -59,13 +59,15 @@ spring: url: ${blade.datasource.factorydata-base.master.url} username: ${blade.datasource.factorydata-base.master.username} password: ${blade.datasource.factorydata-base.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.factorydata-base.slave.url} - username: ${blade.datasource.factorydata-base.slave.username} - password: ${blade.datasource.factorydata-base.slave.password} - + url: ${blade.datasource.factorydata-base.627683.url} + username: ${blade.datasource.factorydata-base.627683.username} + password: ${blade.datasource.factorydata-base.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-prod.yml b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-prod.yml index 3db9ae091..924f6edba 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-prod.yml +++ b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-prod.yml @@ -1,6 +1,6 @@ #服务器端口 server: - port: 8900 + port: 18900 #数据源配置 #spring: @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -30,16 +30,18 @@ spring: validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.report.master.url} - username: ${blade.datasource.report.master.username} - password: ${blade.datasource.report.master.password} - slave: + url: ${blade.datasource.factorydata-base.master.url} + username: ${blade.datasource.factorydata-base.master.username} + password: ${blade.datasource.factorydata-base.master.password} + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.report.slave.url} - username: ${blade.datasource.report.slave.username} - password: ${blade.datasource.report.slave.password} - + url: ${blade.datasource.factorydata-base.627683.url} + username: ${blade.datasource.factorydata-base.627683.username} + password: ${blade.datasource.factorydata-base.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-test.yml b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-test.yml index 58ff342c4..0e63c1a97 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-test.yml +++ b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-test.yml @@ -38,7 +38,7 @@ spring: mandatory: true #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -59,13 +59,15 @@ spring: url: ${blade.datasource.factorydata-base.master.url} username: ${blade.datasource.factorydata-base.master.username} password: ${blade.datasource.factorydata-base.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.factorydata-base.slave.url} - username: ${blade.datasource.factorydata-base.slave.username} - password: ${blade.datasource.factorydata-base.slave.password} - + url: ${blade.datasource.factorydata-base.627683.url} + username: ${blade.datasource.factorydata-base.627683.username} + password: ${blade.datasource.factorydata-base.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application.yml b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application.yml index 77f3f06b4..33da94b58 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application.yml +++ b/blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application.yml @@ -29,14 +29,3 @@ spring: main: allow-circular-references: true -xxl: - job: - accessToken: '' - admin: - addresses: http://127.0.0.1:7009/xxl-job-admin - executor: - appname: logpm-factory-data-xxljob - ip: 127.0.0.1 - logpath: ../data/applogs/logpm-factory-data-xxljob/jobhandler - logretentiondays: -1 - port: 17019 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/Dockerfile b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/Dockerfile new file mode 100644 index 000000000..88d5d9ffe --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/Dockerfile @@ -0,0 +1,14 @@ +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 + +MAINTAINER h5u@163.com + +RUN mkdir -p /logpm/factory-data-jinpai + +WORKDIR /logpm/factory-data-jinpai + +EXPOSE 18940 + +ADD ./target/logpm-factory-data-jinpai.jar ./app.jar + +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","-Xms128m","-Xmx512m", "app.jar"] +CMD ["--spring.profiles.active=test"] diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/pom.xml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/pom.xml new file mode 100644 index 000000000..5098306d4 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/pom.xml @@ -0,0 +1,97 @@ + + + + logpm-factory-data + org.springblade + 3.2.0.RELEASE + + 4.0.0 + ${bladex.project.version} + jar + logpm-factory-data-jinpai + + + 8 + 8 + + + + + org.springblade + blade-core-boot + + + org.springblade + blade-core-auto + provided + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springblade + logpm-factory-data-api + 3.2.0.RELEASE + + + com.xuxueli + xxl-job-core + + + org.springblade + blade-starter-swagger + + + org.springblade + logpm-trunkline-api + 3.2.0.RELEASE + + + org.springblade + logpm-factory-data-base-api + ${bladex.project.version} + + + org.springblade + blade-starter-oss + + + io.minio + minio + + + org.springblade + blade-resource-api + 3.2.0.RELEASE + compile + + + + + + + com.spotify + dockerfile-maven-plugin + + ${docker.username} + ${docker.password} + ${docker.registry.url}/${docker.namespace}/${project.artifactId} + ${project.version} + true + + target/${project.build.finalName}.jar + + false + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/FactoryDataJinPaiApplication.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/FactoryDataJinPaiApplication.java new file mode 100644 index 000000000..04c4c208d --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/FactoryDataJinPaiApplication.java @@ -0,0 +1,20 @@ +package com.logpm.factorydata; + +import org.springblade.common.constant.ModuleNameConstant; +import org.springblade.core.cloud.client.BladeCloudApplication; +import org.springblade.core.launch.BladeApplication; + +/** + * 金牌工厂数据启动类 + * + * @author zhaoqiaobo + * @create 2024-4-26 + */ +@BladeCloudApplication +public class FactoryDataJinPaiApplication { + + public static void main(String[] args) { + BladeApplication.run(ModuleNameConstant.LOGPM_FACTORY_DATA_JINPAI_NAME, FactoryDataJinPaiApplication.class, args); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..bfe13ad27 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.factorydata.jinpai.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/aspect/JobAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/aspect/JobAnnotationAspect.java new file mode 100644 index 000000000..f20d87566 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/aspect/JobAnnotationAspect.java @@ -0,0 +1,83 @@ +package com.logpm.factorydata.jinpai.aspect; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.AllArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Aspect +@Component +@AllArgsConstructor +public class JobAnnotationAspect { + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + + @Around("@annotation(com.xxl.job.core.handler.annotation.XxlJob)") + public Object xxlJobAnnotationMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + + JSONObject jsonObject = mockLogin(); + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.addHeader("Blade-Auth", "bearer "+jsonObject.get("access_token")); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(mockRequest)); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+jsonObject.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + DynamicDataSourceContextHolder.push(jsonObject.getString("tenant_id")); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + + return result; + + + } + + private JSONObject mockLogin() throws InterruptedException { + + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + return data; + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..fa2f303bb --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.factorydata.jinpai.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/CustomMessageConverter.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/CustomMessageConverter.java new file mode 100644 index 000000000..4b51d458b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/CustomMessageConverter.java @@ -0,0 +1,161 @@ +package com.logpm.factorydata.jinpai.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength((long) bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/ExecutorConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/ExecutorConfig.java new file mode 100644 index 000000000..294c78ddd --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/ExecutorConfig.java @@ -0,0 +1,79 @@ +package com.logpm.factorydata.jinpai.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.http.HttpHeaders; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + ThreadLocalUtil.put("bladeContext", headers); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/FactoryDataSuoFeiYaConfiguration.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/FactoryDataSuoFeiYaConfiguration.java new file mode 100644 index 000000000..2d5d3bcb2 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/FactoryDataSuoFeiYaConfiguration.java @@ -0,0 +1,40 @@ +/* + * 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.jinpai.config; + + +import com.logpm.factorydata.jinpai.pros.FactoryDataJinPaiProperties; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 配置feign、mybatis包名、properties + * + * @author chaos + */ +@Configuration(proxyBeanMethods = false) +@ComponentScan({"org.springblade", "com.logpm"}) +@EnableFeignClients({"org.springblade", "com.logpm"}) +@MapperScan({"org.springblade.**.mapper.**", "com.logpm.**.mapper.**"}) +@EnableConfigurationProperties(FactoryDataJinPaiProperties.class) +public class FactoryDataSuoFeiYaConfiguration { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/InterceptorAdapterConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/InterceptorAdapterConfig.java new file mode 100644 index 000000000..505fd7997 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/InterceptorAdapterConfig.java @@ -0,0 +1,35 @@ +package com.logpm.factorydata.jinpai.config; + +import com.logpm.factorydata.jinpai.interceptor.FactoryAccountsInterceptor; +import com.logpm.factorydata.jinpai.interceptor.LocalServerLoginAccountsInterceptor; +import com.logpm.factorydata.jinpai.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.springblade.common.component.MockLoginService; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@AllArgsConstructor +public class InterceptorAdapterConfig implements WebMvcConfigurer { + + private final IFactoryTokenService factoryTokenService; + + private final BladeRedis redis; + + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + + @Override + public void addInterceptors(InterceptorRegistry interceptorRegistry) { +// interceptorRegistry.addInterceptor(new FactoryAccountsInterceptor(factoryTokenService)) +// .addPathPatterns("/**").order(1); + interceptorRegistry.addInterceptor(new LocalServerLoginAccountsInterceptor(redis, environment,redisLockClient,mockLoginService)) + .addPathPatterns("/**").order(2); + + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/RabbitConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/RabbitConfig.java new file mode 100644 index 000000000..b1bfa1153 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/RabbitConfig.java @@ -0,0 +1,17 @@ +package com.logpm.factorydata.jinpai.config; + +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory factory) { + RabbitTemplate template = new RabbitTemplate(factory); + template.setMessageConverter(new CustomMessageConverter()); + return template; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/XxlJobConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/XxlJobConfig.java new file mode 100644 index 000000000..8133b6a26 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/config/XxlJobConfig.java @@ -0,0 +1,74 @@ +package com.logpm.factorydata.jinpai.config; + +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author xuxueli 2017-04-28 + */ +@Configuration(proxyBeanMethods = false) +public class XxlJobConfig { + private final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${xxl.job.admin.addresses}") + private String adminAddresses; + + @Value("${xxl.job.executor.appname}") + private String appName; + + @Value("${xxl.job.executor.ip}") + private String ip; + + @Value("${xxl.job.executor.port}") + private int port; + + @Value("${xxl.job.accessToken}") + private String accessToken; + + @Value("${xxl.job.executor.logpath}") + private String logPath; + + @Value("${xxl.job.executor.logretentiondays}") + private int logRetentionDays; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppName(appName); + xxlJobSpringExecutor.setIp(ip); + xxlJobSpringExecutor.setPort(port); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); + + return xxlJobSpringExecutor; + } + + /** + * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP; + * + * 1、引入依赖: + * + * org.springframework.cloud + * spring-cloud-commons + * ${version} + * + * + * 2、配置文件,或者容器启动变量 + * spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.' + * + * 3、获取IP + * String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(); + */ + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/controller/OrderController.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/controller/OrderController.java new file mode 100644 index 000000000..b5faf3da5 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/controller/OrderController.java @@ -0,0 +1,108 @@ +package com.logpm.factorydata.jinpai.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.factorydata.jinpai.service.DeliveryNoteService; +import com.logpm.factorydata.jinpai.vo.DeliveryNoteVO; +import com.logpm.factorydata.jinpai.vo.OrderInfoVO; +import com.logpm.factorydata.jinpai.vo.PackageInfoVO; +import com.logpm.factorydata.jinpai.vo.PushOrderVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 工厂订单 前端控制器 + * + * @author zhaoqiaobo + * @create 2024-03-21 19:27 + */ +@Slf4j +@RestController +@RequestMapping("/order") +@AllArgsConstructor +@Api(value = "工厂订单", tags = "工厂订单") +public class OrderController { + + private final DeliveryNoteService service; + + @ResponseBody + @PostMapping + @ApiOperationSupport(order = 1) + @ApiOperation(value = "工厂订单", notes = "工厂订单") + public R order(@RequestBody List vo) { + log.info("接收工厂订单:{} ", JSONUtil.toJsonStr(vo)); + String res = ""; + try { + if (CollUtil.isNotEmpty(vo)) { + res = service.order(vo); + } + } catch (Exception e) { + log.error("工厂订单异常:{} ", e); + return R.success("服务器异常"); + } + return R.success(res); + } + + @ResponseBody + @PostMapping("orderInfo") + @ApiOperationSupport(order = 2) + @ApiOperation(value = "工厂订单明细", notes = "工厂订单明细") + public R detail(@RequestBody List vo) { + log.info("接收工厂订单明细:{} ", JSONUtil.toJsonStr(vo)); + String res = ""; + try { + if (CollUtil.isNotEmpty(vo)) { + res = service.detail(vo); + } + } catch (Exception e) { + log.error("工厂订单明细异常:{} ", e); + return R.success("服务器异常"); + } + return R.success(res); + } + @ResponseBody + @PostMapping("packageInfo") + @ApiOperationSupport(order = 3) + @ApiOperation(value = "工厂包件信息", notes = "工厂包件信息") + public R packageInfo(@RequestBody List vo) { + log.info("接收工厂包件信息:{} ", JSONUtil.toJsonStr(vo)); + String res = ""; + try { + if (CollUtil.isNotEmpty(vo)) { + res = service.packageInfo(vo); + } + } catch (Exception e) { + log.error("工厂包件信息异常:{} ", e); + return R.success("服务器异常"); + } + return R.success(res); + } + @ResponseBody + @PostMapping("pushOrder") + @ApiOperationSupport(order = 4) + @ApiOperation(value = "工厂下单接口", notes = "工厂下单接口") + public R pushOrder(@RequestBody PushOrderVO vo) { + log.info("接收工厂下单接口信息:{} ", JSONUtil.toJsonStr(vo)); + String res = ""; + try { + res = service.pushOrder(vo); + } catch (Exception e) { + log.error("接收工厂下单接口信息异常:{} ", e); + return R.success("服务器异常"); + } + return R.success(res); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/DeliveryNoteEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/DeliveryNoteEntity.java new file mode 100644 index 000000000..319987dad --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/DeliveryNoteEntity.java @@ -0,0 +1,142 @@ +package com.logpm.factorydata.jinpai.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 订单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("jp_delivery_note") +@ApiModel(value = "金牌订单", description = "金牌订单") +@EqualsAndHashCode(callSuper = true) +public class DeliveryNoteEntity extends BaseEntity { + + @ApiModelProperty(name = "日志id") + private String logId; + @ApiModelProperty(name = "确认时间") + private String confirmTime; + @ApiModelProperty(name = "订单号") + private String orderId; + @ApiModelProperty(name = "YS客户单号") + private String omsExtYsId; + @ApiModelProperty(name = "始发站") + private String sendSite; + @ApiModelProperty(name = "目的站") + private String recvSite; + @ApiModelProperty(name = "发货时间") + private String sendTime; + @ApiModelProperty(name = "要求到货时间") + private String requireRecvTime; + @ApiModelProperty(name = "发货客户编号") + private String consignerCode; + @ApiModelProperty(name = "发货方客户名称") + private String consignerName; + @ApiModelProperty(name = "发货方联系人") + private String consignerContacts; + @ApiModelProperty(name = "发货方联系手机") + private String consignerMobile; + @ApiModelProperty(name = "发货方联系电话(座机)") + private String consignerPhone; + @ApiModelProperty(name = "发货地址") + private String consignerAddr; + @ApiModelProperty(name = "收货客户名称") + private String receiverName; + @ApiModelProperty(name = "收货客户联系人") + private String receiverContacts; + @ApiModelProperty(name = "收货人联系手机") + private String receiverMobile; + @ApiModelProperty(name = "收货联系电话") + private String receiverPhone; + @ApiModelProperty(name = "收货地址") + private String receiverAddr; + @ApiModelProperty(name = "货物体积") + private String goodsTotalVolume; + @ApiModelProperty(name = "货物件数") + private String goodsTotalNumber; + @ApiModelProperty(name = "货物重量") + private String goodsTotalWeight; + @ApiModelProperty(name = "承运商编码") + private String carrierId; + @ApiModelProperty(name = "承运商名称") + private String carrierName; + @ApiModelProperty(name = "承运类型: sfwl 三方物流, sczp 干仓配") + private String distributionMode; + @ApiModelProperty(name = "送货模式:gc-wf 专线-基地直发,sc-ps 干仓配-2C,sc-wf 干仓配-2B") + private String deliveryMode; + @ApiModelProperty(name = "承运商联系人") + private String carrierContacts; + @ApiModelProperty(name = "承运商手机") + private String carrierMobile; + @ApiModelProperty(name = "承运商电话") + private String carrierPhone; + @ApiModelProperty(name = "车牌号") + private String carNo; + @ApiModelProperty(name = "司机姓名") + private String driverName; + @ApiModelProperty(name = "司机联系手机") + private String driverMobile; + @ApiModelProperty(name = "到站网点id") + private String arriveOrg; + @ApiModelProperty(name = "到站网点") + private String arriveOrgName; + @ApiModelProperty(name = "发车时间") + private String departTime; + @ApiModelProperty(name = "中转站") + private String transferSite; + @ApiModelProperty(name = "中转到达时间") + private String transferArriveTime; + @ApiModelProperty(name = "中转发出时间") + private String transferStartTime; + @ApiModelProperty(name = "到达时间") + private String arriveTime; + @ApiModelProperty(name = "签收时间") + private String signTime; + @ApiModelProperty(name = "门店名称") + private String shopName; + @ApiModelProperty(name = "门店手机") + private String shopPhone; + @ApiModelProperty(name = "门店地址") + private String shopAddr; + @ApiModelProperty(name = "中转地址编码") + private String transferSiteId; + @ApiModelProperty(name = "订单运输跟踪状态(0.0:待发车,1.0:已发车,2.3:已中转到达,2.8:已中转出发,3.0:已到达,4.0:已签收") + private String trackingStatus; + @ApiModelProperty(name = "运输车牌") + private String vehicleNo; + @ApiModelProperty(name = "承运运输单位") + private String carrierUnit; + @ApiModelProperty(name = "承运商单号") + private String carrierOrderId; + @ApiModelProperty(name = "备注") + private String departRemark; + @ApiModelProperty(name = "异常签收类型(0:货损,1:少货,2:串货,)") + private String wrongSignType; + @ApiModelProperty(name = "签收状态:wqs=未签收 ycqs=异常签收 zcqs=正常签收") + private String orderSignStatus; + @ApiModelProperty(name = "回单状态 0 未回单 1 已回单") + private String receiptFlag; + @ApiModelProperty(name = "回单份数") + private String receiptNum; + @ApiModelProperty(name = "发货基地: 1=厦门基地,2=泗阳基地,4=橙鸟厦门仓,5=橙鸟佛山仓,6=成都基地") + private String busSource; + + @ApiModelProperty(name = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(name = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(name = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(name = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(name = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/FactoryNodePushEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/FactoryNodePushEntity.java new file mode 100644 index 000000000..613624eca --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/FactoryNodePushEntity.java @@ -0,0 +1,79 @@ +package com.logpm.factorydata.jinpai.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("jinpai_factory_node_push") +@ApiModel(value = "节点数据推送成功数据", description = "节点数据推送成功数据") +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public class FactoryNodePushEntity 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 orderCode; + /** + * 节点 + */ + @ApiModelProperty(name = "节点", notes = "") + private String node; + /** + * 包件 + */ + @ApiModelProperty(name = "包件", notes = "") + private String packageCode; + /** + * 内容 + */ + @ApiModelProperty(name = "内容", notes = "") + private String content; + /** + * 返回值 + */ + @ApiModelProperty(name = "返回值", notes = "") + private String resultContent; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/FactoryOrderLogEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/FactoryOrderLogEntity.java new file mode 100644 index 000000000..cac3f0573 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/FactoryOrderLogEntity.java @@ -0,0 +1,63 @@ +package com.logpm.factorydata.jinpai.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +@Data +@TableName("jp_factory_log") +@ApiModel(value = "接收工厂订单日志", description = "接收工厂订单日志") +@EqualsAndHashCode(callSuper = true) +public class FactoryOrderLogEntity 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 logUrl; + /** + * 数据类型 1.拉取数据 2。推送数据 + */ + @ApiModelProperty(name = "数据类型 1.拉取数据 2。推送数据", notes = "") + private Integer type; + /** + * 数据维度:1 订单 2 订单明细 3 包件 + */ + @ApiModelProperty(name = "维度:1 订单 2 订单明细 3 包件", notes = "") + private Integer dimension; + /** + * 解析状态 0 未解析 1 解析失败 2 已解析 + */ + @ApiModelProperty(name = "解析状态 0 未解析 1 解析失败 2 已解析", notes = "") + private Integer saxStatus; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/FactoryToken.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/FactoryToken.java new file mode 100644 index 000000000..2e4e7c087 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/FactoryToken.java @@ -0,0 +1,32 @@ +package com.logpm.factorydata.jinpai.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springblade.core.mp.base.BaseEntity; + +import java.util.Date; + +@Data +@TableName("factory_token") +@ApiModel(value = "FactoryToken对象", description = "工厂账户token") +public class FactoryToken extends BaseEntity { + + @ApiModelProperty("token") + private String token; + + @ApiModelProperty("token摘要") + private String tokenAbst; + + @JsonFormat( + pattern = "yyyy-MM-dd HH:mm:ss" + ) + @ApiModelProperty("过期时间") + private Date expireTime; + + @ApiModelProperty("企业id") + private String corpid; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/OrderInfoEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/OrderInfoEntity.java new file mode 100644 index 000000000..0bc828fe3 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/OrderInfoEntity.java @@ -0,0 +1,94 @@ +package com.logpm.factorydata.jinpai.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 订单明细信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("jp_order_info") +@ApiModel(value = "订单明细信息", description = "订单明细信息") +@EqualsAndHashCode(callSuper = true) +public class OrderInfoEntity extends BaseEntity { + + @ApiModelProperty(name = "日志id") + private String logId; + @ApiModelProperty(name = "发货单id") + private String deliveryNoteId; + @ApiModelProperty(name = "订单号") + private String orderId; + @ApiModelProperty(name = "DD单号") + private String omsExtOrderNo; + @ApiModelProperty(name = "YS订单号") + private String omsExtYsId; + @ApiModelProperty(name = "手工合同单号") + private String manualContractNo; + @ApiModelProperty(name = "货品名称") + private String goodsName; + @ApiModelProperty(name = "货品包装") + private String goodsPack; + @ApiModelProperty(name = "货品类型") + private String goodsType; + @ApiModelProperty(name = "货品数量") + private String goodsNumber; + @ApiModelProperty(name = "货品毛重") + private String goodsGrossWeight; + @ApiModelProperty(name = "货品净重") + private String goodsNetWeight; + @ApiModelProperty(name = "货品体积") + private String goodsVolume; + @ApiModelProperty(name = "客户批次") + private String customerNum; + @ApiModelProperty(name = "申明价值") + private String goodsAmount; + @ApiModelProperty(name = "长") + private String goodsLength; + @ApiModelProperty(name = "宽") + private String goodsWidth; + @ApiModelProperty(name = "高") + private String goodsHeigth; + @ApiModelProperty(name = "收货地址") + private String receiverAddrDetail; + @ApiModelProperty(name = "安装地址") + private String yjInstallAddr; + @ApiModelProperty(name = "安装联系人") + private String yjInstallLinker; + @ApiModelProperty(name = "安装联系电话") + private String yjInstallPhone; + @ApiModelProperty(name = "承运类型(sfwl- 三方物流;sczp- 省仓直配)") + private String distributionMode; + @ApiModelProperty(name = "门店编号") + private String shopCode; + @ApiModelProperty(name = "门店名称") + private String shopName; + @ApiModelProperty(name = "加急类型加急类型A、B、C") + private String yjUrgentType; + @ApiModelProperty(name = "加急日期") + private String yjUrgentDate; + @ApiModelProperty(name = "订单类型:零售正单、普通零售单、样块单、增补单、返修单、缺件单、售后单") + private String yjOrderType; + @ApiModelProperty(name = "返修时效返修时效48小时、24小时") + private String yjRepairTimeliness; + @ApiModelProperty(name = "易居订单号") + private String yjOrderNo; + + @ApiModelProperty(name = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(name = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(name = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(name = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(name = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/PackageInfoEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/PackageInfoEntity.java new file mode 100644 index 000000000..f0d7ea3d6 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/PackageInfoEntity.java @@ -0,0 +1,64 @@ +package com.logpm.factorydata.jinpai.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 装箱包信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("jp_package_info") +@ApiModel(value = "包件信息", description = "包件信息") +@EqualsAndHashCode(callSuper = true) +public class PackageInfoEntity extends BaseEntity { + + @ApiModelProperty(name = "推送状态 0 未推 1 已推") + private Integer sendStatus; + @ApiModelProperty(name = "日志id") + private String logId; + @ApiModelProperty(name = "订单明细id") + private String orderInfoId; + @ApiModelProperty(name = "DD单号") + private String omsExtOrderNo; + @ApiModelProperty(name = "订单号") + private String orderId; + @ApiModelProperty(name = "箱码") + private String extBoxCode; + @ApiModelProperty(name = "件数") + private String goodsNum; + @ApiModelProperty(name = "重量") + private String goodsWeight; + @ApiModelProperty(name = "体积") + private String goodsVolume; + @ApiModelProperty(name = "品名") + private String goodsType; + @ApiModelProperty(name = "箱码名称") + private String goodsName; + @ApiModelProperty(name = "箱码类型") + private String extBoxType; + @ApiModelProperty(name = "一级类别") + private String boxType1; + @ApiModelProperty(name = "二级类别") + private String boxType2; + @ApiModelProperty(name = "三级类别") + private String boxType3; + + @ApiModelProperty(name = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(name = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(name = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(name = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(name = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/PushOrderDetailEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/PushOrderDetailEntity.java new file mode 100644 index 000000000..e8835a3d2 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/PushOrderDetailEntity.java @@ -0,0 +1,109 @@ +package com.logpm.factorydata.jinpai.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 金牌订单明细 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("jp_push_order_detail") +@ApiModel(value = "金牌订单明细", description = "金牌订单明细") +@EqualsAndHashCode(callSuper = true) +public class PushOrderDetailEntity extends BaseEntity { + + @ApiModelProperty(name = "订单id") + private String orderId; + @ApiModelProperty(name = "日志id") + private String logId; + + @ApiModelProperty(name = "明细编号") + private String itemId; + @ApiModelProperty(name = "发运类型(gx:干线, zy:直运, db:短驳)") + private String transportType; + @ApiModelProperty(name = "发站") + private String sendSite; + @ApiModelProperty(name = "到站") + private String endSite; + @ApiModelProperty(name = "收货联系人名称") + private String recvLinker; + @ApiModelProperty(name = "收货联系人手机") + private String recvMobile; + @ApiModelProperty(name = "收货联系人电话") + private String recvPhone; + @ApiModelProperty(name = "收货地址") + private String recvAddr; + @ApiModelProperty(name = "代收款") + private String codAmount; + @ApiModelProperty(name = "物品名称") + private String goodsName; + @ApiModelProperty(name = "物品数量(件)") + private String goodsNumber; + @ApiModelProperty(name = "物品重量(吨)") + private String goodsWeight; + @ApiModelProperty(name = "物品毛重(吨)") + private String goodsGrossWeight; + @ApiModelProperty(name = "物品净重(吨)") + private String goodsNetWeight; + @ApiModelProperty(name = "物品体积(方)") + private String goodsVolume; + @ApiModelProperty(name = "货品类型") + private String goodsType; + @ApiModelProperty(name = "货品包装说明") + private String goodsPack; + @ApiModelProperty(name = "长") + private String carLength; + @ApiModelProperty(name = "宽") + private String carWidth; + @ApiModelProperty(name = "高") + private String carHeight; + @ApiModelProperty(name = "订单类型(1-零售正单、2-普通零售单、3-样块单、4-增补单、5-返修单、6-缺件单、7-售后单、8-精板或其他)") + private String orderType; + @ApiModelProperty(name = "承运类型编码(编码含义:sfwl- 三方物流;sczp- 干仓配)") + private String shipType; + @ApiModelProperty(name = "送货模式编码(编码含义:gc-wf-基地-外发;sc-zt-干仓配-自提;sc-ps-干仓配-2C;sc-wf-干仓配-2B)") + private String transType; + @ApiModelProperty(name = "门店名称") + private String shopName; + @ApiModelProperty(name = "门店编码") + private String shopCode; + @ApiModelProperty(name = "门店电话") + private String shopPhone; + @ApiModelProperty(name = "门店地址") + private String shopAddr; + @ApiModelProperty(name = "预约送货时间") + private String appointmentTime; + @ApiModelProperty(name = "安装地址") + private String installAddr; + @ApiModelProperty(name = "安装联系人") + private String installLinker; + @ApiModelProperty(name = "安装联系电话") + private String installPhone; + @ApiModelProperty(name = "客户单号(YS单号)") + private String customOrderNo; + @ApiModelProperty(name = "客户明细单号(DD单号)") + private String customItemNo; + @ApiModelProperty(name = "箱码列表") + private String boxCodeList; + @ApiModelProperty(name = "包件品类") + private String boxDetailList; + + @ApiModelProperty(name = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(name = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(name = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(name = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(name = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/PushOrderEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/PushOrderEntity.java new file mode 100644 index 000000000..5f23a8cbd --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/PushOrderEntity.java @@ -0,0 +1,62 @@ +package com.logpm.factorydata.jinpai.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 金牌推送的下单数据 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("jp_push_order") +@ApiModel(value = "金牌订单", description = "金牌订单") +@EqualsAndHashCode(callSuper = true) +public class PushOrderEntity extends BaseEntity { + + @ApiModelProperty(name = "日志id") + private String logId; + @ApiModelProperty(name = "装车单号") + private String transportNo; + @ApiModelProperty(name = "计划发车时间(yyyy-MM-dd HH:mm:ss)") + private String planBeginTime; + @ApiModelProperty(name = "计划到达时间(yyyy-MM-dd HH:mm:ss)") + private String planEndTime; + @ApiModelProperty(name = "货品总重量(吨)") + private String goodsTotalWeight; + @ApiModelProperty(name = "货品总数量(件)") + private String goodsTotalNumber; + @ApiModelProperty(name = "货品总体积(方)") + private String goodsTotalVolume; + @ApiModelProperty(name = "始发站") + private String sendSite; + @ApiModelProperty(name = "途经站") + private String passSite; + @ApiModelProperty(name = "终点站") + private String endSite; + @ApiModelProperty(name = "车型") + private String carType; + @ApiModelProperty(name = "车长") + private String carSize; + @ApiModelProperty(name = "制单人") + private String userName; + @ApiModelProperty(name = "基地") + private String orgName; + + @ApiModelProperty(name = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(name = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(name = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(name = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(name = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/BusSourceEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/BusSourceEnums.java new file mode 100644 index 000000000..507198abf --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/BusSourceEnums.java @@ -0,0 +1,24 @@ +package com.logpm.factorydata.jinpai.enums; + +import org.springblade.common.model.IDict; + +/** + * 金牌基地枚举 + * + * @author zhaoqiaobo + * @create 2024-04-28 + */ +public enum BusSourceEnums implements IDict { + + XIAMEN("1", "厦门基地"), + SIYANG("2", "泗阳基地"), + OB_XIAMEN("4", "橙鸟厦门仓"), + OB_FOSHAN("5", "橙鸟佛山仓"), + CHENGDU("6", "成都基地"), + ; + + BusSourceEnums(String code, String text) { + init(code, text); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/DimensionEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/DimensionEnums.java new file mode 100644 index 000000000..bec45a7c0 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/DimensionEnums.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.jinpai.enums; + +import org.springblade.common.model.IDict; + +/** + * 金牌数据维度枚举 + * + * @author zhaoqiaobo + * @create 2024-04-28 + */ +public enum DimensionEnums implements IDict { + + ORDER(1, "订单"), + ORDER_DETAIL(2, "订单明细"), + PACKAGE(3, "包件"), + ; + + DimensionEnums(Integer code, String text) { + init(code, text); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/FactoryNodeEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/FactoryNodeEnums.java new file mode 100644 index 000000000..f3a1c6d3b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/FactoryNodeEnums.java @@ -0,0 +1,52 @@ +package com.logpm.factorydata.jinpai.enums; + +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * 工厂节点枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum FactoryNodeEnums { + + /** + * 到达目的站 + */ + FINAL_NET_ARRIVE_CAR(1030100,"到达目的站", 1), + /** + * 包件入库 + */ + UNLOAD_INCOMING_WAREHOUSE(105010,"包件入库", 1) + ; + + private Integer code; + private String text; + private Integer mustPush; + + FactoryNodeEnums(Integer code, String text, Integer mustPush) { + this.code = code; + this.text = text; + this.mustPush = mustPush; + } + + /** + * 获取所有必推节点的编码 + * + * @return + */ + public static List getMustPushCode() { + List list = new ArrayList<>(); + for (FactoryNodeEnums value : FactoryNodeEnums.values()) { + if (value.getMustPush() == 1) { + list.add(value.getCode()); + } + } + return list; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/NodeMappingEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/NodeMappingEnums.java new file mode 100644 index 000000000..8a16e7ce3 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/NodeMappingEnums.java @@ -0,0 +1,63 @@ +package com.logpm.factorydata.jinpai.enums; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Getter; +import org.springblade.common.constant.WorkNodeEnums; + +/** + * 系统和工厂节点映射枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum NodeMappingEnums { + + /** + * 到达目的站 + */ + FINAL_NET_ARRIVE_CAR(FactoryNodeEnums.FINAL_NET_ARRIVE_CAR, WorkNodeEnums.FINAL_NET_ARRIVE_CAR, 1), + /** + * 包件入库 + */ + UNLOAD_INCOMING_WAREHOUSE(FactoryNodeEnums.UNLOAD_INCOMING_WAREHOUSE, WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE, 1), + ; + + /** + * 系统作业节点 + */ + private WorkNodeEnums workNodeEnums; + /** + * 工厂作业节点 + */ + private FactoryNodeEnums factoryNodeEnums; + /** + * 状态码 + * 存在我们系统同一个作业节点对应工厂多个节点的情况,通过状态码区分 + */ + private Integer status; + + NodeMappingEnums(FactoryNodeEnums factoryNodeEnums, WorkNodeEnums workNodeEnums, Integer status) { + this.workNodeEnums = workNodeEnums; + this.factoryNodeEnums = factoryNodeEnums; + this.status = status; + } + + public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums) { + return getFactoryByNodeAndStatus(workNodeEnums, 1); + } + + public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums, Integer status) { + NodeMappingEnums[] values = values(); + for (NodeMappingEnums value : values) { + WorkNodeEnums workNodeEnums1 = value.getWorkNodeEnums(); + Integer status1 = value.getStatus(); + FactoryNodeEnums factoryNodeEnums = value.getFactoryNodeEnums(); + if (ObjectUtil.equal(workNodeEnums1, workNodeEnums) && ObjectUtil.equal(status1, status)) { + return factoryNodeEnums; + } + } + return null; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/NodeNeedEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/NodeNeedEnums.java new file mode 100644 index 000000000..6d7777837 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/NodeNeedEnums.java @@ -0,0 +1,34 @@ +package com.logpm.factorydata.jinpai.enums; + +import lombok.Getter; + +import java.io.Serializable; + +/** + * 作业节点枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum NodeNeedEnums implements Serializable { + + /** + * 到达目的站 + */ + FINAL_NET_ARRIVE_CAR(1030100,"到达目的站"), + /** + * 包件入库 + */ + UNLOAD_INCOMING_WAREHOUSE(105010,"包件入库") + ; + + private Integer code; + private String value; + + NodeNeedEnums(Integer code, String value) { + this.code = code; + this.value = value; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/interceptor/FactoryAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/interceptor/FactoryAccountsInterceptor.java new file mode 100644 index 000000000..0fe683b2a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/interceptor/FactoryAccountsInterceptor.java @@ -0,0 +1,87 @@ +package com.logpm.factorydata.jinpai.interceptor; + +import com.alibaba.fastjson.JSONObject; +import com.logpm.factorydata.jinpai.wrapper.RequestWrapper; +import com.logpm.factorydata.jinpai.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +@Log4j2 +@AllArgsConstructor +public class FactoryAccountsInterceptor implements HandlerInterceptor { + + private final IFactoryTokenService factoryTokenService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + try { + + RequestWrapper myRequestWrapper = new RequestWrapper(request); + String body = myRequestWrapper.getBody(); + JSONObject jsonObject = JSONObject.parseObject(body); + //获取头中参数 + String token = request.getHeader("Authorization"); + String corpId = request.getHeader("corpid"); + if(StringUtil.isBlank(corpId)){ + corpId = jsonObject.getString("corpid"); + } + if(!StringUtil.hasLength(token)){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,token有误"))); + return false; + } + if(!StringUtil.hasLength(corpId)){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,corpId有误"))); + return false; + } + + log.info("##########preHandle: token={}",token); + //验证token + boolean b = factoryTokenService.verifyToken(token,corpId); + if(!b){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,token不存在或已过期"))); + return false; + } + return true; + } catch (Exception e) { + returnJson(response,JSONObject.toJSONString(R.fail(500,"服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null){ + writer.close(); + } + } + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/interceptor/LocalServerLoginAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/interceptor/LocalServerLoginAccountsInterceptor.java new file mode 100644 index 000000000..229b2582c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/interceptor/LocalServerLoginAccountsInterceptor.java @@ -0,0 +1,101 @@ +package com.logpm.factorydata.jinpai.interceptor; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.common.exception.CustomerException; +import org.springblade.common.wrapper.CustomHttpServletRequestWrapper; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Log4j2 +@AllArgsConstructor +public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapter { + + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + + + try { + org.springblade.common.wrapper.CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(request); + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + + // 修改或添加header + + // 发送登录请求 + log.info("##########preHandle: request={}", request); + + wrappedRequest.addHeader("Blade-Auth", "bearer "+data.getString("access_token")); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + + // 用包装后的request替换原始request + request = wrappedRequest; + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + return true; + } catch (Exception e) { + returnJson(response, JSONObject.toJSONString(R.fail(500, "服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/job/AdvanceJob.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/job/AdvanceJob.java new file mode 100644 index 000000000..a3812bf5b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/job/AdvanceJob.java @@ -0,0 +1,300 @@ +package com.logpm.factorydata.jinpai.job; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +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.base.feign.IFactoryDataBaseClient; +import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.jinpai.entity.DeliveryNoteEntity; +import com.logpm.factorydata.jinpai.entity.OrderInfoEntity; +import com.logpm.factorydata.jinpai.entity.PackageInfoEntity; +import com.logpm.factorydata.jinpai.enums.BusSourceEnums; +import com.logpm.factorydata.jinpai.service.DeliveryNoteService; +import com.logpm.factorydata.jinpai.service.OrderInfoService; +import com.logpm.factorydata.jinpai.service.PackageInfoService; +import com.logpm.factorydata.jinpai.vo.ThirdPlWarehouseMappingVO; +import com.logpm.factorydata.vo.SendMsg; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.common.constant.HttpConstants; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.common.model.IDict; +import org.springblade.core.tool.api.R; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author zhaoqiaobo + * @create 2024-04-02 + */ +@AllArgsConstructor +@Component +@Slf4j +public class AdvanceJob { + + private final DeliveryNoteService deliveryNoteService; + private final OrderInfoService orderInfoService; + private final PackageInfoService packageInfoService; + + private final IFactoryDataBaseClient baseClient; + private final IFactoryDataClient factoryDataClient; + + /** + * 定时扫描数据库,保存所有齐套未推送的数据 + * + * @param param + * @return + * @throws Exception + */ + @XxlJob("createAdvance") + public ReturnT createAdvance(String param) throws Exception { + // 查询出齐套未生成暂存单的订单数据 + Map deliveryNoteEntityMap = new HashMap<>(); + Map orderInfoEntityMap = new HashMap<>(); + Map> packageInfoEntityMap = new HashMap<>(); + + Set deliveryNoteSet = new HashSet<>(); + Set orderInfoSet = new HashSet<>(); + // 按dd编号分组 + List list = packageInfoService.list(Wrappers.lambdaQuery().eq(PackageInfoEntity::getSendStatus, 0)); + if (CollUtil.isNotEmpty(list)) { + for (PackageInfoEntity entity : list) { + deliveryNoteSet.add(entity.getOrderId()); + orderInfoSet.add(entity.getOmsExtOrderNo()); + // 将数据封装到packageInfoEntityMap中 其中omsExtOrderNo为key + packageInfoEntityMap.computeIfAbsent(entity.getOmsExtOrderNo(), k -> new ArrayList<>()).add(entity); + } + // 根据订单数据查询出所有订单明细和包件信息 + List deliveryNoteEntities = deliveryNoteService.list(Wrappers.lambdaQuery().in(DeliveryNoteEntity::getOrderId, deliveryNoteSet)); + if (CollUtil.isNotEmpty(deliveryNoteEntities)) { + for (DeliveryNoteEntity entity : deliveryNoteEntities) { + deliveryNoteEntityMap.put(entity.getOrderId(), entity); + } + } + List orderInfoEntities = orderInfoService.list(Wrappers.lambdaQuery().in(OrderInfoEntity::getOmsExtOrderNo, orderInfoSet)); + if (CollUtil.isNotEmpty(orderInfoEntities)) { + for (OrderInfoEntity entity : orderInfoEntities) { + orderInfoEntityMap.put(entity.getOmsExtOrderNo(), entity); + } + } + // 组装数据,然后生成暂存单 + buildAdvance(packageInfoEntityMap, deliveryNoteEntityMap, orderInfoEntityMap); + // 修改包件的发送状态 TODO 后面修改为暂存单消费完成之后回调更新状态 + List updatePackageList = new ArrayList<>(); + for (PackageInfoEntity entity : list) { + PackageInfoEntity updateEntity = new PackageInfoEntity(); + updateEntity.setSendStatus(1); + updateEntity.setId(entity.getId()); + updatePackageList.add(updateEntity); + } + if (CollUtil.isNotEmpty(updatePackageList)) { + packageInfoService.updateBatchById(updatePackageList); + } + } + + return ReturnT.SUCCESS; + } + + @LogpmAsync("asyncExecutor") + public void buildAdvance(Map> packageMap, Map deliveryMap, + Map orderInfoMap) { + // 新起线程构建暂存单发送mq + // 获取非干线仓库映射表数据 + Map thirdPlWarehouseMapping = new HashMap<>(); + List warehouseMappingVOList = deliveryNoteService.getThirdPlWarehouseMappingVO(); + if (CollUtil.isNotEmpty(warehouseMappingVOList)) { + warehouseMappingVOList.forEach(vo -> { + thirdPlWarehouseMapping.put(vo.getArriveOrgName(), vo); + }); + } + Map warehouseBindVOMap = new HashMap<>(); + if (CollUtil.isNotEmpty(deliveryMap)) { + for (Map.Entry entry : deliveryMap.entrySet()) { + DeliveryNoteEntity deliveryNoteEntity = entry.getValue(); + if (ObjectUtil.isNotEmpty(deliveryNoteEntity)) { + // 获取工厂基地绑定的始发仓信息 + String textByCode = IDict.getTextByCode(BusSourceEnums.class, deliveryNoteEntity.getBusSource()); + R warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.JP.getValue(), textByCode); + if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) { + FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData(); + if (ObjectUtil.isNotNull(data)) { + warehouseBindVOMap.put(deliveryNoteEntity.getBusSource(), data); + } + } + } + } + } + // 组装暂存单数据 + List advances = new ArrayList<>(); + for (Map.Entry> stringListEntry : packageMap.entrySet()) { + String key = stringListEntry.getKey(); + OrderInfoEntity orderInfo = orderInfoMap.get(key); + if (ObjectUtil.isEmpty(orderInfo)) { + log.error("订单明细信息不存在,dd单号:{}", key); + continue; + } + DeliveryNoteEntity order = deliveryMap.get(orderInfo.getOrderId()); + if (ObjectUtil.isEmpty(order)) { + log.error("订单信息不存在,订单号:{}", orderInfo.getOrderId()); + continue; + } + List value = stringListEntry.getValue(); + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + // 承运商是汇通的数据 走干线,不是汇通的直接走仓配。 + String carrierName = order.getCarrierName(); + Long warehouseId = null; + String warehouseName = ""; + String tenantId = ""; + if (ObjectUtil.equal(carrierName, "广州市汇通运输有限公司")) { + if (ObjectUtil.isNotNull(warehouseBindVOMap.get(order.getBusSource()))) { + warehouseId = warehouseBindVOMap.get(order.getBusSource()).getWarehouseId(); + warehouseName = warehouseBindVOMap.get(order.getBusSource()).getWarehouseName(); + tenantId = warehouseBindVOMap.get(order.getBusSource()).getTenantId(); + } + } else { + if (ObjectUtil.isNotNull(thirdPlWarehouseMapping.get(order.getArriveOrgName()))) { + if (ObjectUtil.isNotEmpty(thirdPlWarehouseMapping.get(order.getArriveOrgName()).getWarehouseId())) { + warehouseId = Convert.toLong(thirdPlWarehouseMapping.get(order.getArriveOrgName()).getWarehouseId()); + } + warehouseName = thirdPlWarehouseMapping.get(order.getArriveOrgName()).getWarehouseName(); + tenantId = thirdPlWarehouseMapping.get(order.getArriveOrgName()).getTenantId(); + } + } + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + advanceEntity.setHasPackage(CollUtil.isNotEmpty(value) ? 1 : 0); + advanceEntity.setOrderType(orderInfo.getYjOrderType()); + advanceEntity.setBrand(BrandEnums.JP.getValue()); + advanceEntity.setSiteName(IDict.getTextByCode(BusSourceEnums.class, order.getBusSource())); + advanceEntity.setArea(""); + advanceEntity.setTotalNum(CollUtil.isNotEmpty(value) ? value.size() : 0); + advanceEntity.setPackName(""); + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(warehouseId); + advanceEntity.setWarehouseName(warehouseName); + + if (StrUtil.equals("sczp", order.getDistributionMode())) { + advanceEntity.setIsGcp(1); + } else { + advanceEntity.setIsGcp(0); + } + advanceEntity.setCarrierName(carrierName); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setSenderName(order.getConsignerName()); + advanceEntity.setSenderPhone(order.getConsignerMobile()); + advanceEntity.setSenderAddress(order.getConsignerAddr()); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setTrainNumber(""); + advanceEntity.setFreezeStatus("0"); + + advanceEntity.setSenderFactory(IDict.getTextByCode(BusSourceEnums.class, order.getBusSource())); + + advanceEntity.setOrderCode(orderInfo.getOmsExtOrderNo()); + advanceEntity.setDealerCode(orderInfo.getShopCode()); + advanceEntity.setDealerName(orderInfo.getShopName()); + advanceEntity.setStoreCode(orderInfo.getShopCode()); + advanceEntity.setStoreName(orderInfo.getShopName()); + advanceEntity.setServiceNum(orderInfo.getOmsExtYsId()); + // 安装 + advanceEntity.setCustomerName(orderInfo.getYjInstallLinker()); + advanceEntity.setCustomerPhone(orderInfo.getYjInstallPhone()); + advanceEntity.setCustomerAddress(orderInfo.getYjInstallAddr()); + advanceEntity.setConsigneePerson(order.getReceiverContacts()); + advanceEntity.setConsigneeMobile(order.getReceiverMobile()); + advanceEntity.setConsigneeAddress(order.getReceiverMobile()); + List packageList = new ArrayList<>(); + + for (PackageInfoEntity orderPackageDTO : value) { + // 封装包件 + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(warehouseId); + advanceDetailEntity.setWarehouseName(warehouseName); + // 根据的一流单标识赋值 + advanceEntity.setLegacyStatus("0"); + advanceDetailEntity.setOrderCode(orderPackageDTO.getOmsExtOrderNo()); + advanceDetailEntity.setBrand(BrandEnums.JP.getValue()); + advanceDetailEntity.setSystemType("线上"); + String boxType1 = orderPackageDTO.getBoxType1(); + String boxType2 = orderPackageDTO.getBoxType2(); + String boxType3 = orderPackageDTO.getBoxType3(); + if (StrUtil.isNotEmpty(boxType1)) { + advanceDetailEntity.setFirstPackName(orderPackageDTO.getBoxType1()); + } + if (StrUtil.isNotEmpty(boxType2)) { + advanceDetailEntity.setSecondPackName(orderPackageDTO.getBoxType2()); + } else { + advanceDetailEntity.setSecondPackName(orderPackageDTO.getBoxType1()); + } + if (StrUtil.isNotEmpty(boxType3)) { + advanceDetailEntity.setThirdPackName(orderPackageDTO.getBoxType3()); + } else { + if (StrUtil.isNotEmpty(boxType2)) { + advanceDetailEntity.setThirdPackName(orderPackageDTO.getBoxType2()); + } else { + advanceDetailEntity.setThirdPackName(orderPackageDTO.getBoxType1()); + } + } + advanceDetailEntity.setSiteName(IDict.getTextByCode(BusSourceEnums.class, order.getBusSource())); + advanceDetailEntity.setSiteCode(""); + String planQty = orderPackageDTO.getGoodsNum(); + advanceDetailEntity.setQuantity((StrUtil.isNotBlank(planQty) && NumberUtil.isNumber(planQty)) ? Convert.toInt(planQty) : 0); + advanceDetailEntity.setOrderPackageCode(orderPackageDTO.getExtBoxCode()); + advanceDetailEntity.setTrainNumber(""); + advanceDetailEntity.setServiceNum(orderInfo.getOmsExtYsId()); + advanceDetailEntity.setWaybillNo(""); + advanceDetailEntity.setPackageStatus("0"); + advanceDetailEntity.setWeight(StrUtil.isNotBlank(orderPackageDTO.getGoodsWeight()) ? new BigDecimal(orderPackageDTO.getGoodsWeight()) : BigDecimal.ZERO); + advanceDetailEntity.setVolume(StrUtil.isNotBlank(orderPackageDTO.getGoodsVolume()) ? new BigDecimal(orderPackageDTO.getGoodsVolume()) : BigDecimal.ZERO); +// advanceDetailEntity.setChargeType(0); + advanceDetailEntity.setSupple(""); + advanceDetailEntity.setManifest(""); + advanceDetailEntity.setReturnNum(""); + advanceDetailEntity.setSendDateStr(StrUtil.isNotBlank(order.getDepartTime()) ? order.getDepartTime() : DateUtil.formatLocalDateTime(LocalDateTime.now())); + advanceDetailEntity.setCarNumber(order.getCarNo()); + advanceDetailEntity.setGoodsMan(""); + advanceDetailEntity.setTenantId(tenantId); + advanceDetailEntity.setStatus(0); + advanceDetailEntity.setIsDeleted(0); + JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + packageList.add(entries); + } + // 转成json对象,然后将包件明细放到detail中 + JSONObject entries = JSONUtil.parseObj(advanceEntity); + entries.set("details", JSONUtil.toJsonStr(packageList)); + advances.add(entries); + } + // 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg. + if (CollUtil.isNotEmpty(advances)) { + for (JSONObject advance : advances) { + SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); + factoryDataClient.sendMessage(sendMsg); + } + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/launcher/FactoryDataBaseLauncherServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/launcher/FactoryDataBaseLauncherServiceImpl.java new file mode 100644 index 000000000..8c96a7c3f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/launcher/FactoryDataBaseLauncherServiceImpl.java @@ -0,0 +1,60 @@ +/* + * 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.jinpai.launcher; + +import org.springblade.core.auto.service.AutoService; +import org.springblade.core.launch.constant.NacosConstant; +import org.springblade.core.launch.service.LauncherService; +import org.springblade.core.launch.utils.PropsUtil; +import org.springframework.boot.builder.SpringApplicationBuilder; + +import java.util.Properties; + +/** + * 启动参数拓展 + * + * @author Chill + */ +@AutoService(LauncherService.class) +public class FactoryDataBaseLauncherServiceImpl implements LauncherService { + + @Override + public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) { + Properties props = System.getProperties(); + // 开启多数据源 + PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true"); + // 指定注册配置信息 + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].data-id", NacosConstant.dataId(appName, profile)); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].group", NacosConstant.NACOS_CONFIG_GROUP); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].refresh", NacosConstant.NACOS_CONFIG_REFRESH); + // 指定注册IP + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.ip", "127.0.0.1"); + // 指定注册端口 + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.port", "8200"); + // 自定义命名空间 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.NACOS_NAMESPACE); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.NACOS_NAMESPACE); + // 自定义分组 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.group", NacosConstant.NACOS_CONFIG_GROUP); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.group", NacosConstant.NACOS_CONFIG_GROUP); + } + + @Override + public int getOrder() { + return 20; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/DeliveryNoteMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/DeliveryNoteMapper.java new file mode 100644 index 000000000..a267f4ca1 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/DeliveryNoteMapper.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.jinpai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.jinpai.entity.DeliveryNoteEntity; +import com.logpm.factorydata.jinpai.vo.ThirdPlWarehouseMappingVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 发货单 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface DeliveryNoteMapper extends BaseMapper { + + List getThirdPlWarehouseMappingVO(); + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryNodeOrderMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryNodeOrderMapper.xml new file mode 100644 index 000000000..597931489 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryNodeOrderMapper.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryNodePushMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryNodePushMapper.java new file mode 100644 index 000000000..24ff02826 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryNodePushMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.jinpai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.jinpai.entity.FactoryNodePushEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 装箱包信息 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface FactoryNodePushMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryNodePushMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryNodePushMapper.xml new file mode 100644 index 000000000..0445d137e --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryNodePushMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryOrderLogMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryOrderLogMapper.java new file mode 100644 index 000000000..79067a408 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryOrderLogMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.jinpai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.jinpai.entity.FactoryOrderLogEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 工厂订单日志 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface FactoryOrderLogMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryOrderLogMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryOrderLogMapper.xml new file mode 100644 index 000000000..0f2e37356 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryOrderLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryTokenMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryTokenMapper.java new file mode 100644 index 000000000..273494666 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryTokenMapper.java @@ -0,0 +1,31 @@ +/* + * 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.jinpai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.jinpai.entity.FactoryToken; + +/** + * 工厂账号接口日志 Mapper 接口 + * + * @author zhy + * @since 2023-03-28 + */ +public interface FactoryTokenMapper extends BaseMapper { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryTokenMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryTokenMapper.xml new file mode 100644 index 000000000..965bd16f7 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/FactoryTokenMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/OrderInfoMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/OrderInfoMapper.java new file mode 100644 index 000000000..b5f8f9a4f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/OrderInfoMapper.java @@ -0,0 +1,17 @@ +package com.logpm.factorydata.jinpai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.jinpai.entity.OrderInfoEntity; +import com.logpm.factorydata.jinpai.entity.PushOrderEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订单信息 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface OrderInfoMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/OrderInfoMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/OrderInfoMapper.xml new file mode 100644 index 000000000..c029d5001 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/OrderInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PackageInfoMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PackageInfoMapper.java new file mode 100644 index 000000000..e5ec5fb3e --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PackageInfoMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.jinpai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.jinpai.entity.PackageInfoEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 装箱包信息 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface PackageInfoMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PackageInfoMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PackageInfoMapper.xml new file mode 100644 index 000000000..4d232bc64 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PackageInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderDetailMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderDetailMapper.java new file mode 100644 index 000000000..a21d2d20b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderDetailMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.jinpai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.jinpai.entity.PushOrderDetailEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订单信息 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface PushOrderDetailMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderDetailMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderDetailMapper.xml new file mode 100644 index 000000000..8b6943909 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderDetailMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderMapper.java new file mode 100644 index 000000000..424159375 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.jinpai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.jinpai.entity.PushOrderEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订单信息 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface PushOrderMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderMapper.xml new file mode 100644 index 000000000..28906b91b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mapper/PushOrderMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/FactoryOrderListener.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/FactoryOrderListener.java new file mode 100644 index 000000000..068267977 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/FactoryOrderListener.java @@ -0,0 +1,441 @@ +package com.logpm.factorydata.jinpai.mq; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.factorydata.base.feign.IFactoryDataBaseClient; +import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.enums.SaxStatusEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.jinpai.entity.DeliveryNoteEntity; +import com.logpm.factorydata.jinpai.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.jinpai.entity.OrderInfoEntity; +import com.logpm.factorydata.jinpai.entity.PackageInfoEntity; +import com.logpm.factorydata.jinpai.entity.PushOrderDetailEntity; +import com.logpm.factorydata.jinpai.entity.PushOrderEntity; +import com.logpm.factorydata.jinpai.enums.DimensionEnums; +import com.logpm.factorydata.jinpai.service.DeliveryNoteService; +import com.logpm.factorydata.jinpai.service.FactoryOrderLogService; +import com.logpm.factorydata.jinpai.service.OrderInfoService; +import com.logpm.factorydata.jinpai.service.PackageInfoService; +import com.logpm.factorydata.jinpai.service.PushOrderDetailService; +import com.logpm.factorydata.jinpai.service.PushOrderService; +import com.logpm.factorydata.jinpai.vo.DeliveryNoteVO; +import com.logpm.factorydata.jinpai.vo.OrderInfoVO; +import com.logpm.factorydata.jinpai.vo.PackageCategoryVO; +import com.logpm.factorydata.jinpai.vo.PackageInfoVO; +import com.logpm.factorydata.jinpai.vo.PushOrderDetailVO; +import com.logpm.factorydata.jinpai.vo.PushOrderVO; +import com.logpm.factorydata.vo.SendMsg; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.common.constant.HttpConstants; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.tool.api.R; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 监听索菲亚订单数据 + * + * @author zhaoqiaobo + * @create 2024-03-18 + */ +@Slf4j +@Component +@AllArgsConstructor +public class FactoryOrderListener { + + private final PushOrderService pushOrderService; + private final PushOrderDetailService pushOrderDetailService; + private final DeliveryNoteService deliveryNoteService; + private final OrderInfoService orderInfoService; + private final PackageInfoService packageInfoService; + private final FactoryOrderLogService logService; + + private final BladeRedis bladeRedis; + private final IFactoryDataBaseClient baseClient; + private final IFactoryDataClient factoryDataClient; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.JP_FACTORY_ORDER), + exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER, type = ExchangeTypes.TOPIC), + key = FactoryDataConstants.Mq.RoutingKeys.JP_FACTORY_ORDER + )) + @Transactional(rollbackFor = Exception.class) + public void factoryOrder(String msg) { + log.info("处理金牌订单:{}", msg); + if (StrUtil.isEmpty(msg)) { + log.error("消息内容为空"); + return; + } + FactoryOrderLogEntity logEntity = JSONUtil.toBean(msg, FactoryOrderLogEntity.class); + if (ObjectUtil.isEmpty(logEntity)) { + log.error("消息内容为空"); + return; + } + // 去 minio 下载文件到本地,然后解析文件内容为实体对象 + List deliveryNoteVOS = null; + List orderInfoVOS = null; + List packageInfoVOS = null; + PushOrderVO pushOrderVO = null; + Long logId = logEntity.getId(); + String logUrl = logEntity.getLogUrl(); + // 1 订单 2 订单明细 3 包件 + Integer dimension = logEntity.getDimension(); + if (StrUtil.isNotEmpty(logUrl)) { + List res = new ArrayList<>(); + FileUtil.readLines(URLUtil.url(logUrl), CharsetUtil.CHARSET_UTF_8, res); + if (CollUtil.isNotEmpty(res)) { + String content = res.get(0); + if (StrUtil.isNotEmpty(content)) { + // 拉取的数据 + if (ObjectUtil.equal(logEntity.getType(), 1)) { + if (ObjectUtil.equal(dimension, DimensionEnums.ORDER.getCode())) { + deliveryNoteVOS = new JSONArray(content).toList(DeliveryNoteVO.class); + } + if (ObjectUtil.equal(dimension, DimensionEnums.ORDER_DETAIL.getCode())) { + orderInfoVOS = new JSONArray(content).toList(OrderInfoVO.class); + } + if (ObjectUtil.equal(dimension, DimensionEnums.PACKAGE.getCode())) { + packageInfoVOS = new JSONArray(content).toList(PackageInfoVO.class); + } + } else if (ObjectUtil.equal(logEntity.getType(), 2)) { + // 推送的数据 + pushOrderVO = JSONUtil.toBean(content, PushOrderVO.class); + } + } + } + } + if (ObjectUtil.equal(logEntity.getType(), 1)) { + pullData(deliveryNoteVOS, orderInfoVOS, packageInfoVOS, logEntity); + } else if (ObjectUtil.equal(logEntity.getType(), 2)) { + pushData(pushOrderVO, logEntity); + } + + } + + private void pushData(PushOrderVO vo, FactoryOrderLogEntity logEntity) { + if (ObjectUtil.isNotEmpty(vo)) { + // 1 解析数据保存入库 + // 装车单号唯一 + Long logId = logEntity.getId(); + String truckNo = vo.getTransportNo(); + List list = pushOrderService.list(Wrappers.lambdaQuery().eq(PushOrderEntity::getTransportNo, truckNo)); + if (CollUtil.isNotEmpty(list)) { + log.error("装车单号{} 数据已经处理过了, logId: {}", truckNo, logId); + return; + } + vo.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); + pushOrderService.save(vo); + List orderInfos = vo.getItems(); + if (CollUtil.isNotEmpty(orderInfos)) { + List infoEntities = new ArrayList<>(); + for (PushOrderDetailVO orderInfo : orderInfos) { + PushOrderDetailEntity orderInfoEntity = new PushOrderDetailEntity(); + BeanUtil.copyProperties(orderInfo, orderInfoEntity); + orderInfoEntity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); + orderInfoEntity.setOrderId(vo.getId().toString()); + List boxCodes = orderInfo.getBoxCodes(); + if (CollUtil.isNotEmpty(boxCodes)) { + orderInfoEntity.setBoxCodeList(JSONUtil.toJsonStr(boxCodes)); + } + List boxDetails = orderInfo.getBoxDetails(); + if (CollUtil.isNotEmpty(boxDetails)) { + orderInfoEntity.setBoxDetailList(JSONUtil.toJsonStr(boxDetails)); + } + infoEntities.add(orderInfoEntity); + } + pushOrderDetailService.saveBatch(infoEntities); + } + // 2 构建暂存单,发送 mq 消息 + FactoryOrderLogEntity logEntity1 = new FactoryOrderLogEntity(); + logEntity1.setSaxStatus(SaxStatusEnums.SUCCESS.getCode()); + logEntity1.setId(logId); + logService.saveOrUpdate(logEntity1); + // 处理暂存单 + buildAdvance(vo); + } + } + + @LogpmAsync("asyncExecutor") + public void buildAdvance(PushOrderVO vo) { + // 新起线程构建暂存单发送mq + Long startWarehouseId = null; + String startWarehouseName = null; + String tenantId = null; + // 获取工厂基地绑定的始发仓信息 + List details = vo.getItems(); + if (CollUtil.isEmpty(details)) { + return; + } + R warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.JP.getValue(), vo.getOrgName()); + if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) { + FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData(); + if (ObjectUtil.isNotNull(data)) { + startWarehouseId = data.getWarehouseId(); + startWarehouseName = data.getWarehouseName(); + tenantId = data.getTenantId(); + } + } + Map> advanceMap = new HashMap<>(); + // 一个dd单号 一个暂存单 + // 组装暂存单数据 + List advances = new ArrayList<>(); + for (PushOrderDetailVO orderInfoVO : details) { + List packageList = new ArrayList<>(); + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + List boxCodes = orderInfoVO.getBoxCodes(); + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + advanceEntity.setHasPackage(CollUtil.isNotEmpty(boxCodes) ? 1 : 0); + advanceEntity.setOrderType(""); + advanceEntity.setBrand(BrandEnums.JP.getValue()); + advanceEntity.setSiteName(vo.getOrgName()); + advanceEntity.setArea(""); + advanceEntity.setTotalNum(StrUtil.isNotEmpty(orderInfoVO.getGoodsNumber()) ? Convert.toInt(orderInfoVO.getGoodsNumber()) : 0); + advanceEntity.setPackName(""); + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(startWarehouseId); + advanceEntity.setWarehouseName(startWarehouseName); + + advanceEntity.setIsGcp(0); + advanceEntity.setCarrierName(""); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setSenderName(""); + advanceEntity.setSenderPhone(""); + advanceEntity.setSenderAddress(""); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setTrainNumber(vo.getTransportNo()); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setOrderCode(orderInfoVO.getCustomItemNo()); + advanceEntity.setServiceNum(orderInfoVO.getCustomOrderNo()); + advanceEntity.setSenderFactory(vo.getOrgName()); + // 门店是商场 + advanceEntity.setDealerCode(orderInfoVO.getShopCode()); + advanceEntity.setDealerName(orderInfoVO.getShopName()); + advanceEntity.setStoreCode(orderInfoVO.getShopCode()); + advanceEntity.setStoreName(orderInfoVO.getShopName()); + // 安装是客户 + advanceEntity.setCustomerName(orderInfoVO.getInstallLinker()); + advanceEntity.setCustomerPhone(orderInfoVO.getInstallPhone()); + advanceEntity.setCustomerAddress(orderInfoVO.getInstallAddr()); + // 收货人就是商场收货人 + advanceEntity.setConsigneePerson(orderInfoVO.getRecvLinker()); + advanceEntity.setConsigneeMobile(orderInfoVO.getRecvPhone()); + advanceEntity.setConsigneeAddress(orderInfoVO.getRecvAddr()); + // 根据遗留单标识赋值 + advanceEntity.setLegacyStatus("0"); + if (StrUtil.contains(orderInfoVO.getCustomItemNo(), "遗")) { + advanceEntity.setLegacyStatus("1"); + } + // 封装包件品类信息 + Map categoryVOMap = new HashMap<>(); + List boxDetails = orderInfoVO.getBoxDetails(); + if (CollUtil.isNotEmpty(boxDetails)) { + for (PackageCategoryVO packageCategoryVO : boxDetails) { + categoryVOMap.put(packageCategoryVO.getExtBoxCode(), packageCategoryVO); + } + } + for (String packageCode : boxCodes) { + // 封装包件 + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(startWarehouseId); + advanceDetailEntity.setWarehouseName(startWarehouseName); + + advanceDetailEntity.setOrderCode(orderInfoVO.getCustomItemNo()); + advanceDetailEntity.setBrand(BrandEnums.JP.getValue()); + advanceDetailEntity.setSystemType("线上"); + // 获取映射品类信息 + PackageCategoryVO categoryVO = categoryVOMap.get(packageCode); + if (ObjectUtil.isNotEmpty(categoryVO)) { + // 一级品类名称 + if (StrUtil.isNotEmpty(categoryVO.getTypea())) { + advanceDetailEntity.setFirstPackName(categoryVO.getTypea()); + advanceDetailEntity.setMaterialName(categoryVO.getTypea()); + } + // 二级品类名称 + if (StrUtil.isNotEmpty(categoryVO.getTypeb())) { + advanceDetailEntity.setSecondPackName(categoryVO.getTypeb()); + } else { + advanceDetailEntity.setSecondPackName(categoryVO.getTypea()); + } + // 三级品类名称 + if (StrUtil.isNotEmpty(categoryVO.getTypec())) { + advanceDetailEntity.setThirdPackName(categoryVO.getTypec()); + } else { + if (StrUtil.isNotEmpty(categoryVO.getTypeb())) { + advanceDetailEntity.setThirdPackName(categoryVO.getTypeb()); + } else { + advanceDetailEntity.setThirdPackName(categoryVO.getTypea()); + } + } + } + advanceDetailEntity.setSiteName(vo.getOrgName()); + advanceDetailEntity.setSiteCode(""); + advanceDetailEntity.setQuantity(1); + advanceDetailEntity.setOrderPackageCode(packageCode); + advanceDetailEntity.setTrainNumber(vo.getTransportNo()); + advanceDetailEntity.setServiceNum(orderInfoVO.getCustomOrderNo()); + advanceDetailEntity.setWaybillNo(""); + advanceDetailEntity.setPackageStatus("0"); +// advanceDetailEntity.setWeight(StrUtil.isNotBlank(orderPackageDTO.getWeight()) ? new BigDecimal(orderPackageDTO.getWeight()) : BigDecimal.ZERO); +// advanceDetailEntity.setVolume(StrUtil.isNotBlank(orderPackageDTO.getVolume()) ? new BigDecimal(orderPackageDTO.getVolume()) : BigDecimal.ZERO); +// advanceDetailEntity.setChargeType(0); + advanceDetailEntity.setSupple(""); + advanceDetailEntity.setManifest(""); + advanceDetailEntity.setReturnNum(""); + advanceDetailEntity.setSendDateStr(DateUtil.formatLocalDateTime(LocalDateTime.now())); + advanceDetailEntity.setCarNumber(""); + advanceDetailEntity.setGoodsMan(""); + advanceDetailEntity.setTenantId(tenantId); + advanceDetailEntity.setStatus(0); + advanceDetailEntity.setIsDeleted(0); + JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + packageList.add(entries); + } + // 转成json对象,然后将包件明细放到detail中 + JSONObject entries = JSONUtil.parseObj(advanceEntity); + entries.set("details", JSONUtil.toJsonStr(packageList)); + advances.add(entries); + } + // 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg. + if (CollUtil.isNotEmpty(advances)) { + for (JSONObject advance : advances) { + SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); + factoryDataClient.sendMessage(sendMsg); + } + } + } + + private void pullData(List deliveryNoteVOS, List orderInfoVOS, List packageInfoVOS, FactoryOrderLogEntity logEntity) { + if (CollUtil.isNotEmpty(deliveryNoteVOS)) { + List entities = new ArrayList<>(); + List orderCodes = new ArrayList<>(); + for (DeliveryNoteVO deliveryNoteVO : deliveryNoteVOS) { + orderCodes.add(deliveryNoteVO.getOrderId()); + } + List list = deliveryNoteService.list(Wrappers.lambdaQuery() + .in(DeliveryNoteEntity::getOrderId, orderCodes)); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + // 将list中的数据封装到map中 + list.forEach(item -> { + map.put(item.getOrderId(), item.getOrderId()); + }); + } + for (DeliveryNoteVO deliveryNoteVO : deliveryNoteVOS) { + if (map.containsKey(deliveryNoteVO.getOrderId())) { + log.error("订单号:{},已推送过了", deliveryNoteVO.getOrderId()); + continue; + } + DeliveryNoteEntity deliveryNoteEntity = new DeliveryNoteEntity(); + BeanUtil.copyProperties(deliveryNoteVO, deliveryNoteEntity); + deliveryNoteEntity.setLogId(ObjectUtil.isNotEmpty(logEntity.getId()) ? logEntity.getId().toString() : null); + entities.add(deliveryNoteEntity); + } + if (CollUtil.isNotEmpty(entities)) { + deliveryNoteService.saveBatch(entities); + } + } + if (CollUtil.isNotEmpty(orderInfoVOS)) { + List entities = new ArrayList<>(); + List orderCodes = new ArrayList<>(); + for (OrderInfoVO orderInfoVO : orderInfoVOS) { + orderCodes.add(orderInfoVO.getOrderId()); + } + List list = orderInfoService.list(Wrappers.lambdaQuery() + .in(OrderInfoEntity::getOmsExtOrderNo, orderCodes)); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + // 将list中的数据封装到map中 + list.forEach(item -> { + map.put(item.getOmsExtOrderNo(), item.getOmsExtOrderNo()); + }); + } + for (OrderInfoVO vo : orderInfoVOS) { + if (map.containsKey(vo.getOmsExtOrderNo())) { + log.error("DD单号:{},已推送过了", vo.getOmsExtOrderNo()); + continue; + } + OrderInfoEntity deliveryNoteEntity = new OrderInfoEntity(); + BeanUtil.copyProperties(vo, deliveryNoteEntity); + deliveryNoteEntity.setLogId(ObjectUtil.isNotEmpty(logEntity.getId()) ? logEntity.getId().toString() : null); + entities.add(deliveryNoteEntity); + } + if (CollUtil.isNotEmpty(entities)) { + orderInfoService.saveBatch(entities); + } + } + if (CollUtil.isNotEmpty(packageInfoVOS)) { + List entities = new ArrayList<>(); + List orderCodes = new ArrayList<>(); + List packageCodes = new ArrayList<>(); + for (PackageInfoVO orderInfoVO : packageInfoVOS) { + orderCodes.add(orderInfoVO.getOmsExtOrderNo()); + packageCodes.add(orderInfoVO.getExtBoxCode()); + } + List list = packageInfoService.list(Wrappers.lambdaQuery() + .in(PackageInfoEntity::getOmsExtOrderNo, orderCodes) + .in(PackageInfoEntity::getExtBoxCode, packageCodes) + ); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + // 将list中的数据封装到map中 + list.forEach(item -> { + map.put(item.getOmsExtOrderNo() + item.getExtBoxCode(), item.getOmsExtOrderNo()); + }); + } + for (PackageInfoVO vo : packageInfoVOS) { + if (map.containsKey(vo.getOmsExtOrderNo() + vo.getExtBoxCode())) { + log.error("DD单号:{} + 箱码:{},已推送过了", vo.getOmsExtOrderNo(), vo.getExtBoxCode()); + continue; + } + PackageInfoEntity entity = new PackageInfoEntity(); + BeanUtil.copyProperties(vo, entity); + entity.setLogId(ObjectUtil.isNotEmpty(logEntity.getId()) ? logEntity.getId().toString() : null); + entities.add(entity); + } + if (CollUtil.isNotEmpty(entities)) { + packageInfoService.saveBatch(entities); + } + } + // 处理暂存单 通过定时任务扫描的方式判定是否齐套 然后创建暂存单 + FactoryOrderLogEntity logEntity1 = new FactoryOrderLogEntity(); + logEntity1.setSaxStatus(SaxStatusEnums.SUCCESS.getCode()); + logEntity1.setId(logEntity.getId()); + logService.saveOrUpdate(logEntity1); + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/NodeDataPushListener.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/NodeDataPushListener.java new file mode 100644 index 000000000..ca84679ae --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/NodeDataPushListener.java @@ -0,0 +1,261 @@ +package com.logpm.factorydata.jinpai.mq; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.jinpai.entity.FactoryNodePushEntity; +import com.logpm.factorydata.jinpai.entity.PushOrderDetailEntity; +import com.logpm.factorydata.jinpai.entity.PushOrderEntity; +import com.logpm.factorydata.jinpai.enums.FactoryNodeEnums; +import com.logpm.factorydata.jinpai.enums.NodeNeedEnums; +import com.logpm.factorydata.jinpai.pros.JinPaiProperties; +import com.logpm.factorydata.jinpai.service.FactoryNodePushService; +import com.logpm.factorydata.jinpai.service.PushOrderDetailService; +import com.logpm.factorydata.jinpai.service.PushOrderService; +import com.logpm.factorydata.vo.PushData; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.WorkNodeEnums; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 监听业务系统推送给工厂的节点数据 + * + * @author zhaoqiaobo + * @create 2024-03-18 0:02 + */ +@Slf4j +@Component +@AllArgsConstructor +public class NodeDataPushListener { + + private final IFactoryDataClient factoryDataClient; + private final PushOrderDetailService pushOrderDetailService; + private final PushOrderService pushOrderService; + private final FactoryNodePushService factoryNodePushService; + private final JinPaiProperties jinPaiProperties; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.JP_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.JP_NODE_DATA_PUSH + )) + public void nodeDataPushDelayed(String msg) { + // 直接调用nodeDataPush方法处理接收到的消息 + nodeDataPush(msg); + } + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.JP_NODE_DATA_PUSH, durable = "true"), + exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, type = ExchangeTypes.TOPIC), + key = FactoryDataConstants.Mq.RoutingKeys.JP_NODE_DATA_PUSH + )) + @Transactional(rollbackFor = Exception.class) + public void nodeDataPush(String msg) { + // {"brand":"ZBOM","node":"TRANSFER_WAREHOUSE_DEPART","operator":"","operatorTime":"","content":[{"packageCode":"1423090693445"}]} + log.info("接收到节点数据推送:{}", msg); + // 1 校验数据 + if (checkData(msg)) { + return; + } + JSONObject entries = JSONUtil.parseObj(msg); + // 节点 + String node = entries.getStr("node"); + String main = entries.getStr("main"); + WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node); + // 2 获取业务数据 + List content = entries.getBeanList("content", PushData.class); + // 数据按订单分组 + // 3 拿到所有必推节点的code + List mustPushCode = FactoryNodeEnums.getMustPushCode(); + if (CollUtil.isNotEmpty(content)) { + // 查询出本次操作的所有订单 + Set orderCodes = content.stream().map(PushData::getOrderCode).collect(Collectors.toSet()); + if (CollUtil.isEmpty(orderCodes)) { + log.info("订单数据为空,不处理:{}", JSONUtil.toJsonStr(content)); + return; + } + List orderDetailEntities = pushOrderDetailService.list(Wrappers.lambdaQuery() + .in(PushOrderDetailEntity::getCustomItemNo, orderCodes) + ); + if (CollUtil.isEmpty(orderDetailEntities)) { + log.info("未查到包件数据,不处理:{}", JSONUtil.toJsonStr(content)); + return; + } + Map orderCodeMap = orderDetailEntities.stream().collect(Collectors.toMap(PushOrderDetailEntity::getId, PushOrderDetailEntity::getCustomItemNo)); + Map detailEntityMap = orderDetailEntities.stream().collect(Collectors.toMap(PushOrderDetailEntity::getCustomItemNo, v -> v)); + List orderIds = orderDetailEntities.stream().map(PushOrderDetailEntity::getOrderId).collect(Collectors.toList()); + Map pushOrderEntityMap = new HashMap<>(); + if (CollUtil.isNotEmpty(orderIds)) { + List pushOrderEntities = pushOrderService.listByIds(orderIds); + if (CollUtil.isNotEmpty(pushOrderEntities)) { + pushOrderEntities.forEach(pushOrderEntity -> { + pushOrderEntityMap.put(orderCodeMap.get(pushOrderEntity.getId()), pushOrderEntity); + }); + } + } + List pushEntities = factoryNodePushService.list(Wrappers.lambdaQuery() + .in(FactoryNodePushEntity::getOrderCode, orderCodes) + ); + // 到站还是入库 + if (workNodeEnums.equals(WorkNodeEnums.FINAL_NET_ARRIVE_CAR)) { + Map pushEntityMap = new HashMap<>(); + if (CollUtil.isNotEmpty(pushEntities)) { + pushEntityMap = pushEntities.stream().filter(pushEntity -> { + return pushEntity.getNode().equals(FactoryNodeEnums.FINAL_NET_ARRIVE_CAR.getCode()); + }).collect(Collectors.toMap(FactoryNodePushEntity::getOrderCode, v -> v)); + } + JSONObject mainJson = JSONUtil.parseObj(main); + // 到站 一个订单只发送一次 + for (String orderCode : orderCodes) { + if (pushEntityMap.containsKey(orderCode)) { + continue; + } + PushOrderDetailEntity pushOrderDetailEntity = detailEntityMap.get(orderCode); + String boxCodeList = pushOrderDetailEntity.getBoxCodeList(); + JSONArray boxCodeListJson = JSONUtil.parseArray(boxCodeList); + JSONArray details = new JSONArray(); + boxCodeListJson.forEach(item -> { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(item.toString(), 1); + details.add(jsonObject); + }); + if (!CollUtil.contains(pushEntityMap.keySet(), orderCode)) { + JSONObject js = new JSONObject(); + js.set("extOrderNo", orderCode); + js.set("extWaybillNO", mainJson.getStr("serviceNumber")); + js.set("detail", details); + js.set("shipNo", mainJson.getStr("waybillNumber")); + js.set("targetNo", pushOrderEntityMap.get(orderCode).getTransportNo()); + js.set("targetType", "1"); + js.set("doType", "32"); + js.set("doLocation", ""); + js.set("doTime", DateUtil.now()); + js.set("sendSite", mainJson.getStr("sendWarehouseName")); + js.set("endSite", mainJson.getStr("warehouseName")); + js.set("passSite", mainJson.getStr("acceptWarehouseName")); + js.set("doRemark", ""); + js.set("reqSn", pushOrderEntityMap.get(orderCode).getId()); + js.set("syscode", "huitong"); + js.set("carNo", mainJson.getStr("carNumber")); + js.set("carHangNo", ""); + js.set("driverName", mainJson.getStr("driverName")); + js.set("driverPhone", mainJson.getStr("driverMobile")); + js.set("carType", "A"); + js.set("carSize", "1"); + // js.set("arriveFor", ""); + log.info("推送工厂:{}", js); + String url = jinPaiProperties.getOldSystemHost() + jinPaiProperties.getOldSystemArrivedUrl(); + try { + if (jinPaiProperties.getEnable()) { + String result = HttpUtil.post(url, JSONUtil.toJsonStr(js)); + log.info("推送工厂结果:{}", result); + // 保存推送记录 + factoryNodePushService.save(FactoryNodePushEntity.builder() + .orderCode(orderCode) + .node(FactoryNodeEnums.FINAL_NET_ARRIVE_CAR.getCode().toString()) + .content(JSONUtil.toJsonStr(js)) + .resultContent(result) + .build()); + } + } catch (Exception e) { + log.error("推送工厂失败:{}", e); + } + } + } + } else { + // 入库一个包件一次 + Map pushEntityMap = new HashMap<>(); + if (CollUtil.isNotEmpty(pushEntities)) { + pushEntityMap = pushEntities.stream().filter(pushEntity -> { + return pushEntity.getNode().equals(FactoryNodeEnums.UNLOAD_INCOMING_WAREHOUSE.getCode()); + }).collect(Collectors.toMap(FactoryNodePushEntity::getPackageCode, v -> v)); + } + for (PushData pushData : content) { + if (!CollUtil.contains(pushEntityMap.keySet(), pushData.getPackageCode())) { + JSONObject js = new JSONObject(); + js.set("extOrderNo", pushData.getOrderCode()); + js.set("extWaybillNO", detailEntityMap.get(pushData.getOrderCode()).getCustomOrderNo()); + js.set("transportNo", pushOrderEntityMap.get(pushData.getOrderCode()).getTransportNo()); + js.set("doTime", entries.getStr("operatorTime")); + js.set("syscode", "huitong"); + js.set("reqSn", UUID.randomUUID()); + // js.set("arriveFor", ""); + JSONObject detailJson = new JSONObject(); + detailJson.set(pushData.getPackageCode(), 1); + js.set("detail", detailJson.toString()); + js.set("shipNo", pushData.getWaybillNumber()); + log.info("推送工厂:{}", js); + String url = jinPaiProperties.getOldSystemHost() + jinPaiProperties.getOldSystemAlreadyStockedUrl(); + try { + if (jinPaiProperties.getEnable()) { + String result = HttpUtil.post(url, JSONUtil.toJsonStr(js)); + log.info("推送工厂结果:{}", result); + // 保存推送记录 + factoryNodePushService.save(FactoryNodePushEntity.builder() + .orderCode(pushData.getOrderCode()) + .node(FactoryNodeEnums.UNLOAD_INCOMING_WAREHOUSE.getCode().toString()) + .content(JSONUtil.toJsonStr(js)) + .resultContent(result) + .build()); + } + } catch (Exception e) { + log.error("推送工厂失败:{}", e); + } + } + } + } + } + } + + private boolean checkData(String msg) { + if (StrUtil.isEmpty(msg)) { + return true; + } + if (!msg.contains("brand") || !msg.contains("content") || !msg.contains("node")) { + return true; + } + JSONObject entries = JSONUtil.parseObj(msg); + String node = entries.getStr("node"); + if (StrUtil.isEmpty(node)) { + return true; + } + // 不是志邦需要的节点数据直接不处理 + if (!EnumUtil.contains(NodeNeedEnums.class, node)) { + return true; + } + WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node); + if (ObjectUtil.isEmpty(workNodeEnums)) { + return true; + } + List content = entries.getBeanList("content", JSONObject.class); + if (CollUtil.isEmpty(content)) { + return true; + } + return false; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/pros/FactoryDataJinPaiProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/pros/FactoryDataJinPaiProperties.java new file mode 100644 index 000000000..ca2727402 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/pros/FactoryDataJinPaiProperties.java @@ -0,0 +1,20 @@ +package com.logpm.factorydata.jinpai.pros; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * FactoryProperties + * + * @author pref + */ +@Data +@ConfigurationProperties(prefix = "logpm") +public class FactoryDataJinPaiProperties { + /** + * 名称 + */ + private String name; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/pros/JinPaiProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/pros/JinPaiProperties.java new file mode 100644 index 000000000..45317fbec --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/pros/JinPaiProperties.java @@ -0,0 +1,65 @@ +package com.logpm.factorydata.jinpai.pros; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * FactoryProperties + * + * @author pref + */ +@Data +@ConfigurationProperties(prefix = "jinpai") +@Component +public class JinPaiProperties { + + /** + * 金牌工厂推送节点数据url + */ + private String pushNodeUrl; + /** + * 是否推送工厂 + */ + private Boolean enable = true; + /** + * 金牌工厂主机地址 + */ + private String host; + /** + * 承运商编码 + */ + private String carrierCode; + + /** + * 补节点数据时的延时时间(分钟) + */ + private Integer delayedTime = 30; + + /** + * 生成老系统暂存单 + */ + private Boolean oldAdvance = false; + + /** + * 生成新系统暂存单 + */ + private Boolean newAdvance = false; + + /** + * 老系统host + */ + private String oldSystemHost; + + /** + * 老系统回传到达url + */ + private String oldSystemArrivedUrl; + + /** + * 老系统回传入库url + */ + private String oldSystemAlreadyStockedUrl; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/DeliveryNoteService.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/DeliveryNoteService.java new file mode 100644 index 000000000..95f14a8dc --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/DeliveryNoteService.java @@ -0,0 +1,30 @@ +package com.logpm.factorydata.jinpai.service; + +import com.logpm.factorydata.jinpai.entity.DeliveryNoteEntity; +import com.logpm.factorydata.jinpai.vo.DeliveryNoteVO; +import com.logpm.factorydata.jinpai.vo.OrderInfoVO; +import com.logpm.factorydata.jinpai.vo.PackageInfoVO; +import com.logpm.factorydata.jinpai.vo.PushOrderVO; +import com.logpm.factorydata.jinpai.vo.ThirdPlWarehouseMappingVO; +import org.springblade.core.mp.base.BaseService; + +import java.util.List; + +/** + * 索菲亚发货单 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface DeliveryNoteService extends BaseService { + + String order(List vo); + + String detail(List vo); + + String packageInfo(List vo); + + List getThirdPlWarehouseMappingVO(); + + String pushOrder(PushOrderVO vo); +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/FactoryNodePushService.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/FactoryNodePushService.java new file mode 100644 index 000000000..0b2681b8b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/FactoryNodePushService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.jinpai.service; + +import com.logpm.factorydata.jinpai.entity.FactoryNodePushEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 推送工厂节点数据 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface FactoryNodePushService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/FactoryOrderLogService.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/FactoryOrderLogService.java new file mode 100644 index 000000000..0d4d4b7e3 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/FactoryOrderLogService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.jinpai.service; + +import com.logpm.factorydata.jinpai.entity.FactoryOrderLogEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 工厂订单日志 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface FactoryOrderLogService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/IFactoryTokenService.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/IFactoryTokenService.java new file mode 100644 index 000000000..83658b274 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/IFactoryTokenService.java @@ -0,0 +1,15 @@ +package com.logpm.factorydata.jinpai.service; + +import com.logpm.factorydata.jinpai.entity.FactoryToken; +import org.springblade.core.mp.base.BaseService; + +import java.security.NoSuchAlgorithmException; + +/** + * 工厂推送数据接口 + */ +public interface IFactoryTokenService extends BaseService { + + + boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException; +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/OrderInfoService.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/OrderInfoService.java new file mode 100644 index 000000000..b75bd1a95 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/OrderInfoService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.jinpai.service; + +import com.logpm.factorydata.jinpai.entity.OrderInfoEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 订单信息 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface OrderInfoService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/PackageInfoService.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/PackageInfoService.java new file mode 100644 index 000000000..c5fefe939 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/PackageInfoService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.jinpai.service; + +import com.logpm.factorydata.jinpai.entity.PackageInfoEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 装箱包信息 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface PackageInfoService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/PushOrderDetailService.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/PushOrderDetailService.java new file mode 100644 index 000000000..855cf1541 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/PushOrderDetailService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.jinpai.service; + +import com.logpm.factorydata.jinpai.entity.PushOrderDetailEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 订单 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface PushOrderDetailService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/PushOrderService.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/PushOrderService.java new file mode 100644 index 000000000..7b2745f08 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/PushOrderService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.jinpai.service; + +import com.logpm.factorydata.jinpai.entity.PushOrderEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 订单 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface PushOrderService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/DeliveryNoteServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/DeliveryNoteServiceImpl.java new file mode 100644 index 000000000..4f37587ae --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/DeliveryNoteServiceImpl.java @@ -0,0 +1,177 @@ +package com.logpm.factorydata.jinpai.service.impl; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.logpm.factorydata.enums.SaxStatusEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.jinpai.entity.DeliveryNoteEntity; +import com.logpm.factorydata.jinpai.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.jinpai.enums.DimensionEnums; +import com.logpm.factorydata.jinpai.mapper.DeliveryNoteMapper; +import com.logpm.factorydata.jinpai.service.DeliveryNoteService; +import com.logpm.factorydata.jinpai.service.FactoryOrderLogService; +import com.logpm.factorydata.jinpai.vo.DeliveryNoteVO; +import com.logpm.factorydata.jinpai.vo.OrderInfoVO; +import com.logpm.factorydata.jinpai.vo.PackageInfoVO; +import com.logpm.factorydata.jinpai.vo.PushOrderVO; +import com.logpm.factorydata.jinpai.vo.ThirdPlWarehouseMappingVO; +import com.logpm.factorydata.vo.SendMsg; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.io.IOUtils; +import org.jetbrains.annotations.NotNull; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.common.utils.FileLogsUtil; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.oss.model.BladeFile; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.tool.api.R; +import org.springblade.resource.feign.IOssClient; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.util.List; + +/** + * 发货单 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class DeliveryNoteServiceImpl extends BaseServiceImpl implements DeliveryNoteService { + + private final IFactoryDataClient factoryDataClient; + private final FactoryOrderLogService factoryOrderLogService; + private final IOssClient ossClient; + private final BladeRedis bladeRedis; + + @Override + public String order(List vo) { + // 1 上传数据到 minio 获取到地址 + String url = uploadFile(JSONUtil.toJsonStr(vo)); + // 2 保存地址到数据库 + FactoryOrderLogEntity logEntity = new FactoryOrderLogEntity(); + logEntity.setType(1); + logEntity.setSaxStatus(SaxStatusEnums.NOMAL.getCode()); + logEntity.setLogUrl(url); + logEntity.setDimension(DimensionEnums.ORDER.getCode()); + factoryOrderLogService.save(logEntity); + + // 3 将消息发送给 mq,解析保存 + SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.JP_FACTORY_ORDER).message(JSONUtil.toJsonStr(logEntity)).build(); + factoryDataClient.sendMessage(build); + return "成功"; + } + + @Override + public String detail(List vo) { + // 1 上传数据到 minio 获取到地址 + String url = uploadFile(JSONUtil.toJsonStr(vo)); + // 2 保存地址到数据库 + FactoryOrderLogEntity logEntity = new FactoryOrderLogEntity(); + logEntity.setType(1); + logEntity.setSaxStatus(SaxStatusEnums.NOMAL.getCode()); + logEntity.setLogUrl(url); + logEntity.setDimension(DimensionEnums.ORDER_DETAIL.getCode()); + factoryOrderLogService.save(logEntity); + + // 3 将消息发送给 mq,解析保存 + SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.JP_FACTORY_ORDER).message(JSONUtil.toJsonStr(logEntity)).build(); + factoryDataClient.sendMessage(build); + return "成功"; + } + + @Override + public String packageInfo(List vo) { + // 1 上传数据到 minio 获取到地址 + String url = uploadFile(JSONUtil.toJsonStr(vo)); + // 2 保存地址到数据库 + FactoryOrderLogEntity logEntity = new FactoryOrderLogEntity(); + logEntity.setType(1); + logEntity.setSaxStatus(SaxStatusEnums.NOMAL.getCode()); + logEntity.setLogUrl(url); + logEntity.setDimension(DimensionEnums.PACKAGE.getCode()); + factoryOrderLogService.save(logEntity); + // 3 将消息发送给 mq,解析保存 + SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.JP_FACTORY_ORDER).message(JSONUtil.toJsonStr(logEntity)).build(); + factoryDataClient.sendMessage(build); + return "成功"; + } + + @Override + @Cacheable(value = "blade:factory:jp:thirdPlWarehouseMapping") + public List getThirdPlWarehouseMappingVO() { + return this.baseMapper.getThirdPlWarehouseMappingVO(); + } + + @Override + public String pushOrder(PushOrderVO vo) { + // 1 上传数据到 minio 获取到地址 + String url = uploadFile(JSONUtil.toJsonStr(vo)); + // 2 保存地址到数据库 + FactoryOrderLogEntity logEntity = new FactoryOrderLogEntity(); + logEntity.setType(2); + logEntity.setSaxStatus(SaxStatusEnums.NOMAL.getCode()); + logEntity.setLogUrl(url); + factoryOrderLogService.save(logEntity); + // 3 将消息发送给 mq,解析保存 + SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.JP_FACTORY_ORDER).message(JSONUtil.toJsonStr(logEntity)).build(); + factoryDataClient.sendMessage(build); + return "成功"; + } + + private String uploadFile(String body) { + //文本内容和保存为本地文件 并上传 + String logPath = FileLogsUtil.saveFileLogs(body); + log.info(">>> 文件路径 {}", logPath); + + MultipartFile multi = getMultipartFile(logPath); + //上传到服务器 + R r = ossClient.fileUpload(multi, "jp-order-logs"); + if (r.isSuccess()) { + BladeFile data = (BladeFile) r.getData(); + // 删除本地文件 + FileUtil.del(logPath); + return data.getLink(); + } + return null; + } + + @NotNull + private MultipartFile getMultipartFile(String logPath) { + File file = new File(logPath); + + // File 转 MultipartFile + FileItem item = new DiskFileItemFactory().createItem("file" + , MediaType.MULTIPART_FORM_DATA_VALUE + , true + , file.getName()); + try ( + InputStream input = Files.newInputStream(file.toPath()); + OutputStream os = item.getOutputStream()) { + // 流转移 + IOUtils.copy(input, os); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid file: " + e, e); + } + + return new CommonsMultipartFile(item); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/FactoryNodePushServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/FactoryNodePushServiceImpl.java new file mode 100644 index 000000000..2f7645261 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/FactoryNodePushServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.jinpai.service.impl; + +import com.logpm.factorydata.jinpai.entity.FactoryNodePushEntity; +import com.logpm.factorydata.jinpai.mapper.FactoryNodePushMapper; +import com.logpm.factorydata.jinpai.service.FactoryNodePushService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 装箱包信息 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class FactoryNodePushServiceImpl extends BaseServiceImpl implements FactoryNodePushService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/FactoryOrderLogServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/FactoryOrderLogServiceImpl.java new file mode 100644 index 000000000..06841a73e --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/FactoryOrderLogServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.jinpai.service.impl; + +import com.logpm.factorydata.jinpai.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.jinpai.mapper.FactoryOrderLogMapper; +import com.logpm.factorydata.jinpai.service.FactoryOrderLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 工厂订单日志 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class FactoryOrderLogServiceImpl extends BaseServiceImpl implements FactoryOrderLogService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/FactoryTokenServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/FactoryTokenServiceImpl.java new file mode 100644 index 000000000..82493df5c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/FactoryTokenServiceImpl.java @@ -0,0 +1,62 @@ +package com.logpm.factorydata.jinpai.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.factorydata.jinpai.entity.FactoryToken; +import com.logpm.factorydata.jinpai.mapper.FactoryTokenMapper; +import com.logpm.factorydata.jinpai.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.redis.cache.BladeRedis; +import org.springframework.stereotype.Service; + +import java.security.NoSuchAlgorithmException; +import java.util.Objects; + +@AllArgsConstructor +@Service +public class FactoryTokenServiceImpl extends BaseServiceImpl implements IFactoryTokenService { + + private static final Logger logger = LoggerFactory.getLogger(FactoryTokenServiceImpl.class); + + private final BladeRedis bladeRedis; + + @Override + public boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException { + logger.info("#########verifyToken: 验证token开始"); + //先生成token摘要 +// String tokenAbst = MD5Utils.md5Hex(token.getBytes(StandardCharsets.UTF_8)); + + //编写查询条件 + String key = "corpId:" + corpId; + FactoryToken factoryToken = bladeRedis.get(key); + + if (Objects.isNull(factoryToken)) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("token", token); + factoryToken = baseMapper.selectOne(queryWrapper); + } + + + if (Objects.isNull(factoryToken)) { + logger.error("#########verifyToken: token1验证不通过 token={},corpid={}", token, corpId); + return false; + } + logger.info("#########verifyToken: 验证token 传入token {} 验证token {}", token, factoryToken.getToken()); + if (!factoryToken.getToken().equals(token)) { + logger.error("#########verifyToken: token2验证不通过 token={},corpid={}", token, corpId); + return false; + } + + + Long expireTimeLong = factoryToken.getExpireTime().getTime(); + Long now = System.currentTimeMillis(); + //判断是否过期 + if (now > expireTimeLong) { + logger.error("#########verifyToken: token验证不通过 已过期 token={},corpId={}", token, corpId); + return false; + } + return true; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/OrderInfoServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/OrderInfoServiceImpl.java new file mode 100644 index 000000000..87b0e4b7f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/OrderInfoServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.jinpai.service.impl; + +import com.logpm.factorydata.jinpai.entity.OrderInfoEntity; +import com.logpm.factorydata.jinpai.mapper.OrderInfoMapper; +import com.logpm.factorydata.jinpai.service.OrderInfoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 订单信息 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class OrderInfoServiceImpl extends BaseServiceImpl implements OrderInfoService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/PackageInfoServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/PackageInfoServiceImpl.java new file mode 100644 index 000000000..a8489ae07 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/PackageInfoServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.jinpai.service.impl; + +import com.logpm.factorydata.jinpai.entity.PackageInfoEntity; +import com.logpm.factorydata.jinpai.mapper.PackageInfoMapper; +import com.logpm.factorydata.jinpai.service.PackageInfoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 装箱包信息 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class PackageInfoServiceImpl extends BaseServiceImpl implements PackageInfoService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/PushOrderDetailServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/PushOrderDetailServiceImpl.java new file mode 100644 index 000000000..d19922bfd --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/PushOrderDetailServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.jinpai.service.impl; + +import com.logpm.factorydata.jinpai.entity.PushOrderDetailEntity; +import com.logpm.factorydata.jinpai.mapper.PushOrderDetailMapper; +import com.logpm.factorydata.jinpai.service.PushOrderDetailService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 订单信息 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class PushOrderDetailServiceImpl extends BaseServiceImpl implements PushOrderDetailService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/PushOrderServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/PushOrderServiceImpl.java new file mode 100644 index 000000000..af240be20 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/PushOrderServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.jinpai.service.impl; + +import com.logpm.factorydata.jinpai.entity.PushOrderEntity; +import com.logpm.factorydata.jinpai.mapper.PushOrderMapper; +import com.logpm.factorydata.jinpai.service.PushOrderService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 订单信息 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class PushOrderServiceImpl extends BaseServiceImpl implements PushOrderService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/DeliveryNoteVO.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/DeliveryNoteVO.java new file mode 100644 index 000000000..d5d0be51b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/DeliveryNoteVO.java @@ -0,0 +1,26 @@ +package com.logpm.factorydata.jinpai.vo; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.logpm.factorydata.jinpai.entity.DeliveryNoteEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.util.List; + +/** + * 送货单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "发货单", description = "发货单") +@EqualsAndHashCode(callSuper = true) +public class DeliveryNoteVO extends DeliveryNoteEntity { + + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/OrderInfoVO.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/OrderInfoVO.java new file mode 100644 index 000000000..26ab990e8 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/OrderInfoVO.java @@ -0,0 +1,21 @@ +package com.logpm.factorydata.jinpai.vo; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.logpm.factorydata.jinpai.entity.OrderInfoEntity; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 订单信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "订单信息", description = "订单信息") +@EqualsAndHashCode(callSuper = true) +public class OrderInfoVO extends OrderInfoEntity { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PackageCategoryVO.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PackageCategoryVO.java new file mode 100644 index 000000000..5ffbb7241 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PackageCategoryVO.java @@ -0,0 +1,26 @@ +package com.logpm.factorydata.jinpai.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author zhaoqiaobo + * @create 2024-04-30 + */ +@Data +public class PackageCategoryVO implements Serializable { + + @ApiModelProperty(name = "一级品类") + private String typea; + @ApiModelProperty(name = "二级品类") + private String typeb; + @ApiModelProperty(name = "三级品类") + private String typec; + @ApiModelProperty(name = "包件码") + private String extBoxCode; + @ApiModelProperty(name = "包件类型") + private String extBoxType; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PackageInfoVO.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PackageInfoVO.java new file mode 100644 index 000000000..fb67c5c8d --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PackageInfoVO.java @@ -0,0 +1,18 @@ +package com.logpm.factorydata.jinpai.vo; + +import com.logpm.factorydata.jinpai.entity.PackageInfoEntity; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 装箱包信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "装箱包信息", description = "装箱包信息") +@EqualsAndHashCode(callSuper = true) +public class PackageInfoVO extends PackageInfoEntity { +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PushOrderDetailVO.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PushOrderDetailVO.java new file mode 100644 index 000000000..766bf94ad --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PushOrderDetailVO.java @@ -0,0 +1,28 @@ +package com.logpm.factorydata.jinpai.vo; + +import cn.hutool.json.JSONObject; +import com.logpm.factorydata.jinpai.entity.PushOrderDetailEntity; +import com.logpm.factorydata.jinpai.entity.PushOrderEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 金牌下单明细 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "金牌下单明细", description = "金牌下单明细") +@EqualsAndHashCode(callSuper = true) +public class PushOrderDetailVO extends PushOrderDetailEntity { + + @ApiModelProperty(name = "箱码列表") + private List boxCodes; + @ApiModelProperty(name = "包件品类") + private List boxDetails; +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PushOrderVO.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PushOrderVO.java new file mode 100644 index 000000000..0ae37565b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/PushOrderVO.java @@ -0,0 +1,25 @@ +package com.logpm.factorydata.jinpai.vo; + +import com.logpm.factorydata.jinpai.entity.PushOrderEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 金牌下单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "金牌下单", description = "金牌下单") +@EqualsAndHashCode(callSuper = true) +public class PushOrderVO extends PushOrderEntity { + + @ApiModelProperty(name = "订单明细") + private List items; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/ThirdPlWarehouseMappingVO.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/ThirdPlWarehouseMappingVO.java new file mode 100644 index 000000000..be79f933c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/vo/ThirdPlWarehouseMappingVO.java @@ -0,0 +1,32 @@ +package com.logpm.factorydata.jinpai.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 金牌三方物流仓库映射表 + * @author zhaoqiaobo + * @create 2024-04-30 + */ +@Data +public class ThirdPlWarehouseMappingVO implements Serializable { + + /** + * 到站网点 + */ + private String arriveOrgName; + /** + * 仓库id + */ + private String warehouseId; + /** + * 仓库名称 + */ + private String warehouseName; + /** + * 租户id + */ + private String tenantId; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/wrapper/CustomHttpServletRequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/wrapper/CustomHttpServletRequestWrapper.java new file mode 100644 index 000000000..8d6173eb6 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/wrapper/CustomHttpServletRequestWrapper.java @@ -0,0 +1,38 @@ +package com.logpm.factorydata.jinpai.wrapper; + +import org.springframework.http.HttpHeaders; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper { + + private final HttpHeaders headers; + + public CustomHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + headers = new HttpHeaders(); + } + + @Override + public String getHeader(String name) { + String headerValue = headers.getFirst(name); + return headerValue != null ? headerValue : super.getHeader(name); + } + + @Override + public Enumeration getHeaderNames() { + List names = Collections.list(super.getHeaderNames()); + headers.forEach((key, value) -> names.add(key)); + return Collections.enumeration(names); + } + + // 其他需要覆盖的方法... + + public void addHeader(String name, String value) { + headers.add(name, value); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/wrapper/RequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/wrapper/RequestWrapper.java new file mode 100644 index 000000000..ed7563049 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/wrapper/RequestWrapper.java @@ -0,0 +1,75 @@ +package com.logpm.factorydata.jinpai.wrapper; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class RequestWrapper extends HttpServletRequestWrapper { + private final String body; + public RequestWrapper(HttpServletRequest request) throws IOException { + super(request); + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } catch (IOException ex) { + throw ex; + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException ex) { + throw ex; + } + } + } + body = stringBuilder.toString(); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); + ServletInputStream servletInputStream = new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + @Override + public boolean isReady() { + return false; + } + @Override + public void setReadListener(ReadListener readListener) {} + @Override + public int read() throws IOException { + return byteArrayInputStream.read(); + } + }; + return servletInputStream; + + } + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } + public String getBody() { + return this.body; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application-dev.yml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application-dev.yml new file mode 100644 index 000000000..5d1e3b74c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application-dev.yml @@ -0,0 +1,73 @@ +#服务器端口 +server: + port: 18940 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.46 + port: 5672 + username: admin + password: admin + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-jinpai.master.url} + username: ${blade.datasource.factorydata-jinpai.master.username} + password: ${blade.datasource.factorydata-jinpai.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-jinpai.627683.url} + username: ${blade.datasource.factorydata-jinpai.627683.username} + password: ${blade.datasource.factorydata-jinpai.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application-prod.yml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application-prod.yml new file mode 100644 index 000000000..f1b3fd486 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application-prod.yml @@ -0,0 +1,47 @@ +#服务器端口 +server: + port: 18940 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-jinpai.master.url} + username: ${blade.datasource.factorydata-jinpai.master.username} + password: ${blade.datasource.factorydata-jinpai.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-jinpai.627683.url} + username: ${blade.datasource.factorydata-jinpai.627683.username} + password: ${blade.datasource.factorydata-jinpai.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application-test.yml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application-test.yml new file mode 100644 index 000000000..27956ec48 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application-test.yml @@ -0,0 +1,73 @@ +#服务器端口 +server: + port: 18940 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.110 + port: 5672 + username: admin + password: Slwk@123654 + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-jinpai.master.url} + username: ${blade.datasource.factorydata-jinpai.master.username} + password: ${blade.datasource.factorydata-jinpai.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-jinpai.627683.url} + username: ${blade.datasource.factorydata-jinpai.627683.username} + password: ${blade.datasource.factorydata-jinpai.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application.yml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application.yml new file mode 100644 index 000000000..33da94b58 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/application.yml @@ -0,0 +1,31 @@ +#mybatis-plus配置 +mybatis-plus: + mapper-locations: classpath:com/logpm/**/mapper/*Mapper.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.logpm.**.entity + +#swagger扫描路径配置 +swagger: + base-packages: + - org.springblade + - com.logpm + +#oss配置 +oss: + enabled: true + name: minio + tenant-mode: false + endpoint: http://8.137.14.82:9000 + access-key: minio + secret-key: 123123123 + bucket-name: bladex + + +logging: + config: classpath:logback.xml + + +spring: + main: + allow-circular-references: true + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/logback.xml b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/logback.xml new file mode 100644 index 000000000..7170050de --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/resources/logback.xml @@ -0,0 +1,40 @@ + + + + logback + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf8 + + + + + ${log.path} + + ${log.path}.%d{yyyy-MM-dd}.zip + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/Dockerfile b/blade-service/logpm-factory-data/logpm-factory-data-linsy/Dockerfile new file mode 100644 index 000000000..8888121ef --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/Dockerfile @@ -0,0 +1,14 @@ +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 + +MAINTAINER h5u@163.com + +RUN mkdir -p /logpm/logpm-factory-data-linsy + +WORKDIR /logpm/logpm-factory-data-linsy + +EXPOSE 18950 + +ADD ./target/logpm-factory-data-linsy.jar ./app.jar + +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","-Xms128m","-Xmx512m", "app.jar"] +CMD ["--spring.profiles.active=test"] diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/pom.xml b/blade-service/logpm-factory-data/logpm-factory-data-linsy/pom.xml new file mode 100644 index 000000000..0295ee098 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/pom.xml @@ -0,0 +1,97 @@ + + + + logpm-factory-data + org.springblade + 3.2.0.RELEASE + + 4.0.0 + + logpm-factory-data-linsy + + + 8 + 8 + + + + + org.springblade + blade-core-boot + + + org.springblade + blade-core-auto + provided + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springblade + logpm-factory-data-api + 3.2.0.RELEASE + + + com.xuxueli + xxl-job-core + + + org.springblade + blade-starter-swagger + + + org.springblade + logpm-trunkline-api + 3.2.0.RELEASE + + + org.springblade + logpm-factory-data-base-api + ${bladex.project.version} + + + org.springblade + blade-starter-oss + + + io.minio + minio + + + org.springblade + blade-resource-api + 3.2.0.RELEASE + compile + + + + + + + + com.spotify + dockerfile-maven-plugin + + ${docker.username} + ${docker.password} + ${docker.registry.url}/${docker.namespace}/${project.artifactId} + ${project.version} + true + + target/${project.build.finalName}.jar + + false + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factory/snm/entity/FactoryToken.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factory/snm/entity/FactoryToken.java new file mode 100644 index 000000000..304d7cb88 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factory/snm/entity/FactoryToken.java @@ -0,0 +1,32 @@ +package com.logpm.factory.snm.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springblade.core.mp.base.BaseEntity; + +import java.util.Date; + +@Data +@TableName("factory_token") +@ApiModel(value = "FactoryToken对象", description = "工厂账户token") +public class FactoryToken extends BaseEntity { + + @ApiModelProperty("token") + private String token; + + @ApiModelProperty("token摘要") + private String tokenAbst; + + @JsonFormat( + pattern = "yyyy-MM-dd HH:mm:ss" + ) + @ApiModelProperty("过期时间") + private Date expireTime; + + @ApiModelProperty("企业id") + private String corpid; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/FactoryDataLinSyApplication.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/FactoryDataLinSyApplication.java new file mode 100644 index 000000000..fc019aa4a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/FactoryDataLinSyApplication.java @@ -0,0 +1,20 @@ +package com.logpm.factorydata; + +import org.springblade.common.constant.ModuleNameConstant; +import org.springblade.core.cloud.client.BladeCloudApplication; +import org.springblade.core.launch.BladeApplication; + +/** + * 林氏工厂数据启动类 + * + * @author zhaoqiaobo + * @create 2024-4-26 + */ +@BladeCloudApplication +public class FactoryDataLinSyApplication { + + public static void main(String[] args) { + BladeApplication.run(ModuleNameConstant.LOGPM_FACTORY_DATA_LINSY_NAME, FactoryDataLinSyApplication.class, args); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..e6402a23f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.factorydata.linsy.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..985e3ce14 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.factorydata.linsy.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/CustomMessageConverter.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/CustomMessageConverter.java new file mode 100644 index 000000000..85bda2900 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/CustomMessageConverter.java @@ -0,0 +1,161 @@ +package com.logpm.factorydata.linsy.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength((long) bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/ExecutorConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/ExecutorConfig.java new file mode 100644 index 000000000..2cd0c061b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/ExecutorConfig.java @@ -0,0 +1,79 @@ +package com.logpm.factorydata.linsy.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.http.HttpHeaders; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + ThreadLocalUtil.put("bladeContext", headers); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/FactoryDataOloConfiguration.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/FactoryDataOloConfiguration.java new file mode 100644 index 000000000..d2fa931d3 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/FactoryDataOloConfiguration.java @@ -0,0 +1,40 @@ +/* + * 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.linsy.config; + + +import com.logpm.factorydata.linsy.pros.FactoryDataProperties; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 配置feign、mybatis包名、properties + * + * @author chaos + */ +@Configuration(proxyBeanMethods = false) +@ComponentScan({"org.springblade", "com.logpm"}) +@EnableFeignClients({"org.springblade", "com.logpm"}) +@MapperScan({"org.springblade.**.mapper.**", "com.logpm.**.mapper.**"}) +@EnableConfigurationProperties(FactoryDataProperties.class) +public class FactoryDataOloConfiguration { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/InterceptorAdapterConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/InterceptorAdapterConfig.java new file mode 100644 index 000000000..46738fd9e --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/InterceptorAdapterConfig.java @@ -0,0 +1,37 @@ +package com.logpm.factorydata.linsy.config; + +import com.logpm.factorydata.linsy.interceptor.FactoryAccountsInterceptor; +import com.logpm.factorydata.linsy.interceptor.LocalServerLoginAccountsInterceptor; +import com.logpm.factorydata.linsy.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.springblade.common.component.MockLoginService; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@AllArgsConstructor +public class InterceptorAdapterConfig implements WebMvcConfigurer { + + private final IFactoryTokenService factoryTokenService; + + private final BladeRedis redis; + + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + + @Override + public void addInterceptors(InterceptorRegistry interceptorRegistry) { + interceptorRegistry.addInterceptor(new FactoryAccountsInterceptor(factoryTokenService)) + .addPathPatterns("/**") + .excludePathPatterns("/**/sendMsg") + .order(2); + interceptorRegistry.addInterceptor(new LocalServerLoginAccountsInterceptor(redis, environment,redisLockClient,mockLoginService)) + .addPathPatterns("/**").order(1); + + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/RabbitConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/RabbitConfig.java new file mode 100644 index 000000000..4c0022753 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/config/RabbitConfig.java @@ -0,0 +1,17 @@ +package com.logpm.factorydata.linsy.config; + +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory factory, CustomMessageConverter converter) { + RabbitTemplate template = new RabbitTemplate(factory); + template.setMessageConverter(converter); + return template; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/controller/OrderController.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/controller/OrderController.java new file mode 100644 index 000000000..9fedd4b2c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/controller/OrderController.java @@ -0,0 +1,83 @@ +package com.logpm.factorydata.linsy.controller; + +import cn.hutool.json.JSONUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.factorydata.linsy.service.DeliveryNoteService; +import com.logpm.factorydata.linsy.service.FactoryOrderLogService; +import com.logpm.factorydata.linsy.vo.CancelOrderVO; +import com.logpm.factorydata.linsy.vo.DeliveryNoteVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.core.tool.api.R; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * 工厂订单 前端控制器 + * + * @author zhaoqiaobo + * @create 2024-03-21 19:27 + */ +@Slf4j +@RestController +@RequestMapping("/factory/order/v1") +@AllArgsConstructor +@Api(value = "工厂订单", tags = "工厂订单") +public class OrderController { + + private final FactoryOrderLogService service; + private final DeliveryNoteService deliveryNoteService; + private final RabbitTemplate rabbitTemplate; + + @ResponseBody + @PostMapping("sendMsg") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "推送工厂订单", notes = "推送工厂订单") + public R sendMsg(@RequestBody Map vo) { + log.info("推送工厂订单:{} ", JSONUtil.toJsonStr(vo)); + rabbitTemplate.convertAndSend(FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, + FactoryDataConstants.Mq.RoutingKeys.LINSY_NODE_DATA_PUSH, JSONUtil.toJsonStr(vo)); + return R.success("成功"); + } + + @ResponseBody + @PostMapping + @ApiOperationSupport(order = 1) + @ApiOperation(value = "工厂订单", notes = "工厂订单") + public R order(@RequestBody DeliveryNoteVO vo) { + log.info("接收工厂订单:{} ", JSONUtil.toJsonStr(vo)); + String res = ""; + try { + res = service.order(vo); + } catch (Exception e) { + log.error("工厂订单异常:{} ", e); + return R.success("服务器异常"); + } + return R.success(res); + } + + @ResponseBody + @PatchMapping + @ApiOperationSupport(order = 2) + @ApiOperation(value = "取消订单", notes = "取消订单") + public R cancelOrder(@Validated @RequestBody CancelOrderVO vo) { + log.info("取消订单:{} ", JSONUtil.toJsonStr(vo)); + Boolean res = deliveryNoteService.cancelOrder(vo); + if (res) { + return R.success("取消成功"); + } + return R.fail("该订单已作业,无法取消"); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/dto/PushOrderDTO.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/dto/PushOrderDTO.java new file mode 100644 index 000000000..ff469ea4a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/dto/PushOrderDTO.java @@ -0,0 +1,23 @@ +package com.logpm.factorydata.linsy.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 回传订单状态 + * + * @author zhaoqiaobo + * @create 2024-05-16 + */ +@Data +public class PushOrderDTO implements Serializable { + + private String billCode; + + private String status; + + private List packages; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/dto/PushPackageDTO.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/dto/PushPackageDTO.java new file mode 100644 index 000000000..7f0e19627 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/dto/PushPackageDTO.java @@ -0,0 +1,21 @@ +package com.logpm.factorydata.linsy.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 回传包件 + * + * @author zhaoqiaobo + * @create 2024-05-16 + */ +@Data +public class PushPackageDTO implements Serializable { + + /** + * 包条码 + */ + private String barcode; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/DeliveryNoteEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/DeliveryNoteEntity.java new file mode 100644 index 000000000..cfe7b8d89 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/DeliveryNoteEntity.java @@ -0,0 +1,89 @@ +package com.logpm.factorydata.linsy.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 送货单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("linsy_delivery_note") +@ApiModel(value = "林氏发运单", description = "林氏发运单") +@EqualsAndHashCode(callSuper = true) +public class DeliveryNoteEntity extends BaseEntity { + + @ApiModelProperty("日志id") + private String logId; + + @ApiModelProperty(value = "单据编号") + private String billCode; + @ApiModelProperty(value = "单据日期") + private String billDate; + @ApiModelProperty(value = "总包件数") + private String totalPackage; + @ApiModelProperty(value = "总体积") + private String totalVolume; + @ApiModelProperty(value = "经销商") + private String agencyName; + @ApiModelProperty(value = "定制单号") + private String customizedBillCode; + @ApiModelProperty(value = "供应商") + private String supplierName; + @ApiModelProperty(value = "店铺") + private String shopName; + @ApiModelProperty(value = "收货人") + private String receiverName; + @ApiModelProperty(value = "电话") + private String receiverTelephone; + @ApiModelProperty(value = "收货省") + private String receiverProvinceName; + @ApiModelProperty(value = "收货市") + private String receiverCityName; + @ApiModelProperty(value = "收货区") + private String receiverDistrictName; + @ApiModelProperty(value = "收货街道") + private String receiverStreetName; + @ApiModelProperty(value = "收货详细地址") + private String receiverDetailAddress; + @ApiModelProperty(value = "业务员") + private String customerSalesman; + @ApiModelProperty(value = "业务联系电话") + private String customerSalesmanTelephone; + @ApiModelProperty(value = "发货省") + private String senderProvinceName; + @ApiModelProperty(value = "发货市") + private String senderCityName; + @ApiModelProperty(value = "发货区") + private String senderDistrictName; + @ApiModelProperty(value = "发货详细地址") + private String senderDetailAddress; + @ApiModelProperty(value = "发货人") + private String senderName; + @ApiModelProperty(value = "发货人电话") + private String senderTelephone; + @ApiModelProperty(value = "创建时间") + private String createdTime; + @ApiModelProperty(value = "原单编号") + private String sourceBillCode; + @ApiModelProperty(value = "合并单号") + private String mergeOrderCode; + + @ApiModelProperty(value = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(value = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(value = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(value = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(value = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/FactoryNodePushEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/FactoryNodePushEntity.java new file mode 100644 index 000000000..c9c8fc047 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/FactoryNodePushEntity.java @@ -0,0 +1,74 @@ +package com.logpm.factorydata.linsy.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("linsy_factory_node_push") +@ApiModel(value = "节点数据推送成功数据", description = "节点数据推送成功数据") +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public class FactoryNodePushEntity 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 billCode; + /** + * 节点 + */ + @ApiModelProperty(name = "节点", notes = "") + private String node; + /** + * 内容 + */ + @ApiModelProperty(name = "内容", notes = "") + private String content; + /** + * 返回值 + */ + @ApiModelProperty(name = "返回值", notes = "") + private String resultContent; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/FactoryOrderLogEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/FactoryOrderLogEntity.java new file mode 100644 index 000000000..b73f91240 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/FactoryOrderLogEntity.java @@ -0,0 +1,58 @@ +package com.logpm.factorydata.linsy.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +@Data +@TableName("linsy_factory_log") +@ApiModel(value = "接收工厂订单日志", description = "接收工厂订单日志") +@EqualsAndHashCode(callSuper = true) +public class FactoryOrderLogEntity 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 logUrl; + /** + * 数据类型 1.入库数据 + */ + @ApiModelProperty(name = "数据类型 1.入库数据", notes = "") + private Integer type; + /** + * 解析状态 0 未解析 1 解析失败 2 已解析 + */ + @ApiModelProperty(name = "解析状态 0 未解析 1 解析失败 2 已解析", notes = "") + private Integer saxStatus; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/PackageInfoEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/PackageInfoEntity.java new file mode 100644 index 000000000..710150390 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/entity/PackageInfoEntity.java @@ -0,0 +1,76 @@ +package com.logpm.factorydata.linsy.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 装箱包信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("linsy_package_info") +@ApiModel(value = "包件信息", description = "包件信息") +@EqualsAndHashCode(callSuper = true) +public class PackageInfoEntity extends BaseEntity { + + @ApiModelProperty(value = "日志id") + private String logId; + @ApiModelProperty(value = "发货单id") + private String deliveryNoteId; + @ApiModelProperty(value = "订单号") + private String orderCode; + @ApiModelProperty(value = "单据编号") + private String billCode; + @ApiModelProperty(value = "已推送节点编码") + private Integer workedNodeCode; + @ApiModelProperty(value = "父项物料编码") + private String parentMaterialCode; + @ApiModelProperty(value = "父项物料名称") + private String parentMaterialName; + @ApiModelProperty(value = "检验单号") + private String checkBillCode; + @ApiModelProperty(value = "采购单号") + private String sellerBillCode; + @ApiModelProperty(value = "批号") + private String lotCode; + @ApiModelProperty(value = "客户业务员") + private String customerSalesman; + @ApiModelProperty(value = "外部原单行号") + private String outSourceCode; + @ApiModelProperty(value = "定制单号") + private String customizedBillCode; + @ApiModelProperty(value = "物料编码") + private String materialCode; + @ApiModelProperty(value = "物料名称") + private String materialName; + @ApiModelProperty(value = "包件条码") + private String barcode; + @ApiModelProperty(value = "体积") + private String volume; + @ApiModelProperty(value = "重量") + private String weight; + @ApiModelProperty(value = "长度") + private String length; + @ApiModelProperty(value = "宽度") + private String width; + @ApiModelProperty(value = "高度") + private String height; + + @ApiModelProperty(value = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(value = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(value = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(value = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(value = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/enums/FactoryNodeEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/enums/FactoryNodeEnums.java new file mode 100644 index 000000000..14667ed4e --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/enums/FactoryNodeEnums.java @@ -0,0 +1,51 @@ +package com.logpm.factorydata.linsy.enums; + +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * 工厂节点枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum FactoryNodeEnums { + + /** + * 已交接 + */ + INITIAL_WAREHOUSE_ENTRY(101020, "Deliveried", 1), + /** + * 收货完成 + */ + END_WAREHOUSE_UNLOADING(105040, "Received", 1); + + private Integer code; + private String text; + private Integer mustPush; + + FactoryNodeEnums(Integer code, String text, Integer mustPush) { + this.code = code; + this.text = text; + this.mustPush = mustPush; + } + + /** + * 获取所有必推节点的编码 + * + * @return + */ + public static List getMustPushCode() { + List list = new ArrayList<>(); + for (FactoryNodeEnums value : FactoryNodeEnums.values()) { + if (value.getMustPush() == 1) { + list.add(value.getCode()); + } + } + return list; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/enums/NodeMappingEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/enums/NodeMappingEnums.java new file mode 100644 index 000000000..068297675 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/enums/NodeMappingEnums.java @@ -0,0 +1,62 @@ +package com.logpm.factorydata.linsy.enums; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Getter; +import org.springblade.common.constant.WorkNodeEnums; + +/** + * 系统和工厂节点映射枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum NodeMappingEnums { + + /** + * 已交接 + */ + INITIAL_WAREHOUSE_ENTRY(FactoryNodeEnums.INITIAL_WAREHOUSE_ENTRY, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY, 1), + /** + * 收货完成 + */ + END_WAREHOUSE_UNLOADING(FactoryNodeEnums.END_WAREHOUSE_UNLOADING, WorkNodeEnums.END_WAREHOUSE_UNLOADING, 1); + + /** + * 系统作业节点 + */ + private WorkNodeEnums workNodeEnums; + /** + * 工厂作业节点 + */ + private FactoryNodeEnums factoryNodeEnums; + /** + * 状态码 + * 存在我们系统同一个作业节点对应工厂多个节点的情况,通过状态码区分 + */ + private Integer status; + + NodeMappingEnums(FactoryNodeEnums factoryNodeEnums, WorkNodeEnums workNodeEnums, Integer status) { + this.workNodeEnums = workNodeEnums; + this.factoryNodeEnums = factoryNodeEnums; + this.status = status; + } + + public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums) { + return getFactoryByNodeAndStatus(workNodeEnums, 1); + } + + public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums, Integer status) { + NodeMappingEnums[] values = values(); + for (NodeMappingEnums value : values) { + WorkNodeEnums workNodeEnums1 = value.getWorkNodeEnums(); + Integer status1 = value.getStatus(); + FactoryNodeEnums factoryNodeEnums = value.getFactoryNodeEnums(); + if (ObjectUtil.equal(workNodeEnums1, workNodeEnums) && ObjectUtil.equal(status1, status)) { + return factoryNodeEnums; + } + } + return null; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/enums/NodeNeedEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/enums/NodeNeedEnums.java new file mode 100644 index 000000000..899169bbc --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/enums/NodeNeedEnums.java @@ -0,0 +1,34 @@ +package com.logpm.factorydata.linsy.enums; + +import lombok.Getter; + +import java.io.Serializable; + +/** + * 作业节点枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum NodeNeedEnums implements Serializable { + + /** + * 始发仓入库 + */ + INITIAL_WAREHOUSE_ENTRY(101020, "始发仓入库"), + /** + * 末端仓卸车确认 + */ + END_WAREHOUSE_UNLOADING(105040, "末端仓卸车确认"), + ; + + private Integer code; + private String value; + + NodeNeedEnums(Integer code, String value) { + this.code = code; + this.value = value; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/interceptor/FactoryAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/interceptor/FactoryAccountsInterceptor.java new file mode 100644 index 000000000..831ed3bc8 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/interceptor/FactoryAccountsInterceptor.java @@ -0,0 +1,87 @@ +package com.logpm.factorydata.linsy.interceptor; + +import com.alibaba.fastjson.JSONObject; +import com.logpm.factorydata.linsy.service.IFactoryTokenService; +import com.logpm.factorydata.linsy.wrapper.RequestWrapper; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +@Log4j2 +@AllArgsConstructor +public class FactoryAccountsInterceptor implements HandlerInterceptor { + + private final IFactoryTokenService factoryTokenService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + try { + + RequestWrapper myRequestWrapper = new RequestWrapper(request); + String body = myRequestWrapper.getBody(); + JSONObject jsonObject = JSONObject.parseObject(body); + //获取头中参数 + String token = request.getHeader("Authorization"); + String corpId = request.getHeader("corpid"); + if(StringUtil.isBlank(corpId)){ + corpId = jsonObject.getString("corpid"); + } + if(!StringUtil.hasLength(token)){ + returnJson(response,JSONObject.toJSONString(R.fail(401,"认证不通过,token有误"))); + return false; + } + if(!StringUtil.hasLength(corpId)){ + returnJson(response,JSONObject.toJSONString(R.fail(401,"认证不通过,corpId有误"))); + return false; + } + + log.info("##########preHandle: token={}",token); + //验证token + boolean b = factoryTokenService.verifyToken(token,corpId); + if(!b){ + returnJson(response,JSONObject.toJSONString(R.fail(401,"认证不通过,token不存在或已过期"))); + return false; + } + return true; + } catch (Exception e) { + returnJson(response,JSONObject.toJSONString(R.fail(500,"服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null){ + writer.close(); + } + } + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/interceptor/LocalServerLoginAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/interceptor/LocalServerLoginAccountsInterceptor.java new file mode 100644 index 000000000..ddd3c3d8f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/interceptor/LocalServerLoginAccountsInterceptor.java @@ -0,0 +1,101 @@ +package com.logpm.factorydata.linsy.interceptor; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.common.exception.CustomerException; +import org.springblade.common.wrapper.CustomHttpServletRequestWrapper; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Log4j2 +@AllArgsConstructor +public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapter { + + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + + + try { + org.springblade.common.wrapper.CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(request); + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + + // 修改或添加header + + // 发送登录请求 + log.info("##########preHandle: request={}", request); + + wrappedRequest.addHeader("Blade-Auth", "bearer "+data.getString("access_token")); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + + // 用包装后的request替换原始request + request = wrappedRequest; + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + return true; + } catch (Exception e) { + returnJson(response, JSONObject.toJSONString(R.fail(500, "服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/launcher/FactoryDataBaseLauncherServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/launcher/FactoryDataBaseLauncherServiceImpl.java new file mode 100644 index 000000000..9ab059148 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/launcher/FactoryDataBaseLauncherServiceImpl.java @@ -0,0 +1,60 @@ +/* + * 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.linsy.launcher; + +import org.springblade.core.auto.service.AutoService; +import org.springblade.core.launch.constant.NacosConstant; +import org.springblade.core.launch.service.LauncherService; +import org.springblade.core.launch.utils.PropsUtil; +import org.springframework.boot.builder.SpringApplicationBuilder; + +import java.util.Properties; + +/** + * 启动参数拓展 + * + * @author Chill + */ +@AutoService(LauncherService.class) +public class FactoryDataBaseLauncherServiceImpl implements LauncherService { + + @Override + public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) { + Properties props = System.getProperties(); + // 开启多数据源 + PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true"); + // 指定注册配置信息 + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].data-id", NacosConstant.dataId(appName, profile)); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].group", NacosConstant.NACOS_CONFIG_GROUP); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].refresh", NacosConstant.NACOS_CONFIG_REFRESH); + // 指定注册IP + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.ip", "127.0.0.1"); + // 指定注册端口 + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.port", "8200"); + // 自定义命名空间 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.NACOS_NAMESPACE); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.NACOS_NAMESPACE); + // 自定义分组 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.group", NacosConstant.NACOS_CONFIG_GROUP); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.group", NacosConstant.NACOS_CONFIG_GROUP); + } + + @Override + public int getOrder() { + return 20; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/DeliveryNoteMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/DeliveryNoteMapper.java new file mode 100644 index 000000000..0bb77b8a4 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/DeliveryNoteMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.linsy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.linsy.entity.DeliveryNoteEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 发货单 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface DeliveryNoteMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryNodeOrderMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryNodeOrderMapper.xml new file mode 100644 index 000000000..255ceb64c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryNodeOrderMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryNodePushMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryNodePushMapper.java new file mode 100644 index 000000000..09fcc1606 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryNodePushMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.linsy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.linsy.entity.FactoryNodePushEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 装箱包信息 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface FactoryNodePushMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryNodePushMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryNodePushMapper.xml new file mode 100644 index 000000000..76ca06fd7 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryNodePushMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryOrderLogMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryOrderLogMapper.java new file mode 100644 index 000000000..2c8dc0462 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryOrderLogMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.linsy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.linsy.entity.FactoryOrderLogEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 工厂订单日志 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface FactoryOrderLogMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryOrderLogMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryOrderLogMapper.xml new file mode 100644 index 000000000..fd53c5269 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryOrderLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryTokenMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryTokenMapper.java new file mode 100644 index 000000000..764a09910 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryTokenMapper.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.linsy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factory.snm.entity.FactoryToken; +import org.apache.ibatis.annotations.Mapper; + +/** + * 工厂账号接口日志 Mapper 接口 + * + * @author zhy + * @since 2023-03-28 + */ +@Mapper +public interface FactoryTokenMapper extends BaseMapper { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryTokenMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryTokenMapper.xml new file mode 100644 index 000000000..76416cd84 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/FactoryTokenMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/PackageInfoMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/PackageInfoMapper.java new file mode 100644 index 000000000..b5e266b6a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/PackageInfoMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.linsy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.linsy.entity.PackageInfoEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 装箱包信息 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface PackageInfoMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/PackageInfoMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/PackageInfoMapper.xml new file mode 100644 index 000000000..3cd3ffca7 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mapper/PackageInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mq/FactoryOrderListener.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mq/FactoryOrderListener.java new file mode 100644 index 000000000..b454b72a1 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mq/FactoryOrderListener.java @@ -0,0 +1,129 @@ +package com.logpm.factorydata.linsy.mq; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.json.JSONConfig; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.factorydata.enums.SaxStatusEnums; +import com.logpm.factorydata.linsy.entity.DeliveryNoteEntity; +import com.logpm.factorydata.linsy.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.linsy.entity.PackageInfoEntity; +import com.logpm.factorydata.linsy.pros.LinsyProperties; +import com.logpm.factorydata.linsy.service.DeliveryNoteService; +import com.logpm.factorydata.linsy.service.FactoryOrderLogService; +import com.logpm.factorydata.linsy.service.PackageInfoService; +import com.logpm.factorydata.linsy.vo.DeliveryNoteVO; +import com.logpm.factorydata.linsy.vo.PackageInfoVO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 监听订单数据 + * + * @author zhaoqiaobo + * @create 2024-03-18 + */ +@Slf4j +@Component +@AllArgsConstructor +public class FactoryOrderListener { + + private final DeliveryNoteService deliveryNoteService; + private final FactoryOrderLogService logService; + private final PackageInfoService packageInfoService; + private final LinsyProperties linsyProperties; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.LINSY_FACTORY_ORDER), + exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER, type = ExchangeTypes.TOPIC), + key = FactoryDataConstants.Mq.RoutingKeys.LINSY_FACTORY_ORDER + )) + @Transactional(rollbackFor = Exception.class) + public void factoryOrder(String msg) { + log.info("处理林氏订单:{}", msg); + if (StrUtil.isEmpty(msg)) { + log.error("消息内容为空"); + return; + } + FactoryOrderLogEntity logEntity = JSONUtil.toBean(msg, FactoryOrderLogEntity.class); + if (ObjectUtil.isEmpty(logEntity)) { + log.error("消息内容为空"); + return; + } + // 去 minio 下载文件到本地,然后解析文件内容为实体对象 + DeliveryNoteVO vo = null; + Long logId = logEntity.getId(); + String logUrl = logEntity.getLogUrl(); + if (StrUtil.isNotEmpty(logUrl)) { + List res = new ArrayList<>(); + FileUtil.readLines(URLUtil.url(logUrl), CharsetUtil.CHARSET_UTF_8, res); + if (CollUtil.isNotEmpty(res)) { + String content = res.get(0); + if (StrUtil.isNotEmpty(content)) { + JSONConfig config = new JSONConfig(); + config.setIgnoreCase(Boolean.TRUE); + vo = JSONUtil.toBean(content, DeliveryNoteVO.class); + } + } + } + if (ObjectUtil.isEmpty(vo)) { + log.error("消息内容为空"); + return; + } + // 1 解析数据保存入库 + // 车次号唯一 + String billCode = vo.getBillCode(); + List list = deliveryNoteService.list(Wrappers.lambdaQuery() + .eq(DeliveryNoteEntity::getBillCode, billCode)); + if (CollUtil.isNotEmpty(list)) { + log.error("单号{} 数据已经处理过了, logId: {}", billCode, logId); + return; + } + vo.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); + deliveryNoteService.save(vo); + List orderInfos = vo.getPackages(); + if (CollUtil.isNotEmpty(orderInfos)) { + List infoEntities = new ArrayList<>(); + for (PackageInfoVO orderInfo : orderInfos) { + PackageInfoEntity orderInfoEntity = new PackageInfoEntity(); + BeanUtil.copyProperties(orderInfo, orderInfoEntity); + orderInfoEntity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); + orderInfoEntity.setDeliveryNoteId(vo.getId().toString()); + orderInfoEntity.setOrderCode(vo.getCustomizedBillCode()); + orderInfoEntity.setBillCode(vo.getBillCode()); + infoEntities.add(orderInfoEntity); + } + packageInfoService.saveBatch(infoEntities); + } + // 2 构建暂存单,发送 mq 消息 + FactoryOrderLogEntity logEntity1 = new FactoryOrderLogEntity(); + logEntity1.setSaxStatus(SaxStatusEnums.SUCCESS.getCode()); + logEntity1.setId(logId); + logService.saveOrUpdate(logEntity1); + // 处理暂存单 + if (linsyProperties.getNewAdvance()) { + deliveryNoteService.buildAdvance(vo); + } + if (linsyProperties.getOldAdvance()) { + deliveryNoteService.buildOldAdvance(vo); + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mq/NodeDataPushListener.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mq/NodeDataPushListener.java new file mode 100644 index 000000000..f095bf6a3 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/mq/NodeDataPushListener.java @@ -0,0 +1,248 @@ +package com.logpm.factorydata.linsy.mq; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.linsy.entity.FactoryNodePushEntity; +import com.logpm.factorydata.linsy.entity.PackageInfoEntity; +import com.logpm.factorydata.linsy.enums.FactoryNodeEnums; +import com.logpm.factorydata.linsy.enums.NodeMappingEnums; +import com.logpm.factorydata.linsy.enums.NodeNeedEnums; +import com.logpm.factorydata.linsy.pros.LinsyProperties; +import com.logpm.factorydata.linsy.service.FactoryNodePushService; +import com.logpm.factorydata.linsy.service.PackageInfoService; +import com.logpm.factorydata.vo.PushData; +import com.logpm.factorydata.vo.SendMsg; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.WorkNodeEnums; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * 监听业务系统推送给志邦的节点数据 + * + * @author zhaoqiaobo + * @create 2024-03-18 0:02 + */ +@Slf4j +@Component +@AllArgsConstructor +public class NodeDataPushListener { + + private final IFactoryDataClient factoryDataClient; + private final PackageInfoService packageInfoService; + private final FactoryNodePushService factoryNodePushService; + private final LinsyProperties linsyProperties; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.LINSY_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.LINSY_NODE_DATA_PUSH + )) + public void nodeDataPushDelayed(String msg) { + // 直接调用nodeDataPush方法处理接收到的消息 + nodeDataPush(msg); + } + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.LINSY_NODE_DATA_PUSH, durable = "true"), + exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, type = ExchangeTypes.TOPIC), + key = FactoryDataConstants.Mq.RoutingKeys.LINSY_NODE_DATA_PUSH + )) + @Transactional(rollbackFor = Exception.class) + public void nodeDataPush(String msg) { + // {"brand":"ZBOM","node":"TRANSFER_WAREHOUSE_DEPART","operator":"","operatorTime":"","content":[{"packageCode":"1423090693445"}]} + log.info("接收到节点数据推送:{}", msg); + // 1 校验数据 + if (checkData(msg)) { + return; + } + JSONObject entries = JSONUtil.parseObj(msg); + // 节点 + String node = entries.getStr("node"); + WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node); + // 2 获取业务数据 + List content = entries.getBeanList("content", PushData.class); + // 数据按订单分组 + // 3 拿到所有必推节点的code + List mustPushCode = FactoryNodeEnums.getMustPushCode(); + if (CollUtil.isNotEmpty(content)) { + // 根据订单码查询出本次操作的所有数据 + List packageInfoEntities = packageInfoService.list(Wrappers.lambdaQuery() + .in(PackageInfoEntity::getOrderCode, content.stream().map(PushData::getOrderCode).collect(Collectors.toList()))); + if (CollUtil.isEmpty(packageInfoEntities)) { + log.info("未查到包件数据,不处理:{}", JSONUtil.toJsonStr(content)); + return; + } + // packageInfoEntities按订单分组 + Map> packageInfoMap = packageInfoEntities.stream() + .collect(HashMap::new, (m, v) -> m.computeIfAbsent(v.getOrderCode(), k -> new ArrayList<>()).add(v), HashMap::putAll); + // 所有包件按订单号分组 + Map> groupByOrder = content.stream() + .collect(HashMap::new, (m, v) -> m.computeIfAbsent(v.getOrderCode(), k -> new ArrayList<>()).add(v), HashMap::putAll); + // 4 根据订单号查看所有已推节点,获取最大的推送节点 + List list = factoryNodePushService.list(Wrappers.lambdaQuery() + .in(FactoryNodePushEntity::getBillCode, groupByOrder.keySet()) + ); + Map maxNodeMap = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + list.forEach(factoryNodePushEntity -> { + String billCode = factoryNodePushEntity.getBillCode(); + Integer code = Convert.toInt(factoryNodePushEntity.getNode()); + if (mustPushCode.contains(code)) { + if (maxNodeMap.containsKey(billCode)) { + Integer minNode = maxNodeMap.get(billCode); + if (code > minNode) { + maxNodeMap.put(billCode, code); + } + } else { + maxNodeMap.put(billCode, code); + } + } + }); + } + List updateList = new ArrayList<>(); + for (Map.Entry> entry : groupByOrder.entrySet()) { + String orderCode = entry.getKey(); + Integer code = workNodeEnums.getCode(); + // 当前的节点小于已经推送的最大节点,则跳过 + Integer maxCode = 0; + if (maxNodeMap.containsKey(orderCode)) { + if (maxNodeMap.get(orderCode) >= code) { + continue; + } + maxCode = maxNodeMap.get(orderCode); + } + List value = entry.getValue(); + if (CollUtil.isNotEmpty(value)) { + List collect = value.stream().map(PushData::getPackageCode).collect(Collectors.toList()); + // 5 根据订单号,包件码 查看数据是否齐套,齐套直接推送工厂 + List entities = packageInfoMap.get(orderCode); + PackageInfoEntity infoEntity = entities.get(0); + String billCode = infoEntity.getBillCode(); + // 过滤掉entities 中的 workedNodeCode < code 的数据 + List workerList = entities.stream() + .filter(packageInfoEntity -> !collect.contains(packageInfoEntity.getBarcode())) + .filter(packageInfoEntity -> packageInfoEntity.getWorkedNodeCode() < code) + .collect(Collectors.toList()); + FactoryNodeEnums factoryByNodeAndStatus = NodeMappingEnums.getFactoryByNodeAndStatus(workNodeEnums); + if (CollUtil.isEmpty(workerList)) { + // 齐套 推送工厂 + // 6 必传的节点中 必须大于 maxCode 并且 小于当前节点编码 并且 数值最小的一条数据 + Integer finalMaxCode = maxCode; + Optional min = mustPushCode.stream() + .filter(data -> data > finalMaxCode) + .filter(data -> data < code) + .min(Comparator.naturalOrder()); + Integer sendCode = null; + if (min.isPresent()) { + sendCode = min.get(); + } + if (ObjectUtil.isNotEmpty(sendCode)) { + // 延迟发送 + factoryByNodeAndStatus = NodeMappingEnums.getFactoryByNodeAndStatus(WorkNodeEnums.getByCode(sendCode)); + SendMsg sendMsg = SendMsg.builder() + .routingKey(FactoryDataConstants.Mq.RoutingKeys.LINSY_NODE_DATA_PUSH) + .exchange(FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH_DELAYED) + .message(msg) + .delay(linsyProperties.getDelayedTime() * 1000 * 60) + .build(); + log.info("补节点延时推送:{}", msg); + factoryDataClient.sendMessage(sendMsg); + } + // 推送工厂 + JSONObject sendObj = new JSONObject(); + sendObj.set("billCode", billCode); + sendObj.set("status", factoryByNodeAndStatus.getText()); + sendObj.set("packages", entities.stream().map(packageInfoEntity -> { + JSONObject jsonObject = new JSONObject(); + jsonObject.set("barcode", packageInfoEntity.getBarcode()); + return jsonObject; + }).collect(Collectors.toList())); + log.info("推送工厂:{}", JSONUtil.toJsonStr(sendObj)); + String url = linsyProperties.getHost() + linsyProperties.getPushNodeUrl(); + try { + if (linsyProperties.getEnable()) { + String result = HttpUtil.post(url, JSONUtil.toJsonStr(sendObj)); + log.info("推送工厂结果:{}", result); + // 保存推送记录 + factoryNodePushService.save(FactoryNodePushEntity.builder() + .billCode(orderCode) + .node(factoryByNodeAndStatus.getCode().toString()) + .content(JSONUtil.toJsonStr(sendObj)) + .resultContent(result) + .build()); + } + } catch (Exception e) { + log.error("推送工厂失败:{}", e); + } + } + // 封装需要修改作业节点状态的数据 + updateList.addAll(entities.stream() + .filter(data -> collect.contains(data.getBarcode())) + .map(packageInfoEntity -> { + PackageInfoEntity entity = new PackageInfoEntity(); + entity.setId(packageInfoEntity.getId()); + entity.setWorkedNodeCode(workNodeEnums.getCode()); + return entity; + }) + .collect(Collectors.toList())); + } + } + if (CollUtil.isNotEmpty(updateList)) { + packageInfoService.updateBatchById(updateList); + } + } + } + + private boolean checkData(String msg) { + if (StrUtil.isEmpty(msg)) { + return true; + } + if (!msg.contains("brand") || !msg.contains("content") || !msg.contains("node")) { + return true; + } + JSONObject entries = JSONUtil.parseObj(msg); + String node = entries.getStr("node"); + if (StrUtil.isEmpty(node)) { + return true; + } + // 不是志邦需要的节点数据直接不处理 + if (!EnumUtil.contains(NodeNeedEnums.class, node)) { + return true; + } + WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node); + if (ObjectUtil.isEmpty(workNodeEnums)) { + return true; + } + List content = entries.getBeanList("content", JSONObject.class); + if (CollUtil.isEmpty(content)) { + return true; + } + return false; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/pros/FactoryDataProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/pros/FactoryDataProperties.java new file mode 100644 index 000000000..e1f3f2c72 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/pros/FactoryDataProperties.java @@ -0,0 +1,20 @@ +package com.logpm.factorydata.linsy.pros; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * FactoryProperties + * + * @author pref + */ +@Data +@ConfigurationProperties(prefix = "logpm") +public class FactoryDataProperties { + /** + * 名称 + */ + private String name; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/pros/LinsyProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/pros/LinsyProperties.java new file mode 100644 index 000000000..93d9c9dd9 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/pros/LinsyProperties.java @@ -0,0 +1,55 @@ +package com.logpm.factorydata.linsy.pros; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * FactoryProperties + * + * @author pref + */ +@Data +@ConfigurationProperties(prefix = "linsy") +@Component +public class LinsyProperties { + + /** + * 林氏工厂推送节点数据url + */ + private String pushNodeUrl; + /** + * 是否推送工厂 + */ + private Boolean enable = true; + /** + * 林氏工厂主机地址 + */ + private String host; + /** + * 承运商编码 + */ + private String carrierCode; + + /** + * 补节点数据时的延时时间(分钟) + */ + private Integer delayedTime = 30; + + /** 生成老系统暂存单 */ + private Boolean oldAdvance = false; + + /** 生成新系统暂存单 */ + private Boolean newAdvance = false; + + /** 老系统host */ + private String oldSystemHost; + + /** 老系统暂存单url */ + private String oldSystemAdvanceUrl; + + /** 老系统取消暂存单url */ + private String oldSystemCancelAdvanceUrl; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/DeliveryNoteService.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/DeliveryNoteService.java new file mode 100644 index 000000000..8ecc09b0a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/DeliveryNoteService.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.linsy.service; + +import com.logpm.factorydata.linsy.entity.DeliveryNoteEntity; +import com.logpm.factorydata.linsy.vo.CancelOrderVO; +import com.logpm.factorydata.linsy.vo.DeliveryNoteVO; +import org.springblade.core.mp.base.BaseService; + +/** + * 索菲亚发货单 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface DeliveryNoteService extends BaseService { + + + void buildAdvance(DeliveryNoteVO entities); + + Boolean cancelOrder(CancelOrderVO vo); + + void buildOldAdvance(DeliveryNoteVO vo); +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/FactoryNodePushService.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/FactoryNodePushService.java new file mode 100644 index 000000000..38eb69ae7 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/FactoryNodePushService.java @@ -0,0 +1,15 @@ +package com.logpm.factorydata.linsy.service; + +import com.logpm.factorydata.linsy.entity.FactoryNodePushEntity; +import com.logpm.factorydata.linsy.entity.PackageInfoEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 推送工厂节点数据 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface FactoryNodePushService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/FactoryOrderLogService.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/FactoryOrderLogService.java new file mode 100644 index 000000000..864b296b0 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/FactoryOrderLogService.java @@ -0,0 +1,18 @@ +package com.logpm.factorydata.linsy.service; + +import com.logpm.factorydata.linsy.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.linsy.vo.CancelOrderVO; +import com.logpm.factorydata.linsy.vo.DeliveryNoteVO; +import org.springblade.core.mp.base.BaseService; + +/** + * 工厂订单日志 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface FactoryOrderLogService extends BaseService { + + String order(DeliveryNoteVO vo); + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/IFactoryTokenService.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/IFactoryTokenService.java new file mode 100644 index 000000000..0b72c7b77 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/IFactoryTokenService.java @@ -0,0 +1,15 @@ +package com.logpm.factorydata.linsy.service; + +import com.logpm.factory.snm.entity.FactoryToken; +import org.springblade.core.mp.base.BaseService; + +import java.security.NoSuchAlgorithmException; + +/** + * 工厂推送数据接口 + */ +public interface IFactoryTokenService extends BaseService { + + + boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException; +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/PackageInfoService.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/PackageInfoService.java new file mode 100644 index 000000000..e4c66673c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/PackageInfoService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.linsy.service; + +import com.logpm.factorydata.linsy.entity.PackageInfoEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 装箱包信息 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface PackageInfoService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/DeliveryNoteServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/DeliveryNoteServiceImpl.java new file mode 100644 index 000000000..2e99b21fc --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/DeliveryNoteServiceImpl.java @@ -0,0 +1,325 @@ +package com.logpm.factorydata.linsy.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.logpm.factorydata.base.feign.IFactoryDataBaseClient; +import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.linsy.entity.DeliveryNoteEntity; +import com.logpm.factorydata.linsy.mapper.DeliveryNoteMapper; +import com.logpm.factorydata.linsy.pros.LinsyProperties; +import com.logpm.factorydata.linsy.service.DeliveryNoteService; +import com.logpm.factorydata.linsy.vo.CancelOrderVO; +import com.logpm.factorydata.linsy.vo.DeliveryNoteVO; +import com.logpm.factorydata.linsy.vo.PackageInfoVO; +import com.logpm.factorydata.vo.SendMsg; +import com.logpm.trunkline.dto.CancelOrderParamVO; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import com.logpm.trunkline.feign.ITrunklineAdvanceClient; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.common.constant.HttpConstants; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.tool.api.R; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 发货单 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class DeliveryNoteServiceImpl extends BaseServiceImpl implements DeliveryNoteService { + + private final IFactoryDataBaseClient baseClient; + private final IFactoryDataClient factoryDataClient; + private final ITrunklineAdvanceClient advanceClient; + private final LinsyProperties linsyProperties; + + @Override + @LogpmAsync("asyncExecutor") + public void buildAdvance(DeliveryNoteVO vo) { + log.info("林氏新系统生成暂存单:{}", JSONUtil.toJsonStr(vo)); + // 新起线程构建暂存单发送mq + Long startWarehouseId = null; + String startWarehouseName = null; + String tenantId = null; + // 获取工厂基地绑定的始发仓信息 + R warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.LINSY.getValue(), vo.getSupplierName()); + if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) { + FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData(); + if (ObjectUtil.isNotNull(data)) { + startWarehouseId = data.getWarehouseId(); + startWarehouseName = data.getWarehouseName(); + tenantId = data.getTenantId(); + } + } + List packages = vo.getPackages(); + // 组装暂存单数据 + List advances = new ArrayList<>(); + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + advanceEntity.setHasPackage(CollUtil.isNotEmpty(packages) ? 1 : 0); + advanceEntity.setOrderType(""); + advanceEntity.setBrand(BrandEnums.LINSY.getValue()); + advanceEntity.setSiteName(vo.getSupplierName()); + advanceEntity.setArea(""); + advanceEntity.setTotalNum(CollUtil.isNotEmpty(packages) ? packages.size() : 0); + + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(startWarehouseId); + advanceEntity.setWarehouseName(startWarehouseName); + + advanceEntity.setIsGcp(0); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setPackName(""); + advanceEntity.setCarrierName("汇通"); + advanceEntity.setSenderName(""); + advanceEntity.setSenderPhone(""); + advanceEntity.setSenderAddress(""); + advanceEntity.setTrainNumber(StrUtil.replace(DateUtil.today(), "-", "")); + advanceEntity.setSenderFactory(BrandEnums.LINSY.getValue()); + // advanceEntity.setOrderCode(vo.getBillCode()); + advanceEntity.setOrderCode(vo.getCustomizedBillCode()); + advanceEntity.setDealerCode(""); + advanceEntity.setDealerName(vo.getShopName()); + advanceEntity.setStoreCode(""); + advanceEntity.setStoreName(vo.getShopName()); + advanceEntity.setServiceNum(vo.getCustomizedBillCode()); + advanceEntity.setCustomerName(vo.getReceiverName()); + advanceEntity.setCustomerPhone(vo.getReceiverTelephone()); + advanceEntity.setCustomerAddress(vo.getReceiverDetailAddress()); + advanceEntity.setSenderName(vo.getSenderName()); + advanceEntity.setSenderPhone(vo.getSenderTelephone()); + advanceEntity.setSenderAddress(vo.getSenderDetailAddress()); + List packageList = new ArrayList<>(); + for (PackageInfoVO orderPackageDTO : packages) { + // 封装包件 + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(startWarehouseId); + advanceDetailEntity.setWarehouseName(startWarehouseName); +// advanceDetailEntity.setIncomingWarehouseId(0L); +// advanceDetailEntity.setIncomingWarehouseName(""); + advanceDetailEntity.setOrderCode(vo.getCustomizedBillCode()); + advanceDetailEntity.setBrand(BrandEnums.LINSY.getValue()); + advanceDetailEntity.setSystemType("线上"); + advanceDetailEntity.setFirstPackName(orderPackageDTO.getMaterialCode()); + // 二级品类名称 + advanceDetailEntity.setSecondPackName(orderPackageDTO.getMaterialCode()); + // 三级品类名称 + advanceDetailEntity.setThirdPackName(orderPackageDTO.getMaterialCode()); + advanceDetailEntity.setMaterialName(orderPackageDTO.getMaterialName()); + advanceDetailEntity.setMaterialCode(orderPackageDTO.getMaterialCode()); + advanceDetailEntity.setSiteName(vo.getSupplierName()); + advanceDetailEntity.setSiteCode(""); + advanceDetailEntity.setQuantity(1); + advanceDetailEntity.setOrderPackageCode(orderPackageDTO.getBarcode()); + advanceDetailEntity.setTrainNumber(StrUtil.replace(DateUtil.today(), "-", "")); + advanceDetailEntity.setServiceNum(vo.getCustomizedBillCode()); +// advanceDetailEntity.setWaybillNo(""); + advanceDetailEntity.setPackageStatus("0"); + advanceDetailEntity.setWeight(StrUtil.isNotBlank(orderPackageDTO.getWeight()) ? new BigDecimal(orderPackageDTO.getWeight()) : BigDecimal.ZERO); + advanceDetailEntity.setVolume(StrUtil.isNotBlank(orderPackageDTO.getVolume()) ? new BigDecimal(orderPackageDTO.getVolume()) : BigDecimal.ZERO); +// advanceDetailEntity.setChargeType(0); + advanceDetailEntity.setSupple(""); + advanceDetailEntity.setManifest(""); + advanceDetailEntity.setReturnNum(""); + advanceDetailEntity.setSendDateStr(DateUtil.formatLocalDateTime(LocalDateTime.now())); + advanceDetailEntity.setCarNumber(""); + advanceDetailEntity.setGoodsMan(""); + advanceDetailEntity.setTenantId(tenantId); + advanceDetailEntity.setStatus(0); + advanceDetailEntity.setIsDeleted(0); + JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + packageList.add(entries); + } + // 转成json对象,然后将包件明细放到detail中 + JSONObject entries = JSONUtil.parseObj(advanceEntity); + entries.set("details", JSONUtil.toJsonStr(packageList)); + advances.add(entries); + // 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg. + if (CollUtil.isNotEmpty(advances)) { + for (JSONObject advance : advances) { + SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); + factoryDataClient.sendMessage(sendMsg); + } + } + } + + @Override + public Boolean cancelOrder(CancelOrderVO vo) { + log.info("工厂发起取消订单:{}", JSONUtil.toJsonStr(vo)); + CancelOrderParamVO param = new CancelOrderParamVO(); + param.setOrderCode(vo.getSourceCode()); + if (linsyProperties.getNewAdvance()) { + Boolean result = advanceClient.cancelOrder(param); + return result; + } + if (linsyProperties.getOldAdvance()) { + String post = HttpUtil.post(linsyProperties.getOldSystemHost() + linsyProperties.getOldSystemCancelAdvanceUrl(), JSONUtil.parseObj(param)); + if (StrUtil.isNotEmpty(post)) { + JSONObject entries = JSONUtil.parseObj(post); + if (ObjectUtil.equals(entries.getInt("code"), 200)) { + return true; + } + } + } + return false; + } + + @Override + @LogpmAsync("asyncExecutor") + public void buildOldAdvance(DeliveryNoteVO vo) { + log.info("林氏老系统生成暂存单:{}", JSONUtil.toJsonStr(vo)); + Long startWarehouseId = null; + String startWarehouseName = null; + // 获取工厂基地绑定的始发仓信息 + R warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.LINSY.getValue(), vo.getSupplierName()); + log.info("工厂基地绑定的始发仓信息:{}", JSONUtil.toJsonStr(warehouseByBrandAndSiteName)); + if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) { + FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData(); + if (ObjectUtil.isNotNull(data)) { + startWarehouseId = data.getOldWarehouseId(); + startWarehouseName = data.getOldWarehouseName(); + } + } + JSONObject advance = new JSONObject(); + List packages = vo.getPackages(); + // 组装暂存单数据 + advance.set("siteName", vo.getSupplierName()); + advance.set("area", ""); + advance.set("orderTypeName", ""); + advance.set("orderClassName", ""); + advance.set("type", BrandEnums.LINSY.getValue()); + advance.set("total", CollUtil.isNotEmpty(packages) ? packages.size() : 0); + advance.set("mtdsNo", ""); + advance.set("warehouse_id", startWarehouseId); + advance.set("mctsTruck", StrUtil.replace(DateUtil.today(), "-", "")); + // advance.set("orderSelfNum", vo.getBillCode()); + advance.set("orderSelfNum", vo.getCustomizedBillCode()); + advance.set("dealerName", vo.getShopName()); + advance.set("dealerCode", ""); + advance.set("storeName", vo.getShopName()); + advance.set("storeNo", ""); + advance.set("old_id", ""); + advance.set("serialKey", ""); + advance.set("dueDate", ""); + advance.set("delete_reason", ""); + advance.set("delete_administrators_id", ""); + advance.set("matingCode", ""); + advance.set("leaveBehind", "N"); + advance.set("contractNum", ""); + advance.set("orderNum", ""); + advance.set("waybill_no", ""); + advance.set("waybill_status", 1); + advance.set("freeze", 1); + advance.set("cars_num", ""); + advance.set("administrators_id", 1126); + advance.set("carrierName", "汇通"); + advance.set("systemType", "线上"); + advance.set("is_opai", 0); + advance.set("serviceNum", vo.getCustomizedBillCode()); + advance.set("customerName", vo.getReceiverName()); + advance.set("customerPhone", vo.getReceiverTelephone()); + advance.set("customerRoad", vo.getReceiverDetailAddress()); + advance.set("senderName", vo.getSenderName()); + advance.set("senderMobile", vo.getSenderTelephone()); + advance.set("senderAddress", vo.getSenderDetailAddress()); + advance.set("create_time", DateUtil.now()); + advance.set("update_time", DateUtil.now()); + + JSONArray packageList = new JSONArray(); + for (PackageInfoVO orderPackageDTO : packages) { + advance.set("firstPackName", "工件"); + // advance.set("firstPackCode", orderPackageDTO.getMaterialCode()); + // 封装包件 + JSONObject advanceDetailEntity = new JSONObject(); + // advanceDetailEntity.set("orderSelfNum", vo.getBillCode()); + advanceDetailEntity.set("orderSelfNum", vo.getCustomizedBillCode()); + advanceDetailEntity.set("serviceNum", vo.getCustomizedBillCode()); + advanceDetailEntity.set("type", BrandEnums.LINSY.getValue()); + advanceDetailEntity.set("systemType", "线上"); + // advanceDetailEntity.set("firstPackName", orderPackageDTO.getMaterialCode()); + // 二级品类名称 + // advanceDetailEntity.set("secondPackName", orderPackageDTO.getMaterialCode()); + // 三级品类名称 + // advanceDetailEntity.set("thirdPackName", orderPackageDTO.getMaterialCode()); + advanceDetailEntity.set("firstPackName", "工件"); + // 二级品类名称 + advanceDetailEntity.set("secondPackName", "工件"); + // 三级品类名称 + advanceDetailEntity.set("thirdPackName", "工件"); + // advanceDetailEntity.set("firstPackCode", orderPackageDTO.getMaterialCode()); + // advanceDetailEntity.set("secondPackCode", orderPackageDTO.getMaterialCode()); + // advanceDetailEntity.set("thirdPackCode", orderPackageDTO.getMaterialCode()); + advanceDetailEntity.set("siteName", vo.getSupplierName()); + advanceDetailEntity.set("unitNo", orderPackageDTO.getBarcode()); + advanceDetailEntity.set("mctsTruck", StrUtil.replace(DateUtil.today(), "-", "")); + advanceDetailEntity.set("volume", StrUtil.isNotBlank(orderPackageDTO.getVolume()) ? new BigDecimal(orderPackageDTO.getVolume()) : BigDecimal.ZERO); + advanceDetailEntity.set("is_pay", 0); + advanceDetailEntity.set("mtdsNum", 0); + advanceDetailEntity.set("lineID", ""); + advanceDetailEntity.set("mctsTruckNo", ""); + advanceDetailEntity.set("serialKey", ""); + advanceDetailEntity.set("mscsNum", "1"); + advanceDetailEntity.set("isAddin", "N"); + advanceDetailEntity.set("isThirdAddin", "N"); + advanceDetailEntity.set("isSuppin", "N"); + advanceDetailEntity.set("productCode", ""); + advanceDetailEntity.set("goodName", ""); + // advanceDetailEntity.set("admin", ""); + advanceDetailEntity.set("siteCode", ""); + advanceDetailEntity.set("area", ""); + advanceDetailEntity.set("date2", ""); + advanceDetailEntity.set("date3", ""); + advanceDetailEntity.set("date4", ""); + advanceDetailEntity.set("date5", ""); + advanceDetailEntity.set("date6", ""); + advanceDetailEntity.set("orderNum", ""); + advanceDetailEntity.set("mtdsNo", ""); + advanceDetailEntity.set("old_id", 0); + // advanceDetailEntity.set("remark", ""); + // advanceDetailEntity.set("dueDate", null); + advanceDetailEntity.set("is_opai", 0); + advanceDetailEntity.set("administrators_id", 1126); + advanceDetailEntity.set("date100", new Date()); + advanceDetailEntity.set("create_time", DateUtil.now()); + advanceDetailEntity.set("update_time", DateUtil.now()); + JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + packageList.add(entries); + } + advance.set("details", packageList); + if (ObjectUtil.isAllNotEmpty(linsyProperties.getOldSystemHost(), linsyProperties.getOldSystemAdvanceUrl())) { + log.info("推送老系统暂存单:{}", JSONUtil.toJsonStr(advance)); + String post = HttpUtil.post(linsyProperties.getOldSystemHost() + linsyProperties.getOldSystemAdvanceUrl(), JSONUtil.toJsonStr(advance)); + log.info("推送老系统暂存单结果:{}", post); + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/FactoryNodePushServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/FactoryNodePushServiceImpl.java new file mode 100644 index 000000000..4b287ff01 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/FactoryNodePushServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.linsy.service.impl; + +import com.logpm.factorydata.linsy.entity.FactoryNodePushEntity; +import com.logpm.factorydata.linsy.mapper.FactoryNodePushMapper; +import com.logpm.factorydata.linsy.service.FactoryNodePushService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 装箱包信息 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class FactoryNodePushServiceImpl extends BaseServiceImpl implements FactoryNodePushService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/FactoryOrderLogServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/FactoryOrderLogServiceImpl.java new file mode 100644 index 000000000..c96ae76d8 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/FactoryOrderLogServiceImpl.java @@ -0,0 +1,110 @@ +package com.logpm.factorydata.linsy.service.impl; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.logpm.factorydata.enums.SaxStatusEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.linsy.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.linsy.mapper.FactoryOrderLogMapper; +import com.logpm.factorydata.linsy.service.FactoryOrderLogService; +import com.logpm.factorydata.linsy.vo.CancelOrderVO; +import com.logpm.factorydata.linsy.vo.DeliveryNoteVO; +import com.logpm.factorydata.vo.SendMsg; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.io.IOUtils; +import org.jetbrains.annotations.NotNull; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.common.utils.FileLogsUtil; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.oss.model.BladeFile; +import org.springblade.core.tool.api.R; +import org.springblade.resource.feign.IOssClient; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; + +/** + * 工厂订单日志 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class FactoryOrderLogServiceImpl extends BaseServiceImpl implements FactoryOrderLogService { + + private final IFactoryDataClient factoryDataClient; + private final IOssClient ossClient; + + @Override + public String order(DeliveryNoteVO vo) { + + // 1 上传数据到 minio 获取到地址 + String url = uploadFile(JSONUtil.toJsonStr(vo)); + // 2 保存地址到数据库 + FactoryOrderLogEntity logEntity = new FactoryOrderLogEntity(); + logEntity.setType(1); + logEntity.setSaxStatus(SaxStatusEnums.NOMAL.getCode()); + logEntity.setLogUrl(url); + this.save(logEntity); + + // 3 将消息发送给 mq,解析保存 + SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.LINSY_FACTORY_ORDER) + .message(JSONUtil.toJsonStr(logEntity)).build(); + factoryDataClient.sendMessage(build); + return "成功"; + } + + private String uploadFile(String body) { + //文本内容和保存为本地文件 并上传 + String logPath = FileLogsUtil.saveFileLogs(body); + log.info(">>> 文件路径 {}", logPath); + + MultipartFile multi = getMultipartFile(logPath); + //上传到服务器 + R r = ossClient.fileUpload(multi, "linsy-order-logs"); + if (r.isSuccess()) { + BladeFile data = (BladeFile) r.getData(); + // 删除本地文件 + FileUtil.del(logPath); + return data.getLink(); + } + return null; + } + + @NotNull + private MultipartFile getMultipartFile(String logPath) { + File file = new File(logPath); + + // File 转 MultipartFile + FileItem item = new DiskFileItemFactory().createItem("file" + , MediaType.MULTIPART_FORM_DATA_VALUE + , true + , file.getName()); + try ( + InputStream input = Files.newInputStream(file.toPath()); + OutputStream os = item.getOutputStream()) { + // 流转移 + IOUtils.copy(input, os); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid file: " + e, e); + } + + return new CommonsMultipartFile(item); + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/FactoryTokenServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/FactoryTokenServiceImpl.java new file mode 100644 index 000000000..851c8302e --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/FactoryTokenServiceImpl.java @@ -0,0 +1,64 @@ +package com.logpm.factorydata.linsy.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.factory.snm.entity.FactoryToken; +import com.logpm.factorydata.linsy.mapper.FactoryTokenMapper; +import com.logpm.factorydata.linsy.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.redis.cache.BladeRedis; +import org.springframework.stereotype.Service; + +import java.security.NoSuchAlgorithmException; +import java.util.Objects; + +@AllArgsConstructor +@Service +public class FactoryTokenServiceImpl extends BaseServiceImpl implements IFactoryTokenService { + + private static final Logger logger = LoggerFactory.getLogger(FactoryTokenServiceImpl.class); + + private final BladeRedis bladeRedis; + + @Override + public boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException { + logger.info("#########verifyToken: 验证token开始"); + //先生成token摘要 +// String tokenAbst = MD5Utils.md5Hex(token.getBytes(StandardCharsets.UTF_8)); + + //编写查询条件 + String key = "corpId:" + corpId; + FactoryToken factoryToken = bladeRedis.get(key); + + if (Objects.isNull(factoryToken)) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("token", token); + // TODO 由factory提供一个feign接口获取 + return false; +// factoryToken = baseMapper.selectOne(queryWrapper); + } + + + if (Objects.isNull(factoryToken)) { + logger.error("#########verifyToken: token1验证不通过 token={},corpid={}", token, corpId); + return false; + } + logger.info("#########verifyToken: 验证token 传入token {} 验证token {}", token, factoryToken.getToken()); + if (!factoryToken.getToken().equals(token)) { + logger.error("#########verifyToken: token2验证不通过 token={},corpid={}", token, corpId); + return false; + } + + + Long expireTimeLong = factoryToken.getExpireTime().getTime(); + Long now = System.currentTimeMillis(); + //判断是否过期 + if (now > expireTimeLong) { + logger.error("#########verifyToken: token验证不通过 已过期 token={},corpId={}", token, corpId); + return false; + } + return true; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/PackageInfoServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/PackageInfoServiceImpl.java new file mode 100644 index 000000000..05f0d63d8 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/service/impl/PackageInfoServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.linsy.service.impl; + +import com.logpm.factorydata.linsy.entity.PackageInfoEntity; +import com.logpm.factorydata.linsy.mapper.PackageInfoMapper; +import com.logpm.factorydata.linsy.service.PackageInfoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 装箱包信息 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class PackageInfoServiceImpl extends BaseServiceImpl implements PackageInfoService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/vo/CancelOrderVO.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/vo/CancelOrderVO.java new file mode 100644 index 000000000..48d9c8d9a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/vo/CancelOrderVO.java @@ -0,0 +1,24 @@ +package com.logpm.factorydata.linsy.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + +/** + * 取消订单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "取消订单", description = "取消订单") +public class CancelOrderVO implements Serializable { + + @ApiModelProperty("订单编号") + @NotEmpty(message = "订单编号不能为空") + private String sourceCode; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/vo/DeliveryNoteVO.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/vo/DeliveryNoteVO.java new file mode 100644 index 000000000..82e066525 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/vo/DeliveryNoteVO.java @@ -0,0 +1,24 @@ +package com.logpm.factorydata.linsy.vo; + +import com.logpm.factorydata.linsy.entity.DeliveryNoteEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 送货单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "林氏发运信息", description = "林氏发运信息") +public class DeliveryNoteVO extends DeliveryNoteEntity { + + @ApiModelProperty("包件列表") + private List packages; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/vo/PackageInfoVO.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/vo/PackageInfoVO.java new file mode 100644 index 000000000..e50f4b219 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/vo/PackageInfoVO.java @@ -0,0 +1,18 @@ +package com.logpm.factorydata.linsy.vo; + +import com.logpm.factorydata.linsy.entity.PackageInfoEntity; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 装箱包信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "装箱包信息", description = "装箱包信息") +@EqualsAndHashCode(callSuper = true) +public class PackageInfoVO extends PackageInfoEntity { +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/wrapper/CustomHttpServletRequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/wrapper/CustomHttpServletRequestWrapper.java new file mode 100644 index 000000000..131e5ad50 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/wrapper/CustomHttpServletRequestWrapper.java @@ -0,0 +1,38 @@ +package com.logpm.factorydata.linsy.wrapper; + +import org.springframework.http.HttpHeaders; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper { + + private final HttpHeaders headers; + + public CustomHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + headers = new HttpHeaders(); + } + + @Override + public String getHeader(String name) { + String headerValue = headers.getFirst(name); + return headerValue != null ? headerValue : super.getHeader(name); + } + + @Override + public Enumeration getHeaderNames() { + List names = Collections.list(super.getHeaderNames()); + headers.forEach((key, value) -> names.add(key)); + return Collections.enumeration(names); + } + + // 其他需要覆盖的方法... + + public void addHeader(String name, String value) { + headers.add(name, value); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/wrapper/RequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/wrapper/RequestWrapper.java new file mode 100644 index 000000000..261d6bbf3 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/java/com/logpm/factorydata/linsy/wrapper/RequestWrapper.java @@ -0,0 +1,75 @@ +package com.logpm.factorydata.linsy.wrapper; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class RequestWrapper extends HttpServletRequestWrapper { + private final String body; + public RequestWrapper(HttpServletRequest request) throws IOException { + super(request); + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } catch (IOException ex) { + throw ex; + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException ex) { + throw ex; + } + } + } + body = stringBuilder.toString(); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); + ServletInputStream servletInputStream = new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + @Override + public boolean isReady() { + return false; + } + @Override + public void setReadListener(ReadListener readListener) {} + @Override + public int read() throws IOException { + return byteArrayInputStream.read(); + } + }; + return servletInputStream; + + } + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } + public String getBody() { + return this.body; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application-dev.yml b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application-dev.yml new file mode 100644 index 000000000..d27167512 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application-dev.yml @@ -0,0 +1,73 @@ +#服务器端口 +server: + port: 18950 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.46 + port: 5672 + username: admin + password: admin + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-linsy.master.url} + username: ${blade.datasource.factorydata-linsy.master.username} + password: ${blade.datasource.factorydata-linsy.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-linsy.627683.url} + username: ${blade.datasource.factorydata-linsy.627683.username} + password: ${blade.datasource.factorydata-linsy.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application-prod.yml b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application-prod.yml new file mode 100644 index 000000000..28d6724a2 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application-prod.yml @@ -0,0 +1,47 @@ +#服务器端口 +server: + port: 18950 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-linsy.master.url} + username: ${blade.datasource.factorydata-linsy.master.username} + password: ${blade.datasource.factorydata-linsy.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-linsy.627683.url} + username: ${blade.datasource.factorydata-linsy.627683.username} + password: ${blade.datasource.factorydata-linsy.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application-test.yml b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application-test.yml new file mode 100644 index 000000000..b781b45f0 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application-test.yml @@ -0,0 +1,73 @@ +#服务器端口 +server: + port: 18950 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.110 + port: 5672 + username: admin + password: Slwk@123654 + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-linsy.master.url} + username: ${blade.datasource.factorydata-linsy.master.username} + password: ${blade.datasource.factorydata-linsy.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-linsy.627683.url} + username: ${blade.datasource.factorydata-linsy.627683.username} + password: ${blade.datasource.factorydata-linsy.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application.yml b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application.yml new file mode 100644 index 000000000..ca8dc27d5 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/application.yml @@ -0,0 +1,19 @@ +#mybatis-plus配置 +mybatis-plus: + mapper-locations: classpath:com/logpm/**/mapper/*Mapper.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.logpm.**.entity + +#swagger扫描路径配置 +swagger: + base-packages: + - org.springblade + - com.logpm + +logging: + config: classpath:logback.xml + +spring: + main: + allow-circular-references: true + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/logback.xml b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/logback.xml new file mode 100644 index 000000000..7170050de --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-linsy/src/main/resources/logback.xml @@ -0,0 +1,40 @@ + + + + logback + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf8 + + + + + ${log.path} + + ${log.path}.%d{yyyy-MM-dd}.zip + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/Dockerfile b/blade-service/logpm-factory-data/logpm-factory-data-mwh/Dockerfile new file mode 100644 index 000000000..7fbdbd4d9 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/Dockerfile @@ -0,0 +1,14 @@ +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 + +MAINTAINER h5u@163.com + +RUN mkdir -p /logpm/logpm-factory-data-mwh + +WORKDIR /logpm/logpm-factory-data-mwh + +EXPOSE 18960 + +ADD ./target/logpm-factory-data-mwh.jar ./app.jar + +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","-Xms128m","-Xmx512m", "app.jar"] +CMD ["--spring.profiles.active=test"] diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/pom.xml b/blade-service/logpm-factory-data/logpm-factory-data-mwh/pom.xml new file mode 100644 index 000000000..0fb69a30d --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/pom.xml @@ -0,0 +1,93 @@ + +logpm-factory-dataorg.springblade3.2.0.RELEASE + 4.0.0 + + com.logpm + logpm-factory-data-mwh + + + 8 + 8 + + + + + org.springblade + blade-core-boot + + + org.springblade + blade-core-auto + provided + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springblade + logpm-factory-data-api + 3.2.0.RELEASE + + + com.xuxueli + xxl-job-core + + + org.springblade + blade-starter-swagger + + + org.springblade + logpm-trunkline-api + 3.2.0.RELEASE + + + org.springblade + logpm-factory-data-base-api + ${bladex.project.version} + + + org.springblade + blade-starter-oss + + + io.minio + minio + + + org.springblade + blade-resource-api + 3.2.0.RELEASE + compile + + + + + + + + com.spotify + dockerfile-maven-plugin + + ${docker.username} + ${docker.password} + ${docker.registry.url}/${docker.namespace}/${project.artifactId} + ${project.version} + true + + target/${project.build.finalName}.jar + + false + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/FactoryDataMwhApplication.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/FactoryDataMwhApplication.java new file mode 100644 index 000000000..0ab563648 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/FactoryDataMwhApplication.java @@ -0,0 +1,20 @@ +package com.logpm.factorydata; + +import org.springblade.common.constant.ModuleNameConstant; +import org.springblade.core.cloud.client.BladeCloudApplication; +import org.springblade.core.launch.BladeApplication; + +/** + * 曼好家工厂数据启动类 + * + * @author zhaoqiaobo + * @create 2024-4-26 + */ +@BladeCloudApplication +public class FactoryDataMwhApplication { + + public static void main(String[] args) { + BladeApplication.run(ModuleNameConstant.LOGPM_FACTORY_DATA_MWH_NAME, FactoryDataMwhApplication.class, args); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..9a0ce607f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.factorydata.mwh.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..5665cfcf1 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.factorydata.mwh.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/CustomMessageConverter.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/CustomMessageConverter.java new file mode 100644 index 000000000..85cc02203 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/CustomMessageConverter.java @@ -0,0 +1,161 @@ +package com.logpm.factorydata.mwh.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength((long) bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/ExecutorConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/ExecutorConfig.java new file mode 100644 index 000000000..f86167a59 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/ExecutorConfig.java @@ -0,0 +1,79 @@ +package com.logpm.factorydata.mwh.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.http.HttpHeaders; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + ThreadLocalUtil.put("bladeContext", headers); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/FactoryDataConfiguration.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/FactoryDataConfiguration.java new file mode 100644 index 000000000..bcef62fc1 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/FactoryDataConfiguration.java @@ -0,0 +1,40 @@ +/* + * 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.mwh.config; + + +import com.logpm.factorydata.mwh.pros.FactoryDataProperties; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 配置feign、mybatis包名、properties + * + * @author chaos + */ +@Configuration(proxyBeanMethods = false) +@ComponentScan({"org.springblade", "com.logpm"}) +@EnableFeignClients({"org.springblade", "com.logpm"}) +@MapperScan({"org.springblade.**.mapper.**", "com.logpm.**.mapper.**"}) +@EnableConfigurationProperties(FactoryDataProperties.class) +public class FactoryDataConfiguration { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/InterceptorAdapterConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/InterceptorAdapterConfig.java new file mode 100644 index 000000000..5c06f431f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/InterceptorAdapterConfig.java @@ -0,0 +1,35 @@ +package com.logpm.factorydata.mwh.config; + +import com.logpm.factorydata.mwh.interceptor.FactoryAccountsInterceptor; +import com.logpm.factorydata.mwh.interceptor.LocalServerLoginAccountsInterceptor; +import com.logpm.factorydata.mwh.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.springblade.common.component.MockLoginService; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@AllArgsConstructor +public class InterceptorAdapterConfig implements WebMvcConfigurer { + + private final IFactoryTokenService factoryTokenService; + + private final BladeRedis redis; + + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + + @Override + public void addInterceptors(InterceptorRegistry interceptorRegistry) { +// interceptorRegistry.addInterceptor(new FactoryAccountsInterceptor(factoryTokenService)) +// .addPathPatterns("/**").order(1); + interceptorRegistry.addInterceptor(new LocalServerLoginAccountsInterceptor(redis, environment,redisLockClient,mockLoginService)) + .addPathPatterns("/**").order(2); + + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/RabbitConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/RabbitConfig.java new file mode 100644 index 000000000..b2c92f408 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/config/RabbitConfig.java @@ -0,0 +1,17 @@ +package com.logpm.factorydata.mwh.config; + +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory factory, CustomMessageConverter converter) { + RabbitTemplate template = new RabbitTemplate(factory); + template.setMessageConverter(converter); + return template; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/controller/OrderController.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/controller/OrderController.java new file mode 100644 index 000000000..c2a82e8de --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/controller/OrderController.java @@ -0,0 +1,53 @@ +package com.logpm.factorydata.mwh.controller; + +import cn.hutool.json.JSONUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.factorydata.mwh.service.FactoryOrderLogService; +import com.logpm.factorydata.mwh.vo.DeliveryNoteVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +/** + * 工厂订单 前端控制器 + * + * @author zhaoqiaobo + * @create 2024-03-21 19:27 + */ +@Slf4j +@RestController +@RequestMapping("/factory/order/v1") +@AllArgsConstructor +@Api(value = "工厂订单", tags = "工厂订单") +public class OrderController { + + private final FactoryOrderLogService service; + + @ResponseBody + @PostMapping + @ApiOperationSupport(order = 1) + @ApiOperation(value = "工厂订单", notes = "工厂订单") + public R order(@RequestBody DeliveryNoteVO vo) { + log.info("接收工厂订单:{} ", JSONUtil.toJsonStr(vo)); + String res = ""; + try { + res = service.order(vo); + } catch (Exception e) { + log.error("工厂订单异常:{} ", e); + return R.success("服务器异常"); + } + return R.success(res); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/DeliveryNoteEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/DeliveryNoteEntity.java new file mode 100644 index 000000000..6131bee2a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/DeliveryNoteEntity.java @@ -0,0 +1,169 @@ +package com.logpm.factorydata.mwh.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 送货单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("mwh_delivery_note") +@EqualsAndHashCode(callSuper = true) +public class DeliveryNoteEntity extends BaseEntity { + + @ApiModelProperty("日志id") + private String logId; + + /** + * 客户编码 + */ + private String storeCode; + /** + * 客户编码 + */ + private String storeName; + /** + * 客户编码 + */ + private String userId; + /** + * 客户名称 + */ + private String userName; + /** + * 订单来源编码 + */ + private String sources; + /** + * 订单来源名称 + */ + private String sourceName; + /** + * 公司编码 + */ + private String companyCode; + /** + * 公司名称 + */ + private String companyName; + /** + * 服务平台编码 + */ + private String siteCode; + /** + * 服务平台编码 + */ + private String siteName; + /** + * 交割单号/服务号 + */ + private String orderNo; + /** + * 订单号 + */ + private String orderSelfNum; + /** + * 计划总数量 + */ + private String totalQuantity; + /** + * 计划总数量 + */ + private String totalWeight; + /** + * 计划总体积 + */ + private String totalCapacity; + /** + * 订单类型编码 + */ + private String orderType; + /** + * 订单类型名称 + */ + private String orderTypeName; + /** + * 服务类型编码 + */ + private String serviceType; + /** + * 服务类型名称 + */ + private String serviceTypeName; + /** + * 详细地址 + */ + private String senderAddress; + /** + * 发货人城市 + */ + private String senderCity; + /** + * 发货人联系方式 + */ + private String senderMobile; + /** + * 发货工厂名称 + */ + private String senderName; + /** + * 发货人省份 + */ + private String senderProvince; + /** + * 发货人区县 + */ + private String senderArea; + /** + * 收货人详细地址 + */ + private String receiverAddress; + /** + * 收货人区县 + */ + private String receiverArea; + /** + * 收货人城市 + */ + private String receiverCity; + /** + * 收货人联系方式 + */ + private String receiverMobile; + /** + * 加盟商 + */ + private String receiverName; + /** + * 收货人 + */ + private String consigneeName; + /** + * 收货人省份 + */ + private String receiverProvince; + /** + * 业务实体 + */ + private String remark1; + + @ApiModelProperty(value = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(value = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(value = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(value = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(value = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/FactoryOrderLogEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/FactoryOrderLogEntity.java new file mode 100644 index 000000000..543c97da5 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/FactoryOrderLogEntity.java @@ -0,0 +1,58 @@ +package com.logpm.factorydata.mwh.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +@Data +@TableName("mwh_factory_log") +@ApiModel(value = "接收工厂订单日志", description = "接收工厂订单日志") +@EqualsAndHashCode(callSuper = true) +public class FactoryOrderLogEntity 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 logUrl; + /** + * 数据类型 1.入库数据 + */ + @ApiModelProperty(name = "数据类型 1.入库数据", notes = "") + private Integer type; + /** + * 解析状态 0 未解析 1 解析失败 2 已解析 + */ + @ApiModelProperty(name = "解析状态 0 未解析 1 解析失败 2 已解析", notes = "") + private Integer saxStatus; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/FactoryToken.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/FactoryToken.java new file mode 100644 index 000000000..6b1d182f7 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/FactoryToken.java @@ -0,0 +1,32 @@ +package com.logpm.factorydata.mwh.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springblade.core.mp.base.BaseEntity; + +import java.util.Date; + +@Data +@TableName("factory_token") +@ApiModel(value = "FactoryToken对象", description = "工厂账户token") +public class FactoryToken extends BaseEntity { + + @ApiModelProperty("token") + private String token; + + @ApiModelProperty("token摘要") + private String tokenAbst; + + @JsonFormat( + pattern = "yyyy-MM-dd HH:mm:ss" + ) + @ApiModelProperty("过期时间") + private Date expireTime; + + @ApiModelProperty("企业id") + private String corpid; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/PackageInfoEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/PackageInfoEntity.java new file mode 100644 index 000000000..8f76783a0 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/entity/PackageInfoEntity.java @@ -0,0 +1,64 @@ +package com.logpm.factorydata.mwh.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 装箱包信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("mwh_package_info") +@ApiModel(value = "包件信息", description = "包件信息") +@EqualsAndHashCode(callSuper = true) +public class PackageInfoEntity extends BaseEntity { + + @ApiModelProperty(value = "日志id") + private String logId; + @ApiModelProperty(value = "发货单id") + private String deliveryNoteId; + + /** + * 批次/色号:订单编号 + */ + private String color; + /** + * 商品状态:默认为Y -良品 + */ + private String skuStatus; + /** + * 客户编码 + */ + private String storeCode; + /** + * 客户简称 + */ + private String storeName; + /** + * 包件编码 + */ + private String code; + /** + * 包件名称 + */ + private String name; + + @ApiModelProperty(value = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(value = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(value = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(value = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(value = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/FactoryNodeEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/FactoryNodeEnums.java new file mode 100644 index 000000000..dcd273926 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/FactoryNodeEnums.java @@ -0,0 +1,28 @@ +package com.logpm.factorydata.mwh.enums; + +import lombok.Getter; +import org.springblade.common.model.IDict; + +/** + * 工厂节点枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum FactoryNodeEnums implements IDict { + + /** + * 已交接 + */ + INITIAL_WAREHOUSE_ENTRY(20, "Deliveried"), + /** + * 收货完成 + */ + END_WAREHOUSE_UNLOADING(170, "Received"); + + FactoryNodeEnums(Integer code, String text) { + init(code, text); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeMappingEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeMappingEnums.java new file mode 100644 index 000000000..88c6eadff --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeMappingEnums.java @@ -0,0 +1,62 @@ +package com.logpm.factorydata.mwh.enums; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Getter; +import org.springblade.common.constant.WorkNodeEnums; + +/** + * 系统和工厂节点映射枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum NodeMappingEnums { + + /** + * 已交接 + */ + INITIAL_WAREHOUSE_ENTRY(FactoryNodeEnums.INITIAL_WAREHOUSE_ENTRY, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY, 1), + /** + * 收货完成 + */ + END_WAREHOUSE_UNLOADING(FactoryNodeEnums.END_WAREHOUSE_UNLOADING, WorkNodeEnums.END_WAREHOUSE_UNLOADING, 1); + + /** + * 系统作业节点 + */ + private WorkNodeEnums workNodeEnums; + /** + * 工厂作业节点 + */ + private FactoryNodeEnums factoryNodeEnums; + /** + * 状态码 + * 存在我们系统同一个作业节点对应工厂多个节点的情况,通过状态码区分 + */ + private Integer status; + + NodeMappingEnums(FactoryNodeEnums factoryNodeEnums, WorkNodeEnums workNodeEnums, Integer status) { + this.workNodeEnums = workNodeEnums; + this.factoryNodeEnums = factoryNodeEnums; + this.status = status; + } + + public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums) { + return getFactoryByNodeAndStatus(workNodeEnums, 1); + } + + public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums, Integer status) { + NodeMappingEnums[] values = values(); + for (NodeMappingEnums value : values) { + WorkNodeEnums workNodeEnums1 = value.getWorkNodeEnums(); + Integer status1 = value.getStatus(); + FactoryNodeEnums factoryNodeEnums = value.getFactoryNodeEnums(); + if (ObjectUtil.equal(workNodeEnums1, workNodeEnums) && ObjectUtil.equal(status1, status)) { + return factoryNodeEnums; + } + } + return null; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeNeedEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeNeedEnums.java new file mode 100644 index 000000000..5f05d68b8 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeNeedEnums.java @@ -0,0 +1,34 @@ +package com.logpm.factorydata.mwh.enums; + +import lombok.Getter; + +import java.io.Serializable; + +/** + * 作业节点枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum NodeNeedEnums implements Serializable { + + /** + * 始发仓入库 + */ + INITIAL_WAREHOUSE_ENTRY(20, "始发仓入库"), + /** + * 末端仓卸车确认 + */ + END_WAREHOUSE_UNLOADING(170, "末端仓卸车确认"), + ; + + private Integer code; + private String value; + + NodeNeedEnums(Integer code, String value) { + this.code = code; + this.value = value; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/interceptor/FactoryAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/interceptor/FactoryAccountsInterceptor.java new file mode 100644 index 000000000..25cf39a0c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/interceptor/FactoryAccountsInterceptor.java @@ -0,0 +1,87 @@ +package com.logpm.factorydata.mwh.interceptor; + +import com.alibaba.fastjson.JSONObject; +import com.logpm.factorydata.mwh.service.IFactoryTokenService; +import com.logpm.factorydata.mwh.wrapper.RequestWrapper; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +@Log4j2 +@AllArgsConstructor +public class FactoryAccountsInterceptor implements HandlerInterceptor { + + private final IFactoryTokenService factoryTokenService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + try { + + RequestWrapper myRequestWrapper = new RequestWrapper(request); + String body = myRequestWrapper.getBody(); + JSONObject jsonObject = JSONObject.parseObject(body); + //获取头中参数 + String token = request.getHeader("Authorization"); + String corpId = request.getHeader("corpid"); + if(StringUtil.isBlank(corpId)){ + corpId = jsonObject.getString("corpid"); + } + if(!StringUtil.hasLength(token)){ + returnJson(response,JSONObject.toJSONString(R.fail(401,"认证不通过,token有误"))); + return false; + } + if(!StringUtil.hasLength(corpId)){ + returnJson(response,JSONObject.toJSONString(R.fail(401,"认证不通过,corpId有误"))); + return false; + } + + log.info("##########preHandle: token={}",token); + //验证token + boolean b = factoryTokenService.verifyToken(token,corpId); + if(!b){ + returnJson(response,JSONObject.toJSONString(R.fail(401,"认证不通过,token不存在或已过期"))); + return false; + } + return true; + } catch (Exception e) { + returnJson(response,JSONObject.toJSONString(R.fail(500,"服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null){ + writer.close(); + } + } + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/interceptor/LocalServerLoginAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/interceptor/LocalServerLoginAccountsInterceptor.java new file mode 100644 index 000000000..f1c0d7eb1 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/interceptor/LocalServerLoginAccountsInterceptor.java @@ -0,0 +1,101 @@ +package com.logpm.factorydata.mwh.interceptor; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.common.exception.CustomerException; +import org.springblade.common.wrapper.CustomHttpServletRequestWrapper; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Log4j2 +@AllArgsConstructor +public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapter { + + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + + + try { + org.springblade.common.wrapper.CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(request); + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + + // 修改或添加header + + // 发送登录请求 + log.info("##########preHandle: request={}", request); + + wrappedRequest.addHeader("Blade-Auth", "bearer "+data.getString("access_token")); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + + // 用包装后的request替换原始request + request = wrappedRequest; + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + return true; + } catch (Exception e) { + returnJson(response, JSONObject.toJSONString(R.fail(500, "服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/launcher/FactoryDataBaseLauncherServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/launcher/FactoryDataBaseLauncherServiceImpl.java new file mode 100644 index 000000000..d8c21fa2b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/launcher/FactoryDataBaseLauncherServiceImpl.java @@ -0,0 +1,60 @@ +/* + * 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.mwh.launcher; + +import org.springblade.core.auto.service.AutoService; +import org.springblade.core.launch.constant.NacosConstant; +import org.springblade.core.launch.service.LauncherService; +import org.springblade.core.launch.utils.PropsUtil; +import org.springframework.boot.builder.SpringApplicationBuilder; + +import java.util.Properties; + +/** + * 启动参数拓展 + * + * @author Chill + */ +@AutoService(LauncherService.class) +public class FactoryDataBaseLauncherServiceImpl implements LauncherService { + + @Override + public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) { + Properties props = System.getProperties(); + // 开启多数据源 + PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true"); + // 指定注册配置信息 + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].data-id", NacosConstant.dataId(appName, profile)); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].group", NacosConstant.NACOS_CONFIG_GROUP); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].refresh", NacosConstant.NACOS_CONFIG_REFRESH); + // 指定注册IP + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.ip", "127.0.0.1"); + // 指定注册端口 + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.port", "8200"); + // 自定义命名空间 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.NACOS_NAMESPACE); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.NACOS_NAMESPACE); + // 自定义分组 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.group", NacosConstant.NACOS_CONFIG_GROUP); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.group", NacosConstant.NACOS_CONFIG_GROUP); + } + + @Override + public int getOrder() { + return 20; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/DeliveryNoteMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/DeliveryNoteMapper.java new file mode 100644 index 000000000..e1b7cc375 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/DeliveryNoteMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.mwh.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.mwh.entity.DeliveryNoteEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 发货单 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface DeliveryNoteMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryNodeOrderMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryNodeOrderMapper.xml new file mode 100644 index 000000000..95da00624 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryNodeOrderMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryOrderLogMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryOrderLogMapper.java new file mode 100644 index 000000000..842e1adf5 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryOrderLogMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.mwh.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.mwh.entity.FactoryOrderLogEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 工厂订单日志 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface FactoryOrderLogMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryOrderLogMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryOrderLogMapper.xml new file mode 100644 index 000000000..0952aa91f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryOrderLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryTokenMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryTokenMapper.java new file mode 100644 index 000000000..ed14ffd59 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryTokenMapper.java @@ -0,0 +1,31 @@ +/* + * 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.mwh.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.mwh.entity.FactoryToken; + +/** + * 工厂账号接口日志 Mapper 接口 + * + * @author zhy + * @since 2023-03-28 + */ +public interface FactoryTokenMapper extends BaseMapper { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryTokenMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryTokenMapper.xml new file mode 100644 index 000000000..879126a95 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/FactoryTokenMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/PackageInfoMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/PackageInfoMapper.java new file mode 100644 index 000000000..3e79ee325 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/PackageInfoMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.mwh.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.mwh.entity.PackageInfoEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 装箱包信息 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface PackageInfoMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/PackageInfoMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/PackageInfoMapper.xml new file mode 100644 index 000000000..f818f1909 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mapper/PackageInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mq/FactoryOrderListener.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mq/FactoryOrderListener.java new file mode 100644 index 000000000..fb4bc181c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mq/FactoryOrderListener.java @@ -0,0 +1,143 @@ +package com.logpm.factorydata.mwh.mq; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONConfig; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.factorydata.enums.SaxStatusEnums; +import com.logpm.factorydata.mwh.entity.DeliveryNoteEntity; +import com.logpm.factorydata.mwh.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.mwh.entity.PackageInfoEntity; +import com.logpm.factorydata.mwh.service.DeliveryNoteService; +import com.logpm.factorydata.mwh.service.FactoryOrderLogService; +import com.logpm.factorydata.mwh.service.PackageInfoService; +import com.logpm.factorydata.mwh.vo.DeliveryNoteVO; +import com.logpm.factorydata.mwh.vo.PackageInfoVO; +import com.logpm.factorydata.mwh.vo.ReceiverVO; +import com.logpm.factorydata.mwh.vo.SenderVO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 监听订单数据 + * + * @author zhaoqiaobo + * @create 2024-03-18 + */ +@Slf4j +@Component +@AllArgsConstructor +public class FactoryOrderListener { + + private final DeliveryNoteService deliveryNoteService; + private final FactoryOrderLogService logService; + private final PackageInfoService packageInfoService; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.MWH_FACTORY_ORDER), + exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER, type = ExchangeTypes.TOPIC), + key = FactoryDataConstants.Mq.RoutingKeys.MWH_FACTORY_ORDER + )) + @Transactional(rollbackFor = Exception.class) + public void factoryOrder(String msg) { + log.info("处理曼好家订单:{}", msg); + if (StrUtil.isEmpty(msg)) { + log.error("消息内容为空"); + return; + } + FactoryOrderLogEntity logEntity = JSONUtil.toBean(msg, FactoryOrderLogEntity.class); + if (ObjectUtil.isEmpty(logEntity)) { + log.error("消息内容为空"); + return; + } + // 去 minio 下载文件到本地,然后解析文件内容为实体对象 + DeliveryNoteVO vo = null; + Long logId = logEntity.getId(); + String logUrl = logEntity.getLogUrl(); + if (StrUtil.isNotEmpty(logUrl)) { + List res = new ArrayList<>(); + FileUtil.readLines(URLUtil.url(logUrl), CharsetUtil.CHARSET_UTF_8, res); + if (CollUtil.isNotEmpty(res)) { + String content = res.get(0); + if (StrUtil.isNotEmpty(content)) { + JSONConfig config = new JSONConfig(); + config.setIgnoreCase(Boolean.TRUE); + vo = JSONUtil.toBean(content, DeliveryNoteVO.class); + } + } + } + if (ObjectUtil.isEmpty(vo)) { + log.error("消息内容为空"); + return; + } + // 1 解析数据保存入库 + // 订单号唯一 + String orderSelfNum = vo.getOrderSelfNum(); + List list = deliveryNoteService.list(Wrappers.lambdaQuery() + .eq(DeliveryNoteEntity::getOrderSelfNum, orderSelfNum)); + if (CollUtil.isNotEmpty(list)) { + log.error("订单号{} 数据已经处理过了, logId: {}", orderSelfNum, logId); + return; + } + DeliveryNoteEntity deliveryNoteEntity = new DeliveryNoteEntity(); + BeanUtil.copyProperties(vo, deliveryNoteEntity); + ReceiverVO receiver = vo.getReceiver(); + if(ObjectUtil.isNotEmpty(receiver)){ + BeanUtil.copyProperties(receiver, deliveryNoteEntity); + } + SenderVO senderVO = vo.getSender(); + if(ObjectUtil.isNotEmpty(senderVO)){ + BeanUtil.copyProperties(senderVO, deliveryNoteEntity); + } + deliveryNoteEntity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); + deliveryNoteService.save(deliveryNoteEntity); + List orderInfos = vo.getItems(); + if (CollUtil.isNotEmpty(orderInfos)) { + List infoEntities = new ArrayList<>(); + for (PackageInfoVO orderInfo : orderInfos) { + String attributes = orderInfo.getAttributes(); + JSONArray objects = new JSONArray(attributes); + for (Object object : objects) { + PackageInfoEntity orderInfoEntity = new PackageInfoEntity(); + BeanUtil.copyProperties(orderInfo, orderInfoEntity); + JSONObject object1 = (JSONObject) object; + String code = object1.getStr("code"); + String name = object1.getStr("name"); + orderInfoEntity.setCode(code); + orderInfoEntity.setName(name); + orderInfoEntity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); + orderInfoEntity.setDeliveryNoteId(deliveryNoteEntity.getId().toString()); + infoEntities.add(orderInfoEntity); + } + } + packageInfoService.saveBatch(infoEntities); + } + // 2 构建暂存单,发送 mq 消息 + FactoryOrderLogEntity logEntity1 = new FactoryOrderLogEntity(); + logEntity1.setSaxStatus(SaxStatusEnums.SUCCESS.getCode()); + logEntity1.setId(logId); + logService.saveOrUpdate(logEntity1); + // 处理暂存单 + deliveryNoteService.buildAdvance(vo); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/pros/FactoryDataProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/pros/FactoryDataProperties.java new file mode 100644 index 000000000..76c71935f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/pros/FactoryDataProperties.java @@ -0,0 +1,20 @@ +package com.logpm.factorydata.mwh.pros; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * FactoryProperties + * + * @author pref + */ +@Data +@ConfigurationProperties(prefix = "logpm") +public class FactoryDataProperties { + /** + * 名称 + */ + private String name; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/DeliveryNoteService.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/DeliveryNoteService.java new file mode 100644 index 000000000..de04755de --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/DeliveryNoteService.java @@ -0,0 +1,18 @@ +package com.logpm.factorydata.mwh.service; + +import com.logpm.factorydata.mwh.entity.DeliveryNoteEntity; +import com.logpm.factorydata.mwh.vo.DeliveryNoteVO; +import org.springblade.core.mp.base.BaseService; + +/** + * 索菲亚发货单 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface DeliveryNoteService extends BaseService { + + + void buildAdvance(DeliveryNoteVO entities); + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/FactoryOrderLogService.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/FactoryOrderLogService.java new file mode 100644 index 000000000..655d7d549 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/FactoryOrderLogService.java @@ -0,0 +1,17 @@ +package com.logpm.factorydata.mwh.service; + +import com.logpm.factorydata.mwh.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.mwh.vo.DeliveryNoteVO; +import org.springblade.core.mp.base.BaseService; + +/** + * 工厂订单日志 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface FactoryOrderLogService extends BaseService { + + String order(DeliveryNoteVO vo); + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/IFactoryTokenService.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/IFactoryTokenService.java new file mode 100644 index 000000000..a59328cc0 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/IFactoryTokenService.java @@ -0,0 +1,15 @@ +package com.logpm.factorydata.mwh.service; + +import com.logpm.factorydata.mwh.entity.FactoryToken; +import org.springblade.core.mp.base.BaseService; + +import java.security.NoSuchAlgorithmException; + +/** + * 工厂推送数据接口 + */ +public interface IFactoryTokenService extends BaseService { + + + boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException; +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/PackageInfoService.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/PackageInfoService.java new file mode 100644 index 000000000..e2fc6a1f6 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/PackageInfoService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.mwh.service; + +import com.logpm.factorydata.mwh.entity.PackageInfoEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 装箱包信息 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface PackageInfoService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/DeliveryNoteServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/DeliveryNoteServiceImpl.java new file mode 100644 index 000000000..5137a8dea --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/DeliveryNoteServiceImpl.java @@ -0,0 +1,178 @@ +package com.logpm.factorydata.mwh.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.logpm.factorydata.base.feign.IFactoryDataBaseClient; +import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.mwh.entity.DeliveryNoteEntity; +import com.logpm.factorydata.mwh.entity.PackageInfoEntity; +import com.logpm.factorydata.mwh.mapper.DeliveryNoteMapper; +import com.logpm.factorydata.mwh.service.DeliveryNoteService; +import com.logpm.factorydata.mwh.vo.DeliveryNoteVO; +import com.logpm.factorydata.mwh.vo.PackageInfoVO; +import com.logpm.factorydata.mwh.vo.SenderVO; +import com.logpm.factorydata.vo.SendMsg; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.common.constant.HttpConstants; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.tool.api.R; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +/** + * 发货单 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class DeliveryNoteServiceImpl extends BaseServiceImpl implements DeliveryNoteService { + + private final IFactoryDataBaseClient baseClient; + private final IFactoryDataClient factoryDataClient; + + @Override + @LogpmAsync("asyncExecutor") + public void buildAdvance(DeliveryNoteVO vo) { + // 新起线程构建暂存单发送mq + Long startWarehouseId = null; + String startWarehouseName = null; + String tenantId = null; + // 获取工厂基地绑定的始发仓信息 + R warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.MHJ.getValue(), BrandEnums.MHJ.getValue()); + if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) { + FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData(); + if (ObjectUtil.isNotNull(data)) { + startWarehouseId = data.getWarehouseId(); + startWarehouseName = data.getWarehouseName(); + tenantId = data.getTenantId(); + } + } + List packages = vo.getItems(); + // 组装暂存单数据 + List advances = new ArrayList<>(); + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + advanceEntity.setHasPackage(CollUtil.isNotEmpty(packages) ? 1 : 0); + advanceEntity.setOrderType(vo.getOrderTypeName()); + advanceEntity.setBrand(BrandEnums.MHJ.getValue()); + advanceEntity.setSiteName(""); + advanceEntity.setArea(""); + advanceEntity.setTotalNum(StrUtil.isNotEmpty(vo.getTotalQuantity()) ? Convert.toInt(vo.getTotalQuantity()) : 0); + + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(startWarehouseId); + advanceEntity.setWarehouseName(startWarehouseName); + + advanceEntity.setIsGcp(0); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setPackName(""); + advanceEntity.setCarrierName("汇通"); + SenderVO sender = vo.getSender(); + if(ObjectUtil.isNotNull(sender)){ + advanceEntity.setSenderName(vo.getSender().getSenderName()); + advanceEntity.setSenderPhone(vo.getSender().getSenderMobile()); + advanceEntity.setSenderAddress(vo.getSender().getSenderAddress()); + } + advanceEntity.setTrainNumber(""); + advanceEntity.setSenderFactory(BrandEnums.MHJ.getValue()); + advanceEntity.setOrderCode(vo.getOrderSelfNum()); + advanceEntity.setDealerCode(vo.getSiteCode()); + advanceEntity.setDealerName(vo.getSiteName()); + advanceEntity.setStoreCode(vo.getSiteCode()); + advanceEntity.setStoreName(vo.getSiteName()); + advanceEntity.setServiceNum(vo.getOrderNo()); + if(ObjectUtil.isNotNull(vo.getReceiver())){ + advanceEntity.setCustomerName(vo.getReceiver().getReceiverName()); + advanceEntity.setCustomerPhone(vo.getReceiver().getReceiverMobile()); + advanceEntity.setCustomerAddress(vo.getReceiver().getReceiverAddress()); + } + List packageList = new ArrayList<>(); + if(CollUtil.isNotEmpty(packages)){ + for (PackageInfoVO orderPackageDTO : packages) { + String attributes = orderPackageDTO.getAttributes(); + JSONArray objects = new JSONArray(attributes); + for (Object object : objects) { + JSONObject object1 = (JSONObject) object; + String code = object1.getStr("code"); + String name = object1.getStr("name"); + // 封装包件 + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(startWarehouseId); + advanceDetailEntity.setWarehouseName(startWarehouseName); + advanceDetailEntity.setOrderCode(vo.getOrderSelfNum()); + advanceDetailEntity.setBrand(BrandEnums.MHJ.getValue()); + advanceDetailEntity.setSystemType("线上"); + advanceDetailEntity.setFirstPackName(name); + //二级品类名称 + advanceDetailEntity.setSecondPackName(name); + //三级品类名称 + advanceDetailEntity.setThirdPackName(name); + advanceDetailEntity.setMaterialName(""); + advanceDetailEntity.setSiteName(""); + advanceDetailEntity.setSiteCode(""); + advanceDetailEntity.setQuantity(1); + advanceDetailEntity.setOrderPackageCode(code); + advanceDetailEntity.setTrainNumber(""); + advanceDetailEntity.setServiceNum(vo.getOrderNo()); + advanceDetailEntity.setWaybillNo(""); + advanceDetailEntity.setPackageStatus("0"); + advanceDetailEntity.setWeight(BigDecimal.ZERO); + advanceDetailEntity.setVolume(BigDecimal.ZERO); +// advanceDetailEntity.setChargeType(0); + advanceDetailEntity.setSupple(""); + advanceDetailEntity.setManifest(""); + advanceDetailEntity.setReturnNum(""); + advanceDetailEntity.setSendDateStr(DateUtil.formatLocalDateTime(LocalDateTime.now())); + advanceDetailEntity.setCarNumber(""); + advanceDetailEntity.setGoodsMan(""); + advanceDetailEntity.setTenantId(tenantId); + advanceDetailEntity.setStatus(0); + advanceDetailEntity.setIsDeleted(0); + JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + packageList.add(entries); + } + } + } + + // 转成json对象,然后将包件明细放到detail中 + JSONObject entries = JSONUtil.parseObj(advanceEntity); + entries.set("details", JSONUtil.toJsonStr(packageList)); + advances.add(entries); + // 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg. + if (CollUtil.isNotEmpty(advances)) { + for (JSONObject advance : advances) { + SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); + factoryDataClient.sendMessage(sendMsg); + } + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/FactoryOrderLogServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/FactoryOrderLogServiceImpl.java new file mode 100644 index 000000000..34db5d664 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/FactoryOrderLogServiceImpl.java @@ -0,0 +1,110 @@ +package com.logpm.factorydata.mwh.service.impl; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.logpm.factorydata.enums.SaxStatusEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.mwh.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.mwh.mapper.FactoryOrderLogMapper; +import com.logpm.factorydata.mwh.service.FactoryOrderLogService; +import com.logpm.factorydata.mwh.vo.DeliveryNoteVO; +import com.logpm.factorydata.vo.SendMsg; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.io.IOUtils; +import org.jetbrains.annotations.NotNull; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.common.utils.FileLogsUtil; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.oss.model.BladeFile; +import org.springblade.core.tool.api.R; +import org.springblade.resource.feign.IOssClient; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; + +/** + * 工厂订单日志 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class FactoryOrderLogServiceImpl extends BaseServiceImpl implements FactoryOrderLogService { + + private final IFactoryDataClient factoryDataClient; + private final IOssClient ossClient; + + @Override + public String order(DeliveryNoteVO vo) { + + // 1 上传数据到 minio 获取到地址 + String url = uploadFile(JSONUtil.toJsonStr(vo)); + // 2 保存地址到数据库 + FactoryOrderLogEntity logEntity = new FactoryOrderLogEntity(); + logEntity.setType(1); + logEntity.setSaxStatus(SaxStatusEnums.NOMAL.getCode()); + logEntity.setLogUrl(url); + this.save(logEntity); + + // 3 将消息发送给 mq,解析保存 + SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.MWH_FACTORY_ORDER) + .message(JSONUtil.toJsonStr(logEntity)).build(); + factoryDataClient.sendMessage(build); + return "成功"; + } + + + private String uploadFile(String body) { + //文本内容和保存为本地文件 并上传 + String logPath = FileLogsUtil.saveFileLogs(body); + log.info(">>> 文件路径 {}", logPath); + + MultipartFile multi = getMultipartFile(logPath); + //上传到服务器 + R r = ossClient.fileUpload(multi, "mwh-order-logs"); + if (r.isSuccess()) { + BladeFile data = (BladeFile) r.getData(); + // 删除本地文件 + FileUtil.del(logPath); + return data.getLink(); + } + return null; + } + + @NotNull + private MultipartFile getMultipartFile(String logPath) { + File file = new File(logPath); + + // File 转 MultipartFile + FileItem item = new DiskFileItemFactory().createItem("file" + , MediaType.MULTIPART_FORM_DATA_VALUE + , true + , file.getName()); + try ( + InputStream input = Files.newInputStream(file.toPath()); + OutputStream os = item.getOutputStream()) { + // 流转移 + IOUtils.copy(input, os); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid file: " + e, e); + } + + return new CommonsMultipartFile(item); + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/FactoryTokenServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/FactoryTokenServiceImpl.java new file mode 100644 index 000000000..a8e8194aa --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/FactoryTokenServiceImpl.java @@ -0,0 +1,62 @@ +package com.logpm.factorydata.mwh.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.factorydata.mwh.entity.FactoryToken; +import com.logpm.factorydata.mwh.mapper.FactoryTokenMapper; +import com.logpm.factorydata.mwh.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.redis.cache.BladeRedis; +import org.springframework.stereotype.Service; + +import java.security.NoSuchAlgorithmException; +import java.util.Objects; + +@AllArgsConstructor +@Service +public class FactoryTokenServiceImpl extends BaseServiceImpl implements IFactoryTokenService { + + private static final Logger logger = LoggerFactory.getLogger(FactoryTokenServiceImpl.class); + + private final BladeRedis bladeRedis; + + @Override + public boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException { + logger.info("#########verifyToken: 验证token开始"); + //先生成token摘要 +// String tokenAbst = MD5Utils.md5Hex(token.getBytes(StandardCharsets.UTF_8)); + + //编写查询条件 + String key = "corpId:" + corpId; + FactoryToken factoryToken = bladeRedis.get(key); + + if (Objects.isNull(factoryToken)) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("token", token); + factoryToken = baseMapper.selectOne(queryWrapper); + } + + + if (Objects.isNull(factoryToken)) { + logger.error("#########verifyToken: token1验证不通过 token={},corpid={}", token, corpId); + return false; + } + logger.info("#########verifyToken: 验证token 传入token {} 验证token {}", token, factoryToken.getToken()); + if (!factoryToken.getToken().equals(token)) { + logger.error("#########verifyToken: token2验证不通过 token={},corpid={}", token, corpId); + return false; + } + + + Long expireTimeLong = factoryToken.getExpireTime().getTime(); + Long now = System.currentTimeMillis(); + //判断是否过期 + if (now > expireTimeLong) { + logger.error("#########verifyToken: token验证不通过 已过期 token={},corpId={}", token, corpId); + return false; + } + return true; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/PackageInfoServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/PackageInfoServiceImpl.java new file mode 100644 index 000000000..b71bb469c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/PackageInfoServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.mwh.service.impl; + +import com.logpm.factorydata.mwh.entity.PackageInfoEntity; +import com.logpm.factorydata.mwh.mapper.PackageInfoMapper; +import com.logpm.factorydata.mwh.service.PackageInfoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 装箱包信息 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class PackageInfoServiceImpl extends BaseServiceImpl implements PackageInfoService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/DeliveryNoteVO.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/DeliveryNoteVO.java new file mode 100644 index 000000000..3211f0827 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/DeliveryNoteVO.java @@ -0,0 +1,93 @@ +package com.logpm.factorydata.mwh.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.logpm.factorydata.mwh.entity.DeliveryNoteEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 送货单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "曼好家发运信息", description = "曼好家发运信息") +public class DeliveryNoteVO implements Serializable { + + @JsonProperty("StoreCode") + @ApiModelProperty(value = "客户编码") + private String storeCode; + @JsonProperty("StoreName") + @ApiModelProperty(value = "客户简称") + private String storeName; + @JsonProperty("UserId") + @ApiModelProperty(value = "客户编码(100)") + private String userId; + @JsonProperty("UserName") + @ApiModelProperty(value = "客户名称(汇通)") + private String userName; + @JsonProperty("Sources") + @ApiModelProperty(value = "订单来源编码。例:品牌名称 (MWH)") + private String sources; + @JsonProperty("SourceName") + @ApiModelProperty(value = "订单来源名称。例:品牌名称 (曼好家)") + private String sourceName; + @JsonProperty("CompanyCode") + @ApiModelProperty(value = "公司编码") + private String companyCode; + @JsonProperty("CompanyName") + @ApiModelProperty(value = "公司名称") + private String companyName; + @JsonProperty("SiteCode") + @ApiModelProperty(value = "服务平台编码") + private String siteCode; + @JsonProperty("SiteName") + @ApiModelProperty(value = "服务平台编码") + private String siteName; + @JsonProperty("OrderNo") + @ApiModelProperty(value = "交割单号/服务号") + private String orderNo; + @JsonProperty("OrderSelfNum") + @ApiModelProperty(value = "订单号") + private String orderSelfNum; + @JsonProperty("TotalQuantity") + @ApiModelProperty(value = "计划总数量") + private String totalQuantity; + @JsonProperty("TotalWeight") + @ApiModelProperty(value = "计划总数量") + private String totalWeight; + @JsonProperty("TotalCapacity") + @ApiModelProperty(value = "计划总体积") + private String totalCapacity; + @JsonProperty("OrderType") + @ApiModelProperty(value = "订单类型编码:测试环境传“RI”") + private String orderType; + @JsonProperty("OrderTypeName") + @ApiModelProperty(value = "订单类型名称:测试环境传“采购入库单”") + private String orderTypeName; + @JsonProperty("ServiceType") + @ApiModelProperty(value = "服务类型编码:测试环境传“00”") + private String serviceType; + @JsonProperty("ServiceTypeName") + @ApiModelProperty(value = "服务类型名称:测试环境传“入库”") + private String serviceTypeName; + @JsonProperty("remark1") + @ApiModelProperty(value = "业务实体") + private String remark1; + + @ApiModelProperty("包件列表") + @JsonProperty("Items") + private List items; + @ApiModelProperty("发货人") + @JsonProperty("Sender") + private SenderVO sender; + @ApiModelProperty("发货人") + @JsonProperty("Receiver") + private ReceiverVO receiver; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/PackageInfoVO.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/PackageInfoVO.java new file mode 100644 index 000000000..9d51197f1 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/PackageInfoVO.java @@ -0,0 +1,38 @@ +package com.logpm.factorydata.mwh.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.logpm.factorydata.mwh.entity.PackageInfoEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * 装箱包信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "装箱包信息", description = "装箱包信息") +public class PackageInfoVO implements Serializable { + + @JsonProperty("Color") + @ApiModelProperty(value = "批次/色号:订单编号") + private String color; + @JsonProperty("SkuStatus") + @ApiModelProperty(value = "商品状态:默认为Y -良品") + private String skuStatus; + @JsonProperty("StoreCode") + @ApiModelProperty(value = "客户编码") + private String storeCode; + @JsonProperty("StoreName") + @ApiModelProperty(value = "客户简称") + private String storeName; + @JsonProperty("Attributes") + @ApiModelProperty(value = "包件明细") + private String attributes; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/ReceiverVO.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/ReceiverVO.java new file mode 100644 index 000000000..d8d44030b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/ReceiverVO.java @@ -0,0 +1,43 @@ +package com.logpm.factorydata.mwh.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.logpm.factorydata.mwh.entity.DeliveryNoteEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 收货人 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "曼好家订单收货人", description = "曼好家订单收货人") +public class ReceiverVO implements Serializable { + + @JsonProperty("ReceiverAddress") + @ApiModelProperty(value = "收货人详细地址") + private String receiverAddress; + @JsonProperty("ReceiverArea") + @ApiModelProperty(value = "收货人区县") + private String receiverArea; + @JsonProperty("ReceiverCity") + @ApiModelProperty(value = "收货人城市") + private String receiverCity; + @JsonProperty("ReceiverMobile") + @ApiModelProperty(value = "收货人联系方式") + private String receiverMobile; + @JsonProperty("ReceiverName") + @ApiModelProperty(value = "加盟商") + private String receiverName; + @JsonProperty("ConsigneeName") + @ApiModelProperty(value = "收货人") + private String consigneeName; + @JsonProperty("ReceiverProvince") + @ApiModelProperty(value = "收货人省份") + private String receiverProvince; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/SenderVO.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/SenderVO.java new file mode 100644 index 000000000..021a09a9d --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/SenderVO.java @@ -0,0 +1,41 @@ +package com.logpm.factorydata.mwh.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.logpm.factorydata.mwh.entity.DeliveryNoteEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 发货人 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "曼好家订单发货人", description = "曼好家订单发货人") +public class SenderVO implements Serializable { + + @JsonProperty("SenderAddress") + @ApiModelProperty(value = "发货人详细地址") + private String senderAddress; + @JsonProperty("SenderCity") + @ApiModelProperty(value = "发货人城市") + private String senderCity; + @JsonProperty("SenderMobile") + @ApiModelProperty(value = "发货人联系方式") + private String senderMobile; + @JsonProperty("SenderName") + @ApiModelProperty(value = "发货工厂名称") + private String senderName; + @JsonProperty("SenderProvince") + @ApiModelProperty(value = "发货人省份") + private String senderProvince; + @JsonProperty("SenderArea") + @ApiModelProperty(value = "发货人区县") + private String senderArea; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/wrapper/CustomHttpServletRequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/wrapper/CustomHttpServletRequestWrapper.java new file mode 100644 index 000000000..628cbefdb --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/wrapper/CustomHttpServletRequestWrapper.java @@ -0,0 +1,38 @@ +package com.logpm.factorydata.mwh.wrapper; + +import org.springframework.http.HttpHeaders; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper { + + private final HttpHeaders headers; + + public CustomHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + headers = new HttpHeaders(); + } + + @Override + public String getHeader(String name) { + String headerValue = headers.getFirst(name); + return headerValue != null ? headerValue : super.getHeader(name); + } + + @Override + public Enumeration getHeaderNames() { + List names = Collections.list(super.getHeaderNames()); + headers.forEach((key, value) -> names.add(key)); + return Collections.enumeration(names); + } + + // 其他需要覆盖的方法... + + public void addHeader(String name, String value) { + headers.add(name, value); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/RequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/wrapper/RequestWrapper.java similarity index 95% rename from blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/RequestWrapper.java rename to blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/wrapper/RequestWrapper.java index 47c38a56d..aa093871e 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/RequestWrapper.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/wrapper/RequestWrapper.java @@ -1,4 +1,4 @@ -package com.logpm.factorydata.zbom.config; +package com.logpm.factorydata.mwh.wrapper; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; @@ -46,13 +46,17 @@ public class RequestWrapper extends HttpServletRequestWrapper { public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); ServletInputStream servletInputStream = new ServletInputStream() { + @Override public boolean isFinished() { return false; } + @Override public boolean isReady() { return false; } + @Override public void setReadListener(ReadListener readListener) {} + @Override public int read() throws IOException { return byteArrayInputStream.read(); } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application-dev.yml b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application-dev.yml new file mode 100644 index 000000000..6323282be --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application-dev.yml @@ -0,0 +1,73 @@ +#服务器端口 +server: + port: 18960 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.46 + port: 5672 + username: admin + password: admin + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-mwh.master.url} + username: ${blade.datasource.factorydata-mwh.master.username} + password: ${blade.datasource.factorydata-mwh.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-mwh.627683.url} + username: ${blade.datasource.factorydata-mwh.627683.username} + password: ${blade.datasource.factorydata-mwh.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application-prod.yml b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application-prod.yml new file mode 100644 index 000000000..c7f7d639c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application-prod.yml @@ -0,0 +1,47 @@ +#服务器端口 +server: + port: 18960 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-mwh.master.url} + username: ${blade.datasource.factorydata-mwh.master.username} + password: ${blade.datasource.factorydata-mwh.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-mwh.627683.url} + username: ${blade.datasource.factorydata-mwh.627683.username} + password: ${blade.datasource.factorydata-mwh.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application-test.yml b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application-test.yml new file mode 100644 index 000000000..f28ff4273 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application-test.yml @@ -0,0 +1,73 @@ +#服务器端口 +server: + port: 18960 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.110 + port: 5672 + username: admin + password: Slwk@123654 + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-mwh.master.url} + username: ${blade.datasource.factorydata-mwh.master.username} + password: ${blade.datasource.factorydata-mwh.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-mwh.627683.url} + username: ${blade.datasource.factorydata-mwh.627683.username} + password: ${blade.datasource.factorydata-mwh.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application.yml b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application.yml new file mode 100644 index 000000000..33da94b58 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/application.yml @@ -0,0 +1,31 @@ +#mybatis-plus配置 +mybatis-plus: + mapper-locations: classpath:com/logpm/**/mapper/*Mapper.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.logpm.**.entity + +#swagger扫描路径配置 +swagger: + base-packages: + - org.springblade + - com.logpm + +#oss配置 +oss: + enabled: true + name: minio + tenant-mode: false + endpoint: http://8.137.14.82:9000 + access-key: minio + secret-key: 123123123 + bucket-name: bladex + + +logging: + config: classpath:logback.xml + + +spring: + main: + allow-circular-references: true + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/logback.xml b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/logback.xml new file mode 100644 index 000000000..7170050de --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/resources/logback.xml @@ -0,0 +1,40 @@ + + + + logback + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf8 + + + + + ${log.path} + + ${log.path}.%d{yyyy-MM-dd}.zip + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/Dockerfile b/blade-service/logpm-factory-data/logpm-factory-data-olo/Dockerfile new file mode 100644 index 000000000..fc0cb65f8 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/Dockerfile @@ -0,0 +1,14 @@ +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 + +MAINTAINER h5u@163.com + +RUN mkdir -p /logpm/logpm-factory-data-olo + +WORKDIR /logpm/logpm-factory-data-olo + +EXPOSE 18930 + +ADD ./target/logpm-factory-data-olo.jar ./app.jar + +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","-Xms128m","-Xmx512m", "app.jar"] +CMD ["--spring.profiles.active=test"] diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/pom.xml b/blade-service/logpm-factory-data/logpm-factory-data-olo/pom.xml new file mode 100644 index 000000000..a995a3f8b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/pom.xml @@ -0,0 +1,98 @@ + + + + logpm-factory-data + org.springblade + 3.2.0.RELEASE + + 4.0.0 + ${bladex.project.version} + jar + logpm-factory-data-olo + + + 8 + 8 + + + + + org.springblade + blade-core-boot + + + org.springblade + blade-core-auto + provided + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springblade + logpm-factory-data-api + 3.2.0.RELEASE + + + com.xuxueli + xxl-job-core + + + org.springblade + blade-starter-swagger + + + org.springblade + logpm-trunkline-api + 3.2.0.RELEASE + + + org.springblade + logpm-factory-data-base-api + ${bladex.project.version} + + + org.springblade + blade-starter-oss + + + io.minio + minio + + + org.springblade + blade-resource-api + 3.2.0.RELEASE + compile + + + + + + + + com.spotify + dockerfile-maven-plugin + + ${docker.username} + ${docker.password} + ${docker.registry.url}/${docker.namespace}/${project.artifactId} + ${project.version} + true + + target/${project.build.finalName}.jar + + false + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/FactoryDataOloApplication.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/FactoryDataOloApplication.java new file mode 100644 index 000000000..25cd5857e --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/FactoryDataOloApplication.java @@ -0,0 +1,20 @@ +package com.logpm.factorydata; + +import org.springblade.common.constant.ModuleNameConstant; +import org.springblade.core.cloud.client.BladeCloudApplication; +import org.springblade.core.launch.BladeApplication; + +/** + * 我乐工厂数据启动类 + * + * @author zhaoqiaobo + * @create 2024-4-26 + */ +@BladeCloudApplication +public class FactoryDataOloApplication { + + public static void main(String[] args) { + BladeApplication.run(ModuleNameConstant.LOGPM_FACTORY_DATA_OLO_NAME, FactoryDataOloApplication.class, args); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..4de5e3e08 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.factorydata.olo.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/aspect/JobAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/aspect/JobAnnotationAspect.java new file mode 100644 index 000000000..f51b4515b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/aspect/JobAnnotationAspect.java @@ -0,0 +1,83 @@ +package com.logpm.factorydata.olo.aspect; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.AllArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Aspect +@Component +@AllArgsConstructor +public class JobAnnotationAspect { + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + + @Around("@annotation(com.xxl.job.core.handler.annotation.XxlJob)") + public Object xxlJobAnnotationMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + + JSONObject jsonObject = mockLogin(); + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.addHeader("Blade-Auth", "bearer "+jsonObject.get("access_token")); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(mockRequest)); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+jsonObject.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + DynamicDataSourceContextHolder.push(jsonObject.getString("tenant_id")); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + + return result; + + + } + + private JSONObject mockLogin() throws InterruptedException { + + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + return data; + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..cd968e36d --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.factorydata.olo.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/CustomMessageConverter.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/CustomMessageConverter.java new file mode 100644 index 000000000..8ca1d613e --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/CustomMessageConverter.java @@ -0,0 +1,161 @@ +package com.logpm.factorydata.olo.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength((long) bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/ExecutorConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/ExecutorConfig.java new file mode 100644 index 000000000..4d12cb748 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/ExecutorConfig.java @@ -0,0 +1,79 @@ +package com.logpm.factorydata.olo.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.http.HttpHeaders; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + ThreadLocalUtil.put("bladeContext", headers); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/FactoryDataOloConfiguration.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/FactoryDataOloConfiguration.java new file mode 100644 index 000000000..8ae354444 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/FactoryDataOloConfiguration.java @@ -0,0 +1,41 @@ +/* + * 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.olo.config; + + +import com.logpm.factorydata.olo.pros.FactoryDataOloProperties; +import com.logpm.factorydata.olo.pros.OldProperties; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 配置feign、mybatis包名、properties + * + * @author chaos + */ +@Configuration(proxyBeanMethods = false) +@ComponentScan({"org.springblade", "com.logpm"}) +@EnableFeignClients({"org.springblade", "com.logpm"}) +@MapperScan({"org.springblade.**.mapper.**", "com.logpm.**.mapper.**"}) +@EnableConfigurationProperties(value = {FactoryDataOloProperties.class, OldProperties.class}) +public class FactoryDataOloConfiguration { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/InterceptorAdapterConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/InterceptorAdapterConfig.java new file mode 100644 index 000000000..17a1ebb4a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/InterceptorAdapterConfig.java @@ -0,0 +1,36 @@ +package com.logpm.factorydata.olo.config; + +import com.logpm.factorydata.olo.interceptor.FactoryAccountsInterceptor; +import com.logpm.factorydata.olo.interceptor.LocalServerLoginAccountsInterceptor; +import com.logpm.factorydata.olo.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.springblade.common.component.MockLoginService; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@AllArgsConstructor +public class InterceptorAdapterConfig implements WebMvcConfigurer { + + private final IFactoryTokenService factoryTokenService; + + private final BladeRedis redis; + + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + + + @Override + public void addInterceptors(InterceptorRegistry interceptorRegistry) { +// interceptorRegistry.addInterceptor(new FactoryAccountsInterceptor(factoryTokenService)) +// .addPathPatterns("/**").order(1); + interceptorRegistry.addInterceptor(new LocalServerLoginAccountsInterceptor(redis, environment,redisLockClient,mockLoginService)) + .addPathPatterns("/**").order(2); + + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/RabbitConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/RabbitConfig.java new file mode 100644 index 000000000..caf25248c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/RabbitConfig.java @@ -0,0 +1,17 @@ +package com.logpm.factorydata.olo.config; + +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory factory, CustomMessageConverter converter) { + RabbitTemplate template = new RabbitTemplate(factory); + template.setMessageConverter(converter); + return template; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/XxlJobConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/XxlJobConfig.java new file mode 100644 index 000000000..dfff9fc2a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/config/XxlJobConfig.java @@ -0,0 +1,74 @@ +package com.logpm.factorydata.olo.config; + +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author xuxueli 2017-04-28 + */ +@Configuration(proxyBeanMethods = false) +public class XxlJobConfig { + private final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${xxl.job.admin.addresses}") + private String adminAddresses; + + @Value("${xxl.job.executor.appname}") + private String appName; + + @Value("${xxl.job.executor.ip}") + private String ip; + + @Value("${xxl.job.executor.port}") + private int port; + + @Value("${xxl.job.accessToken}") + private String accessToken; + + @Value("${xxl.job.executor.logpath}") + private String logPath; + + @Value("${xxl.job.executor.logretentiondays}") + private int logRetentionDays; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppName(appName); + xxlJobSpringExecutor.setIp(ip); + xxlJobSpringExecutor.setPort(port); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); + + return xxlJobSpringExecutor; + } + + /** + * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP; + * + * 1、引入依赖: + * + * org.springframework.cloud + * spring-cloud-commons + * ${version} + * + * + * 2、配置文件,或者容器启动变量 + * spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.' + * + * 3、获取IP + * String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(); + */ + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/controller/OrderController.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/controller/OrderController.java new file mode 100644 index 000000000..12bb4176c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/controller/OrderController.java @@ -0,0 +1,71 @@ +package com.logpm.factorydata.olo.controller; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.factorydata.olo.service.DeliveryNoteService; +import com.logpm.factorydata.olo.vo.DeliveryNoteVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.core.tool.api.R; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 工厂订单 前端控制器 + * + * @author zhaoqiaobo + * @create 2024-03-21 19:27 + */ +@Slf4j +@RestController +@RequestMapping("/order") +@AllArgsConstructor +@Api(value = "工厂订单", tags = "工厂订单") +public class OrderController { + + private final DeliveryNoteService service; + private final RabbitTemplate rabbitTemplate; + + @ResponseBody + @PostMapping("sendMsg") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "推送节点数据", notes = "推送节点数据") + public R order(@RequestBody Map param) { + log.info("推送节点数据:{} ", JSONUtil.toJsonStr(param)); + String msg = JSONUtil.toJsonStr(param); + rabbitTemplate.convertAndSend(FactoryDataConstants.Mq.RoutingKeys.OLO_NODE_DATA_PUSH, + FactoryDataConstants.Mq.RoutingKeys.OLO_NODE_DATA_PUSH, msg); + return R.success("推送成功"); + } + + @ResponseBody + @PostMapping + @ApiOperationSupport(order = 1) + @ApiOperation(value = "工厂订单", notes = "工厂订单") + public R order(@RequestBody List> param) { + log.info("接收工厂订单:{} ", JSONUtil.toJsonStr(param)); + // 将param转成List + List vos = param.stream().map(p -> BeanUtil.toBean(p, DeliveryNoteVO.class)).collect(Collectors.toList()); + String res = ""; + try { + res = service.order(vos); + } catch (Exception e) { + log.error("工厂订单异常:{} ", e); + return R.success("服务器异常"); + } + return R.success(res); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/entity/DeliveryNoteEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/entity/DeliveryNoteEntity.java new file mode 100644 index 000000000..deddb4273 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/entity/DeliveryNoteEntity.java @@ -0,0 +1,92 @@ +package com.logpm.factorydata.olo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 送货单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("olo_delivery_note") +@ApiModel(value = "我乐发运单", description = "我乐发运单") +@EqualsAndHashCode(callSuper = true) +public class DeliveryNoteEntity extends BaseEntity { + + @ApiModelProperty(name = "日志id") + private String logId; + @ApiModelProperty(name = "发运汇总单号") + private String shipmentNo; + @ApiModelProperty(name = "发运分单号") + private String shipmentSplitNo; + @ApiModelProperty(name = "顾客姓名") + private String endingCustomer; + @ApiModelProperty(name = "顾客地址") + private String zgkdz; + @ApiModelProperty(name = "顾客电话") + private String endingCustomerTel; + @ApiModelProperty(name = "CRM单号") + private String crmSo; + @ApiModelProperty(name = "空间") + private String space; + @ApiModelProperty(name = "SN") + private String sn; + @ApiModelProperty(name = "货物类型") + private String materialCategory; + @ApiModelProperty(name = "体积") + private String snVolume; + @ApiModelProperty(name = "重量") + private String snWeight; + @ApiModelProperty(name = "件数") + private String qty; + @ApiModelProperty(name = "货物描述") + private String materialDesc; + @ApiModelProperty(name = "汇总运价") + private String sumPrice; + @ApiModelProperty(name = "经销商名称") + private String customerName; + @ApiModelProperty(name = "经销商编码") + private String customerCode; + @ApiModelProperty(name = "经销商联系电话") + private String customerTel; + @ApiModelProperty(name = "发货城市") + private String receiveCity; + @ApiModelProperty(name = "发货城市") + private String deliveryCity; + @ApiModelProperty(name = "工厂发运日期") + private String shipmentDate; + @ApiModelProperty(name = "承运商编码") + private String carrierCode; + @ApiModelProperty(name = "承运商名称") + private String carrierName; + @ApiModelProperty(name = "物流线路名称") + private String shipmentRoute; + @ApiModelProperty(name = "服务方式(是否干仓配)") + private String isAllocation; + @ApiModelProperty(name = "发运车次号") + private String shipmentNumber; + @ApiModelProperty(name = "车牌") + private String shipmentPlateNumber; + @ApiModelProperty(name = "标识:空:原始数据;A:新增 ;D:删除") + private String flag; + @ApiModelProperty(name = "发运方式") + private String shipmentTypeDesc; + + @ApiModelProperty(name = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(name = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(name = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(name = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(name = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/entity/FactoryOrderLogEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/entity/FactoryOrderLogEntity.java new file mode 100644 index 000000000..abcdb159d --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/entity/FactoryOrderLogEntity.java @@ -0,0 +1,58 @@ +package com.logpm.factorydata.olo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +@Data +@TableName("olo_factory_log") +@ApiModel(value = "接收工厂订单日志", description = "接收工厂订单日志") +@EqualsAndHashCode(callSuper = true) +public class FactoryOrderLogEntity 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 logUrl; + /** + * 数据类型 1.入库数据 + */ + @ApiModelProperty(name = "数据类型 1.入库数据", notes = "") + private Integer type; + /** + * 解析状态 0 未解析 1 解析失败 2 已解析 + */ + @ApiModelProperty(name = "解析状态 0 未解析 1 解析失败 2 已解析", notes = "") + private Integer saxStatus; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/entity/FactoryToken.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/entity/FactoryToken.java new file mode 100644 index 000000000..c48f02a93 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/entity/FactoryToken.java @@ -0,0 +1,32 @@ +package com.logpm.factorydata.olo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springblade.core.mp.base.BaseEntity; + +import java.util.Date; + +@Data +@TableName("factory_token") +@ApiModel(value = "FactoryToken对象", description = "工厂账户token") +public class FactoryToken extends BaseEntity { + + @ApiModelProperty("token") + private String token; + + @ApiModelProperty("token摘要") + private String tokenAbst; + + @JsonFormat( + pattern = "yyyy-MM-dd HH:mm:ss" + ) + @ApiModelProperty("过期时间") + private Date expireTime; + + @ApiModelProperty("企业id") + private String corpid; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/enums/FactoryNodeEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/enums/FactoryNodeEnums.java new file mode 100644 index 000000000..e77ba3ca2 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/enums/FactoryNodeEnums.java @@ -0,0 +1,31 @@ +package com.logpm.factorydata.olo.enums; + +import lombok.Getter; +import org.springblade.common.model.IDict; + +/** + * 工厂节点枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum FactoryNodeEnums implements IDict { + + /** 已入库 */ + ALREADY_IN_STOCK(101020, "已入库"), + /** 已出库 */ + SHIPPED(103020, "已出库"), + /** 已发车 */ + DISPATCHED(103040, "已发车"), + /** 配送 */ + DISTRIBUTION(302010, "配送"), + /** 已签收 */ + SIGNED_FOR(303010, "已签收"), + ; + + FactoryNodeEnums(Integer code, String text) { + init(code, text); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/enums/NodeMappingEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/enums/NodeMappingEnums.java new file mode 100644 index 000000000..ae1c519f9 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/enums/NodeMappingEnums.java @@ -0,0 +1,69 @@ +package com.logpm.factorydata.olo.enums; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Getter; +import org.springblade.common.constant.WorkNodeEnums; + +/** + * 系统和工厂节点映射枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum NodeMappingEnums { + + INITIAL_WAREHOUSE_ENTRY(FactoryNodeEnums.ALREADY_IN_STOCK, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY, 1), + UNLOAD_INCOMING_WAREHOUSE(FactoryNodeEnums.ALREADY_IN_STOCK, WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE, 1), + + INITIAL_WAREHOUSE_LOADING(FactoryNodeEnums.SHIPPED, WorkNodeEnums.INITIAL_WAREHOUSE_LOADING, 1), + + INITIAL_WAREHOUSE_DEPART(FactoryNodeEnums.DISPATCHED, WorkNodeEnums.INITIAL_WAREHOUSE_DEPART, 1), + TRANSFER_WAREHOUSE_DEPART(FactoryNodeEnums.DISPATCHED, WorkNodeEnums.TRANSFER_WAREHOUSE_DEPART, 1), + TRIPARTITE_TRANSFER_DEPART(FactoryNodeEnums.DISPATCHED, WorkNodeEnums.TRIPARTITE_TRANSFER_DEPART, 1), + + DISTRIBUTION_LOADING(FactoryNodeEnums.DISTRIBUTION, WorkNodeEnums.DISTRIBUTION_LOADING, 1), + + SIGN_DIRECT_SHIPPER(FactoryNodeEnums.SIGNED_FOR, WorkNodeEnums.SIGN_DIRECT_SHIPPER, 1), + SIGN_TRIPARTITE_TRANSFER_DEPART(FactoryNodeEnums.SIGNED_FOR, WorkNodeEnums.SIGN_TRIPARTITE_TRANSFER_DEPART, 1), + CLERK_REVIEW(FactoryNodeEnums.SIGNED_FOR, WorkNodeEnums.CLERK_REVIEW, 1), + ; + + /** + * 系统作业节点 + */ + private WorkNodeEnums workNodeEnums; + /** + * 工厂作业节点 + */ + private FactoryNodeEnums factoryNodeEnums; + /** + * 状态码 + * 存在我们系统同一个作业节点对应工厂多个节点的情况,通过状态码区分 + */ + private Integer status; + + NodeMappingEnums(FactoryNodeEnums factoryNodeEnums, WorkNodeEnums workNodeEnums, Integer status) { + this.workNodeEnums = workNodeEnums; + this.factoryNodeEnums = factoryNodeEnums; + this.status = status; + } + + public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums) { + return getFactoryByNodeAndStatus(workNodeEnums, 1); + } + + public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums, Integer status) { + NodeMappingEnums[] values = values(); + for (NodeMappingEnums value : values) { + WorkNodeEnums workNodeEnums1 = value.getWorkNodeEnums(); + Integer status1 = value.getStatus(); + FactoryNodeEnums factoryNodeEnums = value.getFactoryNodeEnums(); + if (ObjectUtil.equal(workNodeEnums1, workNodeEnums) && ObjectUtil.equal(status1, status)) { + return factoryNodeEnums; + } + } + return null; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/enums/NodeNeedEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/enums/NodeNeedEnums.java new file mode 100644 index 000000000..ad0f0ae85 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/enums/NodeNeedEnums.java @@ -0,0 +1,44 @@ +package com.logpm.factorydata.olo.enums; + +import lombok.Getter; + +import java.io.Serializable; + +/** + * 作业节点枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum NodeNeedEnums implements Serializable { + + INITIAL_WAREHOUSE_ENTRY(101020, "始发仓入库"), + UNLOAD_INCOMING_WAREHOUSE(105010,"卸车入库"), + + INITIAL_WAREHOUSE_LOADING(103020, "装车"), + + INITIAL_WAREHOUSE_DEPART(103040, "始发仓发车"), + TRANSFER_WAREHOUSE_DEPART(103080, "网点发车"), + TRIPARTITE_TRANSFER_DEPART(104010, "三方中转发车"), + /** + * 配送装车 + */ + DISTRIBUTION_LOADING(302010, "配送装车"), + /** + * 文员复核 + */ + SIGN_DIRECT_SHIPPER(105030,"直发商家签收"), + SIGN_TRIPARTITE_TRANSFER_DEPART(104040, "三方中转签收"), + CLERK_REVIEW(303010, "文员复核"), + ; + + private Integer code; + private String value; + + NodeNeedEnums(Integer code, String value) { + this.code = code; + this.value = value; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/interceptor/FactoryAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/interceptor/FactoryAccountsInterceptor.java new file mode 100644 index 000000000..119aa1bb2 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/interceptor/FactoryAccountsInterceptor.java @@ -0,0 +1,87 @@ +package com.logpm.factorydata.olo.interceptor; + +import com.alibaba.fastjson.JSONObject; +import com.logpm.factorydata.olo.service.IFactoryTokenService; +import com.logpm.factorydata.olo.wrapper.RequestWrapper; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +@Log4j2 +@AllArgsConstructor +public class FactoryAccountsInterceptor implements HandlerInterceptor { + + private final IFactoryTokenService factoryTokenService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + try { + + RequestWrapper myRequestWrapper = new RequestWrapper(request); + String body = myRequestWrapper.getBody(); + JSONObject jsonObject = JSONObject.parseObject(body); + //获取头中参数 + String token = request.getHeader("Authorization"); + String corpId = request.getHeader("corpid"); + if(StringUtil.isBlank(corpId)){ + corpId = jsonObject.getString("corpid"); + } + if(!StringUtil.hasLength(token)){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,token有误"))); + return false; + } + if(!StringUtil.hasLength(corpId)){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,corpId有误"))); + return false; + } + + log.info("##########preHandle: token={}",token); + //验证token + boolean b = factoryTokenService.verifyToken(token,corpId); + if(!b){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,token不存在或已过期"))); + return false; + } + return true; + } catch (Exception e) { + returnJson(response,JSONObject.toJSONString(R.fail(500,"服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null){ + writer.close(); + } + } + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/interceptor/LocalServerLoginAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/interceptor/LocalServerLoginAccountsInterceptor.java new file mode 100644 index 000000000..b54dfe272 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/interceptor/LocalServerLoginAccountsInterceptor.java @@ -0,0 +1,101 @@ +package com.logpm.factorydata.olo.interceptor; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.common.exception.CustomerException; +import org.springblade.common.wrapper.CustomHttpServletRequestWrapper; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Log4j2 +@AllArgsConstructor +public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapter { + + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + + + try { + CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(request); + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + + // 修改或添加header + + // 发送登录请求 + log.info("##########preHandle: request={}", request); + + wrappedRequest.addHeader("Blade-Auth", "bearer "+data.getString("access_token")); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + + // 用包装后的request替换原始request + request = wrappedRequest; + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + return true; + } catch (Exception e) { + returnJson(response, JSONObject.toJSONString(R.fail(500, "服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/job/PushDataJob.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/job/PushDataJob.java new file mode 100644 index 000000000..fe1d4e43b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/job/PushDataJob.java @@ -0,0 +1,36 @@ +package com.logpm.factorydata.olo.job; + +import com.logpm.factorydata.olo.service.DeliveryNoteService; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author zhaoqiaobo + * @create 2024-04-02 + */ +@AllArgsConstructor +@Component +@Slf4j +public class PushDataJob { + + private final DeliveryNoteService deliveryNoteService; + + /** + * 定时扫描我乐手动维护的数据,推送给我乐 + * + * @param param + * @return + * @throws Exception + */ + @XxlJob("pushNodeData") + public ReturnT pushDataJob(String param) throws Exception { + + deliveryNoteService.customPushNodeData(); + + return ReturnT.SUCCESS; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/launcher/FactoryDataBaseLauncherServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/launcher/FactoryDataBaseLauncherServiceImpl.java new file mode 100644 index 000000000..da89fa309 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/launcher/FactoryDataBaseLauncherServiceImpl.java @@ -0,0 +1,60 @@ +/* + * 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.olo.launcher; + +import org.springblade.core.auto.service.AutoService; +import org.springblade.core.launch.constant.NacosConstant; +import org.springblade.core.launch.service.LauncherService; +import org.springblade.core.launch.utils.PropsUtil; +import org.springframework.boot.builder.SpringApplicationBuilder; + +import java.util.Properties; + +/** + * 启动参数拓展 + * + * @author Chill + */ +@AutoService(LauncherService.class) +public class FactoryDataBaseLauncherServiceImpl implements LauncherService { + + @Override + public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) { + Properties props = System.getProperties(); + // 开启多数据源 + PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true"); + // 指定注册配置信息 + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].data-id", NacosConstant.dataId(appName, profile)); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].group", NacosConstant.NACOS_CONFIG_GROUP); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].refresh", NacosConstant.NACOS_CONFIG_REFRESH); + // 指定注册IP + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.ip", "127.0.0.1"); + // 指定注册端口 + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.port", "8200"); + // 自定义命名空间 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.NACOS_NAMESPACE); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.NACOS_NAMESPACE); + // 自定义分组 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.group", NacosConstant.NACOS_CONFIG_GROUP); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.group", NacosConstant.NACOS_CONFIG_GROUP); + } + + @Override + public int getOrder() { + return 20; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/DeliveryNoteMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/DeliveryNoteMapper.java new file mode 100644 index 000000000..966cc4ecd --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/DeliveryNoteMapper.java @@ -0,0 +1,21 @@ +package com.logpm.factorydata.olo.mapper; + +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.olo.entity.DeliveryNoteEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 发货单 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface DeliveryNoteMapper extends BaseMapper { + + JSONObject customPushNodeData(); + + void updateSustomPushNodeDataStatus(@Param("status") String status, @Param("orderNo") String orderNo, @Param("deliveryNo") String deliveryNo); +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryNodeOrderMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryNodeOrderMapper.xml new file mode 100644 index 000000000..ba7bc0baa --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryNodeOrderMapper.xml @@ -0,0 +1,26 @@ + + + + + + update olo_custom_push_data + set sendStatus = 1 + where status = #{status} + and orderNo = #{orderNo} + and deliveryNo = #{deliveryNo} + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryOrderLogMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryOrderLogMapper.java new file mode 100644 index 000000000..0ce79ffba --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryOrderLogMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.olo.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.olo.entity.FactoryOrderLogEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 工厂订单日志 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface FactoryOrderLogMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryOrderLogMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryOrderLogMapper.xml new file mode 100644 index 000000000..8e694550b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryOrderLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryTokenMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryTokenMapper.java new file mode 100644 index 000000000..30511083f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryTokenMapper.java @@ -0,0 +1,31 @@ +/* + * 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.olo.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.olo.entity.FactoryToken; + +/** + * 工厂账号接口日志 Mapper 接口 + * + * @author zhy + * @since 2023-03-28 + */ +public interface FactoryTokenMapper extends BaseMapper { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryTokenMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryTokenMapper.xml new file mode 100644 index 000000000..a803123c1 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mapper/FactoryTokenMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mq/FactoryOrderListener.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mq/FactoryOrderListener.java new file mode 100644 index 000000000..6563cb5d5 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mq/FactoryOrderListener.java @@ -0,0 +1,172 @@ +package com.logpm.factorydata.olo.mq; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONConfig; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.factorydata.base.feign.IFactoryDataBaseClient; +import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.enums.SaxStatusEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.olo.entity.DeliveryNoteEntity; +import com.logpm.factorydata.olo.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.olo.service.DeliveryNoteService; +import com.logpm.factorydata.olo.service.FactoryOrderLogService; +import com.logpm.factorydata.olo.vo.DeliveryNoteVO; +import com.logpm.factorydata.vo.SendMsg; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.common.constant.HttpConstants; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.tool.api.R; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 监听索菲亚订单数据 + * + * @author zhaoqiaobo + * @create 2024-03-18 + */ +@Slf4j +@Component +@AllArgsConstructor +public class FactoryOrderListener { + + private final DeliveryNoteService deliveryNoteService; + private final FactoryOrderLogService logService; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.OLO_FACTORY_ORDER), + exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER, type = ExchangeTypes.TOPIC), + key = FactoryDataConstants.Mq.RoutingKeys.OLO_FACTORY_ORDER + )) + @Transactional(rollbackFor = Exception.class) + public void factoryOrder(String msg) { + log.info("处理我乐订单:{}", msg); + if (StrUtil.isEmpty(msg)) { + log.error("消息内容为空"); + return; + } + FactoryOrderLogEntity logEntity = JSONUtil.toBean(msg, FactoryOrderLogEntity.class); + if (ObjectUtil.isEmpty(logEntity)) { + log.error("消息内容为空"); + return; + } + // 去 minio 下载文件到本地,然后解析文件内容为实体对象 + List vos = null; + Long logId = logEntity.getId(); + String logUrl = logEntity.getLogUrl(); + if (StrUtil.isNotEmpty(logUrl)) { + List res = new ArrayList<>(); + FileUtil.readLines(URLUtil.url(logUrl), CharsetUtil.CHARSET_UTF_8, res); + if (CollUtil.isNotEmpty(res)) { + String content = res.get(0); + if (StrUtil.isNotEmpty(content)) { + JSONConfig config = new JSONConfig(); + config.setIgnoreCase(Boolean.TRUE); + vos = new JSONArray(content, config).toList(DeliveryNoteVO.class); + } + } + } + // 保存数据包数据库 + if (CollUtil.isNotEmpty(vos)) { + List entities = new ArrayList<>(); + List crmSos = new ArrayList<>(); + List sns = new ArrayList<>(); + for (DeliveryNoteVO vo : vos) { + // CRM单号 + SN 唯一 + crmSos.add(vo.getCRM_SO()); + sns.add(vo.getSN()); + } + Map entityMap = new HashMap<>(); + if (CollUtil.isNotEmpty(crmSos) && CollUtil.isNotEmpty(sns)) { + List existingEntities = deliveryNoteService.list(Wrappers.lambdaQuery() + .in(DeliveryNoteEntity::getCrmSo, crmSos) + .in(DeliveryNoteEntity::getSn, sns)); + if (CollUtil.isNotEmpty(existingEntities)) { + for (DeliveryNoteEntity existingEntity : existingEntities) { + entityMap.put(existingEntity.getCrmSo() + existingEntity.getSn(), existingEntity.getId()); + } + } + } + for (DeliveryNoteVO vo : vos) { + // CRM单号 + SN 唯一 + String crmSo = vo.getCRM_SO(); + String sn = vo.getSN(); + if (entityMap.containsKey(crmSo + sn)) { + log.error("CRM单号:{} 与SN:{} 数据已经处理过了,logId: {}", crmSo, sn, logId); + continue; + } + DeliveryNoteEntity entity = new DeliveryNoteEntity(); + entity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); + entity.setShipmentNo(vo.getSHIPMENT_NO()); + entity.setShipmentSplitNo(vo.getSHIPMENT_SPLIT_NO()); + entity.setEndingCustomer(vo.getENDING_CUSTOMER()); + entity.setZgkdz(vo.getZGKDZ()); + entity.setEndingCustomerTel(vo.getENDING_CUSTOMER_TEL()); + entity.setCrmSo(vo.getCRM_SO()); + entity.setSpace(vo.getSPACE()); + entity.setSn(vo.getSN()); + entity.setMaterialCategory(vo.getMATERIAL_CATEGORY()); + entity.setSnVolume(vo.getSN_VOLUME()); + entity.setSnWeight(vo.getSN_WEIGHT()); + entity.setQty(vo.getQTY()); + entity.setMaterialDesc(vo.getMATERIAL_DESC()); + entity.setSumPrice(vo.getSUM_PRICE()); + entity.setCustomerName(vo.getCUSTOMER_NAME()); + entity.setCustomerCode(vo.getCUSTOMER_CODE()); + entity.setCustomerTel(vo.getCUSTOMER_TEL()); + entity.setReceiveCity(vo.getRECEIVE_CITY()); + entity.setDeliveryCity(vo.getDELIVERY_CITY()); + entity.setShipmentDate(vo.getSHIPMENT_DATE()); + entity.setCarrierCode(vo.getCARRIER_CODE()); + entity.setCarrierName(vo.getCARRIER_NAME()); + entity.setShipmentRoute(vo.getSHIPMENT_ROUTE()); + entity.setIsAllocation(vo.getIS_ALLOCATION()); + entity.setShipmentNumber(vo.getSHIPMENT_NUMBER()); + entity.setShipmentPlateNumber(vo.getSHIPMENT_PLATE_NUMBER()); + entity.setFlag(vo.getFLAG()); + entity.setShipmentTypeDesc(vo.getSHIPMENT_TYPE_DESC()); + entities.add(entity); + } + if (CollUtil.isNotEmpty(entities)) { + deliveryNoteService.saveBatch(entities); + // 处理暂存单 + deliveryNoteService.buildAdvance(entities); + FactoryOrderLogEntity logEntity1 = new FactoryOrderLogEntity(); + logEntity1.setSaxStatus(SaxStatusEnums.SUCCESS.getCode()); + logEntity1.setId(logId); + logService.saveOrUpdate(logEntity1); + } + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mq/NodeDataPushListener.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mq/NodeDataPushListener.java new file mode 100644 index 000000000..07c83687a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mq/NodeDataPushListener.java @@ -0,0 +1,139 @@ +package com.logpm.factorydata.olo.mq; + +import cn.hutool.core.collection.CollUtil; +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.http.HttpUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.olo.enums.FactoryNodeEnums; +import com.logpm.factorydata.olo.enums.NodeMappingEnums; +import com.logpm.factorydata.olo.enums.NodeNeedEnums; +import com.logpm.factorydata.olo.pros.OldProperties; +import com.logpm.factorydata.vo.PushData; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.WorkNodeEnums; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 监听业务系统推送给节点数据 + * + * @author zhaoqiaobo + * @create 2024-03-18 0:02 + */ +@Slf4j +@Component +@AllArgsConstructor +public class NodeDataPushListener { + + private final IFactoryDataClient factoryDataClient; + private final OldProperties oldProperties; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.OLO_NODE_DATA_PUSH, durable = "true"), + exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, type = ExchangeTypes.TOPIC), + key = FactoryDataConstants.Mq.RoutingKeys.OLO_NODE_DATA_PUSH + )) + @Transactional(rollbackFor = Exception.class) + public void nodeDataPush(String msg) { + log.info("接收到节点数据推送:{}", msg); + if (checkData(msg)) { + return; + } + JSONObject entries = JSONUtil.parseObj(msg); + // 节点 + String node = entries.getStr("node"); + WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node); + FactoryNodeEnums factoryNode = NodeMappingEnums.getFactoryByNodeAndStatus(workNodeEnums); + // 2 获取业务数据 + List content = entries.getBeanList("content", PushData.class); + // 按订单号和运单号进行分组 + if (CollUtil.isNotEmpty(content)) { + Map> sendMap = content.stream() + .collect(Collectors.groupingBy(data -> data.getOrderCode() + data.getWaybillNumber())); + JSONArray jsons = new JSONArray(sendMap.size()); + for (Map.Entry> entry : sendMap.entrySet()) { + List pushDatas = entry.getValue(); + PushData pushData = pushDatas.get(0); + JSONObject js = new JSONObject(); + js.set("status", factoryNode.getText()); + js.set("opTime", DateUtil.now()); + js.set("content", factoryNode.getText()); + js.set("orderNo", pushData.getOrderCode()); + js.set("deliveryNo", pushData.getWaybillNumber()); + js.set("siteLevel", 3); + js.set("nodeName", pushData.getWarehouseName()); + js.set("receiveOrSend", 1); + js.set("shipmentSplitNo", ""); + js.set("receivable", 0); + js.set("receipts", 0); + js.set("shipmentNo", ""); + JSONArray snArray = new JSONArray(pushDatas.size()); + for (PushData data : pushDatas) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set("sn", data.getPackageCode()); + jsonObject.set("qty", 1); + snArray.add(jsonObject); + } + js.set("snList", snArray); + jsons.add(js); + } + if (StrUtil.isNotEmpty(oldProperties.getPushNodeUrl())) { + try { + if (CollUtil.isNotEmpty(jsons)) { + log.info("推送节点数据:{}", JSONUtil.toJsonStr(jsons)); + String post = HttpUtil.post(oldProperties.getPushNodeUrl(), JSONUtil.toJsonStr(jsons)); + log.info("推送结果:{}", post); + } + } catch (Exception e) { + e.printStackTrace(); + log.error("推送节点数据错误:{}", e); + } + } + } + } + + private boolean checkData(String msg) { + if (StrUtil.isEmpty(msg)) { + return true; + } + if (!msg.contains("brand") || !msg.contains("content") || !msg.contains("node")) { + return true; + } + JSONObject entries = JSONUtil.parseObj(msg); + String node = entries.getStr("node"); + if (StrUtil.isEmpty(node)) { + return true; + } + // 不是志邦需要的节点数据直接不处理 + if (!EnumUtil.contains(NodeNeedEnums.class, node)) { + return true; + } + WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node); + if (ObjectUtil.isEmpty(workNodeEnums)) { + return true; + } + List content = entries.getBeanList("content", JSONObject.class); + if (CollUtil.isEmpty(content)) { + return true; + } + return false; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/pros/FactoryDataOloProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/pros/FactoryDataOloProperties.java new file mode 100644 index 000000000..2b34bef63 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/pros/FactoryDataOloProperties.java @@ -0,0 +1,20 @@ +package com.logpm.factorydata.olo.pros; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * FactoryProperties + * + * @author pref + */ +@Data +@ConfigurationProperties(prefix = "logpm") +public class FactoryDataOloProperties { + /** + * 名称 + */ + private String name; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/pros/OldProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/pros/OldProperties.java new file mode 100644 index 000000000..9d414cf8b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/pros/OldProperties.java @@ -0,0 +1,19 @@ +package com.logpm.factorydata.olo.pros; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 老系统配置 + * @author zhaoqiaobo + * @Date 2024/5/29 + **/ +@Data +@ConfigurationProperties(prefix = "old") +public class OldProperties { + /** + * 推送节点数据到来系统的 url + */ + private String pushNodeUrl; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/DeliveryNoteService.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/DeliveryNoteService.java new file mode 100644 index 000000000..cc0382041 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/DeliveryNoteService.java @@ -0,0 +1,29 @@ +package com.logpm.factorydata.olo.service; + +import com.logpm.factorydata.olo.entity.DeliveryNoteEntity; +import com.logpm.factorydata.olo.vo.DeliveryNoteVO; +import org.springblade.core.mp.base.BaseService; + +import java.util.List; + +/** + * 索菲亚发货单 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface DeliveryNoteService extends BaseService { + + String order(List vo); + + void buildAdvance(List entities); + + /** + * 我乐自定义数据推送 + + * @return void + * @author zqb 2024/5/29 + **/ + void customPushNodeData(); + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/FactoryOrderLogService.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/FactoryOrderLogService.java new file mode 100644 index 000000000..1c7d30f11 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/FactoryOrderLogService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.olo.service; + +import com.logpm.factorydata.olo.entity.FactoryOrderLogEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 工厂订单日志 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface FactoryOrderLogService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/IFactoryTokenService.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/IFactoryTokenService.java new file mode 100644 index 000000000..ef703922b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/IFactoryTokenService.java @@ -0,0 +1,15 @@ +package com.logpm.factorydata.olo.service; + +import com.logpm.factorydata.olo.entity.FactoryToken; +import org.springblade.core.mp.base.BaseService; + +import java.security.NoSuchAlgorithmException; + +/** + * 工厂推送数据接口 + */ +public interface IFactoryTokenService extends BaseService { + + + boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException; +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/DeliveryNoteServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/DeliveryNoteServiceImpl.java new file mode 100644 index 000000000..379d31593 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/DeliveryNoteServiceImpl.java @@ -0,0 +1,309 @@ +package com.logpm.factorydata.olo.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.logpm.factorydata.base.feign.IFactoryDataBaseClient; +import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.enums.SaxStatusEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.olo.entity.DeliveryNoteEntity; +import com.logpm.factorydata.olo.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.olo.mapper.DeliveryNoteMapper; +import com.logpm.factorydata.olo.pros.OldProperties; +import com.logpm.factorydata.olo.service.DeliveryNoteService; +import com.logpm.factorydata.olo.service.FactoryOrderLogService; +import com.logpm.factorydata.olo.vo.DeliveryNoteVO; +import com.logpm.factorydata.vo.SendMsg; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.io.IOUtils; +import org.jetbrains.annotations.NotNull; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.common.constant.HttpConstants; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.common.utils.FileLogsUtil; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.oss.model.BladeFile; +import org.springblade.core.tool.api.R; +import org.springblade.resource.feign.IOssClient; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.BigDecimal; +import java.nio.file.Files; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 发货单 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class DeliveryNoteServiceImpl extends BaseServiceImpl implements DeliveryNoteService { + + private final IFactoryDataClient factoryDataClient; + private final FactoryOrderLogService factoryOrderLogService; + private final IOssClient ossClient; + private final IFactoryDataBaseClient baseClient; + private final OldProperties oldProperties; + private final RabbitTemplate rabbitTemplate; + + @Override + public String order(List vo) { + + // 1 上传数据到 minio 获取到地址 + String url = uploadFile(JSONUtil.toJsonStr(vo)); + // 2 保存地址到数据库 + FactoryOrderLogEntity logEntity = new FactoryOrderLogEntity(); + logEntity.setType(1); + logEntity.setSaxStatus(SaxStatusEnums.NOMAL.getCode()); + logEntity.setLogUrl(url); + factoryOrderLogService.save(logEntity); + + // 3 将消息发送给 mq,解析保存 + SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.OLO_FACTORY_ORDER) + .message(JSONUtil.toJsonStr(logEntity)).build(); + factoryDataClient.sendMessage(build); + return "成功"; + } + + @Override + @LogpmAsync("asyncExecutor") + public void buildAdvance(List vos) { + // 新起线程构建暂存单发送mq + Long startWarehouseId = null; + String startWarehouseName = null; + String tenantId = null; + // 获取工厂基地绑定的始发仓信息 + R warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.OLO.getValue(), BrandEnums.OLO.getValue()); + if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) { + FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData(); + if (ObjectUtil.isNotNull(data)) { + startWarehouseId = data.getWarehouseId(); + startWarehouseName = data.getWarehouseName(); + tenantId = data.getTenantId(); + } + } + Map> advanceMap = new HashMap<>(); + // 车次号 + 订单自编号 一个暂存单 + for (DeliveryNoteEntity detail : vos) { + String crmSo = detail.getCrmSo(); + String shipmentNumber = detail.getShipmentNo(); + String advanceKey = crmSo + shipmentNumber; + if (advanceMap.containsKey(advanceKey)) { + advanceMap.get(advanceKey).add(detail); + } else { + ArrayList orderPackageDTOS = new ArrayList<>(); + orderPackageDTOS.add(detail); + advanceMap.put(advanceKey, orderPackageDTOS); + } + } + // 组装暂存单数据 + List advances = new ArrayList<>(); + for (Map.Entry> stringListEntry : advanceMap.entrySet()) { + List value = stringListEntry.getValue(); + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + advanceEntity.setHasPackage(CollUtil.isNotEmpty(value) ? 1 : 0); + advanceEntity.setOrderType(""); + advanceEntity.setBrand(BrandEnums.OLO.getValue()); + advanceEntity.setSiteName(""); + advanceEntity.setArea(""); + advanceEntity.setTotalNum(CollUtil.isNotEmpty(value) ? value.size() : 0); + + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(startWarehouseId); + advanceEntity.setWarehouseName(startWarehouseName); + + advanceEntity.setIsGcp(0); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setFreezeStatus("0"); + + List packageList = new ArrayList<>(); + for (DeliveryNoteEntity orderPackageDTO : value) { + advanceEntity.setPackName(orderPackageDTO.getSpace()); + advanceEntity.setCarrierName(orderPackageDTO.getCarrierName()); + advanceEntity.setSenderName(""); + advanceEntity.setSenderPhone(""); + advanceEntity.setSenderAddress(""); + advanceEntity.setTrainNumber(orderPackageDTO.getShipmentNo()); + advanceEntity.setSenderFactory(BrandEnums.OLO.getValue()); + advanceEntity.setOrderCode(orderPackageDTO.getCrmSo()); + advanceEntity.setDealerCode(orderPackageDTO.getCustomerCode()); + advanceEntity.setDealerName(orderPackageDTO.getCustomerName()); + advanceEntity.setStoreCode(orderPackageDTO.getCustomerCode()); + advanceEntity.setStoreName(orderPackageDTO.getCustomerName()); + advanceEntity.setServiceNum(orderPackageDTO.getShipmentSplitNo()); + advanceEntity.setCustomerName(orderPackageDTO.getEndingCustomer()); + advanceEntity.setCustomerPhone(orderPackageDTO.getEndingCustomerTel()); + advanceEntity.setCustomerAddress(orderPackageDTO.getZgkdz()); + + // 封装包件 + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(startWarehouseId); + advanceDetailEntity.setWarehouseName(startWarehouseName); +// advanceDetailEntity.setIncomingWarehouseId(0L); +// advanceDetailEntity.setIncomingWarehouseName(""); + // 根据志邦的一流单标识赋值 + advanceEntity.setLegacyStatus("0"); + if (StrUtil.contains(orderPackageDTO.getCrmSo(), "遗")) { + advanceEntity.setLegacyStatus("1"); + } + + advanceDetailEntity.setOrderCode(orderPackageDTO.getCrmSo()); + advanceDetailEntity.setBrand(BrandEnums.OLO.getValue()); + advanceDetailEntity.setSystemType("线上"); + advanceDetailEntity.setFirstPackName(orderPackageDTO.getMaterialCategory()); + // 获取映射志邦映射品类信息 + //二级品类名称 + advanceDetailEntity.setSecondPackName(orderPackageDTO.getMaterialCategory()); + //三级品类名称 + advanceDetailEntity.setThirdPackName(orderPackageDTO.getMaterialCategory()); + advanceDetailEntity.setMaterialName(orderPackageDTO.getMaterialCategory()); + + advanceDetailEntity.setSiteName(""); + advanceDetailEntity.setSiteCode(""); + advanceDetailEntity.setQuantity((StrUtil.isNotBlank(orderPackageDTO.getQty()) && NumberUtil.isNumber(orderPackageDTO.getQty())) ? Convert.toInt(orderPackageDTO.getQty()) : 0); + advanceDetailEntity.setOrderPackageCode(orderPackageDTO.getSn()); + advanceDetailEntity.setTrainNumber(orderPackageDTO.getShipmentNo()); + advanceDetailEntity.setServiceNum(orderPackageDTO.getShipmentSplitNo()); + advanceDetailEntity.setWaybillNo(""); + advanceDetailEntity.setPackageStatus("0"); + advanceDetailEntity.setWeight(StrUtil.isNotBlank(orderPackageDTO.getSnWeight()) ? new BigDecimal(orderPackageDTO.getSnWeight()) : BigDecimal.ZERO); + advanceDetailEntity.setVolume(StrUtil.isNotBlank(orderPackageDTO.getSnVolume()) ? new BigDecimal(orderPackageDTO.getSnVolume()) : BigDecimal.ZERO); +// advanceDetailEntity.setChargeType(0); + advanceDetailEntity.setSupple(""); + advanceDetailEntity.setManifest(""); + advanceDetailEntity.setReturnNum(""); + advanceDetailEntity.setSendDateStr(DateUtil.formatLocalDateTime(LocalDateTime.now())); + advanceDetailEntity.setCarNumber(""); + advanceDetailEntity.setGoodsMan(""); + advanceDetailEntity.setTenantId(tenantId); + advanceDetailEntity.setStatus(0); + advanceDetailEntity.setIsDeleted(0); + JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + packageList.add(entries); + } + // 转成json对象,然后将包件明细放到detail中 + JSONObject entries = JSONUtil.parseObj(advanceEntity); + entries.set("details", JSONUtil.toJsonStr(packageList)); + advances.add(entries); + } + // 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg. + if (CollUtil.isNotEmpty(advances)) { + for (JSONObject advance : advances) { + SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); + factoryDataClient.sendMessage(sendMsg); + } + } + } + + @Override + public void customPushNodeData() { + JSONObject js = this.baseMapper.customPushNodeData(); + if (ObjectUtil.isEmpty(js)) { + return; + } + String sns = js.getStr("sns"); + List pushDatas = StrUtil.split(sns, ","); + js.set("siteLevel", 3); + js.set("receiveOrSend", 1); + js.set("receivable", 0); + js.set("receipts", 0); + JSONArray snArray = new JSONArray(pushDatas.size()); + for (String data : pushDatas) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set("sn", data); + jsonObject.set("qty", 1); + snArray.add(jsonObject); + } + js.set("snList", snArray); + js.remove("sns"); + JSONArray jsonArray = new JSONArray(); + jsonArray.add(js); + if (StrUtil.isNotEmpty(oldProperties.getPushNodeUrl())) { + try { + log.info("自定义推送节点数据:{}", JSONUtil.toJsonStr(jsonArray)); + String post = HttpUtil.post(oldProperties.getPushNodeUrl(), JSONUtil.toJsonStr(jsonArray)); + log.info("推送结果:{}", post); + // 修改推送状态 + this.baseMapper.updateSustomPushNodeDataStatus(js.getStr("status"), js.getStr("orderNo"), js.getStr("deliveryNo")); + } catch (Exception e) { + e.printStackTrace(); + log.error("推送节点数据错误:{}", e); + } + } + } + + private String uploadFile(String body) { + //文本内容和保存为本地文件 并上传 + String logPath = FileLogsUtil.saveFileLogs(body); + log.info(">>> 文件路径 {}", logPath); + + MultipartFile multi = getMultipartFile(logPath); + //上传到服务器 + R r = ossClient.fileUpload(multi, "olo-order-logs"); + if (r.isSuccess()) { + BladeFile data = (BladeFile) r.getData(); + // 删除本地文件 + FileUtil.del(logPath); + return data.getLink(); + } + return null; + } + + @NotNull + private MultipartFile getMultipartFile(String logPath) { + File file = new File(logPath); + + // File 转 MultipartFile + FileItem item = new DiskFileItemFactory().createItem("file" + , MediaType.MULTIPART_FORM_DATA_VALUE + , true + , file.getName()); + try ( + InputStream input = Files.newInputStream(file.toPath()); + OutputStream os = item.getOutputStream()) { + // 流转移 + IOUtils.copy(input, os); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid file: " + e, e); + } + + return new CommonsMultipartFile(item); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/FactoryOrderLogServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/FactoryOrderLogServiceImpl.java new file mode 100644 index 000000000..ca8fa4776 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/FactoryOrderLogServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.olo.service.impl; + +import com.logpm.factorydata.olo.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.olo.mapper.FactoryOrderLogMapper; +import com.logpm.factorydata.olo.service.FactoryOrderLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 工厂订单日志 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class FactoryOrderLogServiceImpl extends BaseServiceImpl implements FactoryOrderLogService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/FactoryTokenServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/FactoryTokenServiceImpl.java new file mode 100644 index 000000000..1958c145a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/FactoryTokenServiceImpl.java @@ -0,0 +1,62 @@ +package com.logpm.factorydata.olo.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.factorydata.olo.entity.FactoryToken; +import com.logpm.factorydata.olo.mapper.FactoryTokenMapper; +import com.logpm.factorydata.olo.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.redis.cache.BladeRedis; +import org.springframework.stereotype.Service; + +import java.security.NoSuchAlgorithmException; +import java.util.Objects; + +@AllArgsConstructor +@Service +public class FactoryTokenServiceImpl extends BaseServiceImpl implements IFactoryTokenService { + + private static final Logger logger = LoggerFactory.getLogger(FactoryTokenServiceImpl.class); + + private final BladeRedis bladeRedis; + + @Override + public boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException { + logger.info("#########verifyToken: 验证token开始"); + //先生成token摘要 +// String tokenAbst = MD5Utils.md5Hex(token.getBytes(StandardCharsets.UTF_8)); + + //编写查询条件 + String key = "corpId:" + corpId; + FactoryToken factoryToken = bladeRedis.get(key); + + if (Objects.isNull(factoryToken)) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("token", token); + factoryToken = baseMapper.selectOne(queryWrapper); + } + + + if (Objects.isNull(factoryToken)) { + logger.error("#########verifyToken: token1验证不通过 token={},corpid={}", token, corpId); + return false; + } + logger.info("#########verifyToken: 验证token 传入token {} 验证token {}", token, factoryToken.getToken()); + if (!factoryToken.getToken().equals(token)) { + logger.error("#########verifyToken: token2验证不通过 token={},corpid={}", token, corpId); + return false; + } + + + Long expireTimeLong = factoryToken.getExpireTime().getTime(); + Long now = System.currentTimeMillis(); + //判断是否过期 + if (now > expireTimeLong) { + logger.error("#########verifyToken: token验证不通过 已过期 token={},corpId={}", token, corpId); + return false; + } + return true; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/vo/DeliveryNoteVO.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/vo/DeliveryNoteVO.java new file mode 100644 index 000000000..8952e45f3 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/vo/DeliveryNoteVO.java @@ -0,0 +1,76 @@ +package com.logpm.factorydata.olo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 送货单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "我乐发运信息", description = "我乐发运信息") +public class DeliveryNoteVO implements Serializable { + + @ApiModelProperty(name = "发运汇总单号") + private String SHIPMENT_NO; + @ApiModelProperty(name = "发运分单号") + private String SHIPMENT_SPLIT_NO; + @ApiModelProperty(name = "顾客姓名") + private String ENDING_CUSTOMER; + @ApiModelProperty(name = "顾客地址") + private String ZGKDZ; + @ApiModelProperty(name = "顾客电话") + private String ENDING_CUSTOMER_TEL; + @ApiModelProperty(name = "CRM单号") + private String CRM_SO; + @ApiModelProperty(name = "空间") + private String SPACE; + @ApiModelProperty(name = "SN") + private String SN; + @ApiModelProperty(name = "货物类型") + private String MATERIAL_CATEGORY; + @ApiModelProperty(name = "体积") + private String SN_VOLUME; + @ApiModelProperty(name = "重量") + private String SN_WEIGHT; + @ApiModelProperty(name = "件数") + private String QTY; + @ApiModelProperty(name = "货物描述") + private String MATERIAL_DESC; + @ApiModelProperty(name = "汇总运价") + private String SUM_PRICE; + @ApiModelProperty(name = "经销商名称") + private String CUSTOMER_NAME; + @ApiModelProperty(name = "经销商编码") + private String CUSTOMER_CODE; + @ApiModelProperty(name = "经销商联系电话") + private String CUSTOMER_TEL; + @ApiModelProperty(name = "发货城市") + private String RECEIVE_CITY; + @ApiModelProperty(name = "发货城市") + private String DELIVERY_CITY; + @ApiModelProperty(name = "工厂发运日期") + private String SHIPMENT_DATE; + @ApiModelProperty(name = "承运商编码") + private String CARRIER_CODE; + @ApiModelProperty(name = "承运商名称") + private String CARRIER_NAME; + @ApiModelProperty(name = "物流线路名称") + private String SHIPMENT_ROUTE; + @ApiModelProperty(name = "服务方式(是否干仓配)") + private String IS_ALLOCATION; + @ApiModelProperty(name = "发运车次号") + private String SHIPMENT_NUMBER; + @ApiModelProperty(name = "车牌") + private String SHIPMENT_PLATE_NUMBER; + @ApiModelProperty(name = "标识:空:原始数据;A:新增 ;D:删除") + private String FLAG; + @ApiModelProperty(name = "发运方式") + private String SHIPMENT_TYPE_DESC; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/wrapper/CustomHttpServletRequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/wrapper/CustomHttpServletRequestWrapper.java new file mode 100644 index 000000000..447a11ad6 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/wrapper/CustomHttpServletRequestWrapper.java @@ -0,0 +1,38 @@ +package com.logpm.factorydata.olo.wrapper; + +import org.springframework.http.HttpHeaders; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper { + + private final HttpHeaders headers; + + public CustomHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + headers = new HttpHeaders(); + } + + @Override + public String getHeader(String name) { + String headerValue = headers.getFirst(name); + return headerValue != null ? headerValue : super.getHeader(name); + } + + @Override + public Enumeration getHeaderNames() { + List names = Collections.list(super.getHeaderNames()); + headers.forEach((key, value) -> names.add(key)); + return Collections.enumeration(names); + } + + // 其他需要覆盖的方法... + + public void addHeader(String name, String value) { + headers.add(name, value); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/wrapper/RequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/wrapper/RequestWrapper.java new file mode 100644 index 000000000..6e0e96342 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/wrapper/RequestWrapper.java @@ -0,0 +1,75 @@ +package com.logpm.factorydata.olo.wrapper; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class RequestWrapper extends HttpServletRequestWrapper { + private final String body; + public RequestWrapper(HttpServletRequest request) throws IOException { + super(request); + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } catch (IOException ex) { + throw ex; + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException ex) { + throw ex; + } + } + } + body = stringBuilder.toString(); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); + ServletInputStream servletInputStream = new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + @Override + public boolean isReady() { + return false; + } + @Override + public void setReadListener(ReadListener readListener) {} + @Override + public int read() throws IOException { + return byteArrayInputStream.read(); + } + }; + return servletInputStream; + + } + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } + public String getBody() { + return this.body; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-dev.yml b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-dev.yml new file mode 100644 index 000000000..ddf6d2ffe --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-dev.yml @@ -0,0 +1,73 @@ +#服务器端口 +server: + port: 18930 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.46 + port: 5672 + username: admin + password: admin + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-olo.master.url} + username: ${blade.datasource.factorydata-olo.master.username} + password: ${blade.datasource.factorydata-olo.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-olo.627683.url} + username: ${blade.datasource.factorydata-olo.627683.username} + password: ${blade.datasource.factorydata-olo.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-prod.yml b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-prod.yml new file mode 100644 index 000000000..4e04b9630 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-prod.yml @@ -0,0 +1,47 @@ +#服务器端口 +server: + port: 18930 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-olo.master.url} + username: ${blade.datasource.factorydata-olo.master.username} + password: ${blade.datasource.factorydata-olo.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-olo.627683.url} + username: ${blade.datasource.factorydata-olo.627683.username} + password: ${blade.datasource.factorydata-olo.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-test.yml b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-test.yml new file mode 100644 index 000000000..3cbea6a0b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-test.yml @@ -0,0 +1,73 @@ +#服务器端口 +server: + port: 18930 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.110 + port: 5672 + username: admin + password: Slwk@123654 + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-olo.master.url} + username: ${blade.datasource.factorydata-olo.master.username} + password: ${blade.datasource.factorydata-olo.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-olo.627683.url} + username: ${blade.datasource.factorydata-olo.627683.username} + password: ${blade.datasource.factorydata-olo.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application.yml b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application.yml new file mode 100644 index 000000000..1012d6612 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application.yml @@ -0,0 +1,20 @@ +#mybatis-plus配置 +mybatis-plus: + mapper-locations: classpath:com/logpm/**/mapper/*Mapper.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.logpm.**.entity + +#swagger扫描路径配置 +swagger: + base-packages: + - org.springblade + - com.logpm + +logging: + config: classpath:logback.xml + + +spring: + main: + allow-circular-references: true + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/logback.xml b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/logback.xml new file mode 100644 index 000000000..7170050de --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/logback.xml @@ -0,0 +1,40 @@ + + + + logback + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf8 + + + + + ${log.path} + + ${log.path}.%d{yyyy-MM-dd}.zip + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/Dockerfile b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/Dockerfile new file mode 100644 index 000000000..40a1b2afd --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/Dockerfile @@ -0,0 +1,14 @@ +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 + +MAINTAINER h5u@163.com + +RUN mkdir -p /logpm/logpm-factory-data-suofeiya + +WORKDIR /logpm/logpm-factory-data-suofeiya + +EXPOSE 18920 + +ADD ./target/logpm-factory-data-suofeiya.jar ./app.jar + +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","-Xms128m","-Xmx512m", "app.jar"] +CMD ["--spring.profiles.active=test"] diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/pom.xml b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/pom.xml new file mode 100644 index 000000000..55734ddea --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/pom.xml @@ -0,0 +1,97 @@ + + + + logpm-factory-data + org.springblade + 3.2.0.RELEASE + + 4.0.0 + ${bladex.project.version} + jar + logpm-factory-data-suofeiya + + + 8 + 8 + + + + + org.springblade + blade-core-boot + + + org.springblade + blade-core-auto + provided + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springblade + logpm-factory-data-api + 3.2.0.RELEASE + + + com.xuxueli + xxl-job-core + + + org.springblade + blade-starter-swagger + + + org.springblade + logpm-trunkline-api + 3.2.0.RELEASE + + + org.springblade + logpm-factory-data-base-api + ${bladex.project.version} + + + org.springblade + blade-starter-oss + + + io.minio + minio + + + org.springblade + blade-resource-api + 3.2.0.RELEASE + compile + + + + + + + com.spotify + dockerfile-maven-plugin + + ${docker.username} + ${docker.password} + ${docker.registry.url}/${docker.namespace}/${project.artifactId} + ${project.version} + true + + target/${project.build.finalName}.jar + + false + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/FactoryDataSuoFeiYaApplication.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/FactoryDataSuoFeiYaApplication.java new file mode 100644 index 000000000..8dc88106a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/FactoryDataSuoFeiYaApplication.java @@ -0,0 +1,20 @@ +package com.logpm.factorydata; + +import org.springblade.common.constant.ModuleNameConstant; +import org.springblade.core.cloud.client.BladeCloudApplication; +import org.springblade.core.launch.BladeApplication; + +/** + * 索菲亚工厂数据启动类 + * + * @author zhaoqiaobo + * @create 2024-4-26 + */ +@BladeCloudApplication +public class FactoryDataSuoFeiYaApplication { + + public static void main(String[] args) { + BladeApplication.run(ModuleNameConstant.LOGPM_FACTORY_DATA_SUOFEIYA_NAME, FactoryDataSuoFeiYaApplication.class, args); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..b7eb3ac74 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.factorydata.suofeiya.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..bed29b6e4 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.factorydata.suofeiya.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/CustomMessageConverter.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/CustomMessageConverter.java new file mode 100644 index 000000000..06d25cef8 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/CustomMessageConverter.java @@ -0,0 +1,161 @@ +package com.logpm.factorydata.suofeiya.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength((long) bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/ExecutorConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/ExecutorConfig.java new file mode 100644 index 000000000..68ee9b419 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/ExecutorConfig.java @@ -0,0 +1,79 @@ +package com.logpm.factorydata.suofeiya.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.http.HttpHeaders; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + ThreadLocalUtil.put("bladeContext", headers); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/FactoryDataSuoFeiYaConfiguration.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/FactoryDataSuoFeiYaConfiguration.java new file mode 100644 index 000000000..5145b2145 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/FactoryDataSuoFeiYaConfiguration.java @@ -0,0 +1,40 @@ +/* + * 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.suofeiya.config; + + +import com.logpm.factorydata.suofeiya.pros.FactoryDataSuoFeiYaProperties; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 配置feign、mybatis包名、properties + * + * @author chaos + */ +@Configuration(proxyBeanMethods = false) +@ComponentScan({"org.springblade", "com.logpm"}) +@EnableFeignClients({"org.springblade", "com.logpm"}) +@MapperScan({"org.springblade.**.mapper.**", "com.logpm.**.mapper.**"}) +@EnableConfigurationProperties(FactoryDataSuoFeiYaProperties.class) +public class FactoryDataSuoFeiYaConfiguration { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/InterceptorAdapterConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/InterceptorAdapterConfig.java new file mode 100644 index 000000000..1ce93e7dd --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/InterceptorAdapterConfig.java @@ -0,0 +1,32 @@ +package com.logpm.factorydata.suofeiya.config; + +import com.logpm.factorydata.suofeiya.interceptor.FactoryAccountsInterceptor; +import com.logpm.factorydata.suofeiya.interceptor.LocalServerLoginAccountsInterceptor; +import com.logpm.factorydata.suofeiya.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.springblade.common.component.MockLoginService; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@AllArgsConstructor +public class InterceptorAdapterConfig implements WebMvcConfigurer { + + private final IFactoryTokenService factoryTokenService; + private final BladeRedis redis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + + @Override + public void addInterceptors(InterceptorRegistry interceptorRegistry) { +// interceptorRegistry.addInterceptor(new FactoryAccountsInterceptor(factoryTokenService)) +// .addPathPatterns("/**").order(1); + interceptorRegistry.addInterceptor(new LocalServerLoginAccountsInterceptor(redis, environment,redisLockClient,mockLoginService)) + .addPathPatterns("/**").order(2); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/RabbitConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/RabbitConfig.java new file mode 100644 index 000000000..194f0d2b2 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/config/RabbitConfig.java @@ -0,0 +1,17 @@ +package com.logpm.factorydata.suofeiya.config; + +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory factory) { + RabbitTemplate template = new RabbitTemplate(factory); + template.setMessageConverter(new CustomMessageConverter()); + return template; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/controller/OrderController.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/controller/OrderController.java new file mode 100644 index 000000000..57d4640f0 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/controller/OrderController.java @@ -0,0 +1,55 @@ +package com.logpm.factorydata.suofeiya.controller; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.factorydata.suofeiya.service.DeliveryNoteService; +import com.logpm.factorydata.suofeiya.vo.DeliveryNoteVO; +import com.logpm.factorydata.suofeiya.vo.ParamVO; +import com.logpm.factorydata.suofeiya.vo.Resp; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * 工厂订单 前端控制器 + * + * @author zhaoqiaobo + * @create 2024-03-21 19:27 + */ +@Slf4j +@RestController +@RequestMapping("/order") +@AllArgsConstructor +@Api(value = "工厂订单", tags = "工厂订单") +public class OrderController { + + private final DeliveryNoteService service; + + @ResponseBody + @PostMapping + @ApiOperationSupport(order = 1) + @ApiOperation(value = "工厂订单", notes = "工厂订单") + public Resp order(@RequestBody DeliveryNoteVO params) { + String jsonStr = JSONUtil.toJsonStr(params); + log.info("接收工厂订单:{} ", jsonStr); + String res = ""; + try { +// DeliveryNoteVO params = vo.getParams(); + if (ObjectUtil.isNotEmpty(params)) { + res = service.order(params); + } + } catch (Exception e) { + log.error("工厂订单异常:{} ", e); + return Resp.success("服务器异常"); + } + return Resp.success(res); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/DeliveryNoteEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/DeliveryNoteEntity.java new file mode 100644 index 000000000..b03bc46f5 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/DeliveryNoteEntity.java @@ -0,0 +1,64 @@ +package com.logpm.factorydata.suofeiya.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 送货单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("sfy_delivery_note") +@ApiModel(value = "索菲亚发货单", description = "索菲亚发货单") +@EqualsAndHashCode(callSuper = true) +public class DeliveryNoteEntity extends BaseEntity { + + @ApiModelProperty(name = "日志id") + private String logId; + @ApiModelProperty(name = "渠道单号") + @TableField("logistic_id") + private String logisticID; + @ApiModelProperty(name = "车牌号") + private String truckNo; + @ApiModelProperty(name = "车型") + private String truckTypeName; + @ApiModelProperty(name = "物流商编码") + private String carrierNo; + @ApiModelProperty(name = "司机姓名") + private String driverName; + @ApiModelProperty(name = "联系方式") + private String dirverTel; + @ApiModelProperty(name = "出厂时间") + private String gpsLeaveWhTime; + @ApiModelProperty(name = "发货方地址") + private String sendAddr; + @ApiModelProperty(name = "下单模式") + private String orderType; + @ApiModelProperty(name = "运输方式/产品类型") + private String transportType; + @ApiModelProperty(name = "客户编码/月结账号") + private String customerCode; + @ApiModelProperty(name = "备注") + private String remark; + @ApiModelProperty(name = "扩展字段") + private String orderExtendField; + + @ApiModelProperty(name = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(name = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(name = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(name = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(name = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/FactoryOrderLogEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/FactoryOrderLogEntity.java new file mode 100644 index 000000000..8ed0335b7 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/FactoryOrderLogEntity.java @@ -0,0 +1,58 @@ +package com.logpm.factorydata.suofeiya.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +@Data +@TableName("sfy_factory_log") +@ApiModel(value = "接收工厂订单日志", description = "接收工厂订单日志") +@EqualsAndHashCode(callSuper = true) +public class FactoryOrderLogEntity 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 logUrl; + /** + * 数据类型 1.入库数据 + */ + @ApiModelProperty(name = "数据类型 1.入库数据", notes = "") + private Integer type; + /** + * 解析状态 0 未解析 1 解析失败 2 已解析 + */ + @ApiModelProperty(name = "解析状态 0 未解析 1 解析失败 2 已解析", notes = "") + private Integer saxStatus; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/FactoryToken.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/FactoryToken.java new file mode 100644 index 000000000..21a77ce43 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/FactoryToken.java @@ -0,0 +1,32 @@ +package com.logpm.factorydata.suofeiya.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springblade.core.mp.base.BaseEntity; + +import java.util.Date; + +@Data +@TableName("factory_token") +@ApiModel(value = "FactoryToken对象", description = "工厂账户token") +public class FactoryToken extends BaseEntity { + + @ApiModelProperty("token") + private String token; + + @ApiModelProperty("token摘要") + private String tokenAbst; + + @JsonFormat( + pattern = "yyyy-MM-dd HH:mm:ss" + ) + @ApiModelProperty("过期时间") + private Date expireTime; + + @ApiModelProperty("企业id") + private String corpid; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/OrderInfoEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/OrderInfoEntity.java new file mode 100644 index 000000000..c6347b14f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/OrderInfoEntity.java @@ -0,0 +1,54 @@ +package com.logpm.factorydata.suofeiya.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 订单信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("sfy_order_info") +@ApiModel(value = "订单信息", description = "订单信息") +@EqualsAndHashCode(callSuper = true) +public class OrderInfoEntity extends BaseEntity { + + @ApiModelProperty(name = "日志id") + private String logId; + @ApiModelProperty(name = "发货单id") + private String deliveryNoteId; + @ApiModelProperty(name = "主单号") + private String mainOrderNo; + @ApiModelProperty(name = "订单号") + private String orderNo; + @ApiModelProperty(name = "安装投影面积") + private String area; + @ApiModelProperty(name = "收货地址") + private String receiveAddr; + @ApiModelProperty(name = "收货人") + private String receiver; + @ApiModelProperty(name = "联系电话") + private String receiveTel; + @ApiModelProperty(name = "配送联系人") + private String connectName; + @ApiModelProperty(name = "配送联系电话") + private String connectPhone; + + @ApiModelProperty(name = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(name = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(name = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(name = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(name = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/PackageInfoEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/PackageInfoEntity.java new file mode 100644 index 000000000..bea6a1f7f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/PackageInfoEntity.java @@ -0,0 +1,53 @@ +package com.logpm.factorydata.suofeiya.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 装箱包信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@TableName("sfy_package_info") +@ApiModel(value = "装箱包信息", description = "装箱包信息") +@EqualsAndHashCode(callSuper = true) +public class PackageInfoEntity extends BaseEntity { + + @ApiModelProperty(name = "日志id") + private String logId; + @ApiModelProperty(name = "发货单id") + private String deliveryNoteId; + @ApiModelProperty(name = "标签号") + private String paNo; + @ApiModelProperty(name = "物料名称") + private String plDepart; + @ApiModelProperty(name = "捆包号") + private String tcNumber; + @ApiModelProperty(name = "经销商编码") + private String dealerNo; + @ApiModelProperty(name = "经销商名称") + private String dealerName; + @ApiModelProperty(name = "订单号") + private String orderNo; + @ApiModelProperty(name = "重量") + private String weight; + @ApiModelProperty(name = "体积") + private String volume; + @ApiModelProperty(name = "预留1", notes = "") + private String reserve1; + @ApiModelProperty(name = "预留2", notes = "") + private String reserve2; + @ApiModelProperty(name = "预留3", notes = "") + private String reserve3; + @ApiModelProperty(name = "预留4", notes = "") + private String reserve4; + @ApiModelProperty(name = "预留5", notes = "") + private String reserve5; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/enums/FactoryNodeEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/enums/FactoryNodeEnums.java new file mode 100644 index 000000000..a82010008 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/enums/FactoryNodeEnums.java @@ -0,0 +1,31 @@ +package com.logpm.factorydata.suofeiya.enums; + +import lombok.Getter; +import org.springblade.common.model.IDict; + +/** + * 工厂节点枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum FactoryNodeEnums implements IDict { + + /** 入库 */ + ALREADY_IN_STOCK(101020, "入库"), + /** 出库 */ + INITIAL_WAREHOUSE_LOADING(103020, "出库"), + /** 计划配车 */ + PLAN_DISTRIBUTION(301060, "计划配车"), + /** 配送 */ + DISTRIBUTION_LOADING(302010, "配送"), + /** 签收 */ + CLERK_REVIEW(303010, "签收"), + ; + + FactoryNodeEnums(Integer code, String text) { + init(code, text); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/enums/NodeMappingEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/enums/NodeMappingEnums.java new file mode 100644 index 000000000..6924eb1ee --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/enums/NodeMappingEnums.java @@ -0,0 +1,83 @@ +package com.logpm.factorydata.suofeiya.enums; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Getter; +import org.springblade.common.constant.WorkNodeEnums; + +/** + * 系统和工厂节点映射枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum NodeMappingEnums { + + /** + * 始发仓入库 + */ + INITIAL_WAREHOUSE_ENTRY(FactoryNodeEnums.ALREADY_IN_STOCK, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY, 1), + /** + * 卸车入库 + */ + UNLOAD_INCOMING_WAREHOUSE(FactoryNodeEnums.ALREADY_IN_STOCK, WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE, 1), + /** + * 装车 + */ + INITIAL_WAREHOUSE_LOADING(FactoryNodeEnums.INITIAL_WAREHOUSE_LOADING, WorkNodeEnums.INITIAL_WAREHOUSE_LOADING, 1), + /** + * 计划配车 + */ + PLAN_DISTRIBUTION(FactoryNodeEnums.PLAN_DISTRIBUTION, WorkNodeEnums.PLAN_DISTRIBUTION, 1), + PLAN_BILLOFLADING(FactoryNodeEnums.PLAN_DISTRIBUTION, WorkNodeEnums.PLAN_BILLOFLADING, 1), + + /** + * 已交接 + */ + DISTRIBUTION_LOADING(FactoryNodeEnums.DISTRIBUTION_LOADING, WorkNodeEnums.DISTRIBUTION_LOADING, 1), + /** + * 收货完成 + */ + CLERK_REVIEW(FactoryNodeEnums.CLERK_REVIEW, WorkNodeEnums.CLERK_REVIEW, 1), + CLERK_REVIEW_DIRECT_SHIPPER(FactoryNodeEnums.CLERK_REVIEW, WorkNodeEnums.SIGN_DIRECT_SHIPPER, 1), + CLERK_REVIEW_TRIPARTITE_TRANSFER_DEPART(FactoryNodeEnums.CLERK_REVIEW, WorkNodeEnums.SIGN_TRIPARTITE_TRANSFER_DEPART, 1), + ; + + /** + * 系统作业节点 + */ + private WorkNodeEnums workNodeEnums; + /** + * 工厂作业节点 + */ + private FactoryNodeEnums factoryNodeEnums; + /** + * 状态码 + * 存在我们系统同一个作业节点对应工厂多个节点的情况,通过状态码区分 + */ + private Integer status; + + NodeMappingEnums(FactoryNodeEnums factoryNodeEnums, WorkNodeEnums workNodeEnums, Integer status) { + this.workNodeEnums = workNodeEnums; + this.factoryNodeEnums = factoryNodeEnums; + this.status = status; + } + + public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums) { + return getFactoryByNodeAndStatus(workNodeEnums, 1); + } + + public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums, Integer status) { + NodeMappingEnums[] values = values(); + for (NodeMappingEnums value : values) { + WorkNodeEnums workNodeEnums1 = value.getWorkNodeEnums(); + Integer status1 = value.getStatus(); + FactoryNodeEnums factoryNodeEnums = value.getFactoryNodeEnums(); + if (ObjectUtil.equal(workNodeEnums1, workNodeEnums) && ObjectUtil.equal(status1, status)) { + return factoryNodeEnums; + } + } + return null; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/enums/NodeNeedEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/enums/NodeNeedEnums.java new file mode 100644 index 000000000..c578ae117 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/enums/NodeNeedEnums.java @@ -0,0 +1,39 @@ +package com.logpm.factorydata.suofeiya.enums; + +import lombok.Getter; + +import java.io.Serializable; + +/** + * 作业节点枚举 + * + * @author zhaoqiaobo + * @create 2024-03-20 15:19 + */ +@Getter +public enum NodeNeedEnums implements Serializable { + + INITIAL_WAREHOUSE_ENTRY(101020, "始发仓入库"), + UNLOAD_INCOMING_WAREHOUSE(105010,"卸车入库"), + + INITIAL_WAREHOUSE_LOADING(103020, "装车"), + + PLAN_BILLOFLADING(301040, "计划自提"), + PLAN_DISTRIBUTION(301060, "计划配车"), + + DISTRIBUTION_LOADING(302010, "配送装车"), + + SIGN_DIRECT_SHIPPER(105030,"直发商家签收"), + SIGN_TRIPARTITE_TRANSFER_DEPART(104040, "三方中转签收"), + CLERK_REVIEW(303010, "文员复核"), + ; + + private Integer code; + private String value; + + NodeNeedEnums(Integer code, String value) { + this.code = code; + this.value = value; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/interceptor/FactoryAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/interceptor/FactoryAccountsInterceptor.java new file mode 100644 index 000000000..a34aa97e9 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/interceptor/FactoryAccountsInterceptor.java @@ -0,0 +1,87 @@ +package com.logpm.factorydata.suofeiya.interceptor; + +import com.alibaba.fastjson.JSONObject; +import com.logpm.factorydata.suofeiya.service.IFactoryTokenService; +import com.logpm.factorydata.suofeiya.wrapper.RequestWrapper; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +@Log4j2 +@AllArgsConstructor +public class FactoryAccountsInterceptor implements HandlerInterceptor { + + private final IFactoryTokenService factoryTokenService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + try { + + RequestWrapper myRequestWrapper = new RequestWrapper(request); + String body = myRequestWrapper.getBody(); + JSONObject jsonObject = JSONObject.parseObject(body); + //获取头中参数 + String token = request.getHeader("Authorization"); + String corpId = request.getHeader("corpid"); + if(StringUtil.isBlank(corpId)){ + corpId = jsonObject.getString("corpid"); + } + if(!StringUtil.hasLength(token)){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,token有误"))); + return false; + } + if(!StringUtil.hasLength(corpId)){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,corpId有误"))); + return false; + } + + log.info("##########preHandle: token={}",token); + //验证token + boolean b = factoryTokenService.verifyToken(token,corpId); + if(!b){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,token不存在或已过期"))); + return false; + } + return true; + } catch (Exception e) { + returnJson(response,JSONObject.toJSONString(R.fail(500,"服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null){ + writer.close(); + } + } + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/interceptor/LocalServerLoginAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/interceptor/LocalServerLoginAccountsInterceptor.java new file mode 100644 index 000000000..8f64503e3 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/interceptor/LocalServerLoginAccountsInterceptor.java @@ -0,0 +1,101 @@ +package com.logpm.factorydata.suofeiya.interceptor; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.common.exception.CustomerException; +import org.springblade.common.wrapper.CustomHttpServletRequestWrapper; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Log4j2 +@AllArgsConstructor +public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapter { + + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + + + try { + org.springblade.common.wrapper.CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(request); + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + + // 修改或添加header + + // 发送登录请求 + log.info("##########preHandle: request={}", request); + + wrappedRequest.addHeader("Blade-Auth", "bearer "+data.getString("access_token")); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + + // 用包装后的request替换原始request + request = wrappedRequest; + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + return true; + } catch (Exception e) { + returnJson(response, JSONObject.toJSONString(R.fail(500, "服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/launcher/FactoryDataBaseLauncherServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/launcher/FactoryDataBaseLauncherServiceImpl.java new file mode 100644 index 000000000..9287b29f3 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/launcher/FactoryDataBaseLauncherServiceImpl.java @@ -0,0 +1,60 @@ +/* + * 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.suofeiya.launcher; + +import org.springblade.core.auto.service.AutoService; +import org.springblade.core.launch.constant.NacosConstant; +import org.springblade.core.launch.service.LauncherService; +import org.springblade.core.launch.utils.PropsUtil; +import org.springframework.boot.builder.SpringApplicationBuilder; + +import java.util.Properties; + +/** + * 启动参数拓展 + * + * @author Chill + */ +@AutoService(LauncherService.class) +public class FactoryDataBaseLauncherServiceImpl implements LauncherService { + + @Override + public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) { + Properties props = System.getProperties(); + // 开启多数据源 + PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true"); + // 指定注册配置信息 + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].data-id", NacosConstant.dataId(appName, profile)); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].group", NacosConstant.NACOS_CONFIG_GROUP); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].refresh", NacosConstant.NACOS_CONFIG_REFRESH); + // 指定注册IP + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.ip", "127.0.0.1"); + // 指定注册端口 + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.port", "8200"); + // 自定义命名空间 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.NACOS_NAMESPACE); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.NACOS_NAMESPACE); + // 自定义分组 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.group", NacosConstant.NACOS_CONFIG_GROUP); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.group", NacosConstant.NACOS_CONFIG_GROUP); + } + + @Override + public int getOrder() { + return 20; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/DeliveryNoteMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/DeliveryNoteMapper.java new file mode 100644 index 000000000..f735d3539 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/DeliveryNoteMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.suofeiya.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.suofeiya.entity.DeliveryNoteEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 发货单 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface DeliveryNoteMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryNodeOrderMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryNodeOrderMapper.xml new file mode 100644 index 000000000..34ad59325 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryNodeOrderMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryOrderLogMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryOrderLogMapper.java new file mode 100644 index 000000000..7aaedd14f --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryOrderLogMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.suofeiya.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.suofeiya.entity.FactoryOrderLogEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 工厂订单日志 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface FactoryOrderLogMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryOrderLogMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryOrderLogMapper.xml new file mode 100644 index 000000000..f0ef1666a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryOrderLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryTokenMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryTokenMapper.java new file mode 100644 index 000000000..b7cfc1c81 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryTokenMapper.java @@ -0,0 +1,31 @@ +/* + * 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.suofeiya.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.suofeiya.entity.FactoryToken; + +/** + * 工厂账号接口日志 Mapper 接口 + * + * @author zhy + * @since 2023-03-28 + */ +public interface FactoryTokenMapper extends BaseMapper { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryTokenMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryTokenMapper.xml new file mode 100644 index 000000000..97dc57a35 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryTokenMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/OrderInfoMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/OrderInfoMapper.java new file mode 100644 index 000000000..b7b77ed7a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/OrderInfoMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.suofeiya.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.suofeiya.entity.OrderInfoEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订单信息 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface OrderInfoMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/OrderInfoMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/OrderInfoMapper.xml new file mode 100644 index 000000000..b9764e73b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/OrderInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/PackageInfoMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/PackageInfoMapper.java new file mode 100644 index 000000000..034735443 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/PackageInfoMapper.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.suofeiya.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factorydata.suofeiya.entity.PackageInfoEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 装箱包信息 mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface PackageInfoMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/PackageInfoMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/PackageInfoMapper.xml new file mode 100644 index 000000000..1a4424203 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/PackageInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/FactoryOrderListener.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/FactoryOrderListener.java new file mode 100644 index 000000000..bdfc2ddb6 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/FactoryOrderListener.java @@ -0,0 +1,301 @@ +package com.logpm.factorydata.suofeiya.mq; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.factorydata.base.feign.IFactoryDataBaseClient; +import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.enums.SaxStatusEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.suofeiya.entity.DeliveryNoteEntity; +import com.logpm.factorydata.suofeiya.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.suofeiya.entity.OrderInfoEntity; +import com.logpm.factorydata.suofeiya.entity.PackageInfoEntity; +import com.logpm.factorydata.suofeiya.service.DeliveryNoteService; +import com.logpm.factorydata.suofeiya.service.FactoryOrderLogService; +import com.logpm.factorydata.suofeiya.service.OrderInfoService; +import com.logpm.factorydata.suofeiya.service.PackageInfoService; +import com.logpm.factorydata.suofeiya.vo.DeliveryNoteVO; +import com.logpm.factorydata.suofeiya.vo.OrderInfoVO; +import com.logpm.factorydata.suofeiya.vo.PackageInfoVO; +import com.logpm.factorydata.vo.SendMsg; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.common.constant.HttpConstants; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.tool.api.R; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 监听索菲亚订单数据 + * + * @author zhaoqiaobo + * @create 2024-03-18 + */ +@Slf4j +@Component +@AllArgsConstructor +public class FactoryOrderListener { + + private final DeliveryNoteService deliveryNoteService; + private final OrderInfoService orderInfoService; + private final PackageInfoService packageInfoService; + private final FactoryOrderLogService logService; + + private final BladeRedis bladeRedis; + private final IFactoryDataBaseClient baseClient; + private final IFactoryDataClient factoryDataClient; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.SFY_FACTORY_ORDER), + exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER, type = ExchangeTypes.TOPIC), + key = FactoryDataConstants.Mq.RoutingKeys.SFY_FACTORY_ORDER + )) + @Transactional(rollbackFor = Exception.class) + public void factoryOrder(String msg) { + log.info("处理索菲亚订单:{}", msg); + if (StrUtil.isEmpty(msg)) { + log.error("消息内容为空"); + return; + } + FactoryOrderLogEntity logEntity = JSONUtil.toBean(msg, FactoryOrderLogEntity.class); + if (ObjectUtil.isEmpty(logEntity)) { + log.error("消息内容为空"); + return; + } + // 去 minio 下载文件到本地,然后解析文件内容为实体对象 + DeliveryNoteVO vo = null; + Long logId = logEntity.getId(); + String logUrl = logEntity.getLogUrl(); + if (StrUtil.isNotEmpty(logUrl)) { + List res = new ArrayList<>(); + FileUtil.readLines(URLUtil.url(logUrl), CharsetUtil.CHARSET_UTF_8, res); + if (CollUtil.isNotEmpty(res)) { + String content = res.get(0); + if (StrUtil.isNotEmpty(content)) { + vo = JSONUtil.toBean(content, DeliveryNoteVO.class); + } + } + } + if (ObjectUtil.isNotNull(vo)) { + // 1 解析数据保存入库 + // 车次号唯一 + String logisticID = vo.getLogisticID(); + List list = deliveryNoteService.list(Wrappers.lambdaQuery() + .eq(DeliveryNoteEntity::getLogisticID, logisticID)); + if (CollUtil.isNotEmpty(list)) { + log.error("车次号{} 数据已经处理过了, logId: {}", logisticID, logId); + return; + } + // 处理额外的字段 + if (CollUtil.isNotEmpty(vo.getOrderExtendFields())) { + vo.setOrderExtendField(JSONUtil.toJsonStr(vo.getOrderExtendFields())); + } + vo.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); + deliveryNoteService.save(vo); + List orderInfos = vo.getOrderInfo(); + if (CollUtil.isNotEmpty(orderInfos)) { + List infoEntities = new ArrayList<>(); + for (OrderInfoVO orderInfo : orderInfos) { + OrderInfoEntity orderInfoEntity = new OrderInfoEntity(); + BeanUtil.copyProperties(orderInfo, orderInfoEntity); + orderInfoEntity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); + orderInfoEntity.setDeliveryNoteId(vo.getId().toString()); + infoEntities.add(orderInfoEntity); + } + orderInfoService.saveBatch(infoEntities); + } + if (CollUtil.isNotEmpty(vo.getPackageInfo())) { + List packageInfoEntities = new ArrayList<>(); + for (PackageInfoVO packageInfo : vo.getPackageInfo()) { + PackageInfoEntity entity = new PackageInfoEntity(); + BeanUtil.copyProperties(packageInfo, entity); + entity.setDeliveryNoteId(vo.getId().toString()); + entity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); + packageInfoEntities.add(entity); + } + packageInfoService.saveBatch(packageInfoEntities); + } + // 2 构建暂存单,发送 mq 消息 + FactoryOrderLogEntity logEntity1 = new FactoryOrderLogEntity(); + logEntity1.setSaxStatus(SaxStatusEnums.SUCCESS.getCode()); + logEntity1.setId(logId); + logService.saveOrUpdate(logEntity1); + // 处理暂存单 + buildAdvance(vo); + } + } + + @LogpmAsync("asyncExecutor") + public void buildAdvance(DeliveryNoteVO vo) { + // 新起线程构建暂存单发送mq + Long startWarehouseId = null; + String startWarehouseName = null; + String tenantId = null; + // 获取工厂基地绑定的始发仓信息 + List details = vo.getOrderInfo(); + if (CollUtil.isEmpty(details)) { + return; + } + R warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.SFY.getValue(), BrandEnums.SFY.getValue()); + if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) { + FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData(); + if (ObjectUtil.isNotNull(data)) { + startWarehouseId = data.getWarehouseId(); + startWarehouseName = data.getWarehouseName(); + tenantId = data.getTenantId(); + } + } + Map> advanceMap = new HashMap<>(); + List packageInfos = vo.getPackageInfo(); + // 一个车次号 + 一个订单 一个暂存单 + if (CollUtil.isNotEmpty(packageInfos)) { + for (PackageInfoVO packageInfo : packageInfos) { + String advanceKey = packageInfo.getOrderNo(); + if (advanceMap.containsKey(advanceKey)) { + advanceMap.get(advanceKey).add(packageInfo); + } else { + ArrayList packageInfoVOS = new ArrayList<>(); + packageInfoVOS.add(packageInfo); + advanceMap.put(advanceKey, packageInfoVOS); + } + } + } + + // 组装暂存单数据 + List advances = new ArrayList<>(); + for (OrderInfoVO orderInfoVO : details) { + List packageList = new ArrayList<>(); + if (CollUtil.isEmpty(advanceMap)) { + return; + } + List packageInfoVOS = advanceMap.get(orderInfoVO.getOrderNo()); + if (ObjectUtil.isEmpty(packageInfoVOS)) { + continue; + } + + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + advanceEntity.setHasPackage(CollUtil.isNotEmpty(packageInfoVOS) ? 1 : 0); + advanceEntity.setOrderType(vo.getOrderType()); + advanceEntity.setBrand(BrandEnums.SFY.getValue()); + advanceEntity.setSiteName(""); + advanceEntity.setArea(""); + advanceEntity.setTotalNum(CollUtil.isNotEmpty(packageInfoVOS) ? packageInfoVOS.size() : 0); + advanceEntity.setPackName(""); + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(startWarehouseId); + advanceEntity.setWarehouseName(startWarehouseName); + + advanceEntity.setIsGcp(0); + advanceEntity.setCarrierName(vo.getCarrierNo()); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setSenderName(vo.getSendAddr()); + advanceEntity.setSenderPhone(""); + advanceEntity.setSenderAddress(vo.getSendAddr()); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setTrainNumber(vo.getLogisticID()); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setOrderCode(orderInfoVO.getOrderNo()); + advanceEntity.setServiceNum(orderInfoVO.getMainOrderNo()); + advanceEntity.setSenderFactory(vo.getSendAddr()); + + + for (PackageInfoVO orderPackageDTO : packageInfoVOS) { + advanceEntity.setDealerCode(orderPackageDTO.getDealerNo()); + advanceEntity.setDealerName(orderPackageDTO.getDealerName()); + advanceEntity.setStoreCode(orderPackageDTO.getDealerNo()); + advanceEntity.setStoreName(orderPackageDTO.getDealerName()); + advanceEntity.setCustomerName(orderInfoVO.getReceiver()); + advanceEntity.setCustomerPhone(orderInfoVO.getReceiveTel()); + advanceEntity.setCustomerAddress(orderInfoVO.getReceiveAddr()); + // 封装包件 + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(startWarehouseId); + advanceDetailEntity.setWarehouseName(startWarehouseName); +// advanceDetailEntity.setIncomingWarehouseId(0L); +// advanceDetailEntity.setIncomingWarehouseName(""); + // 根据遗留单标识赋值 + advanceEntity.setLegacyStatus("0"); + if (StrUtil.contains(orderInfoVO.getOrderNo(), "遗")) { + advanceEntity.setLegacyStatus("1"); + } + advanceDetailEntity.setOrderCode(orderPackageDTO.getOrderNo()); + advanceDetailEntity.setBrand(BrandEnums.SFY.getValue()); + advanceDetailEntity.setSystemType("线上"); + // 一级品类名称 + advanceDetailEntity.setFirstPackName(orderPackageDTO.getPlDepart()); + advanceDetailEntity.setFirstPackCode(""); + // 获取映射品类信息 + // 二级品类名称 + advanceDetailEntity.setSecondPackName(orderPackageDTO.getPlDepart()); + // 三级品类名称 + advanceDetailEntity.setThirdPackName(orderPackageDTO.getPlDepart()); + advanceDetailEntity.setMaterialName(orderPackageDTO.getPlDepart()); + advanceDetailEntity.setSiteName(""); + advanceDetailEntity.setSiteCode(""); + advanceDetailEntity.setQuantity(1); + advanceDetailEntity.setOrderPackageCode(orderPackageDTO.getPaNo()); + advanceDetailEntity.setTrainNumber(vo.getLogisticID()); + advanceDetailEntity.setServiceNum(orderInfoVO.getMainOrderNo()); + advanceDetailEntity.setWaybillNo(""); + advanceDetailEntity.setPackageStatus("0"); + advanceDetailEntity.setWeight(StrUtil.isNotBlank(orderPackageDTO.getWeight()) ? new BigDecimal(orderPackageDTO.getWeight()) : BigDecimal.ZERO); + advanceDetailEntity.setVolume(StrUtil.isNotBlank(orderPackageDTO.getVolume()) ? new BigDecimal(orderPackageDTO.getVolume()) : BigDecimal.ZERO); +// advanceDetailEntity.setChargeType(0); + advanceDetailEntity.setSupple(""); + advanceDetailEntity.setManifest(""); + advanceDetailEntity.setReturnNum(""); + advanceDetailEntity.setSendDateStr(vo.getGpsLeaveWhTime()); + advanceDetailEntity.setCarNumber(vo.getTruckNo()); + advanceDetailEntity.setGoodsMan(""); + advanceDetailEntity.setTenantId(tenantId); + advanceDetailEntity.setStatus(0); + advanceDetailEntity.setIsDeleted(0); + JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + packageList.add(entries); + } + // 转成json对象,然后将包件明细放到detail中 + JSONObject entries = JSONUtil.parseObj(advanceEntity); + entries.set("details", JSONUtil.toJsonStr(packageList)); + advances.add(entries); + } + // 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg. + if (CollUtil.isNotEmpty(advances)) { + for (JSONObject advance : advances) { + SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); + factoryDataClient.sendMessage(sendMsg); + } + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/NodeDataPushListener.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/NodeDataPushListener.java new file mode 100644 index 000000000..54fe161d0 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/NodeDataPushListener.java @@ -0,0 +1,155 @@ +package com.logpm.factorydata.suofeiya.mq; + +import cn.hutool.core.collection.CollUtil; +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.http.HttpUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.suofeiya.enums.FactoryNodeEnums; +import com.logpm.factorydata.suofeiya.enums.NodeMappingEnums; +import com.logpm.factorydata.suofeiya.enums.NodeNeedEnums; +import com.logpm.factorydata.suofeiya.pros.OldProperties; +import com.logpm.factorydata.vo.PushData; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.WorkNodeEnums; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 监听业务系统推送给节点数据 + * + * @author zhaoqiaobo + * @create 2024-03-18 0:02 + */ +@Slf4j +@Component +@AllArgsConstructor +public class NodeDataPushListener { + + private final IFactoryDataClient factoryDataClient; + private final OldProperties oldProperties; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.SFY_NODE_DATA_PUSH, durable = "true"), + exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, type = ExchangeTypes.TOPIC), + key = FactoryDataConstants.Mq.RoutingKeys.SFY_NODE_DATA_PUSH + )) + @Transactional(rollbackFor = Exception.class) + public void nodeDataPush(String msg) { + log.info("接收到节点数据推送:{}", msg); + if (checkData(msg)) { + return; + } + JSONObject entries = JSONUtil.parseObj(msg); + // 节点 + String node = entries.getStr("node"); + String main = entries.getStr("main"); + WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node); + FactoryNodeEnums factoryNode = NodeMappingEnums.getFactoryByNodeAndStatus(workNodeEnums); + // 2 获取业务数据 + List content = entries.getBeanList("content", PushData.class); + if (!ObjectUtil.equal(workNodeEnums.getCode(), NodeNeedEnums.PLAN_DISTRIBUTION.getCode()) || !ObjectUtil.equal(workNodeEnums.getCode(), NodeNeedEnums.PLAN_BILLOFLADING.getCode()) ) { + // 推送入库出库数据 + // 按订单号和运单号进行分组 + if (CollUtil.isNotEmpty(content)) { + JSONObject jsons = new JSONObject(); + List packages = new ArrayList<>(); + for (PushData pushData : content) { + JSONObject js = new JSONObject(); + js.set("paNo", pushData.getPackageCode()); + js.set("subinventoryCode", ""); + js.set("locatorCode", ""); + js.set("updateDate", DateUtil.now()); + js.set("paStausNo", "正常"); + js.set("logisticsStatus", factoryNode.getText()); + packages.add(js); + } + jsons.set("packageInfo", JSONUtil.toJsonStr(packages)); + if (StrUtil.isNotEmpty(oldProperties.getPushNodeUrl())) { + try { + log.info("推送节点数据:{}", JSONUtil.toJsonStr(jsons)); + String post = HttpUtil.post(oldProperties.getPushNodeUrl(), JSONUtil.toJsonStr(jsons)); + log.info("推送结果:{}", post); + } catch (Exception e) { + e.printStackTrace(); + log.error("推送节点数据错误:{}", e); + } + } + } + } else { + // 推送配送单计划 + if (CollUtil.isNotEmpty(content)) { + JSONObject jsons = new JSONObject(); + List packages = new ArrayList<>(); + for (PushData pushData : content) { + packages.add(pushData.getPackageCode()); + } + if(StrUtil.isNotEmpty(main)){ + JSONObject jsonObject = JSONUtil.parseObj(main); + jsons.set("shipPlanNo", jsonObject.getStr("trainNumber")); + jsons.set("receiver", jsonObject.getStr("receiver")); + jsons.set("receiveAddr", jsonObject.getStr("receiveAddr")); + jsons.set("receiveTel", jsonObject.getStr("receiveTel")); + jsons.set("planDeliveryDate", jsonObject.getStr("planDeliveryDate")); + } + jsons.set("paNo", JSONUtil.toJsonStr(packages)); + jsons.set("remark", ""); + jsons.set("orderExtendFields", new JSONArray()); + if (StrUtil.isNotEmpty(oldProperties.getPushNodePlanUrl())) { + try { + log.info("推送节点数据:{}", JSONUtil.toJsonStr(jsons)); + String post = HttpUtil.post(oldProperties.getPushNodePlanUrl(), JSONUtil.toJsonStr(jsons)); + log.info("推送结果:{}", post); + } catch (Exception e) { + e.printStackTrace(); + log.error("推送节点数据错误:{}", e); + } + } + } + } + + } + + private boolean checkData(String msg) { + if (StrUtil.isEmpty(msg)) { + return true; + } + if (!msg.contains("brand") || !msg.contains("content") || !msg.contains("node")) { + return true; + } + JSONObject entries = JSONUtil.parseObj(msg); + String node = entries.getStr("node"); + if (StrUtil.isEmpty(node)) { + return true; + } + // 不是志邦需要的节点数据直接不处理 + if (!EnumUtil.contains(NodeNeedEnums.class, node)) { + return true; + } + WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node); + if (ObjectUtil.isEmpty(workNodeEnums)) { + return true; + } + List content = entries.getBeanList("content", JSONObject.class); + if (CollUtil.isEmpty(content)) { + return true; + } + return false; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/FactoryDataSuoFeiYaProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/FactoryDataSuoFeiYaProperties.java new file mode 100644 index 000000000..02e3773ae --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/FactoryDataSuoFeiYaProperties.java @@ -0,0 +1,20 @@ +package com.logpm.factorydata.suofeiya.pros; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * FactoryProperties + * + * @author pref + */ +@Data +@ConfigurationProperties(prefix = "logpm") +public class FactoryDataSuoFeiYaProperties { + /** + * 名称 + */ + private String name; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/OldProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/OldProperties.java new file mode 100644 index 000000000..e46761742 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/OldProperties.java @@ -0,0 +1,25 @@ +package com.logpm.factorydata.suofeiya.pros; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 老系统配置 + * @author zhaoqiaobo + * @Date 2024/5/29 + **/ +@Data +@Component +@ConfigurationProperties(prefix = "old") +public class OldProperties { + /** + * 推送节点数据到来系统的 url + */ + private String pushNodeUrl; + /** + * 推送配送计划URL + */ + private String pushNodePlanUrl; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/DeliveryNoteService.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/DeliveryNoteService.java new file mode 100644 index 000000000..f3862dc5c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/DeliveryNoteService.java @@ -0,0 +1,17 @@ +package com.logpm.factorydata.suofeiya.service; + +import com.logpm.factorydata.suofeiya.entity.DeliveryNoteEntity; +import com.logpm.factorydata.suofeiya.vo.DeliveryNoteVO; +import com.logpm.factorydata.suofeiya.vo.ParamVO; +import org.springblade.core.mp.base.BaseService; + +/** + * 索菲亚发货单 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface DeliveryNoteService extends BaseService { + + String order(DeliveryNoteVO vo); +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/FactoryOrderLogService.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/FactoryOrderLogService.java new file mode 100644 index 000000000..f8bd9df22 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/FactoryOrderLogService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.suofeiya.service; + +import com.logpm.factorydata.suofeiya.entity.FactoryOrderLogEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 工厂订单日志 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface FactoryOrderLogService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/IFactoryTokenService.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/IFactoryTokenService.java new file mode 100644 index 000000000..3c6ab42b7 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/IFactoryTokenService.java @@ -0,0 +1,15 @@ +package com.logpm.factorydata.suofeiya.service; + +import com.logpm.factorydata.suofeiya.entity.FactoryToken; +import org.springblade.core.mp.base.BaseService; + +import java.security.NoSuchAlgorithmException; + +/** + * 工厂推送数据接口 + */ +public interface IFactoryTokenService extends BaseService { + + + boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException; +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/OrderInfoService.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/OrderInfoService.java new file mode 100644 index 000000000..3d4200d47 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/OrderInfoService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.suofeiya.service; + +import com.logpm.factorydata.suofeiya.entity.OrderInfoEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 订单信息 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface OrderInfoService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/PackageInfoService.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/PackageInfoService.java new file mode 100644 index 000000000..c1ec10f12 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/PackageInfoService.java @@ -0,0 +1,14 @@ +package com.logpm.factorydata.suofeiya.service; + +import com.logpm.factorydata.suofeiya.entity.PackageInfoEntity; +import org.springblade.core.mp.base.BaseService; + +/** + * 装箱包信息 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface PackageInfoService extends BaseService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/DeliveryNoteServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/DeliveryNoteServiceImpl.java new file mode 100644 index 000000000..62ad27075 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/DeliveryNoteServiceImpl.java @@ -0,0 +1,109 @@ +package com.logpm.factorydata.suofeiya.service.impl; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.logpm.factorydata.enums.SaxStatusEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.suofeiya.entity.DeliveryNoteEntity; +import com.logpm.factorydata.suofeiya.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.suofeiya.mapper.DeliveryNoteMapper; +import com.logpm.factorydata.suofeiya.service.DeliveryNoteService; +import com.logpm.factorydata.suofeiya.service.FactoryOrderLogService; +import com.logpm.factorydata.suofeiya.vo.DeliveryNoteVO; +import com.logpm.factorydata.suofeiya.vo.ParamVO; +import com.logpm.factorydata.vo.SendMsg; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.io.IOUtils; +import org.jetbrains.annotations.NotNull; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.common.utils.FileLogsUtil; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.oss.model.BladeFile; +import org.springblade.core.tool.api.R; +import org.springblade.resource.feign.IOssClient; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; + +/** + * 发货单 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class DeliveryNoteServiceImpl extends BaseServiceImpl implements DeliveryNoteService { + + private final IFactoryDataClient factoryDataClient; + private final FactoryOrderLogService factoryOrderLogService; + private final IOssClient ossClient; + + @Override + public String order(DeliveryNoteVO vo) { + + // 1 上传数据到 minio 获取到地址 + String url = uploadFile(JSONUtil.toJsonStr(vo)); + // 2 保存地址到数据库 + FactoryOrderLogEntity logEntity = new FactoryOrderLogEntity(); + logEntity.setType(1); + logEntity.setSaxStatus(SaxStatusEnums.NOMAL.getCode()); + logEntity.setLogUrl(url); + factoryOrderLogService.save(logEntity); + + // 3 将消息发送给 mq,解析保存 + SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.SFY_FACTORY_ORDER).message(JSONUtil.toJsonStr(logEntity)).build(); + factoryDataClient.sendMessage(build); + return "成功"; + } + + private String uploadFile(String body) { + //文本内容和保存为本地文件 并上传 + String logPath = FileLogsUtil.saveFileLogs(body); + log.info(">>> 文件路径 {}", logPath); + + MultipartFile multi = getMultipartFile(logPath); + //上传到服务器 + R r = ossClient.fileUpload(multi, "sfy-order-logs"); + if (r.isSuccess()) { + BladeFile data = (BladeFile) r.getData(); + // 删除本地文件 + FileUtil.del(logPath); + return data.getLink(); + } + return null; + } + + @NotNull + private MultipartFile getMultipartFile(String logPath) { + File file = new File(logPath); + + // File 转 MultipartFile + FileItem item = new DiskFileItemFactory().createItem("file" + , MediaType.MULTIPART_FORM_DATA_VALUE + , true + , file.getName()); + try ( + InputStream input = Files.newInputStream(file.toPath()); + OutputStream os = item.getOutputStream()) { + // 流转移 + IOUtils.copy(input, os); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid file: " + e, e); + } + + return new CommonsMultipartFile(item); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/FactoryOrderLogServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/FactoryOrderLogServiceImpl.java new file mode 100644 index 000000000..8956c7a15 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/FactoryOrderLogServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.suofeiya.service.impl; + +import com.logpm.factorydata.suofeiya.entity.FactoryOrderLogEntity; +import com.logpm.factorydata.suofeiya.mapper.FactoryOrderLogMapper; +import com.logpm.factorydata.suofeiya.service.FactoryOrderLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 工厂订单日志 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class FactoryOrderLogServiceImpl extends BaseServiceImpl implements FactoryOrderLogService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/FactoryTokenServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/FactoryTokenServiceImpl.java new file mode 100644 index 000000000..90d9187ff --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/FactoryTokenServiceImpl.java @@ -0,0 +1,62 @@ +package com.logpm.factorydata.suofeiya.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.factorydata.suofeiya.entity.FactoryToken; +import com.logpm.factorydata.suofeiya.mapper.FactoryTokenMapper; +import com.logpm.factorydata.suofeiya.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.redis.cache.BladeRedis; +import org.springframework.stereotype.Service; + +import java.security.NoSuchAlgorithmException; +import java.util.Objects; + +@AllArgsConstructor +@Service +public class FactoryTokenServiceImpl extends BaseServiceImpl implements IFactoryTokenService { + + private static final Logger logger = LoggerFactory.getLogger(FactoryTokenServiceImpl.class); + + private final BladeRedis bladeRedis; + + @Override + public boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException { + logger.info("#########verifyToken: 验证token开始"); + //先生成token摘要 +// String tokenAbst = MD5Utils.md5Hex(token.getBytes(StandardCharsets.UTF_8)); + + //编写查询条件 + String key = "corpId:" + corpId; + FactoryToken factoryToken = bladeRedis.get(key); + + if (Objects.isNull(factoryToken)) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("token", token); + factoryToken = baseMapper.selectOne(queryWrapper); + } + + + if (Objects.isNull(factoryToken)) { + logger.error("#########verifyToken: token1验证不通过 token={},corpid={}", token, corpId); + return false; + } + logger.info("#########verifyToken: 验证token 传入token {} 验证token {}", token, factoryToken.getToken()); + if (!factoryToken.getToken().equals(token)) { + logger.error("#########verifyToken: token2验证不通过 token={},corpid={}", token, corpId); + return false; + } + + + Long expireTimeLong = factoryToken.getExpireTime().getTime(); + Long now = System.currentTimeMillis(); + //判断是否过期 + if (now > expireTimeLong) { + logger.error("#########verifyToken: token验证不通过 已过期 token={},corpId={}", token, corpId); + return false; + } + return true; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/OrderInfoServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/OrderInfoServiceImpl.java new file mode 100644 index 000000000..2a4f7eed5 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/OrderInfoServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.suofeiya.service.impl; + +import com.logpm.factorydata.suofeiya.entity.OrderInfoEntity; +import com.logpm.factorydata.suofeiya.mapper.OrderInfoMapper; +import com.logpm.factorydata.suofeiya.service.OrderInfoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 订单信息 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class OrderInfoServiceImpl extends BaseServiceImpl implements OrderInfoService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/PackageInfoServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/PackageInfoServiceImpl.java new file mode 100644 index 000000000..ef18794ff --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/PackageInfoServiceImpl.java @@ -0,0 +1,22 @@ +package com.logpm.factorydata.suofeiya.service.impl; + +import com.logpm.factorydata.suofeiya.entity.PackageInfoEntity; +import com.logpm.factorydata.suofeiya.mapper.PackageInfoMapper; +import com.logpm.factorydata.suofeiya.service.PackageInfoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 装箱包信息 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class PackageInfoServiceImpl extends BaseServiceImpl implements PackageInfoService { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/DeliveryNoteVO.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/DeliveryNoteVO.java new file mode 100644 index 000000000..882a27848 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/DeliveryNoteVO.java @@ -0,0 +1,31 @@ +package com.logpm.factorydata.suofeiya.vo; + +import com.logpm.factorydata.suofeiya.entity.DeliveryNoteEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 送货单 实体类 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "索菲亚发货单", description = "索菲亚发货单") +@EqualsAndHashCode(callSuper = true) +public class DeliveryNoteVO extends DeliveryNoteEntity { + + @ApiModelProperty("扩展字段") + private List orderExtendFields; + + @ApiModelProperty("装箱包信息") + private List packageInfo; + + @ApiModelProperty("订单信息") + private List orderInfo; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/OrderInfoVO.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/OrderInfoVO.java new file mode 100644 index 000000000..af100ae14 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/OrderInfoVO.java @@ -0,0 +1,21 @@ +package com.logpm.factorydata.suofeiya.vo; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.logpm.factorydata.suofeiya.entity.OrderInfoEntity; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 订单信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "订单信息", description = "订单信息") +@EqualsAndHashCode(callSuper = true) +public class OrderInfoVO extends OrderInfoEntity { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/PackageInfoVO.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/PackageInfoVO.java new file mode 100644 index 000000000..ac0e1d4f2 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/PackageInfoVO.java @@ -0,0 +1,18 @@ +package com.logpm.factorydata.suofeiya.vo; + +import com.logpm.factorydata.suofeiya.entity.PackageInfoEntity; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 装箱包信息 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "装箱包信息", description = "装箱包信息") +@EqualsAndHashCode(callSuper = true) +public class PackageInfoVO extends PackageInfoEntity { +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/ParamVO.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/ParamVO.java new file mode 100644 index 000000000..eb83de735 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/ParamVO.java @@ -0,0 +1,28 @@ +package com.logpm.factorydata.suofeiya.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 请求参数 接收订单数据 + * + * @author zhaoqiaobo + * @create 2024-04-26 + */ +@Data +@ApiModel(value = "索菲亚发货单", description = "索菲亚发货单") +public class ParamVO implements Serializable { + + @ApiModelProperty("核算请求参数") + private DeliveryNoteVO params; + @ApiModelProperty("区域密文摘要") + private String digest; + @ApiModelProperty("核算当前时间戳") + private String timestamp; + @ApiModelProperty("核算第三方接入商的公司编码") + private String companyCode; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/Resp.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/Resp.java new file mode 100644 index 000000000..41bef52aa --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/Resp.java @@ -0,0 +1,26 @@ +package com.logpm.factorydata.suofeiya.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class Resp implements Serializable { + + private String resultCode; + private String resultMessage; + + public Resp(String code, String message) { + this.resultCode = code; + this.resultMessage = message; + } + + public static Resp success(String msg) { + return new Resp("0000", msg); + } + + public static Resp fail(String msg) { + return new Resp("9999", msg); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/wrapper/CustomHttpServletRequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/wrapper/CustomHttpServletRequestWrapper.java new file mode 100644 index 000000000..3ae68bb9d --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/wrapper/CustomHttpServletRequestWrapper.java @@ -0,0 +1,38 @@ +package com.logpm.factorydata.suofeiya.wrapper; + +import org.springframework.http.HttpHeaders; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper { + + private final HttpHeaders headers; + + public CustomHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + headers = new HttpHeaders(); + } + + @Override + public String getHeader(String name) { + String headerValue = headers.getFirst(name); + return headerValue != null ? headerValue : super.getHeader(name); + } + + @Override + public Enumeration getHeaderNames() { + List names = Collections.list(super.getHeaderNames()); + headers.forEach((key, value) -> names.add(key)); + return Collections.enumeration(names); + } + + // 其他需要覆盖的方法... + + public void addHeader(String name, String value) { + headers.add(name, value); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/wrapper/RequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/wrapper/RequestWrapper.java new file mode 100644 index 000000000..b084a4045 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/wrapper/RequestWrapper.java @@ -0,0 +1,75 @@ +package com.logpm.factorydata.suofeiya.wrapper; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class RequestWrapper extends HttpServletRequestWrapper { + private final String body; + public RequestWrapper(HttpServletRequest request) throws IOException { + super(request); + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } catch (IOException ex) { + throw ex; + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException ex) { + throw ex; + } + } + } + body = stringBuilder.toString(); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); + ServletInputStream servletInputStream = new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + @Override + public boolean isReady() { + return false; + } + @Override + public void setReadListener(ReadListener readListener) {} + @Override + public int read() throws IOException { + return byteArrayInputStream.read(); + } + }; + return servletInputStream; + + } + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } + public String getBody() { + return this.body; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application-dev.yml b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application-dev.yml new file mode 100644 index 000000000..58c7ad0bc --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application-dev.yml @@ -0,0 +1,73 @@ +#服务器端口 +server: + port: 18920 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.46 + port: 5672 + username: admin + password: admin + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-sfy.master.url} + username: ${blade.datasource.factorydata-sfy.master.username} + password: ${blade.datasource.factorydata-sfy.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-sfy.627683.url} + username: ${blade.datasource.factorydata-sfy.627683.username} + password: ${blade.datasource.factorydata-sfy.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application-prod.yml b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application-prod.yml new file mode 100644 index 000000000..8cfdfb8b4 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application-prod.yml @@ -0,0 +1,47 @@ +#服务器端口 +server: + port: 18920 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-sfy.master.url} + username: ${blade.datasource.factorydata-sfy.master.username} + password: ${blade.datasource.factorydata-sfy.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-sfy.627683.url} + username: ${blade.datasource.factorydata-sfy.627683.username} + password: ${blade.datasource.factorydata-sfy.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application-test.yml b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application-test.yml new file mode 100644 index 000000000..83ba070d6 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application-test.yml @@ -0,0 +1,73 @@ +#服务器端口 +server: + port: 18920 + +#数据源配置 +#spring: +# datasource: +# url: ${blade.datasource.dev.url} +# username: ${blade.datasource.dev.username} +# password: ${blade.datasource.dev.password} + +spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.110 + port: 5672 + username: admin + password: Slwk@123654 + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true + #排除DruidDataSourceAutoConfigure + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration + datasource: + dynamic: + druid: + #通用校验配置 + validation-query: select 1 + #启用sql日志拦截器 + proxy-filters: + - sqlLogInterceptor + #设置默认的数据源或者数据源组,默认值即为master + primary: master + datasource: + master: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-sfy.master.url} + username: ${blade.datasource.factorydata-sfy.master.username} + password: ${blade.datasource.factorydata-sfy.master.password} + 627683: + druid: + #独立校验配置 + validation-query: select 1 + #oracle校验 + #validation-query: select 1 from dual + url: ${blade.datasource.factorydata-sfy.627683.url} + username: ${blade.datasource.factorydata-sfy.627683.username} + password: ${blade.datasource.factorydata-sfy.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application.yml b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application.yml new file mode 100644 index 000000000..33da94b58 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/application.yml @@ -0,0 +1,31 @@ +#mybatis-plus配置 +mybatis-plus: + mapper-locations: classpath:com/logpm/**/mapper/*Mapper.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.logpm.**.entity + +#swagger扫描路径配置 +swagger: + base-packages: + - org.springblade + - com.logpm + +#oss配置 +oss: + enabled: true + name: minio + tenant-mode: false + endpoint: http://8.137.14.82:9000 + access-key: minio + secret-key: 123123123 + bucket-name: bladex + + +logging: + config: classpath:logback.xml + + +spring: + main: + allow-circular-references: true + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/logback.xml b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/logback.xml new file mode 100644 index 000000000..7170050de --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/resources/logback.xml @@ -0,0 +1,40 @@ + + + + logback + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf8 + + + + + ${log.path} + + ${log.path}.%d{yyyy-MM-dd}.zip + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/Dockerfile b/blade-service/logpm-factory-data/logpm-factory-data-zbom/Dockerfile index 688cc8323..b1bc10117 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/Dockerfile +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/pom.xml b/blade-service/logpm-factory-data/logpm-factory-data-zbom/pom.xml index d03f270ec..321222a75 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/pom.xml +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/pom.xml @@ -54,6 +54,25 @@ logpm-factory-data-base-api ${bladex.project.version} + + org.springblade + blade-starter-oss + + + io.minio + minio + + + org.springblade + blade-resource-api + 3.2.0.RELEASE + compile + + + com.logpm + logpm-factory-data-zbom-api + 3.2.0.RELEASE + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..2f48b3750 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.factorydata.zbom.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..c9f433a93 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.factorydata.zbom.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/CustomMessageConverter.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/CustomMessageConverter.java new file mode 100644 index 000000000..416680a7b --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/CustomMessageConverter.java @@ -0,0 +1,161 @@ +package com.logpm.factorydata.zbom.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength((long) bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/ExecutorConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/ExecutorConfig.java new file mode 100644 index 000000000..028e504d8 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/ExecutorConfig.java @@ -0,0 +1,79 @@ +package com.logpm.factorydata.zbom.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.http.HttpHeaders; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + ThreadLocalUtil.put("bladeContext", headers); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/InterceptorAdapterConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/InterceptorAdapterConfig.java new file mode 100644 index 000000000..726556923 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/InterceptorAdapterConfig.java @@ -0,0 +1,32 @@ +package com.logpm.factorydata.zbom.config; + +import com.logpm.factorydata.zbom.interceptor.LocalServerLoginAccountsInterceptor; +import com.logpm.factorydata.zbom.interceptor.ZbFactoryAccountsInterceptor; +import com.logpm.factorydata.zbom.pros.ZbFactoryProperties; +import com.logpm.factorydata.zbom.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.springblade.common.component.MockLoginService; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@AllArgsConstructor +public class InterceptorAdapterConfig implements WebMvcConfigurer { + + private final BladeRedis redis; + private final ZbFactoryProperties zbFactoryProperties; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + @Override + public void addInterceptors(InterceptorRegistry interceptorRegistry) { +// interceptorRegistry.addInterceptor(new ZbFactoryAccountsInterceptor(zbFactoryProperties)) +// .addPathPatterns("/**").order(2); + interceptorRegistry.addInterceptor(new LocalServerLoginAccountsInterceptor(redis,environment,redisLockClient,mockLoginService)) + .addPathPatterns("/**").order(3); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/RabbitConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/RabbitConfig.java new file mode 100644 index 000000000..7b4e22d15 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/config/RabbitConfig.java @@ -0,0 +1,17 @@ +package com.logpm.factorydata.zbom.config; + +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory factory) { + RabbitTemplate template = new RabbitTemplate(factory); + template.setMessageConverter(new CustomMessageConverter()); + return template; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/controller/OrderController.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/controller/OrderController.java index 8a1d9ddd7..61c59d625 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/controller/OrderController.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/controller/OrderController.java @@ -1,31 +1,48 @@ package com.logpm.factorydata.zbom.controller; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; 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.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.factorydata.enums.SaxStatusEnums; 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.ZbFactoryOrderLogEntity; -import com.logpm.factorydata.zbom.entity.ZbReceiptEntity; -import com.logpm.factorydata.zbom.service.IFactoryOrderLogService; -import com.logpm.factorydata.zbom.service.IReceiptService; +import com.logpm.factorydata.zbom.entity.FactoryLogEntity; +import com.logpm.factorydata.zbom.service.FactoryLogService; import com.logpm.factorydata.zbom.vo.ZBReceiptDTO; import com.logpm.factorydata.zbom.vo.ZbResp; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.io.IOUtils; +import org.jetbrains.annotations.NotNull; import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.common.utils.FileLogsUtil; +import org.springblade.core.oss.model.BladeFile; +import org.springblade.core.tool.api.R; +import org.springblade.resource.feign.IOssClient; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; /** * 工厂订单 前端控制器 @@ -41,9 +58,24 @@ import javax.servlet.http.HttpServletRequest; public class OrderController { private final IFactoryDataClient factoryDataClient; - private final IFactoryOrderLogService orderLogService; - private final IReceiptService receiptService; + private final FactoryLogService factoryLogService; + private final IOssClient ossClient; + private final RabbitTemplate rabbitTemplate; + + + @ResponseBody + @PostMapping("pushData") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "推送志邦工厂节点数据", notes = "推送志邦工厂节点数据") + public ZbResp pushData(@RequestBody String msg, HttpServletRequest request) { + log.info("推送志邦工厂节点数据:{}", msg); + if (StrUtil.isNotEmpty(msg)) { + rabbitTemplate.convertAndSend(FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, + FactoryDataConstants.Mq.RoutingKeys.ZBOM_NODE_DATA_PUSH, msg); + } + return ZbResp.success("成功"); + } @ResponseBody @PostMapping @@ -58,16 +90,9 @@ public class OrderController { } String corpId = request.getHeader("corpId"); zbReceiptDTO.setCorpId(corpId); - // 已经推送过的数据不再接收 - if (CollUtil.isNotEmpty(receiptService.list(Wrappers.lambdaQuery().eq(ZbReceiptEntity::getTaskCode, zbReceiptDTO.getTaskCode())))) { - return ZbResp.fail("该入库单号已推送过,无需重复推送"); - } - // 记录日志 - ZbFactoryOrderLogEntity logEntity = ZbFactoryOrderLogEntity.builder().content(JSONUtil.toJsonStr(zbReceiptDTO)).build(); - orderLogService.save(logEntity); - // 将消息发送给 mq,解析保存 - SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER).routingKey(FactoryDataConstants.Mq.RoutingKeys.ZBOM_FACTORY_ORDER).message(jsonStr).build(); - factoryDataClient.sendMessage(build); + + factoryLogService.orderData(zbReceiptDTO); + return ZbResp.success("成功"); } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/FactoryLogEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/FactoryLogEntity.java new file mode 100644 index 000000000..2e9f08f13 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/FactoryLogEntity.java @@ -0,0 +1,58 @@ +package com.logpm.factorydata.zbom.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +@Data +@TableName("zb_factory_log") +@ApiModel(value = "接收工厂订单日志", description = "接收工厂订单日志") +@EqualsAndHashCode(callSuper = true) +public class FactoryLogEntity 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 logUrl; + /** + * 数据类型 1.入库数据 + */ + @ApiModelProperty(name = "数据类型 1.入库数据", notes = "") + private Integer type; + /** + * 解析状态 0 未解析 1 解析失败 2 已解析 + */ + @ApiModelProperty(name = "解析状态 0 未解析 1 解析失败 2 已解析", notes = "") + private Integer saxStatus; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/FactoryToken.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/FactoryToken.java new file mode 100644 index 000000000..e72454914 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/FactoryToken.java @@ -0,0 +1,32 @@ +package com.logpm.factorydata.zbom.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springblade.core.mp.base.BaseEntity; + +import java.util.Date; + +@Data +@TableName("factory_token") +@ApiModel(value = "FactoryToken对象", description = "工厂账户token") +public class FactoryToken extends BaseEntity { + + @ApiModelProperty("token") + private String token; + + @ApiModelProperty("token摘要") + private String tokenAbst; + + @JsonFormat( + pattern = "yyyy-MM-dd HH:mm:ss" + ) + @ApiModelProperty("过期时间") + private Date expireTime; + + @ApiModelProperty("企业id") + private String corpid; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodePushEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodePushEntity.java index a34dc0924..2c07f146b 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodePushEntity.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodePushEntity.java @@ -61,10 +61,20 @@ public class ZbFactoryNodePushEntity extends BaseEntity { @ApiModelProperty(name = "加盟商单号", notes = "") private String platformOrderCode; /** - * 节点 + * 志邦节点 */ - @ApiModelProperty(name = "节点", notes = "") + @ApiModelProperty(name = "志邦节点", notes = "") private String node; + /** + * 节点 + */ + @ApiModelProperty(name = "物流节点", notes = "") + private String workNode; + /** + * 仓库 + */ + @ApiModelProperty(name = "仓库", notes = "") + private String warehouseName; /** * 包条码 */ diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodePushFailEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodePushFailEntity.java index 6cd896836..84703f4ce 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodePushFailEntity.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryNodePushFailEntity.java @@ -66,6 +66,11 @@ public class ZbFactoryNodePushFailEntity extends BaseEntity { */ @ApiModelProperty(name = "节点", notes = "") private String node; + /** + * 仓库 + */ + @ApiModelProperty(name = "仓库", notes = "") + private String warehouseName; /** * 包条码 */ diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryOrderLogEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryOrderLogEntity.java index ac2243b9f..c26a1e625 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryOrderLogEntity.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbFactoryOrderLogEntity.java @@ -11,7 +11,7 @@ import lombok.NoArgsConstructor; import org.springblade.core.mp.base.BaseEntity; /** - * 志邦发货单接收日志 + * 志邦发货单接收日志 替换为上传文件的记录方式 FactoryLogEntity * * @Author zqb * @Date 2024/3/26 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbOrderPackageEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbOrderPackageEntity.java index e21e67bb4..afa4d8ba5 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbOrderPackageEntity.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbOrderPackageEntity.java @@ -21,6 +21,8 @@ import org.springblade.core.mp.base.BaseEntity; @EqualsAndHashCode(callSuper = true) public class ZbOrderPackageEntity extends BaseEntity { + @ApiModelProperty(name = "日志id", notes = "") + private String logId; /** * 关联入库单ID */ diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbPackageInfoEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbPackageInfoEntity.java index c6acb5737..bef3bdbb7 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbPackageInfoEntity.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbPackageInfoEntity.java @@ -21,7 +21,8 @@ import org.springblade.core.mp.base.BaseEntity; @EqualsAndHashCode(callSuper = true) public class ZbPackageInfoEntity extends BaseEntity { - + @ApiModelProperty(name = "日志id", notes = "") + private String logId; /** 物料编码 */ @ApiModelProperty(name = "物料编码", notes = "") private String itemCode; diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbReceiptEntity.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbReceiptEntity.java index 7b6553bea..cf96e56d0 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbReceiptEntity.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/entity/ZbReceiptEntity.java @@ -25,6 +25,8 @@ import javax.validation.constraints.NotEmpty; public class ZbReceiptEntity extends BaseEntity { + @ApiModelProperty(name = "日志id", notes = "") + private String logId; @ApiModelProperty(name = "工厂账号", notes = "") private String corpId; /** diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/NodeNeedEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/NodeNeedEnums.java index 8484c70b1..1b9a970d1 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/NodeNeedEnums.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/NodeNeedEnums.java @@ -13,11 +13,14 @@ import java.io.Serializable; @Getter public enum NodeNeedEnums implements Serializable { - INITIAL_WAREHOUSE_DEPART(40, "始发仓发车"), - TRANSFER_WAREHOUSE_UNLOADING(50, "中转仓卸车确认"), - TRANSFER_WAREHOUSE_DEPART(60, "中转仓发车"), - END_WAREHOUSE_UNLOADING(70, "末端仓卸车确认"), - CLERK_REVIEW(140, "文员复核"); + INITIAL_WAREHOUSE_DEPART(103040, "始发仓发车"), + UNLOAD_INCOMING_WAREHOUSE(105010,"卸车入库"), + // TRANSFER_WAREHOUSE_UNLOADING(105020, "中转仓卸车确认"), + TRANSFER_WAREHOUSE_DEPART(103080, "中转仓发车"), + SIGN_DIRECT_SHIPPER(105030,"直发商家签收"), + END_WAREHOUSE_UNLOADING(105040, "末端仓卸车确认"), + SIGN_TRIPARTITE_TRANSFER_DEPART(104040, "三方中转签收"), + CLERK_REVIEW(303010, "文员复核"); private Integer code; private String value; diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/ZbomNodeMappingEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/ZbomNodeMappingEnums.java index 1c2217bc3..8a8993e6b 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/ZbomNodeMappingEnums.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/ZbomNodeMappingEnums.java @@ -19,17 +19,19 @@ public enum ZbomNodeMappingEnums { */ STATION_DEPART(ZbomNodeEnums.STATION_DEPART, WorkNodeEnums.INITIAL_WAREHOUSE_DEPART, 1), /** - * 在途 -- 中转仓卸货确认 + * 在途 -- 卸车入库 */ - INTRANSIT_UNLOADING(ZbomNodeEnums.INTRANSIT, WorkNodeEnums.TRANSFER_WAREHOUSE_UNLOADING, 1), + // INTRANSIT_UNLOADING(ZbomNodeEnums.INTRANSIT, WorkNodeEnums.TRANSFER_WAREHOUSE_UNLOADING, 1), + INTRANSIT_UNLOADING(ZbomNodeEnums.INTRANSIT, WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE, 1), /** * 在途 -- 中转仓发车 */ INTRANSIT(ZbomNodeEnums.INTRANSIT, WorkNodeEnums.TRANSFER_WAREHOUSE_DEPART, 1), /** - * 在途 -- 末端仓卸货确认 + * 送货抵达 -- 末端仓卸货确认 */ - DELIVERY_ARRIVAL(ZbomNodeEnums.INTRANSIT, WorkNodeEnums.END_WAREHOUSE_UNLOADING, 1), + DELIVERY_ARRIVAL(ZbomNodeEnums.DELIVERY_ARRIVAL, WorkNodeEnums.END_WAREHOUSE_UNLOADING, 1), + // DELIVERY_ARRIVAL(ZbomNodeEnums.INTRANSIT, WorkNodeEnums.END_WAREHOUSE_UNLOADING, 1), /** * 在途 -- 三方中转发车 */ @@ -38,10 +40,14 @@ public enum ZbomNodeMappingEnums { * 全部签收 -- 文员复核 */ SIGN_FOR(ZbomNodeEnums.SIGN_FOR, WorkNodeEnums.CLERK_REVIEW, 1), + SIGN_FOR_DIRECT_SHIPPER(ZbomNodeEnums.SIGN_FOR, WorkNodeEnums.SIGN_DIRECT_SHIPPER, 1), + SIGN_FOR_TRIPARTITE_TRANSFER_DEPART(ZbomNodeEnums.SIGN_FOR, WorkNodeEnums.SIGN_TRIPARTITE_TRANSFER_DEPART, 1), /** * 部分签收 -- 文员复核 */ - PARTIAL_RECEIPT(ZbomNodeEnums.PARTIAL_RECEIPT, WorkNodeEnums.CLERK_REVIEW, 2); + PARTIAL_RECEIPT(ZbomNodeEnums.PARTIAL_RECEIPT, WorkNodeEnums.CLERK_REVIEW, 2), + PARTIAL_RECEIPT_DIRECT_SHIPPER(ZbomNodeEnums.PARTIAL_RECEIPT, WorkNodeEnums.SIGN_DIRECT_SHIPPER, 2), + PARTIAL_RECEIPT_TRIPARTITE_TRANSFER_DEPART(ZbomNodeEnums.PARTIAL_RECEIPT, WorkNodeEnums.SIGN_TRIPARTITE_TRANSFER_DEPART, 2); /** * 系统作业节点 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/feign/FactoryDataZbomClient.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/feign/FactoryDataZbomClient.java new file mode 100644 index 000000000..4b37814e5 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/feign/FactoryDataZbomClient.java @@ -0,0 +1,29 @@ +package com.logpm.factorydata.zbom.feign; + +import cn.hutool.json.JSONUtil; +import com.logpm.factorydata.zbom.service.FactoryLogService; +import com.logpm.factorydata.zbom.vo.ZBReceiptDTO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author zhaoqiaobo + * @create 2024-05-25 + */ +@RestController +@AllArgsConstructor +@Slf4j +public class FactoryDataZbomClient implements IFactoryDataZbomClient { + + private final FactoryLogService factoryLogService; + + @Override + public R order(String data) { + log.info("接收工厂订单:{}", data); + factoryLogService.orderData(JSONUtil.toBean(data, ZBReceiptDTO.class)); + return R.success("成功"); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/interceptor/FactoryAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/interceptor/FactoryAccountsInterceptor.java new file mode 100644 index 000000000..2ccc2bf53 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/interceptor/FactoryAccountsInterceptor.java @@ -0,0 +1,87 @@ +package com.logpm.factorydata.zbom.interceptor; + +import com.alibaba.fastjson.JSONObject; +import com.logpm.factorydata.zbom.service.IFactoryTokenService; +import com.logpm.factorydata.zbom.wrapper.RequestWrapper; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +@Log4j2 +@AllArgsConstructor +public class FactoryAccountsInterceptor implements HandlerInterceptor { + + private final IFactoryTokenService factoryTokenService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + try { + + RequestWrapper myRequestWrapper = new RequestWrapper(request); + String body = myRequestWrapper.getBody(); + JSONObject jsonObject = JSONObject.parseObject(body); + //获取头中参数 + String token = request.getHeader("Authorization"); + String corpId = request.getHeader("corpid"); + if(StringUtil.isBlank(corpId)){ + corpId = jsonObject.getString("corpid"); + } + if(!StringUtil.hasLength(token)){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,token有误"))); + return false; + } + if(!StringUtil.hasLength(corpId)){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,corpId有误"))); + return false; + } + + log.info("##########preHandle: token={}",token); + //验证token + boolean b = factoryTokenService.verifyToken(token,corpId); + if(!b){ + returnJson(response,JSONObject.toJSONString(R.fail(203,"认证不通过,token不存在或已过期"))); + return false; + } + return true; + } catch (Exception e) { + returnJson(response,JSONObject.toJSONString(R.fail(500,"服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null){ + writer.close(); + } + } + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/interceptor/LocalServerLoginAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/interceptor/LocalServerLoginAccountsInterceptor.java new file mode 100644 index 000000000..454a094d4 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/interceptor/LocalServerLoginAccountsInterceptor.java @@ -0,0 +1,101 @@ +package com.logpm.factorydata.zbom.interceptor; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.common.exception.CustomerException; +import org.springblade.common.wrapper.CustomHttpServletRequestWrapper; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Log4j2 +@AllArgsConstructor +public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapter { + + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + + + try { + org.springblade.common.wrapper.CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(request); + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + + // 修改或添加header + + // 发送登录请求 + log.info("##########preHandle: request={}", request); + + wrappedRequest.addHeader("Blade-Auth", "bearer "+data.getString("access_token")); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + + // 用包装后的request替换原始request + request = wrappedRequest; + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + return true; + } catch (Exception e) { + returnJson(response, JSONObject.toJSONString(R.fail(500, "服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/interceptor/ZbFactoryAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/interceptor/ZbFactoryAccountsInterceptor.java index 0c558d3fd..af55bbf83 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/interceptor/ZbFactoryAccountsInterceptor.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/interceptor/ZbFactoryAccountsInterceptor.java @@ -1,9 +1,9 @@ package com.logpm.factorydata.zbom.interceptor; import com.alibaba.fastjson.JSONObject; -import com.logpm.factorydata.zbom.config.RequestWrapper; import com.logpm.factorydata.zbom.pros.ZbFactoryProperties; import com.logpm.factorydata.zbom.util.QmSignUntil; +import com.logpm.factorydata.zbom.wrapper.RequestWrapper; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springblade.core.tool.api.R; diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryLogMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryLogMapper.java new file mode 100644 index 000000000..f24cb26b0 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryLogMapper.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.FactoryLogEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 接收发货单日志 Mapper + * + * @author zqb + * @since 2024-03-26 + */ +@Mapper +public interface FactoryLogMapper extends BaseMapper { + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryLogMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryLogMapper.xml new file mode 100644 index 000000000..a18fd4864 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryLogMapper.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/FactoryTokenMapper.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryTokenMapper.java new file mode 100644 index 000000000..676b8842a --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryTokenMapper.java @@ -0,0 +1,31 @@ +/* + * 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.FactoryToken; + +/** + * 工厂账号接口日志 Mapper 接口 + * + * @author zhy + * @since 2023-03-28 + */ +public interface FactoryTokenMapper extends BaseMapper { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryTokenMapper.xml b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryTokenMapper.xml new file mode 100644 index 000000000..f4b775aa8 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mapper/FactoryTokenMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + 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 0c41af4c6..cdfe7c3b7 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 @@ -16,6 +16,7 @@ */ package com.logpm.factorydata.zbom.mapper; +import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.logpm.factorydata.zbom.entity.ZbOrderPackageEntity; import com.logpm.factorydata.zbom.vo.NoSignNumberDTO; @@ -35,11 +36,11 @@ 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 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 07669e4c4..cc27af552 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 @@ -27,11 +27,11 @@ select 1 from ( - select #{item} pid + select #{item.packageCode} pid union all - select #{item} pid + select #{item.packageCode} pid ) packageCodeIds where packageCodeIds.pid = t.package_code) @@ -51,11 +51,11 @@ select 1 from ( - select #{item} pid + select #{item.packageCode} pid union all - select #{item} pid + select #{item.packageCode} pid ) packageCodeIds where packageCodeIds.pid = tt.package_code) diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mq/ZbomFactoryOrderListener.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mq/ZbomFactoryOrderListener.java index 4780ff841..a51563664 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mq/ZbomFactoryOrderListener.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/mq/ZbomFactoryOrderListener.java @@ -4,9 +4,12 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,15 +18,16 @@ import com.logpm.factorydata.base.feign.IFactoryDataBaseClient; import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; import com.logpm.factorydata.feign.IFactoryDataClient; import com.logpm.factorydata.vo.SendMsg; +import com.logpm.factorydata.zbom.entity.FactoryLogEntity; import com.logpm.factorydata.zbom.entity.ZbCategoryContrastEntity; import com.logpm.factorydata.zbom.entity.ZbOrderPackageEntity; import com.logpm.factorydata.zbom.entity.ZbPackageInfoEntity; import com.logpm.factorydata.zbom.entity.ZbReceiptEntity; import com.logpm.factorydata.zbom.mapper.ZbCategoryContrastMapper; +import com.logpm.factorydata.zbom.pros.ZbFactoryProperties; import com.logpm.factorydata.zbom.service.IOrderPackageService; import com.logpm.factorydata.zbom.service.IPackageInfoService; import com.logpm.factorydata.zbom.service.IReceiptService; -import com.logpm.factorydata.zbom.util.ThreadPoolUtil; import com.logpm.factorydata.zbom.vo.OrderPackageDTO; import com.logpm.factorydata.zbom.vo.PackageInfoDTO; import com.logpm.factorydata.zbom.vo.ZBReceiptDTO; @@ -32,6 +36,7 @@ import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import com.logpm.trunkline.entity.TrunklineDetailProductEntity; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.LogpmAsync; import org.springblade.common.constant.HttpConstants; import org.springblade.common.constant.PatternConstant; import org.springblade.common.constant.TenantNum; @@ -74,10 +79,7 @@ public class ZbomFactoryOrderListener { private final IReceiptService receiptService; private final IPackageInfoService packageInfoService; private final IOrderPackageService orderPackageService; - private final BladeRedis bladeRedis; - private final ZbCategoryContrastMapper zbCategoryContrastMapper; - private final IFactoryDataBaseClient baseClient; - private final IFactoryDataClient factoryDataClient; + private final ZbFactoryProperties zbFactoryProperties; @RabbitListener(bindings = @QueueBinding( value = @Queue(name = FactoryDataConstants.Mq.Queues.ZBOM_FACTORY_ORDER), @@ -86,11 +88,30 @@ public class ZbomFactoryOrderListener { )) @Transactional(rollbackFor = Exception.class) public void factoryOrder(String msg) { + log.info("处理志邦订单:{}", msg); if (StrUtil.isEmpty(msg)) { log.error("消息内容为空"); return; } - ZBReceiptDTO zbReceiptDTO = JSONUtil.toBean(msg, ZBReceiptDTO.class); + FactoryLogEntity logEntity = JSONUtil.toBean(msg, FactoryLogEntity.class); + if (ObjectUtil.isEmpty(logEntity)) { + log.error("消息内容为空"); + return; + } + // 去 minio 下载文件到本地,然后解析文件内容为实体对象 + ZBReceiptDTO zbReceiptDTO = null; + Long logId = logEntity.getId(); + String logUrl = logEntity.getLogUrl(); + if (StrUtil.isNotEmpty(logUrl)) { + List res = new ArrayList<>(); + FileUtil.readLines(URLUtil.url(logUrl), CharsetUtil.CHARSET_UTF_8, res); + if (CollUtil.isNotEmpty(res)) { + String content = res.get(0); + if (StrUtil.isNotEmpty(content)) { + zbReceiptDTO = JSONUtil.toBean(content, ZBReceiptDTO.class); + } + } + } if (ObjectUtil.isEmpty(zbReceiptDTO)) { log.error("消息内容为空"); return; @@ -102,7 +123,7 @@ public class ZbomFactoryOrderListener { return; } if (CollUtil.isNotEmpty(receiptService.list(Wrappers.lambdaQuery().eq(ZbReceiptEntity::getTaskCode, taskCode)))) { - log.error("入库单号已推送过了"); + log.error("入库单号 {} 已推送过了", taskCode); return; } // 查询当前这次推送的数据中的所有包件,校验其是否在数据库中已存在,存在则不保存 @@ -123,6 +144,7 @@ public class ZbomFactoryOrderListener { } ZbReceiptEntity zbReceiptEntity = new ZbReceiptEntity(); BeanUtil.copyProperties(zbReceiptDTO, zbReceiptEntity); + zbReceiptEntity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); // 保存订单数据 receiptService.save(zbReceiptEntity); if (CollUtil.isNotEmpty(details)) { @@ -136,6 +158,7 @@ public class ZbomFactoryOrderListener { ZbOrderPackageEntity packageEntity = new ZbOrderPackageEntity(); BeanUtil.copyProperties(detail, packageEntity); packageEntity.setReceiptId(zbReceiptEntity.getId()); + packageEntity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); packageEntities.add(packageEntity); } // 保存包件数据 @@ -156,6 +179,7 @@ public class ZbomFactoryOrderListener { ZbPackageInfoEntity packageInfoEntity = new ZbPackageInfoEntity(); BeanUtil.copyProperties(item, packageInfoEntity); packageInfoEntity.setPackageId(detailId); + packageInfoEntity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null); packageInfoEntities.add(packageInfoEntity); } } @@ -164,213 +188,9 @@ public class ZbomFactoryOrderListener { packageInfoService.saveBatch(packageInfoEntities); } // 处理暂存单 - buildAdvance(zbReceiptDTO, packageCode); - } - - private void buildAdvance(ZBReceiptDTO zbReceiptDTO, Set packageCode) { - // 新起线程构建暂存单发送mq - ThreadPoolUtil.getThreadPool().submit(() -> { - Long startWarehouseId = null; - String startWarehouseName = null; - String tenantId = null; - // 获取工厂基地绑定的始发仓信息 - R warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(zbReceiptDTO.getSenderName(), zbReceiptDTO.getSenderName()); - if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) { - FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData(); - if (ObjectUtil.isNotNull(data)) { - startWarehouseId = data.getWarehouseId(); - startWarehouseName = data.getWarehouseName(); - tenantId = data.getTenantId(); - } - } - Map> advanceMap = new HashMap<>(); - List details = zbReceiptDTO.getDetails(); - // 入库单号 + 订单自编号 + 发车单号 一个暂存单 - for (OrderPackageDTO detail : details) { - if (packageCode.contains(detail.getPackageCode())) { - log.info(" 接收志邦数据:包条码 {} 已存在数据库中,不生成暂存单。", detail.getPackageCode()); - continue; - } - String taskCode = zbReceiptDTO.getTaskCode(); - String departCode = zbReceiptDTO.getDepartCode(); - String platformOrderCode = detail.getPlatformOrderCode(); - String advanceKey = taskCode + departCode + platformOrderCode; - if (advanceMap.containsKey(advanceKey)) { - advanceMap.get(advanceKey).add(detail); - } else { - ArrayList orderPackageDTOS = new ArrayList<>(); - orderPackageDTOS.add(detail); - advanceMap.put(advanceKey, orderPackageDTOS); - } - } - // 组装暂存单数据 - List advances = new ArrayList<>(); - for (Map.Entry> stringListEntry : advanceMap.entrySet()) { - List value = stringListEntry.getValue(); - TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); - advanceEntity.setTenantId(tenantId); - advanceEntity.setStatus(0); - advanceEntity.setIsDeleted(0); - advanceEntity.setHasPackage(CollUtil.isNotEmpty(zbReceiptDTO.getDetails()) ? 1 : 0); - advanceEntity.setOrderType(zbReceiptDTO.getOrderType()); - advanceEntity.setBrand(zbReceiptDTO.getSenderName()); - advanceEntity.setSiteName(""); - advanceEntity.setArea(""); - advanceEntity.setTotalNum(CollUtil.isNotEmpty(value) ? value.size() : 0); - advanceEntity.setPackName(""); - advanceEntity.setPackCode(""); - advanceEntity.setWarehouseId(startWarehouseId); - advanceEntity.setWarehouseName(startWarehouseName); - - advanceEntity.setIsGcp(0); - advanceEntity.setCarrierName(zbReceiptDTO.getVendorName()); - advanceEntity.setSystemType("线上"); - advanceEntity.setMatingType(""); - advanceEntity.setSenderName(zbReceiptDTO.getSenderName()); - advanceEntity.setSenderPhone(zbReceiptDTO.getSenderTel()); - advanceEntity.setSenderAddress(zbReceiptDTO.getSenderAddress()); - advanceEntity.setWaybillStatus("0"); - advanceEntity.setWaybillNo(""); - advanceEntity.setTrainNumber(zbReceiptDTO.getDepartCode()); - advanceEntity.setFreezeStatus("0"); - - advanceEntity.setSenderFactory(zbReceiptDTO.getSenderName()); - List packageList = new ArrayList<>(); - for (OrderPackageDTO orderPackageDTO : value) { - advanceEntity.setOrderCode(orderPackageDTO.getPlatformOrderCode()); - advanceEntity.setDealerCode(orderPackageDTO.getCustomerCode()); - advanceEntity.setDealerName(orderPackageDTO.getCustomerName()); - advanceEntity.setStoreCode(orderPackageDTO.getCustomerCode()); - advanceEntity.setStoreName(orderPackageDTO.getCustomerName()); - advanceEntity.setServiceNum(orderPackageDTO.getRelationOrderCode()); - advanceEntity.setCustomerName(orderPackageDTO.getReceiverName()); - advanceEntity.setCustomerPhone(orderPackageDTO.getReceiverMobile()); - advanceEntity.setCustomerAddress(orderPackageDTO.getReceiverAddress()); - - // 封装包件 - TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); - advanceDetailEntity.setWarehouseId(startWarehouseId); - advanceDetailEntity.setWarehouseName(startWarehouseName); -// advanceDetailEntity.setIncomingWarehouseId(0L); -// advanceDetailEntity.setIncomingWarehouseName(""); - // 根据志邦的一流单标识赋值 - advanceEntity.setLegacyStatus("0"); - if (ObjectUtil.equal(orderPackageDTO.getLegacyFlag(), "Y")) { - advanceEntity.setLegacyStatus("1"); - } - - advanceDetailEntity.setOrderCode(orderPackageDTO.getPlatformOrderCode()); - advanceDetailEntity.setBrand(zbReceiptDTO.getSenderName()); - advanceDetailEntity.setSystemType("线上"); - advanceDetailEntity.setFirstPackName(orderPackageDTO.getPackageTypeName()); - advanceDetailEntity.setFirstPackCode(orderPackageDTO.getPackageType()); - // 获取映射志邦映射品类信息 - ZbCategoryContrastEntity zbCategoryContrastEntity = buildZbCategoryContrastEntityCache(orderPackageDTO.getPackageClass()); - if (zbCategoryContrastEntity != null) { - advanceDetailEntity.setSecondPackName(zbCategoryContrastEntity.getSecondName());//二级品类名称 - advanceDetailEntity.setSecondPackCode(zbCategoryContrastEntity.getSecondCode());//二级品类 - advanceDetailEntity.setThirdPackName(zbCategoryContrastEntity.getThirdName());//三级品类名称 - advanceDetailEntity.setThirdPackCode(zbCategoryContrastEntity.getThirdCode());//三级品类 - } else { - advanceDetailEntity.setSecondPackName(StringUtil.isBlank(orderPackageDTO.getPackageClass()) ? "" : orderPackageDTO.getPackageClass());//二级品类名称 - advanceDetailEntity.setSecondPackCode("");//二级品类 - advanceDetailEntity.setThirdPackName(StringUtil.isBlank(orderPackageDTO.getPackageClass()) ? "" : orderPackageDTO.getPackageClass());//三级品类名称 - advanceDetailEntity.setThirdPackCode("");//三级品类 - } - advanceDetailEntity.setSiteName(""); - advanceDetailEntity.setSiteCode(""); - String planQty = orderPackageDTO.getPlanQty(); - advanceDetailEntity.setQuantity((StrUtil.isNotBlank(planQty) && NumberUtil.isNumber(planQty)) ? Convert.toInt(planQty) : 0); - advanceDetailEntity.setOrderPackageCode(orderPackageDTO.getPackageCode()); - advanceDetailEntity.setTrainNumber(zbReceiptDTO.getDepartCode()); - advanceDetailEntity.setServiceNum(orderPackageDTO.getRelationOrderCode()); - advanceDetailEntity.setWaybillNo(""); - advanceDetailEntity.setPackageStatus("0"); - advanceDetailEntity.setWeight(StrUtil.isNotBlank(orderPackageDTO.getTotalGrossWeight()) ? new BigDecimal(orderPackageDTO.getTotalGrossWeight()) : BigDecimal.ZERO); - advanceDetailEntity.setVolume(StrUtil.isNotBlank(orderPackageDTO.getTotalVolume()) ? new BigDecimal(orderPackageDTO.getTotalVolume()) : BigDecimal.ZERO); -// advanceDetailEntity.setChargeType(0); - advanceDetailEntity.setSupple(""); - advanceDetailEntity.setManifest(""); - advanceDetailEntity.setReturnNum(""); - advanceDetailEntity.setSendDateStr(DateUtil.formatLocalDateTime(LocalDateTime.now())); - advanceDetailEntity.setCarNumber(""); - advanceDetailEntity.setGoodsMan(""); - advanceDetailEntity.setTenantId(tenantId); - advanceDetailEntity.setStatus(0); - advanceDetailEntity.setIsDeleted(0); - List itemJsons = new ArrayList<>(); - List items = orderPackageDTO.getItems(); - for (PackageInfoDTO item : items) { - TrunklineDetailProductEntity detailProductEntity = new TrunklineDetailProductEntity(); - detailProductEntity.setTenantId(tenantId); - detailProductEntity.setWarehouseId(startWarehouseId); - detailProductEntity.setWarehouseName(startWarehouseName); - detailProductEntity.setUnitNo(orderPackageDTO.getPackageCode()); - detailProductEntity.setProductCode(item.getItemCode()); - detailProductEntity.setProductName(item.getItemName()); - detailProductEntity.setQuantity(item.getPlanQty()); - detailProductEntity.setTenantId(TenantNum.HUITONGCODE); - detailProductEntity.setStatus(0); - detailProductEntity.setIsDeleted(0); - itemJsons.add(JSONUtil.parseObj(detailProductEntity)); - } - JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); - entries.set("items", itemJsons); - packageList.add(entries); - } - // 转成json对象,然后将包件明细放到detail中 - JSONObject entries = JSONUtil.parseObj(advanceEntity); - entries.set("details", JSONUtil.toJsonStr(packageList)); - advances.add(entries); - } - // 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg. - if (CollUtil.isNotEmpty(advances)) { - for (JSONObject advance : advances) { - SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER) - .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); - factoryDataClient.sendMessage(sendMsg); - } - } - }); - } - - private ZbCategoryContrastEntity buildZbCategoryContrastEntityCache(String packageClass) { - - - if (StringUtil.isBlank(packageClass)) { - return null; - } - if (containsChinese(packageClass)) { - return null; - } - - String key = TenantNum.HUITONGCODE + ":" + ZbCategoryContrastEntity.class.getName() + ":" + packageClass; - ZbCategoryContrastEntity zbCategoryContrastEntity = bladeRedis.get(key); - if (zbCategoryContrastEntity == null) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("source_code", packageClass); - queryWrapper.eq("status", "1"); - zbCategoryContrastEntity = zbCategoryContrastMapper.selectOne(queryWrapper); - if (!Objects.isNull(zbCategoryContrastEntity)) { - // 缓存起来 - bladeRedis.setEx(key, zbCategoryContrastEntity, 3600 * 24L); - } + if(zbFactoryProperties.getIsAdvance()){ + receiptService.buildAdvance(zbReceiptDTO, packageCode); } - return zbCategoryContrastEntity; - - - } - - /** - * 验证参数中是否包含中文 - * - * @param str 匹配参数 - * @return true 包含中文 false 不包含中文 - */ - private boolean containsChinese(String str) { - Pattern pattern = Pattern.compile(PatternConstant.REGEX_CHINESE); - Matcher matcher = pattern.matcher(str); - return matcher.find(); } } 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 1bdd1e641..27c61e2cb 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 @@ -8,6 +8,7 @@ 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.feign.IFactoryDataClient; import com.logpm.factorydata.vo.NodePushMsg; @@ -41,6 +42,7 @@ import org.springframework.amqp.rabbit.annotation.Queue; import org.springframework.amqp.rabbit.annotation.QueueBinding; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashMap; @@ -88,6 +90,7 @@ public class ZbomNodeDataPushListener { exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, type = ExchangeTypes.TOPIC), key = FactoryDataConstants.Mq.RoutingKeys.ZBOM_NODE_DATA_PUSH )) + @Transactional(rollbackFor = Exception.class) public void nodeDataPush(String msg) { // {"brand":"ZBOM","node":"TRANSFER_WAREHOUSE_DEPART","operator":"","operatorTime":"","content":[{"packageCode":"1423090693445"}]} log.info("zb接收到节点数据推送:{}", msg); @@ -100,23 +103,44 @@ public class ZbomNodeDataPushListener { String node = entries.getStr("node"); WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node); // 2 获取业务数据 - List packageCodeList = getBizData(entries); - if (CollUtil.isNotEmpty(packageCodeList)) { + // List packageCodeList = getBizData(entries); + List content = entries.getBeanList("content", JSONObject.class); + if (CollUtil.isNotEmpty(content)) { + String warehouseName = content.get(0).getStr("warehouseName"); + String orderCode = content.get(0).getStr("orderCode"); // 根据运单号和自编码分组查询出对应的数量 - List orders = orderPackageService.findOrderCodebypackageCodes(packageCodeList); + List orders = orderPackageService.findOrderCodebypackageCodes(content); Map nodeDataMap = new HashMap<>(); if (CollUtil.isNotEmpty(orders)) { for (NodeDataDTO order : orders) { nodeDataMap.put(order.getDepartCode() + order.getPlatformOrderCode(), order); } } else { - log.error("【{}】节点【{}】未查到数据", StrUtil.toString(packageCodeList), node); + log.error("【{}】节点【{}】未查到数据", StrUtil.toString(content), node); return; } + if (CollUtil.isNotEmpty(nodeDataMap)) { + if (ObjectUtil.equals(workNodeEnums.getCode(), NodeNeedEnums.UNLOAD_INCOMING_WAREHOUSE.getCode())) { + for (Map.Entry stringNodeDataDTOEntry : nodeDataMap.entrySet()) { + NodeDataDTO value = stringNodeDataDTOEntry.getValue(); + // 卸车入库只发推一次 + List list = nodePushService.list(Wrappers.lambdaQuery() + .eq(ZbFactoryNodePushEntity::getPlatformOrderCode, orderCode) + .eq(ZbFactoryNodePushEntity::getWorkNode, node) + .eq(ZbFactoryNodePushEntity::getWarehouseName, warehouseName) + .eq(ZbFactoryNodePushEntity::getDepartCode, value.getDepartCode()) + ); + // 已经推送过了就不再推了 + if (CollUtil.isNotEmpty(list)) { + return; + } + } + } + } // 签收节点获取组装未签收数据 Map noSignNumberMap = null; if (EnumUtil.equals(WorkNodeEnums.CLERK_REVIEW, node)) { - noSignNumberMap = getNoSignNumber(packageCodeList); + noSignNumberMap = getNoSignNumber(content); } // 获取历史发送的节点数据 List nodeOrderEntities = nodeOrderService.findHistoryNodeOrder(orders); @@ -132,14 +156,15 @@ public class ZbomNodeDataPushListener { Map sendMsgMap = new HashMap<>(); // 构建提交参数 buildParam(entries, node, workNodeEnums, orders, noSignNumberMap, nodeOrderMap, nodeConfirmLsit, sendMsgMap); - try { - // 推送给志邦 - if (CollUtil.isNotEmpty(nodeConfirmLsit)) { - for (NodeConfirmParamDTO nodeConfirmParam : nodeConfirmLsit) { + if (CollUtil.isNotEmpty(nodeConfirmLsit)) { + for (NodeConfirmParamDTO nodeConfirmParam : nodeConfirmLsit) { + log.info("zb节点数据推送NodeConfirmParamDTO:{}", JSONUtil.toJsonStr(nodeConfirmParam)); + try { + // 推送给志邦 String key = nodeConfirmParam.getDepartCode() + nodeConfirmParam.getPlatformOrderCode(); String body = JSONUtil.toJsonStr(nodeConfirmParam); String result = null; - if (zbProperties.isEnable()) { + if (zbProperties.getEnable()) { result = ZbomUtil.pushZbomSystem(zbProperties, body, ZbomConstants.Method.ROUTE_NODE_CONFIRM); } else { JSONObject jsonObject = new JSONObject(); @@ -176,6 +201,8 @@ public class ZbomNodeDataPushListener { .departCode(nodeConfirmParam.getDepartCode()) .platformOrderCode(nodeConfirmParam.getPlatformOrderCode()) .node(nodeConfirmParam.getNode()) + .workNode(node) + .warehouseName(warehouseName) .packageCode(packageCode) .content(body) .resultContent(result) @@ -198,14 +225,14 @@ public class ZbomNodeDataPushListener { } } } + } catch (Exception e) { + // 处理推送不成功的异常情况 + log.error("zb节点推送数据异常:{}", e); + // 保存日志 + + e.printStackTrace(); } } - } catch (Exception e) { - // 处理推送不成功的异常情况 - log.error("zb节点推送数据异常:{}", e); - // 保存日志 - - e.printStackTrace(); } } } @@ -214,6 +241,7 @@ public class ZbomNodeDataPushListener { Map noSignNumberMap, Map nodeOrderMap, List nodeConfirmLsit, Map sendMsgMap) { if (CollUtil.isNotEmpty(orders)) { + Integer nodeDelay = zbProperties.getDelayedTime() * 60 * 1000; for (NodeDataDTO nodeData : orders) { ZbomNodeEnums zbNode = ZbomNodeMappingEnums.getZbomByNodeAndStatus(workNodeEnums); String departCode = nodeData.getDepartCode(); @@ -233,7 +261,7 @@ public class ZbomNodeDataPushListener { nodeOrderEntity = new ZbFactoryNodeOrderEntity(); } // 如果是签收节点,需要判断是否为全部签收和部分签收 - if (EnumUtil.equals(WorkNodeEnums.CLERK_REVIEW, node)) { + if (EnumUtil.equals(WorkNodeEnums.CLERK_REVIEW, node) || EnumUtil.equals(WorkNodeEnums.SIGN_TRIPARTITE_TRANSFER_DEPART, node) || EnumUtil.equals(WorkNodeEnums.SIGN_DIRECT_SHIPPER, node)) { // 签收节点设置签收数量 Integer signNumber = Convert.toInt(nodeData.getSignQty()); log.info("key:{},签收数量:{}", departCode + "_" + platformOrderCode, signNumber); @@ -242,7 +270,6 @@ public class ZbomNodeDataPushListener { if (ObjectUtil.isNotEmpty(nodeOrderEntity.getPushNode()) && !StrUtil.contains(nodeOrderEntity.getPushNode(), ZbomNodeEnums.DELIVERY_ARRIVAL.getIndex().toString())) { // 第一次签收,节点改为送货抵达 currentNode = ZbomNodeEnums.DELIVERY_ARRIVAL; - Integer nodeDelay = 30 * 60 * 1000; buildSendMag(sendMsgMap, nodeData, key, paramDTO, node, nodeDelay); } else { // 查询当前未签收的数量与当前签收数量比较,如果未签收数较大,则是部分签收 @@ -267,20 +294,19 @@ public class ZbomNodeDataPushListener { } } Integer index = currentNode.getIndex(); - Integer startNodeDelay = 15 * 60 * 1000; // 历史必须节点需要补发 if (ObjectUtil.isEmpty(nodeOrderEntity.getPushNode())) { // 历史不存在,当前节点不是第一个节点,则需要补发第一个节点 if (!ObjectUtil.equal(index, ZbomNodeEnums.STATION_DEPART.getIndex())) { currentNode = ZbomNodeEnums.STATION_DEPART; - buildSendMag(sendMsgMap, nodeData, key, paramDTO, node, startNodeDelay); + buildSendMag(sendMsgMap, nodeData, key, paramDTO, node, nodeDelay); } } else { // 历史节点存在,但是历史节点中不包含第一个节点,且当前节点不是第一个节点,则需要补发第一个节点 if (!ObjectUtil.equal(index, ZbomNodeEnums.STATION_DEPART.getIndex()) && !StrUtil.contains(nodeOrderEntity.getPushNode(), ZbomNodeEnums.STATION_DEPART.getIndex().toString())) { currentNode = ZbomNodeEnums.STATION_DEPART; - buildSendMag(sendMsgMap, nodeData, key, paramDTO, node, startNodeDelay); + buildSendMag(sendMsgMap, nodeData, key, paramDTO, node, nodeDelay); } } // 组装历史节点数据 @@ -356,9 +382,9 @@ public class ZbomNodeDataPushListener { } @NotNull - private Map getNoSignNumber(List packageCodeList) { + private Map getNoSignNumber(List content) { // 根据运单号和自编码分组查询出未签收的数量 - List noSignNumberDTOS = orderPackageService.findNoSignNumber(packageCodeList); + List noSignNumberDTOS = orderPackageService.findNoSignNumber(content); log.info("未签收数据:{}", JSONUtil.toJsonStr(noSignNumberDTOS)); Map noSignNumberMap = new HashMap<>(); if (CollUtil.isNotEmpty(noSignNumberDTOS)) { @@ -370,16 +396,16 @@ public class ZbomNodeDataPushListener { } @Nullable - private List getBizData(JSONObject entries) { + private List getBizData(JSONObject entries) { List content = entries.getBeanList("content", JSONObject.class); - List packageCodeList = null; + List packageCodeList = null; if (CollUtil.isNotEmpty(content)) { // 查询这次操作的所有包件和运单号 packageCodeList = new ArrayList<>(); for (JSONObject obj : content) { String packageCode = obj.getStr("packageCode"); if (StrUtil.isNotBlank(packageCode)) { - packageCodeList.add(packageCode); + // packageCodeList.add(packageCode); } } } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/pros/ZbFactoryProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/pros/ZbFactoryProperties.java index f9a7f21b3..a45760756 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/pros/ZbFactoryProperties.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/pros/ZbFactoryProperties.java @@ -19,6 +19,17 @@ public class ZbFactoryProperties { private String customerid; private String secretkey; private String url; - private boolean enable = true; + /** + * 签收延迟推送时间(分钟) + */ + private Integer delayedTime = 30; + /** + * 是否推送暂存单到新系统 + */ + private Boolean isAdvance = false; + /** + * 是否推送数据到志邦 + */ + private Boolean enable = true; } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/FactoryLogService.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/FactoryLogService.java new file mode 100644 index 000000000..a541316f7 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/FactoryLogService.java @@ -0,0 +1,16 @@ +package com.logpm.factorydata.zbom.service; + +import com.logpm.factorydata.zbom.entity.FactoryLogEntity; +import com.logpm.factorydata.zbom.vo.ZBReceiptDTO; +import org.springblade.core.mp.base.BaseService; + +/** + * 工厂订单日志 服务类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +public interface FactoryLogService extends BaseService { + + void orderData(ZBReceiptDTO zbReceiptDTO); +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IFactoryTokenService.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IFactoryTokenService.java new file mode 100644 index 000000000..87af56127 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IFactoryTokenService.java @@ -0,0 +1,15 @@ +package com.logpm.factorydata.zbom.service; + +import com.logpm.factorydata.zbom.entity.FactoryToken; +import org.springblade.core.mp.base.BaseService; + +import java.security.NoSuchAlgorithmException; + +/** + * 工厂推送数据接口 + */ +public interface IFactoryTokenService extends BaseService { + + + boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException; +} 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 ca4e7cf9c..e73b65609 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 @@ -16,6 +16,7 @@ */ package com.logpm.factorydata.zbom.service; +import cn.hutool.json.JSONObject; import com.logpm.factorydata.zbom.entity.ZbOrderPackageEntity; import com.logpm.factorydata.zbom.vo.NoSignNumberDTO; import com.logpm.factorydata.zbom.vo.OrderPackageDTO; @@ -32,11 +33,11 @@ import java.util.List; */ public interface IOrderPackageService extends BaseService { - List findOrderCodebypackageCodes(List packageCodeList); + List findOrderCodebypackageCodes(List content); void updateSignForStatus(List packageCodeList); - List findNoSignNumber(List packageCodeList); + List findNoSignNumber(List content); List findByPackageCodes(List packageCodeList); } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IReceiptService.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IReceiptService.java index f7ebdee19..f2cd4e869 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IReceiptService.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/IReceiptService.java @@ -17,8 +17,11 @@ package com.logpm.factorydata.zbom.service; import com.logpm.factorydata.zbom.entity.ZbReceiptEntity; +import com.logpm.factorydata.zbom.vo.ZBReceiptDTO; import org.springblade.core.mp.base.BaseService; +import java.util.Set; + /** * 志邦入库单 服务类 * @@ -27,4 +30,6 @@ import org.springblade.core.mp.base.BaseService; */ public interface IReceiptService extends BaseService { + void buildAdvance(ZBReceiptDTO zbReceiptDTO, Set packageCode); + } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/FactoryLogServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/FactoryLogServiceImpl.java new file mode 100644 index 000000000..fd35e8e87 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/FactoryLogServiceImpl.java @@ -0,0 +1,105 @@ +package com.logpm.factorydata.zbom.service.impl; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.json.JSONUtil; +import com.logpm.factorydata.enums.SaxStatusEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.vo.SendMsg; +import com.logpm.factorydata.zbom.entity.FactoryLogEntity; +import com.logpm.factorydata.zbom.mapper.FactoryLogMapper; +import com.logpm.factorydata.zbom.service.FactoryLogService; +import com.logpm.factorydata.zbom.vo.ZBReceiptDTO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.io.IOUtils; +import org.jetbrains.annotations.NotNull; +import org.springblade.common.constant.factorydata.FactoryDataConstants; +import org.springblade.common.utils.FileLogsUtil; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.oss.model.BladeFile; +import org.springblade.core.tool.api.R; +import org.springblade.resource.feign.IOssClient; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; + +/** + * 工厂订单日志 业务实现类 + * + * @Author zqb + * @Date 2024/4/26 + **/ +@Slf4j +@Service +@AllArgsConstructor +public class FactoryLogServiceImpl extends BaseServiceImpl implements FactoryLogService { + + + private final IFactoryDataClient factoryDataClient; + + private final IOssClient ossClient; + + @Override + public void orderData(ZBReceiptDTO zbReceiptDTO) { + // 1 上传数据到 minio 获取到地址 + String url = uploadFile(JSONUtil.toJsonStr(zbReceiptDTO)); + // 2 保存地址到数据库 + FactoryLogEntity logEntity = new FactoryLogEntity(); + logEntity.setType(1); + logEntity.setSaxStatus(SaxStatusEnums.NOMAL.getCode()); + logEntity.setLogUrl(url); + this.save(logEntity); + + // 3 将消息发送给 mq,解析保存 + SendMsg build = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ZBOM_FACTORY_ORDER) + .message(JSONUtil.toJsonStr(logEntity)).build(); + factoryDataClient.sendMessage(build); + } + + private String uploadFile(String body) { + //文本内容和保存为本地文件 并上传 + String logPath = FileLogsUtil.saveFileLogs(body); + log.info(">>> 文件路径 {}", logPath); + + MultipartFile multi = getMultipartFile(logPath); + //上传到服务器 + R r = ossClient.fileUpload(multi, "zb-order-logs"); + if (r.isSuccess()) { + BladeFile data = (BladeFile) r.getData(); + // 删除本地文件 + FileUtil.del(logPath); + return data.getLink(); + } + return null; + } + + @NotNull + private MultipartFile getMultipartFile(String logPath) { + File file = new File(logPath); + + // File 转 MultipartFile + FileItem item = new DiskFileItemFactory().createItem("file" + , MediaType.MULTIPART_FORM_DATA_VALUE + , true + , file.getName()); + try ( + InputStream input = Files.newInputStream(file.toPath()); + OutputStream os = item.getOutputStream()) { + // 流转移 + IOUtils.copy(input, os); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid file: " + e, e); + } + + return new CommonsMultipartFile(item); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/FactoryTokenServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/FactoryTokenServiceImpl.java new file mode 100644 index 000000000..115f84902 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/FactoryTokenServiceImpl.java @@ -0,0 +1,62 @@ +package com.logpm.factorydata.zbom.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.factorydata.zbom.entity.FactoryToken; +import com.logpm.factorydata.zbom.mapper.FactoryTokenMapper; +import com.logpm.factorydata.zbom.service.IFactoryTokenService; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.redis.cache.BladeRedis; +import org.springframework.stereotype.Service; + +import java.security.NoSuchAlgorithmException; +import java.util.Objects; + +@AllArgsConstructor +@Service +public class FactoryTokenServiceImpl extends BaseServiceImpl implements IFactoryTokenService { + + private static final Logger logger = LoggerFactory.getLogger(FactoryTokenServiceImpl.class); + + private final BladeRedis bladeRedis; + + @Override + public boolean verifyToken(String token, String corpId) throws NoSuchAlgorithmException { + logger.info("#########verifyToken: 验证token开始"); + //先生成token摘要 +// String tokenAbst = MD5Utils.md5Hex(token.getBytes(StandardCharsets.UTF_8)); + + //编写查询条件 + String key = "corpId:" + corpId; + FactoryToken factoryToken = bladeRedis.get(key); + + if (Objects.isNull(factoryToken)) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("token", token); + factoryToken = baseMapper.selectOne(queryWrapper); + } + + + if (Objects.isNull(factoryToken)) { + logger.error("#########verifyToken: token1验证不通过 token={},corpid={}", token, corpId); + return false; + } + logger.info("#########verifyToken: 验证token 传入token {} 验证token {}", token, factoryToken.getToken()); + if (!factoryToken.getToken().equals(token)) { + logger.error("#########verifyToken: token2验证不通过 token={},corpid={}", token, corpId); + return false; + } + + + Long expireTimeLong = factoryToken.getExpireTime().getTime(); + Long now = System.currentTimeMillis(); + //判断是否过期 + if (now > expireTimeLong) { + logger.error("#########verifyToken: token验证不通过 已过期 token={},corpId={}", token, corpId); + return false; + } + return true; + } +} 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 71b8b1657..2627ca6af 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 @@ -16,6 +16,7 @@ */ package com.logpm.factorydata.zbom.service.impl; +import cn.hutool.json.JSONObject; import com.logpm.factorydata.zbom.entity.ZbOrderPackageEntity; import com.logpm.factorydata.zbom.mapper.OrderPackageMapper; import com.logpm.factorydata.zbom.service.IOrderPackageService; @@ -37,8 +38,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 content) { + List orders = this.baseMapper.findOrderCodebypackageCodes(content); return orders; } @@ -48,8 +49,8 @@ public class OrderPackageServiceImpl extends BaseServiceImpl findNoSignNumber(List packageCodeList) { - return this.baseMapper.findNoSignNumber(packageCodeList); + public List findNoSignNumber(List content) { + return this.baseMapper.findNoSignNumber(content); } @Override diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/ReceiptServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/ReceiptServiceImpl.java index 11878d7fb..5a84b31de 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/ReceiptServiceImpl.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/ReceiptServiceImpl.java @@ -16,14 +16,54 @@ */ package com.logpm.factorydata.zbom.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +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.conditions.query.QueryWrapper; +import com.logpm.factorydata.base.feign.IFactoryDataBaseClient; +import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.vo.SendMsg; +import com.logpm.factorydata.zbom.entity.ZbCategoryContrastEntity; import com.logpm.factorydata.zbom.entity.ZbReceiptEntity; import com.logpm.factorydata.zbom.mapper.ReceiptMapper; +import com.logpm.factorydata.zbom.mapper.ZbCategoryContrastMapper; import com.logpm.factorydata.zbom.service.IReceiptService; +import com.logpm.factorydata.zbom.vo.OrderPackageDTO; +import com.logpm.factorydata.zbom.vo.PackageInfoDTO; +import com.logpm.factorydata.zbom.vo.ZBReceiptDTO; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import com.logpm.trunkline.entity.TrunklineDetailProductEntity; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.common.constant.HttpConstants; +import org.springblade.common.constant.PatternConstant; +import org.springblade.common.constant.TenantNum; +import org.springblade.common.constant.factorydata.FactoryDataConstants; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.StringUtil; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * 志邦入库单 服务实现类 * @@ -35,4 +75,209 @@ import org.springframework.stereotype.Service; @AllArgsConstructor public class ReceiptServiceImpl extends BaseServiceImpl implements IReceiptService { + private final BladeRedis bladeRedis; + private final ZbCategoryContrastMapper zbCategoryContrastMapper; + private final IFactoryDataBaseClient baseClient; + private final IFactoryDataClient factoryDataClient; + + @Override + @LogpmAsync("asyncExecutor") + public void buildAdvance(ZBReceiptDTO zbReceiptDTO, Set packageCode) { + // 新起线程构建暂存单发送mq + Long startWarehouseId = null; + String startWarehouseName = null; + String tenantId = null; + // 获取工厂基地绑定的始发仓信息 + R warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(zbReceiptDTO.getSenderName(), zbReceiptDTO.getSenderName()); + if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) { + FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData(); + if (ObjectUtil.isNotNull(data)) { + startWarehouseId = data.getWarehouseId(); + startWarehouseName = data.getWarehouseName(); + tenantId = data.getTenantId(); + } + } + Map> advanceMap = new HashMap<>(); + List details = zbReceiptDTO.getDetails(); + // 入库单号 + 订单自编号 + 发车单号 一个暂存单 + for (OrderPackageDTO detail : details) { + if (packageCode.contains(detail.getPackageCode())) { + log.info(" 接收志邦数据:包条码 {} 已存在数据库中,不生成暂存单。", detail.getPackageCode()); + continue; + } + String taskCode = zbReceiptDTO.getTaskCode(); + String departCode = zbReceiptDTO.getDepartCode(); + String platformOrderCode = detail.getPlatformOrderCode(); + String advanceKey = taskCode + departCode + platformOrderCode; + if (advanceMap.containsKey(advanceKey)) { + advanceMap.get(advanceKey).add(detail); + } else { + ArrayList orderPackageDTOS = new ArrayList<>(); + orderPackageDTOS.add(detail); + advanceMap.put(advanceKey, orderPackageDTOS); + } + } + // 组装暂存单数据 + List advances = new ArrayList<>(); + for (Map.Entry> stringListEntry : advanceMap.entrySet()) { + List value = stringListEntry.getValue(); + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + advanceEntity.setHasPackage(CollUtil.isNotEmpty(zbReceiptDTO.getDetails()) ? 1 : 0); + advanceEntity.setOrderType(zbReceiptDTO.getOrderType()); + advanceEntity.setBrand(zbReceiptDTO.getSenderName()); + advanceEntity.setSiteName(""); + advanceEntity.setArea(""); + advanceEntity.setTotalNum(CollUtil.isNotEmpty(value) ? value.size() : 0); + advanceEntity.setPackName(""); + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(startWarehouseId); + advanceEntity.setWarehouseName(startWarehouseName); + + advanceEntity.setIsGcp(0); + advanceEntity.setCarrierName(zbReceiptDTO.getVendorName()); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setSenderName(zbReceiptDTO.getSenderName()); + advanceEntity.setSenderPhone(zbReceiptDTO.getSenderTel()); + advanceEntity.setSenderAddress(zbReceiptDTO.getSenderAddress()); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setTrainNumber(zbReceiptDTO.getDepartCode()); + advanceEntity.setFreezeStatus("0"); + + advanceEntity.setSenderFactory(zbReceiptDTO.getSenderName()); + List packageList = new ArrayList<>(); + for (OrderPackageDTO orderPackageDTO : value) { + advanceEntity.setOrderCode(orderPackageDTO.getPlatformOrderCode()); + advanceEntity.setDealerCode(orderPackageDTO.getCustomerCode()); + advanceEntity.setDealerName(orderPackageDTO.getCustomerName()); + advanceEntity.setStoreCode(orderPackageDTO.getCustomerCode()); + advanceEntity.setStoreName(orderPackageDTO.getCustomerName()); + advanceEntity.setServiceNum(orderPackageDTO.getRelationOrderCode()); + advanceEntity.setCustomerName(orderPackageDTO.getReceiverName()); + advanceEntity.setCustomerPhone(orderPackageDTO.getReceiverMobile()); + advanceEntity.setCustomerAddress(orderPackageDTO.getReceiverAddress()); + // 根据志邦的一流单标识赋值 + advanceEntity.setLegacyStatus("0"); + if (ObjectUtil.equal(orderPackageDTO.getLegacyFlag(), "Y")) { + advanceEntity.setLegacyStatus("1"); + } + // 封装包件 + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(startWarehouseId); + advanceDetailEntity.setWarehouseName(startWarehouseName); + advanceDetailEntity.setOrderCode(orderPackageDTO.getPlatformOrderCode()); + advanceDetailEntity.setBrand(zbReceiptDTO.getSenderName()); + advanceDetailEntity.setSystemType("线上"); + advanceDetailEntity.setFirstPackName(orderPackageDTO.getPackageTypeName()); + advanceDetailEntity.setFirstPackCode(orderPackageDTO.getPackageType()); + // 获取映射志邦映射品类信息 + ZbCategoryContrastEntity zbCategoryContrastEntity = buildZbCategoryContrastEntityCache(orderPackageDTO.getPackageClass()); + if (zbCategoryContrastEntity != null) { + advanceDetailEntity.setSecondPackName(zbCategoryContrastEntity.getSecondName());//二级品类名称 + advanceDetailEntity.setSecondPackCode(zbCategoryContrastEntity.getSecondCode());//二级品类 + advanceDetailEntity.setThirdPackName(zbCategoryContrastEntity.getThirdName());//三级品类名称 + advanceDetailEntity.setThirdPackCode(zbCategoryContrastEntity.getThirdCode());//三级品类 + } else { + advanceDetailEntity.setSecondPackName(StringUtil.isBlank(orderPackageDTO.getPackageClass()) ? "" : orderPackageDTO.getPackageClass());//二级品类名称 + advanceDetailEntity.setSecondPackCode("");//二级品类 + advanceDetailEntity.setThirdPackName(StringUtil.isBlank(orderPackageDTO.getPackageClass()) ? "" : orderPackageDTO.getPackageClass());//三级品类名称 + advanceDetailEntity.setThirdPackCode("");//三级品类 + } + advanceDetailEntity.setSiteName(""); + advanceDetailEntity.setSiteCode(""); + String planQty = orderPackageDTO.getPlanQty(); + advanceDetailEntity.setQuantity((StrUtil.isNotBlank(planQty) && NumberUtil.isNumber(planQty)) ? Convert.toInt(planQty) : 0); + advanceDetailEntity.setOrderPackageCode(orderPackageDTO.getPackageCode()); + advanceDetailEntity.setTrainNumber(zbReceiptDTO.getDepartCode()); + advanceDetailEntity.setServiceNum(orderPackageDTO.getRelationOrderCode()); + advanceDetailEntity.setWaybillNo(""); + advanceDetailEntity.setPackageStatus("0"); + advanceDetailEntity.setWeight(StrUtil.isNotBlank(orderPackageDTO.getTotalGrossWeight()) ? new BigDecimal(orderPackageDTO.getTotalGrossWeight()) : BigDecimal.ZERO); + advanceDetailEntity.setVolume(StrUtil.isNotBlank(orderPackageDTO.getTotalVolume()) ? new BigDecimal(orderPackageDTO.getTotalVolume()) : BigDecimal.ZERO); +// advanceDetailEntity.setChargeType(0); + advanceDetailEntity.setSupple(""); + advanceDetailEntity.setManifest(""); + advanceDetailEntity.setReturnNum(""); + advanceDetailEntity.setSendDateStr(DateUtil.formatLocalDateTime(LocalDateTime.now())); + advanceDetailEntity.setCarNumber(""); + advanceDetailEntity.setGoodsMan(""); + advanceDetailEntity.setTenantId(tenantId); + advanceDetailEntity.setStatus(0); + advanceDetailEntity.setIsDeleted(0); + List itemJsons = new ArrayList<>(); + List items = orderPackageDTO.getItems(); + for (PackageInfoDTO item : items) { + TrunklineDetailProductEntity detailProductEntity = new TrunklineDetailProductEntity(); + detailProductEntity.setTenantId(tenantId); + detailProductEntity.setWarehouseId(startWarehouseId); + detailProductEntity.setWarehouseName(startWarehouseName); + detailProductEntity.setUnitNo(orderPackageDTO.getPackageCode()); + detailProductEntity.setProductCode(item.getItemCode()); + detailProductEntity.setProductName(item.getItemName()); + detailProductEntity.setQuantity(item.getPlanQty()); + detailProductEntity.setStatus(0); + detailProductEntity.setIsDeleted(0); + itemJsons.add(JSONUtil.parseObj(detailProductEntity)); + } + JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + entries.set("items", itemJsons); + packageList.add(entries); + } + // 转成json对象,然后将包件明细放到detail中 + JSONObject entries = JSONUtil.parseObj(advanceEntity); + entries.set("details", JSONUtil.toJsonStr(packageList)); + advances.add(entries); + } + // 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg. + if (CollUtil.isNotEmpty(advances)) { + for (JSONObject advance : advances) { + SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); + factoryDataClient.sendMessage(sendMsg); + } + } + } + + private ZbCategoryContrastEntity buildZbCategoryContrastEntityCache(String packageClass) { + + + if (StringUtil.isBlank(packageClass)) { + return null; + } + if (containsChinese(packageClass)) { + return null; + } + + String key = TenantNum.HUITONGCODE + ":" + ZbCategoryContrastEntity.class.getName() + ":" + packageClass; + ZbCategoryContrastEntity zbCategoryContrastEntity = bladeRedis.get(key); + if (zbCategoryContrastEntity == null) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("source_code", packageClass); + queryWrapper.eq("status", "1"); + zbCategoryContrastEntity = zbCategoryContrastMapper.selectOne(queryWrapper); + if (!Objects.isNull(zbCategoryContrastEntity)) { + // 缓存起来 + bladeRedis.setEx(key, zbCategoryContrastEntity, 3600 * 24L); + } + } + return zbCategoryContrastEntity; + + + } + + /** + * 验证参数中是否包含中文 + * + * @param str 匹配参数 + * @return true 包含中文 false 不包含中文 + */ + private boolean containsChinese(String str) { + Pattern pattern = Pattern.compile(PatternConstant.REGEX_CHINESE); + Matcher matcher = pattern.matcher(str); + return matcher.find(); + } } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/ThreadPoolUtil.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/ThreadPoolUtil.java deleted file mode 100644 index 911c162d6..000000000 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/util/ThreadPoolUtil.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.logpm.factorydata.zbom.util; - -import cn.hutool.core.thread.ExecutorBuilder; -import cn.hutool.core.thread.ThreadFactoryBuilder; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutorService; - -/** - * @author zhaoqiaobo - * @create 2024-03-14 10:26 - */ -@Slf4j -public class ThreadPoolUtil { - - private ThreadPoolUtil() { - } - - /** - * 线程池 - */ - public static ExecutorService executor = null; - - static { - init(); - } - - synchronized public static void init() { - if (null != executor) { - executor.shutdownNow(); - } - executor = ExecutorBuilder.create() - .setCorePoolSize(8) - .setMaxPoolSize(20) - .setThreadFactory(ThreadFactoryBuilder.create().setNamePrefix("logpm-factory-data-zbom-").build()) - .useSynchronousQueue().build(); - } - - public static ExecutorService getThreadPool() { - return executor; - } - -} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/wrapper/CustomHttpServletRequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/wrapper/CustomHttpServletRequestWrapper.java new file mode 100644 index 000000000..5639d49b7 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/wrapper/CustomHttpServletRequestWrapper.java @@ -0,0 +1,38 @@ +package com.logpm.factorydata.zbom.wrapper; + +import org.springframework.http.HttpHeaders; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper { + + private final HttpHeaders headers; + + public CustomHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + headers = new HttpHeaders(); + } + + @Override + public String getHeader(String name) { + String headerValue = headers.getFirst(name); + return headerValue != null ? headerValue : super.getHeader(name); + } + + @Override + public Enumeration getHeaderNames() { + List names = Collections.list(super.getHeaderNames()); + headers.forEach((key, value) -> names.add(key)); + return Collections.enumeration(names); + } + + // 其他需要覆盖的方法... + + public void addHeader(String name, String value) { + headers.add(name, value); + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/wrapper/RequestWrapper.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/wrapper/RequestWrapper.java new file mode 100644 index 000000000..9f82f1839 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/wrapper/RequestWrapper.java @@ -0,0 +1,75 @@ +package com.logpm.factorydata.zbom.wrapper; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class RequestWrapper extends HttpServletRequestWrapper { + private final String body; + public RequestWrapper(HttpServletRequest request) throws IOException { + super(request); + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } catch (IOException ex) { + throw ex; + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException ex) { + throw ex; + } + } + } + body = stringBuilder.toString(); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); + ServletInputStream servletInputStream = new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + @Override + public boolean isReady() { + return false; + } + @Override + public void setReadListener(ReadListener readListener) {} + @Override + public int read() throws IOException { + return byteArrayInputStream.read(); + } + }; + return servletInputStream; + + } + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } + public String getBody() { + return this.body; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-dev.yml b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-dev.yml index 7d09a1090..ee4d16179 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-dev.yml +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-dev.yml @@ -2,6 +2,8 @@ server: port: 18910 +zb: + enable: false #数据源配置 #spring: # datasource: @@ -38,7 +40,7 @@ spring: mandatory: true #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -59,13 +61,15 @@ spring: url: ${blade.datasource.factorydata-zbom.master.url} username: ${blade.datasource.factorydata-zbom.master.username} password: ${blade.datasource.factorydata-zbom.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.factorydata-zbom.slave.url} - username: ${blade.datasource.factorydata-zbom.slave.username} - password: ${blade.datasource.factorydata-zbom.slave.password} - + url: ${blade.datasource.factorydata-zbom.627683.url} + username: ${blade.datasource.factorydata-zbom.627683.username} + password: ${blade.datasource.factorydata-zbom.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-prod.yml b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-prod.yml index 3db9ae091..5f0af11dc 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-prod.yml +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-prod.yml @@ -1,6 +1,6 @@ #服务器端口 server: - port: 8900 + port: 18910 #数据源配置 #spring: @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -30,16 +30,18 @@ spring: validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.report.master.url} - username: ${blade.datasource.report.master.username} - password: ${blade.datasource.report.master.password} - slave: + url: ${blade.datasource.factorydata-zbom.master.url} + username: ${blade.datasource.factorydata-zbom.master.username} + password: ${blade.datasource.factorydata-zbom.master.password} + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.report.slave.url} - username: ${blade.datasource.report.slave.username} - password: ${blade.datasource.report.slave.password} - + url: ${blade.datasource.factorydata-zbom.627683.url} + username: ${blade.datasource.factorydata-zbom.627683.username} + password: ${blade.datasource.factorydata-zbom.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-test.yml b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-test.yml index d776d194a..389c6c785 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-test.yml +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application-test.yml @@ -38,7 +38,7 @@ spring: mandatory: true #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -59,13 +59,15 @@ spring: url: ${blade.datasource.factorydata-zbom.master.url} username: ${blade.datasource.factorydata-zbom.master.username} password: ${blade.datasource.factorydata-zbom.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.factorydata-zbom.slave.url} - username: ${blade.datasource.factorydata-zbom.slave.username} - password: ${blade.datasource.factorydata-zbom.slave.password} - + url: ${blade.datasource.factorydata-zbom.627683.url} + username: ${blade.datasource.factorydata-zbom.627683.username} + password: ${blade.datasource.factorydata-zbom.627683.password} +blade: + data-scope: + enabled: false diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application.yml b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application.yml index 33da94b58..ca8dc27d5 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application.yml +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/resources/application.yml @@ -10,21 +10,9 @@ swagger: - org.springblade - com.logpm -#oss配置 -oss: - enabled: true - name: minio - tenant-mode: false - endpoint: http://8.137.14.82:9000 - access-key: minio - secret-key: 123123123 - bucket-name: bladex - - logging: config: classpath:logback.xml - spring: main: allow-circular-references: true diff --git a/blade-service/logpm-factory-data/pom.xml b/blade-service/logpm-factory-data/pom.xml index 32d161303..78a672f0f 100644 --- a/blade-service/logpm-factory-data/pom.xml +++ b/blade-service/logpm-factory-data/pom.xml @@ -12,10 +12,13 @@ pom 3.2.0.RELEASE - logpm-factory-data-zbom - logpm-factory-data-base + logpm-factory-data-suofeiya + logpm-factory-data-olo + logpm-factory-data-jinpai + logpm-factory-data-linsy + logpm-factory-data-mwh diff --git a/blade-service/logpm-factory/Dockerfile b/blade-service/logpm-factory/Dockerfile index 19186b76e..2fd786244 100644 --- a/blade-service/logpm-factory/Dockerfile +++ b/blade-service/logpm-factory/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-factory/pom.xml b/blade-service/logpm-factory/pom.xml index dbe8dab39..a441e8eb8 100644 --- a/blade-service/logpm-factory/pom.xml +++ b/blade-service/logpm-factory/pom.xml @@ -119,6 +119,21 @@ 3.2.0.RELEASE compile + + org.springblade + logpm-factory-data-base-api + 3.2.0.RELEASE + + + org.springblade + logpm-factory-data-api + 3.2.0.RELEASE + + + com.logpm + logpm-factory-data-zbom-api + 3.2.0.RELEASE + diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..a7bb19520 --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.factory.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/JobAnnotationAspect.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/JobAnnotationAspect.java new file mode 100644 index 000000000..896698111 --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/JobAnnotationAspect.java @@ -0,0 +1,77 @@ +package com.logpm.factory.aspect; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.AllArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Aspect +@Component +@AllArgsConstructor +public class JobAnnotationAspect { + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + @Around("@annotation(com.xxl.job.core.handler.annotation.XxlJob)") + public Object xxlJobAnnotationMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + + JSONObject jsonObject = mockLogin(); + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.addHeader("Blade-Auth", "bearer "+jsonObject.get("access_token")); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(mockRequest)); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+jsonObject.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + DynamicDataSourceContextHolder.push(jsonObject.getString("tenant_id")); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + + return result; + + + } + + private JSONObject mockLogin() throws InterruptedException { + + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + return data; + } + + +} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/LocalServerTenantIdAnnotationAspect.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/LocalServerTenantIdAnnotationAspect.java new file mode 100644 index 000000000..76b675a71 --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/LocalServerTenantIdAnnotationAspect.java @@ -0,0 +1,59 @@ +//package com.logpm.factory.aspect; +// +//import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +//import org.aspectj.lang.ProceedingJoinPoint; +//import org.aspectj.lang.annotation.Around; +//import org.aspectj.lang.annotation.Aspect; +//import org.aspectj.lang.reflect.MethodSignature; +//import org.springblade.common.annotations.LocalServerUser; +//import org.springblade.core.secure.BladeUser; +//import org.springblade.core.secure.utils.AuthUtil; +//import org.springblade.core.tool.utils.StringUtil; +//import org.springblade.core.tool.utils.WebUtil; +//import org.springblade.system.cache.UserCache; +//import org.springblade.system.entity.User; +//import org.springframework.core.annotation.Order; +//import org.springframework.scheduling.annotation.Async; +//import org.springframework.stereotype.Component; +// +//import javax.servlet.http.HttpServletRequest; +//import java.lang.reflect.Method; +// +//@Aspect +//@Component +//public class LocalServerTenantIdAnnotationAspect { +// +// +// /** +// * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 +// * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 +// */ +// +// // 定义一个 +// @Around("@annotation(org.springblade.common.annotations.LocalServerUser)") +// public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { +// +// MethodSignature signature = (MethodSignature) joinPoint.getSignature(); +// Method method = signature.getMethod(); +// +// LocalServerUser myAsync = method.getAnnotation(LocalServerUser.class); +// String annotationValue = myAsync.ds(); +// +// if(StringUtil.isNotBlank(annotationValue) ){ +// // 在方法执行前的操作 +// DynamicDataSourceContextHolder.push(annotationValue); +// +// // 执行原方法 +// Object result = joinPoint.proceed(); +// +// // 在方法执行后的操作 +// DynamicDataSourceContextHolder.poll(); +// +// return result; +// }else{ +// return joinPoint.proceed(); +// } +// +// } +// +//} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..eceec509f --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.factory.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryAuthController.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryAuthController.java index b2a90050a..f4a81b0e7 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryAuthController.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryAuthController.java @@ -26,6 +26,9 @@ import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springblade.common.exception.CustomerException; import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -53,6 +56,8 @@ public class FactoryAuthController extends BladeController { @ApiOperation(value = "获取token推送", notes = "传入factoryAccountDTO") public R token(@Validated @RequestBody FactoryAccountDTO factoryAccountDTO, HttpServletResponse response) { log.info("############token: 获取账号token "); + BladeUser user = AuthUtil.getUser(); + log.info("############请求参数 user:{}",user); log.info("############请求参数 factoryAccountDTO:{}",factoryAccountDTO); //通过企业id 应用id 秘钥 获取对应的token String corpid = factoryAccountDTO.getCorpid();//企业id diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryCommonController.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryCommonController.java index 43927134f..301d2ff42 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryCommonController.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryCommonController.java @@ -97,7 +97,10 @@ public class FactoryCommonController { //将消息携带绑定键值 rabbitTemplate.convertAndSend(RabbitConstant.ORDER_STATUS_EXCHANGE, RabbitConstant.ORDER_STATUS_ROUTING, map); map.put("type", "DealWith"); - rabbitTemplate.convertAndSend(RabbitConstant.DEAL_WITH_EXCHANGE, RabbitConstant.DEAL_WITH_ROUTING, map); + rabbitTemplate.convertAndSend(RabbitConstant.DEAL_WITH_EXCHANGE, RabbitConstant.DEAL_WITH_ROUTING, map,message->{ + message.getMessageProperties().setHeader("x-delay",2000); + return message; + }); // R r = factoryDataService.handleStatusData(orderStatusDTO); @@ -177,6 +180,7 @@ public class FactoryCommonController { map.put("messageData", receiveInfoDTO); map.put("createTime", new Date().getTime()); map.put("flagType", "OrderStatusLog"); + //将消息携带绑定键值 rabbitTemplate.convertAndSend(RabbitConstant.UNLOAD_CAR_COM_INFO_EXCHANGE, RabbitConstant.UNLOAD_CAR_COM_INFO_ROUTING, map); diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/IAsyncDataService.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/IAsyncDataService.java index ff89c60bf..4b37fd005 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/IAsyncDataService.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/IAsyncDataService.java @@ -27,4 +27,7 @@ public interface IAsyncDataService { void handlerOuPaiDataToHt(String carNum); + void handlerMtDataToHtNew(Long mainId); + + void handlerPanDataToHtNew(Long orderId); } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/AsyncDataServiceImpl.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/AsyncDataServiceImpl.java index 3884cb801..d70d6360a 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/AsyncDataServiceImpl.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/AsyncDataServiceImpl.java @@ -1,6 +1,13 @@ package com.logpm.factory.comfac.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; @@ -36,6 +43,11 @@ import com.logpm.factory.zb.mapper.ZbCategoryContrastMapper; import com.logpm.factory.zb.service.IOrderPackageService; import com.logpm.factory.zb.service.IPackageInfoService; import com.logpm.factory.zb.service.IReceiptService; +import com.logpm.factorydata.base.feign.IFactoryDataBaseClient; +import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.vo.SendMsg; import com.logpm.oldproject.entity.AdvanceDetailEntity; import com.logpm.oldproject.entity.AdvanceEntity; import com.logpm.oldproject.entity.DetailProductEntity; @@ -44,20 +56,27 @@ import com.logpm.oldproject.feign.IAdvanceClient; import com.logpm.oldproject.feign.IAdvanceDetailClient; import com.logpm.oldproject.feign.IDetailProductClient; import com.logpm.oldproject.feign.IServiceNumClient; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import com.logpm.trunkline.entity.TrunklineDetailProductEntity; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; import org.jetbrains.annotations.Nullable; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.common.constant.HttpConstants; import org.springblade.common.constant.PatternConstant; import org.springblade.common.constant.TenantNum; +import org.springblade.common.constant.factorydata.FactoryDataConstants; import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.ObjectUtil; import org.springblade.core.tool.utils.StringUtil; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; +import java.math.BigDecimal; import java.sql.Timestamp; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Calendar; import java.util.List; @@ -109,6 +128,9 @@ public class AsyncDataServiceImpl implements IAsyncDataService { private final OuPaiProperties ouPaiProperties; + private final IFactoryDataBaseClient factoryDataBaseClient; + private final IFactoryDataClient factoryDataClient; + /** * 目前推送的基地 */ @@ -117,7 +139,7 @@ public class AsyncDataServiceImpl implements IAsyncDataService { * 处理皮阿诺数据推送到汇通老库 */ @Override - @Async + @LogpmAsync("asyncExecutor") public void handlerPanDataToHt(Long id) { log.info("################handlerDataToHt: 处理皮阿诺订单数据到"); //查询需要同步的订单 @@ -311,6 +333,178 @@ public class AsyncDataServiceImpl implements IAsyncDataService { log.info("##############handlerDataToHt: 处理数据完成"); } + @Override + @LogpmAsync("asyncExecutor") + public void handlerPanDataToHtNew(Long id) { + log.info("################handlerPanDataToHtNew: 处理皮阿诺订单数据到"); + //查询需要同步的订单 + QueryWrapper orderQueryWrapper = new QueryWrapper<>(); + orderQueryWrapper.eq("status", 1) + .eq("id", id) + .eq("is_deleted", 0); + List panFactoryOrders = panFactoryOrderService.list(orderQueryWrapper); + log.info("#########handlerPanDataToHtNew: 待处理的订单数量为{}", panFactoryOrders.size()); + List advances = new ArrayList<>(); + for (PanFactoryOrder panFactoryOrder : panFactoryOrders) { + Long orderId = panFactoryOrder.getId(); + log.info("#########handlerPanDataToHtNew: 当前处理的订单id={}", orderId); + // 走新系统入库 + Long startWarehouseId = null; + String startWarehouseName = null; + String tenantId = null; + R r = factoryDataBaseClient.getWarehouseByBrandAndSiteName(BrandEnums.PAN.getValue(), PanFactoryEnum.getMes(panFactoryOrder.getPlantId())); + if (cn.hutool.core.util.ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, r.getCode())) { + FactoryWarehouseBindVO data = r.getData(); + if (cn.hutool.core.util.ObjectUtil.isNotNull(data)) { + startWarehouseId = data.getWarehouseId(); + startWarehouseName = data.getWarehouseName(); + tenantId = data.getTenantId(); + } + } + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + if (ObjectUtil.isNotEmpty(panFactoryOrder.getTotalQuantity())) { + advanceEntity.setHasPackage(panFactoryOrder.getTotalQuantity() > 0 ? 1 : 0); + } + advanceEntity.setOrderType(""); + advanceEntity.setBrand(BrandEnums.PAN.getValue()); + advanceEntity.setSiteName(PanFactoryEnum.getMes(panFactoryOrder.getPlantId())); + advanceEntity.setArea(StringUtil.isBlank(panFactoryOrder.getReceiverArea()) ? "" : panFactoryOrder.getReceiverArea()); + advanceEntity.setTotalNum(panFactoryOrder.getTotalQuantity()); + advanceEntity.setPackName(""); + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(startWarehouseId); + advanceEntity.setWarehouseName(startWarehouseName); + + advanceEntity.setIsGcp(0); + advanceEntity.setCarrierName("汇通"); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setSenderName(""); + advanceEntity.setSenderPhone(""); + advanceEntity.setSenderAddress(""); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setTrainNumber(StringUtil.isBlank(panFactoryOrder.getLoadingList()) ? "" : panFactoryOrder.getLoadingList()); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setOrderCode(StringUtil.isBlank(panFactoryOrder.getOrderNo()) ? "" : panFactoryOrder.getOrderNo()); + advanceEntity.setServiceNum(StringUtil.isBlank(panFactoryOrder.getServiceNum()) ? "" : panFactoryOrder.getServiceNum()); + advanceEntity.setSenderFactory(""); + advanceEntity.setDealerCode(StringUtil.isBlank(panFactoryOrder.getUserId()) ? "" : panFactoryOrder.getUserId()); + advanceEntity.setDealerName(""); + advanceEntity.setStoreCode(StringUtil.isBlank(panFactoryOrder.getUserId()) ? "" : panFactoryOrder.getUserId()); + advanceEntity.setStoreName(""); + advanceEntity.setCustomerName(StringUtil.isBlank(panFactoryOrder.getCustomerName()) ? "" : panFactoryOrder.getCustomerName()); + advanceEntity.setCustomerPhone(StringUtil.isBlank(panFactoryOrder.getCustomerNumber()) ? "" : panFactoryOrder.getCustomerNumber()); + advanceEntity.setCustomerAddress(StringUtil.isBlank(panFactoryOrder.getCustomerAddress()) ? "" : panFactoryOrder.getCustomerAddress()); + advanceEntity.setSenderName(StringUtil.isBlank(panFactoryOrder.getSendFactory()) ? "" : panFactoryOrder.getSendFactory()); + advanceEntity.setSenderPhone(StringUtil.isBlank(panFactoryOrder.getSenderMobile()) ? "" : panFactoryOrder.getSenderMobile()); + advanceEntity.setSenderAddress(StringUtil.isBlank(panFactoryOrder.getSenderAddress()) ? "" : panFactoryOrder.getSenderAddress()); + // 根据遗留单标识赋值 + advanceEntity.setLegacyStatus("0"); + if (StrUtil.isNotEmpty(panFactoryOrder.getOrderNo()) && StrUtil.contains(panFactoryOrder.getOrderNo(), "遗")) { + advanceEntity.setLegacyStatus("1"); + } + + panFactoryOrder.setStatus(0); + panFactoryOrderService.saveOrUpdate(panFactoryOrder); + + //通过订单id查询对应的包件 + QueryWrapper packageQueryWrapper = new QueryWrapper<>(); + packageQueryWrapper.eq("order_id", orderId) + .eq("status", 1) + .eq("is_deleted", 0); + List packages = panPackageInfoService.list(packageQueryWrapper); + + List packageList = new ArrayList<>(); + for (PanPackageInfo panPackageInfo : packages) { + Long packageId = panPackageInfo.getId(); + // 走新系统 + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(startWarehouseId); + advanceDetailEntity.setWarehouseName(startWarehouseName); + advanceDetailEntity.setOrderCode(StringUtil.isBlank(panFactoryOrder.getOrderNo()) ? "" : panFactoryOrder.getOrderNo()); + advanceDetailEntity.setBrand(BrandEnums.PAN.getValue()); + advanceDetailEntity.setSystemType("线上"); + // 一级品类名称 + advanceDetailEntity.setFirstPackName(StringUtil.isBlank(panPackageInfo.getFirstPackName()) ? "" : panPackageInfo.getFirstPackName()); + advanceDetailEntity.setFirstPackCode(StringUtil.isBlank(panPackageInfo.getFirstPackCode()) ? "" : panPackageInfo.getFirstPackCode()); + // 获取映射品类信息 + // 二级品类名称 + advanceDetailEntity.setSecondPackName(StringUtil.isBlank(panPackageInfo.getSecondPackName()) ? "" : panPackageInfo.getSecondPackName()); + advanceDetailEntity.setSecondPackCode(StringUtil.isBlank(panPackageInfo.getSecondPackCode()) ? "" : panPackageInfo.getSecondPackCode()); + // 三级品类名称 + advanceDetailEntity.setThirdPackName(StringUtil.isBlank(panPackageInfo.getThirdPackName()) ? "" : panPackageInfo.getThirdPackName()); + advanceDetailEntity.setThirdPackCode(StringUtil.isBlank(panPackageInfo.getThirdPackCode()) ? "" : panPackageInfo.getThirdPackCode()); + advanceDetailEntity.setMaterialName(StringUtil.isBlank(panPackageInfo.getFirstPackName()) ? "" : panPackageInfo.getFirstPackName()); + advanceDetailEntity.setSiteName(PanFactoryEnum.getMes(panPackageInfo.getPlantId())); + advanceDetailEntity.setSiteCode(""); + advanceDetailEntity.setQuantity(Objects.isNull(panPackageInfo.getProductNum()) ? 1 : panPackageInfo.getProductNum()); + advanceDetailEntity.setOrderPackageCode(StringUtil.isBlank(panPackageInfo.getUnitNo()) ? "" : panPackageInfo.getUnitNo()); + advanceDetailEntity.setTrainNumber(StringUtil.isBlank(panFactoryOrder.getLoadingList()) ? "" : panFactoryOrder.getLoadingList()); + advanceDetailEntity.setServiceNum(StringUtil.isBlank(panFactoryOrder.getServiceNum()) ? "" : panFactoryOrder.getServiceNum()); + advanceDetailEntity.setWaybillNo(""); + advanceDetailEntity.setPackageStatus("0"); + advanceDetailEntity.setWeight(BigDecimal.ZERO); + advanceDetailEntity.setVolume(BigDecimal.ZERO); + advanceDetailEntity.setSupple(""); + advanceDetailEntity.setManifest(""); + advanceDetailEntity.setReturnNum(""); + advanceDetailEntity.setSendDateStr(DateUtil.formatLocalDateTime(LocalDateTime.now())); + advanceDetailEntity.setCarNumber(""); + advanceDetailEntity.setGoodsMan(""); + advanceDetailEntity.setTenantId(tenantId); + advanceDetailEntity.setStatus(0); + advanceDetailEntity.setIsDeleted(0); + //修改数据状态 + panPackageInfo.setStatus(0); + panPackageInfoService.saveOrUpdate(panPackageInfo); + + //查询包件明细 + List saveList = new ArrayList<>(); + QueryWrapper listQueryWrapper = new QueryWrapper<>(); + listQueryWrapper.eq("package_id", packageId) + .eq("is_deleted", 0); + List lists = panPackageListService.list(listQueryWrapper); + List itemJsons = new ArrayList<>(); + for (PanPackageList panPackageList : lists) { + // 走新系统 + TrunklineDetailProductEntity detailProductEntity = new TrunklineDetailProductEntity(); + detailProductEntity.setTenantId(tenantId); + detailProductEntity.setWarehouseId(startWarehouseId); + detailProductEntity.setWarehouseName(startWarehouseName); + detailProductEntity.setUnitNo(panPackageInfo.getUnitNo()); + detailProductEntity.setProductCode(StringUtil.isBlank(panPackageList.getProsBarcode()) ? "" : panPackageList.getProsBarcode()); + detailProductEntity.setProductName(StringUtil.isBlank(panPackageList.getBoardName()) ? "" : panPackageList.getBoardName()); + detailProductEntity.setQuantity(Objects.isNull(panPackageList.getQuantity()) ? 0 : panPackageList.getQuantity()); + detailProductEntity.setStatus(0); + detailProductEntity.setIsDeleted(0); + itemJsons.add(JSONUtil.parseObj(detailProductEntity)); + } + JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + entries.set("items", itemJsons); + packageList.add(entries); + UpdateWrapper listUpdateWrapper = new UpdateWrapper<>(); + listUpdateWrapper.set("status", 2).eq("package_id", packageId).eq("is_deleted", 0); + panPackageListService.update(listUpdateWrapper); + } + JSONObject entries = JSONUtil.parseObj(advanceEntity); + entries.set("details", JSONUtil.toJsonStr(packageList)); + advances.add(entries); + } + // 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg. + if (CollUtil.isNotEmpty(advances)) { + for (JSONObject advance : advances) { + SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); + factoryDataClient.sendMessage(sendMsg); + } + } + log.info("##############handlerPanDataToHtNew: 处理数据完成"); + } + private Timestamp initTimestamp() { Calendar calendar = Calendar.getInstance(); @@ -324,7 +518,7 @@ public class AsyncDataServiceImpl implements IAsyncDataService { @Override - @Async + @LogpmAsync("asyncExecutor") public void handlerMtDataToHt(Long mainId) { log.info("################handlerMtDataToHt: 处理梦天订单数据到"); //查询需要同步的订单 @@ -351,8 +545,8 @@ public class AsyncDataServiceImpl implements IAsyncDataService { //添加订单信息 advanceId = addAdvanceEntity(mtFactoryOrderMain, mtFactoryOrder); if (advanceId == null) { - continue; - } + continue; + } //通过订单id查询对应的包件 QueryWrapper packageQueryWrapper = new QueryWrapper<>(); @@ -402,12 +596,166 @@ public class AsyncDataServiceImpl implements IAsyncDataService { log.info("##############handlerMtDataToHt: 处理数据完成"); } + @Override + @LogpmAsync("asyncExecutor") + public void handlerMtDataToHtNew(Long mainId) { + log.info("################handlerMtDataToHtNew: 处理梦天订单数据到"); + //查询需要同步的订单 + QueryWrapper orderQueryWrapper = new QueryWrapper<>(); + orderQueryWrapper.eq("status", 1) + .eq("main_id", mainId) + .eq("is_deleted", 0); + + List serviceNumEntityList = new ArrayList<>(); + MtFactoryOrderMain mtFactoryOrderMain = mtFactoryOrderMainService.getById(mainId); + + if (StringUtil.isBlank(mtFactoryOrderMain.getCenterWarehouseName()) || !(mtFactoryOrderMain.getCenterWarehouseName().contains("汇通"))) { + log.info("################handlerMtDataToHtNew: 这个派车单不推送到老系统 派车单号 {}", mtFactoryOrderMain.getInvoiceOrderCode()); + return; + } + + + List mtFactoryOrders = mtFactoryOrderService.list(orderQueryWrapper); + log.info("#########handlerMtDataToHtNew: 待处理的订单数量为{}", mtFactoryOrders.size()); + Long startWarehouseId = null; + String startWarehouseName = null; + String tenantId = null; + R r = factoryDataBaseClient.getWarehouseByBrandAndSiteName(BrandEnums.MTMM.getValue(), mtFactoryOrderMain.getSiteName()); + if (cn.hutool.core.util.ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, r.getCode())) { + FactoryWarehouseBindVO data = r.getData(); + if (cn.hutool.core.util.ObjectUtil.isNotNull(data)) { + startWarehouseId = data.getWarehouseId(); + startWarehouseName = data.getWarehouseName(); + tenantId = data.getTenantId(); + } + } + List advances = new ArrayList<>(); + for (MtFactoryOrder mtFactoryOrder : mtFactoryOrders) { + Long orderId = mtFactoryOrder.getId(); + log.info("#########handlerMtDataToHtNew: 当前处理的订单id={}", orderId); + // 走新系统 + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + if (ObjectUtil.isNotEmpty(mtFactoryOrder.getQuantity())) { + advanceEntity.setHasPackage(Integer.parseInt(mtFactoryOrder.getQuantity()) > 0 ? 1 : 0); + } + advanceEntity.setOrderType(""); + advanceEntity.setBrand(BrandEnums.MTMM.getValue()); + advanceEntity.setSiteName(mtFactoryOrderMain.getSiteName()); + advanceEntity.setArea(""); + advanceEntity.setTotalNum(Integer.parseInt(mtFactoryOrder.getQuantity())); + advanceEntity.setPackName(""); + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(startWarehouseId); + advanceEntity.setWarehouseName(startWarehouseName); + if ("中心仓".equals(mtFactoryOrderMain.getWarehouseType())) { + advanceEntity.setIsGcp(1); //是否干仓配 + } else { //转运仓或者其它情况 + advanceEntity.setIsGcp(0); //是否干仓配 + } + advanceEntity.setCarrierName("汇通"); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setTrainNumber(mtFactoryOrderMain.getInvoiceOrderCode()); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setOrderCode(StringUtil.isBlank(mtFactoryOrder.getOrderCode()) ? "" : mtFactoryOrder.getOrderCode()); + advanceEntity.setServiceNum(StringUtil.isBlank(mtFactoryOrder.getMainOrderCode()) ? "" : mtFactoryOrder.getMainOrderCode()); + advanceEntity.setSenderFactory(""); + advanceEntity.setDealerCode(StringUtil.isBlank(mtFactoryOrder.getDealerCode()) ? "" : mtFactoryOrder.getDealerCode()); + advanceEntity.setDealerName(mtFactoryOrder.getDealerName()); + advanceEntity.setStoreCode(StringUtil.isBlank(mtFactoryOrder.getDealerCode()) ? "" : mtFactoryOrder.getDealerCode()); + advanceEntity.setStoreName(mtFactoryOrder.getDealerName()); + advanceEntity.setCustomerName(StringUtil.isBlank(mtFactoryOrder.getCustomName()) ? "" : mtFactoryOrder.getCustomName()); + advanceEntity.setCustomerPhone(StringUtil.isBlank(mtFactoryOrder.getCustomPhone()) ? "" : mtFactoryOrder.getCustomPhone()); + advanceEntity.setCustomerAddress(StringUtil.isBlank(mtFactoryOrder.getCustomAddress()) ? "" : mtFactoryOrder.getCustomAddress()); + advanceEntity.setConsigneePerson(StringUtil.isBlank(mtFactoryOrder.getConsignee()) ? "" : mtFactoryOrder.getConsignee()); + advanceEntity.setConsigneeMobile(StringUtil.isBlank(mtFactoryOrder.getConsigneePhone()) ? "" : mtFactoryOrder.getConsigneePhone()); + advanceEntity.setConsigneeAddress(StringUtil.isBlank(mtFactoryOrder.getConsigneeAddress()) ? "" : mtFactoryOrder.getConsigneeAddress()); + advanceEntity.setSenderName(""); + advanceEntity.setSenderPhone(""); + advanceEntity.setSenderAddress(""); + // 根据遗留单标识赋值 + advanceEntity.setLegacyStatus("0"); + if (StrUtil.isNotEmpty(mtFactoryOrder.getOrderCode()) && StrUtil.contains(mtFactoryOrder.getOrderCode(), "遗")) { + advanceEntity.setLegacyStatus("1"); + } + + //更改订单状态 + mtFactoryOrder.setStatus(0); + mtFactoryOrderService.saveOrUpdate(mtFactoryOrder); + + //通过订单id查询对应的包件 + QueryWrapper packageQueryWrapper = new QueryWrapper<>(); + packageQueryWrapper.eq("order_id", orderId) + .eq("status", 1) + .eq("is_deleted", 0); + List packages = mtPackageInfoService.list(packageQueryWrapper); + List packageList = new ArrayList<>(); + for (MtPackageInfo mtPackageInfo : packages) { + //添加订单明细 + // 走新系统 + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(startWarehouseId); + advanceDetailEntity.setWarehouseName(startWarehouseName); + advanceEntity.setLegacyStatus("0"); + advanceDetailEntity.setOrderCode(StringUtil.isBlank(mtFactoryOrder.getOrderCode()) ? "" : mtFactoryOrder.getOrderCode()); + advanceDetailEntity.setBrand(BrandEnums.MTMM.getValue()); + advanceDetailEntity.setSystemType("线上"); + advanceDetailEntity.setFirstPackName(mtPackageInfo.getBigType()); + advanceDetailEntity.setFirstPackCode(""); + advanceDetailEntity.setSecondPackName(mtPackageInfo.getColor());//二级品类名称 + advanceDetailEntity.setSecondPackCode("");//二级品类 + advanceDetailEntity.setThirdPackName(mtPackageInfo.getBigType());//三级品类名称 + advanceDetailEntity.setThirdPackCode("");//三级品类 + advanceDetailEntity.setMaterialName(mtPackageInfo.getBigType()); + advanceDetailEntity.setSiteName(""); + advanceDetailEntity.setSiteCode(""); + String planQty = "1"; + advanceDetailEntity.setQuantity((StrUtil.isNotBlank(planQty) && NumberUtil.isNumber(planQty)) ? Convert.toInt(planQty) : 0); + advanceDetailEntity.setOrderPackageCode(StringUtil.isBlank(mtPackageInfo.getPackageCode()) ? "" : mtPackageInfo.getPackageCode()); + advanceDetailEntity.setTrainNumber(mtFactoryOrderMain.getInvoiceOrderCode()); + advanceDetailEntity.setServiceNum(StringUtil.isBlank(mtFactoryOrder.getMainOrderCode()) ? "" : mtFactoryOrder.getMainOrderCode()); + advanceDetailEntity.setWaybillNo(""); + advanceDetailEntity.setPackageStatus("0"); + advanceDetailEntity.setSupple(""); + advanceDetailEntity.setManifest(""); + advanceDetailEntity.setReturnNum(""); + advanceDetailEntity.setSendDateStr(DateUtil.formatLocalDateTime(LocalDateTime.now())); + advanceDetailEntity.setCarNumber(mtFactoryOrderMain.getSendCarNumber()); + advanceDetailEntity.setGoodsMan(""); + advanceDetailEntity.setTenantId(tenantId); + advanceDetailEntity.setStatus(0); + advanceDetailEntity.setIsDeleted(0); + //修改数据状态 + mtPackageInfo.setStatus(0); + mtPackageInfoService.saveOrUpdate(mtPackageInfo); + JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + packageList.add(entries); + } + JSONObject entries = JSONUtil.parseObj(advanceEntity); + entries.set("details", JSONUtil.toJsonStr(packageList)); + advances.add(entries); + } + if (CollUtil.isNotEmpty(advances)) { + for (JSONObject advance : advances) { + SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); + factoryDataClient.sendMessage(sendMsg); + } + } + log.info("##############handlerMtDataToHtNew: 处理数据完成"); + } + @Override public void handlerOuPaiDataToHt(String code) { // 查询需要处理的派车单 查询没有转发的shuju List list = receivingOrderService.lambdaQuery().eq(ReceivingOrderEntity::getCode, code).eq(ReceivingOrderEntity::getTurnStatus, 0).list(); - log.info(">>>>>>>>>>>>>>>>>>>>>handlerOuPaiDataToHt 派车单集合长度 {}",list.size()); + log.info(">>>>>>>>>>>>>>>>>>>>>handlerOuPaiDataToHt 派车单集合长度 {}", list.size()); for (ReceivingOrderEntity receivingOrderEntity : list) { @@ -417,17 +765,162 @@ public class AsyncDataServiceImpl implements IAsyncDataService { } // 查询这个派车单下面的订单 List factoryOrderEntities = factoryOrderService.lambdaQuery().eq(FactoryOrderEntity::getReceivingId, receivingOrderEntity.getId()).eq(FactoryOrderEntity::getTurnStatus, 0).list(); - log.info(">>>>>>>>>>>>>>>>>>>>>handlerOuPaiDataToHt 派车单 {} 派车单下面订单集合长度 {}",receivingOrderEntity.getCode(),factoryOrderEntities.size()); + log.info(">>>>>>>>>>>>>>>>>>>>>handlerOuPaiDataToHt 派车单 {} 派车单下面订单集合长度 {}", receivingOrderEntity.getCode(), factoryOrderEntities.size()); - addAdvanceEntityBtOuPai(receivingOrderEntity, factoryOrderEntities); +// addAdvanceEntityBtOuPai(receivingOrderEntity, factoryOrderEntities); + // 走新系统暂存单 + addAdvanceEntityBtOuPaiNew(receivingOrderEntity, factoryOrderEntities); receivingOrderEntity.setTurnStatus(1); - log.info(">>>>>>>>>>>>>>>>>>>>>handlerOuPaiDataToHt 更新收货单状态 收货单号 {}",receivingOrderEntity.getCode()); + log.info(">>>>>>>>>>>>>>>>>>>>>handlerOuPaiDataToHt 更新收货单状态 收货单号 {}", receivingOrderEntity.getCode()); receivingOrderService.updateById(receivingOrderEntity); } } + private void addAdvanceEntityBtOuPaiNew(ReceivingOrderEntity receivingOrderEntity, List factoryOrderEntities) { + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>> addAdvanceEntityBtOuPai 派车单数据推送到新系统,更新物料信息 单号{}", receivingOrderEntity.getCode()); + String carNumber = receivingOrderEntity.getCarNumber(); + // 欧派只更新物料信息 不管暂存单信息 + String fromWarehouseName = receivingOrderEntity.getFromWarehouseName(); + // 只处理 已配置的基地的数据 其他基地无法确认,暂时不处理 + Long startWarehouseId = null; + String startWarehouseName = null; + String tenantId = null; + // 获取工厂基地绑定的始发仓信息 + R warehouseByBrandAndSiteName = factoryDataBaseClient.getWarehouseByBrandAndSiteName(BrandEnums.OP.getValue(), fromWarehouseName); + if (cn.hutool.core.util.ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) { + FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData(); + if (cn.hutool.core.util.ObjectUtil.isNotNull(data)) { + startWarehouseId = data.getWarehouseId(); + startWarehouseName = data.getWarehouseName(); + tenantId = data.getTenantId(); + } + } + if (cn.hutool.core.util.ObjectUtil.isAllNotEmpty(startWarehouseId, startWarehouseName, tenantId)) { + // 订单 + List advances = new ArrayList<>(); + for (FactoryOrderEntity factoryOrderEntity : factoryOrderEntities) { + factoryOrderEntity.setTurnStatus(1); + + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + advanceEntity.setOrderType(factoryOrderEntity.getOrderType()); + advanceEntity.setBrand(BrandEnums.OP.getValue()); + advanceEntity.setSiteName(fromWarehouseName); + advanceEntity.setArea(""); + advanceEntity.setPackName(""); + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(startWarehouseId); + advanceEntity.setWarehouseName(startWarehouseName); + advanceEntity.setIsGcp(0); + advanceEntity.setCarrierName("汇通物流"); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setTrainNumber(receivingOrderEntity.getCarNumber()); + advanceEntity.setFreezeStatus("0"); + + advanceEntity.setSenderFactory(""); + advanceEntity.setOrderCode(factoryOrderEntity.getSelfCode()); + advanceEntity.setDealerCode(factoryOrderEntity.getShopCode()); + advanceEntity.setDealerName(factoryOrderEntity.getShopName()); + advanceEntity.setStoreCode(factoryOrderEntity.getShopCode()); + advanceEntity.setStoreName(factoryOrderEntity.getShopName()); + advanceEntity.setServiceNum(factoryOrderEntity.getServiceNumber()); + advanceEntity.setCustomerName(factoryOrderEntity.getCustomer()); + advanceEntity.setCustomerPhone(factoryOrderEntity.getCustomerPhone()); + advanceEntity.setCustomerAddress(factoryOrderEntity.getCustomerAddress()); + advanceEntity.setConsigneePerson(factoryOrderEntity.getShopReceiver()); + // 处理订单下面的包件数据 + List list = factoryPackageService.lambdaQuery() + .eq(FactoryPackageEntity::getOrderId, factoryOrderEntity.getId()).eq(FactoryPackageEntity::getTurnStatus, 0).list(); + advanceEntity.setHasPackage(CollUtil.isNotEmpty(list) ? 1 : 0); + advanceEntity.setTotalNum(CollUtil.isNotEmpty(list) ? list.size() : 0); + List packageList = new ArrayList<>(); + for (FactoryPackageEntity factoryPackageEntity : list) { + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(startWarehouseId); + advanceDetailEntity.setWarehouseName(startWarehouseName); + advanceDetailEntity.setOrderCode(factoryOrderEntity.getSelfCode()); + advanceDetailEntity.setBrand(BrandEnums.OP.getValue()); + advanceDetailEntity.setSystemType("线上"); + advanceDetailEntity.setFirstPackName(factoryPackageEntity.getFirstClassName()); + advanceDetailEntity.setFirstPackCode(factoryPackageEntity.getFirstClassCode()); + advanceDetailEntity.setSecondPackName(factoryPackageEntity.getSecondClassName());//二级品类名称 + advanceDetailEntity.setSecondPackCode(factoryPackageEntity.getSecondClassCode());//二级品类 + advanceDetailEntity.setThirdPackName(factoryPackageEntity.getThirdClassName());//三级品类名称 + advanceDetailEntity.setThirdPackCode(factoryPackageEntity.getThirdClassCode());//三级品类 + advanceDetailEntity.setMaterialName(factoryPackageEntity.getPackageDetailNames()); + advanceDetailEntity.setSiteName(fromWarehouseName); + advanceDetailEntity.setSiteCode(""); + advanceDetailEntity.setQuantity(1); + advanceDetailEntity.setOrderPackageCode(factoryPackageEntity.getCode()); + advanceDetailEntity.setTrainNumber(receivingOrderEntity.getCarNumber()); + advanceDetailEntity.setServiceNum(factoryOrderEntity.getServiceNumber()); + advanceDetailEntity.setWaybillNo(""); + advanceDetailEntity.setPackageStatus("0"); + advanceDetailEntity.setWeight(factoryPackageEntity.getWeight()); + if (cn.hutool.core.util.ObjectUtil.isAllNotEmpty(factoryPackageEntity.getHeight(), factoryPackageEntity.getWidth(), factoryPackageEntity.getLength())) { + advanceDetailEntity.setVolume(factoryPackageEntity.getHeight().multiply(factoryPackageEntity.getWidth()).multiply(factoryPackageEntity.getLength())); + } + advanceDetailEntity.setSupple(""); + advanceDetailEntity.setManifest(""); + advanceDetailEntity.setReturnNum(""); + advanceDetailEntity.setSendDateStr(DateUtil.formatLocalDateTime(LocalDateTime.now())); + advanceDetailEntity.setCarNumber(""); + advanceDetailEntity.setGoodsMan(""); + advanceDetailEntity.setTenantId(tenantId); + advanceDetailEntity.setStatus(0); + advanceDetailEntity.setIsDeleted(0); + // 物料 + List factoryPackageDetailEntities = factoryPackageDetailService.lambdaQuery() + .eq(FactoryPackageDetailEntity::getPackageId, factoryPackageEntity.getId()).list(); + List itemJsons = new ArrayList<>(); + if (CollUtil.isNotEmpty(factoryPackageDetailEntities)) { + for (FactoryPackageDetailEntity factoryPackageDetailEntity : factoryPackageDetailEntities) { + if(cn.hutool.core.util.ObjectUtil.equal(factoryPackageEntity.getPackageDetailNames(),factoryPackageDetailEntity.getName())){ + advanceDetailEntity.setMaterialCode(factoryPackageDetailEntity.getCode()); + } + TrunklineDetailProductEntity detailProductEntity = new TrunklineDetailProductEntity(); + detailProductEntity.setTenantId(tenantId); + detailProductEntity.setWarehouseId(startWarehouseId); + detailProductEntity.setWarehouseName(startWarehouseName); + detailProductEntity.setUnitNo(factoryPackageEntity.getCode()); + detailProductEntity.setProductCode(factoryPackageDetailEntity.getCode()); + detailProductEntity.setProductName(factoryPackageDetailEntity.getName()); + detailProductEntity.setReserve1(factoryPackageDetailEntity.getType()); + detailProductEntity.setReserve2(factoryPackageDetailEntity.getUnit()); + detailProductEntity.setQuantity(1); + detailProductEntity.setStatus(0); + detailProductEntity.setIsDeleted(0); + itemJsons.add(JSONUtil.parseObj(detailProductEntity)); + } + } + JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + entries.set("items", itemJsons); + packageList.add(entries); + } + JSONObject entries = JSONUtil.parseObj(advanceEntity); + entries.set("details", JSONUtil.toJsonStr(packageList)); + advances.add(entries); + } + factoryOrderService.updateBatchById(factoryOrderEntities); + // 发送消息 + if (CollUtil.isNotEmpty(advances)) { + for (JSONObject advance : advances) { + SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER_OUPAI) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); + factoryDataClient.sendMessage(sendMsg); + } + } + } + + } + /** * 欧派数据保存到老系统 * @@ -435,7 +928,7 @@ public class AsyncDataServiceImpl implements IAsyncDataService { * @param factoryOrderEntities */ private void addAdvanceEntityBtOuPai(ReceivingOrderEntity receivingOrderEntity, List factoryOrderEntities) { - log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>> addAdvanceEntityBtOuPai 派车单数据推送到老系统 单号{}",receivingOrderEntity.getCode()); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>> addAdvanceEntityBtOuPai 派车单数据推送到老系统 单号{}", receivingOrderEntity.getCode()); String carNumber = receivingOrderEntity.getCarNumber(); if (Objects.isNull(ouPaiProperties.getJidiWarehouseMapper())) { @@ -445,12 +938,12 @@ public class AsyncDataServiceImpl implements IAsyncDataService { // 通过发货基地得到仓库ID String warehourseIdString = ouPaiProperties.getJidiWarehouseMapper().get(receivingOrderEntity.getFromWarehouseName()); Integer warehourseId = Integer.parseInt(warehourseIdString); - log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>> addAdvanceEntityBtOuPai 得到基地对应的仓库ID {}",warehourseId); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>> addAdvanceEntityBtOuPai 得到基地对应的仓库ID {}", warehourseId); for (FactoryOrderEntity factoryOrderEntity : factoryOrderEntities) { // 需要从老系统进行订单数据查询 List advanceEntitys = findAdvanceEntityUseCacheByOrderSelfNum(factoryOrderEntity.getSelfCode(), carNumber); - log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>> addAdvanceEntityBtOuPai 得到基地advanceEntity {}",advanceEntitys); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>> addAdvanceEntityBtOuPai 得到基地advanceEntity {}", advanceEntitys); if (ObjectUtils.isNull(advanceEntitys)) { @@ -568,18 +1061,17 @@ public class AsyncDataServiceImpl implements IAsyncDataService { } // 更新车次 - if(!advanceDetailEntity.getMctsTruck().equals(advanceEntity.getMctsTruck())){ + if (!advanceDetailEntity.getMctsTruck().equals(advanceEntity.getMctsTruck())) { advanceDetailEntity.setMctsTruck(advanceEntity.getMctsTruck()); update = true; } // 更新订单ID - if(!advanceDetailEntity.getAdvanceId().equals(advanceEntity.getId())){ + if (!advanceDetailEntity.getAdvanceId().equals(advanceEntity.getId())) { advanceDetailEntity.setAdvanceId(advanceEntity.getId()); update = true; } - //更新包件 if (update) { advanceDetailClient.updateAdvanceDetail(advanceDetailEntity); @@ -972,7 +1464,7 @@ public class AsyncDataServiceImpl implements IAsyncDataService { List advanceEntitys = bladeRedis.get(key); if (ObjectUtils.isNull(advanceEntitys)) { advanceEntitys = iAdvanceClient.getEntityByMctsTruck(orderSelfNum, departCode); - bladeRedis.setEx(key, advanceEntitys, 60 * 60L); + bladeRedis.setEx(key, advanceEntitys, 60 * 60L); } return advanceEntitys; } @@ -1154,7 +1646,7 @@ public class AsyncDataServiceImpl implements IAsyncDataService { private Integer addAdvanceEntity(MtFactoryOrderMain mtFactoryOrderMain, MtFactoryOrder mtFactoryOrder) { AdvanceEntity advanceEntity = new AdvanceEntity(); advanceEntity.setOrderSelfNum(StringUtil.isBlank(mtFactoryOrder.getOrderCode()) ? "" : mtFactoryOrder.getOrderCode()); //订单自编号 - advanceEntity.setSiteName(""); // 基地 TODO 需要映射 + advanceEntity.setSiteName(mtFactoryOrderMain.getSiteName()); // 基地 advanceEntity.setArea(""); // 区域 advanceEntity.setOrderTypeName(""); //订单类型名称 可以为空 advanceEntity.setOrderClassName("工厂"); //订单类型 可以为空 @@ -1165,7 +1657,6 @@ public class AsyncDataServiceImpl implements IAsyncDataService { advanceEntity.setMctsTruckNo(mtFactoryOrderMain.getSendCarNumber());// 车牌//字段没有了 advanceEntity.setFirstPackName(""); //一级品类 advanceEntity.setFirstPackCode(""); //一级品类 - advanceEntity.setDealerName(mtFactoryOrder.getDealerName()); //商场名称 advanceEntity.setDealerCode(StringUtil.isBlank(mtFactoryOrder.getDealerCode()) ? "" : mtFactoryOrder.getDealerCode()); //商场编码 @@ -1207,7 +1698,14 @@ public class AsyncDataServiceImpl implements IAsyncDataService { advanceEntity.setDeleteTime(0); // 删除时间 advanceEntity.setWaybillNo("");//运单号 可以为空 // Integer id = PanFactoryEnum.getId(panFactoryOrder.getPlantId()); - advanceEntity.setWarehouseId(141); //导入人仓库id TODO 需要提供映射 + // 推老系统中对应的仓库id 梦天重庆仓 151 梦天潜江仓 141 + if (Objects.equals("HYXINQI", mtFactoryOrderMain.getSiteCode())) { + // 重庆 + advanceEntity.setWarehouseId(151); //导入人仓库id + } else { + // 潜江 + advanceEntity.setWarehouseId(141); //导入人仓库id + } advanceEntity.setWaybillStatus(Integer.parseInt("1"));//开单状态:1=未开单,2=已开单 advanceEntity.setOldId(0);// advanceEntity.setFreeze(Integer.parseInt("1"));//冻结状态:1=正常,2=冻结 diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/FactoryCommonServiceImpl.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/FactoryCommonServiceImpl.java index bb98e847e..bbf7d1256 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/FactoryCommonServiceImpl.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/FactoryCommonServiceImpl.java @@ -129,6 +129,7 @@ public class FactoryCommonServiceImpl implements IFactoryCommonService { @Override public void extracted(String status, String unitNo, String currentWarehouseId, String operationTime, Integer trayId) { log.info("#############extracted: 当前处理的数据为 status={} unitNo={} currentWarehouseId={} operationTime={} trayId={}",status,unitNo,currentWarehouseId,operationTime,trayId); + String redisKey = "extracted:"+unitNo; if ("4".equals(status) || "2".equals(status) || "1".equals(status)) { //继续判断是否到达目的仓 @@ -152,8 +153,12 @@ public class FactoryCommonServiceImpl implements IFactoryCommonService { if (OldSystemDataPushConfig.getWarehourseIdList().contains(currentWarehouseId)) { try { if ("1".equals(status) || "4".equals(status)) { - // 始发仓和目的仓入库 - panFactoryDataService.handleDataToPlatform(unitNo, operationTime); + Boolean exists = bladeRedis.exists(redisKey); + if(Boolean.FALSE.equals(exists)){ + bladeRedis.setEx(redisKey, "1", 60L); + // 始发仓和目的仓入库 + panFactoryDataService.handleDataToPlatform(unitNo, operationTime,Integer.parseInt(currentWarehouseId)); + } } else { log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>> 错误的状态"); } @@ -162,6 +167,10 @@ public class FactoryCommonServiceImpl implements IFactoryCommonService { } catch (Exception e) { log.error(">>>> 数据推送异常", e); + Boolean exists = bladeRedis.exists(redisKey); + if(Boolean.TRUE.equals(exists)){ + bladeRedis.del(redisKey); + } orderPackageStatusPushFailLogService.saveOrderPackageStatusFaleLog(unitNo, currentWarehouseId, status, operationTime, trayId); log.error(">>>> 保存到错误数据推送记录 {}", unitNo); } @@ -169,6 +178,10 @@ public class FactoryCommonServiceImpl implements IFactoryCommonService { } } } else { + Boolean exists = bladeRedis.exists(redisKey); + if(Boolean.TRUE.equals(exists)){ + bladeRedis.del(redisKey); + } orderPackageStatusPushFailLogService.saveOrderPackageStatusFaleLog(unitNo, currentWarehouseId, status, operationTime, trayId); } } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/CustomMessageConverter.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/CustomMessageConverter.java new file mode 100644 index 000000000..d65ed363f --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/CustomMessageConverter.java @@ -0,0 +1,161 @@ +package com.logpm.factory.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength((long) bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/ExecutorConfig.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/ExecutorConfig.java new file mode 100644 index 000000000..cffd95d87 --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/ExecutorConfig.java @@ -0,0 +1,83 @@ +package com.logpm.factory.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + String tenantId = AuthUtil.getTenantId(); + Map all = ThreadLocalUtil.getAll(); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + all.keySet().forEach(key -> ThreadLocalUtil.put(key, all.get(key))); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + String tenantId1 = AuthUtil.getTenantId(); + log.info(">>>>>>>>>>>>>>>> decorate {}",tenantId1); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + all.clear(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/InterceptorAdapterConfig.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/InterceptorAdapterConfig.java index c775cf98a..a0e1e063d 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/InterceptorAdapterConfig.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/InterceptorAdapterConfig.java @@ -2,31 +2,45 @@ package com.logpm.factory.config; import com.logpm.factory.comfac.service.IFactoryTokenService; import com.logpm.factory.interceptor.FactoryAccountsInterceptor; +import com.logpm.factory.interceptor.LocalServerLoginAccountsInterceptor; import com.logpm.factory.interceptor.ZbFactoryAccountsInterceptor; import com.logpm.factory.props.ZbFactoryProperties; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.AllArgsConstructor; +import org.springblade.common.component.MockLoginService; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.RedisLockClient; import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistration; +import org.springframework.core.env.Environment; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration +@AllArgsConstructor public class InterceptorAdapterConfig implements WebMvcConfigurer { - @Autowired - IFactoryTokenService factoryTokenService; - @Autowired - ZbFactoryProperties zbFactoryProperties; + private final IFactoryTokenService factoryTokenService; + + private final BladeRedis redis; + + private final ZbFactoryProperties zbFactoryProperties; + + private final Environment environment; + + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + @Override public void addInterceptors(InterceptorRegistry interceptorRegistry) { - InterceptorRegistration registry = interceptorRegistry.addInterceptor(new FactoryAccountsInterceptor(factoryTokenService)); - registry.addPathPatterns("/factory/**"). + interceptorRegistry.addInterceptor(new FactoryAccountsInterceptor(factoryTokenService)) + .addPathPatterns("/factory/**"). excludePathPatterns("/factory/auth/token"). excludePathPatterns("/factory/oupai/**"). excludePathPatterns("/factory/zb/**") - .excludePathPatterns("/factory/common/**"); -// InterceptorRegistration registryZbFactory = interceptorRegistry.addInterceptor(new ZbFactoryAccountsInterceptor(zbFactoryProperties)); -// registryZbFactory.addPathPatterns("/factory/zb/**"); + .excludePathPatterns("/factory/common/**").order(2); + interceptorRegistry.addInterceptor(new ZbFactoryAccountsInterceptor(zbFactoryProperties)) + .addPathPatterns("/factory/zb/**").order(3); + interceptorRegistry.addInterceptor(new LocalServerLoginAccountsInterceptor(redis,redisLockClient,mockLoginService)).addPathPatterns("/**").order(1); + } } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/RabbitMqConfiguration.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/RabbitMqConfiguration.java index 8913215e2..d979f2111 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/RabbitMqConfiguration.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/config/RabbitMqConfiguration.java @@ -27,10 +27,11 @@ import static io.protostuff.MapSchema.MessageFactories.HashMap; public class RabbitMqConfiguration { @Bean - public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory) { + public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory, CustomMessageConverter converter) { RabbitTemplate template = new RabbitTemplate(); template.setConnectionFactory(connectionFactory); template.setMandatory(true); + template.setMessageConverter(converter); template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { @Override public void confirm(CorrelationData correlationData, boolean b, String s) { @@ -221,6 +222,22 @@ public class RabbitMqConfiguration { public Binding unloadCarNumBinding(Queue unloadCarNumQueue, CustomExchange unloadCarNumExchange) { return BindingBuilder.bind(unloadCarNumQueue).to(unloadCarNumExchange).with(RabbitConstant.UNLOAD_CAR_COM_INFO_ROUTING).noargs(); } + @Bean + public Queue hwyUnloadCarNumQueue() { + return new Queue(RabbitConstant.HWY_UNLOAD_CAR_COM_INFO_QUEUE, true); + } + + @Bean + public CustomExchange hwyUnloadCarNumExchange() { + Map args = Maps.newHashMap(); + args.put("x-delayed-type", "direct"); + return new CustomExchange(RabbitConstant.HWY_UNLOAD_CAR_COM_INFO_EXCHANGE, "x-delayed-message", true, false, args); + } + + @Bean + public Binding hwyUnloadCarNumBinding(Queue hwyUnloadCarNumQueue, CustomExchange hwyUnloadCarNumExchange) { + return BindingBuilder.bind(hwyUnloadCarNumQueue).to(hwyUnloadCarNumExchange).with(RabbitConstant.HWY_UNLOAD_CAR_COM_INFO_ROUTING).noargs(); + } @Bean diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/filer/HttpServletFilter.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/filer/HttpServletFilter.java index e0efd0d83..de486416c 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/filer/HttpServletFilter.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/filer/HttpServletFilter.java @@ -11,8 +11,14 @@ import java.io.IOException; public class HttpServletFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { + System.out.println("****************************1"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + + + System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 执行这里"); + + ServletRequest requestWrapper = null; if(request instanceof HttpServletRequest) { requestWrapper = new RequestWrapper((HttpServletRequest) request); diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/interceptor/LocalServerLoginAccountsInterceptor.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/interceptor/LocalServerLoginAccountsInterceptor.java new file mode 100644 index 000000000..67af8ebfd --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/interceptor/LocalServerLoginAccountsInterceptor.java @@ -0,0 +1,101 @@ +package com.logpm.factory.interceptor; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.common.exception.CustomerException; +import org.springblade.common.wrapper.CustomHttpServletRequestWrapper; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Log4j2 +@AllArgsConstructor +public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapter { + + private final BladeRedis bladeRedis; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + + + try { + CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(request); + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + + // 修改或添加header + + // 发送登录请求 + log.info("##########preHandle: request={}", request); + + wrappedRequest.addHeader("Blade-Auth", "bearer "+data.getString("access_token")); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + + // 用包装后的request替换原始request + request = wrappedRequest; + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + return true; + } catch (Exception e) { + returnJson(response, JSONObject.toJSONString(R.fail(500, "服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + +} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/FactoryXxlJob.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/FactoryXxlJob.java index a9e49d79c..28cc15b2c 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/FactoryXxlJob.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/FactoryXxlJob.java @@ -1,40 +1,52 @@ package com.logpm.factory.jobhandler; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.logpm.factory.comfac.dto.OrderStatusDTO; import com.logpm.factory.oupai.mapper.FactoryOrderMapper; import com.logpm.factory.oupai.service.IOuPaiFactoryService; +import com.logpm.factory.props.SendDataProperties; import com.logpm.factory.snm.dto.GroupByPackagesDTO; import com.logpm.factory.snm.entity.OrderLogEntity; import com.logpm.factory.snm.entity.StaorderPackagesEntity; import com.logpm.factory.snm.entity.StationOrderEntity; import com.logpm.factory.snm.entity.StationlinenumEntity; import com.logpm.factory.snm.service.*; +import com.logpm.factorydata.base.feign.IFactoryDataBaseClient; +import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; +import com.logpm.factorydata.vo.SendMsg; import com.logpm.oldproject.dto.AdvanceDTO; import com.logpm.oldproject.entity.AdvanceDetailEntity; import com.logpm.oldproject.entity.AdvanceEntity; import com.logpm.oldproject.entity.ServiceNumEntity; import com.logpm.oldproject.feign.*; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.log.XxlJobLogger; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springblade.common.constant.HttpConstants; import org.springblade.common.constant.LogpmDataStatusEnum; import org.springblade.common.constant.PackagesTypeEnum; +import org.springblade.common.constant.factorydata.FactoryDataConstants; import org.springblade.common.utils.CommonUtil; import org.springblade.core.tool.api.R; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; +import java.math.BigDecimal; import java.sql.Timestamp; import java.time.LocalDate; import java.util.*; @@ -50,6 +62,7 @@ import java.util.stream.Collectors; * * @author xuxueli */ +@Slf4j @AllArgsConstructor @Component public class FactoryXxlJob { @@ -74,6 +87,10 @@ public class FactoryXxlJob { private final IOuPaiFactoryService ouPaiFactoryService; private final FactoryOrderMapper factoryOrderMapper; + private final IFactoryDataBaseClient factoryDataBaseClient; + private final IFactoryDataClient factoryDataClient; + + private final SendDataProperties sendDataProperties; /** @@ -178,7 +195,15 @@ public class FactoryXxlJob { }); // 调用接口写入到老系统的数据库 - resoveFactoryData(); + if (ObjectUtil.equal(sendDataProperties.getSend(), "old")) { + log.info("推送到老系统"); + resoveFactoryData(); + } + // 走新系统暂存单 + if (ObjectUtil.equal(sendDataProperties.getSend(), "new")) { + log.info("推送到新系统"); + resoveFactoryDataNew(); + } return ReturnT.SUCCESS; } @@ -205,7 +230,7 @@ public class FactoryXxlJob { //TODO 获取老系统中存在的数据 与当前需要处理的数据进行判断是否存在重复 AdvanceDTO advanceDTO = new AdvanceDTO(); List queryData = iAdvanceClient.getQueryData(advanceDTO); - if (queryData.size() > 0) { + if (!queryData.isEmpty()) { queryData.forEach(it -> { StationOrderEntity stationOrderEntity = collect.get(it.getOrderSelfNum()); if (ObjectUtil.isNotNull(stationOrderEntity)) { @@ -215,13 +240,13 @@ public class FactoryXxlJob { } Map longIntegerMap = new HashMap<>(); //订单ID List list = new ArrayList<>(); // 服务号 自编码 - if (collect.size() > 0) { + if (!collect.isEmpty()) { collect.forEach((k, v) -> { List staorderPackagesList = staorderPackagesService.list(Wrappers.query().lambda() .eq(StaorderPackagesEntity::getIdentification, "2") .eq(StaorderPackagesEntity::getOrderId, k) ); - if (staorderPackagesList.size() > 0) { + if (!staorderPackagesList.isEmpty()) { map.put(k, staorderPackagesList); } //查询基地名称 @@ -393,6 +418,152 @@ public class FactoryXxlJob { return true; } + @Transactional(rollbackFor = Exception.class) + public Boolean resoveFactoryDataNew() { + //查询要处理的订单信息 + List stationOrderList = stationOrderService.list(Wrappers.query().lambda() + .eq(StationOrderEntity::getIdentification, "2") + ); + if (CollUtil.isNotEmpty(stationOrderList)) { + Map collect = stationOrderList.stream().collect(Collectors.toMap(StationOrderEntity::getId, StationOrderEntity -> StationOrderEntity)); + // 走新系统入库 + if (collect.size() > 0) { + List advances = new ArrayList<>(); + collect.forEach((k, v) -> { + List packageList = new ArrayList<>(); + List staorderPackagesList = staorderPackagesService.list(Wrappers.query().lambda() + .eq(StaorderPackagesEntity::getIdentification, "2") + .eq(StaorderPackagesEntity::getOrderId, k) + ); + //查询基地名称 + StationlinenumEntity stationlinenumEntity = stationlinenumService.selectNameByNumber(v.getTcWlb006()); + String siteName = Objects.isNull(stationlinenumEntity) ? null : stationlinenumEntity.getLogisticsLineName(); + Long startWarehouseId = null; + String startWarehouseName = null; + String tenantId = null; + R r = factoryDataBaseClient.getWarehouseByBrandAndSiteName(BrandEnums.SNM.getValue(), siteName); + if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, r.getCode())) { + FactoryWarehouseBindVO data = r.getData(); + if (ObjectUtil.isNotNull(data)) { + startWarehouseId = data.getWarehouseId(); + startWarehouseName = data.getWarehouseName(); + tenantId = data.getTenantId(); + } + } + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + advanceEntity.setHasPackage(CollUtil.isNotEmpty(staorderPackagesList) ? 1 : 0); + advanceEntity.setOrderType(""); + advanceEntity.setBrand(BrandEnums.SFY.getValue()); + advanceEntity.setSiteName(siteName); + advanceEntity.setArea(""); + advanceEntity.setTotalNum(CollUtil.isNotEmpty(staorderPackagesList) ? staorderPackagesList.size() : 0); + advanceEntity.setPackName(""); + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(startWarehouseId); + advanceEntity.setWarehouseName(startWarehouseName); + + advanceEntity.setIsGcp(0); + advanceEntity.setCarrierName(v.getTcBmb003()); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setSenderName(""); + advanceEntity.setSenderPhone(""); + advanceEntity.setSenderAddress(""); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setTrainNumber(v.getTcWla001()); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setOrderCode(v.getTcWlb008()); + advanceEntity.setServiceNum(v.getTcWlb008()); + advanceEntity.setSenderFactory(""); + advanceEntity.setDealerCode(""); + advanceEntity.setDealerName(v.getOcc02()); + advanceEntity.setStoreCode(""); + advanceEntity.setStoreName(v.getOcc02()); + advanceEntity.setCustomerName(v.getTcWlb010()); + advanceEntity.setCustomerPhone(v.getTcWlb011()); + advanceEntity.setCustomerAddress(v.getOcc02()); + // 根据遗留单标识赋值 + advanceEntity.setLegacyStatus("0"); + if (StrUtil.contains(v.getTcWlb008(), "遗")) { + advanceEntity.setLegacyStatus("1"); + } + List groupByPackages = staorderPackagesService.selectGroupByLxAndPackNumByOrderId(k); + Long finalStartWarehouseId = startWarehouseId; + String finalStartWarehouseName = startWarehouseName; + String finalTenantId = tenantId; + groupByPackages.forEach(gpd -> { + // 封装包件 + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(finalStartWarehouseId); + advanceDetailEntity.setWarehouseName(finalStartWarehouseName); + advanceDetailEntity.setOrderCode(v.getTcWlb008()); + advanceDetailEntity.setBrand(BrandEnums.SNM.getValue()); + advanceDetailEntity.setSystemType("线上"); + // 一级品类名称 + advanceDetailEntity.setFirstPackName(PackagesTypeEnum.getMes(gpd.getLx())); + advanceDetailEntity.setFirstPackCode(""); + // 获取映射品类信息 + // 二级品类名称 + advanceDetailEntity.setSecondPackName(PackagesTypeEnum.getMes(gpd.getLx())); + // 三级品类名称 + advanceDetailEntity.setThirdPackName(PackagesTypeEnum.getMes(gpd.getLx())); + advanceDetailEntity.setThirdPackCode(gpd.getLx()); + advanceDetailEntity.setMaterialName(PackagesTypeEnum.getMes(gpd.getLx())); + advanceDetailEntity.setSiteName(siteName); + advanceDetailEntity.setSiteCode(""); + advanceDetailEntity.setQuantity(1); + advanceDetailEntity.setOrderPackageCode(gpd.getPackagenum()); + advanceDetailEntity.setTrainNumber(v.getTcWla001()); + advanceDetailEntity.setServiceNum(v.getTcWlb008()); + advanceDetailEntity.setWaybillNo(""); + advanceDetailEntity.setPackageStatus("0"); + advanceDetailEntity.setWeight(BigDecimal.ZERO); + advanceDetailEntity.setVolume(BigDecimal.ZERO); + advanceDetailEntity.setSupple(""); + advanceDetailEntity.setManifest(""); + advanceDetailEntity.setReturnNum(""); + advanceDetailEntity.setSendDateStr(v.getTcWla002()); + advanceDetailEntity.setCarNumber(""); + advanceDetailEntity.setGoodsMan(""); + advanceDetailEntity.setTenantId(finalTenantId); + advanceDetailEntity.setStatus(0); + advanceDetailEntity.setIsDeleted(0); + cn.hutool.json.JSONObject entries = JSONUtil.parseObj(advanceDetailEntity); + packageList.add(entries); + }); + // 转成json对象,然后将包件明细放到detail中 + cn.hutool.json.JSONObject entries = JSONUtil.parseObj(advanceEntity); + entries.set("details", JSONUtil.toJsonStr(packageList)); + advances.add(entries); + if (CollUtil.isNotEmpty(staorderPackagesList)) { + staorderPackagesList.forEach(it -> { + it.setIdentification("1"); + staorderPackagesService.updateById(it); + }); + } + }); + // 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg. + if (CollUtil.isNotEmpty(advances)) { + for (cn.hutool.json.JSONObject advance : advances) { + SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER) + .routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build(); + factoryDataClient.sendMessage(sendMsg); + } + } + } + //修改提交状态 + stationOrderList.forEach(it -> { + it.setIdentification("1"); + stationOrderService.updateById(it); + }); + } + return true; + } + private List checkDataExit(List dataList, List allDataList) { allDataList.forEach(o -> { String otcWla001 = o.getTcWla001();//数据库中对应的派车单号 @@ -441,7 +612,7 @@ public class FactoryXxlJob { for (JSONObject jsonObject : packagePushAgain) { split.add(jsonObject.getString("code")); } - }else{ + } else { String[] splits = param.split(","); split.addAll(Arrays.asList(splits)); @@ -456,9 +627,9 @@ public class FactoryXxlJob { orderStatusDTO.setStatus("1"); // 查询老系统的操作人 orderStatusDTO.setUsername("admin");// 操作人 - R r =ouPaiFactoryService.handleStatusData(orderStatusDTO); - if(r.isSuccess()){ - factoryOrderMapper.updatePackagePushAgain(orderPackageCode.trim(),1); + R r = ouPaiFactoryService.handleStatusData(orderStatusDTO); + if (r.isSuccess()) { + factoryOrderMapper.updatePackagePushAgain(orderPackageCode.trim(), 1); } } @@ -473,6 +644,7 @@ public class FactoryXxlJob { } } + @XxlJob("factoryByOpOrderPackageCodeJobHandlerOut") public ReturnT factoryByOpOrderPackageCodeJobHandlerOut(String param) throws Exception { @@ -518,9 +690,9 @@ public class FactoryXxlJob { try { for (String receivCode : split) { - XxlJobLogger.log(">>>>> 收货单执行单号 开始 {}",receivCode); + XxlJobLogger.log(">>>>> 收货单执行单号 开始 {}", receivCode); ouPaiFactoryService.saveOuPaiFactoryOrderDTOByCarCarNumberAgain(receivCode); - XxlJobLogger.log(">>>>> 收货单执行单号 结束 {}",receivCode); + XxlJobLogger.log(">>>>> 收货单执行单号 结束 {}", receivCode); } @@ -536,6 +708,7 @@ public class FactoryXxlJob { /** * 修复欧派工厂订单数据重复 + * * @param param * @return * @throws Exception @@ -556,8 +729,8 @@ public class FactoryXxlJob { for (Map stringObjectMap : dataRepeat) { - Long receiving_id = (Long)stringObjectMap.get("receiving_id"); - String self_code = (String)stringObjectMap.get("self_code"); + Long receiving_id = (Long) stringObjectMap.get("receiving_id"); + String self_code = (String) stringObjectMap.get("self_code"); /** * select id from op_factory_order where is_deleted = 0 and (self_code = 'OPLCZ绵阳市231200002CA1-1' and receiving_id = 1736591024500776962) ORDER BY create_time @@ -566,9 +739,6 @@ public class FactoryXxlJob { List orderInforIdBySelfCodeAndReceivingid = factoryOrderMapper.findOrderInforIdBySelfCodeAndReceivingid(self_code, receiving_id); - - - } @@ -581,5 +751,4 @@ public class FactoryXxlJob { } - } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/MengTianPushDataJob.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/MengTianPushDataJob.java new file mode 100644 index 000000000..2a70d26cb --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/MengTianPushDataJob.java @@ -0,0 +1,109 @@ +package com.logpm.factory.jobhandler; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.logpm.factory.mt.dto.MtReceiveContentDTO; +import com.logpm.factory.mt.dto.MtReceiveDTO; +import com.logpm.factory.mt.dto.MtReceiveImagesDTO; +import com.logpm.factory.mt.mapper.MtPushDataMapper; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.RabbitConstant; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author zhaoqiaobo + * @create 2024-04-02 + */ +@AllArgsConstructor +@Component +@Slf4j +public class MengTianPushDataJob { + + private final MtPushDataMapper mtPushDataMapper; + private final RabbitTemplate rabbitTemplate; + + /** + * 定时扫描梦天手动数据 文员复核 + * + * @param param + * @return + * @throws Exception + */ + @XxlJob("mengTianCustomPushNodeData") + public ReturnT pushDataJob(String param) throws Exception { + + List js = this.mtPushDataMapper.customPushNodeData(); + if (CollUtil.isEmpty(js)) { + return ReturnT.SUCCESS; + } + MtReceiveDTO dto = new MtReceiveDTO(); + String sendTaskId = js.get(0).getStr("sendTaskId"); + if (StrUtil.isNotEmpty(sendTaskId)) { + dto.setSendTaskId(sendTaskId); + dto.setReceiver(js.get(0).getStr("receiver")); + // js 按sendTaskId 和 receiver分组 + List mtReceiveContentDTOS = js.stream().map(j -> { + MtReceiveContentDTO contentDTO = new MtReceiveContentDTO(); + contentDTO.setWaybillNumber(j.getStr("waybillNumber")); + contentDTO.setUnitNo(j.getStr("unitNo")); + contentDTO.setOperateDate(j.getStr("operateDate")); + contentDTO.setWarehouse(j.getStr("warehouse")); + contentDTO.setWarehouseCode(j.getStr("warehouseCode")); + contentDTO.setOrderCode(j.getStr("orderCode")); + contentDTO.setInvoiceOrderCode(j.getStr("invoiceOrderCode")); + return contentDTO; + }).collect(Collectors.toList()); + dto.setReceiveContentList(mtReceiveContentDTOS); + List images = mtPushDataMapper.customPushNodeDataImage(sendTaskId); + dto.setReceiveImagesList(images); + Map map = new HashMap<>(); + String mes = com.alibaba.fastjson.JSONObject.toJSONString(dto); + map.put("messageData", mes); + log.info("梦天手动回推签收文员复核数据:{}", JSONUtil.toJsonStr(map)); + rabbitTemplate.convertAndSend(RabbitConstant.MT_BUSINESS_DATA_CLERK_CHECK_2_FACTORY_EXCHANGE, RabbitConstant.MT_BUSINESS_DATA_CLERK_CHECK_2_FACTORY_ROUTING, map); + mtPushDataMapper.customPushNodeDataSended(sendTaskId, 2); + } + + return ReturnT.SUCCESS; + } + + /** + * 定时扫描梦天手动数据 签收扫描 + * + * @param param + * @return + * @throws Exception + */ + @XxlJob("mengTianCustomPushNodeScanData") + public ReturnT mengTianCustomPushNodeScanData(String param) throws Exception { + + JSONObject js = this.mtPushDataMapper.customPushNodeDataScan(); + if (ObjectUtil.isEmpty(js)) { + return ReturnT.SUCCESS; + } + JSONObject entries = new JSONObject(); + entries.set("orderPackageCode", js.getStr("unitNo")); + entries.set("operationTime", js.getStr("operateDate")); + entries.set("distributionContactId", js.getStr("sendTaskId")); + entries.set("destinationWarehouse", js.getStr("warehouse")); + Map map = new HashMap<>(); + map.put("messageData", JSONUtil.toJsonStr(entries)); + log.info("梦天手动回推签收扫描数据:{}", JSONUtil.toJsonStr(map)); + rabbitTemplate.convertAndSend(RabbitConstant.MT_BUSINESS_DATA_2_FACTORY_EXCHANGE, RabbitConstant.MT_BUSINESS_DATA_2_FACTORY_ROUTING, map); + mtPushDataMapper.customPushNodeDataSendedScan(js.getStr("unitNo"), 1); + return ReturnT.SUCCESS; + } + +} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/OrderPackageStatusFallJob.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/OrderPackageStatusFallJob.java index 53981590a..41cfee1e0 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/OrderPackageStatusFallJob.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/OrderPackageStatusFallJob.java @@ -47,6 +47,7 @@ public class OrderPackageStatusFallJob { orderPackageStatusPushFailLogEntity.setDataStatus(1); + }catch (CustomerException e){ XxlJobLogger.log(e); log.error("##################getOrderPackageFromOldSystem: 处理推送失败数据",e); diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/controller/MtFactoryDataController.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/controller/MtFactoryDataController.java index b980ce4c6..01f76ad73 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/controller/MtFactoryDataController.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/controller/MtFactoryDataController.java @@ -16,24 +16,42 @@ */ package com.logpm.factory.mt.controller; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.logpm.factory.comfac.service.IAsyncDataService; import com.logpm.factory.comfac.service.IOrderStatusLogService; import com.logpm.factory.mt.dto.MtFactoryDataDTO; import com.logpm.factory.mt.service.IMtFactoryDataService; +import com.logpm.factory.props.SendDataProperties; import com.logpm.factory.snm.entity.OrderStatusLog; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.vo.NodePushMsg; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; +import org.springblade.common.constant.RabbitConstant; +import org.springblade.common.constant.WorkNodeEnums; import org.springblade.common.exception.CustomerException; import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Value; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -54,6 +72,35 @@ public class MtFactoryDataController extends BladeController { private final IMtFactoryDataService mtFactoryDataService; private final IAsyncDataService asyncDataService; + private final RabbitTemplate rabbitTemplate; + private final SendDataProperties sendDataProperties; + + @ResponseBody + @PostMapping("/sendMsg") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "发送消息", notes = "传入factoryOrderDTO") + public R sendMsg(@Validated @RequestBody cn.hutool.json.JSONObject mtFactoryDataDTO, HttpServletRequest request) { + log.info("############data:{} ", mtFactoryDataDTO); + String corpId = request.getHeader("corpId"); + NodePushMsg msg = new NodePushMsg(); + msg.setNode(EnumUtil.fromString(WorkNodeEnums.class, mtFactoryDataDTO.getStr("node"))); + msg.setBrand(BrandEnums.MTMM); + msg.setOperator(AuthUtil.getUser().getNickName()); + msg.setOperatorTime(new Date()); + List contents = new ArrayList<>(); + ArrayList codes = CollUtil.newArrayList(mtFactoryDataDTO.getStr("packageCode").split(",")); + if (CollUtil.isNotEmpty(codes)) { + for (String code : codes) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("packageCode", code); + contents.add(jsonObject); + } + } + msg.setContent(contents); + rabbitTemplate.convertAndSend(RabbitConstant.HWY_UNLOAD_CAR_COM_INFO_EXCHANGE, RabbitConstant.HWY_UNLOAD_CAR_COM_INFO_ROUTING, msg); + return R.success("1"); + } + /** * 工厂数据推送接口 */ @@ -62,7 +109,7 @@ public class MtFactoryDataController extends BladeController { @ApiOperationSupport(order = 1) @ApiOperation(value = "通常数据推送", notes = "传入factoryOrderDTO") public R data(@Validated @RequestBody MtFactoryDataDTO mtFactoryDataDTO, HttpServletRequest request) { - log.info("############data:{} ",mtFactoryDataDTO); + log.info("############data:{} ", mtFactoryDataDTO); String corpId = request.getHeader("corpId"); //先保存原始请求数据 @@ -72,36 +119,44 @@ public class MtFactoryDataController extends BladeController { orderStatusLog.setType(3); orderStatusLog.setBrand("梦天"); orderStatusLogService.save(orderStatusLog); - try{ + try { //数据存入数据库 R r = mtFactoryDataService.dealWithData(mtFactoryDataDTO); int code = r.getCode(); - Map map = (Map) r.getData(); + Map map = (Map) r.getData(); Long mainId = null; - if(!Objects.isNull(map)){ + if (!Objects.isNull(map)) { mainId = map.get("mainId"); } - if(code == 200){ + if (code == 200) { orderStatusLog.setStatus(0); //开启异步线程处理数据 - if(!Objects.isNull(mainId)){ - asyncDataService.handlerMtDataToHt(map.get("mainId")); + if (!Objects.isNull(mainId)) { + if (ObjectUtil.equal(sendDataProperties.getSend(), "old")) { + log.info("推送到老系统"); + asyncDataService.handlerMtDataToHt(map.get("mainId")); + } + // 走新系统暂存单 + if (ObjectUtil.equal(sendDataProperties.getSend(), "new")) { + log.info("推送到新系统"); + asyncDataService.handlerMtDataToHtNew(map.get("mainId")); + } } - }else{ + } else { orderStatusLog.setStatus(2); } orderStatusLogService.saveOrUpdate(orderStatusLog); return r; - }catch (CustomerException e){ + } catch (CustomerException e) { orderStatusLog.setStatus(2); orderStatusLogService.saveOrUpdate(orderStatusLog); - log.error("#################data: "+e.message); + log.error("#################data: " + e.message); return R.fail(e.code, e.message); - }catch (Exception e){ + } catch (Exception e) { orderStatusLog.setStatus(2); orderStatusLogService.saveOrUpdate(orderStatusLog); - log.error("#################data: 保存数据失败",e); + log.error("#################data: 保存数据失败", e); return R.fail(405, "保存数据失败"); } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/dto/MtFactoryOrderMainDTO.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/dto/MtFactoryOrderMainDTO.java index 6d69c9483..29f47fae8 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/dto/MtFactoryOrderMainDTO.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/dto/MtFactoryOrderMainDTO.java @@ -12,6 +12,14 @@ import java.io.Serializable; @Data public class MtFactoryOrderMainDTO implements Serializable { + @JsonProperty("供应基地编号") + @ApiModelProperty(value = "供应基地编号") + private String siteCode; + + @JsonProperty("供应基地") + @ApiModelProperty(value = "供应基地") + private String siteName; + @JsonProperty("发货单编号") @ApiModelProperty(value = "发货单编号") private String invoiceOrderCode; diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/feign/MtOrderMainClinet.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/feign/MtOrderMainClinet.java index b691e9a62..f2d9f9c28 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/feign/MtOrderMainClinet.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/feign/MtOrderMainClinet.java @@ -26,7 +26,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; -@NonDS + @ApiIgnore @RestController @AllArgsConstructor diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtFactoryOrderMainMapper.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtFactoryOrderMainMapper.java index 4d0573c5c..f115e5530 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtFactoryOrderMainMapper.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtFactoryOrderMainMapper.java @@ -1,5 +1,6 @@ package com.logpm.factory.mt.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.factory.mt.entity.MtFactoryOrderMain; diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtPushDataMapper.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtPushDataMapper.java index dcee955c3..9dc90ce0a 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtPushDataMapper.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtPushDataMapper.java @@ -1,7 +1,21 @@ package com.logpm.factory.mt.mapper; +import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.factory.mt.dto.MtReceiveImagesDTO; import com.logpm.factory.mt.entity.MtPushData; +import org.apache.ibatis.annotations.Param; + +import java.util.List; public interface MtPushDataMapper extends BaseMapper { + + List customPushNodeData(); + JSONObject customPushNodeDataScan(); + + List customPushNodeDataImage(String sendTaskId); + + void customPushNodeDataSended(@Param("sendTaskId") String sendTaskId, @Param("pushType") int pushType); + + void customPushNodeDataSendedScan(@Param("unitNo") String unitNo, @Param("pushType") int pushType); } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtPushDataMapper.xml b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtPushDataMapper.xml index 507ec5afa..5cf55a81d 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtPushDataMapper.xml +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/mt/mapper/MtPushDataMapper.xml @@ -1,9 +1,52 @@ + + + + + update mt_custom_push_data_package + set sendStatus = 1 + where sendTaskId = #{sendTaskId} and push_type = #{pushType} + - - - - + + update mt_custom_push_data_package + set sendStatus = 1 + where unitNo = #{unitNo} and push_type = #{pushType} + diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/feign/OuPaiFactoryClinet.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/feign/OuPaiFactoryClinet.java index bbfd67be8..010692d75 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/feign/OuPaiFactoryClinet.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/feign/OuPaiFactoryClinet.java @@ -26,7 +26,7 @@ import java.util.Map; * @Author Diss * @Create 2024/1/2 22:13 */ -@NonDS + @ApiIgnore @RestController @AllArgsConstructor diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/receiver/OpReceivingDataHandler.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/receiver/OpReceivingDataHandler.java index 196b2057a..f509c2f46 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/receiver/OpReceivingDataHandler.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/receiver/OpReceivingDataHandler.java @@ -38,7 +38,7 @@ public class OpReceivingDataHandler { String receivingTime = object.getString("receivingTime"); //真正处理需要的数据 try { - panFactoryDataService.handleDataToPlatform(orderPackageCode, receivingTime); + panFactoryDataService.handleDataToPlatform(orderPackageCode, receivingTime,null); } catch (CustomerException e) { log.error("##################opReceivingDataHandler: 处理欧派收货数据到新系统,orderPackageCode:{},receivingTime:{},msg:{}", diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OpFailRetryPushPackageServiceImpl.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OpFailRetryPushPackageServiceImpl.java index a1077074e..2f11acf81 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OpFailRetryPushPackageServiceImpl.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OpFailRetryPushPackageServiceImpl.java @@ -1,7 +1,6 @@ package com.logpm.factory.oupai.service.impl; import com.alibaba.nacos.shaded.com.google.gson.Gson; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.logpm.factory.comfac.dto.OrderStatusDTO; import com.logpm.factory.oupai.entity.OpFailRetryPushPackageEntity; import com.logpm.factory.oupai.mapper.OpFailRetryPushPackageMapper; @@ -9,13 +8,15 @@ import com.logpm.factory.oupai.service.IOuPaiFactoryService; import com.logpm.factory.oupai.service.OpFailRetryPushPackageService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; - -import org.springblade.common.constant.opFailRetryPushPackage.PushStatus; +import org.springblade.common.annotations.LogpmAsync; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; /** * 欧派数据失败重推 @@ -31,7 +32,7 @@ public class OpFailRetryPushPackageServiceImpl implements OpFailRetryPushPackage protected final int MAX_RETRY_TIMES = 7; - @Async + @LogpmAsync("asyncExecutor") @Override public void retry(List waitData){ ArrayList completeIds = new ArrayList<>(); diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryDataServiceImpl.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryDataServiceImpl.java index dbd0abf53..9060e059d 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryDataServiceImpl.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryDataServiceImpl.java @@ -38,7 +38,7 @@ public class OuPaiFactoryDataServiceImpl implements IOuPaiFactoryDataService { } else if (event == 2) { //包件收货 // todo 暂时关闭数据推送到新系统 - //code = ouPaiFactoryService.saveOuPaiPackageStatusByCode(key,event); +// code = ouPaiFactoryService.saveOuPaiPackageStatusByCode(key,event); // 老系统的 // 包件收货需要验证 收货单是否在系统中存在 diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryServiceImpl.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryServiceImpl.java index 674a74f4a..f9e70f040 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryServiceImpl.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryServiceImpl.java @@ -1,5 +1,6 @@ package com.logpm.factory.oupai.service.impl; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONArray; @@ -17,6 +18,7 @@ import com.logpm.factory.oupai.entity.*; import com.logpm.factory.oupai.mapper.ReceivingOrderMapper; import com.logpm.factory.oupai.service.*; import com.logpm.factory.props.OuPaiProperties; +import com.logpm.factory.props.SendDataProperties; import com.logpm.factory.snm.bean.Resp; import com.logpm.oldproject.feign.IAdvanceClient; import com.logpm.oldproject.feign.IAdvanceDetailClient; @@ -39,6 +41,7 @@ import org.springblade.system.cache.DictCache; import org.springblade.system.entity.Dict; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -96,6 +99,8 @@ public class OuPaiFactoryServiceImpl implements IOuPaiFactoryService { @Autowired private OpPushFailedPackageRecordService opPushFailedPackageRecordService; + @Autowired + private SendDataProperties sendDataProperties; @Override public String saveOuPaiFactoryOrderDTOByCarCarNumber(String code) { @@ -111,7 +116,10 @@ public class OuPaiFactoryServiceImpl implements IOuPaiFactoryService { handleData(code); if (ObjectUtils.isNotNull(code)) { // 暂停推送 -// asyncDataService.handlerOuPaiDataToHt(code); + if(ObjectUtil.equal(sendDataProperties.getSend(), "new")){ + log.info("推送新系统"); + asyncDataService.handlerOuPaiDataToHt(code); + } } return code; diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/controller/PanFactoryDataController.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/controller/PanFactoryDataController.java index 223cfa0e1..0dd8dfa24 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/controller/PanFactoryDataController.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/controller/PanFactoryDataController.java @@ -16,6 +16,7 @@ */ package com.logpm.factory.pan.controller; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.logpm.factory.comfac.service.IAsyncDataService; @@ -25,6 +26,7 @@ import com.logpm.factory.pan.service.IPanFactoryDataService; import com.logpm.factory.pan.service.IPanFactoryOrderService; import com.logpm.factory.pan.service.IPanPackageInfoService; import com.logpm.factory.pan.service.IPanPackageListService; +import com.logpm.factory.props.SendDataProperties; import com.logpm.factory.snm.bean.Resp; import com.logpm.factory.snm.entity.OrderStatusLog; import io.swagger.annotations.Api; @@ -32,9 +34,13 @@ import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springblade.core.boot.ctrl.BladeController; -import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Value; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.Objects; @@ -57,8 +63,8 @@ public class PanFactoryDataController extends BladeController { private final IPanPackageListService packageListService; private final IPanFactoryDataService panFactoryDataService; private final IAsyncDataService syncDataService; - private RabbitTemplate rabbitTemplate; private final IOrderStatusLogService panOrderStatusLogService; + private final SendDataProperties sendDataProperties; // @ResponseBody // @PostMapping("/token") @@ -87,7 +93,6 @@ public class PanFactoryDataController extends BladeController { // } - /** * 工厂数据推送接口 */ @@ -111,24 +116,32 @@ public class PanFactoryDataController extends BladeController { //判断数据是否已存入 String orderNo = factoryOrderDTO.getOrderNo(); Long orderId = null; - try{ + try { orderId = panFactoryDataService.saveData(factoryOrderDTO); panOrderStatusLog.setStatus(0); - }catch (Exception e){ - log.warn("############data: 保存数据失败 orderNo={}",orderNo); - log.error("############data: 保存数据失败",e); + } catch (Exception e) { + log.warn("############data: 保存数据失败 orderNo={}", orderNo); + log.error("############data: 保存数据失败", e); //修改保存数据的状态 panOrderStatusLog.setStatus(2); } panOrderStatusLogService.saveOrUpdate(panOrderStatusLog); //开启异步线程处理数据 - if(!Objects.isNull(orderId)){ - syncDataService.handlerPanDataToHt(orderId); + if (!Objects.isNull(orderId)) { + if (ObjectUtil.equal(sendDataProperties.getSend(), "old")) { + log.info("推送到老系统"); + syncDataService.handlerPanDataToHt(orderId); + } + // 走新系统暂存单 + if (ObjectUtil.equal(sendDataProperties.getSend(), "new")) { + log.info("推送到新系统"); + syncDataService.handlerPanDataToHtNew(orderId); + } } - return Resp.successOrderNo(factoryOrderDTO.getOrderNo(),factoryOrderDTO.getDeliveryNumber(),"SUCCESS"); + return Resp.successOrderNo(factoryOrderDTO.getOrderNo(), factoryOrderDTO.getDeliveryNumber(), "SUCCESS"); } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/IPanFactoryDataService.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/IPanFactoryDataService.java index 7a24a6fa3..f929a42d6 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/IPanFactoryDataService.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/IPanFactoryDataService.java @@ -16,7 +16,9 @@ public interface IPanFactoryDataService { R handleStatusData(OrderStatusDTO orderStatusDTO); - void handleDataToPlatform(String unitNo,String operationTime); + R hwyHandleStatusData(OrderStatusDTO orderStatusDTO); + + void handleDataToPlatform(String unitNo,String operationTime,Integer oldWarehouseId); Long saveData(PanFactoryOrderDTO factoryOrderDTO); } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/impl/PanFactoryDataServiceImpl.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/impl/PanFactoryDataServiceImpl.java index 8a05789b2..a42be342b 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/impl/PanFactoryDataServiceImpl.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/impl/PanFactoryDataServiceImpl.java @@ -23,7 +23,6 @@ import com.logpm.distribution.feign.IDistributionParcelListClient; import com.logpm.distribution.feign.IDistributionStockArticleClient; import com.logpm.factory.comfac.dto.OrderInfoDTO; import com.logpm.factory.comfac.dto.OrderStatusDTO; -import com.logpm.factory.comfac.service.IOrderStatusLogService; import com.logpm.factory.pan.dto.PanFactoryOrderDTO; import com.logpm.factory.pan.dto.PanPackageInfoDTO; import com.logpm.factory.pan.dto.PanPackageListDTO; @@ -82,7 +81,6 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { private final IPanPackageListService packageListService; private final PanFactoryProperties panFactoryProperties; - private final IOrderStatusLogService panOrderStatusLogService; private final IPanPackageInfoService panPackageInfoService; private final IAdvanceDetailClient advanceDetailClient; private final IWarehouseClient warehouseClient; @@ -116,7 +114,7 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { private final ITrunklineAdvanceDetailClient trunklineAdvanceDetailClient; private final IBasicdataCategoryClient categoryClient; - private final IOrderCountClient orderCountClient; + private final BladeRedis redis; private final IRegionFeign regionFeign; @@ -263,9 +261,104 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { orderStatusDTO.setPlantId(plantId); orderStatusDTO.setCurrentWarehouse(currentWarehouse); orderStatusDTO.setDestinationWarehouse(supplyData.get("destinationWarehouse")); -// orderStatusDTO.setDestinationWarehouse("南充市"); orderStatusDTO.setLogiBillNo(supplyData.get("logiBillNo")); -// orderStatusDTO.setLogiBillNo("GZ23060001"); + + //修改状态映射 + orderStatusDTO.setStatus(statusName(orderStatusDTO.getStatus())); + + + //判断数据是都已存在 + if (!orderStatusDTO.verifyData()) { + log.info("#############handleStatusData: 数据不齐全 orderStatusDTO={}", orderStatusDTO); + return Resp.fail(405, "数据不齐全"); + } + + //拼接参数 + Map map = new HashMap<>(); + map.put("payload", JSONObject.toJSONString(orderStatusDTO)); + + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + String s = gson.toJson(map); + + //先获取token + String panToken = getPanToken(); + + //请求参数 + log.info("##############handleStatusData: 推送包件状态请求参数 {}", s); + //处理逻辑 + String result = HttpRequest.post(panFactoryProperties.getUrl() + "/hitf/v1/rest/invoke?namespace=HZERO&serverCode=OPEN&interfaceCode=HUITONG_RECEIVE") + .header("Authorization", "Bearer " + panToken) + .header("Content-Type", "application/json") + .body(s).timeout(5 * 1000) + .execute().body(); + + log.info("##############handleStatusData: 推送包件状态返回参数 {}", result); + + //把结果字符串转为json对象 + JSONObject jsonObject = JSONObject.parseObject(result); + JSONObject payload = jsonObject.getJSONObject("payload"); + if (!Objects.isNull(payload)) { + Integer code = payload.getInteger("code"); + String message = payload.getString("data"); + if (code.equals(1)) { + log.info("##########handleStatusData: 物流状态传递成功"); + } else { + return Resp.fail(405, message); + } + } else { + return Resp.fail(405, "返回格式有误:" + result); + } + return Resp.success("SUCCESS"); + } + + + /** + * { + * "payload": "{\"currentWarehouse\":\"广州仓\", + * \"destinationWarehouse\":\"乐山仓\", + * \"dispatchNumber\":\"GZGX240510020\", + * \"distributionContactId\":\"0\", + * \"logiBillNo\":\"1121813\", + * \"operationTime\":\"2024-05-10 17:18:40\", + * \"orderNo\":\"2090032404005LCZ\", + * \"plantId\":\"3610\", + * \"status\":\"装车\", + * \"unitNo\":\"PBBB240427000440\", + * \"username\":\"朱梓敏\"}" + * @param orderStatusDTO + * @return + */ + @Override + public R hwyHandleStatusData(OrderStatusDTO orderStatusDTO) { + String status = orderStatusDTO.getStatus(); + if ("1".equals(status) || "2".equals(status) || "5".equals(status) || "6".equals(status) || "8".equals(status) || "9".equals(status)) { + log.info("#############handleStatusData: 当前数据的状态不推送 status={}", status); + return Resp.fail(400, "当前数据的状态不推送"); + } + + //通过包件码查询是否是要推送的订单 + String unitNo = orderStatusDTO.getUnitNo();//包件码 + String currentWarehouse = orderStatusDTO.getCurrentWarehouse(); + QueryWrapper packageInfoQueryWrapper = new QueryWrapper<>(); + packageInfoQueryWrapper.eq("unit_no", unitNo); + PanPackageInfo one = panPackageInfoService.getOne(packageInfoQueryWrapper); + if (Objects.isNull(one)) { + log.info("#############handleStatusData: 当前包条码未找到对应数据unitNo={}", unitNo); + return Resp.fail(400, "未找到包件数据"); + } + WarehouseWaybillEntity waybillEntityByOrderPackageCode = warehouseWaybillClient.findWaybillEntityByOrderPackageCode(unitNo); + String plantId = one.getPlantId(); + + //根据仓库ID查询仓库名字 + currentWarehouse = warehouseClient.selectNameById(Integer.parseInt(currentWarehouse)); + if (ObjectUtil.isEmpty(currentWarehouse)) { + log.info("#############handleStatusData: 数据不齐全 orderStatusDTO={}", orderStatusDTO); + return Resp.fail(405, "数据不齐全"); + } + orderStatusDTO.setPlantId(plantId); + orderStatusDTO.setCurrentWarehouse(currentWarehouse); + orderStatusDTO.setDestinationWarehouse(waybillEntityByOrderPackageCode.getDestinationWarehouseName()); + orderStatusDTO.setLogiBillNo(waybillEntityByOrderPackageCode.getWaybillNo()); //修改状态映射 orderStatusDTO.setStatus(statusName(orderStatusDTO.getStatus())); @@ -361,12 +454,20 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { @Transactional(rollbackFor = Exception.class) @Override - public void handleDataToPlatform(String unitNo, String operationTime) { + public void handleDataToPlatform(String unitNo, String operationTime,Integer oldWarehouseId) { log.info("############handleDataToPlatform: 处理数据到platform unitNo={}", unitNo); + BasicdataWarehouseEntity basicdataWarehouseEntity = basicdataWarehouseClient.getWarehouseByOldId(oldWarehouseId); + if(Objects.isNull(basicdataWarehouseEntity)){ + log.warn("############handleDataToPlatform: 仓库信息不存在 oldWarehouseId={}",oldWarehouseId); + throw new CustomerException(405, "仓库信息不存在"); + } + + Long warehouseId = basicdataWarehouseEntity.getId(); + //先查询包件是否已存入到新系统数据库 - DistributionParcelListEntity distributionParcelListEntity = distributionParcelListClient.findByPacketBarCode(unitNo); - if (Objects.isNull(distributionParcelListEntity)) { + DistributionParcelListEntity distributionParcelListEntity = distributionParcelListClient.findByPacketBarCodeAndWarehouseId(unitNo,warehouseId); + if (ObjectUtils.isEmpty(distributionParcelListEntity)) { //未找到包件信息那就去新增 //1.根据包条码去老系统数据库找到对应的包条信息 AdvanceDetailEntity advanceDetailEntity = advanceDetailClient.getOneByUnitNo(unitNo); @@ -407,12 +508,7 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { // Integer oldId = orderDetailEntity.getNowWarehouseId(); // 查询数据对应的仓库名称 - BasicdataWarehouseEntity basicdataWarehouseEntity = basicdataWarehouseClient.findByName(destinationWarehouse); - if(Objects.isNull(basicdataWarehouseEntity)){ - log.warn("############handleDataToPlatform: 仓库信息不存在 destinationWarehouse={}",destinationWarehouse); - throw new CustomerException(405, "仓库信息不存在"); - } - Long warehouseId = basicdataWarehouseEntity.getId(); + // OrderCountEntity orderCountEntity = orderCountClient.getEntityByOrderCode(orderSelfNum,oldId); // if(Objects.isNull(orderCountEntity)){ @@ -522,6 +618,8 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { if (StringUtil.isNoneBlank(peisongType)) { distributionStockArticleEntity.setTypeService(peisongType); } + }else{ + distributionStockArticleEntity.setMallName(wayBillEntity.getTakeCompany()); } distributionStockArticleEntity.setGenre(1); @@ -564,6 +662,7 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { } }else{ distributionStockArticleEntity.setTotalNumber(total); + distributionStockArticleEntity.setGenre(1); distributionStockArticleClient.saveOrUpdate(distributionStockArticleEntity); } @@ -850,8 +949,10 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { warehouseWaybill.setConsigneeName(wayBillEntity.getTakePerson()); warehouseWaybill.setConsigneeMobile(wayBillEntity.getTakeMobile()); warehouseWaybill.setConsigneeAddress(wayBillEntity.getTakeAddress()); - String arriveSite = wayBillEntity.getArriveSite(); - String code = regionFeign.getCode(arriveSite); +// String arriveSite = wayBillEntity.getArriveSite(); + Integer arriveSiteId = wayBillEntity.getArriveSiteId(); + String code = wayBillClient.findAreaCodeByArriveSiteId(arriveSiteId); +// String code = regionFeign.getCode(arriveSite); warehouseWaybill.setDestinationCode(code); warehouseWaybill.setDestination(wayBillEntity.getArriveSite()); warehouseWaybill.setGoodsName(packname); @@ -1095,6 +1196,7 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { trunklineAdvanceDetailEntity.setTrainNumber(advanceDetailEntity.getMctsTruck()); trunklineAdvanceDetailEntity.setServiceNum(advanceDetailEntity.getServiceNum()); trunklineAdvanceDetailEntity.setWaybillNo(waybillNo); + trunklineAdvanceDetailEntity.setWaybillId(waybillId); trunklineAdvanceDetailEntity.setPackageStatus("1"); trunklineAdvanceDetailEntity.setChargeType(1); newPackageList.add(trunklineAdvanceDetailEntity); diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/props/SendDataProperties.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/props/SendDataProperties.java new file mode 100644 index 000000000..623e39b80 --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/props/SendDataProperties.java @@ -0,0 +1,23 @@ +package com.logpm.factory.props; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * FactoryProperties + * + * @author pref + */ +@Component +@Data +@ConfigurationProperties(prefix = "factory.data") +public class SendDataProperties { + /** + * 名称 + */ + private String send = "old"; + + + +} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/HwyOrderStatusHandler.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/HwyOrderStatusHandler.java new file mode 100644 index 000000000..40b9b481b --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/HwyOrderStatusHandler.java @@ -0,0 +1,95 @@ +package com.logpm.factory.receiver; + +import cn.hutool.json.JSONUtil; +import com.logpm.factory.comfac.constant.FactoryConstant; +import com.logpm.factory.comfac.dto.OrderStatusDTO; +import com.logpm.factory.mt.service.IMtFactoryDataService; +import com.logpm.factory.oupai.service.IOuPaiFactoryService; +import com.logpm.factory.pan.service.IPanFactoryDataService; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import com.logpm.trunkline.feign.ITrunklineAdvanceClient; +import com.rabbitmq.client.Channel; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.RabbitConstant; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.tool.api.R; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.util.Map; +import java.util.Objects; + + +/** + * 梦天工厂数据 处理器 + * + * @author yangkai.shen + */ +@Slf4j +@RabbitListener(queues = RabbitConstant.HWY_ORDER_STATUS_QUEUE) +@Component +@AllArgsConstructor +public class HwyOrderStatusHandler { + + private final IPanFactoryDataService panFactoryDataService; + private final IMtFactoryDataService mtFactoryDataService; + private final IOuPaiFactoryService ouPaiFactoryService; + private final ITrunklineAdvanceClient trunklineAdvanceClient; + + + @RabbitHandler + public void hwyOrderStatusHandler(Map map, Message message, Channel channel) throws IOException, NoSuchAlgorithmException { + // 如果手动ACK,消息会被监听消费,但是消息在队列中依旧存在,如果 未配置 acknowledge-mode 默认是会在消费完毕后自动ACK掉 + + log.info("##################hwyOrderStatusHandler: 处理扫码作业数据"); + OrderStatusDTO orderStatusDTO = JSONUtil.toBean((String) map.get("messageData"), OrderStatusDTO.class); + String orderSelfNum = orderStatusDTO.getOrderNo();//订单自编号 + String unitNo = orderStatusDTO.getUnitNo(); + //通过订单自编号去查询该条订单是属于哪个工厂 + TrunklineAdvanceEntity advanceLimitOneByOrderCode = trunklineAdvanceClient.findAdvanceLimitOneByOrderCode(orderSelfNum); + if (Objects.isNull(advanceLimitOneByOrderCode)) { + log.info("##################hwyOrderStatusHandler: 未找到对应订单 orderNo={}", orderSelfNum); +// channel.basicAck(deliveryTag,true); + return; + } + String type = advanceLimitOneByOrderCode.getBrand();//品牌 + + R r = null; + switch (type) { + case FactoryConstant.PIANO: + r = panFactoryDataService.hwyHandleStatusData(orderStatusDTO); + if (r.getCode() == 400 || r.getCode() == 200) { + log.info("TAG {} ##################hwyOrderStatusHandler: 该条数据不用处理 orderNo={}", FactoryConstant.PIANO, orderSelfNum); + } else { + throw new CustomerException(r.getCode(), r.getMsg()); + } + break; + case FactoryConstant.MENGT: + r = mtFactoryDataService.handleStatusData(orderStatusDTO); + if (r.getCode() == 400 || r.getCode() == 200) { + log.info("TAG {} ##################hwyOrderStatusHandler: 该条数据不用处理 orderNo={}", FactoryConstant.MENGT, orderSelfNum); + } else { + throw new CustomerException(r.getCode(), r.getMsg()); + } + break; + case FactoryConstant.OUPAI: + r = ouPaiFactoryService.handleStatusData(orderStatusDTO); + if (r.getCode() == 400 || r.getCode() == 200) { + log.info("TAG {} ##################hwyOrderStatusHandler: 该条数据不用处理 orderNo={}", FactoryConstant.OUPAI, orderSelfNum); + } else { + throw new CustomerException(r.getCode(), r.getMsg()); + } + break; + + default: + log.info("##################hwyOrderStatusHandler: 新系统推送未知品牌 type={}", type); + } + + + } +} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/HwyUnloadCarComHandler.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/HwyUnloadCarComHandler.java new file mode 100644 index 000000000..cdf04f883 --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/HwyUnloadCarComHandler.java @@ -0,0 +1,179 @@ +package com.logpm.factory.receiver; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +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.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.logpm.factory.mt.entity.MtPushData; +import com.logpm.factory.mt.service.IMtFactoryDataService; +import com.logpm.factory.mt.service.IMtFactoryOrderMainService; +import com.logpm.factory.mt.service.IMtPushDataService; +import com.logpm.factory.snm.vo.MTOrderPackageRelationVO; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.vo.NodePushMsg; +import com.logpm.oldproject.feign.IAdvanceDetailClient; +import com.rabbitmq.client.Channel; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.Nullable; +import org.springblade.common.constant.RabbitConstant; +import org.springblade.common.constant.WorkNodeEnums; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.security.NoSuchAlgorithmException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 卸车完成处理队列 + */ +@Slf4j +@RabbitListener(queues = RabbitConstant.HWY_UNLOAD_CAR_COM_INFO_QUEUE) +@Component +public class HwyUnloadCarComHandler { + + @Autowired + private IAdvanceDetailClient advanceDetailClient; + + + @Autowired + private IMtFactoryOrderMainService mtFactoryOrderMainService; + + @Autowired + private IMtFactoryDataService mtFactoryDataService; + + @Autowired + private IMtPushDataService mtPushDataService; + + + @RabbitHandler + public void unloadCarComDataHandler(NodePushMsg nodePushMsg, Message message, Channel channel) { +// NodePushMsg nodePushMsg = JSONUtil.toBean(msg, NodePushMsg.class); + BrandEnums brand = nodePushMsg.getBrand(); + switch (brand) { + case MTMM: + pushMentTian(nodePushMsg); + break; + } + } + + private void pushMentTian(NodePushMsg nodePushMsg) { + if (!ObjectUtil.equals(WorkNodeEnums.END_WAREHOUSE_UNLOADING, nodePushMsg.getNode())) { + return; + } + // 根据包件获取车次 + List content = nodePushMsg.getContent(); + List carNumList = new ArrayList<>(); + if (CollUtil.isNotEmpty(content)) { + for (Object s : content) { + JSONObject jsonObject = JSONUtil.parseObj(s); + String packageCode = (String) jsonObject.get("packageCode"); + carNumList.add(packageCode); + } + } + + try { + + List allMtData = mtFactoryOrderMainService.mtOrderPackageRelation(); + // 对这个集合内进行分组 + Map> stringListMap = allMtData.stream().collect(Collectors.groupingBy(MTOrderPackageRelationVO::getInvoiceOrderCode)); + Set set = stringListMap.keySet(); + String carNum = null; + + Set r = new HashSet<>(); + for (String s : set) { + // 得到某个工厂运输批次的集合 + List t = stringListMap.get(s); + //得到这个批次下面所有的包件 + List strs = t.stream().map(MTOrderPackageRelationVO::getPackageCode).collect(Collectors.toList()); + // 当前批次的包件 在 这个配载计划中存在一个 则进行通知 + for (String mtStr : carNumList) { + if (strs.contains(mtStr)) { + carNum = s; + break; + } + } + if (StringUtil.isNoneBlank(carNum)) { + r.add(carNum); + } + } + + r.forEach(t -> { + sendDataCarNum(t, DateUtil.formatDateTime(nodePushMsg.getOperatorTime())); + }); + + + } catch (Exception e) { + log.error("##################unloadCarComDataHandler 解析数据出错:{}", e.getMessage()); + } + } + + /** + * 根基匹配到的发货单编号 推送梦天 + * + * @param carNum 车次号 + * @param completeDate 完成时间 + * @throws ParseException + * @throws NoSuchAlgorithmException + * @throws JsonProcessingException + */ + private void sendDataCarNum(String carNum, String completeDate) { + log.info("##################sendDataCarNum carNum:{},completeDate{}", carNum, completeDate); + + // 需要判断这个发货单编号是否推送过 + QueryWrapper lambdaQueryChainWrapper = new QueryWrapper(); + lambdaQueryChainWrapper.eq("ref_code", carNum); + MtPushData ms = mtPushDataService.getOne(lambdaQueryChainWrapper); + if (ObjectUtils.isNotNull(ms)) { + log.info("##################{} 车次已经推送过", carNum); + return; + } + try { + + R r = mtFactoryDataService.sendUnloadCarNum(carNum, completeDate); + + log.info("MT 数据卸车推送 {}", r.getMsg()); + } catch (Exception e) { + + + log.error(">>>> 梦天数据卸车推送异常", e); + } + log.info("##################{} 梦天确认签收数据推送1", carNum); + + } + + @Nullable + private List getBizData(JSONObject entries) { + List content = entries.getBeanList("content", JSONObject.class); + List packageCodeList = null; + if (CollUtil.isNotEmpty(content)) { + // 查询这次操作的所有包件和运单号 + packageCodeList = new ArrayList<>(); + for (JSONObject obj : content) { + String packageCode = obj.getStr("packageCode"); + if (StrUtil.isNotBlank(packageCode)) { + packageCodeList.add(packageCode); + } + } + } + return packageCodeList; + } + + +} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/NewSystemReceiveInfoHandler.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/NewSystemReceiveInfoHandler.java index e9c998eeb..4431ea4fa 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/NewSystemReceiveInfoHandler.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/NewSystemReceiveInfoHandler.java @@ -40,7 +40,7 @@ public class NewSystemReceiveInfoHandler { // 欧派的订单会进来进行推送 String json = (String) map.get("messageData"); OrderStatusDTO orderStatusDTO = JSON.parseObject(json, OrderStatusDTO.class); - log.info("##################receiveInfoHandler:处理签收信息数据 {}",orderStatusDTO); + log.info("##################receiveInfoHandler:处理签收信息数据 {}",orderStatusDTO); try { ouPaiFactoryService.newSystemHandleStatusData(orderStatusDTO); } catch (Exception e) { diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/NodeWorkHandler.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/NodeWorkHandler.java new file mode 100644 index 000000000..e8d1820c8 --- /dev/null +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/NodeWorkHandler.java @@ -0,0 +1,54 @@ +package com.logpm.factory.receiver; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.logpm.factory.mt.service.IMtFactoryDataService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.broadcast.FanoutConstants; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +/** + * 作业节点数据监听 + */ +@Slf4j +@AllArgsConstructor +@Component +public class NodeWorkHandler { + + private final IMtFactoryDataService mtFactoryDataService; + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FanoutConstants.distribution.signfor.QUEUE.FACTORY_NODE_WORK_DISTRIBUTION_SIGNFOR_QUERY), + exchange = @Exchange(name = FanoutConstants.distribution.signfor.EXCHANGE, type = ExchangeTypes.FANOUT) + )) + public void distributionSignforQuery(String message) { + + try { + JSONObject jsonObject = JSONUtil.parseObj(message); + String orderPackageCode = jsonObject.getStr("orderPackageCode"); + String operationTime = jsonObject.getStr("operationTime"); + String distributionContactId = jsonObject.getStr("distributionContactId"); + String destinationWarehouse = jsonObject.getStr("destinationWarehouse"); + // 获取品牌BrandEnums.MTMM.getValue() + String o = jsonObject.getStr("brand"); + switch (o) { + case "梦天" : + log.info("工厂节点数据监听:1"); + mtFactoryDataService.qianshouScanForNewSystem(orderPackageCode, operationTime, distributionContactId, destinationWarehouse); + break; + default: + log.info("签收扫描没有找到品牌: {}",o); + } + }catch (Exception e){ + log.error("工厂节点数据监听异常", e); + } + + + } + +} diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/UnloadCarComHandler.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/UnloadCarComHandler.java index 580fb7758..46f4e7881 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/UnloadCarComHandler.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/UnloadCarComHandler.java @@ -14,6 +14,8 @@ import com.logpm.oldproject.feign.IAdvanceDetailClient; import com.rabbitmq.client.Channel; import lombok.extern.slf4j.Slf4j; import org.springblade.common.constant.RabbitConstant; +import org.springblade.core.log.feign.ILogClient; +import org.springblade.core.log.model.LogError; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springframework.amqp.core.Message; @@ -51,6 +53,8 @@ public class UnloadCarComHandler { @Autowired private IMtPushDataService mtPushDataService; + private ILogClient logClient; + @RabbitHandler public void unloadCarComDataHandler(Map map, Message message, Channel channel) { @@ -79,10 +83,11 @@ public class UnloadCarComHandler { // 对这个集合内进行分组 Map> stringListMap = allMtData.stream().collect(Collectors.groupingBy(MTOrderPackageRelationVO::getInvoiceOrderCode)); Set set = stringListMap.keySet(); - String carNum = null; + Set r = new HashSet<>(); for (String s : set) { + String carNum = null; // 得到某个工厂运输批次的集合 List t = stringListMap.get(s); //得到这个批次下面所有的包件 @@ -98,14 +103,14 @@ public class UnloadCarComHandler { r.add(carNum); } } - r.forEach(t->{ sendDataCarNum(t, unloadCarDTO.getCompleteDate()); }); - } catch (Exception e) { log.error("##################unloadCarComDataHandler 解析数据出错:{}", e.getMessage()); + + } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/snm/feign/StationLineNumClient.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/snm/feign/StationLineNumClient.java index bf8b668ee..84caeb0e6 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/snm/feign/StationLineNumClient.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/snm/feign/StationLineNumClient.java @@ -13,7 +13,7 @@ import java.util.List; /** * 诗尼曼工厂线路信息外部服务 */ -@NonDS + @ApiIgnore @RestController @AllArgsConstructor diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/controller/ZbFactoryDataController.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/controller/ZbFactoryDataController.java index 053398d46..ff332bdd9 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/controller/ZbFactoryDataController.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/controller/ZbFactoryDataController.java @@ -21,13 +21,16 @@ import org.springblade.core.oss.model.BladeFile; import org.springblade.core.tool.api.R; import org.springblade.resource.feign.IOssClient; import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; -import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; @@ -35,6 +38,7 @@ import java.util.Objects; /** * 志邦工厂数据推送 + * * @author pref * @data 2023-02-21 */ @@ -55,6 +59,7 @@ public class ZbFactoryDataController { private final IOssClient ossClient; + /** * 工厂数据推送接口 */ @@ -62,15 +67,15 @@ public class ZbFactoryDataController { @PostMapping("/data") @ApiOperationSupport(order = 1) @ApiOperation(value = "工厂数据推送", notes = "传入factoryOrderDTO") - public ZbResp data(@RequestBody ZBReceiptDTO zbReceiptDTO, HttpServletRequest request) { + public ZbResp data(@RequestBody ZBReceiptDTO zbReceiptDTO, HttpServletRequest request) { - log.info("############zbReceiptDTO: {}",zbReceiptDTO); + log.info("############zbReceiptDTO: {}", zbReceiptDTO); String corpId = request.getHeader("corpId"); zbReceiptDTO.setCorpId(corpId); String method = request.getParameter("method"); - if(!"entry.order.create".equals(method)){ - log.warn("############data: 暂不支持该功能 method={}",method); + if (!"entry.order.create".equals(method)) { + log.warn("############data: 暂不支持该功能 method={}", method); return ZbResp.fail("暂不支持该功能"); } @@ -99,12 +104,12 @@ public class ZbFactoryDataController { // //判断数据是否已存入 Long orderId = null; - try{ + try { orderId = zbFactoryDataService.saveData(zbReceiptDTO); // orderStatusLog.setStatus(0); zbFactoryLogEntity.setSaxStatus(1); - }catch (Exception e){ - log.error("############data: 保存数据失败",e); + } catch (Exception e) { + log.error("############data: 保存数据失败", e); //修改保存数据的状态 // orderStatusLog.setStatus(2); zbFactoryLogEntity.setSaxStatus(2); @@ -113,9 +118,15 @@ public class ZbFactoryDataController { zbFactoryLogService.saveOrUpdate(zbFactoryLogEntity); //开启异步线程处理数据 - if(!Objects.isNull(orderId)){ + if (!Objects.isNull(orderId)) { syncDataService.handlerZbDataToHt(orderId); } + // 推送数据到新系统 + try { + zbFactoryDataService.saveDataNew(zbReceiptDTO); + } catch (Exception e) { + log.error("志邦数据传新系统失败"); + } return ZbResp.success("成功"); } @@ -126,7 +137,7 @@ public class ZbFactoryDataController { MultipartFile multi = getMultipartFile(logPath); //上传到服务器 - R r = ossClient.fileUpload(multi,"zb-logs"); + R r = ossClient.fileUpload(multi, "zb-logs"); if (r.isSuccess()) { BladeFile data = (BladeFile) r.getData(); return data.getLink(); @@ -147,8 +158,8 @@ public class ZbFactoryDataController { , true , file.getName()); try ( - InputStream input = Files.newInputStream(file.toPath()); - OutputStream os = item.getOutputStream()) { + InputStream input = Files.newInputStream(file.toPath()); + OutputStream os = item.getOutputStream()) { // 流转移 IOUtils.copy(input, os); } catch (Exception e) { diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/service/IZbFactoryDataService.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/service/IZbFactoryDataService.java index be748a7f6..ccd0c0c97 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/service/IZbFactoryDataService.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/service/IZbFactoryDataService.java @@ -16,4 +16,6 @@ public interface IZbFactoryDataService { R handleStatusData(OrderStatusDTO orderStatusDTO); + void saveDataNew(ZBReceiptDTO zbReceiptDTO); + } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/service/impl/ZbFactoryDataServiceImpl.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/service/impl/ZbFactoryDataServiceImpl.java index 074f2e2b9..e9c24b8e3 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/service/impl/ZbFactoryDataServiceImpl.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/service/impl/ZbFactoryDataServiceImpl.java @@ -17,12 +17,14 @@ import com.logpm.factory.zb.entity.ZbPackageInfoEntity; import com.logpm.factory.zb.entity.ZbReceiptEntity; import com.logpm.factory.zb.service.*; import com.logpm.factory.zb.untils.QmSignUntil; +import com.logpm.factorydata.zbom.feign.IFactoryDataZbomClient; import com.logpm.oldproject.entity.AdvanceDetailEntity; import com.logpm.oldproject.feign.IAdvanceClient; import com.logpm.oldproject.feign.IAdvanceDetailClient; import com.logpm.oldproject.feign.IOrderDetailClient; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.LogpmAsync; import org.springblade.common.utils.CommonUtil; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.api.R; @@ -46,6 +48,7 @@ public class ZbFactoryDataServiceImpl implements IZbFactoryDataService { private final IPackageInfoService packageInfoService; private final ZbFactoryProperties zbFactoryProperties; private final IZbOrderLogService zbOrderLogService; + private final IFactoryDataZbomClient zbomClient; @Override public Long saveData(ZBReceiptDTO zbReceiptDTO) { @@ -218,6 +221,12 @@ public class ZbFactoryDataServiceImpl implements IZbFactoryDataService { } } + @Override + @LogpmAsync("asyncExecutor") + public void saveDataNew(ZBReceiptDTO zbReceiptDTO) { + zbomClient.order(JSONObject.toJSONString(zbReceiptDTO)); + } + private String getZbUrl(String url, Map params, String sign) { String[] keys = params.keySet().toArray(new String[0]); diff --git a/blade-service/logpm-factory/src/main/resources/application-dev.yml b/blade-service/logpm-factory/src/main/resources/application-dev.yml index 457330ce2..a9a180282 100644 --- a/blade-service/logpm-factory/src/main/resources/application-dev.yml +++ b/blade-service/logpm-factory/src/main/resources/application-dev.yml @@ -39,7 +39,7 @@ spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: diff --git a/blade-service/logpm-factory/src/main/resources/application-prod.yml b/blade-service/logpm-factory/src/main/resources/application-prod.yml index 195d18c4c..4a8010913 100644 --- a/blade-service/logpm-factory/src/main/resources/application-prod.yml +++ b/blade-service/logpm-factory/src/main/resources/application-prod.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -25,10 +25,10 @@ spring: url: ${blade.datasource.factory.master.url} username: ${blade.datasource.factory.master.username} password: ${blade.datasource.factory.master.password} - slave: - url: ${blade.datasource.factory.slave.url} - username: ${blade.datasource.factory.slave.username} - password: ${blade.datasource.factory.slave.password} + 627683: + url: ${blade.datasource.factory.627683.url} + username: ${blade.datasource.factory.627683.username} + password: ${blade.datasource.factory.627683.password} #rabbitmq配置 rabbitmq: host: 172.16.128.145 diff --git a/blade-service/logpm-factory/src/main/resources/application-test.yml b/blade-service/logpm-factory/src/main/resources/application-test.yml index 1481bd319..348d9dd38 100644 --- a/blade-service/logpm-factory/src/main/resources/application-test.yml +++ b/blade-service/logpm-factory/src/main/resources/application-test.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -25,10 +25,10 @@ spring: url: ${blade.datasource.factory.master.url} username: ${blade.datasource.factory.master.username} password: ${blade.datasource.factory.master.password} - slave: - url: ${blade.datasource.factory.slave.url} - username: ${blade.datasource.factory.slave.username} - password: ${blade.datasource.factory.slave.password} + 627683: + url: ${blade.datasource.factory.627683.url} + username: ${blade.datasource.factory.627683.username} + password: ${blade.datasource.factory.627683.password} #rabbitmq配置 rabbitmq: host: 192.168.2.110 diff --git a/blade-service/logpm-factory/src/main/resources/application.yml b/blade-service/logpm-factory/src/main/resources/application.yml index 245dc4cfd..6ccf9fc90 100644 --- a/blade-service/logpm-factory/src/main/resources/application.yml +++ b/blade-service/logpm-factory/src/main/resources/application.yml @@ -22,11 +22,8 @@ oss: #blade配置 blade: - #本地文件上传 - file: - remote-mode: true - upload-domain: http://localhost:8999 - remote-path: /usr/share/nginx/html + data-scope: + enabled: false logging: config: classpath:logback.xml diff --git a/blade-service/logpm-factory/src/test/java/com/logpm/factory/TestService.java b/blade-service/logpm-factory/src/test/java/com/logpm/factory/TestService.java index 48384537e..e42abf179 100644 --- a/blade-service/logpm-factory/src/test/java/com/logpm/factory/TestService.java +++ b/blade-service/logpm-factory/src/test/java/com/logpm/factory/TestService.java @@ -1,6 +1,8 @@ package com.logpm.factory; import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.ExcelReader; @@ -10,9 +12,12 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.MD5Utils; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.fasterxml.jackson.databind.ObjectMapper; import com.logpm.distribution.entity.DistributionParcelListEntity; import com.logpm.distribution.feign.IDistributionParcelListClient; import com.logpm.factory.comfac.dto.OrderStatusDTO; @@ -21,7 +26,9 @@ import com.logpm.factory.excel.JpDataMode; import com.logpm.factory.excel.OrderStatusLogMode; import com.logpm.factory.listener.ExcelListener; import com.logpm.factory.listener.OrderStatusLogListener; +import com.logpm.factory.mt.dto.MtFactoryDataDTO; import com.logpm.factory.mt.feign.IMtOrderMainClinet; +import com.logpm.factory.mt.service.IMtFactoryOrderMainService; import com.logpm.factory.oupai.entity.FactoryOrderEntity; import com.logpm.factory.oupai.entity.FactoryPackageEntity; import com.logpm.factory.oupai.entity.OpOrderStatusLogEntity; @@ -33,6 +40,7 @@ import com.logpm.factory.oupai.vo.OuPaiDataPushVO; import com.logpm.factory.pan.service.IPanFactoryDataService; import com.logpm.factory.props.ZbFactoryProperties; import com.logpm.factory.snm.bean.Resp; +import com.logpm.factory.snm.vo.MTOrderPackageRelationVO; import com.logpm.factory.zb.dto.ZBReceiptDTO; import com.logpm.factory.zb.entity.ZbFactoryLogEntity; import com.logpm.factory.zb.mapper.ZbCategoryContrastMapper; @@ -67,12 +75,14 @@ import org.springframework.http.MediaType; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile; +import javax.crypto.spec.PSource; import java.io.*; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static com.logpm.factory.zb.untils.QmSignUntil.areNotEmpty; @@ -93,7 +103,7 @@ public class TestService { private IOssClient ossClient; @Autowired - private IZbFactoryDataService zbFactoryDataService; + private IZbFactoryDataService zbFactoryDataService; @Autowired @@ -110,6 +120,10 @@ public class TestService { @Autowired private ZbCategoryContrastMapper zbCategoryContrastMapper; + + @Autowired + private IMtFactoryOrderMainService mtFactoryOrderMainService; + @Test public void test2() { // ouPaiFactoryService.findOuPaiFactoryOrderDTOByCarCarNumber("LCD230505047"); @@ -158,6 +172,7 @@ public class TestService { ls.add(jpDataMode); } +// DynamicDataSourceContextHolder EasyExcel.write("F:\\11.xlsx").sheet("sheet1").doWrite(ls); @@ -232,7 +247,7 @@ public class TestService { OpOrderStatusLogEntity orderStatusLog = new OpOrderStatusLogEntity(); //上传到服务器 - R r = ossClient.fileUpload(multi,"op-logs"); + R r = ossClient.fileUpload(multi, "op-logs"); if (r.isSuccess()) { BladeFile data = (BladeFile) r.getData(); orderStatusLog.setResponseUrl(data.getLink()); @@ -244,13 +259,13 @@ public class TestService { @Test - public void test5(){ + public void test5() { // String s = oldLogin("", 30); // System.out.println(s); QueryWrapper warehouseQueryWrapper = new QueryWrapper(); - warehouseQueryWrapper.eq("code","P00842309083496137"); + warehouseQueryWrapper.eq("code", "P00842309083496137"); FactoryPackageEntity packageEntity = factoryPackageService.getOne(warehouseQueryWrapper); @@ -258,7 +273,7 @@ public class TestService { } - private String oldLogin(String name, Integer warhouseId) { + private String oldLogin(String name, Integer warhouseId) { Map map = new HashMap<>(); map.put("pwd", "huitongys-2022"); map.put("user_id", 1080); @@ -304,7 +319,7 @@ public class TestService { } @Test - public void test6(){ + public void test6() { BladeRedis bean = SpringUtil.getBean(BladeRedis.class); @@ -323,7 +338,6 @@ public class TestService { assert false; - } @Test @@ -351,8 +365,7 @@ public class TestService { } @Test - public void test8(){ - + public void test8() { JSON json = JSON.parseObject("{\"carNumber\":\"\",\"companyCode\":\"zbom\",\"departCode\":\"880359\",\"details\":[{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"15\",\"packageClass\":\"线性包装\",\"packageCode\":\"1523090071264\",\"packageName\":\"\",\"packageType\":\"XX\",\"packageTypeName\":\"线性\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"19\",\"packageClass\":\"线性包装\",\"packageCode\":\"1523090072230\",\"packageName\":\"\",\"packageType\":\"XX\",\"packageTypeName\":\"线性\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"15\",\"packageClass\":\"五金包装\",\"packageCode\":\"1423090661395\",\"packageName\":\"\",\"packageType\":\"WJ\",\"packageTypeName\":\"五金\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"13\",\"packageClass\":\"五金包装\",\"packageCode\":\"1423090661400\",\"packageName\":\"\",\"packageType\":\"WJ\",\"packageTypeName\":\"五金\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"14\",\"packageClass\":\"五金包装\",\"packageCode\":\"1423090661406\",\"packageName\":\"\",\"packageType\":\"WJ\",\"packageTypeName\":\"五金\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"3\",\"packageClass\":\"箱体包装\",\"packageCode\":\"1423090691859\",\"packageName\":\"1423090691859\",\"packageType\":\"XB\",\"packageTypeName\":\"标准板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"1\",\"packageClass\":\"箱体包装\",\"packageCode\":\"1423090691952\",\"packageName\":\"1423090691952\",\"packageType\":\"XB\",\"packageTypeName\":\"标准板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"2\",\"packageClass\":\"箱体包装\",\"packageCode\":\"1423090692021\",\"packageName\":\"1423090692021\",\"packageType\":\"XB\",\"packageTypeName\":\"标准板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"5\",\"packageClass\":\"饰面门板包装\",\"packageCode\":\"1623090473497\",\"packageName\":\"1623090473497\",\"packageType\":\"MB\",\"packageTypeName\":\"门板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"7\",\"packageClass\":\"饰面门板包装\",\"packageCode\":\"1623090473505\",\"packageName\":\"1623090473505\",\"packageType\":\"MB\",\"packageTypeName\":\"门板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"4\",\"packageClass\":\"饰面门板包装\",\"packageCode\":\"1623090473510\",\"packageName\":\"1623090473510\",\"packageType\":\"MB\",\"packageTypeName\":\"门板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"6\",\"packageClass\":\"饰面门板包装\",\"packageCode\":\"1623090473518\",\"packageName\":\"1623090473518\",\"packageType\":\"MB\",\"packageTypeName\":\"门板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"3\",\"packageClass\":\"饰面门板包装\",\"packageCode\":\"1423090658966\",\"packageName\":\"1423090658966\",\"packageType\":\"MB\",\"packageTypeName\":\"门板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"15\",\"packageClass\":\"台面包装\",\"packageCode\":\"1523090070679\",\"packageName\":\"\",\"packageType\":\"TM\",\"packageTypeName\":\"台面\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"18\",\"packageClass\":\"台面包装\",\"packageCode\":\"1523090070680\",\"packageName\":\"\",\"packageType\":\"TM\",\"packageTypeName\":\"台面\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"16\",\"packageClass\":\"台面包装\",\"packageCode\":\"1523090070681\",\"packageName\":\"\",\"packageType\":\"TM\",\"packageTypeName\":\"台面\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"17\",\"packageClass\":\"台面包装\",\"packageCode\":\"1523090070682\",\"packageName\":\"\",\"packageType\":\"TM\",\"packageTypeName\":\"台面\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"12\",\"packageClass\":\"箱体包装\",\"packageCode\":\"1423090693442\",\"packageName\":\"1423090693442\",\"packageType\":\"XT\",\"packageTypeName\":\"非标板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"7\",\"packageClass\":\"箱体包装\",\"packageCode\":\"1423090693444\",\"packageName\":\"1423090693444\",\"packageType\":\"XT\",\"packageTypeName\":\"非标板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"9\",\"packageClass\":\"箱体包装\",\"packageCode\":\"1423090693445\",\"packageName\":\"1423090693445\",\"packageType\":\"XT\",\"packageTypeName\":\"非标板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"11\",\"packageClass\":\"箱体包装\",\"packageCode\":\"1423090693446\",\"packageName\":\"1423090693446\",\"packageType\":\"XT\",\"packageTypeName\":\"非标板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"8\",\"packageClass\":\"箱体包装\",\"packageCode\":\"1423090693447\",\"packageName\":\"1423090693447\",\"packageType\":\"XT\",\"packageTypeName\":\"非标板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"10\",\"packageClass\":\"箱体包装\",\"packageCode\":\"1423090694754\",\"packageName\":\"1423090694754\",\"packageType\":\"XT\",\"packageTypeName\":\"非标板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"13\",\"packageClass\":\"箱体包装\",\"packageCode\":\"1423090691972\",\"packageName\":\"1423090691972\",\"packageType\":\"XT\",\"packageTypeName\":\"非标板\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"20\",\"packageClass\":\"16.1603.01\",\"packageCode\":\"1423090719955\",\"packageName\":\"\",\"packageType\":\"SP\",\"packageTypeName\":\"商品\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"},{\"custOrderCode\":\"10423273871\",\"customerCode\":\"F131148\",\"customerName\":\"宁晋县旭润建筑装饰工程有限公司\",\"customizedFlag\":\"Y\",\"inventoryStatus\":\"ZP\",\"items\":[],\"legacyFlag\":\"N\",\"lineNo\":\"19\",\"packageClass\":\"16.1604.01\",\"packageCode\":\"1423090719956\",\"packageName\":\"\",\"packageType\":\"SP\",\"packageTypeName\":\"商品\",\"planQty\":\"1.0000\",\"platformOrderCode\":\"宁晋拎包样202309006\",\"qhFlag\":\"Y\",\"qtFlag\":\"Y\",\"receiverAddress\":\"燕南8栋1单元1702室\",\"receiverMobile\":\"女士\",\"receiverName\":\"女士\",\"relationOrderCode\":\"宁晋拎包样202309006\",\"totalGrossWeight\":\"0.0000\",\"totalVolume\":\"0.000000\"}],\"driverMobile\":\"\",\"driverName\":\"\",\"emptyFlag\":\"N\",\"expectEndTime\":\"\",\"expectStartTime\":\"\",\"orderType\":\"RK\",\"senderAddress\":\"安徽省合肥市长丰县淮南北路1号\",\"senderCity\":\"合肥市\",\"senderDistrict\":\"长丰县\",\"senderMobile\":\"\",\"senderName\":\"\",\"senderProvince\":\"安徽省\",\"senderTel\":\"\",\"senderTow\":\"\",\"taskCode\":\"230928000001\",\"vendorCode\":\"AD-0001\",\"vendorName\":\"安东物流\",\"warehouseCode\":\"HTWL-WH\"}"); @@ -407,12 +420,9 @@ public class TestService { public void test11() throws NoSuchAlgorithmException { - - List ahsv = new ArrayList<>(); - ahsv.add("{\n" + " \"送货任务ID\": \"238770\",\n" + " \"收货人\": \"罗敏\",\n" + @@ -541,10 +551,9 @@ public class TestService { "}"); - for (String s : ahsv) { - String url="http://www.mengtian.cn/ZXCFaHuoDan/QianShouDanNew"; + String url = "http://www.mengtian.cn/ZXCFaHuoDan/QianShouDanNew"; String appkey = "HuiTong"; String appsecret = "HT20230822140820"; String userid = "5003"; @@ -553,10 +562,6 @@ public class TestService { // String data ="{\"送货任务ID\":\"209813\",\"收货人\":\"普布旺堆\",\"签收内容\":[{\"订单编号\":\"scmhzs01DS-20761-0\",\"包条码\":\"SCMHZS01DS207610001\",\"签收时间\":\"2023-10-26 15:21:40\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231039\"},{\"订单编号\":\"scmhzs01DS-20761-0\",\"包条码\":\"SCMHZS01DS207610002\",\"签收时间\":\"2023-10-26 15:21:40\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231039\"},{\"订单编号\":\"scmhzs01DS-20761-0\",\"包条码\":\"SCMHZS01DS207610003\",\"签收时间\":\"2023-10-26 15:21:40\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231039\"},{\"订单编号\":\"scmhzs01DS-20761-0\",\"包条码\":\"SCMHZS01DS207610004\",\"签收时间\":\"2023-10-26 15:21:40\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231039\"},{\"订单编号\":\"scmhzs01DS-20761-0\",\"包条码\":\"SCMHZS01DS207610005\",\"签收时间\":\"2023-10-26 15:21:40\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231039\"},{\"订单编号\":\"scmhzs01DS-20761-0\",\"包条码\":\"SCMHZS01DS207610006\",\"签收时间\":\"2023-10-26 15:21:40\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231039\"}],\"签收图片\":[{\"image\":\"http://htys.oss-cn-chengdu.aliyuncs.com/htys/5b27cda3fdb3d27effd13c67a6407ad6.jpg\"},{\"image\":\"http://htys.oss-cn-chengdu.aliyuncs.com/htys/0de936689aee8cd93ab2ecdcdbdb818f.jpg\"},{\"image\":\"http://htys.oss-cn-chengdu.aliyuncs.com/htys/4d448ca10b1a84c810b81c4cc52a9df2.jpg\"}]}"; - - - - // String data ="{\"送货任务ID\":\"209826\",\"收货人\":\"陈洁\",\"签收内容\":[{\"订单编号\":\"scxblzs01DS-20178-0\",\"包条码\":\"SCXBLZS01DS201780001\",\"签收时间\":\"2023-10-26 15:19:14\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231016\"},{\"订单编号\":\"scxblzs01DS-20178-0\",\"包条码\":\"SCXBLZS01DS201780002\",\"签收时间\":\"2023-10-26 15:19:14\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231016\"},{\"订单编号\":\"scxblzs01DS-20178-0\",\"包条码\":\"SCXBLZS01DS201780003\",\"签收时间\":\"2023-10-26 15:19:14\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231016\"},{\"订单编号\":\"scxblzs01DS-20178-0\",\"包条码\":\"SCXBLZS01DS201780004\",\"签收时间\":\"2023-10-26 15:19:14\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231016\"},{\"订单编号\":\"scxblzs01DS-20178-0\",\"包条码\":\"SCXBLZS01DS201780005\",\"签收时间\":\"2023-10-26 15:19:14\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231016\"},{\"订单编号\":\"scxblzs01DS-20178-0\",\"包条码\":\"SCXBLZS01DS201780006\",\"签收时间\":\"2023-10-26 15:19:14\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231016\"},{\"订单编号\":\"scxblzs01DS-20178-0\",\"包条码\":\"SCXBLZS01DS201780007\",\"签收时间\":\"2023-10-26 15:19:14\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231016\"},{\"订单编号\":\"scxblzs01DS-20178-0\",\"包条码\":\"SCXBLZS01DS201780008\",\"签收时间\":\"2023-10-26 15:19:14\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231016\"},{\"订单编号\":\"scxblzs01DS-20178-0\",\"包条码\":\"SCXBLZS01DS201780009\",\"签收时间\":\"2023-10-26 15:19:14\",\"仓库编号\":\"CDZXC3\",\"作业仓库\":\"成都中心仓(汇通)\",\"发货单编号\":\"HYLEJIA-231016\"}],\"签收图片\":[{\"image\":\"http://htys.oss-cn-chengdu.aliyuncs.com/htys/d087dde59e2d8bebe7e9190fb60ca895.jpg\"},{\"image\":\"http://htys.oss-cn-chengdu.aliyuncs.com/htys/9758dab686a42f895cd2fecab30cd33f.jpg\"},{\"image\":\"http://htys.oss-cn-chengdu.aliyuncs.com/htys/23b2075a896169601f3013e552d42b2b.jpg\"}]}"; String token = "godvWfaLz1PCjyf8dSlBGPh6z/t/h3FNPKMc9+x9sW9IGTQsQJa6t/fpX15Dbw13jI99odr1yHxAoI4iaCaH3csaPKRG/N6bR2bBrpGppbQ="; @@ -567,7 +572,7 @@ public class TestService { .header("USERID", userid) .header("USERPWD", MD5Utils.md5Hex(userpwd.getBytes(StandardCharsets.UTF_8))) .header("Content-Type", "application/json") - .body(s).timeout(10* 1000) + .body(s).timeout(10 * 1000) .execute().body(); // 保存数据到数据库 @@ -588,16 +593,9 @@ public class TestService { } - } - - - - - - } @Test @@ -623,27 +621,26 @@ public class TestService { JSONArray arrag = object.getJSONArray("RECORDS"); Map params = new HashMap<>(); - params.put("app_key",zbFactoryProperties.getAppKey()); - params.put("customerId",zbFactoryProperties.getCustomerid()); - params.put("format","json"); - params.put("method","entry.order.confirm"); - params.put("sign_method","md5"); + params.put("app_key", zbFactoryProperties.getAppKey()); + params.put("customerId", zbFactoryProperties.getCustomerid()); + params.put("format", "json"); + params.put("method", "entry.order.confirm"); + params.put("sign_method", "md5"); params.put("timestamp", CommonUtil.dateToStringGeneral(new Date())); - params.put("v","1.0"); + params.put("v", "1.0"); for (int i = 0; i < arrag.size(); i++) { String unitNo = arrag.getJSONObject(i).getString("ref_code"); - JSONObject result = JSONObject.parseObject(arrag.getJSONObject(i).getString("req_args")); + JSONObject result = JSONObject.parseObject(arrag.getJSONObject(i).getString("req_args")); String body = result.toJSONString(); String s = body.replaceAll("\\s+", ""); String sign = QmSignUntil.signTopRequest(params, zbFactoryProperties.getSecretkey(), "md5", s); - String url = getZbUrl(zbFactoryProperties.getUrl()+"/api/edi/ots/in?",params,sign); + String url = getZbUrl(zbFactoryProperties.getUrl() + "/api/edi/ots/in?", params, sign); R r = sendZbFactoryData(url, body, 1, unitNo); } - // JSONObject result = new JSONObject(); // result.put("taskCode",receiptEntity.getTaskCode()); // result.put("companyCode",receiptEntity.getCompanyCode()); @@ -654,19 +651,10 @@ public class TestService { // result.put("details",detailsArray); - - - - - // R r = sendZbFactoryData(url, body, 1, unitNo); } - - - - private String getZbUrl(String url, Map params, String sign) { String[] keys = params.keySet().toArray(new String[0]); @@ -685,7 +673,8 @@ public class TestService { stringBuilder.append("sign=").append(sign); return stringBuilder.toString(); } - private R sendZbFactoryData(String url, String data, Integer type,String refCode) throws NoSuchAlgorithmException { + + private R sendZbFactoryData(String url, String data, Integer type, String refCode) throws NoSuchAlgorithmException { //处理逻辑 @@ -713,7 +702,7 @@ public class TestService { @Test - public void test13(){ + public void test13() { // QueryWrapper queryWrapper = new QueryWrapper<>(); // queryWrapper.eq("source_code","17.1701.01"); @@ -722,22 +711,19 @@ public class TestService { // System.out.println(zbCategoryContrastEntity); - String [] args ={"15.1501.02" , + String[] args = {"15.1501.02", "J.J02.02", - "180门板包装" + "180门板包装" }; for (String arg : args) { Pattern pattern = Pattern.compile("[\\p{InCJK Unified Ideographs}&&\\P{InCJK Compatibility Ideographs}]+"); Matcher matcher = pattern.matcher(arg); - boolean bl= matcher.find(); + boolean bl = matcher.find(); System.out.println(bl); } - - - } @@ -821,7 +807,6 @@ public class TestService { // } - } @@ -845,12 +830,12 @@ public class TestService { JSONArray arrag = object.getJSONArray("value"); for (int i = 0; i < arrag.size(); i++) { - String sql ="update op_factory_order set business_model='opA' where shop_code= 'opB'"; + String sql = "update op_factory_order set business_model='opA' where shop_code= 'opB'"; JSONObject jsonObject = arrag.getJSONObject(i); - String code =jsonObject.getString("Code"); - String businessModel =jsonObject.getString("BusinessModel"); + String code = jsonObject.getString("Code"); + String businessModel = jsonObject.getString("BusinessModel"); String replace = sql.replace("opA", businessModel).replace("opB", code); System.out.println(replace); @@ -858,12 +843,10 @@ public class TestService { } - - } @Test - public void test16(){ + public void test16() { // 获取字典上配置的不 @@ -879,9 +862,7 @@ public class TestService { } - - - public static Boolean readExcel(InputStream is, Class clazz){ + public static Boolean readExcel(InputStream is, Class clazz) { BufferedInputStream bis = null; try { bis = new BufferedInputStream(is); @@ -909,23 +890,19 @@ public class TestService { * 补退数据 */ @Test - public void test17(){ + public void test17() { // 解析 Excel - String file ="D:\\data\\工作文件\\slwk\\软件项目\\hyw\\新带解析数据1.3.xlsx"; - - EasyExcel.read(file, OrderStatusLogMode.class, new OrderStatusLogListener()).sheet("Sheet1").doRead(); - - - + String file = "D:\\data\\工作文件\\slwk\\软件项目\\hyw\\新带解析数据1.3.xlsx"; + EasyExcel.read(file, OrderStatusLogMode.class, new OrderStatusLogListener()).sheet("Sheet1").doRead(); } @Test - public void test18(){ + public void test18() { // 本地测试 推送服务器 /** @@ -945,14 +922,15 @@ public class TestService { ouPaiFactoryDataService.saveData(ouPaiDataPushVO); - } + @Autowired private IDistributionParcelListClient distributionParcelListClient; @Autowired private IFactoryOrderService factoryOrderService; + @Test - public void test19(){ + public void test19() { OrderStatusDTO orderStatusDTO = new OrderStatusDTO(); orderStatusDTO.setStatus("7"); //状态 orderStatusDTO.setUnitNo("P0041231007B673609"); //包件码 @@ -973,11 +951,10 @@ public class TestService { } - //继续判断是否到达目的仓 String currentWarehouseId = orderStatusDTO.getCurrentWarehouse();//当前仓Id //查询destinationWarehouse logiBillNo plantId数据 - System.out.println("log.info(\"oupai-handleStatusData >>> unitNo={}\", );"+unitNo); + System.out.println("log.info(\"oupai-handleStatusData >>> unitNo={}\", );" + unitNo); // Map supplyData = advanceDetailClient.getSupplyData(unitNo); DistributionParcelListEntity distributionParcelList = new DistributionParcelListEntity(); distributionParcelList.setOrderPackageCode(orderStatusDTO.getUnitNo()); @@ -988,7 +965,7 @@ public class TestService { } String destinationWarehouseId = String.valueOf(distributionParcelListEntity.getData().getAcceptWarehouseId());//目的仓id if (StringUtil.isBlank(currentWarehouseId) || StringUtil.isBlank(destinationWarehouseId)) { - System.out.println("\t\t\tlog.warn(\"##############oupai-handleStatusData: 仓库数据有问题currentWarehouseId={} destinationWarehouseId={}"+currentWarehouseId+" destinationWarehouseId="+destinationWarehouseId); + System.out.println("\t\t\tlog.warn(\"##############oupai-handleStatusData: 仓库数据有问题currentWarehouseId={} destinationWarehouseId={}" + currentWarehouseId + " destinationWarehouseId=" + destinationWarehouseId); // return Resp.fail(400, "仓库数据有误"); } @@ -1002,6 +979,212 @@ public class TestService { System.out.println(factoryOrder); // return Resp.success("成功"); } + + +// public static void main(String[] args) { +// +// +// List t = new ArrayList<>(); +// +// t.add(1L); +// t.add(2L); +// t.add(3L); +// t.add(4L); +// t.add(5L); +// t.add(6L); +// t.add(7L); +// t.add(8L); +// t.add(9L); +// t.add(10L); +// +// +// int num = t.size() % 4; +// +// +// for (int i = 0; i <= num; i++) { +// List sss; +// if(i==num){ +// sss=t.subList(i * 4, t.size()); +// }else{ +// sss = t.subList(i * 4, (i + 1) * 4); +// } +// System.out.println(sss); +// +// } +// +// +// } + + public void test210 (){ + + StringBuilder sb = new StringBuilder("{\"centerWarehouseCode\":\"CDZXC3\",\"centerWarehouseName\":\"成都中心仓(汇通)\",\"invoiceOrderCode\":\"HYJIASHAN-240512\",\"orderList\":[{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金沙湖畔3-1-0704\",\"customName\":\"谢磊\",\"customPhone\":\"13678008438\",\"dealerCode\":\"cdsdzsDS\",\"dealerName\":\"成都山顶装饰有限公司\",\"exclusiveCode\":\"cdsdzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdsdzs01DS-240418019\",\"orderCode\":\"cdsdzs01DS-20039-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404238516\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050181\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"凉山彝族自治州/西昌市 邛海1号院 3-2-801\",\"customName\":\"罗家驹\",\"customPhone\":\"15281088828\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240425078\",\"orderCode\":\"cdxjszs01DS-20159-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404226595\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048505\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"重庆市/潼南区 锦绣观澜 3-1901 \",\"customName\":\"傅友恒/付永贵\",\"customPhone\":\"15228989825\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240420071\",\"orderCode\":\"cdxjszs01DS-20161-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404238514\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049862\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"广安市/邻水县 邦泰御府 3-303\",\"customName\":\"刘亮\",\"customPhone\":\" 13330621326\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240428085\",\"orderCode\":\"cdxjszs01DS-20164-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404238490\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049990\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"南充市/阆中市 滨江壹号 7栋1单元2204 \",\"customName\":\"李玉祥\",\"customPhone\":\"18081558001\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240428086\",\"orderCode\":\"cdxjszs01DS-20166-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404238486\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050003\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\" 四川省/成都市/彭州市 丽府兰台 5-2-202 \",\"customName\":\"胡海鹰 \",\"customPhone\":\" 13551150232\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240428088\",\"orderCode\":\"cdxjszs01DS-20168-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404238503\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050023\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/眉山市/仁寿县 璟樾云山 5-2-701 \",\"customName\":\"黄林英 \",\"customPhone\":\" 13882294071\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240428087\",\"orderCode\":\"cdxjszs01DS-20170-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000011\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050161\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/德阳市/什邡市 星坤雍城 17-2-602\",\"customName\":\"唐俊\",\"customPhone\":\" 18384286614\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240429091\",\"orderCode\":\"cdxjszs01DS-20172-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000007\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050499\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/德阳市/绵竹市 英伦城邦 22-2-401\",\"customName\":\"黄道华\",\"customPhone\":\" 18384286614\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240429090\",\"orderCode\":\"cdxjszs01DS-20174-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000005\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050505\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/绵阳市/涪城区 远大蔚蓝海岸 12-2-1203\",\"customName\":\"邓若兰\",\"customPhone\":\" 13348888883\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240429089\",\"orderCode\":\"cdxjszs01DS-20176-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000012\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050518\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/成都市/新都区 康怡嘉苑 6-2-1203 \",\"customName\":\"刘鑫\",\"customPhone\":\" 13908081160\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240429092\",\"orderCode\":\"cdxjszs01DS-20178-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000002\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050529\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/乐山市/井研县 领丰公园墅 6-1-1805\",\"customName\":\"廖文君\",\"customPhone\":\" 13881321121\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240429093\",\"orderCode\":\"cdxjszs01DS-20180-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000009\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050565\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"新都区 保利狮子湖檀香郡 2-2-201 \",\"customName\":\"周曼\",\"customPhone\":\"13540454984\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240430094\",\"orderCode\":\"cdxjszs01DS-20182-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000008\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051236\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"/乐山市/井研县 领丰公园墅 7-1-1705\",\"customName\":\"雷春梦\",\"customPhone\":\" 13881321121\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240430095\",\"orderCode\":\"cdxjszs01DS-20184-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000003\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051352\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/乐山市/市中区 铂金汇 1-1-504 \",\"customName\":\"李会容\",\"customPhone\":\"18227688699\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240430096\",\"orderCode\":\"cdxjszs01DS-20186-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019505\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051469\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区 蜀镇尚楠湾14-1104\",\"customName\":\"陈志勇\",\"customPhone\":\"18328357560\",\"dealerCode\":\"cdyszsDS\",\"dealerName\":\"成都原树装饰工程有限公司\",\"exclusiveCode\":\"cdyszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdyszs01DS-240419011\",\"orderCode\":\"cdyszs01DS-20032-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404220107\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048088\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区 慕和南道1-2-1001\",\"customName\":\"李沁\",\"customPhone\":\"13540674509\",\"dealerCode\":\"cdyszsDS\",\"dealerName\":\"成都原树装饰工程有限公司\",\"exclusiveCode\":\"cdyszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdyszs01DS-240419012\",\"orderCode\":\"cdyszs01DS-20033-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000032\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051027\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天府二街 凤凰城一期3-2-2303\",\"customName\":\"丁云\",\"customPhone\":\"13350090770\",\"dealerCode\":\"cdyszsDS\",\"dealerName\":\"成都原树装饰工程有限公司\",\"exclusiveCode\":\"cdyszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdyszs01DS-240424015\",\"orderCode\":\"cdyszs01DS-20035-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019518\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051965\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"武侯区 新光社区文景苑27-7-5\",\"customName\":\"包光均\",\"customPhone\":\"15982272803\",\"dealerCode\":\"cdyszsDS\",\"dealerName\":\"成都原树装饰工程有限公司\",\"exclusiveCode\":\"cdyszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdyszs01DS-240424014\",\"orderCode\":\"cdyszs01DS-20037-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019511\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051966\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天府滨江湾2-1-3002\",\"customName\":\"杨欣\",\"customPhone\":\"13540674509\",\"dealerCode\":\"cdyszsDS\",\"dealerName\":\"成都原树装饰工程有限公司\",\"exclusiveCode\":\"cdyszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdyszs01DS-240430017\",\"orderCode\":\"cdyszs01DS-20039-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019504\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051970\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"合能铂悦华庭 6栋1单元1401室 \",\"customName\":\"邹高才\",\"customPhone\":\"17502836393\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240418243\",\"orderCode\":\"qjdszx01DS-20443-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218124\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049654\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天府公园观澜9号澜岸 8栋2单元301室\",\"customName\":\"陈祖芳\",\"customPhone\":\"15388193720\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240413241\",\"orderCode\":\"qjdszx01DS-20445-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218123\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049655\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"国色天乡庆典城 6栋2单元201室 \",\"customName\":\"高广峰\",\"customPhone\":\"13608200842\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240411238\",\"orderCode\":\"qjdszx01DS-20447-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218188\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049656\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"清逸苑 2栋1单元5楼13号室 \",\"customName\":\"帅仕才\",\"customPhone\":\"13688091149\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240407221\",\"orderCode\":\"qjdszx01DS-20449-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239886\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049657\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"清江大厦 1栋1单元2002室\",\"customName\":\"李湘如\",\"customPhone\":\"13688091149\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240313167\",\"orderCode\":\"qjdszx01DS-20451-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239885\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049658\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"时代豪庭一期 2栋1单元2403室\",\"customName\":\"李海荣\",\"customPhone\":\"13699076129\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240407223\",\"orderCode\":\"qjdszx01DS-20454-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218201\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049742\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"仁寿黑龙滩印象中铁时光城 5栋1单元1005室\",\"customName\":\"杜毅\",\"customPhone\":\"13408543681\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240313175\",\"orderCode\":\"qjdszx01DS-20456-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218200\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049779\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区清江大厦 1栋1单元1101室 \",\"customName\":\"蒋能明\",\"customPhone\":\"13688091149\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428266\",\"orderCode\":\"qjdszx01DS-20458-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239879\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049792\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"滨江郦城 18栋1单元2703室\",\"customName\":\"廖勇刚\",\"customPhone\":\"17308037978\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428267\",\"orderCode\":\"qjdszx01DS-20460-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239876\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049798\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"水郡未来城二期 9栋1单元903室 \",\"customName\":\"上官苏丹\",\"customPhone\":\" 18428375685\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428269\",\"orderCode\":\"qjdszx01DS-20462-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239873\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049800\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"水郡未来城二期 10栋1单元1705室\",\"customName\":\"熊小英\",\"customPhone\":\" 18428375685\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428268\",\"orderCode\":\"qjdszx01DS-20464-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239883\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049808\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"崇州观山 53栋3室 \",\"customName\":\"杨淼\",\"customPhone\":\"19960767610\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240322197\",\"orderCode\":\"qjdszx01DS-20466-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239880\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049855\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"水郡未来城一期 7栋1单元2904室\",\"customName\":\"牛红燕\",\"customPhone\":\" 18428375685\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428271\",\"orderCode\":\"qjdszx01DS-20468-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239878\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049869\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"滨江郦城 64栋1单元1902室\",\"customName\":\"李会蓉 \",\"customPhone\":\"18782038358\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428270\",\"orderCode\":\"qjdszx01DS-20470-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239881\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049875\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"川大望江校区新南村 58栋2单元421室\",\"customName\":\"胡静\",\"customPhone\":\" 15208383493\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240321188\",\"orderCode\":\"qjdszx01DS-20472-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239884\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050609\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"高盛公馆 1栋4单元1004室 \",\"customName\":\"徐长路\",\"customPhone\":\"15828177643\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240419254\",\"orderCode\":\"qjdszx01DS-20474-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019513\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051479\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"清江大厦 1栋1单元802室\",\"customName\":\"曾亚东\",\"customPhone\":\"13688091149\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240430275\",\"orderCode\":\"qjdszx01DS-20476-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019503\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051500\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"清水路苑 54栋2单元903室 \",\"customName\":\"黄富华\",\"customPhone\":\"15378380828\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240402211\",\"orderCode\":\"qjdszx01DS-20478-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405022271\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH052692\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"人居东苑E区 1-1-1703\",\"customName\":\"杜仕静\",\"customPhone\":\"16608053536\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240418247\",\"orderCode\":\"qjdszx01DS-20480-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405022240\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH052706\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"锦利锦悦府 3栋1单元1501室\",\"customName\":\" 王虎\",\"customPhone\":\"16608053536\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240418246\",\"orderCode\":\"qjdszx01DS-20482-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405022241\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH052715\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"彭山区水郡未来城 18栋2单元903室\",\"customName\":\"潘淑君\",\"customPhone\":\"13408543681\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240328203\",\"orderCode\":\"qjdszx01DS-20486-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405022246\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH052746\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"温江区大华水映岛-17栋-2单元-5层-510\",\"customName\":\" 王妍鸿\",\"customPhone\":\"13438330798\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240420192\",\"orderCode\":\"sdzscd01DS-20325-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404201912\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH047853\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"成华区新希望万科知园-A地块6栋-1单元-7层-704\",\"customName\":\"罗程\",\"customPhone\":\"18328625271\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240417183\",\"orderCode\":\"sdzscd01DS-20329-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404201995\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH047882\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"郫都区书香府邸二期英伦-4号楼-1单元-2层-202\",\"customName\":\" 李丰\",\"customPhone\":\"15828021362\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240417185\",\"orderCode\":\"sdzscd01DS-20337-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000037\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048020\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"雅居乐十里花巷-8号楼-0单元-25层-2501\",\"customName\":\"刘欧\",\"customPhone\":\"17761227867\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240415177\",\"orderCode\":\"sdzscd01DS-20341-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404201990\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048199\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"武侯区美洲花园棕榈湾-117号楼-2单元-22层-2204\",\"customName\":\"来文瀚\",\"customPhone\":\"13548121286\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240418188\",\"orderCode\":\"sdzscd01DS-20343-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404201914\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048202\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双楠悦天地-3号楼-1单元-6层-604\",\"customName\":\"尚凯茜\",\"customPhone\":\"13880887622\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421198\",\"orderCode\":\"sdzscd01DS-20345-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404206690\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048214\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"新都区百郦锦城-1号楼-2单元-28层-2804\",\"customName\":\"许雪婷\",\"customPhone\":\"13981927611\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240422208\",\"orderCode\":\"sdzscd01DS-20349-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000027\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048335\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"锦江区卓锦城-10号楼-1单元-26层-3室\",\"customName\":\"孔祥凯\",\"customPhone\":\"13540099091\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240417181\",\"orderCode\":\"sdzscd01DS-20351-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404206693\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048340\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区港龙美的未来映-13号-1单元-4层-401\",\"customName\":\"姚树为\",\"customPhone\":\"13981863593\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240417182\",\"orderCode\":\"sdzscd01DS-20353-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404201985\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048355\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区城投置地文园-2号楼-1单元-21层-2102\",\"customName\":\"杨思晗\",\"customPhone\":\"15184399715\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240425223\",\"orderCode\":\"sdzscd01DS-20356-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218122\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048744\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙泉驿区爱情东麓九里-3栋-2单元-4层-401\",\"customName\":\"马寻\",\"customPhone\":\"13808076890\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421197\",\"orderCode\":\"sdzscd01DS-20358-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000035\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049014\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金牛区西宸原著御景-34栋-34栋-32层-3206\",\"customName\":\"钟德超\",\"customPhone\":\"13540225391\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421195\",\"orderCode\":\"sdzscd01DS-20360-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000034\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049047\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"成大花园-20号楼-1单元-9层-902\",\"customName\":\"罗小麟\",\"customPhone\":\"18011506371\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421199\",\"orderCode\":\"sdzscd01DS-20364-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000041\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049057\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金牛区白鸽岛尚-7栋-1单元-11层-1102\",\"customName\":\"郑方舟\",\"customPhone\":\"13402850529\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421200\",\"orderCode\":\"sdzscd01DS-20366-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000031\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049058\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区精城水印阁-1号楼-2单元-17层-1704\",\"customName\":\"吴坤\",\"customPhone\":\"15928682981\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240424212\",\"orderCode\":\"sdzscd01DS-20370-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218113\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049129\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天鹅湖花园-18号楼-1单元-22层-2203\",\"customName\":\"梁希\",\"customPhone\":\"13980726457\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240403136\",\"orderCode\":\"sdzscd01DS-20372-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000038\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049316\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区天邑花园-18号楼-4单元-1层-103\",\"customName\":\"朱勇\",\"customPhone\":\"13699463676\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240315094\",\"orderCode\":\"sdzscd01DS-20374-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000042\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049849\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区天府滨河湾-2幢-2单元-20层-2002\",\"customName\":\"巴宇赫\",\"customPhone\":\"19822913660\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240422204\",\"orderCode\":\"sdzscd01DS-20377-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000026\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050203\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"佳兆业珑樾壹号-11号楼-1单元-1层-102\",\"customName\":\"无\",\"customPhone\":\"18398177944\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240411163\",\"orderCode\":\"sdzscd01DS-20379-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000036\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050208\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区港龙美的未来映-13号楼-2单元-8层-802室\",\"customName\":\"陈亚菲\",\"customPhone\":\"13980710342\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240423209\",\"orderCode\":\"sdzscd01DS-20381-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000024\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050268\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区心怡中丝园-16栋-2单元-23层-2302\",\"customName\":\"雷晨霄\",\"customPhone\":\"13545298230\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240426232\",\"orderCode\":\"sdzscd01DS-20383-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000013\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050277\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"温江区金恒德时代金悦-7号楼-1单元-6层-601\",\"customName\":\"朱雲\",\"customPhone\":\"18180784177\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240422202\",\"orderCode\":\"sdzscd01DS-20385-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000025\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050278\",\"quantity\":\"1\"},"); + sb.append("{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙泉驿区明信雲珑府-3栋-1单元-14层-1404\",\"customName\":\"陈继业\",\"customPhone\":\"18402841944\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421196\",\"orderCode\":\"sdzscd01DS-20387-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000033\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050279\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"融创观玺台花园-6栋-1单元-23层-2304\",\"customName\":\"张臻\",\"customPhone\":\"18782932893\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240419190\",\"orderCode\":\"sdzscd01DS-20389-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000040\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050280\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"成华区城投置地青熙蘭庭-6号楼-1单元-3层-301\",\"customName\":\"杨雨辰\",\"customPhone\":\"13558724993\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240423211\",\"orderCode\":\"sdzscd01DS-20391-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000023\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050343\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"城南名著-B座9号楼-3单元-2层-204\",\"customName\":\"谭燕\",\"customPhone\":\"18280151823\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240422201\",\"orderCode\":\"sdzscd01DS-20393-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000030\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050352\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区港龙美的未来映-6号楼-2单元-11层-1102\",\"customName\":\" 金卉琳\",\"customPhone\":\"18980881437\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240422203\",\"orderCode\":\"sdzscd01DS-20395-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000028\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050363\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"中铁西子香荷-3号楼-1单元-31层-3101\",\"customName\":\"龙志雄\",\"customPhone\":\"13541244746\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240424214\",\"orderCode\":\"sdzscd01DS-20399-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000019\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050470\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区三利麓山城蔚然集-4栋-1单元-27层-2704\",\"customName\":\"刘雨豪\",\"customPhone\":\"18280368884\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240424216\",\"orderCode\":\"sdzscd01DS-20401-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000020\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050517\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"郫都区国宾御府-11号楼-2单元-4层-401室\",\"customName\":\" 张昀皓\",\"customPhone\":\"15928086583\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240412170\",\"orderCode\":\"sdzscd01DS-20403-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000039\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050680\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区优品道三期-35号楼-1单元-9层-903\",\"customName\":\"杜婷\",\"customPhone\":\"15181605713\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240426229\",\"orderCode\":\"sdzscd01DS-20405-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000018\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050765\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金牛区北斗七星城-2号楼-2单元-1层-101\",\"customName\":\"成都育师教培(圣都)补\",\"customPhone\":\"17502807442\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240429246\",\"orderCode\":\"sdzscd01DS-20407-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000006\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050772\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙潭寺TOD龙潭九章-24号楼-2单元-8层-02室\",\"customName\":\"林霞\",\"customPhone\":\"18980812339\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240425222\",\"orderCode\":\"sdzscd01DS-20409-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000022\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050777\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"牛区锦泰世家-1栋-2单元-6层-604\",\"customName\":\" 王芝琛\",\"customPhone\":\"18683445186\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240410159\",\"orderCode\":\"sdzscd01DS-20411-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000043\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051246\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金牛区马鞍东路社区-19号楼-1单元-3层-6\",\"customName\":\"文培\",\"customPhone\":\"17828499867\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240424218\",\"orderCode\":\"sdzscd01DS-20413-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000029\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051252\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"锦江区蜀都花园-27号楼-1单元-15层-1501\",\"customName\":\"李佩芸\",\"customPhone\":\"13881425411\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240426231\",\"orderCode\":\"sdzscd01DS-20415-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000017\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051274\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区商业街25号-2号楼-10单元-3层-302\",\"customName\":\"陈竹\",\"customPhone\":\"18816530726\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240428240\",\"orderCode\":\"sdzscd01DS-20417-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000014\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051300\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区天府公园观澜8号-B地块4号楼-1单元-5层-503\",\"customName\":\"雷小洪\",\"customPhone\":\"13678156927\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240425228\",\"orderCode\":\"sdzscd01DS-20419-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000016\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051320\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"锦江区南府锦-1号楼-4单元-11层-1107\",\"customName\":\"朱朝忠\",\"customPhone\":\"13094496263\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240428243\",\"orderCode\":\"sdzscd01DS-20421-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000015\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051346\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"绿地紫瑞里-1号楼-4单元-11层-1101\",\"customName\":\"李仪\",\"customPhone\":\"15928570386\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240424219\",\"orderCode\":\"sdzscd01DS-20423-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000021\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051381\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"锦江区比华利国际城二期-1号楼-1单元-14层-1403\",\"customName\":\"刘达萍\",\"customPhone\":\"13088049998\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240428238\",\"orderCode\":\"sdzscd01DS-20425-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000010\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051387\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"中国铁建棠樾5栋1单元6层02号\",\"customName\":\"罗成杰\",\"customPhone\":\"18613228665\",\"dealerCode\":\"scdbzsDS\",\"dealerName\":\"四川杜班装饰工程有限公司\",\"exclusiveCode\":\"scdbzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scdbzs01DS-240425015\",\"orderCode\":\"scdbzs01DS-20022-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239531\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049212\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"新津三盛翡俪山7栋2单元2层02号\",\"customName\":\"程容\",\"customPhone\":\"13340938882\",\"dealerCode\":\"scdbzsDS\",\"dealerName\":\"四川杜班装饰工程有限公司\",\"exclusiveCode\":\"scdbzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scdbzs01DS-240420013\",\"orderCode\":\"scdbzs01DS-20024-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239534\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049267\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"汉嘉国际社区62栋2单元27层01号\",\"customName\":\"赖晓敏\",\"customPhone\":\"13693451889\",\"dealerCode\":\"scdbzsDS\",\"dealerName\":\"四川杜班装饰工程有限公司\",\"exclusiveCode\":\"scdbzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scdbzs01DS-240425014\",\"orderCode\":\"scdbzs01DS-20026-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019517\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050684\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙湖三千城a区4栋3单元8层5号\",\"customName\":\"何妍霓\",\"customPhone\":\"18381758811\",\"dealerCode\":\"scltjjDS\",\"dealerName\":\"四川岚庭家居有限公司\",\"exclusiveCode\":\"scltjj01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scltjj01DS-240409381\",\"orderCode\":\"scltjj01DS-20729-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404216994\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048117\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"都江堰 樾玺3栋2单元7层01号\",\"customName\":\"余成义\",\"customPhone\":\"18140006027\",\"dealerCode\":\"scltjjDS\",\"dealerName\":\"四川岚庭家居有限公司\",\"exclusiveCode\":\"scltjj01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scltjj01DS-240430390\",\"orderCode\":\"scltjj01DS-20731-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404247808\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051338\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"王府花园御锦苑3-2-1401\",\"customName\":\"潘霞\",\"customPhone\":\"13348827355\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240410698\",\"orderCode\":\"scmhzs01DS-21370-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404217508\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048494\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"东部新区·兰谷里C区4-1-1302\",\"customName\":\"汪萍\",\"customPhone\":\"13320980898\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240416711\",\"orderCode\":\"scmhzs01DS-21372-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404216993\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048499\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"滨江樾城8-2503\",\"customName\":\"李鹏程\",\"customPhone\":\"13320980898\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240417715\",\"orderCode\":\"scmhzs01DS-21374-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404216991\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048524\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"三利麓山城蔚然集3-1-1205\",\"customName\":\"刘之颖\",\"customPhone\":\"13568855683\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240410697\",\"orderCode\":\"scmhzs01DS-21376-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404217512\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048656\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"新津欧郡C区4-2-13-203\",\"customName\":\"谭静\",\"customPhone\":\"13980022058\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\""); + sb.append(",\"mainOrderCode\":\"scmhzs01DS-240410694\",\"orderCode\":\"scmhzs01DS-21378-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404217510\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048678\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天府未来城星耀7栋1601\",\"customName\":\"邹和平\",\"customPhone\":\"18583787961\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240408682\",\"orderCode\":\"scmhzs01DS-21380-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404217511\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048703\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙泉 兴唐悦府二期3-1-1101\",\"customName\":\"周峻宇\",\"customPhone\":\"18180654891\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240414702\",\"orderCode\":\"scmhzs01DS-21382-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404216992\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048728\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天山名苑4-1-604\",\"customName\":\"封浩\",\"customPhone\":\"18583787961\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240423732\",\"orderCode\":\"scmhzs01DS-21388-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218125\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049113\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"银沙正街70号院1栋1单元6楼23号\",\"customName\":\"黄海\",\"customPhone\":\"18108124918\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240418722\",\"orderCode\":\"scmhzs01DS-21390-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218126\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049126\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金牛区合力达 映日荷花1-2-802\",\"customName\":\"杜玲华\",\"customPhone\":\"18108124918\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240424733\",\"orderCode\":\"scmhzs01DS-21392-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218111\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049127\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金辉凤栖云璟二期6-2-802\",\"customName\":\"陈秀蓉\",\"customPhone\":\"13088077092\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240423731\",\"orderCode\":\"scmhzs01DS-21394-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239495\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050041\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙泉 梵悦里27-2204\",\"customName\":\"谈丽蓉\",\"customPhone\":\"15882199235\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240425735\",\"orderCode\":\"scmhzs01DS-21396-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239528\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050053\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"奥林匹克花园23-1-601\",\"customName\":\"李伦平\",\"customPhone\":\"13388180566\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240423730\",\"orderCode\":\"scmhzs01DS-21398-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239532\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050056\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"万科魅力之城四期1-2605\",\"customName\":\"左海山\",\"customPhone\":\"15308055228\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240417714\",\"orderCode\":\"scmhzs01DS-21400-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239499\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050276\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"清江花园1-906\",\"customName\":\"李胜利\",\"customPhone\":\"18081966377\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240428744\",\"orderCode\":\"scmhzs01DS-21402-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239496\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050473\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"眉山市东坡区旋滨江7-3-403\",\"customName\":\"何金孟\",\"customPhone\":\"18780145068\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240426739\",\"orderCode\":\"scmhzs01DS-21405-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404247757\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050691\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"千川阅1-1-701\",\"customName\":\"王昕瑶\",\"customPhone\":\"18030861096\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240421724\",\"orderCode\":\"scmhzs01DS-21408-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404247755\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051131\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"沙湾路63号10号楼E 网通大厦\",\"customName\":\"网通大厦(童少军)\",\"customPhone\":\"13908176759\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240425737\",\"orderCode\":\"scmhzs01DS-21410-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404247783\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051188\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"湖光里院一期15-2-102\",\"customName\":\"刘勇\",\"customPhone\":\"13550294038\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240322647\",\"orderCode\":\"scmhzs01DS-21412-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404247730\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051213\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"新津 隆兴 公园首府20-1-1702\",\"customName\":\"刘媛\",\"customPhone\":\"18113090886\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240419237\",\"orderCode\":\"scxblzs01DS-20442-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239500\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050067\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"凤凰栖岸2-2306\",\"customName\":\"曹聪\",\"customPhone\":\"13880273490\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240423240\",\"orderCode\":\"scxblzs01DS-20444-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239497\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050084\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙樾湾39-2-2703\",\"customName\":\"马燕\",\"customPhone\":\"18224054271\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240410219\",\"orderCode\":\"scxblzs01DS-20446-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239536\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050095\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"崇州 观山一期4906\",\"customName\":\"刘永刚\",\"customPhone\":\"18782259522\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240414225\",\"orderCode\":\"scxblzs01DS-20448-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239533\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050101\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"彭州 阳光和悦澜庭2-1806\",\"customName\":\"山兰\",\"customPhone\":\"17708005668\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240418235\",\"orderCode\":\"scxblzs01DS-20450-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239498\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050114\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青南美湾2栋2单元1602\",\"customName\":\"徐桂茹\",\"customPhone\":\"15928551063\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240409218\",\"orderCode\":\"scxblzs01DS-20452-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239535\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050122\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"通锦坊1-2-2802\",\"customName\":\"卓晓秋\",\"customPhone\":\"13084453770\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240414227\",\"orderCode\":\"scxblzs01DS-20454-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239529\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050394\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"兴元华盛2-2-1704\",\"customName\":\"罗嘉明\",\"customPhone\":\"13730644858\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240421239\",\"orderCode\":\"scxblzs01DS-20456-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019516\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051226\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"华润二十四城1-1-1102\",\"customName\":\"侯小倩\",\"customPhone\":\"13980941355\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240426242\",\"orderCode\":\"scxblzs01DS-20458-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019528\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051239\",\"quantity\":\"1\"}],\"orderType\":\"原单\",\"reallyDate\":\"2024-05-13T10:41:32.403\",\"reallyMan\":\"嘉善基地发货员(熊艳)\",\"remark\":\"\",\"sendCarDriver\":\"张志峰\",\"sendCarDriverPhone\":\"15102192135\",\"sendCarNumber\":\"浙FH6Z47\",\"warehouseType\":\"中心仓\"}"); + + + MtFactoryDataDTO mtFactoryDataDTO = JSONObject.parseObject(sb.toString(), MtFactoryDataDTO.class); + + + System.out.println(mtFactoryDataDTO); + + } + +// public static void main(String[] args) throws JsonProcessingException { +// +//// StringBuilder sb = new StringBuilder("{\"centerWarehouseCode\":\"CDZXC3\",\"centerWarehouseName\":\"成都中心仓(汇通)\",\"invoiceOrderCode\":\"HYJIASHAN-240512\",\"orderList\":[{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金沙湖畔3-1-0704\",\"customName\":\"谢磊\",\"customPhone\":\"13678008438\",\"dealerCode\":\"cdsdzsDS\",\"dealerName\":\"成都山顶装饰有限公司\",\"exclusiveCode\":\"cdsdzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdsdzs01DS-240418019\",\"orderCode\":\"cdsdzs01DS-20039-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404238516\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050181\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"凉山彝族自治州/西昌市 邛海1号院 3-2-801\",\"customName\":\"罗家驹\",\"customPhone\":\"15281088828\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240425078\",\"orderCode\":\"cdxjszs01DS-20159-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404226595\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048505\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"重庆市/潼南区 锦绣观澜 3-1901 \",\"customName\":\"傅友恒/付永贵\",\"customPhone\":\"15228989825\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240420071\",\"orderCode\":\"cdxjszs01DS-20161-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404238514\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049862\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"广安市/邻水县 邦泰御府 3-303\",\"customName\":\"刘亮\",\"customPhone\":\" 13330621326\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240428085\",\"orderCode\":\"cdxjszs01DS-20164-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404238490\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049990\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"南充市/阆中市 滨江壹号 7栋1单元2204 \",\"customName\":\"李玉祥\",\"customPhone\":\"18081558001\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240428086\",\"orderCode\":\"cdxjszs01DS-20166-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404238486\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050003\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\" 四川省/成都市/彭州市 丽府兰台 5-2-202 \",\"customName\":\"胡海鹰 \",\"customPhone\":\" 13551150232\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240428088\",\"orderCode\":\"cdxjszs01DS-20168-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404238503\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050023\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/眉山市/仁寿县 璟樾云山 5-2-701 \",\"customName\":\"黄林英 \",\"customPhone\":\" 13882294071\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240428087\",\"orderCode\":\"cdxjszs01DS-20170-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000011\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050161\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/德阳市/什邡市 星坤雍城 17-2-602\",\"customName\":\"唐俊\",\"customPhone\":\" 18384286614\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240429091\",\"orderCode\":\"cdxjszs01DS-20172-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000007\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050499\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/德阳市/绵竹市 英伦城邦 22-2-401\",\"customName\":\"黄道华\",\"customPhone\":\" 18384286614\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240429090\",\"orderCode\":\"cdxjszs01DS-20174-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000005\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050505\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/绵阳市/涪城区 远大蔚蓝海岸 12-2-1203\",\"customName\":\"邓若兰\",\"customPhone\":\" 13348888883\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240429089\",\"orderCode\":\"cdxjszs01DS-20176-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000012\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050518\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/成都市/新都区 康怡嘉苑 6-2-1203 \",\"customName\":\"刘鑫\",\"customPhone\":\" 13908081160\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240429092\",\"orderCode\":\"cdxjszs01DS-20178-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000002\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050529\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/乐山市/井研县 领丰公园墅 6-1-1805\",\"customName\":\"廖文君\",\"customPhone\":\" 13881321121\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240429093\",\"orderCode\":\"cdxjszs01DS-20180-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000009\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050565\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"新都区 保利狮子湖檀香郡 2-2-201 \",\"customName\":\"周曼\",\"customPhone\":\"13540454984\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240430094\",\"orderCode\":\"cdxjszs01DS-20182-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000008\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051236\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"/乐山市/井研县 领丰公园墅 7-1-1705\",\"customName\":\"雷春梦\",\"customPhone\":\" 13881321121\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240430095\",\"orderCode\":\"cdxjszs01DS-20184-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000003\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051352\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"四川省/乐山市/市中区 铂金汇 1-1-504 \",\"customName\":\"李会容\",\"customPhone\":\"18227688699\",\"dealerCode\":\"cdxjszsDS\",\"dealerName\":\"成都馨居尚装饰设计工程有限公司\",\"exclusiveCode\":\"cdxjszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdxjszs01DS-240430096\",\"orderCode\":\"cdxjszs01DS-20186-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019505\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051469\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区 蜀镇尚楠湾14-1104\",\"customName\":\"陈志勇\",\"customPhone\":\"18328357560\",\"dealerCode\":\"cdyszsDS\",\"dealerName\":\"成都原树装饰工程有限公司\",\"exclusiveCode\":\"cdyszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdyszs01DS-240419011\",\"orderCode\":\"cdyszs01DS-20032-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404220107\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048088\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区 慕和南道1-2-1001\",\"customName\":\"李沁\",\"customPhone\":\"13540674509\",\"dealerCode\":\"cdyszsDS\",\"dealerName\":\"成都原树装饰工程有限公司\",\"exclusiveCode\":\"cdyszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdyszs01DS-240419012\",\"orderCode\":\"cdyszs01DS-20033-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000032\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051027\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天府二街 凤凰城一期3-2-2303\",\"customName\":\"丁云\",\"customPhone\":\"13350090770\",\"dealerCode\":\"cdyszsDS\",\"dealerName\":\"成都原树装饰工程有限公司\",\"exclusiveCode\":\"cdyszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdyszs01DS-240424015\",\"orderCode\":\"cdyszs01DS-20035-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019518\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051965\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"武侯区 新光社区文景苑27-7-5\",\"customName\":\"包光均\",\"customPhone\":\"15982272803\",\"dealerCode\":\"cdyszsDS\",\"dealerName\":\"成都原树装饰工程有限公司\",\"exclusiveCode\":\"cdyszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdyszs01DS-240424014\",\"orderCode\":\"cdyszs01DS-20037-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019511\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051966\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天府滨江湾2-1-3002\",\"customName\":\"杨欣\",\"customPhone\":\"13540674509\",\"dealerCode\":\"cdyszsDS\",\"dealerName\":\"成都原树装饰工程有限公司\",\"exclusiveCode\":\"cdyszs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"cdyszs01DS-240430017\",\"orderCode\":\"cdyszs01DS-20039-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019504\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051970\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"合能铂悦华庭 6栋1单元1401室 \",\"customName\":\"邹高才\",\"customPhone\":\"17502836393\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240418243\",\"orderCode\":\"qjdszx01DS-20443-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218124\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049654\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天府公园观澜9号澜岸 8栋2单元301室\",\"customName\":\"陈祖芳\",\"customPhone\":\"15388193720\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240413241\",\"orderCode\":\"qjdszx01DS-20445-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218123\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049655\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"国色天乡庆典城 6栋2单元201室 \",\"customName\":\"高广峰\",\"customPhone\":\"13608200842\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240411238\",\"orderCode\":\"qjdszx01DS-20447-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218188\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049656\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"清逸苑 2栋1单元5楼13号室 \",\"customName\":\"帅仕才\",\"customPhone\":\"13688091149\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240407221\",\"orderCode\":\"qjdszx01DS-20449-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239886\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049657\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"清江大厦 1栋1单元2002室\",\"customName\":\"李湘如\",\"customPhone\":\"13688091149\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240313167\",\"orderCode\":\"qjdszx01DS-20451-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239885\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049658\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"时代豪庭一期 2栋1单元2403室\",\"customName\":\"李海荣\",\"customPhone\":\"13699076129\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240407223\",\"orderCode\":\"qjdszx01DS-20454-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218201\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049742\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"仁寿黑龙滩印象中铁时光城 5栋1单元1005室\",\"customName\":\"杜毅\",\"customPhone\":\"13408543681\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240313175\",\"orderCode\":\"qjdszx01DS-20456-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218200\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049779\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区清江大厦 1栋1单元1101室 \",\"customName\":\"蒋能明\",\"customPhone\":\"13688091149\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428266\",\"orderCode\":\"qjdszx01DS-20458-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239879\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049792\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"滨江郦城 18栋1单元2703室\",\"customName\":\"廖勇刚\",\"customPhone\":\"17308037978\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428267\",\"orderCode\":\"qjdszx01DS-20460-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239876\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049798\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"水郡未来城二期 9栋1单元903室 \",\"customName\":\"上官苏丹\",\"customPhone\":\" 18428375685\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428269\",\"orderCode\":\"qjdszx01DS-20462-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239873\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049800\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"水郡未来城二期 10栋1单元1705室\",\"customName\":\"熊小英\",\"customPhone\":\" 18428375685\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428268\",\"orderCode\":\"qjdszx01DS-20464-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239883\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049808\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"崇州观山 53栋3室 \",\"customName\":\"杨淼\",\"customPhone\":\"19960767610\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240322197\",\"orderCode\":\"qjdszx01DS-20466-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239880\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049855\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"水郡未来城一期 7栋1单元2904室\",\"customName\":\"牛红燕\",\"customPhone\":\" 18428375685\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428271\",\"orderCode\":\"qjdszx01DS-20468-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239878\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049869\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"滨江郦城 64栋1单元1902室\",\"customName\":\"李会蓉 \",\"customPhone\":\"18782038358\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240428270\",\"orderCode\":\"qjdszx01DS-20470-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239881\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049875\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"川大望江校区新南村 58栋2单元421室\",\"customName\":\"胡静\",\"customPhone\":\" 15208383493\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240321188\",\"orderCode\":\"qjdszx01DS-20472-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239884\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050609\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"高盛公馆 1栋4单元1004室 \",\"customName\":\"徐长路\",\"customPhone\":\"15828177643\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240419254\",\"orderCode\":\"qjdszx01DS-20474-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019513\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051479\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"清江大厦 1栋1单元802室\",\"customName\":\"曾亚东\",\"customPhone\":\"13688091149\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240430275\",\"orderCode\":\"qjdszx01DS-20476-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019503\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051500\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"清水路苑 54栋2单元903室 \",\"customName\":\"黄富华\",\"customPhone\":\"15378380828\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240402211\",\"orderCode\":\"qjdszx01DS-20478-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405022271\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH052692\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"人居东苑E区 1-1-1703\",\"customName\":\"杜仕静\",\"customPhone\":\"16608053536\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240418247\",\"orderCode\":\"qjdszx01DS-20480-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405022240\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH052706\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"锦利锦悦府 3栋1单元1501室\",\"customName\":\" 王虎\",\"customPhone\":\"16608053536\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240418246\",\"orderCode\":\"qjdszx01DS-20482-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405022241\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH052715\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"彭山区水郡未来城 18栋2单元903室\",\"customName\":\"潘淑君\",\"customPhone\":\"13408543681\",\"dealerCode\":\"qjdszxDS\",\"dealerName\":\"齐家典尚(成都)装修工程有限公司\",\"exclusiveCode\":\"qjdszx01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"qjdszx01DS-240328203\",\"orderCode\":\"qjdszx01DS-20486-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405022246\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH052746\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"温江区大华水映岛-17栋-2单元-5层-510\",\"customName\":\" 王妍鸿\",\"customPhone\":\"13438330798\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240420192\",\"orderCode\":\"sdzscd01DS-20325-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404201912\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH047853\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"成华区新希望万科知园-A地块6栋-1单元-7层-704\",\"customName\":\"罗程\",\"customPhone\":\"18328625271\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240417183\",\"orderCode\":\"sdzscd01DS-20329-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404201995\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH047882\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"郫都区书香府邸二期英伦-4号楼-1单元-2层-202\",\"customName\":\" 李丰\",\"customPhone\":\"15828021362\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240417185\",\"orderCode\":\"sdzscd01DS-20337-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000037\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048020\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"雅居乐十里花巷-8号楼-0单元-25层-2501\",\"customName\":\"刘欧\",\"customPhone\":\"17761227867\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240415177\",\"orderCode\":\"sdzscd01DS-20341-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404201990\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048199\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"武侯区美洲花园棕榈湾-117号楼-2单元-22层-2204\",\"customName\":\"来文瀚\",\"customPhone\":\"13548121286\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240418188\",\"orderCode\":\"sdzscd01DS-20343-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404201914\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048202\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双楠悦天地-3号楼-1单元-6层-604\",\"customName\":\"尚凯茜\",\"customPhone\":\"13880887622\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421198\",\"orderCode\":\"sdzscd01DS-20345-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404206690\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048214\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"新都区百郦锦城-1号楼-2单元-28层-2804\",\"customName\":\"许雪婷\",\"customPhone\":\"13981927611\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240422208\",\"orderCode\":\"sdzscd01DS-20349-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000027\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048335\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"锦江区卓锦城-10号楼-1单元-26层-3室\",\"customName\":\"孔祥凯\",\"customPhone\":\"13540099091\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240417181\",\"orderCode\":\"sdzscd01DS-20351-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404206693\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048340\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区港龙美的未来映-13号-1单元-4层-401\",\"customName\":\"姚树为\",\"customPhone\":\"13981863593\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240417182\",\"orderCode\":\"sdzscd01DS-20353-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404201985\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048355\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区城投置地文园-2号楼-1单元-21层-2102\",\"customName\":\"杨思晗\",\"customPhone\":\"15184399715\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240425223\",\"orderCode\":\"sdzscd01DS-20356-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218122\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048744\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙泉驿区爱情东麓九里-3栋-2单元-4层-401\",\"customName\":\"马寻\",\"customPhone\":\"13808076890\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421197\",\"orderCode\":\"sdzscd01DS-20358-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000035\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049014\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金牛区西宸原著御景-34栋-34栋-32层-3206\",\"customName\":\"钟德超\",\"customPhone\":\"13540225391\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421195\",\"orderCode\":\"sdzscd01DS-20360-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000034\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049047\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"成大花园-20号楼-1单元-9层-902\",\"customName\":\"罗小麟\",\"customPhone\":\"18011506371\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421199\",\"orderCode\":\"sdzscd01DS-20364-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000041\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049057\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金牛区白鸽岛尚-7栋-1单元-11层-1102\",\"customName\":\"郑方舟\",\"customPhone\":\"13402850529\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421200\",\"orderCode\":\"sdzscd01DS-20366-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000031\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049058\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区精城水印阁-1号楼-2单元-17层-1704\",\"customName\":\"吴坤\",\"customPhone\":\"15928682981\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240424212\",\"orderCode\":\"sdzscd01DS-20370-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218113\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049129\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天鹅湖花园-18号楼-1单元-22层-2203\",\"customName\":\"梁希\",\"customPhone\":\"13980726457\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240403136\",\"orderCode\":\"sdzscd01DS-20372-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000038\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049316\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区天邑花园-18号楼-4单元-1层-103\",\"customName\":\"朱勇\",\"customPhone\":\"13699463676\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240315094\",\"orderCode\":\"sdzscd01DS-20374-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000042\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049849\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区天府滨河湾-2幢-2单元-20层-2002\",\"customName\":\"巴宇赫\",\"customPhone\":\"19822913660\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240422204\",\"orderCode\":\"sdzscd01DS-20377-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000026\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050203\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"佳兆业珑樾壹号-11号楼-1单元-1层-102\",\"customName\":\"无\",\"customPhone\":\"18398177944\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240411163\",\"orderCode\":\"sdzscd01DS-20379-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000036\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050208\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区港龙美的未来映-13号楼-2单元-8层-802室\",\"customName\":\"陈亚菲\",\"customPhone\":\"13980710342\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240423209\",\"orderCode\":\"sdzscd01DS-20381-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000024\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050268\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区心怡中丝园-16栋-2单元-23层-2302\",\"customName\":\"雷晨霄\",\"customPhone\":\"13545298230\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240426232\",\"orderCode\":\"sdzscd01DS-20383-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000013\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050277\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"温江区金恒德时代金悦-7号楼-1单元-6层-601\",\"customName\":\"朱雲\",\"customPhone\":\"18180784177\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240422202\",\"orderCode\":\"sdzscd01DS-20385-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000025\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050278\",\"quantity\":\"1\"},"); +//// sb.append("{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙泉驿区明信雲珑府-3栋-1单元-14层-1404\",\"customName\":\"陈继业\",\"customPhone\":\"18402841944\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240421196\",\"orderCode\":\"sdzscd01DS-20387-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000033\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050279\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"融创观玺台花园-6栋-1单元-23层-2304\",\"customName\":\"张臻\",\"customPhone\":\"18782932893\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240419190\",\"orderCode\":\"sdzscd01DS-20389-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000040\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050280\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"成华区城投置地青熙蘭庭-6号楼-1单元-3层-301\",\"customName\":\"杨雨辰\",\"customPhone\":\"13558724993\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240423211\",\"orderCode\":\"sdzscd01DS-20391-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000023\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050343\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"城南名著-B座9号楼-3单元-2层-204\",\"customName\":\"谭燕\",\"customPhone\":\"18280151823\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240422201\",\"orderCode\":\"sdzscd01DS-20393-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000030\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050352\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区港龙美的未来映-6号楼-2单元-11层-1102\",\"customName\":\" 金卉琳\",\"customPhone\":\"18980881437\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240422203\",\"orderCode\":\"sdzscd01DS-20395-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000028\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050363\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"中铁西子香荷-3号楼-1单元-31层-3101\",\"customName\":\"龙志雄\",\"customPhone\":\"13541244746\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240424214\",\"orderCode\":\"sdzscd01DS-20399-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000019\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050470\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区三利麓山城蔚然集-4栋-1单元-27层-2704\",\"customName\":\"刘雨豪\",\"customPhone\":\"18280368884\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240424216\",\"orderCode\":\"sdzscd01DS-20401-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000020\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050517\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"郫都区国宾御府-11号楼-2单元-4层-401室\",\"customName\":\" 张昀皓\",\"customPhone\":\"15928086583\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240412170\",\"orderCode\":\"sdzscd01DS-20403-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000039\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050680\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区优品道三期-35号楼-1单元-9层-903\",\"customName\":\"杜婷\",\"customPhone\":\"15181605713\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240426229\",\"orderCode\":\"sdzscd01DS-20405-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000018\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050765\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金牛区北斗七星城-2号楼-2单元-1层-101\",\"customName\":\"成都育师教培(圣都)补\",\"customPhone\":\"17502807442\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240429246\",\"orderCode\":\"sdzscd01DS-20407-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000006\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050772\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙潭寺TOD龙潭九章-24号楼-2单元-8层-02室\",\"customName\":\"林霞\",\"customPhone\":\"18980812339\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240425222\",\"orderCode\":\"sdzscd01DS-20409-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000022\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050777\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"牛区锦泰世家-1栋-2单元-6层-604\",\"customName\":\" 王芝琛\",\"customPhone\":\"18683445186\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240410159\",\"orderCode\":\"sdzscd01DS-20411-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000043\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051246\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金牛区马鞍东路社区-19号楼-1单元-3层-6\",\"customName\":\"文培\",\"customPhone\":\"17828499867\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240424218\",\"orderCode\":\"sdzscd01DS-20413-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000029\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051252\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"锦江区蜀都花园-27号楼-1单元-15层-1501\",\"customName\":\"李佩芸\",\"customPhone\":\"13881425411\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240426231\",\"orderCode\":\"sdzscd01DS-20415-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000017\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051274\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青羊区商业街25号-2号楼-10单元-3层-302\",\"customName\":\"陈竹\",\"customPhone\":\"18816530726\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240428240\",\"orderCode\":\"sdzscd01DS-20417-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000014\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051300\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"双流区天府公园观澜8号-B地块4号楼-1单元-5层-503\",\"customName\":\"雷小洪\",\"customPhone\":\"13678156927\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240425228\",\"orderCode\":\"sdzscd01DS-20419-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000016\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051320\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"锦江区南府锦-1号楼-4单元-11层-1107\",\"customName\":\"朱朝忠\",\"customPhone\":\"13094496263\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240428243\",\"orderCode\":\"sdzscd01DS-20421-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000015\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051346\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"绿地紫瑞里-1号楼-4单元-11层-1101\",\"customName\":\"李仪\",\"customPhone\":\"15928570386\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240424219\",\"orderCode\":\"sdzscd01DS-20423-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000021\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051381\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"锦江区比华利国际城二期-1号楼-1单元-14层-1403\",\"customName\":\"刘达萍\",\"customPhone\":\"13088049998\",\"dealerCode\":\"sdzscdDS\",\"dealerName\":\"圣都家居装饰有限公司成都分公司\",\"exclusiveCode\":\"sdzscd01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"sdzscd01DS-240428238\",\"orderCode\":\"sdzscd01DS-20425-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405000010\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051387\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"中国铁建棠樾5栋1单元6层02号\",\"customName\":\"罗成杰\",\"customPhone\":\"18613228665\",\"dealerCode\":\"scdbzsDS\",\"dealerName\":\"四川杜班装饰工程有限公司\",\"exclusiveCode\":\"scdbzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scdbzs01DS-240425015\",\"orderCode\":\"scdbzs01DS-20022-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239531\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049212\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"新津三盛翡俪山7栋2单元2层02号\",\"customName\":\"程容\",\"customPhone\":\"13340938882\",\"dealerCode\":\"scdbzsDS\",\"dealerName\":\"四川杜班装饰工程有限公司\",\"exclusiveCode\":\"scdbzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scdbzs01DS-240420013\",\"orderCode\":\"scdbzs01DS-20024-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239534\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049267\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"四川省成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"汉嘉国际社区62栋2单元27层01号\",\"customName\":\"赖晓敏\",\"customPhone\":\"13693451889\",\"dealerCode\":\"scdbzsDS\",\"dealerName\":\"四川杜班装饰工程有限公司\",\"exclusiveCode\":\"scdbzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scdbzs01DS-240425014\",\"orderCode\":\"scdbzs01DS-20026-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019517\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050684\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙湖三千城a区4栋3单元8层5号\",\"customName\":\"何妍霓\",\"customPhone\":\"18381758811\",\"dealerCode\":\"scltjjDS\",\"dealerName\":\"四川岚庭家居有限公司\",\"exclusiveCode\":\"scltjj01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scltjj01DS-240409381\",\"orderCode\":\"scltjj01DS-20729-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404216994\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048117\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"都江堰 樾玺3栋2单元7层01号\",\"customName\":\"余成义\",\"customPhone\":\"18140006027\",\"dealerCode\":\"scltjjDS\",\"dealerName\":\"四川岚庭家居有限公司\",\"exclusiveCode\":\"scltjj01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scltjj01DS-240430390\",\"orderCode\":\"scltjj01DS-20731-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404247808\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051338\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"王府花园御锦苑3-2-1401\",\"customName\":\"潘霞\",\"customPhone\":\"13348827355\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240410698\",\"orderCode\":\"scmhzs01DS-21370-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404217508\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048494\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"东部新区·兰谷里C区4-1-1302\",\"customName\":\"汪萍\",\"customPhone\":\"13320980898\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240416711\",\"orderCode\":\"scmhzs01DS-21372-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404216993\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048499\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"滨江樾城8-2503\",\"customName\":\"李鹏程\",\"customPhone\":\"13320980898\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240417715\",\"orderCode\":\"scmhzs01DS-21374-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404216991\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048524\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"三利麓山城蔚然集3-1-1205\",\"customName\":\"刘之颖\",\"customPhone\":\"13568855683\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240410697\",\"orderCode\":\"scmhzs01DS-21376-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404217512\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048656\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"新津欧郡C区4-2-13-203\",\"customName\":\"谭静\",\"customPhone\":\"13980022058\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\""); +//// sb.append(",\"mainOrderCode\":\"scmhzs01DS-240410694\",\"orderCode\":\"scmhzs01DS-21378-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404217510\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048678\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天府未来城星耀7栋1601\",\"customName\":\"邹和平\",\"customPhone\":\"18583787961\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240408682\",\"orderCode\":\"scmhzs01DS-21380-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404217511\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048703\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙泉 兴唐悦府二期3-1-1101\",\"customName\":\"周峻宇\",\"customPhone\":\"18180654891\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240414702\",\"orderCode\":\"scmhzs01DS-21382-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404216992\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH048728\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"天山名苑4-1-604\",\"customName\":\"封浩\",\"customPhone\":\"18583787961\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240423732\",\"orderCode\":\"scmhzs01DS-21388-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218125\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049113\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"银沙正街70号院1栋1单元6楼23号\",\"customName\":\"黄海\",\"customPhone\":\"18108124918\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240418722\",\"orderCode\":\"scmhzs01DS-21390-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218126\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049126\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金牛区合力达 映日荷花1-2-802\",\"customName\":\"杜玲华\",\"customPhone\":\"18108124918\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240424733\",\"orderCode\":\"scmhzs01DS-21392-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404218111\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH049127\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"金辉凤栖云璟二期6-2-802\",\"customName\":\"陈秀蓉\",\"customPhone\":\"13088077092\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240423731\",\"orderCode\":\"scmhzs01DS-21394-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239495\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050041\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙泉 梵悦里27-2204\",\"customName\":\"谈丽蓉\",\"customPhone\":\"15882199235\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240425735\",\"orderCode\":\"scmhzs01DS-21396-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239528\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050053\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"奥林匹克花园23-1-601\",\"customName\":\"李伦平\",\"customPhone\":\"13388180566\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240423730\",\"orderCode\":\"scmhzs01DS-21398-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239532\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050056\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"万科魅力之城四期1-2605\",\"customName\":\"左海山\",\"customPhone\":\"15308055228\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240417714\",\"orderCode\":\"scmhzs01DS-21400-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239499\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050276\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"清江花园1-906\",\"customName\":\"李胜利\",\"customPhone\":\"18081966377\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240428744\",\"orderCode\":\"scmhzs01DS-21402-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239496\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050473\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"眉山市东坡区旋滨江7-3-403\",\"customName\":\"何金孟\",\"customPhone\":\"18780145068\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240426739\",\"orderCode\":\"scmhzs01DS-21405-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404247757\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050691\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"千川阅1-1-701\",\"customName\":\"王昕瑶\",\"customPhone\":\"18030861096\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240421724\",\"orderCode\":\"scmhzs01DS-21408-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404247755\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051131\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"沙湾路63号10号楼E 网通大厦\",\"customName\":\"网通大厦(童少军)\",\"customPhone\":\"13908176759\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240425737\",\"orderCode\":\"scmhzs01DS-21410-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404247783\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051188\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"湖光里院一期15-2-102\",\"customName\":\"刘勇\",\"customPhone\":\"13550294038\",\"dealerCode\":\"scmhzsDS\",\"dealerName\":\"四川美画天下装饰有限公司\",\"exclusiveCode\":\"scmhzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scmhzs01DS-240322647\",\"orderCode\":\"scmhzs01DS-21412-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404247730\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051213\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"新津 隆兴 公园首府20-1-1702\",\"customName\":\"刘媛\",\"customPhone\":\"18113090886\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240419237\",\"orderCode\":\"scxblzs01DS-20442-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239500\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050067\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"凤凰栖岸2-2306\",\"customName\":\"曹聪\",\"customPhone\":\"13880273490\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240423240\",\"orderCode\":\"scxblzs01DS-20444-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239497\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050084\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"龙樾湾39-2-2703\",\"customName\":\"马燕\",\"customPhone\":\"18224054271\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240410219\",\"orderCode\":\"scxblzs01DS-20446-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239536\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050095\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"崇州 观山一期4906\",\"customName\":\"刘永刚\",\"customPhone\":\"18782259522\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240414225\",\"orderCode\":\"scxblzs01DS-20448-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239533\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050101\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"彭州 阳光和悦澜庭2-1806\",\"customName\":\"山兰\",\"customPhone\":\"17708005668\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240418235\",\"orderCode\":\"scxblzs01DS-20450-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239498\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050114\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"青南美湾2栋2单元1602\",\"customName\":\"徐桂茹\",\"customPhone\":\"15928551063\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240409218\",\"orderCode\":\"scxblzs01DS-20452-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239535\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050122\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"通锦坊1-2-2802\",\"customName\":\"卓晓秋\",\"customPhone\":\"13084453770\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240414227\",\"orderCode\":\"scxblzs01DS-20454-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02404239529\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH050394\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"兴元华盛2-2-1704\",\"customName\":\"罗嘉明\",\"customPhone\":\"13730644858\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240421239\",\"orderCode\":\"scxblzs01DS-20456-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019516\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051226\",\"quantity\":\"1\"},{\"brand\":\"梦天\",\"consignee\":\"段鹏博\",\"consigneeAddress\":\"成都市龙泉驿区车城大道999号宝湾物流园7栋20号,9号库9号、10号门\",\"consigneePhone\":\"18602832396\",\"customAddress\":\"华润二十四城1-1-1102\",\"customName\":\"侯小倩\",\"customPhone\":\"13980941355\",\"dealerCode\":\"scxblzsDS\",\"dealerName\":\"四川鑫佰利装饰有限公司\",\"exclusiveCode\":\"scxblzs01DS\",\"exclusiveName\":\"四川成都(大B)\",\"mainOrderCode\":\"scxblzs01DS-240426242\",\"orderCode\":\"scxblzs01DS-20458-0\",\"outboundType\":\"调拨出库\",\"packageInfos\":[{\"bigType\":\"\",\"color\":\"\",\"number\":1,\"outboundDate\":\"2024-05-13T10:41:03.653\",\"outboundMan\":\"嘉善基地发货员(熊艳)\",\"packageCode\":\"02405019528\",\"packageType\":\"其它\",\"smallType\":\"\"}],\"produceOrderCode\":\"WH051239\",\"quantity\":\"1\"}],\"orderType\":\"原单\",\"reallyDate\":\"2024-05-13T10:41:32.403\",\"reallyMan\":\"嘉善基地发货员(熊艳)\",\"remark\":\"\",\"sendCarDriver\":\"张志峰\",\"sendCarDriverPhone\":\"15102192135\",\"sendCarNumber\":\"浙FH6Z47\",\"warehouseType\":\"中心仓\"}"); +//// +//// +//// MtFactoryDataDTO mtFactoryDataDTO = JSONObject.parseObject(sb.toString(), MtFactoryDataDTO.class); +//// +//// System.out.println(new ObjectMapper().writeValueAsString(mtFactoryDataDTO)); +// +// +// +// +// File file = new File("D:\\新建文件夹\\2222.txt"); +// +// +// try { +// BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); +// +// +// List list = new ArrayList<>(); +// +// while (bufferedReader.ready()) { +// +//// String line = bufferedReader.readLine(); +//// JSONObject js = JSONObject.parseObject(line); +//// +//// String o = js.getString("OrderCode"); +//// if(!list.contains(o)){ +//// list.add(o); +//// System.out.println(line); +//// } +// +// Thread.sleep(1000); +// String line = bufferedReader.readLine(); +// String post = HttpUtil.post("http://openapi.huitongys.com/logpm-factory/factory/oupai/data", line); +// System.out.println(post); +// } +// } catch (FileNotFoundException e) { +// throw new RuntimeException(e); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } catch (InterruptedException e) { +// throw new RuntimeException(e); +// } +// +// +// } + private static String buildToken() { + + String url = "https://timsapi.oppein.com/tims_odata_api/api/Authentication/Authenticate"; + + + JSONObject json = new JSONObject(); + json.put("userName", "HTAPI"); + json.put("password", "HTAPI@3311"); + + String data = json.toString(); + HttpResponse httpResponse = HttpRequest.post(url).body(data).execute(); + String result = httpResponse.body(); + if (StringUtils.isNotEmpty(result)) { + return "Bearer " + result; + } + return null; + + + } + public static void main(String[] args) throws IOException, InterruptedException { + + + + File file = new File("D:\\新建文件夹\\444.txt"); + + BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + + List list = new ArrayList<>(); + + while (bufferedReader.ready()) { + String line = bufferedReader.readLine(); + if(!list.contains(line)){ + list.add(line); + System.out.println(line); + } + } + + // 获取token + String s = buildToken(); + + + + for (String string : list) { + Thread.sleep(500); + System.out.println(string); + String url = "https://timsapi.oppein.com/tims_odata_api/api/odata/PackageFeedbackRecord"; + HttpResponse httpResponse = HttpRequest.post(url).header("Authorization", s).body(string).execute(); + String result = httpResponse.body(); + System.out.println(result); + } + + } + + + @Test + public void test28() throws IOException { + + /* + 2.通过车次查询来系统中车次绑定的运单 + 3.通过运单查询货物上的包件 + 4.需要过滤出来 只要梦天的 + */ + List carNumList = new ArrayList<>(); + + File file = new File("D:\\temp\\hwy\\111\\111.txt"); + BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + + while (bufferedReader.ready()) { + String line = bufferedReader.readLine(); + carNumList.add(line); + } + + + try { + + List allMtData = mtFactoryOrderMainService.mtOrderPackageRelation(); + // 对这个集合内进行分组 + Map> stringListMap = allMtData.stream().collect(Collectors.groupingBy(MTOrderPackageRelationVO::getInvoiceOrderCode)); + Set set = stringListMap.keySet(); + + + Set r = new HashSet<>(); + for (String s : set) { + String carNum = null; + // 得到某个工厂运输批次的集合 + List t = stringListMap.get(s); + //得到这个批次下面所有的包件 + List strs = t.stream().map(MTOrderPackageRelationVO::getPackageCode).collect(Collectors.toList()); + // 当前批次的包件 在 这个配载计划中存在一个 则进行通知 + for (String mtStr : carNumList) { + if (strs.contains(mtStr)) { + carNum = s; + break; + } + } + if (StringUtil.isNoneBlank(carNum)) { + r.add(carNum); + } + } + System.out.println(r); + + + } catch (Exception e) { + e.printStackTrace(); + } + } + } diff --git a/blade-service/logpm-old-project/Dockerfile b/blade-service/logpm-old-project/Dockerfile index 482a7185d..64a4277e5 100644 --- a/blade-service/logpm-old-project/Dockerfile +++ b/blade-service/logpm-old-project/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/AdvanceClient.java b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/AdvanceClient.java index 7b7b08755..6aa30181a 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/AdvanceClient.java +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/AdvanceClient.java @@ -112,4 +112,9 @@ public class AdvanceClient implements IAdvanceClient { return list; } + + @Override + public List findListByWaybillNo(String waybillNo) { + return service.findListByWaybillNo(waybillNo); + } } diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/SignPushClient.java b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/SignPushClient.java index 5b2346c28..d48ab6818 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/SignPushClient.java +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/SignPushClient.java @@ -29,27 +29,29 @@ public class SignPushClient implements IOldSignPushClient { public Boolean pushOldSystemSignInfo(SignPushDataDTO signPushDataDTO) { //todo 这里存在调用老系统的接口 将数据会写给老系统 + int timeoutMilliseconds = 60000; + Boolean result =false; + log.info(">>>> pushOldSystemSignInfo 程序执行 start time: {}",System.currentTimeMillis()); String authCode = oldLogin(signPushDataDTO.getWarehouseId()+""); - log.info("##################pushOldSystemSignInfo: 请求老系统接口 start map {}", signPushDataDTO); - String url = oldSystemProperties.getUrl() + "openApi/newSystem.OptimsSign/index"; String data = JSON.toJSONString(signPushDataDTO); - String body = HttpRequest.post(url).body(data).header("token", authCode).execute().body(); - log.info("##################pushOldSystemSignInfo: 请求老系统接口,url:{},body:{}", url, body); - if (StringUtil.isNotBlank(body)) { + log.info(">>>> pushOldSystemSignInfo request url:{} data:{}",url,data); + String body = HttpRequest.post(url).body(data).header("token", authCode).setConnectionTimeout(timeoutMilliseconds).execute().body(); + if (StringUtil.isNotBlank(body)) { JSONObject res = JSON.parseObject(body); if ("200".equals(res.getString("code"))) { - return true; + result= true; } - } + log.info(">>>> pushOldSystemSignInfo response url:{} body:{}",url,body); + log.info(">>>> pushOldSystemSignInfo 程序执行 end time : {} >> return result :{} ",System.currentTimeMillis(),result); - return false; + return result; } @Override diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/WayBillClient.java b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/WayBillClient.java index 448b7e31f..3e5708fee 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/WayBillClient.java +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/feign/WayBillClient.java @@ -66,4 +66,9 @@ public class WayBillClient implements IWayBillClient { public WayBillEntity getByWayBillByOrderCode(String orderCode) { return wayBillService.getByWayBillByOrderCode(orderCode); } + + @Override + public String findAreaCodeByArriveSiteId(Integer arriveSiteId) { + return wayBillService.findAreaCodeByArriveSiteId(arriveSiteId); + } } diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/AdvanceDetailMapper.xml b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/AdvanceDetailMapper.xml index b817aabea..6ec6e34e2 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/AdvanceDetailMapper.xml +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/AdvanceDetailMapper.xml @@ -97,9 +97,6 @@ select w.title warehouse, od.unitNo packetBarCode, - c.title cargoTitle, - s.title shelfTitle, - l.title goodsAllocation, ad.firstPackName firsts, ad.secondPackName `second`, ad.thirdPackName thirdProduct, @@ -144,9 +135,6 @@ from ht_order_detail od left join ht_advance_detail ad on ad.unitNo = od.unitNo left join ht_warehouse w on w.id = od.now_warehouse_id - left join ht_location l on od.location_id = l.id - left join ht_shelf s on l.shelf_id = s.id - left join ht_cargo c on s.cargo_id = c.id where od.unitNo = #{unitNo} @@ -177,9 +165,6 @@ + @@ -81,4 +82,11 @@ + + diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/WayBillMapper.java b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/WayBillMapper.java index 02cbdc077..90bc21ce7 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/WayBillMapper.java +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/WayBillMapper.java @@ -14,4 +14,6 @@ public interface WayBillMapper extends BaseMapper { List findAdvanceIdsByWaybillNo(@Param("waybillNo") String waybillNo); WayBillEntity getByWayBillByOrderCode(@Param("orderCode") String orderCode); + + String findAreaCodeByArriveSiteId(@Param("arriveSiteId") Integer arriveSiteId); } diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/WayBillMapper.xml b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/WayBillMapper.xml index eb71cd18e..f05948ff3 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/WayBillMapper.xml +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/mapper/WayBillMapper.xml @@ -27,4 +27,10 @@ select ht_way_bill.* FROM ht_way_bill LEFT JOIN ht_advance on ht_advance.waybi limit 1 + + diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/IAdvanceService.java b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/IAdvanceService.java index 572881bd6..79353faa3 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/IAdvanceService.java +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/IAdvanceService.java @@ -54,4 +54,6 @@ public interface IAdvanceService { List getAdvanceList(String orderSelfNum); List findListByAdvanceIds(List advanceIds); + + List findListByWaybillNo(String waybillNo); } diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/IWayBillService.java b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/IWayBillService.java index 1f72401ca..4d74653e4 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/IWayBillService.java +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/IWayBillService.java @@ -20,4 +20,6 @@ public interface IWayBillService { List findAdvanceIdsByWaybillNo(String waybillNo); WayBillEntity getByWayBillByOrderCode(String orderCode); + + String findAreaCodeByArriveSiteId(Integer arriveSiteId); } diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/AdvanceServiceImpl.java b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/AdvanceServiceImpl.java index 60735b8fe..3bc887d09 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/AdvanceServiceImpl.java +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/AdvanceServiceImpl.java @@ -87,4 +87,9 @@ public class AdvanceServiceImpl implements IAdvanceService { public List findListByAdvanceIds(List advanceIds) { return advanceMapper.findListByAdvanceIds(advanceIds); } + + @Override + public List findListByWaybillNo(String waybillNo) { + return advanceMapper.findListByWaybillNo(waybillNo); + } } diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/ServiceNumServiceImpl.java b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/ServiceNumServiceImpl.java index 3db7f7679..3cf2abfba 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/ServiceNumServiceImpl.java +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/ServiceNumServiceImpl.java @@ -21,6 +21,7 @@ import com.logpm.oldproject.entity.ServiceNumEntity; import com.logpm.oldproject.mapper.ServiceNumMapper; import com.logpm.oldproject.service.IServiceNumService; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; @@ -32,6 +33,7 @@ import java.util.Objects; * @author BladeX * @since 2023-05-10 */ +@Slf4j @Service @AllArgsConstructor public class ServiceNumServiceImpl implements IServiceNumService { @@ -40,9 +42,14 @@ public class ServiceNumServiceImpl implements IServiceNumService { @Override public Boolean addServiceNum(List serviceNum) { - if(!Objects.isNull(serviceNum)&&serviceNum.size()>0){ - return serviceNumMapper.addAll(serviceNum); + try{ + if(!Objects.isNull(serviceNum)&& !serviceNum.isEmpty()){ + return serviceNumMapper.addAll(serviceNum); + } + }catch (Exception e){ + log.error(">>>> addServiceNum",e); } + return true; } diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/TrayScanDesServiceImpl.java b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/TrayScanDesServiceImpl.java index b93d58c11..fa23d777f 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/TrayScanDesServiceImpl.java +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/TrayScanDesServiceImpl.java @@ -53,7 +53,8 @@ public class TrayScanDesServiceImpl implements ITrayScanDesService { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("now_warehouse_id",oldWarehouseId) .eq("type",1) - .eq("tray_id",trayId); + .eq("tray_id",trayId) + .eq("delete_time",0); return trayScanDesMapper.selectList(queryWrapper); } } diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/WarehouseServiceImpl.java b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/WarehouseServiceImpl.java index b00e98cf7..825836ed3 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/WarehouseServiceImpl.java +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/WarehouseServiceImpl.java @@ -61,6 +61,7 @@ public class WarehouseServiceImpl implements IWarehouseService { public WarehouseEntity findByName(String destinationWarehouse) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("title",destinationWarehouse); + queryWrapper.eq("delete_time",0); return warehouseMapper.selectOne(queryWrapper); } diff --git a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/WayBillServiceImpl.java b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/WayBillServiceImpl.java index b32dd22f1..a95cbdd6c 100644 --- a/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/WayBillServiceImpl.java +++ b/blade-service/logpm-old-project/src/main/java/com/logpm/oldproject/service/impl/WayBillServiceImpl.java @@ -47,4 +47,9 @@ public class WayBillServiceImpl implements IWayBillService { public WayBillEntity getByWayBillByOrderCode(String orderCode) { return wayBillMapper.getByWayBillByOrderCode(orderCode); } + + @Override + public String findAreaCodeByArriveSiteId(Integer arriveSiteId) { + return wayBillMapper.findAreaCodeByArriveSiteId(arriveSiteId); + } } diff --git a/blade-service/logpm-old-project/src/main/resources/application-dev.yml b/blade-service/logpm-old-project/src/main/resources/application-dev.yml index 6e8304334..68d1f4215 100644 --- a/blade-service/logpm-old-project/src/main/resources/application-dev.yml +++ b/blade-service/logpm-old-project/src/main/resources/application-dev.yml @@ -13,7 +13,7 @@ spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: diff --git a/blade-service/logpm-old-project/src/main/resources/application-prod.yml b/blade-service/logpm-old-project/src/main/resources/application-prod.yml index de13ec368..9683de684 100644 --- a/blade-service/logpm-old-project/src/main/resources/application-prod.yml +++ b/blade-service/logpm-old-project/src/main/resources/application-prod.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: diff --git a/blade-service/logpm-old-project/src/main/resources/application-test.yml b/blade-service/logpm-old-project/src/main/resources/application-test.yml index 44749792d..a23a700dc 100644 --- a/blade-service/logpm-old-project/src/main/resources/application-test.yml +++ b/blade-service/logpm-old-project/src/main/resources/application-test.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: diff --git a/blade-service/logpm-old-project/src/main/resources/application.yml b/blade-service/logpm-old-project/src/main/resources/application.yml index ab56f1cbd..54fc94c20 100644 --- a/blade-service/logpm-old-project/src/main/resources/application.yml +++ b/blade-service/logpm-old-project/src/main/resources/application.yml @@ -10,7 +10,10 @@ swagger: - org.springblade - com.logpm - +#blade配置 +blade: + data-scope: + enabled: false logging: config: classpath:logback.xml diff --git a/blade-service/logpm-patch/Dockerfile b/blade-service/logpm-patch/Dockerfile index b3bd89d90..5cdb6a43a 100644 --- a/blade-service/logpm-patch/Dockerfile +++ b/blade-service/logpm-patch/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/aspect/JobAnnotationAspect.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/aspect/JobAnnotationAspect.java new file mode 100644 index 000000000..e64602118 --- /dev/null +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/aspect/JobAnnotationAspect.java @@ -0,0 +1,83 @@ +package com.logpm.patch.aspect; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.AllArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Aspect +@Component +@AllArgsConstructor +public class JobAnnotationAspect { + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + + @Around("@annotation(com.xxl.job.core.handler.annotation.XxlJob)") + public Object xxlJobAnnotationMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + + JSONObject jsonObject = mockLogin(); + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.addHeader("Blade-Auth", "bearer "+jsonObject.get("access_token")); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(mockRequest)); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+jsonObject.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + DynamicDataSourceContextHolder.push(jsonObject.getString("tenant_id")); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + + return result; + + + } + + private JSONObject mockLogin() throws InterruptedException { + + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + return data; + } + + +} diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..7fac6567b --- /dev/null +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.patch.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/config/CustomMessageConverter.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/config/CustomMessageConverter.java new file mode 100644 index 000000000..ede01714d --- /dev/null +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/config/CustomMessageConverter.java @@ -0,0 +1,155 @@ +package com.logpm.patch.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.*; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength((long) bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/config/InterceptorAdapterConfig.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/config/InterceptorAdapterConfig.java new file mode 100644 index 000000000..036d0b99e --- /dev/null +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/config/InterceptorAdapterConfig.java @@ -0,0 +1,27 @@ +package com.logpm.patch.config; + +import lombok.AllArgsConstructor; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@AllArgsConstructor +public class InterceptorAdapterConfig implements WebMvcConfigurer { + + private final BladeRedis redis; + + private final Environment environment; + + private final RedisLockClient redisLockClient; + + + @Override + public void addInterceptors(InterceptorRegistry interceptorRegistry) { +// interceptorRegistry.addInterceptor(new LocalServerLoginAccountsInterceptor(redis,environment,redisLockClient)).addPathPatterns("/**").order(1); + + } +} diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/config/RabbitMqConfiguration.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/config/RabbitMqConfiguration.java index 6cba8bca7..98cde1539 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/config/RabbitMqConfiguration.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/config/RabbitMqConfiguration.java @@ -26,6 +26,7 @@ public class RabbitMqConfiguration { RabbitTemplate template = new RabbitTemplate(); template.setConnectionFactory(connectionFactory); template.setMandatory(true); + template.setMessageConverter(new CustomMessageConverter()); template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { @Override public void confirm(CorrelationData correlationData, boolean b, String s) { diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/controller/SyncOrderInfoController.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/controller/SyncOrderInfoController.java index b05f020a9..24d49eb23 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/controller/SyncOrderInfoController.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/controller/SyncOrderInfoController.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.oldproject.feign.IAdvanceClient; import com.logpm.patch.dto.SyncInventoryDTO; import com.logpm.patch.entity.SyncInventoryEntity; import com.logpm.patch.service.ISyncOrderInfoService; @@ -30,6 +31,7 @@ public class SyncOrderInfoController { private final IBasicdataWarehouseClient warehouseClient; private final ISyncOrderInfoService syncOrderInfoService; + private final IAdvanceClient advanceClient; @ResponseBody @PostMapping("/syncOrder") @@ -40,6 +42,7 @@ public class SyncOrderInfoController { try{ String orderCodes = syncInventoryDTO.getOrderCodes(); + Integer syncType = syncInventoryDTO.getSyncType();//1订单 2 运单 if(StringUtil.isBlank(orderCodes)){ log.warn(method+"订单号不能为空 orderCodes={}",orderCodes); @@ -51,16 +54,34 @@ public class SyncOrderInfoController { log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); return R.fail(403,"仓库信息为空"); } + + if(Objects.isNull(syncType)){ + log.warn(method+"数据类型不能为空 syncType={}",syncType); + return R.fail(403,"数据类型不能为空"); + } + + Long warehouseId = myCurrentWarehouse.getId(); log.info(method+" warehouseId={} oldWarehouseId={}",warehouseId,myCurrentWarehouse.getOldId()); BasicdataWarehouseEntity entityWarehouseId = warehouseClient.getEntityWarehouseId(warehouseId); log.info(method+" warehouseId={} oldWarehouseId={}",warehouseId,entityWarehouseId.getOldId()); - - String[] split = orderCodes.split(","); - - List orderCodeList = new ArrayList<>(Arrays.asList(split)); + List orderCodeList = new ArrayList<>(); + if(syncType.equals(1)){ + //订单 + String[] split = orderCodes.split(","); + List list = Arrays.asList(split); + orderCodeList.addAll(list); + }else if(syncType.equals(2)){ + //运单 + List list = advanceClient.findListByWaybillNo(orderCodes); + orderCodeList.addAll(list); + }else{ + log.warn(method+"数据类型不正确 syncType={}",syncType); + return R.fail(403,"数据类型不正确"); + } + log.info(method+"当前处理的订单 orderCodeList={}",orderCodeList); syncOrderInfoService.handleData(orderCodeList,entityWarehouseId.getOldId(),warehouseId,null,null); diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/interceptor/LocalServerLoginAccountsInterceptor.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/interceptor/LocalServerLoginAccountsInterceptor.java new file mode 100644 index 000000000..e1c23bab7 --- /dev/null +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/interceptor/LocalServerLoginAccountsInterceptor.java @@ -0,0 +1,103 @@ +package com.logpm.patch.interceptor; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.common.exception.CustomerException; +import org.springblade.common.wrapper.CustomHttpServletRequestWrapper; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Log4j2 +@AllArgsConstructor +public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapter { + + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + + private final MockLoginService mockLoginService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + + + try { + CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(request); + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + + // 修改或添加header + + // 发送登录请求 + log.info("##########preHandle: request={}", request); + + wrappedRequest.addHeader("Blade-Auth", "bearer "+data.getString("access_token")); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") ); + httpHeaders.add( "Authorization", "Basic c2FiZXI6c2FiZXJfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + + // 用包装后的request替换原始request + request = wrappedRequest; + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + return true; + } catch (Exception e) { + returnJson(response, JSONObject.toJSONString(R.fail(500, "服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + +} diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/DistributionDatarepair.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/DistributionDatarepair.java index 062a8b88d..aae4e8158 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/DistributionDatarepair.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/DistributionDatarepair.java @@ -1,16 +1,27 @@ package com.logpm.patch.jobhandle; +import cn.hutool.json.JSONObject; import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.distribution.entity.DistributionSignforEntity; import com.logpm.distribution.feign.IDistributionDeliveryListClient; import com.logpm.distribution.feign.IDistributionReservationClient; +import com.logpm.distribution.feign.IDistributionSignforClient; +import com.logpm.distribution.feign.IDistrilbutionBillLadingClient; +import com.logpm.patch.mapper.WarehouseMappingDataMapper; import com.logpm.patch.service.ISyncDistributionParcelListService; import com.logpm.warehouse.feign.IWarehouseUpdownTypeClient; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; +import io.jsonwebtoken.lang.Objects; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.RabbitConstant; +import org.springblade.common.utils.CommonUtil; import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.HashMap; @@ -34,7 +45,14 @@ public class DistributionDatarepair { private final IDistributionDeliveryListClient deliveryListClient; private final IDistributionReservationClient distributionReservationClient; + private final RabbitTemplate rabbitTemplate; + private final WarehouseMappingDataMapper warehouseMappingDataMapper; + + + private final IDistributionSignforClient distributionSignforClient; + + private final IDistrilbutionBillLadingClient distrilbutionBillLadingClient; /** * 预约状态修复 @@ -161,6 +179,73 @@ public class DistributionDatarepair { + /** + * 推送老系统系统 + * @return + */ + @XxlJob("pushNotification") + public ReturnT pushNotification(String params) { + // 得到当前仓库所有的签收任务 + Integer parmeId = null; + if(StringUtil.isNotBlank(params)){ + parmeId = Integer.parseInt(params); + } + List allSignfor = warehouseMappingDataMapper.findAllSignfor(parmeId); + for (JSONObject entries : allSignfor) { + Long id = entries.getLong("singnforId"); + + Boolean b = distributionSignforClient.clerkCheckPushData(id); + if(b!=null&&b){ + warehouseMappingDataMapper.updateClearSignforStatus(id, entries.getLong("warehouseId"), 1); + log.info(">>> 推送成功 {}",id); + }else{ + log.error(">>> 推送失败 id="+id); + } + } + return ReturnT.SUCCESS; + } + + /** + * 推送自提签收老系统系统 + * @return + */ + @XxlJob("pushBillNotification") + public ReturnT pushBillNotification(String params) { + // 得到当前仓库所有的签收任务 + Long parmeId = null; + if(StringUtil.isNotBlank(params)){ + parmeId = Long.parseLong(params); + } + List allSignfor = warehouseMappingDataMapper.findAllBillSign(parmeId); + for (JSONObject entries : allSignfor) { + Long id = entries.getLong("billId"); + Boolean b =distrilbutionBillLadingClient.clerkBillCheckPushData(id); + if(b!=null&&b){ + warehouseMappingDataMapper.updateClearSignforStatus(id, entries.getLong("warehouseId"), 1); + log.info(">>> pushBillNotification 成功 id={}",id); + }else{ + log.error(">>> pushBillNotification 失败 id="+id); + } + } + return ReturnT.SUCCESS; + } + + + + /** + * 推送自提签收信息至工厂 + * @return + */ + @XxlJob("sendFactorySignforInfo") + public ReturnT sendFactorySignforInfo(String params) { + // 得到当前仓库所有的签收任务 + Boolean b =distrilbutionBillLadingClient.sendFactorySignforInfo(params); + return ReturnT.SUCCESS; + } + + + + diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/OrderDataRepair.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/OrderDataRepair.java index 13a73f734..16b4de17a 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/OrderDataRepair.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/OrderDataRepair.java @@ -32,6 +32,20 @@ public class OrderDataRepair { return ReturnT.SUCCESS; } + /** + * 维护指定收货单位订单商场信息 + * @param param + * @return + */ + @XxlJob("maintenanceOrderMall") + public ReturnT maintenanceOrderMall(String param) { + log.info("####################OrderDataRepair.maintenanceOrderStatus: 维护订单状态 开始"); + log.info("####################OrderDataRepair.param: param"); + Boolean flag = distributionStockArticleClient.maintenanceOrderMall(param); + log.info("####################OrderDataRepair.maintenanceOrderStatus: 维护订单状态 完成"); + return ReturnT.SUCCESS; + } + @XxlJob("repairOrderSignStatus") public ReturnT repairOrderSignStatus(String param) { diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOldTrayTypeData.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOldTrayTypeData.java index 67077eee9..d26822a79 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOldTrayTypeData.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOldTrayTypeData.java @@ -8,7 +8,8 @@ import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springblade.core.tool.api.R; +import org.springblade.common.constant.RabbitConstant; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Component; import java.util.List; @@ -21,7 +22,7 @@ public class SyncOldTrayTypeData { private final IOldTrayTypeService oldTrayTypeService; private final ISyncOldTrayTypeClient syncOldTrayTypeClient; - + private final RabbitTemplate rabbitTemplate; @XxlJob("syncOldTrayTypeInfo") public ReturnT syncOldTrayTypeInfo(String param) { @@ -31,6 +32,8 @@ public class SyncOldTrayTypeData { for (SyncOldTrayTypeLogEntity syncOldTrayTypeLogEntity : ls) { String args = syncOldTrayTypeLogEntity.getArgs(); Long id = syncOldTrayTypeLogEntity.getId(); + syncOldTrayTypeLogEntity.setMqStatus(1); + oldTrayTypeService.updateMqStatus(id, 1); Integer syncNum = syncOldTrayTypeLogEntity.getSyncNum(); log.info("##############syncOldTrayTypeInfo: 当前同步的数据为 {}",args); JSONObject jsonObject = JSONObject.parseObject(args); @@ -43,13 +46,17 @@ public class SyncOldTrayTypeData { Integer trayId = jsonObject.getInteger("trayId"); Integer oldWarehouseId = jsonObject.getInteger("warehouseId"); - R r = syncOldTrayTypeClient.budaOldTrayTypeData(orderPackageCode, trayId, type, oldWarehouseId); - int code = r.getCode(); - if(200 == code){ - oldTrayTypeService.updateSyncStatus(id,1); - }else{ - oldTrayTypeService.updateSyncNum(id,syncNum+1); - } + jsonObject.put("oldTrayTypeId",id); + + rabbitTemplate.convertAndSend(RabbitConstant.OLD_TRAY_TYPE_EXCHANGE,RabbitConstant.OLD_TRAY_TYPE_ROUTING, jsonObject.toJSONString()); + +// R r = syncOldTrayTypeClient.budaOldTrayTypeData(orderPackageCode, trayId, type, oldWarehouseId); +// int code = r.getCode(); +// if(200 == code){ +// oldTrayTypeService.updateSyncStatus(id,1); +// }else{ +// oldTrayTypeService.updateSyncNum(id,syncNum+1); +// } } return ReturnT.SUCCESS; diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOrderInfoToPlatform.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOrderInfoToPlatform.java index 43df6e19e..113479683 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOrderInfoToPlatform.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOrderInfoToPlatform.java @@ -795,4 +795,42 @@ public class SyncOrderInfoToPlatform { } + @XxlJob("clearTrayTypeInfo") + public ReturnT clearTrayTypeInfo(String param) { + log.info("############clearTrayTypeInfo: 处理托盘重复数据 开始"); + List trayCodes = new ArrayList<>(); + if(StringUtil.isBlank(param)){ + trayCodes = warehouseMappingDataService.findExceptionTrayType(); + }else{ + if(param.contains(",")){ + String[] split = param.split(","); + trayCodes.addAll(Arrays.asList(split)); + }else{ + trayCodes.add(param); + } + } + + trayCodes.forEach(trayCode -> { + + List trayTypeIds = warehouseMappingDataService.findMoreTrayTypeIds(trayCode); + Long aLong = trayTypeIds.get(0); + trayTypeIds.remove(aLong); + + warehouseMappingDataService.updateTrayTypeId(aLong,trayCode); + + warehouseMappingDataService.updateTrayTypeDeleted(trayTypeIds); + + Integer num = warehouseMappingDataService.findTrayTypeNum(trayCode); + + warehouseMappingDataService.updateTrayTypeNum(num,aLong); + + }); + + log.info("############clearTrayTypeInfo: 处理托盘重复数据 完成"); + + return ReturnT.SUCCESS; + } + + + } diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncWarehouseData.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncWarehouseData.java index 504821260..fffdb91ca 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncWarehouseData.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncWarehouseData.java @@ -1,20 +1,26 @@ package com.logpm.patch.jobhandle; +import cn.hutool.core.collection.CollUtil; import cn.hutool.json.JSONObject; import com.logpm.basicdata.entity.*; import com.logpm.basicdata.feign.*; import com.logpm.oldproject.entity.*; import com.logpm.oldproject.feign.*; +import com.logpm.patch.service.ISendFanoutService; import com.logpm.patch.service.IWarehouseMappingDataService; -import com.logpm.warehouse.feign.IWarehouseWaybillClient; +import com.logpm.patch.vo.*; +import com.logpm.warehouse.feign.IWarehouseUpdownTypeClient; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.broadcast.FanoutConstants; +import org.springblade.common.model.FanoutMsg; import org.springblade.core.tool.utils.StringUtil; import org.springframework.stereotype.Component; import java.util.*; +import java.util.stream.Collectors; @Slf4j @AllArgsConstructor @@ -28,7 +34,8 @@ public class SyncWarehouseData { private final IBasicdataGoodsAllocationClient basicdataGoodsAllocationClient;//货位 private final IBasicdataTrayClient basicdataTrayClient;//托盘 - private final IWarehouseWaybillClient warehouseWaybillClient; + private final ISendFanoutService sendFanoutMsg; + private final IWarehouseUpdownTypeClient warehouseUpdownTypeClient; //-----------------老系统 private final IWarehouseClient warehouseClient;//仓库 @@ -377,4 +384,270 @@ public class SyncWarehouseData { return true; } + + @XxlJob("syncAllTrayAndAllocation") + public ReturnT syncAllTrayAndAllocation(String param) { + log.info("############syncAllTrayAndAllocation: 处理所有包件零担库存品的托盘库位信息 开始 param={}", param); + + //需要下架解托的包件Map + Map> delTrayAndAllocationPackageMap = new HashMap<>(); + + + //托盘信息 + //包件 + List packageTrayList = warehouseMappingDataService.findPackageTraysInfo(); + //把packageTrayList中所有元素根据orderPackageStatus进行分组 + Map> packageTrayMap = packageTrayList.stream().collect(Collectors.groupingBy(PackageTrayInfoVO::getOrderPackageStatus)); + packageTrayMap.keySet().forEach(orderPackageStatus -> { + List packageTrayInfoVOS = packageTrayMap.get(orderPackageStatus); + if(!packageTrayInfoVOS.isEmpty()){ + if("60".equals(orderPackageStatus) || "70".equals(orderPackageStatus)){ + //把packageTrayInfoVOS通过warehouseId进行分组,来分仓处理下架解托的包件 + Map> packageTrayInfoVOSMap = packageTrayInfoVOS.stream().collect(Collectors.groupingBy(PackageTrayInfoVO::getWarehouseId)); + packageTrayInfoVOSMap.keySet().forEach(warehouseId -> { + List packageTrayInfoVOS1 = packageTrayInfoVOSMap.get(warehouseId); + if(!packageTrayInfoVOS1.isEmpty()){ + //把packageTrayInfoVOS1中的orderPackageCode放入一个List + List orderPackageCodeList = packageTrayInfoVOS1.stream().map(PackageTrayInfoVO::getOrderPackageCode).collect(Collectors.toList()); + List list = delTrayAndAllocationPackageMap.get(warehouseId); + if(CollUtil.isEmpty(list)){ + delTrayAndAllocationPackageMap.put(warehouseId,orderPackageCodeList); + }else{ + list.addAll(orderPackageCodeList); + delTrayAndAllocationPackageMap.put(warehouseId,list); + } + } + }); + }else{ + //如果不是签收或者出库的包件 + //把packageTrayInfoVOS通过conditions进行分组 + Map> packageTrayInfoVOSMap = packageTrayInfoVOS.stream().collect(Collectors.groupingBy(PackageTrayInfoVO::getConditions)); + packageTrayInfoVOSMap.keySet().forEach(conditions -> { + List packageTrayInfoVOS1 = packageTrayInfoVOSMap.get(conditions); + if(!packageTrayInfoVOS1.isEmpty()){ + + //把packageTrayInfoVOS1中所有元素的warehouseId进行分组 + Map> packageTrayInfoVOSMap1 = packageTrayInfoVOS1.stream().collect(Collectors.groupingBy(PackageTrayInfoVO::getWarehouseId)); + packageTrayInfoVOSMap1.keySet().forEach(warehouseId -> { + List packageTrayInfoVOS2 = packageTrayInfoVOSMap1.get(warehouseId); + if(!packageTrayInfoVOS2.isEmpty()){ + //把packageTrayInfoVOS2中所有元素根据trayName进行分组 + Map> packageTrayInfoVOSMap2 = packageTrayInfoVOS2.stream().collect(Collectors.groupingBy(PackageTrayInfoVO::getTrayName)); + packageTrayInfoVOSMap2.keySet().forEach(trayName -> { + List packageTrayInfoVOS3 = packageTrayInfoVOSMap2.get(trayName); + if(!packageTrayInfoVOS3.isEmpty()){ + //订制品 + JSONObject jsonObject = new JSONObject(); + jsonObject.set("dataType",1); + jsonObject.set("operation",1); + jsonObject.set("conditions",conditions); + List orderPackageCodes = packageTrayInfoVOS3.stream().map(PackageTrayInfoVO::getOrderPackageCode).collect(Collectors.toList()); + jsonObject.set("orderPackageCodes",orderPackageCodes); + jsonObject.set("warehouseId",warehouseId); + jsonObject.set("trayName",trayName); + FanoutMsg fanoutMsg = FanoutMsg.builder().exchange(FanoutConstants.warehouse.TRAYTYPE.EXCHANGE).msg(jsonObject.toString()).build(); + sendFanoutMsg.sendFanoutMsg(fanoutMsg); + } + }); + + } + }); + } + }); + + } + } + }); + + //零担 + List zeroTrayList = warehouseMappingDataService.findZeroTraysInfo(); + //把zeroTrayList通过warehouseId进行分组 + Map> zeroTrayMap = zeroTrayList.stream().collect(Collectors.groupingBy(ZeroTrayInfoVO::getWarehouseId)); + zeroTrayMap.keySet().forEach(warehouseId -> { + List zeroTrayInfoVOS = zeroTrayMap.get(warehouseId); + if(!zeroTrayInfoVOS.isEmpty()){ + //把zeroTrayInfoVOS通过trayName进行分组 + Map> zeroTrayInfoVOSMap = zeroTrayInfoVOS.stream().collect(Collectors.groupingBy(ZeroTrayInfoVO::getTrayName)); + zeroTrayInfoVOSMap.keySet().forEach(trayName -> { + List zeroTrayInfoVOS1 = zeroTrayInfoVOSMap.get(trayName); + if(!zeroTrayInfoVOS1.isEmpty()){ + //把zeroTrayInfoVOS1中所有元素的orderCode放入一个List + List orderCodes = zeroTrayInfoVOS1.stream().map(ZeroTrayInfoVO::getOrderCode).collect(Collectors.toList()); + //订制品 + JSONObject jsonObject = new JSONObject(); + jsonObject.set("dataType",2); + jsonObject.set("operation",1); + jsonObject.set("orderCodes",orderCodes); + jsonObject.set("warehouseId",warehouseId); + jsonObject.set("trayName",trayName); + FanoutMsg fanoutMsg = FanoutMsg.builder().exchange(FanoutConstants.warehouse.TRAYTYPE.EXCHANGE).msg(jsonObject.toString()).build(); + sendFanoutMsg.sendFanoutMsg(fanoutMsg); + } + }); + } + }); + + + //无数据库存品 + List stockTrayList = warehouseMappingDataService.findStockTraysInfo(); + //把stockTrayList通过warehouseId分组 + Map> stockTrayMap = stockTrayList.stream().collect(Collectors.groupingBy(StockTrayInfoVO::getWarehouseId)); + stockTrayMap.keySet().forEach(warehouseId -> { + List stockTrayInfoVOS = stockTrayMap.get(warehouseId); + if(!stockTrayInfoVOS.isEmpty()){ + //把stockTrayInfoVOS通过trayName进行分组 + Map> stockTrayInfoVOSMap = stockTrayInfoVOS.stream().collect(Collectors.groupingBy(StockTrayInfoVO::getTrayName)); + stockTrayInfoVOSMap.keySet().forEach(trayName -> { + List stockTrayInfoVOS1 =stockTrayInfoVOSMap.get(trayName); + if(!stockTrayInfoVOS1.isEmpty()){ + //把stockTrayInfoVOS1中所有元素的stockListId放入一个List + JSONObject jsonObject = new JSONObject(); + jsonObject.set("dataType",3); + jsonObject.set("operation",1); + List stockListIds = stockTrayInfoVOS1.stream().map(StockTrayInfoVO::getStockListId).collect(Collectors.toList()); + jsonObject.set("stockListIds",stockListIds); + jsonObject.set("warehouseId",warehouseId); + jsonObject.set("trayName",trayName); + FanoutMsg fanoutMsg = FanoutMsg.builder().exchange(FanoutConstants.warehouse.TRAYTYPE.EXCHANGE).msg(jsonObject.toString()).build(); + sendFanoutMsg.sendFanoutMsg(fanoutMsg); + } + }); + } + }); + + //库位 + //包件 + List packageAllocationData = warehouseMappingDataService.findPackageAllocationData(); + //把packageTrayList中所有元素根据orderPackageStatus进行分组 + Map> packageAllocationMap = packageAllocationData.stream().collect(Collectors.groupingBy(PackageAllocationInfoVO::getOrderPackageStatus)); + packageAllocationMap.keySet().forEach(orderPackageStatus -> { + List packageAllocationInfoVOS = packageAllocationMap.get(orderPackageStatus); + if(!packageAllocationInfoVOS.isEmpty()){ + if("60".equals(orderPackageStatus) || "70".equals(orderPackageStatus)){ + //把packageTrayInfoVOS通过warehouseId进行分组,来分仓处理下架解托的包件 + Map> packageAllocationInfoVOSMap = packageAllocationInfoVOS.stream().collect(Collectors.groupingBy(PackageAllocationInfoVO::getWarehouseId)); + packageAllocationInfoVOSMap.keySet().forEach(warehouseId -> { + List packageAllocationInfoVOS1 = packageAllocationInfoVOSMap.get(warehouseId); + if(!packageAllocationInfoVOS1.isEmpty()){ + //把packageTrayInfoVOS1中的orderPackageCode放入一个List + List orderPackageCodeList = packageAllocationInfoVOS1.stream().map(PackageAllocationInfoVO::getOrderPackageCode).collect(Collectors.toList()); + List list = delTrayAndAllocationPackageMap.get(warehouseId); + if(CollUtil.isEmpty(list)){ + delTrayAndAllocationPackageMap.put(warehouseId,orderPackageCodeList); + }else{ + list.addAll(orderPackageCodeList); + delTrayAndAllocationPackageMap.put(warehouseId,list); + } + } + }); + }else{ + //如果不是签收或者出库的包件 + //把packageTrayInfoVOS通过conditions进行分组 + Map> packageAllocationInfoVOSMap = packageAllocationInfoVOS.stream().collect(Collectors.groupingBy(PackageAllocationInfoVO::getConditions)); + packageAllocationInfoVOSMap.keySet().forEach(conditions -> { + List packageAllocationInfoVOS1 = packageAllocationInfoVOSMap.get(conditions); + if(!packageAllocationInfoVOS1.isEmpty()){ + + //把packageTrayInfoVOS1中所有元素的warehouseId进行分组 + Map> packageAllocationInfoVOSMap1 = packageAllocationInfoVOS1.stream().collect(Collectors.groupingBy(PackageAllocationInfoVO::getWarehouseId)); + packageAllocationInfoVOSMap1.keySet().forEach(warehouseId -> { + List packageAllocationInfoVOS2 = packageAllocationInfoVOSMap1.get(warehouseId); + if(!packageAllocationInfoVOS2.isEmpty()){ + //把packageTrayInfoVOS2中所有元素根据trayName进行分组 + Map> packageAllocationInfoVOSMap2 = packageAllocationInfoVOS2.stream().collect(Collectors.groupingBy(PackageAllocationInfoVO::getAllocationName)); + packageAllocationInfoVOSMap2.keySet().forEach(allocationName -> { + List packageAllocationInfoVOS3 = packageAllocationInfoVOSMap2.get(allocationName); + if(!packageAllocationInfoVOS3.isEmpty()){ + //订制品 + JSONObject jsonObject = new JSONObject(); + jsonObject.set("dataType",1); + jsonObject.set("operation",3); + jsonObject.set("conditions",conditions); + List orderPackageCodes = packageAllocationInfoVOS3.stream().map(PackageAllocationInfoVO::getOrderPackageCode).collect(Collectors.toList()); + jsonObject.set("orderPackageCodes",orderPackageCodes); + jsonObject.set("warehouseId",warehouseId); + jsonObject.set("allocationName",allocationName); + FanoutMsg fanoutMsg = FanoutMsg.builder().exchange(FanoutConstants.warehouse.ALLOCATION.EXCHANGE).msg(jsonObject.toString()).build(); + sendFanoutMsg.sendFanoutMsg(fanoutMsg); + } + }); + } + }); + } + }); + + } + } + }); + + //零担 + List zeroAllocationList = warehouseMappingDataService.findZeroAllocationInfo(); + //把zeroTrayList通过warehouseId进行分组 + Map> zeroAllocationMap = zeroAllocationList.stream().collect(Collectors.groupingBy(ZeroAllocationInfoVO::getWarehouseId)); + zeroAllocationMap.keySet().forEach(warehouseId -> { + List zeroAllocationInfoVOS = zeroAllocationMap.get(warehouseId); + if(!zeroAllocationInfoVOS.isEmpty()){ + //把zeroTrayInfoVOS通过trayName进行分组 + Map> zeroAllocationInfoVOSMap = zeroAllocationInfoVOS.stream().collect(Collectors.groupingBy(ZeroAllocationInfoVO::getAllocationName)); + zeroAllocationInfoVOSMap.keySet().forEach(allocationName -> { + List zeroAllocationInfoVOS1 = zeroAllocationInfoVOSMap.get(allocationName); + if(!zeroAllocationInfoVOS1.isEmpty()){ + //把zeroTrayInfoVOS1中所有元素的orderCode放入一个List + List orderCodes = zeroAllocationInfoVOS1.stream().map(ZeroAllocationInfoVO::getOrderCode).collect(Collectors.toList()); + //订制品 + JSONObject jsonObject = new JSONObject(); + jsonObject.set("dataType",2); + jsonObject.set("operation",3); + jsonObject.set("orderCodes",orderCodes); + jsonObject.set("warehouseId",warehouseId); + jsonObject.set("allocationName",allocationName); + FanoutMsg fanoutMsg = FanoutMsg.builder().exchange(FanoutConstants.warehouse.ALLOCATION.EXCHANGE).msg(jsonObject.toString()).build(); + sendFanoutMsg.sendFanoutMsg(fanoutMsg); + } + }); + } + }); + + + //无数据库存品 + List stockAllocationList = warehouseMappingDataService.findStockAllocationInfo(); + //把stockTrayList通过warehouseId分组 + Map> stockAllocationMap = stockAllocationList.stream().collect(Collectors.groupingBy(StockAllocationInfoVO::getWarehouseId)); + stockAllocationMap.keySet().forEach(warehouseId -> { + List stockAllocationInfoVOS = stockAllocationMap.get(warehouseId); + if(!stockAllocationInfoVOS.isEmpty()){ + //把stockTrayInfoVOS通过trayName进行分组 + Map> stockAllocationInfoVOSMap = stockAllocationInfoVOS.stream().collect(Collectors.groupingBy(StockAllocationInfoVO::getAllocationName)); + stockAllocationInfoVOSMap.keySet().forEach(allocationName -> { + List stockAllocationInfoVOS1 =stockAllocationInfoVOSMap.get(allocationName); + if(!stockAllocationInfoVOS1.isEmpty()){ + //把stockTrayInfoVOS1中所有元素的stockListId放入一个List + JSONObject jsonObject = new JSONObject(); + jsonObject.set("dataType",3); + jsonObject.set("operation",3); + List stockListIds = stockAllocationInfoVOS1.stream().map(StockAllocationInfoVO::getStockListId).collect(Collectors.toList()); + jsonObject.set("stockListIds",stockListIds); + jsonObject.set("warehouseId",warehouseId); + jsonObject.set("allocationName",allocationName); + FanoutMsg fanoutMsg = FanoutMsg.builder().exchange(FanoutConstants.warehouse.ALLOCATION.EXCHANGE).msg(jsonObject.toString()).build(); + sendFanoutMsg.sendFanoutMsg(fanoutMsg); + } + }); + } + }); + +// delTrayAndAllocationPackageMap.keySet().forEach(warehouseId -> { +// List list = delTrayAndAllocationPackageMap.get(warehouseId); +// if(!list.isEmpty()){ +// Set orderPackageCodes = new HashSet<>(list); +// warehouseUpdownTypeClient.downPackageOrDelTray(StringUtil.join(orderPackageCodes,","),warehouseId,"系统因为签收或者出库下架解托"); +// } +// }); + + + log.info("############syncAllTrayAndAllocation: 处理所有包件零担库存品的托盘库位信息 结束"); + return ReturnT.SUCCESS; + } + + } diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/OldTrayTypeMapper.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/OldTrayTypeMapper.java index 604b5954b..d3ae4e6e1 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/OldTrayTypeMapper.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/OldTrayTypeMapper.java @@ -13,4 +13,6 @@ public interface OldTrayTypeMapper { void updateSyncStatus(@Param("id") Long id, @Param("syncStatus") int syncStatus); void updateSyncNum(@Param("id") Long id, @Param("syncNum") int syncNum); + + void updateMqStatus(@Param("id") Long id, @Param("mqStatus") int mqStatus); } diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/OldTrayTypeMapper.xml b/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/OldTrayTypeMapper.xml index 25c58c4f2..bf43fefff 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/OldTrayTypeMapper.xml +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/OldTrayTypeMapper.xml @@ -7,6 +7,7 @@ from sync_old_tray_type_log where sync_status = #{syncStatus} and sync_num < #{syncNum} + and mq_status = 0 @@ -21,4 +22,10 @@ where id = #{id} + + update sync_old_tray_type_log + set mq_status = #{mqStatus} + where id = #{id} + + diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/WarehouseMappingDataMapper.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/WarehouseMappingDataMapper.java index 7ac43cee3..01f043e41 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/WarehouseMappingDataMapper.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/WarehouseMappingDataMapper.java @@ -2,7 +2,7 @@ package com.logpm.patch.mapper; import cn.hutool.json.JSONObject; import com.logpm.patch.entity.WarehouseMappingDataEntity; -import com.logpm.patch.vo.SyncZeroOrderVO; +import com.logpm.patch.vo.*; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -90,4 +90,37 @@ public interface WarehouseMappingDataMapper { void updatePackageUpdownStatus(@Param("id") Integer id, @Param("syncStatus") Integer syncStatus); + + List findAllSignfor(@Param("id") Integer id); + + void updateClearSignforStatus(@Param("singnforId") Long singnforId, @Param("warehouseId") Long warehouseId, @Param("dealStatus") Integer dealStatus); + void updateClearBillSignforStatus(@Param("singnforId") Long singnforId, @Param("warehouseId") Long warehouseId, @Param("dealStatus") Integer dealStatus); + + List findAllBillSign(@Param("id") Long id); + + List findExceptionTrayType(); + + List findMoreTrayTypeIds(@Param("trayCode") String trayCode); + + void updateTrayTypeId(@Param("trayTypeId") Long aLong, @Param("trayCode") String trayCode); + + void updateTrayTypeDeleted(@Param("trayTypeIds") List trayTypeIds); + + Integer findTrayTypeNum(@Param("trayCode") String trayCode); + + void updateTrayTypeNum(@Param("num") Integer num, @Param("aLong") Long aLong); + + List findPackageTraysInfo(); + + List findZeroTraysInfo(); + + List findStockTraysInfo(); + + List findPackageAllocationData(); + + List findZeroAllocationInfo(); + + List findStockAllocationInfo(); + } + diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/WarehouseMappingDataMapper.xml b/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/WarehouseMappingDataMapper.xml index a75c435a5..1d31d9ead 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/WarehouseMappingDataMapper.xml +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/mapper/WarehouseMappingDataMapper.xml @@ -270,4 +270,147 @@ where id = #{id} + + + + + + + update clear_singnfor_status_record + set deal_status = #{dealStatus} + where singnfor_id = #{singnforId} + and warehouse_id = #{warehouseId} + + + + update clear_bill_singnfor_status_record + set deal_status = #{dealStatus} + where singnfor_id = #{singnforId} + and warehouse_id = #{warehouseId} + + + + + + + + update logpm_warehouse_tray_goods + set tray_type_id = #{trayTypeId} + where tray_code = #{trayCode} + and is_deleted = 0 + + + + update logpm_warehouse_tray_type + set is_deleted = 1 + where id in + + #{item} + + + + + + + update logpm_warehouse_tray_type + set total_num = #{num} + where id = #{aLong} + + + + + + + + + + + + + + diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/IOldTrayTypeService.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/IOldTrayTypeService.java index e7c35f4a2..060ee1e4d 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/IOldTrayTypeService.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/IOldTrayTypeService.java @@ -10,4 +10,6 @@ public interface IOldTrayTypeService { void updateSyncStatus(Long id, int syncStatus); void updateSyncNum(Long id, int syncNum); + + void updateMqStatus(Long id, int mqStatus); } diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/ISendFanoutService.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/ISendFanoutService.java new file mode 100644 index 000000000..f6bf478f7 --- /dev/null +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/ISendFanoutService.java @@ -0,0 +1,7 @@ +package com.logpm.patch.service; + +import org.springblade.common.model.FanoutMsg; + +public interface ISendFanoutService { + void sendFanoutMsg(FanoutMsg fanoutMsg); +} diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/IWarehouseMappingDataService.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/IWarehouseMappingDataService.java index cb0e28ea1..390d86299 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/IWarehouseMappingDataService.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/IWarehouseMappingDataService.java @@ -2,7 +2,7 @@ package com.logpm.patch.service; import cn.hutool.json.JSONObject; import com.logpm.patch.entity.WarehouseMappingDataEntity; -import com.logpm.patch.vo.SyncZeroOrderVO; +import com.logpm.patch.vo.*; import java.util.List; @@ -87,4 +87,29 @@ public interface IWarehouseMappingDataService { List findPackageUpdownData(); void updatePackageUpdownStatus(Integer id, Integer syncStatus); + + List findExceptionTrayType(); + + List findMoreTrayTypeIds(String trayCode); + + void updateTrayTypeId(Long aLong,String trayCode); + + void updateTrayTypeDeleted(List trayTypeIds); + + Integer findTrayTypeNum(String trayCode); + + void updateTrayTypeNum(Integer num, Long aLong); + + List findPackageTraysInfo(); + + List findZeroTraysInfo(); + + List findStockTraysInfo(); + + List findPackageAllocationData(); + + List findZeroAllocationInfo(); + + List findStockAllocationInfo(); + } diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/AsyncDataServiceImpl.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/AsyncDataServiceImpl.java index 87f57d76e..81483d604 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/AsyncDataServiceImpl.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/AsyncDataServiceImpl.java @@ -13,6 +13,7 @@ import com.logpm.patch.service.ISyncOrderInfoService; import com.logpm.patch.service.IWarehouseMappingDataService; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; +import org.springblade.common.annotations.LogpmAsync; import org.springblade.common.exception.CustomerException; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -40,7 +41,7 @@ public class AsyncDataServiceImpl implements IAsyncDataService { @Override - @Async + @LogpmAsync("asyncExecutor") public void syncInventoryToPlatform(SyncInventoryEntity syncInventoryEntity) { Integer pageSize = 500;//处理的每页条数 diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/OldTrayTypeServiceImpl.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/OldTrayTypeServiceImpl.java index d57d885fa..b47c78cba 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/OldTrayTypeServiceImpl.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/OldTrayTypeServiceImpl.java @@ -31,4 +31,9 @@ public class OldTrayTypeServiceImpl implements IOldTrayTypeService { public void updateSyncNum(Long id, int syncNum) { oldTrayTypeMapper.updateSyncNum(id,syncNum); } + + @Override + public void updateMqStatus(Long id, int mqStatus) { + oldTrayTypeMapper.updateMqStatus(id,mqStatus); + } } diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/SendFanoutServiceImpl.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/SendFanoutServiceImpl.java new file mode 100644 index 000000000..4488ac910 --- /dev/null +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/SendFanoutServiceImpl.java @@ -0,0 +1,24 @@ +package com.logpm.patch.service.impl; + +import com.logpm.patch.service.ISendFanoutService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.model.FanoutMsg; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +@Slf4j +public class SendFanoutServiceImpl implements ISendFanoutService { + + private final RabbitTemplate rabbitTemplate; + +// @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(value = 3000, multiplier = 1.5)) + @Override + public void sendFanoutMsg(FanoutMsg fanoutMsg) { + + rabbitTemplate.convertAndSend(fanoutMsg.getExchange(),null, fanoutMsg.getMsg()); + + } +} diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/SyncOrderInfoServiceImpl.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/SyncOrderInfoServiceImpl.java index 08529c467..90f253a35 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/SyncOrderInfoServiceImpl.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/SyncOrderInfoServiceImpl.java @@ -235,7 +235,7 @@ public class SyncOrderInfoServiceImpl implements ISyncOrderInfoService { List parcelListEntityList = distributionParcelListClient.getListByOrderPackageCode(orderPackageCode); for (DistributionParcelListEntity parcelListEntity : parcelListEntityList) { Long warehouseId = parcelListEntity.getWarehouseId(); - parcelListEntity.setWaybillId(waybillId+""); + parcelListEntity.setWaybillId(waybillId); parcelListEntity.setWaybillNumber(waybillNo); parcelListEntity.setSendWarehouseId(departureWarehouseId); parcelListEntity.setSendWarehouseName(departureWarehouseName); @@ -327,11 +327,11 @@ public class SyncOrderInfoServiceImpl implements ISyncOrderInfoService { if(!Objects.isNull(parcelListEntity)){ String orderCode = parcelListEntity.getOrderCode(); parcelListEntity.setOrderPackageStatus("20"); - parcelListEntity.setOrderPackageGroundingStatus("10"); +// parcelListEntity.setOrderPackageGroundingStatus("10"); distributionParcelListClient.update(parcelListEntity); distributionStockArticleClient.updateOrderInfo(orderCode,warehouseId); - warehouseUpdownTypeClient.downPackageOrDelTray(orderPackageCode,warehouseId,"系统在库下架解托"); +// warehouseUpdownTypeClient.downPackageOrDelTray(orderPackageCode,warehouseId,"系统在库下架解托"); } } @@ -1070,8 +1070,10 @@ public class SyncOrderInfoServiceImpl implements ISyncOrderInfoService { warehouseWaybill.setConsigneeName(wayBillEntity.getTakePerson()); warehouseWaybill.setConsigneeMobile(wayBillEntity.getTakeMobile()); warehouseWaybill.setConsigneeAddress(wayBillEntity.getTakeAddress()); - String arriveSite = wayBillEntity.getArriveSite(); - String code = regionFeign.getCode(arriveSite); +// String arriveSite = wayBillEntity.getArriveSite(); + Integer arriveSiteId = wayBillEntity.getArriveSiteId(); + String code = wayBillClient.findAreaCodeByArriveSiteId(arriveSiteId); +// String code = regionFeign.getCode(arriveSite); warehouseWaybill.setDestinationCode(code); warehouseWaybill.setDestination(wayBillEntity.getArriveSite()); warehouseWaybill.setGoodsName(packname); @@ -1322,7 +1324,7 @@ public class SyncOrderInfoServiceImpl implements ISyncOrderInfoService { List orderDetailList = orderDetailClient.findByOrderCode(orderCode,oldWarehouseId); for (OrderDetailEntity orderDetailEntity:orderDetailList){ String unitNo = orderDetailEntity.getUnitNo(); - DistributionParcelListEntity parcelListEntity = distributionParcelListClient.findByPacketBarCode(unitNo); + DistributionParcelListEntity parcelListEntity = distributionParcelListClient.findByPacketBarCodeAndWarehouseId(unitNo,basicdataWarehouseEntity.getId()); if(!Objects.isNull(parcelListEntity)){ log.info("###########saveOrderPackage: 包条已存在,不同步 unitNo={}",unitNo); continue; @@ -1458,6 +1460,12 @@ public class SyncOrderInfoServiceImpl implements ISyncOrderInfoService { log.warn("#################saveOrderInfo: 运单信息为空 orderCode={}",orderCode); throw new CustomerException(403,"运单信息为空"); } + Integer warehouseId = wayBillEntity.getWarehouseId(); + if(!warehouseId.equals(oldWarehouseId)){ + log.warn("#################saveOrderInfo: 包件还未到达目的仓,不同步 warehouseId={} oldWarehouseId={}",warehouseId,oldWarehouseId); + throw new CustomerException(403,"包件还未到达目的仓,不同步"); + } + BasicdataWarehouseEntity basicdataWarehouseEntity = basicdataWarehouseClient.getEntityWarehouseId(newWarehouseId); if(Objects.isNull(basicdataWarehouseEntity)){ @@ -1595,7 +1603,7 @@ public class SyncOrderInfoServiceImpl implements ISyncOrderInfoService { Integer carsType = orderDetailEntity.getCarsType(); Integer signState = orderDetailEntity.getSignState(); waybillNo = orderDetailEntity.getWaybillNo(); - Date rukuTime = orderDetailEntity.getCreateTime(); + Date rukuTime = orderDetailEntity.getUpdateTime(); if(StringUtil.isBlank(waybillNo)){ Integer advanceId = orderDetailEntity.getAdvanceId(); AdvanceEntity advanceEntity = advanceClient.fingById(advanceId); diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/WarehouseMappingDataServiceImpl.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/WarehouseMappingDataServiceImpl.java index cf23814c8..8fe26b650 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/WarehouseMappingDataServiceImpl.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/service/impl/WarehouseMappingDataServiceImpl.java @@ -4,7 +4,7 @@ import cn.hutool.json.JSONObject; import com.logpm.patch.entity.WarehouseMappingDataEntity; import com.logpm.patch.mapper.WarehouseMappingDataMapper; import com.logpm.patch.service.IWarehouseMappingDataService; -import com.logpm.patch.vo.SyncZeroOrderVO; +import com.logpm.patch.vo.*; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -205,4 +205,64 @@ public class WarehouseMappingDataServiceImpl implements IWarehouseMappingDataSer public void updatePackageUpdownStatus(Integer id, Integer syncStatus) { warehouseMappingDataMapper.updatePackageUpdownStatus(id,syncStatus); } + + @Override + public List findExceptionTrayType() { + return warehouseMappingDataMapper.findExceptionTrayType(); + } + + @Override + public List findMoreTrayTypeIds(String trayCode) { + return warehouseMappingDataMapper.findMoreTrayTypeIds(trayCode); + } + + @Override + public void updateTrayTypeId(Long aLong,String trayCode) { + warehouseMappingDataMapper.updateTrayTypeId(aLong,trayCode); + } + + @Override + public void updateTrayTypeDeleted(List trayTypeIds) { + warehouseMappingDataMapper.updateTrayTypeDeleted(trayTypeIds); + } + + @Override + public Integer findTrayTypeNum(String trayCode) { + return warehouseMappingDataMapper.findTrayTypeNum(trayCode); + } + + @Override + public void updateTrayTypeNum(Integer num, Long aLong) { + warehouseMappingDataMapper.updateTrayTypeNum(num,aLong); + } + + @Override + public List findPackageTraysInfo() { + return warehouseMappingDataMapper.findPackageTraysInfo(); + } + + @Override + public List findZeroTraysInfo() { + return warehouseMappingDataMapper.findZeroTraysInfo(); + } + + @Override + public List findStockTraysInfo() { + return warehouseMappingDataMapper.findStockTraysInfo(); + } + + @Override + public List findPackageAllocationData() { + return warehouseMappingDataMapper.findPackageAllocationData(); + } + + @Override + public List findZeroAllocationInfo() { + return warehouseMappingDataMapper.findZeroAllocationInfo(); + } + + @Override + public List findStockAllocationInfo() { + return warehouseMappingDataMapper.findStockAllocationInfo(); + } } diff --git a/blade-service/logpm-patch/src/main/resources/application-dev.yml b/blade-service/logpm-patch/src/main/resources/application-dev.yml index 36a4e5360..5fa0b1f73 100644 --- a/blade-service/logpm-patch/src/main/resources/application-dev.yml +++ b/blade-service/logpm-patch/src/main/resources/application-dev.yml @@ -39,7 +39,7 @@ spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -60,12 +60,12 @@ spring: url: ${blade.datasource.patch.master.url} username: ${blade.datasource.patch.master.username} password: ${blade.datasource.patch.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.patch.slave.url} - username: ${blade.datasource.patch.slave.username} - password: ${blade.datasource.patch.slave.password} + url: ${blade.datasource.patch.627683.url} + username: ${blade.datasource.patch.627683.username} + password: ${blade.datasource.patch.627683.password} diff --git a/blade-service/logpm-patch/src/main/resources/application-prod.yml b/blade-service/logpm-patch/src/main/resources/application-prod.yml index 3de00a5c8..74ceef769 100644 --- a/blade-service/logpm-patch/src/main/resources/application-prod.yml +++ b/blade-service/logpm-patch/src/main/resources/application-prod.yml @@ -39,7 +39,7 @@ spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: diff --git a/blade-service/logpm-patch/src/main/resources/application-test.yml b/blade-service/logpm-patch/src/main/resources/application-test.yml index 51d73fdf2..dc2ff6b68 100644 --- a/blade-service/logpm-patch/src/main/resources/application-test.yml +++ b/blade-service/logpm-patch/src/main/resources/application-test.yml @@ -39,7 +39,7 @@ spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: diff --git a/blade-service/logpm-report/Dockerfile b/blade-service/logpm-report/Dockerfile index cd4fe081b..543aee8e9 100644 --- a/blade-service/logpm-report/Dockerfile +++ b/blade-service/logpm-report/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-report/src/main/java/com/logpm/report/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..43e374734 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.report.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/config/ExecutorConfig.java b/blade-service/logpm-report/src/main/java/com/logpm/report/config/ExecutorConfig.java new file mode 100644 index 000000000..195483452 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/config/ExecutorConfig.java @@ -0,0 +1,82 @@ +package com.logpm.report.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + String tenantId = AuthUtil.getTenantId(); + Map all = ThreadLocalUtil.getAll(); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + all.keySet().forEach(key -> ThreadLocalUtil.put(key, all.get(key))); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + String tenantId1 = AuthUtil.getTenantId(); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + all.clear(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/controller/ReportBillLoadingController.java b/blade-service/logpm-report/src/main/java/com/logpm/report/controller/ReportBillLoadingController.java index 2bdca6788..fc327e1b5 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/controller/ReportBillLoadingController.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/controller/ReportBillLoadingController.java @@ -1,12 +1,7 @@ package com.logpm.report.controller; -import cn.hutool.core.util.EnumUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import com.logpm.factorydata.enums.BrandEnums; -import org.springblade.common.constant.WorkNodeEnums; -import com.logpm.factorydata.util.FactoryDataMessageSender; -import com.logpm.factorydata.vo.NodePushMsg; import com.logpm.report.query.BillDetailsQuery; import com.logpm.report.query.BillLoadingTasksQuery; import com.logpm.report.service.IReportBillLoadingAsyncService; @@ -17,15 +12,10 @@ import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springblade.core.tool.api.R; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; -import java.util.Date; -import java.util.List; -import java.util.Map; /** * 自提报表前端控制器 @@ -41,25 +31,6 @@ public class ReportBillLoadingController { private IReportBillLoadingAsyncService reportBillLoadingAsyncService; - private final FactoryDataMessageSender sender; - - @PostMapping("/sendMessage") - @ApiOperation(value = "发送消息测试", notes = "发送消息测试") - public R tasksPage(@RequestBody Map map) { - String node = (String) map.get("node"); - WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node); - NodePushMsg build = NodePushMsg.builder() - .node(workNodeEnums) - .brand(BrandEnums.ZB) - .operatorTime(new Date()) - .operator((String) map.get("operator")) - .address((String) map.get("address")) - .content((List) map.get("content")) - .build(); - sender.sendNodeDataByBrand(build); - return R.data("成功"); - } - @GetMapping("/tasks") @ApiOperationSupport(order = 1) @ApiOperation(value = "自提任务维度", notes = "自提任务维度") diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/controller/WarehouseIndexController.java b/blade-service/logpm-report/src/main/java/com/logpm/report/controller/WarehouseIndexController.java new file mode 100644 index 000000000..61ed1fa9d --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/controller/WarehouseIndexController.java @@ -0,0 +1,346 @@ +package com.logpm.report.controller; + +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.report.dto.IndexDTO; +import com.logpm.report.service.IWarehouseIndexService; +import com.logpm.report.vo.*; +import com.logpm.report.vo.indexCount.IndexDeliveryDataVO; +import com.logpm.report.vo.indexCount.IndexSignforDataVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Log4j2 +@RestController +@AllArgsConstructor +@RequestMapping("/warehouseIndex") +@Api(value = "仓库首页控制类", tags = "仓库首页数据") +public class WarehouseIndexController { + + private IBasicdataWarehouseClient warehouseClient; + private IWarehouseIndexService warehouseIndexService; + + @ResponseBody + @PostMapping("/openOrderData") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "开单数据", notes = "传入indexDTO") + public R openOrderData(@RequestBody IndexDTO indexDTO) { + String method = "###########openOrderData: "; + log.info(method+"indexDTO={}",indexDTO); + + try{ + List warehouseIds = new ArrayList<>(); + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + List myWatchWarehouse = warehouseClient.getMyWatchWarehouse(); + myWatchWarehouse.forEach(warehouseEntity -> { + warehouseIds.add(warehouseEntity.getId()); + }); + }else{ + warehouseIds.add(myCurrentWarehouse.getId()); + } + indexDTO.setWarehouseIds(warehouseIds); + + //查询订制品打托列表 + IndexOpenOrderDataVO indexOpenOrderDataVO = warehouseIndexService.openOrderData(indexDTO); + return R.data(indexOpenOrderDataVO); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } + + + @ResponseBody + @PostMapping("/openOrderIncome") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "开单收入数据", notes = "传入indexDTO") + public R openOrderIncome(@RequestBody IndexDTO indexDTO) { + String method = "###########openOrderIncome: "; + log.info(method+"indexDTO={}",indexDTO); + + try{ + List warehouseIds = new ArrayList<>(); + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + List myWatchWarehouse = warehouseClient.getMyWatchWarehouse(); + myWatchWarehouse.forEach(warehouseEntity -> { + warehouseIds.add(warehouseEntity.getId()); + }); + }else{ + warehouseIds.add(myCurrentWarehouse.getId()); + } + indexDTO.setWarehouseIds(warehouseIds); + + //查询订制品打托列表 + IndexOpenOrderIncomeVO indexOpenOrderIncomeVO = warehouseIndexService.openOrderIncome(indexDTO); + return R.data(indexOpenOrderIncomeVO); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } + + + @ResponseBody + @PostMapping("/handOrderData") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "当前在库数据", notes = "传入indexDTO") + public R handOrderData(@RequestBody IndexDTO indexDTO) { + String method = "###########handOrderData: "; + log.info(method+"indexDTO={}",indexDTO); + + try{ + List warehouseIds = new ArrayList<>(); + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + List myWatchWarehouse = warehouseClient.getMyWatchWarehouse(); + myWatchWarehouse.forEach(warehouseEntity -> { + warehouseIds.add(warehouseEntity.getId()); + }); + }else{ + warehouseIds.add(myCurrentWarehouse.getId()); + } + indexDTO.setWarehouseIds(warehouseIds); + + //查询订制品打托列表 + IndexHandOrderDataVO indexHandOrderDataVO = warehouseIndexService.handOrderData(indexDTO); + return R.data(indexHandOrderDataVO); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } + + @ResponseBody + @PostMapping("/allocationData") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "库位数据", notes = "传入indexDTO") + public R allocationData(@RequestBody IndexDTO indexDTO) { + String method = "###########allocationData: "; + log.info(method+"indexDTO={}",indexDTO); + + try{ + List warehouseIds = new ArrayList<>(); + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + List myWatchWarehouse = warehouseClient.getMyWatchWarehouse(); + myWatchWarehouse.forEach(warehouseEntity -> { + warehouseIds.add(warehouseEntity.getId()); + }); + }else{ + warehouseIds.add(myCurrentWarehouse.getId()); + } + indexDTO.setWarehouseIds(warehouseIds); + + //查询订制品打托列表 + IndexAllocationDataVO indexAllocationDataVO = warehouseIndexService.allocationData(indexDTO); + return R.data(indexAllocationDataVO); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } + + @ResponseBody + @PostMapping("/trunklineHandOrderData") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "干线待发运数据", notes = "传入indexDTO") + public R trunklineHandOrderData(@RequestBody IndexDTO indexDTO) { + String method = "###########trunklineHandOrderData: "; + log.info(method+"indexDTO={}",indexDTO); + + try{ + List warehouseIds = new ArrayList<>(); + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + List myWatchWarehouse = warehouseClient.getMyWatchWarehouse(); + myWatchWarehouse.forEach(warehouseEntity -> { + warehouseIds.add(warehouseEntity.getId()); + }); + }else{ + warehouseIds.add(myCurrentWarehouse.getId()); + } + indexDTO.setWarehouseIds(warehouseIds); + + //查询订制品打托列表 + IndexTrunklineHandOrderDataVO indexTrunklineHandOrderDataVO = warehouseIndexService.trunklineHandOrderData(indexDTO); + return R.data(indexTrunklineHandOrderDataVO); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } + + @ResponseBody + @PostMapping("/trunklineCarsData") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "干线车次数据", notes = "传入indexDTO") + public R trunklineCarsData(@RequestBody IndexDTO indexDTO) { + String method = "###########trunklineCarsData: "; + log.info(method+"indexDTO={}",indexDTO); + + try{ + List warehouseIds = new ArrayList<>(); + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + List myWatchWarehouse = warehouseClient.getMyWatchWarehouse(); + myWatchWarehouse.forEach(warehouseEntity -> { + warehouseIds.add(warehouseEntity.getId()); + }); + }else{ + warehouseIds.add(myCurrentWarehouse.getId()); + } + indexDTO.setWarehouseIds(warehouseIds); + + //查询订制品打托列表 + IndexTrunklineCarsDataVO indexTrunklineCarsDataVO = warehouseIndexService.trunklineCarsData(indexDTO); + return R.data(indexTrunklineCarsDataVO); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } + + @ResponseBody + @PostMapping("/unloadAbnormalData") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "卸车异常数据", notes = "传入indexDTO") + public R unloadAbnormalData(@RequestBody IndexDTO indexDTO) { + String method = "###########unloadAbnormalData: "; + log.info(method+"indexDTO={}",indexDTO); + + try{ + List warehouseIds = new ArrayList<>(); + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + List myWatchWarehouse = warehouseClient.getMyWatchWarehouse(); + myWatchWarehouse.forEach(warehouseEntity -> { + warehouseIds.add(warehouseEntity.getId()); + }); + }else{ + warehouseIds.add(myCurrentWarehouse.getId()); + } + indexDTO.setWarehouseIds(warehouseIds); + + //查询订制品打托列表 + IndexUnloadAbnormalDataVO indexUnloadAbnormalDataVO = warehouseIndexService.unloadAbnormalData(indexDTO); + return R.data(indexUnloadAbnormalDataVO); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } + + + + @ResponseBody + @PostMapping("/deliveryData") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "卸车异常数据", notes = "传入indexDTO") + public R deliveryData(@RequestBody IndexDTO indexDTO) { + String method = "###########unloadAbnormalData: "; + log.info(method+"indexDTO={}",indexDTO); + try{ + List warehouseIds = new ArrayList<>(); + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + List myWatchWarehouse = warehouseClient.getMyWarehouseList(); + if (!myWatchWarehouse.isEmpty()) { + warehouseIds = myWatchWarehouse.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + } + + }else{ + warehouseIds.add(myCurrentWarehouse.getId()); + } + indexDTO.setWarehouseIds(warehouseIds); + + //查询订制品打托列表 + List indexDeliveryDataVO = warehouseIndexService.deliveryData(indexDTO); + return R.data(indexDeliveryDataVO); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } + + + @ResponseBody + @PostMapping("/signforData") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "卸车异常数据", notes = "传入indexDTO") + public R signforData(@RequestBody IndexDTO indexDTO) { + String method = "###########unloadAbnormalData: "; + log.info(method+"indexDTO={}",indexDTO); + try{ + List warehouseIds = new ArrayList<>(); + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + List myWatchWarehouse = warehouseClient.getMyWarehouseList(); + if (!myWatchWarehouse.isEmpty()) { + warehouseIds = myWatchWarehouse.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList()); + } + + }else{ + warehouseIds.add(myCurrentWarehouse.getId()); + } + indexDTO.setWarehouseIds(warehouseIds); + + //查询订制品打托列表 + List indexDeliveryDataVO = warehouseIndexService.signforData(indexDTO); + return R.data(indexDeliveryDataVO); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } + + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/dto/DeliveryTrainLoadedScanDTO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/dto/DeliveryTrainLoadedScanDTO.java new file mode 100644 index 000000000..b8970c5dd --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/dto/DeliveryTrainLoadedScanDTO.java @@ -0,0 +1,19 @@ +package com.logpm.report.dto; + +import lombok.Data; + +/** + * 配送车次报表扫描装车 + * @Author: zqb + * @Date: 2024/6/13 + */ +@Data +public class DeliveryTrainLoadedScanDTO { + + private Long deliveryId; + private String loadedNum; + private String reNum; + private String exLoadedNum; + private String exReNum; + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/dto/IndexDTO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/dto/IndexDTO.java new file mode 100644 index 000000000..85717a98e --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/dto/IndexDTO.java @@ -0,0 +1,17 @@ +package com.logpm.report.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +public class IndexDTO implements Serializable { + + private List warehouseIds; + private Date startDate; + private Date endDate; + private String dayStr; + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportBillLoadingMapper.xml b/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportBillLoadingMapper.xml index 4a1f1d2d6..a6d28ac2f 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportBillLoadingMapper.xml +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportBillLoadingMapper.xml @@ -5,6 +5,7 @@ - select train_number, + select id, + train_number, task_time, warehouse_name, + warehouse_id, type, kind, vehicle_name, @@ -17,208 +19,288 @@ order_number, reservation_num, reservation_stock_listNum, - loaded_num, - invn_loaded_num, - ex_loaded_num, - re_num, - invn_re_num, - ex_reNum, ds_num, ss_num, unloading_team_name - from (select - d.train_number train_number, - d.task_time task_time, - d.warehouse_name warehouse_name, - CASE - WHEN d.type = 1 THEN - '商配' - WHEN d.type = 2 THEN - '市配' - ELSE '' - END type, - CASE - WHEN d.kind = 1 THEN - '自主配送' - WHEN d.kind = 2 THEN - '自主配送' - ELSE '' - END kind, - d.vehicle_name vehicle_name, - d.driver_name driver_name, - d.distribution_company distribution_company, - CASE - WHEN d.delivery_status = 1 THEN - '待配送' - WHEN d.delivery_status = 2 THEN - '配送中' - WHEN d.delivery_status = 3 THEN - '已完成' - ELSE '' - END delivery_status, - d.customers_number customers_number, - d.price, - d.order_number order_number, - rn.num reservation_num, - rn.stnum reservation_stock_listNum, - IFNULL(loadScan.loadedNum, 0) loaded_num, - IFNULL(loadscaninvn.loadedNum, 0) invn_loaded_num, - IFNULL(loadScan.exLoadedNum, 0) ex_loaded_num, - IFNULL(loadScan.reNum, 0) re_num, - IFNULL(loadscaninvn.reNum, 0) invn_re_num, - IFNULL(loadScan.exReNum, 0) ex_reNum, - ifnull(rn.dsNum, 0) ds_num, - ifnull(rn.ssNum, 0) ss_num, - ifnull(d.unloading_team_name, '') unloading_team_name - from - logpm_distribution_delivery_list d - LEFT JOIN ( - SELECT lds.delivery_id, - COALESCE(sum(ldr1.reservation_num), 0) num, - COALESCE(sum(ldr1.reservation_stock_list_num), 0) stnum, - SUM(CASE - WHEN lds.driver_signing = 2 THEN - 1 - ELSE - 0 - END) dsNum, - SUM(CASE - WHEN lds.signing_status = 2 THEN - 1 - ELSE - 0 - END) ssNum - FROM logpm_distribution_signfor lds - JOIN logpm_distribution_reservation ldr1 ON lds.reservation_id = ldr1.id - WHERE ldr1.reservation_status != '40' - GROUP BY lds.delivery_id order by null - ) rn ON rn.delivery_id = d.id - left join (select t.delivery_id, - SUM(t.loaded_nub) loadedNum, - sum(t.received_quantity) reNum, - sum(if(t.is_abnormal_loading = 1, 0, 1)) exLoadedNum, - sum(if(t.is_abnormal_signing = 1, 0, 1)) exReNum - from logpm_distribution_loadscan t - where t.scan_status != 1 - group by t.delivery_id order by null) loadScan on loadScan.delivery_id = d.id - left join (select t.delivery_id, - SUM(t.loaded_nub) loadedNum, - sum(t.received_quantity) reNum - from logpm_distribution_loadscaninvn t - where t.scan_status != 1 - group by t.delivery_id order by null) loadscaninvn on loadscaninvn.delivery_id = d.id - where d.customers_number != 0) t - ${ew.customSqlSegment} - - + + + limit #{limitA},#{limitB} + + + diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportStockMapper.xml b/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportStockMapper.xml index b85d51c30..de92a9f3b 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportStockMapper.xml +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportStockMapper.xml @@ -3,7 +3,9 @@ + select IFNULL(count(id),0) + from logpm_warehouse_waybill + where 1=1 + + and create_time >= #{param.startDate} + + + and create_time <= #{param.endDate} + + and departure_warehouse_id in + + #{item} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/query/DevilerDetailsQuery.java b/blade-service/logpm-report/src/main/java/com/logpm/report/query/DevilerDetailsQuery.java index bf5d57826..1986a27b4 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/query/DevilerDetailsQuery.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/query/DevilerDetailsQuery.java @@ -44,4 +44,10 @@ public class DevilerDetailsQuery extends Query { @ApiModelProperty(value = "运单收货人", position = 17) private String consigneeNameRange; + @ApiModelProperty(value = "签收时间开始(范围)", position = 18) + private Date startSjsigningTime; + + @ApiModelProperty(value = "签收时间结束(范围)", position = 19) + private Date endSjsigningTime; + } diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryDetailReader.java b/blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryDetailReader.java index 3d766d92d..7774621c8 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryDetailReader.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryDetailReader.java @@ -1,17 +1,20 @@ package com.logpm.report.reader; +import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.logpm.report.mapper.ReportDeliverMapeer; import com.logpm.report.service.ExportReader; +import com.logpm.report.service.IAsyncService; +import io.prometheus.client.CollectorRegistry; import org.apache.poi.ss.formula.functions.T; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; /** - * * @author zhaoqiaobo * @create 2024-03-08 9:50 */ @@ -20,17 +23,22 @@ public class DeliveryDetailReader implements ExportReader { @Resource private ReportDeliverMapeer reportDeliverMapeer; + @Autowired + private CollectorRegistry collectorRegistry; + @Autowired + private IAsyncService asyncService; @Override public Long getCount(Wrapper query) { Page page = new Page(1, 1); reportDeliverMapeer.getDetailsPage(page, query); - return page.getTotal(); + Long detailsZeroPageCount = reportDeliverMapeer.getDetailsZeroPageCount(query); + return page.getTotal() + detailsZeroPageCount; } @Override public List findList(Page page, Wrapper query) { - return reportDeliverMapeer.getDetailsPage(page,query); + return asyncService.getdetailPages(page, query, Convert.toInt(page.getCurrent()), Convert.toInt(page.getSize())); } } diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryTrainReader.java b/blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryTrainReader.java index ce2ce25bc..e6317b664 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryTrainReader.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryTrainReader.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.logpm.report.mapper.ReportDeliverMapeer; import com.logpm.report.service.ExportReader; +import com.logpm.report.service.ReportDataService; import org.apache.poi.ss.formula.functions.T; import org.springframework.stereotype.Component; @@ -20,6 +21,9 @@ public class DeliveryTrainReader implements ExportReader { @Resource private ReportDeliverMapeer reportDeliverMapeer; + @Resource + private ReportDataService reportDataService; + @Override public Long getCount(Wrapper query) { Page page = new Page(1, 1); @@ -29,7 +33,7 @@ public class DeliveryTrainReader implements ExportReader { @Override public List findList(Page page, Wrapper query) { - return reportDeliverMapeer.getDeliveryTrainPage(page, query); + return reportDataService.getReportDevilerVOList(page, query); } } diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/IAsyncService.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/IAsyncService.java new file mode 100644 index 000000000..02843e1f4 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/IAsyncService.java @@ -0,0 +1,24 @@ +package com.logpm.report.service; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.report.dto.DeliveryTrainLoadedScanDTO; +import com.logpm.report.vo.ReportDetailVO; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CountDownLatch; + +public interface IAsyncService { + + CompletableFuture getListCompletableFuture(ExportReader service, Wrapper query, Long pageSize, Long count, int finalNum, Map> pageMap, int finalI); + + void initExportData(ExportReader service, Wrapper query, Long pageSize, Long count, int finalNum, Map> pageMap, int finalI, CountDownLatch countDownLatch); + + List getDeliveryTrainLoadSacnInvnByIds(List idBatch); + + List getDeliveryTrainLoadSacnByIds(List idBatch); + + List getdetailPages(IPage page, Wrapper queryWrapper, Integer current, Integer size); +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/IWarehouseIndexService.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/IWarehouseIndexService.java new file mode 100644 index 000000000..572692c59 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/IWarehouseIndexService.java @@ -0,0 +1,38 @@ +package com.logpm.report.service; + +import com.logpm.report.dto.IndexDTO; +import com.logpm.report.vo.*; +import com.logpm.report.vo.indexCount.IndexDeliveryDataVO; +import com.logpm.report.vo.indexCount.IndexSignforDataVO; + +import java.util.List; + +public interface IWarehouseIndexService { + IndexOpenOrderDataVO openOrderData(IndexDTO indexDTO); + + IndexOpenOrderIncomeVO openOrderIncome(IndexDTO indexDTO); + + IndexHandOrderDataVO handOrderData(IndexDTO indexDTO); + + IndexAllocationDataVO allocationData(IndexDTO indexDTO); + + IndexTrunklineHandOrderDataVO trunklineHandOrderData(IndexDTO indexDTO); + + IndexTrunklineCarsDataVO trunklineCarsData(IndexDTO indexDTO); + + IndexUnloadAbnormalDataVO unloadAbnormalData(IndexDTO indexDTO); + + /** + * 查询首页配送数据 + * @param indexDTO + * @return + */ + List deliveryData(IndexDTO indexDTO); + + /** + * 查询当前签收率 + * @param indexDTO + * @return + */ + List signforData(IndexDTO indexDTO); +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/ReportDataService.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/ReportDataService.java new file mode 100644 index 000000000..43e319e08 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/ReportDataService.java @@ -0,0 +1,17 @@ +package com.logpm.report.service; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.report.vo.ReportDevilerVO; + +import java.util.List; + +/** + * @Author: zqb + * @Date: 2024/6/21 + */ +public interface ReportDataService { + + List getReportDevilerVOList(IPage page, Wrapper queryWrapper); + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/ReportDeliverService.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/ReportDeliverService.java index 2080c8bc6..f570f2887 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/service/ReportDeliverService.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/ReportDeliverService.java @@ -1,6 +1,9 @@ package com.logpm.report.service; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.logpm.report.dto.DeliveryTrainLoadedScanDTO; import com.logpm.report.query.DevilerDetailsQuery; import com.logpm.report.query.ReportCustomerQuery; import com.logpm.report.query.ReportDevilerQuery; @@ -9,8 +12,10 @@ import com.logpm.report.vo.ReportCustomerVO; import com.logpm.report.vo.ReportDetailVO; import com.logpm.report.vo.ReportDevilerVO; import com.logpm.report.vo.StockOrderVO; +import org.apache.poi.ss.formula.functions.T; import javax.servlet.http.HttpServletResponse; +import java.util.List; /** * @author zhaoqiaobo @@ -87,4 +92,8 @@ public interface ReportDeliverService { * @param query */ void exportStockOrder(HttpServletResponse response, StockOrderVO vo, StockOrderQuery query); + + List getDeliveryTrainPageReader(Page page, Wrapper query); + + List getDeliveryTrainLoadSacnInvnByIds(List idBatch); } diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/AsyncServiceImpl.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/AsyncServiceImpl.java new file mode 100644 index 000000000..7e55ba191 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/AsyncServiceImpl.java @@ -0,0 +1,140 @@ +package com.logpm.report.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.NumberUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.logpm.report.dto.DeliveryTrainLoadedScanDTO; +import com.logpm.report.mapper.ReportDeliverMapeer; +import com.logpm.report.service.ExportReader; +import com.logpm.report.service.IAsyncService; +import com.logpm.report.vo.ReportDetailVO; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.functions.T; +import org.springblade.common.annotations.LogpmAsync; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executor; + +@Service +@Slf4j +public class AsyncServiceImpl implements IAsyncService { + + @Resource + private Executor asyncExecutor; + @Autowired + private ReportDeliverMapeer reportDeliverMapeer; + + @Override + public CompletableFuture getListCompletableFuture(ExportReader service, Wrapper query, Long pageSize, Long count, int finalNum, Map> pageMap, int finalI) { + CompletableFuture future = CompletableFuture.supplyAsync(() -> { + // 剩余数据 + long remaindNum = count - (finalNum * pageSize); + // 当前第几次查询 + int current = finalNum + 1; + // 当前查询需要查询几条数据 + long lastNum = remaindNum > pageSize ? pageSize : remaindNum; + // 分页查询对象 + Page page = new Page(current, lastNum); + // 执行查询操作返回数据 + return service.findList(page, query); + + }, asyncExecutor); + future.thenAccept(list -> { + if(CollUtil.isNotEmpty(list)){ + // 获取组装的数据列表 + List detailVo = pageMap.get(finalI); + // 将查询数据添加到本地缓存 + if (CollectionUtil.isEmpty(detailVo)) { + pageMap.put(finalI, list); + } else { + pageMap.get(finalI).addAll(list); + } + } + }); + return future; + } + + @Override + @LogpmAsync("asyncExecutor") + public void initExportData(ExportReader service, Wrapper query, Long pageSize, Long count, int finalNum, Map> pageMap, int finalI, CountDownLatch countDownLatch) { + // 剩余数据 + long remaindNum = count - (finalNum * pageSize); + // 当前第几次查询 + int current = finalNum + 1; + // 当前查询需要查询几条数据 + long lastNum = remaindNum > pageSize ? pageSize : remaindNum; + // 分页查询对象 + Page page = new Page(current, lastNum); + // 执行查询操作返回数据 + List deliveryTrainPage = service.findList(page, query); + // 获取组装的数据列表 + List detailVo = pageMap.get(finalI); + // 将查询数据添加到本地缓存 + if (CollectionUtil.isEmpty(detailVo)) { + pageMap.put(finalI, deliveryTrainPage); + } else { + pageMap.get(finalI).addAll(deliveryTrainPage); + } + // 当前线程执行完成 + countDownLatch.countDown(); + } + + @Override + @LogpmAsync("asyncExecutor") + public List getDeliveryTrainLoadSacnInvnByIds(List idBatch) { + return reportDeliverMapeer.getDeliveryTrainLoadSacnInvnByIds(idBatch); + } + + @Override + @LogpmAsync("asyncExecutor") + public List getDeliveryTrainLoadSacnByIds(List idBatch) { + return reportDeliverMapeer.getDeliveryTrainLoadSacnByIds(idBatch); + } + + @Override + public List getdetailPages(IPage page, Wrapper queryWrapper, Integer current, Integer size) { + List detailsPage = reportDeliverMapeer.getDetailsPage(page, queryWrapper); + // 包件总数 + long total = page.getTotal(); + // 零件总数 + Long detailsZeroPageCount = reportDeliverMapeer.getDetailsZeroPageCount(queryWrapper); + long allTotal = total + detailsZeroPageCount; + // 包件没数据查零担 + int pageSize = current * size; + if (total < pageSize) { + // 剩余需要查询的数量 + int zeroTotal = Convert.toInt(pageSize - total); + double div = NumberUtil.div(zeroTotal, size.doubleValue()); + long zeroCurrent = (int) Math.ceil(div); + int zeroSize = zeroTotal % size; + long limitA = 0; + long limitB = 0; + if(zeroSize == 0){ + zeroSize = size; + } + if (!NumberUtil.equals(zeroCurrent, 1)) { + limitA = zeroSize + (zeroCurrent - 2) * size; + zeroSize = size; + } + limitB = zeroSize; + List zeroPage = reportDeliverMapeer.getDetailsZeroPage(limitA, limitB, queryWrapper); + if(CollUtil.isEmpty(detailsPage)){ + detailsPage = new ArrayList<>(); + } + detailsPage.addAll(zeroPage); + } + page.setTotal(allTotal); + return detailsPage; + } +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportBillLoadingAsyncService.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportBillLoadingAsyncService.java index 048211723..9651102e4 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportBillLoadingAsyncService.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportBillLoadingAsyncService.java @@ -1,10 +1,12 @@ package com.logpm.report.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; import com.logpm.report.constant.ReportConstants; import com.logpm.report.mapper.ReportBillLoadingMapper; import com.logpm.report.query.BillDetailsQuery; @@ -14,6 +16,7 @@ import com.logpm.report.reader.BillLoadingTasksReader; import com.logpm.report.service.IReportBillLoadingAsyncService; import com.logpm.report.util.QueryUtil; import com.logpm.report.util.ReportExcelUtil; +import com.logpm.report.util.ReportUtil; import com.logpm.report.vo.BillLoadingDetailsVO; import com.logpm.report.vo.BillLoadingTasksVO; import lombok.AllArgsConstructor; @@ -48,12 +51,19 @@ public class ReportBillLoadingAsyncService implements IReportBillLoadingAsyncSer private final BillLoadingDetailsReader billLoadingDetailsReader; private final BillLoadingTasksReader billLoadingTasksReader; private final IUserClient userClient; + private final IBasicdataWarehouseClient warehouseClient; + private final ReportExcelUtil reportExcelUtil; @Override public IPage tasksPage(BillLoadingTasksVO vo, BillLoadingTasksQuery query) { + if(ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getCreatedTime(), query.getStartCreatedTime(), query.getEndCreatedTime(), "提货时间"); + } IPage page = Condition.getPage(query); QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, BillLoadingTasksVO.class); tasksCustomQuery(query, queryWrapper); + // 仓库权限 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouse(), query.getWarehouseRange(), queryWrapper, warehouseClient); List detailsPage = reportBillLoadingMapper.getTasksPage(page, queryWrapper); return page.setRecords(detailsPage); } @@ -74,17 +84,27 @@ public class ReportBillLoadingAsyncService implements IReportBillLoadingAsyncSer @Override public void exportTasks(HttpServletResponse response, BillLoadingTasksVO vo, BillLoadingTasksQuery query) { + if(ReportUtil.areAllPropertiesEmpty(vo)){ + ReportUtil.dateIsWithinOneMonth(vo.getCreatedTime(), query.getStartCreatedTime(), query.getEndCreatedTime(), "提货时间"); + } QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, BillLoadingTasksVO.class); tasksCustomQuery(query, queryWrapper); - new ReportExcelUtil().export(response, billLoadingTasksReader, BillLoadingTasksVO.class, queryWrapper, "自提任务维度报表"); + // 仓库权限 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouse(), query.getWarehouseRange(), queryWrapper, warehouseClient); + reportExcelUtil.export(response, billLoadingTasksReader, BillLoadingTasksVO.class, queryWrapper, "自提任务维度报表"); } @Override public IPage detailsPage(BillLoadingDetailsVO vo, BillDetailsQuery query) { + if(ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getScanTime(), query.getStartScanTime(), query.getEndScanTime(), "提货扫描时间"); + } IPage page = Condition.getPage(query); QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, BillLoadingDetailsVO.class); // 自定义查询 detailsCustomQuery(query, queryWrapper); + // 仓库权限 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouse(), query.getWarehouseRange(), queryWrapper, warehouseClient); List detailsPage = reportBillLoadingMapper.getDetailsPage(page, queryWrapper); if (CollUtil.isNotEmpty(detailsPage)) { // 组装数据批量去查询用户名称 @@ -102,8 +122,12 @@ public class ReportBillLoadingAsyncService implements IReportBillLoadingAsyncSer List data = listR.getData(); Map collect = data.stream().collect(Collectors.toMap(User::getId, User::getName)); for (BillLoadingDetailsVO detailsVO : detailsPage) { - detailsVO.setScanUser(collect.get(detailsVO.getScanUser())); - detailsVO.setExamineUser(collect.get(detailsVO.getExamineUser())); + if (StrUtil.isNotEmpty(detailsVO.getScanUser())) { + detailsVO.setScanUser(collect.get(Convert.toLong(detailsVO.getScanUser()))); + } + if (StrUtil.isNotEmpty(detailsVO.getExamineUser())) { + detailsVO.setExamineUser(collect.get(Convert.toLong(detailsVO.getExamineUser()))); + } } } @@ -128,8 +152,13 @@ public class ReportBillLoadingAsyncService implements IReportBillLoadingAsyncSer @Override public void exportDetails(HttpServletResponse response, BillLoadingDetailsVO vo, BillDetailsQuery query) { + if(ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getScanTime(), query.getStartScanTime(), query.getEndScanTime(), "提货扫描时间"); + } QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, BillLoadingDetailsVO.class); detailsCustomQuery(query, queryWrapper); - new ReportExcelUtil().export(response, billLoadingDetailsReader, BillLoadingDetailsVO.class, queryWrapper, "自提明细"); + // 仓库权限 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouse(), query.getWarehouseRange(), queryWrapper, warehouseClient); + reportExcelUtil.export(response, billLoadingDetailsReader, BillLoadingDetailsVO.class, queryWrapper, "自提明细"); } } diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDataServiceImpl.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDataServiceImpl.java new file mode 100644 index 000000000..ba625bb3f --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDataServiceImpl.java @@ -0,0 +1,123 @@ +package com.logpm.report.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.report.dto.DeliveryTrainLoadedScanDTO; +import com.logpm.report.mapper.ReportDeliverMapeer; +import com.logpm.report.service.IAsyncService; +import com.logpm.report.service.ReportDataService; +import com.logpm.report.vo.ReportDevilerVO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.stream.Collectors; + +/** + * @Author: zqb + * @Date: 2024/6/21 + */ +@Service +@AllArgsConstructor +@Slf4j +public class ReportDataServiceImpl implements ReportDataService { + + private final ReportDeliverMapeer reportDeliverMapeer; + private final IAsyncService asyncService; + + @Autowired + private Executor asyncExecutor; + + @Override + public List getReportDevilerVOList(IPage page, Wrapper queryWrapper) { + // 查询数据 + List deliveryTrainPage = reportDeliverMapeer.getDeliveryTrainPage(page, queryWrapper); + // 异步组装统计数据 + asyncBuildDeliveryTrainPage(deliveryTrainPage); + return deliveryTrainPage; + } + + private void asyncBuildDeliveryTrainPage(List deliveryTrainPage) { + List ids = deliveryTrainPage.stream().map(ReportDevilerVO::getId).collect(Collectors.toList()); + // 异步查询扫描装车和异常扫描装车数据 + if (CollUtil.isNotEmpty(ids)) { + // 每5000个提交一次查询 + List> partitionedIds = CollUtil.split(ids, 5000); + List>> futures = new ArrayList<>(); + for (List idBatch : partitionedIds) { + futures.add(getTrainLoadedScanFuture(idBatch, deliveryTrainPage)); + futures.add(getTrainLoadedScanInvnFuture(idBatch, deliveryTrainPage)); + } + try { + CompletableFuture allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + allFutures.join(); + } catch (Exception e) { + log.error("系统异常:{}", e); + } + } + } + + private @NotNull CompletableFuture> getTrainLoadedScanInvnFuture(List idBatch, List deliveryTrainPage) { + CompletableFuture> future = CompletableFuture.supplyAsync(() -> + asyncService.getDeliveryTrainLoadSacnInvnByIds(idBatch), (ThreadPoolTaskExecutor) asyncExecutor); + future.thenAccept(list -> { + if (CollUtil.isNotEmpty(list)) { + // list 封装为map deliveryId为key + Map loadedScanDTOMap = new HashMap<>(); + list.forEach(dto -> loadedScanDTOMap.put(dto.getDeliveryId(), dto)); + List collect = deliveryTrainPage.stream().filter(reportDevilerVO -> idBatch.contains(reportDevilerVO.getId())).collect(Collectors.toList()); + for (ReportDevilerVO reportDevilerVO : collect) { + if (loadedScanDTOMap.containsKey(reportDevilerVO.getId())) { + DeliveryTrainLoadedScanDTO dto = loadedScanDTOMap.get(reportDevilerVO.getId()); + reportDevilerVO.setInvnLoadedNum(StrUtil.isNotEmpty(dto.getLoadedNum()) ? dto.getLoadedNum() : "0"); + reportDevilerVO.setInvnReNum(StrUtil.isNotEmpty(dto.getReNum()) ? dto.getReNum() : "0"); + } else { + reportDevilerVO.setInvnLoadedNum("0"); + reportDevilerVO.setInvnReNum("0"); + } + } + } + }); + return future; + } + + private @NotNull CompletableFuture> getTrainLoadedScanFuture(List idBatch, List deliveryTrainPage) { + CompletableFuture> future = CompletableFuture.supplyAsync(() -> + asyncService.getDeliveryTrainLoadSacnByIds(idBatch), (ThreadPoolTaskExecutor) asyncExecutor); + future.thenAccept(list -> { + if (CollUtil.isNotEmpty(list)) { + // list 封装为map deliveryId为key + Map loadedScanDTOMap = new HashMap<>(); + list.forEach(dto -> loadedScanDTOMap.put(dto.getDeliveryId(), dto)); + List collect = deliveryTrainPage.stream().filter(reportDevilerVO -> idBatch.contains(reportDevilerVO.getId())).collect(Collectors.toList()); + for (ReportDevilerVO reportDevilerVO : collect) { + if (loadedScanDTOMap.containsKey(reportDevilerVO.getId())) { + DeliveryTrainLoadedScanDTO dto = loadedScanDTOMap.get(reportDevilerVO.getId()); + reportDevilerVO.setLoadedNum(StrUtil.isNotEmpty(dto.getLoadedNum()) ? dto.getLoadedNum() : "0"); + reportDevilerVO.setReNum(StrUtil.isNotEmpty(dto.getReNum()) ? dto.getReNum() : "0"); + reportDevilerVO.setExLoadedNum(StrUtil.isNotEmpty(dto.getExLoadedNum()) ? dto.getExLoadedNum() : "0"); + reportDevilerVO.setExReNum(StrUtil.isNotEmpty(dto.getExReNum()) ? dto.getExReNum() : "0"); + } else { + reportDevilerVO.setLoadedNum("0"); + reportDevilerVO.setReNum("0"); + reportDevilerVO.setExLoadedNum("0"); + reportDevilerVO.setExReNum("0"); + } + } + } + }); + return future; + } + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDeliverServiceImpl.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDeliverServiceImpl.java index f97714c54..ddd7b4c4a 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDeliverServiceImpl.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDeliverServiceImpl.java @@ -1,8 +1,15 @@ package com.logpm.report.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.report.dto.DeliveryTrainLoadedScanDTO; import com.logpm.report.mapper.ReportDeliverMapeer; import com.logpm.report.query.DevilerDetailsQuery; import com.logpm.report.query.ReportCustomerQuery; @@ -12,18 +19,26 @@ import com.logpm.report.reader.DeliveryCustomerReader; import com.logpm.report.reader.DeliveryDetailReader; import com.logpm.report.reader.DeliveryTrainReader; import com.logpm.report.reader.StockOrderReader; +import com.logpm.report.service.IAsyncService; +import com.logpm.report.service.ReportDataService; import com.logpm.report.service.ReportDeliverService; import com.logpm.report.util.QueryUtil; import com.logpm.report.util.ReportExcelUtil; +import com.logpm.report.util.ReportUtil; import com.logpm.report.vo.ReportCustomerVO; import com.logpm.report.vo.ReportDetailVO; import com.logpm.report.vo.ReportDevilerVO; import com.logpm.report.vo.StockOrderVO; import lombok.AllArgsConstructor; +import org.apache.poi.ss.formula.functions.T; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.support.Condition; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; import java.util.List; /** @@ -34,19 +49,34 @@ import java.util.List; @AllArgsConstructor public class ReportDeliverServiceImpl implements ReportDeliverService { + private static final Logger log = LoggerFactory.getLogger(ReportDeliverServiceImpl.class); private final ReportDeliverMapeer reportDeliverMapeer; private final DeliveryTrainReader deliveryTrainReader; private final DeliveryCustomerReader deliveryCustomerReader; private final DeliveryDetailReader deliveryDetailReader; private final StockOrderReader stockOrderReader; + private final IBasicdataWarehouseClient warehouseClient; + private final ReportDataService reportDataService; + private final ReportExcelUtil reportExcelUtil; + private final IAsyncService anAsyncService; @Override public IPage deliveryTrainPage(ReportDevilerVO vo, ReportDevilerQuery query) { + // 校验时间 + if (ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getTaskTime(), query.getStartTaskTime(), query.getEndTaskTime(), "配送日期"); + } IPage page = Condition.getPage(query); QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportDevilerVO.class); // 自定义 sql 查询条件 trainCustomQuery(query, queryWrapper); - return page.setRecords(reportDeliverMapeer.getDeliveryTrainPage(page, queryWrapper)); + // 用户仓库权限 + // 1 如果用户页面选择了仓库,按选择的仓库查询。 + // 2 用户页面没有选择仓库,但是切换了仓库,按切换的仓库查 + // 3 用户没有选择仓库,也没有切换仓库,按用户当前所有仓查询 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); + List deliveryTrainPage = reportDataService.getReportDevilerVOList(page, queryWrapper); + return page.setRecords(deliveryTrainPage); } private void trainCustomQuery(ReportDevilerQuery query, QueryWrapper queryWrapper) { @@ -68,18 +98,30 @@ public class ReportDeliverServiceImpl implements ReportDeliverService { @Override public void exportTrain(HttpServletResponse response, ReportDevilerVO vo, ReportDevilerQuery query) { + // 添加时间校验 + if (ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getTaskTime(), query.getStartTaskTime(), query.getEndTaskTime(), "配送日期"); + } QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportDevilerVO.class); trainCustomQuery(query, queryWrapper); - new ReportExcelUtil().export(response, deliveryTrainReader, ReportDevilerVO.class, queryWrapper, "配送车次维度报表"); + // 仓库权限 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); + reportExcelUtil.export(response, deliveryTrainReader, ReportDevilerVO.class, queryWrapper, "配送车次维度报表"); } @Override public IPage customerPage(ReportCustomerVO vo, ReportCustomerQuery query) { + // 添加时间校验 + if (ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getTaskTime(), query.getStartTaskTime(), query.getEndTaskTime(), "配送日期"); + } // 构建前端查询参数 IPage page = Condition.getPage(query); QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportCustomerVO.class); // 自定义查询 customerCustomQuery(query, queryWrapper); + // 仓库权限 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); return page.setRecords(reportDeliverMapeer.getCustomerPage(page, queryWrapper)); } @@ -104,18 +146,35 @@ public class ReportDeliverServiceImpl implements ReportDeliverService { @Override public void exportCustomer(HttpServletResponse response, ReportCustomerVO vo, ReportCustomerQuery query) { + // 添加时间校验 + if (ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getTaskTime(), query.getStartTaskTime(), query.getEndTaskTime(), "配送日期"); + } QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportCustomerVO.class); customerCustomQuery(query, queryWrapper); - new ReportExcelUtil().export(response, deliveryCustomerReader, ReportCustomerVO.class, queryWrapper, "配送客户维度报表"); + // 仓库权限 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); + reportExcelUtil.export(response, deliveryCustomerReader, ReportCustomerVO.class, queryWrapper, "配送客户维度报表"); } @Override public IPage detailsPage(ReportDetailVO vo, DevilerDetailsQuery query) { + // 添加时间校验 + if (ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getTaskTime(), query.getStartTaskTime(), query.getEndTaskTime(), "配送日期"); + } Integer current = query.getCurrent(); Integer size = query.getSize(); IPage page = Condition.getPage(query); QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportDetailVO.class); detailsCustomQuery(query, queryWrapper); + // 仓库权限 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); + List detailsPage = anAsyncService.getdetailPages(page, queryWrapper, current, size); + return page.setRecords(detailsPage); + } + + private List getdetailPages(IPage page, QueryWrapper queryWrapper, Integer current, Integer size) { List detailsPage = reportDeliverMapeer.getDetailsPage(page, queryWrapper); // 包件总数 long total = page.getTotal(); @@ -123,19 +182,31 @@ public class ReportDeliverServiceImpl implements ReportDeliverService { Long detailsZeroPageCount = reportDeliverMapeer.getDetailsZeroPageCount(queryWrapper); long allTotal = total + detailsZeroPageCount; // 包件没数据查零担 - if (detailsPage.size() < size) { - int zeroSize = size - detailsPage.size(); - double div = NumberUtil.div(allTotal, size.doubleValue()); - long zeroCurrent = current - (int) Math.ceil(div) + 1; - page.setCurrent(zeroCurrent); - page.setSize(zeroSize); - List zeroPage = reportDeliverMapeer.getDetailsZeroPage(page, queryWrapper); - page.setCurrent(current); - page.setSize(size); + int pageSize = current * size; + if (total < pageSize) { + // 剩余需要查询的数量 + int zeroTotal = Convert.toInt(pageSize - total); + double div = NumberUtil.div(zeroTotal, size.doubleValue()); + long zeroCurrent = (int) Math.ceil(div); + int zeroSize = zeroTotal % size; + long limitA = 0; + long limitB = 0; + if(zeroSize == 0){ + zeroSize = size; + } + if (!NumberUtil.equals(zeroCurrent, 1)) { + limitA = zeroSize + (zeroCurrent - 2) * size; + zeroSize = size; + } + limitB = zeroSize; + List zeroPage = reportDeliverMapeer.getDetailsZeroPage(limitA, limitB, queryWrapper); + if(CollUtil.isEmpty(detailsPage)){ + detailsPage = new ArrayList<>(); + } detailsPage.addAll(zeroPage); } page.setTotal(allTotal); - return page.setRecords(detailsPage); + return detailsPage; } private void detailsCustomQuery(DevilerDetailsQuery query, QueryWrapper queryWrapper) { @@ -143,6 +214,10 @@ public class ReportDeliverServiceImpl implements ReportDeliverService { QueryUtil.timeGe("task_time", query.getStartTaskTime(), queryWrapper); // 配送时间结束 QueryUtil.timeLe("task_time", query.getEndTaskTime(), queryWrapper); + // 签收时间开始 + QueryUtil.timeGe("sjsigning_time", query.getStartSjsigningTime(), queryWrapper); + // 签收时间结束 + QueryUtil.timeLe("sjsigning_time", query.getEndSjsigningTime(), queryWrapper); // 仓库 QueryUtil.splitEqQuery("warehouse_name", query.getWarehouseNameRange(), queryWrapper); // 配送类型 @@ -161,16 +236,31 @@ public class ReportDeliverServiceImpl implements ReportDeliverService { @Override public void exportDetails(HttpServletResponse response, ReportDetailVO vo, DevilerDetailsQuery query) { + // 添加时间校验 + if (ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getTaskTime(), query.getStartTaskTime(), query.getEndTaskTime(), "配送日期"); + } QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportDetailVO.class); detailsCustomQuery(query, queryWrapper); - new ReportExcelUtil().export(response, deliveryDetailReader, ReportDetailVO.class, queryWrapper, "配送明细报表"); + // 仓库权限 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); + reportExcelUtil.export(response, deliveryDetailReader, ReportDetailVO.class, queryWrapper, "配送明细报表"); } @Override public IPage stockOrderPage(StockOrderVO vo, StockOrderQuery query) { + // 添加时间校验 + if (ObjectUtil.isEmpty(vo.getWarehouseEntryTime())) { + boolean withinOneMonth = ReportUtil.isWithinOneMonth(query.getStartWarehouseEntryTime(), query.getEndWarehouseEntryTime()); + if (!withinOneMonth) { + throw new ServiceException("入库时间必选且时间不超过一个月"); + } + } IPage page = Condition.getPage(query); QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, StockOrderVO.class); stockOrderQuery(query, queryWrapper); + // 仓库权限 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouse(), query.getWarehouseRange(), queryWrapper, warehouseClient); return page.setRecords(reportDeliverMapeer.getStockOrderPage(page, queryWrapper)); } @@ -192,9 +282,28 @@ public class ReportDeliverServiceImpl implements ReportDeliverService { @Override public void exportStockOrder(HttpServletResponse response, StockOrderVO vo, StockOrderQuery query) { + // 添加时间校验 + if (ObjectUtil.isEmpty(vo.getWarehouseEntryTime())) { + boolean withinOneMonth = ReportUtil.isWithinOneMonth(query.getStartWarehouseEntryTime(), query.getEndWarehouseEntryTime()); + if (!withinOneMonth) { + throw new ServiceException("入库时间必选且时间不超过一个月"); + } + } QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, StockOrderVO.class); stockOrderQuery(query, queryWrapper); - new ReportExcelUtil().export(response, stockOrderReader, StockOrderVO.class, queryWrapper, "在库订单表"); + // 仓库权限 + ReportUtil.buildReportWarehouseAuth(vo.getWarehouse(), query.getWarehouseRange(), queryWrapper, warehouseClient); + reportExcelUtil.export(response, stockOrderReader, StockOrderVO.class, queryWrapper, "在库订单表"); + } + + @Override + public List getDeliveryTrainPageReader(Page page, Wrapper query) { + return reportDataService.getReportDevilerVOList(page, query); + } + + @Override + public List getDeliveryTrainLoadSacnInvnByIds(List idBatch) { + return reportDeliverMapeer.getDeliveryTrainLoadSacnInvnByIds(idBatch); } } diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportStockServiceImpl.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportStockServiceImpl.java index f387b1a74..23f93bd73 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportStockServiceImpl.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportStockServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; import com.logpm.report.mapper.ReportStockMapeer; import com.logpm.report.query.StockDetailsQuery; import com.logpm.report.query.StockInQuery; @@ -15,6 +16,7 @@ import com.logpm.report.reader.DeliveryStockReader; import com.logpm.report.service.ReportStockService; import com.logpm.report.util.QueryUtil; import com.logpm.report.util.ReportExcelUtil; +import com.logpm.report.util.ReportUtil; import com.logpm.report.vo.ReportInStockVO; import com.logpm.report.vo.ReportOutStockVO; import com.logpm.report.vo.StockDetailsVO; @@ -41,12 +43,15 @@ public class ReportStockServiceImpl implements ReportStockService { private final DeliveryInStocksReader inStocksReader; private final DeliveryOutStocksReader outStocksReader; private final IDictBizClient dictBizClient; + private final IBasicdataWarehouseClient warehouseClient; + private final ReportExcelUtil reportExcelUtil; @Override public IPage detailsPage(StockDetailsVO vo, StockDetailsQuery query) { IPage page = Condition.getPage(query); QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, StockDetailsVO.class); detailsCustomQuery(query, queryWrapper); + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); return page.setRecords(reportStockMapeer.getDetailPage(page, queryWrapper)); } @@ -67,14 +72,19 @@ public class ReportStockServiceImpl implements ReportStockService { public void exportDetails(HttpServletResponse response, StockDetailsVO vo, StockDetailsQuery query) { QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, StockDetailsVO.class); detailsCustomQuery(query, queryWrapper); - new ReportExcelUtil().export(response, deliveryStockReader, StockDetailsVO.class, queryWrapper, "库存品表"); + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); + reportExcelUtil.export(response, deliveryStockReader, StockDetailsVO.class, queryWrapper, "库存品表"); } @Override public IPage inStocks(ReportInStockVO vo, StockInQuery query) { + if(ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getWarehousingTime(), query.getStartWarehousingTime(), query.getEndWarehousingTime(), "入库时间"); + } IPage page = Condition.getPage(query); QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportInStockVO.class); inStocksCustomQuery(query, queryWrapper); + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); List inStocks = reportStockMapeer.getInStocks(page, queryWrapper); if (CollUtil.isNotEmpty(inStocks)) { for (ReportInStockVO inStock : inStocks) { @@ -112,16 +122,24 @@ public class ReportStockServiceImpl implements ReportStockService { @Override public void exportInStocks(HttpServletResponse response, ReportInStockVO vo, StockInQuery query) { + if(ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getWarehousingTime(), query.getStartWarehousingTime(), query.getEndWarehousingTime(), "入库时间"); + } QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportInStockVO.class); inStocksCustomQuery(query, queryWrapper); - new ReportExcelUtil().export(response, inStocksReader, ReportInStockVO.class, queryWrapper, "库存入库表"); + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); + reportExcelUtil.export(response, inStocksReader, ReportInStockVO.class, queryWrapper, "库存入库表"); } @Override public IPage outStocks(ReportOutStockVO vo, StockOutQuery query) { + if(ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getCreateTime(), query.getStartCreateTime(), query.getEndCreateTime(), "出库时间"); + } IPage page = Condition.getPage(query); QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportOutStockVO.class); outStocksCustomQuery(query, queryWrapper); + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); return page.setRecords(reportStockMapeer.getOutStocks(page, queryWrapper)); } @@ -143,9 +161,13 @@ public class ReportStockServiceImpl implements ReportStockService { @Override public void exportOutStocks(HttpServletResponse response, ReportOutStockVO vo, StockOutQuery query) { + if(ReportUtil.areAllPropertiesEmpty(vo)) { + ReportUtil.dateIsWithinOneMonth(vo.getCreateTime(), query.getStartCreateTime(), query.getEndCreateTime(), "出库时间"); + } QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportOutStockVO.class); outStocksCustomQuery(query, queryWrapper); - new ReportExcelUtil().export(response, outStocksReader, ReportOutStockVO.class, queryWrapper, "库存出库表"); + ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); + reportExcelUtil.export(response, outStocksReader, ReportOutStockVO.class, queryWrapper, "库存出库表"); } } diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/WarehouseIndexServiceImpl.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/WarehouseIndexServiceImpl.java new file mode 100644 index 000000000..ab1dee6b6 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/WarehouseIndexServiceImpl.java @@ -0,0 +1,499 @@ +package com.logpm.report.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.logpm.report.dto.IndexDTO; +import com.logpm.report.mapper.WarehouseIndexMapper; +import com.logpm.report.service.IWarehouseIndexService; +import com.logpm.report.vo.*; +import com.logpm.report.vo.indexCount.IndexDeliveryDataVO; +import com.logpm.report.vo.indexCount.IndexSignforDataVO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.constant.DistributionTypeConstant; +import org.springblade.common.utils.CommonUtil; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.Func; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.text.SimpleDateFormat; +import java.util.*; + +@Slf4j +@Service +@AllArgsConstructor +public class WarehouseIndexServiceImpl implements IWarehouseIndexService { + + private final WarehouseIndexMapper warehouseIndexMapper; + + private final BladeRedis bladeRedis; + + @Override + public IndexOpenOrderDataVO openOrderData(IndexDTO indexDTO) { + List warehouseIds = indexDTO.getWarehouseIds(); + IndexOpenOrderDataVO indexOpenOrderDataVO = new IndexOpenOrderDataVO(); + if (warehouseIds.isEmpty()) { + return indexOpenOrderDataVO; + } + + indexOpenOrderDataVO.setTotalNum(warehouseIndexMapper.findTotalNum(indexDTO)); + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + Date dayStart = calendar.getTime(); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + Date dayEnd = calendar.getTime(); + indexDTO.setStartDate(dayStart); + indexDTO.setEndDate(dayEnd); + indexOpenOrderDataVO.setDayNum(warehouseIndexMapper.findTotalNum(indexDTO)); + // 设置日为1,以获取当前月的第一天 + calendar.set(Calendar.DAY_OF_MONTH, 1); + // 将小时、分钟、秒和毫秒设置为0,确保获取的是完整的第一天 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + Date firstDayOfMonth = calendar.getTime(); // 获取第一天 + + // 获取下个月的第一天 + calendar.add(Calendar.MONTH, 1); + // 再将日减1,以得到当前月的最后一天 + calendar.set(Calendar.DAY_OF_MONTH, 1); + calendar.add(Calendar.DATE, -1); + // 同样确保时间部分为0 + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + Date lastDayOfMonth = calendar.getTime(); // 获取最后一天 + indexDTO.setStartDate(firstDayOfMonth); + indexDTO.setEndDate(lastDayOfMonth); + indexOpenOrderDataVO.setMonthNum(warehouseIndexMapper.findTotalNum(indexDTO)); + + return indexOpenOrderDataVO; + } + + @Override + public IndexOpenOrderIncomeVO openOrderIncome(IndexDTO indexDTO) { + List warehouseIds = indexDTO.getWarehouseIds(); + IndexOpenOrderIncomeVO indexOpenOrderIncomeVO = new IndexOpenOrderIncomeVO(); + if (warehouseIds.isEmpty()) { + return indexOpenOrderIncomeVO; + } + //总收入 + indexOpenOrderIncomeVO.setTotalFee(warehouseIndexMapper.findTotalFee(indexDTO)); + //获取当天的开始时间 + indexDTO.setStartDate(CommonUtil.getDayStart()); + indexDTO.setEndDate(CommonUtil.getDayEnd()); + JSONObject incomeDay = warehouseIndexMapper.findFeeByDate(indexDTO); + indexOpenOrderIncomeVO.setDayFee(incomeDay.getBigDecimal("fee")); + indexOpenOrderIncomeVO.setDayBillladingFee(incomeDay.getBigDecimal("billladingFee")); + indexOpenOrderIncomeVO.setDayInstallFee(incomeDay.getBigDecimal("installFee")); + indexOpenOrderIncomeVO.setDayTrunklineFee(incomeDay.getBigDecimal("trunklineFee")); + indexOpenOrderIncomeVO.setDayWarehouseFee(incomeDay.getBigDecimal("warehouseFee")); + indexOpenOrderIncomeVO.setDayDistributionFee(incomeDay.getBigDecimal("distributionFee")); + //获取当月的开始时间 + indexDTO.setStartDate(CommonUtil.getMonthDayStart()); + indexDTO.setEndDate(CommonUtil.getMonthDayEnd()); + JSONObject incomeMonth = warehouseIndexMapper.findFeeByDate(indexDTO); + indexOpenOrderIncomeVO.setMonthFee(incomeMonth.getBigDecimal("fee")); + indexOpenOrderIncomeVO.setMonthBillladingFee(incomeMonth.getBigDecimal("billladingFee")); + indexOpenOrderIncomeVO.setMonthInstallFee(incomeMonth.getBigDecimal("installFee")); + indexOpenOrderIncomeVO.setMonthTrunklineFee(incomeMonth.getBigDecimal("trunklineFee")); + indexOpenOrderIncomeVO.setMonthWarehouseFee(incomeMonth.getBigDecimal("warehouseFee")); + indexOpenOrderIncomeVO.setMonthDistributionFee(incomeMonth.getBigDecimal("distributionFee")); + + return indexOpenOrderIncomeVO; + } + + @Override + public IndexHandOrderDataVO handOrderData(IndexDTO indexDTO) { + //增加缓存 + BladeUser user = AuthUtil.getUser(); +// String key = CacheNames.tenantKey(user.getTenantId(), user.getUserId() + "", "handOrderData"); +// IndexHandOrderDataVO indexHandOrderDataVO = bladeRedis.get(key); +// +// if (Objects.isNull(indexHandOrderDataVO)) { + List warehouseIds = indexDTO.getWarehouseIds(); + IndexHandOrderDataVO indexHandOrderDataVO = new IndexHandOrderDataVO(); + if (warehouseIds.isEmpty()) { + return indexHandOrderDataVO; + } + //当前在库的数据 订制品 零担 + indexHandOrderDataVO = warehouseIndexMapper.handOrderData(indexDTO); + //当前在库的库存品 + Integer stockListNum = warehouseIndexMapper.findHandStockListNum(indexDTO); + indexHandOrderDataVO.setTotalNum(indexHandOrderDataVO.getTotalNum() + stockListNum); + + //已打托数量 + Integer trayNum = warehouseIndexMapper.findTrayNum(indexDTO); + indexHandOrderDataVO.setTrayNum(trayNum); +// bladeRedis.setEx(key, indexHandOrderDataVO, 3600L); +// } + + + return indexHandOrderDataVO; + } + + @Override + public IndexAllocationDataVO allocationData(IndexDTO indexDTO) { + + //增加缓存 +// BladeUser user = AuthUtil.getUser(); +// String key = CacheNames.tenantKey(user.getTenantId(), user.getUserId() + "", "allocationData"); +// IndexAllocationDataVO indexAllocationDataVO = bladeRedis.get(key); +// +// if (Objects.isNull(indexAllocationDataVO)) { + List warehouseIds = indexDTO.getWarehouseIds(); + IndexAllocationDataVO indexAllocationDataVO = new IndexAllocationDataVO(); + if (warehouseIds.isEmpty()) { + return indexAllocationDataVO; + } + //当前在库的数据 订制品 零担 + IndexHandOrderDataVO indexHandOrderDataVO = warehouseIndexMapper.handOrderData(indexDTO); + //当前在库的库存品 + Integer stockListNum = warehouseIndexMapper.findHandStockListNum(indexDTO); + Integer totalNum = indexHandOrderDataVO.getTotalNum() + stockListNum; + + //查询库位总数 + Integer totalAllocationNum = warehouseIndexMapper.findTotalAllocationNum(indexDTO); + //已使用库位数 + Integer useAllocationNum = warehouseIndexMapper.findUseAllocationNum(indexDTO); + //已上架件数 + Integer upshelfNum = warehouseIndexMapper.findUpshelfNum(indexDTO); + + indexAllocationDataVO.setTotalNum(totalAllocationNum); + indexAllocationDataVO.setUseNum(useAllocationNum); + indexAllocationDataVO.setNullNum(totalAllocationNum - useAllocationNum); + indexAllocationDataVO.setUpshelfNum(upshelfNum); + indexAllocationDataVO.setNoUpshelfNum(totalNum - upshelfNum); +// bladeRedis.setEx(key, indexAllocationDataVO, 3600L); +// } + return indexAllocationDataVO; + } + + @Override + public IndexTrunklineHandOrderDataVO trunklineHandOrderData(IndexDTO indexDTO) { + +// BladeUser user = AuthUtil.getUser(); +// String key = CacheNames.tenantKey(user.getTenantId(), user.getUserId() + "", "trunklineHandOrderData"); +// IndexTrunklineHandOrderDataVO indexTrunklineHandOrderDataVO = bladeRedis.get(key); +// +// if (Objects.isNull(indexTrunklineHandOrderDataVO)) { + List warehouseIds = indexDTO.getWarehouseIds(); + IndexTrunklineHandOrderDataVO indexTrunklineHandOrderDataVO = new IndexTrunklineHandOrderDataVO(); + if (warehouseIds.isEmpty()) { + return indexTrunklineHandOrderDataVO; + } + + //订制品 + JSONObject packageJson = warehouseIndexMapper.findPackageTrunklineHandOrderData(indexDTO); + Integer packageWaybillNum = packageJson.getInteger("waybillNum"); + Integer packageHandleNum = packageJson.getInteger("handleNum"); + BigDecimal packageHandleWeight = packageJson.getBigDecimal("handleWeight"); + BigDecimal packageHandleVolume = packageJson.getBigDecimal("handleVolume"); + //零担 + JSONObject zeroJson = warehouseIndexMapper.findZeroTrunklineHandOrderData(indexDTO); + Integer zeroWaybillNum = zeroJson.getInteger("waybillNum"); + Integer zeroHandleNum = zeroJson.getInteger("handleNum"); + BigDecimal zeroHandleWeight = zeroJson.getBigDecimal("handleWeight"); + BigDecimal zeroHandleVolume = zeroJson.getBigDecimal("handleVolume"); + + indexTrunklineHandOrderDataVO.setWaybillNum(packageWaybillNum + zeroWaybillNum); + indexTrunklineHandOrderDataVO.setHandleNum(packageHandleNum + zeroHandleNum); + indexTrunklineHandOrderDataVO.setHandleWeight(packageHandleWeight.add(zeroHandleWeight)); + indexTrunklineHandOrderDataVO.setHandleVolume(packageHandleVolume.add(zeroHandleVolume)); +// } + + return indexTrunklineHandOrderDataVO; + } + + @Override + public IndexTrunklineCarsDataVO trunklineCarsData(IndexDTO indexDTO) { + List warehouseIds = indexDTO.getWarehouseIds(); + IndexTrunklineCarsDataVO indexTrunklineCarsDataVO = new IndexTrunklineCarsDataVO(); + if (warehouseIds.isEmpty()) { + return indexTrunklineCarsDataVO; + } + + indexTrunklineCarsDataVO = warehouseIndexMapper.trunklineCarsData(indexDTO); + + return indexTrunklineCarsDataVO; + } + + @Override + public IndexUnloadAbnormalDataVO unloadAbnormalData(IndexDTO indexDTO) { + List warehouseIds = indexDTO.getWarehouseIds(); + IndexUnloadAbnormalDataVO indexUnloadAbnormalDataVO = new IndexUnloadAbnormalDataVO(); + if (warehouseIds.isEmpty()) { + return indexUnloadAbnormalDataVO; + } + + indexDTO.setStartDate(CommonUtil.getDayStart()); + indexDTO.setEndDate(CommonUtil.getDayEnd()); + JSONObject dayJson = warehouseIndexMapper.findAbnormalData(indexDTO); + Integer sendDayNum = dayJson.getInteger("sendNum"); + Integer dealDayNum = dayJson.getInteger("dealNum"); + Integer unloadDayNum = warehouseIndexMapper.findUnloadNum(indexDTO); + indexUnloadAbnormalDataVO.setSendDayNum(sendDayNum); + indexUnloadAbnormalDataVO.setNoDealDayNum(sendDayNum - dealDayNum); + indexUnloadAbnormalDataVO.setUnloadDayNum(unloadDayNum); + BigDecimal dayRate = BigDecimal.ZERO; + if (!unloadDayNum.equals(0)) { + dayRate = new BigDecimal(sendDayNum).divide(new BigDecimal(unloadDayNum), 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); + } + indexUnloadAbnormalDataVO.setAbnormalDayRate(dayRate); + + indexDTO.setStartDate(CommonUtil.getMonthDayStart()); + indexDTO.setEndDate(CommonUtil.getMonthDayEnd()); + JSONObject monthJson = warehouseIndexMapper.findAbnormalData(indexDTO); + Integer sendMonthNum = monthJson.getInteger("sendNum"); + Integer dealMonthNum = monthJson.getInteger("dealNum"); + Integer unloadMonthNum = warehouseIndexMapper.findUnloadNum(indexDTO); + indexUnloadAbnormalDataVO.setSendMonthNum(sendMonthNum); + indexUnloadAbnormalDataVO.setNoDealMonthNum(sendMonthNum - dealMonthNum); + indexUnloadAbnormalDataVO.setUnloadMonthNum(unloadMonthNum); + BigDecimal monthRate = BigDecimal.ZERO; + if (!unloadMonthNum.equals(0)) { + monthRate = new BigDecimal(sendMonthNum).divide(new BigDecimal(unloadMonthNum), 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); + } + indexUnloadAbnormalDataVO.setAbnormalMonthRate(monthRate); + + return indexUnloadAbnormalDataVO; + } + + @Override + public List deliveryData(IndexDTO indexDTO) { + //查询商市配的信息 + List indexDeliveryDataVOList = new ArrayList<>(); + List indexDeliveryDataVOS = warehouseIndexMapper.findDeliveryTotal(indexDTO); + if (!indexDeliveryDataVOS.isEmpty()) { + for (IndexDeliveryDataVO indexDeliveryDataVO : indexDeliveryDataVOS) { + //总包件数量 + Integer deLiveryTotalNum = warehouseIndexMapper.findDeLiveryTotalNum(indexDTO, indexDeliveryDataVO.getType()); + indexDeliveryDataVO.setTotalDeliveryNum(deLiveryTotalNum); + //查询总重量 + BigDecimal totalWeight = warehouseIndexMapper.findDeliveryTotalWeight(indexDTO, indexDeliveryDataVO.getType()); + indexDeliveryDataVO.setTotalWeight(totalWeight); + //查询总包件体积 + BigDecimal totalVolume = warehouseIndexMapper.findDeliveryTotalVolume(indexDTO, indexDeliveryDataVO.getType()); + indexDeliveryDataVO.setTotalVolume(totalVolume); + //查询在途件数 + Integer totalRoadNum = warehouseIndexMapper.findDeLiveryTotalRoadNum(indexDTO, indexDeliveryDataVO.getType()); + indexDeliveryDataVO.setTotalRoadNum(totalRoadNum); + } + indexDeliveryDataVOList.addAll(indexDeliveryDataVOS); + } + + //查询自提信息 + IndexDeliveryDataVO indexDeliveryDataVO = warehouseIndexMapper.findBillLadingTotal(indexDTO); + if (Func.isNotEmpty(indexDeliveryDataVO)) { + //查询自提总件数 + Integer billLadingTotalNum = warehouseIndexMapper.findBillLadingTotalNum(indexDTO); + indexDeliveryDataVO.setTotalDeliveryNum(billLadingTotalNum); + //查询总重量 + BigDecimal billLadingTotalWeight = warehouseIndexMapper.findBillLadingTotalWeight(indexDTO); + indexDeliveryDataVO.setTotalWeight(billLadingTotalWeight); + //查询总包件体积 + BigDecimal billLadingTotalVolume = warehouseIndexMapper.findBillLadingTotalVolume(indexDTO); + indexDeliveryDataVO.setTotalVolume(billLadingTotalVolume); + indexDeliveryDataVOList.add(indexDeliveryDataVO); + } + //查询商配外协信息 + IndexDeliveryDataVO indexTripartiteDeliveryMerchantDataVO = warehouseIndexMapper.findTripartiteTotalByMerchant(indexDTO); + if (Func.isNotEmpty(indexTripartiteDeliveryMerchantDataVO)) { + + //查询商配外协总件数 + Integer tripartiteTotalNum = warehouseIndexMapper.findTripartiteTotalNumByMerchant(indexDTO); + indexTripartiteDeliveryMerchantDataVO.setTotalDeliveryNum(tripartiteTotalNum); + //查询商配外协总重量 + BigDecimal tripartiteTotalWeight = warehouseIndexMapper.findTripartiteTotalWeightByMerchant(indexDTO); + indexTripartiteDeliveryMerchantDataVO.setTotalWeight(tripartiteTotalWeight); + //查询商配外协总包件体积 + BigDecimal tripartiteTotalVolume = warehouseIndexMapper.findTripartiteTotalVolumeByMerchant(indexDTO); + indexTripartiteDeliveryMerchantDataVO.setTotalVolume(tripartiteTotalVolume); + indexDeliveryDataVOList.add(indexTripartiteDeliveryMerchantDataVO); + } + //查询市配外协信息 + IndexDeliveryDataVO indexTripartiteDeliveryCityDataVO = warehouseIndexMapper.findTripartiteTotalByCity(indexDTO); + if (Func.isNotEmpty(indexTripartiteDeliveryCityDataVO)) { + //查询市配外协总件数 + Integer tripartiteTotalNum = warehouseIndexMapper.findTripartiteTotalNumByCity(indexDTO); + indexTripartiteDeliveryCityDataVO.setTotalDeliveryNum(tripartiteTotalNum); + //查询市配外协总重量 + BigDecimal tripartiteTotalWeight = warehouseIndexMapper.findTripartiteTotalWeightByCity(indexDTO); + indexTripartiteDeliveryCityDataVO.setTotalWeight(tripartiteTotalWeight); + //查询市配外协总包件体积 + BigDecimal tripartiteTotalVolume = warehouseIndexMapper.findTripartiteTotalVolumeByCity(indexDTO); + indexTripartiteDeliveryCityDataVO.setTotalVolume(tripartiteTotalVolume); + indexDeliveryDataVOList.add(indexTripartiteDeliveryCityDataVO); + } + return indexDeliveryDataVOList; + } + + @Override + public List signforData(IndexDTO indexDTO) { + List list = new ArrayList<>(); + Date date = new Date(); + SimpleDateFormat dayFormat = new SimpleDateFormat("yyyy-MM-dd"); + String day = dayFormat.format(date); + indexDTO.setDayStr(day); + IndexSignforDataVO indexSignforDayDataVO = new IndexSignforDataVO(); + indexSignforDayDataVO.setType(1); + //查询当天签收数据 + String daySignforNum = warehouseIndexMapper.findSignforDataByDay(indexDTO); + indexSignforDayDataVO.setSignNum(daySignforNum); + //查询当天未签收件数 + String dayUnSignforNum = warehouseIndexMapper.findUnSignforDataByDay(indexDTO); + indexSignforDayDataVO.setUnSignNum(dayUnSignforNum); + //计算签收率 + if (!"0".equals(daySignforNum) && !"0".equals(dayUnSignforNum)) { + BigDecimal bd1 = new BigDecimal(daySignforNum); + BigDecimal bd2 = new BigDecimal(dayUnSignforNum); + BigDecimal divide = bd1.divide(bd1.add(bd2), 4, BigDecimal.ROUND_HALF_EVEN); + String signScale = divide.toString(); + indexSignforDayDataVO.setSignScale(signScale); + } + //查询当天文员复核数 + String dayClerkSignforNum = warehouseIndexMapper.findClerkSignforNumByDay(indexDTO); + indexSignforDayDataVO.setClerkSignNum(dayClerkSignforNum); + //查询当天计划数 + String dayPlanByday = warehouseIndexMapper.findPlanNumByDay(indexDTO); + //计算文员签收率 + if (!"0".equals(dayClerkSignforNum) && !"0".equals(dayPlanByday)) { + BigDecimal bd1 = new BigDecimal(dayClerkSignforNum); + BigDecimal bd2 = new BigDecimal(dayPlanByday); + BigDecimal multiply = bd1.divide(bd1.add(bd2), 4, BigDecimal.ROUND_CEILING); + String signScale = multiply.toString(); + indexSignforDayDataVO.setClerkSignforScale(signScale); + } + //文员超时复核数 + String dayClerkOverTimeSignfoNum = warehouseIndexMapper.findClerkOverTimeNumByDay(indexDTO); + indexSignforDayDataVO.setClerkOverTimeSignfoNum(dayClerkOverTimeSignfoNum); + indexSignforDayDataVO.setClerkSignNum(dayClerkSignforNum); + list.add(indexSignforDayDataVO); + IndexSignforDataVO indexSignforMonthDataVO = new IndexSignforDataVO(); + indexSignforMonthDataVO.setType(2); + //查询当月签收数据 + String monthSignforNum = warehouseIndexMapper.findSignforDataByMonth(indexDTO); + indexSignforMonthDataVO.setSignNum(monthSignforNum); + //查询当月未签收数据 + String monthUnSignforNum = warehouseIndexMapper.findUnSignforDataByMonth(indexDTO); + indexSignforMonthDataVO.setUnSignNum(monthUnSignforNum); + //计算签收率 + if (!"0".equals(monthSignforNum) && !"0".equals(monthUnSignforNum)) { + BigDecimal bd1 = new BigDecimal(monthSignforNum); + BigDecimal bd2 = new BigDecimal(monthUnSignforNum); + BigDecimal multiply = bd1.divide(bd1.add(bd2), 4, BigDecimal.ROUND_CEILING); + String signScale = multiply.toString(); + indexSignforMonthDataVO.setSignScale(signScale); + } + //查询当月文员复核数 + String monthClerkSignforNum = warehouseIndexMapper.findClerkSignforNumByMonth(indexDTO); + indexSignforMonthDataVO.setClerkSignNum(monthClerkSignforNum); + String monthPlan = warehouseIndexMapper.findPlanNumByMonth(indexDTO); + if (!"0".equals(monthClerkSignforNum) && !"0".equals(monthPlan)) { + BigDecimal bd1 = new BigDecimal(monthClerkSignforNum); + BigDecimal bd2 = new BigDecimal(monthPlan); + BigDecimal multiply = bd1.divide(bd1.add(bd2), 4, BigDecimal.ROUND_CEILING); + String signScale = multiply.toString(); + indexSignforMonthDataVO.setClerkSignforScale(signScale); + } + //查询当月文员复核 + String monthClerkOverTimeSignfoNum = warehouseIndexMapper.findClerkOverTimeNumByMonth(indexDTO); + indexSignforMonthDataVO.setClerkOverTimeSignfoNum(monthClerkOverTimeSignfoNum); + if (!"0".equals(monthClerkOverTimeSignfoNum) && !"0".equals(monthPlan)) { + BigDecimal bd1 = new BigDecimal(monthClerkOverTimeSignfoNum); + BigDecimal bd2 = new BigDecimal(monthPlan); + BigDecimal multiply = bd1.divide(bd1.add(bd2), 4, BigDecimal.ROUND_CEILING); + String signScale = multiply.toString(); + indexSignforMonthDataVO.setClerkOverTimeScale(signScale); + } + list.add(indexSignforMonthDataVO); + + //查询自提相关的签收信息 + + IndexSignforDataVO indexBillLadingSignforDayDataVO = new IndexSignforDataVO(); + indexBillLadingSignforDayDataVO.setType(3); + //查询自提签收包件信息 + String dayBillLadingSignfor = warehouseIndexMapper.findBillLadingSignforByDay(indexDTO); + indexBillLadingSignforDayDataVO.setSignNum(dayBillLadingSignfor); + //查询自提未签收树 + String dayBillLadingUnSignfor = warehouseIndexMapper.findBillLadingUnSignforByDay(indexDTO); + indexBillLadingSignforDayDataVO.setUnSignNum(dayBillLadingUnSignfor); + //计算当天的签收率 + if (!"0".equals(dayBillLadingSignfor) && !"0".equals(dayBillLadingUnSignfor)) { + BigDecimal bd1 = new BigDecimal(dayBillLadingSignfor); + BigDecimal bd2 = new BigDecimal(dayBillLadingUnSignfor); + BigDecimal multiply = bd1.divide(bd1.add(bd2), 4, BigDecimal.ROUND_CEILING); + String signScale = multiply.toString(); + indexBillLadingSignforDayDataVO.setClerkSignforScale(signScale); + } + //查询当天计划数 + String dayBillLadingPlanNum = warehouseIndexMapper.findBillLadingPlanNumByDay(indexDTO); + + + //查询当天文员复核数 + String dayBillLadingSignforNum = warehouseIndexMapper.findBillLadingSignForNumByDay(indexDTO); + indexBillLadingSignforDayDataVO.setClerkSignNum(dayBillLadingSignforNum); + if (!"0".equals(dayBillLadingPlanNum) && !"0".equals(dayBillLadingSignforNum)) { + //计算当月的超时签收率 + BigDecimal bd1 = new BigDecimal(dayBillLadingSignforNum); + BigDecimal bd2 = new BigDecimal(dayBillLadingPlanNum); + BigDecimal multiply = bd1.divide(bd1.add(bd2), 1, BigDecimal.ROUND_CEILING); + String signScale = multiply.toString(); + indexBillLadingSignforDayDataVO.setClerkOverTimeScale(signScale); + } + //查询当天签收超时数 + String dayBillLadingverTimeNum = warehouseIndexMapper.findBillLadingOverTimeNumByDay(indexDTO); + indexBillLadingSignforDayDataVO.setClerkOverTimeSignfoNum(dayBillLadingverTimeNum); + list.add(indexBillLadingSignforDayDataVO); + + + IndexSignforDataVO indexBillLadingSignforMonthDataVO = new IndexSignforDataVO(); + indexBillLadingSignforMonthDataVO.setType(4); + + //查询自提当月签收情况 + String monthBillLadingSignfor = warehouseIndexMapper.findBillLadingSignforByMonth(indexDTO); + indexBillLadingSignforMonthDataVO.setSignNum(monthBillLadingSignfor); + //查询自提当月未签数量 + String monthBillLadingUnSignfor = warehouseIndexMapper.findBillLadingUnSignforByMonth(indexDTO); + indexBillLadingSignforMonthDataVO.setUnSignNum(monthBillLadingUnSignfor); + //计算当月的签收率 + if (!"0".equals(monthBillLadingSignfor) && !"0".equals(monthBillLadingUnSignfor)) { + BigDecimal bd1 = new BigDecimal(monthBillLadingSignfor); + BigDecimal bd2 = new BigDecimal(monthBillLadingUnSignfor); + BigDecimal multiply = bd1.divide(bd1.add(bd2), 4, BigDecimal.ROUND_CEILING); + String signScale = multiply.toString(); + indexBillLadingSignforMonthDataVO.setSignScale(signScale); + } + + //查询当月文员签收数 + String monthBillLadingSignforNum = warehouseIndexMapper.findBillLadingSignForNumByMonth(indexDTO); + indexBillLadingSignforMonthDataVO.setClerkSignNum(monthBillLadingSignforNum); + //查询当月文员超时签收数 + String monthBillLadingOverTimeNum = warehouseIndexMapper.findBillLadingOverTimeNumByDay(indexDTO); + indexBillLadingSignforMonthDataVO.setClerkOverTimeSignfoNum(monthBillLadingOverTimeNum); + //查询当月计划总数 + String monthBillLadingPlanNum = warehouseIndexMapper.findBillLadingPlanNumByMonth(indexDTO); + if (!"0".equals(monthBillLadingOverTimeNum) && !"0".equals(monthBillLadingPlanNum)) { + //计算当月的超时签收率 + BigDecimal bd1 = new BigDecimal(monthBillLadingOverTimeNum); + BigDecimal bd2 = new BigDecimal(monthBillLadingPlanNum); + BigDecimal multiply = bd1.divide(bd1.add(bd2), 4, BigDecimal.ROUND_CEILING); + String signScale = multiply.toString(); + indexBillLadingSignforMonthDataVO.setClerkOverTimeScale(signScale); + } + list.add(indexBillLadingSignforMonthDataVO); + return list; + } +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/util/ReportExcelUtil.java b/blade-service/logpm-report/src/main/java/com/logpm/report/util/ReportExcelUtil.java index 1b862b28a..1cd0d4a38 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/util/ReportExcelUtil.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/util/ReportExcelUtil.java @@ -1,5 +1,6 @@ package com.logpm.report.util; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; @@ -8,17 +9,27 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.logpm.report.constant.ReportConstants; import com.logpm.report.service.ExportReader; +import com.logpm.report.service.IAsyncService; +import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.formula.functions.T; +import org.jetbrains.annotations.NotNull; +import org.springblade.core.log.exception.ServiceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; /** @@ -27,6 +38,8 @@ import java.util.concurrent.ExecutorService; * @author zhaoqiaobo * @create 2024-03-06 17:48 */ +@Slf4j +@Component public class ReportExcelUtil { public static final String CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; @@ -38,7 +51,12 @@ public class ReportExcelUtil { /** * 每次查询几条数据 */ - public static final Long PAGESIZE = 50000L; + public static final Long PAGESIZE = 100000L; + + @Resource + private IAsyncService asyncService; + @Autowired + private Executor asyncExecutor; /** * 设置excel导出的返回头 @@ -87,6 +105,9 @@ public class ReportExcelUtil { ReportExcelUtil.setExportHeader(response, fileName); // 获取需要导出的总条数 Long count = service.getCount(query); + if (count > 500000L) { + throw new ServiceException("导出数据不能大于50w,请增加检索条件"); + } // 每个 sheet 放多少条数据 Double sheetDataNum = onceSheetDataNum.doubleValue(); // 总共要几个 sheet @@ -94,9 +115,7 @@ public class ReportExcelUtil { // 总共需要查询数据库几次 int findNum = (int) Math.ceil((count / pageSize.doubleValue())); // 封装查询后需要导出的数据 - Map> pageMap = new HashMap<>(ReportConstants.HASHMAP_DEFAULT_SIZE); - // 定义线程池,大表导出使用一个线程池 - ExecutorService executorService = ThreadPoolUtil.getThreadPool(); + Map> pageMap = new ConcurrentHashMap<>(ReportConstants.HASHMAP_DEFAULT_SIZE); // 控制线程全部查询完后执行导出操作 CountDownLatch countDownLatch = new CountDownLatch(findNum); ExcelWriter excelWriter = null; @@ -119,28 +138,37 @@ public class ReportExcelUtil { // 查询次数+1 num = num + 1; // 提交线程执行查询 - executorService.submit(() -> { - // 剩余数据 - long remaindNum = count - (finalNum * pageSize); - // 当前第几次查询 - int current = finalNum + 1; - // 当前查询需要查询几条数据 - long lastNum = remaindNum > pageSize ? pageSize : remaindNum; - // 分页查询对象 - Page page = new Page(current, lastNum); - // 执行查询操作返回数据 - List deliveryTrainPage = service.findList(page, query); - // 获取组装的数据列表 - List detailVo = pageMap.get(finalI); - // 将查询数据添加到本地缓存 - if (CollectionUtil.isEmpty(detailVo)) { - pageMap.put(finalI, deliveryTrainPage); - } else { - pageMap.get(finalI).addAll(deliveryTrainPage); - } - // 当前线程执行完成 - countDownLatch.countDown(); - }); + // CompletableFuture future = asyncService.getListCompletableFuture(service, query, pageSize, count, finalNum, pageMap, finalI); + // CompletableFuture future = CompletableFuture.supplyAsync(() -> { + // // 剩余数据 + // long remaindNum = count - (finalNum * pageSize); + // // 当前第几次查询 + // int current = finalNum + 1; + // // 当前查询需要查询几条数据 + // long lastNum = remaindNum > pageSize ? pageSize : remaindNum; + // // 分页查询对象 + // Page page = new Page(current, lastNum); + // // 执行查询操作返回数据 + // return service.findList(page, query); + // }, asyncExecutor); + // future.thenAccept(list -> { + // if(CollUtil.isNotEmpty(list)){ + // // 获取组装的数据列表 + // List detailVo = pageMap.get(finalI); + // // 将查询数据添加到本地缓存 + // if (CollectionUtil.isEmpty(detailVo)) { + // pageMap.put(finalI, list); + // } else { + // pageMap.get(finalI).addAll(list); + // } + // } + // }); + // futures.add(future); + // asyncExecutor.execute(() -> { + + asyncService.initExportData(service, query, pageSize, count, finalNum, pageMap, finalI, countDownLatch); + + // }); } } try { @@ -149,6 +177,13 @@ public class ReportExcelUtil { } catch (InterruptedException e) { e.printStackTrace(); } + + // try { + // CompletableFuture allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + // allFutures.join(); + // } catch (Exception e) { + // log.error("系统异常:{}", e); + // } // 分sheet向excel中写数据, for (Map.Entry> entry : pageMap.entrySet()) { Integer key = entry.getKey(); @@ -160,4 +195,54 @@ public class ReportExcelUtil { excelWriter.finish(); } + private static void initExportData(ExportReader service, Wrapper query, Long pageSize, Long count, int finalNum, Map> pageMap, int finalI) { + // 剩余数据 + long remaindNum = count - (finalNum * pageSize); + // 当前第几次查询 + int current = finalNum + 1; + // 当前查询需要查询几条数据 + long lastNum = remaindNum > pageSize ? pageSize : remaindNum; + // 分页查询对象 + Page page = new Page(current, lastNum); + // 执行查询操作返回数据 + List deliveryTrainPage = service.findList(page, query); + // 获取组装的数据列表 + List detailVo = pageMap.get(finalI); + // 将查询数据添加到本地缓存 + if (CollectionUtil.isEmpty(detailVo)) { + pageMap.put(finalI, deliveryTrainPage); + } else { + pageMap.get(finalI).addAll(deliveryTrainPage); + } + } + + private static @NotNull CompletableFuture getListCompletableFuture(ExportReader service, Wrapper query, Long pageSize, Long count, int finalNum, Map> pageMap, int finalI) { + CompletableFuture future = CompletableFuture.supplyAsync(() -> { + // 剩余数据 + long remaindNum = count - (finalNum * pageSize); + // 当前第几次查询 + int current = finalNum + 1; + // 当前查询需要查询几条数据 + long lastNum = remaindNum > pageSize ? pageSize : remaindNum; + // 分页查询对象 + Page page = new Page(current, lastNum); + // 执行查询操作返回数据 + return service.findList(page, query); + + }); + future.thenAccept(list -> { + if (CollUtil.isNotEmpty(list)) { + // 获取组装的数据列表 + List detailVo = pageMap.get(finalI); + // 将查询数据添加到本地缓存 + if (CollectionUtil.isEmpty(detailVo)) { + pageMap.put(finalI, list); + } else { + pageMap.get(finalI).addAll(list); + } + } + }); + return future; + } + } diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/util/ReportUtil.java b/blade-service/logpm-report/src/main/java/com/logpm/report/util/ReportUtil.java new file mode 100644 index 000000000..c92e59209 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/util/ReportUtil.java @@ -0,0 +1,97 @@ +package com.logpm.report.util; + +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import org.springblade.core.log.exception.ServiceException; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 报表工具类 + * + * @Author zqb + * @Date 2024/6/13 + **/ +public class ReportUtil { + + /** + * 校验两个时间相差不超过 30 天 + * 如果不跨月则返回 true + * 如果跨月则不超过 30 天 + * + * @Param start 开始时间 + * @Param end 解释时间 + * @Return boolean + * @Author zqb 2024/6/13 + **/ + public static boolean isWithinOneMonth(Date start, Date end) { + // 检查输入是否为null + if (start == null || end == null) { + return false; + } + + // 是否跨月,不跨越则直接返回true + if (DateUtil.year(start) == DateUtil.year(end) && DateUtil.month(start) == DateUtil.month(end)) { + return true; + } + + // 跨越则判断两个日期是否相差超过30天 + return DateUtil.between(start, end, DateUnit.DAY) <= 30; + } + + public static void buildReportWarehouseAuth(String warehouseName, String warehouseNameRange, + QueryWrapper queryWrapper, IBasicdataWarehouseClient warehouseClient) { + if (StrUtil.isEmpty(warehouseName) && StrUtil.isEmpty(warehouseNameRange)) { + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if (ObjectUtil.isNotEmpty(myCurrentWarehouse)) { + queryWrapper.eq("warehouse_id", myCurrentWarehouse.getId()); + } else { + List warehouseEntities = warehouseClient.getMyWarehouseList(); + queryWrapper.in("warehouse_id", warehouseEntities.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList())); + } + } + } + + public static void dateIsWithinOneMonth(String taskTime, Date startTaskTime, Date endTaskTime, String title) { + if (ObjectUtil.isEmpty(taskTime)) { + boolean withinOneMonth = isWithinOneMonth(startTaskTime, endTaskTime); + if (!withinOneMonth) { + throw new ServiceException(title + "必选且时间不超过一个月"); + } + } + } + + public static boolean areAllPropertiesEmpty(Object obj) { + if (obj == null) return true; + return Stream.of(obj.getClass().getDeclaredFields()) + .filter(field -> !field.getName().equals("serialVersionUID")) + .peek(field -> field.setAccessible(true)) // 设置所有字段可访问 + .allMatch(field -> { + Object value = null; + try { + value = field.get(obj); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + if (value == null) return true; + if (value instanceof String) return ((String) value).isEmpty(); + if (value instanceof Collection) return ((Collection) value).isEmpty(); + if (value instanceof Map) return ((Map) value).isEmpty(); + if (value.getClass().isArray()) return Arrays.asList((Object[]) value).isEmpty(); + // 对于基本类型或其他不可空类型,你可能需要返回 false 或进行更详细的检查 + return false; + }); + } + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/util/ThreadPoolUtil.java b/blade-service/logpm-report/src/main/java/com/logpm/report/util/ThreadPoolUtil.java index f380ba860..381bfbe8e 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/util/ThreadPoolUtil.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/util/ThreadPoolUtil.java @@ -29,6 +29,7 @@ public class ThreadPoolUtil { executor.shutdownNow(); } executor = ExecutorBuilder.create() + // 设置核心线程 .setCorePoolSize(8) .setMaxPoolSize(20) .setThreadFactory(ThreadFactoryBuilder.create().setNamePrefix("logpm-report-").build()) diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexAllocationDataVO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexAllocationDataVO.java new file mode 100644 index 000000000..12f3870a6 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexAllocationDataVO.java @@ -0,0 +1,16 @@ +package com.logpm.report.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class IndexAllocationDataVO implements Serializable { + + private Integer totalNum = 0; + private Integer useNum = 0; + private Integer nullNum = 0; + private Integer upshelfNum = 0; + private Integer noUpshelfNum = 0; + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexHandOrderDataVO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexHandOrderDataVO.java new file mode 100644 index 000000000..8d59c291c --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexHandOrderDataVO.java @@ -0,0 +1,18 @@ +package com.logpm.report.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class IndexHandOrderDataVO implements Serializable { + + private Integer totalNum = 0; + private Integer zeroNum = 0; + private Integer thirdTransferNum = 0; + private Integer mallNum = 0; + private Integer cityNum = 0; + private Integer billNum = 0; + private Integer trayNum = 0; + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexOpenOrderDataVO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexOpenOrderDataVO.java new file mode 100644 index 000000000..15ea76511 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexOpenOrderDataVO.java @@ -0,0 +1,15 @@ +package com.logpm.report.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class IndexOpenOrderDataVO implements Serializable { + + + private int totalNum = 0; + private int monthNum = 0; + private int dayNum = 0; + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexOpenOrderIncomeVO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexOpenOrderIncomeVO.java new file mode 100644 index 000000000..d81dcf4c0 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexOpenOrderIncomeVO.java @@ -0,0 +1,26 @@ +package com.logpm.report.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class IndexOpenOrderIncomeVO implements Serializable { + + private BigDecimal totalFee = BigDecimal.ZERO; + private BigDecimal monthFee = BigDecimal.ZERO; + private BigDecimal monthTrunklineFee = BigDecimal.ZERO; + private BigDecimal monthWarehouseFee = BigDecimal.ZERO; + private BigDecimal monthDistributionFee = BigDecimal.ZERO; + private BigDecimal monthBillladingFee = BigDecimal.ZERO; + private BigDecimal monthInstallFee = BigDecimal.ZERO; + private BigDecimal dayFee = BigDecimal.ZERO; + private BigDecimal dayTrunklineFee = BigDecimal.ZERO; + private BigDecimal dayWarehouseFee = BigDecimal.ZERO; + private BigDecimal dayDistributionFee = BigDecimal.ZERO; + private BigDecimal dayBillladingFee = BigDecimal.ZERO; + private BigDecimal dayInstallFee = BigDecimal.ZERO; + + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexTrunklineCarsDataVO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexTrunklineCarsDataVO.java new file mode 100644 index 000000000..a03935af9 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexTrunklineCarsDataVO.java @@ -0,0 +1,16 @@ +package com.logpm.report.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class IndexTrunklineCarsDataVO implements Serializable { + + private Integer totalNum = 0; + private Integer inTransitNum = 0; + private Integer workNum = 0; + private Integer unloadNum = 0; + + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexTrunklineHandOrderDataVO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexTrunklineHandOrderDataVO.java new file mode 100644 index 000000000..480f3e58a --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexTrunklineHandOrderDataVO.java @@ -0,0 +1,16 @@ +package com.logpm.report.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class IndexTrunklineHandOrderDataVO implements Serializable { + + private Integer waybillNum = 0; + private Integer handleNum = 0; + private BigDecimal handleWeight = BigDecimal.ZERO; + private BigDecimal handleVolume = BigDecimal.ZERO; + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexUnloadAbnormalDataVO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexUnloadAbnormalDataVO.java new file mode 100644 index 000000000..66fc26049 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/IndexUnloadAbnormalDataVO.java @@ -0,0 +1,21 @@ +package com.logpm.report.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class IndexUnloadAbnormalDataVO implements Serializable { + + private Integer sendDayNum = 0; + private Integer noDealDayNum = 0; + private Integer unloadDayNum = 0; + private BigDecimal abnormalDayRate = BigDecimal.ZERO; + + private Integer sendMonthNum = 0; + private Integer noDealMonthNum = 0; + private Integer unloadMonthNum = 0; + private BigDecimal abnormalMonthRate = BigDecimal.ZERO; + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDevilerVO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDevilerVO.java index fd1713602..ff6bf6c64 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDevilerVO.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDevilerVO.java @@ -1,5 +1,6 @@ package com.logpm.report.vo; +import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; @@ -25,6 +26,10 @@ public class ReportDevilerVO implements Serializable { private static final long serialVersionUID = 1L; + @ApiModelProperty(value = "配送id") + @ExcelIgnore + private Long id; + @ApiModelProperty(value = "车次") @ExcelProperty("车次") private String trainNumber; diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/indexCount/IndexDeliveryDataVO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/indexCount/IndexDeliveryDataVO.java new file mode 100644 index 000000000..e061fc72a --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/indexCount/IndexDeliveryDataVO.java @@ -0,0 +1,19 @@ +package com.logpm.report.vo.indexCount; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class IndexDeliveryDataVO implements Serializable { + + private String type ; + private Integer totalNum = 0; + private Integer totalDeliveryNum = 0; + private BigDecimal totalWeight = BigDecimal.ZERO; + private BigDecimal totalVolume = BigDecimal.ZERO; + private Integer totalRoadNum = 0; + + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/indexCount/IndexSignforDataVO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/indexCount/IndexSignforDataVO.java new file mode 100644 index 000000000..bc3582b5e --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/indexCount/IndexSignforDataVO.java @@ -0,0 +1,34 @@ +package com.logpm.report.vo.indexCount; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class IndexSignforDataVO implements Serializable { + + //类型 + private Integer type; + //签收数 + private String signNum; + //未签收数 + private String UnSignNum; + //文员超时为复核数 + private String clerkOverTimeSignfoNum; + + //文员超时为复核数 + private String clerkOverTimeScale; + + //签收率 + private String signScale; + //复核率 + private String ClerkSignforScale; + //复核数 + private String clerkSignNum; + + + + + +} diff --git a/blade-service/logpm-report/src/main/resources/application-dev.yml b/blade-service/logpm-report/src/main/resources/application-dev.yml index cdf523b40..8a0a09fee 100644 --- a/blade-service/logpm-report/src/main/resources/application-dev.yml +++ b/blade-service/logpm-report/src/main/resources/application-dev.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -32,16 +32,14 @@ spring: #validation-query: select 1 from dual url: ${blade.datasource.report.master.url} username: ${blade.datasource.report.master.username} -# password: ${blade.datasource.report.master.password} - password: 12345678 - slave: + password: ${blade.datasource.report.master.password} + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.report.slave.url} - username: ${blade.datasource.report.slave.username} -# password: ${blade.datasource.report.slave.password} - password: 12345678 + url: ${blade.datasource.report.627683.url} + username: ${blade.datasource.report.627683.username} + password: ${blade.datasource.report.627683.password} diff --git a/blade-service/logpm-report/src/main/resources/application-prod.yml b/blade-service/logpm-report/src/main/resources/application-prod.yml index 3db9ae091..8a0a09fee 100644 --- a/blade-service/logpm-report/src/main/resources/application-prod.yml +++ b/blade-service/logpm-report/src/main/resources/application-prod.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -33,13 +33,13 @@ spring: url: ${blade.datasource.report.master.url} username: ${blade.datasource.report.master.username} password: ${blade.datasource.report.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.report.slave.url} - username: ${blade.datasource.report.slave.username} - password: ${blade.datasource.report.slave.password} + url: ${blade.datasource.report.627683.url} + username: ${blade.datasource.report.627683.username} + password: ${blade.datasource.report.627683.password} diff --git a/blade-service/logpm-report/src/main/resources/application-test.yml b/blade-service/logpm-report/src/main/resources/application-test.yml index 3db9ae091..8a0a09fee 100644 --- a/blade-service/logpm-report/src/main/resources/application-test.yml +++ b/blade-service/logpm-report/src/main/resources/application-test.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -33,13 +33,13 @@ spring: url: ${blade.datasource.report.master.url} username: ${blade.datasource.report.master.username} password: ${blade.datasource.report.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.report.slave.url} - username: ${blade.datasource.report.slave.username} - password: ${blade.datasource.report.slave.password} + url: ${blade.datasource.report.627683.url} + username: ${blade.datasource.report.627683.username} + password: ${blade.datasource.report.627683.password} diff --git a/blade-service/logpm-statisticsdata/Dockerfile b/blade-service/logpm-statisticsdata/Dockerfile new file mode 100644 index 000000000..0187c1277 --- /dev/null +++ b/blade-service/logpm-statisticsdata/Dockerfile @@ -0,0 +1,14 @@ +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 + +MAINTAINER h5u@163.com + +RUN mkdir -p /logpm/statisticsdata + +WORKDIR /logpm/statisticsdata + +EXPOSE 19999 + +ADD ./target/logpm-statisticsdata.jar ./app.jar + +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "-Xms128m","-Xmx512m","app.jar"] +CMD ["--spring.profiles.active=test"] diff --git a/blade-service/logpm-statisticsdata/pom.xml b/blade-service/logpm-statisticsdata/pom.xml index 4f2471905..317ea974f 100644 --- a/blade-service/logpm-statisticsdata/pom.xml +++ b/blade-service/logpm-statisticsdata/pom.xml @@ -12,6 +12,7 @@ org.springblade logpm-statisticsdata + ${project.artifactId} ${bladex.project.version} jar @@ -28,7 +29,61 @@ org.springblade blade-starter-excel + + org.springblade + blade-core-auto + compile + + + org.springframework.amqp + spring-amqp + + + org.springframework.amqp + spring-rabbit + + + org.springblade + logpm-statisticsdata-api + 3.2.0.RELEASE + compile + + + org.springblade + logpm-basicdata-api + 3.2.0.RELEASE + compile + + + org.springblade + logpm-basicdata-api + 3.2.0.RELEASE + compile + + + + + com.spotify + dockerfile-maven-plugin + + ${docker.username} + ${docker.password} + ${docker.registry.url}/${docker.namespace}/${project.artifactId} + ${project.version} + true + + target/${project.build.finalName}.jar + + false + + + + org.apache.maven.plugins + maven-antrun-plugin + + + diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/StatisticsDataApplication.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/StatisticsDataApplication.java index 8efd32b1f..34a7caeb6 100644 --- a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/StatisticsDataApplication.java +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/StatisticsDataApplication.java @@ -19,17 +19,21 @@ package com.logpm.statistics; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.cloud.client.BladeCloudApplication; import org.springblade.core.launch.BladeApplication; +import org.springframework.retry.annotation.EnableRetry; +import org.springframework.scheduling.annotation.EnableAsync; /** * Demo启动器 * * @author Chill */ +@EnableAsync +@EnableRetry @BladeCloudApplication public class StatisticsDataApplication { public static void main(String[] args) { - BladeApplication.run(ModuleNameConstant.APPLICATION_TRUNKLINE_NAME, StatisticsDataApplication.class, args); + BladeApplication.run(ModuleNameConstant.APPLICATION_STATISTICSDATA_NAME, StatisticsDataApplication.class, args); } } diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..e7d184443 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.statistics.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..4595ad5a0 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.statistics.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/CustomMessageConverter.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/CustomMessageConverter.java new file mode 100644 index 000000000..69fc34d26 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/CustomMessageConverter.java @@ -0,0 +1,155 @@ +package com.logpm.statistics.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.*; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength((long) bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/ExecutorConfig.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/ExecutorConfig.java new file mode 100644 index 000000000..ca5281608 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/ExecutorConfig.java @@ -0,0 +1,82 @@ +package com.logpm.statistics.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + String tenantId = AuthUtil.getTenantId(); + Map all = ThreadLocalUtil.getAll(); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + all.keySet().forEach(key -> ThreadLocalUtil.put(key, all.get(key))); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + String tenantId1 = AuthUtil.getTenantId(); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + all.clear(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/RabbitMqConfiguration.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/RabbitMqConfiguration.java new file mode 100644 index 000000000..32e272ac8 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/RabbitMqConfiguration.java @@ -0,0 +1,43 @@ +package com.logpm.statistics.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.ReturnedMessage; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Slf4j +@Configuration +public class RabbitMqConfiguration { + + @Bean + public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory){ + RabbitTemplate template = new RabbitTemplate(); + template.setConnectionFactory(connectionFactory); + template.setMandatory(true); + template.setMessageConverter(new CustomMessageConverter()); + template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { + @Override + public void confirm(CorrelationData correlationData, boolean b, String s) { + System.out.println("确认回调-相关数据:"+correlationData); + System.out.println("确认回调-确认情况:"+b); + System.out.println("确认回调-原因:"+s); + } + }); + + template.setReturnsCallback(new RabbitTemplate.ReturnsCallback() { + @Override + public void returnedMessage(ReturnedMessage returnedMessage) { + System.out.println("返回回调-消息:"+returnedMessage.getMessage()); + System.out.println("返回回调-回应码:"+returnedMessage.getReplyCode()); + System.out.println("返回回调-回应信息:"+returnedMessage.getReplyText()); + System.out.println("返回回调-交换机:"+returnedMessage.getExchange()); + System.out.println("返回回调-路由键:"+returnedMessage.getRoutingKey()); + } + }); + return template; + } + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/StatisticsdataConfiguration.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/StatisticsdataConfiguration.java new file mode 100644 index 000000000..0dd5f4700 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/config/StatisticsdataConfiguration.java @@ -0,0 +1,38 @@ +/* + * 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.statistics.config; + + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 配置feign、mybatis包名、properties + * + * @author chaos + */ +@Configuration(proxyBeanMethods = false) +@ComponentScan({"org.springblade", "com.logpm"}) +@EnableFeignClients({"org.springblade", "com.logpm"}) +@MapperScan({"org.springblade.**.mapper.**", "com.logpm.**.mapper.**"}) +//@EnableConfigurationProperties(FactoryDataBaseProperties.class) +public class StatisticsdataConfiguration { + + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/controller/MerchantBalanceController.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/controller/MerchantBalanceController.java new file mode 100644 index 000000000..1126c8020 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/controller/MerchantBalanceController.java @@ -0,0 +1,184 @@ +package com.logpm.statistics.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.statistics.dto.MerchantStatisticsDTO; +import com.logpm.statistics.dto.StatisticsBalanceAbnormalDTO; +import com.logpm.statistics.dto.StatisticsBalanceRecordDTO; +import com.logpm.statistics.service.IStatisticsBalanceOrderInfoService; +import com.logpm.statistics.vo.StatisticsBalanceOrderInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping("/merchantBalance") +@Api(value = "商户结算控制类", tags = "商户结算单接口") +public class MerchantBalanceController { + + private final IStatisticsBalanceOrderInfoService balanceOrderInfoService; + + @ResponseBody + @PostMapping("/pageList") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "运单维度对账单", notes = "传入merchantStatisticsDTO") + public R pageList(@RequestBody MerchantStatisticsDTO merchantStatisticsDTO) { + String method = "############pageList: "; + log.info(method+"请求参数{}",merchantStatisticsDTO); + try{ + +// Integer listType = merchantStatisticsDTO.getListType(); +// if(Objects.isNull(listType)){ +// log.warn(method+"请选择正确的列表类型 listType={}",listType); +// return R.fail(405,"请选择正确的列表类型"); +// } + + IPage pages = balanceOrderInfoService.pageList(merchantStatisticsDTO); + + return R.data(pages); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + + @ResponseBody + @PostMapping("/addAbnormal") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "添加异常", notes = "传入balanceAbnormalDTO") + public R addAbnormal(@RequestBody StatisticsBalanceAbnormalDTO balanceAbnormalDTO) { + String method = "############addAbnormal: "; + log.info(method+"请求参数{}",balanceAbnormalDTO); + try{ + + Long balanceOrderInfoId = balanceAbnormalDTO.getBalanceOrderInfoId(); + if(Objects.isNull(balanceOrderInfoId)){ + log.warn(method+"请选择正确的结算单 balanceOrderInfoId={}",balanceOrderInfoId); + return R.fail(405,"请选择正确的结算单"); + } + + return balanceOrderInfoService.addAbnormal(balanceAbnormalDTO); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + + @ResponseBody + @PostMapping("/findAbnormalList") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询异常列表", notes = "传入balanceAbnormalDTO") + public R findAbnormalList(@RequestBody StatisticsBalanceAbnormalDTO balanceAbnormalDTO) { + String method = "############findAbnormalList: "; + log.info(method+"请求参数{}",balanceAbnormalDTO); + try{ + + Long balanceOrderInfoId = balanceAbnormalDTO.getBalanceOrderInfoId(); + if(Objects.isNull(balanceOrderInfoId)){ + log.warn(method+"请选择正确的结算单 balanceOrderInfoId={}",balanceOrderInfoId); + return R.fail(405,"请选择正确的结算单"); + } + + return balanceOrderInfoService.findAbnormalList(balanceAbnormalDTO); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + @ResponseBody + @PostMapping("/addBalanceRecord") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "添加结算揭露", notes = "传入balanceRecordDTO") + public R addBalanceRecord(@RequestBody StatisticsBalanceRecordDTO balanceRecordDTO) { + String method = "############addBalanceRecord: "; + log.info(method+"请求参数{}",balanceRecordDTO); + try{ + + Long balanceOrderInfoId = balanceRecordDTO.getBalanceOrderInfoId(); + if(Objects.isNull(balanceOrderInfoId)){ + log.warn(method+"请选择正确的结算单 balanceOrderInfoId={}",balanceOrderInfoId); + return R.fail(405,"请选择正确的结算单"); + } + + return balanceOrderInfoService.addBalanceRecord(balanceRecordDTO); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + @ResponseBody + @PostMapping("/findRecordList") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询结算记录列表", notes = "传入balanceRecordDTO") + public R findRecordList(@RequestBody StatisticsBalanceRecordDTO balanceRecordDTO) { + String method = "############findRecordList: "; + log.info(method+"请求参数{}",balanceRecordDTO); + try{ + + Long balanceOrderInfoId = balanceRecordDTO.getBalanceOrderInfoId(); + if(Objects.isNull(balanceOrderInfoId)){ + log.warn(method+"请选择正确的结算单 balanceOrderInfoId={}",balanceOrderInfoId); + return R.fail(405,"请选择正确的结算单"); + } + + return balanceOrderInfoService.findRecordList(balanceRecordDTO); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + @ResponseBody + @PostMapping("/findBalanceDetail") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询结算单详情", notes = "传入merchantStatisticsDTO") + public R findBalanceDetail(@RequestBody MerchantStatisticsDTO merchantStatisticsDTO) { + String method = "############findBalanceDetail: "; + log.info(method+"请求参数{}",merchantStatisticsDTO); + try{ + + Long balanceOrderInfoId = merchantStatisticsDTO.getBalanceOrderInfoId(); + if(Objects.isNull(balanceOrderInfoId)){ + log.warn(method+"请选择正确的结算单 balanceOrderInfoId={}",balanceOrderInfoId); + return R.fail(405,"请选择正确的结算单"); + } + + return balanceOrderInfoService.findBalanceDetail(balanceOrderInfoId); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/controller/MerchantStatisticsController.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/controller/MerchantStatisticsController.java new file mode 100644 index 000000000..882a270b2 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/controller/MerchantStatisticsController.java @@ -0,0 +1,196 @@ +package com.logpm.statistics.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.statistics.dto.ChangesRecordDTO; +import com.logpm.statistics.dto.MerchantStatisticsDTO; +import com.logpm.statistics.service.IStatisticsOrderInfoService; +import com.logpm.statistics.vo.StatisticsChangesRecordVO; +import com.logpm.statistics.vo.StatisticsOrderInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.exception.CustomerException; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Objects; + +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping("/merchantStatistics") +@Api(value = "商户对账控制类", tags = "商户对账单接口") +public class MerchantStatisticsController { + + private final IStatisticsOrderInfoService statisticsOrderInfoService; + + @ResponseBody + @PostMapping("/pageList") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "运单维度对账单", notes = "传入merchantStatisticsDTO") + public R pageList(@RequestBody MerchantStatisticsDTO merchantStatisticsDTO) { + String method = "############pageList: "; + log.info(method + "请求参数{}", merchantStatisticsDTO); + try { + + Integer listType = merchantStatisticsDTO.getListType(); + if (Objects.isNull(listType)) { + log.warn(method + "请选择正确的列表类型 listType={}", listType); + return R.fail(405, "请选择正确的列表类型"); + } + + IPage pages = statisticsOrderInfoService.pageList(merchantStatisticsDTO); + + return R.data(pages); + } catch (CustomerException e) { + log.error(e.message, e); + return R.fail(e.code, e.message); + } catch (Exception e) { + log.error(method + "系统异常", e); + return R.fail(500, "系统异常"); + } + } + + @ResponseBody + @PostMapping("/findOrderDetail") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询订单详情", notes = "传入merchantStatisticsDTO") + public R findOrderDetail(@RequestBody MerchantStatisticsDTO merchantStatisticsDTO) { + String method = "############findOrderDetail: "; + log.info(method + "请求参数{}", merchantStatisticsDTO); + try { + Long orderInfoId = merchantStatisticsDTO.getOrderInfoId(); + if (Objects.isNull(orderInfoId)) { + log.warn(method + "请选择正确的订单 orderInfoId={}", orderInfoId); + return R.fail(405, "请选择正确的订单"); + } + + StatisticsOrderInfoVO statisticsOrderInfoVO = statisticsOrderInfoService.findOrderDetail(orderInfoId); + + return R.data(statisticsOrderInfoVO); + } catch (CustomerException e) { + log.error(e.message, e); + return R.fail(e.code, e.message); + } catch (Exception e) { + log.error(method + "系统异常", e); + return R.fail(500, "系统异常"); + } + } + + + @ResponseBody + @PostMapping("/findChangesRecordList") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询订单异动记录列表", notes = "传入merchantStatisticsDTO") + public R findChangesRecordList(@RequestBody MerchantStatisticsDTO merchantStatisticsDTO) { + String method = "############findChangesRecordList: "; + log.info(method + "请求参数{}", merchantStatisticsDTO); + try { + + Long orderInfoId = merchantStatisticsDTO.getOrderInfoId(); + if (Objects.isNull(orderInfoId)) { + log.warn(method + "订单id为空 orderInfoId={}", orderInfoId); + return R.fail(405, "订单id为空"); + } + + List list = statisticsOrderInfoService.findChangesRecordList(merchantStatisticsDTO); + + return R.data(list); + } catch (CustomerException e) { + log.error(e.message, e); + return R.fail(e.code, e.message); + } catch (Exception e) { + log.error(method + "系统异常", e); + return R.fail(500, "系统异常"); + } + } + + + @ResponseBody + @PostMapping("/addChangesRecord") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "新增异动金额", notes = "传入waybillDTO") + public R addChangesRecord(@RequestBody ChangesRecordDTO changesRecordDTO) { + String method = "############addChangesRecord: "; + log.info(method + "请求参数{}", changesRecordDTO); + try { + + Long orderInfoId = changesRecordDTO.getOrderInfoId(); + if (Objects.isNull(orderInfoId)) { + log.warn(method + "订单id为空 orderInfoId={}", orderInfoId); + return R.fail(405, "订单id为空"); + } + + Long statisticsWarehouseId = changesRecordDTO.getStatisticsWarehouseId(); + if (Objects.isNull(statisticsWarehouseId)) { + log.warn(method + "仓库id为空 statisticsWarehouseId={}", statisticsWarehouseId); + return R.fail(405, "仓库id为空"); + } + + return statisticsOrderInfoService.addChangesRecord(changesRecordDTO); + + } catch (CustomerException e) { + log.error(e.message, e); + return R.fail(e.code, e.message); + } catch (Exception e) { + log.error(method + "系统异常", e); + return R.fail(500, "系统异常"); + } + } + + + @ResponseBody + @PostMapping("/checkBalance") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "确认结算", notes = "传入merchantStatisticsDTO") + public R checkBalance(@RequestBody MerchantStatisticsDTO merchantStatisticsDTO) { + String method = "############checkBalance: "; + log.info(method + "请求参数{}", merchantStatisticsDTO); + try { + + List orderInfoIds = merchantStatisticsDTO.getOrderInfoIds(); + if (orderInfoIds.isEmpty()) { + log.warn(method + "订单集合为空 orderInfoIds={}", orderInfoIds); + return R.fail(405, "订单集合为空"); + } + + return statisticsOrderInfoService.checkBalance(merchantStatisticsDTO); + + } catch (CustomerException e) { + log.error(e.message, e); + return R.fail(e.code, e.message); + } catch (Exception e) { + log.error(method + "系统异常", e); + return R.fail(500, "系统异常"); + } + } + + @ResponseBody + @PatchMapping("/real/{id}") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "计算实际费用", notes = "计算实际费用") + public R calculateRealCost(@PathVariable("id") Long id) { + String method = "############calculateRealCost: "; + log.info(method + "请求参数{}", id); + try { + return R.status(statisticsOrderInfoService.calculateRealCost(id)); + } catch (CustomerException e) { + log.error(e.message, e); + return R.fail(e.code, e.message); + } catch (Exception e) { + log.error(method + "系统异常", e); + return R.fail(500, "系统异常"); + } + } + + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/launcher/StatisticsdataLauncherServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/launcher/StatisticsdataLauncherServiceImpl.java new file mode 100644 index 000000000..ea07c1be2 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/launcher/StatisticsdataLauncherServiceImpl.java @@ -0,0 +1,75 @@ +/* + * 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.statistics.launcher; + +import org.springblade.core.auto.service.AutoService; +import org.springblade.core.launch.constant.NacosConstant; +import org.springblade.core.launch.service.LauncherService; +import org.springblade.core.launch.utils.PropsUtil; +import org.springframework.boot.builder.SpringApplicationBuilder; + +import java.util.Properties; + +/** + * 启动参数拓展 + * + * @author Chill + */ +@AutoService(LauncherService.class) +public class StatisticsdataLauncherServiceImpl implements LauncherService { + + @Override + public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) { + Properties props = System.getProperties(); + // 开启多数据源 + PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true"); + // 指定注册配置信息 + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].data-id", NacosConstant.dataId(appName, profile)); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].group", NacosConstant.NACOS_CONFIG_GROUP); + PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].refresh", NacosConstant.NACOS_CONFIG_REFRESH); + + // 分布式事物 +// seata注册地址 +// PropsUtil.setProperty(props, "seata.service.grouplist.default", LauncherConstant.seataAddr(profile)); +//// seata注册group格式 +//// PropsUtil.setProperty(props, "seata.tx-service-group", LauncherConstant.seataServiceGroup(appName)); +//// seata配置服务group +// PropsUtil.setProperty(props, "seata.service.vgroup-mapping.default_tx_group".concat(LauncherConstant.seataServiceGroup(appName)), LauncherConstant.DEFAULT_MODE); +//// seata注册模式配置 +// PropsUtil.setProperty(props, "seata.registry.type", LauncherConstant.NACOS_MODE); +// PropsUtil.setProperty(props, "seata.registry.nacos.server-addr", LauncherConstant.nacosAddr(profile)); +// PropsUtil.setProperty(props, "seata.config.type", LauncherConstant.NACOS_MODE); +// PropsUtil.setProperty(props, "seata.config.nacos.server-addr", LauncherConstant.nacosAddr(profile)); + + + // 指定注册IP + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.ip", "127.0.0.1"); + // 指定注册端口 + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.port", "8200"); + // 自定义命名空间 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.NACOS_NAMESPACE); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.NACOS_NAMESPACE); + // 自定义分组 + // PropsUtil.setProperty(props, "spring.cloud.nacos.config.group", NacosConstant.NACOS_CONFIG_GROUP); + // PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.group", NacosConstant.NACOS_CONFIG_GROUP); + } + + @Override + public int getOrder() { + return 20; + } +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/listener/mq/PackageFanoutListener.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/listener/mq/PackageFanoutListener.java new file mode 100644 index 000000000..984a8bc4d --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/listener/mq/PackageFanoutListener.java @@ -0,0 +1,153 @@ +package com.logpm.statistics.listener.mq; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.statistics.entity.StatisticsDistributionPackageEntity; +import com.logpm.statistics.entity.StatisticsOrderInfoEntity; +import com.logpm.statistics.entity.StatisticsWarehousePackageEntity; +import com.logpm.statistics.service.IStatisticsDistributionPackageService; +import com.logpm.statistics.service.IStatisticsOrderInfoService; +import com.logpm.statistics.service.IStatisticsWarehousePackageService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.WorkNodeEnums; +import org.springblade.common.constant.broadcast.FanoutConstants; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@Slf4j +@Component +@AllArgsConstructor +public class PackageFanoutListener { + + private final IStatisticsDistributionPackageService statisticsDistributionPackageService; + private final IStatisticsWarehousePackageService warehousePackageService; + private final IStatisticsOrderInfoService statisticsOrderInfoService; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FanoutConstants.trunkline.PACKAGNODE.QUEUE.PACKAGE_SIGN), + exchange = @Exchange(name = FanoutConstants.trunkline.PACKAGNODE.EXCHANGE, type = ExchangeTypes.FANOUT) + )) + @Transactional(rollbackFor = Exception.class) + public void packageSignFanout(String msg) { + JSONObject jsonObject = JSONUtil.parseObj(msg); + JSONObject trainNumberMap = jsonObject.getJSONObject("mainMap"); + Integer workNode = jsonObject.getInt("workNode"); + if (WorkNodeEnums.SIGN_DIRECT_SHIPPER.getCode().equals(workNode) + || WorkNodeEnums.SIGN_TRIPARTITE_TRANSFER_DEPART.getCode().equals(workNode) + || WorkNodeEnums.DISTRIBUTION_SIGN_FOR.getCode().equals(workNode)) { + + JSONArray orderPackageCodes = jsonObject.getJSONArray("orderPackageCodes"); + List orderPackageCodeList = orderPackageCodes.toList(String.class); + // 配送签收时将签收时间写入 + if (WorkNodeEnums.DISTRIBUTION_SIGN_FOR.getCode().equals(workNode)) { + List list = warehousePackageService.list(Wrappers.lambdaQuery().in(StatisticsWarehousePackageEntity::getOrderPackageCode, orderPackageCodeList)); + if (CollUtil.isNotEmpty(list)) { + for (StatisticsWarehousePackageEntity statisticsWarehousePackageEntity : list) { + statisticsWarehousePackageEntity.setSignTime(new Date()); + if (ObjectUtil.isNotEmpty(trainNumberMap)) { + if (trainNumberMap.containsKey(statisticsWarehousePackageEntity.getOrderPackageCode())) { + JSONObject entries = JSONUtil.parseObj(trainNumberMap.get(statisticsWarehousePackageEntity.getOrderPackageCode())); + if (ObjectUtil.isNotEmpty(entries) && entries.containsKey("warehouseEntryTimeEnd")) { + statisticsWarehousePackageEntity.setWarehouseEntryTimeEnd(DateUtil.parseDate(entries.getStr("warehouseEntryTimeEnd"))); + } + } + } + } + warehousePackageService.updateBatchById(list); + } + } + + + // 如果是签收 + List statisticsDistributionList = statisticsDistributionPackageService.findListByOrderPackageCodes(orderPackageCodeList); + // 修改statisticsDistributionList中所有元素的isSign为1 + Set orderInfoSet = new HashSet<>(); + statisticsDistributionList.forEach(statisticsDistributionPackageEntity -> { + if (ObjectUtil.isNotEmpty(trainNumberMap)) { + if (trainNumberMap.containsKey(statisticsDistributionPackageEntity.getOrderPackageCode())) { + JSONObject entries = JSONUtil.parseObj(trainNumberMap.get(statisticsDistributionPackageEntity.getOrderPackageCode())); + statisticsDistributionPackageEntity.setTrainNumber(entries.getStr("trainNumber")); + } + } + statisticsDistributionPackageEntity.setIsSign(1); + statisticsDistributionPackageEntity.setSignTime(new Date()); + String typeService = statisticsDistributionPackageEntity.getTypeService(); + if ("3".equals(typeService)) { + statisticsDistributionPackageEntity.setRealDeliveryFee(BigDecimal.ZERO); + statisticsDistributionPackageEntity.setRealDeliveryDistance(BigDecimal.ZERO); + statisticsDistributionPackageEntity.setRealDeliveryCrossingFee(BigDecimal.ZERO); + statisticsDistributionPackageEntity.setRealDeliveryLoadingFee(BigDecimal.ZERO); + statisticsDistributionPackageEntity.setRealDeliveryMoveFee(BigDecimal.ZERO); + statisticsDistributionPackageEntity.setRealDeliveryServiceFee(BigDecimal.ZERO); + statisticsDistributionPackageEntity.setRealDeliverySortingFee(BigDecimal.ZERO); + statisticsDistributionPackageEntity.setRealDeliveryUpfloorFee(BigDecimal.ZERO); + } + orderInfoSet.add(statisticsDistributionPackageEntity.getOrderInfoId()); + }); + statisticsDistributionPackageService.updateBatchById(statisticsDistributionList); + + List statisticsList = statisticsDistributionPackageService.findListByOrderInfoSet(orderInfoSet); + // 把statisticsList通过元素的orderInfoId进行map分组 + Map> groupedStatisticsList = statisticsList.stream() + .collect(Collectors.groupingBy(StatisticsDistributionPackageEntity::getOrderInfoId)); + + List orderInfoList = statisticsOrderInfoService.findListByOrderInfoIdsSet(orderInfoSet); + // 把orderInfoList转成以id为key的map + Map orderInfoMap = orderInfoList.stream() + .collect(Collectors.toMap(StatisticsOrderInfoEntity::getId, statisticsOrderInfoEntity -> statisticsOrderInfoEntity)); + + List updateOrderInfoList = new ArrayList<>(); + groupedStatisticsList.keySet().forEach(orderInfoId -> { + StatisticsOrderInfoEntity statisticsOrderInfoEntity = orderInfoMap.get(orderInfoId); + Integer signStatus = statisticsOrderInfoEntity.getSignStatus(); + List statisticsDistributionPackageEntities = groupedStatisticsList.get(orderInfoId); + int allSize = statisticsDistributionPackageEntities.size(); + + // 过滤出statisticsDistributionPackageEntities中isSign等于0的元素 + List unSignStatisticsDistributionPackageEntities = statisticsDistributionPackageEntities.stream() + .filter(statisticsDistributionPackageEntity -> !statisticsDistributionPackageEntity.getIsSign().equals(1)) + .collect(Collectors.toList()); + + int unSignSize = unSignStatisticsDistributionPackageEntities.size(); + + if (unSignSize == 0) { + if (signStatus != 2) { + statisticsOrderInfoEntity.setSignStatus(2); + } + } else { + if (unSignSize != allSize) { + if (signStatus != 1) { + statisticsOrderInfoEntity.setSignStatus(1); + } + } + } + updateOrderInfoList.add(statisticsOrderInfoEntity); + }); + + statisticsOrderInfoService.updateBatchById(updateOrderInfoList); + + } + } + + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/listener/mq/WaybillFanoutListener.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/listener/mq/WaybillFanoutListener.java new file mode 100644 index 000000000..722c85dd7 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/listener/mq/WaybillFanoutListener.java @@ -0,0 +1,381 @@ +package com.logpm.statistics.listener.mq; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.logpm.statistics.entity.StatisticsDistributionPackageEntity; +import com.logpm.statistics.entity.StatisticsOrderInfoEntity; +import com.logpm.statistics.entity.StatisticsTrunklinePackageEntity; +import com.logpm.statistics.entity.StatisticsWarehousePackageEntity; +import com.logpm.statistics.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.broadcast.FanoutConstants; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +@Slf4j +@Component +@AllArgsConstructor +public class WaybillFanoutListener { + + private final IStatisticsTrunklinePackageService statisticsTrunklinePackageService; + private final IStatisticsWarehousePackageService statisticsWarehousePackageService; + private final IStatisticsDistributionPackageService statisticsDistributionPackageService; + private final IStatisticsOrderInfoService statisticsOrderInfoService; + private final IStatisticsWaybillInfoService statisticsWaybillInfoService; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FanoutConstants.trunkline.OPENWAYBILL.QUEUE.STATISTICSDATA_CREATEPACKAGEINFO), + exchange = @Exchange(name = FanoutConstants.trunkline.OPENWAYBILL.EXCHANGE, type = ExchangeTypes.FANOUT) + )) + @Transactional(rollbackFor = Exception.class) + public void createPackageInfo(String msg) { + + JSONObject jsonObject = JSONUtil.parseObj(msg); + Long warehouseId = jsonObject.getLong("warehouseId"); + String warehouseName = jsonObject.getStr("warehouseName"); + Long waybillId = jsonObject.getLong("waybillId"); + String waybillNo = jsonObject.getStr("waybillNo"); + String typeService = jsonObject.getStr("typeService");//服务类型 + Integer waybillType = jsonObject.getInt("waybillType"); + Long brandId = jsonObject.getLong("brandId"); + Long consigneeId = jsonObject.getLong("consigneeId"); + + List statisticsTrunklinePackageEntities = new ArrayList<>(); + List statisticsWarehousePackageEntities = new ArrayList<>(); + List statisticsDistributionPackageEntities = new ArrayList<>(); + + JSONArray orderPackageCodes = jsonObject.getJSONArray("orderPackageCodes"); + for (int i = 0; i < orderPackageCodes.size(); i++) { + JSONObject json = orderPackageCodes.getJSONObject(i); + BigDecimal totalWeight = json.getBigDecimal("totalWeight"); + if(Objects.isNull(totalWeight)){ + totalWeight = BigDecimal.ZERO; + } + BigDecimal totalVolume = json.getBigDecimal("totalVolume"); + if(Objects.isNull(totalVolume)){ + totalVolume = BigDecimal.ZERO; + } + + //干线 + StatisticsTrunklinePackageEntity statisticsTrunklinePackageEntity = new StatisticsTrunklinePackageEntity(); + statisticsTrunklinePackageEntity.setWarehouseId(warehouseId); + statisticsTrunklinePackageEntity.setWarehouseName(warehouseName); + statisticsTrunklinePackageEntity.setTypeService(typeService); + statisticsTrunklinePackageEntity.setWaybillId(waybillId); + statisticsTrunklinePackageEntity.setWaybillNo(waybillNo); + if(waybillType.equals(1)){ + statisticsTrunklinePackageEntity.setGoodsType(1); + }else if (waybillType.equals(2)){ + statisticsTrunklinePackageEntity.setGoodsType(2); + }else{ + statisticsTrunklinePackageEntity.setGoodsType(3); + } + statisticsTrunklinePackageEntity.setOrderCode(json.getStr("orderCode")); + statisticsTrunklinePackageEntity.setOrderPackageCode(json.getStr("orderPackageCode")); + statisticsTrunklinePackageEntity.setProductName(json.getStr("productName")); + statisticsTrunklinePackageEntity.setProductId(json.getStr("productId")); + statisticsTrunklinePackageEntity.setTotalNum(json.getInt("totalNum")); + statisticsTrunklinePackageEntity.setTotalWeight(totalWeight); + statisticsTrunklinePackageEntity.setTotalVolume(totalVolume); + statisticsTrunklinePackageEntity.setOpenPrice(json.getBigDecimal("openPrice")); + statisticsTrunklinePackageEntity.setTotalPrice(json.getBigDecimal("openPrice")); + statisticsTrunklinePackageEntity.setPickupFee(json.getBigDecimal("pickupFee")); + statisticsTrunklinePackageEntity.setRealPickupFee(json.getBigDecimal("pickupFee")); + statisticsTrunklinePackageEntity.setFreightFee(json.getBigDecimal("freightFee")); + statisticsTrunklinePackageEntity.setRealFreightFee(json.getBigDecimal("freightFee")); + statisticsTrunklinePackageEntity.setInstallFee(json.getBigDecimal("installFee")); + statisticsTrunklinePackageEntity.setRealInstallFee(json.getBigDecimal("installFee")); + statisticsTrunklinePackageEntity.setQuotationFee(json.getBigDecimal("quotationFee")); + statisticsTrunklinePackageEntity.setRealQuotationFee(json.getBigDecimal("quotationFee")); + statisticsTrunklinePackageEntity.setClaimingValue(json.getBigDecimal("claimingValue")); + statisticsTrunklinePackageEntity.setRealClaimingValue(json.getBigDecimal("claimingValue")); + statisticsTrunklinePackageEntity.setOtherFee(json.getBigDecimal("otherFee")); + statisticsTrunklinePackageEntity.setRealOtherFee(json.getBigDecimal("otherFee")); + statisticsTrunklinePackageEntity.setReturnFee(json.getBigDecimal("returnFee")); + statisticsTrunklinePackageEntity.setRealReturnFee(json.getBigDecimal("returnFee")); + statisticsTrunklinePackageEntity.setThirdOprationFee(json.getBigDecimal("thirdOprationFee")); + statisticsTrunklinePackageEntity.setRealThirdOprationFee(json.getBigDecimal("thirdOprationFee")); + statisticsTrunklinePackageEntity.setXPay(json.getBigDecimal("xPay")); + statisticsTrunklinePackageEntity.setRealXPay(json.getBigDecimal("xPay")); + statisticsTrunklinePackageEntity.setDPay(json.getBigDecimal("dPay")); + statisticsTrunklinePackageEntity.setRealDPay(json.getBigDecimal("dPay")); + statisticsTrunklinePackageEntity.setHPay(json.getBigDecimal("hPay")); + statisticsTrunklinePackageEntity.setRealHPay(json.getBigDecimal("hPay")); + statisticsTrunklinePackageEntity.setYPay(json.getBigDecimal("yPay")); + statisticsTrunklinePackageEntity.setRealYPay(json.getBigDecimal("yPay")); + statisticsTrunklinePackageEntities.add(statisticsTrunklinePackageEntity); + + //仓库 + StatisticsWarehousePackageEntity statisticsWarehousePackageEntity = new StatisticsWarehousePackageEntity(); + statisticsWarehousePackageEntity.setWarehouseId(warehouseId); + statisticsWarehousePackageEntity.setWarehouseName(warehouseName); + statisticsWarehousePackageEntity.setTypeService(typeService); + statisticsWarehousePackageEntity.setWaybillId(waybillId); + statisticsWarehousePackageEntity.setWaybillNo(waybillNo); + if(waybillType.equals(1)){ + statisticsWarehousePackageEntity.setGoodsType(1); + }else if (waybillType.equals(2)){ + statisticsWarehousePackageEntity.setGoodsType(2); + }else{ + statisticsWarehousePackageEntity.setGoodsType(3); + } + statisticsWarehousePackageEntity.setOrderCode(json.getStr("orderCode")); + statisticsWarehousePackageEntity.setOrderPackageCode(json.getStr("orderPackageCode")); + statisticsWarehousePackageEntity.setProductName(json.getStr("productName")); + statisticsWarehousePackageEntity.setProductId(json.getStr("productId")); + statisticsWarehousePackageEntity.setTotalNum(json.getInt("totalNum")); + statisticsWarehousePackageEntity.setTotalWeight(totalWeight); + statisticsWarehousePackageEntity.setTotalVolume(totalVolume); + statisticsWarehousePackageEntity.setOpenPrice(json.getBigDecimal("warehouseServiceFee")); + statisticsWarehousePackageEntity.setTotalPrice(json.getBigDecimal("warehouseServiceFee")); + statisticsWarehousePackageEntity.setWarehouseServiceFee(json.getBigDecimal("warehouseServiceFee")); + statisticsWarehousePackageEntity.setRealWarehouseServiceFee(json.getBigDecimal("warehouseServiceFee")); + statisticsWarehousePackageEntity.setWarehouseFee(json.getBigDecimal("warehouseFee")); + statisticsWarehousePackageEntity.setRealWarehouseFee(json.getBigDecimal("warehouseFee")); + statisticsWarehousePackageEntity.setWarehouseManageFee(json.getBigDecimal("warehouseManageFee")); + statisticsWarehousePackageEntity.setRealWarehouseManageFee(json.getBigDecimal("warehouseManageFee")); + statisticsWarehousePackageEntity.setWarehouseSortingFee(json.getBigDecimal("warehouseSortingFee")); + statisticsWarehousePackageEntity.setRealWarehouseSortingFee(json.getBigDecimal("warehouseSortingFee")); + statisticsWarehousePackageEntity.setWarehouseOperatingFee(json.getBigDecimal("warehouseOperatingFee")); + statisticsWarehousePackageEntity.setRealWarehouseOperatingFee(json.getBigDecimal("warehouseOperatingFee")); + statisticsWarehousePackageEntities.add(statisticsWarehousePackageEntity); + + + //配送 + StatisticsDistributionPackageEntity statisticsDistributionPackageEntity = new StatisticsDistributionPackageEntity(); + statisticsDistributionPackageEntity.setWarehouseId(warehouseId); + statisticsDistributionPackageEntity.setWarehouseName(warehouseName); + statisticsDistributionPackageEntity.setTypeService(typeService); + statisticsDistributionPackageEntity.setWaybillId(waybillId); + statisticsDistributionPackageEntity.setWaybillNo(waybillNo); + if(waybillType.equals(1)){ + statisticsDistributionPackageEntity.setGoodsType(1); + }else if (waybillType.equals(2)){ + statisticsDistributionPackageEntity.setGoodsType(2); + }else{ + statisticsDistributionPackageEntity.setGoodsType(3); + } + statisticsDistributionPackageEntity.setOrderCode(json.getStr("orderCode")); + statisticsDistributionPackageEntity.setOrderPackageCode(json.getStr("orderPackageCode")); + statisticsDistributionPackageEntity.setProductName(json.getStr("productName")); + statisticsDistributionPackageEntity.setProductId(json.getStr("productId")); + statisticsDistributionPackageEntity.setTotalNum(json.getInt("totalNum")); + statisticsDistributionPackageEntity.setTotalWeight(totalWeight); + statisticsDistributionPackageEntity.setTotalVolume(totalVolume); + statisticsDistributionPackageEntity.setOpenPrice(json.getBigDecimal("deliveryServiceFee")); + statisticsDistributionPackageEntity.setTotalPrice(json.getBigDecimal("deliveryServiceFee")); + statisticsDistributionPackageEntity.setDeliveryServiceFee(json.getBigDecimal("deliveryServiceFee")); + statisticsDistributionPackageEntity.setRealDeliveryServiceFee(json.getBigDecimal("deliveryServiceFee")); + statisticsDistributionPackageEntity.setDeliveryFee(json.getBigDecimal("deliveryFee")); + statisticsDistributionPackageEntity.setRealDeliveryFee(json.getBigDecimal("deliveryFee")); + statisticsDistributionPackageEntity.setDeliveryLoadingFee(json.getBigDecimal("deliveryLoadingFee")); + statisticsDistributionPackageEntity.setRealDeliveryLoadingFee(json.getBigDecimal("deliveryLoadingFee")); + statisticsDistributionPackageEntity.setDeliverySortingFee(json.getBigDecimal("deliverySortingFee")); + statisticsDistributionPackageEntity.setRealDeliverySortingFee(json.getBigDecimal("deliverySortingFee")); + statisticsDistributionPackageEntity.setDeliveryUpfloorFee(json.getBigDecimal("deliveryUpfloorFee")); + statisticsDistributionPackageEntity.setRealDeliveryUpfloorFee(json.getBigDecimal("deliveryUpfloorFee")); + statisticsDistributionPackageEntity.setDeliveryMoveFee(json.getBigDecimal("deliveryMoveFee")); + statisticsDistributionPackageEntity.setRealDeliveryMoveFee(json.getBigDecimal("deliveryMoveFee")); + statisticsDistributionPackageEntity.setDeliveryDistance(json.getBigDecimal("deliveryDistance")); + statisticsDistributionPackageEntity.setRealDeliveryDistance(json.getBigDecimal("deliveryDistance")); + statisticsDistributionPackageEntity.setDeliveryCrossingFee(json.getBigDecimal("deliveryCrossingFee")); + statisticsDistributionPackageEntity.setRealDeliveryCrossingFee(json.getBigDecimal("deliveryCrossingFee")); + statisticsDistributionPackageEntities.add(statisticsDistributionPackageEntity); + + } + + +// //生成运单维度 +// if(!"2".equals(typeService)){ +// StatisticsWaybillInfoEntity statisticsWaybillInfoEntity = new StatisticsWaybillInfoEntity(); +// statisticsWaybillInfoEntity.setWaybillNo(waybillNo); +// statisticsWaybillInfoEntity.setWaybillId(waybillId); +// statisticsWaybillInfoEntity.setTypeService(typeService); +// statisticsWaybillInfoEntity.setConfirmStatisticsOrder(0); +// statisticsWaybillInfoService.save(statisticsWaybillInfoEntity); +// waybillInfoId = statisticsWaybillInfoEntity.getId(); +// } + + + //把statisticsPackageInfoEntities的orderCode作为key进行分组 + Map> trunklineMap = statisticsTrunklinePackageEntities.stream().collect(Collectors.groupingBy(StatisticsTrunklinePackageEntity::getOrderCode)); + Map> warehouseMap = statisticsWarehousePackageEntities.stream().collect(Collectors.groupingBy(StatisticsWarehousePackageEntity::getOrderCode)); + Map> distributionMap = statisticsDistributionPackageEntities.stream().collect(Collectors.groupingBy(StatisticsDistributionPackageEntity::getOrderCode)); + List orderInfoEntities = new ArrayList<>(); + trunklineMap.keySet().forEach(key -> { + + StatisticsOrderInfoEntity statisticsOrderInfoEntity = new StatisticsOrderInfoEntity(); + statisticsOrderInfoEntity.setBrandId(brandId); + statisticsOrderInfoEntity.setConsigneeId(consigneeId); + statisticsOrderInfoEntity.setWaybillId(waybillId); + statisticsOrderInfoEntity.setWaybillNo(waybillNo); + statisticsOrderInfoEntity.setOrderCode(key); + statisticsOrderInfoEntity.setTypeService(typeService); + statisticsOrderInfoEntity.setSignStatus(0); + statisticsOrderInfoEntity.setConfirmStatisticsOrder(0); + statisticsOrderInfoEntity.setChangesFee(BigDecimal.ZERO); + orderInfoEntities.add(statisticsOrderInfoEntity); + }); + + statisticsOrderInfoService.saveBatch(orderInfoEntities); + + List statisticsTrunklinePackageSaveList = new ArrayList<>(); + List statisticsWarehousePackageSaveList = new ArrayList<>(); + List statisticsDistributionPackageSaveList = new ArrayList<>(); + orderInfoEntities.forEach(statisticsOrderInfoEntity -> { + String orderCode = statisticsOrderInfoEntity.getOrderCode(); + Long orderInfoId = statisticsOrderInfoEntity.getId(); + List statisticsTrunklinePackageEntityList= trunklineMap.get(orderCode); + statisticsTrunklinePackageEntityList.forEach(statisticsTrunklinePackageEntity -> { + statisticsTrunklinePackageEntity.setOrderInfoId(orderInfoId); + }); + statisticsTrunklinePackageSaveList.addAll(statisticsTrunklinePackageEntityList); + List statisticsWarehousePackageEntityList= warehouseMap.get(orderCode); + statisticsWarehousePackageEntityList.forEach(statisticsWarehousePackageEntity -> { + statisticsWarehousePackageEntity.setOrderInfoId(orderInfoId); + }); + statisticsWarehousePackageSaveList.addAll(statisticsWarehousePackageEntityList); + List statisticsDistributionPackageEntityList= distributionMap.get(orderCode); + statisticsDistributionPackageEntityList.forEach(statisticsDistributionPackageEntity -> { + statisticsDistributionPackageEntity.setOrderInfoId(orderInfoId); + }); + statisticsDistributionPackageSaveList.addAll(statisticsDistributionPackageEntityList); + + }); + statisticsTrunklinePackageService.saveBatch(statisticsTrunklinePackageSaveList); + statisticsWarehousePackageService.saveBatch(statisticsWarehousePackageSaveList); + statisticsDistributionPackageService.saveBatch(statisticsDistributionPackageSaveList); + +// orderInfoEntities.forEach(statisticsOrderInfoEntity -> { +// String orderCode = statisticsOrderInfoEntity.getOrderCode(); +// Long orderInfoId = statisticsOrderInfoEntity.getId(); +// List statisticsWarehousePackageEntityList= warehouseMap.get(orderCode); +// statisticsWarehousePackageEntityList.forEach(statisticsWarehousePackageEntity -> { +// statisticsWarehousePackageEntity.setOrderInfoId(orderInfoId); +// }); +// statisticsWarehousePackageSaveList.addAll(statisticsWarehousePackageEntityList); +// }); +// +// statisticsWarehousePackageService.saveBatch(statisticsWarehousePackageSaveList); +// +// orderInfoEntities.forEach(statisticsOrderInfoEntity -> { +// String orderCode = statisticsOrderInfoEntity.getOrderCode(); +// Long orderInfoId = statisticsOrderInfoEntity.getId(); +// List statisticsDistributionPackageEntityList= distributionMap.get(orderCode); +// statisticsDistributionPackageEntityList.forEach(statisticsDistributionPackageEntity -> { +// statisticsDistributionPackageEntity.setOrderInfoId(orderInfoId); +// }); +// statisticsDistributionPackageSaveList.addAll(statisticsDistributionPackageEntityList); +// }); +// +// statisticsDistributionPackageService.saveBatch(statisticsDistributionPackageSaveList); + + + log.info("处理完成:{}", msg); + } + + + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FanoutConstants.trunkline.UPDATEWAYBILL.QUEUE.STATISTICSDATA_UPDATEPACKAGEINFO), + exchange = @Exchange(name = FanoutConstants.trunkline.UPDATEWAYBILL.EXCHANGE, type = ExchangeTypes.FANOUT) + )) + @Transactional(rollbackFor = Exception.class) + public void updateWaybillData(String msg) { + log.info("接收到消息:{}", msg); + + JSONObject jsonObject = JSONUtil.parseObj(msg); + Long warehouseId = jsonObject.getLong("warehouseId"); + String warehouseName = jsonObject.getStr("warehouseName"); + Long waybillId = jsonObject.getLong("waybillId"); + String waybillNo = jsonObject.getStr("waybillNo"); + String typeService = jsonObject.getStr("typeService");//服务类型 + + statisticsTrunklinePackageService.deleteListByWaybillId(waybillId); + + List orderInfoEntities = statisticsOrderInfoService.findListByWaybillId(waybillId); + //把orderInfoEntities以orderCode未key,元素本身为value转成Map + Map orderInfoMap = orderInfoEntities.stream() + .collect(Collectors.toMap( + StatisticsOrderInfoEntity::getOrderCode, + entity -> entity + )); + List statisticsTrunklinePackageEntities = new ArrayList<>(); + + JSONArray orderPackageCodes = jsonObject.getJSONArray("orderPackageCodes"); + for (int i = 0; i < orderPackageCodes.size(); i++) { + JSONObject json = orderPackageCodes.getJSONObject(i); + + //干线 + StatisticsTrunklinePackageEntity statisticsTrunklinePackageEntity = new StatisticsTrunklinePackageEntity(); + statisticsTrunklinePackageEntity.setWarehouseId(warehouseId); + statisticsTrunklinePackageEntity.setWarehouseName(warehouseName); + statisticsTrunklinePackageEntity.setTypeService(typeService); + statisticsTrunklinePackageEntity.setWaybillId(waybillId); + statisticsTrunklinePackageEntity.setWaybillNo(waybillNo); + Integer waybillType = json.getInt("waybillType"); + if(waybillType.equals(1)){ + statisticsTrunklinePackageEntity.setGoodsType(1); + }else if (waybillType.equals(2)){ + statisticsTrunklinePackageEntity.setGoodsType(2); + }else{ + statisticsTrunklinePackageEntity.setGoodsType(3); + } + String orderCode = json.getStr("orderCode"); + StatisticsOrderInfoEntity statisticsOrderInfoEntity = orderInfoMap.get(orderCode); + statisticsTrunklinePackageEntity.setOrderInfoId(statisticsOrderInfoEntity.getId()); + statisticsTrunklinePackageEntity.setOrderCode(orderCode); + statisticsTrunklinePackageEntity.setOrderPackageCode(json.getStr("orderPackageCode")); + statisticsTrunklinePackageEntity.setProductName(json.getStr("productName")); + statisticsTrunklinePackageEntity.setTotalNum(json.getInt("totalNum")); + statisticsTrunklinePackageEntity.setTotalWeight(json.getBigDecimal("totalWeight")); + statisticsTrunklinePackageEntity.setTotalVolume(json.getBigDecimal("totalVolume")); + statisticsTrunklinePackageEntity.setOpenPrice(json.getBigDecimal("openPrice")); + statisticsTrunklinePackageEntity.setTotalPrice(json.getBigDecimal("openPrice")); + statisticsTrunklinePackageEntity.setPickupFee(json.getBigDecimal("pickupFee")); + statisticsTrunklinePackageEntity.setRealPickupFee(json.getBigDecimal("pickupFee")); + statisticsTrunklinePackageEntity.setFreightFee(json.getBigDecimal("freightFee")); + statisticsTrunklinePackageEntity.setRealFreightFee(json.getBigDecimal("freightFee")); + statisticsTrunklinePackageEntity.setInstallFee(json.getBigDecimal("installFee")); + statisticsTrunklinePackageEntity.setRealInstallFee(json.getBigDecimal("installFee")); + statisticsTrunklinePackageEntity.setQuotationFee(json.getBigDecimal("quotationFee")); + statisticsTrunklinePackageEntity.setRealQuotationFee(json.getBigDecimal("quotationFee")); + statisticsTrunklinePackageEntity.setClaimingValue(json.getBigDecimal("claimingValue")); + statisticsTrunklinePackageEntity.setRealClaimingValue(json.getBigDecimal("claimingValue")); + statisticsTrunklinePackageEntity.setOtherFee(json.getBigDecimal("otherFee")); + statisticsTrunklinePackageEntity.setRealOtherFee(json.getBigDecimal("otherFee")); + statisticsTrunklinePackageEntity.setReturnFee(json.getBigDecimal("returnFee")); + statisticsTrunklinePackageEntity.setRealReturnFee(json.getBigDecimal("returnFee")); + statisticsTrunklinePackageEntity.setThirdOprationFee(json.getBigDecimal("thirdOprationFee")); + statisticsTrunklinePackageEntity.setRealThirdOprationFee(json.getBigDecimal("thirdOprationFee")); + statisticsTrunklinePackageEntity.setXPay(json.getBigDecimal("xPay")); + statisticsTrunklinePackageEntity.setRealXPay(json.getBigDecimal("xPay")); + statisticsTrunklinePackageEntity.setDPay(json.getBigDecimal("dPay")); + statisticsTrunklinePackageEntity.setRealDPay(json.getBigDecimal("dPay")); + statisticsTrunklinePackageEntity.setHPay(json.getBigDecimal("hPay")); + statisticsTrunklinePackageEntity.setRealHPay(json.getBigDecimal("hPay")); + statisticsTrunklinePackageEntity.setYPay(json.getBigDecimal("yPay")); + statisticsTrunklinePackageEntity.setRealYPay(json.getBigDecimal("yPay")); + statisticsTrunklinePackageEntities.add(statisticsTrunklinePackageEntity); + + } + statisticsTrunklinePackageService.saveBatch(statisticsTrunklinePackageEntities); + + } + + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceAbnormalMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceAbnormalMapper.java new file mode 100644 index 000000000..71d8d8512 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceAbnormalMapper.java @@ -0,0 +1,9 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.statistics.entity.StatisticsBalanceAbnormalEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StatisticsBalanceAbnormalMapper extends BaseMapper { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceAbnormalPhotoMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceAbnormalPhotoMapper.java new file mode 100644 index 000000000..f707d319c --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceAbnormalPhotoMapper.java @@ -0,0 +1,9 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.statistics.entity.StatisticsBalanceAbnormalPhotoEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StatisticsBalanceAbnormalPhotoMapper extends BaseMapper { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceOrderInfoMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceOrderInfoMapper.java new file mode 100644 index 000000000..98201ab55 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceOrderInfoMapper.java @@ -0,0 +1,15 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.statistics.dto.MerchantStatisticsDTO; +import com.logpm.statistics.entity.StatisticsBalanceOrderInfoEntity; +import com.logpm.statistics.vo.StatisticsBalanceOrderInfoVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface StatisticsBalanceOrderInfoMapper extends BaseMapper { + IPage pageList(IPage page, @Param("param") MerchantStatisticsDTO merchantStatisticsDTO); + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceOrderInfoMapper.xml b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceOrderInfoMapper.xml new file mode 100644 index 000000000..da77bee20 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceOrderInfoMapper.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceRecordMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceRecordMapper.java new file mode 100644 index 000000000..1e983a9ee --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceRecordMapper.java @@ -0,0 +1,9 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.statistics.entity.StatisticsBalanceRecordEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StatisticsBalanceRecordMapper extends BaseMapper { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceRecordPhotoMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceRecordPhotoMapper.java new file mode 100644 index 000000000..e27ed15df --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsBalanceRecordPhotoMapper.java @@ -0,0 +1,9 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.statistics.entity.StatisticsBalanceRecordPhotoEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StatisticsBalanceRecordPhotoMapper extends BaseMapper { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsChangesPhotoMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsChangesPhotoMapper.java new file mode 100644 index 000000000..918956a97 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsChangesPhotoMapper.java @@ -0,0 +1,9 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.statistics.entity.StatisticsChangesPhotoEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StatisticsChangesPhotoMapper extends BaseMapper { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsChangesRecordMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsChangesRecordMapper.java new file mode 100644 index 000000000..7ee92cc01 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsChangesRecordMapper.java @@ -0,0 +1,13 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.statistics.entity.StatisticsChangesRecordEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; + +@Mapper +public interface StatisticsChangesRecordMapper extends BaseMapper { + BigDecimal findChangesFeeByOrderInfoId(@Param("orderInfoId") Long orderInfoId); +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsChangesRecordMapper.xml b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsChangesRecordMapper.xml new file mode 100644 index 000000000..a013a59d4 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsChangesRecordMapper.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsDistributionPackageMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsDistributionPackageMapper.java new file mode 100644 index 000000000..d77df8e77 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsDistributionPackageMapper.java @@ -0,0 +1,9 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.statistics.entity.StatisticsDistributionPackageEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StatisticsDistributionPackageMapper extends BaseMapper { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsOrderInfoMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsOrderInfoMapper.java new file mode 100644 index 000000000..4cdc33d8c --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsOrderInfoMapper.java @@ -0,0 +1,21 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.statistics.dto.MerchantStatisticsDTO; +import com.logpm.statistics.entity.StatisticsOrderInfoEntity; +import com.logpm.statistics.vo.StatisticsOrderInfoVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface StatisticsOrderInfoMapper extends BaseMapper { + + IPage pageList(IPage page, @Param("param") MerchantStatisticsDTO merchantStatisticsDTO); + + List findStatementListByOrderInfoIds(@Param("orderInfoIds") List orderInfoIds); + + StatisticsOrderInfoVO findOrderDetail(@Param("orderInfoId") Long orderInfoId); +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsOrderInfoMapper.xml b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsOrderInfoMapper.xml new file mode 100644 index 000000000..e0663c77c --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsOrderInfoMapper.xml @@ -0,0 +1,236 @@ + + + + + + + + + diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsTrunklinePackageMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsTrunklinePackageMapper.java new file mode 100644 index 000000000..bcfb01986 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsTrunklinePackageMapper.java @@ -0,0 +1,11 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.statistics.entity.StatisticsTrunklinePackageEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface StatisticsTrunklinePackageMapper extends BaseMapper { + void deleteListByWaybillId(@Param("waybillId") Long waybillId); +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsTrunklinePackageMapper.xml b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsTrunklinePackageMapper.xml new file mode 100644 index 000000000..608fa792e --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsTrunklinePackageMapper.xml @@ -0,0 +1,10 @@ + + + + + + delete from logpm_statistics_trunkline_package + where waybill_id = #{waybillId} + + + diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsWarehousePackageMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsWarehousePackageMapper.java new file mode 100644 index 000000000..ea64a49fd --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsWarehousePackageMapper.java @@ -0,0 +1,9 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.statistics.entity.StatisticsWarehousePackageEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StatisticsWarehousePackageMapper extends BaseMapper { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsWaybillInfoMapper.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsWaybillInfoMapper.java new file mode 100644 index 000000000..370f40613 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsWaybillInfoMapper.java @@ -0,0 +1,16 @@ +package com.logpm.statistics.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.statistics.dto.MerchantStatisticsDTO; +import com.logpm.statistics.entity.StatisticsWaybillInfoEntity; +import com.logpm.statistics.vo.StatisticsWaybillInfoVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface StatisticsWaybillInfoMapper extends BaseMapper { + + + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsWaybillInfoMapper.xml b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsWaybillInfoMapper.xml new file mode 100644 index 000000000..ee42c63ba --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/mapper/StatisticsWaybillInfoMapper.xml @@ -0,0 +1,111 @@ + + + + + + + diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceAbnormalPhotoService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceAbnormalPhotoService.java new file mode 100644 index 000000000..92177f08f --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceAbnormalPhotoService.java @@ -0,0 +1,7 @@ +package com.logpm.statistics.service; + +import com.logpm.statistics.entity.StatisticsBalanceAbnormalPhotoEntity; +import org.springblade.core.mp.base.BaseService; + +public interface IStatisticsBalanceAbnormalPhotoService extends BaseService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceAbnormalService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceAbnormalService.java new file mode 100644 index 000000000..0792c98e8 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceAbnormalService.java @@ -0,0 +1,7 @@ +package com.logpm.statistics.service; + +import com.logpm.statistics.entity.StatisticsBalanceAbnormalEntity; +import org.springblade.core.mp.base.BaseService; + +public interface IStatisticsBalanceAbnormalService extends BaseService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceOrderInfoService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceOrderInfoService.java new file mode 100644 index 000000000..46d550728 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceOrderInfoService.java @@ -0,0 +1,25 @@ +package com.logpm.statistics.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.statistics.dto.MerchantStatisticsDTO; +import com.logpm.statistics.dto.StatisticsBalanceAbnormalDTO; +import com.logpm.statistics.dto.StatisticsBalanceRecordDTO; +import com.logpm.statistics.entity.StatisticsBalanceOrderInfoEntity; +import com.logpm.statistics.vo.StatisticsBalanceOrderInfoVO; +import org.springblade.core.mp.base.BaseService; +import org.springblade.core.tool.api.R; + +public interface IStatisticsBalanceOrderInfoService extends BaseService { + IPage pageList(MerchantStatisticsDTO merchantStatisticsDTO); + + R addAbnormal(StatisticsBalanceAbnormalDTO balanceAbnormalDTO); + + R findAbnormalList(StatisticsBalanceAbnormalDTO balanceAbnormalDTO); + + R addBalanceRecord(StatisticsBalanceRecordDTO balanceRecordDTO); + + R findRecordList(StatisticsBalanceRecordDTO balanceRecordDTO); + + R findBalanceDetail(Long balanceOrderId); + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceRecordPhotoService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceRecordPhotoService.java new file mode 100644 index 000000000..3663ff76e --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceRecordPhotoService.java @@ -0,0 +1,7 @@ +package com.logpm.statistics.service; + +import com.logpm.statistics.entity.StatisticsBalanceRecordPhotoEntity; +import org.springblade.core.mp.base.BaseService; + +public interface IStatisticsBalanceRecordPhotoService extends BaseService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceRecordService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceRecordService.java new file mode 100644 index 000000000..5d0bc6c79 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsBalanceRecordService.java @@ -0,0 +1,7 @@ +package com.logpm.statistics.service; + +import com.logpm.statistics.entity.StatisticsBalanceRecordEntity; +import org.springblade.core.mp.base.BaseService; + +public interface IStatisticsBalanceRecordService extends BaseService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsChangesPhotoService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsChangesPhotoService.java new file mode 100644 index 000000000..394ada824 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsChangesPhotoService.java @@ -0,0 +1,7 @@ +package com.logpm.statistics.service; + +import com.logpm.statistics.entity.StatisticsChangesPhotoEntity; +import org.springblade.core.mp.base.BaseService; + +public interface IStatisticsChangesPhotoService extends BaseService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsChangesRecordService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsChangesRecordService.java new file mode 100644 index 000000000..f06118813 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsChangesRecordService.java @@ -0,0 +1,10 @@ +package com.logpm.statistics.service; + +import com.logpm.statistics.entity.StatisticsChangesRecordEntity; +import org.springblade.core.mp.base.BaseService; + +import java.math.BigDecimal; + +public interface IStatisticsChangesRecordService extends BaseService { + BigDecimal findChangesFeeByOrderInfoId(Long orderInfoId); +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsDistributionPackageService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsDistributionPackageService.java new file mode 100644 index 000000000..bd1091536 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsDistributionPackageService.java @@ -0,0 +1,13 @@ +package com.logpm.statistics.service; + +import com.logpm.statistics.entity.StatisticsDistributionPackageEntity; +import org.springblade.core.mp.base.BaseService; + +import java.util.List; +import java.util.Set; + +public interface IStatisticsDistributionPackageService extends BaseService { + List findListByOrderPackageCodes(List orderPackageCodeList); + + List findListByOrderInfoSet(Set orderInfoSet); +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsOrderInfoService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsOrderInfoService.java new file mode 100644 index 000000000..17c142cf6 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsOrderInfoService.java @@ -0,0 +1,37 @@ +package com.logpm.statistics.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.statistics.dto.ChangesRecordDTO; +import com.logpm.statistics.dto.MerchantStatisticsDTO; +import com.logpm.statistics.entity.StatisticsOrderInfoEntity; +import com.logpm.statistics.vo.StatisticsChangesRecordVO; +import com.logpm.statistics.vo.StatisticsOrderInfoVO; +import org.springblade.core.mp.base.BaseService; +import org.springblade.core.tool.api.R; + +import java.util.List; +import java.util.Set; + +public interface IStatisticsOrderInfoService extends BaseService { + List findListByWaybillId(Long waybillId); + + List findListByOrderInfoIdsSet(Set orderInfoSet); + + IPage pageList(MerchantStatisticsDTO merchantStatisticsDTO); + + List findChangesRecordList(MerchantStatisticsDTO merchantStatisticsDTO); + + R addChangesRecord(ChangesRecordDTO changesRecordDTO); + + R checkBalance(MerchantStatisticsDTO merchantStatisticsDTO); + + StatisticsOrderInfoVO findOrderDetail(Long orderInfoId); + + /** + * 计算实际费用 + * @param id 订单id + * @Return boolean 计算是否成功 + * @Author zqb 2024/6/17 + **/ + boolean calculateRealCost(Long id); +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsTrunklinePackageService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsTrunklinePackageService.java new file mode 100644 index 000000000..48e4c63d1 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsTrunklinePackageService.java @@ -0,0 +1,8 @@ +package com.logpm.statistics.service; + +import com.logpm.statistics.entity.StatisticsTrunklinePackageEntity; +import org.springblade.core.mp.base.BaseService; + +public interface IStatisticsTrunklinePackageService extends BaseService { + void deleteListByWaybillId(Long waybillId); +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsWarehousePackageService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsWarehousePackageService.java new file mode 100644 index 000000000..548822224 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsWarehousePackageService.java @@ -0,0 +1,7 @@ +package com.logpm.statistics.service; + +import com.logpm.statistics.entity.StatisticsWarehousePackageEntity; +import org.springblade.core.mp.base.BaseService; + +public interface IStatisticsWarehousePackageService extends BaseService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsWaybillInfoService.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsWaybillInfoService.java new file mode 100644 index 000000000..4b7d1d3b4 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/IStatisticsWaybillInfoService.java @@ -0,0 +1,8 @@ +package com.logpm.statistics.service; + +import com.logpm.statistics.entity.StatisticsWaybillInfoEntity; +import org.springblade.core.mp.base.BaseService; + +public interface IStatisticsWaybillInfoService extends BaseService { + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceAbnormalPhotoServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceAbnormalPhotoServiceImpl.java new file mode 100644 index 000000000..cce913fbd --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceAbnormalPhotoServiceImpl.java @@ -0,0 +1,15 @@ +package com.logpm.statistics.service.impl; + +import com.logpm.statistics.entity.StatisticsBalanceAbnormalPhotoEntity; +import com.logpm.statistics.mapper.StatisticsBalanceAbnormalPhotoMapper; +import com.logpm.statistics.service.IStatisticsBalanceAbnormalPhotoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@AllArgsConstructor +public class StatisticsBalanceAbnormalPhotoServiceImpl extends BaseServiceImpl implements IStatisticsBalanceAbnormalPhotoService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceAbnormalServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceAbnormalServiceImpl.java new file mode 100644 index 000000000..870163e03 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceAbnormalServiceImpl.java @@ -0,0 +1,15 @@ +package com.logpm.statistics.service.impl; + +import com.logpm.statistics.entity.StatisticsBalanceAbnormalEntity; +import com.logpm.statistics.mapper.StatisticsBalanceAbnormalMapper; +import com.logpm.statistics.service.IStatisticsBalanceAbnormalService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@AllArgsConstructor +public class StatisticsBalanceAbnormalServiceImpl extends BaseServiceImpl implements IStatisticsBalanceAbnormalService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceOrderInfoServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceOrderInfoServiceImpl.java new file mode 100644 index 000000000..d742108ac --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceOrderInfoServiceImpl.java @@ -0,0 +1,241 @@ +package com.logpm.statistics.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.logpm.statistics.dto.MerchantStatisticsDTO; +import com.logpm.statistics.dto.StatisticsBalanceAbnormalDTO; +import com.logpm.statistics.dto.StatisticsBalanceRecordDTO; +import com.logpm.statistics.entity.*; +import com.logpm.statistics.mapper.StatisticsBalanceOrderInfoMapper; +import com.logpm.statistics.service.*; +import com.logpm.statistics.vo.StatisticsBalanceAbnormalVO; +import com.logpm.statistics.vo.StatisticsBalanceOrderInfoVO; +import com.logpm.statistics.vo.StatisticsBalanceRecordVO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.BeanUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +@Slf4j +@Service +@AllArgsConstructor +public class StatisticsBalanceOrderInfoServiceImpl extends BaseServiceImpl implements IStatisticsBalanceOrderInfoService { + + private final IStatisticsBalanceAbnormalService balanceAbnormalService; + private final IStatisticsBalanceAbnormalPhotoService balanceAbnormalPhotoService; + private final IStatisticsBalanceRecordService balanceRecordService; + private final IStatisticsBalanceRecordPhotoService balanceRecordPhotoService; + + @Override + public IPage pageList(MerchantStatisticsDTO merchantStatisticsDTO) { + + IPage page = new Page<>(); + page.setCurrent(merchantStatisticsDTO.getPageNum()); + page.setSize(merchantStatisticsDTO.getPageSize()); + + return baseMapper.pageList(page,merchantStatisticsDTO); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public R addAbnormal(StatisticsBalanceAbnormalDTO balanceAbnormalDTO) { + StatisticsBalanceAbnormalEntity balanceAbnormalEntity = new StatisticsBalanceAbnormalEntity(); + BeanUtil.copy(balanceAbnormalDTO,balanceAbnormalEntity); + balanceAbnormalEntity.setAbnormalUserName(AuthUtil.getNickName()); + + balanceAbnormalService.save(balanceAbnormalEntity); + + + List abnormalPhotoEntityList = balanceAbnormalDTO.getAbnormalPhotoEntityList(); + + abnormalPhotoEntityList.forEach(abnormalPhotoEntity -> { + abnormalPhotoEntity.setAbnormalId(balanceAbnormalEntity.getId()); + }); + + balanceAbnormalPhotoService.saveBatch(abnormalPhotoEntityList); + + Long balanceOrderInfoId = balanceAbnormalEntity.getBalanceOrderInfoId(); + + StatisticsBalanceOrderInfoEntity balanceOrderInfoEntity = baseMapper.selectById(balanceOrderInfoId); + if(Objects.isNull(balanceOrderInfoEntity)){ + log.warn("###########addAbnormal: 结算单信息不存在 balanceOrderInfoEntity={}",balanceOrderInfoEntity); + return R.fail(405,"结算单信息不存在"); + } + BigDecimal totalBalanceFee = balanceOrderInfoEntity.getTotalBalanceFee(); + BigDecimal hasBalanceFee = balanceOrderInfoEntity.getHasBalanceFee(); + BigDecimal abnormalFee = balanceAbnormalEntity.getAbnormalFee(); + + BigDecimal total = totalBalanceFee.add(abnormalFee); + + balanceOrderInfoEntity.setAbnormalBalanceStatus(1); + balanceOrderInfoEntity.setAbnormalBalanceFee(balanceOrderInfoEntity.getAbnormalBalanceFee().add(abnormalFee)); + balanceOrderInfoEntity.setAbnormalTime(balanceAbnormalEntity.getCreateTime()); + balanceOrderInfoEntity.setAbnormalUserName(balanceAbnormalEntity.getAbnormalUserName()); + balanceOrderInfoEntity.setAbnormalRemark(balanceAbnormalEntity.getAbnormalRemark()); + if(hasBalanceFee.compareTo(total) >= 0){ + balanceOrderInfoEntity.setBalanceStatus(2); + }else{ + if(hasBalanceFee.compareTo(BigDecimal.ZERO) == 0){ + balanceOrderInfoEntity.setBalanceStatus(0); + }else{ + balanceOrderInfoEntity.setBalanceStatus(1); + } + } + updateById(balanceOrderInfoEntity); + + return R.success("添加成功"); + } + + @Override + public R findAbnormalList(StatisticsBalanceAbnormalDTO balanceAbnormalDTO) { + Long balanceOrderInfoId = balanceAbnormalDTO.getBalanceOrderInfoId(); + + QueryWrapper balanceAbnormalEntityQueryWrapper = new QueryWrapper<>(); + balanceAbnormalEntityQueryWrapper.eq("balance_order_info_id",balanceOrderInfoId); + + List list = balanceAbnormalService.list(balanceAbnormalEntityQueryWrapper); + + if(list.isEmpty()){ + return R.data(CollUtil.newArrayList()); + } + + //把list中所有元素的id放到一个List集合中 + List idList= list.stream() + .map(StatisticsBalanceAbnormalEntity::getId) + .collect(Collectors.toList()); + + QueryWrapper balanceAbnormalPhotoEntityQueryWrapper = new QueryWrapper<>(); + balanceAbnormalPhotoEntityQueryWrapper.in("abnormal_id",idList); + + List abnormalPhotoEntityList = balanceAbnormalPhotoService.list(balanceAbnormalPhotoEntityQueryWrapper); + //把abnormalPhotoEntityList中所有元素按照abnormalId进行分组 + Map> groupedPhotos = abnormalPhotoEntityList.stream() + .collect(Collectors.groupingBy(StatisticsBalanceAbnormalPhotoEntity::getAbnormalId)); + + List abnormalVOList = new ArrayList<>(); + list.forEach(balanceAbnormalEntity -> { + StatisticsBalanceAbnormalVO balanceAbnormalVO = new StatisticsBalanceAbnormalVO(); + BeanUtil.copy(balanceAbnormalEntity,balanceAbnormalVO); + balanceAbnormalVO.setAbnormalPhotoEntityList(groupedPhotos.get(balanceAbnormalEntity.getId())); + abnormalVOList.add(balanceAbnormalVO); + }); + + return R.data(abnormalVOList); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public R addBalanceRecord(StatisticsBalanceRecordDTO balanceRecordDTO) { + StatisticsBalanceRecordEntity balanceRecordEntity = new StatisticsBalanceRecordEntity(); + BeanUtil.copy(balanceRecordDTO,balanceRecordEntity); + balanceRecordEntity.setBalanceUserName(AuthUtil.getNickName()); + + balanceRecordService.save(balanceRecordEntity); + + List recordPhotoEntityList = balanceRecordDTO.getRecordPhotoEntityList(); + + recordPhotoEntityList.forEach(recordPhotoEntity -> { + recordPhotoEntity.setRecordId(balanceRecordEntity.getId()); + }); + + balanceRecordPhotoService.saveBatch(recordPhotoEntityList); + + Long balanceOrderInfoId = balanceRecordDTO.getBalanceOrderInfoId(); + + StatisticsBalanceOrderInfoEntity balanceOrderInfoEntity = baseMapper.selectById(balanceOrderInfoId); + if(Objects.isNull(balanceOrderInfoEntity)){ + log.warn("###########addBalanceRecord: 结算单信息不存在 balanceOrderInfoEntity={}",balanceOrderInfoEntity); + return R.fail(405,"结算单信息不存在"); + } + + BigDecimal balanceFee = balanceRecordEntity.getBalanceFee(); + + BigDecimal totalBalanceFee = balanceOrderInfoEntity.getTotalBalanceFee(); + BigDecimal abnormalBalanceFee = balanceOrderInfoEntity.getAbnormalBalanceFee(); + + BigDecimal total = totalBalanceFee.add(abnormalBalanceFee); + BigDecimal hasBalanceFee = balanceOrderInfoEntity.getHasBalanceFee(); + + BigDecimal newHasBalanceFee = hasBalanceFee.add(balanceFee); + + if(newHasBalanceFee.compareTo(total) >= 0){ + balanceOrderInfoEntity.setBalanceStatus(2); + balanceOrderInfoEntity.setNoBalanceFee(BigDecimal.ZERO); + }else{ + balanceOrderInfoEntity.setBalanceStatus(1); + balanceOrderInfoEntity.setNoBalanceFee(total.subtract(newHasBalanceFee)); + } + + balanceOrderInfoEntity.setHasBalanceFee(newHasBalanceFee); + balanceOrderInfoEntity.setBalanceTime(balanceRecordEntity.getCreateTime()); + balanceOrderInfoEntity.setBalanceUserName(balanceRecordEntity.getBalanceUserName()); + balanceOrderInfoEntity.setBalanceRemark(balanceRecordEntity.getBalanceRemark()); + + updateById(balanceOrderInfoEntity); + + return R.success("添加成功"); + } + + @Override + public R findRecordList(StatisticsBalanceRecordDTO balanceRecordDTO) { + + Long balanceOrderInfoId = balanceRecordDTO.getBalanceOrderInfoId(); + + QueryWrapper balanceAbnormalEntityQueryWrapper = new QueryWrapper<>(); + balanceAbnormalEntityQueryWrapper.eq("balance_order_info_id",balanceOrderInfoId); + + List list = balanceRecordService.list(balanceAbnormalEntityQueryWrapper); + + if(list.isEmpty()){ + return R.data(CollUtil.newArrayList()); + } + + //把list中所有元素的id放到一个List集合中 + List idList= list.stream() + .map(StatisticsBalanceRecordEntity::getId) + .collect(Collectors.toList()); + + QueryWrapper balanceRecordPhotoEntityQueryWrapper = new QueryWrapper<>(); + balanceRecordPhotoEntityQueryWrapper.in("record_id",idList); + + List recordPhotoEntityList = balanceRecordPhotoService.list(balanceRecordPhotoEntityQueryWrapper); + //把abnormalPhotoEntityList中所有元素按照abnormalId进行分组 + Map> groupedPhotos = recordPhotoEntityList.stream() + .collect(Collectors.groupingBy(StatisticsBalanceRecordPhotoEntity::getRecordId)); + + List balanceRecordVOS = new ArrayList<>(); + list.forEach(balanceRecordEntity -> { + StatisticsBalanceRecordVO balanceRecordVO = new StatisticsBalanceRecordVO(); + BeanUtil.copy(balanceRecordEntity,balanceRecordVO); + balanceRecordVO.setRecordPhotoEntityList(groupedPhotos.get(balanceRecordEntity.getId())); + balanceRecordVO.setBalanceUserName(balanceRecordEntity.getBalanceUserName()); + balanceRecordVO.setBalanceRemark(balanceRecordEntity.getBalanceRemark()); + balanceRecordVOS.add(balanceRecordVO); + }); + + return R.data(balanceRecordVOS); + } + + @Override + public R findBalanceDetail(Long balanceOrderId) { + + StatisticsBalanceOrderInfoEntity statisticsBalanceOrderInfoEntity = baseMapper.selectById(balanceOrderId); + + return R.data(statisticsBalanceOrderInfoEntity); + } + + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceRecordPhotoServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceRecordPhotoServiceImpl.java new file mode 100644 index 000000000..269dfaf3e --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceRecordPhotoServiceImpl.java @@ -0,0 +1,15 @@ +package com.logpm.statistics.service.impl; + +import com.logpm.statistics.entity.StatisticsBalanceRecordPhotoEntity; +import com.logpm.statistics.mapper.StatisticsBalanceRecordPhotoMapper; +import com.logpm.statistics.service.IStatisticsBalanceRecordPhotoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@AllArgsConstructor +public class StatisticsBalanceRecordPhotoServiceImpl extends BaseServiceImpl implements IStatisticsBalanceRecordPhotoService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceRecordServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceRecordServiceImpl.java new file mode 100644 index 000000000..b1a5ebe38 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsBalanceRecordServiceImpl.java @@ -0,0 +1,15 @@ +package com.logpm.statistics.service.impl; + +import com.logpm.statistics.entity.StatisticsBalanceRecordEntity; +import com.logpm.statistics.mapper.StatisticsBalanceRecordMapper; +import com.logpm.statistics.service.IStatisticsBalanceRecordService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@AllArgsConstructor +public class StatisticsBalanceRecordServiceImpl extends BaseServiceImpl implements IStatisticsBalanceRecordService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsChangesPhotoServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsChangesPhotoServiceImpl.java new file mode 100644 index 000000000..7d0969347 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsChangesPhotoServiceImpl.java @@ -0,0 +1,15 @@ +package com.logpm.statistics.service.impl; + +import com.logpm.statistics.entity.StatisticsChangesPhotoEntity; +import com.logpm.statistics.mapper.StatisticsChangesPhotoMapper; +import com.logpm.statistics.service.IStatisticsChangesPhotoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@AllArgsConstructor +public class StatisticsChangesPhotoServiceImpl extends BaseServiceImpl implements IStatisticsChangesPhotoService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsChangesRecordServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsChangesRecordServiceImpl.java new file mode 100644 index 000000000..2ab88afea --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsChangesRecordServiceImpl.java @@ -0,0 +1,21 @@ +package com.logpm.statistics.service.impl; + +import com.logpm.statistics.entity.StatisticsChangesRecordEntity; +import com.logpm.statistics.mapper.StatisticsChangesRecordMapper; +import com.logpm.statistics.service.IStatisticsChangesRecordService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +@Slf4j +@Service +@AllArgsConstructor +public class StatisticsChangesRecordServiceImpl extends BaseServiceImpl implements IStatisticsChangesRecordService { + @Override + public BigDecimal findChangesFeeByOrderInfoId(Long orderInfoId) { + return baseMapper.findChangesFeeByOrderInfoId(orderInfoId); + } +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsDistributionPackageServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsDistributionPackageServiceImpl.java new file mode 100644 index 000000000..fad19ef2b --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsDistributionPackageServiceImpl.java @@ -0,0 +1,34 @@ +package com.logpm.statistics.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.statistics.entity.StatisticsDistributionPackageEntity; +import com.logpm.statistics.mapper.StatisticsDistributionPackageMapper; +import com.logpm.statistics.service.IStatisticsDistributionPackageService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; + +@Slf4j +@Service +@AllArgsConstructor +public class StatisticsDistributionPackageServiceImpl extends BaseServiceImpl implements IStatisticsDistributionPackageService { + @Override + public List findListByOrderPackageCodes(List orderPackageCodeList) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("order_package_code", orderPackageCodeList); + + return baseMapper.selectList(queryWrapper); + } + + @Override + public List findListByOrderInfoSet(Set orderInfoSet) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("order_info_id", orderInfoSet); + + return baseMapper.selectList(queryWrapper); + } +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsOrderInfoServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsOrderInfoServiceImpl.java new file mode 100644 index 000000000..33f05562f --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsOrderInfoServiceImpl.java @@ -0,0 +1,988 @@ +package com.logpm.statistics.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.logpm.basicdata.entity.BasicdataPriceTemplateEntity; +import com.logpm.basicdata.feign.IBasicdataCodeClient; +import com.logpm.basicdata.feign.IBasicdataPriceClient; +import com.logpm.basicdata.vo.BasicdatPriceApiVO; +import com.logpm.basicdata.vo.PriceClientVO; +import com.logpm.basicdata.vo.PriceDispatchBasicVO; +import com.logpm.basicdata.vo.PriceDispatchVO; +import com.logpm.basicdata.vo.PriceWarehouseAdditionalVO; +import com.logpm.basicdata.vo.PriceWarehouseBasicVO; +import com.logpm.basicdata.vo.PriceWarehouseVO; +import com.logpm.statistics.dto.ChangesRecordDTO; +import com.logpm.statistics.dto.MerchantStatisticsDTO; +import com.logpm.statistics.entity.StatisticsBalanceOrderInfoEntity; +import com.logpm.statistics.entity.StatisticsChangesPhotoEntity; +import com.logpm.statistics.entity.StatisticsChangesRecordEntity; +import com.logpm.statistics.entity.StatisticsDistributionPackageEntity; +import com.logpm.statistics.entity.StatisticsOrderInfoEntity; +import com.logpm.statistics.entity.StatisticsWarehousePackageEntity; +import com.logpm.statistics.mapper.StatisticsOrderInfoMapper; +import com.logpm.statistics.service.IStatisticsBalanceOrderInfoService; +import com.logpm.statistics.service.IStatisticsChangesPhotoService; +import com.logpm.statistics.service.IStatisticsChangesRecordService; +import com.logpm.statistics.service.IStatisticsDistributionPackageService; +import com.logpm.statistics.service.IStatisticsOrderInfoService; +import com.logpm.statistics.service.IStatisticsWarehousePackageService; +import com.logpm.statistics.vo.StatisticsChangesRecordVO; +import com.logpm.statistics.vo.StatisticsOrderInfoVO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.CodeNumConstant; +import org.springblade.common.constant.DictBizConstant; +import org.springblade.common.enums.BooleanZeroOneEnums; +import org.springblade.common.exception.CustomerException; +import org.springblade.common.utils.CommonUtil; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.system.cache.DictBizCache; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +@Slf4j +@Service +@AllArgsConstructor +public class StatisticsOrderInfoServiceImpl extends BaseServiceImpl implements IStatisticsOrderInfoService { + + private final IStatisticsChangesRecordService changesRecordService; + private final IStatisticsChangesPhotoService changesPhotoService; + private final IBasicdataCodeClient basicdataCodeClient; + private final IStatisticsBalanceOrderInfoService balanceOrderInfoService; + private final IBasicdataPriceClient priceClient; + private final IStatisticsDistributionPackageService distributionPackageService; + private final IStatisticsWarehousePackageService warehousePackageService; + + @Override + public List findListByWaybillId(Long waybillId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("waybill_id", waybillId); + return baseMapper.selectList(queryWrapper); + } + + @Override + public List findListByOrderInfoIdsSet(Set orderInfoSet) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("id", orderInfoSet); + return baseMapper.selectList(queryWrapper); + } + + + @Override + public IPage pageList(MerchantStatisticsDTO merchantStatisticsDTO) { + + IPage page = new Page<>(); + page.setCurrent(merchantStatisticsDTO.getPageNum()); + page.setSize(merchantStatisticsDTO.getPageSize()); + + return baseMapper.pageList(page, merchantStatisticsDTO); + } + + @Override + public List findChangesRecordList(MerchantStatisticsDTO merchantStatisticsDTO) { + Long orderInfoId = merchantStatisticsDTO.getOrderInfoId(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_info_id", orderInfoId); + + List list = changesRecordService.list(queryWrapper); + + if (list.isEmpty()) { + return CollUtil.newArrayList(); + } + + // 获取list中所有元素的id + List changesRecordIdList = list.stream().map(StatisticsChangesRecordEntity::getId).collect(Collectors.toList()); + + QueryWrapper changesPhotoEntityQueryWrapper = new QueryWrapper<>(); + changesPhotoEntityQueryWrapper.in("changes_record_id", changesRecordIdList); + + List changesPhotoEntityList = changesPhotoService.list(changesPhotoEntityQueryWrapper); + // 把changesPhotoEntityList中的元素通过changesRecordId为key进行分组 + Map> groupedEntities = + changesPhotoEntityList.stream() + .collect(Collectors.groupingBy(StatisticsChangesPhotoEntity::getChangesRecordId)); + + List ls = new ArrayList<>(); + list.forEach(statisticsChangesRecordEntity -> { + StatisticsChangesRecordVO statisticsChangesRecordVO = new StatisticsChangesRecordVO(); + BeanUtil.copy(statisticsChangesRecordEntity, statisticsChangesRecordVO); + List statisticsChangesPhotoEntities = groupedEntities.get(statisticsChangesRecordEntity.getId()); + statisticsChangesRecordVO.setChangesPhotoEntityList(statisticsChangesPhotoEntities); + ls.add(statisticsChangesRecordVO); + }); + return ls; + } + + @Override + public R addChangesRecord(ChangesRecordDTO changesRecordDTO) { + StatisticsChangesRecordEntity changesRecordEntity = new StatisticsChangesRecordEntity(); + BeanUtil.copy(changesRecordDTO, changesRecordEntity); + + String itemRecord = verifyValue(changesRecordEntity); + + changesRecordEntity.setItemRecord(itemRecord); + changesRecordEntity.setChangesTime(CommonUtil.StringToDate(changesRecordDTO.getChangesTimeStr())); + changesRecordEntity.setChangesUserName(AuthUtil.getNickName()); + changesRecordService.save(changesRecordEntity); + + List changesPhotoUrls = changesRecordDTO.getChangesPhotoUrls(); + List saveList = new ArrayList<>(); + changesPhotoUrls.forEach(url -> { + StatisticsChangesPhotoEntity changesPhotoEntity = new StatisticsChangesPhotoEntity(); + changesPhotoEntity.setUrl(url); + changesPhotoEntity.setChangesRecordId(changesRecordEntity.getId()); + changesPhotoEntity.setCreateUserName(AuthUtil.getNickName()); + saveList.add(changesPhotoEntity); + }); + changesPhotoService.saveBatch(saveList); + + // 把changesRecordEntity对象中的所有BigDecimal类型属性的值求和 + Long orderInfoId = changesRecordEntity.getOrderInfoId(); + + // 重新计算订单的异动金额 + updateOrderChangesFee(orderInfoId); + + return R.success("新增成功"); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public R checkBalance(MerchantStatisticsDTO merchantStatisticsDTO) { + List orderInfoIds = merchantStatisticsDTO.getOrderInfoIds(); + + // 查询对应订单的数据 + List list = baseMapper.findStatementListByOrderInfoIds(orderInfoIds); + + Set brands = new HashSet<>(); + Set waybillNos = new HashSet<>(); + Set orderCodes = new HashSet<>(); + Set typeServices = new HashSet<>(); + Set productGoods = new HashSet<>(); + Set shippers = new HashSet<>(); + Set shipperPersons = new HashSet<>(); + Set shipperMobiles = new HashSet<>(); + Set shipperAddresses = new HashSet<>(); + Set consignees = new HashSet<>(); + Set consigneePersons = new HashSet<>(); + Set consigneeMobiles = new HashSet<>(); + Set consigneeAddresses = new HashSet<>(); + Set departures = new HashSet<>(); + Set destinations = new HashSet<>(); + Set departureWarehouseNames = new HashSet<>(); + Set destinationWarehouseNames = new HashSet<>(); + Set payTypes = new HashSet<>(); + Set payWays = new HashSet<>(); + AtomicReference totalCount = new AtomicReference<>(0);// 总数量 + + List totalWeights = new ArrayList<>();// 总重量 + List totalVolumes = new ArrayList();// 总体积 + List totalFees = new ArrayList(); + List openFees = new ArrayList(); + List pickupFees = new ArrayList();// 提货费 + List freightFees = new ArrayList();// 运费 + List warehouseServiceFees = new ArrayList();// 仓库服务费 + List warehouseFees = new ArrayList();// 仓储费 + List warehouseManageFees = new ArrayList();// 仓储管理费 + List warehouseSortingFees = new ArrayList();// 仓储分拣费 + List warehouseOperatingFees = new ArrayList();// 仓储操作费 + + List deliveryServiceFees = new ArrayList();// 配送服务费 + List deliveryFees = new ArrayList();// 配送费 + List deliveryLoadingFees = new ArrayList();// 配送装卸费 + List deliverySortingFees = new ArrayList();// 配送分拣费 + List deliveryUpfloorFees = new ArrayList();// 配送上楼费 + List deliveryMoveFees = new ArrayList();// 配送平移费 + List deliveryCrossingFees = new ArrayList();// 超区费 + + List installFees = new ArrayList();// 安装费 + List quotationFees = new ArrayList();// 保价费 + List claimingValues = new ArrayList();// 申明价值 + List otherFees = new ArrayList();// 其他费 + List returnFees = new ArrayList();// 回扣 + List thirdOprationFees = new ArrayList();// 三方操作费 + List xPays = new ArrayList();// 现付 + List dPays = new ArrayList();// 到付 + List hPays = new ArrayList();// 回付 + List yPays = new ArrayList();// 月结 + + + list.forEach(statisticsOrderInfoVO -> { + Long orderInfoId = statisticsOrderInfoVO.getOrderInfoId(); + Integer confirmStatisticsOrder = statisticsOrderInfoVO.getConfirmStatisticsOrder(); + if (confirmStatisticsOrder.equals(1)) { + log.warn("############checkBalance: 订单id={} 已经确认对账", orderInfoId); + throw new CustomerException(405, "存在已经确认对账的订单"); + } + + brands.add(statisticsOrderInfoVO.getBrand()); + waybillNos.add(statisticsOrderInfoVO.getWaybillNo()); + orderCodes.add(statisticsOrderInfoVO.getOrderNo()); + typeServices.add(DictBizCache.getValue(DictBizConstant.BASIC_FREIGHT_TYPE, statisticsOrderInfoVO.getTypeService())); + String goodsName = statisticsOrderInfoVO.getGoodsName(); + if (goodsName.contains(",")) { + String[] split = goodsName.split(","); + for (int i = 0; i < split.length; i++) { + productGoods.add(split[i]); + } + } else { + productGoods.add(goodsName); + } + shippers.add(statisticsOrderInfoVO.getShipper()); + shipperPersons.add(statisticsOrderInfoVO.getShipperPerson()); + shipperMobiles.add(statisticsOrderInfoVO.getShipperMobile()); + shipperAddresses.add(statisticsOrderInfoVO.getShipperAddress()); + consignees.add(statisticsOrderInfoVO.getConsignee()); + consigneePersons.add(statisticsOrderInfoVO.getConsigneePerson()); + consigneeMobiles.add(statisticsOrderInfoVO.getConsigneeMobile()); + consigneeAddresses.add(statisticsOrderInfoVO.getConsigneeAddress()); + departures.add(statisticsOrderInfoVO.getDeparture()); + destinations.add(statisticsOrderInfoVO.getDestination()); + departureWarehouseNames.add(statisticsOrderInfoVO.getDepartureWarehouseName()); + destinationWarehouseNames.add(statisticsOrderInfoVO.getDestinationWarehouseName()); + payTypes.add(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_PAY_TYPE, statisticsOrderInfoVO.getPayType())); + payWays.add(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_PAY_WAY, statisticsOrderInfoVO.getPayWay())); + + totalCount.set(totalCount.get() + statisticsOrderInfoVO.getTotalcount()); + + totalWeights.add(statisticsOrderInfoVO.getTotalWeight()); + totalVolumes.add(statisticsOrderInfoVO.getTotalVolume()); + totalFees.add(statisticsOrderInfoVO.getTotalFee()); + openFees.add(statisticsOrderInfoVO.getOpenFee()); + pickupFees.add(statisticsOrderInfoVO.getPickupFee()); + freightFees.add(statisticsOrderInfoVO.getFreightFee()); + warehouseServiceFees.add(statisticsOrderInfoVO.getWarehouseServiceFee()); + warehouseFees.add(statisticsOrderInfoVO.getWarehouseFee()); + warehouseManageFees.add(statisticsOrderInfoVO.getWarehouseManageFee()); + warehouseSortingFees.add(statisticsOrderInfoVO.getWarehouseSortingFee()); + warehouseOperatingFees.add(statisticsOrderInfoVO.getWarehouseOperatingFee()); + deliveryServiceFees.add(statisticsOrderInfoVO.getDeliveryServiceFee()); + deliveryFees.add(statisticsOrderInfoVO.getDeliveryFee()); + deliveryLoadingFees.add(statisticsOrderInfoVO.getDeliveryLoadingFee()); + deliverySortingFees.add(statisticsOrderInfoVO.getDeliverySortingFee()); + deliveryUpfloorFees.add(statisticsOrderInfoVO.getDeliveryUpfloorFee()); + deliveryMoveFees.add(statisticsOrderInfoVO.getDeliveryMoveFee()); + deliveryCrossingFees.add(statisticsOrderInfoVO.getDeliveryCrossingFee()); + installFees.add(statisticsOrderInfoVO.getInstallFee()); + quotationFees.add(statisticsOrderInfoVO.getQuotationFee()); + claimingValues.add(statisticsOrderInfoVO.getClaimingValue()); + otherFees.add(statisticsOrderInfoVO.getOtherFee()); + returnFees.add(statisticsOrderInfoVO.getReturnFee()); + thirdOprationFees.add(statisticsOrderInfoVO.getThirdOprationFee()); + xPays.add(statisticsOrderInfoVO.getXPay()); + dPays.add(statisticsOrderInfoVO.getDPay()); + hPays.add(statisticsOrderInfoVO.getHPay()); + yPays.add(statisticsOrderInfoVO.getYPay()); + + }); + + // 对totalWeights进行求和 + BigDecimal totalWeight = totalWeights.stream().reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalVolume = totalVolumes.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 总体积 + BigDecimal totalBalanceFee = totalFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 结算总金额 TODO 这里还需要加上售后的单子金额 + BigDecimal totalFee = totalFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal openFee = openFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal pickupFee = pickupFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 提货费 + BigDecimal freightFee = freightFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 运费 + BigDecimal warehouseServiceFee = warehouseServiceFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 仓库服务费 + BigDecimal warehouseFee = warehouseFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 仓储费 + BigDecimal warehouseManageFee = warehouseManageFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 仓储管理费 + BigDecimal warehouseSortingFee = warehouseSortingFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 仓储分拣费 + BigDecimal warehouseOperatingFee = warehouseOperatingFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 仓储操作费 + + BigDecimal deliveryServiceFee = deliveryServiceFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 配送服务费 + BigDecimal deliveryFee = deliveryFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 配送费 + BigDecimal deliveryLoadingFee = deliveryLoadingFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 配送装卸费 + BigDecimal deliverySortingFee = deliverySortingFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 配送分拣费 + BigDecimal deliveryUpfloorFee = deliveryUpfloorFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 配送上楼费 + BigDecimal deliveryMoveFee = deliveryMoveFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 配送平移费 + BigDecimal deliveryCrossingFee = deliveryCrossingFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 超区费 + + BigDecimal installFee = installFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 安装费 + BigDecimal quotationFee = quotationFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 保价费 + BigDecimal claimingValue = claimingValues.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 申明价值 + BigDecimal otherFee = otherFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 其他费 + BigDecimal returnFee = returnFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 回扣 + BigDecimal thirdOprationFee = thirdOprationFees.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 三方操作费 + BigDecimal xPay = xPays.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 现付 + BigDecimal dPay = dPays.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 到付 + BigDecimal hPay = hPays.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 回付 + BigDecimal yPay = yPays.stream().reduce(BigDecimal.ZERO, BigDecimal::add);// 月结 + + StatisticsBalanceOrderInfoEntity statisticsBalanceOrderInfoEntity = new StatisticsBalanceOrderInfoEntity(); + + String balanceOrder = basicdataCodeClient.getCodeByType(CodeNumConstant.BALANCE_ORDER, "BALANCE_ORDER", ""); + + statisticsBalanceOrderInfoEntity.setBalanceOrderNo(balanceOrder); + statisticsBalanceOrderInfoEntity.setBrand(String.join(",", brands)); + statisticsBalanceOrderInfoEntity.setWaybillNo(String.join(",", waybillNos)); + statisticsBalanceOrderInfoEntity.setOrderCode(String.join(",", orderCodes)); + statisticsBalanceOrderInfoEntity.setTypeService(String.join(",", typeServices)); + statisticsBalanceOrderInfoEntity.setProductGoods(String.join(",", productGoods)); + statisticsBalanceOrderInfoEntity.setTotalCount(totalCount.get()); + statisticsBalanceOrderInfoEntity.setTotalWeight(totalWeight); + statisticsBalanceOrderInfoEntity.setTotalVolume(totalVolume); + statisticsBalanceOrderInfoEntity.setShipper(String.join(",", shippers)); + statisticsBalanceOrderInfoEntity.setShipperPerson(String.join(",", shipperPersons)); + statisticsBalanceOrderInfoEntity.setShipperMobile(String.join(",", shipperMobiles)); + statisticsBalanceOrderInfoEntity.setShipperAddress(String.join(",", shipperAddresses)); + statisticsBalanceOrderInfoEntity.setConsignee(String.join(",", consignees)); + statisticsBalanceOrderInfoEntity.setConsigneePerson(String.join(",", consigneePersons)); + statisticsBalanceOrderInfoEntity.setConsigneeMobile(String.join(",", consigneeMobiles)); + statisticsBalanceOrderInfoEntity.setConsigneeAddress(String.join(",", consigneeAddresses)); + statisticsBalanceOrderInfoEntity.setDeparture(String.join(",", departures)); + statisticsBalanceOrderInfoEntity.setDestination(String.join(",", destinations)); + statisticsBalanceOrderInfoEntity.setDepartureWarehouseName(String.join(",", departureWarehouseNames)); + statisticsBalanceOrderInfoEntity.setDestinationWarehouseName(String.join(",", destinationWarehouseNames)); + statisticsBalanceOrderInfoEntity.setPayType(String.join(",", payTypes)); + statisticsBalanceOrderInfoEntity.setPayWay(String.join(",", payWays)); + + statisticsBalanceOrderInfoEntity.setIsAftersale(0); + statisticsBalanceOrderInfoEntity.setAftersalesFee(BigDecimal.ZERO); + statisticsBalanceOrderInfoEntity.setTotalBalanceFee(totalBalanceFee); + statisticsBalanceOrderInfoEntity.setTotalFee(totalFee); + statisticsBalanceOrderInfoEntity.setOpenFee(openFee); + statisticsBalanceOrderInfoEntity.setPickupFee(pickupFee); + statisticsBalanceOrderInfoEntity.setFreightFee(freightFee); + statisticsBalanceOrderInfoEntity.setWarehouseServiceFee(warehouseServiceFee); + statisticsBalanceOrderInfoEntity.setWarehouseFee(warehouseFee); + statisticsBalanceOrderInfoEntity.setWarehouseManageFee(warehouseManageFee); + statisticsBalanceOrderInfoEntity.setWarehouseSortingFee(warehouseSortingFee); + statisticsBalanceOrderInfoEntity.setWarehouseOperatingFee(warehouseOperatingFee); + statisticsBalanceOrderInfoEntity.setDeliveryServiceFee(deliveryServiceFee); + statisticsBalanceOrderInfoEntity.setDeliveryFee(deliveryFee); + statisticsBalanceOrderInfoEntity.setDeliveryLoadingFee(deliveryLoadingFee); + statisticsBalanceOrderInfoEntity.setDeliverySortingFee(deliverySortingFee); + statisticsBalanceOrderInfoEntity.setDeliveryUpfloorFee(deliveryUpfloorFee); + statisticsBalanceOrderInfoEntity.setDeliveryMoveFee(deliveryMoveFee); + statisticsBalanceOrderInfoEntity.setDeliveryCrossingFee(deliveryCrossingFee); + statisticsBalanceOrderInfoEntity.setInstallFee(installFee); + statisticsBalanceOrderInfoEntity.setQuotationFee(quotationFee); + statisticsBalanceOrderInfoEntity.setClaimingValue(claimingValue); + statisticsBalanceOrderInfoEntity.setOtherFee(otherFee); + statisticsBalanceOrderInfoEntity.setReturnFee(returnFee); + statisticsBalanceOrderInfoEntity.setThirdOprationFee(thirdOprationFee); + statisticsBalanceOrderInfoEntity.setXPay(xPay); + statisticsBalanceOrderInfoEntity.setDPay(dPay); + statisticsBalanceOrderInfoEntity.setHPay(hPay); + statisticsBalanceOrderInfoEntity.setYPay(yPay); + + statisticsBalanceOrderInfoEntity.setBalanceStatus(0); + statisticsBalanceOrderInfoEntity.setHasBalanceFee(BigDecimal.ZERO); + statisticsBalanceOrderInfoEntity.setNoBalanceFee(BigDecimal.ZERO); + statisticsBalanceOrderInfoEntity.setAbnormalBalanceStatus(0); + statisticsBalanceOrderInfoEntity.setAbnormalBalanceFee(BigDecimal.ZERO); + + balanceOrderInfoService.save(statisticsBalanceOrderInfoEntity); + + // 订单的结算单号生成 + List statisticsOrderInfoEntities = baseMapper.selectList(new QueryWrapper().lambda().in(StatisticsOrderInfoEntity::getId, orderInfoIds)); + statisticsOrderInfoEntities.forEach(statisticsOrderInfoEntity -> { + statisticsOrderInfoEntity.setBalanceOrderNo(statisticsBalanceOrderInfoEntity.getBalanceOrderNo()); + statisticsOrderInfoEntity.setBalanceOrderId(statisticsBalanceOrderInfoEntity.getId()); + statisticsOrderInfoEntity.setConfirmStatisticsTime(new Date()); + statisticsOrderInfoEntity.setConfirmStatisticsOrder(1); + statisticsOrderInfoEntity.setConfirmStatisticsUserName(AuthUtil.getNickName()); + }); + + updateBatchById(statisticsOrderInfoEntities); + + return R.success("确认成功"); + } + + @Override + public StatisticsOrderInfoVO findOrderDetail(Long orderInfoId) { + List orderInfoIds = new ArrayList<>(); + orderInfoIds.add(orderInfoId); + List statementListByOrderInfoIds = baseMapper.findStatementListByOrderInfoIds(orderInfoIds); + return statementListByOrderInfoIds.get(0); + } + + @Override + public boolean calculateRealCost(Long id) { + StatisticsOrderInfoEntity orderInfoEntity = this.getOne(new QueryWrapper().lambda().eq(StatisticsOrderInfoEntity::getId, id)); + if (ObjectUtil.isEmpty(orderInfoEntity)) { + log.warn("#############calculateRealCost: 订单信息不存在"); + throw new CustomerException(405, "订单信息不存在"); + } + Long brandId = orderInfoEntity.getBrandId(); + Long consigneeId = orderInfoEntity.getConsigneeId(); + if (!ObjectUtil.isAllNotEmpty(brandId, consigneeId)) { + log.warn("#############calculateRealCost: 品牌{} 收货单位{}", brandId, consigneeId); + throw new CustomerException(405, "结算单信息不完整,缺少品牌和收货单位,请联系系统管理员。"); + } + Date createTime = orderInfoEntity.getCreateTime(); + // 根据 品牌 收货单位 开单时间 获取价格体系 + PriceClientVO price = priceClient.price(BasicdatPriceApiVO.builder() + .clientId(consigneeId.toString()) + .brandId(brandId.toString()) + .time(DateUtil.formatTime(createTime)) + .build()); + if (ObjectUtil.isEmpty(price)) { + log.warn("#############calculateRealCost: 未维护价格,无法计算。"); + throw new CustomerException(405, "未维护价格,无法计算。"); + } + // 查询包件数据 + List distributionPackageEntities = distributionPackageService.list(new QueryWrapper().lambda().eq(StatisticsDistributionPackageEntity::getOrderInfoId, id)); + // 校验是否全部配送完成 + if (distributionPackageEntities.stream().anyMatch(distributionPackageEntity -> distributionPackageEntity.getIsSign() == 0)) { + log.warn("#############calculateRealCost: 订单未全部配送完成,无法计算。"); + throw new CustomerException(405, "订单未全部配送完成,无法计算。"); + } + List warehousePackageEntities = warehousePackageService.list(new QueryWrapper().lambda().eq(StatisticsWarehousePackageEntity::getOrderInfoId, id)); + PriceDispatchVO dispatch = price.getDispatch(); + PriceWarehouseVO warehouse = price.getWarehouse(); + + BasicdataPriceTemplateEntity template = price.getTemplate(); + if (ObjectUtil.isEmpty(template)) { + log.warn("#############calculateRealCost: 未维护模版,无法计算。"); + throw new CustomerException(405, "未维护模版,无法计算。"); + } + String serviceType = template.getServiceType(); + Integer dispatchIsMinCost = template.getDispatchIsMinCost(); + + // 模版的服务类型 + String typeService = orderInfoEntity.getTypeService(); + if (StrUtil.isNotEmpty(serviceType)) { + // 模版是否有仓储 + if (StrUtil.contains(serviceType, "3")) { + if (CollUtil.isNotEmpty(warehousePackageEntities)) { + calculateWarehouseCost(warehouse, warehousePackageEntities, template); + } + } + // 模版是否有配送 + if (StrUtil.contains(serviceType, "4")) { + if (CollUtil.isNotEmpty(distributionPackageEntities)) { + calculateDispatchCost(template, typeService, distributionPackageEntities, dispatch, dispatchIsMinCost); + } + } + } + return Boolean.TRUE; + } + + private void calculateWarehouseCost(PriceWarehouseVO warehouse, List warehousePackageEntities, BasicdataPriceTemplateEntity template) { + if (ObjectUtil.isNotEmpty(warehouse)) { + // 取出 warehousePackageEntities 中的最小的入库时间 warehouseEntryTimeEnd 和最大的签收时间 signTime。两个时间相差的天数为在库周期 + // 过滤掉无用无用数据 + warehousePackageEntities.removeIf(entity -> entity.getWarehouseEntryTimeEnd() == null || entity.getSignTime() == null); + Long diff = null; + if (CollUtil.isNotEmpty(warehousePackageEntities)) { + // 找到最早的入库结束时间和最晚的签收时间 + StatisticsWarehousePackageEntity earliestEntity = Collections.min(warehousePackageEntities, Comparator.comparing(StatisticsWarehousePackageEntity::getWarehouseEntryTimeEnd)); + StatisticsWarehousePackageEntity latestEntity = Collections.max(warehousePackageEntities, Comparator.comparing(StatisticsWarehousePackageEntity::getSignTime)); + Date warehouseEntryTimeEnd = earliestEntity.getWarehouseEntryTimeEnd(); + Date signTime = latestEntity.getSignTime(); + // 计算在库周期(相差天数) + long diffInMillies = Math.abs(signTime.getTime() - warehouseEntryTimeEnd.getTime()); + diff = (diffInMillies + TimeUnit.DAYS.toMillis(1) - 1) / TimeUnit.DAYS.toMillis(1); + } + if (diff != null && diff > 0) { + for (StatisticsWarehousePackageEntity warehousePackageEntity : warehousePackageEntities) { + buildBasicWarehouseCost(warehousePackageEntity, warehouse, template, diff); + } + if (CollUtil.isNotEmpty(warehousePackageEntities)) { + // 计算配送服务费 realDeliveryServiceFee = 所有real费用的和 + warehousePackageEntities.stream().forEach(entity -> { + entity.setRealWarehouseServiceFee(entity.getRealWarehouseFee() + .add(entity.getRealWarehouseManageFee()) + .add(entity.getRealWarehouseSortingFee()) + .add(entity.getRealWarehouseOperatingFee()) + ); + }); + warehousePackageService.updateBatchById(warehousePackageEntities); + } + } + } + } + + private void calculateDispatchCost(BasicdataPriceTemplateEntity template, String typeService, List distributionPackageEntities, PriceDispatchVO dispatch, Integer dispatchIsMinCost) { + String dispatchPricingType = template.getDispatchPricingType(); + // 服务类型与模版的服务类型一致 + if (StrUtil.equals(dispatchPricingType, typeService)) { + // 计算基础配送费 + Integer dispatchIsByCategory = template.getDispatchIsByCategory(); + if (ObjectUtil.isNotEmpty(dispatch)) { + for (StatisticsDistributionPackageEntity statisticsDistributionPackageEntity : distributionPackageEntities) { + buildBasicDispatchCost(statisticsDistributionPackageEntity, dispatch, dispatchIsByCategory); + } + } + // 保底价 + // 1 是否有最低价 2 最低价的计费类型是按订单还是按配送任务 3 按价格还是件方重量 + if (ObjectUtil.equals(BooleanZeroOneEnums.YES.getCode(), dispatchIsMinCost)) { + // 1 订单 2 配送任务 + Integer dispatchMinCostMode = template.getDispatchMinCostMode(); + // 1 价格 2 件 3 方 4 重量 + Integer dispatchMinCostType = template.getDispatchMinCostType(); + // 最低价 + Double minCost = dispatch.getMinCost(); + // 加算价格 + Double additionalCost = dispatch.getAdditionalCost(); + if (ObjectUtil.equals(1, dispatchMinCostMode)) { + buildDispatchCostToPackage(dispatchMinCostType, distributionPackageEntities, minCost, additionalCost); + } else if (ObjectUtil.equals(2, dispatchMinCostMode)) { + Map> map = distributionPackageEntities.stream().collect(Collectors.groupingBy(StatisticsDistributionPackageEntity::getTrainNumber)); + if (CollUtil.isNotEmpty(map)) { + for (Map.Entry> entry : map.entrySet()) { + List value = entry.getValue(); + buildDispatchCostToPackage(dispatchMinCostType, value, minCost, additionalCost); + } + } + } + // 保存配送包件信息 + if (CollUtil.isNotEmpty(distributionPackageEntities)) { + // 计算配送服务费 realDeliveryServiceFee = 所有real费用的和 + distributionPackageEntities.stream().forEach(entity -> { + entity.setRealDeliveryServiceFee(entity.getRealDeliveryFee() + .add(entity.getRealDeliveryLoadingFee()) + .add(entity.getRealDeliveryMoveFee()) + .add(entity.getRealDeliveryCrossingFee()) + .add(entity.getRealDeliverySortingFee()) + .add(entity.getRealDeliveryUpfloorFee()) + .add(entity.getRealDeliveryDistance())); + }); + distributionPackageService.saveOrUpdateBatch(distributionPackageEntities); + } + } + } + } + + private void buildBasicDispatchCost(StatisticsDistributionPackageEntity statisticsDistributionPackageEntity, PriceDispatchVO dispatch, Integer dispatchIsByCategory) { + List pieceCategory = dispatch.getPieceCategory(); + if (CollUtil.isNotEmpty(pieceCategory)) { + List pieceList = pieceCategory; + if (1 == dispatchIsByCategory) { + pieceList = pieceCategory.stream().filter(priceDispatchBasicVO -> { + return StrUtil.equals(String.valueOf(priceDispatchBasicVO.getCategoryId()), statisticsDistributionPackageEntity.getProductId()); + }).collect(Collectors.toList()); + } + if (CollUtil.isNotEmpty(pieceList)) { + PriceDispatchBasicVO priceDispatchBasicVO = pieceList.get(0); + // TODO 如果是遗留件 按遗留件单价来计算 目前只有欧派有遗留件 + Double price1 = priceDispatchBasicVO.getPrice(); + // 配送费 = 按件单价 + statisticsDistributionPackageEntity.setRealDeliveryFee(NumberUtil.toBigDecimal(price1)); + } + } + + List cubeCategory = dispatch.getCubeCategory(); + if (CollUtil.isNotEmpty(cubeCategory)) { + List cubeList = cubeCategory; + if (1 == dispatchIsByCategory) { + cubeList = cubeCategory.stream().filter(priceDispatchBasicVO -> { + return StrUtil.equals(String.valueOf(priceDispatchBasicVO.getCategoryId()), statisticsDistributionPackageEntity.getProductId()); + }).collect(Collectors.toList()); + } + if (CollUtil.isNotEmpty(cubeList)) { + PriceDispatchBasicVO priceDispatchBasicVO = cubeList.get(0); + // TODO 如果是遗留件 按遗留件单价来计算 目前只有欧派有遗留件 + Double price1 = priceDispatchBasicVO.getPrice(); + BigDecimal totalVolume = statisticsDistributionPackageEntity.getTotalVolume(); + // 配送费 = 按方单价 * 体积 + if (ObjectUtil.isNotEmpty(totalVolume)) { + statisticsDistributionPackageEntity.setRealDeliveryFee(NumberUtil.toBigDecimal(price1).multiply(totalVolume)); + } + } + } + + List weightCategory = dispatch.getWeightCategory(); + if (CollUtil.isNotEmpty(weightCategory)) { + List weightList = weightCategory; + if (1 == dispatchIsByCategory) { + weightList = weightCategory.stream().filter(priceDispatchBasicVO -> { + return StrUtil.equals(String.valueOf(priceDispatchBasicVO.getCategoryId()), statisticsDistributionPackageEntity.getProductId()); + }).collect(Collectors.toList()); + } + if (CollUtil.isNotEmpty(weightList)) { + PriceDispatchBasicVO priceDispatchBasicVO = weightList.get(0); + // TODO 如果是遗留件 按遗留件单价来计算 目前只有欧派有遗留件 + Double price1 = priceDispatchBasicVO.getPrice(); + BigDecimal totalWeight = statisticsDistributionPackageEntity.getTotalWeight(); + // 配送费 = 按重量单价 * 重量 + if (ObjectUtil.isNotEmpty(totalWeight)) { + statisticsDistributionPackageEntity.setRealDeliveryFee(NumberUtil.toBigDecimal(price1).multiply(totalWeight)); + } + } + } + } + + private void buildBasicWarehouseCost(StatisticsWarehousePackageEntity statisticsDistributionPackageEntity, PriceWarehouseVO warehouseVO, BasicdataPriceTemplateEntity template, Long diff) { + // 1 按件 2 按方 3 按重量 + Integer warehousePricingType = template.getWarehousePricingType(); + // 1 分段式 2 最高标准 + Integer warehousePricingMode = template.getWarehousePricingMode(); + // 计费标准 1 按件/天 2 按件/月 + Integer warehouseCalculationBasis = template.getWarehouseCalculationBasis(); + if (!ObjectUtil.isAllNotEmpty(warehousePricingType, warehousePricingMode, warehouseCalculationBasis)) { + log.warn("模版参数不全不计算"); + return; + } + // 仓储费是否按品类计费 1 是 0 否 + Integer warehouseIsByCategory = template.getWarehouseIsByCategory(); + List catergory = warehouseVO.getCatergory(); + if (CollUtil.isNotEmpty(catergory)) { + List pieceList = catergory; + if (1 == warehouseIsByCategory) { + pieceList = catergory.stream().filter(priceDispatchBasicVO -> { + return StrUtil.equals(String.valueOf(priceDispatchBasicVO.getCategoryId()), statisticsDistributionPackageEntity.getProductId()); + }).collect(Collectors.toList()); + } + if (CollUtil.isNotEmpty(pieceList)) { + BigDecimal totalVolume = statisticsDistributionPackageEntity.getTotalVolume(); + BigDecimal totalWeight = statisticsDistributionPackageEntity.getTotalWeight(); + PriceWarehouseBasicVO priceDispatchBasicVO = pieceList.get(0); + Double withinThirtyPrice = priceDispatchBasicVO.getWithinThirtyPrice(); + Double betweenThirtySixtyPrice = priceDispatchBasicVO.getBetweenThirtySixtyPrice(); + Double beyondSixtyPrice = priceDispatchBasicVO.getBeyondSixtyPrice(); + Double beyondNinetyPrice = priceDispatchBasicVO.getBeyondNinetyPrice(); + // 计算仓储费 + if (ObjectUtil.equals(1, warehousePricingType)) { + if (ObjectUtil.equals(1, warehousePricingMode)) { + fenDuan(statisticsDistributionPackageEntity, diff, warehouseCalculationBasis, withinThirtyPrice, BigDecimal.ONE, betweenThirtySixtyPrice, beyondSixtyPrice, beyondNinetyPrice); + } else if (ObjectUtil.equals(2, warehousePricingMode)) { + zuiGao(statisticsDistributionPackageEntity, diff, warehouseCalculationBasis, withinThirtyPrice, BigDecimal.ONE, betweenThirtySixtyPrice, beyondSixtyPrice, beyondNinetyPrice); + } + } else if (ObjectUtil.equals(2, warehousePricingType)) { + if (ObjectUtil.equals(1, warehousePricingMode)) { + fenDuan(statisticsDistributionPackageEntity, diff, warehouseCalculationBasis, withinThirtyPrice, totalVolume, betweenThirtySixtyPrice, beyondSixtyPrice, beyondNinetyPrice); + } else if (ObjectUtil.equals(2, warehousePricingMode)) { + zuiGao(statisticsDistributionPackageEntity, diff, warehouseCalculationBasis, withinThirtyPrice, totalVolume, betweenThirtySixtyPrice, beyondSixtyPrice, beyondNinetyPrice); + } + } else if (ObjectUtil.equals(3, warehousePricingType)) { + if (ObjectUtil.equals(1, warehousePricingMode)) { + fenDuan(statisticsDistributionPackageEntity, diff, warehouseCalculationBasis, withinThirtyPrice, totalWeight, betweenThirtySixtyPrice, beyondSixtyPrice, beyondNinetyPrice); + } else if (ObjectUtil.equals(2, warehousePricingMode)) { + zuiGao(statisticsDistributionPackageEntity, diff, warehouseCalculationBasis, withinThirtyPrice, totalWeight, betweenThirtySixtyPrice, beyondSixtyPrice, beyondNinetyPrice); + } + } + Integer warehouseIsAddFee = template.getWarehouseIsAddFee(); + if (ObjectUtil.equals(BooleanZeroOneEnums.YES.getCode(), warehouseIsAddFee)) { + // 是否有管理费 + Integer warehouseIsManageFee = template.getWarehouseIsManageFee(); + // 是否有分拣费 + Integer warehouseIsSortFee = template.getWarehouseIsSortFee(); + // 是否有操作费 + Integer warehouseIsOperatingFee = template.getWarehouseIsOperateFee(); + // 是否按品类附加费 + Integer warehouseIsCategorySubjoin = template.getWarehouseIsCategorySubjoin(); + List additionalCategory = warehouseVO.getAdditionalCategory(); + if (CollUtil.isNotEmpty(additionalCategory)) { + List additionalList = additionalCategory; + if (ObjectUtil.equals(BooleanZeroOneEnums.YES.getCode(), warehouseIsCategorySubjoin)) { + additionalList = additionalCategory.stream().filter(additionalVO -> { + return StrUtil.equals(String.valueOf(additionalVO.getCategoryId()), statisticsDistributionPackageEntity.getProductId()); + }).collect(Collectors.toList()); + } + if (CollUtil.isNotEmpty(additionalList)) { + PriceWarehouseAdditionalVO additionalVO = additionalList.get(0); + Double operatePrice = additionalVO.getOperatePrice(); + Double managementPrice = additionalVO.getWarehouseManagementPrice(); + Double warehouseSortPrice = additionalVO.getWarehouseSortPrice(); + if (ObjectUtil.equals(BooleanZeroOneEnums.YES.getCode(), warehouseIsManageFee)) { + statisticsDistributionPackageEntity.setRealWarehouseManageFee(NumberUtil.toBigDecimal(managementPrice)); + } + if (ObjectUtil.equals(BooleanZeroOneEnums.YES.getCode(), warehouseIsSortFee)) { + statisticsDistributionPackageEntity.setRealWarehouseSortingFee(NumberUtil.toBigDecimal(warehouseSortPrice)); + } + if (ObjectUtil.equals(BooleanZeroOneEnums.YES.getCode(), warehouseIsOperatingFee)) { + statisticsDistributionPackageEntity.setRealWarehouseOperatingFee(NumberUtil.toBigDecimal(operatePrice)); + } + } + } + } + } + } + } + + private static void zuiGao(StatisticsWarehousePackageEntity statisticsDistributionPackageEntity, Long diff, Integer warehouseCalculationBasis, Double withinThirtyPrice, BigDecimal number, Double betweenThirtySixtyPrice, Double beyondSixtyPrice, Double beyondNinetyPrice) { + if (ObjectUtil.equals(1, warehouseCalculationBasis)) { + // 方 最高 天 + BigDecimal realWarehouseFee = BigDecimal.ZERO; + if (diff <= 30) { + realWarehouseFee = NumberUtil.mul(withinThirtyPrice, diff, number); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("30天内"); + } else if (diff <= 60) { + realWarehouseFee = NumberUtil.mul(betweenThirtySixtyPrice, diff, number); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("31-60天"); + } else if (diff <= 90) { + realWarehouseFee = NumberUtil.mul(beyondSixtyPrice, diff, number); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("61-90天"); + } else if (diff > 90) { + realWarehouseFee = NumberUtil.mul(beyondNinetyPrice, diff, number); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("91天以上"); + } + statisticsDistributionPackageEntity.setRealWarehouseFee(realWarehouseFee); + } else if (ObjectUtil.equals(2, warehouseCalculationBasis)) { + // 方 最高 月 + BigDecimal realWarehouseFee = BigDecimal.ZERO; + if (diff <= 30) { + realWarehouseFee = NumberUtil.mul(withinThirtyPrice, 1, number); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("30天内"); + } else if (diff <= 60) { + realWarehouseFee = NumberUtil.mul(betweenThirtySixtyPrice, 2, number); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("31-60天"); + } else if (diff <= 90) { + realWarehouseFee = NumberUtil.mul(beyondSixtyPrice, 3, number); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("61-90天"); + } else if (diff > 90) { + long time = diff - 90; + // time 以 30 天为维度 计算 ,向上取整 + Double ceil = Math.ceil(time / 30); + realWarehouseFee = NumberUtil.mul(beyondNinetyPrice, NumberUtil.add(ceil, 3, BigDecimal.ZERO), number); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("91天以上"); + } + statisticsDistributionPackageEntity.setRealWarehouseFee(realWarehouseFee); + } + } + + private static void fenDuan(StatisticsWarehousePackageEntity statisticsDistributionPackageEntity, Long diff, Integer warehouseCalculationBasis, Double withinThirtyPrice, BigDecimal number, Double betweenThirtySixtyPrice, Double beyondSixtyPrice, Double beyondNinetyPrice) { + if (ObjectUtil.equals(1, warehouseCalculationBasis)) { + // 方 分段 天 + BigDecimal realWarehouseFee = BigDecimal.ZERO; + if (diff <= 30) { + realWarehouseFee = NumberUtil.mul(withinThirtyPrice, diff, number); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("30天内"); + } else if (diff <= 60) { + realWarehouseFee = NumberUtil.add( + NumberUtil.mul(withinThirtyPrice, 30, number), + NumberUtil.mul(betweenThirtySixtyPrice, NumberUtil.sub(diff, 30, BigDecimal.ZERO), number) + ); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("31-60天"); + } else if (diff <= 90) { + realWarehouseFee = NumberUtil.add( + NumberUtil.mul(withinThirtyPrice, 30, number), + NumberUtil.mul(betweenThirtySixtyPrice, 30, number), + NumberUtil.mul(beyondSixtyPrice, NumberUtil.sub(diff, 60, BigDecimal.ZERO), number) + ); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("61-90天"); + } else if (diff > 90) { + realWarehouseFee = NumberUtil.add( + NumberUtil.mul(withinThirtyPrice, 30, number), + NumberUtil.mul(betweenThirtySixtyPrice, 30, number), + NumberUtil.mul(beyondSixtyPrice, 30, number), + NumberUtil.mul(beyondNinetyPrice, NumberUtil.sub(diff, 90, BigDecimal.ZERO), number) + ); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("91天以上"); + } + statisticsDistributionPackageEntity.setRealWarehouseFee(realWarehouseFee); + } else if (ObjectUtil.equals(2, warehouseCalculationBasis)) { + // 方 分段 月 + BigDecimal realWarehouseFee = BigDecimal.ZERO; + if (diff <= 30) { + realWarehouseFee = NumberUtil.mul(withinThirtyPrice, number); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("30天内"); + } else if (diff <= 60) { + realWarehouseFee = NumberUtil.mul(number, NumberUtil.add(withinThirtyPrice, betweenThirtySixtyPrice, BigDecimal.ZERO)); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("31-60天"); + } else if (diff <= 90) { + realWarehouseFee = NumberUtil.mul(number, NumberUtil.add(withinThirtyPrice, betweenThirtySixtyPrice, beyondSixtyPrice)); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("61-90天"); + } else if (diff > 90) { + long time = diff - 90; + // time 以 30 天为维度 计算 ,向上取整 + Double ceil = Math.ceil(time / 30); + realWarehouseFee = NumberUtil.mul(number, NumberUtil.add(withinThirtyPrice, betweenThirtySixtyPrice, beyondSixtyPrice, NumberUtil.mul(ceil, beyondNinetyPrice))); + statisticsDistributionPackageEntity.setRealWarehouseFeeInterval("91天以上"); + } + statisticsDistributionPackageEntity.setRealWarehouseFee(realWarehouseFee); + } + } + + private void buildDispatchCostToPackage(Integer dispatchMinCostType, List distributionPackageEntities, Double minCost, Double additionalCost) { + if (ObjectUtil.equals(1, dispatchMinCostType)) { + // 计算总价 + BigDecimal sumDeliveryFee = distributionPackageEntities.stream().map(StatisticsDistributionPackageEntity::getRealDeliveryFee).reduce(BigDecimal.ZERO, BigDecimal::add); + // 总价和最低价 取大的值 + BigDecimal max = NumberUtil.max(sumDeliveryFee, NumberUtil.toBigDecimal(minCost)); + // 分摊价格个到包件上 + // max - sumDeliveryFee 大于 0 则分摊价格个到包件上 + if (max.compareTo(sumDeliveryFee) > 0) { + // 分摊价格个到包件上 (原单价 + (max - sumDeliveryFee)/件数) + BigDecimal divide = max.subtract(sumDeliveryFee).divide(NumberUtil.toBigDecimal(distributionPackageEntities.size()), 2, BigDecimal.ROUND_HALF_UP); + distributionPackageEntities.forEach(statisticsDistributionPackageEntity -> { + statisticsDistributionPackageEntity.setRealDeliveryFee(statisticsDistributionPackageEntity.getRealDeliveryFee().add(divide)); + }); + } + } else if (ObjectUtil.equals(2, dispatchMinCostType)) { + // 总件数 + int size = distributionPackageEntities.size(); + // 总件数 < 最低价 则计算保底价 + if (size < minCost) { + // 分摊到包件上 原单价 + 加算价格 + distributionPackageEntities.forEach(statisticsDistributionPackageEntity -> { + statisticsDistributionPackageEntity.setRealDeliveryFee(statisticsDistributionPackageEntity.getRealDeliveryFee().add(NumberUtil.toBigDecimal(additionalCost))); + }); + } + } else if (ObjectUtil.equals(3, dispatchMinCostType)) { + // 总体积 + BigDecimal totalVolume = distributionPackageEntities.stream().map(StatisticsDistributionPackageEntity::getTotalVolume).reduce(BigDecimal.ZERO, BigDecimal::add); + // 总件数 < 最低价 则计算保底价 + if (NumberUtil.compare(NumberUtil.toDouble(totalVolume), minCost) < 0) { + // 分摊到包件上 原单价 + 加算价格 + distributionPackageEntities.forEach(statisticsDistributionPackageEntity -> { + statisticsDistributionPackageEntity.setRealDeliveryFee(statisticsDistributionPackageEntity.getRealDeliveryFee().add(NumberUtil.toBigDecimal(additionalCost))); + }); + } + } else if (ObjectUtil.equals(4, dispatchMinCostType)) { + // 总重量 + BigDecimal totalWeight = distributionPackageEntities.stream().map(StatisticsDistributionPackageEntity::getTotalWeight).reduce(BigDecimal.ZERO, BigDecimal::add); + // 总件数 < 最低价 则计算保底价 + if (NumberUtil.compare(NumberUtil.toDouble(totalWeight), minCost) < 0) { + // 分摊到包件上 原单价 + 加算价格 + distributionPackageEntities.forEach(statisticsDistributionPackageEntity -> { + statisticsDistributionPackageEntity.setRealDeliveryFee(statisticsDistributionPackageEntity.getRealDeliveryFee().add(NumberUtil.toBigDecimal(additionalCost))); + }); + } + } + } + + private void updateOrderChangesFee(Long orderInfoId) { + + StatisticsOrderInfoEntity statisticsOrderInfoEntity = baseMapper.selectById(orderInfoId); + if (Objects.isNull(statisticsOrderInfoEntity)) { + log.warn("#############updateOrderChangesFee: 订单信息不存在 statisticsOrderInfoEntity={}", statisticsOrderInfoEntity); + throw new CustomerException(405, "订单信息不存在"); + } + + BigDecimal changesFee = changesRecordService.findChangesFeeByOrderInfoId(orderInfoId); + + statisticsOrderInfoEntity.setChangesFee(changesFee); + + baseMapper.updateById(statisticsOrderInfoEntity); + + } + + private String verifyValue(StatisticsChangesRecordEntity changesRecordEntity) { + StringBuilder stringBuilder = new StringBuilder(); + BigDecimal totalFee = BigDecimal.ZERO; + + BigDecimal pickupFee = changesRecordEntity.getPickupFee(); + if (pickupFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(pickupFee); + stringBuilder.append("提货费变更").append(pickupFee.toPlainString()).append(";"); + } + BigDecimal freightFee = changesRecordEntity.getFreightFee(); + if (freightFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(freightFee); + stringBuilder.append("运费变更").append(freightFee.toPlainString()).append(";"); + } + + BigDecimal warehouseFee = changesRecordEntity.getWarehouseFee(); + if (warehouseFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(warehouseFee); + stringBuilder.append("仓储费变更").append(warehouseFee.toPlainString()).append(";"); + } + + BigDecimal warehouseManageFee = changesRecordEntity.getWarehouseManageFee(); + if (warehouseManageFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(warehouseManageFee); + stringBuilder.append("仓储管理费变更").append(warehouseManageFee.toPlainString()).append(";"); + } + + BigDecimal warehouseSortingFee = changesRecordEntity.getWarehouseSortingFee(); + if (warehouseSortingFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(warehouseSortingFee); + stringBuilder.append("仓储分拣费变更").append(warehouseSortingFee.toPlainString()).append(";"); + } + + BigDecimal warehouseOperatingFee = changesRecordEntity.getWarehouseOperatingFee(); + if (warehouseOperatingFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(warehouseOperatingFee); + stringBuilder.append("仓储操作费变更").append(warehouseOperatingFee.toPlainString()).append(";"); + } + + BigDecimal deliveryFee = changesRecordEntity.getDeliveryFee(); + if (deliveryFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(deliveryFee); + stringBuilder.append("配送费变更").append(deliveryFee.toPlainString()).append(";"); + } + + BigDecimal deliveryLoadingFee = changesRecordEntity.getDeliveryLoadingFee(); + if (deliveryLoadingFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(deliveryLoadingFee); + stringBuilder.append("配送装卸费变更").append(deliveryLoadingFee.toPlainString()).append(";"); + } + + BigDecimal deliverySortingFee = changesRecordEntity.getDeliverySortingFee(); + if (deliverySortingFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(deliverySortingFee); + stringBuilder.append("配送分拣费变更").append(deliverySortingFee.toPlainString()).append(";"); + } + + BigDecimal deliveryUpfloorFee = changesRecordEntity.getDeliveryUpfloorFee(); + if (deliveryUpfloorFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(deliveryUpfloorFee); + stringBuilder.append("配送上楼费变更").append(deliveryUpfloorFee.toPlainString()).append(";"); + } + + BigDecimal deliveryMoveFee = changesRecordEntity.getDeliveryMoveFee(); + if (deliveryMoveFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(deliveryMoveFee); + stringBuilder.append("配送平移费变更").append(deliveryMoveFee.toPlainString()).append(";"); + } + + BigDecimal installFee = changesRecordEntity.getInstallFee(); + if (installFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(installFee); + stringBuilder.append("安装费变更").append(installFee.toPlainString()).append(";"); + } + + BigDecimal quotationFee = changesRecordEntity.getQuotationFee(); + if (quotationFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(quotationFee); + stringBuilder.append("保价费变更").append(quotationFee.toPlainString()).append(";"); + } + + BigDecimal claimingValue = changesRecordEntity.getClaimingValue(); + if (claimingValue.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(claimingValue); + stringBuilder.append("申明价值变更").append(claimingValue.toPlainString()).append(";"); + } + + BigDecimal otherFee = changesRecordEntity.getOtherFee(); + if (otherFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(otherFee); + stringBuilder.append("其他费变更").append(otherFee.toPlainString()).append(";"); + } + + BigDecimal returnFee = changesRecordEntity.getReturnFee(); + if (returnFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(returnFee); + stringBuilder.append("回扣变更").append(returnFee.toPlainString()).append(";"); + } + + BigDecimal thirdOprationFee = changesRecordEntity.getThirdOprationFee(); + if (thirdOprationFee.compareTo(BigDecimal.ZERO) != 0) { + totalFee = totalFee.add(thirdOprationFee); + stringBuilder.append("第三方操作费变更").append(thirdOprationFee.toPlainString()).append(";"); + } + + changesRecordEntity.setTotalFee(totalFee); + return stringBuilder.toString(); + } + + +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsTrunklinePackageServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsTrunklinePackageServiceImpl.java new file mode 100644 index 000000000..35fad7f45 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsTrunklinePackageServiceImpl.java @@ -0,0 +1,19 @@ +package com.logpm.statistics.service.impl; + +import com.logpm.statistics.entity.StatisticsTrunklinePackageEntity; +import com.logpm.statistics.mapper.StatisticsTrunklinePackageMapper; +import com.logpm.statistics.service.IStatisticsTrunklinePackageService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +@Slf4j +public class StatisticsTrunklinePackageServiceImpl extends BaseServiceImpl implements IStatisticsTrunklinePackageService { + @Override + public void deleteListByWaybillId(Long waybillId) { + baseMapper.deleteListByWaybillId(waybillId); + } +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsWarehousePackageServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsWarehousePackageServiceImpl.java new file mode 100644 index 000000000..47d6198f0 --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsWarehousePackageServiceImpl.java @@ -0,0 +1,15 @@ +package com.logpm.statistics.service.impl; + +import com.logpm.statistics.entity.StatisticsWarehousePackageEntity; +import com.logpm.statistics.mapper.StatisticsWarehousePackageMapper; +import com.logpm.statistics.service.IStatisticsWarehousePackageService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@AllArgsConstructor +public class StatisticsWarehousePackageServiceImpl extends BaseServiceImpl implements IStatisticsWarehousePackageService { +} diff --git a/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsWaybillInfoServiceImpl.java b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsWaybillInfoServiceImpl.java new file mode 100644 index 000000000..92050fcad --- /dev/null +++ b/blade-service/logpm-statisticsdata/src/main/java/com/logpm/statistics/service/impl/StatisticsWaybillInfoServiceImpl.java @@ -0,0 +1,25 @@ +package com.logpm.statistics.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.logpm.statistics.dto.MerchantStatisticsDTO; +import com.logpm.statistics.entity.StatisticsChangesRecordEntity; +import com.logpm.statistics.entity.StatisticsWaybillInfoEntity; +import com.logpm.statistics.mapper.StatisticsWaybillInfoMapper; +import com.logpm.statistics.service.IStatisticsWaybillInfoService; +import com.logpm.statistics.vo.StatisticsChangesRecordVO; +import com.logpm.statistics.vo.StatisticsWaybillInfoVO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Slf4j +@Service +@AllArgsConstructor +public class StatisticsWaybillInfoServiceImpl extends BaseServiceImpl implements IStatisticsWaybillInfoService { + +} diff --git a/blade-service/logpm-statisticsdata/src/main/resources/application-dev.yml b/blade-service/logpm-statisticsdata/src/main/resources/application-dev.yml index ffd7f1130..f5a8e1df0 100644 --- a/blade-service/logpm-statisticsdata/src/main/resources/application-dev.yml +++ b/blade-service/logpm-statisticsdata/src/main/resources/application-dev.yml @@ -1,6 +1,6 @@ #服务器端口 server: - port: 8200 + port: 19999 #数据源配置 #spring: @@ -10,9 +10,36 @@ server: # password: ${blade.datasource.dev.password} spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.46 + port: 5672 + username: admin + password: admin + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true + #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -30,15 +57,15 @@ spring: validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.factory.master.url} - username: ${blade.datasource.factory.master.username} - password: ${blade.datasource.factory.master.password} - slave: + url: ${blade.datasource.statisticsdata.master.url} + username: ${blade.datasource.statisticsdata.master.username} + password: ${blade.datasource.statisticsdata.master.password} + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.factory.slave.url} - username: ${blade.datasource.factory.slave.username} - password: ${blade.datasource.factory.slave.password} + url: ${blade.datasource.statisticsdata.627683.url} + username: ${blade.datasource.statisticsdata.627683.username} + password: ${blade.datasource.statisticsdata.627683.password} diff --git a/blade-service/logpm-statisticsdata/src/main/resources/application-prod.yml b/blade-service/logpm-statisticsdata/src/main/resources/application-prod.yml index a0ca7ca85..2fffc1406 100644 --- a/blade-service/logpm-statisticsdata/src/main/resources/application-prod.yml +++ b/blade-service/logpm-statisticsdata/src/main/resources/application-prod.yml @@ -10,9 +10,35 @@ server: # password: ${blade.datasource.prod.password} spring: + #rabbitmq配置 + rabbitmq: + host: 172.16.128.145 + port: 5672 + username: admin + password: Slwk@123654 + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -22,10 +48,10 @@ spring: primary: master datasource: master: - url: ${blade.datasource.factory.master.url} - username: ${blade.datasource.factory.master.username} - password: ${blade.datasource.factory.master.password} - slave: - url: ${blade.datasource.factory.slave.url} - username: ${blade.datasource.factory.slave.username} - password: ${blade.datasource.factory.slave.password} + url: ${blade.datasource.statisticsdata.master.url} + username: ${blade.datasource.statisticsdata.master.username} + password: ${blade.datasource.statisticsdata.master.password} + 627683: + url: ${blade.datasource.statisticsdata.627683.url} + username: ${blade.datasource.statisticsdata.627683.username} + password: ${blade.datasource.statisticsdata.627683.password} diff --git a/blade-service/logpm-statisticsdata/src/main/resources/application-test.yml b/blade-service/logpm-statisticsdata/src/main/resources/application-test.yml index 2a6bc8bfd..ed72a5140 100644 --- a/blade-service/logpm-statisticsdata/src/main/resources/application-test.yml +++ b/blade-service/logpm-statisticsdata/src/main/resources/application-test.yml @@ -10,9 +10,35 @@ server: # password: ${blade.datasource.test.password} spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.110 + port: 5672 + username: admin + password: Slwk@123654 + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -22,10 +48,14 @@ spring: primary: master datasource: master: - url: ${blade.datasource.factory.master.url} - username: ${blade.datasource.factory.master.username} - password: ${blade.datasource.factory.master.password} - slave: - url: ${blade.datasource.factory.slave.url} - username: ${blade.datasource.factory.slave.username} - password: ${blade.datasource.factory.slave.password} + url: ${blade.datasource.statisticsdata.master.url} + username: ${blade.datasource.statisticsdata.master.username} + password: ${blade.datasource.statisticsdata.master.password} + 627683: + url: ${blade.datasource.statisticsdata.627683.url} + username: ${blade.datasource.statisticsdata.627683.username} + password: ${blade.datasource.statisticsdata.627683.password} + 695224: + url: ${blade.datasource.statisticsdata.695224.url} + username: ${blade.datasource.statisticsdata.695224.username} + password: ${blade.datasource.statisticsdata.695224.password} diff --git a/blade-service/logpm-statisticsdata/src/main/resources/application.yml b/blade-service/logpm-statisticsdata/src/main/resources/application.yml index 28bbf533b..3b23e330e 100644 --- a/blade-service/logpm-statisticsdata/src/main/resources/application.yml +++ b/blade-service/logpm-statisticsdata/src/main/resources/application.yml @@ -37,14 +37,14 @@ spring: allow-circular-references: true -xxl: - job: - accessToken: '' - admin: - addresses: http://127.0.0.1:7009/xxl-job-admin - executor: - appname: logpm-factory-xxljob - ip: 127.0.0.1 - logpath: ../data/applogs/logpm-factory-xxljob/jobhandler - logretentiondays: -1 - port: 7018 +#xxl: +# job: +# accessToken: '' +# admin: +# addresses: http://127.0.0.1:7009/xxl-job-admin +# executor: +# appname: logpm-factory-xxljob +# ip: 127.0.0.1 +# logpath: ../data/applogs/logpm-factory-xxljob/jobhandler +# logretentiondays: -1 +# port: 7018 diff --git a/blade-service/logpm-supervise/Dockerfile b/blade-service/logpm-supervise/Dockerfile index efbe89b31..b4cb79dfa 100644 --- a/blade-service/logpm-supervise/Dockerfile +++ b/blade-service/logpm-supervise/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/SuperviseApplication.java b/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/SuperviseApplication.java index 52e2666af..0dbf98df6 100644 --- a/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/SuperviseApplication.java +++ b/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/SuperviseApplication.java @@ -5,6 +5,7 @@ package com.logpm.supervise; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.cloud.client.BladeCloudApplication; import org.springblade.core.launch.BladeApplication; +import org.springblade.core.transaction.annotation.SeataCloudApplication; /** * Basic启动器 diff --git a/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..5fcbeef6e --- /dev/null +++ b/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.supervise.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/config/ExecutorConfig.java b/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/config/ExecutorConfig.java new file mode 100644 index 000000000..bcc846a05 --- /dev/null +++ b/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/config/ExecutorConfig.java @@ -0,0 +1,82 @@ +package com.logpm.supervise.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + String tenantId = AuthUtil.getTenantId(); + Map all = ThreadLocalUtil.getAll(); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + all.keySet().forEach(key -> ThreadLocalUtil.put(key, all.get(key))); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + String tenantId1 = AuthUtil.getTenantId(); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + all.clear(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/mapper/IndicatorsMapper.xml b/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/mapper/IndicatorsMapper.xml index 3eafd25e4..e956ea312 100644 --- a/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/mapper/IndicatorsMapper.xml +++ b/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/mapper/IndicatorsMapper.xml @@ -22,7 +22,8 @@ si.objection_remark objectionRemark, si.create_time createTime, si.create_dept createDept, - si.create_user createUser + si.create_user createUser, + si.remark from sup_indicators si left join sup_classify sc on sc.id = si.classify_id left join sup_classify psc on psc.id = sc.p_id diff --git a/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/service/impl/IndicatorsServiceImpl.java b/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/service/impl/IndicatorsServiceImpl.java index 1c6afe8f0..d69b1d098 100644 --- a/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/service/impl/IndicatorsServiceImpl.java +++ b/blade-service/logpm-supervise/src/main/java/com/logpm/supervise/service/impl/IndicatorsServiceImpl.java @@ -189,8 +189,14 @@ public class IndicatorsServiceImpl extends BaseServiceImpl userR = userClient.userInfoById(createUser); - String userName = userR.getData().getName(); - exportIndicatorsVO.setCreateUserName(userName); + if(userR.isSuccess()){ + if(!Objects.isNull(userR.getData())){ + String userName = userR.getData().getName(); + exportIndicatorsVO.setCreateUserName(userName); + } + + } + } return list; diff --git a/blade-service/logpm-supervise/src/main/resources/application-dev.yml b/blade-service/logpm-supervise/src/main/resources/application-dev.yml index ea38e3d37..c095b463d 100644 --- a/blade-service/logpm-supervise/src/main/resources/application-dev.yml +++ b/blade-service/logpm-supervise/src/main/resources/application-dev.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -33,13 +33,13 @@ spring: url: ${blade.datasource.supervise.master.url} username: ${blade.datasource.supervise.master.username} password: ${blade.datasource.supervise.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.supervise.slave.url} - username: ${blade.datasource.supervise.slave.username} - password: ${blade.datasource.supervise.slave.password} + url: ${blade.datasource.supervise.627683.url} + username: ${blade.datasource.supervise.627683.username} + password: ${blade.datasource.supervise.627683.password} diff --git a/blade-service/logpm-supervise/src/main/resources/application-prod.yml b/blade-service/logpm-supervise/src/main/resources/application-prod.yml index b520eea1a..f252686c7 100644 --- a/blade-service/logpm-supervise/src/main/resources/application-prod.yml +++ b/blade-service/logpm-supervise/src/main/resources/application-prod.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -33,13 +33,13 @@ spring: url: ${blade.datasource.basic.master.url} username: ${blade.datasource.basic.master.username} password: ${blade.datasource.basic.master.password} - slave: + 627683: druid: #独立校验配置 validation-query: select 1 #oracle校验 #validation-query: select 1 from dual - url: ${blade.datasource.basic.slave.url} - username: ${blade.datasource.basic.slave.username} - password: ${blade.datasource.basic.slave.password} + url: ${blade.datasource.basic.627683.url} + username: ${blade.datasource.basic.627683.username} + password: ${blade.datasource.basic.627683.password} diff --git a/blade-service/logpm-supervise/src/main/resources/application-test.yml b/blade-service/logpm-supervise/src/main/resources/application-test.yml index ea38e3d37..52e792bb7 100644 --- a/blade-service/logpm-supervise/src/main/resources/application-test.yml +++ b/blade-service/logpm-supervise/src/main/resources/application-test.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: diff --git a/blade-service/logpm-trunkline/Dockerfile b/blade-service/logpm-trunkline/Dockerfile index 73546915b..f5523b7d7 100644 --- a/blade-service/logpm-trunkline/Dockerfile +++ b/blade-service/logpm-trunkline/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/TrunkLineApplication.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/TrunkLineApplication.java index d17b93470..a82e78131 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/TrunkLineApplication.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/TrunkLineApplication.java @@ -19,6 +19,7 @@ package com.logpm.trunkline; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.cloud.client.BladeCloudApplication; import org.springblade.core.launch.BladeApplication; +import org.springblade.core.transaction.annotation.SeataCloudApplication; /** * Demo启动器 @@ -26,6 +27,7 @@ import org.springblade.core.launch.BladeApplication; * @author Chill */ @BladeCloudApplication +@SeataCloudApplication public class TrunkLineApplication { public static void main(String[] args) { diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/api/CarsLoadApiController.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/api/CarsLoadApiController.java index 60ed6f05a..5054165c1 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/api/CarsLoadApiController.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/api/CarsLoadApiController.java @@ -897,7 +897,7 @@ public class CarsLoadApiController { return R.fail(405,"包件码为空"); } - return carsLoadService.signScanPackageCode(signOrderId,orderPackageCode,"PDA扫码签收"); + return carsLoadService.signScanPackageCode(signOrderId,orderPackageCode,"PDA扫码签收",loadCarsDTO.getWarehouseId()); }catch (CustomerException e){ log.error(e.message,e); return R.fail(e.code,e.message); diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..23ac93519 --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.trunkline.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/aspect/ChangeAsyncAnnotationAspect.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/aspect/ChangeAsyncAnnotationAspect.java new file mode 100644 index 000000000..bc17b4c73 --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/aspect/ChangeAsyncAnnotationAspect.java @@ -0,0 +1,120 @@ +package com.logpm.trunkline.aspect; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.ChangeAsync; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.annotation.Order; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.lang.reflect.Method; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Aspect +@Component +@Slf4j +@Order(-1) +@AllArgsConstructor +public class ChangeAsyncAnnotationAspect { + + private final MockLoginService mockLoginService; + + private final BladeRedis bladeRedis; + private final Environment environment; + private final RedisLockClient redisLockClient; + private final String account = "shujutongbu"; + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.ChangeAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + ChangeAsync myAsync = method.getAnnotation(ChangeAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> ChangeAsync={}", annotationValue); + + // 获取当前拦截方法的入参参数 + Object[] args = joinPoint.getArgs(); + // 获取入参名称 + String[] parameterNames = signature.getParameterNames(); + String tenantId = null; + // 获取参数名称 为tenantId 的值 + for (int i = 0; i < parameterNames.length; i++) { + if ("tenantId".equals(parameterNames[i])) { + tenantId = (String) args[i]; + log.info(">> tenandId {} ", tenantId); + break; + } + } + // 执行模拟登录 + if (StringUtil.isNotBlank(tenantId)) { + JSONObject data = bladeRedis.get(CacheNames.LOCAL_SERVER_USER + tenantId + ":" + account); + if (Objects.isNull(data)) { + boolean flag = redisLockClient.tryLock("local_server_user" + tenantId, LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if (flag) { + data = bladeRedis.get(CacheNames.LOCAL_SERVER_USER + tenantId + ":" + account); + if (Objects.isNull(data)) { + data = mockLoginService.mockToken(tenantId, account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER + tenantId + ":" + account, data, 2591990L); + redisLockClient.unLock("local_server_user" + tenantId, LockType.FAIR); + } + } + } + + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.addHeader("Blade-Auth", "bearer "+data.get("access_token")); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(mockRequest)); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + DynamicDataSourceContextHolder.push(data.getString("tenant_id")); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + }else{ + return joinPoint.proceed(); + } + + +// // 在方法执行前的操作 +// String tenantId = AuthUtil.getTenantId(); +// log.info(">> tenandId {} ",tenantId); +// DynamicDataSourceContextHolder.push("627683"); +// +// // 执行原方法 +// Object result = joinPoint.proceed(); +// +// // 在方法执行后的操作 +// DynamicDataSourceContextHolder.poll(); +// return result; + } + +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..78eca8351 --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.trunkline.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/bean/Resp.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/bean/Resp.java index beeb9cca2..592cf76e6 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/bean/Resp.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/bean/Resp.java @@ -16,6 +16,15 @@ public class Resp extends R { return resp; } + public static Resp scanData(String msg,String audio,Object data){ + Resp resp = new Resp(); + resp.setCode(200); + resp.setMsg(msg); + resp.setData(data); + resp.setAudio(audio); + return resp; + } + public static Resp scanFail(String msg,String audio){ Resp resp = new Resp(); resp.setCode(3001); diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/CustomMessageConverter.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/CustomMessageConverter.java new file mode 100644 index 000000000..1612b391d --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/CustomMessageConverter.java @@ -0,0 +1,155 @@ +package com.logpm.trunkline.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.*; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength(bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/ExecutorConfig.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/ExecutorConfig.java new file mode 100644 index 000000000..b9903d9d1 --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/ExecutorConfig.java @@ -0,0 +1,82 @@ +package com.logpm.trunkline.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + String tenantId = AuthUtil.getTenantId(); + Map all = ThreadLocalUtil.getAll(); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + all.keySet().forEach(key -> ThreadLocalUtil.put(key, all.get(key))); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + String tenantId1 = AuthUtil.getTenantId(); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + all.clear(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/GlobalExceptionHandler.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/GlobalExceptionHandler.java new file mode 100644 index 000000000..14fb2ffee --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/GlobalExceptionHandler.java @@ -0,0 +1,28 @@ +package com.logpm.trunkline.config; + +import com.mysql.cj.jdbc.exceptions.CommunicationsException; +import org.springblade.core.tool.api.R; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExceptionHandler { + + + @ExceptionHandler(CommunicationsException.class) + public ResponseEntity handleCustomException(CommunicationsException e) { + // 从CustomException中获取errorCode和errorMessage + String errorMessage = e.getMessage(); + + // 创建一个自定义的响应体来封装错误信息 + if(errorMessage.contains("Communications link failure")){ + // 返回带有错误信息的HTTP响应 + return new ResponseEntity<>(R.fail(405,"请求超时,请重试"), HttpStatus.BAD_REQUEST); + } + // 返回带有错误信息的HTTP响应 + return new ResponseEntity<>(R.fail(e.getErrorCode(),errorMessage), HttpStatus.BAD_REQUEST); + } + +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/InterceptorAdapterConfig.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/InterceptorAdapterConfig.java new file mode 100644 index 000000000..5e991316d --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/InterceptorAdapterConfig.java @@ -0,0 +1,17 @@ +package com.logpm.trunkline.config; + +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@AllArgsConstructor +public class InterceptorAdapterConfig implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry interceptorRegistry) { +// interceptorRegistry.addInterceptor(new ParameterCombinationInterceptor()) +// .addPathPatterns("/**"); + } +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/RabbitMqConfiguration.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/RabbitMqConfiguration.java index b4f10143c..4f41cda88 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/RabbitMqConfiguration.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/config/RabbitMqConfiguration.java @@ -21,6 +21,7 @@ public class RabbitMqConfiguration { RabbitTemplate template = new RabbitTemplate(); template.setConnectionFactory(connectionFactory); template.setMandatory(true); + template.setMessageConverter(new CustomMessageConverter()); template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { @Override public void confirm(CorrelationData correlationData, boolean b, String s) { @@ -88,6 +89,19 @@ public class RabbitMqConfiguration { public Binding openOrderLoadScanBinding(Queue openOrderLoadScanQueue, CustomExchange openOrderLoadScanExchange) { return BindingBuilder.bind(openOrderLoadScanQueue).to(openOrderLoadScanExchange).with(RabbitConstant.OPEN_ORDER_LOAD_SCAN_ROUTING).noargs(); } - + @Bean + public Queue hwyOpenOrderLoadScanQueue() { + return new Queue(RabbitConstant.HWY_ORDER_STATUS_QUEUE, true); + } + @Bean + public CustomExchange hwyOpenOrderLoadScanExchange() { + Map args = Maps.newHashMap(); + args.put("x-delayed-type", "direct"); + return new CustomExchange(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, "x-delayed-message", true, false, args); + } + @Bean + public Binding hwyOpenOrderLoadScanBinding(Queue hwyOpenOrderLoadScanQueue, CustomExchange hwyOpenOrderLoadScanExchange) { + return BindingBuilder.bind(hwyOpenOrderLoadScanQueue).to(hwyOpenOrderLoadScanExchange).with(RabbitConstant.HWY_ORDER_STATUS_ROUTING).noargs(); + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/AdvanceDetailController.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/AdvanceDetailController.java index e93c19619..637dbea38 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/AdvanceDetailController.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/AdvanceDetailController.java @@ -1,11 +1,13 @@ package com.logpm.trunkline.controller; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; import com.logpm.distribution.vo.OrderPackgeCodeDataVO; import com.logpm.trunkline.dto.AdvanceDetailDTO; +import com.logpm.trunkline.dto.OrderDetailsDTO; import com.logpm.trunkline.service.ITrunklineAdvanceDetailService; import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; import io.swagger.annotations.Api; @@ -86,7 +88,7 @@ public class AdvanceDetailController { try{ List advanceDetailIds = advanceDetailDTO.getAdvanceDetailIds(); - if(0 == advanceDetailIds.size()){ + if(CollUtil.isEmpty(advanceDetailIds)){ log.warn(method+"请选择删除的包件"); return R.fail(405,"请选择删除的包件"); } @@ -103,4 +105,38 @@ public class AdvanceDetailController { } + + @ResponseBody + @PostMapping("/findOrderDetails") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询订单明细", notes = "orderDetailsDTO") + public R findOrderDetails(@RequestBody OrderDetailsDTO orderDetailsDTO) { + String method = "############findOrderDetails: "; + log.info(method+"请求参数{}",orderDetailsDTO); + try{ + Integer pageSize = orderDetailsDTO.getPageSize(); + Integer pageNum = orderDetailsDTO.getPageNum(); + if(Objects.isNull(pageSize)){ + orderDetailsDTO.setPageSize(30); + } + if(Objects.isNull(pageNum)){ + orderDetailsDTO.setPageNum(1); + } + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(!Objects.isNull(myCurrentWarehouse)){ + orderDetailsDTO.setWarehouseId(myCurrentWarehouse.getId()); + orderDetailsDTO.setWarehouseName(myCurrentWarehouse.getName()); + } + + return advanceDetailService.findOrderDetails(orderDetailsDTO); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/BillladingController.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/BillladingController.java index 2f990ec59..e86df1f2c 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/BillladingController.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/BillladingController.java @@ -51,7 +51,7 @@ public class BillladingController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } billladingDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -110,7 +110,7 @@ public class BillladingController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } billladingDTO.setWarehouseId(myCurrentWarehouse.getId()); billladingDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -187,7 +187,7 @@ public class BillladingController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } billladingDTO.setWarehouseId(myCurrentWarehouse.getId()); billladingDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -257,7 +257,7 @@ public class BillladingController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } if(Objects.isNull(type)){ @@ -295,7 +295,7 @@ public class BillladingController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } if(Objects.isNull(billladingId)){ log.warn(method+"提货单id不能为空 billladingId={}",billladingId); @@ -334,7 +334,7 @@ public class BillladingController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } billladingDTO.setWarehouseId(myCurrentWarehouse.getId()); billladingDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -370,7 +370,7 @@ public class BillladingController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } billladingDTO.setWarehouseId(myCurrentWarehouse.getId()); billladingDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -406,7 +406,7 @@ public class BillladingController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } billladingDTO.setWarehouseId(myCurrentWarehouse.getId()); billladingDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -442,7 +442,7 @@ public class BillladingController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } billladingDTO.setWarehouseId(myCurrentWarehouse.getId()); billladingDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -492,7 +492,7 @@ public class BillladingController { } @ResponseBody - @PostMapping("/findDriverListByName") + @PostMapping("/findDriverListByName") @ApiOperationSupport(order = 1) @ApiOperation(value = "通过名称查司机", notes = "传入waybillDTO") public R findDriverListByName(@RequestBody BillladingDTO billladingDTO) { @@ -551,6 +551,27 @@ public class BillladingController { } + @ResponseBody + @PostMapping("/findBillladingLogList") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询提货单日志", notes = "传入waybillDTO") + public R findBillladingLogList(@RequestBody BillladingDTO billladingDTO) { + String method = "############findBillladingLogList: "; + log.info(method + "请求参数{}", billladingDTO); + Long billladingId = billladingDTO.getBillladingId(); + + try{ + return trunklineBillladingService.findBillladingLogList(billladingId); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error("############sendOrders: 系统异常",e); + return R.fail(500,"############sendOrders: 系统异常"); + } + } + + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/CarsLoadController.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/CarsLoadController.java index 83a8d60b9..9f6bf1113 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/CarsLoadController.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/CarsLoadController.java @@ -6,7 +6,9 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; import com.logpm.trunkline.dto.*; +import com.logpm.trunkline.entity.TrunklineCarsLoadEntity; import com.logpm.trunkline.service.ITrunklineCarsLoadService; +import com.logpm.trunkline.vo.LoadingDetailExportVO; import com.logpm.trunkline.vo.TrunklineCarsLoadVO; import com.logpm.trunkline.vo.ZeroSuppleVO; import io.swagger.annotations.Api; @@ -14,11 +16,13 @@ import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.common.exception.CustomerException; +import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.Enumeration; import java.util.List; @@ -101,7 +105,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } verifySaveNewCarsLoad(carsLoadDTO); @@ -131,7 +135,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } if(Objects.isNull(loadId)){ @@ -174,7 +178,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } if(Objects.isNull(loadId)){ @@ -246,7 +250,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); // if(Objects.isNull(loadId)){ @@ -280,7 +284,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -318,7 +322,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -385,7 +389,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(carsOrderId)){ @@ -426,7 +430,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(StringUtil.isBlank(carsOrderIds)){ @@ -460,7 +464,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -499,7 +503,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -535,7 +539,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(carsOrderId)){ @@ -741,7 +745,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -790,7 +794,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -826,7 +830,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -871,7 +875,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -917,7 +921,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -964,7 +968,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if (Objects.isNull(myCurrentWarehouse)) { log.warn(method + "仓库信息为空 myCurrentWarehouse={}", myCurrentWarehouse); - return R.fail(405, "仓库信息为空"); + return R.fail(405, "多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1027,7 +1031,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if (Objects.isNull(myCurrentWarehouse)) { log.warn(method + "仓库信息为空 myCurrentWarehouse={}", myCurrentWarehouse); - return R.fail(405, "仓库信息为空"); + return R.fail(405, "多仓权限无法操作,请选择仓库"); } return carsLoadService.findLoadInitData(myCurrentWarehouse.getId()); }catch (CustomerException e){ @@ -1053,7 +1057,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if (Objects.isNull(myCurrentWarehouse)) { log.warn(method + "仓库信息为空 myCurrentWarehouse={}", myCurrentWarehouse); - return R.fail(405, "仓库信息为空"); + return R.fail(405, "多仓权限无法操作,请选择仓库"); } return carsLoadService.findLoadFeeByNodeId(loadId,myCurrentWarehouse.getId()); }catch (CustomerException e){ @@ -1092,7 +1096,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if (Objects.isNull(myCurrentWarehouse)) { log.warn(method + "仓库信息为空 myCurrentWarehouse={}", myCurrentWarehouse); - return R.fail(405, "仓库信息为空"); + return R.fail(405, "多仓权限无法操作,请选择仓库"); } if(Objects.isNull(loadId)){ @@ -1170,7 +1174,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1189,6 +1193,21 @@ public class CarsLoadController { } } + @ResponseBody + @PostMapping("/loadingDetailExport") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "装车明细导出", notes = "传入loadCarsDTO") + public void loadingDetailExport(@RequestBody LoadCarsDTO loadCarsDTO, HttpServletResponse response) { + String method = "############loadingDetailExport: "; + log.info(method+"请求参数{}",loadCarsDTO); + TrunklineCarsLoadEntity carsLoadEntity = carsLoadService.getById(loadCarsDTO.getLoadId()); + List ls = carsLoadService.loadingDetailExport(loadCarsDTO); + //导出ls + ExcelUtil.export(response, "装车明细数据"+carsLoadEntity.getCarsNo(), "装车明细", ls, LoadingDetailExportVO.class); + } + + + @ResponseBody @PostMapping("/carsLoadDetailInfo") @ApiOperationSupport(order = 1) @@ -1203,7 +1222,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1236,7 +1255,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1266,7 +1285,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1304,7 +1323,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1368,7 +1387,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1418,7 +1437,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1456,7 +1475,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1493,7 +1512,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1527,7 +1546,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1563,7 +1582,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } batchUnloadDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1605,7 +1624,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1640,7 +1659,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1677,7 +1696,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1716,7 +1735,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1783,7 +1802,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1817,9 +1836,10 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); + loadCarsDTO.setWarehouseName(myCurrentWarehouse.getName()); if(Objects.isNull(loadScanIds) || loadScanIds.size() < 1){ log.warn(method+"批量签收ids为空 loadScanIds={}",loadScanIds); @@ -1852,7 +1872,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(signOrderId)){ @@ -1865,7 +1885,7 @@ public class CarsLoadController { return R.fail(405,"包件码为空"); } - return carsLoadService.signScanPackageCode(signOrderId,orderPackageCode,"PC签收"); + return carsLoadService.signScanPackageCode(signOrderId,orderPackageCode,"PC签收",loadCarsDTO.getWarehouseId()); }catch (CustomerException e){ log.error(e.message,e); return R.fail(e.code,e.message); @@ -1893,7 +1913,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(signOrderId)){ @@ -1931,7 +1951,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -1965,7 +1985,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -1999,7 +2019,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -2032,7 +2052,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -2069,7 +2089,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -2103,7 +2123,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -2136,7 +2156,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -2169,7 +2189,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); if(Objects.isNull(loadId)){ @@ -2201,7 +2221,7 @@ public class CarsLoadController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -2266,6 +2286,96 @@ public class CarsLoadController { } } + @ResponseBody + @PostMapping("/findWarehouseUnloadReport") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询运配载节点卸车报告", notes = "传入loadCarsDTO") + public R findWarehouseUnloadReport(@RequestBody LoadCarsDTO loadCarsDTO) { + String method = "############findWarehouseUnloadReport: "; + log.info(method + "请求参数{}", loadCarsDTO); + Long loadId = loadCarsDTO.getLoadId(); + try{ + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); + return R.fail(405,"多仓权限无法操作,请选择仓库"); + } + loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); + if(ObjectUtil.isNull(loadId)){ + log.warn(method+"配载id为空 loadId={}",loadId); + return R.fail(405,"配载id为空"); + } + + return carsLoadService.findWarehouseUnloadReport(loadCarsDTO); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + + @ResponseBody + @PostMapping("/findSignOrderPageList") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询签收单分页列表", notes = "传入loadCarsDTO") + public R findSignOrderPageList(@RequestBody LoadCarsDTO loadCarsDTO) { + String method = "############findSignOrderPageList: "; + log.info(method + "请求参数{}", loadCarsDTO); + try{ + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); + return R.fail(405,"多仓权限无法操作,请选择仓库"); + } + loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); + + return carsLoadService.findSignOrderPageList(loadCarsDTO); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + + + @ResponseBody + @PostMapping("/findSignPhotoList") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询签收单图片列表", notes = "传入loadCarsDTO") + public R findSignPhotoList(@RequestBody LoadCarsDTO loadCarsDTO) { + String method = "############findSignPhotoList: "; + log.info(method + "请求参数{}", loadCarsDTO); + Long signOrderId = loadCarsDTO.getSignOrderId(); + try{ + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); + return R.fail(405,"多仓权限无法操作,请选择仓库"); + } + loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); + if(Objects.isNull(signOrderId)){ + log.warn(method+"签收单id为空 signOrderId={}",signOrderId); + return R.fail(405,"签收单id为空"); + } + + return carsLoadService.findSignPhotoList(loadCarsDTO); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/IncomingController.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/IncomingController.java index 178dd7c72..29cf7c22e 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/IncomingController.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/IncomingController.java @@ -42,7 +42,7 @@ public class IncomingController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"当前仓库信息为空"); - return R.fail(405,"请先选择仓库"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } inComingDTO.setWarehouseId(myCurrentWarehouse.getId()); inComingDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -56,6 +56,7 @@ public class IncomingController { log.warn(method+"入库方式不正确 incomingType={}",incomingType); return R.fail(405,"入库方式不正确"); } + return inComingService.findIncomingOrderList(inComingDTO); }catch (CustomerException e){ log.error(e.message,e); @@ -79,7 +80,7 @@ public class IncomingController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"当前仓库信息为空"); - return R.fail(405,"请先选择仓库"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } inComingDTO.setWarehouseId(myCurrentWarehouse.getId()); inComingDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -90,7 +91,7 @@ public class IncomingController { } - return inComingService.incomingBatchOrder(inComingDTO); + return inComingService.incomingBatchOrder(inComingDTO,null); }catch (CustomerException e){ log.error(e.message,e); return R.fail(e.code,e.message); diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/OpenOrderController.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/OpenOrderController.java index 28766d35b..0f16d25bf 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/OpenOrderController.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/OpenOrderController.java @@ -1,7 +1,6 @@ package com.logpm.trunkline.controller; import cn.hutool.core.collection.CollUtil; -import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; @@ -10,7 +9,7 @@ import com.logpm.trunkline.dto.AdvanceDTO; import com.logpm.trunkline.dto.OpenLabelDTO; import com.logpm.trunkline.dto.OpenOrderDTO; import com.logpm.trunkline.dto.WaybillDetailDTO; -import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import com.logpm.trunkline.service.ICarsLoadAsyncService; import com.logpm.trunkline.service.IOpenOrderService; import com.logpm.trunkline.service.ITrunklineCarsLoadService; import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; @@ -26,6 +25,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -39,6 +39,7 @@ public class OpenOrderController { private final IBasicdataWarehouseClient warehouseClient; private final IOpenOrderService openOrderService; private final ITrunklineCarsLoadService carsLoadService; + private final ICarsLoadAsyncService carsLoadAsyncService; @ResponseBody @PostMapping("/advancePageList") @@ -101,7 +102,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } advanceDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -136,7 +137,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } advanceDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -177,7 +178,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } advanceDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -217,7 +218,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(405,"仓库信息为空"); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } advanceDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -254,7 +255,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } advanceDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -289,7 +290,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } if(advanceIds.isEmpty()){ @@ -324,7 +325,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } if(advanceIds.isEmpty()){ @@ -356,7 +357,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } if(advanceIds.isEmpty()){ @@ -388,7 +389,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } openOrderDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -418,7 +419,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } return openOrderService.openZeroWaybillInfo(myCurrentWarehouse.getId()); @@ -445,7 +446,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } return openOrderService.findPayWayByClientId(clientId); @@ -472,7 +473,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } openOrderDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -573,6 +574,13 @@ public class OpenOrderController { throw new CustomerException(405,"发站仓不属于当前仓"); } + Long brandId = openOrderDTO.getBrandId(); + String brand = openOrderDTO.getBrand(); + if(Objects.isNull(brandId) || StringUtil.isBlank(brand)){ + log.warn("#################openZeroOrderParamVerify: 品牌不能为空 brandId={} brand={}",brandId,brand); + throw new CustomerException(405,"品牌不能为空"); + } + Long destinationWarehouseId = openOrderDTO.getDestinationWarehouseId(); String destinationWarehouseName = openOrderDTO.getDestinationWarehouseName(); if(Objects.isNull(destinationWarehouseId) && StringUtil.isBlank(destinationWarehouseName)){ @@ -639,14 +647,14 @@ public class OpenOrderController { // } BigDecimal subtotalFreight = waybillDetailDTO.getSubtotalFreight(); - if(subtotalFreight.compareTo(BigDecimal.ZERO) <= 0){ + if(subtotalFreight.compareTo(BigDecimal.ZERO) < 0){ log.warn("#################openZeroOrderParamVerify: 货物运费小计不正确 subtotalFreight={} ",subtotalFreight); throw new CustomerException(405,"货物运费小计不正确"); } } BigDecimal totalFreight = openOrderDTO.getTotalFreight(); - if(totalFreight.compareTo(BigDecimal.ZERO) <= 0){ + if(totalFreight.compareTo(BigDecimal.ZERO) < 0){ log.warn("#################openZeroOrderParamVerify: 运费不正确 totalFreight={} ",totalFreight); throw new CustomerException(405,"运费不正确"); } @@ -916,14 +924,14 @@ public class OpenOrderController { // } BigDecimal subtotalFreight = waybillDetailDTO.getSubtotalFreight(); - if(subtotalFreight.compareTo(BigDecimal.ZERO) <= 0){ + if(subtotalFreight.compareTo(BigDecimal.ZERO) < 0){ log.warn("#################openOrderParamVerify: 货物运费小计不正确 subtotalFreight={} ",subtotalFreight); throw new CustomerException(405,"货物运费小计不正确"); } } BigDecimal totalFreight = openOrderDTO.getTotalFreight(); - if(totalFreight.compareTo(BigDecimal.ZERO) <= 0){ + if(totalFreight.compareTo(BigDecimal.ZERO) < 0){ log.warn("#################openOrderParamVerify: 运费不正确 totalFreight={} ",totalFreight); throw new CustomerException(405,"运费不正确"); } @@ -977,7 +985,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } openLabelDTO.setWarehouseId(myCurrentWarehouse.getId()); openLabelDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -1003,8 +1011,15 @@ public class OpenOrderController { log.warn(method+"订单号为空 orderCode={}",orderCode); throw new CustomerException(405,"订单号为空"); } + + String brand = openLabelDTO.getBrand(); + if(StringUtil.isBlank(brand)){ + log.warn(method+"品牌为空 brand={}",brand); + throw new CustomerException(405,"品牌为空"); + } + Integer totalNumber = openLabelDTO.getTotalNumber(); - if(totalNumber == 0){ + if(totalNumber == 0 && !"曼好家".equals(brand)){ log.warn(method+"总数量不正确 totalNumber={}",totalNumber); throw new CustomerException(405,"总数量不正确"); } @@ -1013,11 +1028,7 @@ public class OpenOrderController { log.warn(method+"一级品类为空 firsts={}",firsts); throw new CustomerException(405,"一级品类为空"); } - String brand = openLabelDTO.getBrand(); - if(StringUtil.isBlank(brand)){ - log.warn(method+"品牌为空 brand={}",brand); - throw new CustomerException(405,"品牌为空"); - } + String dealerName = openLabelDTO.getDealerName(); if(StringUtil.isBlank(dealerName)){ log.warn(method+"商场为空 dealerName={}",dealerName); @@ -1055,10 +1066,10 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } - return openOrderService.batchOpenLabel(myCurrentWarehouse.getId(),myCurrentWarehouse.getName(),file); + return openOrderService.batchOpenLabel(myCurrentWarehouse.getId(),myCurrentWarehouse.getName(),myCurrentWarehouse.getWarehouseCode(),file); }catch (CustomerException e){ log.error(e.message,e); return R.fail(e.code,e.message); @@ -1082,18 +1093,10 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); - } - - R> listR = openOrderService.openLabelHasPacakage(myCurrentWarehouse.getId(),myCurrentWarehouse.getName(),file); - List data = listR.getData(); - if(!CollUtil.isEmpty(data)){ - for (TrunklineAdvanceEntity datum : data) { - carsLoadService.sendRabbitMessageLoadScanData(JSONUtil.toJsonStr(datum)); - } + return R.fail(403,"多仓权限无法操作,请选择仓库"); } - return listR; + return openOrderService.openLabelHasPacakage(myCurrentWarehouse.getId(),myCurrentWarehouse.getName(),file); }catch (CustomerException e){ log.error(e.message,e); return R.fail(e.code,e.message); @@ -1116,18 +1119,10 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } - R> listR = openOrderService.importOrderNoPackage(myCurrentWarehouse.getId(),myCurrentWarehouse.getName(),file); -// List data = listR.getData(); -// if(!CollUtil.isEmpty(data)){ -// for (TrunklineAdvanceEntity datum : data) { -// carsLoadService.sendRabbitMessageLoadScanData(JSONUtil.toJsonStr(datum)); -// } -// } - - return listR; + return openOrderService.importOrderNoPackage(myCurrentWarehouse.getId(),myCurrentWarehouse.getName(),myCurrentWarehouse.getWarehouseCode(),file); }catch (CustomerException e){ log.error(e.message,e); return R.fail(e.code,e.message); @@ -1153,17 +1148,10 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } - R> listR = openOrderService.importCustomizedOuPai(myCurrentWarehouse.getId(), myCurrentWarehouse.getName(), file); - List data = listR.getData(); - if(!CollUtil.isEmpty(data)){ - for (TrunklineAdvanceEntity datum : data) { - carsLoadService.sendRabbitMessageLoadScanData(JSONUtil.toJsonStr(datum)); - } - } - return listR; + return openOrderService.importCustomizedOuPai(myCurrentWarehouse.getId(), myCurrentWarehouse.getName(), file); }catch (CustomerException e){ log.error(e.message,e); return R.fail(e.code,e.message); @@ -1187,17 +1175,10 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } - R> listR = openOrderService.importStandardOuPai(myCurrentWarehouse.getId(),myCurrentWarehouse.getName(),file); - List data = listR.getData(); - if(!CollUtil.isEmpty(data)){ - for (TrunklineAdvanceEntity datum : data) { - carsLoadService.sendRabbitMessageLoadScanData(JSONUtil.toJsonStr(datum)); - } - } - return listR; + return openOrderService.importStandardOuPai(myCurrentWarehouse.getId(),myCurrentWarehouse.getName(),file); }catch (CustomerException e){ log.error(e.message,e); return R.fail(e.code,e.message); @@ -1216,14 +1197,14 @@ public class OpenOrderController { String method = "############findWaybillDetail: "; log.info(method + "请求参数{}", openOrderDTO); Long waybillId = openOrderDTO.getWaybillId(); - + Integer isEdit = openOrderDTO.getIsEdit(); try{ //当前登录人选择的仓库 BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } openOrderDTO.setWarehouseId(myCurrentWarehouse.getId()); openOrderDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -1233,6 +1214,11 @@ public class OpenOrderController { return R.fail(403,"运单号id为空"); } + if (Objects.isNull(isEdit)){ + log.warn(method+"查看类型为空 isEdit={}",isEdit); + return R.fail(403,"查看类型为空"); + } + return openOrderService.findWaybillDetail(openOrderDTO); }catch (CustomerException e){ log.error(e.message,e); @@ -1258,7 +1244,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } openOrderDTO.setWarehouseId(myCurrentWarehouse.getId()); openOrderDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -1297,7 +1283,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } openOrderDTO.setWarehouseId(myCurrentWarehouse.getId()); openOrderDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -1335,7 +1321,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } openOrderDTO.setWarehouseId(myCurrentWarehouse.getId()); openOrderDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -1367,7 +1353,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } openOrderDTO.setWarehouseId(myCurrentWarehouse.getId()); openOrderDTO.setWarehouseName(myCurrentWarehouse.getName()); @@ -1399,7 +1385,7 @@ public class OpenOrderController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(403,"仓库信息为空"); + return R.fail(403,"多仓权限无法操作,请选择仓库"); } openOrderDTO.setWarehouseId(myCurrentWarehouse.getId()); @@ -1589,13 +1575,52 @@ public class OpenOrderController { log.info(method + "请求参数{}", openOrderDTO); Long waybillId = openOrderDTO.getWaybillId(); try{ + List warehouseIds = new ArrayList<>(); + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + List myWatchWarehouse = warehouseClient.getMyWatchWarehouse(); + //循环myWatchWarehouse,把id存入warehouseIds中 + myWatchWarehouse.forEach(basicdataWarehouseEntity -> { + warehouseIds.add(basicdataWarehouseEntity.getId()); + }); + }else{ + warehouseIds.add(myCurrentWarehouse.getId()); + } + openOrderDTO.setWarehouseIds(warehouseIds); - if(Objects.isNull(waybillId)){ - log.warn(method+"运单id为空 waybillId={}",waybillId); - return R.fail(405,"运单id为空"); + return openOrderService.findUpdateWaybillList(openOrderDTO); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + + @ResponseBody + @PostMapping("/freezeWaybill") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "冻结运单", notes = "传入openOrderDTO") + public R freezeWaybill(@RequestBody OpenOrderDTO openOrderDTO) { + String method = "############freezeWaybill: "; + log.info(method + "请求参数{}", openOrderDTO); + List waybillIds = openOrderDTO.getWaybillIds(); + try{ + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + log.warn(method+"请选择仓库 myCurrentWarehouse={}",myCurrentWarehouse); + return R.fail(405,"多仓权限无法操作,请选择仓库"); } - return openOrderService.findWaybillReturnList(waybillId); + + if(CollUtil.isEmpty(waybillIds)){ + log.warn(method+"运单ids为空 waybillIds={}",waybillIds); + return R.fail(405,"运单ids为空"); + } + + return openOrderService.freezeWaybill(waybillIds,myCurrentWarehouse.getId(),myCurrentWarehouse.getName()); }catch (CustomerException e){ log.error(e.message,e); return R.fail(e.code,e.message); @@ -1605,6 +1630,107 @@ public class OpenOrderController { } } + @ResponseBody + @PostMapping("/unFreezeWaybill") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "解冻运单", notes = "传入openOrderDTO") + public R unFreezeWaybill(@RequestBody OpenOrderDTO openOrderDTO) { + String method = "############unFreezeWaybill: "; + log.info(method + "请求参数{}", openOrderDTO); + List waybillIds = openOrderDTO.getWaybillIds(); + try{ + + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + log.warn(method+"请选择仓库 myCurrentWarehouse={}",myCurrentWarehouse); + return R.fail(405,"多仓权限无法操作,请选择仓库"); + } + + if(CollUtil.isEmpty(waybillIds)){ + log.warn(method+"运单ids为空 waybillIds={}",waybillIds); + return R.fail(405,"运单ids为空"); + } + + return openOrderService.unFreezeWaybill(waybillIds,myCurrentWarehouse.getId(),myCurrentWarehouse.getName()); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + + @ResponseBody + @PostMapping("/abolishWaybill") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "作废运单", notes = "传入openOrderDTO") + public R abolishWaybill(@RequestBody OpenOrderDTO openOrderDTO) { + String method = "############abolishWaybill: "; + log.info(method + "请求参数{}", openOrderDTO); + List waybillIds = openOrderDTO.getWaybillIds(); + String abolishReson = openOrderDTO.getAbolishReson(); + try{ + + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + log.warn(method+"请选择仓库 myCurrentWarehouse={}",myCurrentWarehouse); + return R.fail(405,"多仓权限无法操作,请选择仓库"); + } + + if(CollUtil.isEmpty(waybillIds)){ + log.warn(method+"运单ids为空 waybillIds={}",waybillIds); + return R.fail(405,"运单ids为空"); + } + + if(StringUtil.isBlank(abolishReson)){ + log.warn(method+"请填写作废原因 abolishReson={}",abolishReson); + return R.fail(405,"请填写作废原因"); + } + + return openOrderService.abolishWaybill(waybillIds,myCurrentWarehouse.getId(),myCurrentWarehouse.getName(),abolishReson); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + + @ResponseBody + @PostMapping("/findWaybillDes") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询运单目的仓", notes = "传入openOrderDTO") + public R findWaybillDes(@RequestBody OpenOrderDTO openOrderDTO) { + String method = "############findWaybillDes: "; + log.info(method + "请求参数{}", openOrderDTO); + Long departureWarehouseId = openOrderDTO.getDepartureWarehouseId(); + Long consigneeId = openOrderDTO.getConsigneeId(); + + + try{ + + if(Objects.isNull(departureWarehouseId)){ + log.warn(method+"发站仓id为空 departureWarehouseId={}",departureWarehouseId); + return R.fail(405,"发站仓id为空"); + } + if(Objects.isNull(consigneeId)){ + log.warn(method+"收货单位id不能为空 consigneeId={}",consigneeId); + return R.fail(405,"收货单位id不能为空"); + } + + return openOrderService.findWaybillDes(departureWarehouseId,consigneeId); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/TripartiteTransferController.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/TripartiteTransferController.java index 123aedc44..e3a5d7ea8 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/TripartiteTransferController.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/controller/TripartiteTransferController.java @@ -75,7 +75,7 @@ public class TripartiteTransferController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } verifySaveNewTripartiteTransfer(carsLoadDTO); @@ -189,7 +189,7 @@ public class TripartiteTransferController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } if(Objects.isNull(loadId)){ log.warn(method+"三方中转id为空 loadId={}",loadId); @@ -221,7 +221,7 @@ public class TripartiteTransferController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } if(Objects.isNull(loadId)){ log.warn(method+"三方中转id为空 loadId={}",loadId); @@ -254,7 +254,7 @@ public class TripartiteTransferController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } if(Objects.isNull(loadId)){ log.warn(method+"三方中转id为空 loadId={}",loadId); @@ -290,7 +290,7 @@ public class TripartiteTransferController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } if(Objects.isNull(loadId)){ log.warn(method+"三方中转id为空 loadId={}",loadId); @@ -323,7 +323,7 @@ public class TripartiteTransferController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } return carsLoadService.signLoadScanByIds(loadScanIds,myCurrentWarehouse.getId()); @@ -352,7 +352,7 @@ public class TripartiteTransferController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } if(Objects.isNull(loadId)){ log.warn(method+"三方中转id为空 loadId={}",loadId); @@ -399,7 +399,7 @@ public class TripartiteTransferController { BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); - return R.fail(400,"仓库信息为空"); + return R.fail(400,"多仓权限无法操作,请选择仓库"); } if(Objects.isNull(loadId)){ @@ -468,6 +468,59 @@ public class TripartiteTransferController { } } + @ResponseBody + @PostMapping("/tripartiteTransferFindSignPhoto") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "三方中转签收图片列表", notes = "传入loadCarsDTO") + public R tripartiteTransferFindSignPhoto(@RequestBody LoadCarsDTO loadCarsDTO) { + String method = "############tripartiteTransferFindSignPhoto: "; + log.info(method+"请求参数{}",loadCarsDTO); + try{ + +// //当前登录人选择的仓库 +// BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); +// if(!Objects.isNull(myCurrentWarehouse)){ +// loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); +// } +// +// IPage pages = carsLoadService.tripartiteTransferPageList(loadCarsDTO); + + return carsLoadService.tripartiteTransferFindSignPhoto(loadCarsDTO); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } + + @ResponseBody + @PostMapping("/tripartiteTransferUploadSignPhoto") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "三方中转签收图片上传", notes = "传入loadCarsDTO") + public R tripartiteTransferUploadSignPhoto(@RequestBody LoadCarsDTO loadCarsDTO) { + String method = "############tripartiteTransferUploadSignPhoto: "; + log.info(method+"请求参数{}",loadCarsDTO); + try{ + +// //当前登录人选择的仓库 +// BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); +// if(!Objects.isNull(myCurrentWarehouse)){ +// loadCarsDTO.setWarehouseId(myCurrentWarehouse.getId()); +// } +// +// IPage pages = carsLoadService.tripartiteTransferPageList(loadCarsDTO); + + return carsLoadService.tripartiteTransferUploadSignPhoto(loadCarsDTO); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + return R.fail(500,"系统异常"); + } + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/dto/LoadScanBrandDTO.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/dto/LoadScanBrandDTO.java index 274d33434..2773d7268 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/dto/LoadScanBrandDTO.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/dto/LoadScanBrandDTO.java @@ -18,6 +18,14 @@ public class LoadScanBrandDTO implements Serializable { * 包件码 */ private String packageCode; + /** + * 订单 + */ + private String orderCode; + /** + * 运单 + */ + private String waybillNumber; /** * 始发仓 */ diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/dto/OrderDetailsDTO.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/dto/OrderDetailsDTO.java new file mode 100644 index 000000000..e3c7b15f8 --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/dto/OrderDetailsDTO.java @@ -0,0 +1,43 @@ +package com.logpm.trunkline.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class OrderDetailsDTO implements Serializable { + + private Integer pageSize; + private Integer pageNum; + private Long warehouseId; + private String warehouseName; + + private Integer packageStatus;//是否入库 0未入库 1已入库 + + private Integer isGcp;//是否干仓配 0否 1是 + + private String orderCode;//订单好 + + private String waybillNo;//运单号 + + private String orderPackageCode;//包件码 + + private String brand; + + private String firsts;//一级品类 + private String sencods;//二级品类 + private String thirds;//三级品类 + private String trainNumber;//客户号车次号 + private String serviceNumber;//服务号 + private String trunklineCarsNo;//干线车次号 + private String deliveryTrainNumber;//配送车次号 + private String nowWarehouseId;//当前所在仓iD + private String sendDateStr;//发货时间 + private String createUserName;//创建人 + private Date createTimeStart;//创建时间 + private String createTimeStartStr;//创建时间 + private String createTimeEndStr;//创建时间 + private Date createTimeEnd;//创建时间 + +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/dto/OrderStatusDTO.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/dto/OrderStatusDTO.java new file mode 100644 index 000000000..387b8056f --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/dto/OrderStatusDTO.java @@ -0,0 +1,111 @@ +/* + * 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.trunkline.dto; + +import lombok.Data; +import org.springblade.core.tool.utils.StringUtil; + +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + +/** + * OrderStatus + * + * @author zhy + * @since 2023-06-12 + */ +@Data +public class OrderStatusDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @NotEmpty(message = "派车单号不能为空") + private String dispatchNumber;//派车单号 + + @NotEmpty(message = "客户订单号不能为空") + private String orderNo;//客户订单号 + + @NotEmpty(message = "工厂ID不能为空") + private String plantId;//工厂ID + + @NotEmpty(message = "物流单号不能为空") + private String logiBillNo;//物流单号 + + @NotEmpty(message = "包件码不能为空") + private String unitNo;//包件码 + + @NotEmpty(message = "操作时间不能为空") + private String operationTime;//操作时间 + + @NotEmpty(message = "当前仓库不能为空") + private String currentWarehouse;//当前仓库 + + @NotEmpty(message = "目的仓库不能为空") + private String destinationWarehouse;//目的仓库 + + @NotEmpty(message = "状态不能为空") + private String status;//状态 + + @NotEmpty(message = "送货任务ID不能为空") + private String distributionContactId; + + @NotEmpty(message = "托盘id") + private Integer trayId; + + @NotEmpty(message = "托盘编码") + private String trayNo; + + @NotEmpty(message = "操作人名称") + private String username; + + + /** + * 验证参数是否都存在 + * @return + */ + public boolean verifyData(){ + if(StringUtil.isBlank(dispatchNumber)){ + return false; + } + if(StringUtil.isBlank(orderNo)){ + return false; + } + if(StringUtil.isBlank(plantId)){ + return false; + } + if(StringUtil.isBlank(logiBillNo)){ + return false; + } + if(StringUtil.isBlank(unitNo)){ + return false; + } + if(StringUtil.isBlank(operationTime)){ + return false; + } + if(StringUtil.isBlank(currentWarehouse)){ + return false; + } + if(StringUtil.isBlank(destinationWarehouse)){ + return false; + } + if(StringUtil.isBlank(status)){ + return false; + } + return !StringUtil.isBlank(distributionContactId); + } + + +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/InComingClient.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/InComingClient.java new file mode 100644 index 000000000..fdbff1cae --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/InComingClient.java @@ -0,0 +1,22 @@ +package com.logpm.trunkline.feign; + +import com.logpm.trunkline.dto.InComingDTO; +import com.logpm.trunkline.service.IInComingService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.annotations.ApiIgnore; + +@Slf4j +@ApiIgnore() +@RestController +@AllArgsConstructor +public class InComingClient implements IInComingClient{ + private final IInComingService inComingService; + @Override + public R incomingPackageByTaryCode(InComingDTO inComingDTO) { + + return inComingService.incomingPackageByTaryCode(inComingDTO); + } +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineAdvanceClient.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineAdvanceClient.java index 93e0c4e8e..8b8e6ba8c 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineAdvanceClient.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineAdvanceClient.java @@ -1,5 +1,7 @@ package com.logpm.trunkline.feign; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.trunkline.dto.CancelOrderParamVO; import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import com.logpm.trunkline.service.ITrunklineAdvanceService; import lombok.AllArgsConstructor; @@ -7,6 +9,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; +import java.util.List; + @Slf4j @ApiIgnore() @RestController @@ -23,4 +27,26 @@ public class TrunklineAdvanceClient implements ITrunklineAdvanceClient{ } return trunklineAdvanceEntity.getId(); } + + @Override + public TrunklineAdvanceEntity findAdvanceLimitOneByOrderCode(String orderCode) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_code",orderCode) + .last("limit 1"); + return advanceService.getOne(queryWrapper); + } + + @Override + public List findListByIds(List collect) { + + + + + return advanceService.findListByIds(collect); + } + + @Override + public Boolean cancelOrder(CancelOrderParamVO orderCode) { + return advanceService.cancelOrder(orderCode.getOrderCode()); + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineAdvanceDetailClient.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineAdvanceDetailClient.java index e4f9572a2..ff564343c 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineAdvanceDetailClient.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineAdvanceDetailClient.java @@ -2,6 +2,7 @@ package com.logpm.trunkline.feign; import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; import com.logpm.trunkline.service.ITrunklineAdvanceDetailService; +import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RestController; @@ -21,4 +22,14 @@ public class TrunklineAdvanceDetailClient implements ITrunklineAdvanceDetailClie public void addAdvanceBatch(List advanceDetailEntities) { advanceDetailService.saveBatch(advanceDetailEntities); } + + @Override + public List findListByAdvanceIds(List collect) { + return advanceDetailService.findAdvanceDetailVoByAdvanceIds(collect); + } + + @Override + public TrunklineAdvanceDetailEntity findEntityByOrderPackageCode(String orderPackageCode) { + return advanceDetailService.findEntityByOrderPackageCode(orderPackageCode); + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineCarsLoadClient.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineCarsLoadClient.java new file mode 100644 index 000000000..abc700623 --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineCarsLoadClient.java @@ -0,0 +1,23 @@ +package com.logpm.trunkline.feign; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.trunkline.entity.TrunklineCarsLoadEntity; +import com.logpm.trunkline.service.ITrunklineCarsLoadService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@AllArgsConstructor +public class TrunklineCarsLoadClient implements ITrunklineCarsLoadClient{ + + private final ITrunklineCarsLoadService carsLoadService; + + @Override + public TrunklineCarsLoadEntity findEntityByCarsNo(String carsNo) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("cars_no",carsNo); + return carsLoadService.getOne(queryWrapper); + } +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineCarsLoadScanClient.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineCarsLoadScanClient.java index d3b973efa..ab684949b 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineCarsLoadScanClient.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineCarsLoadScanClient.java @@ -25,4 +25,9 @@ public class TrunklineCarsLoadScanClient implements ITrunklineCarsLoadScanClient public R incomingPackage(Long carsLoadScanId) { return trunklineCarsLoadService.syncIncomingPackage(carsLoadScanId); } + + @Override + public R adnormalHasStock(Long carsLoadScanId, Long warehouseId) { + return trunklineCarsLoadService.adnormalHasStock(carsLoadScanId,warehouseId); + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklinePackageTrackLogClient.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklinePackageTrackLogClient.java new file mode 100644 index 000000000..929d98e3c --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklinePackageTrackLogClient.java @@ -0,0 +1,51 @@ +package com.logpm.trunkline.feign; + +import com.alibaba.fastjson.JSONObject; +import com.logpm.trunkline.service.IPackageTrackLogAsyncService; +import com.logpm.warehouse.entity.WarehousePackageTrackLogEntity; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.annotations.ApiIgnore; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@Slf4j +@ApiIgnore() +@RestController +@AllArgsConstructor +public class TrunklinePackageTrackLogClient implements ITrunklinePackageTrackLogClient { + + private final IPackageTrackLogAsyncService packageTrackLogAsyncService; + + @Override + public void addPackageTrackLog(List addPackageTrackLogList) { + List ls = new ArrayList<>(); + List orderPackageCodes = new ArrayList<>(); + final Integer[] workNode = {null}; + Map map = new HashMap<>(); + addPackageTrackLogList.forEach(jsonObject -> { + WarehousePackageTrackLogEntity warehousePackageTrackLogEntity = jsonObject.toJavaObject(WarehousePackageTrackLogEntity.class); + JSONObject js = new JSONObject(); + if (jsonObject.containsKey("trainNumber")) { + js.put("trainNumber", jsonObject.getString("trainNumber")); + } + if(jsonObject.containsKey("warehouseEntryTimeEnd")){ + js.put("warehouseEntryTimeEnd", jsonObject.getString("warehouseEntryTimeEnd")); + } + map.put(warehousePackageTrackLogEntity.getOrderPackageCode(), js); + orderPackageCodes.add(warehousePackageTrackLogEntity.getOrderPackageCode()); + if (Objects.isNull(workNode[0])) { + workNode[0] = warehousePackageTrackLogEntity.getWorkNode(); + } + ls.add(warehousePackageTrackLogEntity); + }); + + packageTrackLogAsyncService.addBatchPackageTrackLog(ls, orderPackageCodes, workNode[0], map); + + } +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineWaybillOrderClient.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineWaybillOrderClient.java index 005016eee..c96d5a130 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineWaybillOrderClient.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineWaybillOrderClient.java @@ -1,5 +1,6 @@ package com.logpm.trunkline.feign; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.logpm.trunkline.entity.TrunklineWaybillOrderEntity; import com.logpm.trunkline.service.ITrunklineWaybillOrderService; @@ -34,4 +35,13 @@ public class TrunklineWaybillOrderClient implements ITrunklineWaybillOrderClient } return trunklineWaybillOrderEntity.getId(); } + + @Override + public List findListByWaybillIds(List waybillIds) { + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(TrunklineWaybillOrderEntity::getWaybillId,waybillIds); + + return waybillOrderService.list(lambdaQueryWrapper); + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineWaybillPackageClient.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineWaybillPackageClient.java new file mode 100644 index 000000000..0b76b097f --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/feign/TrunklineWaybillPackageClient.java @@ -0,0 +1,31 @@ +package com.logpm.trunkline.feign; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.logpm.trunkline.entity.TrunklineWaybillPackageEntity; +import com.logpm.trunkline.service.ITrunklineWaybillPackageService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.annotations.ApiIgnore; + +import java.util.List; +@Slf4j +@ApiIgnore() +@RestController +@AllArgsConstructor +public class TrunklineWaybillPackageClient implements ITrunklineWaybillPackageClient{ + private final ITrunklineWaybillPackageService trunklineWaybillPackageService; + @Override + public List findListByWaybillIds(List waybillIds) { + + LambdaQueryWrapper lambdaQueryWrapper =new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(TrunklineWaybillPackageEntity::getWaybillId,waybillIds); + + return trunklineWaybillPackageService.list(lambdaQueryWrapper); + } + + @Override + public void addEntity(TrunklineWaybillPackageEntity trunklineWaybillPackageEntity) { + trunklineWaybillPackageService.save(trunklineWaybillPackageEntity); + } +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/interceptor/ParameterCombinationInterceptor.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/interceptor/ParameterCombinationInterceptor.java new file mode 100644 index 000000000..2d33c9e4e --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/interceptor/ParameterCombinationInterceptor.java @@ -0,0 +1,66 @@ +package com.logpm.trunkline.interceptor; + +import org.apache.commons.codec.digest.DigestUtils; +import org.springblade.common.annotations.RepeatSubmit; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; +import java.util.stream.Collectors; + +@Component +public class ParameterCombinationInterceptor implements HandlerInterceptor { + + private static final ThreadLocal PROCESSED_REQUEST_HASH = new ThreadLocal<>(); + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (handler instanceof HandlerMethod) { + HandlerMethod hm = (HandlerMethod) handler; + RepeatSubmit annotation = hm.getMethodAnnotation(RepeatSubmit.class); + if (annotation != null) { + // 计算当前请求参数的MD5哈希值 + String currentRequestHash = calculateRequestHash(request.getParameterMap()); + // 检查是否已处理过相同参数组合的请求 + if (PROCESSED_REQUEST_HASH.get() != null && PROCESSED_REQUEST_HASH.get().equals(currentRequestHash)) { + // 阻止重复提交 + response.sendError(HttpServletResponse.SC_CONFLICT, "Duplicate submit detected"); + return false; + } + // 保存当前请求的哈希值 + PROCESSED_REQUEST_HASH.set(currentRequestHash); + } + } + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + // 清理当前请求的哈希值 + PROCESSED_REQUEST_HASH.remove(); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + // 可选清理操作,postHandle中已处理 + } + + /** + * 计算请求参数的MD5哈希值。 + * @param parameters 请求参数Map + * @return 参数哈希值字符串 + */ + private String calculateRequestHash(Map parameters) { + // 将参数按key排序并拼接为字符串 + String sortedParams = parameters.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .map(entry -> entry.getKey() + "=" + String.join(",", entry.getValue())) + .collect(Collectors.joining("&")); + // 计算并返回MD5摘要 + return DigestUtils.md5Hex(sortedParams); + } +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceDetailMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceDetailMapper.java index cc6e1d5a5..a48a34efb 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceDetailMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceDetailMapper.java @@ -3,21 +3,22 @@ package com.logpm.trunkline.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.trunkline.dto.AdvanceDetailDTO; +import com.logpm.trunkline.dto.OrderDetailsDTO; import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; -import com.logpm.trunkline.vo.AdvanceDetailGoodsVO; -import com.logpm.trunkline.vo.AdvanceDetailStockNumVO; -import com.logpm.trunkline.vo.BillladingPackageVO; -import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; +import com.logpm.trunkline.vo.*; +import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Set; @Mapper public interface TrunklineAdvanceDetailMapper extends BaseMapper { - void updatePackageStatusById(@Param("packageStatus") String packageStatus, @Param("advanceDetailId") Long advanceDetailId, @Param("warehouseId") Long warehouseId,@Param("warehouseName") String warehouseName); + void updatePackageStatusById(@Param("packageStatus") String packageStatus, @Param("advanceDetailId") Long advanceDetailId, @Param("warehouseId") Long warehouseId, @Param("warehouseName") String warehouseName, @Param("incomingTime") Date incomingTime); List findList(@Param("advanceId") Long advanceId); @@ -57,6 +58,18 @@ public interface TrunklineAdvanceDetailMapper extends BaseMapper类型的集合,包含与输入订单包裹代码相匹配的包裹编码。 * 如果没有找到匹配的包裹编码,则返回一个空集合。 */ - List findPackageCodeByCodes(@Param("orderPackageCodes") Set orderPackageCodes); + List> findPackageCodeByCodes(@Param("orderPackageCodes") Set orderPackageCodes); + IPage findOrderDetails(IPage page, @Param("param") OrderDetailsDTO orderDetailsDTO); + + void updateWaybillNoIsNullByAdvanceIds(@Param("advanceIds") List advanceIds); + + List findListByExistsAndOrderPackageCodes(@Param("orderPackageCodeGroup") List orderPackageCodeGroup); + + List findAdvanceDetailVoByAdvanceIds(@Param("advanceIds") List advanceIds); + + @Delete("delete from trunkline_advance_detail where order_code = #{orderCode}") + void deletedAdvanceByOrderCode(String orderCode); + + void deleteByWaybillNo(@Param("waybillNo") String waybillNo); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceDetailMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceDetailMapper.xml index c6f498d1d..734206167 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceDetailMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceDetailMapper.xml @@ -7,7 +7,8 @@ update logpm_trunkline_advance_detail set package_status = #{packageStatus}, incoming_warehouse_id = #{warehouseId}, - incoming_warehouse_name = #{warehouseName} + incoming_warehouse_name = #{warehouseName}, + incoming_time = #{incomingTime} where id = #{advanceDetailId} @@ -33,7 +34,9 @@ ltad.system_type systemType, ltad.weight weight, ltad.volume volume, - ltad.incoming_warehouse_name incomingWarehouseName + ltad.advance_id advanceId, + ltad.incoming_warehouse_name incomingWarehouseName, + ltad.now_warehouse_name nowWarehouseName from logpm_trunkline_advance_detail ltad left join logpm_trunkline_advance lta on lta.id = ltad.advance_id left join logpm_warehouse_tray_goods lwtg on lwtg.association_value = ltad.order_package_code @@ -160,6 +163,10 @@ delete from logpm_trunkline_advance_detail where id = #{advanceDetailId} + + delete from logpm_trunkline_advance_detail + where waybill_no = #{waybillNo} + - + select t.order_package_code code,t.id id from logpm_trunkline_advance_detail t + where t.is_deleted= 0 and exists( select 1 from ( @@ -212,4 +220,143 @@ ) packageCodes where packageCodes.pid = t.order_package_code) + + + + + update logpm_trunkline_advance_detail + set waybill_no = null, + waybill_id = null + where advance_id in + + #{advanceId} + + + + + + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceMapper.java index c563ccd00..26e5c5633 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceMapper.java @@ -8,6 +8,7 @@ import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import com.logpm.trunkline.vo.CustomerInfoVO; import com.logpm.trunkline.vo.OpenOrderVO; import com.logpm.trunkline.vo.TrunklineAdvanceVO; +import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -37,4 +38,11 @@ public interface TrunklineAdvanceMapper extends BaseMapper findIncomingOrderList(@Param("param") InComingDTO inComingDTO); Integer findAllNumByOrderCode(@Param("orderCode") String orderCode); + + List findListByExistsAndOrderCodeSet(@Param("orderCodeSet") List orderCodeSet); + + @Delete("delete from trunkline_advance where order_code = #{orderCode}") + void deletedAdvanceByOrderCode(String orderCode); + + void deleteByWaybillNo(@Param("waybillNo") String waybillNo); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceMapper.xml index 1e0fade47..57cc82c32 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineAdvanceMapper.xml @@ -15,7 +15,7 @@ select lta.*, lbc.client_name htMallName from logpm_trunkline_advance lta - left join logpm_basicdata_tripartite_mall lbtm on lbtm.tripartite_mall = lta.dealer_name and lbtm.brand_name = lta.brand and lta.dealer_code = lbtm.tripartite_coding + left join logpm_basicdata_tripartite_mall lbtm on lbtm.tripartite_mall = lta.dealer_name and lbtm.brand_name = lta.brand and IFNULL(lta.dealer_code,'') = IFNULL(lbtm.tripartite_coding,'') and lbtm.is_deleted = 0 left join logpm_basicdata_client lbc on lbc.id = lbtm.client_id where lta.is_deleted = 0 and lta.waybill_status = 0 @@ -84,7 +84,9 @@ - select lta.* - from logpm_trunkline_advance lta + select lta.*, + max(IF(ltad.package_status = '0',1,0)) isIncoming + from logpm_trunkline_advance_detail ltad + left join logpm_trunkline_advance lta on lta.id = ltad.advance_id WHERE 1=1 - and lta.warehouse_id = #{param.warehouseId} + and ltad.warehouse_id = #{param.warehouseId} - and lta.train_number = #{param.incomingCode} + and ltad.train_number = #{param.incomingCode} - and lta.order_code in + and ltad.order_code in #{item} + group by lta.id + + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingMapper.java index abea12e70..b1ba3672d 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.trunkline.dto.BillladingDTO; import com.logpm.trunkline.entity.TrunklineBillladingEntity; +import com.logpm.trunkline.entity.TrunklineBillladingLogEntity; import com.logpm.trunkline.vo.TrunklineBillladingDetailListVO; import com.logpm.trunkline.vo.TrunklineBillladingDetailVO; import com.logpm.trunkline.vo.TrunklineBillladingVO; @@ -24,9 +25,11 @@ public interface TrunklineBillladingMapper extends BaseMapper findWaybillListNotBillladingId(IPage page,@Param("param") BillladingDTO billladingDTO); - IPage billladingList(IPage page, @Param("warehouseId") Long warehouseId, @Param("startByDateStr") Date startByDateStr, @Param("endByDateStr") Date endByDateStr); + IPage billladingList(IPage page, @Param("warehouseId") Long warehouseId, @Param("startByDateStr") Date startByDateStr, @Param("endByDateStr") Date endByDateStr,@Param("customerTrain") String customerTrain); List findAdvanceDetailList(@Param("orderCode") String orderCode); - Map billladingNum(@Param("warehouseId") Long warehouseId, @Param("startByDateStr") Date startByDateStr, @Param("endByDateStr") Date endByDateStr); + Map billladingNum(@Param("warehouseId") Long warehouseId, @Param("startByDateStr") Date startByDateStr, @Param("endByDateStr") Date endByDateStr, @Param("customerTrain") String customerTrain); + + List findBillladingLogList(@Param("billladingId") Long billladingId); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingMapper.xml index 31d82ef4a..60364c065 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingMapper.xml @@ -30,9 +30,10 @@ count(DISTINCT ltbl.id) nodeNub, count(DISTINCT ltbw.id) waybillCount from logpm_trunkline_billlading ltb - left join logpm_trunkline_billlading_line ltbl on ltbl.billlading_id = ltb.id + left join logpm_trunkline_billlading_line ltbl on ltbl.billlading_id = ltb.id and ltbl.is_deleted = 0 left join logpm_trunkline_billlading_waybill ltbw on ltbw.billlading_id = ltb.id and ltbw.waybill_no != '————' where ltb.is_deleted = 0 + and ltb.billlading_status != 5 and ltb.warehouse_id = #{param.warehouseId} @@ -79,19 +80,22 @@ carrier_name carrierName, remark remark from logpm_trunkline_billlading - where billlading_status = '2' - + where billlading_status = #{param.billladingStatus} + AND warehouse_id = #{param.warehouseId} + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingPackageMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingPackageMapper.java index 8aa78ecac..fe850c8a4 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingPackageMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingPackageMapper.java @@ -8,10 +8,16 @@ import com.logpm.trunkline.vo.TrunklineBillladingPackageVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + @Mapper public interface TrunklineBillladingPackageMapper extends BaseMapper { IPage findBillladingPackageDetail(IPage page, @Param("param") BillladingDTO billladingDTO); TrunklineBillladingPackageEntity findBillladingPackage(@Param("packageCode") String packageCode); + + List findBillladingPackages(@Param("orderPackageCodes") List orderPackageCodes); + + List findListByBillladingAndWaybillId(@Param("billladingId") Long billladingId, @Param("waybillId") Long waybillId); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingPackageMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingPackageMapper.xml index 266da73c7..83d9c3fd8 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingPackageMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingPackageMapper.xml @@ -64,4 +64,22 @@ + + + + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingWaybillMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingWaybillMapper.java index 4dcf1583e..4383cda82 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingWaybillMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingWaybillMapper.java @@ -3,6 +3,7 @@ package com.logpm.trunkline.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.logpm.trunkline.entity.TrunklineBillladingWaybillEntity; import com.logpm.trunkline.entity.TrunklineWaybillOrderEntity; +import com.logpm.trunkline.vo.TrunklineBillladingNumVO; import com.logpm.trunkline.vo.TrunklineBillladingWaybillVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -25,5 +26,9 @@ public interface TrunklineBillladingWaybillMapper extends BaseMapper findNoFinishWaybillByBillladingId(@Param("billladingId") Long billladingId); + + TrunklineBillladingNumVO getNumVOByBillladingId(@Param("billladingId") Long billladingId); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingWaybillMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingWaybillMapper.xml index 0441a8ee0..f8e8ffe2d 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingWaybillMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineBillladingWaybillMapper.xml @@ -40,14 +40,24 @@ lww.consignee_mobile consigneeMobile, lww.consignee_address consigneeAddress, lww.remark remark, - lww.total_count totalCount, - lww.stock_count stockCount, + lww.total_count-lww.billlading_num totalPlanNum, + ltbw.plan_num planNum, + ltbw.real_num realNum, ltbw.billlading_fee billladingFee, - lww.collect_pay collectPay + lww.collect_pay collectPay, + t.num scanNum from logpm_trunkline_billlading_waybill ltbw - left join logpm_trunkline_billlading ltb on ltb.id = ltbw.billlading_id - left join logpm_warehouse_waybill lww on lww.waybill_no = ltbw.waybill_no + left join (select IFNULL(ltad.waybill_no,'————') waybillNo, + COUNT(ltbp.id) num + from logpm_trunkline_billlading_package ltbp + left join logpm_platform.logpm_trunkline_advance_detail ltad on ltbp.order_package_code = ltad.order_package_code + where ltbp.billlading_id=#{billladingId} + group by IFNULL(ltad.waybill_no,'————')) t on t.waybillNo = ltbw.waybill_no + left join logpm_trunkline_billlading ltb on ltb.id = ltbw.billlading_id + left join logpm_warehouse_waybill lww on lww.waybill_no = ltbw.waybill_no where ltbw.billlading_id = #{billladingId} + and ltbw.is_deleted = 0 + and ltbw.real_num > 0 @@ -78,9 +88,27 @@ update logpm_trunkline_billlading_waybill - set is_deleted = 0 + set is_deleted = 0, + plan_num = #{planNum} where billlading_id = #{billladingId} and waybill_no = #{waybillNo} + + + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.java index 548e321e6..340b96c30 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.java @@ -17,6 +17,11 @@ import java.util.List; @Mapper public interface TrunklineCarsLoadMapper extends BaseMapper { + /** + * @param page + * @param loadCarsDTO + * @return + */ IPage loadCarsPageList(IPage page, @Param("param") LoadCarsDTO loadCarsDTO); IPage arriveCarsPageList(IPage page, @Param("param") LoadCarsDTO loadCarsDTO); diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.xml index 1a5bc1364..36f9a4b03 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.xml @@ -41,9 +41,16 @@ left join logpm_trunkline_cars_load_line ltcll on ltcll.load_id = ltcl.id where ltcl.is_deleted = 0 and ltcl.load_type != '4' + and ltcl.load_status != '100' and ltcl.start_warehouse_id = #{param.warehouseId} + + and ltcl.cars_no = #{param.loadCarsNo} + + + and ltcl.load_status = #{param.loadStatus} + group by ltcl.id,ltcl.cars_no, ltcl.plan_loading_number, ltcl.real_loading_number, @@ -61,6 +68,7 @@ ltcl.start_time, ltcl.now_warehouse_id, ltcl.count_transport_cost + order by ltcl.create_time desc @@ -82,6 +90,7 @@ ltcl.arrive_time arriveTime, ltcl.start_time startTime, ltcl.create_user_name createUserName, + ltcl.operator operator, ltcl.create_time createTime, ltcl.now_warehouse_id nowWarehouseId, sum(ltcll.now_transport_cost) nowTransportCost, @@ -100,10 +109,14 @@ from logpm_trunkline_cars_load ltcl left join logpm_trunkline_cars_load_line ltcll on ltcll.load_id = ltcl.id where ltcl.is_deleted = 0 + and ltcl.load_status != '100' and ltcl.load_type != '4' and ltcl.end_warehouse_ids like concat('%',#{param.warehouseId},'%') + + and Locate(#{param.loadCarsNo},ltcl.cars_no) > 0 + group by ltcl.id,ltcl.cars_no, ltcl.plan_loading_number, ltcl.real_loading_number, @@ -119,11 +132,13 @@ ltcl.end_warehouse_names, ltcl.arrive_time, ltcl.start_time + order by ltcl.create_time desc select ltco.id carsOrderId, ltco.order_code orderCode, + ltco.waybill_id waybillId, ltco.waybill_no waybillNo, lww.create_time createTime, lww.destination destination, @@ -290,7 +320,7 @@ lww.remark remark, lww.waybill_type type, IFNULL(ltco.total_num,0) totalNum, - IF(lww.waybill_type = 1,count( ldpl.id ),SUM(ldpl.quantity)) stockNum, + IF(lww.waybill_type = 1,count( ldpl.id ),SUM(ldpl.quantity))-ltco.real_num stockNum, ltco.plan_num planNum, ltco.real_num realNum, IFNULL(TRUNCATE(lww.total_freight/lww.total_count,4),0) price, @@ -301,12 +331,12 @@ where ltco.load_id = #{param.loadId} and ltco.final_node_id = #{param.finalNodeId} and ldpl.is_deleted = 0 - and ldpl.order_package_status in ('20','30') and ldpl.warehouse_id = #{param.warehouseId} group by ltco.id, ltco.order_code, + ltco.waybill_id, ltco.waybill_no, lww.create_time, lww.destination, @@ -340,13 +370,16 @@ ltcl.start_time startTime, ltcl.plan_loading_number planLoadingNumber, ltcl.real_loading_number realLoadingNumber, + ltcl.unload_number unloadNumber, ltcl.delivery_type deliveryType, ltcl.operator operator, ltcl.create_time createTime, ltcl.settlement_value settlementValue, ltcl.settlement_person settlementPerson, - ltcl.sign_time signTime + ltcl.sign_time signTime, + IFNULL(sum(ltcls.num),0) signNum from logpm_trunkline_cars_load ltcl + left join logpm_trunkline_cars_load_scan ltcls on ltcls.load_id = ltcl.id and ltcls.scan_status = '3' where ltcl.is_deleted = 0 and ltcl.load_type = '4' @@ -358,6 +391,43 @@ and ltcl.load_status != '0' + + and ltcl.create_time >= #{param.startTime} + + + and ltcl.create_time <= #{param.endTime} + + + and Locate(#{param.loadCarsNo},ltcl.cars_no) > 0 + + + and Locate(#{param.carrierName},ltcl.carrier_name) > 0 + + + and ltcl.pay_method = #{param.payMethod} + + + and Locate(#{param.carrierOrderCode},ltcl.carrier_order_code) > 0 + + + and Locate(#{param.startWarehouseName},ltcl.start_warehouse_name) > 0 + + + and ltcl.load_status = #{param.loadStatus} + + + and ltcl.is_settlement = #{param.isSettlement} + + + and ltcl.delivery_type = #{param.deliveryType} + + + and Locate(#{param.operator},ltcl.operator) > 0 + + + and Locate(#{param.settlementPerson},ltcl.settlement_person) > 0 + + group by ltcl.id order by ltcl.create_time desc @@ -365,13 +435,14 @@ select * from logpm_trunkline_cars_load ltcl where ltcl.is_deleted = 0 - and ltcl.load_type != '4' + and ltcl.load_type != '4' + and ltcl.load_status != '100' and ltcl.start_warehouse_id = #{param.warehouseId} - - and ltcl.create_time >= #{param.startDate} + + and ltcl.create_time >= #{param.startTime} - - and ltcl.create_time <= #{param.endDate} + + and ltcl.create_time <= #{param.endTime} and ltcl.load_status = '0' @@ -379,6 +450,7 @@ and ltcl.load_status != '0' + order by ltcl.create_time desc @@ -420,8 +492,10 @@ lww.remark remark, ROUND(lww.total_freight/lww.total_count,2) price from logpm_distribution_stock_article ldsa - left join logpm_warehouse_waybill lww on lww.waybill_no = ldsa.waybill_number + left join logpm_warehouse_waybill lww on lww.waybill_no = ldsa.waybill_number where ldsa.is_zero = 1 + and lww.destination_warehouse_id != #{param.warehouseId} + and ldsa.hand_quantity > 0 and ldsa.warehouse_id = #{param.warehouseId} and ldsa.order_code not in @@ -460,15 +534,18 @@ select ltco.id carsOrderId, ltco.waybill_no waybillNo, ltco.order_code orderCode, + lww.create_time createTime, + lww.destination destination, + lww.destination_warehouse_name destinationWarehouseName, + lww.shipper shipper, + lww.consignee consignee, + lww.goods_name goodsName, ltco.plan_num planNum, ltco.real_num realNum, ltco.type type, - ldsa.mall_name consignee, - ldsa.consignee_person consigneeName, - ldsa.consignee_mobile consigneeMobile, - ldsa.consignee_address consigneeAddress, - lww.departure_warehouse_name departureWarehouseName, - lww.destination_warehouse_name destinationWarehouseName + lww.total_freight freight, + lww.remark remark, + lww.total_freight/lww.total_count*ltco.real_num price from logpm_trunkline_cars_order ltco left join logpm_distribution_stock_article ldsa on ldsa.order_code = ltco.order_code left join logpm_warehouse_waybill lww on lww.waybill_no = ltco.waybill_no @@ -495,11 +572,13 @@ diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.java index 0c37661b2..ca8671370 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.java @@ -1,14 +1,19 @@ package com.logpm.trunkline.mapper; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.distribution.entity.DistributionStockArticleEntity; import com.logpm.trunkline.dto.LoadCarsDTO; import com.logpm.trunkline.dto.ProductInfoDTO; import com.logpm.trunkline.entity.TrunklineCarsLoadScanEntity; import com.logpm.trunkline.vo.*; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; import java.util.Map; @@ -34,7 +39,7 @@ public interface TrunklineCarsLoadScanMapper extends BaseMapper findProductInfoList(@Param("loadId") Long loadId, @Param("trayCode") String trayCode, @Param("waybillNo") String waybillNo); - IPage loadingDetail(IPage page, @Param("param") LoadCarsDTO loadCarsDTO); + IPage loadingDetail(IPage page, @Param("param") LoadCarsDTO loadCarsDTO); List findCarsLoadingOrderDetail(@Param("loadId") Long loadId, @Param("orderCode") String orderCode, @Param("warehouseId") Long warehouseId); @@ -87,7 +92,7 @@ public interface TrunklineCarsLoadScanMapper extends BaseMapper findUnloadGoods(@Param("loadId") Long loadId, @Param("warehouseId") Long warehouseId, @Param("orderCode") String orderCode, @Param("waybillNo") String waybillNo); - void updateScanStatus(@Param("loadScanIds") List loadScanIds, @Param("scanStatus") String scanStatus); + void updateScanStatusAndTime(@Param("loadScanIds") List loadScanIds, @Param("scanStatus") String scanStatus, @Param("unloadTime") Date unloadTime,@Param("signUserName") String signUserName,@Param("warehouseId") Long warehouseId,@Param("warehouseName") String warehouseName); List findLoadScanWaybillList(@Param("loadId") Long loadId, @Param("nodeId") Long nodeId); @@ -113,7 +118,7 @@ public interface TrunklineCarsLoadScanMapper extends BaseMapper findUnloadByLoadIdAndWarehouseId(@Param("loadId") Long loadId, @Param("warehouseId") Long warehouseId); - void updateScanStatusByLoadId(@Param("loadId") Long loadId, @Param("scanStatus") String scanStatus); + void updateScanStatusByLoadId(@Param("loadId") Long loadId, @Param("scanStatus") String scanStatus, @Param("unloadTime") Date unloadTime,@Param("signUserName") String signUserName); List findSignListOrderPackageCodes(@Param("loadId") Long loadId); @@ -126,4 +131,38 @@ public interface TrunklineCarsLoadScanMapper extends BaseMapper findWaybillCarsLoadInfo(@Param("waybillId") Long waybillId); List findWaybillTransferInfo(@Param("waybillId") Long waybillId); + + List loadingDetailExport(@Param("param") LoadCarsDTO loadCarsDTO); + + Integer findSignNumByLoadId(@Param("loadId") Long loadId); + + UnloadReportVO findUnloadReport(@Param("loadId") Long loadId, @Param("warehouseId") Long warehouseId); + + List findParceListByCarsLoadScanIds(@Param("carsLoadScanIds") List carsLoadScanIds); + + List findOrderListByCarsLoadScanIds(@Param("carsLoadScanIds") List carsLoadScanIds); + + List findWaybillListByCarsLoadScanIds(@Param("carsLoadScanIds") List carsLoadScanIds); + + List findListByIdsNoPackage(@Param("carsLoadScanIds") List carsLoadScanIds,@Param("warehouseId") Long warehouseId); + + List findIncomingOrdeCodesByCarsLoadScanIds(@Param("carsLoadScanIds") List carsLoadScanIds, @Param("warehouseId") Long warehouseId); + + List findListHasSignOrderIdByIds(@Param("carsLoadScanIds") List loadScanIds); + + List findCarsLoadScanIdsByWaybillIds(@Param("waybillIds") List waybillIds); + + List findAbnormalData(@Param("loadId") Long loadId); + + List findUnloadZeroList(@Param("loadId") Long loadId, @Param("warehouseId") Long warehouseId); + + JSONObject findUnloadNumAudio(@Param("loadId") Long loadId, @Param("warehouseId") Long warehouseId); + + void updateFinalNodeIdAndFinalNodeNameByLoadIdNoData(@Param("loadId") Long loadId, @Param("warehouseId") Long warehouseId, @Param("warehouseName") String warehouseName); + + void deleteListByCarsLoadScanIds(@Param("carsLoadScanIdList") List carsLoadScanIdList); + + void clearSignOrderIdByLoadIdAndWarehouseIdAndOrderCodeAndWaybillNo(@Param("loadId") Long loadId, @Param("nodeId") Long nodeId, @Param("orderCode") String orderCode, @Param("waybillNo") String waybillNo); + + void addSignOrderIdByLoadIdAndNodeIdAndOrderCodeAndWaybillNo(@Param("loadId") Long finalLoadId, @Param("nodeId") Long nodeId, @Param("orderCode") String orderCode, @Param("waybillNo") String waybillNo, @Param("signOrderId") Long signOrderId); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.xml index 06a1d48d1..cc3144087 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.xml @@ -56,7 +56,6 @@ from logpm_trunkline_cars_load_scan where scan_code = #{orderPackageCode} and load_id = #{loadId} - and scan_status = '1' @@ -79,11 +78,79 @@ and waybill_no = #{waybillNo} - + select cls.*, + lww.destination_warehouse_name + from logpm_trunkline_cars_load_scan cls + left join logpm_warehouse_waybill lww on cls.waybill_id = lww.id + where cls.load_id = #{param.loadId} + + and Locate(#{param.waybillNo},cls.waybill_no) > 0 + + + and Locate(#{param.orderCode},cls.order_code) > 0 + + + and Locate(#{param.scanCode},cls.scan_code) > 0 + + + and Locate(#{param.loadingUserName},cls.loading_user_name) > 0 + + + and Locate(#{param.warehouseName},cls.warehouse_name) > 0 + + + and Locate(#{param.finalNodeName},cls.final_node_name) > 0 + + + and Locate(#{param.finalNodeName},cls.final_node_name) > 0 + + + and cls.scan_status = #{param.scanStatus} + + + and Locate(#{param.trayName},cls.tray_name) > 0 + + + and Locate(#{param.trayCode},cls.tray_code) > 0 + + + and Locate(#{param.unloadNodeName},cls.unload_node_name) > 0 + + + and Locate(#{param.unloadUserName},cls.unload_user_name) > 0 + + + and cls.`type` = #{param.type} + + + and cls.is_data = #{param.isData} + + + and cls.loading_abnormal = #{param.loadingAbnormal} + + + and cls.unload_abnormal = #{param.unloadAbnormal} + + + and cls.is_supple = #{param.isSupple} + + + and cls.create_time >= #{param.createTimeStart} + + + and cls.create_time <= #{param.createTimeEnd} + + + and cls.unload_time >= #{param.unloadTimeStart} + + + and cls.unload_time <= #{param.unloadTimeEnd} + + + and Locate(#{param.destinationWarehouseName},lww.destination_warehouse_name) > 0 + + order by cls.loading_abnormal desc,cls.unload_abnormal desc,cls.create_time asc @@ -330,6 +398,7 @@ left join logpm_warehouse_waybill lww on ltcls.waybill_no = lww.waybill_no where ltcls.load_id = #{loadId} and ltcls.warehouse_id = #{warehouseId} + and ltcls.order_code is not null group by ltcls.order_code, ltcls.waybill_no, ltcls.type, @@ -378,9 +447,9 @@ lww.consignee consignee, lww.consignee_name consigneeName, lww.consignee_mobile consigneeMobile, - ltco.unload_num unloadNum, - 0 planNum, - sum(ltcls.num) smallTotal + IFNULL(ltco.plan_num,0) AS planNum, + sum(case when ltcls.scan_status != 1 then ltcls.num else 0 end) unloadNum, + sum( ltcls.num ) AS smallTota from logpm_trunkline_cars_load_scan ltcls left join logpm_trunkline_cars_order ltco on ltco.order_code = ltcls.order_code and ltco.waybill_no = ltcls.waybill_no and ltco.load_id = ltcls.load_id and ltco.node_id = ltcls.warehouse_id left join logpm_distribution_stock_article ldsa on ldsa.order_code = ltcls.order_code and ldsa.warehouse_id = ltcls.from_warehouse_id @@ -400,9 +469,12 @@ ltco.unload_num - + update logpm_trunkline_cars_load_scan - set scan_status = #{scanStatus} + set scan_status = #{scanStatus}, + sign_time = #{unloadTime}, + sign_user_name = #{signUserName}, + sign_abnormal = 0 where 1=1 and id in @@ -436,7 +508,7 @@ select ltcl.cars_no carsNo, ltcl.load_status loadStatus, - ltcl.cars_line_name carsLineName, + ltcl.carrier_name carsLineName, ltcl.start_time startTime, ltcl.arrive_time arriveTime, - ltcl.car_number carNumber, - ltcl.driver_name driverName, - ltcl.driver_mobile driverMobile, + ltcl.sign_time signTime, + IF(ltcl.delivery_type=1,'',ltcl.car_number) carNumber, + IF(ltcl.delivery_type=1,'物流到仓自提',ltcl.driver_name) driverName, + IF(ltcl.delivery_type=1,'',ltcl.driver_mobile) driverMobile, ltcl.remark remark from logpm_trunkline_cars_load_scan ltcls left join logpm_trunkline_cars_load ltcl on ltcl.id = ltcls.load_id - where ltcls.waybill_no = #{waybillNo} + where ltcls.waybill_id = #{waybillId} and ltcl.load_type = 4 group by ltcl.cars_no order By ltcl.start_time asc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update logpm_trunkline_cars_load_scan + set final_node_id = #{warehouseId}, + final_node_name = #{warehouseName} + where load_id = #{loadId} + and final_node_id is null + + + + delete from logpm_trunkline_cars_load_scan + where id in + + #{item} + + + + + update logpm_trunkline_cars_load_scan + set sign_order_id = null + where load_id = #{loadId} + and warehouse_id = #{nodeId} + and order_code = #{orderCode} + and waybill_no = #{waybillNo} + and scan_status = '1' + + + + update logpm_trunkline_cars_load_scan + set sign_order_id = #{signOrderId} + where load_id = #{loadId} + and warehouse_id = #{nodeId} + and order_code = #{orderCode} + and waybill_no = #{waybillNo} + and scan_status = '1' + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.java index 264655d8d..adc569c08 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.java @@ -45,9 +45,9 @@ public interface TrunklineCarsOrderMapper extends BaseMapper findSignOrderListBy(@Param("loadId") Long loadId, @Param("warehouseId") Long warehouseId); - List findSignOrderList(@Param("loadId") Long loadId, @Param("warehouseId") Long warehouseId); + List findSignOrderList(@Param("loadId") Long loadId, @Param("warehouseId") Long warehouseId,@Param("signOrderId") Long signOrderId); - List findSignZeroOrderList(@Param("loadId") Long loadId, @Param("warehouseId") Long warehouseId); + List findSignZeroOrderList(@Param("loadId") Long loadId, @Param("warehouseId") Long warehouseId,@Param("signOrderId") Long signOrderId); Integer findSignNumBySignOrderId(@Param("signOrderId") Long signOrderId); @@ -58,4 +58,10 @@ public interface TrunklineCarsOrderMapper extends BaseMapper findLoadingList(@Param("loadId") Long loadId, @Param("nodeId") Long nodeId); + + Integer findLoadingNumBySignOrderId(@Param("signOrderId") Long signOrderId); + + void updateNoCustomer(@Param("updateCarsOrderIdList") List updateCarsOrderIdList); + + List findMallOrderList(@Param("carsOrderIdList") List carsOrderIdList); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.xml index 946a30e3c..a6ff9b330 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.xml @@ -104,9 +104,12 @@ @@ -264,6 +272,7 @@ from logpm_trunkline_cars_order ltco where ltco.load_id = #{loadId} and ltco.node_id = #{warehouseId} + and ltco.sign_order_id = #{signOrderId} and ltco.type = 2 and ltco.is_customer = '1' @@ -309,4 +318,36 @@ and real_num > 0 + + + + update logpm_trunkline_cars_order + set is_customer = '0', + sign_order_id = null + where id in + + #{item} + + and sign_num = 0 + + + + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCostShareRecordMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCostShareRecordMapper.java index 74beb8b01..f0c66f9b0 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCostShareRecordMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCostShareRecordMapper.java @@ -22,4 +22,6 @@ public interface TrunklineCostShareRecordMapper extends BaseMapper + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineLoadSignOrderMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineLoadSignOrderMapper.java index 13d89550e..51ab86112 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineLoadSignOrderMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineLoadSignOrderMapper.java @@ -24,4 +24,9 @@ public interface TrunklineLoadSignOrderMapper extends BaseMapper findSignOrderDetailList(IPage page, @Param("param") LoadCarsDTO loadCarsDTO); void updateBelongToWarehouse(@Param("signOrderId") Long signOrderId, @Param("warehouseId") Long warehouseId, @Param("warehouseName") String warehouseName); + + IPage findSignOrderPageList(IPage page, @Param("param") LoadCarsDTO loadCarsDTO); + + void deleteListBySignOrderIds(@Param("delSignOrderList") List delSignOrderList); + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineLoadSignOrderMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineLoadSignOrderMapper.xml index ba7844624..53d2397c6 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineLoadSignOrderMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineLoadSignOrderMapper.xml @@ -17,11 +17,27 @@ + select ltlso.id id, + ltlso.load_id loadId, + ltlso.warehouse_id warehouseId, + ltlso.plan_num planNum, + ltlso.load_sign_code loadSignCode, + ltlso.sign_num signNum, + ltcl.driver_name driverName, + ltcl.driver_mobile driverMobile, + ltcl.car_number carNumber, + ltcl.cars_line_name carsLineName, + ltcl.cars_no carsNo, + SUM(ltco.real_num) AS loadingNum + from logpm_trunkline_load_sign_order ltlso + left join logpm_trunkline_cars_load ltcl on ltcl.id = ltlso.load_id + LEFT JOIN logpm_trunkline_cars_order ltco on ltco.sign_order_id = ltlso.id + + and (ltlso.warehouse_id = #{param.warehouseId} or ltlso.final_node_id = #{param.warehouseId}) + + + and ltlso.load_id = #{param.loadId} + + + and ltcl.cars_no = #{param.loadCarsNo} + + + and ltlso.sign_status = '20' + and ltlso.sign_time >= #{param.enterTimeStart} + and ltlso.sign_time <= #{param.enterTimeEnd} + + + and ltlso.sign_status != '20' + and ltlso.create_time >= #{param.enterTimeStart} + and ltlso.create_time <= #{param.enterTimeEnd} + + + GROUP BY ltlso.id + + + + + delete from logpm_trunkline_load_sign_order + where id in + + #{signOrderId} + + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillJsonMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillJsonMapper.java new file mode 100644 index 000000000..730aec84d --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillJsonMapper.java @@ -0,0 +1,12 @@ +package com.logpm.trunkline.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.logpm.trunkline.entity.TrunklineWaybillJsonEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface TrunklineWaybillJsonMapper extends BaseMapper { + + + +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillOrderMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillOrderMapper.java index 57696d095..f051a17c6 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillOrderMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillOrderMapper.java @@ -20,4 +20,10 @@ public interface TrunklineWaybillOrderMapper extends BaseMapper findAdvanceIdsByWaybillIds(@Param("waybillIds") List waybillIds); + + Integer findTotalNumByWaybillAndOrderCode(@Param("waybillNo") String waybillNo, @Param("orderCode") String orderCode); + + void deleteByWaybillNo(@Param("waybillNo") String waybillNo); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillOrderMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillOrderMapper.xml index cf13328b0..1243351d1 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillOrderMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillOrderMapper.xml @@ -1,6 +1,10 @@ + + delete from logpm_trunkline_waybill_order + where waybill_no = #{waybillNo} + + + + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillPacakgeMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillPacakgeMapper.xml index 353a36403..22a75b0ba 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillPacakgeMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillPacakgeMapper.xml @@ -1,6 +1,9 @@ + + delete from logpm_trunkline_waybill_package where waybill_no = #{waybillNo} + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillPackageMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillPackageMapper.java index 15d532d02..66dcec4e4 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillPackageMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillPackageMapper.java @@ -3,10 +3,11 @@ package com.logpm.trunkline.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.logpm.trunkline.entity.TrunklineWaybillPackageEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper public interface TrunklineWaybillPackageMapper extends BaseMapper { - + void deleteByWaybillNo(@Param("waybillNo") String waybillNo); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillTrackMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillTrackMapper.java index 96be3f508..241f40e9e 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillTrackMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillTrackMapper.java @@ -1,7 +1,10 @@ package com.logpm.trunkline.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.trunkline.dto.OpenOrderDTO; import com.logpm.trunkline.entity.TrunklineWaybillTrackEntity; +import com.logpm.trunkline.vo.TrunklineWaybillTrackVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -11,4 +14,8 @@ import java.util.List; public interface TrunklineWaybillTrackMapper extends BaseMapper { List findWaybillLog(@Param("waybillId") Long waybillId, @Param("trackType") String trackType); + + IPage findUpdateWaybillList(IPage page, @Param("param") OpenOrderDTO openOrderDTO); + + void deleteByWaybillNo(@Param("waybillNo") String waybillNo); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillTrackMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillTrackMapper.xml index 3c2da86ad..bcde05b3e 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillTrackMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineWaybillTrackMapper.xml @@ -1,6 +1,9 @@ + + delete from logpm_trunkline_waybill_track where waybill_no = #{waybillNo} + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/AdvanceOrderListener.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/AdvanceOrderListener.java index bdc730002..4e192983a 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/AdvanceOrderListener.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/AdvanceOrderListener.java @@ -1,11 +1,19 @@ package com.logpm.trunkline.mq; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.distribution.feign.IDistributionParcelListClient; +import com.logpm.distribution.feign.IDistributionStockArticleClient; +import com.logpm.factorydata.enums.BrandEnums; import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import com.logpm.trunkline.entity.TrunklineDetailProductEntity; @@ -25,8 +33,10 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -44,6 +54,8 @@ public class AdvanceOrderListener { private final ITrunklineAdvanceDetailService advanceDetailService; private final ITrunklineDetailProductService detailProductService; private final ITrunklineCarsLoadService trunklineCarsLoadService; + private final IDistributionStockArticleClient stockArticleClient; + private final IDistributionParcelListClient parcelListClient; @RabbitListener(bindings = @QueueBinding( value = @Queue(name = FactoryDataConstants.Mq.Queues.ADVANCE_ORDER), @@ -58,6 +70,23 @@ public class AdvanceOrderListener { JSONObject entries = JSONUtil.parseObj(msg); JSONArray details = entries.getJSONArray("details"); TrunklineAdvanceEntity advanceEntity = JSONUtil.toBean(entries, TrunklineAdvanceEntity.class); + LambdaQueryWrapper eq = Wrappers.lambdaQuery() + .eq(TrunklineAdvanceEntity::getOrderCode, advanceEntity.getOrderCode()); + if (StrUtil.isNotEmpty(advanceEntity.getTrainNumber())) { + eq.eq(TrunklineAdvanceEntity::getTrainNumber, advanceEntity.getTrainNumber()); + } + // 暂存单 订单自编号 + 车次号 唯一 + List advanceEntities = advanceService.list(eq); + + // 暂存单存在 并且未开单 则将新数据添加到原来的暂存单上 + // 如果已开单则新增暂存单 + if (CollUtil.isNotEmpty(advanceEntities) && ObjectUtil.equal(advanceEntity.getWaybillStatus(), "0")) { + TrunklineAdvanceEntity entity = advanceEntities.get(0); + if (ObjectUtil.isNotEmpty(entity)) { + advanceEntity.setId(entity.getId()); +// advanceEntity.setTotalNum(entity.getTotalNum() + advanceEntity.getTotalNum()); + } + } Set packageCodeSet = new HashSet<>(); if (CollUtil.isNotEmpty(details)) { // 使用HashSet代替ArrayList以优化内存使用和检查重复值 @@ -68,7 +97,7 @@ public class AdvanceOrderListener { JSONObject jsonObject = JSONUtil.parseObj(detail); TrunklineAdvanceDetailEntity entity = JSONUtil.toBean(jsonObject, TrunklineAdvanceDetailEntity.class); // 检查转换后的实体不为null,且其orderPackageCode非null - if (!ObjectUtil.hasEmpty(entity, entity.getOrderPackageCode())) { + if (!ObjectUtil.isAllEmpty(entity, entity.getOrderPackageCode())) { orderPackageCodes.add(entity.getOrderPackageCode()); } } catch (Exception e) { @@ -78,18 +107,23 @@ public class AdvanceOrderListener { }); // 查询数据库,校验订单包件编码是否重复 if (CollUtil.isNotEmpty(orderPackageCodes)) { - List codes = advanceDetailService.findPackageCodeByCodes(orderPackageCodes); - if (CollUtil.isNotEmpty(codes)) { - packageCodeSet.addAll(codes); + Map packageCodeByCodes = advanceDetailService.findPackageCodeByCodes(orderPackageCodes); + if (CollUtil.isNotEmpty(packageCodeByCodes)) { + packageCodeSet.addAll(packageCodeByCodes.keySet()); } } } if (ObjectUtil.isNotNull(advanceEntity)) { String orderCode = advanceEntity.getOrderCode(); - if(orderCode.contains("遗")){ + if (StrUtil.isNotEmpty(orderCode) && orderCode.contains("遗")) { advanceEntity.setLegacyStatus("1"); } - advanceService.save(advanceEntity); + // 暂存单不存在则新增,暂存单存在则将暂存单明细往原暂存单中添加 + if (ObjectUtil.isEmpty(advanceEntity.getId())) { + advanceService.save(advanceEntity); + } else { + advanceService.updateById(advanceEntity); + } } if (ObjectUtil.isNotEmpty(advanceEntity) && CollUtil.isNotEmpty(details)) { List advanceDetailEntityList = new ArrayList<>(); @@ -99,9 +133,31 @@ public class AdvanceOrderListener { TrunklineAdvanceDetailEntity advanceDetailEntity = JSONUtil.toBean(detail, TrunklineAdvanceDetailEntity.class); if (ObjectUtil.isNotNull(advanceDetailEntity)) { if (CollUtil.isNotEmpty(packageCodeSet) && packageCodeSet.contains(advanceDetailEntity.getOrderPackageCode())) { - continue; + // 金牌如果是重复包条,则单独处理 + if (ObjectUtil.equal(advanceEntity.getBrand(), BrandEnums.JP.getValue())) { + // 金牌按DD单号+包条确定唯一值 + List list = advanceDetailService.list(Wrappers.lambdaQuery() + .eq(TrunklineAdvanceDetailEntity::getOrderPackageCode, advanceDetailEntity.getOrderPackageCode()) + .eq(TrunklineAdvanceDetailEntity::getOrderCode, advanceEntity.getOrderCode()) + ); + if (CollUtil.isNotEmpty(list)) { + // 订单+包件重复则不处理这条数据 + log.error("金牌,订单+包条码重复,订单:{},包条码:{}", advanceEntity.getOrderCode(), advanceDetailEntity.getOrderPackageCode()); + continue; + } else { + // 包件码重复,订单+包件不重复,设置预留字段1 为 1 + advanceDetailEntity.setReserve1("1"); + } + } else { + log.error("非金牌,包条码重复,包条码:{}", advanceDetailEntity.getOrderPackageCode()); + continue; + } } advanceDetailEntity.setAdvanceId(advanceEntity.getId()); + // 设置发货时间为当前时间 + if (StrUtil.isEmpty(advanceDetailEntity.getSendDateStr())) { + advanceDetailEntity.setSendDateStr(DateUtil.today()); + } advanceDetailEntityList.add(advanceDetailEntity); JSONArray items = detail.getJSONArray("items"); if (CollUtil.isNotEmpty(items)) { @@ -124,4 +180,192 @@ public class AdvanceOrderListener { } } + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FactoryDataConstants.Mq.Queues.ADVANCE_ORDER_OUPAI), + exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER_OUPAI, type = ExchangeTypes.TOPIC), + key = FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER + )) + @Transactional(rollbackFor = Exception.class) + public void advanceOrderOuPai(String msg) { + // 新增暂存单 + if (StrUtil.isNotBlank(msg)) { + log.info("收到欧派工厂数据暂存单消息:{}", msg); + JSONObject entries = JSONUtil.parseObj(msg); + JSONArray details = entries.getJSONArray("details"); + TrunklineAdvanceEntity advanceEntity = JSONUtil.toBean(entries, TrunklineAdvanceEntity.class); + LambdaQueryWrapper eq = Wrappers.lambdaQuery() + .eq(TrunklineAdvanceEntity::getOrderCode, advanceEntity.getOrderCode()); + if (StrUtil.isNotEmpty(advanceEntity.getTrainNumber())) { + eq.eq(TrunklineAdvanceEntity::getTrainNumber, advanceEntity.getTrainNumber()); + } + // 暂存单 订单自编号 + 车次号 唯一 + List advanceEntities = advanceService.list(eq); + + // 暂存单存在 并且未开单 则将新数据添加到原来的暂存单上 + // 如果已开单则新增暂存单 + // 订单 修改最终客户信息 + if (CollUtil.isNotEmpty(advanceEntities)) { + TrunklineAdvanceEntity entity = advanceEntities.get(0); + if (ObjectUtil.isNotEmpty(entity)) { + // 如果存在则只修改客户信息 + if (StrUtil.isNotEmpty(advanceEntity.getCustomerName())) { + entity.setCustomerName(advanceEntity.getCustomerName()); + } + if (StrUtil.isNotEmpty(advanceEntity.getCustomerAddress())) { + entity.setCustomerAddress(advanceEntity.getCustomerAddress()); + } + if (StrUtil.isNotEmpty(advanceEntity.getCustomerPhone())) { + entity.setCustomerPhone(advanceEntity.getCustomerPhone()); + } + advanceService.updateById(entity); + // 修改在库订单信息 未预约的数据 reservation_status = 10 才更新 + if (ObjectUtil.isAllNotEmpty(entity.getOrderCode(), advanceEntity.getCustomerName(), advanceEntity.getCustomerAddress(), advanceEntity.getCustomerPhone())) { + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.set("orderCode", entity.getOrderCode()); + jsonObject.set("customerName", advanceEntity.getCustomerName()); + jsonObject.set("customerAddress", advanceEntity.getCustomerAddress()); + jsonObject.set("customerPhone", advanceEntity.getCustomerPhone()); + stockArticleClient.updateCustomerAllByOrderCode(JSONUtil.toJsonStr(jsonObject)); + } catch (Exception e) { + log.error("更新在库订单失败"); + } + } + } + } + if (ObjectUtil.isNotNull(advanceEntity)) { + String orderCode = advanceEntity.getOrderCode(); + if (StrUtil.isNotEmpty(orderCode) && orderCode.contains("遗")) { + advanceEntity.setLegacyStatus("1"); + } + // 暂存单不存在则新增,暂存单存在则将暂存单明细往原暂存单中添加 + if (ObjectUtil.isEmpty(advanceEntity.getId())) { + advanceService.save(advanceEntity); + } + } + Map packageCodeMap = new HashMap<>(); + Map> parcelListMap = new HashMap<>(); + if (CollUtil.isNotEmpty(details)) { + // 使用HashSet代替ArrayList以优化内存使用和检查重复值 + Set orderPackageCodes = new HashSet<>(); + details.forEach(detail -> { + try { + // 更具描述性的变量命名 + JSONObject jsonObject = JSONUtil.parseObj(detail); + TrunklineAdvanceDetailEntity entity = JSONUtil.toBean(jsonObject, TrunklineAdvanceDetailEntity.class); + // 检查转换后的实体不为null,且其orderPackageCode非null + if (!ObjectUtil.isAllEmpty(entity, entity.getOrderPackageCode())) { + orderPackageCodes.add(entity.getOrderPackageCode()); + } + } catch (Exception e) { + // 异常处理,可根据实际情况记录日志或进行其他处理 + log.error("暂存单转换时发生异常: " + detail + ",异常:" + e.getMessage()); + } + }); + // 查询数据库,校验订单包件编码是否重复 + if (CollUtil.isNotEmpty(orderPackageCodes)) { + packageCodeMap = advanceDetailService.findPackageCodeByCodes(orderPackageCodes); + try { + if(CollUtil.isNotEmpty(packageCodeMap)){ + parcelListMap = parcelListClient.findPackageCodeByCodes(packageCodeMap.keySet()); + } + }catch (Exception e){ + log.error("查询包件表失败"); + } + } + } + + // 包件 修改 品类信息 物料名称 + if (ObjectUtil.isNotEmpty(advanceEntity) && CollUtil.isNotEmpty(details)) { + List advanceDetailEntityList = new ArrayList<>(); + List parcelListEntityList = new ArrayList<>(); + List detailProductEntityList = new ArrayList<>(); + Set productCodes = new HashSet<>(); + for (Object detailObj : details) { + JSONObject detail = JSONUtil.parseObj(detailObj); + TrunklineAdvanceDetailEntity advanceDetailEntity = JSONUtil.toBean(detail, TrunklineAdvanceDetailEntity.class); + if (ObjectUtil.isNotNull(advanceDetailEntity)) { + if (CollUtil.isNotEmpty(packageCodeMap) && StrUtil.isNotEmpty(advanceDetailEntity.getOrderPackageCode()) + && packageCodeMap.containsKey(advanceDetailEntity.getOrderPackageCode())) { + if(!ObjectUtil.isAllEmpty(advanceDetailEntity.getFirstPackName(),advanceDetailEntity.getSecondPackName(), + advanceDetailEntity.getThirdPackName(),advanceDetailEntity.getMaterialName())){ + TrunklineAdvanceDetailEntity updatedetailEntity = new TrunklineAdvanceDetailEntity(); + updatedetailEntity.setId(Convert.toLong(packageCodeMap.get(advanceDetailEntity.getOrderPackageCode()))); + updatedetailEntity.setFirstPackName(advanceDetailEntity.getFirstPackName()); + updatedetailEntity.setFirstPackCode(advanceDetailEntity.getFirstPackCode()); + updatedetailEntity.setSecondPackName(advanceDetailEntity.getSecondPackName()); + updatedetailEntity.setSecondPackCode(advanceDetailEntity.getSecondPackCode()); + updatedetailEntity.setThirdPackName(advanceDetailEntity.getThirdPackName()); + updatedetailEntity.setThirdPackCode(advanceDetailEntity.getThirdPackCode()); + updatedetailEntity.setMaterialName(advanceDetailEntity.getMaterialName()); + updatedetailEntity.setMaterialCode(advanceDetailEntity.getMaterialCode()); + advanceDetailEntityList.add(updatedetailEntity); + } + if(CollUtil.isNotEmpty(parcelListMap) && parcelListMap.containsKey(advanceDetailEntity.getOrderPackageCode())){ + Set strings = parcelListMap.get(advanceDetailEntity.getOrderPackageCode()); + for (String string : strings) { + DistributionParcelListEntity parcelListEntity = new DistributionParcelListEntity(); + parcelListEntity.setId(Convert.toLong(string)); + parcelListEntity.setFirsts(advanceDetailEntity.getFirstPackName()); + parcelListEntity.setSecond(advanceDetailEntity.getSecondPackName()); + parcelListEntity.setThirdProduct(advanceDetailEntity.getThirdPackName()); + parcelListEntity.setMaterialName(advanceDetailEntity.getMaterialName()); + parcelListEntity.setMaterialCode(advanceDetailEntity.getMaterialCode()); + parcelListEntityList.add(parcelListEntity); + } + + } + } else { + advanceDetailEntity.setAdvanceId(advanceEntity.getId()); + // 设置发货时间为当前时间 + if (StrUtil.isEmpty(advanceDetailEntity.getSendDateStr())) { + advanceDetailEntity.setSendDateStr(DateUtil.today()); + } + advanceDetailEntityList.add(advanceDetailEntity); + } + + JSONArray items = detail.getJSONArray("items"); + if (CollUtil.isNotEmpty(items)) { + for (Object itemObj : items) { + JSONObject item = JSONUtil.parseObj(itemObj); + TrunklineDetailProductEntity detailProductEntity = JSONUtil.toBean(item, TrunklineDetailProductEntity.class); + if (ObjectUtil.isNotNull(detailProductEntity)) { + productCodes.add(detailProductEntity.getProductCode()); + detailProductEntityList.add(detailProductEntity); + } + } + } + } + + } + if(CollUtil.isNotEmpty(parcelListEntityList)){ + parcelListClient.saveorUpdateBatchByOP(parcelListEntityList); + } + if(CollUtil.isNotEmpty(advanceDetailEntityList)){ + advanceDetailService.saveOrUpdateBatch(advanceDetailEntityList); + } + //发送入库包件处理无数据装车数据 + trunklineCarsLoadService.sendRabbitMessageLoadScanData(JSONUtil.toJsonStr(advanceEntity)); + if(CollUtil.isNotEmpty(detailProductEntityList)){ + if(ObjectUtil.isAllNotEmpty(packageCodeMap,productCodes)){ + List list = detailProductService.list(Wrappers.lambdaQuery() + .in(TrunklineDetailProductEntity::getUnitNo, packageCodeMap.keySet()) + .in(TrunklineDetailProductEntity::getProductCode, productCodes) + ); + if(CollUtil.isNotEmpty(list)){ + for (TrunklineDetailProductEntity productEntity : detailProductEntityList) { + for (TrunklineDetailProductEntity detailProductEntity : list) { + if(ObjectUtil.equal(productEntity.getProductCode(),detailProductEntity.getProductCode())){ + productEntity.setId(detailProductEntity.getId()); + } + } + } + } + } + detailProductService.saveOrUpdateBatch(detailProductEntityList); + } + } + } + } + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/AdvanceToLoadListener.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/AdvanceToLoadListener.java index c4ee7da44..b3efe868f 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/AdvanceToLoadListener.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/AdvanceToLoadListener.java @@ -18,6 +18,7 @@ import org.springblade.common.constant.IncomingTypeEnum; import org.springblade.common.constant.RabbitConstant; import org.springblade.common.constant.TenantNum; import org.springblade.common.utils.CommonUtil; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springframework.amqp.core.Message; @@ -48,6 +49,7 @@ public class AdvanceToLoadListener { @Transactional(rollbackFor = Exception.class) public void advanceToLoad(Map map, Message message, Channel channel){ String msg = (String) map.get("messageData"); + String tenantId1 = AuthUtil.getTenantId(); if(StringUtil.isNotBlank(msg)){ log.info("#############advanceToLoad: 暂存单包件入库并且绑定到对应车次上 {}", msg); JSONObject jsonObject = JSONUtil.parseObj(msg); @@ -79,18 +81,24 @@ public class AdvanceToLoadListener { inComingDTO.setTenantId(TenantNum.HUITONGCODE); inComingDTO.setOrderPackageCode(orderPackageCode); inComingDTO.setWarehouseId(warehouseId); - inComingDTO.setWarehouseName(warehouseName); +// inComingDTO.setWarehouseName(warehouseName); + inComingDTO.setTenantId(advanceDetailEntity.getTenantId()); + inComingDTO.setUserId(advanceDetailEntity.getCreateUser()); + inComingDTO.setDeptId(advanceDetailEntity.getCreateDept()); R r = inComingService.incomingPackage(inComingDTO); if(r.getCode() == 200){ carsLoadScanEntity.setFromWarehouseId(warehouseId); carsLoadScanEntity.setOrderCode(orderCode); + carsLoadScanEntity.setIsData(1); Date createTime = carsLoadScanEntity.getCreateTime(); Long createUser = carsLoadScanEntity.getCreateUser(); Long createDept = carsLoadScanEntity.getCreateDept(); + String tenantId = carsLoadScanEntity.getTenantId(); carsLoadScanService.updateById(carsLoadScanEntity); loadIds.add(carsLoadScanEntity.getLoadId()); DistributionParcelListEntity parcelListEntity = distributionParcelListClient.findByPacketBarCodeAndWarehouseId(orderPackageCode, warehouseId); parcelListEntity.setWarehouseEntryTimeEnd(CommonUtil.addDate(createTime,-60)); + parcelListEntity.setTenantId(tenantId); parcelListEntity.setUpdateUser(createUser); parcelListEntity.setCreateUser(createUser); parcelListEntity.setCreateDept(createDept); diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/OpenOrderToLoadListener.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/OpenOrderToLoadListener.java index 0e0da40b5..8bf44e626 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/OpenOrderToLoadListener.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/OpenOrderToLoadListener.java @@ -3,10 +3,8 @@ package com.logpm.trunkline.mq; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; -import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; -import com.logpm.trunkline.entity.TrunklineCarsLoadLineEntity; -import com.logpm.trunkline.entity.TrunklineCarsLoadScanEntity; -import com.logpm.trunkline.entity.TrunklineCarsOrderEntity; +import com.logpm.trunkline.dto.InComingDTO; +import com.logpm.trunkline.entity.*; import com.logpm.trunkline.service.*; import com.rabbitmq.client.Channel; import lombok.AllArgsConstructor; @@ -27,13 +25,14 @@ import java.util.*; @RabbitListener(queues = RabbitConstant.OPEN_ORDER_LOAD_SCAN_QUEUE) public class OpenOrderToLoadListener { + private final ITrunklineAdvanceService advanceService; private final ITrunklineAdvanceDetailService advanceDetailService; private final ITrunklineCarsLoadScanService carsLoadScanService; private final ITrunklineCarsLoadService carsLoadService; private final ITrunklineCarsOrderService carsOrderService; private final ITrunklineCarsLoadLineService carsLoadLineService; private final ITrunklineWaybillOrderService waybillOrderService; - + private final IInComingService inComingService; @RabbitHandler @Transactional(rollbackFor = Exception.class) @@ -48,6 +47,7 @@ public class OpenOrderToLoadListener { Set loadIds = new HashSet<>(); for (Object object : advanceIds) { Long advanceId = (Long) object; + TrunklineAdvanceEntity advanceEntity = advanceService.getById(advanceId); List advanceDetailEntityList = advanceDetailService.findListByAdvanceId(advanceId); for (TrunklineAdvanceDetailEntity advanceDetailEntity : advanceDetailEntityList) { String orderPackageCode = advanceDetailEntity.getOrderPackageCode(); @@ -61,7 +61,21 @@ public class OpenOrderToLoadListener { carsLoadScanEntity.setIsSupple(1); carsLoadScanEntity.setLoadingAbnormal(0); carsLoadScanEntity.setUnloadAbnormal(0); + String packageStatus = advanceDetailEntity.getPackageStatus(); + if("0".equals(packageStatus)){ + //未入库,强制入库 + Long warehouseId = advanceDetailEntity.getWarehouseId(); + InComingDTO inComingDTO = new InComingDTO(); + inComingDTO.setOrderPackageCode(orderPackageCode); + inComingDTO.setIncomingType(10); + inComingDTO.setWarehouseId(warehouseId); + inComingService.incomingPackage(inComingDTO); + carsLoadScanEntity.setFromWarehouseId(warehouseId); + }else{ + carsLoadScanEntity.setFromWarehouseId(advanceDetailEntity.getIncomingWarehouseId()); + } carsLoadScanService.updateById(carsLoadScanEntity); + Long loadId = carsLoadScanEntity.getLoadId(); Long warehouseId = carsLoadScanEntity.getWarehouseId(); String warehouseName = carsLoadScanEntity.getWarehouseName(); @@ -86,9 +100,10 @@ public class OpenOrderToLoadListener { trunklineCarsOrderEntity.setNodeName(warehouseName); trunklineCarsOrderEntity.setLoadLineId(carsLoadLineEntity.getId()); trunklineCarsOrderEntity.setOrderCode(orderCode); + trunklineCarsOrderEntity.setWaybillId(waybillId); trunklineCarsOrderEntity.setWaybillNo(waybillNo); - Integer totalNum = waybillOrderService.findTotalNumByWaybillNoAndOrderCode(waybillId,orderCode); - trunklineCarsOrderEntity.setTotalNum(totalNum); +// Integer totalNum = waybillOrderService.findTotalNumByWaybillNoAndOrderCode(waybillId,orderCode); + trunklineCarsOrderEntity.setTotalNum(advanceEntity.getTotalNum()); trunklineCarsOrderEntity.setPlanNum(0); trunklineCarsOrderEntity.setIsCustomer("0"); trunklineCarsOrderEntity.setRealNum(0); diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/OpenWaybillToBusinessListener.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/OpenWaybillToBusinessListener.java new file mode 100644 index 000000000..2009edd3c --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/OpenWaybillToBusinessListener.java @@ -0,0 +1,205 @@ +package com.logpm.trunkline.mq; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; +import com.logpm.trunkline.entity.TrunklineWaybillOrderEntity; +import com.logpm.trunkline.entity.TrunklineWaybillPackageEntity; +import com.logpm.trunkline.entity.TrunklineWaybillTrackEntity; +import com.logpm.trunkline.feign.ITrunklineAdvanceClient; +import com.logpm.trunkline.feign.ITrunklineAdvanceDetailClient; +import com.logpm.trunkline.feign.ITrunklineWaybillOrderClient; +import com.logpm.trunkline.feign.ITrunklineWaybillPackageClient; +import com.logpm.trunkline.service.IAsyncService; +import com.logpm.trunkline.service.ITrunklineWaybillTrackService; +import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; +import com.logpm.warehouse.entity.WarehouseWayBillDetail; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; +import com.logpm.warehouse.feign.IWarehouseWaybillClient; +import com.logpm.warehouse.feign.IWarehouseWaybillDetailClient; +import com.rabbitmq.client.Channel; +import jodd.util.ArraysUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.RabbitConstant; +import org.springblade.common.constant.broadcast.FanoutConstants; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.system.entity.Tenant; +import org.springblade.system.feign.ISysClient; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.*; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +/** + * 运单开单数据推送商场 + *
+ *
  • 站存单
  • + *
  • 站存单明细
  • + *
  • 运单
  • + *
  • 运单关联信息
  • + *
  • 运单关联暂存单
  • + *
  • 运单关联站存单明细
  • + */ +@Slf4j +@AllArgsConstructor +@Component +//@RabbitListener(queues = RabbitConstant.OPEN_WAYBILL_TO_BUSINESS_DATA_QUEUE) +public class OpenWaybillToBusinessListener { + + + private final IWarehouseWaybillClient warehouseWaybillClient; + + private final IWarehouseWaybillDetailClient warehouseWaybillDetailClient; + + private final ITrunklineWaybillOrderClient trunklineWaybillOrderClient; + + private final ITrunklineWaybillPackageClient trunklineWaybillPackageClient; + + private final ITrunklineAdvanceClient trunklineAdvanceClient; + + private final ITrunklineAdvanceDetailClient trunklineAdvanceDetailClient; + private final ISysClient sysClient; + + private final IAsyncService asyncService; + + private ITrunklineWaybillTrackService trunklineWaybillTrackService; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FanoutConstants.trunkline.OPENWAYBILL.QUEUE.SEND_BUSINESS_DATA_BY_OPENWAYBILL_DATA), + exchange = @Exchange(name = FanoutConstants.trunkline.OPENWAYBILL.EXCHANGE, type = ExchangeTypes.FANOUT) + )) + @Transactional(rollbackFor = Exception.class) + public void openWaybillToBusinessDataHandler(String message) { + + + JSONObject jsonObject = JSONUtil.parseObj(message); + Long waybillId = jsonObject.getLong("waybillId"); + if (ObjectUtil.isEmpty(waybillId)) { + log.warn("运单ID为null"); + return; + } + WarehouseWaybillEntity byWaybillId = warehouseWaybillClient.findByWaybillId(waybillId); + + R> tenantList = sysClient.getTenantList(); + Tenant tenant = null; + if (tenantList.isSuccess()) { + List data = tenantList.getData(); + for (Tenant datum : data) { + if (datum.getTenantType() == 2 && datum.getTenantName().equals(byWaybillId.getConsignee().trim())) { + tenant = datum; + break; + } + } + } + + + if (tenant != null) { + extractedTenant(tenant, byWaybillId); + } + + } + + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FanoutConstants.trunkline.UPDATEWAYBILL.QUEUE.SEND_BUSINESS_DATA_BY_UPDATEWAYBILL_DATA), + exchange = @Exchange(name = FanoutConstants.trunkline.UPDATEWAYBILL.EXCHANGE, type = ExchangeTypes.FANOUT) + )) + @Transactional(rollbackFor = Exception.class) + public void updateWaybillToBusinessDataHandler(String message) { + + + JSONObject jsonObject = JSONUtil.parseObj(message); + Long waybillId = jsonObject.getLong("waybillId"); + if (ObjectUtil.isEmpty(waybillId)) { + log.warn("运单ID为null"); + return; + } + WarehouseWaybillEntity byWaybillId = warehouseWaybillClient.findByWaybillId(waybillId); + String oldConsignee = (String) jsonObject.get("oldConsignee"); + + R> tenantList = sysClient.getTenantList(); + Tenant tenant = null; + Tenant oldTenant = null; + if (tenantList.isSuccess()) { + List data = tenantList.getData(); + for (Tenant datum : data) { + if (datum.getTenantType() == 2 && datum.getTenantName().equals(byWaybillId.getConsignee().trim())) { + tenant = datum; + } + + if (oldConsignee!=null && datum.getTenantType() == 2 && datum.getTenantName().equals(oldConsignee.trim())) { + oldTenant = datum; + } + + } + } + + if (!StringUtil.isBlank(oldConsignee)) { + // 证明存在之前的推送数据 + if (!byWaybillId.getConsignee().equals(oldConsignee)) { + // 证明修改的商家和之前推送的不一致 + // 需要去删除之前 推送的商家 + if (oldTenant != null) { + // 删除之前的推送的商家基础数据 + Tenant finalOldTenant = oldTenant; + CompletableFuture.supplyAsync(() -> { + asyncService.deleteWaybillData(finalOldTenant.getTenantId(), byWaybillId.getWaybillNo(), oldConsignee); + return null; + }); + } + } + } + if (tenant != null) { + extractedTenant(tenant, byWaybillId); + } + + } + + + + private void extractedTenant(Tenant tenant, WarehouseWaybillEntity byWaybillId) { + + List waybillIds = new ArrayList<>(); + waybillIds.add(byWaybillId.getId()); + + List warehouseWayBillDetails = warehouseWaybillDetailClient.findByWaybillId(byWaybillId.getId()); + + List trunklineWaybillOrderEntities = trunklineWaybillOrderClient.findListByWaybillIds(waybillIds); + + List trunklineWaybillPackageEntities = trunklineWaybillPackageClient.findListByWaybillIds(waybillIds); + + // 暂存单ID集合 + List collect = trunklineWaybillOrderEntities.stream().map(TrunklineWaybillOrderEntity::getAdvanceId).distinct().collect(Collectors.toList()); + + List trunklineAdvanceEntities = trunklineAdvanceClient.findListByIds(collect); + + // 获取暂存单明细 + List trunklineAdvanceDetailEntities = trunklineAdvanceDetailClient.findListByAdvanceIds(collect); + + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TrunklineWaybillTrackEntity::getWaybillId, byWaybillId.getId()); + queryWrapper.eq(TrunklineWaybillTrackEntity::getTrackType, "10"); + List list = trunklineWaybillTrackService.list(queryWrapper); + TrunklineWaybillTrackEntity trunklineWaybillTrackEntity = list.get(0); + Tenant finalTenant = tenant; + CompletableFuture.supplyAsync(() -> { + asyncService.saveOtherData(finalTenant.getTenantId(), byWaybillId, trunklineAdvanceDetailEntities, trunklineAdvanceEntities, trunklineWaybillPackageEntities, trunklineWaybillOrderEntities, warehouseWayBillDetails, trunklineWaybillTrackEntity); + return null; + }); + } + + +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/PackageFanoutListener.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/PackageFanoutListener.java new file mode 100644 index 000000000..c0acce262 --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mq/PackageFanoutListener.java @@ -0,0 +1,67 @@ +package com.logpm.trunkline.mq; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.service.ITrunklineAdvanceDetailService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.WorkNodeEnums; +import org.springblade.common.constant.broadcast.FanoutConstants; +import org.springblade.common.exception.CustomerException; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; + +@Slf4j +@Component +@AllArgsConstructor +public class PackageFanoutListener { + + private final ITrunklineAdvanceDetailService advanceDetailService; + private final IBasicdataWarehouseClient warehouseClient; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = FanoutConstants.trunkline.PACKAGNODE.QUEUE.PACKAGE_INCOMING), + exchange = @Exchange(name = FanoutConstants.trunkline.PACKAGNODE.EXCHANGE, type = ExchangeTypes.FANOUT) + )) + @Transactional(rollbackFor = Exception.class) + public void packageIncomingFanout(String msg) { + JSONObject jsonObject = JSONUtil.parseObj(msg); + Integer workNode = jsonObject.getInt("workNode"); + if(WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY.getCode().equals(workNode) + || WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE.getCode().equals(workNode)){ + Long warehouseId = jsonObject.getLong("warehouseId"); + BasicdataWarehouseEntity warehouseEntity = warehouseClient.getEntityWarehouseId(warehouseId); + if(Objects.isNull(warehouseEntity)){ + log.warn("###########packageSignFanout: 仓库信息不存在 warehouseId={}",warehouseId); + throw new CustomerException(405,"仓库信息不存在"); + } + + JSONArray orderPackageCodes = jsonObject.getJSONArray("orderPackageCodes"); + List orderPackageCodeList = orderPackageCodes.toList(String.class); + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("now_warehouse_id", warehouseId) + .set("now_warehouse_name", warehouseEntity.getName()) + .in("order_package_code", orderPackageCodeList); + advanceDetailService.update(updateWrapper); + + } + + + } + + +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IAsyncService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IAsyncService.java new file mode 100644 index 000000000..04ab83d9c --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IAsyncService.java @@ -0,0 +1,35 @@ +package com.logpm.trunkline.service; + +import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.trunkline.entity.*; +import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; +import com.logpm.warehouse.entity.WarehouseWayBillDetail; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; +import org.springblade.common.annotations.ChangeAsync; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public interface IAsyncService { + + CompletableFuture getResponseFromCp(List list, int queryType); + + CompletableFuture saveAdvanceEntity(List list, int queryType); + + CompletableFuture updateAdvanceEntity(List list, int queryType); + + + void saveOtherData(String tenantId,WarehouseWaybillEntity byWaybillId, List trunklineAdvanceDetailEntities, List trunklineAdvanceEntities, List trunklineWaybillPackageEntities, List trunklineWaybillOrderEntities, List warehouseWayBillDetails, TrunklineWaybillTrackEntity trunklineWaybillTrackEntity ); + + /** + * 根据租户ID 删除该租户下基于运单号的相关数 + *
  • 1.运单表
  • + *
  • 2.暂存单
  • + *
  • 3.暂存但明细
  • + *
  • 4.运单和暂存单关联表
  • + * @param tenantId 租户ID + * @param waybillNo 运单号 + * @param consignee 收货单位 + */ + void deleteWaybillData(String tenantId, String waybillNo,String consignee); +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ICarsLoadAsyncService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ICarsLoadAsyncService.java index f76c98808..ee8ea20a8 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ICarsLoadAsyncService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ICarsLoadAsyncService.java @@ -1,7 +1,11 @@ package com.logpm.trunkline.service; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import com.logpm.trunkline.entity.TrunklineCarsLoadEntity; import com.logpm.trunkline.entity.TrunklineCarsLoadLineEntity; +import com.logpm.trunkline.entity.TrunklineCarsUnloadLogEntity; + +import java.util.List; public interface ICarsLoadAsyncService { @@ -17,4 +21,9 @@ public interface ICarsLoadAsyncService { void abnormalListUnloadCheckByLoadIdAndWarehouseId(Long loadId, Long warehouseId, String nodeName, String tenantId, Long userId, String nickName, Long firstLong); + void dealwithAfterAbnormalPackage(String orderPackageCode, Long warehouseId, String warehouseName, String carsNo, Long userId, Long aLong, String nickName); + + void savaUnloadLogBatch(List unloadLogList); + + void sendRabbitMessageLoadScanData(List data); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IInComingService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IInComingService.java index f75e98021..1af3368d7 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IInComingService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IInComingService.java @@ -1,14 +1,21 @@ package com.logpm.trunkline.service; import com.logpm.trunkline.dto.InComingDTO; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; import org.springblade.core.tool.api.R; +import org.springframework.transaction.annotation.Transactional; public interface IInComingService { R incomingPackage(InComingDTO inComingDTO); - R findIncomingOrderList(InComingDTO inComingDTO); + R incomingPackages(InComingDTO inComingDTO); - R incomingBatchOrder(InComingDTO inComingDTO); + @Transactional(rollbackFor = Exception.class) + R incomingPackageByTaryCode(InComingDTO inComingDTO); + + R findIncomingOrderList(InComingDTO inComingDTO); + + R incomingBatchOrder(InComingDTO inComingDTO, WarehouseWaybillEntity waybillEntity); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IOpenOrderAsyncService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IOpenOrderAsyncService.java index 38f028df0..d75fcf07d 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IOpenOrderAsyncService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IOpenOrderAsyncService.java @@ -1,6 +1,8 @@ package com.logpm.trunkline.service; import com.logpm.trunkline.entity.TrunklineCarsLoadLineEntity; +import com.logpm.warehouse.entity.WarehouseWayBillDetail; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; import java.util.List; @@ -17,5 +19,13 @@ public interface IOpenOrderAsyncService { void saveUnloadStartCarLog(TrunklineCarsLoadLineEntity currentCarsLoadLineEntity, String nickName,Long userId); - void incomingPackageBatch(List advanceIds, Long userId, Long deptId, String tenantId, String nickName,Integer incomingType); + void incomingPackageBatch(List advanceIds, Long userId, Long deptId, String tenantId, String nickName,Integer incomingType,Long warehouseId,String warehouseName,WarehouseWaybillEntity waybillEntity); + + void saveUpdateLog(Long waybillId, String waybillNo, String trackType, String refer, String operationRemark, String nickName, Long userId, Long warehouseId, String warehouseName, WarehouseWaybillEntity waybillEntity); + + void sendOpenWaybillFanout(WarehouseWaybillEntity waybillEntity, List details, List advanceIds); + + void sendUpdateWaybillFanout(WarehouseWaybillEntity waybillEntity, List details, List advanceIds,String oldConsignee); + + void dealwithBillladingInfo(List advanceIds,Long warehouseId,String warehouseName,Long waybillId,String waybillNo); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IOpenOrderService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IOpenOrderService.java index c807177cd..d6dcb0b8a 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IOpenOrderService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IOpenOrderService.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.trunkline.dto.AdvanceDTO; import com.logpm.trunkline.dto.OpenLabelDTO; import com.logpm.trunkline.dto.OpenOrderDTO; -import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; import com.logpm.trunkline.vo.TrunklineAdvanceVO; import org.springblade.core.tool.api.R; @@ -44,11 +43,11 @@ public interface IOpenOrderService { R openLabel(OpenLabelDTO openLabelDTO); - R> openLabelHasPacakage(Long warehouseId, String warehouseName, MultipartFile file) throws IOException; + R openLabelHasPacakage(Long warehouseId, String warehouseName, MultipartFile file) throws IOException; - R> importCustomizedOuPai(Long warehouseId, String warehouseName, MultipartFile file) throws IOException; + R importCustomizedOuPai(Long warehouseId, String warehouseName, MultipartFile file) throws IOException; - R> importStandardOuPai(Long warehouseId, String warehouseName, MultipartFile file) throws IOException; + R importStandardOuPai(Long warehouseId, String warehouseName, MultipartFile file) throws IOException; R findWaybillDetail(OpenOrderDTO openOrderDTO); @@ -58,11 +57,11 @@ public interface IOpenOrderService { R findBrandList(OpenOrderDTO openOrderDTO); - R batchOpenLabel(Long warehouseId, String warehouseName, MultipartFile file) throws IOException; + R batchOpenLabel(Long warehouseId, String warehouseName, String warehouseCode, MultipartFile file) throws IOException; R findPayWayByClientId(Long clientId); - R> importOrderNoPackage(Long warehouseId, String warehouseName, MultipartFile file) throws IOException; + R importOrderNoPackage(Long warehouseId, String warehouseName, String warehouseCode, MultipartFile file) throws IOException; R checkWaybill(OpenOrderDTO openOrderDTO); @@ -80,6 +79,16 @@ public interface IOpenOrderService { R findWaybillReturnList(Long waybillId); + R findUpdateWaybillList(OpenOrderDTO openOrderDTO); + + R freezeWaybill(List waybillIds, Long warehouseId, String warehouseName); + + R unFreezeWaybill(List waybillIds, Long warehouseId, String warehouseName); + + R abolishWaybill(List waybillIds, Long warehouseId, String warehouseName, String abolishReson); + + R findWaybillDes(Long departureWarehouseId, Long consigneeId); + // R findWaybillInfo(String waybillNo); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IPackageTrackLogAsyncService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IPackageTrackLogAsyncService.java index 0e4110a87..76b1d080c 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IPackageTrackLogAsyncService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/IPackageTrackLogAsyncService.java @@ -1,9 +1,17 @@ package com.logpm.trunkline.service; +import com.alibaba.fastjson.JSONObject; +import com.logpm.warehouse.entity.WarehousePackageTrackLogEntity; + import java.util.List; +import java.util.Map; public interface IPackageTrackLogAsyncService { void addPackageTrackLog(String tenantId, Long userId, Long deptId, String nickName, List orderPackageCodes, Long warehouseId, String warehouseName, Integer workNode, String content); + void addBatchPackageTrackLog(List addPackageTrackLogList, List orderPackageCodes, Integer code, Map map); + + void sendPackageWorkNodeFanout(List orderPackageCodes, Integer workNode, Long warehouseId, Map map); + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ISendFanoutService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ISendFanoutService.java new file mode 100644 index 000000000..670365aee --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ISendFanoutService.java @@ -0,0 +1,7 @@ +package com.logpm.trunkline.service; + +import org.springblade.common.model.FanoutMsg; + +public interface ISendFanoutService{ + void sendFanoutMsg(FanoutMsg fanoutMsg); +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineAdvanceDetailService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineAdvanceDetailService.java index 189241e1c..09f559711 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineAdvanceDetailService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineAdvanceDetailService.java @@ -3,21 +3,24 @@ package com.logpm.trunkline.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.distribution.vo.OrderPackgeCodeDataVO; import com.logpm.trunkline.dto.AdvanceDetailDTO; +import com.logpm.trunkline.dto.OrderDetailsDTO; import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; import com.logpm.trunkline.vo.AdvanceDetailGoodsVO; import com.logpm.trunkline.vo.AdvanceDetailStockNumVO; import com.logpm.trunkline.vo.BillladingPackageVO; import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; +import org.apache.ibatis.annotations.Delete; import org.springblade.core.mp.base.BaseService; import org.springblade.core.tool.api.R; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; public interface ITrunklineAdvanceDetailService extends BaseService { - void updatePackageStatusById(String packageStatus, Long advanceDetailId, Long warehouseId, String warehouseName); + void updatePackageStatusById(String packageStatus, Long advanceDetailId, Long warehouseId, String warehouseName, Date incomingTime); TrunklineAdvanceDetailEntity findEntityByOrderPackageCodeAndWarehouseId(String orderPackageCode, Long warehouseId); @@ -68,6 +71,17 @@ public interface ITrunklineAdvanceDetailService extends BaseService类型的列表,包含与输入的订单包裹代码相匹配的所有包裹编码。 * 如果没有找到匹配的包裹编码,则返回空列表。 */ - List findPackageCodeByCodes(Set orderPackageCodes); + Map findPackageCodeByCodes(Set orderPackageCodes); + R findOrderDetails(OrderDetailsDTO orderDetailsDTO); + + void updateWaybillNoIsNullByAdvanceIds(List advanceIds); + + List findListByExistsAndOrderPackageCodes(List orderPackageCodeGroup); + + List findAdvanceDetailVoByAdvanceIds(List advanceIds); + + void deletedAdvanceByOrderCode(String orderCode); + + void deleteByWaybillNo(String waybillNo); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineAdvanceService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineAdvanceService.java index edba361d4..a826cd256 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineAdvanceService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineAdvanceService.java @@ -8,6 +8,7 @@ import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import com.logpm.trunkline.vo.CustomerInfoVO; import com.logpm.trunkline.vo.OpenOrderVO; import com.logpm.trunkline.vo.TrunklineAdvanceVO; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; import org.springblade.core.mp.base.BaseService; import java.util.List; @@ -36,6 +37,13 @@ public interface ITrunklineAdvanceService extends BaseService findIncomingOrderList(InComingDTO inComingDTO); - List incomingPackageBatch(Long advanceId, Long warehouseId, List detailList, Long userId, Long deptId, String tenantId); + List incomingPackageBatch(Long advanceId, Long warehouseId, List detailList, Long userId, Long deptId, String tenantId, WarehouseWaybillEntity waybillEntity); + List findListByExistsAndOrderCodeSet(List orderCodeSet); + + boolean saveOrderAndPackages(List advanceDetailEntities, Long warehouseId); + + Boolean cancelOrder(String orderCode); + + void deleteByWaybillNo(String waybillNo); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingPackageServicie.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingPackageServicie.java index 50f7d0fb8..34c35b9da 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingPackageServicie.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingPackageServicie.java @@ -6,6 +6,8 @@ import com.logpm.trunkline.entity.TrunklineBillladingPackageEntity; import com.logpm.trunkline.vo.TrunklineBillladingPackageVO; import org.springblade.core.mp.base.BaseService; +import java.util.List; + public interface ITrunklineBillladingPackageServicie extends BaseService { void saveEntity(String orderPackageCode, Long billladingId,Long warehouseId,Integer incomingType); @@ -14,4 +16,10 @@ public interface ITrunklineBillladingPackageServicie extends BaseService findBillladingPackages(List orderPackageCodes); + + void saveEntityBatch(List noOrderPackageCodes, Long billladingId, Long warehouseId, Integer incomingType); + + List findListByBillladingAndWaybillId(Long billladingId, Long waybillId); + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingService.java index cc771b06e..1b0b6eef1 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingService.java @@ -44,4 +44,7 @@ public interface ITrunklineBillladingService extends BaseService findAdvanceDetailList(BillladingDTO billladingDTO); + + R findBillladingLogList(Long billladingId); + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingWaybillService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingWaybillService.java index c960ff80a..f8f1ff4f9 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingWaybillService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineBillladingWaybillService.java @@ -3,6 +3,7 @@ package com.logpm.trunkline.service; import com.logpm.trunkline.entity.TrunklineBillladingEntity; import com.logpm.trunkline.entity.TrunklineBillladingWaybillEntity; import com.logpm.trunkline.entity.TrunklineWaybillOrderEntity; +import com.logpm.trunkline.vo.TrunklineBillladingNumVO; import com.logpm.trunkline.vo.TrunklineBillladingWaybillVO; import org.springblade.core.mp.base.BaseService; @@ -33,5 +34,11 @@ public interface ITrunklineBillladingWaybillService extends BaseService findNoFinishWaybillByBillladingId(Long billladingId); + + TrunklineBillladingNumVO getNumVOByBillladingId(Long billladingId); + + List getNoDataWaybillByBillladingIds(List billladingIds); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsLoadScanService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsLoadScanService.java index 51bd8eabe..1b481d0b7 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsLoadScanService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsLoadScanService.java @@ -1,12 +1,17 @@ package com.logpm.trunkline.service; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.distribution.entity.DistributionStockArticleEntity; import com.logpm.trunkline.dto.LoadCarsDTO; import com.logpm.trunkline.dto.ProductInfoDTO; import com.logpm.trunkline.entity.TrunklineCarsLoadScanEntity; import com.logpm.trunkline.vo.*; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; import org.springblade.core.mp.base.BaseService; +import java.util.Date; import java.util.List; import java.util.Map; @@ -30,7 +35,7 @@ public interface ITrunklineCarsLoadScanService extends BaseService findProductInfoList(Long loadId, String trayCode, String waybillNo); - IPage loadingDetail(IPage page, LoadCarsDTO loadCarsDTO); + IPage loadingDetail(IPage page, LoadCarsDTO loadCarsDTO); List findCarsLoadingOrderDetail(Long loadId, String orderCode, Long warehouseId); @@ -82,7 +87,7 @@ public interface ITrunklineCarsLoadScanService extends BaseService findUnloadGoods(Long loadId, Long warehouseId, String orderCode, String waybillNo); - void updateScanStatus(List loadScanIds, String scanStatus); + void updateScanStatusAndTime(List loadScanIds, String scanStatus,Date unloadTime,String signUserName,Long warehouseId,String warehouseName); List findLoadScanWaybillList(Long loadId, Long nodeId); @@ -108,7 +113,7 @@ public interface ITrunklineCarsLoadScanService extends BaseService findUnloadByLoadIdAndWarehouseId(Long loadId, Long warehouseId); - void updateScanStatusByLoadId(Long loadId, String scanStatus); + void updateScanStatusByLoadId(Long loadId, String scanStatus, Date unloadTime,String signUserName); List findSignListOrderPackageCodes(Long loadId); @@ -122,4 +127,37 @@ public interface ITrunklineCarsLoadScanService extends BaseService findWaybillTransferInfo(Long waybillId); + List loadingDetailExport(LoadCarsDTO loadCarsDTO); + + Integer findSignNumByLoadId(Long loadId); + + UnloadReportVO findUnloadReport(Long loadId, Long warehouseId); + + List findParceListByCarsLoadScanIds(List carsLoadScanIds); + + List findOrderListByCarsLoadScanIds(List carsLoadScanIds); + + List findWaybillListByCarsLoadScanIds(List carsLoadScanIds); + + List findListByIdsNoPackage(List carsLoadScanIds, Long warehouseId); + + List findIncomingOrdeCodesByCarsLoadScanIds(List carsLoadScanIds, Long warehouseId); + + List findListHasSignOrderIdByIds(List loadScanIds); + + List findCarsLoadScanIdsByWaybillIds(List waybillIds); + + List findAbnormalData(Long loadId); + + List findUnloadZeroList(Long loadId, Long warehouseId); + + JSONObject findUnloadNumAudio(Long loadId, Long warehouseId); + + void updateFinalNodeIdAndFinalNodeNameByLoadIdNoData(Long loadId, Long warehouseId, String warehouseName); + + void deleteListByCarsLoadScanIds(List carsLoadScanIdList); + + void clearSignOrderIdByLoadIdAndWarehouseIdAndOrderCodeAndWaybillNo(Long finalLoadId1, Long nodeId, String orderCode, String waybillNo); + + void addSignOrderIdByLoadIdAndNodeIdAndOrderCodeAndWaybillNo(Long finalLoadId, Long nodeId, String orderCode, String waybillNo, Long signOrderId); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsLoadService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsLoadService.java index 342f8c137..75d6eca9a 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsLoadService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsLoadService.java @@ -5,6 +5,7 @@ import com.logpm.trunkline.dto.BatchUnloadDTO; import com.logpm.trunkline.dto.LoadCarsDTO; import com.logpm.trunkline.dto.TrunklineCarsLoadDTO; import com.logpm.trunkline.entity.TrunklineCarsLoadEntity; +import com.logpm.trunkline.vo.LoadingDetailExportVO; import com.logpm.trunkline.vo.TripartiteTransferVO; import com.logpm.trunkline.vo.TrunklineCarsLoadVO; import org.springblade.core.mp.base.BaseService; @@ -155,7 +156,7 @@ public interface ITrunklineCarsLoadService extends BaseService loadingDetailExport(LoadCarsDTO loadCarsDTO); + + R tripartiteTransferFindSignPhoto(LoadCarsDTO loadCarsDTO); + + R tripartiteTransferUploadSignPhoto(LoadCarsDTO loadCarsDTO); + + R findWarehouseUnloadReport(LoadCarsDTO loadCarsDTO); + + R findSignOrderPageList(LoadCarsDTO loadCarsDTO); + + R findSignPhotoList(LoadCarsDTO loadCarsDTO); + + R adnormalHasStock(Long carsLoadScanId, Long warehouseId); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsOrderService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsOrderService.java index ed3466a15..ed8b92cf9 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsOrderService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsOrderService.java @@ -42,9 +42,9 @@ public interface ITrunklineCarsOrderService extends BaseService findSignOrderListBy(Long loadId, Long warehouseId); - List findSignOrderList(Long loadId, Long warehouseId); + List findSignOrderList(Long loadId, Long warehouseId,Long signOrderId); - List findSignZeroOrderList(Long loadId, Long warehouseId); + List findSignZeroOrderList(Long loadId, Long warehouseId,Long signOrderId); Integer findSignNumBySignOrderId(Long signOrderId); @@ -55,4 +55,10 @@ public interface ITrunklineCarsOrderService extends BaseService findLoadingList(Long loadId, Long nodeId); + + Integer findLoadingNumBySignOrderId(Long signOrderId); + + void updateNoCustomer(List updateCarsOrderIdList); + + List findMallOrderList(List carsOrderIdList); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsSignLogService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsSignLogService.java index 7c3040569..4863d2dd5 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsSignLogService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsSignLogService.java @@ -4,8 +4,12 @@ import com.logpm.trunkline.entity.TrunklineCarsLoadScanEntity; import com.logpm.trunkline.entity.TrunklineCarsSignLogEntity; import org.springblade.core.mp.base.BaseService; +import java.util.List; + public interface ITrunklineCarsSignLogService extends BaseService { void addEntity(TrunklineCarsLoadScanEntity carsLoadScanEntity,String remark); void saveSignLog(Long warehouseId,String warehouseName,Long loadId,String loadCode,Long waybillId,String waybillNo,String orderCode,String scanCode,Integer num,Integer type,Integer isData,Integer isAbnormal,Long trayId,String trayCode,String trayName,Long fromWarehouseId,Long loadScanId,String remark); + + void addList(List updateCarsLoadScanList, String remark); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsUnloadLogService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsUnloadLogService.java index 1b66ee6be..65d56eb5d 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsUnloadLogService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCarsUnloadLogService.java @@ -1,7 +1,6 @@ package com.logpm.trunkline.service; import com.logpm.trunkline.entity.TrunklineCarsUnloadLogEntity; -import com.logpm.trunkline.vo.UnloadScanOrderVO; import org.springblade.core.mp.base.BaseService; import java.util.List; @@ -21,4 +20,5 @@ public interface ITrunklineCarsUnloadLogService extends BaseService unloadLogList); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCostShareRecordService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCostShareRecordService.java index 8969f835a..8145fdef2 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCostShareRecordService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineCostShareRecordService.java @@ -17,4 +17,6 @@ public interface ITrunklineCostShareRecordService extends BaseService findSignOrderPageList(IPage page, LoadCarsDTO loadCarsDTO); + + void deleteListBySignOrderIds(List delSignOrderList); + + List findSignOrderListByLoadId(Long loadId); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillJsonService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillJsonService.java new file mode 100644 index 000000000..271e00883 --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillJsonService.java @@ -0,0 +1,7 @@ +package com.logpm.trunkline.service; + +import com.logpm.trunkline.entity.TrunklineWaybillJsonEntity; +import org.springblade.core.mp.base.BaseService; + +public interface ITrunklineWaybillJsonService extends BaseService { +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillOrderService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillOrderService.java index c1e0a47fb..dbe111831 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillOrderService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillOrderService.java @@ -19,4 +19,10 @@ public interface ITrunklineWaybillOrderService extends BaseService findAdvanceIdsByWaybillIds(List waybillIds); + + void deleteByWaybillNo(String waybillNo); + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillPackageService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillPackageService.java index 0b75c8f2c..46527ad2c 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillPackageService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillPackageService.java @@ -1,11 +1,13 @@ package com.logpm.trunkline.service; +import com.alibaba.fastjson.JSONObject; import com.logpm.trunkline.entity.TrunklineWaybillPackageEntity; import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; import com.logpm.warehouse.entity.WarehouseWaybillEntity; import org.springblade.core.mp.base.BaseService; import java.util.List; +import java.util.Map; public interface ITrunklineWaybillPackageService extends BaseService { void saveList(List list, WarehouseWaybillEntity waybillEntity); @@ -13,6 +15,8 @@ public interface ITrunklineWaybillPackageService extends BaseService orderPackageCodes, Integer workNode); + void updatePackageStatus(List orderPackageCodes, Integer workNode, Long warehouseId, Map map); + + void deleteByWaybillNo(String waybillNo); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillTrackService.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillTrackService.java index 49f238f09..da3b2cff2 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillTrackService.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/ITrunklineWaybillTrackService.java @@ -1,10 +1,17 @@ package com.logpm.trunkline.service; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.trunkline.dto.OpenOrderDTO; import com.logpm.trunkline.entity.TrunklineWaybillTrackEntity; +import com.logpm.trunkline.vo.TrunklineWaybillTrackVO; import org.springblade.core.mp.base.BaseService; import java.util.List; public interface ITrunklineWaybillTrackService extends BaseService { List findWaybillLog(Long waybillId, String trackType); + + IPage findUpdateWaybillList(IPage page, OpenOrderDTO openOrderDTO); + + void deleteByWaybillNo(String waybillNo); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/AsyncServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/AsyncServiceImpl.java new file mode 100644 index 000000000..a5fd5b843 --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/AsyncServiceImpl.java @@ -0,0 +1,388 @@ +package com.logpm.trunkline.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.trunkline.entity.*; +import com.logpm.trunkline.service.*; +import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; +import com.logpm.warehouse.entity.WarehouseWayBillDetail; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; +import com.logpm.warehouse.feign.IWarehouseWaybillClient; +import com.logpm.warehouse.feign.IWarehouseWaybillDetailClient; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.ChangeAsync; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.system.entity.Tenant; +import org.springblade.system.feign.ISysClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class AsyncServiceImpl implements IAsyncService { + + @Autowired + private ITrunklineAdvanceService advanceService; + @Autowired + private ITrunklineAdvanceDetailService advanceDetailService; + @Autowired + private IWarehouseWaybillClient warehouseWaybillClient; + @Autowired + private IWarehouseWaybillDetailClient warehouseWaybillDetailClient; + @Autowired + private ISysClient sysClient; + @Autowired + private BladeRedis bladeRedis; + @Autowired + private ITrunklineWaybillOrderService waybillOrderService; + @Autowired + private ITrunklineWaybillPackageService trunklineWaybillPackageService; + + @Autowired + private IWarehouseWaybillClient waybillClient; + @Autowired + private IBasicdataWarehouseClient warehouseClient; + + @Autowired + private ITrunklineWaybillTrackService trunklineWaybillTrackService; + + @LogpmAsync("asyncExecutor") + @Override + public CompletableFuture getResponseFromCp(List list, int queryType) { + return CompletableFuture + .completedFuture( + advanceDetailService.saveBatch(list) + ); + } + + @LogpmAsync("asyncExecutor") + @Override + public CompletableFuture saveAdvanceEntity(List list, int queryType) { + return CompletableFuture + .completedFuture( + advanceService.saveBatch(list) + ); + } + + @LogpmAsync("asyncExecutor") + @Override + public CompletableFuture updateAdvanceEntity(List list, int queryType) { + return CompletableFuture + .completedFuture( + advanceService.updateBatchById(list) + ); + } + + @ChangeAsync() + @Override + public void saveOtherData(String tenantId, WarehouseWaybillEntity waybillBilllByWaybillNo, List trunklineAdvanceDetailEntities, List trunklineAdvanceEntities, List trunklineWaybillPackageEntities, List trunklineWaybillOrderEntities, List warehouseWayBillDetails, TrunklineWaybillTrackEntity trunklineWaybillTrackEntity) { + + log.info(">>> 执行保存数据到商家数据的功能 "); + // 保存暂存单 + Tenant tenant = null; + R tenantFeign = sysClient.getTenant(tenantId); + + if (tenantFeign.isSuccess()) { + tenant = tenantFeign.getData(); + } + String mallName = tenant.getTenantName(); + log.info(">>> 执行保存数据到商家数据的功能 商家名称{}",tenant.getTenantName()); + + for (TrunklineAdvanceEntity trunklineAdvanceEntity : trunklineAdvanceEntities) { + + List t = trunklineAdvanceDetailEntities.stream().filter(trunklineAdvanceDetailEntity -> trunklineAdvanceDetailEntity.getAdvanceId().equals(trunklineAdvanceEntity.getId())).collect(Collectors.toList()); + + saveTrunklineAdvanceEntity(trunklineAdvanceEntity, mallName); + + // 保存暂存子表 + saveTrunklineAdvanceDetailEntity(t, trunklineAdvanceEntity, mallName); + } + List collect = trunklineAdvanceEntities.stream().map(TrunklineAdvanceEntity::getId).distinct().collect(Collectors.toList()); + + // 重新查询trunklineAdvanceDetail + List listByAdvanceIds = advanceDetailService.findAdvanceDetailVoByAdvanceIds(collect); + + // 保存运单 + BasicdataWarehouseEntity basicdataWarehouseEntity = getBasicdataWarehouseEntity(mallName); + + + List collect1 = trunklineWaybillOrderEntities.stream().filter(trunklineWaybillOrderEntity -> trunklineWaybillOrderEntity.getWaybillId().equals(waybillBilllByWaybillNo.getId())).collect(Collectors.toList()); + List t = warehouseWayBillDetails.stream().filter(warehouseWayBillDetail -> warehouseWayBillDetail.getWaybillId().equals(waybillBilllByWaybillNo.getId())).collect(Collectors.toList()); + + + // 修改运单的起始仓库 和末端仓 + waybillBilllByWaybillNo.setDepartureWarehouseName(waybillBilllByWaybillNo.getDestinationWarehouseName()); + waybillBilllByWaybillNo.setDepartureWarehouseId(null); + + // 目的仓 + if (basicdataWarehouseEntity != null) { + waybillBilllByWaybillNo.setDestinationWarehouseId(basicdataWarehouseEntity.getId()); + waybillBilllByWaybillNo.setDestinationWarehouseName(basicdataWarehouseEntity.getName()); + } + + + waybillBilllByWaybillNo.setTenantId(tenant.getTenantId()); + + WarehouseWaybillEntity byWaybillNo = warehouseWaybillClient.findByWaybillNo(waybillBilllByWaybillNo.getWaybillNo()); + if (byWaybillNo == null) { + Long l = warehouseWaybillClient.addEnntity(waybillBilllByWaybillNo); + waybillBilllByWaybillNo.setId(l); + } else { + waybillBilllByWaybillNo.setId(byWaybillNo.getId()); + } + + List byWaybillId = warehouseWaybillDetailClient.findByWaybillId(waybillBilllByWaybillNo.getId()); + + for (WarehouseWayBillDetail warehouseWayBillDetail : t) { + warehouseWayBillDetail.setId(null); + for (WarehouseWayBillDetail wayBillDetail : byWaybillId) { + + if (wayBillDetail.getProductName().equals(warehouseWayBillDetail.getProductName())) { + // 不执行 + warehouseWayBillDetail.setId(wayBillDetail.getId()); + break; + } + } + + if (warehouseWayBillDetail.getId() == null) { + warehouseWayBillDetail.setWaybillId(waybillBilllByWaybillNo.getId()); + warehouseWaybillDetailClient.addEntity(warehouseWayBillDetail); + } + + + } + + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("waybill_no", waybillBilllByWaybillNo.getWaybillNo()); + List listByWaybillNo = waybillOrderService.list(queryWrapper); + + for (TrunklineWaybillOrderEntity trunklineWaybillOrderEntity : collect1) { + + trunklineWaybillOrderEntity.setId(null); + List collect3 = trunklineWaybillPackageEntities.stream().filter(ts -> { + return ts.getWaybillNo().equals(trunklineWaybillOrderEntity.getWaybillNo()) && ts.getAdvanceId().equals(trunklineWaybillOrderEntity.getAdvanceId()); + }).collect(Collectors.toList()); + + trunklineWaybillOrderEntity.setWaybillId(waybillBilllByWaybillNo.getId()); + trunklineWaybillOrderEntity.setTenantId(tenant.getTenantId()); + + Optional entityWithOrderNumber1123 = trunklineAdvanceEntities.stream() + .filter(entity -> trunklineWaybillOrderEntity.getOrderCode().equals(entity.getOrderCode())) // 过滤出订单号为"1123"的实体 + .findFirst(); // 获取第一个匹配的实体 + + if (entityWithOrderNumber1123.isPresent()) { + TrunklineAdvanceEntity foundEntity = entityWithOrderNumber1123.get(); + // 使用找到的实体 + trunklineWaybillOrderEntity.setAdvanceId(foundEntity.getId()); + + } + + + for (TrunklineWaybillOrderEntity waybillOrderEntity : listByWaybillNo) { + + if (waybillOrderEntity.getOrderCode().equals(trunklineWaybillOrderEntity.getOrderCode())) { + trunklineWaybillOrderEntity.setId(waybillOrderEntity.getId()); + } + + } + if (trunklineWaybillOrderEntity.getId() == null) { + + waybillOrderService.save(trunklineWaybillOrderEntity); + + } + + + List ids = Collections.singletonList(waybillBilllByWaybillNo.getId()); + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(TrunklineWaybillPackageEntity::getWaybillId, ids); + List listByWaybillIds = trunklineWaybillPackageService.list(lambdaQueryWrapper); + + for (TrunklineWaybillPackageEntity trunklineWaybillPackageEntity : collect3) { + trunklineWaybillPackageEntity.setId(null); + trunklineWaybillPackageEntity.setWaybillId(waybillBilllByWaybillNo.getId()); + trunklineWaybillPackageEntity.setTenantId(tenant.getTenantId()); + + trunklineWaybillPackageEntity.setAdvanceId(trunklineWaybillOrderEntity.getAdvanceId()); + + for (TrunklineAdvanceDetailVO listByAdvanceId : listByAdvanceIds) { + if (listByAdvanceId.getAdvanceId().equals(trunklineWaybillOrderEntity.getAdvanceId())) { + + if (listByAdvanceId.getOrderPackageCode().equals(trunklineWaybillPackageEntity.getOrderPackageCode())) { + trunklineWaybillPackageEntity.setAdvanceDetailId(listByAdvanceId.getId()); + + } + } + } + + for (TrunklineWaybillPackageEntity listByWaybillId : listByWaybillIds) { + + if (listByWaybillId.getWaybillId().equals(trunklineWaybillPackageEntity.getWaybillId())) { + if (listByWaybillId.getOrderPackageCode().equals(trunklineWaybillPackageEntity.getOrderPackageCode())) { + trunklineWaybillPackageEntity.setId(listByWaybillId.getId()); + break; + } + } + + } + if (trunklineWaybillPackageEntity.getId() == null) { + trunklineWaybillPackageService.save(trunklineWaybillPackageEntity); + } + + } + + } + + + // 查询运单作业节点数据 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(TrunklineWaybillTrackEntity::getWaybillNo, waybillBilllByWaybillNo.getWaybillNo()); + lambdaQueryWrapper.eq(TrunklineWaybillTrackEntity::getTrackType, "10"); + List list = trunklineWaybillTrackService.list(lambdaQueryWrapper); + if (list.isEmpty()) { + + trunklineWaybillTrackEntity.setWaybillId(waybillBilllByWaybillNo.getId()); + trunklineWaybillTrackEntity.setTenantId(tenant.getTenantId()); + BasicdataWarehouseEntity basicdataWarehouseEntity1 = getBasicdataWarehouseEntity(mallName); + trunklineWaybillTrackEntity.setWarehouseId(basicdataWarehouseEntity1.getId()); + trunklineWaybillTrackEntity.setWarehouseName(basicdataWarehouseEntity1.getName()); + trunklineWaybillTrackService.save(trunklineWaybillTrackEntity); + } + + } + + @ChangeAsync() + @Override + public void deleteWaybillData(String tenantId, String waybillNo,String consignee) { + + + try{ + log.info("执行删除商场推送数据清理动作 商场名称:{}",consignee); + // 根据运单号删除运单logpm_trunkline_waybill_package 的数据 + trunklineWaybillPackageService.deleteByWaybillNo(waybillNo); + // 根据运单号删除 logpm_trunkline_waybill_order 的数据 + waybillOrderService.deleteByWaybillNo(waybillNo); + + // 根据运单号删除 logpm_warehouse_waybill_detail + warehouseWaybillDetailClient.deleteByWaybillNo(waybillNo); + + // 根据运单号删除 logpm_warehouse_waybill + warehouseWaybillClient.deleteByWaybillNo(waybillNo); + + // 根据运单号删除 logpm_trunkline_advance_detail + advanceService.deleteByWaybillNo(waybillNo); + + // 根据运单号删除 logpm_trunkline_advance + advanceDetailService.deleteByWaybillNo(waybillNo); + + // 根据运单号 删除 logpm_trunkline_waybill_track + trunklineWaybillTrackService.deleteByWaybillNo(waybillNo); + }catch (Exception e){ + e.printStackTrace(); + } + + + + } + + private BasicdataWarehouseEntity getBasicdataWarehouseEntity(String mallName) { + String cacheName = mallName + "仓"; + BasicdataWarehouseEntity basicdataWarehouseEntity = bladeRedis.get(cacheName); + if (basicdataWarehouseEntity == null) { + basicdataWarehouseEntity = warehouseClient.findByName(mallName + "仓"); + bladeRedis.setEx(cacheName, basicdataWarehouseEntity, 60 * 60 * 24L); + } + return basicdataWarehouseEntity; + } + + private void saveTrunklineAdvanceDetailEntity(List t, TrunklineAdvanceEntity trunklineAdvanceEntity, String mallName) { + Tenant tenant = changeDataBase(mallName); + + List ids = Collections.singletonList(trunklineAdvanceEntity.getId()); + + List listByAdvanceIds = advanceDetailService.findAdvanceDetailVoByAdvanceIds(ids); + + + List saveObjs = new ArrayList<>(); + + for (TrunklineAdvanceDetailEntity trunklineAdvanceDetailEntity : t) { + + trunklineAdvanceDetailEntity.setId(null); + // 检测 保存的对象是否已经存在 + for (TrunklineAdvanceDetailVO listByAdvanceId : listByAdvanceIds) { + if (listByAdvanceId.getOrderPackageCode().equals(trunklineAdvanceDetailEntity.getOrderPackageCode())) { + trunklineAdvanceDetailEntity.setId(listByAdvanceId.getId()); + break; + } + } + + if (trunklineAdvanceDetailEntity.getId() == null) { + trunklineAdvanceDetailEntity.setPackageStatus("0"); + trunklineAdvanceDetailEntity.setAdvanceId(trunklineAdvanceEntity.getId()); + trunklineAdvanceDetailEntity.setTenantId(tenant.getTenantId()); + trunklineAdvanceDetailEntity.setIncomingWarehouseId(null); + trunklineAdvanceDetailEntity.setIncomingWarehouseName(null); + BasicdataWarehouseEntity basicdataWarehouseEntity = getBasicdataWarehouseEntity(mallName); + if (basicdataWarehouseEntity != null) { + trunklineAdvanceDetailEntity.setWarehouseId(basicdataWarehouseEntity.getId()); + trunklineAdvanceDetailEntity.setWarehouseName(basicdataWarehouseEntity.getName()); + } + saveObjs.add(trunklineAdvanceDetailEntity); + + } + } + advanceDetailService.saveBatch(saveObjs); + } + + + private TrunklineAdvanceEntity saveTrunklineAdvanceEntity(TrunklineAdvanceEntity trunklineAdvanceEntity, String mallName) { + Tenant tenant = changeDataBase(mallName); + // 查找商户的暂存单是否存在改制 + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_code", trunklineAdvanceEntity.getOrderCode()); + queryWrapper.eq("waybill_no", trunklineAdvanceEntity.getWaybillNo()) + .last("limit 1"); + TrunklineAdvanceEntity trunklineAdvanceEntity1 = advanceService.getOne(queryWrapper); + BasicdataWarehouseEntity basicdataWarehouseEntity = getBasicdataWarehouseEntity(mallName); + if (ObjectUtil.isEmpty(trunklineAdvanceEntity1)) { + // 保存对象 + if (basicdataWarehouseEntity != null) { + trunklineAdvanceEntity.setWarehouseId(basicdataWarehouseEntity.getId()); + trunklineAdvanceEntity.setWarehouseName(basicdataWarehouseEntity.getName()); + } + trunklineAdvanceEntity.setTenantId(tenant.getTenantId()); + advanceService.save(trunklineAdvanceEntity); + + return trunklineAdvanceEntity; + } else { + return trunklineAdvanceEntity1; + } + + } + + private Tenant changeDataBase(String maillName) { + R tenantByName = sysClient.getTenantByName(maillName); + if (tenantByName.isSuccess()) { + Tenant tenant = tenantByName.getData(); + if (ObjectUtil.isEmpty(tenant)) { + log.info(">>>>>>>>>>>>> saveOtherDataBaseNew 租户不存在"); + return null; + } + return tenant; + } + return null; + } + +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/CarsLoadAsyncServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/CarsLoadAsyncServiceImpl.java index d11c953de..d6f8153b5 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/CarsLoadAsyncServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/CarsLoadAsyncServiceImpl.java @@ -1,32 +1,37 @@ package com.logpm.trunkline.service.impl; +import cn.hutool.core.util.IdUtil; +import cn.hutool.json.JSONUtil; import com.logpm.aftersales.entity.AftersalesAbnormalRecordEntity; import com.logpm.aftersales.feign.IAftersalesAbnormalRecordClient; +import com.logpm.aftersales.feign.IAftersalesWorkOrderClient; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; import com.logpm.distribution.entity.DistributionStockArticleEntity; import com.logpm.distribution.feign.IDistributionStockArticleClient; import com.logpm.trunkline.entity.*; import com.logpm.trunkline.service.*; +import com.logpm.trunkline.vo.UnloadReportVO; import com.logpm.warehouse.entity.WarehouseWaybillEntity; import com.logpm.warehouse.feign.IWarehouseWaybillClient; import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.LogpmAsync; import org.springblade.common.constant.DictBizConstant; +import org.springblade.common.constant.RabbitConstant; import org.springblade.common.constant.TenantNum; import org.springblade.common.constant.carsload.CarsLoadLogTypeConstant; import org.springblade.common.exception.CustomerException; import org.springblade.common.utils.CommonUtil; import org.springblade.system.cache.DictBizCache; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.util.*; @Slf4j @Service @@ -37,6 +42,8 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { @Autowired private ITrunklineCarsLoadScanService trunklineCarsLoadScanService; @Autowired + private ITrunklineCarsLoadLineService trunklineCarsLoadLineService; + @Autowired private IWarehouseWaybillClient warehouseWaybillClient; @Autowired private ITrunklineCostShareRecordService trunklineCostShareRecordService; @@ -47,8 +54,14 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { @Lazy @Autowired private IAftersalesAbnormalRecordClient abnormalRecordClient; + @Autowired + private IAftersalesWorkOrderClient aftersalesWorkOrderClient; + @Autowired + private ITrunklineCarsUnloadLogService trunklineCarsUnloadLogService; + @Autowired + private RabbitTemplate rabbitTemplate; - @Async + @LogpmAsync("asyncExecutor") @Override public void saveLog(TrunklineCarsLoadEntity carsLoadEntity, TrunklineCarsLoadLineEntity carsLoadLineEntity, int cardLoadType,String nickName,Long userId) { String nodeName = null; @@ -158,7 +171,7 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { trunklineCarsLoadLogService.save(carsLoadLogEntity); } - @Async + @LogpmAsync("asyncExecutor") @Override public void saveCostShareRecord(Long loadId, TrunklineCarsLoadEntity carsLoadEntity, Long userId, String tenantId, String deptIds) { Long deptId = null; @@ -243,7 +256,7 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { } - @Async + @LogpmAsync("asyncExecutor") @Override public void costShareByLoadId(Long loadId,TrunklineCarsLoadEntity carsLoadEntity) { @@ -324,7 +337,7 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { } - @Async + @LogpmAsync("asyncExecutor") @Override public void abnormalListStartCarByLoadIdAndWarehouseId(Long loadId, Long warehouseId,Long userId,Long deptId,String nickName,String tenantId,String warehouseName) { @@ -347,8 +360,8 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { abnormalRecordEntity.setType("2"); abnormalRecordEntity.setAbnormalType("2"); abnormalRecordEntity.setCarType("1"); - abnormalRecordEntity.setUpWarehouseId(warehouseId); - abnormalRecordEntity.setUpWarehouseName(warehouseName); + abnormalRecordEntity.setWarehouseId(warehouseId); + abnormalRecordEntity.setWarehouseName(warehouseName); abnormalRecordEntity.setCarsNo(loadCode); abnormalRecordEntity.setWaybillNo(waybillNo); abnormalRecordEntity.setOrderCode(orderCode); @@ -365,7 +378,7 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { } } - @Async + @LogpmAsync("asyncExecutor") @Override public void abnormalListUnloadByLoadIdAndWarehouseId(Long loadId, Long warehouseId, String warehouseName, Long loadScanId, String tenantId, Long userId, String nickName, Long deptId) { TrunklineCarsLoadScanEntity carsLoadScanEntity = trunklineCarsLoadScanService.getById(loadScanId); @@ -383,26 +396,42 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { abnormalRecordEntity.setType("1"); abnormalRecordEntity.setAbnormalType("3"); abnormalRecordEntity.setCarType("1"); - abnormalRecordEntity.setUpWarehouseId(warehouseId); - abnormalRecordEntity.setUpWarehouseName(warehouseName); + abnormalRecordEntity.setWarehouseId(warehouseId); + abnormalRecordEntity.setWarehouseName(warehouseName); abnormalRecordEntity.setCarsNo(loadCode); abnormalRecordEntity.setWaybillNo(waybillNo); abnormalRecordEntity.setOrderCode(orderCode); abnormalRecordEntity.setOrderPackageCode(scanCode); abnormalRecordEntity.setUpUserId(userId); abnormalRecordEntity.setUpUserName(nickName); - abnormalRecordEntity.setAbnormalStatus(0); + abnormalRecordEntity.setDealTime(new Date()); + abnormalRecordEntity.setDealUserId(userId); + abnormalRecordEntity.setDealUserName(nickName); + abnormalRecordEntity.setAbnormalStatus(1); abnormalRecordEntity.setUpTime(new Date()); abnormalRecordEntity.setAssociationId(loadScanId); abnormalRecordEntity.setAssociationType(1); - abnormalRecordEntity.setRemark("无装车记录"); + abnormalRecordEntity.setRemark("无装车记录 系统自动完结"); abnormalRecordClient.addAbnormalRecord(abnormalRecordEntity); } } - @Async + @LogpmAsync("asyncExecutor") @Override public void abnormalListUnloadCheckByLoadIdAndWarehouseId(Long loadId, Long warehouseId, String warehouseName, String tenantId, Long userId, String nickName, Long deptId) { + + log.info("################abnormalListUnloadCheckByLoadIdAndWarehouseId: 卸车报告生成开始 loadId={}",loadId); + + UnloadReportVO unloadReportVO = trunklineCarsLoadScanService.findUnloadReport(loadId,warehouseId); + TrunklineCarsLoadLineEntity carsLoadLineEntity = trunklineCarsLoadLineService.findEntityByLoadIdAndNodeId(loadId, warehouseId); + if(!Objects.isNull(carsLoadLineEntity)){ + carsLoadLineEntity.setUnloadReportStatus(1); + carsLoadLineEntity.setReportOne("本次装车件数 "+unloadReportVO.getLoadingNum()+" 件,实际卸车件数 "+unloadReportVO.getUnloadNum()+" 件,计划未卸车数量 "+(unloadReportVO.getNoUnloadNum()-unloadReportVO.getNoPlanNum())+" 件"); + carsLoadLineEntity.setReportTwo("无基础数据货物 "+unloadReportVO.getNoDataNum()+" 件、非计划内货物 "+unloadReportVO.getNoPlanNum()+" 件、手动确认入库 "+unloadReportVO.getManualNum()+" 件"); + trunklineCarsLoadLineService.updateById(carsLoadLineEntity); + } + + List noUnloadList = trunklineCarsLoadScanService.findUnloadCheckAbnormalNoUnloadList(loadId,warehouseId); for (TrunklineCarsLoadScanEntity trunklineCarsLoadScanEntity : noUnloadList) { String loadCode = trunklineCarsLoadScanEntity.getLoadCode(); @@ -410,7 +439,7 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { String orderCode = trunklineCarsLoadScanEntity.getOrderCode(); String scanCode = trunklineCarsLoadScanEntity.getScanCode(); Long scanId = trunklineCarsLoadScanEntity.getId(); - //无装车计划 + //无卸车计划 AftersalesAbnormalRecordEntity abnormalRecordEntity = new AftersalesAbnormalRecordEntity(); abnormalRecordEntity.setTenantId(tenantId); abnormalRecordEntity.setCreateUser(userId); @@ -419,8 +448,8 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { abnormalRecordEntity.setType("2"); abnormalRecordEntity.setAbnormalType("4"); abnormalRecordEntity.setCarType("1"); - abnormalRecordEntity.setUpWarehouseId(warehouseId); - abnormalRecordEntity.setUpWarehouseName(warehouseName); + abnormalRecordEntity.setWarehouseId(warehouseId); + abnormalRecordEntity.setWarehouseName(warehouseName); abnormalRecordEntity.setCarsNo(loadCode); abnormalRecordEntity.setWaybillNo(waybillNo); abnormalRecordEntity.setOrderCode(orderCode); @@ -428,6 +457,7 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { abnormalRecordEntity.setUpUserId(userId); abnormalRecordEntity.setUpUserName(nickName); abnormalRecordEntity.setAbnormalStatus(0); + abnormalRecordEntity.setSendOrderStatus(0); abnormalRecordEntity.setUpTime(new Date()); abnormalRecordEntity.setAssociationId(scanId); abnormalRecordEntity.setAssociationType(1); @@ -451,8 +481,8 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { abnormalRecordEntity.setType("2"); abnormalRecordEntity.setAbnormalType("1"); abnormalRecordEntity.setCarType("1"); - abnormalRecordEntity.setUpWarehouseId(warehouseId); - abnormalRecordEntity.setUpWarehouseName(warehouseName); + abnormalRecordEntity.setWarehouseId(warehouseId); + abnormalRecordEntity.setWarehouseName(warehouseName); abnormalRecordEntity.setCarsNo(loadCode); abnormalRecordEntity.setWaybillNo(waybillNo); abnormalRecordEntity.setOrderCode(orderCode); @@ -460,6 +490,7 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { abnormalRecordEntity.setUpUserId(userId); abnormalRecordEntity.setUpUserName(nickName); abnormalRecordEntity.setAbnormalStatus(0); + abnormalRecordEntity.setSendOrderStatus(0); abnormalRecordEntity.setUpTime(new Date()); abnormalRecordEntity.setAssociationId(scanId); abnormalRecordEntity.setAssociationType(1); @@ -468,4 +499,56 @@ public class CarsLoadAsyncServiceImpl implements ICarsLoadAsyncService { } } + @LogpmAsync("asyncExecutor") + @Override + public void dealwithAfterAbnormalPackage(String orderPackageCode, Long warehouseId, String warehouseName, String carsNo, Long userId, Long aLong, String nickName) { + + List abnormalRecordEntities = abnormalRecordClient.findOrderPackageAndAbnormalStatus(orderPackageCode,"0"); + //循环abnormalRecordEntities把abnormalStatus改为1 + //如果send_order_status = 1 则修改工单记录 + for (AftersalesAbnormalRecordEntity abnormalRecordEntity : abnormalRecordEntities) { + Integer sendOrderStatus = abnormalRecordEntity.getSendOrderStatus(); + if(Objects.isNull(sendOrderStatus)){ + continue; + } + + if(sendOrderStatus == 1){ + //修改对应工单记录 + aftersalesWorkOrderClient.updateWorkOrderStatus(warehouseId,orderPackageCode,1); + } + abnormalRecordEntity.setAbnormalStatus(1); + abnormalRecordEntity.setDealUserId(userId); + abnormalRecordEntity.setDealUserName(nickName); + abnormalRecordEntity.setRemark("包件已在 "+warehouseName+" 车次号:"+carsNo+" 中被卸车"); + } + abnormalRecordClient.updateList(abnormalRecordEntities); + + } + + @LogpmAsync("asyncExecutor") + @Override + public void savaUnloadLogBatch(List unloadLogList) { + trunklineCarsUnloadLogService.savaUnloadLogBatch(unloadLogList); + } + + @LogpmAsync("asyncExecutor") + @Override + public void sendRabbitMessageLoadScanData(List data) { + String queue = RabbitConstant.INCOMING_TO_LOAD_QUEUE; + String exchange = RabbitConstant.INCOMING_TO_LOAD_EXCHANGE; + String routing = RabbitConstant.INCOMING_TO_LOAD_ROUTING; + + String msgId = IdUtil.simpleUUID(); + for (TrunklineAdvanceEntity datum : data) { + Map map = new HashMap<>(); + map.put("messageId", CommonUtil.getUUID()); + map.put("logId", msgId); + map.put("messageData", JSONUtil.toJsonStr(datum)); + map.put("createTime", new Date().getTime()); + map.put("flagType", "OrderStatusLog"); + //将消息携带绑定键值 + rabbitTemplate.convertAndSend(exchange, routing, map, new CorrelationData(msgId)); + } + } + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/InComingServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/InComingServiceImpl.java index 3c3f7cd2a..53475f636 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/InComingServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/InComingServiceImpl.java @@ -1,26 +1,51 @@ package com.logpm.trunkline.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.basicdata.entity.BasicdataStorageServicesEntity; +import com.logpm.basicdata.entity.BasicdataTripartiteMallEntity; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataStorageServicesClient; +import com.logpm.basicdata.feign.IBasicdataTripartiteMallClient; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.util.FactoryDataMessageSender; +import com.logpm.factorydata.vo.NodePushMsg; +import com.logpm.factorydata.vo.PushData; import com.logpm.trunkline.bean.Resp; import com.logpm.trunkline.dto.InComingDTO; +import com.logpm.trunkline.dto.OrderStatusDTO; import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; +import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import com.logpm.trunkline.entity.TrunklineBillladingPackageEntity; import com.logpm.trunkline.service.*; import com.logpm.trunkline.vo.TrunklineAdvanceVO; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; import com.logpm.warehouse.feign.IWarehouseTrayTypeClient; +import com.logpm.warehouse.feign.IWarehouseWaybillClient; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.common.constant.IncomingTypeEnum; +import org.springblade.common.constant.RabbitConstant; import org.springblade.common.constant.WorkNodeEnums; +import org.springblade.common.exception.CustomerException; +import org.springblade.common.utils.CommonUtil; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; +import org.springblade.system.entity.Tenant; +import org.springblade.system.feign.ISysClient; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; +import java.util.stream.Collectors; @Slf4j @Service @@ -33,134 +58,635 @@ public class InComingServiceImpl implements IInComingService { private final IWarehouseTrayTypeClient warehouseTrayTypeClient; private final IBasicdataWarehouseClient warehouseClient; private final IPackageTrackLogAsyncService packageTrackLogAsyncService; + // private final DynamicDataSourceProvider dynamicDataSourceProvider; + private final RabbitTemplate rabbitTemplate; + private final FactoryDataMessageSender factoryDataMessageSender; + private final ISysClient sysClient; + private final IWarehouseWaybillClient warehouseWaybillClient; + private final IOpenOrderAsyncService openOrderAsyncService; + private final IBasicdataTripartiteMallClient tripartiteMallClient; + private final IBasicdataStorageServicesClient storageServicesClient; @Override - public R incomingPackage(InComingDTO inComingDTO) { + public R incomingPackages(InComingDTO inComingDTO) { String orderPackageCode = inComingDTO.getOrderPackageCode();//包件码 Long warehouseId = inComingDTO.getWarehouseId();//仓库id String warehouseName = inComingDTO.getWarehouseName(); Long billladingId = inComingDTO.getBillladingId();//提货单id - Integer incomingType = inComingDTO.getIncomingType();//入库类型 1码板打托 2扫码入库 3直接入库 4 按车次号入库 5按订单入库 6扫描入库 7 批量卸车入库 8卸车托盘 9卸分一体 + Integer incomingType = inComingDTO.getIncomingType();//入库类型 1码板打托 2扫码入库 3直接入库 4 按车次号入库 5按订单入库 6扫描入库 7 批量卸车入库 8卸车托盘 9卸分一体 10补录数据入库 String trayCode = inComingDTO.getTrayCode();//托盘码 String trayType = inComingDTO.getTrayType();//打托方式 String[] packageCodes = orderPackageCode.split(","); for (String packageCode : packageCodes) { - log.info("############incomingPackage: 包件入库开始 packageCode={} billladingId={} warehouseId={}",packageCode,billladingId,warehouseId); + log.info("############incomingPackage: 包件入库开始 packageCode={} billladingId={} warehouseId={}", packageCode, billladingId, warehouseId); //包件入库开始 //查询包件是否有数据 QueryWrapper advanceDetailQueryWrapper = new QueryWrapper<>(); - advanceDetailQueryWrapper.eq("order_package_code",packageCode); + advanceDetailQueryWrapper.eq("order_package_code", packageCode); TrunklineAdvanceDetailEntity advanceDetailEntity = advanceDetailService.getOne(advanceDetailQueryWrapper); - if(Objects.isNull(advanceDetailEntity)){ - log.warn("############incomingPackage: 包件不存在 packageCode={} warehouseId={}",packageCode,warehouseId); - return Resp.scanFail(405,"包件无数据","包件无数据"); + if (Objects.isNull(advanceDetailEntity)) { + log.warn("############incomingPackage: 包件不存在 packageCode={} warehouseId={}", packageCode, warehouseId); + return Resp.scanFail(405, "包件无数据", "包件无数据"); } Long advanceDetailId = advanceDetailEntity.getId(); String packageStatus = advanceDetailEntity.getPackageStatus(); Long advanceId = advanceDetailEntity.getAdvanceId(); - if("1".equals(packageStatus)){ - if(incomingType != 1){ - log.warn("############incomingPackage: 包件已入库 packageCode={} warehouseId={}",packageCode,warehouseId); - return Resp.scanFail(405,"包件已入库","包件已入库"); - }else{ - if(!Objects.isNull(billladingId)){ + if ("1".equals(packageStatus)) { + if (incomingType != 1) { + log.warn("############incomingPackage: 包件已入库 packageCode={} warehouseId={}", packageCode, warehouseId); + return Resp.scanFail(405, "包件已入库", "包件已入库"); + } else { + if (!Objects.isNull(billladingId)) { //先判断该包件是否已经有提货记录了 TrunklineBillladingPackageEntity billladingPackageEntity = billladingPackageServicie.findBillladingPackage(packageCode); - if(Objects.isNull(billladingPackageEntity)){ - billladingPackageServicie.saveEntity(packageCode,billladingId,warehouseId,incomingType); + if (Objects.isNull(billladingPackageEntity)) { + billladingPackageServicie.saveEntity(packageCode, billladingId, warehouseId, incomingType); } } //4.如果有托盘码 - if(StringUtil.isNotBlank(trayCode) && StringUtil.isNotBlank(trayType)){ - Map map = new HashMap<>(); - map.put("trayType",trayType); - map.put("trayCode",trayCode); - map.put("warehouseId",warehouseId); - map.put("orderPackageCode",packageCode); + if (StringUtil.isNotBlank(trayCode) && StringUtil.isNotBlank(trayType)) { + Map map = new HashMap<>(); + map.put("trayType", trayType); + map.put("trayCode", trayCode); + map.put("warehouseId", warehouseId); + map.put("orderPackageCode", packageCode); warehouseTrayTypeClient.orderScanOrderPackageCode(map); } } - }else{ - if(StringUtil.isBlank(warehouseName)){ + } else { + if (StringUtil.isBlank(warehouseName)) { BasicdataWarehouseEntity warehouseEntity = warehouseClient.getEntityWarehouseId(warehouseId); - if(!Objects.isNull(warehouseEntity)){ + if (!Objects.isNull(warehouseEntity)) { warehouseName = warehouseEntity.getName(); } } //1.修改暂存单包件入库状态 - advanceDetailService.updatePackageStatusById("1",advanceDetailId,warehouseId,warehouseName); + advanceDetailService.updatePackageStatusById("1", advanceDetailId, warehouseId, warehouseName, new Date()); List incomingWarehouseNames = advanceDetailService.findIncomingWarehouseName(advanceId); - advanceService.updateIncomingWarehouseName(String.join(",",incomingWarehouseNames),advanceId); + advanceService.updateIncomingWarehouseName(String.join(",", incomingWarehouseNames), advanceId); List orderPackageCodes = new ArrayList<>(); orderPackageCodes.add(orderPackageCode); //存入日志 - packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(),AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()),AuthUtil.getNickName(),orderPackageCodes,warehouseId,warehouseName, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY.getCode(),"包件"+ IncomingTypeEnum.getValue(incomingType)); + packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(), AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getNickName(), orderPackageCodes, warehouseId, warehouseName, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY.getCode(), "包件" + IncomingTypeEnum.getValue(incomingType)); //2.判断包件和订单是否已经存入在库订单 boolean b = advanceService.saveOrderAndPackage(advanceDetailEntity, warehouseId); - if(b){ + if (b) { //3.根据是否有提货单id绑定提货单 - if(!Objects.isNull(billladingId)){ + if (!Objects.isNull(billladingId)) { //先判断该包件是否已经有提货记录了 TrunklineBillladingPackageEntity billladingPackageEntity = billladingPackageServicie.findBillladingPackage(packageCode); - if(Objects.isNull(billladingPackageEntity)){ - billladingPackageServicie.saveEntity(packageCode,billladingId,warehouseId,incomingType); + if (Objects.isNull(billladingPackageEntity)) { + billladingPackageServicie.saveEntity(packageCode, billladingId, warehouseId, incomingType); } } //4.如果有托盘码 - if(StringUtil.isNotBlank(trayCode) && StringUtil.isNotBlank(trayType)){ - Map map = new HashMap<>(); - map.put("trayType",trayType); - map.put("trayCode",trayCode); - map.put("warehouseId",warehouseId); - map.put("orderPackageCode",packageCode); + if (StringUtil.isNotBlank(trayCode) && StringUtil.isNotBlank(trayType)) { + Map map = new HashMap<>(); + map.put("trayType", trayType); + map.put("trayCode", trayCode); + map.put("warehouseId", warehouseId); + map.put("orderPackageCode", packageCode); warehouseTrayTypeClient.orderScanOrderPackageCode(map); } } + try { + // 发送入库消息 + OrderStatusDTO orderStatusDTO = new OrderStatusDTO(); + // 通过包件id 查询包件 + orderStatusDTO.setUnitNo(packageCode); + orderStatusDTO.setOrderNo(advanceDetailEntity.getOrderCode()); + orderStatusDTO.setStatus("1"); + orderStatusDTO.setOperationTime(DateUtil.now()); + orderStatusDTO.setCurrentWarehouse(warehouseId.toString()); + Map map = new HashMap<>(); + map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO)); + rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map); + + NodePushMsg nodePushMsg = NodePushMsg.builder() + .operator(AuthUtil.getNickName()) + .operatorTime(new Date()) + .address("在【" + warehouseName + "】入库") + .brand(BrandEnums.getByValue(advanceDetailEntity.getBrand())) + .node(WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY) + .content(Collections.singletonList(PushData.builder() + .packageCode(packageCode) + .warehouseName(warehouseName) + .orderCode(advanceDetailEntity.getOrderCode()) + .build())) + .build(); + factoryDataMessageSender.sendNodeDataByBrand(nodePushMsg); + } catch (Exception e) { + log.error("入库推送失败:{}", e); + } } } return R.success("入库成功"); } + + + + + + @Transactional(rollbackFor = Exception.class) + public R incomingPackage(InComingDTO inComingDTO) { + AtomicReference audio = new AtomicReference<>(); + try{ + String orderPackageCode = inComingDTO.getOrderPackageCode();//包件码 + Long warehouseId = inComingDTO.getWarehouseId();//仓库id + String warehouseName = inComingDTO.getWarehouseName(); + if (StringUtil.isBlank(warehouseName)) { + BasicdataWarehouseEntity warehouseEntity = warehouseClient.getEntityWarehouseId(warehouseId); + if (!Objects.isNull(warehouseEntity)) { + warehouseName = warehouseEntity.getName(); + } + } + Long billladingId = inComingDTO.getBillladingId();//提货单id + Integer incomingType = inComingDTO.getIncomingType();//入库类型 1码板打托 2扫码入库 3直接入库 4 按车次号入库 5按订单入库 6扫描入库 7 批量卸车入库 8卸车托盘 9卸分一体 10补录数据入库 + String trayCode = inComingDTO.getTrayCode();//托盘码 + String trayType = inComingDTO.getTrayType();//打托方式 + String customerTrain = inComingDTO.getCustomerTrain();//车次号 + + List packageCodes = Arrays.asList(orderPackageCode.split(",")); + log.info("############incomingPackage: 包件入库开始 packageCodes={} billladingId={} warehouseId={}", packageCodes, billladingId, warehouseId); + //包件入库开始 + //查询包件是否有数据 + QueryWrapper advanceDetailQueryWrapper = new QueryWrapper<>(); + advanceDetailQueryWrapper.in("order_package_code", packageCodes); + List advanceDetailEntityList = advanceDetailService.list(advanceDetailQueryWrapper); + if (advanceDetailEntityList.isEmpty()) { + log.warn("############incomingPackage: 包件不存在 packageCodes={} warehouseId={}", packageCodes, warehouseId); + return Resp.scanFail(405, "包件无数据", "包件无数据"); + } + if(StringUtil.isNotBlank(customerTrain)){ + for (TrunklineAdvanceDetailEntity advanceDetailEntity : advanceDetailEntityList) { + String trainNumber = advanceDetailEntity.getTrainNumber(); + if(!trainNumber.equals(customerTrain)){ + log.warn("############incomingPackage: 包件车次号不一致 packageCodes={} trainNumber={} trainNumber={}", packageCodes, trainNumber, customerTrain); + return Resp.scanFail(405, "包件车次号不一致", "包件车次号不一致"); + } + } + } + + + + //把advanceDetailEntityList通过packageStatus分组 + Map> advanceDetailEntityMap = advanceDetailEntityList.stream().collect(Collectors.groupingBy(TrunklineAdvanceDetailEntity::getPackageStatus)); + + //把advanceDetailEntityList的orderCode提取成一个Set +// Set orderCodes = advanceDetailEntityList.stream().map(TrunklineAdvanceDetailEntity::getOrderCode).collect(Collectors.toSet()); + + String finalWarehouseName = warehouseName; + advanceDetailEntityMap.keySet().forEach(packageStatus -> { + List advanceDetailEntities = advanceDetailEntityMap.get(packageStatus); + if (!advanceDetailEntities.isEmpty()) { + //提取advanceDetailEntities中所有元素的orderPackageCode组成一个List + List orderPackageCodes = advanceDetailEntities.stream() + .map(TrunklineAdvanceDetailEntity::getOrderPackageCode) + .collect(Collectors.toList()); + + if ("0".equals(packageStatus)) { + //未入库包件 + + Set advanceIds = new HashSet<>(); + //1.修改暂存单包件入库状态 + advanceDetailEntities.forEach(advanceDetailEntity -> { + advanceIds.add(advanceDetailEntity.getId()); + advanceDetailEntity.setPackageStatus("1"); + advanceDetailEntity.setIncomingTime(new Date()); + advanceDetailEntity.setIncomingWarehouseId(warehouseId); + advanceDetailEntity.setIncomingWarehouseName(finalWarehouseName); + }); + + advanceDetailService.updateBatchById(advanceDetailEntities); + + advanceIds.forEach(advanceId -> { + List incomingWarehouseNames = advanceDetailService.findIncomingWarehouseName(advanceId); + advanceService.updateIncomingWarehouseName(String.join(",", incomingWarehouseNames), advanceId); + }); + +// advanceDetailService.updatePackageStatusById("1", advanceDetailId, warehouseId, warehouseName,new Date()); +// List incomingWarehouseNames = advanceDetailService.findIncomingWarehouseName(advanceId); +// advanceService.updateIncomingWarehouseName(String.join(",", incomingWarehouseNames), advanceId); +// +// List orderPackageCodes = new ArrayList<>(); +// orderPackageCodes.add(orderPackageCode); + //存入日志 + packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(), AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getNickName(), orderPackageCodes, warehouseId, finalWarehouseName, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY.getCode(), "包件" + IncomingTypeEnum.getValue(incomingType)); + + + //2.判断包件和订单是否已经存入在库订单 + boolean b = advanceService.saveOrderAndPackages(advanceDetailEntities, warehouseId); + if (b) { + + //把advanceDetailEntities通过waybillNo进行分组 + Map> advanceDetailEntityWaybillNoMap = advanceDetailEntities.stream().filter(entity -> StringUtil.isNotBlank(entity.getWaybillNo())).collect(Collectors.groupingBy(TrunklineAdvanceDetailEntity::getWaybillNo)); + + Set waybillNoSet = advanceDetailEntityWaybillNoMap.keySet(); + if(!waybillNoSet.isEmpty()){ + + List waybillEntityList = warehouseWaybillClient.findWaybillBilllByWaybillNos(new ArrayList<>(waybillNoSet)); + //把waybillEntityList转化成waybillNo为key的map + Map waybillEntityMap = waybillEntityList.stream().collect(Collectors.toMap(WarehouseWaybillEntity::getWaybillNo, Function.identity())); + + advanceDetailEntityWaybillNoMap.keySet().forEach(waybillNo -> { + List waybillNoAdvanceDetailEntities = advanceDetailEntityWaybillNoMap.get(waybillNo); + if(!waybillNoAdvanceDetailEntities.isEmpty()){ + WarehouseWaybillEntity waybillEntity = waybillEntityMap.get(waybillNo); + if(!Objects.isNull(waybillEntity)){ + Long departureWarehouseId = waybillEntity.getDepartureWarehouseId(); + if(departureWarehouseId!=null&&departureWarehouseId.equals(warehouseId)){ + Integer totalCount = waybillEntity.getTotalCount(); + Integer stockCount = waybillEntity.getStockCount(); + openOrderAsyncService.saveLog(waybillEntity.getId(), waybillEntity.getWaybillNo(), "20", "已入库", "运单入库:"+stockCount+"/"+totalCount+",入库类型:【"+IncomingTypeEnum.getValue(incomingType)+"】,入库时间:"+ CommonUtil.dateToStringGeneral(new Date()), AuthUtil.getNickName(), AuthUtil.getUserId(), warehouseId, finalWarehouseName); + } + } + } + }); + } + + + if (!Objects.isNull(billladingId)) { + //先判断该包件是否已经有提货记录了 + List noOrderPackageCodes = billladingPackageServicie.findBillladingPackages(orderPackageCodes); + if (!noOrderPackageCodes.isEmpty()) { + billladingPackageServicie.saveEntityBatch(noOrderPackageCodes, billladingId, warehouseId, incomingType); + } + } + + //4.如果有托盘码 + orderPackageCodes.forEach(packageCode -> { + if (StringUtil.isNotBlank(trayCode) && StringUtil.isNotBlank(trayType)) { + Map map = new HashMap<>(); + map.put("trayType", trayType); + map.put("trayCode", trayCode); + map.put("warehouseId", warehouseId); + map.put("orderPackageCode", packageCode); + R r = warehouseTrayTypeClient.orderScanOrderPackageCodeReturnR(map); + Object data = r.getData(); + if(!Objects.isNull(data)){ + audio.set((String) data); + } + } + }); + } + try { + + advanceDetailEntities.forEach(advanceDetailEntity -> { + R result = sysClient.getTenant(AuthUtil.getTenantId()); + if (result.isSuccess()) { + + Tenant tenant = result.getData(); + + if (tenant.getTenantType() == 1) { + // 发送入库消息 + OrderStatusDTO orderStatusDTO = new OrderStatusDTO(); + // 通过包件id 查询包件 + orderStatusDTO.setUnitNo(advanceDetailEntity.getOrderPackageCode()); + orderStatusDTO.setOrderNo(advanceDetailEntity.getOrderCode()); + orderStatusDTO.setStatus("1"); + orderStatusDTO.setOperationTime(DateUtil.now()); + orderStatusDTO.setCurrentWarehouse(warehouseId.toString()); + Map map = new HashMap<>(); + map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO)); + rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map); + + NodePushMsg nodePushMsg = NodePushMsg.builder() + .operator(AuthUtil.getNickName()) + .operatorTime(new Date()) + .address("在【" + finalWarehouseName + "】入库") + .brand(BrandEnums.getByValue(advanceDetailEntity.getBrand())) + .node(WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY) + .content(Collections.singletonList(PushData.builder() + .packageCode(advanceDetailEntity.getOrderPackageCode()) + .orderCode(advanceDetailEntity.getOrderCode()) + .warehouseName(finalWarehouseName) + .build())) + .build(); + factoryDataMessageSender.sendNodeDataByBrand(nodePushMsg); + } else if (tenant.getTenantType() == 2) { + // 完结预入库数据状态 +// JSONObject jsonObject = new JSONObject(); +// jsonObject.put("orderPackageCode", advanceDetailEntity.getOrderPackageCode()); +// jsonObject.put("carNum", null); +// +// Map mapState = new HashMap(); +// mapState.put("messageId", CommonUtil.getUUID()); +// mapState.put("messageData", jsonObject); +// mapState.put("createTime", System.currentTimeMillis()); +// try { +// rabbitTemplate.convertAndSend(RabbitConstant.IN_WAREHOUSE_TO_BUSINESS_DATA_EXCHANGE, RabbitConstant.IN_WAREHOUSE_TO_BUSINESS_DATA_ROUTING, mapState, message -> { +// message.getMessageProperties() +// .setHeader("x-delay", 5000); +// return message; +// }); +// } catch (Exception customerException) { +// log.error(">>>>>>>>>>>>>>>>>>>>>>>>>> 消息推送失败~ 请联系管理员! ", customerException); +//// throw new CustomerException(customerException.getMessage()); +// +// } + + + } else { + log.warn("未知的租户类型"); + } + + } + }); + } catch (Exception e) { + log.error(">>>>>>>>>>>>>>>>>>>>>>>>>> 预入库消息推送失败~ 请联系管理员! ", e); + } + + + } else if ("1".equals(packageStatus)) { + //已入库包件 + if (incomingType != 1) { + log.warn("############incomingPackage: 包件已入库 orderPackageCodes={} warehouseId={}", orderPackageCodes, warehouseId); + throw new CustomerException(405, "包件已入库"); + } else { +// if (!Objects.isNull(billladingId)) { +// //先判断该包件是否已经有提货记录了 +// List noOrderPackageCodes = billladingPackageServicie.findBillladingPackages(orderPackageCodes); +// if (!noOrderPackageCodes.isEmpty()) { +// billladingPackageServicie.saveEntityBatch(noOrderPackageCodes, billladingId, warehouseId, incomingType); +// } +// } + + //4.如果有托盘码 + orderPackageCodes.forEach(packageCode -> { + if (StringUtil.isNotBlank(trayCode) && StringUtil.isNotBlank(trayType)) { + Map map = new HashMap<>(); + map.put("trayType", trayType); + map.put("trayCode", trayCode); + map.put("warehouseId", warehouseId); + map.put("orderPackageCode", packageCode); + R r = warehouseTrayTypeClient.orderScanOrderPackageCodeReturnR(map); + Object data = r.getData(); + if(!Objects.isNull(data)){ + audio.set((String) data); + } + } + }); + } + } + } + }); + + int size = packageCodes.size(); + if(size == 1){ + if(incomingType == 2){ + //只有扫码入库才报服务仓库 + String packageCode = packageCodes.get(0); + TrunklineAdvanceDetailEntity advanceDetailEntity = advanceDetailService.findEntityByOrderPackageCode(packageCode); + Long advanceId = advanceDetailEntity.getAdvanceId(); + Long waybillId = advanceDetailEntity.getWaybillId(); + TrunklineAdvanceEntity advanceEntity = advanceService.getById(advanceId); + String dealerName = advanceEntity.getDealerName(); + String dealerCode = advanceEntity.getDealerCode(); + String brand = advanceEntity.getBrand(); + if(!Objects.isNull(waybillId)){ + WarehouseWaybillEntity waybillEntity = warehouseWaybillClient.findByWaybillId(waybillId); + if(!Objects.isNull(waybillEntity)){ + String destinationWarehouseName = waybillEntity.getDestinationWarehouseName(); + return Resp.scanSuccess(dealerName+"的目的仓库为"+destinationWarehouseName,dealerName+"的目的仓库为"+destinationWarehouseName); + }else{ + return Resp.scanSuccess("商家为"+dealerName,"商家为"+dealerName); + } + }else{ + BasicdataTripartiteMallEntity tripartiteMallEntity = tripartiteMallClient.findEntityByDealerNameAndDealerCodeAndBrand(dealerName,dealerCode,brand); + if(!Objects.isNull(tripartiteMallEntity)){ + Long clientId = tripartiteMallEntity.getClientId(); + BasicdataStorageServicesEntity storageServicesEntity = storageServicesClient.findEntityBySendWarehouseIdAndClientId(warehouseId, clientId); + if(!Objects.isNull(storageServicesEntity)){ + String serveWarehouseName = storageServicesEntity.getServeWarehouseName(); + return Resp.scanSuccess(dealerName+"的服务仓库为"+serveWarehouseName,dealerName+"的服务仓库为"+serveWarehouseName); + } + } + return Resp.scanSuccess("商家为"+dealerName,"商家为"+dealerName); + } + } + } + + }catch (Exception e){ + log.error("入库异常",e); + throw e; + } + + String a = audio.get(); + if(StringUtil.isNotBlank(a)){ + return Resp.scanSuccess("入库成功",a); + } + + return R.success("入库成功"); + } + + + + @Override + @Transactional(rollbackFor = Exception.class) + public R incomingPackageByTaryCode(InComingDTO inComingDTO) { + try{ + String orderPackageCode = inComingDTO.getOrderPackageCode();//包件码 + Long warehouseId = inComingDTO.getWarehouseId();//仓库id + String warehouseName = inComingDTO.getWarehouseName(); + if (StringUtil.isBlank(warehouseName)) { + BasicdataWarehouseEntity warehouseEntity = warehouseClient.getEntityWarehouseId(warehouseId); + if (!Objects.isNull(warehouseEntity)) { + warehouseName = warehouseEntity.getName(); + } + } + Long billladingId = inComingDTO.getBillladingId();//提货单id + Integer incomingType = inComingDTO.getIncomingType();//入库类型 1码板打托 2扫码入库 3直接入库 4 按车次号入库 5按订单入库 6扫描入库 7 批量卸车入库 8卸车托盘 9卸分一体 10补录数据入库 + String trayCode = inComingDTO.getTrayCode();//托盘码 + String trayType = inComingDTO.getTrayType();//打托方式 + String customerTrain = inComingDTO.getCustomerTrain();//车次号 + + List packageCodes = Arrays.asList(orderPackageCode.split(",")); + log.info("############incomingPackage: 包件入库开始 packageCodes={} billladingId={} warehouseId={}", packageCodes, billladingId, warehouseId); + //包件入库开始 + //查询包件是否有数据 + QueryWrapper advanceDetailQueryWrapper = new QueryWrapper<>(); + advanceDetailQueryWrapper.in("order_package_code", packageCodes); + List advanceDetailEntityList = advanceDetailService.list(advanceDetailQueryWrapper); + if (advanceDetailEntityList.isEmpty()) { + log.warn("############incomingPackage: 包件不存在 packageCodes={} warehouseId={}", packageCodes, warehouseId); + return Resp.scanFail(405, "包件无数据", "包件无数据"); + } + if(StringUtil.isNotBlank(customerTrain)){ + for (TrunklineAdvanceDetailEntity advanceDetailEntity : advanceDetailEntityList) { + String trainNumber = advanceDetailEntity.getTrainNumber(); + if(!trainNumber.equals(customerTrain)){ + log.warn("############incomingPackage: 包件车次号不一致 packageCodes={} trainNumber={} trainNumber={}", packageCodes, trainNumber, customerTrain); + return Resp.scanFail(405, "包件车次号不一致", "包件车次号不一致"); + } + } + } + + //把advanceDetailEntityList通过packageStatus分组 + Map> advanceDetailEntityMap = advanceDetailEntityList.stream().collect(Collectors.groupingBy(TrunklineAdvanceDetailEntity::getPackageStatus)); + + //把advanceDetailEntityList的orderCode提取成一个Set +// Set orderCodes = advanceDetailEntityList.stream().map(TrunklineAdvanceDetailEntity::getOrderCode).collect(Collectors.toSet()); + + String finalWarehouseName = warehouseName; + advanceDetailEntityMap.keySet().forEach(packageStatus -> { + List advanceDetailEntities = advanceDetailEntityMap.get(packageStatus); + if (!advanceDetailEntities.isEmpty()) { + //提取advanceDetailEntities中所有元素的orderPackageCode组成一个List + List orderPackageCodes = advanceDetailEntities.stream() + .map(TrunklineAdvanceDetailEntity::getOrderPackageCode) + .collect(Collectors.toList()); + + if ("0".equals(packageStatus)) { + //未入库包件 + + Set advanceIds = new HashSet<>(); + //1.修改暂存单包件入库状态 + advanceDetailEntities.forEach(advanceDetailEntity -> { + advanceIds.add(advanceDetailEntity.getId()); + advanceDetailEntity.setPackageStatus("1"); + advanceDetailEntity.setIncomingTime(new Date()); + advanceDetailEntity.setIncomingWarehouseId(warehouseId); + advanceDetailEntity.setIncomingWarehouseName(finalWarehouseName); + }); + + advanceDetailService.updateBatchById(advanceDetailEntities); + + advanceIds.forEach(advanceId -> { + List incomingWarehouseNames = advanceDetailService.findIncomingWarehouseName(advanceId); + advanceService.updateIncomingWarehouseName(String.join(",", incomingWarehouseNames), advanceId); + }); + +// advanceDetailService.updatePackageStatusById("1", advanceDetailId, warehouseId, warehouseName,new Date()); +// List incomingWarehouseNames = advanceDetailService.findIncomingWarehouseName(advanceId); +// advanceService.updateIncomingWarehouseName(String.join(",", incomingWarehouseNames), advanceId); +// +// List orderPackageCodes = new ArrayList<>(); +// orderPackageCodes.add(orderPackageCode); + //存入日志 + packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(), AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getNickName(), orderPackageCodes, warehouseId, finalWarehouseName, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY.getCode(), "包件" + IncomingTypeEnum.getValue(incomingType)); + + + //2.判断包件和订单是否已经存入在库订单 + boolean b = advanceService.saveOrderAndPackages(advanceDetailEntities, warehouseId); + if (b) { + + //把advanceDetailEntities通过waybillNo进行分组 + Map> advanceDetailEntityWaybillNoMap = advanceDetailEntities.stream().filter(entity -> StringUtil.isNotBlank(entity.getWaybillNo())).collect(Collectors.groupingBy(TrunklineAdvanceDetailEntity::getWaybillNo)); + + Set waybillNoSet = advanceDetailEntityWaybillNoMap.keySet(); + if(!waybillNoSet.isEmpty()){ + + List waybillEntityList = warehouseWaybillClient.findWaybillBilllByWaybillNos(new ArrayList<>(waybillNoSet)); + //把waybillEntityList转化成waybillNo为key的map + Map waybillEntityMap = waybillEntityList.stream().collect(Collectors.toMap(WarehouseWaybillEntity::getWaybillNo, Function.identity())); + + advanceDetailEntityWaybillNoMap.keySet().forEach(waybillNo -> { + List waybillNoAdvanceDetailEntities = advanceDetailEntityWaybillNoMap.get(waybillNo); + if(!waybillNoAdvanceDetailEntities.isEmpty()){ + WarehouseWaybillEntity waybillEntity = waybillEntityMap.get(waybillNo); + if(!Objects.isNull(waybillEntity)){ + Long departureWarehouseId = waybillEntity.getDepartureWarehouseId(); + if(departureWarehouseId!=null&&departureWarehouseId.equals(warehouseId)){ + Integer totalCount = waybillEntity.getTotalCount(); + Integer stockCount = waybillEntity.getStockCount(); + openOrderAsyncService.saveLog(waybillEntity.getId(), waybillEntity.getWaybillNo(), "20", "已入库", "运单入库:"+stockCount+"/"+totalCount+",入库类型:【"+IncomingTypeEnum.getValue(incomingType)+"】,入库时间:"+ CommonUtil.dateToStringGeneral(new Date()), AuthUtil.getNickName(), AuthUtil.getUserId(), warehouseId, finalWarehouseName); + } + } + } + }); + } + + + //4.如果有托盘码 + orderPackageCodes.forEach(packageCode -> { + if (StringUtil.isNotBlank(trayCode) && StringUtil.isNotBlank(trayType)) { + Map map = new HashMap<>(); + map.put("trayType", trayType); + map.put("trayCode", trayCode); + map.put("warehouseId", warehouseId); + map.put("orderPackageCode", packageCode); + warehouseTrayTypeClient.orderScanOrderPackageCode(map); + } + }); + } + + + + } else if ("1".equals(packageStatus)) { + //已入库包件 + if (incomingType != 1) { + log.warn("############incomingPackage: 包件已入库 orderPackageCodes={} warehouseId={}", orderPackageCodes, warehouseId); + throw new CustomerException(405, "包件" + orderPackageCodes + "已入库"); + } else { + + //4.如果有托盘码 + orderPackageCodes.forEach(packageCode -> { + if (StringUtil.isNotBlank(trayCode) && StringUtil.isNotBlank(trayType)) { + Map map = new HashMap<>(); + map.put("trayType", trayType); + map.put("trayCode", trayCode); + map.put("warehouseId", warehouseId); + map.put("orderPackageCode", packageCode); + warehouseTrayTypeClient.orderScanOrderPackageCode(map); + } + }); + } + } + } + }); + }catch (Exception e){ + e.printStackTrace(); + log.error("入库异常",e); + throw new CustomerException("系统异常,请联系管理员"); + } + + return R.success("入库成功"); + } + + @Override public R findIncomingOrderList(InComingDTO inComingDTO) { Integer incomingType = inComingDTO.getIncomingType(); - if(incomingType == 5){ + if (incomingType == 5) { String incomingCode = inComingDTO.getIncomingCode(); - incomingCode = incomingCode.replaceAll(",",","); - List orderCodes = new ArrayList<>(); - if(incomingCode.contains(",")){ - orderCodes.addAll(Arrays.asList(incomingCode.split(","))); - }else{ - orderCodes.add(incomingCode); + if (!StringUtil.isBlank(incomingCode)) { + incomingCode = incomingCode.replaceAll(",", ","); + List orderCodes = new ArrayList<>(); + if (incomingCode.contains(",")) { + orderCodes.addAll(Arrays.asList(incomingCode.split(","))); + } else { + orderCodes.add(incomingCode); + } + inComingDTO.setOrderCodes(orderCodes); } - inComingDTO.setOrderCodes(orderCodes); } List ls = advanceService.findIncomingOrderList(inComingDTO); - for (TrunklineAdvanceVO advanceVO : ls) { - Long advanceId = advanceVO.getId(); - Integer num = advanceDetailService.findListByAdvanceIdAndPackageStatus(advanceId,"0"); - if(num > 0){ - advanceVO.setIsIncoming(1); - }else{ - advanceVO.setIsIncoming(0); - } - } +// for (TrunklineAdvanceVO advanceVO : ls) { +// Long advanceId = advanceVO.getId(); +// Integer num = advanceDetailService.findListByAdvanceIdAndPackageStatus(advanceId,"0"); +// if(num > 0){ +// advanceVO.setIsIncoming(1); +// }else{ +// advanceVO.setIsIncoming(0); +// } +// } return R.data(ls); } @Override - public R incomingBatchOrder(InComingDTO inComingDTO) { + public R incomingBatchOrder(InComingDTO inComingDTO, WarehouseWaybillEntity waybillEntity) { Long warehouseId = inComingDTO.getWarehouseId(); String warehouseName = inComingDTO.getWarehouseName(); Integer incomingType = inComingDTO.getIncomingType(); @@ -170,26 +696,65 @@ public class InComingServiceImpl implements IInComingService { String tenantId = inComingDTO.getTenantId(); String nickName = inComingDTO.getNickName(); + Integer total = 0; for (Long advanceId : advanceIds) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("advance_id",advanceId) - .eq("package_status",0); + queryWrapper.eq("advance_id", advanceId) + .eq("package_status", "0"); //查询所有包件 List detailList = advanceDetailService.list(queryWrapper); - List orderPackageCodes = advanceService.incomingPackageBatch(advanceId, warehouseId, detailList,userId,deptId,tenantId); + List orderPackageCodes = advanceService.incomingPackageBatch(advanceId, warehouseId, detailList, userId, deptId, tenantId, waybillEntity); advanceDetailService.updateBatchById(detailList); List incomingWarehouseNames = advanceDetailService.findIncomingWarehouseName(advanceId); - advanceService.updateIncomingWarehouseName(String.join(",",incomingWarehouseNames),advanceId); + advanceService.updateIncomingWarehouseName(String.join(",", incomingWarehouseNames), advanceId); + + //把detailList通过waybillId分组 + Map> map = detailList.stream().filter(t -> Objects.nonNull(t.getWaybillId())).collect(Collectors.groupingBy(TrunklineAdvanceDetailEntity::getWaybillId)); + + Set waybillIdSet = map.keySet(); + + + + if(CollUtil.isNotEmpty(waybillIdSet)){ + List waybillEntityList = warehouseWaybillClient.findListByWaybillIds(new ArrayList<>(waybillIdSet)); + waybillEntityList.forEach(wb -> { + Integer totalCount = wb.getTotalCount(); + Integer stockCount = wb.getStockCount(); + openOrderAsyncService.saveLog(wb.getId(), wb.getWaybillNo(), "20", "已入库", "运单入库:"+stockCount+"/"+totalCount+",入库类型:【"+IncomingTypeEnum.getValue(incomingType)+"】,入库时间:"+ CommonUtil.dateToStringGeneral(new Date()), AuthUtil.getNickName(), AuthUtil.getUserId(), warehouseId, warehouseName); + }); + } + + //把waybillEntityList转化成id为key的Map +// Map waybillEntityMap = waybillEntityList.stream().collect(Collectors.toMap(WarehouseWaybillEntity::getId, Function.identity())); //存入日志 - packageTrackLogAsyncService.addPackageTrackLog(tenantId,userId, deptId,nickName,orderPackageCodes,warehouseId,warehouseName, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY.getCode(),"包件"+ IncomingTypeEnum.getValue(incomingType)); + packageTrackLogAsyncService.addPackageTrackLog(tenantId, userId, deptId, nickName, orderPackageCodes, warehouseId, warehouseName, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY.getCode(), "包件" + IncomingTypeEnum.getValue(incomingType)); + total = total + detailList.size(); + if (CollUtil.isNotEmpty(detailList)) { + for (TrunklineAdvanceDetailEntity advanceDetailEntity : detailList) { + NodePushMsg nodePushMsg = NodePushMsg.builder() + .operator(AuthUtil.getNickName()) + .operatorTime(new Date()) + .address("在【" + warehouseName + "】入库") + .brand(BrandEnums.getByValue(advanceDetailEntity.getBrand())) + .node(WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY) + .content(Collections.singletonList(PushData.builder() + .packageCode(advanceDetailEntity.getOrderPackageCode()) + .orderCode(advanceDetailEntity.getOrderCode()) + .warehouseName(warehouseName) + .build())) + .build(); + factoryDataMessageSender.sendNodeDataByBrand(nodePushMsg); + } + } } - return R.success("入库成功"); +// DynamicDataSourceContextHolder.clear(); + return R.success("入库成功" + total + "件"); } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderAsyncServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderAsyncServiceImpl.java index 5b3acbad4..f67512a8d 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderAsyncServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderAsyncServiceImpl.java @@ -1,24 +1,39 @@ package com.logpm.trunkline.service.impl; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.logpm.basicdata.entity.BasicdataClientEntity; +import com.logpm.basicdata.entity.BasicdataStoreBusinessEntity; +import com.logpm.basicdata.feign.IBasicdataClientClient; +import com.logpm.basicdata.feign.IBasicdataStoreBusinessClient; import com.logpm.trunkline.dto.InComingDTO; -import com.logpm.trunkline.entity.TrunklineCarsLoadEntity; -import com.logpm.trunkline.entity.TrunklineCarsLoadLineEntity; -import com.logpm.trunkline.entity.TrunklineWaybillTrackEntity; +import com.logpm.trunkline.entity.*; import com.logpm.trunkline.service.*; +import com.logpm.trunkline.vo.BillladingPackageVO; import com.logpm.trunkline.vo.LoadScanWaybillVO; +import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; +import com.logpm.warehouse.entity.WarehouseWayBillDetail; import com.logpm.warehouse.entity.WarehouseWaybillEntity; import com.logpm.warehouse.feign.IWarehouseWaybillClient; import lombok.extern.slf4j.Slf4j; -import org.springblade.common.constant.TenantNum; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.common.constant.broadcast.FanoutConstants; +import org.springblade.common.model.FanoutMsg; import org.springblade.common.utils.CommonUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.system.cache.UserCache; +import org.springblade.system.entity.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.stream.Collectors; @Service @Slf4j @@ -26,6 +41,7 @@ public class OpenOrderAsyncServiceImpl implements IOpenOrderAsyncService { @Autowired private ITrunklineWaybillTrackService trunklineWaybillTrackService; + @Lazy @Autowired private ITrunklineCarsLoadService trunklineCarsLoadService; @@ -35,32 +51,81 @@ public class OpenOrderAsyncServiceImpl implements IOpenOrderAsyncService { private IWarehouseWaybillClient warehouseWaybillClient; @Autowired private ITrunklineCarsLoadLineService trunklineCarsLoadLineService; + @Lazy @Autowired private IInComingService inComingService; + @Autowired + private ISendFanoutService sendFanoutService; + @Autowired + private ITrunklineAdvanceDetailService advanceDetailService; + @Autowired + private IBasicdataClientClient basicdataClientClient; + @Autowired + private IBasicdataStoreBusinessClient basicdataStoreBusinessClient; + @Autowired + private ITrunklineBillladingWaybillService trunklineBillladingWaybillService; + @Autowired + private ITrunklineBillladingService trunklineBillladingService; - @Async + @LogpmAsync("asyncExecutor") @Override public void saveLog(Long waybillId, String waybillNo, String trackType, String refer, String operationRemark, String nickName,Long userId,Long warehouseId,String warehouseName) { - TrunklineWaybillTrackEntity waybillTrackEntity = new TrunklineWaybillTrackEntity(); - waybillTrackEntity.setWarehouseId(warehouseId); - waybillTrackEntity.setWarehouseName(warehouseName); - waybillTrackEntity.setWaybillId(waybillId); - waybillTrackEntity.setWaybillNo(waybillNo); - waybillTrackEntity.setTrackType(trackType); - waybillTrackEntity.setRefer(refer); - waybillTrackEntity.setOperationRemark(operationRemark); - waybillTrackEntity.setCreateUserName(nickName); - waybillTrackEntity.setTenantId(TenantNum.HUITONGCODE); - waybillTrackEntity.setCreateUser(userId); - waybillTrackEntity.setUpdateUser(userId); - trunklineWaybillTrackService.save(waybillTrackEntity); + + if("20".equals(trackType)){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("warehouse_id",warehouseId) + .eq("waybill_id",waybillId) + .eq("track_type",trackType); + TrunklineWaybillTrackEntity waybillTrackEntity = trunklineWaybillTrackService.getOne(queryWrapper); + if(waybillTrackEntity!=null){ + waybillTrackEntity.setRefer(refer); + waybillTrackEntity.setOperationRemark(operationRemark); + waybillTrackEntity.setCreateUserName(nickName); + waybillTrackEntity.setUpdateTime(new Date()); + trunklineWaybillTrackService.updateById(waybillTrackEntity); + }else{ + waybillTrackEntity = new TrunklineWaybillTrackEntity(); + waybillTrackEntity.setWarehouseId(warehouseId); + waybillTrackEntity.setWarehouseName(warehouseName); + waybillTrackEntity.setWaybillId(waybillId); + waybillTrackEntity.setWaybillNo(waybillNo); + waybillTrackEntity.setTrackType(trackType); + waybillTrackEntity.setRefer(refer); + waybillTrackEntity.setOperationRemark(operationRemark); + waybillTrackEntity.setCreateUserName(nickName); + waybillTrackEntity.setCheckStatus(1); + waybillTrackEntity.setCheckTime(new Date()); + trunklineWaybillTrackService.save(waybillTrackEntity); + } + }else{ + TrunklineWaybillTrackEntity waybillTrackEntity = new TrunklineWaybillTrackEntity(); + waybillTrackEntity.setWarehouseId(warehouseId); + waybillTrackEntity.setWarehouseName(warehouseName); + waybillTrackEntity.setWaybillId(waybillId); + waybillTrackEntity.setWaybillNo(waybillNo); + waybillTrackEntity.setTrackType(trackType); + waybillTrackEntity.setRefer(refer); + waybillTrackEntity.setOperationRemark(operationRemark); + waybillTrackEntity.setCreateUserName(nickName); + waybillTrackEntity.setCheckStatus(1); + waybillTrackEntity.setCheckTime(new Date()); + trunklineWaybillTrackService.save(waybillTrackEntity); + } + + +// DynamicDataSourceContextHolder.clear(); } - @Async + @LogpmAsync("asyncExecutor") @Override public void saveStartCarLog(TrunklineCarsLoadLineEntity carsLoadLineEntity,String nickName,Long userId) { Long loadId = carsLoadLineEntity.getLoadId(); Integer sort = carsLoadLineEntity.getSort(); + + String tenantId = AuthUtil.getTenantId(); + BladeUser user = AuthUtil.getUser(); +// DynamicDataSourceContextHolder.push(tenantId); + TrunklineCarsLoadEntity carsLoadEntity = trunklineCarsLoadService.getById(loadId); if(Objects.isNull(carsLoadEntity)){ log.warn("##############saveStartCarLog: 配载信息不存在 loadId={}",loadId); @@ -101,7 +166,27 @@ public class OpenOrderAsyncServiceImpl implements IOpenOrderAsyncService { } - @Async + + private void saveTrackLog(Long waybillId, String waybillNo, String trackType, String refer, String operationRemark, String nickName,Long userId,Long warehouseId,String warehouseName) { + TrunklineWaybillTrackEntity waybillTrackEntity = new TrunklineWaybillTrackEntity(); + waybillTrackEntity.setWarehouseId(warehouseId); + waybillTrackEntity.setWarehouseName(warehouseName); + waybillTrackEntity.setWaybillId(waybillId); + waybillTrackEntity.setWaybillNo(waybillNo); + waybillTrackEntity.setTrackType(trackType); + waybillTrackEntity.setRefer(refer); + waybillTrackEntity.setOperationRemark(operationRemark); + waybillTrackEntity.setCreateUserName(nickName); +// waybillTrackEntity.setTenantId(TenantNum.HUITONGCODE); +// waybillTrackEntity.setCreateUser(userId); +// waybillTrackEntity.setUpdateUser(userId); + waybillTrackEntity.setCheckStatus(1); + waybillTrackEntity.setCheckTime(new Date()); + trunklineWaybillTrackService.save(waybillTrackEntity); + } + + + @LogpmAsync("asyncExecutor") @Override public void saveCancelStartCarLog(TrunklineCarsLoadLineEntity carsLoadLineEntity, String nickName,Long userId) { Long loadId = carsLoadLineEntity.getLoadId(); @@ -131,7 +216,7 @@ public class OpenOrderAsyncServiceImpl implements IOpenOrderAsyncService { } } - @Async + @LogpmAsync("asyncExecutor") @Override public void saveArriveCarLog(TrunklineCarsLoadLineEntity carsLoadLineEntity, String nickName,Long userId) { Long loadId = carsLoadLineEntity.getLoadId(); @@ -161,7 +246,7 @@ public class OpenOrderAsyncServiceImpl implements IOpenOrderAsyncService { } } - @Async + @LogpmAsync("asyncExecutor") @Override public void saveCancelArriveCarLog(TrunklineCarsLoadLineEntity carsLoadLineEntity, String nickName,Long userId) { Long loadId = carsLoadLineEntity.getLoadId(); @@ -191,7 +276,7 @@ public class OpenOrderAsyncServiceImpl implements IOpenOrderAsyncService { } } - @Async + @LogpmAsync("asyncExecutor") @Override public void saveUnloadStartCarLog(TrunklineCarsLoadLineEntity carsLoadLineEntity, String nickName,Long userId) { Long loadId = carsLoadLineEntity.getLoadId(); @@ -223,16 +308,603 @@ public class OpenOrderAsyncServiceImpl implements IOpenOrderAsyncService { } } - @Async + @LogpmAsync("asyncExecutor") @Override - public void incomingPackageBatch(List advanceIds, Long userId, Long deptId, String tenantId, String nickName,Integer incomingType) { + public void incomingPackageBatch(List advanceIds, Long userId, Long deptId, String tenantId, String nickName,Integer incomingType,Long warehouseId,String warehouseName,WarehouseWaybillEntity waybillEntity) { InComingDTO inComingDTO = new InComingDTO(); inComingDTO.setAdvanceIds(advanceIds); + inComingDTO.setWarehouseId(warehouseId); + inComingDTO.setWarehouseName(warehouseName); inComingDTO.setUserId(userId); inComingDTO.setDeptId(deptId); inComingDTO.setTenantId(tenantId); inComingDTO.setNickName(nickName); inComingDTO.setIncomingType(incomingType); - inComingService.incomingBatchOrder(inComingDTO); + inComingService.incomingBatchOrder(inComingDTO,waybillEntity); + } + + @Override + public void saveUpdateLog(Long waybillId, String waybillNo, String trackType, String refer, String operationRemark, String nickName, Long userId, Long warehouseId, String warehouseName, WarehouseWaybillEntity waybillEntity) { + User user = UserCache.getUser(userId); + TrunklineWaybillTrackEntity waybillTrackEntity = new TrunklineWaybillTrackEntity(); + waybillTrackEntity.setWarehouseId(warehouseId); + waybillTrackEntity.setWarehouseName(warehouseName); + waybillTrackEntity.setWaybillId(waybillId); + waybillTrackEntity.setWaybillNo(waybillNo); + waybillTrackEntity.setTrackType(trackType); + waybillTrackEntity.setRefer(refer); + waybillTrackEntity.setOperationRemark(operationRemark); + waybillTrackEntity.setCreateUserName(nickName); + waybillTrackEntity.setTenantId(user.getTenantId()); + waybillTrackEntity.setCreateUser(userId); + waybillTrackEntity.setUpdateUser(userId); + waybillTrackEntity.setCheckStatus(1); + waybillTrackEntity.setCheckTime(new Date()); + trunklineWaybillTrackService.save(waybillTrackEntity); + + //存入运单json + + } + + @LogpmAsync("asyncExecutor") + @Override + public void sendOpenWaybillFanout(WarehouseWaybillEntity waybillEntity, List details,List advanceIds) { + + Integer waybillType = waybillEntity.getWaybillType(); + String waybillNo = waybillEntity.getWaybillNo(); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("warehouseId",waybillEntity.getDepartureWarehouseId()); + jsonObject.put("warehouseName",waybillEntity.getDepartureWarehouseName()); + jsonObject.put("waybillId",waybillEntity.getId()); + jsonObject.put("waybillNo",waybillNo); + jsonObject.put("waybillType",waybillType); + jsonObject.put("brandId",waybillEntity.getBrandId()); + jsonObject.put("consigneeId",waybillEntity.getConsigneeId()); + Long consigneeId = waybillEntity.getConsigneeId(); + BasicdataClientEntity basicdataClientEntity = basicdataClientClient.findEntityById(consigneeId); + if(Objects.isNull(basicdataClientEntity)){ + jsonObject.put("typeService","1"); + }else{ + BasicdataStoreBusinessEntity storeBusinessEntity = basicdataStoreBusinessClient.findByClientIdAndTypeService(consigneeId, 3); + if(Objects.isNull(storeBusinessEntity)){ + jsonObject.put("typeService","1"); + }else{ + jsonObject.put("typeService",storeBusinessEntity.getMold()); + } + } + + + Integer totalCount = waybillEntity.getTotalCount(); + //干线价格 + BigDecimal pickupFee = waybillEntity.getPickupFee(); + BigDecimal pickupPrice = pickupFee.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal installFee = waybillEntity.getInstallFee(); + BigDecimal installPrice = installFee.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal insuranceFee = waybillEntity.getInsuranceFee(); + BigDecimal insurancePrice = insuranceFee.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal claimingValue = waybillEntity.getClaimingValue(); + BigDecimal claimingPrice = claimingValue.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal otherFee = waybillEntity.getOtherFee(); + BigDecimal otherPrice = otherFee.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal rebate = waybillEntity.getRebate(); + if(Objects.isNull(rebate)){ + rebate = BigDecimal.ZERO; + } + BigDecimal rebatePrice = rebate.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal thirdOperationFee = waybillEntity.getThirdOperationFee(); + if(Objects.isNull(thirdOperationFee)){ + thirdOperationFee = BigDecimal.ZERO; + } + BigDecimal thirdOperationPrice = thirdOperationFee.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal xPay = waybillEntity.getXPay(); + BigDecimal xPayPrice = xPay.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal dPay = waybillEntity.getDPay(); + BigDecimal dPayPrice = dPay.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal hPay = waybillEntity.getHPay(); + BigDecimal hPayPrice = hPay.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal yPay = waybillEntity.getYPay(); + BigDecimal yPayPrice = yPay.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + + //把details转化成不分组以productName为key的map + Map detailsMap = details.stream() + .collect(Collectors.toMap(WarehouseWayBillDetail::getProductName, detail -> detail, (a, b) -> a)); + + if(waybillType.equals(1)){ + //订制品 + List list = advanceDetailService.findAdvanceDetailVoByAdvanceIds(advanceIds); + //把list按goodsName分组,并统计一个count,转成一个map +// Map countMap = list.stream() +// .collect(Collectors.toMap(TrunklineAdvanceDetailVO::getGoodsName, TrunklineAdvanceDetailVO::getQuantity, Integer::sum)); +// countMap.keySet().forEach(goodsName -> { +// WarehouseWayBillDetail warehouseWayBillDetail = detailsMap.get(goodsName); +// +// +// +// }); + + + + List jsonList = new ArrayList<>(); + list.forEach(advanceDetailVO -> { + JSONObject json = new JSONObject(); + String goodsName = advanceDetailVO.getGoodsName(); + BigDecimal openPrice = BigDecimal.ZERO; + json.put("orderPackageCode",advanceDetailVO.getOrderPackageCode()); + json.put("orderCode",advanceDetailVO.getOrderCode()); + json.put("productId",advanceDetailVO.getGoodsId()); + json.put("productName",goodsName); + json.put("totalNum",advanceDetailVO.getQuantity()); + BigDecimal weight = advanceDetailVO.getWeight(); + if(Objects.isNull(weight)){ + weight = BigDecimal.ZERO; + } + json.put("totalWeight",advanceDetailVO.getWeight()); + BigDecimal volume = advanceDetailVO.getVolume(); + if(Objects.isNull(volume)){ + volume = BigDecimal.ZERO; + } + json.put("totalVolume",volume); + + WarehouseWayBillDetail warehouseWayBillDetail = detailsMap.get(goodsName); + if(!Objects.isNull(warehouseWayBillDetail)){ + Integer num = warehouseWayBillDetail.getNum(); + if(num > 0){ + json.put("freightFee",warehouseWayBillDetail.getPrice()); + openPrice = openPrice.add(warehouseWayBillDetail.getPrice()); + BigDecimal deliveryPrice = warehouseWayBillDetail.getDeliveryPrice(); + if(Objects.isNull(deliveryPrice)){ + deliveryPrice = BigDecimal.ZERO; + } + json.put("deliveryFee",warehouseWayBillDetail.getDeliveryPrice()); + json.put("deliveryServiceFee",warehouseWayBillDetail.getDeliveryPrice()); + openPrice = openPrice.add(deliveryPrice); + warehouseWayBillDetail.setNum(num-1); + detailsMap.put(goodsName,warehouseWayBillDetail); + } + } + json.put("warehouseServiceFee",BigDecimal.ZERO); + json.put("warehouseFee",BigDecimal.ZERO); + json.put("warehouseManageFee",BigDecimal.ZERO); + json.put("warehouseSortingFee",BigDecimal.ZERO); + json.put("warehouseOperatingFee",BigDecimal.ZERO); + json.put("pickupFee",pickupPrice); + openPrice = openPrice.add(pickupPrice); + json.put("deliveryLoadingFee",BigDecimal.ZERO); + json.put("deliverySortingFee",BigDecimal.ZERO); + json.put("deliveryUpfloorFee",BigDecimal.ZERO); + json.put("deliveryMoveFee",BigDecimal.ZERO); + json.put("deliveryDistance",BigDecimal.ZERO); + json.put("deliveryCrossingFee",BigDecimal.ZERO); + json.put("installFee",installPrice); + json.put("quotationFee",insurancePrice); + json.put("claimingValue",claimingPrice); + json.put("otherFee",otherPrice); + json.put("returnFee",rebatePrice); + json.put("thirdOprationFee",thirdOperationPrice); + json.put("xPay",xPayPrice); + json.put("dPay",dPayPrice); + json.put("hPay",hPayPrice); + json.put("yPay",yPayPrice); + openPrice = openPrice.add(installPrice).add(insurancePrice).add(claimingPrice).add(otherPrice).add(rebatePrice).add(thirdOperationPrice); + json.put("openPrice",openPrice); + jsonList.add(json); + }); + + + AtomicInteger atomicOtherNum = new AtomicInteger(); + List otherTotalPriceList = new ArrayList<>(); + List otherTotalDeliveryPriceList = new ArrayList<>(); + detailsMap.values().forEach(warehouseWayBillDetail -> { + if (warehouseWayBillDetail != null && warehouseWayBillDetail.getNum() > 0) { + Integer num = warehouseWayBillDetail.getNum(); + atomicOtherNum.addAndGet(num); + + // 使用 BigDecimal 的 add 方法来正确累加总价,确保精度 + otherTotalPriceList.add(warehouseWayBillDetail.getPrice().multiply(new BigDecimal(num))); + BigDecimal deliveryPrice = warehouseWayBillDetail.getDeliveryPrice(); + if(Objects.isNull(deliveryPrice)){ + deliveryPrice = BigDecimal.ZERO; + } + otherTotalDeliveryPriceList.add(deliveryPrice.multiply(new BigDecimal(num))); + } + }); + + int otherNum = atomicOtherNum.get(); + + BigDecimal p = BigDecimal.ZERO; + BigDecimal dp = BigDecimal.ZERO; + //otherTotalPriceList元素求和 + if(otherNum > 0){ + BigDecimal otherTotalPrice = otherTotalPriceList.stream().reduce(BigDecimal.ZERO, BigDecimal::add); + p = otherTotalPrice.divide(new BigDecimal(otherNum), 2, RoundingMode.HALF_UP); + BigDecimal otherTotalDeliveryPrice = otherTotalDeliveryPriceList.stream().reduce(BigDecimal.ZERO, BigDecimal::add); + dp = otherTotalDeliveryPrice.divide(new BigDecimal(otherNum), 2, RoundingMode.HALF_UP); + } + + + BigDecimal finalP = p; + BigDecimal finalDp = dp; + jsonList.forEach(json -> { + BigDecimal op = json.getBigDecimal("openPrice"); + BigDecimal freightFee = json.getBigDecimal("freightFee"); + if(Objects.isNull(freightFee)){ + json.put("freightFee", finalP); + op = op.add(finalP); + } + BigDecimal deliveryFee = json.getBigDecimal("deliveryFee"); + if(Objects.isNull(deliveryFee)){ + json.put("deliveryFee", finalDp); + json.put("deliveryServiceFee", finalDp); + op = op.add(finalDp); + } + json.put("openPrice",op); + }); + jsonObject.put("orderPackageCodes",jsonList); + + }else if(waybillType.equals(2)){ + //零担 + List jsonList = new ArrayList<>(); + details.forEach(detail -> { + Integer num = detail.getNum(); + JSONObject json = new JSONObject(); + BigDecimal openPrice = BigDecimal.ZERO; + json.put("orderPackageCode",detail.getProductName()); + json.put("orderCode",waybillNo); + json.put("productName",detail.getProductName()); + json.put("productId",detail.getProductId()); + json.put("totalNum",num); + json.put("totalWeight",detail.getWeight()); + json.put("totalVolume",detail.getVolume()); + json.put("freightFee",detail.getSubtotalFreight()); + openPrice = openPrice.add(detail.getSubtotalFreight()); + json.put("deliveryFee",detail.getSubtotalDeliveryFee()); + openPrice = openPrice.add(detail.getSubtotalDeliveryFee()); + json.put("warehouseServiceFee",BigDecimal.ZERO); + json.put("warehouseFee",BigDecimal.ZERO); + json.put("warehouseManageFee",BigDecimal.ZERO); + json.put("warehouseSortingFee",BigDecimal.ZERO); + json.put("warehouseOperatingFee",BigDecimal.ZERO); + json.put("pickupFee",pickupPrice.multiply(new BigDecimal(num))); + openPrice = openPrice.add(pickupPrice.multiply(new BigDecimal(num))); + json.put("deliveryLoadingFee",BigDecimal.ZERO); + json.put("deliverySortingFee",BigDecimal.ZERO); + json.put("deliveryUpfloorFee",BigDecimal.ZERO); + json.put("deliveryMoveFee",BigDecimal.ZERO); + json.put("deliveryDistance",BigDecimal.ZERO); + json.put("deliveryCrossingFee",BigDecimal.ZERO); + json.put("installFee",installPrice); + openPrice = openPrice.add(installPrice.multiply(new BigDecimal(num))); + json.put("quotationFee",insurancePrice); + openPrice = openPrice.add(insurancePrice.multiply(new BigDecimal(num))); + json.put("claimingValue",claimingPrice); + openPrice = openPrice.add(claimingPrice.multiply(new BigDecimal(num))); + json.put("otherFee",otherPrice); + openPrice = openPrice.add(otherPrice.multiply(new BigDecimal(num))); + json.put("returnFee",rebatePrice); + openPrice = openPrice.add(rebatePrice.multiply(new BigDecimal(num))); + json.put("thirdOprationFee",thirdOperationPrice); + openPrice = openPrice.add(thirdOperationPrice.multiply(new BigDecimal(num))); + json.put("xPay",xPayPrice); + openPrice = openPrice.add(xPayPrice.multiply(new BigDecimal(num))); + json.put("dPay",dPayPrice); + openPrice = openPrice.add(dPayPrice.multiply(new BigDecimal(num))); + json.put("hPay",hPayPrice); + openPrice = openPrice.add(hPayPrice.multiply(new BigDecimal(num))); + json.put("yPay",yPayPrice); + openPrice = openPrice.add(yPayPrice.multiply(new BigDecimal(num))); + json.put("openPrice",openPrice); + jsonList.add(json); + }); + jsonObject.put("orderPackageCodes",jsonList); + } + + FanoutMsg build = FanoutMsg.builder().msg(jsonObject.toJSONString()) + .exchange(FanoutConstants.trunkline.OPENWAYBILL.EXCHANGE).build(); + + sendFanoutService.sendFanoutMsg(build); + + } + + + @LogpmAsync("asyncExecutor") + @Override + public void sendUpdateWaybillFanout(WarehouseWaybillEntity waybillEntity, List details,List advanceIds,String oldConsignee) { + + Integer waybillType = waybillEntity.getWaybillType(); + String waybillNo = waybillEntity.getWaybillNo(); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("warehouseId",waybillEntity.getDepartureWarehouseId()); + jsonObject.put("warehouseName",waybillEntity.getDepartureWarehouseName()); + jsonObject.put("waybillId",waybillEntity.getId()); + jsonObject.put("waybillNo",waybillNo); + jsonObject.put("waybillType",waybillType); + jsonObject.put("oldConsignee",oldConsignee); + Long consigneeId = waybillEntity.getConsigneeId(); + BasicdataClientEntity basicdataClientEntity = basicdataClientClient.findEntityById(consigneeId); + if(Objects.isNull(basicdataClientEntity)){ + jsonObject.put("typeService","1"); + }else{ + BasicdataStoreBusinessEntity storeBusinessEntity = basicdataStoreBusinessClient.findByClientIdAndTypeService(consigneeId, 3); + if(Objects.isNull(storeBusinessEntity)){ + jsonObject.put("typeService","1"); + }else{ + jsonObject.put("typeService",storeBusinessEntity.getMold()); + } + } + + + Integer totalCount = waybillEntity.getTotalCount(); + BigDecimal pickupFee = waybillEntity.getPickupFee(); + BigDecimal pickupPrice = pickupFee.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal installFee = waybillEntity.getInstallFee(); + BigDecimal installPrice = installFee.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal insuranceFee = waybillEntity.getInsuranceFee(); + BigDecimal insurancePrice = insuranceFee.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal claimingValue = waybillEntity.getClaimingValue(); + BigDecimal claimingPrice = claimingValue.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal otherFee = waybillEntity.getOtherFee(); + BigDecimal otherPrice = otherFee.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal rebate = waybillEntity.getRebate(); + if(rebate==null){ + rebate = BigDecimal.ZERO; + } + BigDecimal rebatePrice = rebate.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal thirdOperationFee = waybillEntity.getThirdOperationFee(); + BigDecimal thirdOperationPrice = thirdOperationFee.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal xPay = waybillEntity.getXPay(); + BigDecimal xPayPrice = xPay.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal dPay = waybillEntity.getDPay(); + BigDecimal dPayPrice = dPay.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal hPay = waybillEntity.getHPay(); + BigDecimal hPayPrice = hPay.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + BigDecimal yPay = waybillEntity.getYPay(); + BigDecimal yPayPrice = yPay.divide(new BigDecimal(totalCount), 2, RoundingMode.HALF_UP); + + //把details转化成不分组以productName为key的map + Map detailsMap = details.stream() + .collect(Collectors.toMap(WarehouseWayBillDetail::getProductName, detail -> detail, (a, b) -> a)); + + if(waybillType.equals(1)){ + //订制品 + List list = advanceDetailService.findAdvanceDetailVoByAdvanceIds(advanceIds); + + List jsonList = new ArrayList<>(); + list.forEach(advanceDetailVO -> { + JSONObject json = new JSONObject(); + String goodsName = advanceDetailVO.getGoodsName(); + BigDecimal openPrice = BigDecimal.ZERO; + json.put("orderPackageCode",advanceDetailVO.getOrderPackageCode()); + json.put("orderCode",advanceDetailVO.getOrderCode()); + json.put("productId",advanceDetailVO.getGoodsId()); + json.put("productName",goodsName); + json.put("totalNum",advanceDetailVO.getQuantity()); + json.put("totalWeight",advanceDetailVO.getWeight()); + json.put("totalVolume",advanceDetailVO.getVolume()); + + WarehouseWayBillDetail warehouseWayBillDetail = detailsMap.get(goodsName); + if(!Objects.isNull(warehouseWayBillDetail)){ + Integer num = warehouseWayBillDetail.getNum(); + if(num > 0){ + json.put("freightFee",warehouseWayBillDetail.getPrice()); + openPrice = openPrice.add(warehouseWayBillDetail.getPrice()); + json.put("deliveryFee",warehouseWayBillDetail.getDeliveryPrice()); + json.put("deliveryServiceFee",warehouseWayBillDetail.getDeliveryPrice()); + openPrice = openPrice.add(warehouseWayBillDetail.getDeliveryPrice()); + warehouseWayBillDetail.setNum(num-1); + detailsMap.put(goodsName,warehouseWayBillDetail); + } + } + json.put("warehouseServiceFee",BigDecimal.ZERO); + json.put("warehouseFee",BigDecimal.ZERO); + json.put("warehouseManageFee",BigDecimal.ZERO); + json.put("warehouseSortingFee",BigDecimal.ZERO); + json.put("warehouseOperatingFee",BigDecimal.ZERO); + json.put("pickupFee",pickupPrice); + openPrice = openPrice.add(pickupPrice); + json.put("deliveryLoadingFee",BigDecimal.ZERO); + json.put("deliverySortingFee",BigDecimal.ZERO); + json.put("deliveryUpfloorFee",BigDecimal.ZERO); + json.put("deliveryMoveFee",BigDecimal.ZERO); + json.put("deliveryDistance",BigDecimal.ZERO); + json.put("deliveryCrossingFee",BigDecimal.ZERO); + json.put("installFee",installPrice); + json.put("quotationFee",insurancePrice); + json.put("claimingValue",claimingPrice); + json.put("otherFee",otherPrice); + json.put("returnFee",rebatePrice); + json.put("thirdOprationFee",thirdOperationPrice); + json.put("xPay",xPayPrice); + json.put("dPay",dPayPrice); + json.put("hPay",hPayPrice); + json.put("yPay",yPayPrice); + openPrice = openPrice.add(installPrice).add(insurancePrice).add(claimingPrice).add(otherPrice).add(rebatePrice).add(thirdOperationPrice).add(xPayPrice).add(dPayPrice).add(hPayPrice).add(yPayPrice); + json.put("openPrice",openPrice); + jsonList.add(json); + }); + + + AtomicInteger atomicOtherNum = new AtomicInteger(); + List otherTotalPriceList = new ArrayList<>(); + List otherTotalDeliveryPriceList = new ArrayList<>(); + detailsMap.values().forEach(warehouseWayBillDetail -> { + if (warehouseWayBillDetail != null && warehouseWayBillDetail.getNum() > 0) { + Integer num = warehouseWayBillDetail.getNum(); + atomicOtherNum.addAndGet(num); + + // 使用 BigDecimal 的 add 方法来正确累加总价,确保精度 + otherTotalPriceList.add(warehouseWayBillDetail.getPrice().multiply(new BigDecimal(num))); + otherTotalDeliveryPriceList.add(warehouseWayBillDetail.getDeliveryPrice().multiply(new BigDecimal(num))); + } + }); + + int otherNum = atomicOtherNum.get(); + if(otherNum==0){ + otherNum=1; + } + //otherTotalPriceList元素求和 + BigDecimal otherTotalPrice = otherTotalPriceList.stream().reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal p = otherTotalPrice.divide(new BigDecimal(otherNum), 2, RoundingMode.HALF_UP); + BigDecimal otherTotalDeliveryPrice = otherTotalDeliveryPriceList.stream().reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal dp = otherTotalDeliveryPrice.divide(new BigDecimal(otherNum), 2, RoundingMode.HALF_UP); + + jsonList.forEach(json -> { + BigDecimal op = json.getBigDecimal("openPrice"); + BigDecimal freightFee = json.getBigDecimal("freightFee"); + if(Objects.isNull(freightFee)){ + json.put("freightFee",p); + op = op.add(p); + } + BigDecimal deliveryFee = json.getBigDecimal("deliveryFee"); + if(Objects.isNull(deliveryFee)){ + json.put("deliveryFee",dp); + json.put("deliveryServiceFee",dp); + op = op.add(dp); + } + json.put("openPrice",op); + }); + jsonObject.put("orderPackageCodes",jsonList); + + }else if(waybillType.equals(2)){ + //零担 + List jsonList = new ArrayList<>(); + details.forEach(detail -> { + Integer num = detail.getNum(); + JSONObject json = new JSONObject(); + BigDecimal openPrice = BigDecimal.ZERO; + json.put("orderPackageCode",detail.getProductName()); + json.put("orderCode",waybillNo); + json.put("productName",detail.getProductName()); + json.put("totalNum",num); + json.put("totalWeight",detail.getWeight()); + json.put("totalVolume",detail.getVolume()); + json.put("freightFee",detail.getSubtotalFreight()); + openPrice = openPrice.add(detail.getSubtotalFreight()); + json.put("deliveryFee",detail.getSubtotalDeliveryFee()); + openPrice = openPrice.add(detail.getSubtotalDeliveryFee()); + json.put("warehouseServiceFee",BigDecimal.ZERO); + json.put("warehouseFee",BigDecimal.ZERO); + json.put("warehouseManageFee",BigDecimal.ZERO); + json.put("warehouseSortingFee",BigDecimal.ZERO); + json.put("warehouseOperatingFee",BigDecimal.ZERO); + json.put("pickupFee",pickupPrice.multiply(new BigDecimal(num))); + openPrice = openPrice.add(pickupPrice.multiply(new BigDecimal(num))); + json.put("deliveryLoadingFee",BigDecimal.ZERO); + json.put("deliverySortingFee",BigDecimal.ZERO); + json.put("deliveryUpfloorFee",BigDecimal.ZERO); + json.put("deliveryMoveFee",BigDecimal.ZERO); + json.put("deliveryDistance",BigDecimal.ZERO); + json.put("deliveryCrossingFee",BigDecimal.ZERO); + json.put("installFee",installPrice); + openPrice = openPrice.add(installPrice.multiply(new BigDecimal(num))); + json.put("quotationFee",insurancePrice); + openPrice = openPrice.add(insurancePrice.multiply(new BigDecimal(num))); + json.put("claimingValue",claimingPrice); + openPrice = openPrice.add(claimingPrice.multiply(new BigDecimal(num))); + json.put("otherFee",otherPrice); + openPrice = openPrice.add(otherPrice.multiply(new BigDecimal(num))); + json.put("returnFee",rebatePrice); + openPrice = openPrice.add(rebatePrice.multiply(new BigDecimal(num))); + json.put("thirdOprationFee",thirdOperationPrice); + openPrice = openPrice.add(thirdOperationPrice.multiply(new BigDecimal(num))); + json.put("xPay",xPayPrice); + openPrice = openPrice.add(xPayPrice.multiply(new BigDecimal(num))); + json.put("dPay",dPayPrice); + openPrice = openPrice.add(dPayPrice.multiply(new BigDecimal(num))); + json.put("hPay",hPayPrice); + openPrice = openPrice.add(hPayPrice.multiply(new BigDecimal(num))); + json.put("yPay",yPayPrice); + openPrice = openPrice.add(yPayPrice.multiply(new BigDecimal(num))); + json.put("openPrice",openPrice); + jsonList.add(json); + }); + jsonObject.put("orderPackageCodes",jsonList); + } + + FanoutMsg build = FanoutMsg.builder().msg(jsonObject.toJSONString()) + .exchange(FanoutConstants.trunkline.UPDATEWAYBILL.EXCHANGE).build(); + + sendFanoutService.sendFanoutMsg(build); + } + + @LogpmAsync("asyncExecutor") + @Override + public void dealwithBillladingInfo(List advanceIds,Long warehouseId,String warehouseName,Long waybillId,String waybillNo) { + + //查询这些暂存单所有包件有在哪些提货单中有多少个 + List billladingPackageList = advanceDetailService.findBillladingPackageByAdvanceIdsAnd(advanceIds); + List addBillladingWaybillEntities = new ArrayList<>(); + List updateBillladingWaybillEntities = new ArrayList<>(); + + List updateFeeBilllading = new ArrayList<>(); + + //把billladingPackageList转化成以billladingId为key的Map,以billladingId为key,value为BillladingPackageVO + Map billladingPackageMap = billladingPackageList.stream().collect(Collectors.toMap(BillladingPackageVO::getBillladingId, Function.identity())); + + List billladingIds = new ArrayList<>(billladingPackageMap.keySet()); + if(billladingIds.isEmpty()){ + return; + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("id", billladingIds) + .eq("is_deleted", 0) + .eq("billlading_status", "2"); + List billladingEntities = trunklineBillladingService.list(queryWrapper); + + //把billladingEntities转化成以id为key的Map + Map billladingMap = billladingEntities.stream().collect(Collectors.toMap(TrunklineBillladingEntity::getId, Function.identity())); + + //查询这些提货单下没有运单的数据 + List billladingNoWaybillEntities = trunklineBillladingWaybillService.getNoDataWaybillByBillladingIds(billladingIds); + + //把billladingWaybillEntities转化成以billladingId为key的Map + Map billladingNoWaybillMap = billladingNoWaybillEntities.stream().collect(Collectors.toMap(TrunklineBillladingWaybillEntity::getBillladingId, Function.identity())); + + billladingPackageMap.keySet().forEach(billladingId -> { + BillladingPackageVO billladingPackageVO = billladingPackageMap.get(billladingId); + Integer num = billladingPackageVO.getNum(); + TrunklineBillladingWaybillEntity billladingNoWaybillEntity = billladingNoWaybillMap.get(billladingId); + if(!Objects.isNull(billladingNoWaybillEntity)){ + TrunklineBillladingEntity billladingEntity = billladingMap.get(billladingId); + Integer realNum = billladingNoWaybillEntity.getRealNum(); + if (realNum > num) { + billladingNoWaybillEntity.setRealNum(realNum - num); + } else if (realNum.equals(num)) { + billladingNoWaybillEntity.setRealNum(0); + billladingNoWaybillEntity.setIsDeleted(1); + } + updateBillladingWaybillEntities.add(billladingNoWaybillEntity); + TrunklineBillladingWaybillEntity addbillladingWaybillEntity = new TrunklineBillladingWaybillEntity(); + addbillladingWaybillEntity.setWarehouseId(warehouseId); + addbillladingWaybillEntity.setWarehouseName(warehouseName); + addbillladingWaybillEntity.setBillladingId(billladingId); + addbillladingWaybillEntity.setBilladingCode(billladingEntity.getBillladingCode()); + addbillladingWaybillEntity.setWaybillId(waybillId); + addbillladingWaybillEntity.setWaybillNo(waybillNo); + addbillladingWaybillEntity.setRealNum(num); + addbillladingWaybillEntity.setRealVolume(BigDecimal.ZERO); + addbillladingWaybillEntity.setRealWeight(BigDecimal.ZERO); + addBillladingWaybillEntities.add(addbillladingWaybillEntity); + updateFeeBilllading.add(billladingEntity); + } + }); + + trunklineBillladingWaybillService.updateBatchById(updateBillladingWaybillEntities); + trunklineBillladingWaybillService.saveBatch(addBillladingWaybillEntities); + + //更新提货单对应的运单的提货费用 + for (TrunklineBillladingEntity billladingEntity : updateFeeBilllading) { + trunklineBillladingWaybillService.updateBillladingFeeByBillladingId(billladingEntity); + } + + + + + } + + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderServiceImpl.java index ed8542c61..c2b74f410 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderServiceImpl.java @@ -1,5 +1,7 @@ package com.logpm.trunkline.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -11,6 +13,7 @@ import com.logpm.basic.entity.BasicMaterialEntity; import com.logpm.basic.feign.IBasicMaterialClient; import com.logpm.basicdata.entity.*; import com.logpm.basicdata.feign.*; +import com.logpm.basicdata.vo.BasicdataClientVO; import com.logpm.basicdata.vo.BasicdataFreightApiVO; import com.logpm.distribution.entity.DistributionParcelListEntity; import com.logpm.distribution.entity.DistributionParcelNumberEntity; @@ -29,13 +32,14 @@ import com.logpm.warehouse.feign.IWarehouseWaybillDetailClient; import com.logpm.warehouse.vo.WarehouseWaybillVO; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.common.annotations.RepeatSubmit; import org.springblade.common.constant.CodeNumConstant; import org.springblade.common.constant.DictBizConstant; import org.springblade.common.constant.IncomingTypeEnum; +import org.springblade.common.constant.RabbitConstant; import org.springblade.common.constant.order.*; import org.springblade.common.exception.CustomerException; import org.springblade.common.utils.CommonUtil; -import org.springblade.core.log.exception.ServiceException; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.BeanUtil; @@ -43,6 +47,7 @@ import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.system.cache.DictBizCache; import org.springblade.system.feign.IRegionFeign; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -51,6 +56,7 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @Slf4j @@ -87,6 +93,12 @@ public class OpenOrderServiceImpl implements IOpenOrderService { private final ITrunklineWaybillReturnService trunklineWaybillReturnService; private final IBasicdataOpenIncomingClient basicdataOpenIncomingClient; private final ITrunklineCarsLoadService carsLoadService; + private final ITrunklineCarsLoadScanService trunklineCarsLoadScanService; + private final IBasicdataStoreContactClient basicdataStoreContactClient; + private final IAsyncService asyncService; + private final ICarsLoadAsyncService carsLoadAsyncService; + + private final RabbitTemplate rabbitTemplate; @Override public IPage advancePageList(AdvanceDTO advanceDTO) { @@ -94,9 +106,7 @@ public class OpenOrderServiceImpl implements IOpenOrderService { page.setCurrent(advanceDTO.getPageNum()); page.setSize(advanceDTO.getPageSize()); - IPage pageList = advanceService.advancePageList(page, advanceDTO); - - return pageList; + return advanceService.advancePageList(page, advanceDTO); } @Override @@ -122,11 +132,13 @@ public class OpenOrderServiceImpl implements IOpenOrderService { return R.fail(405, "暂存单数据不存在"); } String dealerName = null; + String dealerCode = null; String brand = null; Integer totalNum = 0; for (TrunklineAdvanceEntity advanceEntity : list) { if (StringUtil.isBlank(dealerName)) { dealerName = advanceEntity.getDealerName(); + dealerCode = advanceEntity.getDealerCode(); } if (StringUtil.isBlank(brand)) { brand = advanceEntity.getBrand(); @@ -139,6 +151,10 @@ public class OpenOrderServiceImpl implements IOpenOrderService { OpenOrderVO infoByIds = advanceService.selectInfoByIds(advanceIds); BeanUtil.copy(infoByIds, openOrderVO); openOrderVO.setAdvanceIds(advanceIds); + BasicdataBrandEntity basicdataBrandEntity = basicdataBrandClient.findEntityByName(brand); + if (!Objects.isNull(basicdataBrandEntity)) { + openOrderVO.setBrandId(basicdataBrandEntity.getId()); + } //发站仓-----目前登录人的仓库 openOrderVO.setDepartureWarehouseName(basicdataWarehouseEntity.getName()); openOrderVO.setDepartureWarehouseId(warehouseId); @@ -146,26 +162,54 @@ public class OpenOrderServiceImpl implements IOpenOrderService { //发货单位 Long shipperId = basicdataForwardingUnitClient.findForwardingUnitByWarehouseId(warehouseId); if (!Objects.isNull(shipperId)) { - BasicdataClientEntity basicdataClientEntity = basicdataClientClient.findEntityById(shipperId); + BasicdataClientVO basicdataClientEntity = basicdataClientClient.findEntityVoById(shipperId); if (!Objects.isNull(basicdataClientEntity)) { openOrderVO.setShipperClientId(shipperId); openOrderVO.setShipper(basicdataClientEntity.getClientName()); openOrderVO.setShipperName(basicdataClientEntity.getLinkman()); openOrderVO.setShipperMobile(basicdataClientEntity.getPhone()); openOrderVO.setShipperAddress(basicdataClientEntity.getDetailedly()); + + List departureArray = new ArrayList<>(); + String badeRegionAreaId = basicdataClientEntity.getBladeRegionAreaId(); + String bladeRegionProvinceId = basicdataClientEntity.getBladeRegionProvinceId(); + String bladeRegionCityId = basicdataClientEntity.getBladeRegionCityId(); + departureArray.add(bladeRegionProvinceId); + departureArray.add(bladeRegionCityId); + String name = regionFeign.getName(bladeRegionCityId); + String areaId = bladeRegionCityId; + if (!StringUtil.isBlank(badeRegionAreaId)) { + departureArray.add(badeRegionAreaId); + name = regionFeign.getName(badeRegionAreaId); + areaId = badeRegionAreaId; + } + + openOrderVO.setDeparture(name); + openOrderVO.setDepartureCode(areaId); + openOrderVO.setDepartureArray(departureArray); + } } //收货单位-----根据三方商场找到对应的clientId - Long clientId = basicdataTripartiteMallClient.getClientIdByNameAndBrand(dealerName, brand); - BasicdataClientEntity basicdataClientEntity = basicdataClientClient.findEntityById(clientId); + Long clientId = basicdataTripartiteMallClient.getClientIdByNameAndBrandAndCode(dealerName,StringUtil.isBlank(dealerCode)?"":dealerCode, brand); + BasicdataClientVO basicdataClientEntity = basicdataClientClient.findEntityVoById(clientId); if (!Objects.isNull(basicdataClientEntity)) { openOrderVO.setConsigneeClientId(clientId); + TrunklineAdvanceEntity advanceEntity = list.get(0); openOrderVO.setConsignee(basicdataClientEntity.getClientName()); openOrderVO.setConsigneeName(basicdataClientEntity.getLinkman()); openOrderVO.setConsigneeMobile(basicdataClientEntity.getPhone()); openOrderVO.setConsigneeAddress(basicdataClientEntity.getDetailedly()); + if(!Objects.isNull(advanceEntity)){ + String consigneePerson = advanceEntity.getConsigneePerson(); + if(!StringUtil.isBlank(consigneePerson)){ + openOrderVO.setConsigneeName(consigneePerson); + openOrderVO.setConsigneeMobile(advanceEntity.getConsigneeMobile()); + openOrderVO.setConsigneeAddress(advanceEntity.getConsigneeAddress()); + } + } List destinationArray = new ArrayList<>(); String badeRegionAreaId = basicdataClientEntity.getBladeRegionAreaId(); @@ -181,6 +225,21 @@ public class OpenOrderServiceImpl implements IOpenOrderService { areaId = badeRegionAreaId; } + + openOrderVO.setDefaultDeliveryWay("2"); + String typeService = "1"; + BasicdataStoreBusinessEntity storeBusinessEntity = basicdataStoreBusinessClient.findByClientIdAndTypeService(clientId, 3); + if(!Objects.isNull(storeBusinessEntity)){ + typeService = storeBusinessEntity.getMold(); + } + if ("1".equals(typeService)){ + openOrderVO.setDefaultDeliveryWay("2"); + }else if("2".equals(typeService)){ + openOrderVO.setDefaultDeliveryWay("3"); + }else if("3".equals(typeService)){ + openOrderVO.setDefaultDeliveryWay("1"); + } + openOrderVO.setDestination(name); openOrderVO.setDestinationCode(areaId); openOrderVO.setDestinationArray(destinationArray); @@ -203,25 +262,51 @@ public class OpenOrderServiceImpl implements IOpenOrderService { basicdataFreightApiVO.setDestination(openOrderVO.getDestinationCode()); basicdataFreightApiVO.setArrivalWarehouse(openOrderVO.getDestinationWarehouseId() + ""); - for (AdvanceDetailGoodsVO advanceDetailGoodsVO : goodsList) { - String goodsName = advanceDetailGoodsVO.getGoodsName(); - BasicdataCategoryEntity basicdataCategoryEntity = basicdataCategoryClient.findByName(goodsName); - Long goodsId = null; - if (Objects.isNull(basicdataCategoryEntity)) { - basicdataCategoryEntity = new BasicdataCategoryEntity(); - basicdataCategoryEntity.setType(1); - basicdataCategoryEntity.setName(goodsName); - goodsId = basicdataCategoryClient.addReturnId(basicdataCategoryEntity); - } else { - goodsId = basicdataCategoryEntity.getId(); + if (goodsList.isEmpty()) { + List ls = new ArrayList<>(); + //把list中的元素通过packName分组如果pickName为空则换为"其他" + Map> groupedEntities = list.stream() + .collect(Collectors.groupingBy(entity -> { + String packName = entity.getPackName(); + return packName != null ? packName : "其他"; + })); + + groupedEntities.keySet().forEach(packName -> { + int total; + List advanceEntityList = groupedEntities.get(packName); + total = advanceEntityList.stream().mapToInt(TrunklineAdvanceEntity::getTotalNum).sum(); + AdvanceDetailGoodsVO advanceDetailGoodsVO = new AdvanceDetailGoodsVO(); + advanceDetailGoodsVO.setChargeType(1); + advanceDetailGoodsVO.setGoodsName(packName); + advanceDetailGoodsVO.setNum(total); + advanceDetailGoodsVO.setVolume(BigDecimal.ZERO); + advanceDetailGoodsVO.setWeight(BigDecimal.ZERO); + ls.add(advanceDetailGoodsVO); + }); + goodsList = new ArrayList<>(ls); + } else { + for (AdvanceDetailGoodsVO advanceDetailGoodsVO : goodsList) { + String goodsName = advanceDetailGoodsVO.getGoodsName(); + BasicdataCategoryEntity basicdataCategoryEntity = basicdataCategoryClient.findByName(goodsName); + Long goodsId = null; + if (Objects.isNull(basicdataCategoryEntity)) { + basicdataCategoryEntity = new BasicdataCategoryEntity(); + basicdataCategoryEntity.setType(1); + basicdataCategoryEntity.setName(goodsName); + goodsId = basicdataCategoryClient.addReturnId(basicdataCategoryEntity); + } else { + goodsId = basicdataCategoryEntity.getId(); + } + advanceDetailGoodsVO.setGoodsId(goodsId); + basicdataFreightApiVO.setCategory(goodsId + ""); + List pirceList = basicdataFreightClient.pirce(basicdataFreightApiVO); + JSONArray price = JSONArray.parseArray(JSON.toJSONString(pirceList)); + advanceDetailGoodsVO.setArrPirce(price); } - advanceDetailGoodsVO.setGoodsId(goodsId); - basicdataFreightApiVO.setCategory(goodsId + ""); - List pirceList = basicdataFreightClient.pirce(basicdataFreightApiVO); - JSONArray price = JSONArray.parseArray(JSON.toJSONString(pirceList)); - advanceDetailGoodsVO.setArrPirce(price); } + + openOrderVO.setGoodsList(goodsList); //查询支付方式 @@ -275,7 +360,8 @@ public class OpenOrderServiceImpl implements IOpenOrderService { return R.success("验证成功"); } - @Transactional(rollbackFor = ServiceException.class) + @RepeatSubmit + @Transactional(rollbackFor = Exception.class) @Override public R openWaybill(OpenOrderDTO openOrderDTO) { log.info("############openWaybill: 开单开始 openOrderDTO={}", openOrderDTO); @@ -303,13 +389,19 @@ public class OpenOrderServiceImpl implements IOpenOrderService { Long destinationWarehouseId = openOrderDTO.getDestinationWarehouseId(); String brand = openOrderDTO.getBrand(); - BasicdataBrandEntity basicdataBrandEntity = basicdataBrandClient.findEntityByName(brand); + Long brandId = openOrderDTO.getBrandId(); + WarehouseWaybillEntity waybillEntity = new WarehouseWaybillEntity(); waybillEntity.setWaybillNo(waybillNo); - if (!Objects.isNull(basicdataBrandEntity)) { - waybillEntity.setBrandId(basicdataBrandEntity.getId()); + if (Objects.isNull(brandId)) { + BasicdataBrandEntity basicdataBrandEntity = basicdataBrandClient.findEntityByName(brand); + if (!Objects.isNull(basicdataBrandEntity)) { + brandId = basicdataBrandEntity.getId(); + } } + + waybillEntity.setBrandId(brandId); waybillEntity.setBrand(brand); waybillEntity.setOrderNo(openOrderDTO.getOrderCode()); waybillEntity.setDepartureWarehouseId(departureWarehouseId); @@ -344,16 +436,24 @@ public class OpenOrderServiceImpl implements IOpenOrderService { waybillEntity.setDestination(openOrderDTO.getDestination()); waybillEntity.setDestinationCode(openOrderDTO.getDestinationCode()); + waybillEntity.setDeparture(openOrderDTO.getDeparture()); + waybillEntity.setDepartureCode(openOrderDTO.getDepartureCode()); waybillEntity.setGoodsName(openOrderDTO.getGoodsName()); waybillEntity.setTotalCount(openOrderDTO.getTotalCount()); waybillEntity.setTotalVolume(openOrderDTO.getTotalVolume()); waybillEntity.setTotalWeight(openOrderDTO.getTotalWeghit()); + waybillEntity.setDealerCode(openOrderDTO.getDealerCode()); + waybillEntity.setDealerName(openOrderDTO.getDealerName()); + waybillEntity.setWaybillStatus("0"); //统计当前订单的在库数 List advanceIds = openOrderDTO.getAdvanceIds(); AdvanceDetailStockNumVO advanceDetailStockNumVO = advanceDetailService.findStockNumByAdvanceIds(advanceIds); waybillEntity.setStockCount(advanceDetailStockNumVO.getStockNum()); waybillEntity.setStockWeight(advanceDetailStockNumVO.getStockWeight()); waybillEntity.setStockVolume(advanceDetailStockNumVO.getStockVolume()); + List billladingPackageList = advanceDetailService.findBillladingPackageByAdvanceIdsAnd(advanceIds); + //把billladingPackageList中的所有num累加 + waybillEntity.setBillladingNum(billladingPackageList.stream().mapToInt(BillladingPackageVO::getNum).sum()); waybillEntity.setTotalFreight(openOrderDTO.getTotalFreight()); waybillEntity.setDeliveryFee(openOrderDTO.getDeliveryFee()); @@ -385,17 +485,23 @@ public class OpenOrderServiceImpl implements IOpenOrderService { waybillEntity.setReceipt(openOrderDTO.getReceipt()); waybillEntity.setRemark(openOrderDTO.getRemark()); waybillEntity.setWaybillType(openOrderDTO.getWaybillType()); - waybillEntity.setAgent(AuthUtil.getUserName()); + waybillEntity.setAgent(AuthUtil.getNickName()); waybillEntity.setAgentId(AuthUtil.getUserId()); waybillEntity.setDocumentMakingTime(CommonUtil.StringToDate(openOrderDTO.getOpenOrderDate())); - + waybillEntity.setPickupCompleteOrNot(openOrderDTO.getPickupCompleteOrNot()); + waybillEntity.setTrunklineCompleteOrNot(openOrderDTO.getTrunklineCompleteOrNot()); + waybillEntity.setTrunklineVehicleType(openOrderDTO.getTrunklineVehicleType()); + waybillEntity.setPickupVehicleType(openOrderDTO.getPickupVehicleType()); + waybillEntity.setAbolishStatus(0); + waybillEntity.setFreezeStatus(0); Long waybillId = warehouseWaybillClient.addEnntity(waybillEntity); + waybillEntity.setId(waybillId); + List details = new ArrayList<>(); if (!Objects.isNull(waybillId)) { log.info("#################openWaybill: 运单保存成功"); //保存运单货物明细 List waybillDetailList = openOrderDTO.getWaybillDetailList(); - List details = new ArrayList<>(); for (WaybillDetailDTO waybillDetailDTO : waybillDetailList) { WarehouseWayBillDetail warehouseWayBillDetail = new WarehouseWayBillDetail(); warehouseWayBillDetail.setWaybillId(waybillId); @@ -429,6 +535,8 @@ public class OpenOrderServiceImpl implements IOpenOrderService { warehouseWayBillDetail.setPrice(waybillDetailDTO.getPrice()); warehouseWayBillDetail.setSubtotalFreight(waybillDetailDTO.getSubtotalFreight()); warehouseWayBillDetail.setChargeType(waybillDetailDTO.getChargeType()); + warehouseWayBillDetail.setDeliveryPrice(waybillDetailDTO.getDeliveryPrice()); + warehouseWayBillDetail.setSubtotalDeliveryFee(waybillDetailDTO.getSubtotalDeliveryFee()); details.add(warehouseWayBillDetail); } warehouseWaybillDetailClient.addList(details); @@ -476,83 +584,45 @@ public class OpenOrderServiceImpl implements IOpenOrderService { advanceService.updateBatchById(advanceEntityList); //计算扫码入库的包件是否需要把运单和提货单挂上 - List billladingPackageList = advanceDetailService.findBillladingPackageByAdvanceIdsAnd(advanceIds); - List billladingWaybillEntities = new ArrayList<>(); - - List updateFeeBilllading = new ArrayList<>(); - - for (BillladingPackageVO billladingPackageVO : billladingPackageList) { - Long billladingId = billladingPackageVO.getBillladingId(); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("id", billladingId) - .eq("is_deleted", 0) - .eq("billlading_status", "2"); - TrunklineBillladingEntity billladingEntity = trunklineBillladingService.getOne(queryWrapper); - if (Objects.isNull(billladingEntity)) { - log.info("#################openWaybill: 提货单信息不存在 billladingId={}", billladingId); - continue; - } - Integer num = billladingPackageVO.getNum(); - TrunklineBillladingWaybillEntity trunklineBillladingWaybillEntity = trunklineBillladingWaybillService.getNoDataWaybillByBillladingId(billladingId); - - if (!Objects.isNull(trunklineBillladingWaybillEntity)) { - Integer realNum = trunklineBillladingWaybillEntity.getRealNum(); - if (realNum > num) { - trunklineBillladingWaybillEntity.setRealNum(realNum - num); - } else if (realNum.equals(num)) { - trunklineBillladingWaybillEntity.setRealNum(0); - trunklineBillladingWaybillEntity.setIsDeleted(1); - } - trunklineBillladingWaybillService.updateById(trunklineBillladingWaybillEntity); - TrunklineBillladingWaybillEntity billladingWaybillEntity = new TrunklineBillladingWaybillEntity(); - billladingWaybillEntity.setWarehouseId(warehouseId); - billladingWaybillEntity.setWarehouseName(basicdataWarehouseEntity.getName()); - billladingWaybillEntity.setBillladingId(billladingId); - billladingWaybillEntity.setBilladingCode(billladingEntity.getBillladingCode()); - billladingWaybillEntity.setWaybillId(waybillId); - billladingWaybillEntity.setWaybillNo(waybillNo); - billladingWaybillEntity.setRealNum(num); - billladingWaybillEntity.setRealVolume(BigDecimal.ZERO); - billladingWaybillEntity.setRealWeight(BigDecimal.ZERO); - billladingWaybillEntities.add(billladingWaybillEntity); - updateFeeBilllading.add(billladingEntity); - } - } - trunklineBillladingWaybillService.saveBatch(billladingWaybillEntities); - - //更新提货单对应的运单的提货费用 - for (TrunklineBillladingEntity billladingEntity : updateFeeBilllading) { - trunklineBillladingWaybillService.updateBillladingFeeByBillladingId(billladingEntity); - } + openOrderAsyncService.dealwithBillladingInfo(advanceIds,warehouseId,warehouseName,waybillId,waybillNo); //判断是否是开单及入库的配置 - Boolean aBoolean = basicdataOpenIncomingClient.checkOpenIncoming(warehouseId, basicdataBrandEntity.getId()); - if (aBoolean) { - openOrderAsyncService.incomingPackageBatch(advanceIds, AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getTenantId(), AuthUtil.getNickName(), IncomingTypeEnum.OPEN_TO_IN.getCode()); + Boolean aBoolean = basicdataOpenIncomingClient.checkOpenIncoming(warehouseId, brandId); + if (Boolean.TRUE.equals(aBoolean)) { + openOrderAsyncService.incomingPackageBatch(advanceIds, AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getTenantId(), AuthUtil.getNickName(), IncomingTypeEnum.OPEN_TO_IN.getCode(), warehouseId, warehouseName, waybillEntity); + waybillEntity.setStockCount(waybillEntity.getTotalCount()); + waybillEntity.setWaybillStatus("20"); + warehouseWaybillClient.updateEntity(waybillEntity); } //异步存入日志 String nickName = AuthUtil.getNickName(); Long userId = AuthUtil.getUserId(); - String createOperationRemark = "创建运单" + waybillNo + ",时间:" + CommonUtil.dateToString(waybillEntity.getCreateTime()); + String createOperationRemark = "创建运单" + waybillNo + ",时间:" + CommonUtil.dateToStringGeneral(new Date()); openOrderAsyncService.saveLog(waybillId, waybillNo, "10", "创建运单", createOperationRemark, nickName, userId, warehouseId, warehouseName); Integer totalCount = waybillEntity.getTotalCount(); Integer stockCount = waybillEntity.getStockCount(); - if (totalCount.equals(stockCount)) { - createOperationRemark = "运单入库:" + stockCount + "/" + totalCount + ",入库类型:【批量入库】,入库时间:" + CommonUtil.dateToString(new Date()); + if (stockCount > 0) { + createOperationRemark = "运单入库:" + stockCount + "/" + totalCount + ",入库类型:【开单前已入库】,入库时间:" + CommonUtil.dateToStringGeneral(new Date()); openOrderAsyncService.saveLog(waybillId, waybillNo, "20", "已入库", createOperationRemark, nickName, userId, warehouseId, warehouseName); } //队列处理包件补数据 - -// sendRabbitMessageLoadScanData(JSONUtil.parseArray(advanceIds)); carsLoadService.sendRabbitMessageOpenOrder(advanceIds, waybillId); - return R.success("开单成功"); + //发布开单广播 + openOrderAsyncService.sendOpenWaybillFanout(waybillEntity, details, advanceIds); + + + Map map = new HashMap<>(); + map.put("waybillId", waybillId); + return R.data(map); } + @RepeatSubmit + @Transactional(rollbackFor = Exception.class) @Override public R openZeroWaybill(OpenOrderDTO openOrderDTO) { log.info("############openZeroWaybill: 开零担单开始 openOrderDTO={}", openOrderDTO); @@ -575,6 +645,16 @@ public class OpenOrderServiceImpl implements IOpenOrderService { WarehouseWaybillEntity waybillEntity = new WarehouseWaybillEntity(); waybillEntity.setWaybillNo(waybillNo); + waybillEntity.setBrandId(openOrderDTO.getBrandId()); + waybillEntity.setBrand(openOrderDTO.getBrand()); + waybillEntity.setDeparture(openOrderDTO.getDeparture()); + waybillEntity.setDepartureCode(openOrderDTO.getDepartureCode()); + waybillEntity.setDealerCode(openOrderDTO.getDealerCode()); + waybillEntity.setDealerName(openOrderDTO.getDealerName()); + waybillEntity.setPickupCompleteOrNot(openOrderDTO.getPickupCompleteOrNot()); + waybillEntity.setTrunklineCompleteOrNot(openOrderDTO.getTrunklineCompleteOrNot()); + waybillEntity.setTrunklineVehicleType(openOrderDTO.getTrunklineVehicleType()); + waybillEntity.setPickupVehicleType(openOrderDTO.getPickupVehicleType()); waybillEntity.setDepartureWarehouseId(openOrderDTO.getDepartureWarehouseId()); waybillEntity.setDepartureWarehouseName(openOrderDTO.getDepartureWarehouseName()); waybillEntity.setDestinationWarehouseId(openOrderDTO.getDestinationWarehouseId()); @@ -650,16 +730,19 @@ public class OpenOrderServiceImpl implements IOpenOrderService { waybillEntity.setRemark(openOrderDTO.getRemark()); waybillEntity.setWaybillType(openOrderDTO.getWaybillType()); waybillEntity.setWaybillStatus("20"); - waybillEntity.setAgent(AuthUtil.getUserName()); + waybillEntity.setAgent(AuthUtil.getNickName()); waybillEntity.setAgentId(AuthUtil.getUserId()); + waybillEntity.setAbolishStatus(0); + waybillEntity.setFreezeStatus(0); Long waybillId = warehouseWaybillClient.addEnntity(waybillEntity); waybillEntity.setId(waybillId); + List details = new ArrayList<>(); if (!Objects.isNull(waybillId)) { log.info("#################openZeroWaybill: 运单保存成功"); //保存运单货物明细 List waybillDetailList = openOrderDTO.getAddList(); - List details = new ArrayList<>(); + for (WaybillDetailDTO waybillDetailDTO : waybillDetailList) { WarehouseWayBillDetail warehouseWayBillDetail = new WarehouseWayBillDetail(); warehouseWayBillDetail.setCreateUser(AuthUtil.getUserId()); @@ -693,6 +776,8 @@ public class OpenOrderServiceImpl implements IOpenOrderService { warehouseWayBillDetail.setPrice(waybillDetailDTO.getPrice()); warehouseWayBillDetail.setSubtotalFreight(waybillDetailDTO.getSubtotalFreight()); warehouseWayBillDetail.setChargeType(waybillDetailDTO.getChargeType()); + warehouseWayBillDetail.setDeliveryPrice(waybillDetailDTO.getDeliveryPrice()); + warehouseWayBillDetail.setSubtotalDeliveryFee(waybillDetailDTO.getSubtotalDeliveryFee()); details.add(warehouseWayBillDetail); } warehouseWaybillDetailClient.addList(details); @@ -714,13 +799,13 @@ public class OpenOrderServiceImpl implements IOpenOrderService { //异步存入日志 String nickName = AuthUtil.getNickName(); Long userId = AuthUtil.getUserId(); - String createOperationRemark = "创建运单" + waybillNo + ",时间:" + CommonUtil.dateToString(new Date()); + String createOperationRemark = "创建运单" + waybillNo + ",时间:" + CommonUtil.dateToStringGeneral(new Date()); openOrderAsyncService.saveLog(waybillId, waybillNo, "10", "创建运单", createOperationRemark, nickName, userId, warehouseId, warehouseName); Integer totalCount = waybillEntity.getTotalCount(); Integer stockCount = waybillEntity.getStockCount(); if (totalCount.equals(stockCount)) { - createOperationRemark = "运单入库:" + stockCount + "/" + totalCount + ",入库类型:【批量入库】,入库时间:" + CommonUtil.dateToString(waybillEntity.getCreateTime()); + createOperationRemark = "运单入库:" + stockCount + "/" + totalCount + ",入库类型:【零担开单及入库】,入库时间:" + CommonUtil.dateToStringGeneral(waybillEntity.getCreateTime()); openOrderAsyncService.saveLog(waybillId, waybillNo, "20", "已入库", createOperationRemark, nickName, userId, warehouseId, warehouseName); } @@ -738,7 +823,12 @@ public class OpenOrderServiceImpl implements IOpenOrderService { trunklineWaybillOrderEntity.setHandleNumber(waybillEntity.getTotalCount()); trunklineWaybillOrderService.save(trunklineWaybillOrderEntity); - return R.success("开单成功"); + //发布开单广播 + openOrderAsyncService.sendOpenWaybillFanout(waybillEntity, details, null); + + Map map = new HashMap<>(); + map.put("waybillId",waybillId); + return R.data(map); } @Override @@ -780,11 +870,23 @@ public class OpenOrderServiceImpl implements IOpenOrderService { @Override public void deletedAdvance(AdvanceDTO advanceDTO) { List advanceIds = advanceDTO.getAdvanceIds(); + Long warehouseId = advanceDTO.getWarehouseId(); + + //查询包件是否已经不在库 + List parcelListEntities = distributionParcelListClient.findPackagesByAdvanceIdsAndNoStock(advanceIds, warehouseId); + if (!parcelListEntities.isEmpty()) { + log.warn("############deletedAdvance: 已有包件出库,不能删除"); + throw new CustomerException(405, "已有包件出库,不能删除"); + } for (Long advanceId : advanceIds) { advanceDetailService.deleteByAdvanceId(advanceId); } advanceService.deletedAdvance(advanceIds); + + //删除所有在库包件,并更新订单信息 + distributionParcelListClient.findAllOrderCodesAndDeleteByAdvanceIds(advanceIds, warehouseId); + } @Override @@ -811,6 +913,25 @@ public class OpenOrderServiceImpl implements IOpenOrderService { openOrderVO.setShipperName(basicdataClientEntity.getLinkman()); openOrderVO.setShipperMobile(basicdataClientEntity.getPhone()); openOrderVO.setShipperAddress(basicdataClientEntity.getDetailedly()); + + List departureArray = new ArrayList<>(); + String badeRegionAreaId = basicdataClientEntity.getBladeRegionAreaId(); + String bladeRegionProvinceId = basicdataClientEntity.getBladeRegionProvinceId(); + String bladeRegionCityId = basicdataClientEntity.getBladeRegionCityId(); + departureArray.add(bladeRegionProvinceId); + departureArray.add(bladeRegionCityId); + String name = regionFeign.getName(bladeRegionCityId); + String areaId = bladeRegionCityId; + if (!StringUtil.isBlank(badeRegionAreaId)) { + departureArray.add(badeRegionAreaId); + name = regionFeign.getName(badeRegionAreaId); + areaId = badeRegionAreaId; + } + + openOrderVO.setDeparture(name); + openOrderVO.setDepartureCode(areaId); + openOrderVO.setDepartureArray(departureArray); + } } @@ -844,6 +965,14 @@ public class OpenOrderServiceImpl implements IOpenOrderService { @Override public R findClientInfo(String clientName, String linkMan, String linkPhone) { + BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + log.warn("###########findClientInfo: 仓库信息不存在 myCurrentWarehouse={}",myCurrentWarehouse); + return R.fail(405,"仓库信息不存在"); + } + + Long warehouseId = myCurrentWarehouse.getId(); + if (clientName == null) { clientName = ""; } @@ -856,6 +985,37 @@ public class OpenOrderServiceImpl implements IOpenOrderService { List ls = basicdataClientClient.findListByClientName(clientName, linkMan, linkPhone); + ls.forEach(basicdataClientJson -> { + Long clientId = basicdataClientJson.getLong("clientId"); + List destinationArray = new ArrayList<>(); + String badeRegionAreaId = basicdataClientJson.getString("areaId"); + String bladeRegionProvinceId = basicdataClientJson.getString("provinceId"); + String bladeRegionCityId = basicdataClientJson.getString("cityId"); + basicdataClientJson.put("provinceId", bladeRegionProvinceId); + basicdataClientJson.put("cityId", bladeRegionCityId); + basicdataClientJson.put("areaId", badeRegionAreaId); + + basicdataClientJson.put("defaultDeliveryWay","2"); + String typeService = "1"; + BasicdataStoreBusinessEntity storeBusinessEntity = basicdataStoreBusinessClient.findByClientIdAndTypeService(clientId, 3); + if(!Objects.isNull(storeBusinessEntity)){ + typeService = storeBusinessEntity.getMold(); + } + if ("1".equals(typeService)){ + basicdataClientJson.put("defaultDeliveryWay","2"); + }else if("2".equals(typeService)){ + basicdataClientJson.put("defaultDeliveryWay","3"); + }else if("3".equals(typeService)){ + basicdataClientJson.put("defaultDeliveryWay","1"); + } + + //查询目的仓数据 + BasicdataStorageServicesEntity basicdataStorageServicesEntity = basicdataStorageServicesClient.findEntityBySendWarehouseIdAndClientId(warehouseId, clientId); + if (!Objects.isNull(basicdataStorageServicesEntity)) { + basicdataClientJson.put("destinationWarehouseId",basicdataStorageServicesEntity.getServeWarehouseId()); + basicdataClientJson.put("destinationWarehouseName",basicdataStorageServicesEntity.getServeWarehouseName()); + } + }); return R.data(ls); } @@ -896,7 +1056,7 @@ public class OpenOrderServiceImpl implements IOpenOrderService { advanceEntity.setOrderCode(openLabelDTO.getOrderCode()); advanceEntity.setSiteName(openLabelDTO.getSiteName()); advanceEntity.setArea(openLabelDTO.getArea()); - advanceEntity.setOrderType("Label"); +// advanceEntity.setOrderType("Label"); advanceEntity.setBrand(openLabelDTO.getBrand()); Integer totalNumber = openLabelDTO.getTotalNumber(); advanceEntity.setTotalNum(totalNumber); @@ -930,7 +1090,7 @@ public class OpenOrderServiceImpl implements IOpenOrderService { advanceDetailModel.setOrderCode(openLabelDTO.getOrderCode()); advanceDetailModel.setBrand(openLabelDTO.getBrand()); advanceDetailModel.setSystemType("线上"); - advanceDetailModel.setOrderPackageCode(basicdataCodeClient.getCodeByType(CodeNumConstant.PACKAGE, warehouseCode, orderCode)); +// advanceDetailModel.setOrderPackageCode(basicdataCodeClient.getCodeByType(CodeNumConstant.PACKAGE, warehouseCode, orderCode)); advanceDetailModel.setFirstPackName(firsts); String sencods = openLabelDTO.getSencods(); @@ -952,19 +1112,29 @@ public class OpenOrderServiceImpl implements IOpenOrderService { advanceDetailModel.setVolume(openLabelDTO.getVolume()); List detailEntities = new ArrayList<>(); - for (int i = 0; i < totalNumber; i++) { + + List batchPackageCodeByType = basicdataCodeClient.getBatchPackageCodeByType(warehouseCode, orderCode, totalNumber); + batchPackageCodeByType.forEach(item -> { TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); BeanUtil.copy(advanceDetailModel, advanceDetailEntity); - advanceDetailEntity.setOrderPackageCode(basicdataCodeClient.getCodeByType(CodeNumConstant.PACKAGE, warehouseCode, orderCode)); + advanceDetailEntity.setOrderPackageCode(item); detailEntities.add(advanceDetailEntity); - } + }); + + +// for (int i = 0; i < totalNumber; i++) { +// TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); +// BeanUtil.copy(advanceDetailModel, advanceDetailEntity); +// advanceDetailEntity.setOrderPackageCode(basicdataCodeClient.getCodeByType(CodeNumConstant.PACKAGE, warehouseCode, orderCode)); +// detailEntities.add(advanceDetailEntity); +// } advanceDetailService.saveBatch(detailEntities); return R.success("保存成功"); } @Transactional(rollbackFor = Exception.class) @Override - public R> openLabelHasPacakage(Long warehouseId, String warehouseName, MultipartFile file) throws IOException { + public R openLabelHasPacakage(Long warehouseId, String warehouseName, MultipartFile file) throws IOException { if (Objects.isNull(file)) { log.warn("##################openLabelHasPacakage: 文件不存在"); return R.fail(405, "文件不存在"); @@ -972,36 +1142,126 @@ public class OpenOrderServiceImpl implements IOpenOrderService { InputStream inputStream = file.getInputStream(); List pacakgeDetailExcelDTOS = EasyExcel.read(inputStream).head(PacakgeDetailExcelDTO.class).sheet(0).headRowNumber(2).doReadSync(); + //排除pacakgeDetailExcelDTOS中的orderPackageCode为空的元素 + pacakgeDetailExcelDTOS = pacakgeDetailExcelDTOS.stream().filter(item -> StringUtil.isNotBlank(item.getOrderPackageCode())).collect(Collectors.toList()); + //把pacakgeDetailExcelDTOS转成以orderPacakgeCode为一个Set集合 + Set pacakgeDetailExcelDTOSet = pacakgeDetailExcelDTOS.stream().map(PacakgeDetailExcelDTO::getOrderPackageCode).collect(Collectors.toSet()); + + //把pacakgeDetailExcelDTOS中的元素的orderPackageCode属性分组 + Map orderPackageCodeCounts = pacakgeDetailExcelDTOS.stream() + .collect(Collectors.groupingBy(PacakgeDetailExcelDTO::getOrderPackageCode, Collectors.counting())); + + Set duplicateOrderPackageCodes = orderPackageCodeCounts.entrySet().stream() + .filter(entry -> entry.getValue() > 1) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + + if(!duplicateOrderPackageCodes.isEmpty()){ + log.warn("#####################openLabelHasPacakage: 包条码重复 {}",duplicateOrderPackageCodes); + return R.fail(405, "包条码重复"+duplicateOrderPackageCodes); + } + + List orderPackageCodeKeys = new ArrayList<>(pacakgeDetailExcelDTOSet); + + List hasOrderPackageCodeList = new ArrayList<>(); + + //把orderPackageCodeKeys每2000个元素为一组 + int packageBatchSize = 1000; + List> orderPackageCodeGroups = new ArrayList<>(); + + for (int i = 0; i < orderPackageCodeKeys.size(); i += packageBatchSize) { + int endIndex = Math.min(i + packageBatchSize, orderPackageCodeKeys.size()); + orderPackageCodeGroups.add(orderPackageCodeKeys.subList(i, endIndex)); + } + + orderPackageCodeGroups.forEach(orderPackageCodeGroup -> { + List hasOrderPackageCodes = advanceDetailService.findListByExistsAndOrderPackageCodes(orderPackageCodeGroup); + hasOrderPackageCodeList.addAll(hasOrderPackageCodes); + }); + + //排除pacakgeDetailExcelDTOS中orderPackageCode在hasOrderPackageCodeList中存在的元素 + pacakgeDetailExcelDTOS = pacakgeDetailExcelDTOS.stream().filter(item -> !hasOrderPackageCodeList.contains(item.getOrderPackageCode())).collect(Collectors.toList()); + + List advanceEntityList = new ArrayList<>(); + + if(pacakgeDetailExcelDTOS.isEmpty()){ + log.warn("##################openLabelHasPacakage: 没有需要处理的数据 pacakgeDetailExcelDTOS={}",pacakgeDetailExcelDTOS); + return R.data(advanceEntityList); + } Map> listMap = pacakgeDetailExcelDTOS.parallelStream().collect(Collectors.groupingBy(a -> a.getOrderCode() + "&" + a.getTrainNumber())); listMap.remove("null&null"); - Set set = listMap.keySet(); + //把pacakgeDetailExcelDTOS中的orderCode存入一个set集合 + Set orderCodes = pacakgeDetailExcelDTOS.parallelStream().map(PacakgeDetailExcelDTO::getOrderCode).collect(Collectors.toSet()); + List advanceDetailEntities = new ArrayList<>(); - List advanceEntityList = new ArrayList<>(); - for (String str : set) { - List detailExcelDTOS = listMap.get(str); - PacakgeDetailExcelDTO pacakgeDetailExcelDTO = detailExcelDTOS.get(0); - String[] split = str.split("&"); - String orderCode = split[0]; - String trainNumber = split[1]; - List orderPackageCodes = new ArrayList<>(); - TrunklineAdvanceEntity advanceEntity = advanceService.findEntityByOrderCodeAndTrainNumber(orderCode, trainNumber); + + Map advanceEntityMap = new HashMap<>(); + + List advanceIds = new ArrayList<>(); + + List detailEntities = new ArrayList<>(); + //把orderCodes转成List + List orderCodeList = new ArrayList<>(orderCodes); + //把orderCodeList分成每2000个元素一组 + List> orderedGroups = new ArrayList<>(); + + + int batchSize = 1000; + for (int i = 0; i < orderCodeList.size(); i += batchSize) { + int endIndex = Math.min(i + batchSize, orderCodeList.size()); + orderedGroups.add(orderCodeList.subList(i, endIndex)); + } + + for (int i = 0; i < orderedGroups.size(); i++) { + List set1 = orderedGroups.get(i); + List entities = advanceService.findListByExistsAndOrderCodeSet(set1); + detailEntities.addAll(entities); + } + + //把detailEntities转化成以orderCode和trainNumber为key的map + detailEntities.forEach(advanceEntity -> { + String orderCode = advanceEntity.getOrderCode(); + String trainNumber = advanceEntity.getTrainNumber(); + String key = orderCode + "&" + (StringUtil.isBlank(trainNumber) ? "null" : trainNumber); + advanceEntityMap.put(key, advanceEntity); + }); + + List updateAdvanceEntityList = new ArrayList<>(); + + listMap.keySet().forEach(str -> { + List excelDTOS = listMap.get(str); + PacakgeDetailExcelDTO pacakgeDetailExcelDTO = excelDTOS.get(0); + String trainNumber = pacakgeDetailExcelDTO.getTrainNumber(); + String orderCode = pacakgeDetailExcelDTO.getOrderCode(); + TrunklineAdvanceEntity advanceEntity = advanceEntityMap.get(str); if (Objects.isNull(advanceEntity)) { advanceEntity = new TrunklineAdvanceEntity(); advanceEntity.setWarehouseId(warehouseId); advanceEntity.setWarehouseName(warehouseName); advanceEntity.setOrderCode(orderCode); advanceEntity.setArea(pacakgeDetailExcelDTO.getArea()); - advanceEntity.setOrderType("Label"); - advanceEntity.setBrand(pacakgeDetailExcelDTO.getBrand()); - advanceEntity.setTotalNum(detailExcelDTOS.size()); + String brand = pacakgeDetailExcelDTO.getBrand(); + advanceEntity.setBrand(brand); + advanceEntity.setTotalNum(excelDTOS.size()); String firsts = pacakgeDetailExcelDTO.getFirsts(); advanceEntity.setPackName(firsts); advanceEntity.setDealerCode(pacakgeDetailExcelDTO.getDealerCode()); - advanceEntity.setDealerName(pacakgeDetailExcelDTO.getDealerName()); + + String dealerName = pacakgeDetailExcelDTO.getDealerName(); + if(StringUtil.isBlank(dealerName)){ + if(StringUtil.equals(brand,"欧派")){ + //获取orderCode数字第一次出现的前面字符串截取 + int firstDigitIndex = findFirstDigitIndex(orderCode); + if(firstDigitIndex != -1){ + dealerName = orderCode.substring(0,firstDigitIndex); + } + } + } + advanceEntity.setDealerName(dealerName); advanceEntity.setConsigneePerson(pacakgeDetailExcelDTO.getConsigneePerson()); advanceEntity.setConsigneeMobile(pacakgeDetailExcelDTO.getConsigneeMobile()); advanceEntity.setConsigneeAddress(pacakgeDetailExcelDTO.getConsigneeAddress()); @@ -1025,91 +1285,188 @@ public class OpenOrderServiceImpl implements IOpenOrderService { advanceEntity.setWaybillStatus("0"); advanceEntity.setFreezeStatus("0"); advanceEntity.setLegacyStatus("0"); + advanceEntity.setHasPackage(1); advanceEntity.setCreateUserName(AuthUtil.getNickName()); - advanceService.save(advanceEntity); advanceEntityList.add(advanceEntity); } else { - Long advanceId = advanceEntity.getId(); - orderPackageCodes = advanceDetailService.findOrderPackageCodesByAdvanceId(advanceId); + advanceEntity.setTotalNum(advanceEntity.getTotalNum() + excelDTOS.size()); + updateAdvanceEntityList.add(advanceEntity); + advanceIds.add(advanceEntity.getId()); + advanceEntityMap.put(advanceEntity.getOrderCode()+"&"+(StringUtil.isBlank(trainNumber)?"null":trainNumber),advanceEntity); + } + }); + + if (!advanceEntityList.isEmpty()) { + //把advanceEntityList每1000个元素分组 + List> advanceEntitiesList = advanceEntityList.stream().collect(Collectors.groupingBy(item -> advanceEntityList.indexOf(item) / 1000)).entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + List comlist = new ArrayList<>(); + for (int i = 0; i < advanceEntitiesList.size(); i++) { + List list = advanceEntitiesList.get(i); + CompletableFuture fromCpFirstReq = asyncService.saveAdvanceEntity(list, i + 1); + comlist.add(fromCpFirstReq); } + CompletableFuture.allOf(comlist.toArray(new CompletableFuture[0])).join(); - for (PacakgeDetailExcelDTO detailExcelDTO : detailExcelDTOS) { - String orderPackageCode = detailExcelDTO.getOrderPackageCode(); - if (orderPackageCodes.contains(orderPackageCode)) { - continue; - } - TrunklineAdvanceDetailEntity advanceDetailModel = new TrunklineAdvanceDetailEntity(); - advanceDetailModel = new TrunklineAdvanceDetailEntity(); - advanceDetailModel.setWarehouseId(warehouseId); - advanceDetailModel.setWarehouseName(warehouseName); - advanceDetailModel.setAdvanceId(advanceEntity.getId()); - advanceDetailModel.setOrderCode(orderCode); - advanceDetailModel.setOrderPackageCode(orderPackageCode); - advanceDetailModel.setBrand(detailExcelDTO.getBrand()); - advanceDetailModel.setSystemType("线上"); - String firsts = detailExcelDTO.getFirsts(); - advanceDetailModel.setFirstPackName(firsts); - String sencods = detailExcelDTO.getSencods(); - if (StringUtil.isBlank(sencods)) { - advanceDetailModel.setSecondPackName(firsts); - } else { - advanceDetailModel.setSecondPackName(sencods); - } - String thirds = detailExcelDTO.getThirds(); - if (StringUtil.isBlank(thirds)) { - advanceDetailModel.setThirdPackName(firsts); - } else { - advanceDetailModel.setThirdPackName(thirds); - } - advanceDetailModel.setQuantity(1); - advanceDetailModel.setServiceNum(detailExcelDTO.getServiceNum()); - advanceDetailModel.setPackageStatus("0"); - if (!Objects.isNull(detailExcelDTO.getVolume())) { - advanceDetailModel.setVolume(new BigDecimal(detailExcelDTO.getVolume())); - } + } + + if (!updateAdvanceEntityList.isEmpty()) { + //把advanceDetailEntities分成相等数量的10个集合 + List> advanceEntitiesList = updateAdvanceEntityList.stream().collect(Collectors.groupingBy(item -> updateAdvanceEntityList.indexOf(item) / 1000)).entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + List comlist = new ArrayList<>(); + for (int i = 0; i < advanceEntitiesList.size(); i++) { + List list = advanceEntitiesList.get(i); + CompletableFuture fromCpFirstReq = asyncService.updateAdvanceEntity(list, i + 1); + comlist.add(fromCpFirstReq); + } + CompletableFuture.allOf(comlist.toArray(new CompletableFuture[0])).join(); + + } - String materialName = detailExcelDTO.getMaterialName(); - String materialCode = detailExcelDTO.getMaterialCode(); - - if (StringUtil.isNotBlank(materialCode) && StringUtil.isNotBlank(materialName)) { - BasicMaterialEntity basicMaterialEntity = basicMaterialClient.findEntityByCodeAndName(materialCode, materialName); - if (Objects.isNull(basicMaterialEntity)) { - basicMaterialEntity = new BasicMaterialEntity(); - basicMaterialEntity.setProductCode(materialCode); - basicMaterialEntity.setName(materialName); - basicMaterialEntity.setBrandId("1713382405517201409"); - basicMaterialEntity.setProperty("家配"); - basicMaterialEntity.setSpecification("件"); - basicMaterialEntity.setPackingSpecification("1件/箱"); - basicMaterialEntity.setLogpmUnit("箱"); - basicMaterialEntity.setSku(materialCode); - basicMaterialEntity.setPackageNum("1"); - basicMaterialEntity.setHide(1); - Long aLong = basicMaterialClient.addMaterial(basicMaterialEntity); - basicMaterialEntity.setId(aLong); + + advanceEntityList.forEach(advanceEntity -> { + advanceIds.add(advanceEntity.getId()); + String trainNumber = advanceEntity.getTrainNumber(); + advanceEntityMap.put(advanceEntity.getOrderCode() + "&" + (StringUtil.isBlank(trainNumber) ? "null" : trainNumber), advanceEntity); + }); + + //通过advanceIds查询所有advanceDetail + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("advance_id", advanceIds) + .eq("is_deleted", 0); + List advanceDetailEntityList = advanceDetailService.list(queryWrapper); + //把advanceDetailEntityList通过advanceId分组并且把集合转化为orderPackageCode的集合 + Map> map = advanceDetailEntityList.parallelStream().collect(Collectors.groupingBy(TrunklineAdvanceDetailEntity::getAdvanceId, Collectors.mapping(TrunklineAdvanceDetailEntity::getOrderPackageCode, Collectors.toList()))); + Map materialMap = new HashMap<>(); + + + listMap.keySet().forEach(str -> { + List pacakgeDetailExcelList = listMap.get(str); + TrunklineAdvanceEntity advanceEntity = advanceEntityMap.get(str); + if (!Objects.isNull(advanceEntity)) { + Long advanceId = advanceEntity.getId(); + String orderCode = advanceEntity.getOrderCode(); + List orderPackageCodes = map.get(advanceId); + pacakgeDetailExcelList.forEach(pacakgeDetailExcelDTO -> { + String orderPackageCode = pacakgeDetailExcelDTO.getOrderPackageCode(); + if (Objects.isNull(orderPackageCodes) || !orderPackageCodes.contains(orderPackageCode)) { + TrunklineAdvanceDetailEntity advanceDetailModel = new TrunklineAdvanceDetailEntity(); + advanceDetailModel.setWarehouseId(warehouseId); + advanceDetailModel.setWarehouseName(warehouseName); + advanceDetailModel.setAdvanceId(advanceId); + advanceDetailModel.setOrderCode(orderCode); + advanceDetailModel.setOrderPackageCode(orderPackageCode); + advanceDetailModel.setBrand(pacakgeDetailExcelDTO.getBrand()); + advanceDetailModel.setSystemType("线上"); + advanceDetailModel.setTrainNumber(advanceEntity.getTrainNumber()); + String firsts = pacakgeDetailExcelDTO.getFirsts(); + advanceDetailModel.setFirstPackName(firsts); + String sencods = pacakgeDetailExcelDTO.getSencods(); + if (StringUtil.isBlank(sencods)) { + advanceDetailModel.setSecondPackName(firsts); + } else { + advanceDetailModel.setSecondPackName(sencods); + } + String thirds = pacakgeDetailExcelDTO.getThirds(); + if (StringUtil.isBlank(thirds)) { + advanceDetailModel.setThirdPackName(firsts); + } else { + advanceDetailModel.setThirdPackName(thirds); + } + advanceDetailModel.setQuantity(1); + advanceDetailModel.setServiceNum(pacakgeDetailExcelDTO.getServiceNum()); + advanceDetailModel.setPackageStatus("0"); + if (!Objects.isNull(pacakgeDetailExcelDTO.getVolume())) { + advanceDetailModel.setVolume(new BigDecimal(pacakgeDetailExcelDTO.getVolume())); + } else { + advanceDetailModel.setVolume(BigDecimal.ZERO); + } + + String materialName = pacakgeDetailExcelDTO.getMaterialName(); + String materialCode = pacakgeDetailExcelDTO.getMaterialCode(); + + if (StringUtil.isNotBlank(materialCode) && StringUtil.isNotBlank(materialName)) { + Long materialId = materialMap.get(materialCode); + if (!Objects.isNull(materialId)) { + advanceDetailModel.setMaterialId(materialId); + advanceDetailModel.setMaterialCode(materialCode); + advanceDetailModel.setMaterialName(materialName); + } else { + BasicMaterialEntity basicMaterialEntity = basicMaterialClient.findEntityByCodeAndName(materialCode, materialName); + if (Objects.isNull(basicMaterialEntity)) { + basicMaterialEntity = new BasicMaterialEntity(); + basicMaterialEntity.setProductCode(materialCode); + basicMaterialEntity.setName(materialName); + BasicdataBrandEntity basicdataBrandEntity = basicdataBrandClient.findEntityByName(pacakgeDetailExcelDTO.getBrand()); + if (Objects.isNull(basicdataBrandEntity)) { + basicMaterialEntity.setBrandId("1713382405517201409"); + } else { + basicMaterialEntity.setBrandId(basicdataBrandEntity.getId() + ""); + } + basicMaterialEntity.setProperty("家配"); + basicMaterialEntity.setSpecification("件"); + basicMaterialEntity.setPackingSpecification("1件/箱"); + basicMaterialEntity.setLogpmUnit("箱"); + basicMaterialEntity.setSku(materialCode); + basicMaterialEntity.setPackageNum("1"); + basicMaterialEntity.setHide(1); + Long aLong = basicMaterialClient.addMaterial(basicMaterialEntity); + basicMaterialEntity.setId(aLong); + materialMap.put(materialCode, aLong); + advanceDetailModel.setMaterialId(aLong); + advanceDetailModel.setMaterialCode(materialCode); + advanceDetailModel.setMaterialName(materialName); + } else { + materialMap.put(materialCode, basicMaterialEntity.getId()); + advanceDetailModel.setMaterialId(basicMaterialEntity.getId()); + advanceDetailModel.setMaterialCode(basicMaterialEntity.getProductCode()); + advanceDetailModel.setMaterialName(basicMaterialEntity.getName()); + } + } + } + advanceDetailEntities.add(advanceDetailModel); } - advanceDetailModel.setMaterialId(basicMaterialEntity.getId()); - advanceDetailModel.setMaterialCode(basicMaterialEntity.getProductCode()); - advanceDetailModel.setMaterialName(basicMaterialEntity.getName()); - } - advanceDetailEntities.add(advanceDetailModel); + + }); + } + }); + + if (!advanceDetailEntities.isEmpty()) { + //把advanceDetailEntities分成相等数量的10个集合 + List> advanceDetailEntitiesList = advanceDetailEntities.stream().collect(Collectors.groupingBy(item -> advanceDetailEntities.indexOf(item) / 1000)).entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + List comlist = new ArrayList<>(); + for (int i = 0; i < advanceDetailEntitiesList.size(); i++) { + List list = advanceDetailEntitiesList.get(i); + CompletableFuture fromCpFirstReq = asyncService.getResponseFromCp(list, i+1); + comlist.add(fromCpFirstReq); } + CompletableFuture.allOf(comlist.toArray(new CompletableFuture[0])).join(); -// int all = orderPackageCodes.size() + advanceDetailEntities.size(); -// if(all != advanceEntity.getTotalNum()){ -// advanceService.updateTotalNumById(advanceEntity.getId(),all); -// } } - advanceDetailService.saveBatch(advanceDetailEntities); - return R.data(advanceEntityList); + if(!CollUtil.isEmpty(advanceEntityList)){ + carsLoadAsyncService.sendRabbitMessageLoadScanData(advanceEntityList); + } + + int successNum = advanceDetailEntities.size(); + + return R.success("成功处理包件"+successNum+"件"); + } + + public int findFirstDigitIndex(String str) { + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (Character.isDigit(c)) { + return i; + } + } + return -1; // 如果没有找到数字,返回-1 } @Transactional(rollbackFor = Exception.class) @Override - public R> importCustomizedOuPai(Long warehouseId, String warehouseName, MultipartFile file) throws IOException { + public R importCustomizedOuPai(Long warehouseId, String warehouseName, MultipartFile file) throws IOException { if (Objects.isNull(file)) { - log.warn("##################openLabelHasPacakage: 文件不存在"); + log.warn("##################importCustomizedOuPai: 文件不存在"); return R.fail(405, "文件不存在"); } InputStream inputStream = file.getInputStream(); @@ -1118,115 +1475,278 @@ public class OpenOrderServiceImpl implements IOpenOrderService { List importCustomizedOuPaiDTOS = EasyExcel.read(inputStream).head(ImportCustomizedOuPaiDTO.class).sheet(0).headRowNumber(1).doReadSync(); + //排除pacakgeDetailExcelDTOS中的orderPackageCode为空的元素 + importCustomizedOuPaiDTOS = importCustomizedOuPaiDTOS.stream().filter(item -> StringUtil.isNotBlank(item.getOrderPackageCode())).collect(Collectors.toList()); + //把pacakgeDetailExcelDTOS转成以orderPacakgeCode为一个Set集合 + Set importCustomizedOuPaiDTOSet = importCustomizedOuPaiDTOS.stream().map(ImportCustomizedOuPaiDTO::getOrderPackageCode).collect(Collectors.toSet()); + + //把pacakgeDetailExcelDTOS中的元素的orderPackageCode属性分组 + Map orderPackageCodeCounts = importCustomizedOuPaiDTOS.stream() + .collect(Collectors.groupingBy(ImportCustomizedOuPaiDTO::getOrderPackageCode, Collectors.counting())); + + Set duplicateOrderPackageCodes = orderPackageCodeCounts.entrySet().stream() + .filter(entry -> entry.getValue() > 1) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + + if (!duplicateOrderPackageCodes.isEmpty()) { + log.warn("#################importCustomizedOuPai: 包条码重复 {}", duplicateOrderPackageCodes); + return R.fail(405, "包条码重复" + duplicateOrderPackageCodes); + } + + List orderPackageCodeKeys = new ArrayList<>(importCustomizedOuPaiDTOSet); + + List hasOrderPackageCodeList = new ArrayList<>(); + + //把orderPackageCodeKeys每2000个元素为一组 + int packageBatchSize = 1000; + List> orderPackageCodeGroups = new ArrayList<>(); + + for (int i = 0; i < orderPackageCodeKeys.size(); i += packageBatchSize) { + int endIndex = Math.min(i + packageBatchSize, orderPackageCodeKeys.size()); + orderPackageCodeGroups.add(orderPackageCodeKeys.subList(i, endIndex)); + } + + orderPackageCodeGroups.forEach(orderPackageCodeGroup -> { + List hasOrderPackageCodes = advanceDetailService.findListByExistsAndOrderPackageCodes(orderPackageCodeGroup); + hasOrderPackageCodeList.addAll(hasOrderPackageCodes); + }); + + //排除pacakgeDetailExcelDTOS中orderPackageCode在hasOrderPackageCodeList中存在的元素 + importCustomizedOuPaiDTOS = importCustomizedOuPaiDTOS.stream().filter(item -> !hasOrderPackageCodeList.contains(item.getOrderPackageCode())).collect(Collectors.toList()); + + List advanceEntityList = new ArrayList<>(); + List updateAdvanceEntityList = new ArrayList<>(); + + if (importCustomizedOuPaiDTOS.isEmpty()) { + log.warn("##################importCustomizedOuPai: 没有需要处理的数据 importCustomizedOuPaiDTOS={}", importCustomizedOuPaiDTOS); + return R.data(advanceEntityList); + } + Map> listMap = importCustomizedOuPaiDTOS.parallelStream().collect(Collectors.groupingBy(a -> a.getOrderCode() + "&" + a.getTrainNumber())); listMap.remove("null&null"); - Set set = listMap.keySet(); + //把pacakgeDetailExcelDTOS中的orderCode存入一个set集合 + Set orderCodes = importCustomizedOuPaiDTOS.parallelStream() + .map(ImportCustomizedOuPaiDTO::getOrderCode) + .collect(Collectors.toSet()); + //把orderCodes转成List + List orderCodeList = new ArrayList<>(orderCodes); + //把orderCodeList分成每2000个元素一组 + List> orderedGroups = new ArrayList<>(); + + int batchSize = 1000; + for (int i = 0; i < orderCodeList.size(); i += batchSize) { + int endIndex = Math.min(i + batchSize, orderCodeList.size()); + orderedGroups.add(orderCodeList.subList(i, endIndex)); + } - List advanceEntityList = new ArrayList<>(); List advanceDetailEntities = new ArrayList<>(); - for (String str : set) { - List paiDTOList = listMap.get(str); - ImportCustomizedOuPaiDTO importCustomizedOuPaiDTO = paiDTOList.get(0); - String[] split = str.split("&"); - String orderCode = split[0]; - String trainNumber = split[1]; - List orderPackageCodes = new ArrayList<>(); - TrunklineAdvanceEntity trunklineAdvanceEntity = advanceService.findEntityByOrderCodeAndTrainNumber(orderCode, trainNumber); - if (Objects.isNull(trunklineAdvanceEntity)) { - trunklineAdvanceEntity = new TrunklineAdvanceVO(); - trunklineAdvanceEntity.setWarehouseId(warehouseId); - trunklineAdvanceEntity.setWarehouseName(warehouseName); - trunklineAdvanceEntity.setOrderCode(orderCode); - trunklineAdvanceEntity.setSiteName(importCustomizedOuPaiDTO.getSiteName()); - trunklineAdvanceEntity.setOrderType(importCustomizedOuPaiDTO.getOrderType()); - trunklineAdvanceEntity.setBrand("欧派"); - trunklineAdvanceEntity.setTotalNum(paiDTOList.size()); - trunklineAdvanceEntity.setPackName(importCustomizedOuPaiDTO.getFirstsName()); - trunklineAdvanceEntity.setDealerCode(importCustomizedOuPaiDTO.getDealerCode()); - trunklineAdvanceEntity.setDealerName(importCustomizedOuPaiDTO.getDealerName()); - trunklineAdvanceEntity.setCarrierName(importCustomizedOuPaiDTO.getCarrierName()); - trunklineAdvanceEntity.setCustomerName(importCustomizedOuPaiDTO.getCustomerName()); - trunklineAdvanceEntity.setCustomerPhone(importCustomizedOuPaiDTO.getCustomerPhone()); - trunklineAdvanceEntity.setCustomerAddress(importCustomizedOuPaiDTO.getCustomerAddress()); - trunklineAdvanceEntity.setSystemType("线上"); - trunklineAdvanceEntity.setServiceNum(importCustomizedOuPaiDTO.getServiceNum()); - trunklineAdvanceEntity.setMatingType("1"); - trunklineAdvanceEntity.setWaybillStatus("0"); - trunklineAdvanceEntity.setTrainNumber(importCustomizedOuPaiDTO.getTrainNumber()); - trunklineAdvanceEntity.setFreezeStatus("0"); - trunklineAdvanceEntity.setLegacyStatus("0"); + + Map advanceEntityMap = new HashMap<>(); + + List advanceIds = new ArrayList<>(); + + List detailEntities = new ArrayList<>(); + + + for (int i = 0; i < orderedGroups.size(); i++) { + List set1 = orderedGroups.get(i); + List entities = advanceService.findListByExistsAndOrderCodeSet(set1); + detailEntities.addAll(entities); + } + + //把detailEntities转化成以orderCode和trainNumber为key的map + detailEntities.forEach(advanceEntity -> { + String orderCode = advanceEntity.getOrderCode(); + String trainNumber = advanceEntity.getTrainNumber(); + String key = orderCode + "&" + (StringUtil.isBlank(trainNumber) ? "null" : trainNumber); + advanceEntityMap.put(key, advanceEntity); + }); + + listMap.keySet().forEach(str -> { + List excelDTOS = listMap.get(str); + ImportCustomizedOuPaiDTO importCustomizedOuPaiDTO = excelDTOS.get(0); + TrunklineAdvanceEntity advanceEntity = advanceEntityMap.get(str); + if (Objects.isNull(advanceEntity)) { + String orderCode = importCustomizedOuPaiDTO.getOrderCode(); + advanceEntity = new TrunklineAdvanceVO(); + advanceEntity.setWarehouseId(warehouseId); + advanceEntity.setWarehouseName(warehouseName); + advanceEntity.setOrderCode(orderCode); + advanceEntity.setCarrierName(importCustomizedOuPaiDTO.getCarrierName()); + advanceEntity.setTrainNumber(importCustomizedOuPaiDTO.getTrainNumber()); + advanceEntity.setSiteName(importCustomizedOuPaiDTO.getSiteName()); + advanceEntity.setOrderType(importCustomizedOuPaiDTO.getOrderType()); + advanceEntity.setBrand("欧派"); + advanceEntity.setTotalNum(excelDTOS.size()); + advanceEntity.setPackName(importCustomizedOuPaiDTO.getFirstsName()); + advanceEntity.setDealerCode(importCustomizedOuPaiDTO.getDealerCode()); + String dealerName = importCustomizedOuPaiDTO.getDealerName(); + if(StringUtil.isBlank(dealerName)){ + int firstDigitIndex = findFirstDigitIndex(orderCode); + if(firstDigitIndex != -1){ + dealerName = orderCode.substring(0,firstDigitIndex); + } + } + advanceEntity.setDealerName(dealerName); + advanceEntity.setCarrierName(importCustomizedOuPaiDTO.getCarrierName()); + advanceEntity.setCustomerName(importCustomizedOuPaiDTO.getCustomerName()); + advanceEntity.setCustomerPhone(importCustomizedOuPaiDTO.getCustomerPhone()); + advanceEntity.setCustomerAddress(importCustomizedOuPaiDTO.getCustomerAddress()); + advanceEntity.setSystemType("线上"); + advanceEntity.setServiceNum(importCustomizedOuPaiDTO.getServiceNum()); + advanceEntity.setMatingType("1"); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setTrainNumber(importCustomizedOuPaiDTO.getTrainNumber()); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setLegacyStatus("0"); + advanceEntity.setIsGcp(0); + String isOupai = importCustomizedOuPaiDTO.getIsOupai(); + if("是".equals(isOupai)){ + advanceEntity.setIsGcp(1); + } if (orderCode.contains("遗")) { - trunklineAdvanceEntity.setLegacyStatus("1"); + advanceEntity.setLegacyStatus("1"); } - trunklineAdvanceEntity.setDeliveryDate(CommonUtil.StringToDate(importCustomizedOuPaiDTO.getDueDateStr())); - trunklineAdvanceEntity.setCreateUserName(AuthUtil.getNickName()); - advanceService.save(trunklineAdvanceEntity); - advanceEntityList.add(trunklineAdvanceEntity); + advanceEntity.setDeliveryDate(CommonUtil.StringToDate(importCustomizedOuPaiDTO.getDueDateStr())); + advanceEntity.setCreateUserName(AuthUtil.getNickName()); + advanceEntity.setHasPackage(1); + advanceEntityList.add(advanceEntity); } else { - Long advanceId = trunklineAdvanceEntity.getId(); - orderPackageCodes = advanceDetailService.findOrderPackageCodesByAdvanceId(advanceId); + advanceEntity.setTotalNum(advanceEntity.getTotalNum() + excelDTOS.size()); + + updateAdvanceEntityList.add(advanceEntity); + advanceIds.add(advanceEntity.getId()); + String trainNumber = advanceEntity.getTrainNumber(); + advanceEntityMap.put(advanceEntity.getOrderCode()+"&"+(StringUtil.isBlank(trainNumber)?"null":trainNumber),advanceEntity); } + }); + + if (!advanceEntityList.isEmpty()) { + //把advanceDetailEntities分成相等数量的10个集合 + List> advanceEntitiesList = advanceEntityList.stream().collect(Collectors.groupingBy(item -> advanceEntityList.indexOf(item) / 1000)).entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + List comlist = new ArrayList<>(); + for (int i = 0; i < advanceEntitiesList.size(); i++) { + List list = advanceEntitiesList.get(i); + CompletableFuture fromCpFirstReq = asyncService.saveAdvanceEntity(list, i+1); + comlist.add(fromCpFirstReq); + } + CompletableFuture.allOf(comlist.toArray(new CompletableFuture[0])).join(); + + } + + if (!updateAdvanceEntityList.isEmpty()) { + //把advanceDetailEntities分成相等数量的10个集合 + List> advanceEntitiesList = updateAdvanceEntityList.stream().collect(Collectors.groupingBy(item -> updateAdvanceEntityList.indexOf(item) / 1000)).entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + List comlist = new ArrayList<>(); + for (int i = 0; i < advanceEntitiesList.size(); i++) { + List list = advanceEntitiesList.get(i); + CompletableFuture fromCpFirstReq = asyncService.updateAdvanceEntity(list, i+1); + comlist.add(fromCpFirstReq); + } + CompletableFuture.allOf(comlist.toArray(new CompletableFuture[0])).join(); + + } + + + advanceEntityList.forEach(advanceEntity -> { + advanceIds.add(advanceEntity.getId()); + String trainNumber = advanceEntity.getTrainNumber(); + advanceEntityMap.put(advanceEntity.getOrderCode()+"&"+(StringUtil.isBlank(trainNumber)?"null":trainNumber),advanceEntity); + }); + + //通过advanceIds查询所有advanceDetail + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("advance_id",advanceIds) + .eq("is_deleted",0); + List advanceDetailEntityList = advanceDetailService.list(queryWrapper); + //把advanceDetailEntityList通过advanceId分组并且把集合转化为orderPackageCode的集合 + Map> map = advanceDetailEntityList.parallelStream().collect(Collectors.groupingBy(TrunklineAdvanceDetailEntity::getAdvanceId, Collectors.mapping(TrunklineAdvanceDetailEntity::getOrderPackageCode, Collectors.toList()))); + Map materialMap = new HashMap<>(); + + + listMap.keySet().forEach(str -> { + List importCustomizedOuPaiDTOList = listMap.get(str); + + TrunklineAdvanceEntity advanceEntity = advanceEntityMap.get(str); + if(!Objects.isNull(advanceEntity)){ + Long advanceId = advanceEntity.getId(); + String orderCode = advanceEntity.getOrderCode(); + List orderPackageCodes = map.get(advanceId); + importCustomizedOuPaiDTOList.forEach(importCustomizedOuPaiDTO -> { + String orderPackageCode = importCustomizedOuPaiDTO.getOrderPackageCode(); + if(Objects.isNull(orderPackageCodes) || !orderPackageCodes.contains(orderPackageCode)){ + TrunklineAdvanceDetailEntity advanceDetailModel = new TrunklineAdvanceDetailEntity(); + advanceDetailModel.setWarehouseId(warehouseId); + advanceDetailModel.setWarehouseName(warehouseName); + advanceDetailModel.setAdvanceId(advanceId); + advanceDetailModel.setOrderCode(orderCode); + advanceDetailModel.setOrderPackageCode(orderPackageCode); + advanceDetailModel.setBrand(advanceEntity.getBrand()); + advanceDetailModel.setSystemType("线上"); + advanceDetailModel.setSiteName(importCustomizedOuPaiDTO.getSiteName()); + advanceDetailModel.setSupple(importCustomizedOuPaiDTO.getSupple()); + advanceDetailModel.setManifest(importCustomizedOuPaiDTO.getManifest()); + advanceDetailModel.setReturnNum(importCustomizedOuPaiDTO.getReturnNum()); + advanceDetailModel.setSendDateStr(importCustomizedOuPaiDTO.getSendDateStr()); + advanceDetailModel.setCarNumber(importCustomizedOuPaiDTO.getCarNumber()); + advanceDetailModel.setGoodsMan(importCustomizedOuPaiDTO.getGoodsMan()); + advanceDetailModel.setTrainNumber(advanceEntity.getTrainNumber()); + String firsts = importCustomizedOuPaiDTO.getFirstsName(); + advanceDetailModel.setFirstPackName(firsts); + String sencods = importCustomizedOuPaiDTO.getSencodsName(); + if (StringUtil.isBlank(sencods)) { + advanceDetailModel.setSecondPackName(firsts); + } else { + advanceDetailModel.setSecondPackName(sencods); + } + String thirds = importCustomizedOuPaiDTO.getThirdsName(); + if (StringUtil.isBlank(thirds)) { + advanceDetailModel.setThirdPackName(firsts); + } else { + advanceDetailModel.setThirdPackName(thirds); + } + advanceDetailModel.setQuantity(1); + advanceDetailModel.setServiceNum(advanceEntity.getServiceNum()); + advanceDetailModel.setPackageStatus("0"); + advanceDetailEntities.add(advanceDetailModel); + } + + }); + } + }); + + if (!advanceDetailEntities.isEmpty()) { + //把advanceDetailEntities分成相等数量的10个集合 + List> advanceDetailEntitiesList = advanceDetailEntities.stream().collect(Collectors.groupingBy(item -> advanceDetailEntities.indexOf(item) / 1000)).entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + List comlist = new ArrayList<>(); + for (int i = 0; i < advanceDetailEntitiesList.size(); i++) { + List list = advanceDetailEntitiesList.get(i); + CompletableFuture fromCpFirstReq = asyncService.getResponseFromCp(list, i + 1); + comlist.add(fromCpFirstReq); + } + CompletableFuture.allOf(comlist.toArray(new CompletableFuture[0])).join(); - for (ImportCustomizedOuPaiDTO customizedOuPaiDTO : paiDTOList) { - String orderPackageCode = customizedOuPaiDTO.getOrderPackageCode(); - if (orderPackageCodes.contains(orderPackageCode)) { - continue; - } - TrunklineAdvanceDetailEntity advanceDetailModel = new TrunklineAdvanceDetailEntity(); - advanceDetailModel.setWarehouseId(warehouseId); - advanceDetailModel.setWarehouseName(warehouseName); - advanceDetailModel.setAdvanceId(trunklineAdvanceEntity.getId()); - advanceDetailModel.setOrderPackageCode(orderPackageCode); - advanceDetailModel.setTrainNumber(customizedOuPaiDTO.getTrainNumber()); - advanceDetailModel.setOrderCode(orderCode); - advanceDetailModel.setBrand("欧派"); - advanceDetailModel.setSystemType("线上"); - String firsts = customizedOuPaiDTO.getFirstsName(); - advanceDetailModel.setFirstPackName(firsts); - String sencods = customizedOuPaiDTO.getSencodsName(); - if (StringUtil.isBlank(sencods)) { - advanceDetailModel.setSecondPackName(firsts); - } else { - advanceDetailModel.setSecondPackName(sencods); - } - String thirds = customizedOuPaiDTO.getThirdsName(); - if (StringUtil.isBlank(thirds)) { - advanceDetailModel.setThirdPackName(firsts); - } else { - advanceDetailModel.setThirdPackName(thirds); - } - advanceDetailModel.setQuantity(1); - advanceDetailModel.setServiceNum(customizedOuPaiDTO.getServiceNum()); - advanceDetailModel.setPackageStatus("0"); - advanceDetailModel.setSupple(customizedOuPaiDTO.getSupple()); - advanceDetailModel.setManifest(customizedOuPaiDTO.getManifest()); - advanceDetailModel.setReturnNum(customizedOuPaiDTO.getReturnNum()); - advanceDetailModel.setSendDateStr(customizedOuPaiDTO.getSendDateStr()); - advanceDetailModel.setCarNumber(customizedOuPaiDTO.getCarNumber()); - advanceDetailModel.setGoodsMan(customizedOuPaiDTO.getGoodsMan()); - advanceDetailEntities.add(advanceDetailModel); - } - -// int all = orderPackageCodes.size() + advanceDetailEntities.size(); -// if(all != trunklineAdvanceEntity.getTotalNum()){ -// advanceService.updateTotalNumById(trunklineAdvanceEntity.getId(),all); -// } } - advanceDetailService.saveBatch(advanceDetailEntities); long end = new Date().getTime(); log.info("################本次耗时 " + (end - start) + "ms"); + int size = advanceDetailEntities.size(); + + if(!CollUtil.isEmpty(advanceEntityList)){ + carsLoadAsyncService.sendRabbitMessageLoadScanData(advanceEntityList); + } - return R.data(advanceEntityList); + return R.success("成功导入"+size+"条"); } @Transactional(rollbackFor = Exception.class) @Override - public R> importStandardOuPai(Long warehouseId, String warehouseName, MultipartFile file) throws IOException { + public R importStandardOuPai(Long warehouseId, String warehouseName, MultipartFile file) throws IOException { if (Objects.isNull(file)) { log.warn("##################importStandardOuPai: 文件不存在"); return R.fail(405, "文件不存在"); @@ -1234,161 +1754,326 @@ public class OpenOrderServiceImpl implements IOpenOrderService { InputStream inputStream = file.getInputStream(); List importStandardOuPaiDTOS = EasyExcel.read(inputStream).head(ImportStandardOuPaiDTO.class).sheet(0).headRowNumber(1).doReadSync(); + + //排除importStandardOuPaiDTOS中的orderPackageCode为空的元素 + importStandardOuPaiDTOS = importStandardOuPaiDTOS.stream().filter(item -> StringUtil.isNotBlank(item.getOrderPackageCode())).collect(Collectors.toList()); + //把importStandardOuPaiDTOS转成以orderPacakgeCode为一个Set集合 + Set importStandardOuPaiDTOSet = importStandardOuPaiDTOS.stream().map(ImportStandardOuPaiDTO::getOrderPackageCode).collect(Collectors.toSet()); + + //把pacakgeDetailExcelDTOS中的元素的orderPackageCode属性分组 + Map orderPackageCodeCounts = importStandardOuPaiDTOS.stream() + .collect(Collectors.groupingBy(ImportStandardOuPaiDTO::getOrderPackageCode, Collectors.counting())); + + Set duplicateOrderPackageCodes = orderPackageCodeCounts.entrySet().stream() + .filter(entry -> entry.getValue() > 1) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + + if(!duplicateOrderPackageCodes.isEmpty()){ + log.warn("#################importStandardOuPai: 包条码重复 {}",duplicateOrderPackageCodes); + return R.fail(405, "包条码重复"+duplicateOrderPackageCodes); + } + + List orderPackageCodeKeys = new ArrayList<>(importStandardOuPaiDTOSet); + + List hasOrderPackageCodeList = new ArrayList<>(); + + //把orderPackageCodeKeys每2000个元素为一组 + int packageBatchSize = 1000; + List> orderPackageCodeGroups = new ArrayList<>(); + + for (int i = 0; i < orderPackageCodeKeys.size(); i += packageBatchSize) { + int endIndex = Math.min(i + packageBatchSize, orderPackageCodeKeys.size()); + orderPackageCodeGroups.add(orderPackageCodeKeys.subList(i, endIndex)); + } + + orderPackageCodeGroups.forEach(orderPackageCodeGroup -> { + List hasOrderPackageCodes = advanceDetailService.findListByExistsAndOrderPackageCodes(orderPackageCodeGroup); + hasOrderPackageCodeList.addAll(hasOrderPackageCodes); + }); + + //排除importStandardOuPaiDTOS中orderPackageCode在hasOrderPackageCodeList中存在的元素 + importStandardOuPaiDTOS = importStandardOuPaiDTOS.stream().filter(item -> !hasOrderPackageCodeList.contains(item.getOrderPackageCode())).collect(Collectors.toList()); + + List advanceEntityList = new ArrayList<>(); + List updateAdvanceEntityList = new ArrayList<>(); + + if(importStandardOuPaiDTOS.isEmpty()){ + log.warn("##################importStandardOuPai: 没有需要处理的数据 importStandardOuPaiDTOS={}",importStandardOuPaiDTOS); + return R.data(advanceEntityList); + } + Map> listMap = importStandardOuPaiDTOS.parallelStream().collect(Collectors.groupingBy(a -> a.getOrderCode() + "&" + a.getTrainNumber())); listMap.remove("null&null"); - Set set = listMap.keySet(); + //把pacakgeDetailExcelDTOS中的orderCode存入一个set集合 + Set orderCodes = importStandardOuPaiDTOS.parallelStream().map(ImportStandardOuPaiDTO::getOrderCode).collect(Collectors.toSet()); - List advanceEntityList = new ArrayList<>(); List advanceDetailEntities = new ArrayList<>(); - for (String str : set) { - List paiDTOList = listMap.get(str); - ImportStandardOuPaiDTO importStandardOuPaiDTO = paiDTOList.get(0); - String[] split = str.split("&"); - String orderCode = split[0]; - String trainNumber = split[1]; - List orderPackageCodes = new ArrayList<>(); - TrunklineAdvanceEntity trunklineAdvanceEntity = advanceService.findEntityByOrderCodeAndTrainNumber(orderCode, trainNumber); - if (Objects.isNull(trunklineAdvanceEntity)) { - trunklineAdvanceEntity = new TrunklineAdvanceVO(); - trunklineAdvanceEntity.setWarehouseId(warehouseId); - trunklineAdvanceEntity.setWarehouseName(warehouseName); - trunklineAdvanceEntity.setOrderCode(orderCode); - trunklineAdvanceEntity.setSiteName(importStandardOuPaiDTO.getSiteName()); - trunklineAdvanceEntity.setBrand("欧派"); - trunklineAdvanceEntity.setTotalNum(paiDTOList.size()); - trunklineAdvanceEntity.setPackName(importStandardOuPaiDTO.getFirstsName()); - trunklineAdvanceEntity.setDealerCode(importStandardOuPaiDTO.getDealerCode()); - trunklineAdvanceEntity.setDealerName(importStandardOuPaiDTO.getDealerName()); - trunklineAdvanceEntity.setCarrierName(importStandardOuPaiDTO.getCarrierName()); - trunklineAdvanceEntity.setCustomerName(importStandardOuPaiDTO.getCustomerName()); - trunklineAdvanceEntity.setCustomerPhone(importStandardOuPaiDTO.getCustomerPhone()); - trunklineAdvanceEntity.setCustomerAddress(importStandardOuPaiDTO.getCustomerAddress()); - trunklineAdvanceEntity.setSystemType("线上"); - trunklineAdvanceEntity.setMatingType("1"); - trunklineAdvanceEntity.setWaybillStatus("0"); - trunklineAdvanceEntity.setTrainNumber(importStandardOuPaiDTO.getTrainNumber()); - trunklineAdvanceEntity.setFreezeStatus("0"); - trunklineAdvanceEntity.setLegacyStatus("0"); - if (orderCode.contains("遗")) { - trunklineAdvanceEntity.setLegacyStatus("1"); - } - trunklineAdvanceEntity.setDeliveryDate(CommonUtil.StringToDate(importStandardOuPaiDTO.getDueDateStr())); - trunklineAdvanceEntity.setCreateUserName(AuthUtil.getNickName()); - advanceService.save(trunklineAdvanceEntity); - advanceEntityList.add(trunklineAdvanceEntity); - } else { - Long advanceId = trunklineAdvanceEntity.getId(); - orderPackageCodes = advanceDetailService.findOrderPackageCodesByAdvanceId(advanceId); - } - - - for (ImportStandardOuPaiDTO standardOuPaiDTO : paiDTOList) { - String orderPackageCode = standardOuPaiDTO.getOrderPackageCode(); - if (orderPackageCodes.contains(orderPackageCode)) { - - TrunklineAdvanceDetailEntity advanceDetailEntity = advanceDetailService.findEntityByOrderPackageCode(orderPackageCode); - String materialCode = standardOuPaiDTO.getMaterialCode(); - String materialName = standardOuPaiDTO.getMaterialName(); - String num = standardOuPaiDTO.getNum(); - - if (StringUtil.isNotBlank(materialCode) && StringUtil.isNotBlank(materialName)) { - BasicMaterialEntity basicMaterialEntity = basicMaterialClient.findEntityByCodeAndName(materialCode, materialName); - if (Objects.isNull(basicMaterialEntity)) { - basicMaterialEntity = new BasicMaterialEntity(); - basicMaterialEntity.setProductCode(materialCode); - basicMaterialEntity.setName(materialName); - basicMaterialEntity.setBrandId("1713382405517201409"); - basicMaterialEntity.setProperty("家配"); - basicMaterialEntity.setSpecification("件"); - basicMaterialEntity.setPackingSpecification(num + "件/箱"); - basicMaterialEntity.setLogpmUnit("箱"); - basicMaterialEntity.setSku(materialCode); - basicMaterialEntity.setPackageNum(num); - basicMaterialEntity.setHide(1); - Long aLong = basicMaterialClient.addMaterial(basicMaterialEntity); - basicMaterialEntity.setId(aLong); - } - advanceDetailEntity.setMaterialId(basicMaterialEntity.getId()); - advanceDetailEntity.setMaterialCode(basicMaterialEntity.getProductCode()); - advanceDetailEntity.setMaterialName(basicMaterialEntity.getName()); + + Map advanceEntityMap = new HashMap<>(); + + List advanceIds = new ArrayList<>(); + + List detailEntities = new ArrayList<>(); + //把orderCodes转成List + List orderCodeList = new ArrayList<>(orderCodes); + //把orderCodeList分成每2000个元素一组 + List> orderedGroups = new ArrayList<>(); + + int batchSize = 1000; + for (int i = 0; i < orderCodeList.size(); i += batchSize) { + int endIndex = Math.min(i + batchSize, orderCodeList.size()); + orderedGroups.add(orderCodeList.subList(i, endIndex)); + } + for (int i = 0; i < orderedGroups.size(); i++) { + List set1 = orderedGroups.get(i); + List entities = advanceService.findListByExistsAndOrderCodeSet(set1); + detailEntities.addAll(entities); + } + + //把detailEntities转化成以orderCode和trainNumber为key的map + detailEntities.forEach(advanceEntity -> { + String orderCode = advanceEntity.getOrderCode(); + String trainNumber = advanceEntity.getTrainNumber(); + String key = orderCode + "&" + (StringUtil.isBlank(trainNumber)?"null":trainNumber); + advanceEntityMap.put(key,advanceEntity); + }); + + listMap.keySet().forEach(str -> { + List excelDTOS = listMap.get(str); + ImportStandardOuPaiDTO importStandardOuPaiDTO = excelDTOS.get(0); + TrunklineAdvanceEntity advanceEntity = advanceEntityMap.get(str); + if (Objects.isNull(advanceEntity)) { + String orderCode = importStandardOuPaiDTO.getOrderCode(); + advanceEntity = new TrunklineAdvanceVO(); + advanceEntity.setWarehouseId(warehouseId); + advanceEntity.setWarehouseName(warehouseName); + advanceEntity.setOrderCode(orderCode); + advanceEntity.setCarrierName(importStandardOuPaiDTO.getCarrierName()); + advanceEntity.setTrainNumber(importStandardOuPaiDTO.getTrainNumber()); + advanceEntity.setSiteName(importStandardOuPaiDTO.getSiteName()); +// advanceEntity.setOrderType(importStandardOuPaiDTO.getOrderType()); + advanceEntity.setBrand("欧派"); + advanceEntity.setTotalNum(excelDTOS.size()); + advanceEntity.setPackName(importStandardOuPaiDTO.getFirstsName()); + advanceEntity.setDealerCode(importStandardOuPaiDTO.getDealerCode()); + String dealerName = importStandardOuPaiDTO.getDealerName(); + if(StringUtil.isBlank(dealerName)){ + int firstDigitIndex = findFirstDigitIndex(orderCode); + if(firstDigitIndex != -1){ + dealerName = orderCode.substring(0,firstDigitIndex); } - advanceDetailService.updateById(advanceDetailEntity); - continue; - } - TrunklineAdvanceDetailEntity advanceDetailModel = new TrunklineAdvanceDetailEntity(); - advanceDetailModel.setWarehouseId(warehouseId); - advanceDetailModel.setWarehouseName(warehouseName); - advanceDetailModel.setAdvanceId(trunklineAdvanceEntity.getId()); - advanceDetailModel.setOrderPackageCode(orderPackageCode); - advanceDetailModel.setTrainNumber(importStandardOuPaiDTO.getTrainNumber()); - advanceDetailModel.setOrderCode(orderCode); - advanceDetailModel.setBrand("欧派"); - advanceDetailModel.setSystemType("线上"); - String firsts = standardOuPaiDTO.getFirstsName(); - advanceDetailModel.setFirstPackName(firsts); - String sencods = standardOuPaiDTO.getSencodsName(); - if (StringUtil.isBlank(sencods)) { - advanceDetailModel.setSecondPackName(firsts); - } else { - advanceDetailModel.setSecondPackName(sencods); } - String thirds = standardOuPaiDTO.getThirdsName(); - if (StringUtil.isBlank(thirds)) { - advanceDetailModel.setThirdPackName(firsts); - } else { - advanceDetailModel.setThirdPackName(thirds); + advanceEntity.setDealerName(dealerName); + advanceEntity.setCustomerName(importStandardOuPaiDTO.getCustomerName()); + advanceEntity.setCustomerPhone(importStandardOuPaiDTO.getCustomerPhone()); + advanceEntity.setCustomerAddress(importStandardOuPaiDTO.getCustomerAddress()); + advanceEntity.setSenderFactory(importStandardOuPaiDTO.getSendFactory()); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setTrainNumber(importStandardOuPaiDTO.getTrainNumber()); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setLegacyStatus("0"); + advanceEntity.setIsGcp(0); + String isOupai = importStandardOuPaiDTO.getIsOupai(); + if("是".equals(isOupai)){ + advanceEntity.setIsGcp(1); } - advanceDetailModel.setQuantity(1); - advanceDetailModel.setPackageStatus("0"); - advanceDetailModel.setReturnNum(standardOuPaiDTO.getReturnNum()); - advanceDetailModel.setSendDateStr(standardOuPaiDTO.getSendDateStr()); - advanceDetailModel.setCarNumber(standardOuPaiDTO.getCarNumber()); - String materialCode = standardOuPaiDTO.getMaterialCode(); - String materialName = standardOuPaiDTO.getMaterialName(); - String num = standardOuPaiDTO.getNum(); - - if (StringUtil.isNotBlank(materialCode) && StringUtil.isNotBlank(materialName)) { - BasicMaterialEntity basicMaterialEntity = basicMaterialClient.findEntityByCodeAndName(materialCode, materialName); - if (Objects.isNull(basicMaterialEntity)) { - basicMaterialEntity = new BasicMaterialEntity(); - basicMaterialEntity.setProductCode(materialCode); - basicMaterialEntity.setName(materialName); - basicMaterialEntity.setBrandId("1713382405517201409"); - basicMaterialEntity.setProperty("家配"); - basicMaterialEntity.setSpecification("件"); - basicMaterialEntity.setPackingSpecification(num + "件/箱"); - basicMaterialEntity.setLogpmUnit("箱"); - basicMaterialEntity.setSku(materialCode); - basicMaterialEntity.setPackageNum(num); - basicMaterialEntity.setHide(1); - Long aLong = basicMaterialClient.addMaterial(basicMaterialEntity); - basicMaterialEntity.setId(aLong); - } - advanceDetailModel.setMaterialId(basicMaterialEntity.getId()); - advanceDetailModel.setMaterialCode(basicMaterialEntity.getProductCode()); - advanceDetailModel.setMaterialName(basicMaterialEntity.getName()); + if (orderCode.contains("遗")) { + advanceEntity.setLegacyStatus("1"); } - advanceDetailEntities.add(advanceDetailModel); + advanceEntity.setDeliveryDate(CommonUtil.StringToDate(importStandardOuPaiDTO.getDueDateStr())); + advanceEntity.setCreateUserName(AuthUtil.getNickName()); + advanceEntity.setHasPackage(1); + advanceEntityList.add(advanceEntity); + } else { + advanceEntity.setTotalNum(advanceEntity.getTotalNum()+excelDTOS.size()); + + updateAdvanceEntityList.add(advanceEntity); + advanceIds.add(advanceEntity.getId()); + String trainNumber = advanceEntity.getTrainNumber(); + advanceEntityMap.put(advanceEntity.getOrderCode()+"&"+(StringUtil.isBlank(trainNumber)?"null":trainNumber),advanceEntity); } + }); + if (!advanceEntityList.isEmpty()) { + //把advanceDetailEntities分成相等数量的10个集合 + List> advanceEntitiesList = advanceEntityList.stream().collect(Collectors.groupingBy(item -> advanceDetailEntities.indexOf(item) / 1000)).entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + List comlist = new ArrayList<>(); + for (int i = 0; i < advanceEntitiesList.size(); i++) { + List list = advanceEntitiesList.get(i); + CompletableFuture fromCpFirstReq = asyncService.saveAdvanceEntity(list, i+1); + comlist.add(fromCpFirstReq); + } + CompletableFuture.allOf(comlist.toArray(new CompletableFuture[0])).join(); + } -// int all = orderPackageCodes.size() + advanceDetailEntities.size(); -// if(all != trunklineAdvanceEntity.getTotalNum()){ -// advanceService.updateTotalNumById(trunklineAdvanceEntity.getId(),all); -// } + if (!updateAdvanceEntityList.isEmpty()) { + //把advanceDetailEntities分成相等数量的10个集合 + List> advanceEntitiesList = updateAdvanceEntityList.stream().collect(Collectors.groupingBy(item -> updateAdvanceEntityList.indexOf(item) / 1000)).entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + List comlist = new ArrayList<>(); + for (int i = 0; i < advanceEntitiesList.size(); i++) { + List list = advanceEntitiesList.get(i); + CompletableFuture fromCpFirstReq = asyncService.updateAdvanceEntity(list, i+1); + comlist.add(fromCpFirstReq); + } + CompletableFuture.allOf(comlist.toArray(new CompletableFuture[0])).join(); + + } + + advanceEntityList.forEach(advanceEntity -> { + advanceIds.add(advanceEntity.getId()); + String trainNumber = advanceEntity.getTrainNumber(); + advanceEntityMap.put(advanceEntity.getOrderCode()+"&"+(StringUtil.isBlank(trainNumber)?"null":trainNumber),advanceEntity); + }); + + //通过advanceIds查询所有advanceDetail + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("advance_id",advanceIds) + .eq("is_deleted",0); + List advanceDetailEntityList = advanceDetailService.list(queryWrapper); + //把advanceDetailEntityList通过advanceId分组并且把集合转化为orderPackageCode的集合 + Map> map = advanceDetailEntityList.parallelStream().collect(Collectors.groupingBy(TrunklineAdvanceDetailEntity::getAdvanceId, Collectors.mapping(TrunklineAdvanceDetailEntity::getOrderPackageCode, Collectors.toList()))); + Map materialMap = new HashMap<>(); + + listMap.keySet().forEach(str -> { + List importStandardOuPaiDTOList = listMap.get(str); + + TrunklineAdvanceEntity advanceEntity = advanceEntityMap.get(str); + if(!Objects.isNull(advanceEntity)){ + Long advanceId = advanceEntity.getId(); + String orderCode = advanceEntity.getOrderCode(); + String brand = advanceEntity.getBrand(); + List orderPackageCodes = map.get(advanceId); + importStandardOuPaiDTOList.forEach(importStandardOuPaiDTO -> { + String orderPackageCode = importStandardOuPaiDTO.getOrderPackageCode(); + if(Objects.isNull(orderPackageCodes) || !orderPackageCodes.contains(orderPackageCode)){ + TrunklineAdvanceDetailEntity advanceDetailModel = new TrunklineAdvanceDetailEntity(); + advanceDetailModel.setWarehouseId(warehouseId); + advanceDetailModel.setWarehouseName(warehouseName); + advanceDetailModel.setAdvanceId(advanceId); + advanceDetailModel.setOrderCode(orderCode); + advanceDetailModel.setOrderPackageCode(orderPackageCode); + advanceDetailModel.setBrand(brand); + advanceDetailModel.setSystemType("线上"); + advanceDetailModel.setSiteName(importStandardOuPaiDTO.getSiteName()); + advanceDetailModel.setReturnNum(importStandardOuPaiDTO.getReturnNum()); + advanceDetailModel.setSendDateStr(importStandardOuPaiDTO.getSendDateStr()); + advanceDetailModel.setCarNumber(importStandardOuPaiDTO.getCarNumber()); + String volume = importStandardOuPaiDTO.getVolume(); + if(StringUtil.isBlank(volume)){ + advanceDetailModel.setVolume(BigDecimal.ZERO); + } else { + advanceDetailModel.setVolume(new BigDecimal(importStandardOuPaiDTO.getVolume())); + } + advanceDetailModel.setTrainNumber(advanceEntity.getTrainNumber()); + String firsts = importStandardOuPaiDTO.getFirstsName(); + advanceDetailModel.setFirstPackName(firsts); + String sencods = importStandardOuPaiDTO.getSencodsName(); + if (StringUtil.isBlank(sencods)) { + advanceDetailModel.setSecondPackName(firsts); + } else { + advanceDetailModel.setSecondPackName(sencods); + } + String thirds = importStandardOuPaiDTO.getThirdsName(); + if (StringUtil.isBlank(thirds)) { + advanceDetailModel.setThirdPackName(firsts); + } else { + advanceDetailModel.setThirdPackName(thirds); + } + advanceDetailModel.setQuantity(1); + advanceDetailModel.setServiceNum(advanceEntity.getServiceNum()); + advanceDetailModel.setPackageStatus("0"); + String materialName = importStandardOuPaiDTO.getMaterialName(); + String materialCode = importStandardOuPaiDTO.getMaterialCode(); + + if (StringUtil.isNotBlank(materialCode) && StringUtil.isNotBlank(materialName)) { + Long materialId = materialMap.get(materialCode); + if(!Objects.isNull(materialId)){ + advanceDetailModel.setMaterialId(materialId); + advanceDetailModel.setMaterialCode(materialCode); + advanceDetailModel.setMaterialName(materialName); + }else{ + BasicMaterialEntity basicMaterialEntity = basicMaterialClient.findEntityByCodeAndName(materialCode, materialName); + if (Objects.isNull(basicMaterialEntity)) { + basicMaterialEntity = new BasicMaterialEntity(); + basicMaterialEntity.setProductCode(materialCode); + basicMaterialEntity.setName(materialName); + BasicdataBrandEntity basicdataBrandEntity = basicdataBrandClient.findEntityByName(brand); + if(Objects.isNull(basicdataBrandEntity)){ + basicMaterialEntity.setBrandId("1713382405517201409"); + }else{ + basicMaterialEntity.setBrandId(basicdataBrandEntity.getId()+""); + } + basicMaterialEntity.setProperty("家配"); + basicMaterialEntity.setSpecification("件"); + basicMaterialEntity.setPackingSpecification("1件/箱"); + basicMaterialEntity.setLogpmUnit("箱"); + basicMaterialEntity.setSku(materialCode); + basicMaterialEntity.setPackageNum("1"); + basicMaterialEntity.setHide(1); + Long aLong = basicMaterialClient.addMaterial(basicMaterialEntity); + basicMaterialEntity.setId(aLong); + materialMap.put(materialCode,aLong); + advanceDetailModel.setMaterialId(aLong); + advanceDetailModel.setMaterialCode(materialCode); + advanceDetailModel.setMaterialName(materialName); + }else{ + materialMap.put(materialCode,basicMaterialEntity.getId()); + advanceDetailModel.setMaterialId(basicMaterialEntity.getId()); + advanceDetailModel.setMaterialCode(basicMaterialEntity.getProductCode()); + advanceDetailModel.setMaterialName(basicMaterialEntity.getName()); + } + } + } + advanceDetailEntities.add(advanceDetailModel); + } + }); + } + }); + + if (!advanceDetailEntities.isEmpty()) { + //把advanceDetailEntities分成相等数量的10个集合 + List> advanceDetailEntitiesList = advanceDetailEntities.stream().collect(Collectors.groupingBy(item -> advanceDetailEntities.indexOf(item) / 1000)).entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + List comlist = new ArrayList<>(); + for (int i = 0; i < advanceDetailEntitiesList.size(); i++) { + List list = advanceDetailEntitiesList.get(i); + CompletableFuture fromCpFirstReq = asyncService.getResponseFromCp(list, i+1); + comlist.add(fromCpFirstReq); + } + CompletableFuture.allOf(comlist.toArray(new CompletableFuture[0])).join(); } - advanceDetailService.saveBatch(advanceDetailEntities); - return R.data(advanceEntityList); + if(!CollUtil.isEmpty(advanceEntityList)){ + carsLoadAsyncService.sendRabbitMessageLoadScanData(advanceEntityList); + } + + int successNum = advanceDetailEntities.size(); + + return R.success("成功导入"+successNum+"条"); } @Override public R findWaybillDetail(OpenOrderDTO openOrderDTO) { Long waybillId = openOrderDTO.getWaybillId(); + Integer isEdit = openOrderDTO.getIsEdit(); WarehouseWaybillEntity waybillEntity = warehouseWaybillClient.findByWaybillId(waybillId); + if(Objects.isNull(waybillEntity)){ + log.warn("#############findWaybillDetail: 运单信息不存在 waybillId={}",waybillId); + return R.fail(405,"运单信息不存在"); + } + + if(isEdit.equals(1)){ + Integer abolishStatus = waybillEntity.getAbolishStatus(); + if(abolishStatus.equals(1)){ + log.warn("#############findWaybillDetail: 运单已作废 waybillId={}",waybillId); + return R.fail(405,"运单已作废"); + } + } WarehouseWaybillVO warehouseWaybillVO = new WarehouseWaybillVO(); BeanUtil.copy(waybillEntity, warehouseWaybillVO); @@ -1399,37 +2084,111 @@ public class OpenOrderServiceImpl implements IOpenOrderService { Map map = new HashMap<>(); - map.put("warehouseWaybill", warehouseWaybillVO); - map.put("payTypeList", DictBizCache.getList(DictBizConstant.OPEN_ORDER_PAY_TYPE)); - map.put("payWayList", DictBizCache.getList(DictBizConstant.OPEN_ORDER_PAY_WAY)); - map.put("deliveryWayList", DictBizCache.getList(DictBizConstant.OPEN_ORDER_DELIVERY_WAY)); - map.put("urgencyList", DictBizCache.getList(DictBizConstant.OPEN_ORDER_URGENCY)); - map.put("receiptList", DictBizCache.getList(DictBizConstant.OPEN_ORDER_RECEIPT)); - map.put("transportTypeList", DictBizCache.getList(DictBizConstant.OPEN_ORDER_TRANSPORT_TYPE)); + map.put("warehouseWaybill",warehouseWaybillVO); + map.put("payTypeList",DictBizCache.getList(DictBizConstant.OPEN_ORDER_PAY_TYPE)); + map.put("payWayList",DictBizCache.getList(DictBizConstant.OPEN_ORDER_PAY_WAY)); + map.put("deliveryWayList",DictBizCache.getList(DictBizConstant.OPEN_ORDER_DELIVERY_WAY)); + map.put("urgencyList",DictBizCache.getList(DictBizConstant.OPEN_ORDER_URGENCY)); + map.put("receiptList",DictBizCache.getList(DictBizConstant.OPEN_ORDER_RECEIPT)); + map.put("transportTypeList",DictBizCache.getList(DictBizConstant.OPEN_ORDER_TRANSPORT_TYPE)); + map.put("editWaybillReasonTypeList",DictBizCache.getList(DictBizConstant.EDIT_WAYBILL_REASON_TYPE)); return R.data(map); } @Override public R updateWaybill(OpenOrderDTO openOrderDTO) { + String oldConsignee = null; Long waybillId = openOrderDTO.getWaybillId(); String waybillNo = openOrderDTO.getWaybillNo(); Long warehouseId = openOrderDTO.getWarehouseId(); String warehouseName = openOrderDTO.getWarehouseName(); String editReson = openOrderDTO.getEditReson(); - String remark = openOrderDTO.getRemark(); + String refer = openOrderDTO.getRefer(); WarehouseWaybillEntity waybillEntity = warehouseWaybillClient.findByWaybillId(waybillId); + if (Objects.isNull(waybillEntity)) { log.warn("#############updateWaybill: 运单信息不存在 waybillId={}", waybillId); return R.fail(405, "运单信息不存在"); } + + Integer abolishStatus = waybillEntity.getAbolishStatus(); + if(abolishStatus.equals(1)){ + log.warn("#############updateWaybill: 运单已作废 waybillId={}", waybillId); + return R.fail(405, "运单已作废"); + } + // 得到改单之前的收货单位 + oldConsignee = waybillEntity.getConsignee(); + String updateMsg = verifyUpdateData(openOrderDTO, waybillEntity); warehouseWaybillClient.updateEntity(waybillEntity); // String operationRemark = "修改运单"+waybillNo+",时间:"+ CommonUtil.dateToString(waybillEntity.getCreateTime())+","+updateMsg; //异步存入日志 - openOrderAsyncService.saveLog(waybillId, waybillNo, "888", "修改运单", editReson + " " + remark, AuthUtil.getNickName(), AuthUtil.getUserId(), warehouseId, warehouseName); + openOrderAsyncService.saveUpdateLog(waybillId, waybillNo, "888", editReson, "备注:"+refer+" 修改内容:"+updateMsg, AuthUtil.getNickName(), AuthUtil.getUserId(), warehouseId, warehouseName,waybillEntity); + + List wayBillDetailList = warehouseWaybillDetailClient.findListByWaybillNo(waybillNo); + + List waybillIds = new ArrayList<>(); + waybillIds.add(waybillId); + List advanceIds = trunklineWaybillOrderService.findAdvanceIdsByWaybillIds(waybillIds); + + + List parcelListEntityList = distributionParcelListClient.findAllParcelListByAdvanceIds(advanceIds); + if(CollUtil.isNotEmpty(parcelListEntityList)){ + Long consigneeId = waybillEntity.getConsigneeId(); + String consignee = waybillEntity.getConsignee(); + String consigneeName = waybillEntity.getConsigneeName(); + String consigneeAddress = waybillEntity.getConsigneeAddress(); + String consigneeMobile = waybillEntity.getConsigneeMobile(); + Long departureWarehouseId = waybillEntity.getDepartureWarehouseId(); + Long destinationWarehouseId = waybillEntity.getDestinationWarehouseId(); + String departureWarehouseName = waybillEntity.getDepartureWarehouseName(); + String destinationWarehouseName = waybillEntity.getDestinationWarehouseName(); + BasicdataClientEntity basicdataClientEntity = basicdataClientClient.findEntityById(consigneeId); + + + //把parcelListEntityList包件集合中所有元素的orderCode放入一个Set集合 + Set orderCodeSet = parcelListEntityList.stream().map(DistributionParcelListEntity::getOrderCode).collect(Collectors.toSet()); + List stockArticleEntities = distributionStockArticleClient.findAllStockArticleListByOrderCodes(new ArrayList<>(orderCodeSet)); + stockArticleEntities.forEach(stockArticleEntity -> { + stockArticleEntity.setMallId(consigneeId); + if(!Objects.isNull(basicdataClientEntity)){ + stockArticleEntity.setMallCode(basicdataClientEntity.getClientCode()); + }else{ + stockArticleEntity.setMallCode(""); + } + stockArticleEntity.setMallName(consignee); + stockArticleEntity.setConsigneeUnit(consignee); + stockArticleEntity.setConsigneePerson(consigneeName); + stockArticleEntity.setConsigneeAddress(consigneeAddress); + stockArticleEntity.setConsigneeMobile(consigneeMobile); + }); + + parcelListEntityList.forEach(parcelListEntity -> { + Long nowWarehouseId = parcelListEntity.getWarehouseId(); + parcelListEntity.setSendWarehouseId(departureWarehouseId); + parcelListEntity.setSendWarehouseName(departureWarehouseName); + parcelListEntity.setAcceptWarehouseId(destinationWarehouseId); + parcelListEntity.setAcceptWarehouseName(destinationWarehouseName); + + if(nowWarehouseId.equals(destinationWarehouseId)){ + parcelListEntity.setIsTransfer(0); + }else{ + parcelListEntity.setIsTransfer(1); + } + + }); + if(CollUtil.isNotEmpty(stockArticleEntities)){ + distributionStockArticleClient.updateByBatchId(stockArticleEntities); + } + if(CollUtil.isNotEmpty(parcelListEntityList)){ + distributionParcelListClient.updateList(parcelListEntityList); + } + } + + openOrderAsyncService.sendUpdateWaybillFanout(waybillEntity,wayBillDetailList,advanceIds,oldConsignee); return R.success("改单成功"); } @@ -1442,9 +2201,17 @@ public class OpenOrderServiceImpl implements IOpenOrderService { log.warn("#############updateWaybill: 运单信息不存在 waybillId={}", waybillId); return R.fail(405, "运单信息不存在"); } - String updateMsg = verifyData(openOrderDTO, waybillEntity); + Integer abolishStatus = waybillEntity.getAbolishStatus(); + if(abolishStatus.equals(1)){ + log.warn("#############updateWaybill: 运单已作废 waybillId={}", waybillId); + return R.fail(405, "运单已作废"); + } - return R.data(updateMsg); + +// String updateMsg = verifyData(openOrderDTO,waybillEntity); + List list = verifyData(openOrderDTO,waybillEntity); + + return R.data(list); } @Override @@ -1452,84 +2219,180 @@ public class OpenOrderServiceImpl implements IOpenOrderService { List ls = basicdataBrandClient.findAllList(); - return R.data(ls); - } + return R.data(ls); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public R batchOpenLabel(Long warehouseId, String warehouseName, String warehouseCode, MultipartFile file) throws IOException { + if (Objects.isNull(file)) { + log.warn("##################batchOpenLabel: 文件不存在"); + return R.fail(405, "文件不存在"); + } + InputStream inputStream = file.getInputStream(); + + List importOrderNoPackageExcelDTOS = EasyExcel.read(inputStream).head(ImportOrderNoPackageExcelDTO.class).sheet(0).headRowNumber(2).doReadSync(); + + Map orderCodeCounts = importOrderNoPackageExcelDTOS.stream() + .collect(Collectors.groupingBy(a->(a.getOrderCode()+"&"+a.getFirsts()), Collectors.counting())); + + Set duplicateOrderCodes = orderCodeCounts.entrySet().stream() + .filter(entry -> entry.getValue() > 1) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + + if(!duplicateOrderCodes.isEmpty()){ + log.warn("#################importCustomizedOuPai: 订单号品类重复 {}",duplicateOrderCodes); + return R.fail(405, "包条码重复"+duplicateOrderCodes); + } + + + //把importOrderNoPackageExcelDTOS中的orderCode存入一个set集合 +// Set orderCodes = importOrderNoPackageExcelDTOS.parallelStream().map(ImportOrderNoPackageExcelDTO::getOrderCode).collect(Collectors.toSet()); + + //把importOrderNoPackageExcelDTOS的每个元素提取成一个key为orderCode和trainNumber的拼接,value为元素本身的map + Map importOrderNoPackageExcelDTOMap = importOrderNoPackageExcelDTOS.parallelStream().collect(Collectors.toMap(a -> a.getOrderCode() + "&" + a.getFirsts(), a -> a)); + + importOrderNoPackageExcelDTOMap.remove("null&null"); + + List detailEntities = new ArrayList<>(); + + //把orderCodes转成List +// List orderCodeList = new ArrayList<>(orderCodes); + //把orderCodeList分成每2000个元素一组 +// int batchSize = 2000; +// List> orderedGroups = new ArrayList<>(); +// +// for (int i = 0; i < orderCodeList.size(); i += batchSize) { +// int endIndex = Math.min(i + batchSize, orderCodeList.size()); +// orderedGroups.add(orderCodeList.subList(i, endIndex)); +// } +// for (int i = 0; i < orderedGroups.size(); i++) { +// List set1 = orderedGroups.get(i); +// List entities = advanceService.findListByExistsAndOrderCodeSet(set1); +// detailEntities.addAll(entities); +// } + + Map advanceEntityMap = new HashMap<>(); - @Override - public R batchOpenLabel(Long warehouseId, String warehouseName, MultipartFile file) throws IOException { - if (Objects.isNull(file)) { - log.warn("##################openLabelHasPacakage: 文件不存在"); - return R.fail(405, "文件不存在"); - } - InputStream inputStream = file.getInputStream(); + //把detailEntities转化成以orderCode和trainNumber为key的map +// detailEntities.forEach(advanceEntity -> { +// String orderCode = advanceEntity.getOrderCode(); +// String packName = advanceEntity.getPackName(); +// String key = orderCode + "&" + (StringUtil.isBlank(packName)?"null":packName); +// advanceEntityMap.put(key,advanceEntity); +// }); - List orderNoPackageExcelDTOS = EasyExcel.read(inputStream).head(OrderNoPackageExcelDTO.class).sheet(0).headRowNumber(2).doReadSync(); + List list = new ArrayList<>(); + importOrderNoPackageExcelDTOMap.keySet().forEach(key -> { + ImportOrderNoPackageExcelDTO importOrderNoPackageExcelDTO = importOrderNoPackageExcelDTOMap.get(key); + if(!Objects.isNull(importOrderNoPackageExcelDTO)){ + String orderCode = importOrderNoPackageExcelDTO.getOrderCode(); + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceVO(); + advanceEntity.setWarehouseId(warehouseId); + advanceEntity.setWarehouseName(warehouseName); + advanceEntity.setServiceNum(importOrderNoPackageExcelDTO.getServiceNum()); + advanceEntity.setOrderCode(orderCode); + advanceEntity.setArea(importOrderNoPackageExcelDTO.getArea()); + advanceEntity.setBrand(importOrderNoPackageExcelDTO.getBrand()); + advanceEntity.setTotalNum(Integer.parseInt(importOrderNoPackageExcelDTO.getCount())); + advanceEntity.setPackName(importOrderNoPackageExcelDTO.getFirsts()); + advanceEntity.setDealerCode(importOrderNoPackageExcelDTO.getDealerCode()); + advanceEntity.setDealerName(importOrderNoPackageExcelDTO.getDealerName()); + advanceEntity.setCustomerName(importOrderNoPackageExcelDTO.getCustomerName()); + advanceEntity.setCustomerPhone(importOrderNoPackageExcelDTO.getCustomerPhone()); + advanceEntity.setCustomerAddress(importOrderNoPackageExcelDTO.getCustomerAddress()); + advanceEntity.setConsigneePerson(importOrderNoPackageExcelDTO.getConsigneePerson()); + advanceEntity.setConsigneeMobile(importOrderNoPackageExcelDTO.getConsigneeMobile()); + advanceEntity.setConsigneeAddress(importOrderNoPackageExcelDTO.getConsigneeAddress()); + advanceEntity.setSenderName(importOrderNoPackageExcelDTO.getShipperPerson()); + advanceEntity.setSenderPhone(importOrderNoPackageExcelDTO.getShipperMobile()); + advanceEntity.setSenderAddress(importOrderNoPackageExcelDTO.getShipperAddress()); + advanceEntity.setTrainNumber(importOrderNoPackageExcelDTO.getTrainNumber()); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setLegacyStatus("0"); + if (orderCode.contains("遗")) { + advanceEntity.setLegacyStatus("1"); + } + advanceEntity.setHasPackage(1); + advanceEntity.setCreateUserName(AuthUtil.getUserName()); + list.add(advanceEntity); + } + }); + advanceService.saveBatch(list); - BasicdataWarehouseEntity basicdataWarehouseEntity = basicdataWarehouseClient.getEntityWarehouseId(warehouseId); + List advanceDetailEntities = new ArrayList<>(); + for (TrunklineAdvanceEntity advanceEntity : list) { + String orderCode = advanceEntity.getOrderCode(); + String packName = advanceEntity.getPackName(); + ImportOrderNoPackageExcelDTO importOrderNoPackageExcelDTO = importOrderNoPackageExcelDTOMap.get(orderCode + "&" + (StringUtil.isBlank(packName) ? "null" : packName)); + if(!Objects.isNull(importOrderNoPackageExcelDTO)){ + String firsts = importOrderNoPackageExcelDTO.getFirsts(); + Integer totalNum = advanceEntity.getTotalNum(); + TrunklineAdvanceDetailEntity advanceDetailModel = new TrunklineAdvanceDetailEntity(); + advanceDetailModel.setWarehouseId(warehouseId); + advanceDetailModel.setWarehouseName(warehouseName); + advanceDetailModel.setAdvanceId(advanceEntity.getId()); + advanceDetailModel.setOrderCode(advanceEntity.getOrderCode()); + advanceDetailModel.setBrand(advanceEntity.getBrand()); + advanceDetailModel.setSystemType("线上"); - for (OrderNoPackageExcelDTO orderNoPackageExcelDTO : orderNoPackageExcelDTOS) { - TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); - advanceEntity.setWarehouseId(warehouseId); - advanceEntity.setWarehouseName(warehouseName); - String orderCode = orderNoPackageExcelDTO.getOrderCode(); - advanceEntity.setOrderCode(orderCode); - advanceEntity.setArea(orderNoPackageExcelDTO.getArea()); - advanceEntity.setOrderType("Label"); - advanceEntity.setBrand(orderNoPackageExcelDTO.getBrand()); - Integer totalNumber = Integer.parseInt(orderNoPackageExcelDTO.getNum()); - advanceEntity.setTotalNum(totalNumber); - String firsts = orderNoPackageExcelDTO.getFirsts(); - advanceEntity.setPackName(firsts); - advanceEntity.setDealerName(orderNoPackageExcelDTO.getDealerName()); - advanceEntity.setConsigneePerson(orderNoPackageExcelDTO.getConsigneePerson()); - advanceEntity.setConsigneeMobile(orderNoPackageExcelDTO.getConsigneeMobile()); - advanceEntity.setConsigneeAddress(orderNoPackageExcelDTO.getConsigneeAddress()); - advanceEntity.setCustomerName(orderNoPackageExcelDTO.getCustomerName()); - advanceEntity.setCustomerPhone(orderNoPackageExcelDTO.getCustomerPhone()); - advanceEntity.setCustomerAddress(orderNoPackageExcelDTO.getCustomerAddress()); - advanceEntity.setSystemType("线上"); - advanceEntity.setServiceNum(orderNoPackageExcelDTO.getServiceNum()); - advanceEntity.setMatingType("1"); - advanceEntity.setWaybillStatus("0"); - advanceEntity.setFreezeStatus("0"); - advanceEntity.setLegacyStatus("0"); - advanceService.save(advanceEntity); - Long advanceId = advanceEntity.getId(); + advanceDetailModel.setFirstPackName(firsts); + String sencods = importOrderNoPackageExcelDTO.getSeconds(); + if (StringUtil.isBlank(sencods)) { + advanceDetailModel.setSecondPackName(firsts); + } else { + advanceDetailModel.setSecondPackName(sencods); + } + String thirds = importOrderNoPackageExcelDTO.getThirds(); + if (StringUtil.isBlank(thirds)) { + advanceDetailModel.setThirdPackName(firsts); + } else { + advanceDetailModel.setThirdPackName(thirds); + } + advanceDetailModel.setQuantity(1); + advanceDetailModel.setServiceNum(advanceEntity.getServiceNum()); + advanceDetailModel.setMaterialCode(importOrderNoPackageExcelDTO.getMaterialCode()); + advanceDetailModel.setMaterialName(importOrderNoPackageExcelDTO.getMaterialName()); + String volume = importOrderNoPackageExcelDTO.getVolume(); + if (StringUtil.isBlank(volume)){ + advanceDetailModel.setVolume(BigDecimal.ZERO); + }else{ + advanceDetailModel.setVolume(new BigDecimal(volume)); + } + String weight = importOrderNoPackageExcelDTO.getWeight(); + if (StringUtil.isBlank(weight)){ + advanceDetailModel.setWeight(BigDecimal.ZERO); + }else{ + advanceDetailModel.setWeight(new BigDecimal(weight)); + } + advanceDetailModel.setPackageStatus("0"); - TrunklineAdvanceDetailEntity advanceDetailModel = new TrunklineAdvanceDetailEntity(); - advanceDetailModel.setWarehouseId(warehouseId); - advanceDetailModel.setWarehouseName(warehouseName); - advanceDetailModel.setAdvanceId(advanceId); - advanceDetailModel.setOrderCode(orderCode); - advanceDetailModel.setBrand(orderNoPackageExcelDTO.getBrand()); - advanceDetailModel.setSystemType("线上"); - - advanceDetailModel.setFirstPackName(firsts); - String sencods = orderNoPackageExcelDTO.getSencods(); - if (StringUtil.isBlank(sencods)) { - advanceDetailModel.setSecondPackName(firsts); - } else { - advanceDetailModel.setSecondPackName(sencods); + List orderPackageCodes = basicdataCodeClient.getBatchPackageCodeByType(warehouseCode, orderCode, totalNum); + orderPackageCodes.forEach(orderPackageCode -> { + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + BeanUtil.copy(advanceDetailModel, advanceDetailEntity); + advanceDetailEntity.setOrderPackageCode(orderPackageCode); + advanceDetailEntities.add(advanceDetailEntity); + }); } - String thirds = orderNoPackageExcelDTO.getThirds(); - if (StringUtil.isBlank(thirds)) { - advanceDetailModel.setThirdPackName(firsts); - } else { - advanceDetailModel.setThirdPackName(thirds); - } - advanceDetailModel.setQuantity(1); - advanceDetailModel.setServiceNum(orderNoPackageExcelDTO.getServiceNum()); - advanceDetailModel.setPackageStatus("0"); + } - List detailEntities = new ArrayList<>(); - for (int i = 0; i < totalNumber; i++) { - TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); - BeanUtil.copy(advanceDetailModel, advanceDetailEntity); - advanceDetailEntity.setOrderPackageCode(basicdataCodeClient.getCodeByType(CodeNumConstant.PACKAGE, basicdataWarehouseEntity.getWarehouseCode(), orderCode)); - detailEntities.add(advanceDetailEntity); + if (!advanceDetailEntities.isEmpty()) { + //把advanceDetailEntities分成相等数量的10个集合 + List> advanceDetailEntitiesList = advanceDetailEntities.stream().collect(Collectors.groupingBy(item -> advanceDetailEntities.indexOf(item) / 1000)).entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + List comlist = new ArrayList<>(); + for (int i = 0; i < advanceDetailEntitiesList.size(); i++) { + List ls = advanceDetailEntitiesList.get(i); + CompletableFuture fromCpFirstReq = asyncService.getResponseFromCp(ls, i+1); + comlist.add(fromCpFirstReq); } - advanceDetailService.saveBatch(detailEntities); + CompletableFuture.allOf(comlist.toArray(new CompletableFuture[0])).join(); } + return R.success("添加成功"); } @@ -1562,52 +2425,148 @@ public class OpenOrderServiceImpl implements IOpenOrderService { return R.data(map); } + @Transactional(rollbackFor = Exception.class) @Override - public R> importOrderNoPackage(Long warehouseId, String warehouseName, MultipartFile file) throws IOException { + public R importOrderNoPackage(Long warehouseId, String warehouseName, String warehouseCode, MultipartFile file) throws IOException { if (Objects.isNull(file)) { log.warn("##################importOrderNoPackage: 文件不存在"); return R.fail(405, "文件不存在"); } InputStream inputStream = file.getInputStream(); - List importOrderNoPackageExcelDTOS = EasyExcel.read(inputStream).head(ImportOrderNoPackageExcelDTO.class).sheet(0).headRowNumber(1).doReadSync(); + List importOrderNoPackageExcelDTOS = EasyExcel.read(inputStream).head(ImportOrderNoPackageExcelDTO.class).sheet(0).headRowNumber(2).doReadSync(); + + //把importOrderNoPackageExcelDTOS中的orderCode存入一个set集合 +// Set orderCodes = importOrderNoPackageExcelDTOS.parallelStream().map(ImportOrderNoPackageExcelDTO::getOrderCode).collect(Collectors.toSet()); +// +// Map orderCodeCounts = importOrderNoPackageExcelDTOS.stream() +// .collect(Collectors.groupingBy(a -> a.getOrderCode() + "&" + a.getTrainNumber(), Collectors.counting())); +// +// Set duplicateOrderCodes = orderCodeCounts.entrySet().stream() +// .filter(entry -> entry.getValue() > 1) +// .map(Map.Entry::getKey) +// .collect(Collectors.toSet()); +// +// if(!duplicateOrderCodes.isEmpty()){ +// log.warn("#####################openLabelHasPacakage: 订单重复 {}",duplicateOrderCodes); +// return R.fail(405, "包条码重复"+duplicateOrderCodes); +// } +// +// //把importOrderNoPackageExcelDTOS的每个元素提取成一个key为orderCode和trainNumber的拼接,value为元素本身的map +// Map importOrderNoPackageExcelDTOMap = importOrderNoPackageExcelDTOS.parallelStream().collect(Collectors.toMap(a -> a.getOrderCode() + "&" + a.getTrainNumber(), a -> a)); +// +// importOrderNoPackageExcelDTOMap.remove("null&null"); +// +// List detailEntities = new ArrayList<>(); +// +// //把orderCodes转成List +// List orderCodeList = new ArrayList<>(orderCodes); +// //把orderCodeList分成每2000个元素一组 +// int batchSize = 1000; +// List> orderedGroups = new ArrayList<>(); +// +// for (int i = 0; i < orderCodeList.size(); i += batchSize) { +// int endIndex = Math.min(i + batchSize, orderCodeList.size()); +// orderedGroups.add(orderCodeList.subList(i, endIndex)); +// } +// for (int i = 0; i < orderedGroups.size(); i++) { +// List set1 = orderedGroups.get(i); +// List entities = advanceService.findListByExistsAndOrderCodeSet(set1); +// detailEntities.addAll(entities); +// } +// +// Map advanceEntityMap = new HashMap<>(); +// +// //把detailEntities转化成以orderCode和trainNumber为key的map +// detailEntities.forEach(advanceEntity -> { +// String orderCode = advanceEntity.getOrderCode(); +// String trainNumber = advanceEntity.getTrainNumber(); +// String key = orderCode + "&" + (StringUtil.isBlank(trainNumber)?"null":trainNumber); +// advanceEntityMap.put(key,advanceEntity); +// }); + List list = new ArrayList<>(); - for (ImportOrderNoPackageExcelDTO importOrderNoPackageExcelDTO : importOrderNoPackageExcelDTOS) { +// importOrderNoPackageExcelDTOMap.keySet().forEach(key -> { +// ImportOrderNoPackageExcelDTO importOrderNoPackageExcelDTO = importOrderNoPackageExcelDTOMap.get(key); +// TrunklineAdvanceEntity advanceEntity = advanceEntityMap.get(key); +// if(Objects.isNull(advanceEntity)){ +// String orderCode = importOrderNoPackageExcelDTO.getOrderCode(); +// advanceEntity = new TrunklineAdvanceVO(); +// advanceEntity.setWarehouseId(warehouseId); +// advanceEntity.setWarehouseName(warehouseName); +// advanceEntity.setServiceNum(importOrderNoPackageExcelDTO.getServiceNum()); +// advanceEntity.setOrderCode(orderCode); +// advanceEntity.setArea(importOrderNoPackageExcelDTO.getArea()); +// advanceEntity.setBrand(importOrderNoPackageExcelDTO.getBrand()); +// advanceEntity.setTotalNum(Integer.parseInt(importOrderNoPackageExcelDTO.getCount())); +// advanceEntity.setPackName(importOrderNoPackageExcelDTO.getFirsts()); +// advanceEntity.setDealerCode(importOrderNoPackageExcelDTO.getDealerCode()); +// advanceEntity.setDealerName(importOrderNoPackageExcelDTO.getDealerName()); +// advanceEntity.setCustomerName(importOrderNoPackageExcelDTO.getCustomerName()); +// advanceEntity.setCustomerPhone(importOrderNoPackageExcelDTO.getCustomerPhone()); +// advanceEntity.setCustomerAddress(importOrderNoPackageExcelDTO.getCustomerAddress()); +// advanceEntity.setConsigneePerson(importOrderNoPackageExcelDTO.getConsigneePerson()); +// advanceEntity.setConsigneeMobile(importOrderNoPackageExcelDTO.getConsigneeMobile()); +// advanceEntity.setConsigneeAddress(importOrderNoPackageExcelDTO.getConsigneeAddress()); +// advanceEntity.setSenderName(importOrderNoPackageExcelDTO.getShipperPerson()); +// advanceEntity.setSenderPhone(importOrderNoPackageExcelDTO.getShipperMobile()); +// advanceEntity.setSenderAddress(importOrderNoPackageExcelDTO.getShipperAddress()); +// advanceEntity.setTrainNumber(importOrderNoPackageExcelDTO.getTrainNumber()); +// advanceEntity.setSystemType("线上"); +// advanceEntity.setMatingType("1"); +// advanceEntity.setWaybillStatus("0"); +// advanceEntity.setFreezeStatus("0"); +// advanceEntity.setLegacyStatus("0"); +// if (orderCode.contains("遗")) { +// advanceEntity.setLegacyStatus("1"); +// } +// advanceEntity.setHasPackage(0); +// advanceEntity.setCreateUserName(AuthUtil.getNickName()); +// list.add(advanceEntity); +// } +// }); + + importOrderNoPackageExcelDTOS.forEach(importOrderNoPackageExcelDTO -> { String orderCode = importOrderNoPackageExcelDTO.getOrderCode(); - String trainNumber = importOrderNoPackageExcelDTO.getTrainNumber(); - TrunklineAdvanceEntity trunklineAdvanceEntity = advanceService.findEntityByOrderCodeAndTrainNumber(orderCode, trainNumber); - if (Objects.isNull(trunklineAdvanceEntity)) { - trunklineAdvanceEntity = new TrunklineAdvanceVO(); - trunklineAdvanceEntity.setWarehouseId(warehouseId); - trunklineAdvanceEntity.setWarehouseName(warehouseName); - trunklineAdvanceEntity.setOrderCode(orderCode); - trunklineAdvanceEntity.setBrand(importOrderNoPackageExcelDTO.getBrand()); - trunklineAdvanceEntity.setTotalNum(Integer.parseInt(importOrderNoPackageExcelDTO.getNum())); - trunklineAdvanceEntity.setDealerName(importOrderNoPackageExcelDTO.getDealerName()); - trunklineAdvanceEntity.setCustomerName(importOrderNoPackageExcelDTO.getCustomerName()); - trunklineAdvanceEntity.setCustomerPhone(importOrderNoPackageExcelDTO.getCustomerPhone()); - trunklineAdvanceEntity.setCustomerAddress(importOrderNoPackageExcelDTO.getCustomerAddress()); - trunklineAdvanceEntity.setConsigneePerson(importOrderNoPackageExcelDTO.getConsigneePerson()); - trunklineAdvanceEntity.setConsigneeMobile(importOrderNoPackageExcelDTO.getConsigneeMobile()); - trunklineAdvanceEntity.setConsigneeAddress(importOrderNoPackageExcelDTO.getConsigneeAddress()); - trunklineAdvanceEntity.setServiceNum(importOrderNoPackageExcelDTO.getServiceNum()); - trunklineAdvanceEntity.setSystemType("线上"); - trunklineAdvanceEntity.setMatingType("1"); - trunklineAdvanceEntity.setWaybillStatus("0"); - trunklineAdvanceEntity.setTrainNumber(importOrderNoPackageExcelDTO.getTrainNumber()); - trunklineAdvanceEntity.setFreezeStatus("0"); - trunklineAdvanceEntity.setLegacyStatus("0"); - if (orderCode.contains("遗")) { - trunklineAdvanceEntity.setLegacyStatus("1"); - } - trunklineAdvanceEntity.setHasPackage(0); - trunklineAdvanceEntity.setCreateUserName(AuthUtil.getUserName()); - list.add(trunklineAdvanceEntity); + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + advanceEntity.setWarehouseId(warehouseId); + advanceEntity.setWarehouseName(warehouseName); + advanceEntity.setServiceNum(importOrderNoPackageExcelDTO.getServiceNum()); + advanceEntity.setOrderCode(orderCode); + advanceEntity.setArea(importOrderNoPackageExcelDTO.getArea()); + advanceEntity.setBrand(importOrderNoPackageExcelDTO.getBrand()); + advanceEntity.setTotalNum(Integer.parseInt(importOrderNoPackageExcelDTO.getCount())); + advanceEntity.setPackName(importOrderNoPackageExcelDTO.getFirsts()); + advanceEntity.setDealerCode(importOrderNoPackageExcelDTO.getDealerCode()); + advanceEntity.setDealerName(importOrderNoPackageExcelDTO.getDealerName()); + advanceEntity.setCustomerName(importOrderNoPackageExcelDTO.getCustomerName()); + advanceEntity.setCustomerPhone(importOrderNoPackageExcelDTO.getCustomerPhone()); + advanceEntity.setCustomerAddress(importOrderNoPackageExcelDTO.getCustomerAddress()); + advanceEntity.setConsigneePerson(importOrderNoPackageExcelDTO.getConsigneePerson()); + advanceEntity.setConsigneeMobile(importOrderNoPackageExcelDTO.getConsigneeMobile()); + advanceEntity.setConsigneeAddress(importOrderNoPackageExcelDTO.getConsigneeAddress()); + advanceEntity.setSenderName(importOrderNoPackageExcelDTO.getShipperPerson()); + advanceEntity.setSenderPhone(importOrderNoPackageExcelDTO.getShipperMobile()); + advanceEntity.setSenderAddress(importOrderNoPackageExcelDTO.getShipperAddress()); + advanceEntity.setTrainNumber(importOrderNoPackageExcelDTO.getTrainNumber()); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setLegacyStatus("0"); + if (orderCode.contains("遗")) { + advanceEntity.setLegacyStatus("1"); } - } + advanceEntity.setHasPackage(0); + advanceEntity.setCreateUserName(AuthUtil.getNickName()); + list.add(advanceEntity); + }); + advanceService.saveBatch(list); - return R.data(list); + int successNum = list.size(); + + return R.success("成功导入"+successNum+"条"); } @Override @@ -1622,6 +2581,17 @@ public class OpenOrderServiceImpl implements IOpenOrderService { log.warn("##############checkWaybill: 运单信息不存在"); return R.fail(405, "运单信息不存在"); } + Integer abolishStatus = warehouseWaybillEntity.getAbolishStatus(); + if(abolishStatus.equals(1)){ + log.warn("#############checkWaybill: 运单已作废 waybillId={}",waybillId); + return R.fail(405,"运单已作废"); + } + + Long checkUserId = warehouseWaybillEntity.getCheckUserId(); + if(!Objects.isNull(checkUserId)){ + log.warn("##############checkWaybill: 运单已经审核 waybillId={}",waybillId); + return R.fail(405, "运单已经审核"); + } warehouseWaybillEntity.setCheckUserId(AuthUtil.getUserId()); warehouseWaybillEntity.setCheckUserName(AuthUtil.getNickName()); @@ -1632,7 +2602,7 @@ public class OpenOrderServiceImpl implements IOpenOrderService { String nickName = AuthUtil.getNickName(); Long userId = AuthUtil.getUserId(); String waybillNo = warehouseWaybillEntity.getWaybillNo(); - String createOperationRemark = "审核运单" + waybillNo + ",时间:" + CommonUtil.dateToString(new Date()) + ", 审核人:" + AuthUtil.getNickName(); + String createOperationRemark = "审核运单" + waybillNo + ",时间:" + CommonUtil.dateToStringGeneral(new Date()) + ", 审核人:" + AuthUtil.getNickName(); openOrderAsyncService.saveLog(waybillId, waybillNo, "999", "审核运单", createOperationRemark, nickName, userId, warehouseId, warehouseName); return R.success("审核成功"); @@ -1918,7 +2888,8 @@ public class OpenOrderServiceImpl implements IOpenOrderService { //绑定订单和运单的关系 List advanceEntityList = advanceService.findListByIds(advanceIds); List waybillOrderEntities = new ArrayList<>(); - for (TrunklineAdvanceEntity advanceEntity : advanceEntityList) { + Set orderCodes = new TreeSet<>(); + for (TrunklineAdvanceEntity advanceEntity:advanceEntityList){ Long advanceId = advanceEntity.getId(); String waybillStatus = advanceEntity.getWaybillStatus(); if ("1".equals(waybillStatus)) { @@ -1938,6 +2909,10 @@ public class OpenOrderServiceImpl implements IOpenOrderService { waybillOrderEntities.add(waybillOrderEntity); +// List list = advanceDetailService.findList(advanceEntity.getId()); +// trunklineWaybillPackageService.saveList(list,waybillEntity); +// distributionParcelListClient.updateEntityByOpenOrder(advanceId,warehouseId,waybillId); +// orderCodes.add(advanceEntity.getOrderCode()); advanceEntity.setWaybillStatus("1"); advanceEntity.setWaybillNo(waybillEntity.getWaybillNo()); } @@ -1945,6 +2920,15 @@ public class OpenOrderServiceImpl implements IOpenOrderService { //修改暂存单的状态为已开单 advanceService.updateBatchById(advanceEntityList); +// Integer isTransfer = 1; +// if(departureWarehouseId.equals(destinationWarehouseId)){ +// isTransfer = 0; +// } + +// for (String orderCode : orderCodes) { +// distributionParcelListClient.updateTransferStatus(orderCode,warehouseId,isTransfer); +// } + //计算扫码入库的包件是否需要把运单和提货单挂上 List billladingPackageList = advanceDetailService.findBillladingPackageByAdvanceIdsAnd(advanceIds); @@ -1998,13 +2982,13 @@ public class OpenOrderServiceImpl implements IOpenOrderService { String nickName = AuthUtil.getNickName(); Long userId = AuthUtil.getUserId(); - String createOperationRemark = "创建运单" + waybillNo + ",时间:" + CommonUtil.dateToString(new Date()); + String createOperationRemark = "创建运单" + waybillNo + ",时间:" + CommonUtil.dateToStringGeneral(new Date()); openOrderAsyncService.saveLog(waybillId, waybillNo, "10", "创建运单", createOperationRemark, nickName, userId, warehouseId, warehouseName); Integer totalCount = waybillEntity.getTotalCount(); Integer stockCount = waybillEntity.getStockCount(); if (totalCount.equals(stockCount)) { - createOperationRemark = "运单入库:" + stockCount + "/" + totalCount + ",入库类型:【批量入库】,入库时间:" + CommonUtil.dateToString(waybillEntity.getCreateTime()); + createOperationRemark = "运单入库:" + stockCount + "/" + totalCount + ",入库类型:【零担开单及入库】,入库时间:" + CommonUtil.dateToStringGeneral(waybillEntity.getCreateTime()); openOrderAsyncService.saveLog(waybillId, waybillNo, "20", "已入库", createOperationRemark, nickName, userId, warehouseId, warehouseName); } @@ -2087,76 +3071,368 @@ public class OpenOrderServiceImpl implements IOpenOrderService { return R.data(list); } - private String verifyData(OpenOrderDTO openOrderDTO, WarehouseWaybillEntity waybillEntity) { + @Override + public R findUpdateWaybillList(OpenOrderDTO openOrderDTO) { + Integer pageNum = openOrderDTO.getPageNum(); + Integer pageSize = openOrderDTO.getPageSize(); + + IPage page = new Page<>(); + page.setCurrent(pageNum); + page.setSize(pageSize); + + openOrderDTO.setOpenTimeStart(CommonUtil.getStartByDateStr(openOrderDTO.getOpenTimeStartStr())); + openOrderDTO.setOpenTimeEnd(CommonUtil.getEndByDateStr(openOrderDTO.getOpenTimeEndStr())); + + openOrderDTO.setApplyTimeStart(CommonUtil.getStartByDateStr(openOrderDTO.getApplyTimeStartStr())); + openOrderDTO.setApplyTimeEnd(CommonUtil.getEndByDateStr(openOrderDTO.getApplyTimeEndStr())); + + openOrderDTO.setCheckTimeStart(CommonUtil.getStartByDateStr(openOrderDTO.getCheckTimeStartStr())); + openOrderDTO.setCheckTimeEnd(CommonUtil.getEndByDateStr(openOrderDTO.getCheckTimeEndStr())); + + IPage pageList = trunklineWaybillTrackService.findUpdateWaybillList(page,openOrderDTO); + + return R.data(pageList); + } + + @Override + public R freezeWaybill(List waybillIds, Long warehouseId, String warehouseName) { + List waybillEntities = warehouseWaybillClient.findListByWaybillIds(waybillIds); + waybillEntities.forEach(waybillEntity -> { + String waybillNo = waybillEntity.getWaybillNo(); + Integer abolishStatus = waybillEntity.getAbolishStatus(); + Integer freezeStatus = waybillEntity.getFreezeStatus(); + if(abolishStatus.equals(1)){ + log.warn("##############freezeWaybill: {}运单已经作废",waybillNo); + throw new CustomerException(405,waybillNo+"运单已经作废,不能冻结"); + } + + if(freezeStatus.equals(1)){ + log.warn("##############freezeWaybill: {}运单已冻结",waybillNo); + throw new CustomerException(405,waybillNo+"运单已冻结,不能冻结"); + } + + waybillEntity.setFreezeStatus(1); + waybillEntity.setFreezeTime(new Date()); + waybillEntity.setFreezeUserName(AuthUtil.getNickName()); + }); + warehouseWaybillClient.updateList(waybillEntities); + + //修改所有该运单的包件状态为已冻结 + distributionParcelListClient.updateFreezeStatusByWaybillIds(waybillIds); + + + waybillEntities.forEach(waybillEntity -> { + String createOperationRemark = "冻结运单" + waybillEntity.getWaybillNo() + ",时间:" + CommonUtil.dateToStringGeneral(new Date()); + openOrderAsyncService.saveLog(waybillEntity.getId(), waybillEntity.getWaybillNo(), "990", "冻结运单", createOperationRemark, AuthUtil.getNickName(), AuthUtil.getUserId(), warehouseId, warehouseName); + }); + + return R.success("修改成功"); + } + + @Override + public R unFreezeWaybill(List waybillIds, Long warehouseId, String warehouseName) { + List waybillEntities = warehouseWaybillClient.findListByWaybillIds(waybillIds); + waybillEntities.forEach(waybillEntity -> { + String waybillNo = waybillEntity.getWaybillNo(); + Integer abolishStatus = waybillEntity.getAbolishStatus(); + Integer freezeStatus = waybillEntity.getFreezeStatus(); + if(abolishStatus.equals(1)){ + log.warn("##############unFreezeWaybill: {}运单已经作废",waybillNo); + throw new CustomerException(405,waybillNo+"运单已经作废,不能解冻"); + } + if(freezeStatus.equals(0)){ + log.warn("##############unFreezeWaybill: {}运单未冻结",waybillNo); + throw new CustomerException(405,waybillNo+"运单未冻结,不能解冻"); + } + + waybillEntity.setFreezeStatus(0); + waybillEntity.setFreezeTime(null); + waybillEntity.setFreezeUserName(null); + }); + warehouseWaybillClient.updateWaybillFreezeStatusByWaybillIds(waybillIds); + + //修改所有该运单的包件状态为已冻结 + distributionParcelListClient.updateUnFreezeStatusByWaybillIds(waybillIds); + + waybillEntities.forEach(waybillEntity -> { + String createOperationRemark = "解冻运单" + waybillEntity.getWaybillNo() + ",时间:" + CommonUtil.dateToStringGeneral(new Date()); + openOrderAsyncService.saveLog(waybillEntity.getId(), waybillEntity.getWaybillNo(), "991", "解冻运单", createOperationRemark, AuthUtil.getNickName(), AuthUtil.getUserId(), warehouseId, warehouseName); + }); + + return R.success("修改成功"); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public R abolishWaybill(List waybillIds, Long warehouseId, String warehouseName, String abolishReson) { + List waybillList = warehouseWaybillClient.findListByWaybillIds(waybillIds); + waybillList.forEach(waybillEntity -> { + String waybillNo = waybillEntity.getWaybillNo(); + String waybillStatus = waybillEntity.getWaybillStatus(); + if(StringUtil.isBlank(waybillStatus)){ + log.warn("##############abolishWaybill: {}运单为旧数据不能作废",waybillNo); + throw new CustomerException(405,waybillNo+"运单为旧数据不能作废"); + } + Integer waybillStatusNum = Integer.parseInt(waybillStatus); + if(waybillStatusNum >= 30){ + log.warn("##############abolishWaybill: {}运单已经进入配载不能进行作废",waybillNo); + throw new CustomerException(405,waybillNo+"运单已经进入配载不能进行作废"); + } + Integer abolishStatus = waybillEntity.getAbolishStatus(); + if(abolishStatus.equals(1)){ + log.warn("##############abolishWaybill: {}运单已经作废",waybillNo); + throw new CustomerException(405,waybillNo+"运单已经作废,不能重复作废"); + } + waybillEntity.setAbolishStatus(1); + waybillEntity.setAbolishUserName(AuthUtil.getNickName()); + waybillEntity.setAbolishTime(new Date()); + }); + warehouseWaybillClient.updateList(waybillList); + + //把装了车的包件取消装车 + List carsLoadScanIds = trunklineCarsLoadScanService.findCarsLoadScanIdsByWaybillIds(waybillIds); + + if(!CollUtil.isEmpty(carsLoadScanIds)){ + //把carsLoadScanIds中的元素用,拼接起来成为一个字符串 + String carsLoadScanIdsStr = CollUtil.join(carsLoadScanIds, ","); + carsLoadService.removeCarsLoadScan(carsLoadScanIdsStr,warehouseId); + } + + List advanceIds = trunklineWaybillOrderService.findAdvanceIdsByWaybillIds(waybillIds); + + trunklineWaybillOrderService.remove(new QueryWrapper().in("waybill_id",waybillIds)); + + if(!advanceIds.isEmpty()){ + List advanceEntities = advanceService.findListByIds(advanceIds); + advanceEntities.forEach(advanceEntity -> { + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(null); + }); + advanceService.updateBatchById(advanceEntities); + + advanceDetailService.updateWaybillNoIsNullByAdvanceIds(advanceIds); + + distributionParcelListClient.clearParceListWaybillByAdvanceIds(advanceIds); + } + + waybillList.forEach(waybillEntity -> { + String createOperationRemark = "作废运单" + waybillEntity.getWaybillNo() + ",时间:" + CommonUtil.dateToStringGeneral(new Date()); + openOrderAsyncService.saveLog(waybillEntity.getId(), waybillEntity.getWaybillNo(), "1000", "作废运单", createOperationRemark+" 原因:"+abolishReson, AuthUtil.getNickName(), AuthUtil.getUserId(), warehouseId, warehouseName); + }); + return R.success("作废成功"); + } + + @Override + public R findWaybillDes(Long departureWarehouseId, Long consigneeId) { + + Map map = new HashMap<>(); + map.put("destinationWarehouseId",null); + map.put("destinationWarehouseName",null); + + BasicdataStorageServicesEntity basicdataStorageServicesEntity = basicdataStorageServicesClient.findEntityBySendWarehouseIdAndClientId(departureWarehouseId, consigneeId); + if (!Objects.isNull(basicdataStorageServicesEntity)) { + map.put("destinationWarehouseId",basicdataStorageServicesEntity.getServeWarehouseId()); + map.put("destinationWarehouseName",basicdataStorageServicesEntity.getServeWarehouseName()); + } + return R.data(map); + } + + private List verifyData(OpenOrderDTO openOrderDTO, WarehouseWaybillEntity waybillEntity) { log.info("###################verifyData: 验证改单数据"); StringBuilder stringBuilder = new StringBuilder(); + List msgList = new ArrayList<>(); + + String newBrand = openOrderDTO.getBrand(); + Long newBrandId = openOrderDTO.getBrandId(); + String brand = waybillEntity.getBrand(); + Long brandId = waybillEntity.getBrandId(); + if(!ObjectUtil.equals(newBrandId,brandId)){ + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("品牌"); + editOrderMsgVO.setOldValue(brand); + editOrderMsgVO.setNewValue(newBrand); + msgList.add(editOrderMsgVO); + } + + String newDeparture = openOrderDTO.getDeparture(); + String departure = waybillEntity.getDeparture(); + if(!ObjectUtil.equals(newDeparture,departure)){ +// stringBuilder.append("到站:").append(destination).append("-->").append(newDestination).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("发站"); + editOrderMsgVO.setOldValue(departure); + editOrderMsgVO.setNewValue(newDeparture); + msgList.add(editOrderMsgVO); + } + +// String newDepartureCode = openOrderDTO.getDepartureCode(); +// String departureCode = waybillEntity.getDepartureCode(); +// if(!ObjectUtil.equals(newDepartureCode,departureCode)){ +//// stringBuilder.append("到站:").append(destination).append("-->").append(newDestination).append(";"); +// EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); +// editOrderMsgVO.setItemName("发站"); +// editOrderMsgVO.setOldValue(departure); +// editOrderMsgVO.setNewValue(newDeparture); +// msgList.add(editOrderMsgVO); +// } + + Integer newPickupCompleteOrNot = openOrderDTO.getPickupCompleteOrNot(); + Integer pickupCompleteOrNot = waybillEntity.getPickupCompleteOrNot(); + if(!ObjectUtil.equals(newPickupCompleteOrNot,pickupCompleteOrNot)){ +// stringBuilder.append("到站:").append(destination).append("-->").append(newDestination).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("提货是否整车"); + editOrderMsgVO.setOldValue(pickupCompleteOrNot==1?"是":"否"); + editOrderMsgVO.setNewValue(newPickupCompleteOrNot==1?"是":"否"); + msgList.add(editOrderMsgVO); + } + + Integer newTrunklineCompleteOrNot = openOrderDTO.getTrunklineCompleteOrNot(); + Integer trunklineCompleteOrNot = waybillEntity.getTrunklineCompleteOrNot(); + if(!ObjectUtil.equals(newTrunklineCompleteOrNot,trunklineCompleteOrNot)){ +// stringBuilder.append("到站:").append(destination).append("-->").append(newDestination).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("干线是否整车"); + editOrderMsgVO.setOldValue(trunklineCompleteOrNot==1?"是":"否"); + editOrderMsgVO.setNewValue(newTrunklineCompleteOrNot==1?"是":"否"); + msgList.add(editOrderMsgVO); + } + + String newTrunklineVehicleType = openOrderDTO.getTrunklineVehicleType(); + String trunklineVehicleType = waybillEntity.getTrunklineVehicleType(); + if(!ObjectUtil.equals(newTrunklineVehicleType,trunklineVehicleType)){ +// stringBuilder.append("到站:").append(destination).append("-->").append(newDestination).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("干线车型"); + editOrderMsgVO.setOldValue(DictBizCache.getValue("price_vehicle_type",trunklineVehicleType)); + editOrderMsgVO.setNewValue(DictBizCache.getValue("price_vehicle_type",newTrunklineVehicleType)); + msgList.add(editOrderMsgVO); + } + + String newPickupVehicleType = openOrderDTO.getPickupVehicleType(); + String pickupVehicleType = waybillEntity.getPickupVehicleType(); + if(!ObjectUtil.equals(newPickupVehicleType,pickupVehicleType)){ +// stringBuilder.append("到站:").append(destination).append("-->").append(newDestination).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("提货车型"); + editOrderMsgVO.setOldValue(DictBizCache.getValue("price_vehicle_type",pickupVehicleType)); + editOrderMsgVO.setNewValue(DictBizCache.getValue("price_vehicle_type",newPickupVehicleType)); + msgList.add(editOrderMsgVO); + } + + String newDestination = openOrderDTO.getDestination(); String destination = waybillEntity.getDestination(); - if (!destination.equals(newDestination)) { - stringBuilder.append("到站:").append(destination).append("-->").append(newDestination).append(";"); + if(!ObjectUtil.equals(newDestination,destination)){ +// stringBuilder.append("到站:").append(destination).append("-->").append(newDestination).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("到站"); + editOrderMsgVO.setOldValue(destination); + editOrderMsgVO.setNewValue(newDestination); + msgList.add(editOrderMsgVO); } Long newDestinationWarehouseId = openOrderDTO.getDestinationWarehouseId(); String newDestinationWarehouseName = openOrderDTO.getDestinationWarehouseName(); Long destinationWarehouseId = waybillEntity.getDestinationWarehouseId(); - String departureWarehouseName = waybillEntity.getDepartureWarehouseName(); - if (!destinationWarehouseId.equals(newDestinationWarehouseId)) { - stringBuilder.append("目的仓:").append(departureWarehouseName).append("-->").append(newDestinationWarehouseName).append(";"); + String destinationWarehouseName = waybillEntity.getDestinationWarehouseName(); + if(!ObjectUtil.equals(destinationWarehouseId,newDestinationWarehouseId)){ +// stringBuilder.append("目的仓:").append(departureWarehouseName).append("-->").append(newDestinationWarehouseName).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("目的仓"); + editOrderMsgVO.setOldValue(destinationWarehouseName); + editOrderMsgVO.setNewValue(newDestinationWarehouseName); + msgList.add(editOrderMsgVO); } Long newShipperId = openOrderDTO.getShipperId(); String newShipper = openOrderDTO.getShipper(); Long shipperId = waybillEntity.getShipperId(); String shipper = waybillEntity.getShipper(); - if (!shipperId.equals(newShipperId)) { - stringBuilder.append("发货单位:").append(shipper).append("-->").append(newShipper).append(";"); + if(!ObjectUtil.equals(shipperId,newShipperId)){ +// stringBuilder.append("发货单位:").append(shipper).append("-->").append(newShipper).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("发货单位"); + editOrderMsgVO.setOldValue(shipper); + editOrderMsgVO.setNewValue(newShipper); + msgList.add(editOrderMsgVO); } + String newShipperName = openOrderDTO.getShipperName(); String shipperName = waybillEntity.getShipperName(); - shipperName = StringUtil.isBlank(shipperName) ? "" : shipperName; - if (!shipperName.equals(newShipperName)) { - stringBuilder.append("发货人:").append(shipperName).append("-->").append(newShipperName).append(";"); + if(!ObjectUtil.equals(shipperName,newShipperName)){ +// stringBuilder.append("发货人:").append(shipperName).append("-->").append(newShipperName).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("发货人"); + editOrderMsgVO.setOldValue(shipperName); + editOrderMsgVO.setNewValue(newShipperName); + msgList.add(editOrderMsgVO); } String newShipperMobile = openOrderDTO.getShipperMobile(); String shipperMobile = waybillEntity.getShipperMobile(); - shipperMobile = StringUtil.isBlank(shipperMobile) ? "" : shipperMobile; - if (!shipperMobile.equals(newShipperMobile)) { - stringBuilder.append("发货人电话:").append(shipperMobile).append("-->").append(newShipperMobile).append(";"); + if(!ObjectUtil.equals(shipperMobile,newShipperMobile)){ +// stringBuilder.append("发货人电话:").append(shipperMobile).append("-->").append(newShipperMobile).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("发货人电话"); + editOrderMsgVO.setOldValue(shipperMobile); + editOrderMsgVO.setNewValue(newShipperMobile); + msgList.add(editOrderMsgVO); } String newShipperAddress = openOrderDTO.getShipperAddress(); String shipperAddress = waybillEntity.getShipperAddress(); - shipperAddress = StringUtil.isBlank(shipperAddress) ? "" : shipperAddress; - if (!shipperAddress.equals(newShipperAddress)) { - stringBuilder.append("发货人地址:").append(shipperAddress).append("-->").append(newShipperAddress).append(";"); + if(!ObjectUtil.equals(shipperAddress,newShipperAddress)){ +// stringBuilder.append("发货人地址:").append(shipperAddress).append("-->").append(newShipperAddress).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("发货人地址"); + editOrderMsgVO.setOldValue(shipperAddress); + editOrderMsgVO.setNewValue(newShipperAddress); + msgList.add(editOrderMsgVO); } Long newConsigneeId = openOrderDTO.getConsigneeId(); String newConsignee = openOrderDTO.getConsignee(); Long consigneeId = waybillEntity.getConsigneeId(); String consignee = waybillEntity.getConsignee(); - if (!consigneeId.equals(newConsigneeId)) { - stringBuilder.append("收货单位:").append(consignee).append("-->").append(newConsignee).append(";"); + if(!ObjectUtil.equals(consigneeId,newConsigneeId)){ +// stringBuilder.append("收货单位:").append(consignee).append("-->").append(newConsignee).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("收货单位"); + editOrderMsgVO.setOldValue(consignee); + editOrderMsgVO.setNewValue(newConsignee); + msgList.add(editOrderMsgVO); } String newConsigneeName = openOrderDTO.getConsigneeName(); String consigneeName = waybillEntity.getConsigneeName(); - consigneeName = StringUtil.isBlank(consigneeName) ? "" : consigneeName; - if (!consigneeName.equals(newConsigneeName)) { - stringBuilder.append("收货人:").append(consigneeName).append("-->").append(newConsigneeName).append(";"); + if(!ObjectUtil.equals(consigneeName,newConsigneeName)){ +// stringBuilder.append("收货人:").append(consigneeName).append("-->").append(newConsigneeName).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("收货人"); + editOrderMsgVO.setOldValue(consigneeName); + editOrderMsgVO.setNewValue(newConsigneeName); + msgList.add(editOrderMsgVO); } String newConsigneeMobile = openOrderDTO.getConsigneeMobile(); String consigneeMobile = waybillEntity.getConsigneeMobile(); - consigneeMobile = StringUtil.isBlank(consigneeMobile) ? "" : consigneeMobile; - if (!consigneeMobile.equals(newConsigneeMobile)) { - stringBuilder.append("收货人电话:").append(consigneeMobile).append("-->").append(newConsigneeMobile).append(";"); + if(!ObjectUtil.equals(consigneeMobile,newConsigneeMobile)){ +// stringBuilder.append("收货人电话:").append(consigneeMobile).append("-->").append(newConsigneeMobile).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("收货人电话"); + editOrderMsgVO.setOldValue(consigneeMobile); + editOrderMsgVO.setNewValue(newConsigneeMobile); + msgList.add(editOrderMsgVO); } String newConsigneeAddress = openOrderDTO.getConsigneeAddress(); String consigneeAddress = waybillEntity.getConsigneeAddress(); - consigneeAddress = StringUtil.isBlank(consigneeAddress) ? "" : consigneeAddress; - if (!shipperAddress.equals(newShipperAddress)) { - stringBuilder.append("发货人地址:").append(consigneeAddress).append("-->").append(newConsigneeAddress).append(";"); + if(!ObjectUtil.equals(consigneeAddress,newConsigneeAddress)){ +// stringBuilder.append("收货人地址:").append(consigneeAddress).append("-->").append(newConsigneeAddress).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("收货人地址"); + editOrderMsgVO.setOldValue(consigneeAddress); + editOrderMsgVO.setNewValue(newConsigneeAddress); + msgList.add(editOrderMsgVO); } String removeMsg = null; @@ -2166,20 +3442,24 @@ public class OpenOrderServiceImpl implements IOpenOrderService { Long waybillDetailId = waybillDetailDTO.getId(); WarehouseWayBillDetail warehouseWayBillDetail = warehouseWaybillDetailClient.findEntityByWaybillDetailId(waybillDetailId); - if (Objects.isNull(warehouseWayBillDetail)) { + if(Objects.isNull(warehouseWayBillDetail)){ log.warn("#################verifyUpdateData: 明细不存在"); continue; } - if (StringUtil.isBlank(removeMsg)) { - removeMsg = warehouseWayBillDetail.getProductName() + "(" + warehouseWayBillDetail.getNum() + ")"; - } else { - removeMsg = removeMsg + "," + warehouseWayBillDetail.getProductName() + "(" + warehouseWayBillDetail.getNum() + ")"; + if(StringUtil.isBlank(removeMsg)){ + removeMsg = warehouseWayBillDetail.getProductName()+"("+warehouseWayBillDetail.getNum()+")"; + }else{ + removeMsg = removeMsg + "," + warehouseWayBillDetail.getProductName()+"("+warehouseWayBillDetail.getNum()+")"; } } - if (StringUtil.isNotBlank(removeMsg)) { - stringBuilder.append("明细移除:").append(removeMsg).append(";"); + if(StringUtil.isNotBlank(removeMsg)){ +// stringBuilder.append("明细移除:").append(removeMsg).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("明细移除"); + editOrderMsgVO.setOldValue(removeMsg); + msgList.add(editOrderMsgVO); } List addList = openOrderDTO.getAddList(); @@ -2187,197 +3467,358 @@ public class OpenOrderServiceImpl implements IOpenOrderService { Integer updateType = waybillDetailDTO.getUpdateType(); - if (1 == updateType) { + if(1 == updateType){ //新增 - stringBuilder.append("明细新增:").append(waybillDetailDTO.getGoodsName()).append(" 数量 ").append(waybillDetailDTO.getNum()).append(" 单价 ").append(waybillDetailDTO.getPrice()).append(";"); +// stringBuilder.append("明细新增:").append(waybillDetailDTO.getGoodsName()).append(" 数量 ").append(waybillDetailDTO.getNum()).append(" 单价 ").append(waybillDetailDTO.getPrice()).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("明细新增 "+waybillDetailDTO.getGoodsName()); + editOrderMsgVO.setNewValue(" 数量 "+waybillDetailDTO.getNum()+" 单价 "+waybillDetailDTO.getPrice()); + msgList.add(editOrderMsgVO); - } else if (2 == updateType) { + + }else if(2 == updateType){ //更新 Long waybillDetailId = waybillDetailDTO.getId(); WarehouseWayBillDetail warehouseWayBillDetail = warehouseWaybillDetailClient.findEntityByWaybillDetailId(waybillDetailId); - if (Objects.isNull(warehouseWayBillDetail)) { + if(Objects.isNull(warehouseWayBillDetail)){ log.warn("#################verifyUpdateData: 明细不存在"); continue; } Integer newNum = waybillDetailDTO.getNum(); Integer num = warehouseWayBillDetail.getNum(); - if (!num.equals(newNum)) { - stringBuilder.append("明细更新:").append(warehouseWayBillDetail.getProductName()).append(" 数量修改").append(num).append("-->").append(newNum).append(";"); + if(!num.equals(newNum)){ +// stringBuilder.append("明细更新:").append(warehouseWayBillDetail.getProductName()).append(" 数量修改").append(num).append("-->").append(newNum).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("明细更新 "+warehouseWayBillDetail.getProductName() +" 数量修改 "); + editOrderMsgVO.setOldValue(num+""); + editOrderMsgVO.setNewValue(newNum+""); + msgList.add(editOrderMsgVO); } BigDecimal newPrice = waybillDetailDTO.getPrice(); BigDecimal price = warehouseWayBillDetail.getPrice(); - if (price.compareTo(newPrice) != 0) { - stringBuilder.append("明细更新:").append(warehouseWayBillDetail.getProductName()).append(" 单价修改").append(price).append("-->").append(newPrice).append(";"); + if(price.compareTo(newPrice) != 0){ +// stringBuilder.append("明细更新:").append(warehouseWayBillDetail.getProductName()).append(" 单价修改").append(price).append("-->").append(newPrice).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("明细更新 "+warehouseWayBillDetail.getProductName() +" 单价修改 "); + editOrderMsgVO.setOldValue(price.toPlainString()); + editOrderMsgVO.setNewValue(newPrice.toPlainString()); + msgList.add(editOrderMsgVO); } Integer newChargeType = waybillDetailDTO.getChargeType(); Integer chargeType = warehouseWayBillDetail.getChargeType(); - if (!chargeType.equals(newChargeType)) { - stringBuilder.append("明细更新:").append(warehouseWayBillDetail.getProductName()).append(" 计价方式修改").append(chargeType).append("-->").append(newChargeType).append(";"); + if(!ObjectUtil.equals(chargeType,newChargeType)){ +// stringBuilder.append("明细更新:").append(warehouseWayBillDetail.getProductName()).append(" 计价方式修改").append(chargeType).append("-->").append(newChargeType).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("明细更新 "+warehouseWayBillDetail.getProductName() +" 计价方式修改 "); + editOrderMsgVO.setOldValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_CHARGE_TYPE,chargeType+"")); + editOrderMsgVO.setNewValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_CHARGE_TYPE,newChargeType+"")); + msgList.add(editOrderMsgVO); + } + + BigDecimal newSubtotalFreight = waybillDetailDTO.getSubtotalFreight(); + BigDecimal subtotalFreight = warehouseWayBillDetail.getSubtotalFreight(); + if(subtotalFreight.compareTo(newSubtotalFreight) != 0){ +// stringBuilder.append("明细更新:").append(warehouseWayBillDetail.getProductName()).append(" 单价修改").append(price).append("-->").append(newPrice).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("明细更新 "+warehouseWayBillDetail.getProductName() +" 运费小计修改 "); + editOrderMsgVO.setOldValue(subtotalFreight.toPlainString()); + editOrderMsgVO.setNewValue(newSubtotalFreight.toPlainString()); + msgList.add(editOrderMsgVO); } + } } Integer newTotalCount = openOrderDTO.getTotalCount(); Integer totalCount = waybillEntity.getTotalCount(); - if (!totalCount.equals(newTotalCount)) { - stringBuilder.append("货物总数:").append(totalCount).append("-->").append(newTotalCount).append(";"); + if(!ObjectUtil.equals(totalCount,newTotalCount)){ +// stringBuilder.append("货物总数:").append(totalCount).append("-->").append(newTotalCount).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("货物总数"); + editOrderMsgVO.setOldValue(totalCount+""); + editOrderMsgVO.setNewValue(newTotalCount+""); + msgList.add(editOrderMsgVO); } BigDecimal newTotalFreight = openOrderDTO.getTotalFreight(); BigDecimal totalFreight = waybillEntity.getTotalFreight(); - if (totalFreight.compareTo(newTotalFreight) != 0) { - stringBuilder.append("运费:").append(totalFreight).append("-->").append(newTotalFreight).append(";"); + if(totalFreight.compareTo(newTotalFreight) != 0){ +// stringBuilder.append("运费:").append(totalFreight).append("-->").append(newTotalFreight).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("运费"); + editOrderMsgVO.setOldValue(totalFreight+""); + editOrderMsgVO.setNewValue(newTotalFreight+""); + msgList.add(editOrderMsgVO); } BigDecimal newDeliveryFee = openOrderDTO.getDeliveryFee(); BigDecimal deliveryFee = waybillEntity.getDeliveryFee(); - if (deliveryFee.compareTo(newDeliveryFee) != 0) { - stringBuilder.append("送货费:").append(deliveryFee).append("-->").append(newDeliveryFee).append(";"); + if(deliveryFee.compareTo(newDeliveryFee) != 0){ +// stringBuilder.append("送货费:").append(deliveryFee).append("-->").append(newDeliveryFee).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("送货费"); + editOrderMsgVO.setOldValue(deliveryFee.toPlainString()); + editOrderMsgVO.setNewValue(newDeliveryFee.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal newPickupFee = openOrderDTO.getPickupFee(); BigDecimal pickupFee = waybillEntity.getPickupFee(); - if (pickupFee.compareTo(newPickupFee) != 0) { - stringBuilder.append("提货费:").append(pickupFee).append("-->").append(newPickupFee).append(";"); + if(pickupFee.compareTo(newPickupFee) != 0){ +// stringBuilder.append("提货费:").append(pickupFee).append("-->").append(newPickupFee).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("提货费"); + editOrderMsgVO.setOldValue(pickupFee.toPlainString()); + editOrderMsgVO.setNewValue(newPickupFee.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal newWarehouseManagementFee = openOrderDTO.getWarehouseManagementFee(); BigDecimal warehouseManagementFee = waybillEntity.getWarehouseManagementFee(); - if (warehouseManagementFee.compareTo(newWarehouseManagementFee) != 0) { - stringBuilder.append("仓库管理费:").append(warehouseManagementFee).append("-->").append(newWarehouseManagementFee).append(";"); + if(warehouseManagementFee.compareTo(newWarehouseManagementFee) != 0){ +// stringBuilder.append("仓库管理费:").append(warehouseManagementFee).append("-->").append(newWarehouseManagementFee).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("仓库管理费"); + editOrderMsgVO.setOldValue(warehouseManagementFee.toPlainString()); + editOrderMsgVO.setNewValue(newWarehouseManagementFee.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal newStorageFee = openOrderDTO.getStorageFee(); BigDecimal storageFee = waybillEntity.getStorageFee(); - if (storageFee.compareTo(newStorageFee) != 0) { - stringBuilder.append("仓储费:").append(storageFee).append("-->").append(newStorageFee).append(";"); + if(storageFee.compareTo(newStorageFee) != 0){ +// stringBuilder.append("仓储费:").append(storageFee).append("-->").append(newStorageFee).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("仓储费"); + editOrderMsgVO.setOldValue(storageFee.toPlainString()); + editOrderMsgVO.setNewValue(newStorageFee.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal newHandlingFee = openOrderDTO.getHandlingFee(); BigDecimal handlingFee = waybillEntity.getHandlingFee(); - if (handlingFee.compareTo(newHandlingFee) != 0) { - stringBuilder.append("装卸费:").append(handlingFee).append("-->").append(newHandlingFee).append(";"); + if(handlingFee.compareTo(newHandlingFee) != 0){ +// stringBuilder.append("装卸费:").append(handlingFee).append("-->").append(newHandlingFee).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("装卸费"); + editOrderMsgVO.setOldValue(handlingFee.toPlainString()); + editOrderMsgVO.setNewValue(newHandlingFee.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal newInstallFee = openOrderDTO.getInstallFee(); BigDecimal installFee = waybillEntity.getInstallFee(); - if (installFee.compareTo(newInstallFee) != 0) { - stringBuilder.append("安装费:").append(installFee).append("-->").append(newInstallFee).append(";"); + if(installFee.compareTo(newInstallFee) != 0){ +// stringBuilder.append("安装费:").append(installFee).append("-->").append(newInstallFee).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("安装费"); + editOrderMsgVO.setOldValue(installFee.toPlainString()); + editOrderMsgVO.setNewValue(newInstallFee.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal newOtherFee = openOrderDTO.getOtherFee(); BigDecimal otherFee = waybillEntity.getOtherFee(); - if (otherFee.compareTo(newOtherFee) != 0) { - stringBuilder.append("其他费:").append(otherFee).append("-->").append(newOtherFee).append(";"); + if(otherFee.compareTo(newOtherFee) != 0){ +// stringBuilder.append("其他费:").append(otherFee).append("-->").append(newOtherFee).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("其他费"); + editOrderMsgVO.setOldValue(otherFee.toPlainString()); + editOrderMsgVO.setNewValue(newOtherFee.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal newInsuranceFee = openOrderDTO.getInsuranceFee(); BigDecimal insuranceFee = waybillEntity.getInsuranceFee(); - if (insuranceFee.compareTo(newInsuranceFee) != 0) { - stringBuilder.append("保价费:").append(insuranceFee).append("-->").append(newInsuranceFee).append(";"); + if(insuranceFee.compareTo(newInsuranceFee) != 0){ +// stringBuilder.append("保价费:").append(insuranceFee).append("-->").append(newInsuranceFee).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("保价费"); + editOrderMsgVO.setOldValue(insuranceFee.toPlainString()); + editOrderMsgVO.setNewValue(newInsuranceFee.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal newClaimingValue = openOrderDTO.getClaimingValue(); BigDecimal claimingValue = waybillEntity.getClaimingValue(); - if (claimingValue.compareTo(newClaimingValue) != 0) { - stringBuilder.append("申明价值:").append(claimingValue).append("-->").append(newClaimingValue).append(";"); + if(claimingValue.compareTo(newClaimingValue) != 0){ +// stringBuilder.append("申明价值:").append(claimingValue).append("-->").append(newClaimingValue).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("申明价值"); + editOrderMsgVO.setOldValue(claimingValue.toPlainString()); + editOrderMsgVO.setNewValue(newClaimingValue.toPlainString()); + msgList.add(editOrderMsgVO); } String newPayType = openOrderDTO.getPayType(); String payType = waybillEntity.getPayType(); - if (!payType.equals(newPayType)) { - stringBuilder.append("支付方式:").append(payType).append("-->").append(newPayType).append(";"); + if(!ObjectUtil.equals(payType,newPayType)){ +// stringBuilder.append("支付方式:").append(payType).append("-->").append(newPayType).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("支付方式"); + editOrderMsgVO.setOldValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_PAY_TYPE,payType)); + editOrderMsgVO.setNewValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_PAY_TYPE,newPayType)); + msgList.add(editOrderMsgVO); } String newPayWay = openOrderDTO.getPayWay(); String payWay = waybillEntity.getPayWay(); - if (!payWay.equals(newPayWay)) { - stringBuilder.append("付款方式:").append(payWay).append("-->").append(newPayWay).append(";"); + if(!ObjectUtil.equals(payWay,newPayWay)){ +// stringBuilder.append("付款方式:").append(payWay).append("-->").append(newPayWay).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("付款方式"); + editOrderMsgVO.setOldValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_PAY_WAY,payWay)); + editOrderMsgVO.setNewValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_PAY_WAY,newPayWay)); + msgList.add(editOrderMsgVO); } BigDecimal xianPay = openOrderDTO.getXianPay(); BigDecimal xPay = waybillEntity.getXPay(); - if (xPay.compareTo(xianPay) != 0) { - stringBuilder.append("现付:").append(xPay).append("-->").append(xianPay).append(";"); + if(xPay.compareTo(xianPay) != 0){ +// stringBuilder.append("现付:").append(xPay).append("-->").append(xianPay).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("现付"); + editOrderMsgVO.setOldValue(xPay.toPlainString()); + editOrderMsgVO.setNewValue(xianPay.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal daoPay = openOrderDTO.getDaoPay(); BigDecimal dPay = waybillEntity.getDPay(); - if (dPay.compareTo(daoPay) != 0) { - stringBuilder.append("到付:").append(dPay).append("-->").append(daoPay).append(";"); + if(dPay.compareTo(daoPay) != 0){ +// stringBuilder.append("到付:").append(dPay).append("-->").append(daoPay).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("到付"); + editOrderMsgVO.setOldValue(dPay.toPlainString()); + editOrderMsgVO.setNewValue(daoPay.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal yuePay = openOrderDTO.getYuePay(); BigDecimal yPay = waybillEntity.getYPay(); - if (yPay.compareTo(yuePay) != 0) { - stringBuilder.append("月结:").append(yPay).append("-->").append(yuePay).append(";"); + if(yPay.compareTo(yuePay) != 0){ +// stringBuilder.append("月结:").append(yPay).append("-->").append(yuePay).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("月结"); + editOrderMsgVO.setOldValue(yPay.toPlainString()); + editOrderMsgVO.setNewValue(yuePay.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal huiPay = openOrderDTO.getHuiPay(); BigDecimal hPay = waybillEntity.getHPay(); - if (hPay.compareTo(huiPay) != 0) { - stringBuilder.append("月结:").append(hPay).append("-->").append(huiPay).append(";"); + if(hPay.compareTo(huiPay) != 0){ +// stringBuilder.append("回付:").append(hPay).append("-->").append(huiPay).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("回付"); + editOrderMsgVO.setOldValue(hPay.toPlainString()); + editOrderMsgVO.setNewValue(huiPay.toPlainString()); + msgList.add(editOrderMsgVO); } BigDecimal newthirdOperationFee = openOrderDTO.getThirdOperationFee(); BigDecimal thirdOperationFee = waybillEntity.getThirdOperationFee(); - if (thirdOperationFee.compareTo(newthirdOperationFee) != 0) { - stringBuilder.append("三方操作费:").append(thirdOperationFee).append("-->").append(newthirdOperationFee).append(";"); + if(thirdOperationFee.compareTo(newthirdOperationFee) != 0){ +// stringBuilder.append("三方操作费:").append(thirdOperationFee).append("-->").append(newthirdOperationFee).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("三方操作费"); + editOrderMsgVO.setOldValue(thirdOperationFee.toPlainString()); + editOrderMsgVO.setNewValue(newthirdOperationFee.toPlainString()); + msgList.add(editOrderMsgVO); } String newdeliveryWay = openOrderDTO.getDeliveryWay(); String deliveryWay = waybillEntity.getDeliveryWay(); - if (!deliveryWay.equals(newdeliveryWay)) { - stringBuilder.append("送货方式:").append(deliveryWay).append("-->").append(newdeliveryWay).append(";"); + if(!ObjectUtil.equals(deliveryWay,newdeliveryWay)){ +// stringBuilder.append("送货方式:").append(deliveryWay).append("-->").append(newdeliveryWay).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("送货方式"); + editOrderMsgVO.setOldValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_DELIVERY_WAY,deliveryWay)); + editOrderMsgVO.setNewValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_DELIVERY_WAY,newdeliveryWay)); + msgList.add(editOrderMsgVO); } String newurgency = openOrderDTO.getUrgency(); String urgency = waybillEntity.getUrgency(); - if (!urgency.equals(newurgency)) { - stringBuilder.append("紧急度:").append(urgency).append("-->").append(newurgency).append(";"); + if(!ObjectUtil.equals(urgency,newurgency)){ +// stringBuilder.append("紧急度:").append(urgency).append("-->").append(newurgency).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("紧急度"); + editOrderMsgVO.setOldValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_URGENCY,urgency)); + editOrderMsgVO.setNewValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_URGENCY,newurgency)); + msgList.add(editOrderMsgVO); } String newreceipt = openOrderDTO.getReceipt(); String receipt = waybillEntity.getReceipt(); - if (!receipt.equals(newreceipt)) { - stringBuilder.append("回单方式:").append(receipt).append("-->").append(newreceipt).append(";"); + if(!ObjectUtil.equals(receipt,newreceipt)){ +// stringBuilder.append("回单方式:").append(receipt).append("-->").append(newreceipt).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("回单方式"); + editOrderMsgVO.setOldValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_RECEIPT,receipt)); + editOrderMsgVO.setNewValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_RECEIPT,newreceipt)); + msgList.add(editOrderMsgVO); } String newtransportType = openOrderDTO.getTransportType(); String transportType = waybillEntity.getTransportType(); - if (!transportType.equals(newtransportType)) { - stringBuilder.append("运输方式:").append(transportType).append("-->").append(newtransportType).append(";"); + if(!ObjectUtil.equals(transportType,newtransportType)){ +// stringBuilder.append("运输方式:").append(transportType).append("-->").append(newtransportType).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("运输方式"); + editOrderMsgVO.setOldValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_TRANSPORT_TYPE,transportType)); + editOrderMsgVO.setNewValue(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_TRANSPORT_TYPE,newtransportType)); + msgList.add(editOrderMsgVO); } Integer newreceiptNum = openOrderDTO.getReceiptNum(); Integer receiptNum = waybillEntity.getReceiptNum(); - if (!receiptNum.equals(newreceiptNum)) { - stringBuilder.append("回单数量:").append(receiptNum).append("-->").append(newreceiptNum).append(";"); + if(!ObjectUtil.equals(receiptNum,newreceiptNum)){ +// stringBuilder.append("回单数量:").append(receiptNum).append("-->").append(newreceiptNum).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("回单数量"); + editOrderMsgVO.setOldValue(receiptNum+""); + editOrderMsgVO.setNewValue(newreceiptNum+""); + msgList.add(editOrderMsgVO); } BigDecimal newrebate = openOrderDTO.getRebate(); BigDecimal rebate = waybillEntity.getRebate(); - if (!Objects.isNull(rebate)) { - if (rebate.compareTo(newrebate) != 0) { - stringBuilder.append("回扣:").append(rebate).append("-->").append(newrebate).append(";"); + if(!Objects.isNull(rebate)){ + if(rebate.compareTo(newrebate) != 0){ +// stringBuilder.append("回扣:").append(rebate).append("-->").append(newrebate).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("回扣"); + editOrderMsgVO.setOldValue(rebate+""); + editOrderMsgVO.setNewValue(newrebate+""); + msgList.add(editOrderMsgVO); } } String newRemark = openOrderDTO.getRemark(); String remark = waybillEntity.getRemark(); - if (!StringUtil.isBlank(remark)) { - if (!remark.equals(newRemark)) { - stringBuilder.append("备注:").append(remark).append("-->").append(newRemark).append(";"); - } - } else { - if (!StringUtil.isBlank(newRemark)) { - stringBuilder.append("备注:").append(remark).append("-->").append(newRemark).append(";"); - } - } + if(!ObjectUtil.equals(remark,newRemark)){ + stringBuilder.append("备注:").append(remark).append("-->").append(newRemark).append(";"); + EditOrderMsgVO editOrderMsgVO = new EditOrderMsgVO(); + editOrderMsgVO.setItemName("备注"); + editOrderMsgVO.setOldValue(remark); + editOrderMsgVO.setNewValue(newRemark); + msgList.add(editOrderMsgVO); + } + +// if(!StringUtil.isBlank(remark)){ +// if(!remark.equals(newRemark)){ +// +// } +// }else{ +// if(!StringUtil.isBlank(newRemark)){ +// stringBuilder.append("备注:").append(remark).append("-->").append(newRemark).append(";"); +// } +// } - return stringBuilder.toString(); + return msgList; } @@ -2385,9 +3826,59 @@ public class OpenOrderServiceImpl implements IOpenOrderService { private String verifyUpdateData(OpenOrderDTO openOrderDTO, WarehouseWaybillEntity waybillEntity) { log.info("###################verifyUpdateData: 验证改单数据"); StringBuilder stringBuilder = new StringBuilder(); + + Long waybillId = waybillEntity.getId(); + + Long newBrandId = openOrderDTO.getBrandId(); + String newBrand = openOrderDTO.getBrand(); + Long brandId = waybillEntity.getBrandId(); + String brand = waybillEntity.getBrand(); + if(!ObjectUtil.equals(newBrandId,brandId)){ + stringBuilder.append("品牌:").append(brand).append("-->").append(newBrand).append(";"); + waybillEntity.setBrandId(newBrandId); + waybillEntity.setBrand(newBrand); + } + + String newDeparture = openOrderDTO.getDeparture(); + String departure = waybillEntity.getDeparture(); + if(!ObjectUtil.equals(newDeparture,departure)){ + stringBuilder.append("发站:").append(departure).append("-->").append(newDeparture).append(";"); + waybillEntity.setDeparture(newDeparture); + waybillEntity.setDepartureCode(openOrderDTO.getDepartureCode()); + } + + Integer newPickupCompleteOrNot = openOrderDTO.getPickupCompleteOrNot(); + Integer pickupCompleteOrNot = waybillEntity.getPickupCompleteOrNot(); + if(!ObjectUtil.equals(newPickupCompleteOrNot,pickupCompleteOrNot)){ + stringBuilder.append("提货是否整车:").append(pickupCompleteOrNot==1?"是":"否").append("-->").append(newPickupCompleteOrNot==1?"是":"否").append(";"); + waybillEntity.setPickupCompleteOrNot(newPickupCompleteOrNot); + } + + Integer newTrunklineCompleteOrNot = openOrderDTO.getTrunklineCompleteOrNot(); + Integer trunklineCompleteOrNot = waybillEntity.getTrunklineCompleteOrNot(); + if(!ObjectUtil.equals(newTrunklineCompleteOrNot,trunklineCompleteOrNot)){ + stringBuilder.append("干线是否整车:").append(trunklineCompleteOrNot==1?"是":"否").append("-->").append(newTrunklineCompleteOrNot==1?"是":"否").append(";"); + waybillEntity.setTrunklineCompleteOrNot(newTrunklineCompleteOrNot); + } + + String newTrunklineVehicleType = openOrderDTO.getTrunklineVehicleType(); + String trunklineVehicleType = waybillEntity.getTrunklineVehicleType(); + if(!ObjectUtil.equals(newTrunklineVehicleType,trunklineVehicleType)){ + stringBuilder.append("干线车型:").append(DictBizCache.getValue("price_vehicle_type",trunklineVehicleType)).append("-->").append(DictBizCache.getValue("price_vehicle_type",newTrunklineVehicleType)).append(";"); + waybillEntity.setTrunklineVehicleType(newTrunklineVehicleType); + } + + String newPickupVehicleType = openOrderDTO.getPickupVehicleType(); + String pickupVehicleType = waybillEntity.getPickupVehicleType(); + if(!ObjectUtil.equals(newPickupVehicleType,pickupVehicleType)){ + stringBuilder.append("提货车型:").append(DictBizCache.getValue("price_vehicle_type",pickupVehicleType)).append("-->").append(DictBizCache.getValue("price_vehicle_type",newPickupVehicleType)).append(";"); + waybillEntity.setPickupVehicleType(newPickupVehicleType); + } + + String newDestination = openOrderDTO.getDestination(); String destination = waybillEntity.getDestination(); - if (!destination.equals(newDestination)) { + if (!ObjectUtil.equals(destination,newDestination)) { stringBuilder.append("到站:").append(destination).append("-->").append(newDestination).append(";"); waybillEntity.setDestination(newDestination); waybillEntity.setDestinationCode(openOrderDTO.getDestinationCode()); @@ -2396,40 +3887,50 @@ public class OpenOrderServiceImpl implements IOpenOrderService { String newDestinationWarehouseName = openOrderDTO.getDestinationWarehouseName(); Long destinationWarehouseId = waybillEntity.getDestinationWarehouseId(); String departureWarehouseName = waybillEntity.getDepartureWarehouseName(); - if (!destinationWarehouseId.equals(newDestinationWarehouseId)) { + if (!ObjectUtil.equals(destinationWarehouseId,newDestinationWarehouseId)) { stringBuilder.append("目的仓:").append(departureWarehouseName).append("-->").append(newDestinationWarehouseName).append(";"); waybillEntity.setDestinationWarehouseId(newDestinationWarehouseId); waybillEntity.setDestinationWarehouseName(newDestinationWarehouseName); + //查询所有该运单的包件 + List parcelListEntityList = distributionParcelListClient.findListByWaybillId(waybillId); + parcelListEntityList.forEach(parcelListEntity -> { + Long warehouseId = parcelListEntity.getWarehouseId(); + parcelListEntity.setAcceptWarehouseId(newDestinationWarehouseId); + parcelListEntity.setAcceptWarehouseName(newDestinationWarehouseName); + if(warehouseId.equals(newDestinationWarehouseId)){ + parcelListEntity.setIsTransfer(0); + }else{ + parcelListEntity.setIsTransfer(1); + } + }); + distributionParcelListClient.updateList(parcelListEntityList); } Long newShipperId = openOrderDTO.getShipperId(); String newShipper = openOrderDTO.getShipper(); Long shipperId = waybillEntity.getShipperId(); String shipper = waybillEntity.getShipper(); - if (!shipperId.equals(newShipperId)) { + if (!ObjectUtil.equals(shipperId,newShipperId)) { stringBuilder.append("发货单位:").append(shipper).append("-->").append(newShipper).append(";"); waybillEntity.setShipper(newShipper); waybillEntity.setShipperId(newShipperId); } String newShipperName = openOrderDTO.getShipperName(); String shipperName = waybillEntity.getShipperName(); - shipperName = StringUtil.isBlank(shipperName) ? "" : shipperName; - if (!shipperName.equals(newShipperName)) { + if (!ObjectUtil.equals(shipperName,newShipperName)) { stringBuilder.append("发货人:").append(shipperName).append("-->").append(newShipperName).append(";"); waybillEntity.setShipperName(newShipperName); } String newShipperMobile = openOrderDTO.getShipperMobile(); String shipperMobile = waybillEntity.getShipperMobile(); - shipperMobile = StringUtil.isBlank(shipperMobile) ? "" : shipperMobile; - if (!shipperMobile.equals(newShipperMobile)) { + if (!ObjectUtil.equals(shipperMobile,newShipperMobile)) { stringBuilder.append("发货人电话:").append(shipperMobile).append("-->").append(newShipperMobile).append(";"); waybillEntity.setShipperMobile(newShipperMobile); } String newShipperAddress = openOrderDTO.getShipperAddress(); String shipperAddress = waybillEntity.getShipperAddress(); - shipperAddress = StringUtil.isBlank(shipperAddress) ? "" : shipperAddress; - if (!shipperAddress.equals(newShipperAddress)) { + if (!ObjectUtil.equals(shipperAddress,newShipperAddress)) { stringBuilder.append("发货人地址:").append(shipperAddress).append("-->").append(newShipperAddress).append(";"); waybillEntity.setShipperAddress(newShipperAddress); } @@ -2438,7 +3939,7 @@ public class OpenOrderServiceImpl implements IOpenOrderService { String newConsignee = openOrderDTO.getConsignee(); Long consigneeId = waybillEntity.getConsigneeId(); String consignee = waybillEntity.getConsignee(); - if (!consigneeId.equals(newConsigneeId)) { + if (!ObjectUtil.equals(consigneeId,newConsigneeId)) { stringBuilder.append("收货单位:").append(consignee).append("-->").append(newConsignee).append(";"); waybillEntity.setConsignee(newConsignee); waybillEntity.setConsigneeId(newConsigneeId); @@ -2446,24 +3947,21 @@ public class OpenOrderServiceImpl implements IOpenOrderService { String newConsigneeName = openOrderDTO.getConsigneeName(); String consigneeName = waybillEntity.getConsigneeName(); - consigneeName = StringUtil.isBlank(consigneeName) ? "" : consigneeName; - if (!consigneeName.equals(newConsigneeName)) { + if (!ObjectUtil.equals(consigneeName,newConsigneeName)) { stringBuilder.append("收货人:").append(consigneeName).append("-->").append(newConsigneeName).append(";"); waybillEntity.setConsigneeName(newConsigneeName); } String newConsigneeMobile = openOrderDTO.getConsigneeMobile(); String consigneeMobile = waybillEntity.getConsigneeMobile(); - consigneeMobile = StringUtil.isBlank(consigneeMobile) ? "" : consigneeMobile; - if (!consigneeMobile.equals(newConsigneeMobile)) { + if (!ObjectUtil.equals(consigneeMobile,newConsigneeMobile)) { stringBuilder.append("收货人电话:").append(consigneeMobile).append("-->").append(newConsigneeMobile).append(";"); waybillEntity.setConsigneeMobile(newConsigneeMobile); } String newConsigneeAddress = openOrderDTO.getConsigneeAddress(); String consigneeAddress = waybillEntity.getConsigneeAddress(); - consigneeAddress = StringUtil.isBlank(consigneeAddress) ? "" : consigneeAddress; - if (!shipperAddress.equals(newShipperAddress)) { + if (!ObjectUtil.equals(consigneeAddress,newConsigneeAddress)) { stringBuilder.append("收货人地址:").append(consigneeAddress).append("-->").append(newConsigneeAddress).append(";"); waybillEntity.setConsigneeAddress(newConsigneeAddress); } @@ -2523,7 +4021,7 @@ public class OpenOrderServiceImpl implements IOpenOrderService { } Integer newNum = waybillDetailDTO.getNum(); Integer num = warehouseWayBillDetail.getNum(); - if (!num.equals(newNum)) { + if (!ObjectUtil.equals(num,newNum)) { stringBuilder.append("明细更新:").append(warehouseWayBillDetail.getProductName()).append(" 数量修改").append(num).append("-->").append(newNum).append(";"); warehouseWayBillDetail.setNum(newNum); } @@ -2537,17 +4035,28 @@ public class OpenOrderServiceImpl implements IOpenOrderService { Integer newChargeType = waybillDetailDTO.getChargeType(); Integer chargeType = warehouseWayBillDetail.getChargeType(); - if (!chargeType.equals(newChargeType)) { + if (!ObjectUtil.equals(chargeType,newChargeType)) { stringBuilder.append("明细更新:").append(warehouseWayBillDetail.getProductName()).append(" 计价方式修改").append(chargeType).append("-->").append(newChargeType).append(";"); warehouseWayBillDetail.setChargeType(newChargeType); } + + BigDecimal newSubtotalFreight = waybillDetailDTO.getSubtotalFreight(); + BigDecimal subtotalFreight = warehouseWayBillDetail.getSubtotalFreight(); + if(subtotalFreight.compareTo(newSubtotalFreight) != 0){ + stringBuilder.append("明细更新:").append(warehouseWayBillDetail.getProductName()).append(" 运费小计修改").append(subtotalFreight).append("-->").append(newSubtotalFreight).append(";"); + warehouseWayBillDetail.setSubtotalFreight(newSubtotalFreight); + } + + warehouseWayBillDetail.setDeliveryPrice(waybillDetailDTO.getDeliveryPrice()); + warehouseWayBillDetail.setSubtotalDeliveryFee(waybillDetailDTO.getSubtotalDeliveryFee()); + warehouseWaybillDetailClient.updateEntityById(warehouseWayBillDetail); } } Integer newTotalCount = openOrderDTO.getTotalCount(); Integer totalCount = waybillEntity.getTotalCount(); - if (!totalCount.equals(newTotalCount)) { + if (!ObjectUtil.equals(totalCount,newTotalCount)) { stringBuilder.append("货物总数:").append(totalCount).append("-->").append(newTotalCount).append(";"); waybillEntity.setTotalCount(newTotalCount); } @@ -2624,14 +4133,14 @@ public class OpenOrderServiceImpl implements IOpenOrderService { String newPayType = openOrderDTO.getPayType(); String payType = waybillEntity.getPayType(); - if (!payType.equals(newPayType)) { + if (!ObjectUtil.equals(payType,newPayType)) { stringBuilder.append("支付方式:").append(payType).append("-->").append(newPayType).append(";"); waybillEntity.setPayType(newPayType); } String newPayWay = openOrderDTO.getPayWay(); String payWay = waybillEntity.getPayWay(); - if (!payWay.equals(newPayWay)) { + if (!ObjectUtil.equals(payType,newPayType)) { stringBuilder.append("付款方式:").append(payWay).append("-->").append(newPayWay).append(";"); waybillEntity.setPayWay(newPayWay); } @@ -2673,14 +4182,14 @@ public class OpenOrderServiceImpl implements IOpenOrderService { String newdeliveryWay = openOrderDTO.getDeliveryWay(); String deliveryWay = waybillEntity.getDeliveryWay(); - if (!deliveryWay.equals(newdeliveryWay)) { + if (!ObjectUtil.equals(deliveryWay,newdeliveryWay)) { stringBuilder.append("送货方式:").append(deliveryWay).append("-->").append(newdeliveryWay).append(";"); waybillEntity.setDeliveryWay(newdeliveryWay); } String newurgency = openOrderDTO.getUrgency(); String urgency = waybillEntity.getUrgency(); - if (!urgency.equals(newurgency)) { + if (!ObjectUtil.equals(urgency,newurgency)) { stringBuilder.append("紧急度:").append(urgency).append("-->").append(newurgency).append(";"); waybillEntity.setUrgency(newurgency); } @@ -2716,16 +4225,9 @@ public class OpenOrderServiceImpl implements IOpenOrderService { } String newRemark = openOrderDTO.getRemark(); String remark = waybillEntity.getRemark(); - if (!StringUtil.isBlank(remark)) { - if (!remark.equals(newRemark)) { - stringBuilder.append("备注:").append(remark).append("-->").append(newRemark).append(";"); - waybillEntity.setRemark(newRemark); - } - } else { - if (!StringUtil.isBlank(newRemark)) { - stringBuilder.append("备注:").append(remark).append("-->").append(newRemark).append(";"); - waybillEntity.setRemark(newRemark); - } + if(!ObjectUtil.equals(remark,newRemark)){ + stringBuilder.append("备注:").append(remark).append("-->").append(newRemark).append(";"); + waybillEntity.setRemark(newRemark); } return stringBuilder.toString(); @@ -2799,7 +4301,7 @@ public class OpenOrderServiceImpl implements IOpenOrderService { distributionStockArticleEntity.setIsZero("1"); Long orderId = distributionStockArticleClient.addData(distributionStockArticleEntity); - if (orderId == 0) { + if (Objects.isNull(orderId)) { log.warn("#################createStockArticle: 保存订单信息失败 orderCode={}", distributionStockArticleEntity.getOrderCode()); throw new CustomerException(405, "保存订单信息失败"); } @@ -2823,7 +4325,7 @@ public class OpenOrderServiceImpl implements IOpenOrderService { entity.setOrderPackageStockupStatus("10"); entity.setOrderPackageReservationStatus("10"); entity.setOrderPackageLoadingStatus("10"); - entity.setWaybillId(warehouseWaybill.getId() + ""); + entity.setWaybillId(warehouseWaybill.getId()); entity.setWaybillNumber(warehouseWaybill.getWaybillNo()); entity.setIsZero("1"); entity.setWarehouseEntryTimeEnd(date); diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/PackageTrackLogAsyncServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/PackageTrackLogAsyncServiceImpl.java index 4581a3f82..7a67324a0 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/PackageTrackLogAsyncServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/PackageTrackLogAsyncServiceImpl.java @@ -1,17 +1,24 @@ package com.logpm.trunkline.service.impl; +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSONObject; import com.logpm.trunkline.service.IPackageTrackLogAsyncService; +import com.logpm.trunkline.service.ISendFanoutService; import com.logpm.trunkline.service.ITrunklineWaybillPackageService; import com.logpm.warehouse.entity.WarehousePackageTrackLogEntity; import com.logpm.warehouse.feign.IWarehousePackageTrackLogClient; +import io.prometheus.client.CollectorRegistry; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.common.constant.broadcast.FanoutConstants; +import org.springblade.common.model.FanoutMsg; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; @Service @Slf4j @@ -20,8 +27,10 @@ public class PackageTrackLogAsyncServiceImpl implements IPackageTrackLogAsyncSer private final IWarehousePackageTrackLogClient warehousePackageTrackLogClient; private final ITrunklineWaybillPackageService waybillPackageService; + private final ISendFanoutService sendFanoutService; + private final CollectorRegistry collectorRegistry; - @Async + @LogpmAsync("asyncExecutor") @Override public void addPackageTrackLog(String tenantId, Long userId, Long deptId, String nickName, List orderPackageCodes, Long warehouseId, String warehouseName, Integer workNode, String content) { List list = new ArrayList<>(); @@ -46,6 +55,36 @@ public class PackageTrackLogAsyncServiceImpl implements IPackageTrackLogAsyncSer } warehousePackageTrackLogClient.addLogList(list); - waybillPackageService.updatePackageStatus(orderPackageCodes,workNode); + waybillPackageService.updatePackageStatus(orderPackageCodes, workNode,warehouseId, null); } + + @LogpmAsync("asyncExecutor") + @Override + public void addBatchPackageTrackLog(List addPackageTrackLogList, List orderPackageCodes, Integer workNode, Map map) { + if(CollUtil.isNotEmpty(addPackageTrackLogList)){ + warehousePackageTrackLogClient.addLogList(addPackageTrackLogList); + WarehousePackageTrackLogEntity warehousePackageTrackLogEntity = addPackageTrackLogList.get(0); + Long warehouseId = warehousePackageTrackLogEntity.getWarehouseId(); + waybillPackageService.updatePackageStatus(orderPackageCodes, workNode,warehouseId, map); + } + } + + @LogpmAsync("asyncExecutor") + @Override + public void sendPackageWorkNodeFanout(List orderPackageCodes, Integer workNode, Long warehouseId, Map map) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("orderPackageCodes",orderPackageCodes); + jsonObject.put("workNode",workNode); + jsonObject.put("warehouseId",warehouseId); + if(CollUtil.isNotEmpty(map)){ + jsonObject.put("mainMap",map); + } + + FanoutMsg build = FanoutMsg.builder().msg(jsonObject.toJSONString()) + .exchange(FanoutConstants.trunkline.PACKAGNODE.EXCHANGE).build(); + + sendFanoutService.sendFanoutMsg(build); + } + } + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/SendFanoutServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/SendFanoutServiceImpl.java new file mode 100644 index 000000000..927a5d3a8 --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/SendFanoutServiceImpl.java @@ -0,0 +1,26 @@ +package com.logpm.trunkline.service.impl; + +import com.logpm.trunkline.service.ISendFanoutService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.model.FanoutMsg; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +@Slf4j +public class SendFanoutServiceImpl implements ISendFanoutService { + + private final RabbitTemplate rabbitTemplate; + + @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(value = 3000, multiplier = 1.5)) + @Override + public void sendFanoutMsg(FanoutMsg fanoutMsg) { + + rabbitTemplate.convertAndSend(fanoutMsg.getExchange(),null, fanoutMsg.getMsg()); + + } +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineAdvanceDetailServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineAdvanceDetailServiceImpl.java index c29ddb416..6e72ba080 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineAdvanceDetailServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineAdvanceDetailServiceImpl.java @@ -1,6 +1,8 @@ package com.logpm.trunkline.service.impl; -import com.alibaba.fastjson.JSONObject; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; @@ -10,6 +12,7 @@ import com.logpm.basic.feign.IBasicPrintTemplateClient; import com.logpm.distribution.vo.DistributionStockArticleQRCodeVO; import com.logpm.distribution.vo.OrderPackgeCodeDataVO; import com.logpm.trunkline.dto.AdvanceDetailDTO; +import com.logpm.trunkline.dto.OrderDetailsDTO; import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import com.logpm.trunkline.mapper.TrunklineAdvanceDetailMapper; @@ -18,10 +21,14 @@ import com.logpm.trunkline.service.ITrunklineAdvanceDetailService; import com.logpm.trunkline.vo.AdvanceDetailGoodsVO; import com.logpm.trunkline.vo.AdvanceDetailStockNumVO; import com.logpm.trunkline.vo.BillladingPackageVO; +import com.logpm.trunkline.vo.OrderDetailInfoVO; import com.logpm.trunkline.vo.TrunklineAdvanceDetailVO; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; +import com.logpm.warehouse.feign.IWarehouseWaybillClient; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.common.constant.printTemplate.PrintTemplateStatusConstant; +import org.springblade.common.utils.CommonUtil; import org.springblade.common.utils.QRCodeUtil; import org.springblade.common.utils.TemplateUtil; import org.springblade.core.log.exception.ServiceException; @@ -31,11 +38,8 @@ import org.springblade.core.tool.utils.ObjectUtil; import org.springblade.core.tool.utils.StringUtil; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; @Slf4j @Service @@ -46,9 +50,11 @@ public class TrunklineAdvanceDetailServiceImpl extends BaseServiceImpl map = JSONObject.parseObject(JSONObject.toJSONString(vo), Map.class); + //把vo转成Map + Map map = BeanUtil.beanToMap(vo); if(!Objects.isNull(advanceDetailEntity)){ map.put("id",advanceDetailEntity.getId()); } String filename = QRCodeUtil.createCodeToFile(vo.getQrCode()); map.put("img", QRCodeUtil.getEmpAutograph(filename)); // 订单号 生成二维码 - String fileTypeName = QRCodeUtil.createCodeToFile(vo.getOrderCode()); + String fileTypeName = QRCodeUtil.createCodeToFile(vo.getQrCode()); map.put("imgType", QRCodeUtil.getEmpAutograph(fileTypeName)); data.add(map); } @@ -253,7 +282,58 @@ public class TrunklineAdvanceDetailServiceImpl extends BaseServiceImpl findPackageCodeByCodes(Set orderPackageCodes) { - return baseMapper.findPackageCodeByCodes(orderPackageCodes); + public Map findPackageCodeByCodes(Set orderPackageCodes) { + List> packageCodeByCodes = baseMapper.findPackageCodeByCodes(orderPackageCodes); + if(CollUtil.isNotEmpty(packageCodeByCodes)){ + return packageCodeByCodes.stream().collect(Collectors.toMap(map -> map.get("code"), map -> String.valueOf(map.get("id")))); + } + return null; } + + @Override + public R findOrderDetails(OrderDetailsDTO orderDetailsDTO) { + + //判断orderDetailsDTO中的订单号 运单号 包件码 服务号 客户车次号至少有一个有值 + if(StringUtil.isBlank(orderDetailsDTO.getOrderCode()) && StringUtil.isBlank(orderDetailsDTO.getWaybillNo()) && StringUtil.isBlank(orderDetailsDTO.getOrderPackageCode()) && StringUtil.isBlank(orderDetailsDTO.getServiceNumber()) && StringUtil.isBlank(orderDetailsDTO.getTrunklineCarsNo())){ + return R.fail("订单号 运单号 包件码 服务号 客户车次号至少有一个有值"); + } + + IPage page = new Page<>(); + page.setCurrent(orderDetailsDTO.getPageNum()); + page.setSize(orderDetailsDTO.getPageSize()); + + orderDetailsDTO.setCreateTimeStart(CommonUtil.getStartByDateStr(orderDetailsDTO.getCreateTimeStartStr())); + orderDetailsDTO.setCreateTimeEnd(CommonUtil.getEndByDateStr(orderDetailsDTO.getCreateTimeEndStr())); + + + IPage pageList = baseMapper.findOrderDetails(page,orderDetailsDTO); + return R.data(pageList); + } + + @Override + public void updateWaybillNoIsNullByAdvanceIds(List advanceIds) { + baseMapper.updateWaybillNoIsNullByAdvanceIds(advanceIds); + } + + @Override + public List findListByExistsAndOrderPackageCodes(List orderPackageCodeGroup) { + return baseMapper.findListByExistsAndOrderPackageCodes(orderPackageCodeGroup); + } + + @Override + public List findAdvanceDetailVoByAdvanceIds(List advanceIds) { + return baseMapper.findAdvanceDetailVoByAdvanceIds(advanceIds); + } + + @Override + public void deletedAdvanceByOrderCode(String orderCode) { + if(StrUtil.isNotEmpty(orderCode)){ + baseMapper.deletedAdvanceByOrderCode(orderCode); + } + } + + @Override + public void deleteByWaybillNo(String waybillNo) { + baseMapper.deleteByWaybillNo(waybillNo); + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineAdvanceServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineAdvanceServiceImpl.java index 250e10208..b59213ea3 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineAdvanceServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineAdvanceServiceImpl.java @@ -1,7 +1,12 @@ package com.logpm.trunkline.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.logpm.basic.entity.BasicMaterialEntity; import com.logpm.basic.feign.IBasicMaterialClient; import com.logpm.basicdata.entity.BasicdataClientEntity; @@ -11,15 +16,18 @@ import com.logpm.basicdata.feign.IBasicdataClientClient; import com.logpm.basicdata.feign.IBasicdataStoreBusinessClient; import com.logpm.basicdata.feign.IBasicdataTripartiteMallClient; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.distribution.dto.FindParamterDTO; import com.logpm.distribution.entity.DistributionParcelListEntity; import com.logpm.distribution.entity.DistributionStockArticleEntity; import com.logpm.distribution.feign.IDistributionParcelListClient; import com.logpm.distribution.feign.IDistributionStockArticleClient; import com.logpm.trunkline.dto.AdvanceDTO; import com.logpm.trunkline.dto.InComingDTO; +import com.logpm.trunkline.dto.OrderStatusDTO; import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; import com.logpm.trunkline.entity.TrunklineAdvanceEntity; import com.logpm.trunkline.mapper.TrunklineAdvanceMapper; +import com.logpm.trunkline.service.ITrunklineAdvanceDetailService; import com.logpm.trunkline.service.ITrunklineAdvanceService; import com.logpm.trunkline.vo.CustomerInfoVO; import com.logpm.trunkline.vo.OpenOrderVO; @@ -28,18 +36,20 @@ import com.logpm.warehouse.entity.WarehouseWaybillEntity; import com.logpm.warehouse.feign.IWarehouseWaybillClient; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springblade.common.constant.TenantNum; +import org.springblade.common.constant.RabbitConstant; import org.springblade.common.exception.CustomerException; import org.springblade.common.utils.CommonUtil; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; @Slf4j @Service @@ -55,6 +65,8 @@ public class TrunklineAdvanceServiceImpl extends BaseServiceImpl incomingPackageBatch(Long advanceId, Long warehouseId, List detailList, Long userId, Long deptId, String tenantId) { + public List incomingPackageBatch(Long advanceId, Long warehouseId, List detailList, Long userId, Long deptId, String tenantId, WarehouseWaybillEntity waybillEntity) { Date date = new Date(); @@ -440,9 +469,12 @@ public class TrunklineAdvanceServiceImpl extends BaseServiceImpl map = new HashMap<>(); + map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO)); + rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map); + } + } + } catch (Exception e) { + log.error("入库推送失败:{}", e); + } return orderPackageCodes; } + @Override + public List findListByExistsAndOrderCodeSet(List orderCodeSet) { + return baseMapper.findListByExistsAndOrderCodeSet(orderCodeSet); + } + + @Override + public boolean saveOrderAndPackages(List advanceDetailEntities, Long warehouseId) { + + BasicdataWarehouseEntity warehouseEntity = basicdataWarehouseClient.getEntityWarehouseId(warehouseId); + if(Objects.isNull(warehouseEntity)){ + log.warn("############saveOrderAndPackages: 仓库信息不存在warehouseId={}",warehouseId); + throw new CustomerException(405,"仓库信息不存在"); + } + + TrunklineAdvanceDetailEntity advanceDetailEntity = advanceDetailEntities.get(0); + String tenantId = advanceDetailEntity.getTenantId(); + Long userId = AuthUtil.getUserId(); + Long deptId = Func.firstLong(AuthUtil.getDeptId()); + if(Objects.isNull(userId)){ + userId = advanceDetailEntity.getCreateUser(); + } + if(Objects.isNull(deptId)){ + userId = advanceDetailEntity.getCreateDept(); + } + + //把advanceDetailEntities所有元素的orderCode作为key分组 + Map> orderCodeMap = advanceDetailEntities.stream().collect(Collectors.groupingBy(TrunklineAdvanceDetailEntity::getOrderCode)); + Set orderCodeSet = orderCodeMap.keySet(); + + //把advanceDetailEntities中所有元素的waybillId提取到一个Set中 + Set waybillIdSet = advanceDetailEntities.stream().map(TrunklineAdvanceDetailEntity::getWaybillId).collect(Collectors.toSet()); + Map waybillEntityMap = new HashMap<>(); + if(!waybillIdSet.isEmpty()){ + List waybillEntityList = warehouseWaybillClient.findListByWaybillIds(new ArrayList<>(waybillIdSet)); + //把waybillEntityList转化成以id为key的Map + waybillEntityMap = waybillEntityList.stream().collect(Collectors.toMap(WarehouseWaybillEntity::getWaybillNo, Function.identity())); + } + + + //提取出advanceDetailEntities所有元素的advanceId存入Set + Set advanceIdSet = advanceDetailEntities.stream().map(TrunklineAdvanceDetailEntity::getAdvanceId).collect(Collectors.toSet()); + List advanceEntityList = findListByIds(new ArrayList<>(advanceIdSet)); + + Map advanceEntityMap = new HashMap<>(); + if(!advanceEntityList.isEmpty()){ + advanceEntityMap = advanceEntityList.stream().collect(Collectors.toMap(TrunklineAdvanceEntity::getOrderCode, Function.identity())); + } + + + FindParamterDTO findParamterDTO = new FindParamterDTO(); + findParamterDTO.setOrderCodeSet(orderCodeSet); + findParamterDTO.setWarehouseId(warehouseId); + List stockArticleEntities = stockArticleClient.findListByOrderCodesAndWarehouseId(findParamterDTO); + Map stockArticleMap = new HashMap<>(); + if(!stockArticleEntities.isEmpty()){ + stockArticleMap = stockArticleEntities.stream().collect(Collectors.toMap(DistributionStockArticleEntity::getOrderCode, Function.identity())); + } + + FindParamterDTO findParamterD = new FindParamterDTO(); + findParamterD.setOrderCodeSet(orderCodeSet); + findParamterD.setWarehouseId(warehouseId); + List parcelListEntities = parcelListClient.findListByOrderCodesAndWarehouseId(findParamterD); + Map parcelListMap = new HashMap<>(); + if(!parcelListEntities.isEmpty()){ + parcelListMap = parcelListEntities.stream().collect(Collectors.toMap(DistributionParcelListEntity::getOrderPackageCode, Function.identity())); + } + + Set hasOrderPackageCodes = parcelListMap.keySet(); + + Map finalStockArticleMap = stockArticleMap; + Map finalParcelListMap = parcelListMap; + Map finalAdvanceEntityMap = advanceEntityMap; + Long finalUserId = userId; + Date date = new Date(); + + List addStockArticleEntities = new ArrayList<>(); + List updateStockArticleEntities = new ArrayList<>(); + + Map finalWaybillEntityMap = waybillEntityMap; + orderCodeSet.forEach(orderCode -> { + int total = baseMapper.getAllTotalNum(orderCode); + + DistributionStockArticleEntity stockArticleEntity = finalStockArticleMap.get(orderCode); + if(Objects.isNull(stockArticleEntity)){ + TrunklineAdvanceEntity advanceEntity = finalAdvanceEntityMap.get(orderCode); + if(!Objects.isNull(advanceEntity)){ + String waybillNo = advanceEntity.getWaybillNo(); + + stockArticleEntity = new DistributionStockArticleEntity(); + stockArticleEntity.setTenantId(tenantId); + stockArticleEntity.setCreateUser(finalUserId); + stockArticleEntity.setUpdateUser(finalUserId); + stockArticleEntity.setCreateDept(deptId); + stockArticleEntity.setOrderCode(orderCode); + stockArticleEntity.setServiceNumber(advanceEntity.getServiceNum()); + stockArticleEntity.setWaybillNumber(waybillNo); + stockArticleEntity.setTotalNumber(total); + stockArticleEntity.setHandQuantity(0); +// stockArticleEntity.setTenantId(TenantNum.HUITONGCODE);// 对应租户ID + stockArticleEntity.setWarehouse(warehouseEntity.getName()); + stockArticleEntity.setWarehouseId(warehouseId); + stockArticleEntity.setBrand(advanceEntity.getBrand()); + stockArticleEntity.setDescriptionGoods(advanceEntity.getPackName()); + stockArticleEntity.setWarehouseEntryTime(date); + stockArticleEntity.setGenre(1); + + String dealerName = advanceEntity.getDealerName();//暂存单经销商名称 + stockArticleEntity.setDealerCode(advanceEntity.getDealerCode()); + stockArticleEntity.setDealerName(advanceEntity.getDealerName()); + + stockArticleEntity.setTypeService("1");//默认商配 + + if(!StringUtil.isBlank(waybillNo)){ + WarehouseWaybillEntity waybillEntity = finalWaybillEntityMap.get(waybillNo); + if(!Objects.isNull(waybillEntity)){ + Long consigneeId = waybillEntity.getConsigneeId(); + + BasicdataClientEntity clientEntity = basicdataClientClient.findEntityById(consigneeId); + if(!Objects.isNull(clientEntity)){ + stockArticleEntity.setMallId(clientEntity.getId()); + stockArticleEntity.setMallName(clientEntity.getClientName()); + stockArticleEntity.setMallCode(clientEntity.getClientCode()); + } + String consignee = waybillEntity.getConsignee(); + String consigneeName = waybillEntity.getConsigneeName(); + String consigneeMobile = waybillEntity.getConsigneeMobile(); + String consigneeAddress = waybillEntity.getConsigneeAddress(); + stockArticleEntity.setConsigneeUnit(consignee); + stockArticleEntity.setConsigneePerson(consigneeName); + stockArticleEntity.setConsigneeMobile(consigneeMobile); + stockArticleEntity.setConsigneeAddress(consigneeAddress); + + BasicdataStoreBusinessEntity basicdataStoreBusinessEntity = basicdataStoreBusinessClient.findByClientIdAndTypeService(consigneeId, 3); + if(!Objects.isNull(basicdataStoreBusinessEntity)){ + stockArticleEntity.setTypeService(basicdataStoreBusinessEntity.getMold()); + } + } + }else{ + Long clientId = basicdataTripartiteMallClient.getClientIdByNameAndBrand(dealerName, advanceEntity.getBrand()); + BasicdataClientEntity basicdataClientEntity = basicdataClientClient.findEntityById(clientId); + if(!Objects.isNull(basicdataClientEntity)){ + String clientType = basicdataClientEntity.getClientType(); + if("5".equals(clientType)){ + stockArticleEntity.setStoreId(basicdataClientEntity.getId()); + stockArticleEntity.setStoreCode(basicdataClientEntity.getClientCode()); + stockArticleEntity.setStoreName(basicdataClientEntity.getClientName()); + //查询门店的父级商场 + Long pid = basicdataClientEntity.getPid(); + BasicdataClientEntity pidEntity = basicdataClientClient.findEntityById(pid); + if(!Objects.isNull(pidEntity)){ + String pidEntityClientType = pidEntity.getClientType(); + if("2".equals(pidEntityClientType)){ + //商城 + stockArticleEntity.setMallId(pidEntity.getId()); + stockArticleEntity.setMallName(pidEntity.getClientName()); + stockArticleEntity.setMallCode(pidEntity.getClientCode()); + + BasicdataStoreBusinessEntity basicdataStoreBusinessEntity = basicdataStoreBusinessClient.findByClientIdAndTypeService(pidEntity.getId(), 3); + if(!Objects.isNull(basicdataStoreBusinessEntity)){ + stockArticleEntity.setTypeService(basicdataStoreBusinessEntity.getMold()); + } + } + } + }else if("2".equals(clientType)){ + //商城 + stockArticleEntity.setMallId(basicdataClientEntity.getId()); + stockArticleEntity.setMallName(basicdataClientEntity.getClientName()); + stockArticleEntity.setMallCode(basicdataClientEntity.getClientCode()); + + BasicdataStoreBusinessEntity basicdataStoreBusinessEntity = basicdataStoreBusinessClient.findByClientIdAndTypeService(basicdataClientEntity.getId(), 3); + if(!Objects.isNull(basicdataStoreBusinessEntity)){ + stockArticleEntity.setTypeService(basicdataStoreBusinessEntity.getMold()); + } + } + } + } + stockArticleEntity.setCustomerName(advanceEntity.getCustomerName()); + stockArticleEntity.setCustomerTelephone(advanceEntity.getCustomerPhone()); + stockArticleEntity.setCustomerAddress(advanceEntity.getCustomerAddress()); + stockArticleEntity.setStockupStatus("10"); + stockArticleEntity.setReservationStatus("10"); + stockArticleEntity.setOrderStatus("0"); + stockArticleEntity.setGroundingStatus("10"); + stockArticleEntity.setOrderReceiveStatus("10"); + stockArticleEntity.setFreezeStatus("10"); + stockArticleEntity.setNotification(2); + stockArticleEntity.setIsHaveData(2); + stockArticleEntity.setTrainNumber(advanceEntity.getTrainNumber()); + stockArticleEntity.setSortingQuantity(0); + stockArticleEntity.setDeliveryQuantity(0); + stockArticleEntity.setTransferQuantity(0); + stockArticleEntity.setSigninQuantity(0); + addStockArticleEntities.add(stockArticleEntity); + } + }else{ + stockArticleEntity.setTotalNumber(total); + updateStockArticleEntities.add(stockArticleEntity); + } + }); + stockArticleClient.updateByBatchId(updateStockArticleEntities); + + List returnStockArticleEntities = stockArticleClient.addReturnList(addStockArticleEntities); + returnStockArticleEntities.addAll(updateStockArticleEntities); + + Map saMap = returnStockArticleEntities.stream().collect(Collectors.toMap(DistributionStockArticleEntity::getOrderCode, Function.identity())); + + List parcelListEntityList = new ArrayList<>(); + orderCodeMap.keySet().forEach(orderCode->{ + DistributionStockArticleEntity stockArticleEntity = saMap.get(orderCode); + if(!Objects.isNull(stockArticleEntity)){ + Long orderId = stockArticleEntity.getId(); + List adList = orderCodeMap.get(orderCode); + adList.forEach(ad->{ + String orderPackageCode = ad.getOrderPackageCode(); + if(!hasOrderPackageCodes.contains(orderPackageCode)){ + String trainNumber = ad.getTrainNumber(); + DistributionParcelListEntity parcelList = new DistributionParcelListEntity(); + parcelList.setCreateUser(finalUserId); + parcelList.setUpdateUser(finalUserId); + parcelList.setCreateDept(deptId); + parcelList.setTenantId(tenantId); + parcelList.setWarehouse(warehouseEntity.getName()); + parcelList.setWarehouseId(warehouseId); + parcelList.setIsTransfer(1); + String waybillNo = ad.getWaybillNo(); + if(StringUtil.isNotBlank(waybillNo)){ + WarehouseWaybillEntity waybillEntity = finalWaybillEntityMap.get(waybillNo); + if(!Objects.isNull(waybillEntity)){ + parcelList.setWaybillId(waybillEntity.getId()); + parcelList.setWaybillNumber(waybillEntity.getWaybillNo()); + parcelList.setSendWarehouseId(waybillEntity.getDepartureWarehouseId()); + parcelList.setSendWarehouseName(waybillEntity.getDepartureWarehouseName()); + Long destinationWarehouseId = waybillEntity.getDestinationWarehouseId(); + parcelList.setAcceptWarehouseId(destinationWarehouseId); + parcelList.setAcceptWarehouseName(waybillEntity.getDestinationWarehouseName()); + if(warehouseId.equals(destinationWarehouseId)){ + parcelList.setIsTransfer(0); + } + + } + } + parcelList.setConditions(1); + parcelList.setOrderPackageCode(orderPackageCode); + parcelList.setFirsts(advanceDetailEntity.getFirstPackName()); + parcelList.setSecond(advanceDetailEntity.getSecondPackName()); + parcelList.setThirdProduct(advanceDetailEntity.getThirdPackName()); + parcelList.setQuantity(1); + parcelList.setStockArticleId(orderId); + parcelList.setOrderCode(orderCode); + parcelList.setServiceNumber(advanceDetailEntity.getServiceNum()); + parcelList.setTrainNumber(trainNumber); + parcelList.setAdvanceId(ad.getAdvanceId()); + + Long materialId = advanceDetailEntity.getMaterialId(); + String materialCode = advanceDetailEntity.getMaterialCode(); + String materialName = advanceDetailEntity.getMaterialName(); + if(Objects.isNull(materialId)){ + if(StringUtil.isNotBlank(materialCode)&& StringUtil.isNotBlank(materialName)){ + BasicMaterialEntity materialEntity = basicMaterialClient.findEntityByCodeAndName(materialCode,materialName); + if(!Objects.isNull(materialEntity)){ + parcelList.setMaterialId(materialEntity.getId()); + parcelList.setMaterialName(materialEntity.getName()); + parcelList.setMaterialCode(materialEntity.getProductCode()); + parcelList.setMaterialUnit(materialEntity.getSpecification()); + } + } + + }else{ + BasicMaterialEntity materialOwnId = basicMaterialClient.getMaterialOwnId(materialId); + if(!Objects.isNull(materialOwnId)){ + parcelList.setMaterialId(materialOwnId.getId()); + parcelList.setMaterialName(materialOwnId.getName()); + parcelList.setMaterialCode(materialOwnId.getProductCode()); + parcelList.setMaterialUnit(materialOwnId.getSpecification()); + } + + } + parcelList.setBrandName(advanceDetailEntity.getBrand()); + parcelList.setOrderPackageStatus("20"); + parcelList.setOrderPackageFreezeStatus("10"); + parcelList.setOrderPackageGroundingStatus("10"); + parcelList.setOrderPackageStockupStatus("10"); + parcelList.setOrderPackageReservationStatus("10"); + parcelList.setOrderPackageLoadingStatus("10"); + parcelList.setWarehouseEntryTimeEnd(date); + parcelList.setDealerCode(stockArticleEntity.getDealerCode()); + parcelList.setDealerName(stockArticleEntity.getDealerName()); + parcelListEntityList.add(parcelList); + } + }); + } + }); + + parcelListClient.addBatch(parcelListEntityList); + + //把parcelListEntityList中所有元素以waubillId分组 + Map> parcelListEntityMap = parcelListEntityList.stream().filter(pl->!Objects.isNull(pl.getWaybillNumber())).collect(Collectors.groupingBy(DistributionParcelListEntity::getWaybillNumber)); + + List updateWaybillList = new ArrayList<>(); + parcelListEntityMap.keySet().forEach(waybillNo->{ + WarehouseWaybillEntity updateWaybill = new WarehouseWaybillEntity(); + WarehouseWaybillEntity waybillEntity = finalWaybillEntityMap.get(waybillNo); + + if(!Objects.isNull(waybillEntity)){ + List pl = parcelListEntityMap.get(waybillNo); + Integer size = 0; + if(!pl.isEmpty()){ + size = pl.size(); + } + updateWaybill.setId(waybillEntity.getId()); + updateWaybill.setStockCount(waybillEntity.getStockCount() + size); +// updateWaybill.setBillladingNum(waybillEntity.getBillladingNum() + size); + updateWaybillList.add(updateWaybill); + } + }); + + if(!updateWaybillList.isEmpty()){ + warehouseWaybillClient.updateList(updateWaybillList); + } + + orderCodeSet.forEach(orderCode->{ + stockArticleClient.updateOrderInfo(orderCode,warehouseId); + }); + + +// String orderPackageCode = advanceDetailEntity.getOrderPackageCode(); +// String orderCode = advanceDetailEntity.getOrderCode(); +// Long advanceId = advanceDetailEntity.getAdvanceId(); +// String tenantId = advanceDetailEntity.getTenantId(); +// log.info("############saveOrderAndPackage: 保存订单和包件信息 orderPackageCode={}",orderPackageCode); +// +// BasicdataWarehouseEntity warehouseEntity = basicdataWarehouseClient.getEntityWarehouseId(warehouseId); +// if(Objects.isNull(warehouseEntity)){ +// log.warn("############saveOrderAndPackage: 仓库信息不存在warehouseId={}",warehouseId); +// throw new CustomerException(405,"仓库信息不存在"); +// } +// +// //1.判断包件是否已经存在 +// DistributionParcelListEntity parcelListEntity = parcelListClient.findByPacketBarCodeAndWarehouseId(orderPackageCode, warehouseId); +// if(!Objects.isNull(parcelListEntity)){ +// log.warn("############saveOrderAndPackage: 包件信息已存在 orderPackageCode={} warehouseId={}",orderPackageCode,warehouseId); +// return true; +// } +// +// TrunklineAdvanceEntity advanceEntity = getById(advanceId); +// if(Objects.isNull(advanceEntity)){ +// log.warn("############saveOrderAndPackage: 暂存单信息不存在 advanceId={} warehouseId={}",advanceId,warehouseId); +// throw new CustomerException(405,"暂存单信息不存在"); +// } +// +// Long userId = AuthUtil.getUserId(); +// Long deptId = null; +// String deptIds = AuthUtil.getDeptId(); +// String[] split = deptIds.split(","); +// if(Objects.isNull(userId)){ +// userId = advanceDetailEntity.getCreateUser(); +// } +// if(CollUtil.isEmpty(Arrays.asList(split))){ +// deptId = Long.parseLong(split[0]); +// } +// if(Objects.isNull(deptId)){ +// userId = advanceDetailEntity.getCreateDept(); +// } +// +// //2.查询订单信息 +// int total = baseMapper.getAllTotalNum(orderCode); +// +// Date date = new Date(); +// Long orderId = null; +// DistributionStockArticleEntity stockArticleEntity = stockArticleClient.findStockArticleByOrderCodeAndWarehouseId(orderCode, warehouseId); +// if(Objects.isNull(stockArticleEntity)){ +// log.info("#############saveOrderAndPackage: 订单信息为空,同步订单信息"); +// //订单信息为空 +// String waybillNo = advanceEntity.getWaybillNo(); +// +// stockArticleEntity = new DistributionStockArticleEntity(); +// stockArticleEntity.setTenantId(tenantId); +// stockArticleEntity.setCreateUser(userId); +// stockArticleEntity.setUpdateUser(userId); +// stockArticleEntity.setCreateDept(deptId); +// stockArticleEntity.setOrderCode(orderCode); +// stockArticleEntity.setServiceNumber(advanceEntity.getServiceNum()); +// stockArticleEntity.setWaybillNumber(waybillNo); +// stockArticleEntity.setTotalNumber(total); +// stockArticleEntity.setHandQuantity(0); +//// stockArticleEntity.setTenantId(TenantNum.HUITONGCODE);// 对应租户ID +// stockArticleEntity.setWarehouse(warehouseEntity.getName()); +// stockArticleEntity.setWarehouseId(warehouseId); +// stockArticleEntity.setBrand(advanceEntity.getBrand()); +// stockArticleEntity.setDescriptionGoods(advanceEntity.getPackName()); +// stockArticleEntity.setWarehouseEntryTime(date); +// stockArticleEntity.setGenre(1); +// +// String dealerName = advanceEntity.getDealerName();//暂存单经销商名称 +// stockArticleEntity.setDealerCode(advanceEntity.getDealerCode()); +// stockArticleEntity.setDealerName(advanceEntity.getDealerName()); +// +// stockArticleEntity.setTypeService("1");//默认商配 +// +// if(!StringUtil.isBlank(waybillNo)){ +// WarehouseWaybillEntity waybillEntity = warehouseWaybillClient.findByWaybillNo(waybillNo); +// if(!Objects.isNull(waybillEntity)){ +// Long consigneeId = waybillEntity.getConsigneeId(); +// +// BasicdataClientEntity clientEntity = basicdataClientClient.findEntityById(consigneeId); +// if(!Objects.isNull(clientEntity)){ +// stockArticleEntity.setMallId(clientEntity.getId()); +// stockArticleEntity.setMallName(clientEntity.getClientName()); +// stockArticleEntity.setMallCode(clientEntity.getClientCode()); +// } +// String consignee = waybillEntity.getConsignee(); +// String consigneeName = waybillEntity.getConsigneeName(); +// String consigneeMobile = waybillEntity.getConsigneeMobile(); +// String consigneeAddress = waybillEntity.getConsigneeAddress(); +// stockArticleEntity.setConsigneeUnit(consignee); +// stockArticleEntity.setConsigneePerson(consigneeName); +// stockArticleEntity.setConsigneeMobile(consigneeMobile); +// stockArticleEntity.setConsigneeAddress(consigneeAddress); +// +// BasicdataStoreBusinessEntity basicdataStoreBusinessEntity = basicdataStoreBusinessClient.findByClientIdAndTypeService(consigneeId, 3); +// if(!Objects.isNull(basicdataStoreBusinessEntity)){ +// stockArticleEntity.setTypeService(basicdataStoreBusinessEntity.getMold()); +// } +// } +// }else{ +// Long clientId = basicdataTripartiteMallClient.getClientIdByNameAndBrand(dealerName, advanceEntity.getBrand()); +// BasicdataClientEntity basicdataClientEntity = basicdataClientClient.findEntityById(clientId); +// if(!Objects.isNull(basicdataClientEntity)){ +// String clientType = basicdataClientEntity.getClientType(); +// if("5".equals(clientType)){ +// stockArticleEntity.setStoreId(basicdataClientEntity.getId()); +// stockArticleEntity.setStoreCode(basicdataClientEntity.getClientCode()); +// stockArticleEntity.setStoreName(basicdataClientEntity.getClientName()); +// //查询门店的父级商场 +// Long pid = basicdataClientEntity.getPid(); +// BasicdataClientEntity pidEntity = basicdataClientClient.findEntityById(pid); +// if(!Objects.isNull(pidEntity)){ +// String pidEntityClientType = pidEntity.getClientType(); +// if("2".equals(pidEntityClientType)){ +// //商城 +// stockArticleEntity.setMallId(pidEntity.getId()); +// stockArticleEntity.setMallName(pidEntity.getClientName()); +// stockArticleEntity.setMallCode(pidEntity.getClientCode()); +// +// BasicdataStoreBusinessEntity basicdataStoreBusinessEntity = basicdataStoreBusinessClient.findByClientIdAndTypeService(pidEntity.getId(), 3); +// if(!Objects.isNull(basicdataStoreBusinessEntity)){ +// stockArticleEntity.setTypeService(basicdataStoreBusinessEntity.getMold()); +// } +// } +// } +// }else if("2".equals(clientType)){ +// //商城 +// stockArticleEntity.setMallId(basicdataClientEntity.getId()); +// stockArticleEntity.setMallName(basicdataClientEntity.getClientName()); +// stockArticleEntity.setMallCode(basicdataClientEntity.getClientCode()); +// +// BasicdataStoreBusinessEntity basicdataStoreBusinessEntity = basicdataStoreBusinessClient.findByClientIdAndTypeService(basicdataClientEntity.getId(), 3); +// if(!Objects.isNull(basicdataStoreBusinessEntity)){ +// stockArticleEntity.setTypeService(basicdataStoreBusinessEntity.getMold()); +// } +// } +// } +// } +// +// stockArticleEntity.setCustomerName(advanceEntity.getCustomerName()); +// stockArticleEntity.setCustomerTelephone(advanceEntity.getCustomerPhone()); +// stockArticleEntity.setCustomerAddress(advanceEntity.getCustomerAddress()); +// stockArticleEntity.setStockupStatus("10"); +// stockArticleEntity.setReservationStatus("10"); +// stockArticleEntity.setOrderStatus("0"); +// stockArticleEntity.setGroundingStatus("10"); +// stockArticleEntity.setOrderReceiveStatus("10"); +// stockArticleEntity.setFreezeStatus("10"); +// stockArticleEntity.setNotification(2); +// stockArticleEntity.setIsHaveData(2); +// stockArticleEntity.setTrainNumber(advanceEntity.getTrainNumber()); +// stockArticleEntity.setSortingQuantity(0); +// stockArticleEntity.setDeliveryQuantity(0); +// stockArticleEntity.setTransferQuantity(0); +// stockArticleEntity.setSigninQuantity(0); +// orderId = stockArticleClient.addData(stockArticleEntity); +// }else{ +// +// stockArticleEntity.setTotalNumber(total); +// stockArticleClient.saveOrUpdate(stockArticleEntity); +// orderId = stockArticleEntity.getId(); +// } +// if(Objects.isNull(orderId)){ +// log.warn("##############saveOrderAndPackage: 订单信息有误 orderId={}",orderId); +// throw new CustomerException(405,"订单信息有误"); +// } +// log.info("#############saveOrderAndPackage: 订单信息保存成功 orderId={}",orderId); +// +// //保存包件信息 +// DistributionParcelListEntity parcelList = new DistributionParcelListEntity(); +// parcelList.setCreateUser(userId); +// parcelList.setUpdateUser(userId); +// parcelList.setCreateDept(deptId); +// parcelList.setTenantId(tenantId); +// parcelList.setWarehouse(warehouseEntity.getName()); +// parcelList.setWarehouseId(warehouseId); +// parcelList.setIsTransfer(1); +// String waybillNo = advanceEntity.getWaybillNo(); +// if(StringUtil.isNotBlank(waybillNo)){ +// WarehouseWaybillEntity waybillEntity = warehouseWaybillClient.findByWaybillNo(waybillNo); +// if(!Objects.isNull(waybillEntity)){ +// parcelList.setWaybillId(waybillEntity.getId()); +// parcelList.setWaybillNumber(waybillEntity.getWaybillNo()); +// parcelList.setSendWarehouseId(waybillEntity.getDepartureWarehouseId()); +// parcelList.setSendWarehouseName(waybillEntity.getDepartureWarehouseName()); +// Long destinationWarehouseId = waybillEntity.getDestinationWarehouseId(); +// parcelList.setAcceptWarehouseId(destinationWarehouseId); +// parcelList.setAcceptWarehouseName(waybillEntity.getDestinationWarehouseName()); +// if(warehouseId.equals(destinationWarehouseId)){ +// parcelList.setIsTransfer(0); +// } +// } +// } +// parcelList.setConditions(1); +// parcelList.setOrderPackageCode(advanceDetailEntity.getOrderPackageCode()); +// parcelList.setFirsts(advanceDetailEntity.getFirstPackName()); +// parcelList.setSecond(advanceDetailEntity.getSecondPackName()); +// parcelList.setThirdProduct(advanceDetailEntity.getThirdPackName()); +// parcelList.setQuantity(1); +// parcelList.setStockArticleId(orderId); +// parcelList.setOrderCode(orderCode); +// parcelList.setServiceNumber(advanceDetailEntity.getServiceNum()); +// parcelList.setTrainNumber(advanceEntity.getTrainNumber()); +// parcelList.setAdvanceId(advanceId); +// +// Long materialId = advanceDetailEntity.getMaterialId(); +// String materialCode = advanceDetailEntity.getMaterialCode(); +// String materialName = advanceDetailEntity.getMaterialName(); +// if(Objects.isNull(materialId)){ +// BasicMaterialEntity materialEntity = basicMaterialClient.findEntityByCodeAndName(materialCode,materialName); +// if(!Objects.isNull(materialEntity)){ +// parcelList.setMaterialId(materialEntity.getId()); +// parcelList.setMaterialName(materialEntity.getName()); +// parcelList.setMaterialCode(materialEntity.getProductCode()); +// parcelList.setMaterialUnit(materialEntity.getSpecification()); +// } +// }else{ +// BasicMaterialEntity materialOwnId = basicMaterialClient.getMaterialOwnId(materialId); +// if(!Objects.isNull(materialOwnId)){ +// parcelList.setMaterialId(materialOwnId.getId()); +// parcelList.setMaterialName(materialOwnId.getName()); +// parcelList.setMaterialCode(materialOwnId.getProductCode()); +// parcelList.setMaterialUnit(materialOwnId.getSpecification()); +// } +// +// } +// parcelList.setBrandName(advanceDetailEntity.getBrand()); +// parcelList.setOrderPackageStatus("20"); +// parcelList.setOrderPackageFreezeStatus("10"); +// parcelList.setOrderPackageGroundingStatus("10"); +// parcelList.setOrderPackageStockupStatus("10"); +// parcelList.setOrderPackageReservationStatus("10"); +// parcelList.setOrderPackageLoadingStatus("10"); +// parcelList.setWarehouseEntryTimeEnd(date); +// parcelList.setDealerCode(stockArticleEntity.getDealerCode()); +// parcelList.setDealerName(stockArticleEntity.getDealerName()); +// Long orderPackageId = parcelListClient.addReturnId(parcelList); +// if(!Objects.isNull(orderPackageId)){ +// log.info("################saveOrderAndPackage: 包件信息保存成功 OrderPackageCode={}",advanceDetailEntity.getOrderPackageCode()); +// //1.修改订单在库件数和最后入库时间和入库状态 +// +//// List parcelListEntityList = parcelListClient.findEntityListByOrderCode(orderCode, warehouseId); +//// int size = parcelListEntityList.size(); +//// Integer totalNumber = stockArticleEntity.getTotalNumber();//总件数 +//// Integer handQuantity = stockArticleEntity.getHandQuantity();//在库件数 +//// Integer incomingNum = stockArticleEntity.getIncomingNum();//入库件数 +//// +//// if(size == 1){ +//// stockArticleEntity.setWarehouseEntryTime(date); +//// stockArticleEntity.setWarehouseEntryTimeEnd(new Date()); +//// stockArticleEntity.setHandQuantity(handQuantity+1); +//// stockArticleEntity.setIncomingNum(incomingNum+1); +//// }else{ +//// stockArticleEntity.setWarehouseEntryTimeEnd(new Date()); +//// stockArticleEntity.setHandQuantity(handQuantity+1); +//// stockArticleEntity.setIncomingNum(incomingNum+1); +//// } +//// +//// if(incomingNum+1 < totalNumber){ +//// stockArticleEntity.setOrderStatus("10"); +//// }else{ +//// stockArticleEntity.setOrderStatus("20"); +//// } +//// stockArticleClient.saveOrUpdate(stockArticleEntity); +// } +// log.info("#############saveOrderAndPackage: 订单包件信息保存完成 OrderPackageCode={}",advanceDetailEntity.getOrderPackageCode()); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean cancelOrder(String orderCode) { + List list = advanceDetailService.list(Wrappers.lambdaQuery() + .eq(TrunklineAdvanceDetailEntity::getOrderCode, orderCode) + .and( + wrapper -> wrapper.eq(TrunklineAdvanceDetailEntity::getPackageStatus, "1") + .or().isNotNull(TrunklineAdvanceDetailEntity::getWaybillNo) + ) + ); + if (CollUtil.isNotEmpty(list)) { + return Boolean.FALSE; + } + if(StrUtil.isNotEmpty(orderCode)){ + baseMapper.deletedAdvanceByOrderCode(orderCode); + } + advanceDetailService.deletedAdvanceByOrderCode(orderCode); + return Boolean.TRUE; + } + + @Override + public void deleteByWaybillNo(String waybillNo) { + baseMapper.deleteByWaybillNo(waybillNo); + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingPackageServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingPackageServiceImpl.java index 314454082..8915d20bb 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingPackageServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingPackageServiceImpl.java @@ -1,5 +1,6 @@ package com.logpm.trunkline.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; @@ -12,18 +13,21 @@ import com.logpm.trunkline.vo.TrunklineBillladingPackageVO; import com.logpm.warehouse.entity.WarehouseWaybillEntity; import com.logpm.warehouse.feign.IWarehouseWaybillClient; import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.IncomingTypeEnum; +import org.springblade.common.constant.WaybillStatusEnum; import org.springblade.common.exception.CustomerException; import org.springblade.common.utils.CommonUtil; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; @Slf4j @Service @@ -41,6 +45,8 @@ public class TrunklineBillladingPackageServiceImpl extends BaseServiceImpl findBillladingPackages(List orderPackageCodes) { + List billladingPackages = baseMapper.findBillladingPackages(orderPackageCodes); + orderPackageCodes.removeAll(billladingPackages); + return orderPackageCodes; + } + + @Override + public void saveEntityBatch(List noOrderPackageCodes, Long billladingId, Long warehouseId, Integer incomingType) { + log.info("################saveEntityBatch: 包件绑定提货单 noOrderPackageCodes={} billladingId={}",noOrderPackageCodes,billladingId); + + BasicdataWarehouseEntity warehouseEntity = basicdataWarehouseClient.getEntityWarehouseId(warehouseId); + if(Objects.isNull(warehouseEntity)){ + log.warn("############saveEntityBatch: 仓库信息不存在warehouseId={}",warehouseId); + throw new CustomerException(405,"仓库信息不存在"); + } + + TrunklineBillladingEntity trunklineBillladingEntity = trunklineBillladingService.getById(billladingId); + if(Objects.isNull(trunklineBillladingEntity)){ + log.warn("############saveEntityBatch: 提货单不存在 billladingId={}",billladingId); + throw new CustomerException(405,"提货单不存在"); + } + + QueryWrapper advanceDetailEntityQueryWrapper = new QueryWrapper<>(); + advanceDetailEntityQueryWrapper.in("order_package_code",noOrderPackageCodes); + + List advanceDetailList = trunklineAdvanceDetailService.list(advanceDetailEntityQueryWrapper); + if(advanceDetailList.isEmpty()){ + log.warn("############saveEntityBatch: 包件信息不存在 noOrderPackageCodes={}",noOrderPackageCodes); + throw new CustomerException(405,"包件信息不存在"); + } + + List billladingPackageEntities = new ArrayList<>(); + Set advanceIdsSet = new HashSet<>(); + advanceDetailList.forEach(advanceDetailEntity -> { + //1.保存入库包件明细 + advanceIdsSet.add(advanceDetailEntity.getAdvanceId()); + TrunklineBillladingPackageEntity billladingPackageEntity = new TrunklineBillladingPackageEntity(); + billladingPackageEntity.setWarehouseId(warehouseId); + billladingPackageEntity.setWarehouseName(warehouseEntity.getName()); + billladingPackageEntity.setOrderPackageCode(advanceDetailEntity.getOrderPackageCode()); + billladingPackageEntity.setBillladingId(billladingId); + billladingPackageEntity.setCreateUserName(AuthUtil.getNickName()); + billladingPackageEntity.setIncomingType(incomingType); + billladingPackageEntities.add(billladingPackageEntity); + }); + saveBatch(billladingPackageEntities); + + //查出所有入库包件对应的暂存单 + QueryWrapper advanceEntityQueryWrapper = new QueryWrapper<>(); + advanceEntityQueryWrapper.in("id",advanceIdsSet); + List advanceEntities = trunklineAdvanceService.list(advanceEntityQueryWrapper); + + //把所有暂存单已开单的运单号提取出来 + //把advanceEntities所有元素的waybillNo放入一个Set + Set waybillNoSet = advanceEntities.stream().filter(advanceEntity -> !StringUtil.isEmpty(advanceEntity.getWaybillNo())).map(TrunklineAdvanceEntity::getWaybillNo).collect(Collectors.toSet()); + + //所有已开单暂存单运单信息 + Map waybillEntityMap = new HashMap<>(); + if(!waybillNoSet.isEmpty()){ + List waybillEntityList = warehouseWaybillClient.findWaybillBilllByWaybillNos(new ArrayList<>(waybillNoSet)); + //把waybillEntityList转化成waybillNo为key的Map + waybillEntityMap = waybillEntityList.stream().collect(Collectors.toMap(WarehouseWaybillEntity::getWaybillNo, Function.identity())); + } + + + //所有暂存单信息 + //把advanceEntities转成以id为key的Map + Map advanceEntityMap = advanceEntities.stream().collect(Collectors.toMap(TrunklineAdvanceEntity::getId, Function.identity())); + + //把这次所有入库的包件根据暂存单id进行分组 + //把advanceDetailList中的所有元素的advanceId分组 + Map> advanceIdGroupedEntities = advanceDetailList.stream() + .collect(Collectors.groupingBy(TrunklineAdvanceDetailEntity::getAdvanceId)); + + //把没开单的暂存单包件放在一起 + List noWaybillList = new ArrayList<>(); + + Map waybillNoMNumMap = new HashMap<>(); + Map finalWaybillEntityMap = waybillEntityMap; + advanceEntityMap.keySet().forEach(advanceId -> { + TrunklineAdvanceEntity advanceEntity = advanceEntityMap.get(advanceId); + List advanceDetailEntities = advanceIdGroupedEntities.get(advanceId); + String waybillNo = advanceEntity.getWaybillNo(); + if(StringUtil.isNotBlank(waybillNo)){ + int size = advanceDetailEntities.size();//入库件数 + WarehouseWaybillEntity waybillEntity = finalWaybillEntityMap.get(waybillNo); + if(!Objects.isNull(waybillEntity)){ + Integer stockCount = waybillEntity.getStockCount(); + Integer totalCount = waybillEntity.getTotalCount(); + Integer billladingNum = waybillEntity.getBillladingNum(); + if(Objects.isNull(stockCount)){ + stockCount = 0; + } + int diff = 0; + int all = stockCount + size; + if(all > totalCount){ + diff = totalCount - stockCount; + }else{ + diff = size; + } + Integer integer = waybillNoMNumMap.get(waybillNo); + if(Objects.isNull(integer)){ + waybillNoMNumMap.put(waybillNo,diff); + }else{ + waybillNoMNumMap.put(waybillNo,diff+integer); + } + + finalWaybillEntityMap.put(waybillNo,waybillEntity); + } + }else{ + noWaybillList.addAll(advanceDetailEntities); + } + }); + + Map billladingWaybillEntityMap = new HashMap<>(); + if(!waybillNoSet.isEmpty()){ + QueryWrapper billladingWaybillEntityQueryWrapper = new QueryWrapper<>(); + billladingWaybillEntityQueryWrapper.in("waybill_no",waybillNoSet) + .eq("billlading_id",billladingId) + .eq("is_deleted",0); + + List billladingWaybillEntityList = trunklineBillladingWaybillService.list(billladingWaybillEntityQueryWrapper); + + //把billladingWaybillEntityList转化成waybillNo为key的Map + billladingWaybillEntityMap = billladingWaybillEntityList.stream().collect(Collectors.toMap(TrunklineBillladingWaybillEntity::getWaybillNo, Function.identity())); + } + + + List updateList = new ArrayList<>(); + + TrunklineBillladingWaybillEntity noWaybillNoData = trunklineBillladingWaybillService.findNoWaybillNoData(billladingId); + + if(CollUtil.isNotEmpty(noWaybillList)){ + int size = noWaybillList.size(); + if(Objects.isNull(noWaybillNoData)){ + noWaybillNoData = new TrunklineBillladingWaybillEntity(); + noWaybillNoData.setWarehouseId(warehouseId); + noWaybillNoData.setWarehouseName(warehouseEntity.getName()); + noWaybillNoData.setBillladingId(billladingId); + noWaybillNoData.setBilladingCode(trunklineBillladingEntity.getBillladingCode()); + noWaybillNoData.setWaybillNo("————"); + noWaybillNoData.setRealNum(size); + noWaybillNoData.setRealWeight(BigDecimal.ZERO); + noWaybillNoData.setRealVolume(BigDecimal.ZERO); + }else{ + Integer realNum = noWaybillNoData.getRealNum(); + noWaybillNoData.setRealNum(realNum+size); + } + } + + + + for (String waybillNo : waybillNoSet) { + Integer integer = waybillNoMNumMap.get(waybillNo); + TrunklineBillladingWaybillEntity billladingWaybillEntity = billladingWaybillEntityMap.get(waybillNo); + if(Objects.isNull(billladingWaybillEntity)){ + //查询是否有一条无运单的数据 + if(Objects.isNull(noWaybillNoData)){ + noWaybillNoData = new TrunklineBillladingWaybillEntity(); + noWaybillNoData.setWarehouseId(warehouseId); + noWaybillNoData.setWarehouseName(warehouseEntity.getName()); + noWaybillNoData.setBillladingId(billladingId); + noWaybillNoData.setBilladingCode(trunklineBillladingEntity.getBillladingCode()); + noWaybillNoData.setWaybillNo("————"); + noWaybillNoData.setRealNum(integer); + noWaybillNoData.setRealWeight(BigDecimal.ZERO); + noWaybillNoData.setRealVolume(BigDecimal.ZERO); + }else{ + Integer realNum = noWaybillNoData.getRealNum(); + noWaybillNoData.setRealNum(realNum+integer); + } + } + + } + + if(!Objects.isNull(noWaybillNoData)){ + trunklineBillladingWaybillService.saveOrUpdate(noWaybillNoData); + } + +// if(!updateList.isEmpty()){ +// trunklineBillladingWaybillService.updateBatchById(updateList); +// } + + + TrunklineBillladingEntity billladingEntity = trunklineBillladingService.getById(billladingId); + if(!Objects.isNull(billladingEntity)){ + int realNum = billladingEntity.getRealNum(); + int all = advanceDetailList.size(); + + billladingEntity.setRealNum(realNum+all); + trunklineBillladingService.updateById(billladingEntity); + } + + List warehouseWaybillEntities = new ArrayList<>(); + finalWaybillEntityMap.keySet().forEach(waybillNo -> { + WarehouseWaybillEntity waybillEntity = finalWaybillEntityMap.get(waybillNo); + if(!Objects.isNull(waybillEntity)){ + Integer totalCount = waybillEntity.getTotalCount(); + Integer stockCount = waybillEntity.getStockCount(); + if(stockCount.equals(totalCount)){ + waybillEntity.setWaybillStatus(WaybillStatusEnum.RUKU.getCode()); + try{ + TrunklineWaybillTrackEntity waybillTrackEntity = new TrunklineWaybillTrackEntity(); + waybillTrackEntity.setWarehouseId(warehouseId); + waybillTrackEntity.setWarehouseName(warehouseEntity.getName()); + waybillTrackEntity.setWaybillId(waybillEntity.getId()); + waybillTrackEntity.setWaybillNo(waybillEntity.getWaybillNo()); + waybillTrackEntity.setTrackType("20"); + waybillTrackEntity.setRefer("已入库"); + waybillTrackEntity.setOperationRemark("运单入库:"+stockCount+"/"+totalCount+",入库类型:【"+ IncomingTypeEnum.getValue(incomingType) +"】,入库时间:"+ CommonUtil.dateToString(new Date())); + trunklineWaybillTrackService.save(waybillTrackEntity); + }catch (Exception e){ + log.warn("#################updateBillladingWaybillNum: 存入日志失败"); + } + }else{ + waybillEntity.setWaybillStatus(WaybillStatusEnum.BUFENRUKU.getCode()); + } + warehouseWaybillEntities.add(waybillEntity); + } + }); + warehouseWaybillClient.updateList(warehouseWaybillEntities); + + //根据提货单id重新计算每个运单的费用 +// trunklineBillladingWaybillService.updateBillladingFeeByBillladingId(billladingEntity); + + + //--------------------------------------分割线------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq("order_package_code",orderPackageCode); +// TrunklineBillladingPackageEntity billladingPackageEntity = baseMapper.selectOne(queryWrapper); +// if(!Objects.isNull(billladingPackageEntity)){ +// log.warn("####################saveEntity: 包件已入库 orderPackageCode={}",orderPackageCode); +// throw new CustomerException(405,"包件已入库"); +// } +// +// +// +// //2.判断运单是否需要加上数量 +// List ls = trunklineBillladingWaybillService.findWaybillOrderByBillladingId(billladingId,advanceId); +// int size = ls.size(); +// if(size != 0){ +// TrunklineWaybillOrderEntity trunklineWaybillOrderEntity = ls.get(0); +// Long waybillId = trunklineWaybillOrderEntity.getWaybillId(); +// //查询该运单对应的所有订单的一个总数量 +// WarehouseWaybillEntity waybillEntity = warehouseWaybillClient.findByWaybillId(waybillId); +// Integer allTotalNum = waybillEntity.getTotalCount(); +// //查询运单已提货的数量 +// Integer finishNum = waybillEntity.getStockCount(); +// +// //计算数量是否正确 +// if(finishNum+1 > allTotalNum){ +// log.warn("####################saveEntity: 运单提货已完成,无法增加提货数量 finishNum={} allTotalNum={}",finishNum,allTotalNum); +// throw new CustomerException(405,"运单提货已完成,无法增加提货数量"); +// } +// +// TrunklineBillladingWaybillEntity billladingWaybillEntity = trunklineBillladingWaybillService.findEntityByWaybillIdAndBillladingId(waybillId,billladingId); +// if(Objects.isNull(billladingWaybillEntity)){ +// log.warn("####################saveEntity: 提货运单信息有误 waybillId={} billladingId={}",waybillId,billladingId); +// throw new CustomerException(405,"提货运单信息有误"); +// } +// Integer realNum = billladingWaybillEntity.getRealNum(); +// billladingWaybillEntity.setRealNum(realNum+1); +// trunklineBillladingWaybillService.updateById(billladingWaybillEntity); +// waybillEntity.setStockCount(finishNum+1); +// +// if(allTotalNum.equals(waybillEntity.getStockCount())){ +// waybillEntity.setWaybillStatus("20"); +// try{ +// TrunklineWaybillTrackEntity waybillTrackEntity = new TrunklineWaybillTrackEntity(); +// waybillTrackEntity.setWarehouseId(warehouseId); +// waybillTrackEntity.setWarehouseName(warehouseEntity.getName()); +// waybillTrackEntity.setWaybillId(waybillId); +// waybillTrackEntity.setWaybillNo(waybillEntity.getWaybillNo()); +// waybillTrackEntity.setTrackType("20"); +// waybillTrackEntity.setRefer("已入库"); +// waybillTrackEntity.setOperationRemark("运单入库:"+waybillEntity.getStockCount()+"/"+allTotalNum+",入库类型:【批量入库】,入库时间:"+ CommonUtil.dateToString(new Date())); +// trunklineWaybillTrackService.save(waybillTrackEntity); +// }catch (Exception e){ +// log.warn("#################updateBillladingWaybillNum: 存入日志失败"); +// } +// }else{ +// waybillEntity.setWaybillStatus("10"); +// } +// +// warehouseWaybillClient.updateEntity(waybillEntity); +// +// }else{ +// //查询是否有一条无运单的数据 +// TrunklineBillladingWaybillEntity noWaybillData = trunklineBillladingWaybillService.findNoWaybillNoData(billladingId); +// if(Objects.isNull(noWaybillData)){ +// noWaybillData = new TrunklineBillladingWaybillEntity(); +// noWaybillData.setWarehouseId(warehouseId); +// noWaybillData.setWarehouseName(warehouseEntity.getName()); +// noWaybillData.setBillladingId(billladingId); +// noWaybillData.setBilladingCode(trunklineBillladingEntity.getBillladingCode()); +// noWaybillData.setWaybillNo("————"); +// noWaybillData.setRealNum(1); +// noWaybillData.setRealWeight(BigDecimal.ZERO); +// noWaybillData.setRealVolume(BigDecimal.ZERO); +// trunklineBillladingWaybillService.save(noWaybillData); +// }else{ +// Integer realNum = noWaybillData.getRealNum(); +// noWaybillData.setRealNum(realNum+1); +// trunklineBillladingWaybillService.updateById(noWaybillData); +// } +// } +// +// int rn = trunklineBillladingEntity.getRealNum(); +// trunklineBillladingEntity.setRealNum(rn+1); +// trunklineBillladingService.updateById(trunklineBillladingEntity); + + + } + + @Override + public List findListByBillladingAndWaybillId(Long billladingId, Long waybillId) { + return baseMapper.findListByBillladingAndWaybillId(billladingId,waybillId); + } + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingServiceImpl.java index 7bc2dd9ae..ba5a808bf 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingServiceImpl.java @@ -1,5 +1,8 @@ package com.logpm.trunkline.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -15,6 +18,7 @@ import com.logpm.warehouse.feign.IWarehouseWaybillClient; import com.logpm.warehouse.vo.WarehouseWaybillVO; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.DictBizConstant; import org.springblade.common.exception.CustomerException; import org.springblade.common.utils.CommonUtil; import org.springblade.core.mp.base.BaseServiceImpl; @@ -22,6 +26,7 @@ import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.StringUtil; +import org.springblade.system.cache.DictBizCache; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -56,9 +61,7 @@ public class TrunklineBillladingServiceImpl extends BaseServiceImpl pageList = baseMapper.pageList(page,billladingDTO); - - return pageList; + return baseMapper.pageList(page,billladingDTO); } @Override @@ -72,7 +75,7 @@ public class TrunklineBillladingServiceImpl extends BaseServiceImpl saveBillladingWaybillList = new ArrayList<>(); //保存提货运单 List billladingWaybillList = billladingDTO.getBillladingWaybillList(); - for (TrunklineBillladingWaybillVO billladingWaybillVO:billladingWaybillList){ - TrunklineBillladingWaybillEntity billladingWaybillEntity = new TrunklineBillladingWaybillEntity(); - BeanUtil.copy(billladingWaybillVO,billladingWaybillEntity); - billladingWaybillEntity.setBillladingId(billladingId); - billladingWaybillEntity.setBilladingCode(trunklineBillladingEntity.getBillladingCode()); - billladingWaybillEntity.setRealNum(0); - billladingWaybillEntity.setRealWeight(BigDecimal.ZERO); - billladingWaybillEntity.setRealVolume(BigDecimal.ZERO); - billladingWaybillEntity.setBillladingFee(BigDecimal.ZERO); - billladingWaybillService.save(billladingWaybillEntity); + if(CollUtil.isNotEmpty(billladingWaybillList)){ + //把billladingWaybillList中所有元素的waybillId放到一个List + List waybillIdList = billladingWaybillList.stream() + .map(TrunklineBillladingWaybillVO::getWaybillId) + .collect(Collectors.toList()); + //查询运单 + Map waybillEntityMap = new HashMap<>(); + + if(CollUtil.isNotEmpty(waybillIdList)){ + List waybillEntityList = warehouseWaybillClient.findListByWaybillIds(waybillIdList); + //把waybillEntityList转化为waybillId为key的Map + waybillEntityMap = waybillEntityList.stream() + .collect(Collectors.toMap(WarehouseWaybillEntity::getId, waybillEntity -> waybillEntity)); + } + + List updateWaybillList = new ArrayList<>(); + for (TrunklineBillladingWaybillVO billladingWaybillVO:billladingWaybillList){ + Long waybillId = billladingWaybillVO.getWaybillId(); + WarehouseWaybillEntity warehouseWaybillEntity = waybillEntityMap.get(waybillId); + if(!Objects.isNull(warehouseWaybillEntity)){ + Integer noBillladingNum = billladingWaybillVO.getNoBillladingNum(); + Integer billladingNum = warehouseWaybillEntity.getBillladingNum(); + Integer totalCount = warehouseWaybillEntity.getTotalCount(); + if(billladingNum+noBillladingNum > totalCount){ + log.warn("########saveNew1: "+waybillId+"已大于运单总件数"); + continue; + } + warehouseWaybillEntity.setBillladingNum(billladingNum+noBillladingNum); + updateWaybillList.add(warehouseWaybillEntity); + + TrunklineBillladingWaybillEntity billladingWaybillEntity = new TrunklineBillladingWaybillEntity(); + BeanUtil.copy(billladingWaybillVO,billladingWaybillEntity); + billladingWaybillEntity.setBillladingId(billladingId); + billladingWaybillEntity.setBilladingCode(trunklineBillladingEntity.getBillladingCode()); + billladingWaybillEntity.setRealNum(billladingWaybillVO.getNoBillladingNum()); + billladingWaybillEntity.setRealWeight(BigDecimal.ZERO); + billladingWaybillEntity.setRealVolume(BigDecimal.ZERO); + billladingWaybillEntity.setBillladingFee(BigDecimal.ZERO); + saveBillladingWaybillList.add(billladingWaybillEntity); + } + } + billladingWaybillService.saveBatch(saveBillladingWaybillList); + warehouseWaybillClient.updateList(updateWaybillList); } @@ -124,7 +161,7 @@ public class TrunklineBillladingServiceImpl extends BaseServiceImpl pageList = baseMapper.pageInfoList(page,billladingDTO); - - return pageList; + return baseMapper.pageInfoList(page,billladingDTO); } @Override @@ -162,16 +197,18 @@ public class TrunklineBillladingServiceImpl extends BaseServiceImpl oldWaybillBillladingNumMap = new HashMap<>(); + List billladingWaybillVOList = billladingWaybillService.findWaybillInfoListByBillladingId(billladingId); + billladingWaybillVOList.forEach(billladingWaybillVO -> { + oldWaybillBillladingNumMap.put(billladingWaybillVO.getWaybillId(),billladingWaybillVO.getPlanNum()); + }); + + Set oldWaybillIdSet = oldWaybillBillladingNumMap.keySet(); + + List oldWaybillList = warehouseWaybillClient.findListByWaybillIds(new ArrayList<>(oldWaybillIdSet)); + oldWaybillList.forEach(waybillEntity -> { + Long waybillEntityId = waybillEntity.getId(); + Integer planNum = oldWaybillBillladingNumMap.get(waybillEntityId); + if(Objects.isNull(planNum)){ + planNum = 0; + } + Integer billladingNum = waybillEntity.getBillladingNum(); + if(Objects.isNull(billladingNum)){ + billladingNum = 0; + } + waybillEntity.setBillladingNum(Math.max(billladingNum - planNum, 0)); + }); + warehouseWaybillClient.updateList(oldWaybillList); + //先删除所有对应的运单 billladingWaybillService.deletedByBillladingId(billladingId); + Map newWaybillBillladingNumMap = new HashMap<>(); //保存提货运单 List billladingWaybillList = billladingDTO.getBillladingWaybillList(); for (TrunklineBillladingWaybillVO billladingWaybillVO:billladingWaybillList){ String waybillNo = billladingWaybillVO.getWaybillNo(); + Integer planNum = billladingWaybillVO.getPlanNum(); //查询运单以前是否挂在当前提货单下 TrunklineBillladingWaybillEntity one = billladingWaybillService.getOneByBillladingIdAndWaybillNo(billladingId,waybillNo); if(!Objects.isNull(one)){ - billladingWaybillService.updateByBillladingIdAndWaybillNo(billladingId,waybillNo); + billladingWaybillService.updateByBillladingIdAndWaybillNo(billladingId,waybillNo,planNum); }else{ TrunklineBillladingWaybillEntity billladingWaybillEntity = new TrunklineBillladingWaybillEntity(); BeanUtil.copy(billladingWaybillVO,billladingWaybillEntity); @@ -219,106 +282,217 @@ public class TrunklineBillladingServiceImpl extends BaseServiceImpl newWaybillIdSet = newWaybillBillladingNumMap.keySet(); + List newWaybillList = warehouseWaybillClient.findListByWaybillIds(new ArrayList<>(newWaybillIdSet)); + newWaybillList.forEach(waybillEntity -> { + Long waybillEntityId = waybillEntity.getId(); + Integer planNum = newWaybillBillladingNumMap.get(waybillEntityId); + if(Objects.isNull(planNum)){ + planNum = 0; + } + Integer billladingNum = waybillEntity.getBillladingNum(); + if(Objects.isNull(billladingNum)){ + billladingNum = 0; + } + waybillEntity.setBillladingNum(billladingNum + planNum); + }); + warehouseWaybillClient.updateList(newWaybillList); + + logEntity.setAfterOpreation(JSON.toJSONString(billladingEntity)); trunklineBillladingLogService.save(logEntity); } + private String verifyBilllading(TrunklineBillladingEntity billladingEntity, BillladingDTO billladingDTO) { + StringBuilder stringBuilder = new StringBuilder(); + String carNumber = billladingEntity.getCarNumber(); + String newCarNumber = billladingDTO.getCarNumber(); + if(!StringUtil.equals(carNumber,newCarNumber)){ + stringBuilder.append("车牌号:").append(carNumber).append("-->").append(newCarNumber).append(";"); + } + + String driverName = billladingEntity.getDriverName(); + String newDriverName = billladingDTO.getDriverName(); + if(!StringUtil.equals(driverName,newDriverName)){ + stringBuilder.append("司机:").append(driverName).append("-->").append(newDriverName).append(";"); + } + + String driverPhone = billladingEntity.getDriverPhone(); + String newDriverPhone = billladingDTO.getDriverPhone(); + if(!StringUtil.equals(driverPhone,newDriverPhone)){ + stringBuilder.append("司机电话:").append(driverPhone).append("-->").append(newDriverPhone).append(";"); + } + + String carrierName = billladingEntity.getCarrierName(); + String newCarrierName = billladingDTO.getCarrierName(); + if(!StringUtil.equals(carrierName,newCarrierName)){ + stringBuilder.append("承运商:").append(carrierName).append("-->").append(newCarrierName).append(";"); + } + + Integer planNum = billladingEntity.getPlanNum(); + Integer newPlanNum = billladingDTO.getPlanNum(); + if(!ObjectUtil.equals(planNum,newPlanNum)){ + stringBuilder.append("预计件数:").append(planNum).append("-->").append(newPlanNum).append(";"); + } + + BigDecimal planWeight = billladingEntity.getPlanWeight(); + BigDecimal newPlanWeight = billladingDTO.getPlanWeight(); + if(!ObjectUtil.equals(planWeight,newPlanWeight)){ + stringBuilder.append("预计重量:").append(planWeight).append("-->").append(newPlanWeight).append(";"); + } + + BigDecimal planVolume = billladingEntity.getPlanVolume(); + BigDecimal newPlanVolume = billladingDTO.getPlanVolume(); + if(!ObjectUtil.equals(planVolume,newPlanVolume)){ + stringBuilder.append("预计重量:").append(planWeight).append("-->").append(newPlanWeight).append(";"); + } + + String chargeType = billladingEntity.getChargeType(); + String newChargeType = billladingDTO.getChargeType(); + if(!StringUtil.equals(chargeType,newChargeType)){ + stringBuilder.append("计费模式:").append(DictBizCache.getValue(DictBizConstant.BILLLADING_CHARGE_TYPE,chargeType)).append("-->").append(DictBizCache.getValue(DictBizConstant.BILLLADING_CHARGE_TYPE,newChargeType)).append(";"); + } + + BigDecimal totalFee = billladingEntity.getTotalFee(); + BigDecimal newTotalFee = billladingDTO.getTotalFee(); + if(!ObjectUtil.equals(totalFee,newTotalFee)){ + stringBuilder.append("提货费用:").append(totalFee.toPlainString()).append("-->").append(newTotalFee.toPlainString()).append(";"); + } + + String remark = billladingEntity.getRemark(); + String newRemark = billladingDTO.getRemark(); + if(!StringUtil.equals(remark,newRemark)){ + stringBuilder.append("备注:").append(remark).append("-->").append(newRemark).append(";"); + } + + return stringBuilder.toString(); + } + @Override public void updateBillladingStatus(Long billladingId, Integer type,Long warehouseId,String warehouseName) { log.info("#############updateBillladingStatus: 更新提货单状态 type={}",type); TrunklineBillladingEntity billladingEntity = baseMapper.selectById(billladingId); - if(Objects.isNull(billladingEntity)){ - log.warn("##################updateBillladingStatus: 提货单不存在 billladingId={}",billladingId); - throw new CustomerException(405,"提货单不存在"); - } - String billladingCode = billladingEntity.getBillladingCode(); - - StringBuilder stringBuffer = new StringBuilder(); - TrunklineBillladingLogEntity logEntity = new TrunklineBillladingLogEntity(); - logEntity.setWarehouseId(warehouseId); - logEntity.setWarehouseName(warehouseName); - logEntity.setCreateUserName(AuthUtil.getUserName()); - logEntity.setBillladingId(billladingId); - logEntity.setBeforeOpreation(JSONObject.toJSONString(billladingEntity)); - - stringBuffer.append("变更提货单状态 billladingCode=").append(billladingCode); - - - String billladingStatus = billladingEntity.getBillladingStatus(); - //提货单状态 1=未开始,2=提货中,3=已完成,4=已结算 5=已取消 - switch (type){ - case 1://开始提货 - if("1".equals(billladingStatus)){ - billladingEntity.setBillladingStatus("2"); - billladingEntity.setStartTime(new Date()); - stringBuffer.append(",未开始变更为提货中"); - }else{ - log.warn("##################updateBillladingStatus: 提货单不能更新为提货中 billladingStatus={}",billladingStatus); - throw new CustomerException(405,"提货单不能更新为提货中"); - } - break; - case 2://提货完成 - if("2".equals(billladingStatus)){ - billladingEntity.setBillladingStatus("3"); - billladingEntity.setEndTime(new Date()); - stringBuffer.append(",提货中变更为提货完成"); - }else{ - log.warn("##################updateBillladingStatus: 提货单不能更新为已完成 billladingStatus={}",billladingStatus); - throw new CustomerException(405,"提货单不能更新为已完成"); - } - break; - case 3://取消完成 - if("3".equals(billladingStatus)){ - billladingEntity.setBillladingStatus("2"); - billladingEntity.setEndTime(null); - stringBuffer.append(",提货完成变更为提货中"); - }else{ - log.warn("##################updateBillladingStatus: 提货单不能更新为提货中 billladingStatus={}",billladingStatus); - throw new CustomerException(405,"提货单不能更新为提货中"); - } - break; - case 4://结算 - if("3".equals(billladingStatus)){ - Date date = new Date(); - billladingEntity.setBillladingStatus("4"); - billladingEntity.setSettlementTime(date); - billladingEntity.setSettlementId(AuthUtil.getUserId()); - billladingEntity.setSettlementName(AuthUtil.getUserName()); - stringBuffer.append(",提货完成变更为已结算,时间"+ CommonUtil.dateToString(date)+",变更人"+AuthUtil.getUserName()); - }else{ - log.warn("##################updateBillladingStatus: 提货单不能更新为已结算 billladingStatus={}",billladingStatus); - throw new CustomerException(405,"提货单不能更新为提货中"); - } - break; - case 5://取消结算 - if("4".equals(billladingStatus)){ - billladingEntity.setBillladingStatus("3"); - billladingEntity.setSettlementTime(null); - billladingEntity.setSettlementId(null); - billladingEntity.setSettlementName(null); - stringBuffer.append(",已结算变更为提货完成,时间"+ CommonUtil.dateToString(new Date())+",变更人"+AuthUtil.getUserName()); - }else{ - log.warn("##################updateBillladingStatus: 提货单不能更新为提货完成 billladingStatus={}",billladingStatus); - throw new CustomerException(405,"提货单不能更新为提货完成"); - } - break; - case 6://取消提货 - billladingEntity.setBillladingStatus("5"); - stringBuffer.append(",变更为取消提货,时间"+ CommonUtil.dateToString(new Date())+",变更人"+AuthUtil.getUserName()); - break; - default: - log.warn("#############updateBillladingStatus: 未知的更新操作"); - throw new CustomerException(405,"未知的更新操作"); + if (!Objects.isNull(billladingEntity)) { + String billladingCode = billladingEntity.getBillladingCode(); + + StringBuilder stringBuffer = new StringBuilder(); + TrunklineBillladingLogEntity logEntity = new TrunklineBillladingLogEntity(); + logEntity.setWarehouseId(warehouseId); + logEntity.setWarehouseName(warehouseName); + logEntity.setCreateUserName(AuthUtil.getUserName()); + logEntity.setBillladingId(billladingId); + logEntity.setBeforeOpreation(JSON.toJSONString(billladingEntity)); + + stringBuffer.append("变更提货单状态 billladingCode=").append(billladingCode); + + + String billladingStatus = billladingEntity.getBillladingStatus(); + //提货单状态 1=未开始,2=提货中,3=已完成,4=已结算 5=已取消 + switch (type) { + case 1: + //开始提货 + if ("1".equals(billladingStatus)) { + billladingEntity.setBillladingStatus("2"); + billladingEntity.setStartTime(new Date()); + stringBuffer.append(",未开始变更为提货中"); + } else { + log.warn("##################updateBillladingStatus: 提货单不能更新为提货中 billladingStatus={}", billladingStatus); + throw new CustomerException(405, "提货单不能更新为提货中"); + } + break; + case 2: + //提货完成 + if ("2".equals(billladingStatus)) { + billladingEntity.setBillladingStatus("3"); + billladingEntity.setEndTime(new Date()); + stringBuffer.append(",提货中变更为提货完成"); + } else { + log.warn("##################updateBillladingStatus: 提货单不能更新为已完成 billladingStatus={}", billladingStatus); + throw new CustomerException(405, "提货单不能更新为已完成"); + } + break; + case 3: + //取消完成 + if ("3".equals(billladingStatus)) { + billladingEntity.setBillladingStatus("2"); + billladingEntity.setEndTime(null); + stringBuffer.append(",提货完成变更为提货中"); + } else { + log.warn("##################updateBillladingStatus: 提货单不能更新为提货中 billladingStatus={}", billladingStatus); + throw new CustomerException(405, "提货单不能更新为提货中"); + } + break; + case 4: + //结算 + if ("3".equals(billladingStatus)) { + Date date = new Date(); + billladingEntity.setBillladingStatus("4"); + billladingEntity.setSettlementTime(date); + billladingEntity.setSettlementId(AuthUtil.getUserId()); + billladingEntity.setSettlementName(AuthUtil.getUserName()); + stringBuffer.append(",提货完成变更为已结算,时间").append(CommonUtil.dateToString(date)).append(",变更人").append(AuthUtil.getUserName()); + + List billladingWaybillEntities = billladingWaybillService.findNoFinishWaybillByBillladingId(billladingId); + Map map = new HashMap<>(); + billladingWaybillEntities.forEach(billladingWaybillEntity -> { + map.put(billladingWaybillEntity.getWaybillId(),billladingWaybillEntity.getPlanNum() - billladingWaybillEntity.getRealNum()); + }); + + Set waybillIdSet = map.keySet(); + List waybillEntityList = warehouseWaybillClient.findListByWaybillIds(new ArrayList<>(waybillIdSet)); + waybillEntityList.forEach(waybillEntity -> { + Integer integer = map.get(waybillEntity.getId()); + if(Objects.isNull(integer)){ + integer = 0; + } + Integer billladingNum = waybillEntity.getBillladingNum(); + if(Objects.isNull(billladingNum)){ + billladingNum = 0; + } + waybillEntity.setBillladingNum(Math.max(billladingNum - integer, 0)); + }); + warehouseWaybillClient.updateList(waybillEntityList); + + } else { + log.warn("##################updateBillladingStatus: 提货单不能更新为已结算 billladingStatus={}", billladingStatus); + throw new CustomerException(405, "提货单不能更新为提货中"); + } + break; + case 5: + //取消结算 +// if ("4".equals(billladingStatus)) { +// billladingEntity.setBillladingStatus("3"); +// billladingEntity.setSettlementTime(null); +// billladingEntity.setSettlementId(null); +// billladingEntity.setSettlementName(null); +// stringBuffer.append(",已结算变更为提货完成,时间").append(CommonUtil.dateToString(new Date())).append(",变更人").append(AuthUtil.getUserName()); +// } else { +// log.warn("##################updateBillladingStatus: 提货单不能更新为提货完成 billladingStatus={}", billladingStatus); +// throw new CustomerException(405, "提货单不能更新为提货完成"); +// } + break; + case 6: + //取消提货 + billladingEntity.setBillladingStatus("5"); + stringBuffer.append(",变更为取消提货,时间").append(CommonUtil.dateToString(new Date())).append(",变更人").append(AuthUtil.getUserName()); + break; + default: + log.warn("#############updateBillladingStatus: 未知的更新操作"); + throw new CustomerException(405, "未知的更新操作"); + } + //更新状态 + updateById(billladingEntity); + logEntity.setContent(stringBuffer.toString()); + logEntity.setAfterOpreation(JSON.toJSONString(billladingEntity)); + trunklineBillladingLogService.save(logEntity); + } else { + log.warn("##################updateBillladingStatus: 提货单不存在 billladingId={}", billladingId); + throw new CustomerException(405, "提货单不存在"); } - //更新状态 - updateById(billladingEntity); - logEntity.setContent(stringBuffer.toString()); - logEntity.setAfterOpreation(JSONObject.toJSONString(billladingEntity)); - trunklineBillladingLogService.save(logEntity); } @Override @@ -374,61 +548,101 @@ public class TrunklineBillladingServiceImpl extends BaseServiceImpl updateBillladingWaybillList = new ArrayList<>(); + List updateWaybillList = new ArrayList<>(); + for (BillladingWaybillDTO billladingWaybillDTO:billladingWaybillEnterList){ Long billladingWaybillId = billladingWaybillDTO.getBillladingWaybillId(); TrunklineBillladingWaybillEntity billladingWaybillEntity = billladingWaybillService.getById(billladingWaybillId); Long waybillId = billladingWaybillEntity.getWaybillId(); String waybillNo = billladingWaybillEntity.getWaybillNo(); - - Integer tNum = billladingWaybillService.getFinishNumByWaybillIdNotBillladingWaybillId(waybillId,billladingWaybillId); - - //这个运单总件数不应该查询运单上的总件数,应该取统计运单下暂存单的包件数量,因为运单可能会涉及到改单 总数会变 - - Integer totalCount = trunklineWaybillOrderService.getOrderPackageNumByWaybillId(waybillId); + Integer planNum = billladingWaybillEntity.getPlanNum(); + Integer realNum = billladingWaybillEntity.getRealNum(); + BigDecimal realWeight = billladingWaybillEntity.getRealWeight(); + BigDecimal realVolume = billladingWaybillEntity.getRealVolume(); Integer enterNum = billladingWaybillDTO.getEnterNum(); - if(tNum+enterNum > totalCount){ - log.warn("###############updateBillladingWaybillNum: 运单提货数量已经大于总数 waybillId={} totalCount={}",waybillId,totalCount); - throw new CustomerException(405,"【"+waybillNo+"】运单提货数量已经大于总数"); - } - BigDecimal enterWeight = billladingWaybillDTO.getEnterWeight(); BigDecimal enterVolume = billladingWaybillDTO.getEnterVolume(); - stockNum = stockNum + enterNum; - stockWeight = stockWeight.add(enterWeight); - stockVolume = stockVolume.add(enterVolume); - billladingWaybillService.updateDataByBillladingWaybillId(billladingWaybillId,enterNum,enterWeight,enterVolume); - + //查询运单信息 WarehouseWaybillEntity waybillEntity = warehouseWaybillClient.findByWaybillId(waybillId); - waybillEntity.setStockCount(enterNum); - waybillEntity.setStockWeight(enterWeight); - waybillEntity.setStockVolume(enterVolume); - - - if(totalCount.equals(enterNum)){ - waybillEntity.setWaybillStatus("10"); - try{ - TrunklineWaybillTrackEntity waybillTrackEntity = new TrunklineWaybillTrackEntity(); - waybillTrackEntity.setWarehouseId(billladingEntity.getWarehouseId()); - waybillTrackEntity.setWarehouseName(billladingEntity.getWarehouseName()); - waybillTrackEntity.setWaybillId(waybillId); - waybillTrackEntity.setWaybillNo(waybillNo); - waybillTrackEntity.setTrackType("20"); - waybillTrackEntity.setRefer("已入库"); - waybillTrackEntity.setOperationRemark("运单入库:"+enterNum+"/"+totalCount+",入库类型:【批量入库】,入库时间:"+ CommonUtil.dateToString(new Date())); - trunklineWaybillTrackService.save(waybillTrackEntity); - }catch (Exception e){ - log.warn("#################updateBillladingWaybillNum: 存入日志失败"); - } + if(Objects.isNull(waybillEntity)){ + log.warn("#############updateBillladingWaybillNum: 运单信息不存在 waybillId={}",waybillId); + throw new CustomerException(405,"运单"+waybillNo+"信息不存在"); } - warehouseWaybillClient.updateEntity(waybillEntity); + Integer billladingNum = waybillEntity.getBillladingNum(); + int totalCount = waybillEntity.getTotalCount(); + + int tNum =billladingNum+(enterNum-realNum);//最终的提货件数 + if(tNum > totalCount){ + log.warn("#############updateBillladingWaybillNum: 运单{}提货件数已超过总件数 waybillId={}",waybillNo,waybillId); + throw new CustomerException(405,"运单"+waybillNo+"提货件数已超过总件数"); + } + + TrunklineBillladingWaybillEntity updateBillladingWaybillEntity = new TrunklineBillladingWaybillEntity(); + updateBillladingWaybillEntity.setId(billladingWaybillId); + updateBillladingWaybillEntity.setRealNum(enterNum); + updateBillladingWaybillEntity.setRealWeight(enterWeight); + updateBillladingWaybillEntity.setRealVolume(enterVolume); + updateBillladingWaybillList.add(updateBillladingWaybillEntity); + + WarehouseWaybillEntity updateWaybillEntity = new WarehouseWaybillEntity(); + updateWaybillEntity.setId(waybillId); + updateWaybillEntity.setBillladingNum(tNum); + updateWaybillList.add(updateWaybillEntity); + +// Integer tNum = billladingWaybillService.getFinishNumByWaybillIdNotBillladingWaybillId(waybillId,billladingWaybillId); + + //这个运单总件数不应该查询运单上的总件数,应该取统计运单下暂存单的包件数量,因为运单可能会涉及到改单 总数会变 + +// Integer totalCount = trunklineWaybillOrderService.getOrderPackageNumByWaybillId(waybillId); + +// Integer diffNum = enterNum-realNum; +// BigDecimal diffWeight = realWeight.subtract(enterWeight); +// BigDecimal diffVolume = realVolume.subtract(enterVolume); + +// WarehouseWaybillEntity waybillEntity = warehouseWaybillClient.findByWaybillId(waybillId); +// waybillEntity.setStockCount(Math.max(waybillEntity.getStockCount() + diffNum, 0)); +// waybillEntity.setStockWeight(waybillEntity.getStockWeight().add(diffWeight).compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : diffWeight); +// waybillEntity.setStockVolume(waybillEntity.getStockVolume().add(diffVolume).compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : diffVolume); + +// Integer totalCount = waybillEntity.getTotalCount(); +// Integer stockCount = waybillEntity.getStockCount(); + +// if(totalCount.equals(stockCount)){ +// waybillEntity.setWaybillStatus("10"); +// try{ +// TrunklineWaybillTrackEntity waybillTrackEntity = new TrunklineWaybillTrackEntity(); +// waybillTrackEntity.setWarehouseId(billladingEntity.getWarehouseId()); +// waybillTrackEntity.setWarehouseName(billladingEntity.getWarehouseName()); +// waybillTrackEntity.setWaybillId(waybillId); +// waybillTrackEntity.setWaybillNo(waybillNo); +// waybillTrackEntity.setTrackType("20"); +// waybillTrackEntity.setRefer("已入库"); +// waybillTrackEntity.setOperationRemark("运单入库:"+enterNum+"/"+totalCount+",入库类型:【批量入库】,入库时间:"+ CommonUtil.dateToString(new Date())); +// trunklineWaybillTrackService.save(waybillTrackEntity); +// }catch (Exception e){ +// log.warn("#################updateBillladingWaybillNum: 存入日志失败"); +// } +// } +// warehouseWaybillClient.updateEntity(waybillEntity); + } + + if(CollUtil.isNotEmpty(updateBillladingWaybillList)){ + billladingWaybillService.updateBatchById(updateBillladingWaybillList); + } + if(CollUtil.isNotEmpty(updateWaybillList)){ + warehouseWaybillClient.updateList(updateWaybillList); } - billladingEntity.setRealNum(stockNum); - billladingEntity.setRealWeight(stockWeight); - billladingEntity.setRealVolume(stockVolume); + TrunklineBillladingNumVO numVO = billladingWaybillService.getNumVOByBillladingId(billladingId); + + billladingEntity.setRealNum(numVO.getNum()); + billladingEntity.setRealWeight(numVO.getWeight()); + billladingEntity.setRealVolume(numVO.getVolume()); updateById(billladingEntity); billladingWaybillService.updateBillladingFeeByBillladingId(billladingEntity); @@ -451,6 +665,7 @@ public class TrunklineBillladingServiceImpl extends BaseServiceImpl billladingPackageEntities = trunklineBillladingPackageServicie.findListByBillladingAndWaybillId(billladingId,waybillId); + if(CollUtil.isNotEmpty(billladingPackageEntities)){ + int size = billladingPackageEntities.size(); + noWaybillNoBillladingWaybill.setRealNum(realNum-size); + } + billladingWaybillService.updateById(noWaybillNoBillladingWaybill); + } + + + billladingWaybillService.updateBillladingFeeByBillladingId(trunklineBillladingEntity); return R.success("添加成功"); } @@ -529,13 +765,14 @@ public class TrunklineBillladingServiceImpl extends BaseServiceImpl page = new Page<>(); page.setCurrent(pageNum); page.setSize(pageSize); - Map map = baseMapper.billladingNum(warehouseId,CommonUtil.getStartByDateStr(startDateStr),CommonUtil.getEndByDateStr(endDateStr)); - IPage ls = baseMapper.billladingList(page,warehouseId,CommonUtil.getStartByDateStr(startDateStr),CommonUtil.getEndByDateStr(endDateStr)); + Map map = baseMapper.billladingNum(warehouseId,CommonUtil.getStartByDateStr(startDateStr),CommonUtil.getEndByDateStr(endDateStr),customerTrain); + IPage ls = baseMapper.billladingList(page,warehouseId,CommonUtil.getStartByDateStr(startDateStr),CommonUtil.getEndByDateStr(endDateStr),customerTrain); Map m = new HashMap<>(); if(!Objects.isNull(map)){ @@ -548,15 +785,18 @@ public class TrunklineBillladingServiceImpl extends BaseServiceImpl findAdvanceDetailList(BillladingDTO billladingDTO) { -// Integer pageNum = billladingDTO.getPageNum(); -// Integer pageSize = billladingDTO.getPageSize(); + String orderCode = billladingDTO.getOrderCode(); -// IPage page = new Page<>(); -// page.setCurrent(pageNum); -// page.setSize(pageSize); - List ls = baseMapper.findAdvanceDetailList(orderCode); + return baseMapper.findAdvanceDetailList(orderCode); + } + + @Override + public R findBillladingLogList(Long billladingId) { + + + List list = baseMapper.findBillladingLogList(billladingId); - return ls; + return R.data(list); } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingWaybillServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingWaybillServiceImpl.java index 2faf91918..0b5f19aef 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingWaybillServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineBillladingWaybillServiceImpl.java @@ -6,6 +6,7 @@ import com.logpm.trunkline.entity.TrunklineBillladingWaybillEntity; import com.logpm.trunkline.entity.TrunklineWaybillOrderEntity; import com.logpm.trunkline.mapper.TrunklineBillladingWaybillMapper; import com.logpm.trunkline.service.ITrunklineBillladingWaybillService; +import com.logpm.trunkline.vo.TrunklineBillladingNumVO; import com.logpm.trunkline.vo.TrunklineBillladingWaybillVO; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -13,6 +14,7 @@ import org.springblade.core.mp.base.BaseServiceImpl; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; @Slf4j @@ -75,16 +77,16 @@ public class TrunklineBillladingWaybillServiceImpl extends BaseServiceImpl 0){ - price = totalFee.divide(new BigDecimal(realNum),2,BigDecimal.ROUND_UP); + price = totalFee.divide(new BigDecimal(realNum),2, RoundingMode.UP); } }else if ("2".equals(chargeType)){ if(realWeight.compareTo(BigDecimal.ZERO) > 0){ - price = totalFee.divide(realWeight,4,BigDecimal.ROUND_UP); + price = totalFee.divide(realWeight,4, RoundingMode.UP); } }else if("3".equals(chargeType)){ if(realVolume.compareTo(BigDecimal.ZERO) > 0){ - price = totalFee.divide(realVolume,4,BigDecimal.ROUND_UP); + price = totalFee.divide(realVolume,4, RoundingMode.UP); } } @@ -124,6 +126,7 @@ public class TrunklineBillladingWaybillServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("waybill_no","————") + .eq("billlading_id",billladingId) .eq("is_deleted",0); return baseMapper.selectOne(queryWrapper); } @@ -134,8 +137,27 @@ public class TrunklineBillladingWaybillServiceImpl extends BaseServiceImpl findNoFinishWaybillByBillladingId(Long billladingId) { + return baseMapper.findNoFinishWaybillByBillladingId(billladingId); + } + + @Override + public TrunklineBillladingNumVO getNumVOByBillladingId(Long billladingId) { + return baseMapper.getNumVOByBillladingId(billladingId); + } + + @Override + public List getNoDataWaybillByBillladingIds(List billladingIds) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("waybill_no","————") + .in("billlading_id",billladingIds) + .eq("is_deleted",0); + return baseMapper.selectList(queryWrapper); } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadLineServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadLineServiceImpl.java index ab574ef14..2242d5bfe 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadLineServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadLineServiceImpl.java @@ -31,7 +31,8 @@ public class TrunklineCarsLoadLineServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("load_id",loadId) - .eq("node_id",nodeId); + .eq("node_id",nodeId) + .eq("is_deleted",0); return baseMapper.selectOne(queryWrapper); } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadLogServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadLogServiceImpl.java index a1e27f869..d25ac9efc 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadLogServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadLogServiceImpl.java @@ -1,10 +1,13 @@ package com.logpm.trunkline.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.logpm.trunkline.entity.TrunklineCarsLoadEntity; import com.logpm.trunkline.entity.TrunklineCarsLoadLineEntity; import com.logpm.trunkline.entity.TrunklineCarsLoadLogEntity; +import com.logpm.trunkline.entity.TrunklineCarsLoadScanEntity; import com.logpm.trunkline.mapper.TrunklineCarsLoadLogMapper; import com.logpm.trunkline.service.ITrunklineCarsLoadLogService; +import com.logpm.trunkline.service.ITrunklineCarsLoadScanService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.common.constant.carsload.CarsLoadLogTypeConstant; @@ -14,12 +17,16 @@ import org.springblade.core.secure.utils.AuthUtil; import org.springframework.stereotype.Service; import java.util.Date; +import java.util.List; import java.util.Objects; @Slf4j @Service @AllArgsConstructor public class TrunklineCarsLoadLogServiceImpl extends BaseServiceImpl implements ITrunklineCarsLoadLogService { + + private final ITrunklineCarsLoadScanService carsLoadScanService; + @Override public void saveLog(TrunklineCarsLoadEntity carsLoadEntity, TrunklineCarsLoadLineEntity carsLoadLineEntity, int cardLoadType) { String nodeName = null; @@ -34,6 +41,7 @@ public class TrunklineCarsLoadLogServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("load_id",loadId) + .eq("scan_status","3"); + List list = carsLoadScanService.list(queryWrapper); + Integer signNum = 0; + if(!list.isEmpty()){ + signNum = list.size(); + } + content = "【"+nodeName+"】三方中转【整车】签收,车次号:"+carsNo+",车牌号:"+carNumber+",司机姓名:"+driverName+ + ",司机手机号:"+driverMobile+",签收件数:"+ signNum + "/" + realLoadingNumber + "件"; + break; + case 17: + content = "【"+nodeName+"】三方中转结算,车次号:"+carsNo+",车牌号:"+carNumber+",司机姓名:"+driverName+ + ",司机手机号:"+driverMobile+",结算时间:"+ now; + break; + case 18: + content = "【"+nodeName+"】直发商家签收,车次号:"+carsNo+",车牌号:"+carNumber+",司机姓名:"+driverName+ + ",司机手机号:"+driverMobile+",签收时间:"+ now; + break; + case 19: + content = "【"+nodeName+"】直发商家签收图片上传,车次号:"+carsNo+",车牌号:"+carNumber+",司机姓名:"+driverName+ + ",司机手机号:"+driverMobile+",上传时间:"+ now; + break; + case 20: + content = "【"+nodeName+"】三方中转签收图片上传,车次号:"+carsNo+",车牌号:"+carNumber+",司机姓名:"+driverName+ + ",司机手机号:"+driverMobile+",上传时间:"+ now; + break; default: content = "【"+nodeName+"】其他日志,车次号:"+carsNo+",车牌号:"+carNumber+",司机姓名:"+driverName+ ",司机手机号:"+driverMobile; @@ -124,6 +160,42 @@ public class TrunklineCarsLoadLogServiceImpl extends BaseServiceImpl qw = new QueryWrapper<>(); + qw.eq("node_id",nodeId) + .eq("load_id",loadId) + .eq("type",cardLoadType); + TrunklineCarsLoadLogEntity carsLoadLogEntity1 = baseMapper.selectOne(qw); + if(Objects.isNull(carsLoadLogEntity1)){ + save(carsLoadLogEntity); + return; + }else{ + carsLoadLogEntity1.setContent(content); + updateById(carsLoadLogEntity1); + return; + } + } + + if(CarsLoadLogTypeConstant.SEND_DIRECTLY_SIGNPHOTO.getValue().equals(cardLoadType) + || CarsLoadLogTypeConstant.TRIPARTITE_TRANSFER_SIGNPHOTO.getValue().equals(cardLoadType)){ + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("node_id",nodeId) + .eq("load_id",loadId) + .eq("type",cardLoadType); + TrunklineCarsLoadLogEntity carsLoadLogEntity1 = baseMapper.selectOne(qw); + if(Objects.isNull(carsLoadLogEntity1)){ + save(carsLoadLogEntity); + return; + }else{ + carsLoadLogEntity1.setContent(content); + updateById(carsLoadLogEntity1); + return; + } + } + save(carsLoadLogEntity); + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadScanServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadScanServiceImpl.java index 3ad55de2b..5cc24d084 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadScanServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadScanServiceImpl.java @@ -1,17 +1,22 @@ package com.logpm.trunkline.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.distribution.entity.DistributionParcelListEntity; +import com.logpm.distribution.entity.DistributionStockArticleEntity; import com.logpm.trunkline.dto.LoadCarsDTO; import com.logpm.trunkline.dto.ProductInfoDTO; import com.logpm.trunkline.entity.TrunklineCarsLoadScanEntity; import com.logpm.trunkline.mapper.TrunklineCarsLoadScanMapper; import com.logpm.trunkline.service.ITrunklineCarsLoadScanService; import com.logpm.trunkline.vo.*; +import com.logpm.warehouse.entity.WarehouseWaybillEntity; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.mp.base.BaseServiceImpl; import org.springframework.stereotype.Service; +import java.util.Date; import java.util.List; import java.util.Map; @@ -66,7 +71,7 @@ public class TrunklineCarsLoadScanServiceImpl extends BaseServiceImpl loadingDetail(IPage page, LoadCarsDTO loadCarsDTO) { + public IPage loadingDetail(IPage page, LoadCarsDTO loadCarsDTO) { return baseMapper.loadingDetail(page,loadCarsDTO); } @@ -199,8 +204,8 @@ public class TrunklineCarsLoadScanServiceImpl extends BaseServiceImpl loadScanIds, String scanStatus) { - baseMapper.updateScanStatus(loadScanIds,scanStatus); + public void updateScanStatusAndTime(List loadScanIds, String scanStatus,Date unloadTime,String signUserName,Long warehouseId,String warehouseName) { + baseMapper.updateScanStatusAndTime(loadScanIds,scanStatus,unloadTime,signUserName,warehouseId,warehouseName); } @Override @@ -264,8 +269,8 @@ public class TrunklineCarsLoadScanServiceImpl extends BaseServiceImpl loadingDetailExport(LoadCarsDTO loadCarsDTO) { + return baseMapper.loadingDetailExport(loadCarsDTO); + } + + @Override + public Integer findSignNumByLoadId(Long loadId) { + return baseMapper.findSignNumByLoadId(loadId); + } + + @Override + public UnloadReportVO findUnloadReport(Long loadId, Long warehouseId) { + return baseMapper.findUnloadReport(loadId,warehouseId); + } + + @Override + public List findParceListByCarsLoadScanIds(List carsLoadScanIds) { + return baseMapper.findParceListByCarsLoadScanIds(carsLoadScanIds); + } + + @Override + public List findOrderListByCarsLoadScanIds(List carsLoadScanIds) { + return baseMapper.findOrderListByCarsLoadScanIds(carsLoadScanIds); + } + + @Override + public List findWaybillListByCarsLoadScanIds(List carsLoadScanIds) { + return baseMapper.findWaybillListByCarsLoadScanIds(carsLoadScanIds); + } + + @Override + public List findListByIdsNoPackage(List carsLoadScanIds, Long warehouseId) { + return baseMapper.findListByIdsNoPackage(carsLoadScanIds,warehouseId); + } + + @Override + public List findIncomingOrdeCodesByCarsLoadScanIds(List carsLoadScanIds, Long warehouseId) { + return baseMapper.findIncomingOrdeCodesByCarsLoadScanIds(carsLoadScanIds,warehouseId); + } + + @Override + public List findListHasSignOrderIdByIds(List loadScanIds) { + return baseMapper.findListHasSignOrderIdByIds(loadScanIds); + } + + @Override + public List findCarsLoadScanIdsByWaybillIds(List waybillIds) { + return baseMapper.findCarsLoadScanIdsByWaybillIds(waybillIds); + } + + @Override + public List findAbnormalData(Long loadId) { + return baseMapper.findAbnormalData(loadId); + } + + @Override + public List findUnloadZeroList(Long loadId, Long warehouseId) { + return baseMapper.findUnloadZeroList(loadId,warehouseId); + } + + @Override + public JSONObject findUnloadNumAudio(Long loadId, Long warehouseId) { + return baseMapper.findUnloadNumAudio(loadId,warehouseId); + } + + @Override + public void updateFinalNodeIdAndFinalNodeNameByLoadIdNoData(Long loadId, Long warehouseId, String warehouseName) { + baseMapper.updateFinalNodeIdAndFinalNodeNameByLoadIdNoData(loadId,warehouseId,warehouseName); + } + + @Override + public void deleteListByCarsLoadScanIds(List carsLoadScanIdList) { + baseMapper.deleteListByCarsLoadScanIds(carsLoadScanIdList); + } + + @Override + public void clearSignOrderIdByLoadIdAndWarehouseIdAndOrderCodeAndWaybillNo(Long finalLoadId1, Long nodeId, String orderCode, String waybillNo) { + baseMapper.clearSignOrderIdByLoadIdAndWarehouseIdAndOrderCodeAndWaybillNo(finalLoadId1,nodeId,orderCode,waybillNo); + } + + @Override + public void addSignOrderIdByLoadIdAndNodeIdAndOrderCodeAndWaybillNo(Long finalLoadId, Long nodeId, String orderCode, String waybillNo, Long signOrderId) { + baseMapper.addSignOrderIdByLoadIdAndNodeIdAndOrderCodeAndWaybillNo(finalLoadId,nodeId,orderCode,waybillNo,signOrderId); + } + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadServiceImpl.java index 0d7dd469c..abdb5f4d0 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsLoadServiceImpl.java @@ -1,6 +1,7 @@ package com.logpm.trunkline.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; @@ -19,6 +20,7 @@ import com.logpm.basicdata.feign.IBasicdataCodeClient; import com.logpm.basicdata.feign.IBasicdataDriverArteryClient; import com.logpm.basicdata.feign.IBasicdataTrayClient; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.distribution.dto.FindParamterDTO; import com.logpm.distribution.entity.DistributionParcelListEntity; import com.logpm.distribution.entity.DistributionParcelNumberEntity; import com.logpm.distribution.entity.DistributionStockArticleEntity; @@ -26,76 +28,19 @@ import com.logpm.distribution.feign.IDistributionParcelListClient; import com.logpm.distribution.feign.IDistributionParcelNumberClient; import com.logpm.distribution.feign.IDistributionStockArticleClient; import com.logpm.factorydata.enums.BrandEnums; +import com.logpm.factorydata.feign.IFactoryDataClient; import com.logpm.factorydata.util.FactoryDataMessageSender; import com.logpm.factorydata.vo.NodePushMsg; +import com.logpm.factorydata.vo.PushData; import com.logpm.trunkline.bean.Resp; -import com.logpm.trunkline.dto.BatchUnloadDTO; -import com.logpm.trunkline.dto.InComingDTO; -import com.logpm.trunkline.dto.LoadCarsDTO; -import com.logpm.trunkline.dto.LoadScanBrandDTO; -import com.logpm.trunkline.dto.LoadingPackageDTO; -import com.logpm.trunkline.dto.LoadingZeroDTO; -import com.logpm.trunkline.dto.ProductInfoDTO; -import com.logpm.trunkline.dto.TrunklineCarsLoadDTO; -import com.logpm.trunkline.dto.TrunklineCarsLoadLineDTO; -import com.logpm.trunkline.dto.TrunklineCarsOrderDTO; -import com.logpm.trunkline.dto.UnloadPackageDTO; -import com.logpm.trunkline.dto.UnloadZeroDTO; -import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity; -import com.logpm.trunkline.entity.TrunklineCarsLoadContractEntity; -import com.logpm.trunkline.entity.TrunklineCarsLoadEntity; -import com.logpm.trunkline.entity.TrunklineCarsLoadFinanceEntity; -import com.logpm.trunkline.entity.TrunklineCarsLoadLineEntity; -import com.logpm.trunkline.entity.TrunklineCarsLoadLogEntity; -import com.logpm.trunkline.entity.TrunklineCarsLoadScanEntity; -import com.logpm.trunkline.entity.TrunklineCarsOrderEntity; -import com.logpm.trunkline.entity.TrunklineCostShareRecordEntity; -import com.logpm.trunkline.entity.TrunklineLoadSignOrderEntity; -import com.logpm.trunkline.entity.TrunklineLoadSignPhotoEntity; +import com.logpm.trunkline.dto.*; +import com.logpm.trunkline.entity.*; +import com.logpm.trunkline.feign.ITrunklinePackageTrackLogClient; import com.logpm.trunkline.mapper.TrunklineCarsLoadMapper; -import com.logpm.trunkline.service.ICarsLoadAsyncService; -import com.logpm.trunkline.service.IInComingService; -import com.logpm.trunkline.service.IOpenOrderAsyncService; -import com.logpm.trunkline.service.IPackageTrackLogAsyncService; -import com.logpm.trunkline.service.ITrunklineAdvanceDetailService; -import com.logpm.trunkline.service.ITrunklineCarsLoadContractService; -import com.logpm.trunkline.service.ITrunklineCarsLoadFinanceService; -import com.logpm.trunkline.service.ITrunklineCarsLoadLineService; -import com.logpm.trunkline.service.ITrunklineCarsLoadLogService; -import com.logpm.trunkline.service.ITrunklineCarsLoadScanService; -import com.logpm.trunkline.service.ITrunklineCarsLoadService; -import com.logpm.trunkline.service.ITrunklineCarsLoadingLogService; -import com.logpm.trunkline.service.ITrunklineCarsOrderService; -import com.logpm.trunkline.service.ITrunklineCarsSignLogService; -import com.logpm.trunkline.service.ITrunklineCarsUnloadLogService; -import com.logpm.trunkline.service.ITrunklineCostShareRecordService; -import com.logpm.trunkline.service.ITrunklineLoadSignOrderService; -import com.logpm.trunkline.service.ITrunklineLoadSignPhotoService; -import com.logpm.trunkline.service.ITrunklineWaybillOrderService; -import com.logpm.trunkline.vo.CarsLoadAllOrderVO; -import com.logpm.trunkline.vo.CarsLoadOrderInfoVO; -import com.logpm.trunkline.vo.CarsLoadWaybillInfoVO; -import com.logpm.trunkline.vo.HasNotFinalNodeIdDataVO; -import com.logpm.trunkline.vo.LoadScanFinalNodeIdVO; -import com.logpm.trunkline.vo.LoadScanOrderVO; -import com.logpm.trunkline.vo.LoadZeroListVO; -import com.logpm.trunkline.vo.LoadingListGoodsVO; -import com.logpm.trunkline.vo.LoadingListMainVO; -import com.logpm.trunkline.vo.NodeNumDataVO; -import com.logpm.trunkline.vo.OrderScanDetailVO; -import com.logpm.trunkline.vo.SignOrderDetailVO; -import com.logpm.trunkline.vo.SignPackageVO; -import com.logpm.trunkline.vo.SignScanOrderVO; -import com.logpm.trunkline.vo.TripartiteTransferVO; -import com.logpm.trunkline.vo.TrunklineCarsLoadLoadingListVO; -import com.logpm.trunkline.vo.TrunklineCarsLoadScanVO; -import com.logpm.trunkline.vo.TrunklineCarsLoadVO; -import com.logpm.trunkline.vo.TrunklineLoadSignOrderVO; -import com.logpm.trunkline.vo.UnloadPackageVO; -import com.logpm.trunkline.vo.UnloadScanOrderVO; -import com.logpm.trunkline.vo.UnloadZeroVO; -import com.logpm.trunkline.vo.WaybillCarsLoadVO; -import com.logpm.trunkline.vo.ZeroSuppleVO; +import com.logpm.trunkline.service.*; +import com.logpm.trunkline.vo.*; +import com.logpm.warehouse.entity.WarehousePackageTrackLogEntity; +import com.logpm.warehouse.entity.WarehouseTrayTypeEntity; import com.logpm.warehouse.entity.WarehouseWayBillDetail; import com.logpm.warehouse.entity.WarehouseWaybillEntity; import com.logpm.warehouse.feign.IWarehouseTrayTypeClient; @@ -105,11 +50,8 @@ import com.logpm.warehouse.feign.IWarehouseWaybillDetailClient; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringEscapeUtils; -import org.springblade.common.constant.CodeNumConstant; -import org.springblade.common.constant.DictBizConstant; -import org.springblade.common.constant.IncomingTypeEnum; -import org.springblade.common.constant.RabbitConstant; -import org.springblade.common.constant.WorkNodeEnums; +import org.springblade.common.annotations.RepeatSubmit; +import org.springblade.common.constant.*; import org.springblade.common.constant.carsload.CarsLoadLogTypeConstant; import org.springblade.common.exception.CustomerException; import org.springblade.common.utils.CommonUtil; @@ -128,14 +70,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.TreeSet; +import java.math.RoundingMode; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; @Slf4j @Service @@ -173,28 +111,41 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl loadCarsPageList(LoadCarsDTO loadCarsDTO) { + IPage page = new Page<>(); page.setCurrent(loadCarsDTO.getPageNum()); page.setSize(loadCarsDTO.getPageSize()); IPage pageList = baseMapper.loadCarsPageList(page, loadCarsDTO); List records = pageList.getRecords(); - for (TrunklineCarsLoadVO trunklineCarsLoadVO : records) { + //把records中的id封装成一个set + Set idsSet = records.stream() + .map(TrunklineCarsLoadVO::getId) // Assuming getId() method returns the id as an Integer + .collect(Collectors.toSet()); + //判空idsSet + if (idsSet.isEmpty()) { + return pageList; + } + //使用trunklineCarsLoadLineService通过idsSet关联loadId批量查询TrunklineCarsLoadLineEntity集合 + List loadLineList = trunklineCarsLoadLineService.list(new QueryWrapper().in("load_id", idsSet)); + //把loadLineList中对象通过loadId分组 + Map> loadLineMap = loadLineList.stream() + .collect(Collectors.groupingBy(TrunklineCarsLoadLineEntity::getLoadId)); + records.forEach(trunklineCarsLoadVO -> { Long loadId = trunklineCarsLoadVO.getId(); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("is_deleted", 0) - .eq("load_id", loadId) - .orderByAsc("sort"); - List list = trunklineCarsLoadLineService.list(queryWrapper); + List list = loadLineMap.get(loadId); trunklineCarsLoadVO.setCarsLoadLineList(list); - } + }); pageList.setRecords(records); return pageList; } @@ -207,15 +158,24 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl pageList = baseMapper.arriveCarsPageList(page, loadCarsDTO); List records = pageList.getRecords(); - for (TrunklineCarsLoadVO trunklineCarsLoadVO : records) { + //把records中的id封装成一个set + Set idsSet = records.stream() + .map(TrunklineCarsLoadVO::getId) // Assuming getId() method returns the id as an Integer + .collect(Collectors.toSet()); + //判空idsSet + if (idsSet.isEmpty()) { + return pageList; + } + //使用trunklineCarsLoadLineService通过idsSet关联loadId批量查询TrunklineCarsLoadLineEntity集合 + List loadLineList = trunklineCarsLoadLineService.list(new QueryWrapper().in("load_id", idsSet)); + //把loadLineList中对象通过loadId分组 + Map> loadLineMap = loadLineList.stream() + .collect(Collectors.groupingBy(TrunklineCarsLoadLineEntity::getLoadId)); + records.forEach(trunklineCarsLoadVO -> { Long loadId = trunklineCarsLoadVO.getId(); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("is_deleted", 0) - .eq("load_id", loadId) - .orderByAsc("sort"); - List list = trunklineCarsLoadLineService.list(queryWrapper); + List list = loadLineMap.get(loadId); trunklineCarsLoadVO.setCarsLoadLineList(list); - } + }); pageList.setRecords(records); return pageList; } @@ -284,7 +244,7 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl contents = new ArrayList<>(); - ArrayList codes = CollUtil.newArrayList(packageCode.split(",")); - if (CollUtil.isNotEmpty(codes)) { - for (String code : codes) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("packageCode", code); - contents.add(jsonObject); - } - } - msg.setContent(contents); + NodePushMsg msg = NodePushMsg.builder() + .operator(AuthUtil.getNickName()) + .operatorTime(new Date()) + .address(warehouseAddress) + .brand(BrandEnums.getByValue(brand.getBrand())) + .node(node) + .content(StrUtil.split(packageCode, ",").stream().map(data->{ + return PushData.builder() + .packageCode(data) + .warehouseName(warehouseEntity.getName()) + .orderCode(brand.getOrderCode()) + .build(); + }).collect(Collectors.toList())) + .build(); log.info("推送工厂数据:{}", JSONUtil.toJsonStr(msg)); factoryDataMessageSender.sendNodeDataByBrand(msg); + // 推送梦天工厂 + rabbitTemplate.convertAndSend(RabbitConstant.HWY_UNLOAD_CAR_COM_INFO_EXCHANGE, RabbitConstant.HWY_UNLOAD_CAR_COM_INFO_ROUTING, msg); } } } @@ -502,6 +462,11 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl orderPackageCodes = trunklineCarsLoadScanService.findPackageListByLoadId(loadId); String content = "包件在 " + warehouseEntity.getName() + "到车"; - packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(), AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getNickName(), orderPackageCodes, warehouseId, warehouseEntity.getName(), workNode, content); + packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(), AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getNickName(), orderPackageCodes, warehouseId, warehouseEntity.getName(), workNodeEnums.getCode(), content); + try { + + FindParamterDTO param = new FindParamterDTO(); + param.setWarehouseId(warehouseId); + param.setOrderPackageCodeList(orderPackageCodes); + List listByOrderPackageCodeList = distributionParcelListClient.findListByOrderPackageCodeList(param); + Map> map = listByOrderPackageCodeList.stream().collect(Collectors.groupingBy(DistributionParcelListEntity::getStockArticleId)); + JSONObject js = new JSONObject(); + js.put("carNumber", carsLoadEntity.getCarNumber()); + js.put("driverName", carsLoadEntity.getDriverName()); + js.put("driverMobile", carsLoadEntity.getDriverMobile()); + for (Map.Entry> entry : map.entrySet()) { + List value = entry.getValue(); + DistributionParcelListEntity parcelListEntity = value.get(0); + js.put("orderCode", parcelListEntity.getOrderCode()); + js.put("serviceNumber", parcelListEntity.getServiceNumber()); + js.put("waybillNumber", parcelListEntity.getWaybillNumber()); + js.put("sendWarehouseName", parcelListEntity.getSendWarehouseName()); + js.put("acceptWarehouseName", parcelListEntity.getAcceptWarehouseName()); + // 分割字符串得到仓库名称列表 + List warehouseNames = StrUtil.split(carsLoadEntity.getEndWarehouseNames(), ","); + // 获取最后一个仓库名称 + String lastWarehouseName = CollUtil.isNotEmpty(warehouseNames) ? warehouseNames.get(warehouseNames.size() - 1): ""; + // 将最后一个仓库名称放入js对象 + js.put("warehouseName", lastWarehouseName); + NodePushMsg msg = new NodePushMsg(); + msg.setNode(workNodeEnums); + msg.setBrand(BrandEnums.getByValue(parcelListEntity.getBrandName())); + msg.setOperator(AuthUtil.getNickName()); + msg.setOperatorTime(new Date()); + msg.setMain(js.toString()); + msg.setContent(value.stream().map(item -> { + return PushData.builder() + .packageCode(item.getOrderPackageCode()) + .orderCode(item.getOrderCode()) + .warehouseName(warehouseEntity.getName()) + .waybillNumber(item.getWaybillNumber()).build(); + }).collect(Collectors.toList())); + log.info("推送工厂数据:{}", JSONUtil.toJsonStr(msg)); + factoryDataMessageSender.sendNodeDataByBrand(msg); + } + } catch (Exception e){ + log.warn("推送工厂失败:{}", e); + } } catch (Exception e) { log.warn("#############arriveCarByLoadId: 存入日志失败"); } - } @Override @@ -631,20 +638,12 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl carsLoadScanIdList = trunklineCarsLoadScanService.findAllIdListByLoadId(loadId); - removeCarsLoadScan(StringUtil.join(carsLoadScanIdList, ","), warehouseId); + //通过loadId更新carsOrder关联表中的所有订单startNum为0 + trunklineCarsOrderService.updateStartNumByLoadIdAndWarehouseId(loadId, warehouseId); + + if (CollUtil.isNotEmpty(carsLoadScanIdList)) { + removeCarsLoadScan(StringUtil.join(carsLoadScanIdList, ","), warehouseId); + } try { trunklineCarsLoadLogService.saveLog(carsLoadEntity, currentCarsLoadLineEntity, CarsLoadLogTypeConstant.CANCEL_CARS_LOAD.getValue()); @@ -927,6 +939,7 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("load_id", loadId) + .eq("unload_node_id", warehouseId) + .eq("type", 2) + .ne("scan_status", "1"); + + List carsLoadScanEntityList = trunklineCarsLoadScanService.list(queryWrapper); + if(CollUtil.isNotEmpty(carsLoadScanEntityList)){ + //把carsLoadScanEntityList通过orderCode进行分组 + Map> orderCodemap = carsLoadScanEntityList.stream().collect(Collectors.groupingBy(TrunklineCarsLoadScanEntity::getOrderCode)); + orderCodemap.keySet().forEach(orderCode -> { + List orderCodeList = orderCodemap.get(orderCode); + //把orderCodeList通过fromWarehouseId进行分组 + Map> fromWarehouseIdmap = orderCodeList.stream().collect(Collectors.groupingBy(TrunklineCarsLoadScanEntity::getFromWarehouseId)); + fromWarehouseIdmap.keySet().forEach(fromWarehouseId -> { + TrunklineCarsOrderEntity trunklineCarsOrderEntity = trunklineCarsOrderService.findEntityByLoadIdAndWarehouseIdAndOrderCodeAndWaybillNo(loadId, fromWarehouseId, orderCode, orderCode); + if(!Objects.isNull(trunklineCarsOrderEntity)){ + Integer realNum = trunklineCarsOrderEntity.getRealNum(); + List fromWarehouseIdList = fromWarehouseIdmap.get(fromWarehouseId); + //把fromWarehouseIdList中所有元素的unloadNum累加 + int unloadNum = fromWarehouseIdList.stream().mapToInt(TrunklineCarsLoadScanEntity::getUnloadNum).sum(); + DistributionStockArticleEntity stockArticleEntity = distributionStockArticleClient.findZeroByOrderCodeAndWarehouseId(orderCode, fromWarehouseId); + if(!Objects.isNull(stockArticleEntity)){ + Integer handQuantity = stockArticleEntity.getHandQuantity(); + + if(unloadNum > realNum){ + //卸车数大于实际装车数 + throw new CustomerException(405,"零担订单"+orderCode+"卸车件数已大于实际装车件数,请去调整补录"); + }else { + if(unloadNum < realNum){ + distributionStockArticleClient.addHandQuantity(stockArticleEntity.getId(),realNum-unloadNum); + } + + DistributionStockArticleEntity newStockArticleEntity = distributionStockArticleClient.findStockArticleByOrderCodeAndWarehouseId(orderCode, warehouseId); + if (Objects.isNull(newStockArticleEntity)) { + newStockArticleEntity = new DistributionStockArticleEntity(); + BeanUtil.copy(stockArticleEntity, newStockArticleEntity); + newStockArticleEntity.setId(null); + newStockArticleEntity.setOrderReceiveStatus("20"); + newStockArticleEntity.setOrderStatus("10"); + newStockArticleEntity.setHandQuantity(unloadNum); + newStockArticleEntity.setIncomingNum(unloadNum); + newStockArticleEntity.setWarehouse(warehouseEntity.getName()); + newStockArticleEntity.setWarehouseId(warehouseEntity.getId()); + newStockArticleEntity.setCarsLoadNum(0); + Long orderId = distributionStockArticleClient.addData(newStockArticleEntity); + if (orderId != 0) { + List parcelListEntityList = distributionParcelListClient.findEntityListByOrderCode(orderCode, fromWarehouseId); + List ls = new ArrayList<>(); + for (DistributionParcelListEntity parcelListEntity : parcelListEntityList) { + DistributionParcelListEntity newParcelListEntity = new DistributionParcelListEntity(); + BeanUtil.copy(parcelListEntity, newParcelListEntity); + newParcelListEntity.setId(null); + newParcelListEntity.setWarehouseId(warehouseId); + newParcelListEntity.setWarehouse(warehouseEntity.getName()); + newParcelListEntity.setStockArticleId(orderId); + Long acceptWarehouseId = parcelListEntity.getAcceptWarehouseId(); + if(warehouseId.equals(acceptWarehouseId)){ + newParcelListEntity.setIsTransfer(0); + }else{ + newParcelListEntity.setIsTransfer(1); + } + Long orderPackageId = distributionParcelListClient.addReturnId(newParcelListEntity); + + DistributionParcelNumberEntity parcelNumberEntity = new DistributionParcelNumberEntity(); + parcelNumberEntity.setStockArticleId(orderId); + parcelNumberEntity.setParcelListId(orderPackageId); + parcelNumberEntity.setQuantity(newParcelListEntity.getQuantity()); + parcelNumberEntity.setHandQuantity(0); + parcelNumberEntity.setDeliveryQuantity(0); + parcelNumberEntity.setSigninQuantity(0); + parcelNumberEntity.setOutboundQuantity(0); + parcelNumberEntity.setWarehouseId(warehouseId); + ls.add(parcelNumberEntity); + } + distributionParcelNumberClient.addBatch(ls); + } + } else { + Integer hQuantity = newStockArticleEntity.getHandQuantity() + unloadNum; + Integer incomingNum = newStockArticleEntity.getIncomingNum() + unloadNum; + Integer totalNumber = newStockArticleEntity.getTotalNumber(); + + if (incomingNum.equals(totalNumber)) { + if (hQuantity.equals(totalNumber)) { + newStockArticleEntity.setOrderStatus("20"); + } else { + newStockArticleEntity.setOrderStatus("30"); + } + newStockArticleEntity.setOrderReceiveStatus("30"); + } else { + if (incomingNum.equals(hQuantity)) { + newStockArticleEntity.setOrderStatus("10"); + } else { + newStockArticleEntity.setOrderStatus("30"); + } + newStockArticleEntity.setOrderReceiveStatus("20"); + } + newStockArticleEntity.setHandQuantity(hQuantity); + newStockArticleEntity.setIncomingNum(incomingNum); + + distributionStockArticleClient.saveOrUpdate(newStockArticleEntity); + } + } + } + } + }); + }); + } + //无装车记录异常日志记录 try { +// carsLoadAsyncService. + carsLoadAsyncService.abnormalListUnloadCheckByLoadIdAndWarehouseId(loadId, warehouseId, currentCarsLoadLineEntity.getNodeName(), AuthUtil.getTenantId(), AuthUtil.getUserId(), AuthUtil.getNickName(), Func.firstLong(AuthUtil.getDeptId())); List orderPackageCodes = trunklineCarsLoadScanService.findUnloadByLoadIdAndWarehouseId(loadId, warehouseId); @@ -1073,6 +1202,7 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl lineCarsOrderList = carsLoadLineDTO.getAddList(); + //把lineCarsOrderList中的所有运单号合并成一个集合 + List waybillNos = lineCarsOrderList.stream().map(TrunklineCarsOrderDTO::getWaybillNo).collect(Collectors.toList()); + List freezeOrAbolishWaybillList = warehouseWaybillClient.findFreezeOrAbolishByWaybillNos(waybillNos); + if (!CollUtil.isEmpty(freezeOrAbolishWaybillList)) { + log.warn("##########saveNew: 运单有变动,请重新做计划"); + throw new CustomerException(400, "运单有变动,请重新做计划"); + } for (TrunklineCarsOrderDTO carsOrderDTO : lineCarsOrderList) { Integer planNum = carsOrderDTO.getPlanNum(); String orderCode = carsOrderDTO.getOrderCode(); @@ -1321,6 +1459,9 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl addCarsLoadLineList = carsLoadDTO.getAddCarsLoadLineList(); List removeCarsLoadLineList = carsLoadDTO.getRemoveCarsLoadLineList(); @@ -1360,6 +1501,9 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl waybillNos = addList.stream().map(TrunklineCarsOrderDTO::getWaybillNo).collect(Collectors.toList()); + + if(!waybillNos.isEmpty()){ + List freezeOrAbolishWaybillList = warehouseWaybillClient.findFreezeOrAbolishByWaybillNos(waybillNos); + if (!CollUtil.isEmpty(freezeOrAbolishWaybillList)) { + log.warn("##########saveNew: 运单有变动,请重新做计划"); + throw new CustomerException(400, "运单有变动,请重新做计划"); + } + } + + for (TrunklineCarsOrderDTO trunklineCarsOrderDTO : addList) { TrunklineCarsOrderEntity trunklineCarsOrderEntity = new TrunklineCarsOrderEntity(); BeanUtil.copy(trunklineCarsOrderDTO, trunklineCarsOrderEntity); @@ -1690,6 +1859,10 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl pageList = baseMapper.tripartiteTransferPageList(page, loadCarsDTO); return pageList; } @@ -1822,7 +1995,11 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl orderPackageCodes = trunklineCarsLoadScanService.findSignListOrderPackageCodes(loadId); String content = "包件在" + warehouseEntity.getName() + "被三方中转整车签收"; packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(), AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getNickName(), orderPackageCodes, warehouseId, warehouseEntity.getName(), WorkNodeEnums.SIGN_TRIPARTITE_TRANSFER_DEPART.getCode(), content); + // 推送签收数据给工厂 + sendFactorySignTriparite(warehouseId, orderPackageCodes, warehouseEntity); } catch (Exception e) { log.warn("###########存入日志失败"); } @@ -2029,22 +2217,27 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl pageList = trunklineCarsLoadScanService.loadingDetail(page, loadCarsDTO); + loadCarsDTO.setCreateTimeStart(CommonUtil.getStartByDateStr(loadCarsDTO.getCreateTimeStartStr())); + loadCarsDTO.setCreateTimeEnd(CommonUtil.getEndByDateStr(loadCarsDTO.getCreateTimeEndStr())); + loadCarsDTO.setUnloadTimeStart(CommonUtil.getStartByDateStr(loadCarsDTO.getUnloadTimeStartStr())); + loadCarsDTO.setUnloadTimeEnd(CommonUtil.getEndByDateStr(loadCarsDTO.getUnloadTimeEndStr())); + + IPage pageList = trunklineCarsLoadScanService.loadingDetail(page, loadCarsDTO); return R.data(pageList); } @Override - public R loadingScan(Long loadId, Long warehouseId, String orderPackageCode, String trayCode, String remark) { + public R loadingScan(Long loadId, Long warehouseId, String orderPackageCode, String trayCode, String remark) { log.info("#################loadingScan: 装车扫描"); TrunklineCarsLoadEntity carsLoadEntity = baseMapper.selectById(loadId); @@ -2096,17 +2294,19 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl orderPackageCodes = new ArrayList<>(); orderPackageCodes.add(orderPackageCode); - String content = "包件在 " + warehouseName + "装车,配载计划目的仓 " + carsLoadScanEntity.getFinalNodeName() + ",数据来源仓库 " + fromWarehouseName; + String content = "包件在 " + warehouseName + " " + (StringUtil.isBlank(trayName) ? "扫码" : "托盘(" + trayName + ")") + " 装车,配载计划目的仓 " + carsLoadScanEntity.getFinalNodeName() + ",数据来源仓库 " + fromWarehouseName; packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(), AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getNickName(), orderPackageCodes, warehouseId, warehouseName, WorkNodeEnums.INITIAL_WAREHOUSE_LOADING.getCode(), content); trunklineCarsLoadingLogService.savaLoadingLog(warehouseId, warehouseName, loadId, loadCode, waybillId, waybillNo, orderCode, orderPackageCode, 1, 1, isData, isAbnormal, trayId, trayCode, trayName, fromWarehouseId, loadScanId, remark); updateNumByLoadId(loadId); + // 推送包件装车数据到工厂 + pushFactoryOrderData(warehouseId, orderPackageCode, orderCode); + try { + NodePushMsg nodePushMsg = NodePushMsg.builder() + .operator(AuthUtil.getNickName()) + .operatorTime(new Date()) + .address("在【" + warehouseName + "】出库") + .brand(BrandEnums.getByValue(brandName)) + .node(WorkNodeEnums.INITIAL_WAREHOUSE_LOADING) + .content(Collections.singletonList(PushData.builder() + .packageCode(orderPackageCode) + .orderCode(orderCode) + .warehouseName(warehouseName) + .build())) + .build(); + factoryDataMessageSender.sendNodeDataByBrand(nodePushMsg); + }catch (Exception e){ + log.error("推送数据失败",e); + } + if(StringUtil.isBlank(audio)){ + TrunklineCarsLoadEntity carsLoad = baseMapper.selectById(loadId); + Integer realLoadingNumber = carsLoad.getRealLoadingNumber(); + audio = realLoadingNumber+"件"; + } + + return Resp.scanSuccess("装车成功",audio); + } - return R.success("装车成功"); + private void pushFactoryOrderData(Long warehouseId, String orderPackageCode, String orderCode) { + try { + // 发送入库消息 + OrderStatusDTO orderStatusDTO = new OrderStatusDTO(); + // 通过包件id 查询包件 + orderStatusDTO.setUnitNo(orderPackageCode); + orderStatusDTO.setOrderNo(orderCode); + orderStatusDTO.setStatus("3"); + orderStatusDTO.setOperationTime(DateUtil.now()); + orderStatusDTO.setCurrentWarehouse(warehouseId.toString()); + Map map = new HashMap<>(); + map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO)); + rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map); + } catch (Exception e) { + log.error("入库推送失败:{}", e); + } } @Override @@ -2364,6 +2624,8 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("load_id", loadId) @@ -2385,6 +2648,7 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl planNum) { isAbnormal = 1; remark = "有数据,有计划,大于计划件数,异常装车"; + audio = "大于计划数量装车"; } } @@ -2430,6 +2695,8 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl planNum) { isAbnormal = 1; remark = "有数据,有计划,大于计划件数,异常装车"; + audio = "大于计划数量装车"; } } @@ -2466,11 +2734,13 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl pageList = baseMapper.carsLoadPageList(page, loadCarsDTO); List records = pageList.getRecords(); + //循环records,获取字典值 for (TrunklineCarsLoadVO trunklineCarsLoadVO : records) { String loadStatus = trunklineCarsLoadVO.getLoadStatus(); String value = DictBizCache.getValue(DictBizConstant.CARS_LOAD_STATUS, loadStatus); @@ -2533,8 +2804,8 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl pageList = baseMapper.carsLoadPageList(page, loadCarsDTO); return R.data(pageList); @@ -2827,18 +3098,121 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl carsLoadOrderInfoList = trunklineCarsOrderService.findCarsLoadOrderInfoList(loadId, waybillNo); +// List carsLoadOrderInfoList = trunklineCarsOrderService.findCarsLoadOrderInfoList(loadId, waybillNo); List carsLoadOrderInfoListPlan = trunklineCarsOrderService.findCarsLoadOrderInfoListPlan(loadId, waybillNo); - carsLoadWaybillInfoVO.setCarsLoadOrderInfoList(carsLoadOrderInfoList); - carsLoadWaybillInfoVO.setCarsLoadOrderInfoListPlan(carsLoadOrderInfoListPlan); + carsLoadOrderInfoListPlan.forEach(carsLoadOrderInfoVO -> { + carsLoadOrderInfoVO.setUnloadIncome(carsLoadOrderInfoVO.getUnloadIncome().setScale(2, BigDecimal.ROUND_HALF_UP)); + carsLoadOrderInfoVO.setOrderFreight(carsLoadOrderInfoVO.getOrderFreight().setScale(2, BigDecimal.ROUND_HALF_UP)); + }); + + + carsLoadWaybillInfoVO.setCarsLoadOrderInfoList(carsLoadOrderInfoListPlan); +// carsLoadWaybillInfoVO.setCarsLoadOrderInfoListPlan(carsLoadOrderInfoListPlan); TrunklineCostShareRecordEntity costShareRecordEntity = trunklineCostShareRecordService.findTotalUnloadNumByLoadAndWaybillNo(loadId, waybillNo); carsLoadWaybillInfoVO.setCostPiece(costShareRecordEntity.getCostPiece()); carsLoadWaybillInfoVO.setCostZhang(costShareRecordEntity.getCostZhang()); carsLoadWaybillInfoVO.setCostNum(costShareRecordEntity.getNum()); } + + //查询异常的数据 + List carsLoadScanAbnormalList = trunklineCarsLoadScanService.findAbnormalData(loadId); + if(!carsLoadScanAbnormalList.isEmpty()){ + //把carsLoadScanAbnormalList过滤waybillNo等于--的数据后把waybillNo放入一个Set + Set waybillNoSet = carsLoadScanAbnormalList.stream().filter(carsLoadScanAbnormalVO -> !"--".equals(carsLoadScanAbnormalVO.getWaybillNo())) + .map(CarsLoadScanAbnormalVO::getWaybillNo) + .collect(Collectors.toSet()); + + List waybillEntityList = warehouseWaybillClient.findWaybillBilllByWaybillNos(new ArrayList<>(waybillNoSet)); + //把waybillEntityList转化成以waybillNo为key的map + Map waybillEntityMap = waybillEntityList.stream().collect(Collectors.toMap(WarehouseWaybillEntity::getWaybillNo, Function.identity())); + + //把carsLoadScanAbnormalList通过waybillNo分组 + Map> carsLoadScanAbnormalMap = carsLoadScanAbnormalList.stream().collect(Collectors.groupingBy(CarsLoadScanAbnormalVO::getWaybillNo)); + carsLoadScanAbnormalMap.keySet().forEach(waybillNo -> { + List carsLoadScanAbnormalVOS = carsLoadScanAbnormalMap.get(waybillNo); + WarehouseWaybillEntity warehouseWaybillEntity = waybillEntityMap.get(waybillNo); + BigDecimal freightPrice = BigDecimal.ZERO; + CarsLoadWaybillInfoVO carsLoadWaybillInfoVO = new CarsLoadWaybillInfoVO(); + carsLoadWaybillInfoVO.setWaybillNo(waybillNo); + if(!"--".equals(waybillNo)){ + if(!Objects.isNull(warehouseWaybillEntity)){ + Integer totalCount = warehouseWaybillEntity.getTotalCount(); + carsLoadWaybillInfoVO.setCreateTime(warehouseWaybillEntity.getCreateTime()); + carsLoadWaybillInfoVO.setDestination(warehouseWaybillEntity.getDestination()); + carsLoadWaybillInfoVO.setDestinationWarehouseName(warehouseWaybillEntity.getDestinationWarehouseName()); + carsLoadWaybillInfoVO.setShipper(warehouseWaybillEntity.getShipper()); + carsLoadWaybillInfoVO.setShipperName(warehouseWaybillEntity.getShipperName()); + carsLoadWaybillInfoVO.setConsignee(warehouseWaybillEntity.getConsignee()); + carsLoadWaybillInfoVO.setConsigneeName(warehouseWaybillEntity.getConsigneeName()); + carsLoadWaybillInfoVO.setWaybillNum(totalCount); + carsLoadWaybillInfoVO.setWaybillType(warehouseWaybillEntity.getWaybillType()); + carsLoadWaybillInfoVO.setWaybillId(warehouseWaybillEntity.getId()); + carsLoadWaybillInfoVO.setRemark(warehouseWaybillEntity.getRemark()); + BigDecimal totalFreight = warehouseWaybillEntity.getTotalFreight(); + BigDecimal deliveryFee = warehouseWaybillEntity.getDeliveryFee(); + BigDecimal pickupFee = warehouseWaybillEntity.getPickupFee(); + BigDecimal warehouseManagementFee = warehouseWaybillEntity.getWarehouseManagementFee(); + BigDecimal storageFee = warehouseWaybillEntity.getStorageFee(); + BigDecimal handlingFee = warehouseWaybillEntity.getHandlingFee(); + BigDecimal otherFee = warehouseWaybillEntity.getOtherFee(); + BigDecimal insuranceFee = warehouseWaybillEntity.getInsuranceFee(); + carsLoadWaybillInfoVO.setTotalFreight(totalFreight); + carsLoadWaybillInfoVO.setDeliveryFee(deliveryFee); + carsLoadWaybillInfoVO.setPickupFee(pickupFee); + carsLoadWaybillInfoVO.setWarehouseManagementFee(warehouseManagementFee); + carsLoadWaybillInfoVO.setStorageFee(storageFee); + carsLoadWaybillInfoVO.setHandlingFee(handlingFee); + carsLoadWaybillInfoVO.setOtherFee(otherFee); + carsLoadWaybillInfoVO.setInsuranceFee(insuranceFee); + carsLoadWaybillInfoVO.setOpenPrice(totalFreight.divide(new BigDecimal(totalCount),2, RoundingMode.HALF_UP).toPlainString()); + carsLoadWaybillInfoVO.setTotalFee(totalFreight.add(deliveryFee).add(pickupFee).add(warehouseManagementFee).add(storageFee).add(handlingFee).add(otherFee).add(insuranceFee)); + TrunklineCostShareRecordEntity costShareRecordEntity = trunklineCostShareRecordService.findTotalUnloadNumByLoadAndWaybillNo(loadId, waybillNo); + carsLoadWaybillInfoVO.setCostPiece(costShareRecordEntity.getCostPiece()); + carsLoadWaybillInfoVO.setCostZhang(costShareRecordEntity.getCostZhang()); + carsLoadWaybillInfoVO.setCostNum(costShareRecordEntity.getNum()); + freightPrice = totalFreight.divide(BigDecimal.valueOf(warehouseWaybillEntity.getTotalCount()),4, RoundingMode.HALF_UP); + } + } + + List carsLoadOrderInfoList = new ArrayList<>(); + BigDecimal finalFreightPrice = freightPrice; + carsLoadScanAbnormalVOS.forEach(carsLoadScanAbnormalVO -> { + CarsLoadOrderInfoVO carsLoadOrderInfoVO = new CarsLoadOrderInfoVO(); + carsLoadOrderInfoVO.setOrderCode(carsLoadScanAbnormalVO.getOrderCode()); + carsLoadOrderInfoVO.setLoadingNum(carsLoadScanAbnormalVO.getLoadingNum()); + carsLoadOrderInfoVO.setUnloadNum(carsLoadScanAbnormalVO.getUnloadNum()); + BigDecimal unloadIncome = finalFreightPrice.multiply(BigDecimal.valueOf(carsLoadScanAbnormalVO.getUnloadNum())); + carsLoadOrderInfoVO.setUnloadIncome(unloadIncome.setScale(2,BigDecimal.ROUND_UP)); + carsLoadOrderInfoVO.setPlanNum(0); + String orderCode = carsLoadScanAbnormalVO.getOrderCode(); + if("--".equals(waybillNo) || "--".equals(orderCode)){ + carsLoadOrderInfoVO.setOrderNum(0); + carsLoadOrderInfoVO.setOrderFreight(BigDecimal.ZERO.setScale(2,BigDecimal.ROUND_UP)); + }else{ + Integer num = trunklineWaybillOrderService.findTotalNumByWaybillAndOrderCode(waybillNo, orderCode); + carsLoadOrderInfoVO.setOrderNum(num); + carsLoadOrderInfoVO.setOrderFreight(finalFreightPrice.multiply(new BigDecimal(num)).setScale(2,BigDecimal.ROUND_UP)); + } + TrunklineCostShareRecordEntity orderCostShareRecordEntity = trunklineCostShareRecordService.findTotalUnloadNumByLoadAndWaybillNoAndOrderCode(loadId,waybillNo,orderCode); + carsLoadOrderInfoVO.setCostZhang(orderCostShareRecordEntity.getCostZhang()); + carsLoadOrderInfoVO.setCostPiece(orderCostShareRecordEntity.getCostPiece()); +// carsLoadOrderInfoVO.setWeight(BigDecimal.ZERO); +// carsLoadOrderInfoVO.setVolume(BigDecimal.ZERO); + carsLoadOrderInfoList.add(carsLoadOrderInfoVO); + }); + carsLoadWaybillInfoVO.setCarsLoadOrderInfoList(carsLoadOrderInfoList); + + carsLoadWaybillInfoList.add(carsLoadWaybillInfoVO); + }); + + } + + //对元素中的waybillNo进行倒序排序 + carsLoadWaybillInfoList.sort(Comparator.comparing(CarsLoadWaybillInfoVO::getWaybillNo).reversed()); + trunklineCarsLoadVO.setCarsLoadWaybillInfoList(carsLoadWaybillInfoList); return R.data(trunklineCarsLoadVO); @@ -2905,6 +3279,9 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl map = new HashMap<>(); map.put("orders", orders); + WarehouseTrayTypeEntity trayTypeEntity = trayTypeClient.findTrayTypeEntity(trayCode); + if(!Objects.isNull(trayTypeEntity)){ + Integer totalNum = trayTypeEntity.getTotalNum(); + return Resp.scanData("打托成功", totalNum+"件",map); + } return R.data(map); } @@ -3167,8 +3554,7 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl loadScanQueryWrapper = new QueryWrapper<>(); loadScanQueryWrapper.eq("load_id", loadId) - .eq("scan_code", orderPackageCode) - .eq("scan_status", "1"); + .eq("scan_code", orderPackageCode); TrunklineCarsLoadScanEntity carsLoadScanEntity = trunklineCarsLoadScanService.getOne(loadScanQueryWrapper); //判断是否有装车扫描记录 if (Objects.isNull(carsLoadScanEntity)) { @@ -3177,31 +3563,72 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl unloadPackageList = batchUnloadDTO.getUnloadPackageList(); List unloadZeroList = batchUnloadDTO.getUnloadZeroList(); - for (UnloadPackageDTO unloadPackageDTO : unloadPackageList) { - String orderPackageCode = unloadPackageDTO.getOrderPackageCode(); - unloadPackage(loadId, orderPackageCode, warehouseId, 1, "批量卸车包件正常卸车", incomingType); - } - - for (UnloadZeroDTO unloadZeroDTO : unloadZeroList) { String waybillNo = unloadZeroDTO.getWaybillNo(); Integer enterNum = unloadZeroDTO.getEnterNum(); String trayCode = unloadZeroDTO.getTrayCode(); String orderCode = unloadZeroDTO.getOrderCode(); - unloadZero(loadId, waybillNo, enterNum, warehouseId, 1, trayCode, orderCode, "批量卸车零担正常卸车"); + } + + List carsLoadScanIds = new ArrayList<>(); + for (UnloadPackageDTO unloadPackageDTO : unloadPackageList) { + carsLoadScanIds.add(unloadPackageDTO.getCarsLoadScanId()); + } + + if (!carsLoadScanIds.isEmpty()) { + + Date date = new Date(); + List loadScanEntityList = trunklineCarsLoadScanService.findListByIdsNoPackage(carsLoadScanIds, warehouseId); + List parcelListEntities = trunklineCarsLoadScanService.findParceListByCarsLoadScanIds(carsLoadScanIds); + //把parcelListEntities转成orderPackageCode为键值的map + Map parcelListMap = parcelListEntities.stream().collect(Collectors.toMap(DistributionParcelListEntity::getOrderPackageCode, e -> e)); + List stockArticleEntities = trunklineCarsLoadScanService.findOrderListByCarsLoadScanIds(carsLoadScanIds); + //把stockArticleEntities转成orderCode为键值的map + Map stockArticleMap = stockArticleEntities.stream().collect(Collectors.toMap(DistributionStockArticleEntity::getOrderCode, e -> e)); +// List waybillEntities = trunklineCarsLoadScanService.findWaybillListByCarsLoadScanIds(carsLoadScanIds); +// //把waybillEntities转成WaybillNo为键值的map +// Map waybillMap = waybillEntities.stream().collect(Collectors.toMap(WarehouseWaybillEntity::getWaybillNo, e -> e)); + + List unloadLogList = new ArrayList<>(); + + List orderCodeList = trunklineCarsLoadScanService.findIncomingOrdeCodesByCarsLoadScanIds(carsLoadScanIds, warehouseId); + Map orderCodes = new HashMap<>(); + if (!Objects.isNull(orderCodeList)) { + Map finalOrderCodes2 = orderCodes; + orderCodeList.forEach(e -> { + String[] split = e.split("----"); + finalOrderCodes2.put(split[0], Long.valueOf(split[1])); + }); + orderCodes = finalOrderCodes2; + } + + List updateScanEntityList = new ArrayList<>(); + //把loadScanEntityList通过isData=0和isData=1分成两个新的list + List loadScanEntityListNoData = loadScanEntityList.stream().filter(e -> e.getIsData() == 0).collect(Collectors.toList()); + loadScanEntityListNoData.forEach(e -> { + Integer isAbnormal = 0; + String remark = "正常卸车"; + e.setScanStatus("2"); + e.setUnloadNodeId(warehouseId); + e.setUnloadNodeName(warehouseName); + e.setUnloadTime(date); + Long finalNodeId = e.getFinalNodeId(); + if (!finalNodeId.equals(warehouseId)) { + isAbnormal = 1; + remark = "卸车仓库与目的仓不一致,异常卸车"; + } + e.setUnloadAbnormal(isAbnormal); + e.setUnloadNum(1); + e.setUnloadUserName(nickName); + e.setUnloadTime(new Date()); + e.setRemark(remark); + updateScanEntityList.add(e); + + TrunklineCarsUnloadLogEntity entity = new TrunklineCarsUnloadLogEntity(); + entity.setTenantId(tenantId); + entity.setCreateUser(userId); + entity.setUpdateUser(userId); + entity.setCreateDept(deptId); + entity.setCreateTime(date); + entity.setUpdateTime(date); + entity.setWarehouseId(warehouseId); + entity.setWarehouseName(warehouseName); + entity.setLoadId(loadId); + entity.setLoadCode(carsLoadEntity.getCarsNo()); + entity.setWaybillId(e.getWaybillId()); + entity.setWaybillNo(e.getWaybillNo()); + entity.setOrderCode(e.getOrderCode()); + entity.setScanCode(e.getScanCode()); + entity.setNum(e.getUnloadNum()); + entity.setType(e.getType()); + entity.setIsData(e.getIsData()); + entity.setIsAbnormal(isAbnormal); + entity.setFromWarehouseId(e.getFromWarehouseId()); + entity.setLoadScanId(e.getId()); + entity.setRemark(remark); + unloadLogList.add(entity); + }); + + + //需要解托下架的包件嘛 + Map> unbingTrayAndDelAllocationPackages = new HashMap<>(); + //直接新增的包件 + List newParcelListEntities = new ArrayList<>(); + //需要修改仓库信息的打托数据 + List trayCodes = new ArrayList<>(); + List orderPackageCodes = new ArrayList<>(); + + + List loadScanEntityListHasData = loadScanEntityList.stream().filter(e -> e.getIsData() == 1).collect(Collectors.toList()); + //把loadScanEntityListHasData通过tray_code is null和tray_code is not null 分成两个新的list + List loadScanEntityListHasDataNoTray = loadScanEntityListHasData.stream().filter(e -> StringUtil.isBlank(e.getTrayCode())).collect(Collectors.toList()); + //把loadScanEntityListHasDataNoTray通过orderCode进行分组 + Map> loadScanEntityListHasDataNoTrayMap = loadScanEntityListHasDataNoTray.stream().collect(Collectors.groupingBy(TrunklineCarsLoadScanEntity::getOrderCode)); + Map finalOrderCodes = orderCodes; + loadScanEntityListHasDataNoTrayMap.keySet().forEach(e -> { + //判断是否有已经有order了 + Long orderId = null; + if (!finalOrderCodes.isEmpty()) { + orderId = finalOrderCodes.get(e); + } + + List carsLoadScanEntities = loadScanEntityListHasDataNoTrayMap.get(e); + + if (ObjectUtil.isNull(orderId)) { + //没有id + DistributionStockArticleEntity stockArticleEntity = stockArticleMap.get(e); + DistributionStockArticleEntity newStockArticleEntity = new DistributionStockArticleEntity(); + BeanUtil.copy(stockArticleEntity, newStockArticleEntity); + newStockArticleEntity.setId(null); + newStockArticleEntity.setCreateUser(userId); + newStockArticleEntity.setUpdateUser(userId); + newStockArticleEntity.setWarehouseId(warehouseId); + newStockArticleEntity.setWarehouse(warehouseName); + newStockArticleEntity.setHandQuantity(0); + newStockArticleEntity.setIncomingNum(0); + newStockArticleEntity.setCreateUserName(nickName); + newStockArticleEntity.setOrderStatus("10"); + newStockArticleEntity.setStockupStatus("10"); + newStockArticleEntity.setReservationStatus("10"); + newStockArticleEntity.setGroundingStatus("10"); + newStockArticleEntity.setOrderReceiveStatus("10"); + newStockArticleEntity.setFreezeStatus("10"); + orderId = distributionStockArticleClient.addData(newStockArticleEntity); + finalOrderCodes.put(e, orderId); + } + + + Long finalOrderId = orderId; + carsLoadScanEntities.forEach(p -> { + Long fromWarehouseId = p.getFromWarehouseId(); + DistributionParcelListEntity parcelListEntity = parcelListMap.get(p.getScanCode()); + Long acceptWarehouseId = parcelListEntity.getAcceptWarehouseId(); + DistributionParcelListEntity newNoOrderPackage = new DistributionParcelListEntity(); + BeanUtil.copy(parcelListEntity, newNoOrderPackage); + newNoOrderPackage.setId(null); + newNoOrderPackage.setCreateUser(userId); + newNoOrderPackage.setUpdateUser(userId); + newNoOrderPackage.setWarehouseId(warehouseId); + newNoOrderPackage.setWarehouse(warehouseName); + newNoOrderPackage.setStockArticleId(finalOrderId); + newNoOrderPackage.setTrainNumber(carsNo); + newNoOrderPackage.setOrderPackageStatus("20"); + newNoOrderPackage.setOrderPackageFreezeStatus("10"); + newNoOrderPackage.setOrderPackageGroundingStatus("10"); + newNoOrderPackage.setOrderPackageStockupStatus("10"); + newNoOrderPackage.setOrderPackageReservationStatus("10"); + newNoOrderPackage.setOrderPackageLoadingStatus("10"); + if (acceptWarehouseId.equals(warehouseId)) { + newNoOrderPackage.setIsTransfer(0); + } else { + newNoOrderPackage.setIsTransfer(1); + } + newParcelListEntities.add(newNoOrderPackage); + orderPackageCodes.add(p.getScanCode()); + + List list = unbingTrayAndDelAllocationPackages.get(fromWarehouseId); + if (Objects.isNull(list)) { + list = new ArrayList<>(); + list.add(p.getScanCode()); + } else { + list.add(p.getScanCode()); + } + unbingTrayAndDelAllocationPackages.put(fromWarehouseId, list); + + Integer isAbnormal = 0; + String remark = "正常卸车"; + p.setScanStatus("2"); + p.setUnloadNodeId(warehouseId); + p.setUnloadNodeName(warehouseName); + Long finalNodeId = p.getFinalNodeId(); + if (!finalNodeId.equals(warehouseId)) { + isAbnormal = 1; + remark = "卸车仓库与目的仓不一致,异常卸车"; + } + p.setUnloadAbnormal(isAbnormal); + p.setUnloadNum(1); + p.setUnloadUserName(nickName); + p.setUnloadTime(new Date()); + updateScanEntityList.add(p); + + + TrunklineCarsUnloadLogEntity entity = new TrunklineCarsUnloadLogEntity(); + entity.setTenantId(tenantId); + entity.setCreateUser(userId); + entity.setUpdateUser(userId); + entity.setCreateDept(deptId); + entity.setCreateTime(date); + entity.setUpdateTime(date); + entity.setWarehouseId(warehouseId); + entity.setWarehouseName(warehouseName); + entity.setLoadId(loadId); + entity.setLoadCode(carsLoadEntity.getCarsNo()); + entity.setWaybillId(p.getWaybillId()); + entity.setWaybillNo(p.getWaybillNo()); + entity.setOrderCode(p.getOrderCode()); + entity.setScanCode(p.getScanCode()); + entity.setNum(p.getUnloadNum()); + entity.setType(p.getType()); + entity.setIsData(p.getIsData()); + entity.setIsAbnormal(isAbnormal); + entity.setFromWarehouseId(fromWarehouseId); + entity.setLoadScanId(p.getId()); + entity.setRemark(remark); + unloadLogList.add(entity); + }); + + }); + orderCodes = finalOrderCodes; + + List loadScanEntityListHasDataHasTray = loadScanEntityListHasData.stream().filter(e -> StringUtil.isNotBlank(e.getTrayCode())).collect(Collectors.toList()); + //把loadScanEntityListHasDataHasTray通过TrayCode进行分组 + Map> loadScanEntityListHasDataHasTrayMap = loadScanEntityListHasDataHasTray.stream().collect(Collectors.groupingBy(TrunklineCarsLoadScanEntity::getTrayCode)); + Map finalOrderCodes1 = orderCodes; + loadScanEntityListHasDataHasTrayMap.keySet().forEach(o -> { + trayCodes.add(o); + List carsLoadScanEntities = loadScanEntityListHasDataHasTrayMap.get(o); + //把carsLoadScanEntities通过orderCode进行分组 + Map> carsLoadScanEntitiesMap = carsLoadScanEntities.stream().collect(Collectors.groupingBy(TrunklineCarsLoadScanEntity::getOrderCode)); + carsLoadScanEntitiesMap.keySet().forEach(e -> { + //判断是否有已经有order了 + Long orderId = finalOrderCodes1.get(e); + + if (ObjectUtil.isNull(orderId)) { + //没有id + DistributionStockArticleEntity stockArticleEntity = stockArticleMap.get(e); + DistributionStockArticleEntity newStockArticleEntity = new DistributionStockArticleEntity(); + BeanUtil.copy(stockArticleEntity, newStockArticleEntity); + newStockArticleEntity.setId(null); + newStockArticleEntity.setCreateUser(userId); + newStockArticleEntity.setUpdateUser(userId); + newStockArticleEntity.setWarehouseId(warehouseId); + newStockArticleEntity.setWarehouse(warehouseName); + newStockArticleEntity.setHandQuantity(0); + newStockArticleEntity.setIncomingNum(0); + newStockArticleEntity.setCreateUserName(nickName); + newStockArticleEntity.setOrderStatus("10"); + newStockArticleEntity.setStockupStatus("10"); + newStockArticleEntity.setReservationStatus("10"); + newStockArticleEntity.setGroundingStatus("10"); + newStockArticleEntity.setOrderReceiveStatus("10"); + newStockArticleEntity.setFreezeStatus("10"); + orderId = distributionStockArticleClient.addData(newStockArticleEntity); + finalOrderCodes1.put(e, orderId); + } + + + List carsLoadScanList = carsLoadScanEntitiesMap.get(e); + Long finalOrderId = orderId; + carsLoadScanList.forEach(p -> { + DistributionParcelListEntity parcelListEntity = parcelListMap.get(p.getScanCode()); + Long acceptWarehouseId = parcelListEntity.getAcceptWarehouseId(); + DistributionParcelListEntity newNoOrderPackage = new DistributionParcelListEntity(); + BeanUtil.copy(parcelListEntity, newNoOrderPackage); + newNoOrderPackage.setId(null); + newNoOrderPackage.setCreateUser(userId); + newNoOrderPackage.setUpdateUser(userId); + newNoOrderPackage.setWarehouseId(warehouseId); + newNoOrderPackage.setWarehouse(warehouseName); + newNoOrderPackage.setStockArticleId(finalOrderId); + newNoOrderPackage.setTrainNumber(carsNo); + newNoOrderPackage.setOrderPackageStatus("20"); + newNoOrderPackage.setOrderPackageFreezeStatus("10"); + newNoOrderPackage.setOrderPackageGroundingStatus("10"); + newNoOrderPackage.setOrderPackageStockupStatus("10"); + newNoOrderPackage.setOrderPackageReservationStatus("10"); + newNoOrderPackage.setOrderPackageLoadingStatus("10"); + if (acceptWarehouseId.equals(warehouseId)) { + newNoOrderPackage.setIsTransfer(0); + } else { + newNoOrderPackage.setIsTransfer(1); + } + newParcelListEntities.add(newNoOrderPackage); + orderPackageCodes.add(p.getScanCode()); + + + Integer isAbnormal = 0; + String remark = "正常卸车"; + p.setScanStatus("2"); + p.setUnloadNodeId(warehouseId); + p.setUnloadNodeName(warehouseName); + Long finalNodeId = p.getFinalNodeId(); + if (!finalNodeId.equals(warehouseId)) { + isAbnormal = 1; + remark = "卸车仓库与目的仓不一致,异常卸车"; + } + p.setUnloadAbnormal(isAbnormal); + p.setUnloadNum(1); + p.setUnloadUserName(nickName); + p.setUnloadTime(new Date()); + p.setRemark(remark); + updateScanEntityList.add(p); + + + TrunklineCarsUnloadLogEntity entity = new TrunklineCarsUnloadLogEntity(); + entity.setTenantId(tenantId); + entity.setCreateUser(userId); + entity.setUpdateUser(userId); + entity.setCreateDept(deptId); + entity.setCreateTime(date); + entity.setUpdateTime(date); + entity.setWarehouseId(warehouseId); + entity.setWarehouseName(warehouseName); + entity.setLoadId(loadId); + entity.setLoadCode(carsLoadEntity.getCarsNo()); + entity.setWaybillId(p.getWaybillId()); + entity.setWaybillNo(p.getWaybillNo()); + entity.setOrderCode(p.getOrderCode()); + entity.setScanCode(p.getScanCode()); + entity.setNum(p.getUnloadNum()); + entity.setType(p.getType()); + entity.setIsData(p.getIsData()); + entity.setIsAbnormal(isAbnormal); + entity.setFromWarehouseId(p.getFromWarehouseId()); + entity.setLoadScanId(p.getId()); + entity.setRemark(remark); + unloadLogList.add(entity); + + }); + }); + }); + + //直接新增的包件 + distributionParcelListClient.addBatch(newParcelListEntities); + if (CollUtil.isNotEmpty(newParcelListEntities)) { + for (DistributionParcelListEntity entity : newParcelListEntities) { + try { + // 发送入库消息 + OrderStatusDTO orderStatusDTO = new OrderStatusDTO(); + // 通过包件id 查询包件 + orderStatusDTO.setUnitNo(entity.getOrderPackageCode()); + orderStatusDTO.setOrderNo(entity.getOrderCode()); + orderStatusDTO.setStatus("4"); + orderStatusDTO.setOperationTime(DateUtil.now()); + orderStatusDTO.setCurrentWarehouse(warehouseId.toString()); + Map map = new HashMap<>(); + map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO)); + rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map); + NodePushMsg nodePushMsg = NodePushMsg.builder() + .operator(AuthUtil.getNickName()) + .operatorTime(new Date()) + .address("在【" + warehouseName + "】入库") + .brand(BrandEnums.getByValue(entity.getBrandName())) + .node(WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE) + .content(Collections.singletonList(PushData.builder() + .packageCode(entity.getOrderPackageCode()) + .warehouseName(warehouseName) + .waybillNumber(entity.getWaybillNumber()) + .orderCode(entity.getOrderCode()) + .build())) + .build(); + factoryDataMessageSender.sendNodeDataByBrand(nodePushMsg); + } catch (Exception e) { + log.error("推送卸车失败{}", e); + } + } + } + + trunklineCarsLoadScanService.updateBatchById(updateScanEntityList); + + carsLoadAsyncService.savaUnloadLogBatch(unloadLogList); +// trunklineCarsUnloadLogService.savaUnloadLogBatch(unloadLogList); + + //需要解托下架的包件嘛 + unbingTrayAndDelAllocationPackages.keySet().forEach(w -> { + List list = unbingTrayAndDelAllocationPackages.get(w); + updownTypeClient.downPackageOrDelTray(StringUtil.join(list), w, "批量入库解托下架"); + }); + + //需要修改仓库信息的打托数据 + trayCodes.forEach(trayCode -> { + trayTypeClient.changeTrayWarehouseInfo(trayCode, warehouseId); + }); + + newParcelListEntities.forEach(e -> { + carsLoadAsyncService.dealwithAfterAbnormalPackage(e.getOrderPackageCode(), warehouseId, warehouseName, carsLoadEntity.getCarsNo(), userId, deptId, nickName); + }); + + String content = "包件在 " + warehouseName + "卸车,卸车方式:" + IncomingTypeEnum.getValue(incomingType); + packageTrackLogAsyncService.addPackageTrackLog(tenantId, userId, deptId, nickName, orderPackageCodes, warehouseId, warehouseName, WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE.getCode(), content); } + updateNumByLoadId(loadId); + return R.success("卸车成功"); } @@ -3513,20 +4383,231 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl carsOrderIdList = new ArrayList<>(); for (String s : split) { carsOrderIdList.add(Long.parseLong(s)); } + Long carsOrderId = carsOrderIdList.get(0); + TrunklineCarsOrderEntity carsOrder = trunklineCarsOrderService.getById(carsOrderId); + loadId = carsOrder.getLoadId(); + + TrunklineCarsLoadEntity carsLoadEntity = baseMapper.selectById(loadId); + if(Objects.isNull(carsLoadEntity)){ + log.warn("###########updateWaybillOrderIsCustemer: 配载计划不存在 loadId={}",loadId); + return R.fail(405,"配载计划不存在"); + } + + + if("1".equals(isCustomer)){ + //直发商家添加 + List addCarsOrderEntityList = trunklineCarsOrderService.findMallOrderList(carsOrderIdList); + //把addCarsOrderEntityList中所有元素以mallName和nodeId作为key进行分组 + Map> addCarsOrderEntityMap = addCarsOrderEntityList.stream().collect(Collectors.groupingBy(TrunklineCarsOrderVO -> TrunklineCarsOrderVO.getMallName()+"&&"+TrunklineCarsOrderVO.getNodeId())); + + List signOrderEntityList = trunklineLoadSignOrderService.findAllLoadSignOrderList(loadId, warehouseId); + //把signOrderEntityList中所有元素转化成mallName和warehouseId作为key的map + Map signOrderEntityMap = signOrderEntityList.stream().collect(Collectors.toMap(TrunklineLoadSignOrderEntity -> TrunklineLoadSignOrderEntity.getMallName()+"&&"+TrunklineLoadSignOrderEntity.getWarehouseId(), Function.identity(), (k1, k2) -> k1)); + + List updateCarsOrderList = new ArrayList<>(); + + Long finalLoadId = loadId; + addCarsOrderEntityMap.keySet().forEach(key -> { + String[] split1 = key.split("&&"); + String mallName = split1[0]; + + List trunklineCarsOrderVOS = addCarsOrderEntityMap.get(key); + Long finalNodeId = trunklineCarsOrderVOS.get(0).getFinalNodeId(); + TrunklineLoadSignOrderEntity trunklineLoadSignOrderEntity = signOrderEntityMap.get(key); + if(Objects.isNull(trunklineLoadSignOrderEntity)){ + trunklineLoadSignOrderEntity = new TrunklineLoadSignOrderEntity(); + trunklineLoadSignOrderEntity.setLoadId(finalLoadId); + trunklineLoadSignOrderEntity.setWarehouseId(warehouseId); + trunklineLoadSignOrderEntity.setMallName(mallName); + //把trunklineCarsOrderVOS中所有元素的mallPerson去重后用,拼接 + trunklineLoadSignOrderEntity.setMallPerson(trunklineCarsOrderVOS.stream().map(TrunklineCarsOrderVO::getMallPerson).distinct().collect(Collectors.joining(","))); + trunklineLoadSignOrderEntity.setMallMobile(trunklineCarsOrderVOS.stream().map(TrunklineCarsOrderVO::getMallMobile).distinct().collect(Collectors.joining(","))); + trunklineLoadSignOrderEntity.setMallAddress(trunklineCarsOrderVOS.stream().map(TrunklineCarsOrderVO::getMallAddress).distinct().collect(Collectors.joining(","))); + trunklineLoadSignOrderEntity.setBelongToWarehouseId(warehouseId); + trunklineLoadSignOrderEntity.setBelongToWarehouseName(warehouseName); + //把trunklineCarsOrderVOS中所有元素的planNum求和 + trunklineLoadSignOrderEntity.setPlanNum(trunklineCarsOrderVOS.stream().mapToInt(TrunklineCarsOrderVO::getPlanNum).sum()); + trunklineLoadSignOrderEntity.setLoadingNum(trunklineCarsOrderVOS.stream().mapToInt(TrunklineCarsOrderVO::getRealNum).sum()); + trunklineLoadSignOrderEntity.setSignNum(0); + trunklineLoadSignOrderEntity.setSignStatus("0"); + trunklineLoadSignOrderEntity.setLoadSignCode(codeClient.getCodeByType(CodeNumConstant.TRUNKLINE_LOAD_SIGN, warehouseCode, "")); + trunklineLoadSignOrderEntity.setFinalNodeId(finalNodeId); + }else{ + //把trunklineCarsOrderVOS中所有元素的mallPerson去重后放入一个Set + Set mallPersonSet = trunklineCarsOrderVOS.stream() + .map(TrunklineCarsOrderVO::getMallPerson) + .collect(Collectors.toSet()); + mallPersonSet.add(trunklineLoadSignOrderEntity.getMallName()); + trunklineLoadSignOrderEntity.setMallPerson(String.join(",",mallPersonSet)); + Set mallMobileSet = trunklineCarsOrderVOS.stream() + .map(TrunklineCarsOrderVO::getMallMobile) + .collect(Collectors.toSet()); + mallMobileSet.add(trunklineLoadSignOrderEntity.getMallMobile()); + trunklineLoadSignOrderEntity.setMallMobile(String.join(",",mallMobileSet)); + Set mallAddressSet = trunklineCarsOrderVOS.stream() + .map(TrunklineCarsOrderVO::getMallMobile) + .collect(Collectors.toSet()); + mallAddressSet.add(trunklineLoadSignOrderEntity.getMallAddress()); + trunklineLoadSignOrderEntity.setMallAddress(String.join(",",mallAddressSet)); + int plan = trunklineCarsOrderVOS.stream().mapToInt(TrunklineCarsOrderVO::getPlanNum).sum() + trunklineLoadSignOrderEntity.getPlanNum(); + trunklineLoadSignOrderEntity.setPlanNum(plan); + trunklineLoadSignOrderEntity.setLoadingNum(trunklineCarsOrderVOS.stream().mapToInt(TrunklineCarsOrderVO::getRealNum).sum()+trunklineLoadSignOrderEntity.getLoadingNum()); + Integer signNum = trunklineLoadSignOrderEntity.getSignNum(); + if(signNum >= plan){ + trunklineLoadSignOrderEntity.setSignStatus("20"); + }else if(signNum == 0){ + trunklineLoadSignOrderEntity.setSignStatus("0"); + }else{ + trunklineLoadSignOrderEntity.setSignStatus("10"); + } + } + trunklineLoadSignOrderService.saveOrUpdate(trunklineLoadSignOrderEntity); + Long signOrderId = trunklineLoadSignOrderEntity.getId(); + + + + trunklineCarsOrderVOS.forEach(trunklineCarsOrderVO -> { + Long nodeId = trunklineCarsOrderVO.getNodeId(); + String waybillNo = trunklineCarsOrderVO.getWaybillNo(); + String orderCode = trunklineCarsOrderVO.getOrderCode(); + TrunklineCarsOrderEntity updateCarsOrder = new TrunklineCarsOrderEntity(); + updateCarsOrder.setId(trunklineCarsOrderVO.getId()); + updateCarsOrder.setNodeId(nodeId); + updateCarsOrder.setWaybillNo(waybillNo); + updateCarsOrder.setOrderCode(orderCode); + updateCarsOrder.setIsCustomer("1"); + updateCarsOrder.setSignOrderId(signOrderId); + updateCarsOrderList.add(updateCarsOrder); + }); + + }); + + if(CollUtil.isNotEmpty(updateCarsOrderList)){ + trunklineCarsOrderService.updateBatchById(updateCarsOrderList); + updateCarsOrderList.forEach(e -> { + Long nodeId = e.getNodeId(); + String orderCode = e.getOrderCode(); + String waybillNo = e.getWaybillNo(); + Long signOrderId = e.getSignOrderId(); + trunklineCarsLoadScanService.addSignOrderIdByLoadIdAndNodeIdAndOrderCodeAndWaybillNo(finalLoadId, nodeId, orderCode, waybillNo, signOrderId); + }); + } + + }else{ + //直发商家移除 + List dealwithCarsOrderIdList = new ArrayList<>(); + List carsOrderEntityList = trunklineCarsOrderService.listByIds(carsOrderIdList); + //移除carsOrderEntityList中signNum不为0的元素 + carsOrderEntityList.removeIf(e -> e.getSignNum() != 0); + if(CollUtil.isNotEmpty(carsOrderEntityList)){ + //把carsOrderEntityList通过signOrderId进行分组 + Map> collect = carsOrderEntityList.stream().collect(Collectors.groupingBy(TrunklineCarsOrderEntity::getSignOrderId)); + Set signOrderIds = collect.keySet(); + List signOrderEntityList = trunklineLoadSignOrderService.listByIds(signOrderIds); + //把signOrderEntityList转化成id为key的Map + Map signOrderEntityMap = signOrderEntityList.stream().collect(Collectors.toMap(TrunklineLoadSignOrderEntity::getId, Function.identity())); + + + List updateCarsOrderList = new ArrayList<>(); + List updateSignOrderList = new ArrayList<>(); + List delSignOrderList = new ArrayList<>(); + + Long finalLoadId1 = loadId; + collect.keySet().forEach(signOrderId -> { + List list = collect.get(signOrderId); + TrunklineLoadSignOrderEntity trunklineLoadSignOrderEntity = signOrderEntityMap.get(signOrderId); + //把list中所有元素的realNum求和 + int sumLoading = list.stream().mapToInt(TrunklineCarsOrderEntity::getRealNum).sum(); + int sumPlan = list.stream().mapToInt(TrunklineCarsOrderEntity::getPlanNum).sum(); + Integer planNum = trunklineLoadSignOrderEntity.getPlanNum(); + Integer loadingNum = trunklineLoadSignOrderEntity.getLoadingNum(); + Integer signNum = trunklineLoadSignOrderEntity.getSignNum(); + if(sumPlan < planNum){ + //只是更新不删除 + TrunklineLoadSignOrderEntity updateSignOrderEntity = new TrunklineLoadSignOrderEntity(); + updateSignOrderEntity.setId(trunklineLoadSignOrderEntity.getId()); + int diff = planNum - sumPlan; + updateSignOrderEntity.setPlanNum(diff); + updateSignOrderEntity.setLoadingNum(loadingNum-sumLoading); + if(signNum >= diff){ + updateSignOrderEntity.setSignStatus("20"); + }else if(signNum == 0){ + updateSignOrderEntity.setSignStatus("0"); + }else{ + updateSignOrderEntity.setSignStatus("10"); + } + updateSignOrderList.add(updateSignOrderEntity); + }else{ + //删除 + delSignOrderList.add(signOrderId); + } + list.forEach(e -> { + TrunklineCarsOrderEntity carsOrderEntity = new TrunklineCarsOrderEntity(); + carsOrderEntity.setId(e.getId()); + carsOrderEntity.setOrderCode(e.getOrderCode()); + carsOrderEntity.setWaybillNo(e.getWaybillNo()); + carsOrderEntity.setLoadId(finalLoadId1); + carsOrderEntity.setNodeId(e.getNodeId()); + updateCarsOrderList.add(carsOrderEntity); + }); + + }); + + if(CollUtil.isNotEmpty(updateSignOrderList)){ + trunklineLoadSignOrderService.updateBatchById(updateSignOrderList); + } + if(CollUtil.isNotEmpty(delSignOrderList)){ + trunklineLoadSignOrderService.deleteListBySignOrderIds(delSignOrderList); + } + if(CollUtil.isNotEmpty(updateCarsOrderList)){ + //把updateCarsOrderIdList所有的id放入一个List + List updateCarsOrderIdList = updateCarsOrderList.stream().map(TrunklineCarsOrderEntity::getId).collect(Collectors.toList()); + trunklineCarsOrderService.updateNoCustomer(updateCarsOrderIdList); + updateCarsOrderList.forEach(e -> { + Long nodeId = e.getNodeId(); + String orderCode = e.getOrderCode(); + String waybillNo = e.getWaybillNo(); + trunklineCarsLoadScanService.clearSignOrderIdByLoadIdAndWarehouseIdAndOrderCodeAndWaybillNo(finalLoadId1,nodeId,orderCode,waybillNo); + }); + } + }else{ + log.warn("###############updateWaybillOrderIsCustemer: 订单已有签收数据不能移除"); + return R.fail(405,"订单已有签收数据,不能移除"); + } + } - baseMapper.updateWaybillOrderIsCustemer(carsOrderIdList, isCustomer); + List signOrderList =trunklineLoadSignOrderService.findSignOrderListByLoadId(loadId); + String isCustomer1 = carsLoadEntity.getIsCustomer(); + if(CollUtil.isNotEmpty(signOrderList)){ + if("2".equals(isCustomer1)){ + carsLoadEntity.setIsCustomer("1"); + updateById(carsLoadEntity); + } + }else{ + if("1".equals(isCustomer1)){ + carsLoadEntity.setIsCustomer("2"); + updateById(carsLoadEntity); + } + } return R.success("更新成功"); } @@ -3542,7 +4623,7 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl pageList = trunklineLoadSignOrderService.finaSignOrderList(page, loadCarsDTO); @@ -3567,38 +4648,48 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl signScanOrderList = trunklineCarsOrderService.findSignOrderList(loadId, warehouseId); + List signScanOrderList = trunklineCarsOrderService.findSignOrderList(loadId, fromWarehouseId,signOrderId); for (SignScanOrderVO signScanOrderVO : signScanOrderList) { String waybillNo = signScanOrderVO.getWaybillNo(); String orderCode = signScanOrderVO.getOrderCode(); - List signPackageList = trunklineCarsLoadScanService.findSignPackageList(loadId, warehouseId, orderCode, waybillNo); + List signPackageList = trunklineCarsLoadScanService.findSignPackageList(loadId, fromWarehouseId, orderCode, waybillNo); signScanOrderVO.setSignPackageList(signPackageList); } - List signScanZeroOrderList = trunklineCarsOrderService.findSignZeroOrderList(loadId, warehouseId); + List signScanZeroOrderList = trunklineCarsOrderService.findSignZeroOrderList(loadId, fromWarehouseId,signOrderId); for (SignScanOrderVO signScanOrderVO : signScanZeroOrderList) { String waybillNo = signScanOrderVO.getWaybillNo(); String orderCode = signScanOrderVO.getOrderCode(); - List signPackageList = trunklineCarsLoadScanService.findSignPackageList(loadId, warehouseId, orderCode, waybillNo); + List signPackageList = trunklineCarsLoadScanService.findSignPackageList(loadId, fromWarehouseId, orderCode, waybillNo); signScanOrderVO.setSignPackageList(signPackageList); } + //查询异常列表 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("load_id", loadId) + .eq("unload_node_id", warehouseId) + .eq("sign_abnormal", 1); + List exceptionList = trunklineCarsLoadScanService.list(queryWrapper); + + List signPhotoList = loadSignPhotoService.findBySignPhotoList(signOrderId); Map map = new HashMap<>(); map.put("signOrder", signOrderVO); map.put("signScanOrderList", signScanOrderList); map.put("signScanZeroOrderList", signScanZeroOrderList); + map.put("exceptionList", exceptionList); map.put("signPhotoList", signPhotoList); return R.data(map); } @Override - public R signScanPackageCode(Long signOrderId, String orderPackageCode, String remark) { + public R signScanPackageCode(Long signOrderId, String orderPackageCode, String remark,Long warehouseId) { TrunklineLoadSignOrderEntity signOrderEntity = trunklineLoadSignOrderService.getById(signOrderId); if (Objects.isNull(signOrderEntity)) { @@ -3606,7 +4697,7 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl contents = new ArrayList<>(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("packageCode", orderPackageCode); - contents.add(jsonObject); + PushData pushData = PushData.builder() + .packageCode(parcelListEntity.getOrderPackageCode()) + .waybillNumber(parcelListEntity.getWaybillNumber()) + .warehouseName(warehouseEntity.getName()) + .orderCode(parcelListEntity.getOrderCode()) + .build(); + contents.add(pushData); NodePushMsg msg = new NodePushMsg(); - msg.setNode(WorkNodeEnums.CLERK_REVIEW); + msg.setNode(WorkNodeEnums.SIGN_DIRECT_SHIPPER); msg.setBrand(BrandEnums.getByValue(parcelListEntity.getBrandName())); msg.setOperator(AuthUtil.getNickName()); msg.setOperatorTime(new Date()); @@ -3792,16 +4968,17 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl= loadingNum) { signOrderEntity.setSignStatus("20"); signOrderEntity.setSignTime(new Date()); } else { signOrderEntity.setSignStatus("10"); + signOrderEntity.setSignTime(new Date()); } trunklineLoadSignOrderService.updateById(signOrderEntity); @@ -3809,7 +4986,7 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl pageList = trunklineLoadSignOrderService.finaSignOrderList(page, loadCarsDTO); + List records = pageList.getRecords(); + for (TrunklineLoadSignOrderVO record : records) { + Long id = record.getId(); + List bySignPhotoList = loadSignPhotoService.findBySignPhotoList(id); + record.setSignPhotoList(bySignPhotoList); + } + pageList.setRecords(records); return R.data(pageList); } @@ -3882,44 +5089,104 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl loadScanIds = loadCarsDTO.getLoadScanIds(); + Long warehouseId = loadCarsDTO.getWarehouseId(); + String warehouseName = loadCarsDTO.getWarehouseName(); - List list = trunklineCarsLoadScanService.findListByIds(loadScanIds); + List list = trunklineCarsLoadScanService.findListHasSignOrderIdByIds(loadScanIds); + List parcelListEntityList = trunklineCarsLoadScanService.findParceListByCarsLoadScanIds(loadScanIds); + //把parcelListEntityList通过orderPackageCode分组 + Map> parcelListMap = parcelListEntityList.stream().collect(Collectors.groupingBy(DistributionParcelListEntity::getOrderPackageCode)); - for (TrunklineCarsLoadScanEntity carsLoadScanEntity : list) { - Long loadScanId = carsLoadScanEntity.getId(); - Long loadId = carsLoadScanEntity.getLoadId(); - Long warehouseId = carsLoadScanEntity.getWarehouseId(); - String orderCode = carsLoadScanEntity.getOrderCode(); - String waybillNo = carsLoadScanEntity.getWaybillNo(); - String scanCode = carsLoadScanEntity.getScanCode(); - Integer num = carsLoadScanEntity.getNum(); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("load_id", loadId) - .eq("node_id", warehouseId) - .eq("order_code", orderCode) - .eq("waybill_no", waybillNo); - TrunklineCarsOrderEntity one = trunklineCarsOrderService.getOne(queryWrapper); - if (Objects.isNull(one)) { - log.warn("############batchSign: 包件不在该车次中 "); - return R.fail(405, "包件不在该车次中"); - } + List signOrderIds = new ArrayList<>(); + List updateCarsLoadScanList = new ArrayList<>(); + List updateParcelList = new ArrayList<>(); - String isCustomer = one.getIsCustomer(); - if ("0".equals(isCustomer)) { - log.warn("############batchSign: 订单不是直发商家订单 orderCode={} waybillNo={}", orderCode, waybillNo); - return R.fail(405, "订单不是直发商家订单"); - } + Date date = new Date(); - Long signOrderId = one.getSignOrderId(); + if (!list.isEmpty()) { + //排除list中scanStatus = 1的数据 + list = list.stream().filter(e -> "1".equals(e.getScanStatus())).collect(Collectors.toList()); - Integer type = carsLoadScanEntity.getType(); - if (1 == type) { - signScanPackageCode(signOrderId, scanCode, "PC批量签收"); - } else if (2 == type) { - signZeroOrder(signOrderId, loadScanId, num, "PC批量签收"); + List orderPackageCodes = new ArrayList<>(); + + Set loadIds = new HashSet<>(); + //把list通过signOrderId进行分组 + Map> map = list.stream().filter(e -> !Objects.isNull(e.getSignOrderId())).collect(Collectors.groupingBy(TrunklineCarsLoadScanVO::getSignOrderId)); + map.keySet().forEach(e -> { + List trunklineCarsLoadScanVOS = map.get(e);//该签收单对应的包件 + trunklineCarsLoadScanVOS.forEach(t -> { + TrunklineCarsLoadScanEntity entity = new TrunklineCarsLoadScanEntity(); + BeanUtil.copy(t, entity); + entity.setScanStatus("3"); + entity.setUnloadNum(t.getNum()); + entity.setSignTime(date); + entity.setSignUserName(AuthUtil.getNickName()); + entity.setUnloadUserName(AuthUtil.getNickName()); + entity.setUnloadTime(date); + entity.setUnloadNodeId(warehouseId); + entity.setUnloadNodeName(warehouseName); + if (entity.getType().equals(1)) { + String scanCode = entity.getScanCode(); + List parcelList = parcelListMap.get(scanCode); + if (!Objects.isNull(parcelList)) { + parcelList.forEach(p -> { + p.setOrderPackageStatus("70"); + updateParcelList.add(p); + }); + } + orderPackageCodes.add(entity.getScanCode()); + } + updateCarsLoadScanList.add(entity); + loadIds.add(entity.getLoadId()); + }); + signOrderIds.add(e); + }); + + trunklineCarsLoadScanService.updateBatchById(updateCarsLoadScanList); + + //生成签收记录 + trunklineCarsSignLogService.addList(updateCarsLoadScanList, "PC批量签收"); + + //重新计算数量 + loadIds.forEach(this::updateNumByLoadId); + + //重新计算签收单的数量 + signOrderIds.forEach(this::updateSignOrderNumBySignOrderId); + + distributionParcelListClient.updateList(updateParcelList); + + try { + String content = "包件在 " + warehouseName + "直发商家签收"; + packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(), AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getNickName(), orderPackageCodes, warehouseId, warehouseName, WorkNodeEnums.SIGN_DIRECT_SHIPPER.getCode(), content); + } catch (Exception e) { + log.warn("###########存入日志信息失败"); } - } + // 推送签收数据给工厂 + try { + updateParcelList.forEach(parcelListEntity -> { + if (ObjectUtil.isNotEmpty(parcelListEntity)) { + List contents = new ArrayList<>(); + PushData pushData = PushData.builder() + .packageCode(parcelListEntity.getOrderPackageCode()) + .orderCode(parcelListEntity.getOrderCode()) + .warehouseName(warehouseName) + .waybillNumber(parcelListEntity.getWaybillNumber()).build(); + contents.add(pushData); + NodePushMsg msg = new NodePushMsg(); + msg.setNode(WorkNodeEnums.SIGN_DIRECT_SHIPPER); + msg.setBrand(BrandEnums.getByValue(parcelListEntity.getBrandName())); + msg.setOperator(AuthUtil.getNickName()); + msg.setOperatorTime(new Date()); + msg.setContent(contents); + log.info("推送工厂数据:{}", JSONUtil.toJsonStr(msg)); + factoryDataMessageSender.sendNodeDataByBrand(msg); + } + }); + } catch (Exception e) { + log.error("推送签收数据给工厂失败 {}", e); + } + } return R.success("签收完成"); } @@ -3952,12 +5219,14 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl carsOrderEntityList = trunklineCarsOrderService.findListByLoadIdAndNodeId(loadId, warehouseId); - for (TrunklineCarsOrderEntity carsOrderEntity : carsOrderEntityList) { - Integer type = carsOrderEntity.getType(); - Integer realNum = carsOrderEntity.getRealNum(); - if (type.equals(1)) { - //订制品订单 - String orderCode = carsOrderEntity.getOrderCode(); - Integer planNum = carsOrderEntity.getPlanNum(); - List entityListByOrderCode = distributionParcelListClient.findEntityListByOrderCodeAndStatus(orderCode, warehouseId, "20"); - int size = entityListByOrderCode.size(); - if (planNum.equals(size + realNum)) { - for (DistributionParcelListEntity parcelListEntity : entityListByOrderCode) { - String orderPackageCode = parcelListEntity.getOrderPackageCode(); - //查询包件是否已经装车 - TrunklineCarsLoadScanEntity carsLoadScanEntity = trunklineCarsLoadScanService.findEntityByLoadIdAndOrderPackageCode(loadId, orderPackageCode); - if (Objects.isNull(carsLoadScanEntity)) { - loadingScan(loadId, warehouseId, orderPackageCode, null, "手动一键装车"); - } + //把carsOrderEntityList通过type分组成两个新的集合 + List packageOrderList = carsOrderEntityList.stream().filter(e -> e.getType().equals(1)).collect(Collectors.toList()); + List zeroOrderList = carsOrderEntityList.stream().filter(e -> e.getType().equals(2)).collect(Collectors.toList()); + //零担批量装车 + zeroOrderList.stream().forEach(e -> { + //零担订单 + Integer realNum = e.getRealNum(); + String orderCode = e.getOrderCode(); + String waybillNo = e.getWaybillNo(); + Integer planNum = e.getPlanNum(); + if (realNum.equals(0)) { + loadingZero(loadId, warehouseId, waybillNo, orderCode, null, planNum, "手动一键装车"); + } + }); + + List addCarsLoadScanList = new ArrayList<>(); + List addPackageTrackLogList = new ArrayList<>(); + List orderPackageCodes = new ArrayList<>(); + List parcelList = new ArrayList<>(); + packageOrderList.stream().forEach(e -> { + Integer realNum = e.getRealNum(); + String orderCode = e.getOrderCode(); + Integer planNum = e.getPlanNum(); + String waybillNo = e.getWaybillNo(); + Long finalNodeId = e.getFinalNodeId(); + String finalNodeName = null; + BasicdataWarehouseEntity finalNodeWarehouse = basicdataWarehouseClient.getEntityWarehouseId(finalNodeId); + if (Objects.nonNull(finalNodeWarehouse)) { + finalNodeName = finalNodeWarehouse.getName(); + } + List entityListByOrderCode = distributionParcelListClient.findEntityListByOrderCodeAndStatus(orderCode, warehouseId, "20", waybillNo); + int size = entityListByOrderCode.size(); + if (planNum.equals(size + realNum)) { + for (DistributionParcelListEntity parcelListEntity : entityListByOrderCode) { + String orderPackageCode = parcelListEntity.getOrderPackageCode(); + TrunklineCarsLoadScanEntity carsLoadScanEntity = new TrunklineCarsLoadScanEntity(); + carsLoadScanEntity.setLoadId(loadId); + carsLoadScanEntity.setWarehouseId(warehouseId); + carsLoadScanEntity.setWarehouseName(warehouseName); + carsLoadScanEntity.setLoadCode(carsNo); + carsLoadScanEntity.setWaybillId(parcelListEntity.getWaybillId()); + carsLoadScanEntity.setWaybillNo(parcelListEntity.getWaybillNumber()); + carsLoadScanEntity.setOrderCode(parcelListEntity.getOrderCode()); + carsLoadScanEntity.setScanCode(orderPackageCode); + carsLoadScanEntity.setScanStatus("1"); + carsLoadScanEntity.setNum(1); + carsLoadScanEntity.setType(1); + carsLoadScanEntity.setIsData(1); + carsLoadScanEntity.setLoadingAbnormal(0); + carsLoadScanEntity.setUnloadAbnormal(0); + carsLoadScanEntity.setFromWarehouseId(warehouseId); + carsLoadScanEntity.setUnloadNum(0); + carsLoadScanEntity.setFinalNodeId(finalNodeId); + carsLoadScanEntity.setFinalNodeName(finalNodeName); + carsLoadScanEntity.setUnloadCheck(0); + carsLoadScanEntity.setIsSupple(0); + carsLoadScanEntity.setLoadingUserName(AuthUtil.getNickName()); + addCarsLoadScanList.add(carsLoadScanEntity); + + Date date = new Date(); + WarehousePackageTrackLogEntity warehousePackageTrackLogEntity = new WarehousePackageTrackLogEntity(); + warehousePackageTrackLogEntity.setTenantId(tenantId); + warehousePackageTrackLogEntity.setCreateUser(userId); + warehousePackageTrackLogEntity.setCreateTime(date); + warehousePackageTrackLogEntity.setUpdateUser(userId); + warehousePackageTrackLogEntity.setUpdateTime(date); + warehousePackageTrackLogEntity.setIsDeleted(0); + warehousePackageTrackLogEntity.setStatus(1); + warehousePackageTrackLogEntity.setCreateDept(deptId); + warehousePackageTrackLogEntity.setOrderPackageCode(orderPackageCode); + warehousePackageTrackLogEntity.setWarehouseId(warehouseId); + warehousePackageTrackLogEntity.setWarehouseName(warehouseName); + warehousePackageTrackLogEntity.setWorkNode(WorkNodeEnums.INITIAL_WAREHOUSE_LOADING.getCode()); + String content = "包件在 " + warehouseName + "手动批量装车,配载计划目的仓 " + carsLoadScanEntity.getFinalNodeName() + ",数据来源仓库 " + warehouseName; + warehousePackageTrackLogEntity.setContent(content); + warehousePackageTrackLogEntity.setOperator(nickName); + addPackageTrackLogList.add(warehousePackageTrackLogEntity); + orderPackageCodes.add(orderPackageCode); + // 推送包件装车信息到工厂 + pushFactoryOrderData(warehouseId, orderPackageCode, orderCode); + try { + NodePushMsg nodePushMsg = NodePushMsg.builder() + .operator(AuthUtil.getNickName()) + .operatorTime(new Date()) + .address("在【" + warehouseName + "】出库") + .brand(BrandEnums.getByValue(parcelListEntity.getBrandName())) + .node(WorkNodeEnums.INITIAL_WAREHOUSE_LOADING) + .content(Collections.singletonList(PushData.builder() + .packageCode(orderPackageCode) + .orderCode(orderCode) + .warehouseName(warehouseName) + .build())) + .build(); + factoryDataMessageSender.sendNodeDataByBrand(nodePushMsg); + }catch (Exception e1){ + log.error("推送数据失败",e1); } } - } else if (type.equals(2)) { - //零担订单 - String orderCode = carsOrderEntity.getOrderCode(); - String waybillNo = carsOrderEntity.getWaybillNo(); - Integer planNum = carsOrderEntity.getPlanNum(); -// Integer realNum = carsOrderEntity.getRealNum(); - if (realNum.equals(0)) { - loadingZero(loadId, warehouseId, waybillNo, orderCode, null, planNum, "手动一键装车"); - } } - } + }); + + distributionParcelListClient.updatePackageStatus(orderPackageCodes, warehouseId, "60"); + + trunklineCarsLoadScanService.saveBatch(addCarsLoadScanList); + + updateNumByLoadId(loadId); + + addCarsLoadScanList.forEach(e -> { + trunklineCarsLoadingLogService.savaLoadingLog(warehouseId, warehouseName, loadId, e.getLoadCode(), e.getWaybillId(), e.getWaybillNo(), e.getOrderCode(), e.getScanCode(), 1, + 1, 1, 0, null, null, null, e.getFromWarehouseId(), e.getId(), remark); + }); + + packageTrackLogAsyncService.addBatchPackageTrackLog(addPackageTrackLogList, orderPackageCodes, WorkNodeEnums.INITIAL_WAREHOUSE_LOADING.getCode(), null); return R.success("装车完成"); } @@ -4105,25 +5462,104 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl orderPackageCodes = trunklineCarsLoadScanService.findSignListOrderPackageCodesByIds(loadScanIds); + trunklineCarsLoadScanService.updateScanStatusAndTime(loadScanIds, "3", new Date(),AuthUtil.getNickName(),warehouseId,warehouseEntity.getName()); + + List orderPackageCodes = trunklineCarsLoadScanService.findSignListOrderPackageCodesByIds(loadScanIds); + + //通过loadId查询是否所有包件都签收了 + Integer num = trunklineCarsLoadScanService.findSignNumByLoadId(loadId); + if (realLoadingNumber.equals(num)) { + carsLoadEntity.setSignTime(date); + carsLoadEntity.setLoadStatus("90"); + } else { + carsLoadEntity.setSignTime(date); + carsLoadEntity.setLoadStatus("91"); + } + + updateById(carsLoadEntity); + + //包件签收状态修改 + distributionParcelListClient.updatePackageStatus(orderPackageCodes, warehouseId, "70"); + + waybillPackageService.updatePackageStatus(orderPackageCodes, WorkNodeEnums.SIGN_TRIPARTITE_TRANSFER_DEPART.getCode(),warehouseId, null); + try { String content = "包件在" + warehouseEntity.getName() + "被三方中转签收"; packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(), AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getNickName(), orderPackageCodes, warehouseId, warehouseEntity.getName(), WorkNodeEnums.SIGN_TRIPARTITE_TRANSFER_DEPART.getCode(), content); } catch (Exception e) { log.warn("###########存入日志失败"); } - + // 推送签收数据给工厂 + sendFactorySignTriparite(warehouseId, orderPackageCodes, warehouseEntity); return R.success("签收成功"); } + private void sendFactorySignTriparite(Long warehouseId, List orderPackageCodes, BasicdataWarehouseEntity warehouseEntity) { + try { + FindParamterDTO paramterDTO = new FindParamterDTO(); + paramterDTO.setOrderPackageCodeList(orderPackageCodes); + paramterDTO.setWarehouseId(warehouseId); + List listByOrderPackageCodeList = distributionParcelListClient.findListByOrderPackageCodeList(paramterDTO); + if (CollUtil.isNotEmpty(listByOrderPackageCodeList)) { + // 按品牌分组 + Map> map = listByOrderPackageCodeList.stream().collect(Collectors.groupingBy(DistributionParcelListEntity::getBrandName)); + for (Map.Entry> entry : map.entrySet()) { + String key = entry.getKey(); + List value = entry.getValue(); + NodePushMsg msg = new NodePushMsg(); + msg.setNode(WorkNodeEnums.SIGN_TRIPARTITE_TRANSFER_DEPART); + msg.setBrand(BrandEnums.getByValue(key)); + msg.setOperator(AuthUtil.getNickName()); + msg.setOperatorTime(new Date()); + msg.setContent(value.stream().map(item -> { + return PushData.builder() + .packageCode(item.getOrderPackageCode()) + .orderCode(item.getOrderCode()) + .warehouseName(warehouseEntity.getName()) + .waybillNumber(item.getWaybillNumber()).build(); + }).collect(Collectors.toList())); + log.info("推送工厂数据:{}", JSONUtil.toJsonStr(msg)); + factoryDataMessageSender.sendNodeDataByBrand(msg); + } + } + } catch (Exception e) { + log.error("推送签收数据给工厂失败 {}", e); + } + } + @Override public R findCarsLoadLogs(LoadCarsDTO loadCarsDTO) { @@ -4330,12 +5766,32 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl signPhotoList = loadCarsDTO.getSignPhotoList(); List oldSignPhotoList = loadSignPhotoService.findBySignPhotoList(signOrderId); loadSignPhotoService.removeBatchByIds(oldSignPhotoList); loadSignPhotoService.saveBatch(signPhotoList); + TrunklineLoadSignOrderEntity signOrderEntity = trunklineLoadSignOrderService.getById(signOrderId); + if(Objects.isNull(signOrderEntity)){ + + TrunklineCarsLoadEntity carsLoadEntity = baseMapper.selectById(signOrderId); + if(!Objects.isNull(carsLoadEntity)){ + //三方中转上传图片 + TrunklineCarsLoadLineEntity carsLoadLineEntity = trunklineCarsLoadLineService.findEntityByLoadIdAndNodeId(signOrderId, warehouseId); + if(!Objects.isNull(carsLoadLineEntity)){ + trunklineCarsLoadLogService.saveLog(carsLoadEntity, carsLoadLineEntity, CarsLoadLogTypeConstant.TRIPARTITE_TRANSFER_SIGNPHOTO.getValue()); + } + } + + }else{ + //直发商家签收单 + + + } + + return R.success("添加成功"); } @@ -4478,6 +5934,140 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl loadingDetailExport(LoadCarsDTO loadCarsDTO) { + return trunklineCarsLoadScanService.loadingDetailExport(loadCarsDTO); + } + + @Override + public R tripartiteTransferFindSignPhoto(LoadCarsDTO loadCarsDTO) { + List signPhotoEntityList = loadSignPhotoService.findBySignPhotoList(loadCarsDTO.getLoadId()); + + return R.data(signPhotoEntityList); + } + + @Override + public R tripartiteTransferUploadSignPhoto(LoadCarsDTO loadCarsDTO) { + Long signOrderId = loadCarsDTO.getSignOrderId(); + List signPhotoList = loadCarsDTO.getSignPhotoList(); + List oldSignPhotoList = loadSignPhotoService.findBySignPhotoList(signOrderId); + //修改oldSignPhotoList中所有对象的type为2 + oldSignPhotoList.forEach(e -> { + e.setPhotoType(2); + }); + + loadSignPhotoService.removeBatchByIds(oldSignPhotoList); + loadSignPhotoService.saveBatch(signPhotoList); + + + return R.success("上传成功"); + } + + @Override + public R findWarehouseUnloadReport(LoadCarsDTO loadCarsDTO) { + Long loadId = loadCarsDTO.getLoadId(); + Long warehouseId = loadCarsDTO.getWarehouseId(); + + TrunklineCarsLoadEntity carsLoadEntity = baseMapper.selectById(loadId); + if (Objects.isNull(carsLoadEntity)) { + log.warn("##############findWarehouseUnloadReport: 找不到对应的配载信息"); + return R.fail(405, "找不到对应的配载信息"); + } + String carsNo = carsLoadEntity.getCarsNo(); + + TrunklineCarsLoadLineEntity carsLoadLineEntity = trunklineCarsLoadLineService.findEntityByLoadIdAndNodeId(loadId, warehouseId); + //判空 + if (Objects.isNull(carsLoadLineEntity)) { + log.warn("##############findWarehouseUnloadReport: 找不到对应的配载节点信息"); + return R.fail(405, "找不到对应的配载节点信息"); + } + String nodeName = carsLoadLineEntity.getNodeName(); + Integer unloadReportStatus = carsLoadLineEntity.getUnloadReportStatus(); + if (unloadReportStatus.equals(0)) { + log.warn("##############findWarehouseUnloadReport: {} 还未卸车确认", nodeName); + return R.fail(405, nodeName + "还未卸车确认"); + } + + Map map = new HashMap<>(); + map.put("one", carsLoadLineEntity.getReportOne()); + map.put("two", carsLoadLineEntity.getReportTwo()); + + JSONObject abnormalRecord = abnormalRecordClient.findListByCarsNoAndUpWarehouseId(carsNo, warehouseId); + + map.put("three", "当前待处理异常 " + abnormalRecord.getInteger("dealwithNum") + " 条、已处理异常 " + abnormalRecord.getInteger("noDealwithNum") + " 条"); + + return R.data(map); + } + + @Override + public R findSignOrderPageList(LoadCarsDTO loadCarsDTO) { + + IPage page = new Page<>(); + page.setCurrent(loadCarsDTO.getPageNum()); + page.setSize(loadCarsDTO.getPageSize()); + + IPage ls = trunklineLoadSignOrderService.findSignOrderPageList(page, loadCarsDTO); + + return R.data(ls); + } + + @Override + public R findSignPhotoList(LoadCarsDTO loadCarsDTO) { + Long signOrderId = loadCarsDTO.getSignOrderId(); + List ls = loadSignPhotoService.findBySignPhotoList(signOrderId); + + return R.data(ls); + } + + @Override + public R adnormalHasStock(Long carsLoadScanId, Long warehouseId) { + TrunklineCarsLoadScanEntity trunklineCarsLoadScan = trunklineCarsLoadScanService.getById(carsLoadScanId); + if(Objects.isNull(trunklineCarsLoadScan)){ + log.warn("###############adnormalHasStock: 装车明细不存在"); + return R.fail(405, "装车明细不存在"); + } + Long loadId = trunklineCarsLoadScan.getLoadId(); + Integer type = trunklineCarsLoadScan.getType(); + String scanCode = trunklineCarsLoadScan.getScanCode(); + Integer num = trunklineCarsLoadScan.getNum(); + String trayCode = trunklineCarsLoadScan.getTrayCode(); + String waybillNo = trunklineCarsLoadScan.getWaybillNo(); + String orderCode = trunklineCarsLoadScan.getOrderCode(); + if(type==1){ + //包件 + DistributionParcelListEntity parcelListEntity = distributionParcelListClient.findByPacketBarCodeAndWarehouseId(scanCode, warehouseId); + if(Objects.isNull(parcelListEntity)){ + log.info("#########adnormalHasStock: 包件信息不存在"); + Integer unbingTray = 0; + if(StringUtil.isNotBlank(trayCode)){ + unbingTray = 1; + } + unloadPackage(loadId,scanCode,warehouseId,unbingTray,IncomingTypeEnum.ABNORMAL_INCOMING.getValue(),IncomingTypeEnum.ABNORMAL_INCOMING.getCode()); + }else{ + String orderPackageStatus = parcelListEntity.getOrderPackageStatus(); + if("20".equals(orderPackageStatus)){ + log.warn("#########adnormalHasStock: 包件已入库 scanCode={} warehouseId={}",scanCode,warehouseId); + return R.fail(405,"包件已入库"); + }else{ + Integer unbingTray = 0; + if(StringUtil.isNotBlank(trayCode)){ + unbingTray = 1; + } + unloadPackage(loadId,scanCode,warehouseId,unbingTray,IncomingTypeEnum.ABNORMAL_INCOMING.getValue(),IncomingTypeEnum.ABNORMAL_INCOMING.getCode()); + } + } + }else{ + Integer unbingTray = 0; + if(StringUtil.isNotBlank(trayCode)){ + unbingTray = 1; + } + //零担 + unloadZero(loadId,waybillNo,num,warehouseId,unbingTray,trayCode,orderCode,"异常列表入库"); + + } + return R.success("入库成功"); + } + @Override public R loadingTrayInfo(LoadCarsDTO loadCarsDTO) { log.info("##############loadingTrayInfo: 查询托盘的货物信息"); @@ -4615,6 +6205,7 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl orderPackageCodes = new ArrayList<>(); orderPackageCodes.add(scanCode); @@ -4718,9 +6312,9 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl pageList = baseMapper.arriveUnloadPageList(page, loadCarsDTO); @@ -4777,11 +6371,153 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl carsLoadScanIdList, Long loadId, Long warehouseId) { + + TrunklineCarsLoadEntity carsLoadEntity = baseMapper.selectById(loadId); + if (Objects.isNull(carsLoadEntity)) { + log.warn("##################removeCarsLoadScanListByCancelLoad: 配载计划不存在 loadId={}", loadId); + return R.fail(405, "配载计划不存在"); + } + + Long nowWarehouseId = carsLoadEntity.getNowWarehouseId(); + + if (!nowWarehouseId.equals(warehouseId)) { + log.warn("##################removeCarsLoadScanListByCancelLoad: 暂未有权限进行操作 nowWarehouseId={} warehouseId={}", nowWarehouseId, warehouseId); + return R.fail(405, "暂未有权限进行操作"); + } + String loadStatus = carsLoadEntity.getLoadStatus(); + if (!"100".equals(loadStatus)) { + log.warn("##################removeCarsLoadScanListByCancelLoad: 当前配载计划不属于取消配载状态 loadStatus={} warehouseId={}", loadStatus, warehouseId); + return R.fail(405, "当前配载计划不属于取消配载状态"); + } + + TrunklineCarsLoadLineEntity carsLoadLineEntity = trunklineCarsLoadLineService.findEntityByLoadIdAndNodeId(loadId, warehouseId); + if (Objects.isNull(carsLoadLineEntity)) { + log.warn("##################removeCarsLoadScanListByCancelLoad: 当前节点信息不存在 loadId={} warehouseId={}", loadId, warehouseId); + return R.fail(405, "当前节点信息不存在"); + } + + String nodeStatus = carsLoadLineEntity.getNodeStatus(); + if (!"10".equals(nodeStatus)) { + log.warn("##################removeCarsLoadScanListByCancelLoad: 当前节点不是到车状态 nodeStatus={} warehouseId={}", nodeStatus, warehouseId); + return R.fail(405, "当前节点不是到车状态"); + } + + BasicdataWarehouseEntity basicdataWarehouse = basicdataWarehouseClient.getEntityWarehouseId(warehouseId); + if(Objects.isNull(basicdataWarehouse)){ + log.warn("##################removeCarsLoadScanListByCancelLoad: 仓库信息不存在 warehouseId={}", warehouseId); + return R.fail(405, "仓库信息不存在"); + } + + String warehouseName = basicdataWarehouse.getName(); + + List trunklineCarsLoadScanEntities = trunklineCarsLoadScanService.listByIds(carsLoadScanIdList); + + //把trunklineCarsLoadScanEntities只提取isData等于1的数据 + List hasDataScanEntites = trunklineCarsLoadScanEntities.stream().filter(carsLoadScanEntity -> carsLoadScanEntity.getIsData() == 1).collect(Collectors.toList()); + + + //把hasDataScanEntites通过fromWarehouseId进行分组 + Map> fromWarehouseIdMap = hasDataScanEntites.stream().collect(Collectors.groupingBy(TrunklineCarsLoadScanEntity::getFromWarehouseId)); + + List updateStockArticleList = new ArrayList<>(); + List updateParcelListList = new ArrayList<>(); + + fromWarehouseIdMap.keySet().forEach(fromWarehouseId -> { + List scanEntities = fromWarehouseIdMap.get(fromWarehouseId); + //把scanEntities中所有元素的以orderCode进行分组 + Map> orderCodeMap = scanEntities.stream().collect(Collectors.groupingBy(TrunklineCarsLoadScanEntity::getOrderCode)); + Set orderCodeSet = orderCodeMap.keySet(); + FindParamterDTO findParamterDTO = new FindParamterDTO(); + findParamterDTO.setOrderCodeSet(orderCodeSet); + findParamterDTO.setWarehouseId(fromWarehouseId); + List stockArticleEntityList = distributionStockArticleClient.findListByOrderCodesAndWarehouseId(findParamterDTO); + //把stockArticleEntityList转化成OrderCode为key的Map + Map stockArticleMap = stockArticleEntityList.stream().collect(Collectors.toMap(DistributionStockArticleEntity::getOrderCode, Function.identity())); + + orderCodeMap.keySet().forEach(orderCode -> { + DistributionStockArticleEntity stockArticle = stockArticleMap.get(orderCode); + if(!Objects.isNull(stockArticle)){ + List orderCodeEntities = orderCodeMap.get(orderCode); + //把orderCodeEntities中所有元素的num求和 + Integer num = orderCodeEntities.stream().map(TrunklineCarsLoadScanEntity::getNum).reduce(Integer::sum).get(); + DistributionStockArticleEntity updateStockArticle = new DistributionStockArticleEntity(); + updateStockArticle.setId(stockArticle.getId()); + updateStockArticle.setHandQuantity(stockArticle.getHandQuantity() + num); + updateStockArticleList.add(updateStockArticle); + } + }); + + //把scanEntities通过只保留type等于1的数据 + List type1ScanEntities = scanEntities.stream().filter(carsLoadScanEntity -> carsLoadScanEntity.getType() == 1).collect(Collectors.toList()); + //把type1ScanEntities中所有元素的scanCode放入一个Set + Set scanCodeSet = type1ScanEntities.stream().map(TrunklineCarsLoadScanEntity::getScanCode).collect(Collectors.toSet()); + findParamterDTO.setOrderPackageCodeList(new ArrayList<>(scanCodeSet)); + List parcelListEntityList = distributionParcelListClient.findListByOrderPackageCodeList(findParamterDTO); + parcelListEntityList.forEach(parcelListEntity -> { + Long waybillId = parcelListEntity.getWaybillId(); + DistributionParcelListEntity parcelList = new DistributionParcelListEntity(); + parcelList.setId(parcelListEntity.getId()); + parcelList.setOrderPackageStatus("20"); + if(!Objects.isNull(waybillId)){ + Long acceptWarehouseId = parcelListEntity.getAcceptWarehouseId(); + if(acceptWarehouseId.equals(fromWarehouseId)){ + parcelList.setIsTransfer(0); + }else{ + parcelList.setIsTransfer(1); + } + } + updateParcelListList.add(parcelList); + }); + }); + + if(CollUtil.isNotEmpty(updateStockArticleList)){ + distributionStockArticleClient.updateByBatchId(updateStockArticleList); + } + + if(CollUtil.isNotEmpty(updateParcelListList)){ + distributionParcelListClient.updateList(updateParcelListList); + } + + if(CollUtil.isNotEmpty(carsLoadScanIdList)){ + trunklineCarsLoadScanService.deleteListByCarsLoadScanIds(carsLoadScanIdList); + } + + if(CollUtil.isNotEmpty(trunklineCarsLoadScanEntities)){ + //把trunklineCarsLoadScanEntities中所有元素保留type等于1的数据 + List type1ScanEntities = trunklineCarsLoadScanEntities.stream().filter(carsLoadScanEntity -> carsLoadScanEntity.getType() == 1).collect(Collectors.toList()); + //把type1ScanEntities通过finalNodeId进行分组 + Map> finalNodeIdMap = type1ScanEntities.stream().collect(Collectors.groupingBy(TrunklineCarsLoadScanEntity::getFinalNodeName)); + finalNodeIdMap.keySet().forEach(finalNodeName -> { + List finalNodeIdEntities = finalNodeIdMap.get(finalNodeName); + List orderPackageCodes = new ArrayList<>(); + finalNodeIdEntities.forEach(carsLoadScanEntity -> { + Integer type = carsLoadScanEntity.getType(); + if(type.equals(1)){ + orderPackageCodes.add(carsLoadScanEntity.getScanCode()); + } + }); + String content = "包件在 " + warehouseName + "取消装车,配载计划目的仓 " + finalNodeName; + packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(), AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getNickName(), orderPackageCodes, warehouseId, warehouseName, WorkNodeEnums.CANCEL_INITIAL_WAREHOUSE_LOADING.getCode(), content); + }); + } + + + if (!Objects.isNull(loadId)) { + updateNumByLoadId(loadId); + } + + return R.success("删除成功"); + } + + @Override public R unloadPackage(Long loadId, String orderPackageCode, Long warehouseId, Integer unbindTray, String remark, Integer incomingType) { log.info("#############unloadPackage: 卸车包件"); @@ -4799,6 +6535,17 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl loadScanQueryWrapper = new QueryWrapper<>(); + QueryWrapper loadScanQueryWrapper = new QueryWrapper<>(); loadScanQueryWrapper.eq("load_id", loadId) - .eq("scan_code", orderPackageCode) - .eq("scan_status", "1"); + .eq("scan_code", orderPackageCode); TrunklineCarsLoadScanEntity carsLoadScanEntity = trunklineCarsLoadScanService.getOne(loadScanQueryWrapper); //判断是否有装车扫描记录 if (Objects.isNull(carsLoadScanEntity)) { //没有装车扫码记录 + //不在计划中,则查询在哪个仓库中 DistributionParcelListEntity parcelListEntity = distributionParcelListClient.findByOrderPackageCodeAndStatus(orderPackageCode); Long loadScanId = null; if (Objects.isNull(parcelListEntity)) { //没有包件数据 + TrunklineAdvanceDetailEntity advanceDetailEntity = trunklineAdvanceDetailService.findEntityByOrderPackageCode(orderPackageCode); + if(!Objects.isNull(advanceDetailEntity)){ + String packageStatus = advanceDetailEntity.getPackageStatus(); + if("0".equals(packageStatus)){ + InComingDTO inComingDTO = new InComingDTO(); + inComingDTO.setOrderPackageCode(orderPackageCode); + inComingDTO.setIncomingType(incomingType); + inComingDTO.setWarehouseId(warehouseId); + inComingService.incomingPackage(inComingDTO); - InComingDTO inComingDTO = new InComingDTO(); - inComingDTO.setOrderPackageCode(orderPackageCode); - inComingDTO.setIncomingType(incomingType); - inComingDTO.setWarehouseId(warehouseId); - inComingService.incomingPackage(inComingDTO); -// int code = r.getCode(); -// if(code != 200){ -// log.warn("##############unloadPackage: 包件入库失败"); -// } + //需要补装车扫记录 + TrunklineCarsLoadScanEntity trunklineCarsLoadScanEntity = new TrunklineCarsLoadScanEntity(); + trunklineCarsLoadScanEntity.setWarehouseId(warehouseId); + trunklineCarsLoadScanEntity.setWarehouseName(warehouseName); + trunklineCarsLoadScanEntity.setOrderCode(advanceDetailEntity.getOrderCode()); + trunklineCarsLoadScanEntity.setWaybillId(advanceDetailEntity.getWaybillId()); + trunklineCarsLoadScanEntity.setWaybillNo(advanceDetailEntity.getWaybillNo()); + trunklineCarsLoadScanEntity.setLoadId(loadId); + trunklineCarsLoadScanEntity.setLoadCode(loadCode); + trunklineCarsLoadScanEntity.setScanCode(orderPackageCode); + trunklineCarsLoadScanEntity.setScanStatus("2"); + trunklineCarsLoadScanEntity.setNum(1); + trunklineCarsLoadScanEntity.setType(1); + trunklineCarsLoadScanEntity.setIsData(1); + trunklineCarsLoadScanEntity.setLoadingAbnormal(1); + trunklineCarsLoadScanEntity.setUnloadAbnormal(1); + trunklineCarsLoadScanEntity.setUnloadNodeName(warehouseName); + trunklineCarsLoadScanEntity.setUnloadNodeId(warehouseId); + trunklineCarsLoadScanEntity.setUnloadNum(1); + trunklineCarsLoadScanEntity.setIsSupple(0); + trunklineCarsLoadScanEntity.setLoadingUserName(AuthUtil.getNickName()); + trunklineCarsLoadScanEntity.setUnloadUserName(AuthUtil.getNickName()); + trunklineCarsLoadScanEntity.setUnloadTime(new Date()); + trunklineCarsLoadScanService.save(trunklineCarsLoadScanEntity); + loadScanId = trunklineCarsLoadScanEntity.getId(); + + trunklineCarsLoadingLogService.savaLoadingLog(warehouseId, warehouseName, loadId, loadCode, null, null, null, orderPackageCode, 1, + 1, 1, 1, trayId, trayCode, trayName, null, loadScanId, "有数据,补装车计划,异常装车"); + + trunklineCarsUnloadLogService.savaUnloadLog(warehouseId, warehouseName, loadId, loadCode, null, null, null, orderPackageCode, 1, + 1, 1, 1, trayId, trayCode, trayName, null, loadScanId, "有数据,异常卸车"); + + }else{ + //已入库 + Long nowWarehouseId = advanceDetailEntity.getNowWarehouseId(); + String nowWarehouseName = advanceDetailEntity.getNowWarehouseName(); + + //需要补装车扫记录 + TrunklineCarsLoadScanEntity trunklineCarsLoadScanEntity = new TrunklineCarsLoadScanEntity(); + trunklineCarsLoadScanEntity.setWarehouseId(warehouseId); + trunklineCarsLoadScanEntity.setWarehouseName(warehouseName); + trunklineCarsLoadScanEntity.setOrderCode(advanceDetailEntity.getOrderCode()); + trunklineCarsLoadScanEntity.setWaybillId(advanceDetailEntity.getWaybillId()); + trunklineCarsLoadScanEntity.setWaybillNo(advanceDetailEntity.getWaybillNo()); + trunklineCarsLoadScanEntity.setLoadId(loadId); + trunklineCarsLoadScanEntity.setLoadCode(loadCode); + trunklineCarsLoadScanEntity.setScanCode(orderPackageCode); + trunklineCarsLoadScanEntity.setScanStatus("2"); + trunklineCarsLoadScanEntity.setNum(1); + trunklineCarsLoadScanEntity.setType(1); + trunklineCarsLoadScanEntity.setIsData(1); + trunklineCarsLoadScanEntity.setLoadingAbnormal(1); + trunklineCarsLoadScanEntity.setUnloadAbnormal(1); + trunklineCarsLoadScanEntity.setUnloadNodeName(warehouseName); + trunklineCarsLoadScanEntity.setUnloadNodeId(warehouseId); + trunklineCarsLoadScanEntity.setUnloadNum(1); + trunklineCarsLoadScanEntity.setIsSupple(0); + trunklineCarsLoadScanEntity.setLoadingUserName(AuthUtil.getNickName()); + trunklineCarsLoadScanEntity.setUnloadUserName(AuthUtil.getNickName()); + trunklineCarsLoadScanEntity.setUnloadTime(new Date()); + trunklineCarsLoadScanEntity.setFromWarehouseId(nowWarehouseId); + trunklineCarsLoadScanEntity.setRemark("无装车记录卸车"); + trunklineCarsLoadScanService.save(trunklineCarsLoadScanEntity); + loadScanId = trunklineCarsLoadScanEntity.getId(); + + trunklineCarsLoadingLogService.savaLoadingLog(warehouseId, warehouseName, loadId, loadCode, null, null, null, orderPackageCode, 1, + 1, 1, 1, trayId, trayCode, trayName, null, loadScanId, "有数据,无计划,无装车,补装车计划,异常装车"); + + trunklineCarsUnloadLogService.savaUnloadLog(warehouseId, warehouseName, loadId, loadCode, null, null, null, orderPackageCode, 1, + 1, 1, 1, trayId, trayCode, trayName, null, loadScanId, "有数据,无计划,无装车,异常卸车"); + + //无装车记录异常日志记录 + try { + carsLoadAsyncService.abnormalListUnloadByLoadIdAndWarehouseId(loadId, warehouseId, warehouseName, loadScanId, AuthUtil.getTenantId(), AuthUtil.getUserId(), AuthUtil.getNickName(), Func.firstLong(AuthUtil.getDeptId())); + } catch (Exception e) { + log.warn("###############unloadPackage: 存入异常列表记录失败"); + } - //需要补装车扫记录 - TrunklineCarsLoadScanEntity trunklineCarsLoadScanEntity = new TrunklineCarsLoadScanEntity(); - trunklineCarsLoadScanEntity.setWarehouseId(warehouseId); - trunklineCarsLoadScanEntity.setWarehouseName(warehouseName); - trunklineCarsLoadScanEntity.setLoadId(loadId); - trunklineCarsLoadScanEntity.setLoadCode(loadCode); - trunklineCarsLoadScanEntity.setScanCode(orderPackageCode); - trunklineCarsLoadScanEntity.setScanStatus("2"); - trunklineCarsLoadScanEntity.setNum(1); - trunklineCarsLoadScanEntity.setType(1); - trunklineCarsLoadScanEntity.setIsData(0); - trunklineCarsLoadScanEntity.setLoadingAbnormal(1); - trunklineCarsLoadScanEntity.setUnloadAbnormal(1); - trunklineCarsLoadScanEntity.setUnloadNodeId(warehouseId); - trunklineCarsLoadScanEntity.setUnloadNum(1); - trunklineCarsLoadScanEntity.setIsSupple(0); - trunklineCarsLoadScanEntity.setLoadingUserName(AuthUtil.getNickName()); - trunklineCarsLoadScanEntity.setUnloadUserName(AuthUtil.getNickName()); - trunklineCarsLoadScanService.save(trunklineCarsLoadScanEntity); - loadScanId = trunklineCarsLoadScanEntity.getId(); - trunklineCarsLoadingLogService.savaLoadingLog(warehouseId, warehouseName, loadId, loadCode, null, null, null, orderPackageCode, 1, - 1, 0, 1, trayId, trayCode, trayName, null, loadScanId, "无数据,补装车计划,异常装车"); + DistributionParcelListEntity nowParcelListEntity = distributionParcelListClient.findByPacketBarCodeAndWarehouseId(orderPackageCode, nowWarehouseId); + if(Objects.isNull(nowParcelListEntity)){ + log.warn("###############unloadPackage: 包件信息不存在 orderPackageCode={},nowWarehouseId={}",orderPackageCode,nowWarehouseId); + return R.fail(405,"包件信息不存在"); + } + orderCode = nowParcelListEntity.getOrderCode(); + Long packageId = nowParcelListEntity.getId(); + String orderPackageStatus = nowParcelListEntity.getOrderPackageStatus(); + String waybillNumber = nowParcelListEntity.getWaybillNumber(); + + DistributionStockArticleEntity nowDistributionStockArticle = distributionStockArticleClient.findStockArticleByOrderCodeAndWarehouseId(orderCode, nowWarehouseId); + if(Objects.isNull(nowDistributionStockArticle)){ + log.warn("###############unloadPackage: 订单信息不存在 orderCode={},nowWarehouseId={}",orderCode,nowWarehouseId); + return R.fail(405,"订单信息不存在"); + } + Long articleId = nowDistributionStockArticle.getId(); - trunklineCarsUnloadLogService.savaUnloadLog(warehouseId, warehouseName, loadId, loadCode, null, null, null, orderPackageCode, 1, - 1, 0, 1, trayId, trayCode, trayName, null, loadScanId, "无数据,异常卸车"); + if(!"70".equals(orderPackageStatus)){ + distributionStockArticleClient.submitHandleNumByOrderId(1, articleId); + distributionParcelListClient.updateOrderPackageCodeById(packageId, "60"); + } + + + Long currentOrderId = null; + //查询当前仓库订单信息有没有 + DistributionStockArticleEntity currentStockArticleEntity = distributionStockArticleClient.findStockArticleByOrderCodeAndWarehouseId(orderCode, warehouseId); + if (Objects.isNull(currentStockArticleEntity)) { + //查询包件前面仓的订单信息 + currentStockArticleEntity = new DistributionStockArticleEntity(); + BeanUtil.copy(nowDistributionStockArticle, currentStockArticleEntity); + currentStockArticleEntity.setId(null); + currentStockArticleEntity.setWarehouseId(warehouseId); + currentStockArticleEntity.setWarehouse(warehouseName); + currentStockArticleEntity.setHandQuantity(0); + currentStockArticleEntity.setCompleteSet(1); + currentStockArticleEntity.setStockupStatus("10"); + currentStockArticleEntity.setReservationStatus("10"); + currentStockArticleEntity.setOrderStatus("10"); + currentStockArticleEntity.setGroundingStatus("10"); + currentStockArticleEntity.setOrderReceiveStatus("10"); + currentStockArticleEntity.setFreezeStatus("10"); + currentStockArticleEntity.setSortingQuantity(0); + currentStockArticleEntity.setDeliveryQuantity(0); + currentStockArticleEntity.setTransferQuantity(0); + currentStockArticleEntity.setSigninQuantity(0); + currentStockArticleEntity.setIncomingNum(0); + currentOrderId = distributionStockArticleClient.addData(currentStockArticleEntity); + currentStockArticleEntity.setId(currentOrderId); + } else { + currentOrderId = currentStockArticleEntity.getId(); + } + + //判断包件当前仓是否是目的仓 + WarehouseWaybillEntity warehouseWaybillEntity = warehouseWaybillClient.findByWaybillNo(waybillNumber); + + if (Objects.isNull(distributionParcelListEntity)) { + distributionParcelListEntity = new DistributionParcelListEntity(); + BeanUtil.copy(nowParcelListEntity, distributionParcelListEntity); + distributionParcelListEntity.setId(null); + distributionParcelListEntity.setIsTransfer(1); + if (!Objects.isNull(warehouseWaybillEntity)) { + Long destinationWarehouseId = warehouseWaybillEntity.getDestinationWarehouseId();//目的仓 + if (destinationWarehouseId.equals(warehouseId)) { + distributionParcelListEntity.setIsTransfer(0); + } + } + distributionParcelListEntity.setAdvanceId(nowParcelListEntity.getAdvanceId()); + distributionParcelListEntity.setOrderPackageStatus("20"); + distributionParcelListEntity.setWarehouseId(warehouseId); + distributionParcelListEntity.setWarehouse(warehouseName); + distributionParcelListEntity.setTrainNumber(loadCode); + distributionParcelListEntity.setStockArticleId(currentOrderId); + distributionParcelListEntity.setOrderPackageFreezeStatus("10"); + distributionParcelListEntity.setOrderPackageGroundingStatus("10"); + distributionParcelListEntity.setOrderPackageStockupStatus("10"); + distributionParcelListEntity.setOrderPackageReservationStatus("10"); + distributionParcelListEntity.setOrderPackageLoadingStatus("10"); + distributionParcelListEntity.setWarehouseEntryTimeEnd(new Date()); + boolean add = distributionParcelListClient.add(distributionParcelListEntity); + if (add) { + distributionStockArticleClient.addIncomingNum(currentOrderId, 1); + } + } else { + distributionParcelListEntity.setOrderPackageStatus("20"); + if (!Objects.isNull(warehouseWaybillEntity)) { + Long destinationWarehouseId = warehouseWaybillEntity.getDestinationWarehouseId();//目的仓 + if (destinationWarehouseId.equals(warehouseId)) { + distributionParcelListEntity.setIsTransfer(0); + } else { + distributionParcelListEntity.setIsTransfer(1); + } + } + distributionParcelListClient.update(distributionParcelListEntity); + } + updownTypeClient.downPackageOrDelTray(orderPackageCode, nowWarehouseId, "干线卸车下架解托"); + } + }else{ + //需要补装车扫记录 + TrunklineCarsLoadScanEntity trunklineCarsLoadScanEntity = new TrunklineCarsLoadScanEntity(); + trunklineCarsLoadScanEntity.setWarehouseId(warehouseId); + trunklineCarsLoadScanEntity.setWarehouseName(warehouseName); + trunklineCarsLoadScanEntity.setLoadId(loadId); + trunklineCarsLoadScanEntity.setLoadCode(loadCode); + trunklineCarsLoadScanEntity.setOrderCode("--"); + trunklineCarsLoadScanEntity.setScanCode(orderPackageCode); + trunklineCarsLoadScanEntity.setScanStatus("2"); + trunklineCarsLoadScanEntity.setNum(1); + trunklineCarsLoadScanEntity.setType(1); + trunklineCarsLoadScanEntity.setIsData(0); + isData=0; + trunklineCarsLoadScanEntity.setLoadingAbnormal(1); + trunklineCarsLoadScanEntity.setUnloadAbnormal(1); + trunklineCarsLoadScanEntity.setUnloadNodeName(warehouseName); + trunklineCarsLoadScanEntity.setUnloadNodeId(warehouseId); + trunklineCarsLoadScanEntity.setUnloadNum(1); + trunklineCarsLoadScanEntity.setIsSupple(0); + trunklineCarsLoadScanEntity.setLoadingUserName(AuthUtil.getNickName()); + trunklineCarsLoadScanEntity.setUnloadUserName(AuthUtil.getNickName()); + trunklineCarsLoadScanEntity.setUnloadTime(new Date()); + trunklineCarsLoadScanService.save(trunklineCarsLoadScanEntity); + loadScanId = trunklineCarsLoadScanEntity.getId(); + + trunklineCarsLoadingLogService.savaLoadingLog(warehouseId, warehouseName, loadId, loadCode, null, null, null, orderPackageCode, 1, + 1, 0, 1, trayId, trayCode, trayName, null, loadScanId, "无数据,补装车计划,异常装车"); + + trunklineCarsUnloadLogService.savaUnloadLog(warehouseId, warehouseName, loadId, loadCode, null, null, null, orderPackageCode, 1, + 1, 0, 1, trayId, trayCode, trayName, null, loadScanId, "无数据,异常卸车"); + } } else { String waybillNumber = parcelListEntity.getWaybillNumber(); - String orderCode = parcelListEntity.getOrderCode(); + orderCode = parcelListEntity.getOrderCode(); Long wid = parcelListEntity.getWarehouseId(); String wName = parcelListEntity.getWarehouse(); Long pacakageId = parcelListEntity.getId(); @@ -4913,8 +6842,10 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl orderPackageCodes = new ArrayList<>(); orderPackageCodes.add(orderPackageCode); String content = "包件在 " + warehouseName + "卸车,卸车方式:" + IncomingTypeEnum.getValue(incomingType); packageTrackLogAsyncService.addPackageTrackLog(AuthUtil.getTenantId(), AuthUtil.getUserId(), Func.firstLong(AuthUtil.getDeptId()), AuthUtil.getNickName(), orderPackageCodes, warehouseId, warehouseName, WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE.getCode(), content); + try { + if (StrUtil.isNotEmpty(orderCode)) { + // 发送入库消息 + OrderStatusDTO orderStatusDTO = new OrderStatusDTO(); + // 通过包件id 查询包件 + orderStatusDTO.setUnitNo(orderPackageCode); + orderStatusDTO.setOrderNo(orderCode); + orderStatusDTO.setStatus("4"); + orderStatusDTO.setOperationTime(DateUtil.now()); + orderStatusDTO.setCurrentWarehouse(warehouseId.toString()); + Map map = new HashMap<>(); + map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO)); + rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map); + + NodePushMsg nodePushMsg = NodePushMsg.builder() + .operator(AuthUtil.getNickName()) + .operatorTime(new Date()) + .address("在【" + warehouseName + "】入库") + .brand(BrandEnums.getByValue(distributionParcelListEntity.getBrandName())) + .node(WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE) + .content(Collections.singletonList(PushData.builder() + .packageCode(orderPackageCode) + .warehouseName(warehouseName) + .orderCode(orderCode) + .build())) + .build(); + factoryDataMessageSender.sendNodeDataByBrand(nodePushMsg); + } + } catch (Exception e) { + log.error("入库推送失败:{}", e); + } } catch (Exception e) { - log.warn("#########3卸车存入日志失败"); + log.warn("#########卸车存入日志失败"); } - return R.success("卸车成功"); + JSONObject jsonObject = trunklineCarsLoadScanService.findUnloadNumAudio(loadId,warehouseId); + Integer totalUnloadNum = jsonObject.getInteger("totalUnloadNum"); + Integer abnormalUnloadNum = jsonObject.getInteger("abnormalUnloadNum"); + StringBuilder audio = new StringBuilder(); + audio.append("卸车").append(totalUnloadNum).append("件"); + if(!Objects.isNull(abnormalUnloadNum) && !abnormalUnloadNum.equals(0)){ + audio.append("异常卸车").append(abnormalUnloadNum).append("件"); + } + + if (isData == 0) { + return Resp.scanSuccess("卸车成功", "系统无编码"); + } + return Resp.scanSuccess("卸车成功", audio.toString()); } @@ -5198,6 +7198,16 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl num) { log.warn("#############unloadZero: 零担信息卸车数量大于装车件数 enterNun={} num={}", enterNun, num); return R.fail(405, "零担信息卸车数量大于装车件数"); - } else { - - Integer difficute = num - enterNun; - DistributionStockArticleEntity stockArticleEntity = distributionStockArticleClient.findStockArticleByOrderCodeAndWarehouseId(orderCode, fromWarehouseId); - Long orderId = stockArticleEntity.getId(); - distributionStockArticleClient.addHandQuantity(orderId, difficute); } carsLoadScanEntity.setUnloadNum(enterNun); @@ -5258,6 +7262,7 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl parcelListEntityList = distributionParcelListClient.findEntityListByOrderCode(orderCode, fromWarehouseId); - List ls = new ArrayList<>(); - for (DistributionParcelListEntity parcelListEntity : parcelListEntityList) { - DistributionParcelListEntity newParcelListEntity = new DistributionParcelListEntity(); - BeanUtil.copy(parcelListEntity, newParcelListEntity); - newParcelListEntity.setId(null); - newParcelListEntity.setWarehouseId(warehouseId); - newParcelListEntity.setWarehouse(warehouseName); - newParcelListEntity.setStockArticleId(orderId); - Long orderPackageId = distributionParcelListClient.addReturnId(newParcelListEntity); - - DistributionParcelNumberEntity parcelNumberEntity = new DistributionParcelNumberEntity(); - parcelNumberEntity.setStockArticleId(orderId); - parcelNumberEntity.setParcelListId(orderPackageId); - parcelNumberEntity.setQuantity(newParcelListEntity.getQuantity()); - parcelNumberEntity.setHandQuantity(0); - parcelNumberEntity.setDeliveryQuantity(0); - parcelNumberEntity.setSigninQuantity(0); - parcelNumberEntity.setOutboundQuantity(0); - parcelNumberEntity.setWarehouseId(warehouseId); - ls.add(parcelNumberEntity); - } - distributionParcelNumberClient.addBatch(ls); - } - } else { - Integer handQuantity = newStockArticleEntity.getHandQuantity() + enterNun; - Integer incomingNum = newStockArticleEntity.getIncomingNum() + enterNun; - Integer totalNumber = newStockArticleEntity.getTotalNumber(); - - if (incomingNum.equals(totalNumber)) { - if (handQuantity.equals(totalNumber)) { - newStockArticleEntity.setOrderStatus("20"); - } else { - newStockArticleEntity.setOrderStatus("30"); - } - newStockArticleEntity.setOrderReceiveStatus("30"); - } else { - if (incomingNum.equals(handQuantity)) { - newStockArticleEntity.setOrderStatus("10"); - } else { - newStockArticleEntity.setOrderStatus("30"); - } - newStockArticleEntity.setOrderReceiveStatus("20"); - } - newStockArticleEntity.setHandQuantity(handQuantity); - newStockArticleEntity.setIncomingNum(incomingNum); - - distributionStockArticleClient.saveOrUpdate(newStockArticleEntity); - } +// DistributionStockArticleEntity newStockArticleEntity = distributionStockArticleClient.findStockArticleByOrderCodeAndWarehouseId(orderCode, warehouseId); +// if (Objects.isNull(newStockArticleEntity)) { +// DistributionStockArticleEntity stockArticleEntity = distributionStockArticleClient.findStockArticleByOrderCodeAndWarehouseId(orderCode, fromWarehouseId); +// newStockArticleEntity = new DistributionStockArticleEntity(); +// BeanUtil.copy(stockArticleEntity, newStockArticleEntity); +// newStockArticleEntity.setId(null); +// newStockArticleEntity.setOrderReceiveStatus("20"); +// newStockArticleEntity.setOrderStatus("10"); +// newStockArticleEntity.setHandQuantity(enterNun); +// newStockArticleEntity.setIncomingNum(enterNun); +// newStockArticleEntity.setWarehouse(basicdataWarehouseEntity.getName()); +// newStockArticleEntity.setWarehouseId(basicdataWarehouseEntity.getId()); +// newStockArticleEntity.setCarsLoadNum(0); +// Long orderId = distributionStockArticleClient.addData(newStockArticleEntity); +// if (orderId != 0) { +// List parcelListEntityList = distributionParcelListClient.findEntityListByOrderCode(orderCode, fromWarehouseId); +// List ls = new ArrayList<>(); +// for (DistributionParcelListEntity parcelListEntity : parcelListEntityList) { +// DistributionParcelListEntity newParcelListEntity = new DistributionParcelListEntity(); +// BeanUtil.copy(parcelListEntity, newParcelListEntity); +// newParcelListEntity.setId(null); +// newParcelListEntity.setWarehouseId(warehouseId); +// newParcelListEntity.setWarehouse(warehouseName); +// newParcelListEntity.setStockArticleId(orderId); +// Long acceptWarehouseId = parcelListEntity.getAcceptWarehouseId(); +// if(warehouseId.equals(acceptWarehouseId)){ +// newParcelListEntity.setIsTransfer(0); +// }else{ +// newParcelListEntity.setIsTransfer(1); +// } +// Long orderPackageId = distributionParcelListClient.addReturnId(newParcelListEntity); +// +// DistributionParcelNumberEntity parcelNumberEntity = new DistributionParcelNumberEntity(); +// parcelNumberEntity.setStockArticleId(orderId); +// parcelNumberEntity.setParcelListId(orderPackageId); +// parcelNumberEntity.setQuantity(newParcelListEntity.getQuantity()); +// parcelNumberEntity.setHandQuantity(0); +// parcelNumberEntity.setDeliveryQuantity(0); +// parcelNumberEntity.setSigninQuantity(0); +// parcelNumberEntity.setOutboundQuantity(0); +// parcelNumberEntity.setWarehouseId(warehouseId); +// ls.add(parcelNumberEntity); +// } +// distributionParcelNumberClient.addBatch(ls); +// } +// } else { +// Integer handQuantity = newStockArticleEntity.getHandQuantity() + enterNun; +// Integer incomingNum = newStockArticleEntity.getIncomingNum() + enterNun; +// Integer totalNumber = newStockArticleEntity.getTotalNumber(); +// +// if (incomingNum.equals(totalNumber)) { +// if (handQuantity.equals(totalNumber)) { +// newStockArticleEntity.setOrderStatus("20"); +// } else { +// newStockArticleEntity.setOrderStatus("30"); +// } +// newStockArticleEntity.setOrderReceiveStatus("30"); +// } else { +// if (incomingNum.equals(handQuantity)) { +// newStockArticleEntity.setOrderStatus("10"); +// } else { +// newStockArticleEntity.setOrderStatus("30"); +// } +// newStockArticleEntity.setOrderReceiveStatus("20"); +// } +// newStockArticleEntity.setHandQuantity(handQuantity); +// newStockArticleEntity.setIncomingNum(incomingNum); +// +// distributionStockArticleClient.saveOrUpdate(newStockArticleEntity); +// } updateNumByLoadId(loadId); @@ -5403,7 +7414,7 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl zeroList = trunklineCarsOrderService.findUnloadZeroList(loadId, warehouseId); + List zeroList = trunklineCarsLoadScanService.findUnloadZeroList(loadId, warehouseId); for (UnloadZeroVO unloadZeroVO : zeroList) { Integer loadingNum = unloadZeroVO.getLoadingNum(); String waybillNo = unloadZeroVO.getWaybillNo(); @@ -5526,7 +7537,17 @@ public class TrunklineCarsLoadServiceImpl extends BaseServiceImpl findCarsLoadOrderInfoListPlan(Long loadId, String waybillNo) { - return baseMapper.findCarsLoadOrderInfoList(loadId,waybillNo); + return baseMapper.findCarsLoadOrderInfoListPlan(loadId,waybillNo); } @Override @@ -99,13 +99,13 @@ public class TrunklineCarsOrderEntityServiceImpl extends BaseServiceImpl findSignOrderList(Long loadId, Long warehouseId) { - return baseMapper.findSignOrderList(loadId,warehouseId); + public List findSignOrderList(Long loadId, Long warehouseId,Long signOrderId) { + return baseMapper.findSignOrderList(loadId,warehouseId,signOrderId); } @Override - public List findSignZeroOrderList(Long loadId, Long warehouseId) { - return baseMapper.findSignZeroOrderList(loadId,warehouseId); + public List findSignZeroOrderList(Long loadId, Long warehouseId,Long signOrderId) { + return baseMapper.findSignZeroOrderList(loadId,warehouseId,signOrderId); } @Override @@ -133,4 +133,19 @@ public class TrunklineCarsOrderEntityServiceImpl extends BaseServiceImpl updateCarsOrderIdList) { + baseMapper.updateNoCustomer(updateCarsOrderIdList); + } + + @Override + public List findMallOrderList(List carsOrderIdList) { + return baseMapper.findMallOrderList(carsOrderIdList); + } + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsSignLogServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsSignLogServiceImpl.java index dc496e179..143a643fa 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsSignLogServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsSignLogServiceImpl.java @@ -9,6 +9,9 @@ import lombok.extern.slf4j.Slf4j; import org.springblade.core.mp.base.BaseServiceImpl; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + @Slf4j @Service @AllArgsConstructor @@ -60,4 +63,34 @@ public class TrunklineCarsSignLogServiceImpl extends BaseServiceImpl updateCarsLoadScanList, String remark) { + List signLogList = new ArrayList<>(); + updateCarsLoadScanList.forEach(carsLoadScanEntity -> { + TrunklineCarsSignLogEntity trunklineCarsSignLogEntity = new TrunklineCarsSignLogEntity(); + trunklineCarsSignLogEntity.setLoadId(carsLoadScanEntity.getLoadId()); + trunklineCarsSignLogEntity.setLoadCode(carsLoadScanEntity.getLoadCode()); + trunklineCarsSignLogEntity.setLoadScanId(carsLoadScanEntity.getId()); + trunklineCarsSignLogEntity.setWarehouseId(carsLoadScanEntity.getWarehouseId()); + trunklineCarsSignLogEntity.setWarehouseName(carsLoadScanEntity.getWarehouseName()); + trunklineCarsSignLogEntity.setWaybillId(carsLoadScanEntity.getWaybillId()); + trunklineCarsSignLogEntity.setWaybillNo(carsLoadScanEntity.getWaybillNo()); + trunklineCarsSignLogEntity.setOrderCode(carsLoadScanEntity.getOrderCode()); + trunklineCarsSignLogEntity.setScanCode(carsLoadScanEntity.getScanCode()); + trunklineCarsSignLogEntity.setNum(carsLoadScanEntity.getNum()); + trunklineCarsSignLogEntity.setType(carsLoadScanEntity.getType()); + trunklineCarsSignLogEntity.setIsData(carsLoadScanEntity.getIsData()); + trunklineCarsSignLogEntity.setIsAbnormal(carsLoadScanEntity.getSignAbnormal()); + trunklineCarsSignLogEntity.setTrayId(carsLoadScanEntity.getTrayId()); + trunklineCarsSignLogEntity.setTrayCode(carsLoadScanEntity.getTrayCode()); + trunklineCarsSignLogEntity.setTrayName(carsLoadScanEntity.getTrayName()); + trunklineCarsSignLogEntity.setFromWarehouseId(carsLoadScanEntity.getFromWarehouseId()); + trunklineCarsSignLogEntity.setRemark(remark); + signLogList.add(trunklineCarsSignLogEntity); + }); + + saveBatch(signLogList); + + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsUnloadLogServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsUnloadLogServiceImpl.java index 18e0ca55f..26c6bc6c9 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsUnloadLogServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCarsUnloadLogServiceImpl.java @@ -8,6 +8,8 @@ import lombok.extern.slf4j.Slf4j; import org.springblade.core.mp.base.BaseServiceImpl; import org.springframework.stereotype.Service; +import java.util.List; + @Slf4j @AllArgsConstructor @Service @@ -62,4 +64,9 @@ public class TrunklineCarsUnloadLogServiceImpl extends BaseServiceImpl unloadLogList) { + saveBatch(unloadLogList); + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCostShareRecordServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCostShareRecordServiceImpl.java index 24ba51788..4d9e04238 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCostShareRecordServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineCostShareRecordServiceImpl.java @@ -43,4 +43,9 @@ public class TrunklineCostShareRecordServiceImpl extends BaseServiceImpl findSignOrderPageList(IPage page, LoadCarsDTO loadCarsDTO) { + return baseMapper.findSignOrderPageList(page,loadCarsDTO); + } + + @Override + public void deleteListBySignOrderIds(List delSignOrderList) { + baseMapper.deleteListBySignOrderIds(delSignOrderList); + } + + @Override + public List findSignOrderListByLoadId(Long loadId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("load_id",loadId); + return baseMapper.selectList(queryWrapper); + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillJsonServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillJsonServiceImpl.java new file mode 100644 index 000000000..0090717b2 --- /dev/null +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillJsonServiceImpl.java @@ -0,0 +1,15 @@ +package com.logpm.trunkline.service.impl; + +import com.logpm.trunkline.entity.TrunklineWaybillJsonEntity; +import com.logpm.trunkline.mapper.TrunklineWaybillJsonMapper; +import com.logpm.trunkline.service.ITrunklineWaybillJsonService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@AllArgsConstructor +public class TrunklineWaybillJsonServiceImpl extends BaseServiceImpl implements ITrunklineWaybillJsonService { +} diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillOrderServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillOrderServiceImpl.java index dffb1bd6b..b777f9353 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillOrderServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillOrderServiceImpl.java @@ -39,4 +39,19 @@ public class TrunklineWaybillOrderServiceImpl extends BaseServiceImpl findAdvanceIdsByWaybillIds(List waybillIds) { + return baseMapper.findAdvanceIdsByWaybillIds(waybillIds); + } + + @Override + public void deleteByWaybillNo(String waybillNo) { + baseMapper.deleteByWaybillNo(waybillNo); + } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillPackageServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillPackageServiceImpl.java index 5266d50a5..456aea13c 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillPackageServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillPackageServiceImpl.java @@ -1,5 +1,6 @@ package com.logpm.trunkline.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.logpm.trunkline.entity.TrunklineWaybillPackageEntity; import com.logpm.trunkline.mapper.TrunklineWaybillPackageMapper; @@ -74,6 +75,8 @@ public class TrunklineWaybillPackageServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("waybill_no",waybillEntity.getWaybillNo()) .eq("is_deleted",0); @@ -104,48 +107,53 @@ public class TrunklineWaybillPackageServiceImpl extends BaseServiceImpl 0){ if(signNum == size){ - waybillEntity.setWaybillStatus("100"); + updateWaybillEntity.setWaybillStatus("100"); }else{ - waybillEntity.setWaybillStatus("90"); + updateWaybillEntity.setWaybillStatus("90"); } }else{ if(deliveryNum > 0){ if (deliveryNum == size){ - waybillEntity.setWaybillStatus("80"); + updateWaybillEntity.setWaybillStatus("80"); }else { - waybillEntity.setWaybillStatus("70"); + updateWaybillEntity.setWaybillStatus("70"); } }else{ if(unloadNum > 0){ if (unloadNum == size){ - waybillEntity.setWaybillStatus("60"); + updateWaybillEntity.setWaybillStatus("60"); }else { - waybillEntity.setWaybillStatus("50"); + updateWaybillEntity.setWaybillStatus("50"); } }else{ if(transferNum > 0){ if (transferNum == size){ - waybillEntity.setWaybillStatus("40"); + updateWaybillEntity.setWaybillStatus("40"); }else { - waybillEntity.setWaybillStatus("30"); + updateWaybillEntity.setWaybillStatus("30"); } }else{ if(incomingNum > 0){ if (incomingNum == size){ - waybillEntity.setWaybillStatus("20"); + updateWaybillEntity.setWaybillStatus("20"); }else { - waybillEntity.setWaybillStatus("10"); + updateWaybillEntity.setWaybillStatus("10"); } } } } } } - warehouseWaybillClient.updateEntity(waybillEntity); + warehouseWaybillClient.updateEntity(updateWaybillEntity); } @Override - public void updatePackageStatus(List orderPackageCodes, Integer workNode) { + public void deleteByWaybillNo(String waybillNo) { + baseMapper.deleteByWaybillNo(waybillNo); + } + + @Override + public void updatePackageStatus(List orderPackageCodes, Integer workNode, Long warehouseId, Map map) { Integer packageStatus = null; if(WorkNodeEnums.INITIAL_WAREHOUSE_DEPART.getCode().equals(workNode)){ @@ -157,36 +165,35 @@ public class TrunklineWaybillPackageServiceImpl extends BaseServiceImpl waybillPackageEntities = new ArrayList<>(); Set waybillIds = new HashSet<>(); - for (String orderPackageCode : orderPackageCodes) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("order_package_code",orderPackageCode) - .eq("is_deleted",0); - TrunklineWaybillPackageEntity waybillPackageEntity = baseMapper.selectOne(queryWrapper); - if(Objects.isNull(waybillPackageEntity)){ - continue; + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("order_package_code",orderPackageCodes) + .eq("is_deleted",0); + List trunklineWaybillPackageEntities = baseMapper.selectList(queryWrapper); + if(!trunklineWaybillPackageEntities.isEmpty()){ + for (TrunklineWaybillPackageEntity trunklineWaybillPackageEntity : trunklineWaybillPackageEntities) { + trunklineWaybillPackageEntity.setPackageStatus(packageStatus); + waybillIds.add(trunklineWaybillPackageEntity.getWaybillId()); } - waybillPackageEntity.setPackageStatus(packageStatus); - waybillPackageEntities.add(waybillPackageEntity); - waybillIds.add(waybillPackageEntity.getWaybillId()); - } - - updateBatchById(waybillPackageEntities); + updateBatchById(trunklineWaybillPackageEntities); - for (Long waybillId : waybillIds) { - WarehouseWaybillEntity waybillEntity = warehouseWaybillClient.findByWaybillId(waybillId); - updateWaybillStatus(waybillEntity); + for (Long waybillId : waybillIds) { + WarehouseWaybillEntity waybillEntity = warehouseWaybillClient.findByWaybillId(waybillId); + updateWaybillStatus(waybillEntity); + } } - } + packageTrackLogAsyncService.sendPackageWorkNodeFanout(orderPackageCodes,workNode,warehouseId, map); } } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillTrackServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillTrackServiceImpl.java index c431eaf9b..6fe75efd2 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillTrackServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/TrunklineWaybillTrackServiceImpl.java @@ -1,8 +1,11 @@ package com.logpm.trunkline.service.impl; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.trunkline.dto.OpenOrderDTO; import com.logpm.trunkline.entity.TrunklineWaybillTrackEntity; import com.logpm.trunkline.mapper.TrunklineWaybillTrackMapper; import com.logpm.trunkline.service.ITrunklineWaybillTrackService; +import com.logpm.trunkline.vo.TrunklineWaybillTrackVO; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.mp.base.BaseServiceImpl; @@ -18,4 +21,14 @@ public class TrunklineWaybillTrackServiceImpl extends BaseServiceImpl findWaybillLog(Long waybillId, String trackType) { return baseMapper.findWaybillLog(waybillId,trackType); } + + @Override + public IPage findUpdateWaybillList(IPage page, OpenOrderDTO openOrderDTO) { + return baseMapper.findUpdateWaybillList(page,openOrderDTO); + } + + @Override + public void deleteByWaybillNo(String waybillNo) { + baseMapper.deleteByWaybillNo(waybillNo); + } } diff --git a/blade-service/logpm-trunkline/src/main/resources/application-dev.yml b/blade-service/logpm-trunkline/src/main/resources/application-dev.yml index befc8a180..b017fcbd3 100644 --- a/blade-service/logpm-trunkline/src/main/resources/application-dev.yml +++ b/blade-service/logpm-trunkline/src/main/resources/application-dev.yml @@ -39,7 +39,7 @@ spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -60,12 +60,21 @@ spring: url: ${blade.datasource.trunkline.master.url} username: ${blade.datasource.trunkline.master.username} password: ${blade.datasource.trunkline.master.password} - slave: - druid: - #独立校验配置 - validation-query: select 1 - #oracle校验 - #validation-query: select 1 from dual - url: ${blade.datasource.trunkline.slave.url} - username: ${blade.datasource.trunkline.slave.username} - password: ${blade.datasource.trunkline.slave.password} +# 627683: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.trunkline.627683.url} +# username: ${blade.datasource.trunkline.627683.username} +# password: ${blade.datasource.trunkline.627683.password} +# 703623: +# druid: +# #独立校验配置 +# validation-query: select 1 +# #oracle校验 +# #validation-query: select 1 from dual +# url: ${blade.datasource.trunkline.703623.url} +# username: ${blade.datasource.trunkline.703623.username} +# password: ${blade.datasource.trunkline.703623.password} diff --git a/blade-service/logpm-trunkline/src/main/resources/application-prod.yml b/blade-service/logpm-trunkline/src/main/resources/application-prod.yml index b0a067516..d0205f177 100644 --- a/blade-service/logpm-trunkline/src/main/resources/application-prod.yml +++ b/blade-service/logpm-trunkline/src/main/resources/application-prod.yml @@ -12,7 +12,7 @@ server: spring: #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -25,10 +25,10 @@ spring: url: ${blade.datasource.trunkline.master.url} username: ${blade.datasource.trunkline.master.username} password: ${blade.datasource.trunkline.master.password} - slave: - url: ${blade.datasource.trunkline.slave.url} - username: ${blade.datasource.trunkline.slave.username} - password: ${blade.datasource.trunkline.slave.password} + 627683: + url: ${blade.datasource.trunkline.627683.url} + username: ${blade.datasource.trunkline.627683.username} + password: ${blade.datasource.trunkline.627683.password} #rabbitmq配置 rabbitmq: host: 172.16.128.145 diff --git a/blade-service/logpm-trunkline/src/main/resources/application-test.yml b/blade-service/logpm-trunkline/src/main/resources/application-test.yml index fd764eb95..93370deb3 100644 --- a/blade-service/logpm-trunkline/src/main/resources/application-test.yml +++ b/blade-service/logpm-trunkline/src/main/resources/application-test.yml @@ -10,9 +10,35 @@ server: # password: ${blade.datasource.test.password} spring: + #rabbitmq配置 + rabbitmq: + host: 192.168.2.110 + port: 5672 + username: admin + password: Slwk@123654 + #虚拟host 可以不设置,使用server默认host + virtual-host: / + #确认消息已发送到队列(Queue) + publisher-returns: true + publisher-confirm-type: correlated + # 手动提交消息 + listener: + simple: + acknowledge-mode: auto + default-requeue-rejected: false + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000 # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false + direct: + acknowledge-mode: manual + template: + mandatory: true #排除DruidDataSourceAutoConfigure autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration datasource: dynamic: druid: @@ -25,7 +51,15 @@ spring: url: ${blade.datasource.trunkline.master.url} username: ${blade.datasource.trunkline.master.username} password: ${blade.datasource.trunkline.master.password} - slave: - url: ${blade.datasource.trunkline.slave.url} - username: ${blade.datasource.trunkline.slave.username} - password: ${blade.datasource.trunkline.slave.password} + 627683: + url: ${blade.datasource.trunkline.627683.url} + username: ${blade.datasource.trunkline.627683.username} + password: ${blade.datasource.trunkline.627683.password} + 695224: + url: ${blade.datasource.trunkline.695224.url} + username: ${blade.datasource.trunkline.695224.username} + password: ${blade.datasource.trunkline.695224.password} + 645789: + url: ${blade.datasource.trunkline.645789.url} + username: ${blade.datasource.trunkline.645789.username} + password: ${blade.datasource.trunkline.645789.password} diff --git a/blade-service/logpm-warehouse/Dockerfile b/blade-service/logpm-warehouse/Dockerfile index 7125738d0..9e8c525f2 100644 --- a/blade-service/logpm-warehouse/Dockerfile +++ b/blade-service/logpm-warehouse/Dockerfile @@ -1,4 +1,4 @@ -FROM bladex/alpine-java:openjdk8-openj9_cn_slim +FROM 192.168.2.110:7777/hwy/hwy_base:v1.0 MAINTAINER h5u@163.com diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/WarehouseApplication.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/WarehouseApplication.java index 20720b6d2..2235cedc9 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/WarehouseApplication.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/WarehouseApplication.java @@ -19,6 +19,7 @@ package com.logpm.warehouse; import org.springblade.common.constant.ModuleNameConstant; import org.springblade.core.cloud.client.BladeCloudApplication; import org.springblade.core.launch.BladeApplication; +import org.springblade.core.transaction.annotation.SeataCloudApplication; /** * Demo启动器 @@ -26,6 +27,7 @@ import org.springblade.core.launch.BladeApplication; * @author Chill */ @BladeCloudApplication +@SeataCloudApplication public class WarehouseApplication { public static void main(String[] args) { diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseRetentionApiController.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseRetentionApiController.java index 96f3bdc85..25f1a74d6 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseRetentionApiController.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseRetentionApiController.java @@ -53,7 +53,6 @@ public class WarehouseRetentionApiController { } try { - //查询订制品打托列表 IPage pages = warehouseRetentionRecordService.retentionPackageList(retentionDTO); return R.data(pages); } catch (CustomerException e) { @@ -79,7 +78,6 @@ public class WarehouseRetentionApiController { @ApiOperationSupport(order = 1) @ApiOperation(value = "保存滞留扫描列表", notes = "传入trayTypeDTO") public R saveRetentionList(@RequestBody WarehouseRetentionRecordDTO warehouseRetentionScanDTOS) { -// R r = warehouseRetentionScanService.saveRetentionList(warehouseRetentionScanDTOS); R r = warehouseRetentionRecordService.saveRetentionList(warehouseRetentionScanDTOS); return r; } @@ -89,77 +87,8 @@ public class WarehouseRetentionApiController { @ApiOperationSupport(order = 1) @ApiOperation(value = "保存滞留扫描列表", notes = "传入trayTypeDTO") public R updateRetentionList(@RequestBody WarehouseRetentionRecordDTO warehouseRetentionScanDTOS) { -// R r = warehouseRetentionScanService.saveRetentionList(warehouseRetentionScanDTOS); R r = warehouseRetentionRecordService.updateRetentionList(warehouseRetentionScanDTOS); return r; } - - - - - -// @GetMapping("/initRetentionList") -// @ApiOperationSupport(order = 1) -// @ApiOperation(value = "初始化滞留车次信息", notes = "传入trayTypeDTO") -// public R initRetentionList(@RequestParam Long deliveryId) { -// WarehouseRetentionRecordVO warehouseRetentionRecordVO = warehouseRetentionRecordService.initRetentionList(deliveryId); -// return R.data(warehouseRetentionRecordVO); -// } - - -// -// -// @ResponseBody -// @PostMapping("/retentionScanPackage") -// @ApiOperationSupport(order = 1) -// @ApiOperation(value = "滞留扫描包件码", notes = "传入trayTypeDTO") -// public R retentionScanPackage(@RequestBody RetentionDTO retentionDTO) { -// String method = "###########retentionScanPackage: "; -// log.info(method + "滞留扫描包件码 retentionDTO={}", retentionDTO); -// String orderPackageCode = retentionDTO.getOrderPackageCode();//包件码 -// try{ -// if(StringUtil.isBlank(orderPackageCode)){ -// log.warn("############retentionScanPackage: 包件码不能为空 orderPackageCode={}",orderPackageCode); -// return R.fail(403,"包件码不能为空"); -// } -// -// //查询订制品打托列表 -// return warehouseRetentionRecordService.retentionScanPackage(orderPackageCode); -// }catch (CustomerException e){ -// log.warn(e.message); -// return R.fail(e.code,e.message); -// }catch (Exception e){ -// log.error(method+"系统异常,联系管理员",e); -// return R.fail(500,"系统异常,联系管理员"); -// } -// } - - -// @ResponseBody -// @PostMapping("/retentionScanPackage") -// @ApiOperationSupport(order = 1) -// @ApiOperation(value = "滞留扫描包件码", notes = "传入trayTypeDTO") -// public R retentionScanPackage(@RequestBody RetentionDTO retentionDTO) { -// String method = "###########retentionScanPackage: "; -// log.info(method + "滞留扫描包件码 retentionDTO={}", retentionDTO); -// String orderPackageCode = retentionDTO.getOrderPackageCode();//包件码 -// try{ -// if(StringUtil.isBlank(orderPackageCode)){ -// log.warn("############retentionScanPackage: 包件码不能为空 orderPackageCode={}",orderPackageCode); -// return R.fail(403,"包件码不能为空"); -// } -// -// //查询订制品打托列表 -// return warehouseRetentionRecordService.retentionScanPackage(orderPackageCode); -// }catch (CustomerException e){ -// log.warn(e.message); -// return R.fail(e.code,e.message); -// }catch (Exception e){ -// log.error(method+"系统异常,联系管理员",e); -// return R.fail(500,"系统异常,联系管理员"); -// } -// } - - } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseTaskApiController.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseTaskApiController.java index 7534eafeb..b35c32c55 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseTaskApiController.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseTaskApiController.java @@ -19,6 +19,8 @@ import lombok.extern.log4j.Log4j2; import org.springblade.common.exception.CustomerException; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; @@ -129,6 +131,7 @@ public class WarehouseTaskApiController { */ @PostMapping("/addDataInfo") public R addDataInfo(@RequestBody TaskSearchDTO taskSearchDTO){ + //当前登录人选择的仓库 BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ @@ -567,6 +570,7 @@ public class WarehouseTaskApiController { @ApiOperation(value = "查询包件信息", notes = "code,type") public R selectPackageInfo(@RequestBody TaskSearchDTO taskSearchDTO) { String method = "###########selectPackageInfo: "; + log.info(method+"查询包件信息 参数:{}",taskSearchDTO); String orderPackageCode = taskSearchDTO.getCode();//包件码 Long questId = taskSearchDTO.getQuestId();//包件码 diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseTrayTypeApiController.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseTrayTypeApiController.java index c44067c05..55b39c4ba 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseTrayTypeApiController.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseTrayTypeApiController.java @@ -1,11 +1,19 @@ package com.logpm.warehouse.api; +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.logpm.basicdata.entity.BasicdataTrayEntity; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataTrayClient; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.warehouse.dto.DownPackageCodeDTO; +import com.logpm.warehouse.dto.NoDataStockListDTO; import com.logpm.warehouse.dto.TrayTypeDTO; import com.logpm.warehouse.dto.ZeroOrderVO; +import com.logpm.warehouse.service.IWarehouseTaryAllocationService; import com.logpm.warehouse.service.IWarehouseTrayTypeService; import com.logpm.warehouse.vo.OrderDetailVO; import com.logpm.warehouse.vo.TrayTypeDataListVO; @@ -23,10 +31,7 @@ import org.springblade.system.cache.DictBizCache; import org.springblade.system.entity.DictBiz; import org.springframework.web.bind.annotation.*; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; @Log4j2 @RestController @@ -37,6 +42,8 @@ public class WarehouseTrayTypeApiController { private final IWarehouseTrayTypeService warehouseTrayTypeService; private final IBasicdataWarehouseClient warehouseClient; + private final IWarehouseTaryAllocationService taryAllocationService; + private final IBasicdataTrayClient trayClient; //----------------------订单分拣-------------------------------- @ResponseBody @@ -99,7 +106,7 @@ public class WarehouseTrayTypeApiController { return R.fail(403,"仓库信息为空"); } - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘码不能为空 trayCode={}",trayCode); return R.fail(403,"托盘码不能为空"); } @@ -146,11 +153,11 @@ public class WarehouseTrayTypeApiController { return R.fail(403,"仓库信息为空"); } - if(!StringUtil.hasLength(orderCode)){ + if(StringUtil.isBlank(orderCode)){ log.warn(method+"订单编号不能为空 orderCode={}",orderCode); return R.fail(403,"订单编号不能为空"); } - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"订单编号不能为空 trayCode={}",trayCode); return R.fail(403,"订单编号不能为空"); } @@ -181,15 +188,15 @@ public class WarehouseTrayTypeApiController { String trayCode = trayTypeDTO.getTrayCode(); String orderPackageCode = trayTypeDTO.getOrderPackageCode();//包条码 - if(!StringUtil.hasLength(trayType)){ + if(StringUtil.isBlank(trayType)){ log.warn(method+"打托方式不能为空 trayType={}",trayType); return R.fail(403,"打托方式不能为空"); } - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘码不能为空 trayCode={}",trayCode); return R.fail(403,"托盘码不能为空"); } - if(!StringUtil.hasLength(orderPackageCode)){ + if(StringUtil.isBlank(orderPackageCode)){ log.warn(method+"包条码不能为空 orderPackageCode={}",orderPackageCode); return R.fail(403,"包条码不能为空"); } @@ -223,11 +230,11 @@ public class WarehouseTrayTypeApiController { List orderPackageCodes = trayTypeDTO.getOrderPackageCodes(); String trayCode = trayTypeDTO.getTrayCode();//托盘码 - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘码不能为空 trayCode={}",trayCode); return R.fail(403,"托盘码不能为空"); } - if(Objects.isNull(orderPackageCodes)||orderPackageCodes.size() == 0){ + if(Objects.isNull(orderPackageCodes)||orderPackageCodes.isEmpty()){ log.warn(method+"包条码不能为空 orderPackageCodes={}",orderPackageCodes); return R.fail(403,"包条码不能为空"); } @@ -262,11 +269,11 @@ public class WarehouseTrayTypeApiController { String orderCode = trayTypeDTO.getOrderCode(); String trayCode = trayTypeDTO.getTrayCode();//托盘码 - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘码不能为空 trayCode={}",trayCode); return R.fail(403,"托盘码不能为空"); } - if(!StringUtil.hasLength(orderCode)){ + if(StringUtil.isBlank(orderCode)){ log.warn(method+"订单号不能为空 orderCode={}",orderCode); return R.fail(403,"订单号不能为空"); } @@ -345,7 +352,7 @@ public class WarehouseTrayTypeApiController { return R.fail(403,"仓库信息为空"); } - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘码不能为空 trayCode={}",trayCode); return R.fail(403,"托盘码不能为空"); } @@ -388,7 +395,7 @@ public class WarehouseTrayTypeApiController { log.warn(method+"仓库信息不能为空"); return R.fail(403,"仓库信息不能为空"); } - if(!StringUtil.hasLength(waybillCode)){ + if(StringUtil.isBlank(waybillCode)){ log.warn(method+"运单号不能为空 waybillCode={}",waybillCode); return R.fail(403,"运单号不能为空"); } @@ -420,11 +427,11 @@ public class WarehouseTrayTypeApiController { log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); return R.fail(403,"仓库信息为空"); } - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘号不能为空 trayCode={}",trayCode); return R.fail(403,"托盘号不能为空"); } - if(!StringUtil.hasLength(trayType)){ + if(StringUtil.isBlank(trayType)){ log.warn(method+"打托方式不能为空 trayCode={}",trayCode); return R.fail(403,"打托方式不能为空"); } @@ -455,11 +462,11 @@ public class WarehouseTrayTypeApiController { log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); return R.fail(403,"仓库信息为空"); } - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘号不能为空 trayCode={}",trayCode); return R.fail(403,"托盘号不能为空"); } - if(!StringUtil.hasLength(orderCode)){ + if(StringUtil.isBlank(orderCode)){ log.warn(method+"订单不能为空 trayCode={}",trayCode); return R.fail(403,"打托方式不能为空"); } @@ -480,9 +487,12 @@ public class WarehouseTrayTypeApiController { public R updateZeroOrderNumByTrayCode(@RequestBody TrayTypeDTO trayTypeDTO) { String method = "###########updateZeroOrderNumByTrayCode: "; log.info(method + "更新零担订单数量 trayTypeDTO={}", trayTypeDTO); - String orderCode = trayTypeDTO.getOrderCode();//订单自编码 - String trayCode = trayTypeDTO.getTrayCode();//托盘码 - Integer num = trayTypeDTO.getNum();//数量 + //订单自编码 + String orderCode = trayTypeDTO.getOrderCode(); + //托盘码 + String trayCode = trayTypeDTO.getTrayCode(); + //数量 + Integer num = trayTypeDTO.getNum(); try{ BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); @@ -490,11 +500,11 @@ public class WarehouseTrayTypeApiController { log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); return R.fail(403,"仓库信息为空"); } - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘号不能为空 trayCode={}",trayCode); return R.fail(403,"托盘号不能为空"); } - if(!StringUtil.hasLength(orderCode)){ + if(StringUtil.isBlank(orderCode)){ log.warn(method+"订单不能为空 orderCode={}",orderCode); return R.fail(403,"订单不能为空"); } @@ -524,10 +534,11 @@ public class WarehouseTrayTypeApiController { public R zeroOrderUpdateRemark(@RequestBody TrayTypeDTO trayTypeDTO) { String method = "###########updateZeroOrderNumByTrayCode: "; log.info(method + "更新零担订单数量 trayTypeDTO={}", trayTypeDTO); - String trayCode = trayTypeDTO.getTrayCode();//托盘码 + //托盘码 + String trayCode = trayTypeDTO.getTrayCode(); String remark = trayTypeDTO.getRemark(); try{ - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘号不能为空 trayCode={}",trayCode); return R.fail(403,"托盘号不能为空"); } @@ -597,7 +608,7 @@ public class WarehouseTrayTypeApiController { return R.fail(403,"仓库信息为空"); } - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘码不能为空 trayCode={}",trayCode); return R.fail(403,"托盘码不能为空"); } @@ -644,15 +655,15 @@ public class WarehouseTrayTypeApiController { return R.fail(403,"仓库信息为空"); } - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘码不能为空 trayCode={}",trayCode); return R.fail(403,"托盘码不能为空"); } - if(!StringUtil.hasLength(trayType)){ + if(StringUtil.isBlank(trayType)){ log.warn(method+"打托方式不能为空 trayType={}",trayType); return R.fail(403,"打托方式不能为空"); } - if(!StringUtil.hasLength(orderPackageCode)){ + if(StringUtil.isBlank(orderPackageCode)){ log.warn(method+"包条码不能为空 orderPackageCode={}",orderPackageCode); return R.fail(403,"包条码不能为空"); } @@ -777,7 +788,7 @@ public class WarehouseTrayTypeApiController { return R.fail(403,"仓库信息为空"); } - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘码不能为空 trayCode={}",trayCode); return R.fail(403,"托盘码不能为空"); } @@ -827,7 +838,7 @@ public class WarehouseTrayTypeApiController { log.warn(method+"商场id不能为空 marketId={}",marketId); return R.fail(403,"商场id不能为空"); } - if(!StringUtil.hasLength(materialCode)){ + if(StringUtil.isBlank(materialCode)){ log.warn(method+"物料编码不能为空 materialCode={}",materialCode); return R.fail(403,"物料编码不能为空"); } @@ -863,7 +874,7 @@ public class WarehouseTrayTypeApiController { log.warn(method+"商场id不能为空 marketId={}",marketId); return R.fail(403,"商场id不能为空"); } - if(!StringUtil.hasLength(materialName)){ + if(StringUtil.isBlank(materialName)){ log.warn(method+"物料名称不能为空 materialCode={}",materialName); return R.fail(403,"物料名称不能为空"); } @@ -885,12 +896,9 @@ public class WarehouseTrayTypeApiController { public R enterStockNoDataMaterialCode(@RequestBody TrayTypeDTO trayTypeDTO) { String method = "###########enterStockNoDataMaterialCode: "; log.info(method + "录入库存品物料编码 trayTypeDTO={}", trayTypeDTO); - String materialCode = trayTypeDTO.getMaterialCode();//物料编码 - Long marketId = trayTypeDTO.getMarketId();//商场id - Integer num = trayTypeDTO.getNum();//数量 String trayType = trayTypeDTO.getTrayType();//打托方式 String trayCode = trayTypeDTO.getTrayCode();//托盘码 - String incomingBatch = trayTypeDTO.getIncomingBatch();//批次号 + List noDataStockListDTOS = trayTypeDTO.getNoDataStockListDTOS(); try{ BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ @@ -898,32 +906,21 @@ public class WarehouseTrayTypeApiController { return R.fail(403,"仓库信息不能为空"); } - if(!StringUtil.hasLength(trayCode)){ + if(StringUtil.isBlank(trayCode)){ log.warn(method+"托盘码不能为空 trayCode={}",trayCode); return R.fail(403,"托盘码不能为空"); } - if(!StringUtil.hasLength(trayType)){ + if(StringUtil.isBlank(trayType)){ log.warn(method+"打托方式不能为空 trayType={}",trayType); return R.fail(403,"打托方式不能为空"); } - if(!StringUtil.hasLength(materialCode)){ - log.warn(method+"物料编码不能为空 materialCode={}",materialCode); - return R.fail(403,"物料编码不能为空"); - } - if(!StringUtil.hasLength(incomingBatch)){ - log.warn(method+"批次号不能为空 incomingBatch={}",incomingBatch); - return R.fail(403,"批次号不能为空"); - } - if(Objects.isNull(marketId)){ - log.warn(method+"商场id不能为空 marketId={}",marketId); - return R.fail(403,"商场id不能为空"); - } - if(Objects.isNull(num)||num == 0){ - log.warn(method+"数量不正确 num={}",num); - return R.fail(403,"数量不正确"); + if(CollUtil.isEmpty(noDataStockListDTOS)){ + log.warn(method+"录入数据不能为空 trayType={}",trayType); + return R.fail(403,"录入数据不能为空"); } - return warehouseTrayTypeService.enterStockNoDataMaterialCode(trayCode,trayType,materialCode,marketId,num,incomingBatch,myCurrentWarehouse.getId(),"无数据库存品打托"); + + return warehouseTrayTypeService.enterStockNoDataMaterialCode(trayCode,trayType,noDataStockListDTOS,myCurrentWarehouse.getId(),"无数据库存品打托"); }catch (CustomerException e){ log.warn(e.message); return R.fail(e.code,e.message); @@ -1333,6 +1330,168 @@ public class WarehouseTrayTypeApiController { } } + @ResponseBody + @PostMapping("/batchSyncOldTrayTypeInfo") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "批量同步老系统托盘数据", notes = "传入trayTypeDTO") + public R batchSyncOldTrayTypeInfo(@RequestBody TrayTypeDTO trayTypeDTO) { + String method = "###########batchSyncOldTrayTypeInfo: "; + log.info(method + "移托包件 trayTypeDTO={}", trayTypeDTO); + String trayCodeStr = trayTypeDTO.getTrayCode(); + + try{ + + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + log.warn(method+"仓库信息不能为空"); + return R.fail(403,"仓库信息不能为空"); + } + + if(StringUtil.isBlank(trayCodeStr)){ + log.warn(method+"托盘码不能为空 trayCodeStr={}",trayCodeStr); + return R.fail(403,"托盘码不能为空"); + } + List trayCodes = new ArrayList<>(); + if(trayCodeStr.contains(",")){ + String[] split = trayCodeStr.split(","); + trayCodes.addAll(Arrays.asList(split)); + }else{ + trayCodes.add(trayCodeStr); + } + + for (String trayCode : trayCodes) { + log.info(method+"当前同步的托盘 trayCode={}",trayCode); + + BasicdataTrayEntity trayEntity = trayClient.getTrayByTrayCode(trayCode); + if(Objects.isNull(trayEntity)){ + log.warn(method+"托盘信息不存在 trayCode={}",trayCode); + continue; + } + Long trayId = trayEntity.getId(); + + Long allcationId = taryAllocationService.getAllocationIdByTrayId(trayId); + if(!Objects.isNull(allcationId)){ + log.warn(method+"托盘已上架 trayCode={}",trayCode); + continue; + } + + R trayData = warehouseTrayTypeService.findTrayData(trayCode, myCurrentWarehouse.getId()); + int total = 0; + Object data = trayData.getData(); + if(!Objects.isNull(data)){ + String s = JSONObject.toJSONString(data); + JSONObject jsonObject = JSONObject.parseObject(s); + JSONArray packageList = jsonObject.getJSONArray("packageList"); + JSONArray zeroOrderList = jsonObject.getJSONArray("zeroOrderList"); + JSONArray stockOrderList = jsonObject.getJSONArray("stockOrderList"); + int packageSize = packageList.size(); + int zeroSize = zeroOrderList.size(); + int stockSize = stockOrderList.size(); + total = packageSize+zeroSize+stockSize; + } + + R syncOldTrayData = warehouseTrayTypeService.findSyncOldTrayData(trayCode, myCurrentWarehouse.getId()); + Object data1 = syncOldTrayData.getData(); + if(!Objects.isNull(data1)){ + String s1 = JSONObject.toJSONString(data1); + JSONObject jsonObject1 = JSONObject.parseObject(s1); + JSONArray packageList1 = jsonObject1.getJSONArray("packageList"); + String trayType1 = jsonObject1.getString("trayType"); + String trayCode1 = jsonObject1.getString("trayCode"); + int size = packageList1.size(); + if(total >= size){ + log.warn(method+"新系统打托数量大于等于老系统 trayCode={} 不同步",trayCode); + continue; + } + List orderPackageCodes = new ArrayList<>(); + for (int i = 0; i < size; i++){ + JSONObject jsonObject2 = packageList1.getJSONObject(i); + orderPackageCodes.add(jsonObject2.getString("orderPackageCode")); + } + if(!orderPackageCodes.isEmpty()){ + warehouseTrayTypeService.syncOldTrayData(trayCode1,trayType1,orderPackageCodes,myCurrentWarehouse.getId(),"同步老系统打托"); + } + } + + + + } + + return R.success("处理完成"); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } + + + @ResponseBody + @PostMapping("/findPackageTrayInfo") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "查询包件所在托盘", notes = "传入trayTypeDTO") + public R findPackageTrayInfo(@RequestBody TrayTypeDTO trayTypeDTO) { + String method = "###########findPackageTrayInfo: "; + log.info(method + "查询包件所在托盘 trayTypeDTO={}", trayTypeDTO); + String orderPackageCode = trayTypeDTO.getOrderPackageCode(); + + try{ + + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + log.warn(method+"仓库信息不能为空"); + return R.fail(403,"仓库信息不能为空"); + } + + if(StringUtil.isBlank(orderPackageCode)){ + log.warn(method+"包件码不能为空 orderPackageCode={}",orderPackageCode); + return R.fail(403,"包件码不能为空"); + } + + return warehouseTrayTypeService.findPackageTrayInfo(orderPackageCode,myCurrentWarehouse.getId()); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } + + + @ResponseBody + @PostMapping("/downPackageCodes") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "解托包件", notes = "传入trayTypeDTO") + public R downPackageCodes(@RequestBody TrayTypeDTO trayTypeDTO) { + String method = "###########downPackageCodes: "; + log.info(method + "查询包件所在托盘 trayTypeDTO={}", trayTypeDTO); + List downPackageCodeDTOS = trayTypeDTO.getDownPackageCodeDTOS(); + + try{ + + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + log.warn(method+"仓库信息不能为空"); + return R.fail(403,"仓库信息不能为空"); + } + + if(CollUtil.isEmpty(downPackageCodeDTOS)){ + log.warn(method+"解托数据不能为空"); + return R.fail(403,"解托数据不能为空"); + } + + return warehouseTrayTypeService.downPackageCodes(downPackageCodeDTOS,myCurrentWarehouse.getId()); + }catch (CustomerException e){ + log.warn(e.message); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常,联系管理员",e); + return R.fail(500,"系统异常,联系管理员"); + } + } } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseUpdownTypeApiController.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseUpdownTypeApiController.java index cbeb3304b..86ca17a57 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseUpdownTypeApiController.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/api/WarehouseUpdownTypeApiController.java @@ -1,5 +1,6 @@ package com.logpm.warehouse.api; +import com.alibaba.fastjson.JSONObject; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; @@ -15,7 +16,10 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; +import org.apache.commons.codec.digest.DigestUtils; +import org.springblade.common.annotations.RepeatSubmit; import org.springblade.common.exception.CustomerException; +import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springframework.web.bind.annotation.*; @@ -33,6 +37,7 @@ public class WarehouseUpdownTypeApiController { private final IWarehouseUpdownTypeService warehouseUpdownTypeService; private final IBasicdataWarehouseClient warehouseClient; private final WarehouseGoodsAllocationClient warehouseGoodsAllocationClient; + private final BladeRedis redis; //---------------------------------上架-------------------------- @@ -184,6 +189,7 @@ public class WarehouseUpdownTypeApiController { } + @RepeatSubmit @ResponseBody @PostMapping("/upShelfOrder") @ApiOperationSupport(order = 1) @@ -193,8 +199,21 @@ public class WarehouseUpdownTypeApiController { log.info(method + "上架订单维度 updownTypeDTO={}", updownTypeDTO); List upShelfOrderList = updownTypeDTO.getUpShelfOrderList(); Long allocationId = updownTypeDTO.getAllocationId();//库位id + + String s = JSONObject.toJSONString(updownTypeDTO); + String hasCret = DigestUtils.md5Hex(s);//摘要 + Boolean exists = redis.exists("updownType:" + hasCret); + if(Boolean.TRUE.equals(exists)){ + log.warn(method+"请勿重复提交 hasCret={}",hasCret); + return R.fail(403,"请勿重复提交"); + } + + redis.set("updownType:" + hasCret, "1"); + try{ + + //当前登录人选择的仓库 BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ @@ -213,17 +232,22 @@ public class WarehouseUpdownTypeApiController { } //查询该库位的货物信息 - return warehouseUpdownTypeService.upShelfOrder(upShelfOrderList,allocationId,myCurrentWarehouse.getId(),"扫码订单上架"); + R r = warehouseUpdownTypeService.upShelfOrder(upShelfOrderList, allocationId, myCurrentWarehouse.getId(), "扫码订单上架"); + redis.del("updownType:" + hasCret); + return r; }catch (CustomerException e){ + redis.del("updownType:" + hasCret); log.warn(e.message); return R.fail(e.code,e.message); }catch (Exception e){ + redis.del("updownType:" + hasCret); log.error(method+"系统异常,联系管理员",e); return R.fail(500,"系统异常,联系管理员"); } } + @RepeatSubmit @ResponseBody @PostMapping("/upShelfPackage") @ApiOperationSupport(order = 1) @@ -233,6 +257,18 @@ public class WarehouseUpdownTypeApiController { log.info(method + "上架包件维度 updownTypeDTO={}", updownTypeDTO); List upShelfPackageList = updownTypeDTO.getUpShelfPackageList(); Long allocationId = updownTypeDTO.getAllocationId();//库位码 + + + String s = JSONObject.toJSONString(updownTypeDTO); + String hasCret = DigestUtils.md5Hex(s);//摘要 + Boolean exists = redis.exists("updownType:" + hasCret); + if(Boolean.TRUE.equals(exists)){ + log.warn(method+"请勿重复提交 hasCret={}",hasCret); + return R.fail(403,"请勿重复提交"); + } + + redis.set("updownType:" + hasCret, "1"); + try{ BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); if(Objects.isNull(myCurrentWarehouse)){ @@ -251,11 +287,15 @@ public class WarehouseUpdownTypeApiController { } //查询该库位的货物信息 - return warehouseUpdownTypeService.upShelfPackage(upShelfPackageList,allocationId,myCurrentWarehouse.getId(),"包件扫码上架"); + R r = warehouseUpdownTypeService.upShelfPackage(upShelfPackageList, allocationId, myCurrentWarehouse.getId(), "包件扫码上架"); + redis.del("updownType:" + hasCret); + return r; }catch (CustomerException e){ + redis.del("updownType:" + hasCret); log.warn(e.message); return R.fail(e.code,e.message); }catch (Exception e){ + redis.del("updownType:" + hasCret); log.error(method+"系统异常,联系管理员",e); return R.fail(500,"系统异常,联系管理员"); } @@ -263,6 +303,7 @@ public class WarehouseUpdownTypeApiController { } + @RepeatSubmit @ResponseBody @PostMapping("/upShelfTray") @ApiOperationSupport(order = 1) @@ -428,6 +469,7 @@ public class WarehouseUpdownTypeApiController { } } + @RepeatSubmit @ResponseBody @PostMapping("/upShelfStockList") @ApiOperationSupport(order = 1) diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..5e5895f27 --- /dev/null +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/aspect/AsyncAnnotationAspect.java @@ -0,0 +1,51 @@ +package com.logpm.warehouse.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@Slf4j +@Order(-1) +public class AsyncAnnotationAspect { + + /** + * 定义一个切点,匹配所有带有@LogpmAsync("asyncExecutor")注解的方法。 + * 注意:实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理,直接这样配置可能会导致预期之外的行为。 + */ + @Around("@annotation(org.springblade.common.annotations.LogpmAsync)") + public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class); + String annotationValue = myAsync.value(); + log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue); + + log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 "); + + // 在方法执行前的操作 + String tenantId = AuthUtil.getTenantId(); + log.info(">> tenandId {} ",tenantId); + DynamicDataSourceContextHolder.push(tenantId); + + // 执行原方法 + Object result = joinPoint.proceed(); + + // 在方法执行后的操作 + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..c8617a0c0 --- /dev/null +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/aspect/RabbitAnnotationAspect.java @@ -0,0 +1,48 @@ +package com.logpm.warehouse.aspect; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springblade.core.secure.utils.AuthUtil; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@Slf4j +public class RabbitAnnotationAspect { + + + /** + * 该方法为一个切面,用于对标记了@RabbitListener注解的方法进行增强,主要增加了日志记录和数据源上下文处理的功能。 + * + * @param joinPoint 切面的连接点,表示当前被拦截的方法。 + * @return 返回被拦截方法的执行结果。 + * @throws Throwable 如果执行过程中发生异常,则抛出。 + */ + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)") + public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + + @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)") + public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable { + // 在方法执行前,获取当前租户ID并设置到数据源上下文中 + String tenantId = AuthUtil.getTenantId(); + DynamicDataSourceContextHolder.push(tenantId); + // 执行原方法 + Object result = joinPoint.proceed(); + // 在方法执行后,从数据源上下文中移除租户ID + DynamicDataSourceContextHolder.poll(); + return result; + } + +} diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/CustomMessageConverter.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/CustomMessageConverter.java new file mode 100644 index 000000000..c14892da5 --- /dev/null +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/CustomMessageConverter.java @@ -0,0 +1,161 @@ +package com.logpm.warehouse.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.amqp.utils.SerializationUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +/** + * @author zhaoqiaobo + * @create 2024-05-08 + */ +@Component +public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware { + + private volatile String defaultCharset = "UTF-8"; + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + private String codebaseUrl; + + @Deprecated + public void setCodebaseUrl(String codebaseUrl) { + this.codebaseUrl = codebaseUrl; + } + + @Override + public Object fromMessage(Message message) throws MessageConversionException { + Object content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String contentType = properties.getContentType(); + if (contentType != null && contentType.startsWith("text")) { + String encoding = properties.getContentEncoding(); + if (encoding == null) { + encoding = "UTF-8"; + } + + try { + content = new String(message.getBody(), encoding); + } catch (UnsupportedEncodingException var8) { + throw new MessageConversionException("failed to convert text-based Message content", var8); + } + } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) { + try { + content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl)); + } catch (IllegalArgumentException | IllegalStateException | IOException var7) { + throw new MessageConversionException("failed to convert serialized Message content", var7); + } + } + } + Map headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry entry : headers.entrySet()) { + if (StrUtil.equals("Blade-Auth", entry.getKey()) + || StrUtil.equals("Authorization", entry.getKey()) + || StrUtil.equals("blade-auth", entry.getKey()) + || StrUtil.equals("authorization", entry.getKey())) { + List value = (List) entry.getValue(); + for (Object o : value) { + httpHeaders.add(entry.getKey(), String.valueOf(o)); + } + } + } + ThreadLocalUtil.put("bladeContext", httpHeaders); + Object bladeUser = headers.get("bladeUser"); + MockHttpServletRequest request = new MockHttpServletRequest(); + BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + if (content == null) { + content = message.getBody(); + } + return content; + } + + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { + byte[] bytes = null; + if (object instanceof byte[]) { + bytes = (byte[]) object; + messageProperties.setContentType("application/octet-stream"); + } else if (object instanceof String) { + try { + bytes = ((String) object).getBytes(this.defaultCharset); + } catch (UnsupportedEncodingException var6) { + throw new MessageConversionException("failed to convert to Message content", var6); + } + + messageProperties.setContentType("text/plain"); + messageProperties.setContentEncoding(this.defaultCharset); + } else if (object instanceof Serializable) { + try { + bytes = SerializationUtils.serialize(object); + } catch (IllegalArgumentException var5) { + throw new MessageConversionException("failed to convert to serialized Message content", var5); + } + + messageProperties.setContentType("application/x-java-serialized-object"); + } + HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext"); + if (headers != null && !headers.isEmpty()) { + headers.forEach((key, values) -> { + values.forEach((value) -> { + messageProperties.setHeader(key, new String[]{value}); + }); + }); + } + BladeUser user = AuthUtil.getUser(); + BladeUser bladeUser = new BladeUser(); + bladeUser.setTenantId(user.getTenantId()); + bladeUser.setUserId(user.getUserId()); + bladeUser.setAccount(user.getAccount()); + bladeUser.setRoleId(user.getRoleId()); + messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser)); + + if (bytes != null) { + messageProperties.setContentLength((long) bytes.length); + return new Message(bytes, messageProperties); + } else { + throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName()); + } + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = beanClassLoader; + } + + protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) { + @Override + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + Class clazz = super.resolveClass(classDesc); + CustomMessageConverter.this.checkAllowedList(clazz); + return clazz; + } + }; + } +} diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/ExecutorConfig.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/ExecutorConfig.java new file mode 100644 index 000000000..dc6afe2e4 --- /dev/null +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/ExecutorConfig.java @@ -0,0 +1,79 @@ +package com.logpm.warehouse.config; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@Slf4j +@EnableAsync +public class ExecutorConfig { + + @Bean + public Executor asyncExecutor() { + log.info("start async executor"); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); +// 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(10); +// 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(20); +// 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(50); +// 配置线程池中线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_"); +// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务: +// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行; +// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常; +// DiscardPolicy:丢弃当前将要加入队列的任务; +// DiscardOldestPolicy:丢弃任务队列中最旧的任务; + threadPoolTaskExecutor.setRejectedExecutionHandler( + new ThreadPoolExecutor.CallerRunsPolicy() + ); + threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator()); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } + + + static class ContextCopyingDecorator implements TaskDecorator { + @Nonnull + @Override + public Runnable decorate(@Nonnull Runnable runnable) { + RequestAttributes context = RequestContextHolder.currentRequestAttributes(); + Map all = ThreadLocalUtil.getAll(); + Map mdcMap = MDC.getCopyOfContextMap(); + return () -> { + try { + all.keySet().forEach(key -> ThreadLocalUtil.put(key, all.get(key))); + if (mdcMap != null && !mdcMap.isEmpty()) { + MDC.setContextMap(mdcMap); + } + RequestContextHolder.setRequestAttributes(context); + + runnable.run(); + } finally { + RequestContextHolder.resetRequestAttributes(); + all.clear(); + if (mdcMap != null) { + mdcMap.clear(); + } + ThreadLocalUtil.clear(); + MDC.clear(); + } + }; + } + } + +} diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/InterceptorAdapterConfig.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/InterceptorAdapterConfig.java new file mode 100644 index 000000000..5645722ca --- /dev/null +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/InterceptorAdapterConfig.java @@ -0,0 +1,31 @@ +package com.logpm.warehouse.config; + +import com.logpm.warehouse.config.interceptor.LocalServerLoginAccountsInterceptor; +import lombok.AllArgsConstructor; +import org.springblade.common.component.MockLoginService; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@AllArgsConstructor +public class InterceptorAdapterConfig implements WebMvcConfigurer { + + private final BladeRedis redis; + + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + + + @Override + public void addInterceptors(InterceptorRegistry interceptorRegistry) { + interceptorRegistry.addInterceptor(new LocalServerLoginAccountsInterceptor(redis,redisLockClient,mockLoginService)).addPathPatterns("/oldpush/**").order(1); + +// interceptorRegistry.addInterceptor(new ParameterCombinationInterceptor()) +// .addPathPatterns("/**"); + + } +} diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/RabbitMqConfiguration.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/RabbitMqConfiguration.java index 4779c8bf5..b2bb6db12 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/RabbitMqConfiguration.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/RabbitMqConfiguration.java @@ -27,6 +27,7 @@ public class RabbitMqConfiguration { public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory){ RabbitTemplate template = new RabbitTemplate(); template.setConnectionFactory(connectionFactory); + template.setMessageConverter(new CustomMessageConverter()); template.setMandatory(true); template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { @Override diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/RedissonConfig.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/RedissonConfig.java index e40cd71fe..3c93a4097 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/RedissonConfig.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/RedissonConfig.java @@ -1,35 +1,26 @@ package com.logpm.warehouse.config; -import org.redisson.Redisson; -import org.redisson.config.Config; -import org.springblade.core.redis.cache.BladeRedis; -import org.springblade.core.tool.utils.SpringUtil; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; - -@Configuration +//@Configuration public class RedissonConfig { - @Bean - public Redisson redisson() { - // 单机模式 - Config config = new Config(); - - BladeRedis bean = SpringUtil.getBean(BladeRedis.class); - - RedisConnectionFactory connectionFactory = bean.getRedisTemplate().getConnectionFactory(); - - LettuceConnectionFactory factory = (LettuceConnectionFactory) connectionFactory; - - String hostName = factory.getHostName(); - int port = factory.getPort(); - String password = factory.getPassword(); - - config.useSingleServer().setAddress("redis://"+hostName+":"+port).setDatabase(2); - config.useSingleServer().setPassword(password); - return (Redisson) Redisson.create(config); - } +// @Bean +// public Redisson redisson() { +// // 单机模式 +// Config config = new Config(); +// +// BladeRedis bean = SpringUtil.getBean(BladeRedis.class); +// +// RedisConnectionFactory connectionFactory = bean.getRedisTemplate().getConnectionFactory(); +// +// LettuceConnectionFactory factory = (LettuceConnectionFactory) connectionFactory; +// +// String hostName = factory.getHostName(); +// int port = factory.getPort(); +// String password = factory.getPassword(); +// +// config.useSingleServer().setAddress("redis://"+hostName+":"+port).setDatabase(2); +// config.useSingleServer().setPassword(password); +// return (Redisson) Redisson.create(config); +// } } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/interceptor/LocalServerLoginAccountsInterceptor.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/interceptor/LocalServerLoginAccountsInterceptor.java new file mode 100644 index 000000000..515c3e11d --- /dev/null +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/config/interceptor/LocalServerLoginAccountsInterceptor.java @@ -0,0 +1,100 @@ +package com.logpm.warehouse.config.interceptor; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springblade.common.cache.CacheNames; +import org.springblade.common.component.MockLoginService; +import org.springblade.common.constant.LauncherConstant; +import org.springblade.common.exception.CustomerException; +import org.springblade.common.wrapper.CustomHttpServletRequestWrapper; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.redis.lock.LockType; +import org.springblade.core.redis.lock.RedisLockClient; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.ThreadLocalUtil; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Log4j2 +@AllArgsConstructor +public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapter { + + private final BladeRedis bladeRedis; + private final RedisLockClient redisLockClient; + private final MockLoginService mockLoginService; + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException { + + + try { + CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(request); + String account ="shujutongbu"; + JSONObject data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + boolean flag = redisLockClient.tryLock("local_server_user", LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS); + if(flag){ + data =bladeRedis.get(CacheNames.LOCAL_SERVER_USER+account); + if(Objects.isNull(data)){ + data = mockLoginService.mockToken("627683",account); + bladeRedis.setEx(CacheNames.LOCAL_SERVER_USER+account,data,2591990L); + redisLockClient.unLock("local_server_user", LockType.FAIR); + } + } + } + + // 修改或添加header + + // 发送登录请求 + log.info("##########preHandle: request={}", request); + + wrappedRequest.addHeader("Blade-Auth", "bearer "+data.getString("access_token")); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") ); + httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0"); + ThreadLocalUtil.put("bladeContext", httpHeaders); + + + // 用包装后的request替换原始request + request = wrappedRequest; + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + return true; + } catch (Exception e) { + returnJson(response, JSONObject.toJSONString(R.fail(500, "服务异常,请联系管理员"))); + return false; + } + } + + private void returnJson(HttpServletResponse response, String json) { + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + try { + writer = response.getWriter(); + writer.print(json); + + } catch (IOException e) { + System.out.println(e.getMessage()); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + +} diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/OldSystemPushController.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/OldSystemPushController.java index c48826a09..512e1ad1b 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/OldSystemPushController.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/OldSystemPushController.java @@ -1,5 +1,6 @@ package com.logpm.warehouse.controller; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; @@ -16,6 +17,7 @@ import org.springblade.common.constant.OldSystemDataPushConfig; import org.springblade.common.constant.RabbitConstant; import org.springblade.common.exception.CustomerException; import org.springblade.common.utils.CommonUtil; +import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springframework.amqp.rabbit.core.RabbitTemplate; @@ -43,6 +45,7 @@ public class OldSystemPushController { private final RabbitTemplate rabbitTemplate; private final IAsyncDataService asyncDataService; private final ISyncOldTrayTypeLogService syncOldTrayTypeLogService; + private final BladeRedis bladeRedis; // private final IWarehouseWaybillService warehouseWaybillService; // @@ -182,7 +185,8 @@ public class OldSystemPushController { warehouseLog.setType(3); warehouseLogService.save(warehouseLog); - asyncDataService.sendTrayInfoByOrderPackageCode(trayInfoDTO); + rabbitTemplate.convertAndSend(RabbitConstant.OLD_TRAY_TYPE_EXCHANGE,RabbitConstant.OLD_TRAY_TYPE_ROUTING, JSONObject.toJSONString(trayInfoDTO)); +// asyncDataService.sendTrayInfoByOrderPackageCode(trayInfoDTO); warehouseLog.setStatus(1); warehouseLogService.updateById(warehouseLog); @@ -248,6 +252,45 @@ public class OldSystemPushController { } } + @ResponseBody + @PostMapping("/addCreateTrayData") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "老系统创建托盘数据", notes = "传入waybillDTO") + public R addCreateTrayData(@RequestBody TrayInfoDTO trayInfoDTO) { + log.info("############addCreateTrayData: 请求参数{}",trayInfoDTO); + try{ + + List trayNos = trayInfoDTO.getTrayNos(); + Integer warehouseId = trayInfoDTO.getWarehouseId(); + + if(trayNos.isEmpty()){ + log.warn("##############addCreateTrayData: 托盘id不存在 trayNos={}",trayNos); + return R.fail(405,"托盘id不存在"); + } + if(Objects.isNull(warehouseId)){ + log.warn("##############addCreateTrayData: 仓库id不存在 warehouseId={}",warehouseId); + return R.fail(405,"仓库id不存在"); + } + + //先保存原始请求数据 + WarehouseLog warehouseLog = new WarehouseLog(); + warehouseLog.setArgs(JSON.toJSONString(trayInfoDTO)); + warehouseLog.setStatus(0); + warehouseLog.setType(5); + warehouseLogService.save(warehouseLog); + + asyncDataService.addCreateTrayData(trayInfoDTO); + warehouseLog.setStatus(1); + warehouseLogService.updateById(warehouseLog); + return R.success("操作成功"); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error("############sendOrders: 系统异常",e); + return R.fail(500,"############sendOrders: 系统异常"); + } + } } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/TaskQuestController.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/TaskQuestController.java index 99d75f204..fbd284ab7 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/TaskQuestController.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/TaskQuestController.java @@ -172,7 +172,7 @@ public class TaskQuestController extends BladeController { @GetMapping("/exportContrastStockInfo") @ApiOperationSupport(order = 1) @ApiOperation(value = "盘点任务 未盘点数据导出", notes = "传入id") - public void exportContrastStockInfo( HttpServletResponse response,QuestDetailDTO questDetailDTO,Query query){ + public void exportContrastStockInfo( HttpServletResponse response,QuestDetailDTO questDetailDTO){ // IPage page = taskQuestService.selectTaskDataInfo(questDetailDTO,Condition.getPage(query)); List data =taskQuestService.exportContrastStockInfo(questDetailDTO); diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseGoodsAllocationController.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseGoodsAllocationController.java index a02c617e7..f174e1cd6 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseGoodsAllocationController.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseGoodsAllocationController.java @@ -21,8 +21,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.logpm.basicdata.entity.BasicdataWarehouseEntity; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; - -import com.logpm.warehouse.config.RedissonConfig; import com.logpm.warehouse.dto.*; import com.logpm.warehouse.entity.WarehouseGoodsAllocationEntity; import com.logpm.warehouse.excel.WarehouseGoodsAllocationExcel; @@ -37,7 +35,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; -import org.redisson.api.RLock; import org.springblade.common.exception.CustomerException; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.excel.util.ExcelUtil; @@ -58,7 +55,6 @@ import javax.validation.Valid; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -140,6 +136,14 @@ public class WarehouseGoodsAllocationController extends BladeController { return R.data(WarehouseVisualizaVOWrapper.build().pageVO(pages)); } + @GetMapping("/wrapStockUp") + @ApiOperationSupport(order = 5) + @ApiOperation(value = "备货货位上架 查询包件", notes = "传入warehouseGoodsAllocation") + public R> wrapStockUp(WarehouseVisualizationDTO warehouseGoodsAllocation, Query query) { + IPage pages = warehouseGoodsAllocationService.wrapStockUp(warehouseGoodsAllocation, Condition.getPage(query)); + return R.data(WarehouseVisualizaVOWrapper.build().pageVO(pages)); + } + /** * 货位上架 查询订单 */ @@ -202,6 +206,8 @@ public class WarehouseGoodsAllocationController extends BladeController { } + + /** * 货位上架 订单上架 */ @@ -213,12 +219,16 @@ public class WarehouseGoodsAllocationController extends BladeController { Long allocationId = updownTypeDTO.getAllocationId(); //设置lockey String lockKey ="lock:upPackage:" + allocationId; - RLock lock = new RedissonConfig().redisson().getLock(lockKey); - if(lock.isLocked()){ + + +// RLock lock = new RedissonConfig().redisson().getLock(lockKey); + + if(bladeRedis.exists(lockKey)){ return R.fail("该货位还在上架中!!!"); } - lock.lock(5, TimeUnit.SECONDS); - if (upShelfOrderList.size() == 0 || Objects.isNull(allocationId)) { + bladeRedis.setEx(lockKey,allocationId,5L); + + if (upShelfOrderList.isEmpty() || Objects.isNull(allocationId)) { return R.fail("参数不全"); } //查询是否为备货区 @@ -232,7 +242,7 @@ public class WarehouseGoodsAllocationController extends BladeController { return R.fail(403,"仓库信息为空"); } - R r = warehouseUpdownTypeService.upShelfOrder(upShelfOrderList, allocationId,myCurrentWarehouse.getId(),"扫码订单上架"); + R r = warehouseUpdownTypeService.upShelfOrder(upShelfOrderList, allocationId,myCurrentWarehouse.getId(),"PC订单上架"); // if (r.getCode() == 200) { // warehouseGoodsAllocationService.updateAllocationCache(allocationId.toString()); // } @@ -252,11 +262,11 @@ public class WarehouseGoodsAllocationController extends BladeController { Long allocationId = updownTypeDTO.getAllocationId(); //设置lockey String lockKey ="lock:upPackage:" + allocationId; - RLock lock = new RedissonConfig().redisson().getLock(lockKey); - if(lock.isLocked()){ + if(bladeRedis.exists(lockKey)){ return R.fail("该货位还在上架中!!!"); } - lock.lock(5, TimeUnit.SECONDS); + bladeRedis.setEx(lockKey,allocationId,5L); + Boolean b = warehouseGoodsAllocationService.selectIsStocking(allocationId); if (b){ return R.fail("备货区不可上架"); @@ -294,11 +304,11 @@ public class WarehouseGoodsAllocationController extends BladeController { Long allocationId = updownTypeDTO.getAllocationId(); //设置lockey String lockKey ="lock:upPackage:" + allocationId; - RLock lock = new RedissonConfig().redisson().getLock(lockKey); - if(lock.isLocked()){ + if(bladeRedis.exists(lockKey)){ return R.fail("该货位还在上架中!!!"); } - lock.lock(3, TimeUnit.SECONDS); + bladeRedis.setEx(lockKey,allocationId,3L); + if (upShelfPackageList.size() == 0 || Objects.isNull(allocationId)) { return R.fail("参数不全"); } @@ -330,11 +340,11 @@ public class WarehouseGoodsAllocationController extends BladeController { Long allocationId = updownTypeDTO.getAllocationId(); //设置lockey String lockKey ="lock:upPackage:" + allocationId; - RLock lock = new RedissonConfig().redisson().getLock(lockKey); - if(lock.isLocked()){ + if(bladeRedis.exists(lockKey)){ return R.fail("该货位还在上架中!!!"); } - lock.lock(5, TimeUnit.SECONDS); + bladeRedis.setEx(lockKey,allocationId,5L); + if (null == allocationId || StringUtil.isBlank(trayCode)) { return R.fail("参数不全"); } @@ -365,12 +375,12 @@ public class WarehouseGoodsAllocationController extends BladeController { List upShelfStockList = updownTypeDTO.getUpShelfStockList(); //设置lockey String lockKey ="lock:upPackage:" + allocationId; - RLock lock = new RedissonConfig().redisson().getLock(lockKey); - if(lock.isLocked()){ + if(bladeRedis.exists(lockKey)){ return R.fail("该货位还在上架中!!!"); } - lock.lock(5, TimeUnit.SECONDS); - if (null == allocationId || upShelfStockList.size() == 0) { + bladeRedis.setEx(lockKey,allocationId,5L); + + if (null == allocationId || upShelfStockList.isEmpty()) { return R.fail("参数不全"); } BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); @@ -402,11 +412,11 @@ public class WarehouseGoodsAllocationController extends BladeController { List upShelfZeroOrderList = updownTypeDTO.getUpShelfZeroOrderList(); //设置lockey String lockKey ="lock:upPackage:" + allocationId; - RLock lock = new RedissonConfig().redisson().getLock(lockKey); - if(lock.isLocked()){ + if(bladeRedis.exists(lockKey)){ return R.fail("该货位还在上架中!!!"); } - lock.lock(5, TimeUnit.SECONDS); + bladeRedis.setEx(lockKey,allocationId,5L); + if (null == allocationId || upShelfZeroOrderList.size() == 0) { return R.fail("参数不全"); } @@ -490,16 +500,6 @@ public class WarehouseGoodsAllocationController extends BladeController { } - /** - * 备货库位 查询包件 - */ - @GetMapping("/selectStockUpAllocationWrap") - @ApiOperationSupport(order = 20) - @ApiOperation(value = "货位 查询包件", notes = "传入warehouseGoodsAllocation") - public R> selectStockUpAllocationWrap(WarehouseGoodsAllocationDTO warehouseGoodsAllocation, Query query) { - IPage pages = warehouseGoodsAllocationService.selectStockUpAllocationWrap(warehouseGoodsAllocation, Condition.getPage(query)); - return R.data(WarehouseVisualizaVOWrapper.build().pageVO(pages)); - } /** * 货位 查询库存品 @@ -512,6 +512,8 @@ public class WarehouseGoodsAllocationController extends BladeController { return R.data(pages); } + + /** * 货位 查询零担 */ @@ -523,6 +525,14 @@ public class WarehouseGoodsAllocationController extends BladeController { return R.data(pages); } + @GetMapping("/selectStockUpZeroOrder") + @ApiOperationSupport(order = 22) + @ApiOperation(value = "货位 查询零担", notes = "传入warehouseGoodsAllocation") + public R> selectStockUpZeroOrder(WarehouseStockArticleZationDTO warehouseStockArticleZationDTO, Query query) { + IPage pages = warehouseGoodsAllocationService.selectStockUpZeroOrder(warehouseStockArticleZationDTO, Condition.getPage(query)); + return R.data(pages); + } + /** * 货位 查询托盘 */ @@ -543,7 +553,7 @@ public class WarehouseGoodsAllocationController extends BladeController { @ApiOperation(value = "货位 下架包件", notes = "传入warehouseGoodsAllocation") public R downPackage(@RequestBody UpdownTypeDTO updownTypeDTO) { List upShelfPackageList = updownTypeDTO.getUpShelfPackageList(); - if (upShelfPackageList.size() == 0) { + if (upShelfPackageList.isEmpty()) { return R.fail("参数不全"); } BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); @@ -606,7 +616,7 @@ public class WarehouseGoodsAllocationController extends BladeController { @ApiOperation(value = "货位 下架库存品", notes = "传入warehouseGoodsAllocation") public R downStock(@RequestBody UpdownTypeDTO updownTypeDTO) { List upShelfStockList = updownTypeDTO.getUpShelfStockList(); - if (upShelfStockList.size() == 0) { + if (upShelfStockList.isEmpty()) { return R.fail("参数不全"); } BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseRetentionScanController.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseRetentionScanController.java index 7a8fc93aa..e9c50d240 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseRetentionScanController.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseRetentionScanController.java @@ -16,6 +16,7 @@ */ package com.logpm.warehouse.controller; +import com.logpm.warehouse.dto.WarehouseRetentionScanDTO; import com.logpm.warehouse.entity.WarehouseRetentionScanEntity; import com.logpm.warehouse.excel.WarehouseRetentionScanExcel; import com.logpm.warehouse.service.IWarehouseRetentionScanService; @@ -89,7 +90,7 @@ public class WarehouseRetentionScanController extends BladeController { @GetMapping("/page") @ApiOperationSupport(order = 3) @ApiOperation(value = "分页", notes = "传入warehouseRetentionScan") - public R> page(WarehouseRetentionScanVO warehouseRetentionScan, Query query) { + public R> page(WarehouseRetentionScanDTO warehouseRetentionScan, Query query) { IPage pages = warehouseRetentionScanService.selectWarehouseRetentionRecordPage(Condition.getPage(query), warehouseRetentionScan); return R.data(pages); } @@ -141,14 +142,10 @@ public class WarehouseRetentionScanController extends BladeController { @GetMapping("/export-warehouseRetentionScan") @ApiOperationSupport(order = 9) @ApiOperation(value = "导出数据", notes = "传入warehouseRetentionScan") - public void exportWarehouseRetentionScan(@ApiIgnore @RequestParam Map warehouseRetentionScan, BladeUser bladeUser, HttpServletResponse response) { - QueryWrapper queryWrapper = Condition.getQueryWrapper(warehouseRetentionScan, WarehouseRetentionScanEntity.class); - //if (!AuthUtil.isAdministrator()) { - // queryWrapper.lambda().eq(WarehouseRetentionScan::getTenantId, bladeUser.getTenantId()); - //} - queryWrapper.lambda().eq(WarehouseRetentionScanEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED); - List list = warehouseRetentionScanService.exportWarehouseRetentionRecord(queryWrapper); - ExcelUtil.export(response, "滞留扫描记录数据" + DateUtil.time(), "滞留扫描记录数据表", list, WarehouseRetentionScanExcel.class); + public void exportWarehouseRetentionScan(WarehouseRetentionScanDTO warehouseRetentionScan,HttpServletResponse response) { + List warehouseRetentionScanExcelList = warehouseRetentionScanService.getExportWarehouseRetentionScanList(warehouseRetentionScan); + + ExcelUtil.export(response, "滞留扫描记录数据" + DateUtil.time(), "滞留扫描记录数据表", warehouseRetentionScanExcelList, WarehouseRetentionScanExcel.class); } } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWarehousingEntryController.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWarehousingEntryController.java index 699b4ef11..a6a1833d4 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWarehousingEntryController.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWarehousingEntryController.java @@ -218,6 +218,7 @@ public class WarehouseWarehousingEntryController extends BladeController { warehousingEntryDetailExcel.setPackagingSpecifications("1"); warehousingEntryDetailExcel.setCreateInventory(100); warehousingEntryDetailExcel.setPositions("存放位置 选填"); + warehousingEntryDetailExcel.setLoadingType("存放类型 1-库位 2-托盘 "); warehousingEntryDetailExcel.setRemark("备注 选填"); list.add(warehousingEntryDetailExcel); ExcelUtil.export(response, "仓库入库单数据" + DateUtil.time(), "仓库入库单数据表", list, WarehousingEntryDetailExcel.class); diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWaybillController.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWaybillController.java index 90b5f6c95..63cf135e8 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWaybillController.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWaybillController.java @@ -22,11 +22,13 @@ import com.logpm.basicdata.entity.BasicdataWarehouseEntity; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; import com.logpm.distribution.entity.DistributionStockArticleEntity; import com.logpm.distribution.feign.IDistributionStockArticleClient; +import com.logpm.distribution.vo.print.PrintPreviewVO; import com.logpm.warehouse.dto.SplitOrderDTO; import com.logpm.warehouse.dto.WarehouseWaybillDTO; import com.logpm.warehouse.entity.WarehouseWaybillEntity; import com.logpm.warehouse.excel.WarehouseWaybillExcel; import com.logpm.warehouse.service.IWarehouseWaybillService; +import com.logpm.warehouse.vo.ExportWarehouseWaybillVO; import com.logpm.warehouse.vo.WarehouseWaybillVO; import com.logpm.warehouse.wrapper.WarehouseWaybillWrapper; import io.swagger.annotations.Api; @@ -50,6 +52,7 @@ import springfox.documentation.annotations.ApiIgnore; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -258,6 +261,73 @@ public class WarehouseWaybillController extends BladeController { } } + @ResponseBody + @PostMapping("/exportWaybillList") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "导出运单列表", notes = "传入waybillDTO") + public void exportWaybillList(@RequestBody WarehouseWaybillDTO waybillDTO, HttpServletResponse response) { + String method = "############exportWaybillList: "; + log.info(method + "请求参数{}", waybillDTO); + try{ + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + log.warn(method+"仓库信息为空 myCurrentWarehouse={}",myCurrentWarehouse); + throw new CustomerException(403,"仓库信息为空"); + } + waybillDTO.setWarehouseId(myCurrentWarehouse.getId()); + + List list = warehouseWaybillService.exportWaybillList(waybillDTO); + + //导出ls + ExcelUtil.export(response, "运单列表"+myCurrentWarehouse.getName(), "运单列表", list, ExportWarehouseWaybillVO.class); + }catch (CustomerException e){ + log.error(e.message,e); + throw new CustomerException(e.code,e.message); + }catch (Exception e){ + log.error(method+"系统异常",e); + throw new CustomerException(500,"系统异常"); + } + } + + + + @ResponseBody + @PostMapping("/pageFinanceWaybillList") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "分页查询运单审核", notes = "传入waybillDTO") + public R pageFinanceWaybillList(@RequestBody WarehouseWaybillDTO waybillDTO) { + String method = "############pageFinanceWaybillList: "; + log.info(method + "请求参数{}", waybillDTO); + try{ + List destinationWarehouseIds = new ArrayList<>(); + //当前登录人选择的仓库 + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if(Objects.isNull(myCurrentWarehouse)){ + List myWatchWarehouse = warehouseClient.getMyWatchWarehouse(); + if(!myWatchWarehouse.isEmpty()){ + myWatchWarehouse.forEach(warehouseEntity -> { + destinationWarehouseIds.add(warehouseEntity.getId()); + }); + } + }else{ + destinationWarehouseIds.add(myCurrentWarehouse.getId()); + } + waybillDTO.setDestinationWarehouseIds(destinationWarehouseIds); + + IPage pages = warehouseWaybillService.pageFinanceWaybillList(waybillDTO); + + return R.data(pages); + }catch (CustomerException e){ + log.error(e.message,e); + return R.fail(e.code,e.message); + }catch (Exception e){ + log.error("############sendOrders: 系统异常",e); + return R.fail(500,"############sendOrders: 系统异常"); + } + } + + @ResponseBody @PostMapping("/findWaybillInfo") @ApiOperationSupport(order = 1) @@ -317,5 +387,25 @@ public class WarehouseWaybillController extends BladeController { } } + /** + * 打印运单 + * @param ids 运单ID + * @param tempId 模板ID + * @return + */ + @PostMapping("/printBatch") + @ApiOperationSupport(order = 2) + @ApiOperation(value = "批量打印 配送单") + public R>> printBatch(@ApiParam(value = "主键集合", required = true) @RequestParam String ids, @ApiParam(value = "打印类型", required = true) @RequestParam String tempId) { + try { + log.info(">>>>>>>>>>>>>>>>>> printBatch {}",ids); + Map> printPreviewVOS = warehouseWaybillService.printBatch(ids, tempId); + return R.data(printPreviewVOS); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/DownPackageCodeDTO.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/DownPackageCodeDTO.java new file mode 100644 index 000000000..58b1c4546 --- /dev/null +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/DownPackageCodeDTO.java @@ -0,0 +1,13 @@ +package com.logpm.warehouse.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class DownPackageCodeDTO implements Serializable { + + private String orderPackageCode; + private Long warehouseId; + +} diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/NoDataStockListDTO.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/NoDataStockListDTO.java new file mode 100644 index 000000000..7fb932f92 --- /dev/null +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/NoDataStockListDTO.java @@ -0,0 +1,15 @@ +package com.logpm.warehouse.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class NoDataStockListDTO implements Serializable { + + private String materialCode;//物料编码 + private Long marketId;//商场id + private String incomingBatch;//批次号 + private Integer num;//数量 + +} diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/RetentionDistributionListDetailDTO.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/RetentionDistributionListDetailDTO.java index 3be7d0ec1..c65f05e17 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/RetentionDistributionListDetailDTO.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/RetentionDistributionListDetailDTO.java @@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) public class RetentionDistributionListDetailDTO extends DisStockListDetailEntity { - private String MaterialName; + private String materialName; private String materialNumber; } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/TrayTypeDTO.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/TrayTypeDTO.java index f431b3ed5..c8d59ac56 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/TrayTypeDTO.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/TrayTypeDTO.java @@ -54,7 +54,10 @@ public class TrayTypeDTO implements Serializable { private String sourceTrayCode; private String targetTrayCode; + private List noDataStockListDTOS = new ArrayList<>(); private List trayGoodsIds = new ArrayList<>(); + private List downPackageCodeDTOS = new ArrayList<>(); + } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseGoodsAllocationDTO.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseGoodsAllocationDTO.java index 73badf72a..a62a5037f 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseGoodsAllocationDTO.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseGoodsAllocationDTO.java @@ -46,5 +46,9 @@ public class WarehouseGoodsAllocationDTO extends WarehouseGoodsAllocationEntity * 物料编码 */ private String materialCode; + /** + * 物料编码 + */ + private String areaType; } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseRetentionScanDTO.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseRetentionScanDTO.java index e3347140f..ebaf6ee88 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseRetentionScanDTO.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseRetentionScanDTO.java @@ -20,6 +20,8 @@ import com.logpm.warehouse.entity.WarehouseRetentionScanEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.List; + /** * 滞留扫描记录 数据传输对象实体类 * @@ -31,4 +33,21 @@ import lombok.EqualsAndHashCode; public class WarehouseRetentionScanDTO extends WarehouseRetentionScanEntity { private static final long serialVersionUID = 1L; + /** + * 日期搜索 + */ + private String scanDate; + + /** + * 日期区间搜索 + */ + private String scanDateStart; + + /** + * 日期区间搜索 + */ + private String scanDateEnd; + + private List warehouseListId; + } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseStockArticleZationDTO.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseStockArticleZationDTO.java index 3efe88d52..8f0dabf69 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseStockArticleZationDTO.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseStockArticleZationDTO.java @@ -39,4 +39,6 @@ public class WarehouseStockArticleZationDTO extends DistributionStockArticleEnti * 仓库Id */ private List warehouseIdList; + + private String areaType; } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseWaybillDTO.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseWaybillDTO.java index 35da651d1..498bb5e3a 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseWaybillDTO.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/dto/WarehouseWaybillDTO.java @@ -20,6 +20,7 @@ import com.logpm.warehouse.entity.WarehouseWaybillEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.Date; import java.util.List; /** @@ -44,5 +45,26 @@ public class WarehouseWaybillDTO extends WarehouseWaybillEntity { private List waybillNoList; + private String documentMakingTimeStartStr; + private String documentMakingTimeEndStr; + + private Date documentMakingTimeStartDate; + private Date documentMakingTimeEndDate; + + private String createTimeStartStr; + private String createTimeEndStr; + + private Date createTimeStartDate; + private Date createTimeEndDate; + + private String abolishTimeStartStr; + private String abolishTimeEndStr; + private Date abolishTimeStartDate; + private Date abolishTimeEndDate; + + private String freezeTimeStartStr; + private String freezeTimeEndStr; + private Date freezeTimeStartDate; + private Date freezeTimeEndDate; } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehouseRetentionScanExcel.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehouseRetentionScanExcel.java index 953bed997..03d7677e7 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehouseRetentionScanExcel.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehouseRetentionScanExcel.java @@ -41,161 +41,107 @@ public class WarehouseRetentionScanExcel implements Serializable { private static final long serialVersionUID = 1L; - /** - * 租户号 - */ - @ColumnWidth(20) - @ExcelProperty("租户号") - private String tenantId; - /** - * 是否已删除 - */ - @ColumnWidth(20) - @ExcelProperty("是否已删除") - private Integer isDeleted; - /** - * 预留1 - */ - @ColumnWidth(20) - @ExcelProperty("预留1") - private String reserve1; - /** - * 预留2 - */ - @ColumnWidth(20) - @ExcelProperty("预留2") - private String reserve2; - /** - * 预留3 - */ - @ColumnWidth(20) - @ExcelProperty("预留3") - private String reserve3; - /** - * 预留4 - */ - @ColumnWidth(20) - @ExcelProperty("预留4") - private String reserve4; - /** - * 预留5 - */ - @ColumnWidth(20) - @ExcelProperty("预留5") - private String reserve5; + /** * 配送车次号 */ @ColumnWidth(20) @ExcelProperty("配送车次号") private String trainNumber; + /** - * 订单ID - */ - @ColumnWidth(20) - @ExcelProperty("订单ID") - private Long orderId; - /** - * 库存品ID - */ - @ColumnWidth(20) - @ExcelProperty("库存品ID") - private Long inventoryId; - /** - * 滞留类型 1-包件、2-零担(这里会关联到具体的品类)、3-库存品 - */ - @ColumnWidth(20) - @ExcelProperty("滞留类型 1-包件、2-零担(这里会关联到具体的品类)、3-库存品") - private Integer conditions; - /** - * 物料编码(库存品) - */ - @ColumnWidth(20) - @ExcelProperty("物料编码(库存品)") - private String materialNumber; - /** - * 物料名称(库存品) + * 预约单号 */ @ColumnWidth(20) - @ExcelProperty("物料名称(库存品)") - private String materialName; + @ExcelProperty("预约单号") + private String reservationCode; + /** - * 预约客户ID + * 预约单号 */ @ColumnWidth(20) - @ExcelProperty("预约客户ID") - private Long reservationId; + @ExcelProperty("运单号") + private String waybillNumber; + /** * 订单自编号(库存品没有) */ @ColumnWidth(20) - @ExcelProperty("订单自编号(库存品没有)") + @ExcelProperty("订单自编号") private String orderCode; + /** - * 预约单号 - */ - @ColumnWidth(20) - @ExcelProperty("预约单号") - private String reservationCode; - /** - * 扫描类型:1-包件、2-订单、3-托盘、4... + * 包条码 */ @ColumnWidth(20) - @ExcelProperty("扫描类型:1-包件、2-订单、3-托盘、4...") - private Integer scanType; + @ExcelProperty("包条码") + private String orderPackageCode; + /** - * 包件ID + * 物料编码(库存品) */ @ColumnWidth(20) - @ExcelProperty("包件ID") - private Long orderPackageId; + @ExcelProperty("物料编码") + private String materialNumber; + + /** - * 包条码 + * 物料名称(库存品) */ @ColumnWidth(20) - @ExcelProperty("包条码") - private String orderPackageCode; + @ExcelProperty("物料名称") + private String materialName; + /** - * 滞留数量 + * 滞留扫描时间 */ @ColumnWidth(20) - @ExcelProperty("滞留数量") - private Integer retentionQuantity; + @ExcelProperty("滞留扫描时间") + private Date retentionScanTime; + /** * 滞留扫描操作人名称 */ @ColumnWidth(20) @ExcelProperty("滞留扫描操作人名称") private String retentionScanUsername; + /** - * 滞留扫描操作人Id + * 滞留数量 */ @ColumnWidth(20) - @ExcelProperty("滞留扫描操作人Id") - private String retentionScanUserId; + @ExcelProperty("滞留数量") + private Integer retentionQuantity; + + /** - * 滞留操作备注 + * 订单自编号(库存品没有) */ @ColumnWidth(20) - @ExcelProperty("滞留操作备注") - private String remarks; + @ExcelProperty("仓库") + private String warehouseName; + /** - * 滞留扫描时间 + * 滞留方式 1-PDA、2-PC */ @ColumnWidth(20) - @ExcelProperty("滞留扫描时间") - private Date retentionScanTime; + @ExcelProperty("滞留方式 1-PDA、2-PC") + private String retentionWay; + + /** - * 滞留方式 1-PDA、2-PC + * 滞留类型 */ @ColumnWidth(20) - @ExcelProperty("滞留方式 1-PDA、2-PC") - private Integer retentionWay; + @ExcelProperty("滞留货物类型") + private String conditions; + + /** - * 配送任务ID + * 滞留操作备注 */ @ColumnWidth(20) - @ExcelProperty("配送任务ID") - private Long deliveryListId; + @ExcelProperty("备注") + private String remarks; } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehousingEntryDetailExcel.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehousingEntryDetailExcel.java index 93d5d469f..5c64bbcbf 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehousingEntryDetailExcel.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehousingEntryDetailExcel.java @@ -5,6 +5,7 @@ import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -164,12 +165,22 @@ public class WarehousingEntryDetailExcel implements Serializable { @ColumnWidth(20) @ExcelProperty("入库数量") private Integer createInventory; + + /** * 存放位置 */ @ColumnWidth(20) @ExcelProperty("存放位置") private String positions; + + /** + * 装载类型 1- 库位 2- 托盘 + */ + @ExcelProperty("存放类型") + @ApiModelProperty(value = "装载类型 1- 库位 2- 托盘") + private String loadingType; + /** * 备注 */ @@ -180,4 +191,5 @@ public class WarehousingEntryDetailExcel implements Serializable { + } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseGoodsAllocationClient.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseGoodsAllocationClient.java index 02a75eed6..d82ad97ee 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseGoodsAllocationClient.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseGoodsAllocationClient.java @@ -17,6 +17,7 @@ package com.logpm.warehouse.feign; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.logpm.warehouse.entity.WarehouseGoodsAllocationEntity; import com.logpm.warehouse.service.IWarehouseGoodsAllocationService; import lombok.AllArgsConstructor; @@ -70,4 +71,11 @@ public class WarehouseGoodsAllocationClient implements IWarehouseGoodsAllocation return warehouseGoodsAllocationService.selectAllocationInfo(lss); } + + @Override + public WarehouseGoodsAllocationEntity findByAllocationQrCode(String positions) { + return warehouseGoodsAllocationService.list(Wrappers.query().lambda() + .eq(WarehouseGoodsAllocationEntity::getQrCode,positions) + ).get(0); + } } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseRetentionScanClient.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseRetentionScanClient.java index 730cd1f55..47e8b3c48 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseRetentionScanClient.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseRetentionScanClient.java @@ -30,6 +30,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; +import java.util.List; + /** * 滞留扫描记录 Feign实现类 * @@ -43,6 +45,8 @@ public class WarehouseRetentionScanClient implements IWarehouseRetentionScanClie private final IWarehouseRetentionScanService warehouseRetentionScanService; + private final IWarehouseRetentionRecordService warehouseRetentionRecordService; + @Override @GetMapping(TOP) public BladePage retentionScanTop(Integer current, Integer size) { @@ -58,4 +62,10 @@ public class WarehouseRetentionScanClient implements IWarehouseRetentionScanClie return R.status(warehouseRetentionScanService.save(warehouseRetentionScanEntity)); } + @Override + public R saveBatchRetentionScan(List warehouseRetentionScanEntities) { + + return warehouseRetentionRecordService.saveBatchRetentionList(warehouseRetentionScanEntities); + } + } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseTrayGoodsClient.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseTrayGoodsClient.java index 0d15091ea..fbe2d1f21 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseTrayGoodsClient.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseTrayGoodsClient.java @@ -1,8 +1,10 @@ package com.logpm.warehouse.feign; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.logpm.warehouse.dto.UpShelfZeroOrderDTO; import com.logpm.warehouse.entity.WarehouseTrayGoodsEntity; import com.logpm.warehouse.service.IWarehouseTrayGoodsService; import com.logpm.warehouse.service.IWarehouseTrayTypeService; @@ -73,10 +75,12 @@ public class WarehouseTrayGoodsClient implements IWarehouseTrayGoodsClient { public List getTrayList(WarehouseTrayGoodsEntity warehouseTrayGoodsEntity) { return warehouseTrayGoodsService.list(Wrappers.query().lambda() .eq(ObjectUtils.isNotNull(warehouseTrayGoodsEntity.getAssociationId()),WarehouseTrayGoodsEntity:: getAssociationId,warehouseTrayGoodsEntity.getAssociationId()) + .eq(ObjectUtils.isNotNull(warehouseTrayGoodsEntity.getAssociationValue()),WarehouseTrayGoodsEntity:: getAssociationValue,warehouseTrayGoodsEntity.getAssociationValue()) .eq(ObjectUtils.isNotNull(warehouseTrayGoodsEntity.getWarehouseId()),WarehouseTrayGoodsEntity:: getWarehouseId,warehouseTrayGoodsEntity.getWarehouseId()) .eq(ObjectUtils.isNotNull(warehouseTrayGoodsEntity.getIncomingBatch()),WarehouseTrayGoodsEntity:: getIncomingBatch,warehouseTrayGoodsEntity.getIncomingBatch()) .eq(ObjectUtils.isNotNull(warehouseTrayGoodsEntity.getMarketId()),WarehouseTrayGoodsEntity::getMarketId ,warehouseTrayGoodsEntity.getMarketId()) .eq(ObjectUtils.isNotNull(warehouseTrayGoodsEntity.getAssociationType()),WarehouseTrayGoodsEntity::getAssociationType ,warehouseTrayGoodsEntity.getAssociationType()) + .eq(ObjectUtils.isNotNull(warehouseTrayGoodsEntity.getTrayId()),WarehouseTrayGoodsEntity::getTrayId ,warehouseTrayGoodsEntity.getTrayId()) ); } @@ -105,6 +109,26 @@ public class WarehouseTrayGoodsClient implements IWarehouseTrayGoodsClient { warehouseTrayGoodsService.deleteByTrayGoodsId(trayGoodsId,warehouseId); } + @Override + public void downZeroTrayById(List list) { + Long warehouseId = null; + Long trayId = null; + Long orderId = null; + Integer num = null; + String remark = null; + for (JSONObject jsonObject:list){ + warehouseId = jsonObject.getLong("warehouseId"); + trayId = jsonObject.getLong("trayId"); + orderId = jsonObject.getLong("orderId"); + num = jsonObject.getInteger("num"); + remark = jsonObject.getString("remark"); + } + + + + warehouseTrayGoodsService.downZeroByTrayId(trayId, orderId, warehouseId, num, remark); + } + /** * @param map * @return diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseTrayTypeClient.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseTrayTypeClient.java index 3ba4fb72a..d5c8d8fbe 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseTrayTypeClient.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseTrayTypeClient.java @@ -1,11 +1,14 @@ package com.logpm.warehouse.feign; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.logpm.warehouse.dto.ZeroOrderVO; +import com.logpm.warehouse.entity.WarehouseTrayTypeEntity; import com.logpm.warehouse.service.IWarehouseTrayTypeService; import com.logpm.warehouse.vo.TrayTypeDataVO; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.tool.api.R; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; @@ -21,7 +24,7 @@ import java.util.Map; public class WarehouseTrayTypeClient implements IWarehouseTrayTypeClient { private final IWarehouseTrayTypeService warehouseTrayTypeService; - + private final BladeRedis redis; @Override @@ -41,14 +44,31 @@ public class WarehouseTrayTypeClient implements IWarehouseTrayTypeClient { Long warehouseId = (Long) map.get("warehouseId"); String orderPackageCode = (String) map.get("orderPackageCode"); - R r = warehouseTrayTypeService.orderScanOrderPackageCodeSync(trayType, trayCode, orderPackageCode, warehouseId); - if(r.getCode() == 200){ - return true; + Boolean exists = redis.exists("trayType:" + trayCode + ":" + orderPackageCode); + if(Boolean.FALSE.equals(exists)){ + try{ + redis.set("trayType:" + trayCode + ":" + orderPackageCode, "1"); + R r = warehouseTrayTypeService.orderScanOrderPackageCodeSync(trayType, trayCode, orderPackageCode, warehouseId); + redis.del("trayType:" + trayCode + ":" + orderPackageCode); + if(r.getCode() == 200){ + return true; + }else{ + log.error("############orderScanOrderPackageCode: orderPackageCode={} code={} msg={}",orderPackageCode,r.getCode(),r.getMsg()); + return false; + } + }catch (Exception e){ + redis.del("trayType:" + trayCode + ":" + orderPackageCode); + log.warn("############orderScanOrderPackageCode: orderPackageCode={} 打托异常",orderPackageCode); + return false; + } + }else{ - log.error("############orderScanOrderPackageCode: orderPackageCode={} code={} msg={}",orderPackageCode,r.getCode(),r.getMsg()); + log.warn("############orderScanOrderPackageCode: orderPackageCode={} 正在打托",orderPackageCode); return false; } + + } @@ -59,7 +79,24 @@ public class WarehouseTrayTypeClient implements IWarehouseTrayTypeClient { Long warehouseId = (Long) map.get("warehouseId"); String orderPackageCode = (String) map.get("orderPackageCode"); - return warehouseTrayTypeService.orderScanOrderPackageCodeSync(trayType, trayCode, orderPackageCode, warehouseId); + Boolean exists = redis.exists("trayType:" + trayCode + ":" + orderPackageCode); + if(Boolean.FALSE.equals(exists)){ + try{ + redis.set("trayType:" + trayCode + ":" + orderPackageCode, "1"); + return warehouseTrayTypeService.orderScanOrderPackageCodeSync(trayType, trayCode, orderPackageCode, warehouseId); + }catch (Exception e){ + redis.del("trayType:" + trayCode + ":" + orderPackageCode); + log.warn("############orderScanOrderPackageCodeReturnR: orderPackageCode={} 打托异常",orderPackageCode); + return R.fail(405,"打托异常 orderPackageCode="+orderPackageCode); + }finally { + redis.del("trayType:" + trayCode + ":" + orderPackageCode); + } + + }else{ + log.warn("############orderScanOrderPackageCodeReturnR: orderPackageCode={} 正在打托",orderPackageCode); + return R.fail(405,orderPackageCode+"正在打托"); + } + } @Override @@ -105,5 +142,13 @@ public class WarehouseTrayTypeClient implements IWarehouseTrayTypeClient { warehouseTrayTypeService.trayToNull(trayCode,remark); } + @Override + public WarehouseTrayTypeEntity findTrayTypeEntity(String trayCode) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("tray_code",trayCode) + .eq("is_deleted",0); + return warehouseTrayTypeService.getOne(queryWrapper); + } + } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownGoodsClient.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownGoodsClient.java index d66e6a4da..ccfb4a6c8 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownGoodsClient.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownGoodsClient.java @@ -16,7 +16,7 @@ import springfox.documentation.annotations.ApiIgnore; import java.util.List; -@NonDS +//@NonDS @ApiIgnore @RestController @AllArgsConstructor diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownStockupAreaClient.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownStockupAreaClient.java index 4dde218e6..94c6c3257 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownStockupAreaClient.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownStockupAreaClient.java @@ -1,5 +1,6 @@ package com.logpm.warehouse.feign; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -29,15 +30,34 @@ public class WarehouseUpdownStockupAreaClient implements IWarehouseUpdownStockUp /** * 备货库位上架 - * @param code 包条码、库存品码、托盘、订单 - * @param stockUpAllocationId 备货库位ID - * @param warehouseId 仓库ID - * @param type 类型 1 - 包件、完成备货库存品、 2 - 零担 3 - 托盘 * @return */ @Override - public Boolean upStockUpShelf(String code, Long stockUpAllocationId, Long warehouseId, Integer type,Integer num) { - return warehouseUpdownStockupAreaService.upStockUpShelf(code,stockUpAllocationId,warehouseId,type,num); + public Boolean upStockUpShelf(JSONObject jsonObject) { + Long warehouseId =jsonObject.getLong("warehouseId"); + String code =jsonObject.getString("code"); + Long stockUpAllocationId =jsonObject.getLong("stockUpAllocationId"); + Integer type =jsonObject.getInteger("type"); + Integer num =jsonObject.getInteger("num"); +// * @param code 包条码、库存品码、托盘、订单 +// * @param stockUpAllocationId 备货库位ID +// * @param warehouseId 仓库ID +// * @param type + return warehouseUpdownStockupAreaService.upStockUpShelf(code, stockUpAllocationId, warehouseId, type, num); + } + + + @Override + public void downStockUpShelf(List jsonObjects) { + for (JSONObject jsonObject : jsonObjects) { + Long warehouseId =jsonObject.getLong("warehouseId"); + Long reservationId =jsonObject.getLong("taskId"); + String code =jsonObject.getString("code"); + String remark =jsonObject.getString("remark"); + Integer type =jsonObject.getInteger("type"); + Integer num =jsonObject.getInteger("num"); + warehouseUpdownStockupAreaService.downStockUpShelf(code,warehouseId,reservationId,type,num,remark); + } } } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownTypeClient.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownTypeClient.java index 2eccd41cc..076f0798c 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownTypeClient.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseUpdownTypeClient.java @@ -97,6 +97,22 @@ public class WarehouseUpdownTypeClient implements IWarehouseUpdownTypeClient { } } + @Override + public R downPackageAndDelTrayAndIsUpdate(String orderPackageCodes,Long warehouseId,String remark,boolean isOrNo) { + List upShelfPackageList = new ArrayList<>(); + String[] split = orderPackageCodes.split(","); + for(String orderPackageCode:split){ + UpShelfPackageDTO dto = new UpShelfPackageDTO(); + dto.setOrderPackageCode(orderPackageCode); + upShelfPackageList.add(dto); + } + if(!upShelfPackageList.isEmpty()){ + return warehouseUpdownTypeService.downPackageAndDelTrayAndIsUpdate(upShelfPackageList,warehouseId,remark,isOrNo); + }else{ + return R.fail(403,"处理失败"); + } + } + @Override public R downTray(String trayCode, Long warehouseId) { return warehouseUpdownTypeService.downTrayCode(trayCode,warehouseId); diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillClient.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillClient.java index ef5c5596a..7ac679ab8 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillClient.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillClient.java @@ -1,5 +1,7 @@ package com.logpm.warehouse.feign; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.logpm.warehouse.entity.WarehouseWaybillEntity; import com.logpm.warehouse.service.IWarehouseWaybillService; @@ -7,7 +9,7 @@ import lombok.AllArgsConstructor; import org.springblade.core.mp.support.BladePage; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; -import org.springblade.core.tenant.annotation.NonDS; +import org.springblade.core.secure.utils.AuthUtil; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,7 +17,7 @@ import springfox.documentation.annotations.ApiIgnore; import java.util.List; -@NonDS +//@NonDS @ApiIgnore @RestController @AllArgsConstructor @@ -36,6 +38,8 @@ public class WarehouseWaybillClient implements IWarehouseWaybillClient { @Override @GetMapping(API_PREFIX + "/findByWaybillNo") public WarehouseWaybillEntity findByWaybillNo(String waybillNo) { + String tenantId = AuthUtil.getTenantId(); + return warehouseWaybillService.findByWaybillNo(waybillNo); } @@ -71,4 +75,48 @@ public class WarehouseWaybillClient implements IWarehouseWaybillClient { public Long findLastData(String waybillNo) { return warehouseWaybillService.findLastData(waybillNo); } + + @Override + public List findListByWaybillIds(List waybillIds) { + //通过waybillIds查询List + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("id", waybillIds); + return warehouseWaybillService.list(queryWrapper); + } + + @Override + public void updateList(List waybillEntities) { + warehouseWaybillService.updateBatchById(waybillEntities); + } + + @Override + public List findFreezeOrAbolishByWaybillNos(List waybillNos) { + return warehouseWaybillService.findFreezeOrAbolishByWaybillNos(waybillNos); + } + + @Override + public List findWaybillBilllByWaybillNos(List waybillNos) { + return warehouseWaybillService.findWaybillBilllByWaybillNos(waybillNos); + } + + @Override + public void updateWaybillFreezeStatusByWaybillIds(List waybillIds) { + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("freeze_user_name",null) + .set("freeze_time",null) + .set("freeze_status",0) + .in("id",waybillIds); + warehouseWaybillService.update(updateWrapper); + } + + @Override + public WarehouseWaybillEntity findWaybillEntityByOrderPackageCode(String orderPackageCode) { + return warehouseWaybillService.findWaybillEntityByOrderPackageCode(orderPackageCode); + } + + @Override + public void deleteByWaybillNo(String waybillNo) { + warehouseWaybillService.deleteByWaybillNo(waybillNo); + } } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillDetailClient.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillDetailClient.java index 25f7c07d2..7339ff56b 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillDetailClient.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillDetailClient.java @@ -42,11 +42,21 @@ public class WarehouseWaybillDetailClient implements IWarehouseWaybillDetailClie @Override public void updateEntityById(WarehouseWayBillDetail warehouseWayBillDetail) { - warehouseWayBillDetailService.update(warehouseWayBillDetail); + warehouseWayBillDetailService.updateById(warehouseWayBillDetail); } @Override public void addEntity(WarehouseWayBillDetail warehouseWayBillDetail) { warehouseWayBillDetailService.save(warehouseWayBillDetail); } + + @Override + public List findByWaybillIds(List waybillIds) { + return warehouseWayBillDetailService.findByWaybillIds(waybillIds); + } + + @Override + public void deleteByWaybillNo(String waybillNo) { + warehouseWayBillDetailService.deleteByWaybillNo(waybillNo); + } } diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillReceivedRecordClient.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillReceivedRecordClient.java index 05c4d9f4b..3e37c4566 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillReceivedRecordClient.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/feign/WarehouseWaybillReceivedRecordClient.java @@ -31,7 +31,7 @@ import java.util.List; * @author zhy * @since 2023-07-28 */ -@NonDS +//@NonDS @ApiIgnore @RestController @AllArgsConstructor diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/interceptor/ParameterCombinationInterceptor.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/interceptor/ParameterCombinationInterceptor.java new file mode 100644 index 000000000..2ff220994 --- /dev/null +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/interceptor/ParameterCombinationInterceptor.java @@ -0,0 +1,105 @@ +package com.logpm.warehouse.interceptor; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.TypeFactory; +import org.apache.commons.codec.digest.DigestUtils; +import org.springblade.common.annotations.RepeatSubmit; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Map; + +@Component +public class ParameterCombinationInterceptor implements HandlerInterceptor { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + private static final ThreadLocal PROCESSED_REQUEST_HASH = new ThreadLocal<>(); + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (handler instanceof HandlerMethod) { + HandlerMethod hm = (HandlerMethod) handler; + RepeatSubmit annotation = hm.getMethodAnnotation(RepeatSubmit.class); + if (annotation != null) { + // 读取请求体并解析为Map + Map requestBodyMap = parseRequestBody(request); + requestBodyMap.remove("version"); + // 构建请求唯一标识,这里使用请求URI+参数MD5作为示例 + String requestKey = getRequestKey(request, requestBodyMap); + // 检查是否已处理过相同参数组合的请求 + if (PROCESSED_REQUEST_HASH.get() != null && PROCESSED_REQUEST_HASH.get().equals(requestKey)) { + // 阻止重复提交 + response.sendError(HttpServletResponse.SC_CONFLICT, "Duplicate submit detected"); + return false; + } + // 保存当前请求的哈希值 + PROCESSED_REQUEST_HASH.set(requestKey); + } + } + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + // 清理当前请求的哈希值 + PROCESSED_REQUEST_HASH.remove(); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + // 可选清理操作,postHandle中已处理 + } + + + // ...其他方法保持不变 + + /** + * 解析请求体为Map对象 + * @param request 请求对象 + * @return 请求体内容的Map对象 + * @throws IOException 如果解析失败 + */ + private Map parseRequestBody(HttpServletRequest request) throws IOException { + BufferedReader reader = request.getReader(); + String line; + StringBuilder requestBodyBuilder = new StringBuilder(); + while ((line = reader.readLine()) != null) { + requestBodyBuilder.append(line); + } + return objectMapper.readValue(requestBodyBuilder.toString(), TypeFactory.defaultInstance().constructMapType(Map.class, String.class, Object.class)); + } + + /** + * 构建请求的唯一标识 + * @param request 请求对象 + * @param requestBodyMap 请求体内容的Map对象 + * @return 唯一标识字符串 + */ + private String getRequestKey(HttpServletRequest request, Map requestBodyMap) throws JsonProcessingException { + StringBuilder sb = new StringBuilder(request.getRequestURI()); + String queryString = request.getQueryString(); + if (queryString != null) { + sb.append('?').append(queryString); + } + // 将请求体的Map转换为JSON字符串,然后计算MD5 + String requestBodyJson = objectMapper.writeValueAsString(requestBodyMap); + byte[] uriAndQueryBytes = sb.toString().getBytes(StandardCharsets.UTF_8); + byte[] requestBodyJsonBytes = requestBodyJson.getBytes(StandardCharsets.UTF_8); + + // 合并两个字节数组 + byte[] combinedBytes = new byte[uriAndQueryBytes.length + requestBodyJsonBytes.length]; + System.arraycopy(uriAndQueryBytes, 0, combinedBytes, 0, uriAndQueryBytes.length); + System.arraycopy(requestBodyJsonBytes, 0, combinedBytes, uriAndQueryBytes.length, requestBodyJsonBytes.length); + + return DigestUtils.md5Hex(combinedBytes); + } +} diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/mapper/TaskQuestMapper.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/mapper/TaskQuestMapper.java index 6ab100702..b860c9ac5 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/mapper/TaskQuestMapper.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/mapper/TaskQuestMapper.java @@ -189,9 +189,9 @@ public interface TaskQuestMapper extends BaseMapper { List findStockList(@Param("param") TaskSearchDTO taskSearchDTO); - List selectContrastStockInfo(@Param("questNum") String questNum); + List selectContrastStockInfo(@Param("questNum") String questNum,@Param("questStatus")Integer questStatus); - QuestDetailEntity findEntityById(@Param("questNum") String questNum,@Param("taskID") Long taskID); + QuestDetailEntity findEntityById(@Param("questNum") String questNum,@Param("taskID") Long taskId); IPage findContrastList(IPage page, @Param("param") QuestDetailDTO questDetailDTO); diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/mapper/TaskQuestMapper.xml b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/mapper/TaskQuestMapper.xml index c38c81a72..3ab2f39d1 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/mapper/TaskQuestMapper.xml +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/mapper/TaskQuestMapper.xml @@ -110,6 +110,7 @@ `grounding_allocation_id` bigint(20) NULL DEFAULT NULL COMMENT '上架后的库位ID', `new_tray_id` bigint(20) NULL DEFAULT NULL COMMENT '新托盘ID', `new_tray_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '新托盘编码', + `new_tray_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '新托盘名称', `is_new` int(20) NULL DEFAULT 0 COMMENT '是否是新增数据', `is_change` int(4) NULL DEFAULT 0 COMMENT '是否有变更 0未变更 1有变更', `is_change_at` int(4) NULL DEFAULT 0 COMMENT '是否有变更库位托盘 0未变更 1有变更', @@ -301,6 +302,7 @@ update ${questNum} set quest_status = #{param.questStatus} WHERE `id` = #{ param.id } + update ${questNum} @@ -325,6 +327,7 @@ is_change = #{item.isChange }, new_tray_id = #{item.newTrayId }, new_tray_code = #{item.newTrayCode }, + new_tray_name = #{item.newTrayName }, is_change_at = #{item.isChangeAt }, logpm-factory-data logpm-data-sharing + + logpm-business @@ -63,10 +65,10 @@ blade-starter-metrics - - - - + + org.springblade + blade-starter-transaction + org.springblade blade-starter-tenant @@ -95,7 +97,10 @@ blade-scope-api ${bladex.project.version} - + + org.springframework + spring-test +