From 43e1d463b86c6a9365f42c3302bc2bf6502c566b Mon Sep 17 00:00:00 2001
From: anthonywj <yewenjie20@vip.qq.com>
Date: Thu, 19 Oct 2023 14:05:11 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BB=B7=E6=A0=BC=E5=85=88=E8=BF=9B=E5=85=88?=
 =?UTF-8?q?=E5=87=BA=EF=BC=8C=E8=80=97=E6=9D=90=E5=AD=97=E5=85=B8=E9=97=AE?=
 =?UTF-8?q?=E9=A2=98=EF=BC=8C=E7=A1=AE=E8=AE=A4=E5=8D=95=E6=8D=AE=E4=BA=BA?=
 =?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml                                       |  6 ++
 .../api/annotation/CusRedissonAnnotation.java | 32 +++++++
 .../com/glxp/api/aspect/RedissonAspect.java   | 94 +++++++++++++++++++
 .../java/com/glxp/api/config/RedisConfig.java | 22 +++++
 .../glxp/api/constant/RedissonCacheKey.java   | 41 ++++++++
 .../basic/BasicOrderPrintController.java      | 13 +--
 .../basic/UdiContrastController.java          | 12 ++-
 .../basic/UdiRelevanceController.java         | 29 +++---
 .../controller/inout/IoCodeController.java    |  2 +-
 .../inout/IoCodeTempController.java           | 19 +++-
 .../controller/inout/IoOrderController.java   | 15 +--
 .../inout/IoOrderDetailResultController.java  |  1 +
 .../inout/IoOrderReviewController.java        |  1 +
 .../controller/inv/InvProductController.java  |  3 +-
 .../controller/inv/UdiTraceController.java    |  4 +-
 .../controller/sync/SyncDelController.java    |  2 +-
 .../glxp/api/entity/inout/IoCodeEntity.java   | 11 +++
 .../api/entity/inout/IoCodeTempEntity.java    | 11 +++
 .../entity/inout/IoOrderDetailCodeEntity.java |  7 ++
 .../inv/InvPreInProductDetailEntity.java      | 14 +++
 .../entity/inv/InvPreProductDetailEntity.java | 12 +++
 .../api/entity/inv/InvPreProductEntity.java   | 12 ++-
 .../api/entity/inv/InvPreinProductEntity.java |  7 ++
 .../entity/inv/InvProductDetailEntity.java    | 10 ++
 .../glxp/api/entity/inv/InvProductEntity.java |  7 ++
 .../glxp/api/req/basic/UdiCombineRequest.java |  1 +
 .../inv/FilterInvProductDetailRequest.java    |  3 +
 .../api/res/inv/InvProductDetailResponse.java |  3 +
 .../glxp/api/res/inv/InvProductResponse.java  |  6 ++
 .../api/service/inout/IoAddInoutService.java  | 18 +++-
 .../service/inout/IoChangeInoutService.java   |  5 +-
 .../service/inout/IoCheckInoutService.java    |  8 ++
 .../glxp/api/service/inout/IoCodeService.java | 59 ------------
 .../api/service/inout/IoGenInvService.java    | 11 ++-
 .../inout/IoOrderDetailCodeService.java       |  5 +
 ...odeServiceImpl.java => IoCodeService.java} | 34 +++----
 .../impl/IoOrderDetailCodeServiceImpl.java    | 14 +++
 .../inout/impl/IoOrderServiceImpl.java        | 19 ++--
 .../inv/InvPreProductDetailService.java       |  3 +
 .../api/service/inv/InvPreProductService.java |  3 +-
 .../inv/InvPreinProductDetailService.java     |  5 +-
 .../service/inv/InvPreinProductService.java   |  3 +-
 .../service/inv/InvProductDetailService.java  | 53 -----------
 .../api/service/inv/InvProductService.java    |  4 +
 .../InvPreInProductDetailServiceImpl.java     |  7 +-
 .../impl/InvPreProductDetailServiceImpl.java  | 11 +++
 .../inv/impl/InvPreProductServiceImpl.java    |  6 +-
 .../inv/impl/InvPreinProductServiceImpl.java  |  6 +-
 ...Impl.java => InvProductDetailService.java} | 32 +++----
 .../inv/impl/InvProductServiceImpl.java       | 12 +++
 .../service/sync/SpsSyncDownloadService.java  |  1 +
 .../mybatis/mapper/basic/UdiRelevanceDao.xml  |  2 +-
 .../mybatis/mapper/inv/invProductDao.xml      |  5 +-
 src/main/resources/schemas/schema_v2.3.sql    | 20 ++++
 54 files changed, 519 insertions(+), 227 deletions(-)
 create mode 100644 src/main/java/com/glxp/api/annotation/CusRedissonAnnotation.java
 create mode 100644 src/main/java/com/glxp/api/aspect/RedissonAspect.java
 create mode 100644 src/main/java/com/glxp/api/constant/RedissonCacheKey.java
 delete mode 100644 src/main/java/com/glxp/api/service/inout/IoCodeService.java
 rename src/main/java/com/glxp/api/service/inout/impl/{IoCodeServiceImpl.java => IoCodeService.java} (93%)
 delete mode 100644 src/main/java/com/glxp/api/service/inv/InvProductDetailService.java
 rename src/main/java/com/glxp/api/service/inv/impl/{InvProductDetailServiceImpl.java => InvProductDetailService.java} (95%)

diff --git a/pom.xml b/pom.xml
index 1d2924c8..14a460f6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -362,6 +362,12 @@
             <artifactId>minio</artifactId>
             <version>3.0.10</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>3.6.0</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/glxp/api/annotation/CusRedissonAnnotation.java b/src/main/java/com/glxp/api/annotation/CusRedissonAnnotation.java
