From 5e1bbc39053b6e43282fcffe7fba0e88a29a7acc Mon Sep 17 00:00:00 2001 From: Gjm <你的邮箱> Date: Fri, 15 May 2026 16:59:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(core):=20=E6=B7=BB=E5=8A=A0=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E7=94=B3=E8=AF=B7=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=92=8C=E4=BA=8C=E7=BB=B4=E7=A0=81=E7=94=9F=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 OutboundApplicationJob 定时任务处理出货单据二维码生成 - 添加 ScmgiplanEntity 和 ScmGiPlanItemEntity 实体类定义 - 创建 ScmgiplanQrEntity 和 ScmgiPlanSyncLogEntity 二维码相关实体 - 实现 ScmgiPlanService 服务接口及 ScmgiPlanServiceImpl 实现类 - 添加 ScmgiPlanItemMapper、ScmgiPlanMapper、ScmgiPlanQrMapper 等数据访问层 - 集成二维码生成工具类 QrCodeUtil 支持数据压缩功能 - 创建 QrOutboundApplicationController 提供出库申请相关接口 - 修改数据库配置将 schema 从 ERPCS 和 ERP 统一为 GSSERVER --- .../src/main/resources/application-local.yaml | 4 +- .../config/job/OutboundApplicationJob.java | 107 +++++ .../entity/ScmgiPlanSyncLogEntity.java | 45 ++ .../entity/erp/ScmGiPlanItemEntity.java | 448 ++++++++++++++++++ .../framework/entity/erp/ScmgiplanEntity.java | 340 +++++++++++++ .../entity/erp/ScmgiplanQrEntity.java | 23 + .../mapper/erp/ScmgiPlanItemMapper.java | 12 + .../framework/mapper/erp/ScmgiPlanMapper.java | 12 + .../mapper/erp/ScmgiPlanQrMapper.java | 12 + .../mapper/erp/ScmgiPlanSyncLogMapper.java | 12 + .../service/erp/ScmgiPlanService.java | 11 + .../erp/impl/ScmgiPlanServiceImpl.java | 151 ++++++ .../core/framework/utils/QrCodeUtil.java | 60 ++- .../QrOutboundApplicationController.java | 95 ++++ .../mapper/QrOutboundApplicationMapper.java | 11 + .../service/QrOutboundApplicationService.java | 16 + .../QrQrOutboundApplicationServiceImpl.java | 157 ++++++ 17 files changed, 1500 insertions(+), 16 deletions(-) create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/config/job/OutboundApplicationJob.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/entity/ScmgiPlanSyncLogEntity.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmGiPlanItemEntity.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmgiplanEntity.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmgiplanQrEntity.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanItemMapper.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanMapper.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanQrMapper.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanSyncLogMapper.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/service/erp/ScmgiPlanService.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/service/erp/impl/ScmgiPlanServiceImpl.java create mode 100644 lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/controller/QrOutboundApplicationController.java create mode 100644 lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/mapper/QrOutboundApplicationMapper.java create mode 100644 lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/service/QrOutboundApplicationService.java create mode 100644 lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/service/impl/QrQrOutboundApplicationServiceImpl.java diff --git a/lidee-admin/src/main/resources/application-local.yaml b/lidee-admin/src/main/resources/application-local.yaml index c7f81b8..4f1f420 100644 --- a/lidee-admin/src/main/resources/application-local.yaml +++ b/lidee-admin/src/main/resources/application-local.yaml @@ -10,7 +10,7 @@ spring: master: # 达梦数据库 主库,业务库 driver-class-name: dm.jdbc.driver.DmDriver - url: jdbc:dm://127.0.0.1:5236?schema=ERPCS&compatible_mode=mysql + url: jdbc:dm://127.0.0.1:5236?schema=GSSERVER&compatible_mode=mysql username: sysdba password: Gao1048783178 lideeyunji: # 从库,框架库 @@ -26,7 +26,7 @@ spring: password: Gao1048783178 erp_dev: # erp driver-class-name: dm.jdbc.driver.DmDriver - url: jdbc:dm://127.0.0.1:5236?schema=ERP&compatible_mode=mysql + url: jdbc:dm://127.0.0.1:5236?schema=GSSERVER&compatible_mode=mysql username: sysdba password: Gao1048783178 sjzt: # 数据中台 diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/config/job/OutboundApplicationJob.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/config/job/OutboundApplicationJob.java new file mode 100644 index 0000000..8fdf827 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/config/job/OutboundApplicationJob.java @@ -0,0 +1,107 @@ +package com.lideeyunji.core.framework.config.job; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.lideeyunji.core.framework.entity.ErpDtaSyncLogEntity; +import com.lideeyunji.core.framework.entity.ScmgiPlanSyncLogEntity; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanEntity; +import com.lideeyunji.core.framework.mapper.erp.ScmgiPlanSyncLogMapper; +import com.lideeyunji.core.framework.service.erp.ScmgiPlanService; +import com.lideeyunji.tool.framework.quartz.core.handler.JobHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Calendar; +import java.util.Date; +import java.util.UUID; + +@Component("OutboundApplicationJob") +@Slf4j +public class OutboundApplicationJob implements JobHandler { + + @Resource + private ScmgiPlanService scmgiPlanService; + + @Resource + private ScmgiPlanSyncLogMapper logMapper; + + private static final int SYNC_LOG_TYPE_IN = 1; + private static final int SYNC_LOG_TYPE_OUT = 2; + + @Override + public String execute(String param) throws Exception { + long startTime = System.currentTimeMillis(); + + try { + syncDcToErp(); + + long costTime = System.currentTimeMillis() - startTime; + String result = String.format("========== 二维码完成,总耗时: %dms ==========", costTime); + log.info(result); + return result; + } catch (Exception e) { + log.error("ERP二维码完成任务执行失败", e); + throw e; + } + } + + private void syncDcToErp() { + log.info("*********** 开始erp出货单据生成二维码定时任务 ************"); + long startTime = System.currentTimeMillis(); + + Date lastSyncTime = getLastSyncTime(SYNC_LOG_TYPE_OUT); + ScmgiplanEntity scmgiplanEntity = new ScmgiplanEntity(); + scmgiplanEntity.setPlanStatus("2"); + if (lastSyncTime != null) + scmgiplanEntity.setTimestampLastchangedon(lastSyncTime); + scmgiPlanService.selectList(scmgiplanEntity); + updateSyncLog(SYNC_LOG_TYPE_OUT); + + long costTime = System.currentTimeMillis() - startTime; + } + + /** + * 更新同步日志 + */ + private void updateSyncLog(int type) { + Date now = new Date(); + ScmgiPlanSyncLogEntity latestLog = logMapper.selectOne( + new LambdaQueryWrapper() + .eq(ScmgiPlanSyncLogEntity::getType, type) + ); + + if (latestLog != null) { + logMapper.update(null, + new LambdaUpdateWrapper() + .eq(ScmgiPlanSyncLogEntity::getId, latestLog.getId()) + .set(ScmgiPlanSyncLogEntity::getLastUpdateTime, now) + ); + log.debug("更新同步日志,类型:{}, ID:{}, 时间:{}", type, latestLog.getId(), now); + } else { + ScmgiPlanSyncLogEntity newLog = new ScmgiPlanSyncLogEntity(); + newLog.setId(UUID.randomUUID().toString()); + newLog.setType(type); + newLog.setLastUpdateTime(now); + logMapper.insert(newLog); + log.debug("创建新同步日志,类型:{}, ID:{}, 时间:{}", type, newLog.getId(), now); + } + } + + /** + * 获取最后同步时间 + */ + private Date getLastSyncTime(int type) { + ScmgiPlanSyncLogEntity latestLog = logMapper.selectOne( + new LambdaQueryWrapper() + .eq(ScmgiPlanSyncLogEntity::getType, type) + ); + if (latestLog != null && latestLog.getLastUpdateTime() != null) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(latestLog.getLastUpdateTime()); + calendar.add(Calendar.MINUTE, -10); + return calendar.getTime(); + } + return null; + } +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/ScmgiPlanSyncLogEntity.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/ScmgiPlanSyncLogEntity.java new file mode 100644 index 0000000..4e77ef6 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/ScmgiPlanSyncLogEntity.java @@ -0,0 +1,45 @@ +package com.lideeyunji.core.framework.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * erp数据同步中间表 ERP_BFMEASUREUNIT_TABLE + * + * @author 雷神 + * @date 2026-04-10 + */ +@TableName("SCMGIPLANSYNCLOG") +@Data +public class ScmgiPlanSyncLogEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** ID */ + @TableId(value = "ID", type = IdType.INPUT) + private String id; + + /** 创建时间 */ + @TableField(value = "CREATE_TIME") + private Date createTime; + + + /** 最后修改时间 */ + @TableField(value = "LAST_UPDATE_TIME") + private Date lastUpdateTime; + + + + /** 更改类型(1 erp,2数据中心) */ + @TableField(value = "SYNCTYPE") + private Integer type; + + /** 报文 */ + @TableField(value = "MESSAGE") + private String message; +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmGiPlanItemEntity.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmGiPlanItemEntity.java new file mode 100644 index 0000000..ddb9aec --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmGiPlanItemEntity.java @@ -0,0 +1,448 @@ +package com.lideeyunji.core.framework.entity.erp; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@TableName("SCMGIPLANITEM") +public class ScmGiPlanItemEntity { + + @TableId("ID") + private String id; + + @TableField("ASSETID") + private String assetId; + + @TableField("ASSETNAME") + private String assetName; + + @TableField("BATCHCODE") + private String batchCode; + + @TableField("BATCHID") + private String batchId; + + @TableField("BEGINSN") + private String beginSn; + + @TableField("BINID") + private String binId; + + @TableField("BINNAME") + private String binName; + + @TableField("CONTRACTCODE") + private String contractCode; + + @TableField("CONTRACTID") + private String contractId; + + @TableField("CONVRATIO") + private String convRatio; + + @TableField("CONVRULE") + private String convRule; + + @TableField("CUSTOMER") + private String customer; + + @TableField("CUSTOMERID") + private String customerId; + + @TableField("DEPTID") + private String deptId; + + @TableField("DEPTNAME") + private String deptName; + + @TableField("EXCONTENT") + private String exContent; + + @TableField("EXCONTENTID") + private String exContentId; + + @TableField("FORDATE") + private LocalDateTime forDate; + + @TableField("FROMID") + private String fromId; + + @TableField("FROMITEMCODE") + private String fromItemCode; + + @TableField("FROMITEMID") + private String fromItemId; + + @TableField("FROMNOTE") + private String fromNote; + + @TableField("FROMTYPE") + private String fromType; + + @TableField("GIQTY") + private BigDecimal giQty; + + @TableField("ISFINISH") + private String isFinish; + + @TableField("ITEMCODE") + private String itemCode; + + @TableField("MATERIALCODE") + private String materialCode; + + @TableField("MATERIALID") + private String materialId; + + @TableField("MATERIALVERSION") + private String materialVersion; + + @TableField("MEXCONTENT") + private String mExContent; + + @TableField("MEXCONTENTID") + private String mExContentId; + + @TableField("MFEATURE") + private String mFeature; + + @TableField("MFEATUREID") + private String mFeatureId; + + @TableField("MMODEL") + private String mModel; + + @TableField("MNAME") + private String mName; + + @TableField("MNOTE") + private String mNote; + + @TableField("MSPECS") + private String mSpecs; + + @TableField("ORICODE") + private String oriCode; + + @TableField("ORIID") + private String oriId; + + @TableField("ORIITEMID") + private String oriItemId; + + @TableField("ORINOTE") + private String oriNote; + + @TableField("ORITYPE") + private String oriType; + + @TableField("OWNERCUST") + private String ownerCust; + + @TableField("OWNERCUSTID") + private String ownerCustId; + + @TableField("PILECODE") + private String pileCode; + + @TableField("PLANID") + private String planId; + + @TableField("PLANQTY") + private BigDecimal planQty; + + @TableField("PLANQTY1") + private BigDecimal planQty1; + + @TableField("PROJECT") + private String project; + + @TableField("PROJECTID") + private String projectId; + + @TableField("QUALITYLEVEL") + private String qualityLevel; + + @TableField("REMARKS") + private String remarks; + + @TableField("SALESORDERCODE") + private String salesOrderCode; + + @TableField("SALESORDERID") + private String salesOrderId; + + @TableField("STOCKSTATE") + private String stockState; + + @TableField("STOCKSTATEID") + private String stockStateId; + + @TableField("STOCKTYPEID") + private String stockTypeId; + + @TableField("SUBVENDER") + private String subVender; + + @TableField("SUBVENDERID") + private String subVenderId; + + @TableField("UOMID") + private String uomId; + + @TableField("UOM") + private String uom; + + @TableField("UOMPRECISION") + private String uomPrecision; + + @TableField("UOM1ID") + private String uom1Id; + + @TableField("UOM1") + private String uom1; + + @TableField("UOM1PRECISION") + private String uom1Precision; + + @TableField("VENDERID") + private String venderId; + + @TableField("VENDOR") + private String vendor; + + @TableField("WAREHOUSE") + private String warehouse; + + @TableField("WAREHOUSEID") + private String warehouseId; + + @TableField("WBSID") + private String wbsId; + + @TableField("WBSNAME") + private String wbsName; + + @TableField("ACCOUNTTYPEID") + private String accountTypeId; + + @TableField("FIORGID") + private String fiOrgId; + + @TableField("QUALITYLEVELGROUP") + private String qualityLevelGroup; + + @TableField("QUALITYLEVELNAME") + private String qualityLevelName; + + @TableField("BLUESOCODE") + private String blueSoCode; + + @TableField("BLUESOID") + private String blueSoId; + + @TableField("BLUESOITEMCODE") + private String blueSoItemCode; + + @TableField("BLUESOITEMID") + private String blueSoItemId; + + @TableField("NEEDQUALITY") + private String needQuality; + + @TableField("CONTAINFO") + private String contAinfo; + + @TableField("DELIVERYCARNUM") + private String deliveryCarNum; + + @TableField("DELIVERYMAN") + private String deliveryMan; + + @TableField("DELIVERYMANID") + private String deliveryManId; + + @TableField("DELIVERYPLACE") + private String deliveryPlace; + + @TableField("DELIVERYTEL") + private String deliveryTel; + + @TableField("DELIVERYTIME") + private LocalDateTime deliveryTime; + + @TableField("MTYPE") + private String mType; + + @TableField("MTYPEID") + private String mTypeId; + + @TableField("TARGETQTY") + private BigDecimal targetQty; + + @TableField("SECTIONCODE") + private String sectionCode; + + @TableField("ISTRAN") + private String isTran; + + @TableField("TRANFLAG") + private String tranFlag; + + @TableField("TRANQTY") + private BigDecimal tranQty; + + @TableField("SETTLEBASIS") + private String settleBasis; + + @TableField("SETTLEFLAG") + private String settleFlag; + + @TableField("SETTLEQTY") + private BigDecimal settleQty; + + @TableField("SETTLEVALUE") + private BigDecimal settleValue; + + @TableField("COMPQTY") + private String compQty; + + @TableField("COMPUNIT") + private String compUnit; + + @TableField("MDRAWNO") + private String mDrawNo; + + @TableField("SNMGR") + private String snMgr; + + @TableField("BATCHMGR") + private String batchMgr; + + @TableField("BASECONVRATIO") + private String baseConvRatio; + + @TableField("BASECONVRULE") + private String baseConvRule; + + @TableField("BASEGIQTY") + private BigDecimal baseGiQty; + + @TableField("BASEINVQTY") + private BigDecimal baseInvQty; + + @TableField("BASEPRECISION") + private Integer basePrecision; + + @TableField("BASEPRICONVRATIO") + private String basePriConvRatio; + + @TableField("BASEQTY") + private BigDecimal baseQty; + + @TableField("BASESECCONVRATIO") + private String baseSecConvRatio; + + @TableField("BASESECPRECISION") + private Integer baseSecPrecision; + + @TableField("BASESECQTY") + private BigDecimal baseSecQty; + + @TableField("BASESECUNIT") + private String baseSecUnit; + + @TableField("BASESECUNITID") + private String baseSecUnitId; + + @TableField("BASESETTLEQTY") + private BigDecimal baseSettleQty; + + @TableField("BASETARGETQTY") + private BigDecimal baseTargetQty; + + @TableField("BASETRANQTY") + private BigDecimal baseTranQty; + + @TableField("BASEUNIT") + private String baseUnit; + + @TableField("BASEUNITID") + private String baseUnitId; + + @TableField("BASEOVERSUMQTY") + private BigDecimal baseOverSumQty; + + @TableField("MATSPRINGCODE") + private String matSpringCode; + + @TableField("MATSPRINGID") + private String matSpringId; + + @TableField("OVERQTY") + private BigDecimal overQty; + + @TableField("OVERRATE") + private BigDecimal overRate; + + @TableField("OVERSUMQTY") + private BigDecimal overSumQty; + + @TableField("NEEDQC") + private String needQc; + + @TableField("QUALIFIEDQTY") + private BigDecimal qualifiedQty; + + @TableField("QUALITYSTATE") + private String qualityState; + + @TableField("UNQUALIFIEDQTY") + private BigDecimal unQualifiedQty; + + @TableField("EXT_1_LV9") + private String ext1Lv9; + + @TableField("EXT_2_LV9") + private String ext2Lv9; + + @TableField("EXT_3_LV9") + private String ext3Lv9; + + @TableField("EXT_4_LV9") + private String ext4Lv9; + + @TableField("EXT_5_LV9") + private String ext5Lv9; + + @TableField("EXT_6_LV9") + private String ext6Lv9; + + @TableField("EXT_7_LV9") + private String ext7Lv9; + + @TableField("EXT_8_LV9") + private String ext8Lv9; + + @TableField("EXT_9_LV9") + private String ext9Lv9; + + @TableField("EXT_10_LV9") + private String ext10Lv9; + + @TableField("EXT_11_LV9") + private String ext11Lv9; + + @TableField("EXT_12_LV9") + private String ext12Lv9; + + @TableField("EXT_13_LV9") + private String ext13Lv9; + + @TableField("EXT_14_LV9") + private String ext14Lv9; +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmgiplanEntity.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmgiplanEntity.java new file mode 100644 index 0000000..05296bc --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmgiplanEntity.java @@ -0,0 +1,340 @@ +package com.lideeyunji.core.framework.entity.erp; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +@TableName("SCMGIPLAN") +public class ScmgiplanEntity { + + @TableId("ID") + private String id; + + @TableField("BFORGID") + private String bforgid; + + @TableField("CONFIRMTIME") + private Date confirmTime; + + @TableField("CONFIRMUSER") + private String confirmUser; + + @TableField("CONFIRMUSERID") + private String confirmUserId; + + @TableField("CREATORID") + private String creatorId; + + @TableField("DEPTI") + private String depti; + + @TableField("DEPTID") + private String deptId; + + @TableField("EMP") + private String emp; + + @TableField("EMPID") + private String empId; + + @TableField("ENDTIME") + private Date endTime; + + @TableField("EXCONTENT") + private String exContent; + + @TableField("EXCONTENTID") + private String exContentId; + + @TableField("FLOWID") + private String flowId; + + @TableField("FORCUSTOMER") + private String forCustomer; + + @TableField("FORCUSTOMERID") + private String forCustomerId; + + @TableField("FORDATE") + private Date forDate; + + @TableField("FORDEPT") + private String forDept; + + @TableField("FORDEPTID") + private String forDeptId; + + @TableField("FOREMP") + private String forEmp; + + @TableField("FOREMPID") + private String forEmpId; + + @TableField("FORPROJECT") + private String forProject; + + @TableField("FORPROJECTID") + private String forProjectId; + + @TableField("FROMCODE") + private String fromCode; + + @TableField("FROMID") + private String fromId; + + @TableField("FROMTYPE") + private String fromType; + + @TableField("GIPRIORITY") + private String giPriority; + + @TableField("GITYPE") + private String giType; + + @TableField("GIWAREHOUSE") + private String giWarehouse; + + @TableField("GIWAREHOUSEID") + private String giWarehouseId; + + @TableField("IMORGID") + private String imOrgId; + + @TableField("ISRED") + private String isRed; + + @TableField("ISSTOP") + private String isStop; + + @TableField("ITEMCNTS") + private Integer itemCnts; + + @TableField("LASTUSERID") + private String lastUserId; + + @TableField("PLANCODE") + private String planCode; + + @TableField("PLANDATE") + private Date planDate; + + @TableField("PLANSTATUS") + private String planStatus; + + @TableField("REMARKS") + private String remarks; + + @TableField("SECLEVEL") + private Integer secLevel; + + @TableField("SECLEVELID") + private String secLevelId; + + @TableField("SECLEVELNAME") + private String secLevelName; + + @TableField("STOPTIME") + private Date stopTime; + + @TableField("STOPUSER") + private String stopUser; + + @TableField("STOPUSERID") + private String stopUserId; + + @TableField("TIMESTAMP_CREATEDBY") + private String timestampCreatedby; + + @TableField("TIMESTAMP_CREATEDON") + private Date timestampCreatedon; + + @TableField("TIMESTAMP_LASTCHANGEDBY") + private String timestampLastchangedby; + + @TableField("TIMESTAMP_LASTCHANGEDON") + private Date timestampLastchangedon; + + @TableField("TYPEID") + private String typeId; + + @TableField("TYPENAME") + private String typeName; + + @TableField("FIORGID") + private String fiOrgId; + + @TableField("BLUESOCODE") + private String blueSoCode; + + @TableField("BLUESOID") + private String blueSoId; + + @TableField("PICKPURPOSE") + private String pickPurpose; + + @TableField("PICKPURPOSEID") + private String pickPurposeId; + + @TableField("BILLTO") + private String billTo; + + @TableField("BILLTOID") + private String billToId; + + @TableField("PAYER") + private String payer; + + @TableField("PAYERID") + private String payerId; + + @TableField("SHIPTO") + private String shipTo; + + @TableField("SHIPTOID") + private String shipToId; + + @TableField("SOTEAMCODE") + private String soTeamCode; + + @TableField("SOTEAMID") + private String soTeamId; + + @TableField("SOTEAMNAME") + private String soTeamName; + + @TableField("VERSION") + private Date version; + + @TableField("CREDITFROZEN") + private String creditFrozen; + + @TableField("SALESCHANNEL") + private String salesChannel; + + @TableField("SALESCHANNELCODE") + private String salesChannelCode; + + @TableField("SALESCHANNELID") + private String salesChannelId; + + @TableField("ACCEPTEMP") + private String acceptEmp; + + @TableField("ACCEPTTEL") + private String acceptTel; + + @TableField("DELIVERYTYPE") + private String deliveryType; + + @TableField("HANDOVERPLACE") + private String handOverPlace; + + @TableField("EXT_1_LV9") + private String ext1Lv9; + + @TableField("EXT_2_LV9") + private String ext2Lv9; + + @TableField("EXT_3_LV9") + private String ext3Lv9; + + @TableField("CONTAINFO") + private String contAinfo; + + @TableField("PBATCHCODE") + private String pBatchCode; + + @TableField("PCODE") + private String pCode; + + @TableField("PEXCONTENT") + private String pExContent; + + @TableField("PEXCONTENTID") + private String pExContentId; + + @TableField("PFEATURE") + private String pFeature; + + @TableField("PFEATUREID") + private String pFeatureId; + + @TableField("PMODEL") + private String pModel; + + @TableField("PNAME") + private String pName; + + @TableField("PNOTE") + private String pNote; + + @TableField("PRODUCTID") + private String productId; + + @TableField("PSPECS") + private String pSpecs; + + @TableField("PVERSION") + private String pVersion; + + @TableField("SECTIONCODE") + private String sectionCode; + + @TableField("FROMNOTE") + private String fromNote; + + @TableField("ATTACHMENTCNT") + private Integer attachmentCnt; + + @TableField("FORWBS") + private String forWbs; + + @TableField("FORWBSID") + private String forWbsId; + + @TableField("ORINOTE") + private String oriNote; + + @TableField("CUSTOMERADDRESS") + private String customerAddress; + + @TableField("CUSTOMERLINKMAN") + private String customerLinkman; + + @TableField("CUSTOMERTEL") + private String customerTel; + + @TableField("ISTRAN") + private String isTran; + + @TableField("TRANFLAG") + private String tranFlag; + + @TableField("SETTLEFLAG") + private String settleFlag; + + @TableField("TRANWAY") + private String tranWay; + + @TableField("TRANWAYNAME") + private String tranWayName; + + @TableField("EXT_4_LV9") + private String ext4Lv9; + + @TableField("PDRAWNO") + private String pDrawNo; + + @TableField("PRINTCNT") + private Integer printCnt; + + @TableField("EXT_5_LV9") + private String ext5Lv9; + @TableField(exist = false) + List scmGiPlanItemEntities; +} \ No newline at end of file diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmgiplanQrEntity.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmgiplanQrEntity.java new file mode 100644 index 0000000..745c9e6 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/erp/ScmgiplanQrEntity.java @@ -0,0 +1,23 @@ +package com.lideeyunji.core.framework.entity.erp; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("SCMGIPLANQR") +public class ScmgiplanQrEntity { + @TableId("ID") + private String id; + @TableField("PLANID") + private String planId; + @TableField("QRCODE") + private String qrCode; + @TableField("PLANCODE") + private String planCode; + @TableField("PLANSTATUS") + private String planStatus; +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanItemMapper.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanItemMapper.java new file mode 100644 index 0000000..a311532 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanItemMapper.java @@ -0,0 +1,12 @@ +package com.lideeyunji.core.framework.mapper.erp; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lideeyunji.core.framework.entity.erp.ScmGiPlanItemEntity; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +@DS("erp_dev") +public interface ScmgiPlanItemMapper extends BaseMapper { +} \ No newline at end of file diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanMapper.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanMapper.java new file mode 100644 index 0000000..8ab99d6 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanMapper.java @@ -0,0 +1,12 @@ +package com.lideeyunji.core.framework.mapper.erp; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lideeyunji.core.framework.entity.ErpScmWarehouse; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +@DS("erp_dev") +public interface ScmgiPlanMapper extends BaseMapper { +} \ No newline at end of file diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanQrMapper.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanQrMapper.java new file mode 100644 index 0000000..51187d5 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanQrMapper.java @@ -0,0 +1,12 @@ +package com.lideeyunji.core.framework.mapper.erp; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanEntity; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanQrEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +@DS("erp_dev") +public interface ScmgiPlanQrMapper extends BaseMapper { +} \ No newline at end of file diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanSyncLogMapper.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanSyncLogMapper.java new file mode 100644 index 0000000..9c7f392 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/erp/ScmgiPlanSyncLogMapper.java @@ -0,0 +1,12 @@ +package com.lideeyunji.core.framework.mapper.erp; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lideeyunji.core.framework.entity.ScmgiPlanSyncLogEntity; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +@DS("erp_dev") +public interface ScmgiPlanSyncLogMapper extends BaseMapper { +} \ No newline at end of file diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/service/erp/ScmgiPlanService.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/service/erp/ScmgiPlanService.java new file mode 100644 index 0000000..a9686f9 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/service/erp/ScmgiPlanService.java @@ -0,0 +1,11 @@ +package com.lideeyunji.core.framework.service.erp; + +import com.lideeyunji.core.framework.entity.erp.ScmgiplanEntity; + +import java.util.List; + +public interface ScmgiPlanService { + List selectList(ScmgiplanEntity scmgiplanEntity); + + List selectPlanForQr(List< String> idList); +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/service/erp/impl/ScmgiPlanServiceImpl.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/service/erp/impl/ScmgiPlanServiceImpl.java new file mode 100644 index 0000000..69ccec6 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/service/erp/impl/ScmgiPlanServiceImpl.java @@ -0,0 +1,151 @@ +package com.lideeyunji.core.framework.service.erp.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.lideeyunji.core.framework.entity.erp.ScmGiPlanItemEntity; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanEntity; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanQrEntity; +import com.lideeyunji.core.framework.mapper.erp.ScmgiPlanItemMapper; +import com.lideeyunji.core.framework.mapper.erp.ScmgiPlanMapper; +import com.lideeyunji.core.framework.mapper.erp.ScmgiPlanQrMapper; +import com.lideeyunji.core.framework.service.erp.ScmgiPlanService; +import com.lideeyunji.core.framework.utils.QrCodeUtil; +import com.lideeyunji.tool.framework.sql.core.toolkit.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class ScmgiPlanServiceImpl extends ServiceImpl implements ScmgiPlanService { + + @Resource + private QrCodeUtil qrCodeUtil; + @Resource + private ScmgiPlanQrMapper scmgiPlanQrMapper; + @Resource + private ScmgiPlanItemMapper scmgiPlanItemMapper; + + private static final int WIDTH = 350; // 二维码宽 + private static final int HEIGHT = 350; // 二维码高 + private static final String FORMAT = "PNG"; + + @Override + public List selectList(ScmgiplanEntity scmgiplanEntity) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper + .select(ScmgiplanEntity::getId, + ScmgiplanEntity::getPlanCode, + ScmgiplanEntity::getPlanStatus, + ScmgiplanEntity::getFromType, +// ScmgiplanEntity::getPlanDate, +// ScmgiplanEntity::getFromCode, + ScmgiplanEntity::getRemarks, + ScmgiplanEntity::getTimestampCreatedon, + ScmgiplanEntity::getTimestampCreatedby, + ScmgiplanEntity::getTimestampLastchangedon, + ScmgiplanEntity::getTimestampLastchangedby) + .eq(ScmgiplanEntity::getPlanStatus, scmgiplanEntity.getPlanStatus()) + .eq(ScmgiplanEntity::getIsStop, "0") + ; + + if (scmgiplanEntity.getTimestampLastchangedon() != null) { + queryWrapper.ge(ScmgiplanEntity::getTimestampLastchangedon, scmgiplanEntity.getTimestampLastchangedon()); + } + + List scmgiplanEntities = baseMapper.selectList(queryWrapper); + if (CollectionUtils.isEmpty(scmgiplanEntities)) { + return Collections.emptyList(); + } + + Set planIds = scmgiplanEntities.stream() + .map(ScmgiplanEntity::getId) + .collect(Collectors.toSet()); + + List itemEntities = scmgiPlanItemMapper.selectList( + new LambdaQueryWrapper() + .select(ScmGiPlanItemEntity::getId, ScmGiPlanItemEntity::getPlanId, + ScmGiPlanItemEntity::getItemCode,ScmGiPlanItemEntity::getWarehouseId, + ScmGiPlanItemEntity::getMaterialCode,ScmGiPlanItemEntity::getBatchCode, + ScmGiPlanItemEntity::getMaterialCode,ScmGiPlanItemEntity::getSalesOrderCode, + ScmGiPlanItemEntity::getGiQty,ScmGiPlanItemEntity::getTargetQty + ) + .in(ScmGiPlanItemEntity::getPlanId, planIds) + ); + + Map> itemMap = CollectionUtils.isNotEmpty(itemEntities) + ? itemEntities.stream().collect(Collectors.groupingBy(ScmGiPlanItemEntity::getPlanId)) + : Collections.emptyMap(); + + scmgiplanEntities.forEach(entity -> + entity.setScmGiPlanItemEntities(itemMap.getOrDefault(entity.getId(), Collections.emptyList())) + ); + + // 生成二维码 + scmgiplanEntities.forEach(entity -> { + try { + saveQrToJson(entity); + log.debug("二维码JSON已保存,planId: {}", entity.getId()); + } catch (Exception e) { + log.error("保存二维码JSON失败,跳过当前记录,planId: {}", entity.getId(), e); + } + }); + + return scmgiplanEntities; + } + + + + public void saveQrToJson(ScmgiplanEntity entity) { + // 这里会排除null + String jsonString = JSON.toJSONString(entity); + + ScmgiplanQrEntity existQr = scmgiPlanQrMapper.selectOne( + new LambdaQueryWrapper() + .eq(ScmgiplanQrEntity::getPlanId, entity.getId()) + ); + + if (existQr == null) { + ScmgiplanQrEntity newQr = new ScmgiplanQrEntity(); + newQr.setId(java.util.UUID.randomUUID().toString()); + newQr.setPlanId(entity.getId()); + newQr.setPlanCode(entity.getPlanCode()); + newQr.setPlanStatus(entity.getPlanStatus()); + newQr.setQrCode(jsonString); + scmgiPlanQrMapper.insert(newQr); + log.info("新增二维码JSON,planId: {}, 长度: {}", entity.getId(), jsonString.length()); + } else { + existQr.setQrCode(jsonString); + existQr.setPlanStatus(entity.getPlanStatus()); + scmgiPlanQrMapper.updateById(existQr); + log.info("更新二维码JSON,planId: {}, 长度: {}", entity.getId(), jsonString.length()); + } + } + + @Override + public List selectPlanForQr(List idList) { + if (CollectionUtils.isEmpty(idList)) { + return Collections.emptyList(); + } + + List scmgiplanEntities = baseMapper.selectList(new LambdaQueryWrapper() + .eq(ScmgiplanEntity::getPlanStatus, "2") + .in(ScmgiplanEntity::getId, idList) + ); + return scmgiplanEntities; + } + +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/utils/QrCodeUtil.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/utils/QrCodeUtil.java index 3b724b3..5b49659 100644 --- a/lidee-core/src/main/java/com/lideeyunji/core/framework/utils/QrCodeUtil.java +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/utils/QrCodeUtil.java @@ -11,21 +11,22 @@ import java.nio.file.FileSystems; import java.nio.file.Path; import java.util.Base64; import java.io.ByteArrayOutputStream; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + @Component public class QrCodeUtil { - private static final int WIDTH = 350; // 二维码宽 - private static final int HEIGHT = 350; // 二维码高 + private static final int WIDTH = 350; + private static final int HEIGHT = 350; private static final String FORMAT = "PNG"; - /** - * 生成二维码 → 保存到本地 - */ - public static void generateQrToFile(Object data, String filePath) throws Exception { - // 1. 转 JSON(把整个到货单+明细存进去) - String jsonContent = JSON.toJSONString(data); + private static final int QR_MAX_BYTES = 2953; + private static final int SAFE_THRESHOLD = 2500; + + public static void generateQrToFile(Object data, String filePath) throws Exception { + String jsonContent = compressIfNeed(JSON.toJSONString(data)); - // 2. 生成二维码 QRCodeWriter writer = new QRCodeWriter(); BitMatrix matrix = writer.encode( jsonContent, @@ -33,16 +34,12 @@ public class QrCodeUtil { WIDTH, HEIGHT ); - // 3. 保存图片 Path path = FileSystems.getDefault().getPath(filePath); MatrixToImageWriter.writeToPath(matrix, FORMAT, path); } - /** - * 生成二维码 → 返回 Base64(前端直接用) - */ public static String generateQrToBase64(Object data) throws Exception { - String jsonContent = JSON.toJSONString(data); + String jsonContent = compressIfNeed(JSON.toJSONString(data)); QRCodeWriter writer = new QRCodeWriter(); BitMatrix matrix = writer.encode(jsonContent, BarcodeFormat.QR_CODE, WIDTH, HEIGHT); @@ -52,4 +49,39 @@ public class QrCodeUtil { return Base64.getEncoder().encodeToString(outputStream.toByteArray()); } + + public static String generateQrJsonString(Object data) throws Exception { + return compressIfNeed(JSON.toJSONString(data)); + } + + public static String decompressQrJson(String compressedData) throws Exception { + if (compressedData == null || compressedData.isEmpty()) { + return compressedData; + } + + byte[] compressed = Base64.getDecoder().decode(compressedData); + + try (GZIPInputStream gis = new GZIPInputStream(new java.io.ByteArrayInputStream(compressed))) { + java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(gis, "UTF-8")); + StringBuilder sb = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + return sb.toString(); + } + } + + private static String compressIfNeed(String json) throws Exception { + if (json.getBytes("UTF-8").length <= SAFE_THRESHOLD) { + return json; + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (GZIPOutputStream gzos = new GZIPOutputStream(baos)) { + gzos.write(json.getBytes("UTF-8")); + } + + return "GZIP:" + Base64.getEncoder().encodeToString(baos.toByteArray()); + } } diff --git a/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/controller/QrOutboundApplicationController.java b/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/controller/QrOutboundApplicationController.java new file mode 100644 index 0000000..2ed418e --- /dev/null +++ b/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/controller/QrOutboundApplicationController.java @@ -0,0 +1,95 @@ + +package com.lideeyunji.module.biz.controller; + +import com.lideeyunji.core.framework.entity.erp.ScmgiplanEntity; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanQrEntity; +import com.lideeyunji.core.framework.service.erp.ScmgiPlanService; +import com.lideeyunji.module.biz.service.QrOutboundApplicationService; +import com.lideeyunji.tool.framework.common.pojo.CommonResult; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.xml.transform.Result; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.lideeyunji.tool.framework.common.pojo.CommonResult.success; + +/** + * @author DX + * @create 2026-03-3 11:59 + * @dedescription: + */ +@Tag(name = "出库申请控制器") +@RestController +@Validated +@RequestMapping("/outbound") +public class QrOutboundApplicationController { + + @Resource + private QrOutboundApplicationService qrOutboundApplicationService; + + @Resource + private ScmgiPlanService scmgiPlanService; + @PostMapping("/list") + @PermitAll + @Operation(tags = "出库申请列表",summary = "出库申请列表") + public CommonResult> list(@RequestBody ScmgiplanEntity scmgiplanEntity) { + return success(qrOutboundApplicationService.selectList(scmgiplanEntity)); + } + + + @PostMapping("/selectOne") + @PermitAll + @Operation(tags = "查询出库申请",summary = "查询出库申请") + public CommonResult selectOne(@RequestBody ScmgiplanEntity scmgiplanEntity) { + return success(qrOutboundApplicationService.selectByCode(scmgiplanEntity)); + } + // 批量查询接口 + @GetMapping("/selectBatch") + @PermitAll + public CommonResult> selectBatch(@RequestParam("ids") String ids) { + List idList = Arrays.asList(ids.split(",")); + + if (idList.isEmpty()) { + return CommonResult.error(200,"ids参数不能为空"); + } + Listlist= scmgiPlanService.selectPlanForQr(idList); + if (list.isEmpty()) { + return CommonResult.error(200,"没有查询到数据"); + } + List planIds = list.stream() + .map(ScmgiplanEntity::getId) + .collect(Collectors.toList()); + + // 批量查询 + List dataList = qrOutboundApplicationService.selectBatchByIds(planIds); + // 保持原有顺序 + Map dataMap = dataList.stream() + .collect(Collectors.toMap(ScmgiplanQrEntity::getPlanId, Function.identity())); + + List sortedList = idList.stream() + .map(dataMap::get) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + return success(sortedList); + } + + + @GetMapping("/getQrCode") + @PermitAll + @Operation(tags = "查询出库申请",summary = "查询出库申请") + public CommonResult getQrCode(@RequestParam("id") String id) { + return success(qrOutboundApplicationService.getQrCode(id)); + } +} diff --git a/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/mapper/QrOutboundApplicationMapper.java b/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/mapper/QrOutboundApplicationMapper.java new file mode 100644 index 0000000..59e2da6 --- /dev/null +++ b/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/mapper/QrOutboundApplicationMapper.java @@ -0,0 +1,11 @@ +package com.lideeyunji.module.biz.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanQrEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +@DS("erp_dev") +public interface QrOutboundApplicationMapper extends BaseMapper { +} diff --git a/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/service/QrOutboundApplicationService.java b/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/service/QrOutboundApplicationService.java new file mode 100644 index 0000000..21cf27b --- /dev/null +++ b/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/service/QrOutboundApplicationService.java @@ -0,0 +1,16 @@ +package com.lideeyunji.module.biz.service; + +import com.lideeyunji.core.framework.entity.erp.ScmgiplanEntity; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanQrEntity; + +import java.util.List; + +public interface QrOutboundApplicationService { + List selectList(ScmgiplanEntity scmgiplanEntity); + + ScmgiplanEntity selectByCode(ScmgiplanEntity scmgiplanEntity); + + ScmgiplanQrEntity getQrCode(String id); + + List selectBatchByIds(List idList); +} diff --git a/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/service/impl/QrQrOutboundApplicationServiceImpl.java b/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/service/impl/QrQrOutboundApplicationServiceImpl.java new file mode 100644 index 0000000..6ce90ec --- /dev/null +++ b/lidee-module/lidee-module-biz/src/main/java/com/lideeyunji/module/biz/service/impl/QrQrOutboundApplicationServiceImpl.java @@ -0,0 +1,157 @@ +package com.lideeyunji.module.biz.service.impl; + +import cn.hutool.core.bean.copier.CopyOptions; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.lideeyunji.core.framework.entity.erp.ScmGiPlanItemEntity; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanEntity; +import com.lideeyunji.core.framework.entity.erp.ScmgiplanQrEntity; +import com.lideeyunji.core.framework.mapper.erp.ScmgiPlanItemMapper; +import com.lideeyunji.core.framework.mapper.erp.ScmgiPlanMapper; +import com.lideeyunji.module.biz.mapper.QrOutboundApplicationMapper; +import com.lideeyunji.module.biz.service.QrOutboundApplicationService; +import com.lideeyunji.tool.framework.sql.core.toolkit.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class QrQrOutboundApplicationServiceImpl extends ServiceImpl implements QrOutboundApplicationService { + + @Resource + private ScmgiPlanMapper scmgiPlanMapper; + + @Resource + private ScmgiPlanItemMapper scmgiPlanItemMapper; + + @Override + public List selectList(ScmgiplanEntity scmgiplanEntity) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + + if (StringUtils.isNotBlank(scmgiplanEntity.getPlanCode())) { + queryWrapper.eq(ScmgiplanQrEntity::getPlanCode, scmgiplanEntity.getPlanCode()); + } + + if (StringUtils.isNotBlank(scmgiplanEntity.getPlanStatus())) { + queryWrapper.eq(ScmgiplanQrEntity::getPlanStatus, scmgiplanEntity.getPlanStatus()); + } + + return baseMapper.selectList(queryWrapper); + + } + + @Override + public ScmgiplanEntity selectByCode(ScmgiplanEntity scmgiplanEntity) { + if (scmgiplanEntity == null || StringUtils.isBlank(scmgiplanEntity.getPlanCode())) { + return null; + } + + ScmgiplanEntity dbEntity = scmgiPlanMapper.selectOne(new LambdaQueryWrapper() + .eq(ScmgiplanEntity::getPlanCode, scmgiplanEntity.getPlanCode()) + .eq(ScmgiplanEntity::getIsStop, "0")); + + if (dbEntity == null) { + return null; + } + + cn.hutool.core.bean.BeanUtil.copyProperties(scmgiplanEntity, dbEntity, + CopyOptions.create() + .setIgnoreNullValue(true) + .setIgnoreError(true) + .setIgnoreProperties("id")); + scmgiPlanMapper.updateById(dbEntity); + if (CollectionUtils.isNotEmpty(scmgiplanEntity.getScmGiPlanItemEntities())) { + List inputItems = scmgiplanEntity.getScmGiPlanItemEntities(); + + List inputMaterialCodes = inputItems.stream() + .map(ScmGiPlanItemEntity::getMaterialCode) + .filter(StringUtils::isNotBlank) + .distinct() + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(inputMaterialCodes)) { + return dbEntity; + } + + List dbItems = scmgiPlanItemMapper.selectList( + new LambdaQueryWrapper() + .eq(ScmGiPlanItemEntity::getPlanId, dbEntity.getId()) + .in(ScmGiPlanItemEntity::getMaterialCode, inputMaterialCodes)); + + java.util.Map dbItemMap = dbItems.stream() + .collect(Collectors.toMap(ScmGiPlanItemEntity::getMaterialCode, item -> item, (k1, k2) -> k1)); + + List toInsert = new java.util.ArrayList<>(); + List toUpdate = new java.util.ArrayList<>(); + + for (ScmGiPlanItemEntity inputItem : inputItems) { + if (StringUtils.isBlank(inputItem.getMaterialCode())) { + continue; + } + + ScmGiPlanItemEntity dbItem = dbItemMap.get(inputItem.getMaterialCode()); + + if (dbItem == null) { + ScmGiPlanItemEntity newItem = new ScmGiPlanItemEntity(); + cn.hutool.core.bean.BeanUtil.copyProperties(inputItem, newItem, + CopyOptions.create() + .setIgnoreProperties("id")); + newItem.setId(UUID.randomUUID().toString()); + newItem.setPlanId(dbEntity.getId()); + toInsert.add(newItem); + } else { + cn.hutool.core.bean.BeanUtil.copyProperties(inputItem, dbItem, + CopyOptions.create() + .setIgnoreNullValue(true) + .setIgnoreError(true) + .setIgnoreProperties("id")); + toUpdate.add(dbItem); + } + } + + List toDelete = dbItems.stream() + .filter(dbItem -> !inputMaterialCodes.contains(dbItem.getMaterialCode())) + .collect(Collectors.toList()); + + if (CollectionUtils.isNotEmpty(toInsert)) { + toInsert.forEach(item -> scmgiPlanItemMapper.insert(item)); + } + + if (CollectionUtils.isNotEmpty(toUpdate)) { + toUpdate.forEach(item -> scmgiPlanItemMapper.updateById(item)); + } + +// if (CollectionUtils.isNotEmpty(toDelete)) { +// List deleteIds = toDelete.stream() +// .map(ScmGiPlanItemEntity::getId) +// .collect(Collectors.toList()); +// scmgiPlanItemMapper.deleteBatchIds(deleteIds); +// } + + dbEntity.setScmGiPlanItemEntities(inputItems); + } + return dbEntity; + } + + @Override + public ScmgiplanQrEntity getQrCode(String id) { + ScmgiplanQrEntity scmgiplanQrEntity = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(ScmgiplanQrEntity::getPlanId, id) + ); + return scmgiplanQrEntity; + } + + @Override + public List selectBatchByIds(List idList) { + if (idList == null || idList.isEmpty()) { + return Collections.emptyList(); + } + return baseMapper.selectList(new LambdaQueryWrapper().in(ScmgiplanQrEntity::getPlanId, idList)); + } +}