new file mode 100644
index 00000000..e846ab26
--- /dev/null
+++ b/src/main/java/com/glxp/api/annotation/CusRedissonAnnotation.java
@@ -0,0 +1,32 @@
+package com.glxp.api.annotation;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import java.lang.annotation.*;
+
+/**
+ * redisson分布式锁
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface CusRedissonAnnotation {
+
+    @NotBlank(message = "redisson使用的缓存名称不能为空")
+    String cacheName();
+
+    @NotEmpty(message = "redisson使用的key不能为空")
+    String[] key();
+
+    @NotBlank(message = "redisson的超时信息不能为空")
+    String timeOutMsg();
+
+    /**
+     * 等待锁的时间,默认1秒,小于0时默认为0
+     *
+     * @return
+     */
+    @Min(value = 0, message = "等待时间最小值为0")
+    int waitTime() default 1;
+}
diff --git a/src/main/java/com/glxp/api/aspect/RedissonAspect.java b/src/main/java/com/glxp/api/aspect/RedissonAspect.java
new file mode 100644
index 00000000..d1594125
--- /dev/null
+++ b/src/main/java/com/glxp/api/aspect/RedissonAspect.java
@@ -0,0 +1,94 @@
+package com.glxp.api.aspect;
+
+
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.StrUtil;
+import com.glxp.api.annotation.CusRedissonAnnotation;
+import com.glxp.api.exception.JsonException;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.core.DefaultParameterNameDiscoverer;
+import org.springframework.expression.EvaluationContext;
+import org.springframework.expression.Expression;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Aspect
+@Component
+public class RedissonAspect {
+
+    private final ExpressionParser expressionParser = new SpelExpressionParser();
+
+    private final DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();
+
+    @Resource
+    private RedissonClient redissonClient;
+
+    @Before("@annotation(annotation)")
+    public void before(JoinPoint joinPoint, CusRedissonAnnotation annotation) throws InterruptedException {
+        if (StrUtil.isBlank(parseKey(joinPoint, annotation))) {
+            throw new RuntimeException("redisson使用的key不能为空");
+        }
+        if (StrUtil.isBlank(annotation.timeOutMsg())) {
+            throw new RuntimeException("redisson的超时信息不能为空");
+        }
+
+        RLock lock = redissonClient.getLock(parseKey(joinPoint, annotation));
+        int waitTime = annotation.waitTime();
+        boolean tryLock = lock.tryLock(waitTime, TimeUnit.SECONDS);
+        if (!tryLock) {
+            throw new JsonException(500, annotation.timeOutMsg());
+        }
+
+    }
+
+    @After("@annotation(cusRedissonAnnotation)")
+    public void after(JoinPoint joinPoint, CusRedissonAnnotation cusRedissonAnnotation) {
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        CusRedissonAnnotation annotation = signature.getMethod().getAnnotation(CusRedissonAnnotation.class);
+        RLock lock = redissonClient.getLock(parseKey(joinPoint, annotation));
+        try {
+            lock.unlock();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+    }
+
+    private String parseKey(JoinPoint joinPoint, CusRedissonAnnotation annotation) {
+
+        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
+        Method method = methodSignature.getMethod();
+        String[] paramNames = nameDiscoverer.getParameterNames(method);
+        List<String> keyValue = new ArrayList<>(annotation.key().length);
+        for (String s : annotation.key()) {
+            Expression expression = expressionParser.parseExpression(s);
+            EvaluationContext context = new StandardEvaluationContext();
+            Object[] args = joinPoint.getArgs();
+            for (int i = 0; i < args.length; i++) {
+                context.setVariable(paramNames[i], args[i]);
+            }
+            if (s.contains("#")) {
+                keyValue.add(expression.getValue(context, String.class));
+            } else {
+                keyValue.add(s);
+            }
+        }
+        return String.format("%s:%s", annotation.cacheName(), ArrayUtil.join(keyValue.toArray(), "_"));
+    }
+
+}
diff --git a/src/main/java/com/glxp/api/config/RedisConfig.java b/src/main/java/com/glxp/api/config/RedisConfig.java
index 37801727..27117b3f 100644
--- a/src/main/java/com/glxp/api/config/RedisConfig.java
+++ b/src/main/java/com/glxp/api/config/RedisConfig.java
@@ -3,6 +3,10 @@ package com.glxp.api.config;
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.PropertyAccessor;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
 import org.springframework.cache.annotation.CachingConfigurerSupport;
 import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.context.annotation.Bean;
@@ -12,8 +16,11 @@ import org.springframework.data.redis.core.*;
 import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
+import javax.annotation.Resource;
+
 /**
  * redis配置类
+ *
  * @program: springbootdemo
  * @Date: 2019/2/22 15:20
  * @Author: zjjlive
@@ -23,8 +30,23 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
 @EnableCaching //开启注解
 public class RedisConfig extends CachingConfigurerSupport {
 
+
+    @Resource
+    private RedisProperties redisProperties;
+
+    @Bean
+    public RedissonClient redisson() {
+        Config config = new Config();
+        config.useSingleServer()
+                .setAddress(String.format("redis://%s:%s", redisProperties.getHost(), redisProperties.getPort()))
+                .setPassword(redisProperties.getPassword())
+                .setDatabase(redisProperties.getDatabase());
+        return Redisson.create(config);
+    }
+
     /**
      * retemplate相关配置
+     *
      * @param factory
      * @return
      */
diff --git a/src/main/java/com/glxp/api/constant/RedissonCacheKey.java b/src/main/java/com/glxp/api/constant/RedissonCacheKey.java
new file mode 100644
index 00000000..0716ba7f
--- /dev/null
+++ b/src/main/java/com/glxp/api/constant/RedissonCacheKey.java
@@ -0,0 +1,41 @@
+package com.glxp.api.constant;
+
+//redisson缓存key
+public interface RedissonCacheKey {
+
+    /**
+     * 注册审核
+     */
+    String REGISTER_AUDIT = "register_audit";
+
+    /**
+     * web添加单据
+     */
+    String WEB_ADD_ORDER = "web_add_order";
+
+    /**
+     * 升级
+     */
+    String UPGRADE = "upgrade";
+
+    /**
+     * 提交单据
+     */
+    String SUBMIT_ORDER = "submit_order";
+
+    /**
+     * app提交单据
+     */
+    String APP_SUBMIT_ORDER = "app_submit_order";
+
+    /**
+     * 删除临时码表
+     */
+    String DELETE_CODE_TEMP = "delete_code_temp";
+
+
+    /**
+     * web添加单据
+     */
+    String WEB_ADD_CODE = "web_add_code";
+}
diff --git a/src/main/java/com/glxp/api/controller/basic/BasicOrderPrintController.java b/src/main/java/com/glxp/api/controller/basic/BasicOrderPrintController.java
index c35664c6..5aeffbf5 100644
--- a/src/main/java/com/glxp/api/controller/basic/BasicOrderPrintController.java
+++ b/src/main/java/com/glxp/api/controller/basic/BasicOrderPrintController.java
@@ -9,25 +9,15 @@ import com.glxp.api.entity.basic.BasicBussinessTypeEntity;
 import com.glxp.api.entity.basic.UdiProductEntity;
 import com.glxp.api.entity.inout.IoCodeEntity;
 import com.glxp.api.entity.inout.IoOrderDetailBizEntity;
-import com.glxp.api.entity.inout.IoOrderEntity;
-import com.glxp.api.entity.purchase.SupCertEntity;
-import com.glxp.api.entity.purchase.SupManufacturerEntity;
-import com.glxp.api.entity.purchase.SupProductEntity;
 import com.glxp.api.entity.system.*;
 import com.glxp.api.req.basic.FilterOrderPrintRequest;
 import com.glxp.api.req.inout.FilterOrderRequest;
-import com.glxp.api.req.inout.InspectionPDFTemplateRequest;
-import com.glxp.api.req.purchase.FilterSupManufacturerRequest;
-import com.glxp.api.req.purchase.purPlanPrintRequest;
-import com.glxp.api.req.system.FilterPdfTemplateRequest;
-import com.glxp.api.res.inout.IoOrderInvoiceResponse;
 import com.glxp.api.res.inout.IoOrderResponse;
-import com.glxp.api.res.system.SystemPDFTemplateRelevanceResponse;
 import com.glxp.api.service.basic.IBasicBussinessTypeService;
 import com.glxp.api.service.basic.UdiProductService;
-import com.glxp.api.service.inout.IoCodeService;
 import com.glxp.api.service.inout.IoOrderDetailBizService;
 import com.glxp.api.service.inout.IoOrderService;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import com.glxp.api.service.system.SystemPDFModuleService;
 import com.glxp.api.service.system.SystemPDFTemplateRelevanceCodeService;
 import com.glxp.api.service.system.SystemPDFTemplateRelevanceService;
@@ -43,7 +33,6 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/src/main/java/com/glxp/api/controller/basic/UdiContrastController.java b/src/main/java/com/glxp/api/controller/basic/UdiContrastController.java
index 8c6fc97e..0b58b53e 100644
--- a/src/main/java/com/glxp/api/controller/basic/UdiContrastController.java
+++ b/src/main/java/com/glxp/api/controller/basic/UdiContrastController.java
@@ -28,10 +28,12 @@ import com.glxp.api.res.PageSimpleResponse;
 import com.glxp.api.res.basic.UdiRelevanceResponse;
 import com.glxp.api.service.auth.CustomerService;
 import com.glxp.api.service.basic.*;
+import com.glxp.api.service.inout.IoOrderDetailCodeService;
 import com.glxp.api.service.system.CompanyService;
 import com.glxp.api.service.thrsys.ThrDataService;
 import com.glxp.api.service.thrsys.ThrSystemService;
 import com.glxp.api.util.CustomUtil;
+import com.glxp.api.util.IntUtil;
 import com.glxp.api.util.udi.UdiInfoUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.transaction.annotation.Transactional;
@@ -71,7 +73,8 @@ public class UdiContrastController {
     CompanyService companyService;
     @Resource
     private CompanyProductRelevanceService companyProductRelevanceService;
-
+    @Resource
+    IoOrderDetailCodeService orderDetailCodeService;
 
     /**
      * 耗材字典添加
@@ -304,6 +307,13 @@ public class UdiContrastController {
                     }
             }
         }
+
+        //判断单据是否存在相关对照的产品组合
+        Boolean exitUuid = orderDetailCodeService.isExit(udiRelevanceEntity.getId(), udiRelevanceEntity.getUuid());
+        if (IntUtil.value(exitUuid)) {
+            return ResultVOUtils.error(500, "该产品已关联单据,无法解绑!");
+        }
+
         ThrSystemEntity thrSystemEntity = thrSystemService.selectMainThrSys();
         ThrProductsEntity thrProductsEntity = thrDataService.getProducts(udiRelevanceEntity.getMainId(), thrSystemEntity.getThirdId());
         UdiProductEntity UdiInfoRequest = new UdiProductEntity();
diff --git a/src/main/java/com/glxp/api/controller/basic/UdiRelevanceController.java b/src/main/java/com/glxp/api/controller/basic/UdiRelevanceController.java
index 5b03efd4..35babe7e 100644
--- a/src/main/java/com/glxp/api/controller/basic/UdiRelevanceController.java
+++ b/src/main/java/com/glxp/api/controller/basic/UdiRelevanceController.java
@@ -29,7 +29,7 @@ import com.glxp.api.res.basic.BasicProductThirdSysResponse;
 import com.glxp.api.res.basic.UdiRelevanceResponse;
 import com.glxp.api.service.auth.CustomerService;
 import com.glxp.api.service.basic.*;
-import com.glxp.api.service.inout.IoCodeService;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import com.glxp.api.service.inv.InvPreProductService;
 import com.glxp.api.service.inv.InvProductService;
 import com.glxp.api.service.system.SystemParamConfigService;
@@ -275,19 +275,18 @@ public class UdiRelevanceController extends BaseController {
         String ids = deleteRequest.getId();
         UdiRelevanceEntity udiRelevanceEntity = udiRelevanceService.selectById(Long.parseLong(ids));
         if (udiRelevanceEntity != null && udiRelevanceEntity.getUuid() != null) {
-//            if (codeService.isExitByRelId(udiRelevanceEntity.getId() + "")) {
-//                return ResultVOUtils.error(500, "该产品已关联单据,无法删除!");
-//            }
-//            if (companyProductRelevanceService.isExitByRelId(udiRelevanceEntity.getId() + "")) {
-//                return ResultVOUtils.error(500, "该产品已被已被供应商选入,无法删除!");
-//            }
+            if (codeService.isExitByRelId(udiRelevanceEntity.getId() + "")) {
+                return ResultVOUtils.error(500, "该产品已关联单据,无法删除!");
+            }
+            if (companyProductRelevanceService.isExitByRelId(udiRelevanceEntity.getId() + "")) {
+                return ResultVOUtils.error(500, "该产品已被已被供应商选入,无法删除!");
+            }
+        }
+        udiRelevanceService.deleteById(ids);
+        List<UdiRelevanceEntity> udiRelevanceEntities = udiRelevanceService.selectByUuid(udiRelevanceEntity.getUuid());
+        if (udiRelevanceEntities == null || udiRelevanceEntities.isEmpty()) {
+            udiProductService.deleteByUuid(udiRelevanceEntity.getUuid());
         }
-
-//        udiRelevanceService.deleteById(ids);
-//        List<UdiRelevanceEntity> udiRelevanceEntities = udiRelevanceService.selectByUuid(udiRelevanceEntity.getUuid());
-//        if (udiRelevanceEntities == null || udiRelevanceEntities.isEmpty()) {
-//           udiProductService.deleteByUuid(udiRelevanceEntity.getUuid());
-//        }
 
         BasicDataRequest basicDataRequest = new BasicDataRequest();
         basicDataRequest.setDeleteRequest(deleteRequest);
@@ -397,13 +396,13 @@ public class UdiRelevanceController extends BaseController {
     @PostMapping("/udi/udirel/check/udi")
     public BaseResponse checkUdi(@RequestBody UdiCombineRequest udiCombineRequest) {
 
-        List<String> keys = udiCombineRequest.getKeys();
+        List<String> keys = udiCombineRequest.getDevKeys();
         if (keys != null && keys.size() > 0) {
             List<UdiRelevanceEntity> datas = udiRelevanceService.batchSelectByUuid(keys);
             if (datas.isEmpty()) {
                 return ResultVOUtils.success("无被选入!");
             } else {
-                return ResultVOUtils.error(499, "所选产品DI已经被" + "第三方产品ID" + "绑定,您确定继续对照");
+                return ResultVOUtils.error(499, "所选产品DI已存在耗材字典,继续对照将会出现不可预估错误,是否继续选入?");
             }
         }
         return ResultVOUtils.success("未选择产品");
diff --git a/src/main/java/com/glxp/api/controller/inout/IoCodeController.java b/src/main/java/com/glxp/api/controller/inout/IoCodeController.java
index ecc17afe..10d999c8 100644
--- a/src/main/java/com/glxp/api/controller/inout/IoCodeController.java
+++ b/src/main/java/com/glxp/api/controller/inout/IoCodeController.java
@@ -9,7 +9,7 @@ import com.glxp.api.entity.inout.IoCodeEntity;
 import com.glxp.api.req.inout.FilterCodeRequest;
 import com.glxp.api.res.PageSimpleResponse;
 import com.glxp.api.res.inout.IoCodeResponse;
-import com.glxp.api.service.inout.IoCodeService;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 
diff --git a/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java b/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java
index 549c9073..9756164c 100644
--- a/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java
+++ b/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java
@@ -6,14 +6,13 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import com.github.pagehelper.PageInfo;
 import com.glxp.api.annotation.AuthRuleAnnotation;
+import com.glxp.api.annotation.CusRedissonAnnotation;
 import com.glxp.api.annotation.Log;
 import com.glxp.api.common.enums.ResultEnum;
 import com.glxp.api.common.res.BaseResponse;
 import com.glxp.api.common.util.ResultVOUtils;
-import com.glxp.api.constant.BusinessType;
+import com.glxp.api.constant.*;
 import com.glxp.api.constant.Constant;
-import com.glxp.api.constant.ConstantStatus;
-import com.glxp.api.constant.ConstantType;
 import com.glxp.api.controller.BaseController;
 import com.glxp.api.entity.auth.AuthAdmin;
 import com.glxp.api.entity.auth.InvWarehouseEntity;
@@ -41,7 +40,9 @@ import com.glxp.api.res.inout.IoCodeTempResponse;
 import com.glxp.api.service.auth.InvWarehouseService;
 import com.glxp.api.service.basic.*;
 import com.glxp.api.service.inout.*;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import com.glxp.api.service.inv.*;
+import com.glxp.api.service.inv.impl.InvProductDetailService;
 import com.glxp.api.service.purchase.SupCertService;
 import com.glxp.api.service.purchase.SupProductService;
 import com.glxp.api.service.system.SystemParamConfigService;
@@ -339,6 +340,7 @@ public class IoCodeTempController extends BaseController {
     //前端扫码提交
     @AuthRuleAnnotation("")
     @PostMapping("warehouse/inout/addOrderWeb")
+    @CusRedissonAnnotation(cacheName = RedissonCacheKey.WEB_ADD_CODE, key = {"#addOrderRequest.corpOrderId", "#addOrderRequest.code"}, timeOutMsg = "系统正在处理,请勿重复扫码")
     @Log(title = "单据管理", businessType = BusinessType.INSERT)
     public BaseResponse addOrderWeb(@RequestBody AddOrderRequest addOrderRequest, BindingResult bindingResult) {
 
@@ -622,9 +624,11 @@ public class IoCodeTempController extends BaseController {
 
         //先生成扫码单据
         IoOrderEntity orderEntity = orderService.findByBillNo(orderId);
+        String inBatch = "";
         if (StringUtils.isBlank(orderId) || orderEntity == null) {
             String orderNo = gennerOrderUtils.createScOrderNo(new OrderNoTypeBean(Constant.SCAN_ORDER + StrUtil.trimToEmpty(bussinessTypeEntity.getPrefix()), "yyyyMMdd"));
             orderId = orderNo;
+            inBatch = orderNo.substring((Constant.SCAN_ORDER + StrUtil.trimToEmpty(bussinessTypeEntity.getPrefix())).length());
         }
 
         List<IoCodeTempEntity> codeEnttitys = codeTempService.findByOrderId(orderId);
@@ -808,7 +812,8 @@ public class IoCodeTempController extends BaseController {
                     }
                 }
             }
-
+            codeEnttity.setPrice(udiRelevanceResponse.getPrice());
+            codeEnttity.setInBatchNo(inBatch);
             //是否边扫边校验
             if (addOrderRequest.getOrderType() == ConstantStatus.ORDER_TYPE_NORMAL && bussinessTypeEntity.isCheckEnable()) {
                 String errMsg = ioCheckInoutService.checkCode(codeEnttity);
@@ -1013,7 +1018,11 @@ public class IoCodeTempController extends BaseController {
             } else {
                 int count = invProductDetailService.vailStockCount(codeTempEntity.getRelId(), codeTempEntity.getBatchNo(), codeTempEntity.getSupId(), codeTempEntity.getDeptCode(), codeTempEntity.getInvCode(), null);
                 if (count <= 0) {
-                    return ResultVOUtils.error(500, "当前库存不足,不允许0库存出库");
+
+                    if (count == -1) {
+                        return ResultVOUtils.error(500, "该产品未入库");
+                    } else
+                        return ResultVOUtils.error(500, "当前库存不足");
                 } else {
                     //查询此单据已扫描的条码数量
                     if (codeTempEntity.getMyReCount() > count) {
diff --git a/src/main/java/com/glxp/api/controller/inout/IoOrderController.java b/src/main/java/com/glxp/api/controller/inout/IoOrderController.java
index 7a059c65..33c79085 100644
--- a/src/main/java/com/glxp/api/controller/inout/IoOrderController.java
+++ b/src/main/java/com/glxp/api/controller/inout/IoOrderController.java
@@ -7,14 +7,12 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.pagehelper.PageInfo;
 import com.glxp.api.annotation.AuthRuleAnnotation;
+import com.glxp.api.annotation.CusRedissonAnnotation;
 import com.glxp.api.annotation.Log;
 import com.glxp.api.common.enums.ResultEnum;
 import com.glxp.api.common.res.BaseResponse;
 import com.glxp.api.common.util.ResultVOUtils;
-import com.glxp.api.constant.BusinessType;
-import com.glxp.api.constant.Constant;
-import com.glxp.api.constant.ConstantStatus;
-import com.glxp.api.constant.SocketMsgType;
+import com.glxp.api.constant.*;
 import com.glxp.api.controller.BaseController;
 import com.glxp.api.controller.sync.SpsSyncWebSocket;
 import com.glxp.api.entity.auth.AuthAdmin;
@@ -38,7 +36,9 @@ import com.glxp.api.service.auth.InvWarehouseService;
 import com.glxp.api.service.basic.EntrustReceService;
 import com.glxp.api.service.basic.IBasicBussinessTypeService;
 import com.glxp.api.service.inout.*;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import com.glxp.api.service.inout.impl.IoOrderInvoiceService;
+import com.glxp.api.service.system.SystemParamConfigService;
 import com.glxp.api.util.CustomUtil;
 import com.glxp.api.util.GennerOrderUtils;
 import com.glxp.api.util.OrderNoTypeBean;
@@ -82,7 +82,8 @@ public class IoOrderController extends BaseController {
     IoCheckInoutService ioCheckInoutService;
     @Resource
     IoOrderInvoiceService orderInvoiceService;
-
+    @Resource
+    private SystemParamConfigService systemParamConfigService;
 
     /**
      * 查询单据列表
@@ -286,6 +287,7 @@ public class IoOrderController extends BaseController {
     //等待校验-立即提交
     @AuthRuleAnnotation("")
     @PostMapping("warehouse/inout/submitOrderWeb")
+    @CusRedissonAnnotation(cacheName = RedissonCacheKey.SUBMIT_ORDER, key = {"#addOrderRequest.billNo"}, timeOutMsg = "系统正在处理,请勿重复提交")
     @Log(title = "单据管理", businessType = BusinessType.UPDATE)
     public BaseResponse submitOrderWeb(@RequestBody AddOrderRequest addOrderRequest) {
 
@@ -679,10 +681,9 @@ public class IoOrderController extends BaseController {
     @Log(title = "单据管理", businessType = BusinessType.UPDATE)
     public BaseResponse updateOrder(@RequestBody IoOrderEntity ioOrderEntity) {
         ioOrderEntity.setUpdateTime(new Date());
+        ioOrderEntity.setUpdateUser(getUserId() + "");
         orderService.updateByBillNo(ioOrderEntity);
-
 //        webSocketServer.sendMessage(SocketMsgEntity.builder().type(SocketMsgType.TASK_SYNC_DELETE).content(ioOrderEntity.getBillNo()).remark("单据删除").build(), null);
-
         webSocketServer.sendMessage(SocketMsgEntity.builder().type(SocketMsgType.TASK_INVOICE_CONFIRM).content(ioOrderEntity.getBillNo()).remark("发票确认").build(), null);
         return ResultVOUtils.success();
     }
diff --git a/src/main/java/com/glxp/api/controller/inout/IoOrderDetailResultController.java b/src/main/java/com/glxp/api/controller/inout/IoOrderDetailResultController.java
index 04cb3c4f..eb31e1ff 100644
--- a/src/main/java/com/glxp/api/controller/inout/IoOrderDetailResultController.java
+++ b/src/main/java/com/glxp/api/controller/inout/IoOrderDetailResultController.java
@@ -29,6 +29,7 @@ import com.glxp.api.res.inout.IoOrderDetailResultResponse;
 import com.glxp.api.service.auth.AuthCompanyService;
 import com.glxp.api.service.basic.IBasicBussinessTypeService;
 import com.glxp.api.service.inout.*;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import com.glxp.api.service.inout.impl.IoOrderInvoiceService;
 import com.glxp.api.service.system.SystemPDFModuleService;
 import com.glxp.api.service.system.SystemPDFTemplateService;
diff --git a/src/main/java/com/glxp/api/controller/inout/IoOrderReviewController.java b/src/main/java/com/glxp/api/controller/inout/IoOrderReviewController.java
index 1e0c8a79..ac7b19cb 100644
--- a/src/main/java/com/glxp/api/controller/inout/IoOrderReviewController.java
+++ b/src/main/java/com/glxp/api/controller/inout/IoOrderReviewController.java
@@ -31,6 +31,7 @@ import com.glxp.api.service.auth.AuthAdminService;
 import com.glxp.api.service.basic.EntrustReceService;
 import com.glxp.api.service.basic.IBasicBussinessTypeService;
 import com.glxp.api.service.inout.*;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import com.glxp.api.service.sync.SpsSyncDownloadService;
 import com.glxp.api.service.system.SystemParamConfigService;
 import com.glxp.api.util.*;
diff --git a/src/main/java/com/glxp/api/controller/inv/InvProductController.java b/src/main/java/com/glxp/api/controller/inv/InvProductController.java
index d090418d..f6dec2e8 100644
--- a/src/main/java/com/glxp/api/controller/inv/InvProductController.java
+++ b/src/main/java/com/glxp/api/controller/inv/InvProductController.java
@@ -22,9 +22,8 @@ import com.glxp.api.res.inv.InvProductPageResponse;
 import com.glxp.api.res.inv.InvProductResponse;
 import com.glxp.api.service.auth.CustomerService;
 import com.glxp.api.service.auth.WarehouseUserService;
-import com.glxp.api.service.inv.InvProductDetailService;
 import com.glxp.api.service.inv.InvProductService;
-import com.glxp.api.util.DateUtil;
+import com.glxp.api.service.inv.impl.InvProductDetailService;
 import com.glxp.api.util.udi.FilterUdiUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.BindingResult;
diff --git a/src/main/java/com/glxp/api/controller/inv/UdiTraceController.java b/src/main/java/com/glxp/api/controller/inv/UdiTraceController.java
index 5963f4ea..dfd88528 100644
--- a/src/main/java/com/glxp/api/controller/inv/UdiTraceController.java
+++ b/src/main/java/com/glxp/api/controller/inv/UdiTraceController.java
@@ -9,7 +9,6 @@ import com.glxp.api.common.util.ResultVOUtils;
 import com.glxp.api.entity.basic.UdiEntity;
 import com.glxp.api.entity.basic.UdiProductEntity;
 import com.glxp.api.entity.inv.InvProductDetailEntity;
-import com.glxp.api.req.basic.FilterUdiInfoRequest;
 import com.glxp.api.req.basic.FilterUdiRelRequest;
 import com.glxp.api.req.inout.FilterOrderRequest;
 import com.glxp.api.req.inv.FilterCodeTraceRequest;
@@ -21,10 +20,9 @@ import com.glxp.api.res.inv.UdiTraceResponse;
 import com.glxp.api.service.basic.UdiProductService;
 import com.glxp.api.service.basic.UdiRelevanceService;
 import com.glxp.api.service.inout.IoOrderService;
-import com.glxp.api.service.inv.InvProductDetailService;
+import com.glxp.api.service.inv.impl.InvProductDetailService;
 import com.glxp.api.util.DateUtil;
 import com.glxp.api.util.udi.FilterUdiUtils;
-import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 
diff --git a/src/main/java/com/glxp/api/controller/sync/SyncDelController.java b/src/main/java/com/glxp/api/controller/sync/SyncDelController.java
index 8a329a5b..cbc96479 100644
--- a/src/main/java/com/glxp/api/controller/sync/SyncDelController.java
+++ b/src/main/java/com/glxp/api/controller/sync/SyncDelController.java
@@ -21,8 +21,8 @@ import com.glxp.api.req.system.DeleteRequest;
 import com.glxp.api.service.auth.InvBusUserService;
 import com.glxp.api.service.auth.WarehouseBussinessTypeService;
 import com.glxp.api.service.basic.*;
-import com.glxp.api.service.inout.IoCodeService;
 import com.glxp.api.service.inout.IoOrderService;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import com.glxp.api.service.inv.DeviceInspectTaskDetailService;
 import com.glxp.api.service.inv.DeviceInspectTaskService;
 import com.glxp.api.service.sync.SyncEditLogService;
diff --git a/src/main/java/com/glxp/api/entity/inout/IoCodeEntity.java b/src/main/java/com/glxp/api/entity/inout/IoCodeEntity.java
index 8bafcc5d..b0f36729 100644
--- a/src/main/java/com/glxp/api/entity/inout/IoCodeEntity.java
+++ b/src/main/java/com/glxp/api/entity/inout/IoCodeEntity.java
@@ -11,6 +11,7 @@ import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
 import org.springframework.http.codec.json.Jackson2JsonEncoder;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
@@ -139,6 +140,16 @@ public class IoCodeEntity implements Serializable {
     @TableField(value = "createTime")
     private Date createTime;
 
+    @TableField(value = "price")
+    private BigDecimal price;
+
+    /**
+     * 入院批号
+     */
+    @TableField(value = "inBatchNo")
+    private String inBatchNo;
+
+
     @TableField(exist = false)
     private int status;     //条码校验状态//条码校验状态(数据类型请勿修改)
     @TableField(exist = false)
diff --git a/src/main/java/com/glxp/api/entity/inout/IoCodeTempEntity.java b/src/main/java/com/glxp/api/entity/inout/IoCodeTempEntity.java
index 4c661f2f..2770128b 100644
--- a/src/main/java/com/glxp/api/entity/inout/IoCodeTempEntity.java
+++ b/src/main/java/com/glxp/api/entity/inout/IoCodeTempEntity.java
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonIdentityReference;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 
@@ -136,6 +137,16 @@ public class IoCodeTempEntity {
     @TableField(value = "createTime")
     private Date createTime;
 
+
+    /**
+     * 入院批号
+     */
+    @TableField(value = "inBatchNo")
+    private String inBatchNo;
+
+    @TableField(value = "price")
+    private BigDecimal price;
+
     @TableField(exist = false)
     private int status;     //条码校验状态(数据类型请勿修改)
     @TableField(exist = false)
diff --git a/src/main/java/com/glxp/api/entity/inout/IoOrderDetailCodeEntity.java b/src/main/java/com/glxp/api/entity/inout/IoOrderDetailCodeEntity.java
index f34c0604..487293d0 100644
--- a/src/main/java/com/glxp/api/entity/inout/IoOrderDetailCodeEntity.java
+++ b/src/main/java/com/glxp/api/entity/inout/IoOrderDetailCodeEntity.java
@@ -178,6 +178,13 @@ public class IoOrderDetailCodeEntity implements Serializable {
     @TableField(value = "remark4")
     private String remark4;
 
+    /**
+     * 入院批号
+     */
+
+    @TableField(exist = false)
+    private String inBatchNo;
+
     /**
      * 扩展字段5
      */
diff --git a/src/main/java/com/glxp/api/entity/inv/InvPreInProductDetailEntity.java b/src/main/java/com/glxp/api/entity/inv/InvPreInProductDetailEntity.java
index e40500e7..d5bfc44b 100644
--- a/src/main/java/com/glxp/api/entity/inv/InvPreInProductDetailEntity.java
+++ b/src/main/java/com/glxp/api/entity/inv/InvPreInProductDetailEntity.java
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -133,6 +134,19 @@ public class InvPreInProductDetailEntity {
     private Date updateTime;
 
 
+    /**
+     * 价格
+     */
+    @TableField(value = "price")
+    private BigDecimal price;
+
+    /**
+     * 入院批号
+     */
+    @TableField(value = "inBatchNo")
+    private String inBatchNo;
+
+
     public static final String COL_ID = "id";
 
     public static final String COL_CODE = "code";
diff --git a/src/main/java/com/glxp/api/entity/inv/InvPreProductDetailEntity.java b/src/main/java/com/glxp/api/entity/inv/InvPreProductDetailEntity.java
index bd4b0ae2..f03a6c40 100644
--- a/src/main/java/com/glxp/api/entity/inv/InvPreProductDetailEntity.java
+++ b/src/main/java/com/glxp/api/entity/inv/InvPreProductDetailEntity.java
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -134,6 +135,17 @@ public class InvPreProductDetailEntity {
     @TableField(value = "updateTime")
     private Date updateTime;
 
+    /**
+     * 价格
+     */
+    @TableField(value = "price")
+    private BigDecimal price;
+    /**
+     * 入院批号
+     */
+    @TableField(value = "inBatchNo")
+    private String inBatchNo;
+
 
     public static final String COL_ID = "id";
 
diff --git a/src/main/java/com/glxp/api/entity/inv/InvPreProductEntity.java b/src/main/java/com/glxp/api/entity/inv/InvPreProductEntity.java
index 84d5dcd0..e52218aa 100644
--- a/src/main/java/com/glxp/api/entity/inv/InvPreProductEntity.java
+++ b/src/main/java/com/glxp/api/entity/inv/InvPreProductEntity.java
@@ -6,11 +6,12 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
-    * 寄售库存表
-    */
+ * 寄售库存表
+ */
 @Data
 @TableName(value = "inv_pre_product")
 public class InvPreProductEntity {
@@ -101,6 +102,13 @@ public class InvPreProductEntity {
     @TableField(value = "updateTime")
     private Date updateTime;
 
+    /**
+     * 价格
+     */
+    @TableField(value = "price")
+    private BigDecimal price;
+
+
     public static final String COL_ID = "id";
 
     public static final String COL_RELIDFK = "relIdFk";
diff --git a/src/main/java/com/glxp/api/entity/inv/InvPreinProductEntity.java b/src/main/java/com/glxp/api/entity/inv/InvPreinProductEntity.java
index a144bb69..40890408 100644
--- a/src/main/java/com/glxp/api/entity/inv/InvPreinProductEntity.java
+++ b/src/main/java/com/glxp/api/entity/inv/InvPreinProductEntity.java
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -101,6 +102,12 @@ public class InvPreinProductEntity {
     @TableField(value = "updateTime")
     private Date updateTime;
 
+    /**
+     * 价格
+     */
+    @TableField(value = "price")
+    private BigDecimal price;
+
     public static final String COL_ID = "id";
 
     public static final String COL_RELIDFK = "relIdFk";
diff --git a/src/main/java/com/glxp/api/entity/inv/InvProductDetailEntity.java b/src/main/java/com/glxp/api/entity/inv/InvProductDetailEntity.java
index 3ae7b3ce..deeeacc7 100644
--- a/src/main/java/com/glxp/api/entity/inv/InvProductDetailEntity.java
+++ b/src/main/java/com/glxp/api/entity/inv/InvProductDetailEntity.java
@@ -122,6 +122,16 @@ public class InvProductDetailEntity {
     private String mainAction;
     @TableField(value = "action")
     private String action;
+    /**
+     * 价格
+     */
+    @TableField(value = "price")
+    private BigDecimal price;
+    /**
+     * 入院批号
+     */
+    @TableField(value = "inBatchNo")
+    private String inBatchNo;
 
 
 }
diff --git a/src/main/java/com/glxp/api/entity/inv/InvProductEntity.java b/src/main/java/com/glxp/api/entity/inv/InvProductEntity.java
index 5427cc0b..040d3e15 100644
--- a/src/main/java/com/glxp/api/entity/inv/InvProductEntity.java
+++ b/src/main/java/com/glxp/api/entity/inv/InvProductEntity.java
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
@@ -136,4 +137,10 @@ public class InvProductEntity {
     @TableField(value = "availableStock")
     private Integer availableStock;
 
+
+    /**
+     * 价格
+     */
+    @TableField(value = "price")
+    private BigDecimal price;
 }
diff --git a/src/main/java/com/glxp/api/req/basic/UdiCombineRequest.java b/src/main/java/com/glxp/api/req/basic/UdiCombineRequest.java
index c6122240..0fde4980 100644
--- a/src/main/java/com/glxp/api/req/basic/UdiCombineRequest.java
+++ b/src/main/java/com/glxp/api/req/basic/UdiCombineRequest.java
@@ -10,6 +10,7 @@ import java.util.List;
 public class UdiCombineRequest {
 
     List<String> keys;
+    List<String> devKeys;
     private String thirdId;
     private List<String> thirdIds;
     private String erpName;
diff --git a/src/main/java/com/glxp/api/req/inv/FilterInvProductDetailRequest.java b/src/main/java/com/glxp/api/req/inv/FilterInvProductDetailRequest.java
index 160d5cac..5235eefe 100644
--- a/src/main/java/com/glxp/api/req/inv/FilterInvProductDetailRequest.java
+++ b/src/main/java/com/glxp/api/req/inv/FilterInvProductDetailRequest.java
@@ -3,6 +3,7 @@ package com.glxp.api.req.inv;
 import com.glxp.api.util.page.ListPageRequest;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -87,4 +88,6 @@ public class FilterInvProductDetailRequest extends ListPageRequest {
     private String expireDate;
 
     private String orderBy;
+
+    private BigDecimal price;
 }
diff --git a/src/main/java/com/glxp/api/res/inv/InvProductDetailResponse.java b/src/main/java/com/glxp/api/res/inv/InvProductDetailResponse.java
index 92d8e96c..4fe2a4ff 100644
--- a/src/main/java/com/glxp/api/res/inv/InvProductDetailResponse.java
+++ b/src/main/java/com/glxp/api/res/inv/InvProductDetailResponse.java
@@ -2,6 +2,7 @@ package com.glxp.api.res.inv;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -126,4 +127,6 @@ public class InvProductDetailResponse {
      * 单据日期
      */
     private String orderTime;
+
+    private BigDecimal price;
 }
diff --git a/src/main/java/com/glxp/api/res/inv/InvProductResponse.java b/src/main/java/com/glxp/api/res/inv/InvProductResponse.java
index 2f4d1b13..da0401d3 100644
--- a/src/main/java/com/glxp/api/res/inv/InvProductResponse.java
+++ b/src/main/java/com/glxp/api/res/inv/InvProductResponse.java
@@ -2,6 +2,8 @@ package com.glxp.api.res.inv;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 /**
  * 库存数据VO
  */
@@ -113,4 +115,8 @@ public class InvProductResponse {
      */
     private String spaceName;
 
+
+    private BigDecimal price;
+
+
 }
diff --git a/src/main/java/com/glxp/api/service/inout/IoAddInoutService.java b/src/main/java/com/glxp/api/service/inout/IoAddInoutService.java
index 8262b9d4..4fd64f82 100644
--- a/src/main/java/com/glxp/api/service/inout/IoAddInoutService.java
+++ b/src/main/java/com/glxp/api/service/inout/IoAddInoutService.java
@@ -6,7 +6,6 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.glxp.api.common.enums.ResultEnum;
 import com.glxp.api.common.res.BaseResponse;
 import com.glxp.api.common.util.ResultVOUtils;
 import com.glxp.api.constant.Constant;
@@ -23,7 +22,8 @@ import com.glxp.api.req.inout.PostOrderRequest;
 import com.glxp.api.req.udims.PostUdimsOrderRequest;
 import com.glxp.api.res.basic.UdiRelevanceResponse;
 import com.glxp.api.service.basic.*;
-import com.glxp.api.service.inv.InvProductDetailService;
+import com.glxp.api.service.inout.impl.IoCodeService;
+import com.glxp.api.service.inv.impl.InvProductDetailService;
 import com.glxp.api.service.system.SystemParamConfigService;
 import com.glxp.api.util.CustomUtil;
 import com.glxp.api.util.DateUtil;
@@ -31,7 +31,6 @@ import com.glxp.api.util.GennerOrderUtils;
 import com.glxp.api.util.OrderNoTypeBean;
 import com.glxp.api.util.udi.FilterUdiUtils;
 import com.glxp.api.util.udi.UdiCalCountUtil;
-import com.glxp.api.util.udi.UdiInfoUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -692,6 +691,15 @@ public class IoAddInoutService {
         ioOrderDetailCodeEntity.setMeasname(udiRelevanceResponse.getMeasname());
         ioOrderDetailCodeEntity.setSpec(udiRelevanceResponse.getGgxh());
         ioOrderDetailCodeEntity.setSupId(codeTempEntity.getSupId());
+
+        if (codeTempEntity.getPrice() == null) {
+            ioOrderDetailCodeEntity.setPrice(udiRelevanceResponse.getPrice());
+            codeTempEntity.setPrice(udiRelevanceResponse.getPrice());
+            codeTempService.updateById(codeTempEntity);
+        } else {
+            ioOrderDetailCodeEntity.setPrice(codeTempEntity.getPrice());
+        }
+
         ioOrderDetailCodeEntity.setPrice(udiRelevanceResponse.getPrice());
         ioOrderDetailCodeEntity.setCount(codeTempEntity.getCount());
         ioOrderDetailCodeEntity.setReCount(codeTempEntity.getMyReCount());
@@ -745,8 +753,8 @@ public class IoAddInoutService {
                         IoCodeTempEntity codeEnttity = new IoCodeTempEntity();
                         BeanUtil.copyProperties(msCodeEntities.get(index), codeEnttity);
                         UdiProductEntity uuid = udiProductService.findByNameCode(codeEnttity.getNameCode());
-                        if (uuid==null){
-                            throw new JsonException(500,"未找到对应耗材字典");
+                        if (uuid == null) {
+                            throw new JsonException(500, "未找到对应耗材字典");
                         }
                         codeEnttity.setAction(orderSaveRequest.getAction());
                         codeEnttity.setMainAction(orderSaveRequest.getMainAction());
diff --git a/src/main/java/com/glxp/api/service/inout/IoChangeInoutService.java b/src/main/java/com/glxp/api/service/inout/IoChangeInoutService.java
index 4976dac1..ef5a7412 100644
--- a/src/main/java/com/glxp/api/service/inout/IoChangeInoutService.java
+++ b/src/main/java/com/glxp/api/service/inout/IoChangeInoutService.java
@@ -12,13 +12,12 @@ import com.glxp.api.entity.basic.BasicBusTypePreEntity;
 import com.glxp.api.entity.basic.BasicBussinessTypeEntity;
 import com.glxp.api.entity.inout.*;
 import com.glxp.api.entity.inv.InvProductDetailEntity;
-import com.glxp.api.entity.system.SystemParamConfigEntity;
 import com.glxp.api.service.auth.InvWarehouseService;
 import com.glxp.api.service.basic.IBasicBusTypePreService;
 import com.glxp.api.service.basic.IBasicBussinessTypeService;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import com.glxp.api.service.inout.impl.IoOrderInvoiceService;
-import com.glxp.api.service.inv.InvProductDetailService;
-import com.glxp.api.service.inv.InvProductService;
+import com.glxp.api.service.inv.impl.InvProductDetailService;
 import com.glxp.api.service.system.SystemParamConfigService;
 import com.glxp.api.util.CustomUtil;
 import com.glxp.api.util.DateUtil;
diff --git a/src/main/java/com/glxp/api/service/inout/IoCheckInoutService.java b/src/main/java/com/glxp/api/service/inout/IoCheckInoutService.java
index a2bb00fd..565a7066 100644
--- a/src/main/java/com/glxp/api/service/inout/IoCheckInoutService.java
+++ b/src/main/java/com/glxp/api/service/inout/IoCheckInoutService.java
@@ -22,6 +22,7 @@ import com.glxp.api.res.inout.IoOrderDetailBizResponse;
 import com.glxp.api.res.inout.IoOrderDetailCodeResponse;
 import com.glxp.api.service.auth.InvWarehouseService;
 import com.glxp.api.service.basic.IBasicBussinessTypeService;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import com.glxp.api.service.inout.impl.IoOrderInvoiceService;
 import com.glxp.api.service.inv.InvPreinDetailService;
 import com.glxp.api.service.inv.InvPreinOrderService;
@@ -283,6 +284,8 @@ public class IoCheckInoutService {
         if (curCount > bizEntity.getCount()) {
             return "当前产品数量超出!";
         }
+        if (bizEntity.getPrice() != null)
+            codeEntity.setPrice(bizEntity.getPrice());
         return null;
     }
 
@@ -307,6 +310,8 @@ public class IoCheckInoutService {
         if (curCount > bizEntity.getCount()) {
             return "当前产品数量超出!";
         }
+        if (bizEntity.getPrice() != null)
+            codeTempEntity.setPrice(bizEntity.getPrice());
         return null;
     }
 
@@ -415,6 +420,7 @@ public class IoCheckInoutService {
                         bizEntity.setCheckSuccess(true);
                         bizEntity.setScanCount(codeEntity.getReCount());
                         codeEntity.setCheckSuccess(true);
+                        codeEntity.setPrice(bizEntity.getPrice());
                     } else {
                         bizEntity.setScanCount(codeEntity.getReCount());
                         bizEntity.setCheckSuccess(false);
@@ -485,6 +491,8 @@ public class IoCheckInoutService {
                 BeanUtils.copyProperties(codeTempEntity, codeEnttity);
                 codeService.insert(codeEnttity);
             }
+            //更新扫码详情表
+            orderDetailCodeDao.updateBatchById(orderDetailCodeEntities);
             codeTempService.deleteByBillNo(orderEntity.getBillNo());
             orderEntity.setErrMsg("校验成功!");
             orderEntity.setStatus(ConstantStatus.ORDER_STATUS_CHECK_SUCCESS);
diff --git a/src/main/java/com/glxp/api/service/inout/IoCodeService.java b/src/main/java/com/glxp/api/service/inout/IoCodeService.java
deleted file mode 100644
index c04f895b..00000000
--- a/src/main/java/com/glxp/api/service/inout/IoCodeService.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.glxp.api.service.inout;
-
-import com.glxp.api.common.res.BaseResponse;
-import com.glxp.api.entity.inout.IoCodeEntity;
-import com.glxp.api.req.inout.FilterCodeRequest;
-import com.glxp.api.res.inout.IoCodeResponse;
-
-import java.util.List;
-
-public interface IoCodeService {
-
-    int insert(IoCodeEntity codeEnttity);
-
-    boolean insertBatch(List<IoCodeEntity> codeEnttities);
-
-    List<IoCodeEntity> findByOrderId(String billNo);
-
-    int updateById(IoCodeEntity codeEnttity);
-
-    int deleteById(Integer id);
-
-    public IoCodeEntity findByUnique(String orderId, String code);
-
-    List<IoCodeEntity> findByOrderIds(List<String> orderIds, String code);
-
-    int findByOrderIdsCount(List<String> orderIds, String code);
-
-
-    boolean isExitByRelId(String relId);
-
-    /**
-     * 查询正式码表实体数据
-     *
-     * @param filterCodeRequest
-     * @return
-     */
-    List<IoCodeEntity> filterCodeList(FilterCodeRequest filterCodeRequest);
-
-    /**
-     * 查询正式码表VO数据
-     */
-    List<IoCodeResponse> filterList(FilterCodeRequest filterCodeRequest);
-
-    /**
-     * 根据单号删除正式码表数据
-     *
-     * @param orderId
-     * @return
-     */
-    BaseResponse deleteCodeByOrderId(String orderId);
-
-    /**
-     * 查询单据编辑条码列表
-     *
-     * @param filterCodeRequest
-     * @return
-     */
-    List<IoCodeResponse> getCodeListForEdit(FilterCodeRequest filterCodeRequest);
-}
diff --git a/src/main/java/com/glxp/api/service/inout/IoGenInvService.java b/src/main/java/com/glxp/api/service/inout/IoGenInvService.java
index 0403f229..53452034 100644
--- a/src/main/java/com/glxp/api/service/inout/IoGenInvService.java
+++ b/src/main/java/com/glxp/api/service/inout/IoGenInvService.java
@@ -18,7 +18,9 @@ import com.glxp.api.entity.system.SystemParamConfigEntity;
 import com.glxp.api.service.auth.InvWarehouseService;
 import com.glxp.api.service.basic.IBasicBusTypePreService;
 import com.glxp.api.service.basic.IBasicBussinessTypeService;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import com.glxp.api.service.inv.*;
+import com.glxp.api.service.inv.impl.InvProductDetailService;
 import com.glxp.api.service.system.SystemParamConfigService;
 import com.glxp.api.util.CustomUtil;
 import com.glxp.api.util.DateUtil;
@@ -74,7 +76,7 @@ public class IoGenInvService {
 
         //生成库存产品表
         for (IoOrderDetailResultEntity orderDetailResultEntity : orderDetailResultEntities) {
-            InvProductEntity invProductEntity = invProductService.selectByUnique(orderDetailResultEntity.getBindRlFk(), orderDetailResultEntity.getBatchNo(), orderDetailResultEntity.getSupId(), orderEntity.getDeptCode(), orderEntity.getInvCode());
+            InvProductEntity invProductEntity = invProductService.selectByUnique(orderDetailResultEntity.getBindRlFk(), orderDetailResultEntity.getBatchNo(), orderDetailResultEntity.getSupId(), orderEntity.getDeptCode(), orderEntity.getInvCode(), orderDetailResultEntity.getPrice());
             if (invProductEntity == null) {
                 invProductEntity = new InvProductEntity();
                 invProductEntity.setRelIdFk(orderDetailResultEntity.getBindRlFk());
@@ -88,6 +90,7 @@ public class IoGenInvService {
                 invProductEntity.setDeptCode(orderEntity.getDeptCode());
                 invProductEntity.setInvCode(orderEntity.getInvCode());
                 invProductEntity.setCreateTime(new Date());
+                invProductEntity.setPrice(orderDetailResultEntity.getPrice());
                 invProductEntity.setUpdateTime(new Date());
                 invProductService.insert(invProductEntity);
             }
@@ -145,7 +148,7 @@ public class IoGenInvService {
 
         //生成库存产品表
         for (IoOrderDetailResultEntity orderDetailResultEntity : orderDetailResultEntities) {
-            InvPreProductEntity invPreProductEntity = invPreProductService.selectByUnique(orderDetailResultEntity.getBindRlFk(), orderDetailResultEntity.getBatchNo(), orderDetailResultEntity.getSupId(), orderEntity.getDeptCode(), orderEntity.getInvCode());
+            InvPreProductEntity invPreProductEntity = invPreProductService.selectByUnique(orderDetailResultEntity.getBindRlFk(), orderDetailResultEntity.getBatchNo(), orderDetailResultEntity.getSupId(), orderEntity.getDeptCode(), orderEntity.getInvCode(), orderDetailResultEntity.getPrice());
             if (invPreProductEntity == null) {
                 invPreProductEntity = new InvPreProductEntity();
                 invPreProductEntity.setRelIdFk(orderDetailResultEntity.getBindRlFk());
@@ -157,6 +160,7 @@ public class IoGenInvService {
                 invPreProductEntity.setOutCount(0);
                 invPreProductEntity.setSupId(orderDetailResultEntity.getSupId());
                 invPreProductEntity.setDeptCode(orderEntity.getDeptCode());
+                invPreProductEntity.setPrice(orderDetailResultEntity.getPrice());
                 invPreProductEntity.setInvCode(orderEntity.getInvCode());
                 invPreProductEntity.setCreateTime(new Date());
                 invPreProductEntity.setUpdateTime(new Date());
@@ -227,7 +231,7 @@ public class IoGenInvService {
         List<IoOrderDetailResultEntity> orderDetailResultEntities = orderDetailResultService.findByOrderId(orderId);
         //生成库存产品表
         for (IoOrderDetailResultEntity orderDetailResultEntity : orderDetailResultEntities) {
-            InvPreinProductEntity invProductEntity = invPreinProductService.selectByUnique(orderDetailResultEntity.getBindRlFk(), orderDetailResultEntity.getBatchNo(), orderDetailResultEntity.getSupId(), orderEntity.getDeptCode(), orderEntity.getInvCode());
+            InvPreinProductEntity invProductEntity = invPreinProductService.selectByUnique(orderDetailResultEntity.getBindRlFk(), orderDetailResultEntity.getBatchNo(), orderDetailResultEntity.getSupId(), orderEntity.getDeptCode(), orderEntity.getInvCode(), orderDetailResultEntity.getPrice());
             if (invProductEntity == null) {
                 invProductEntity = new InvPreinProductEntity();
                 invProductEntity.setRelIdFk(orderDetailResultEntity.getBindRlFk());
@@ -240,6 +244,7 @@ public class IoGenInvService {
                 invProductEntity.setSupId(orderDetailResultEntity.getSupId());
                 invProductEntity.setDeptCode(orderEntity.getDeptCode());
                 invProductEntity.setInvCode(orderEntity.getInvCode());
+                invProductEntity.setPrice(orderDetailResultEntity.getPrice());
                 invProductEntity.setCreateTime(new Date());
                 invProductEntity.setUpdateTime(new Date());
                 invPreinProductService.insert(invProductEntity);
diff --git a/src/main/java/com/glxp/api/service/inout/IoOrderDetailCodeService.java b/src/main/java/com/glxp/api/service/inout/IoOrderDetailCodeService.java
index d1294be9..c4d9c2f4 100644
--- a/src/main/java/com/glxp/api/service/inout/IoOrderDetailCodeService.java
+++ b/src/main/java/com/glxp/api/service/inout/IoOrderDetailCodeService.java
@@ -5,6 +5,7 @@ import com.glxp.api.entity.inout.IoOrderDetailCodeEntity;
 import com.glxp.api.req.inout.FilterOrderDetailCodeRequest;
 import com.glxp.api.res.inout.IoOrderDetailCodeResponse;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 public interface IoOrderDetailCodeService {
@@ -41,6 +42,10 @@ public interface IoOrderDetailCodeService {
 
     boolean isExit(String orderId);
 
+    boolean isExit(Long relId, String bacthNo, Long ignoreId, String orderId);
+
+    boolean isExit(Long relId, String uuid);
+
     /**
      * 扫码明细实体类数据转换VO类
      *
diff --git a/src/main/java/com/glxp/api/service/inout/impl/IoCodeServiceImpl.java b/src/main/java/com/glxp/api/service/inout/impl/IoCodeService.java
similarity index 93%
rename from src/main/java/com/glxp/api/service/inout/impl/IoCodeServiceImpl.java
rename to src/main/java/com/glxp/api/service/inout/impl/IoCodeService.java
index 023b4e6f..49c9cf26 100644
--- a/src/main/java/com/glxp/api/service/inout/impl/IoCodeServiceImpl.java
+++ b/src/main/java/com/glxp/api/service/inout/impl/IoCodeService.java
@@ -4,6 +4,7 @@ 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.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
 import com.glxp.api.common.enums.ResultEnum;
 import com.glxp.api.common.res.BaseResponse;
@@ -16,7 +17,6 @@ import com.glxp.api.entity.inout.IoOrderEntity;
 import com.glxp.api.req.inout.FilterCodeRequest;
 import com.glxp.api.res.inout.IoCodeResponse;
 import com.glxp.api.res.inout.IoCodeTempResponse;
-import com.glxp.api.service.inout.IoCodeService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -27,7 +27,7 @@ import java.util.List;
 
 @Service
 @Transactional(rollbackFor = Exception.class)
-public class IoCodeServiceImpl implements IoCodeService {
+public class IoCodeService extends ServiceImpl<IoCodeDao, IoCodeEntity> {
 
     @Resource
     private IoCodeDao ioCodeDao;
@@ -36,38 +36,38 @@ public class IoCodeServiceImpl implements IoCodeService {
     @Resource
     private IoCodeTempDao ioCodeTempDao;
 
-    @Override
+
     public int insert(IoCodeEntity codeEnttity) {
         codeEnttity.setId(null);
         return ioCodeDao.insert(codeEnttity);
     }
 
-    @Override
+
     public boolean insertBatch(List<IoCodeEntity> codeEnttities) {
         return ioCodeDao.insertBatch(codeEnttities);
     }
 
-    @Override
+
     public List<IoCodeEntity> findByOrderId(String billNo) {
         return ioCodeDao.selectList(new QueryWrapper<IoCodeEntity>().eq("orderId", billNo));
     }
 
-    @Override
-    public int updateById(IoCodeEntity codeEnttity) {
-        return ioCodeDao.updateById(codeEnttity);
+
+    public boolean updateById(IoCodeEntity codeEnttity) {
+        return ioCodeDao.updateById(codeEnttity) > 0;
     }
 
-    @Override
+
     public int deleteById(Integer id) {
         return ioCodeDao.deleteById(id);
     }
 
-    @Override
+
     public IoCodeEntity findByUnique(String orderId, String code) {
         return ioCodeDao.selectOne(new QueryWrapper<IoCodeEntity>().eq("orderId", orderId).eq("code", code));
     }
 
-    @Override
+
     public List<IoCodeEntity> findByOrderIds(List<String> orderIds, String code) {
 
         if (StrUtil.isNotEmpty(code))
@@ -77,7 +77,7 @@ public class IoCodeServiceImpl implements IoCodeService {
         }
     }
 
-    @Override
+
     public int findByOrderIdsCount(List<String> orderIds, String code) {
         List<IoCodeEntity> codeEntities = findByOrderIds(orderIds, code);
         if (CollUtil.isNotEmpty(codeEntities)) {
@@ -91,13 +91,13 @@ public class IoCodeServiceImpl implements IoCodeService {
         return 0;
     }
 
-    @Override
+
     public boolean isExitByRelId(String relId) {
 //        return ioCodeDao.selectList(new QueryWrapper<IoCodeEntity>().eq("relId", relId).last("limit 1"));
         return ioCodeDao.exists(new QueryWrapper<IoCodeEntity>().eq("relId", relId));
     }
 
-    @Override
+
     public List<IoCodeEntity> filterCodeList(FilterCodeRequest filterCodeRequest) {
         if (null == filterCodeRequest) {
             return Collections.emptyList();
@@ -108,7 +108,7 @@ public class IoCodeServiceImpl implements IoCodeService {
         return ioCodeDao.filterCodeList(filterCodeRequest);
     }
 
-    @Override
+
     public List<IoCodeResponse> filterList(FilterCodeRequest filterCodeRequest) {
         if (null == filterCodeRequest) {
             return Collections.emptyList();
@@ -119,7 +119,7 @@ public class IoCodeServiceImpl implements IoCodeService {
         return ioCodeDao.filterList(filterCodeRequest);
     }
 
-    @Override
+
     public BaseResponse deleteCodeByOrderId(String orderId) {
         if (StrUtil.isBlank(orderId)) {
             return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "单据号不能为空");
@@ -128,7 +128,7 @@ public class IoCodeServiceImpl implements IoCodeService {
         return ResultVOUtils.success("删除成功");
     }
 
-    @Override
+
     public List<IoCodeResponse> getCodeListForEdit(FilterCodeRequest filterCodeRequest) {
         List<IoCodeResponse> ioCodeResponses = new ArrayList<>();
         //查询此单的数据
diff --git a/src/main/java/com/glxp/api/service/inout/impl/IoOrderDetailCodeServiceImpl.java b/src/main/java/com/glxp/api/service/inout/impl/IoOrderDetailCodeServiceImpl.java
index 79c06635..df0eeff4 100644
--- a/src/main/java/com/glxp/api/service/inout/impl/IoOrderDetailCodeServiceImpl.java
+++ b/src/main/java/com/glxp/api/service/inout/impl/IoOrderDetailCodeServiceImpl.java
@@ -49,6 +49,7 @@ public class IoOrderDetailCodeServiceImpl implements IoOrderDetailCodeService {
                 .isNull(StrUtil.isEmpty(bacthNo), "batchNo"));
     }
 
+
     @Override
     public Integer findByRelIdCount(String orderId, Long relId) {
         return ioOrderDetailCodeDao.findByRelIdCount(orderId, relId);
@@ -103,6 +104,19 @@ public class IoOrderDetailCodeServiceImpl implements IoOrderDetailCodeService {
         return ioOrderDetailCodeDao.exists(new QueryWrapper<IoOrderDetailCodeEntity>().eq("orderIdFk", orderId));
     }
 
+
+    @Override
+    public boolean isExit(Long relId, String bacthNo, Long ignoreId, String orderId) {
+        return ioOrderDetailCodeDao.exists(new QueryWrapper<IoOrderDetailCodeEntity>().eq("bindRlFk", relId).eq(StrUtil.isNotEmpty(bacthNo), "batchNo", bacthNo)
+                .isNull(StrUtil.isEmpty(bacthNo), "batchNo").eq("orderIdFk", orderId).ne("id", ignoreId));
+    }
+
+    @Override
+    public boolean isExit(Long relId, String uuid) {
+        return ioOrderDetailCodeDao.exists(new QueryWrapper<IoOrderDetailCodeEntity>().eq("bindRlFk", relId).eq("uuidFk", uuid));
+
+    }
+
     @Override
     public List<IoOrderDetailCodeResponse> getDetailCodeResponse(List<IoOrderDetailCodeEntity> orderEntityList) {
         if (CollUtil.isEmpty(orderEntityList)) {
diff --git a/src/main/java/com/glxp/api/service/inout/impl/IoOrderServiceImpl.java b/src/main/java/com/glxp/api/service/inout/impl/IoOrderServiceImpl.java
index 48f66d84..02f697f2 100644
--- a/src/main/java/com/glxp/api/service/inout/impl/IoOrderServiceImpl.java
+++ b/src/main/java/com/glxp/api/service/inout/impl/IoOrderServiceImpl.java
@@ -39,6 +39,7 @@ import com.glxp.api.res.inout.OrderNoResult;
 import com.glxp.api.service.basic.IBasicBussinessTypeService;
 import com.glxp.api.service.inout.*;
 import com.glxp.api.service.inv.*;
+import com.glxp.api.service.inv.impl.InvProductDetailService;
 import com.glxp.api.service.system.SyncUploadDataBustypeService;
 import com.glxp.api.util.DateUtil;
 import com.glxp.api.util.IntUtil;
@@ -209,7 +210,8 @@ public class IoOrderServiceImpl implements IoOrderService {
                     if (CollUtil.isNotEmpty(invProductDetailEntities)) {
                         for (InvPreInProductDetailEntity invProductDetailEntity : invProductDetailEntities) {
                             //更新库存
-                            InvPreinProductEntity invProductEntity = invPreinProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(), invProductDetailEntity.getSupId(), invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode());
+                            InvPreinProductEntity invProductEntity = invPreinProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(), invProductDetailEntity.getSupId(),
+                                    invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode(), invProductDetailEntity.getPrice());
                             if (invProductEntity != null) {
                                 if (ConstantType.TYPE_PUT.equals(invProductDetailEntity.getMainAction())) {
                                     int count = invProductEntity.getInCount() - invProductDetailEntity.getReCount();
@@ -233,7 +235,8 @@ public class IoOrderServiceImpl implements IoOrderService {
                     if (CollUtil.isNotEmpty(invProductDetailEntities)) {
                         for (InvPreProductDetailEntity invProductDetailEntity : invProductDetailEntities) {
                             //更新库存
-                            InvPreProductEntity invProductEntity = invPreProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(), invProductDetailEntity.getSupId(), invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode());
+                            InvPreProductEntity invProductEntity = invPreProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(),
+                                    invProductDetailEntity.getSupId(), invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode(), invProductDetailEntity.getPrice());
                             if (invProductEntity != null) {
                                 if (ConstantType.TYPE_PUT.equals(invProductDetailEntity.getMainAction())) {
                                     int count = invProductEntity.getInCount() - invProductDetailEntity.getReCount();
@@ -258,7 +261,7 @@ public class IoOrderServiceImpl implements IoOrderService {
                     if (CollUtil.isNotEmpty(invProductDetailEntities)) {
                         for (InvProductDetailEntity invProductDetailEntity : invProductDetailEntities) {
                             //更新库存
-                            InvProductEntity invProductEntity = invProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(), invProductDetailEntity.getSupId(), invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode());
+                            InvProductEntity invProductEntity = invProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(), invProductDetailEntity.getSupId(), invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode(), invProductDetailEntity.getPrice());
                             if (invProductEntity != null) {
                                 if (ConstantType.TYPE_PUT.equals(invProductDetailEntity.getMainAction())) {
                                     int count = invProductEntity.getInCount() - invProductDetailEntity.getReCount();
@@ -333,7 +336,7 @@ public class IoOrderServiceImpl implements IoOrderService {
                 //预验收库存
                 if (basicBussinessTypeEntity.getActionType() == ConstantStatus.ACTION_TYPE_PREIN) {
 
-                    InvPreInProductDetailEntity invProductDetailEntity = invPreinProductDetailService.selectByCode(billNo, code);
+                    InvPreInProductDetailEntity invProductDetailEntity = invPreinProductDetailService.selectByCode(billNo, code, ioCodeEntity.getPrice());
                     int count = invProductDetailEntity.getCount() - 1;
                     if (count == 0) {
                         invPreinProductDetailService.deleteById(invProductDetailEntity.getId() + "");
@@ -345,7 +348,7 @@ public class IoOrderServiceImpl implements IoOrderService {
                         invPreinProductDetailService.update(invProductDetailEntity);
                     }
                     //更新产品表
-                    InvPreinProductEntity invProductEntity = invPreinProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(), invProductDetailEntity.getSupId(), invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode());
+                    InvPreinProductEntity invProductEntity = invPreinProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(), invProductDetailEntity.getSupId(), invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode(), invProductDetailEntity.getPrice());
                     if (invProductEntity != null) {
                         if (ConstantType.TYPE_PUT.equals(invProductDetailEntity.getMainAction())) {
                             int inCount = invProductEntity.getInCount() - invProductDetailEntity.getReCount();
@@ -371,7 +374,7 @@ public class IoOrderServiceImpl implements IoOrderService {
                         invPreProductDetailService.update(invProductDetailEntity);
                     }
                     //更新产品表
-                    InvPreProductEntity invProductEntity = invPreProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(), invProductDetailEntity.getSupId(), invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode());
+                    InvPreProductEntity invProductEntity = invPreProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(), invProductDetailEntity.getSupId(), invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode(), invProductDetailEntity.getPrice());
                     if (invProductEntity != null) {
                         if (ConstantType.TYPE_PUT.equals(invProductDetailEntity.getMainAction())) {
                             int inCount = invProductEntity.getInCount() - invProductDetailEntity.getReCount();
@@ -451,7 +454,7 @@ public class IoOrderServiceImpl implements IoOrderService {
             if (CollUtil.isNotEmpty(invProductDetailEntities)) {
                 for (InvPreInProductDetailEntity invProductDetailEntity : invProductDetailEntities) {
                     InvPreinProductEntity invProductEntity = invPreinProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(), invProductDetailEntity.getSupId(),
-                            invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode());
+                            invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode(), invProductDetailEntity.getPrice());
 
                     if (ConstantType.TYPE_PUT.equals(invProductDetailEntity.getMainAction())) {
                         int count = invProductEntity.getInCount() - invProductDetailEntity.getReCount();
@@ -470,7 +473,7 @@ public class IoOrderServiceImpl implements IoOrderService {
             if (CollUtil.isNotEmpty(invProductDetailEntities)) {
                 for (InvPreProductDetailEntity invProductDetailEntity : invProductDetailEntities) {
                     InvPreProductEntity invProductEntity = invPreProductService.selectByUnique(invProductDetailEntity.getRelId(), invProductDetailEntity.getBatchNo(), invProductDetailEntity.getSupId(),
-                            invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode());
+                            invProductDetailEntity.getDeptCode(), invProductDetailEntity.getInvCode(), invProductDetailEntity.getPrice());
 
                     if (ConstantType.TYPE_PUT.equals(invProductDetailEntity.getMainAction())) {
                         int count = invProductEntity.getInCount() - invProductDetailEntity.getReCount();
diff --git a/src/main/java/com/glxp/api/service/inv/InvPreProductDetailService.java b/src/main/java/com/glxp/api/service/inv/InvPreProductDetailService.java
index 258f161e..90a63624 100644
--- a/src/main/java/com/glxp/api/service/inv/InvPreProductDetailService.java
+++ b/src/main/java/com/glxp/api/service/inv/InvPreProductDetailService.java
@@ -7,6 +7,7 @@ import com.glxp.api.req.inv.FilterInvPreProductDetailRequest;
 import com.glxp.api.req.inv.FilterInvProductDetailRequest;
 import com.glxp.api.res.inv.InvPreProductDetailResponse;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -20,6 +21,8 @@ public interface InvPreProductDetailService {
 
     List<InvPreProductDetailEntity> selectByOrderIdFk(String billNo);
 
+    InvPreProductDetailEntity selectByCode(String billNo, String code, BigDecimal price);
+
     InvPreProductDetailEntity selectByCode(String billNo, String code);
 
     boolean update(InvPreProductDetailEntity invPreProductDetailEntity);
diff --git a/src/main/java/com/glxp/api/service/inv/InvPreProductService.java b/src/main/java/com/glxp/api/service/inv/InvPreProductService.java
index 8db3bcdc..645a4ace 100644
--- a/src/main/java/com/glxp/api/service/inv/InvPreProductService.java
+++ b/src/main/java/com/glxp/api/service/inv/InvPreProductService.java
@@ -6,6 +6,7 @@ import com.glxp.api.entity.inv.InvProductEntity;
 import com.glxp.api.req.inv.FilterInvPreProductRequest;
 import com.glxp.api.res.inv.InvPreProductResponse;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -18,7 +19,7 @@ public interface InvPreProductService {
 
     boolean update(InvPreProductEntity invPreProductEntity);
 
-    InvPreProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode);
+    InvPreProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode, BigDecimal price);
 
     boolean deleteById(Integer id);
 
diff --git a/src/main/java/com/glxp/api/service/inv/InvPreinProductDetailService.java b/src/main/java/com/glxp/api/service/inv/InvPreinProductDetailService.java
index ecf3dc25..4187ad99 100644
--- a/src/main/java/com/glxp/api/service/inv/InvPreinProductDetailService.java
+++ b/src/main/java/com/glxp/api/service/inv/InvPreinProductDetailService.java
@@ -7,6 +7,7 @@ import com.glxp.api.req.inv.FilterInvPreProductDetailRequest;
 import com.glxp.api.req.inv.FilterInvProductDetailRequest;
 import com.glxp.api.res.inv.InvPreProductDetailResponse;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -22,7 +23,7 @@ public interface InvPreinProductDetailService {
 
     List<InvPreInProductDetailEntity> findByCode(String code);
 
-    InvPreInProductDetailEntity selectByCode(String billNo, String code);
+    InvPreInProductDetailEntity selectByCode(String billNo, String code, BigDecimal price);
 
     boolean update(InvPreInProductDetailEntity invPreInProductDetailEntity);
 
@@ -55,4 +56,6 @@ public interface InvPreinProductDetailService {
     int findCountByCode(String code);
 
     InvPreInProductDetailEntity findUseOneByCode(String code);
+
+
 }
diff --git a/src/main/java/com/glxp/api/service/inv/InvPreinProductService.java b/src/main/java/com/glxp/api/service/inv/InvPreinProductService.java
index 70d71cc5..b65ace80 100644
--- a/src/main/java/com/glxp/api/service/inv/InvPreinProductService.java
+++ b/src/main/java/com/glxp/api/service/inv/InvPreinProductService.java
@@ -5,6 +5,7 @@ import com.glxp.api.req.inv.FilterInvPreinDetailRequest;
 import com.glxp.api.req.inv.FilterInvPreinProductRequest;
 import com.glxp.api.res.inv.InvPreinProductResponse;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -17,7 +18,7 @@ public interface InvPreinProductService {
 
     boolean update(InvPreinProductEntity invPreinProductEntity);
 
-    InvPreinProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode);
+    InvPreinProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode, BigDecimal price);
 
     boolean deleteById(Integer id);
 
diff --git a/src/main/java/com/glxp/api/service/inv/InvProductDetailService.java b/src/main/java/com/glxp/api/service/inv/InvProductDetailService.java
deleted file mode 100644
index da1b00c4..00000000
--- a/src/main/java/com/glxp/api/service/inv/InvProductDetailService.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.glxp.api.service.inv;
-
-import com.glxp.api.entity.inv.InvPreinDetailEntity;
-import com.glxp.api.entity.inv.InvProductDetailEntity;
-import com.glxp.api.req.inv.FilterInvProductDetailRequest;
-import com.glxp.api.res.inv.InvProductDetailResponse;
-
-import java.util.List;
-
-public interface InvProductDetailService {
-
-    int insert(InvProductDetailEntity invProductDetailEntity);
-
-
-    List<InvProductDetailEntity> selectByOrderIdFk(String billNo);
-
-
-    InvProductDetailEntity selectByCode(String billNo, String code);
-
-    int deleteByOrderId(String billNo);
-
-    int deleteById(Integer id);
-
-    int update(InvProductDetailEntity invProductDetailEntity);
-
-    List<InvProductDetailEntity> selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode);
-
-    InvProductDetailEntity sortFindByCode(String code);
-
-    boolean insertList(List<InvProductDetailEntity> invProductDetailEntities);
-
-    /**
-     * 查询库存详情列表
-     *
-     * @param filterInvProductDetailRequest
-     * @return
-     */
-    List<InvProductDetailEntity> filterInvProductDetailList(FilterInvProductDetailRequest filterInvProductDetailRequest);
-
-    boolean deleteInvProductDetail(FilterInvProductDetailRequest detailRequest);
-
-    /**
-     * 库存详情封装单据相关信息
-     *
-     * @param response
-     */
-    void setOrderInfo(InvProductDetailResponse response);
-
-
-    int vailStockCount(Long relId, String batchNo, String supId, String deptCode, String invCode, String invSpaceCode);
-
-
-}
diff --git a/src/main/java/com/glxp/api/service/inv/InvProductService.java b/src/main/java/com/glxp/api/service/inv/InvProductService.java
index 7c137d80..428aae1d 100644
--- a/src/main/java/com/glxp/api/service/inv/InvProductService.java
+++ b/src/main/java/com/glxp/api/service/inv/InvProductService.java
@@ -4,6 +4,7 @@ import com.glxp.api.entity.inv.InvProductEntity;
 import com.glxp.api.req.inv.FilterInvProductRequest;
 import com.glxp.api.res.inv.InvProductResponse;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 public interface InvProductService {
@@ -15,6 +16,9 @@ public interface InvProductService {
 
     boolean updateBatch(List<InvProductEntity> invProductEntities);
 
+    InvProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode, BigDecimal price);
+
+
     InvProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode);
 
     /**
diff --git a/src/main/java/com/glxp/api/service/inv/impl/InvPreInProductDetailServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InvPreInProductDetailServiceImpl.java
index c24e0462..7692761c 100644
--- a/src/main/java/com/glxp/api/service/inv/impl/InvPreInProductDetailServiceImpl.java
+++ b/src/main/java/com/glxp/api/service/inv/impl/InvPreInProductDetailServiceImpl.java
@@ -27,6 +27,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
 
@@ -74,9 +75,9 @@ public class InvPreInProductDetailServiceImpl implements InvPreinProductDetailSe
     }
 
     @Override
-    public InvPreInProductDetailEntity selectByCode(String billNo, String code) {
+    public InvPreInProductDetailEntity selectByCode(String billNo, String code, BigDecimal price) {
         List<InvPreInProductDetailEntity> invProductDetailEntities = invPreInProductDetailDao.selectList
-                (new QueryWrapper<InvPreInProductDetailEntity>().eq("code", code).eq("orderId", billNo));
+                (new QueryWrapper<InvPreInProductDetailEntity>().eq("code", code).eq("orderId", billNo).eq(price != null, "price", price));
         if (CollUtil.isNotEmpty(invProductDetailEntities))
             return invProductDetailEntities.get(0);
         else
@@ -143,7 +144,7 @@ public class InvPreInProductDetailServiceImpl implements InvPreinProductDetailSe
         response.setActionName(busType.getName());
         //设置单据日期
         IoOrderEntity order = orderDao.selectOne(new QueryWrapper<IoOrderEntity>().select("createTime").eq("billNo", response.getOrderId()));
-        if (order!=null){
+        if (order != null) {
             response.setOrderTime(DateUtil.toDateStr(order.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
         }
 
diff --git a/src/main/java/com/glxp/api/service/inv/impl/InvPreProductDetailServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InvPreProductDetailServiceImpl.java
index 3c949421..d6a4ba01 100644
--- a/src/main/java/com/glxp/api/service/inv/impl/InvPreProductDetailServiceImpl.java
+++ b/src/main/java/com/glxp/api/service/inv/impl/InvPreProductDetailServiceImpl.java
@@ -26,6 +26,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
 
@@ -66,6 +67,16 @@ public class InvPreProductDetailServiceImpl implements InvPreProductDetailServic
         return invProductDetailEntities;
     }
 
+    @Override
+    public InvPreProductDetailEntity selectByCode(String billNo, String code, BigDecimal price) {
+        List<InvPreProductDetailEntity> invProductDetailEntities = invPreProductDetailDao.selectList
+                (new QueryWrapper<InvPreProductDetailEntity>().eq("code", code).eq("orderId", billNo).eq(price != null, "price", price));
+        if (CollUtil.isNotEmpty(invProductDetailEntities))
+            return invProductDetailEntities.get(0);
+        else
+            return null;
+    }
+
     @Override
     public InvPreProductDetailEntity selectByCode(String billNo, String code) {
         List<InvPreProductDetailEntity> invProductDetailEntities = invPreProductDetailDao.selectList
diff --git a/src/main/java/com/glxp/api/service/inv/impl/InvPreProductServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InvPreProductServiceImpl.java
index b4f6a5d9..2195504a 100644
--- a/src/main/java/com/glxp/api/service/inv/impl/InvPreProductServiceImpl.java
+++ b/src/main/java/com/glxp/api/service/inv/impl/InvPreProductServiceImpl.java
@@ -14,6 +14,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
 
@@ -36,9 +37,10 @@ public class InvPreProductServiceImpl implements InvPreProductService {
     }
 
     @Override
-    public InvPreProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode) {
+    public InvPreProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode, BigDecimal price) {
         return invPreProductDao.selectOne(new QueryWrapper<InvPreProductEntity>().eq("relIdFk", relId).eq(StrUtil.isNotEmpty(batchNo), "batchNo", batchNo)
-                .isNull(StrUtil.isEmpty(batchNo), "batchNo").eq("supId", supId).eq("deptCode", deptCode).eq("invCode", invCode));
+                .isNull(StrUtil.isEmpty(batchNo), "batchNo").eq("supId", supId).eq("deptCode", deptCode).eq("invCode", invCode)
+                .eq(price != null, "price", price).isNull(price == null, "price"));
 
     }
 
diff --git a/src/main/java/com/glxp/api/service/inv/impl/InvPreinProductServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InvPreinProductServiceImpl.java
index fa195182..8d94b456 100644
--- a/src/main/java/com/glxp/api/service/inv/impl/InvPreinProductServiceImpl.java
+++ b/src/main/java/com/glxp/api/service/inv/impl/InvPreinProductServiceImpl.java
@@ -13,6 +13,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
 
@@ -35,9 +36,10 @@ public class InvPreinProductServiceImpl implements InvPreinProductService {
     }
 
     @Override
-    public InvPreinProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode) {
+    public InvPreinProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode, BigDecimal price) {
         return invPreinProductDao.selectOne(new QueryWrapper<InvPreinProductEntity>().eq("relIdFk", relId).eq(StrUtil.isNotEmpty(batchNo), "batchNo", batchNo)
-                .isNull(StrUtil.isEmpty(batchNo), "batchNo").eq("supId", supId).eq("deptCode", deptCode).eq("invCode", invCode));
+                .isNull(StrUtil.isEmpty(batchNo), "batchNo").eq("supId", supId).eq("deptCode", deptCode).eq("invCode", invCode)
+                .eq(price != null, "price", price).isNull(price == null, "price"));
 
     }
 
diff --git a/src/main/java/com/glxp/api/service/inv/impl/InvProductDetailServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InvProductDetailService.java
similarity index 95%
rename from src/main/java/com/glxp/api/service/inv/impl/InvProductDetailServiceImpl.java
rename to src/main/java/com/glxp/api/service/inv/impl/InvProductDetailService.java
index 96f13c11..f3398e98 100644
--- a/src/main/java/com/glxp/api/service/inv/impl/InvProductDetailServiceImpl.java
+++ b/src/main/java/com/glxp/api/service/inv/impl/InvProductDetailService.java
@@ -3,6 +3,7 @@ package com.glxp.api.service.inv.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
 import com.glxp.api.constant.ConstantType;
 import com.glxp.api.dao.basic.BasicBussinessTypeDao;
@@ -14,7 +15,6 @@ import com.glxp.api.entity.inout.IoOrderEntity;
 import com.glxp.api.entity.inv.InvProductDetailEntity;
 import com.glxp.api.req.inv.FilterInvProductDetailRequest;
 import com.glxp.api.res.inv.InvProductDetailResponse;
-import com.glxp.api.service.inv.InvProductDetailService;
 import com.glxp.api.util.DateUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -25,7 +25,7 @@ import java.util.List;
 
 @Service
 @Transactional(rollbackFor = Exception.class)
-public class InvProductDetailServiceImpl implements InvProductDetailService {
+public class InvProductDetailService extends ServiceImpl<InvProductDetailDao, InvProductDetailEntity> {
 
     @Resource
     private InvProductDetailDao invProductDetailDao;
@@ -37,7 +37,6 @@ public class InvProductDetailServiceImpl implements InvProductDetailService {
     private UdiProductDao udiProductDao;
 
 
-    @Override
     public int insert(InvProductDetailEntity invProductDetailEntity) {
         invProductDetailEntity.setId(null);
         if (invProductDetailEntity.getMainAction().equals(ConstantType.TYPE_PUT)) {
@@ -48,7 +47,7 @@ public class InvProductDetailServiceImpl implements InvProductDetailService {
         return invProductDetailDao.insert(invProductDetailEntity);
     }
 
-    @Override
+
     public List<InvProductDetailEntity> selectByOrderIdFk(String billNo) {
         if (StrUtil.isEmpty(billNo))
             return null;
@@ -56,7 +55,7 @@ public class InvProductDetailServiceImpl implements InvProductDetailService {
         return invProductDetailEntities;
     }
 
-    @Override
+
     public InvProductDetailEntity selectByCode(String billNo, String code) {
         List<InvProductDetailEntity> invProductDetailEntities = invProductDetailDao.selectList
                 (new QueryWrapper<InvProductDetailEntity>().eq("code", code).eq("orderId", billNo));
@@ -66,17 +65,17 @@ public class InvProductDetailServiceImpl implements InvProductDetailService {
             return null;
     }
 
-    @Override
+
     public int deleteByOrderId(String billNo) {
         return invProductDetailDao.delete(new QueryWrapper<InvProductDetailEntity>().eq("orderId", billNo));
     }
 
-    @Override
+
     public int deleteById(Integer id) {
         return invProductDetailDao.deleteById(id);
     }
 
-    @Override
+
     public int update(InvProductDetailEntity invProductDetailEntity) {
         if (invProductDetailEntity.getMainAction().equals(ConstantType.TYPE_PUT)) {
             invProductDetailEntity.setInCount(invProductDetailEntity.getReCount());
@@ -87,13 +86,13 @@ public class InvProductDetailServiceImpl implements InvProductDetailService {
         return invProductDetailDao.updateById(invProductDetailEntity);
     }
 
-    @Override
+
     public List<InvProductDetailEntity> selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode) {
         return invProductDetailDao.selectList(new QueryWrapper<InvProductDetailEntity>().eq("relId", relId).eq(StrUtil.isNotEmpty(batchNo), "batchNo", batchNo)
                 .isNull(StrUtil.isEmpty(batchNo), "batchNo").eq("supId", supId).eq("deptCode", deptCode).eq("invCode", invCode));
     }
 
-    @Override
+
     public InvProductDetailEntity sortFindByCode(String code) {
         List<InvProductDetailEntity> invProductDetailEntities = invProductDetailDao.selectList(new QueryWrapper<InvProductDetailEntity>().eq("code", code).orderByDesc("id"));
         if (CollUtil.isNotEmpty(invProductDetailEntities))
@@ -102,12 +101,12 @@ public class InvProductDetailServiceImpl implements InvProductDetailService {
             return null;
     }
 
-    @Override
+
     public boolean insertList(List<InvProductDetailEntity> invProductDetailEntities) {
         return invProductDetailDao.insertBatch(invProductDetailEntities);
     }
 
-    @Override
+
     public List<InvProductDetailEntity> filterInvProductDetailList(FilterInvProductDetailRequest filterInvProductDetailRequest) {
         if (null == filterInvProductDetailRequest) {
             return Collections.emptyList();
@@ -118,12 +117,12 @@ public class InvProductDetailServiceImpl implements InvProductDetailService {
         return invProductDetailDao.filterInvProductDetailList(filterInvProductDetailRequest);
     }
 
-    @Override
+
     public boolean deleteInvProductDetail(FilterInvProductDetailRequest detailRequest) {
         return invProductDetailDao.deleteInvProductDetail(detailRequest);
     }
 
-    @Override
+
     public void setOrderInfo(InvProductDetailResponse response) {
         //查询DI层级,根据DI层级设置数量取值
         Integer packLevel = udiProductDao.selectPackLevel(response.getNameCode());
@@ -150,15 +149,14 @@ public class InvProductDetailServiceImpl implements InvProductDetailService {
 
         //设置单据类型名称
         BasicBussinessTypeEntity busType = bussinessTypeDao.selectOne(new QueryWrapper<BasicBussinessTypeEntity>().select("name").eq("action", response.getAction()));
-       if(busType!=null)
-        response.setActionName(busType.getName());
+        if (busType != null)
+            response.setActionName(busType.getName());
         //设置单据日期
         IoOrderEntity order = orderDao.selectOne(new QueryWrapper<IoOrderEntity>().select("createTime").eq("billNo", response.getOrderId()));
         response.setOrderTime(DateUtil.toDateStr(order.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
     }
 
 
-    @Override
     public int vailStockCount(Long relId, String batchNo, String supId, String deptCode, String invCode, String invSpaceCode) {
         if (relId == null) {
             return 0;
diff --git a/src/main/java/com/glxp/api/service/inv/impl/InvProductServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InvProductServiceImpl.java
index 87da4e0a..2c8386ac 100644
--- a/src/main/java/com/glxp/api/service/inv/impl/InvProductServiceImpl.java
+++ b/src/main/java/com/glxp/api/service/inv/impl/InvProductServiceImpl.java
@@ -12,6 +12,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
 
@@ -38,6 +39,17 @@ public class InvProductServiceImpl implements InvProductService {
         return invProductDao.updateBatchById(invProductEntities);
     }
 
+    @Override
+    public InvProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode, BigDecimal price) {
+        return invProductDao.selectOne(new QueryWrapper<InvProductEntity>().eq("relIdFk", relId)
+                .eq(StrUtil.isNotEmpty(batchNo), "batchNo", batchNo).isNull(StrUtil.isEmpty(batchNo), "batchNo")
+                .eq("supId", supId)
+                .eq("deptCode", deptCode)
+                .eq("invCode", invCode)
+                .eq(price != null, "price", price).isNull(price == null, "price")
+        );
+    }
+
     @Override
     public InvProductEntity selectByUnique(Long relId, String batchNo, String supId, String deptCode, String invCode) {
         return invProductDao.selectOne(new QueryWrapper<InvProductEntity>().eq("relIdFk", relId).eq(StrUtil.isNotEmpty(batchNo), "batchNo", batchNo)
diff --git a/src/main/java/com/glxp/api/service/sync/SpsSyncDownloadService.java b/src/main/java/com/glxp/api/service/sync/SpsSyncDownloadService.java
index 9cf9da1e..c91c2f0f 100644
--- a/src/main/java/com/glxp/api/service/sync/SpsSyncDownloadService.java
+++ b/src/main/java/com/glxp/api/service/sync/SpsSyncDownloadService.java
@@ -33,6 +33,7 @@ import com.glxp.api.res.sync.SpsSyncOrderResponse;
 import com.glxp.api.res.system.SyncDataSetResponse;
 import com.glxp.api.service.basic.*;
 import com.glxp.api.service.inout.*;
+import com.glxp.api.service.inout.impl.IoCodeService;
 import com.glxp.api.service.inout.impl.IoOrderInvoiceService;
 import com.glxp.api.service.inv.DeviceInspectTaskDetailService;
 import com.glxp.api.service.inv.DeviceInspectTaskService;
diff --git a/src/main/resources/mybatis/mapper/basic/UdiRelevanceDao.xml b/src/main/resources/mybatis/mapper/basic/UdiRelevanceDao.xml
index b7ae2b3f..fdb9a8a9 100644
--- a/src/main/resources/mybatis/mapper/basic/UdiRelevanceDao.xml
+++ b/src/main/resources/mybatis/mapper/basic/UdiRelevanceDao.xml
@@ -1142,7 +1142,7 @@
 
     <select id="batchSelectByUuid" resultType="com.glxp.api.entity.basic.UdiRelevanceEntity">
         select *
-        from basic_udirel where uuid in
+        from basic_products where basic_products.deviceRecordKey in
         <foreach collection="uuids" item="item" index="index" separator="," open="(" close=")">
             #{item}
         </foreach>
diff --git a/src/main/resources/mybatis/mapper/inv/invProductDao.xml b/src/main/resources/mybatis/mapper/inv/invProductDao.xml
index ce1911a6..e2db5142 100644
--- a/src/main/resources/mybatis/mapper/inv/invProductDao.xml
+++ b/src/main/resources/mybatis/mapper/inv/invProductDao.xml
@@ -26,7 +26,8 @@
                auth_warehouse.name invName,
                ip.deptCode,
                ip.invCode,
-               s.name             spaceName
+               s.name              spaceName,
+               ip.price
         from inv_product ip
                      inner join basic_udirel on ip.relIdFk = basic_udirel.id
                      inner join basic_products bp on basic_udirel.uuid = bp.uuid
@@ -85,7 +86,7 @@
                 </foreach>
             </if>
         </where>
-        GROUP BY ip.relIdFk, ip.batchNo, ip.supId
+        GROUP BY ip.relIdFk, ip.batchNo, ip.supId, ip.price
         order by ip.updateTime desc
     </select>
 
diff --git a/src/main/resources/schemas/schema_v2.3.sql b/src/main/resources/schemas/schema_v2.3.sql
index 64970840..2f6f98c1 100644
--- a/src/main/resources/schemas/schema_v2.3.sql
+++ b/src/main/resources/schemas/schema_v2.3.sql
@@ -601,3 +601,23 @@ INSERT ignore INTO `auth_menu`(`menu_id`, `menu_name`, `parent_id`, `order_num`,
 VALUES (2004, '任务管理', 1703, 5, 'taskManage', NULL, NULL, 1, 0, 'M', '0', '0', NULL, NULL, '超级用户', '2023-08-18 14:40:53',
         NULL, NULL, NULL);
 CALL Pro_Temp_ColumnWork('basic_bussiness_type', 'editType', 'tinyint', 1);
+
+
+CALL Pro_Temp_ColumnWork('io_code', 'price', 'decimal(10, 3)', 1);
+CALL Pro_Temp_ColumnWork('io_code_temp', 'price', 'decimal(10, 3)', 1);
+CALL Pro_Temp_ColumnWork('inv_prein_product', 'price', 'decimal(10, 3)', 1);
+CALL Pro_Temp_ColumnWork('inv_product', 'price', 'decimal(10, 3)', 1);
+CALL Pro_Temp_ColumnWork('inv_pre_product', 'price', 'decimal(10, 3)', 1);
+CALL Pro_Temp_ColumnWork('inv_product_detail', 'price', 'decimal(10, 3)', 1);
+CALL Pro_Temp_ColumnWork('inv_prein_product_detail', 'price', 'decimal(10, 3)', 1);
+CALL Pro_Temp_ColumnWork('inv_pre_product_detail', 'price', 'decimal(10, 3)', 1);
+
+
+CALL Pro_Temp_ColumnWork('io_code', 'inBatchNo', 'varchar(255)', 1);
+CALL Pro_Temp_ColumnWork('io_code_temp', 'inBatchNo', 'varchar(255)', 1);
+CALL Pro_Temp_ColumnWork('inv_product_detail', 'inBatchNo', 'varchar(255)', 1);
+CALL Pro_Temp_ColumnWork('inv_prein_product_detail', 'inBatchNo', 'varchar(255)', 1);
+CALL Pro_Temp_ColumnWork('inv_pre_product_detail', 'inBatchNo', 'varchar(255)', 1);
+INSERT ignore INTO `sys_param_config`(`id`, `parentId`, `paramName`, `paramKey`, `paramValue`, `paramStatus`,
+                                      `paramType`, `paramExplain`, `updateTime`)
+VALUES (20078, 0, '是否启用价格先进先出策略', 'price_fifo', '1', 1, 0, '0:否;1:是', '2023-10-10 10:10:08');