소스 검색

增加新的批次序列号

wwh 1 주 전
부모
커밋
4a0a05b7bf

+ 8 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDistribution.java

@@ -3,8 +3,12 @@ package com.ruoyi.web.v2.v1.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.deser.std.NumberDeserializers;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -85,4 +89,7 @@ public class JsDistribution implements Serializable {
 
     private String unit;
 
+    @ApiModelProperty(value = "批次序列号集")
+    private String seriesNoGroup;
+
 }

+ 6 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDivideCircle.java

@@ -3,10 +3,13 @@ package com.ruoyi.web.v2.v1.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
 import java.io.Serializable;
 import java.util.Date;
 
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.deser.std.NumberDeserializers;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -69,6 +72,8 @@ public class JsDivideCircle implements Serializable {
     @ApiModelProperty(value = "批次id")
     private Integer entranceBatchId;
 
+    @ApiModelProperty(value = "批次序列号")
+    private String seriesNo;
 
 
 }

+ 4 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDrugCheck.java

@@ -3,8 +3,8 @@ package com.ruoyi.web.v2.v1.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
 import java.io.Serializable;
+
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -58,4 +58,7 @@ public class JsDrugCheck implements Serializable {
     @ApiModelProperty(value = "批次号")
     private Integer entranceBatchId;
 
+    @ApiModelProperty(value = "批次序列号集")
+    private String seriesNoGroup;
+
 }

+ 8 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsRestInspection.java

@@ -3,8 +3,12 @@ package com.ruoyi.web.v2.v1.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.deser.std.NumberDeserializers;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -54,4 +58,7 @@ public class JsRestInspection implements Serializable {
 
     @ApiModelProperty(value = "分圈id")
     private Integer divideCircleId;
+
+    @ApiModelProperty(value = "批次序列号")
+    private String seriesNo;
 }

+ 8 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsSample.java

@@ -3,8 +3,12 @@ package com.ruoyi.web.v2.v1.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.deser.std.NumberDeserializers;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -60,5 +64,8 @@ public class JsSample implements Serializable {
 
     private Integer entranceBatchId;
 
+    @ApiModelProperty(value = "批次序列号集")
+    private String seriesNoGroup;
+
 
 }

+ 36 - 7
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDistributionServiceImpl.java

@@ -2,10 +2,9 @@ package com.ruoyi.web.v2.v1.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.app.domain.EntranceBatch;
-import com.ruoyi.app.domain.Pigpen;
-import com.ruoyi.app.domain.ProductCategory;
 import com.ruoyi.app.domain.Purchaser;
 import com.ruoyi.app.mapper.EntranceBatchMapper;
 import com.ruoyi.app.mapper.PigpenMapper;
@@ -15,7 +14,6 @@ import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.uuid.UUID;
 import com.ruoyi.web.v2.v1.entity.*;
-import com.ruoyi.web.v2.v1.entity.vo.HarmlessVo;
 import com.ruoyi.web.v2.v1.entity.vo.ProductionVo;
 import com.ruoyi.web.v2.v1.mapper.*;
 import com.ruoyi.web.v2.v1.service.IJsDistributionService;
@@ -23,12 +21,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.web.v2.v1.utils.PaginationUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.Date;
-import java.util.List;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.ruoyi.common.core.domain.AjaxResult.success;
 
@@ -58,6 +56,7 @@ public class JsDistributionServiceImpl extends ServiceImpl<JsDistributionMapper,
     @Autowired
     private JsProduceCodeMapper produceCodeMapper;
 
+    @Transactional
     @Override
     public AjaxResult add(JsDistribution distribution) {
         Integer supplierId = distribution.getSupplierId();
@@ -79,10 +78,40 @@ public class JsDistributionServiceImpl extends ServiceImpl<JsDistributionMapper,
         jsProduceCode.setOneCode(shortUUID);
         distribution.setOneCode(shortUUID);
         produceCodeMapper.insert(jsProduceCode);
+        distribution.setSeriesNoGroup(genSeriesNoGroup(distribution));
         distributionMapper.insert(distribution);
         return success();
     }
 
+    private String genSeriesNoGroup(JsDistribution distribution) {
+        if(ObjectUtil.isNotEmpty(distribution.getSeriesNoGroup())) {
+            //如果提交的表单直接带有分圈后的批次序列号集,那么做一次存在性检测,检测成功直接采用,否则置空
+            String[] seriesNoGroup = distribution.getSeriesNoGroup().split(",");
+            List<JsDivideCircle> circles = circleMapper.selectList(
+                    Wrappers.<JsDivideCircle>lambdaQuery().in(JsDivideCircle::getSeriesNo, seriesNoGroup));
+            return circles.size() > 0 ? distribution.getSeriesNoGroup() : "";
+        }else {
+            //如果提交的表单未带有分圈的批次序列号,那么根据入场id或者检疫证号查分圈批次序列号集,进行设置
+            if(ObjectUtil.isNotEmpty(distribution.getEntranceBatchId())) {
+                //查询进场数据
+                EntranceBatch entranceBatch = entranceBatchMapper.selectEntranceBatchById(distribution.getEntranceBatchId().longValue());
+                //查询分圈数据
+                List<JsDivideCircle> circles = circleMapper.selectList(
+                        Wrappers.<JsDivideCircle>lambdaQuery()
+                                .eq(JsDivideCircle::getEntranceBatchId, distribution.getEntranceBatchId()));
+                if(entranceBatch != null && circles.size() > 0) {
+                    //返回本条生产数据关联的分圈批次序列号集合
+                    return circles.stream().map(
+                            item -> entranceBatch.getAnimalCertNo() +
+                                    item.getPigpenId() +
+                                    new SimpleDateFormat("yyyyMMdd").format(entranceBatch.getEntranceTime()))
+                            .collect(Collectors.joining(","));
+                }
+            }
+        }
+        return "";
+    }
+
     @Override
     public AjaxResult edit(JsDistribution distribution) {
         distributionMapper.updateById(distribution);

+ 22 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDivideCircleServiceImpl.java

@@ -17,7 +17,9 @@ import com.ruoyi.web.v2.v1.service.IJsDivideCircleService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 
@@ -44,6 +46,7 @@ public class JsDivideCircleServiceImpl extends ServiceImpl<JsDivideCircleMapper,
     @Autowired
     private EntranceBatchMapper entranceBatchMapper;
 
+    @Transactional
     @Override
     public AjaxResult add(JsDivideCircle divideCircle) {
         Pigpen pigpen = pigpenMapper.selectPigpenById(divideCircle.getPigpenId().longValue());
@@ -77,12 +80,31 @@ public class JsDivideCircleServiceImpl extends ServiceImpl<JsDivideCircleMapper,
             return error("该批次中所剩需分圈猪只不足");
         }
         divideCircle.setCreateTime(new Date());
+        divideCircle.setSeriesNo(
+                generateSeriesNo(animalCertNo, pigpen.getPigpenName(), entranceBatch.getEntranceTime()));
         jsDivideCircleMapper.insert(divideCircle);
         pigpen.setIsUse(1);
         pigpenMapper.updatePigpen(pigpen);
         return success();
     }
 
+    /**
+     * 批次序列号处理
+     */
+    private String generateSeriesNo(String animalCertNo, String pigpenName, Date entranceTime) {
+        try {
+            if(ObjectUtil.isNotEmpty(animalCertNo) && ObjectUtil.isNotEmpty(pigpenName) && entranceTime != null) {
+                StringBuilder strBuilder = new StringBuilder();
+                strBuilder.append(animalCertNo).append(pigpenName)
+                        .append(new SimpleDateFormat("yyyyMMdd").format(entranceTime));
+                return strBuilder.toString();
+            }
+        }catch (Exception e) {
+            log.error("生成批次序列号出现异常,异常详细是:{}", e);
+        }
+        return "";
+    }
+
     @Override
     public AjaxResult edit(JsDivideCircle divideCircle) {
         Pigpen pigpen = pigpenMapper.selectPigpenById(divideCircle.getPigpenId().longValue());

+ 6 - 5
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDrugCheckServiceImpl.java

@@ -8,7 +8,6 @@ import com.ruoyi.app.domain.EntranceBatch;
 import com.ruoyi.app.domain.HarmlessTreatment;
 import com.ruoyi.app.domain.Purchaser;
 import com.ruoyi.app.domain.Supplier;
-import com.ruoyi.app.domain.response.DrugCheckParam;
 import com.ruoyi.app.mapper.*;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
@@ -20,17 +19,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.web.v2.v1.utils.PaginationUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.math.BigDecimal;
 import java.text.DecimalFormat;
-import java.text.SimpleDateFormat;
-import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
 import static com.ruoyi.common.core.domain.AjaxResult.error;
 import static com.ruoyi.common.core.domain.AjaxResult.success;
-import static com.ruoyi.common.utils.PageUtils.startPage;
 
 /**
  * <p>
@@ -64,6 +60,7 @@ public class JsDrugCheckServiceImpl extends ServiceImpl<JsDrugCheckMapper, JsDru
     @Autowired
     private JsProduceCodeMapper produceCodeMapper;
 
+    @Transactional
     @Override
     public AjaxResult add(JsDrugCheck drugCheck) {
         EntranceBatch entranceBatch = entranceBatchMapper.selectEntranceBatchById(drugCheck.getEntranceBatchId().longValue());
@@ -80,6 +77,9 @@ public class JsDrugCheckServiceImpl extends ServiceImpl<JsDrugCheckMapper, JsDru
             queryWrapper1.select(" IFNULL(sum(deal_amount),'0') dealAmount");
             JsRestInspection restInspection = restInspectionMapper.selectOne(queryWrapper1);//静养病死病害数量
             dealAmount = restInspection.getDealAmount();
+            //新增加批次序列号字段,多个批次序列号使用逗号分割
+            drugCheck.setSeriesNoGroup(circles.stream().map(JsDivideCircle::getSeriesNo)
+                    .collect(Collectors.joining(",")));
         }
         int amount = entranceBatch.getAmount() - dealAmount -
                 harmlessTreatment.getIllnessDeadAmount() - harmlessTreatment.getIllnessDiseaseAmount()
@@ -91,6 +91,7 @@ public class JsDrugCheckServiceImpl extends ServiceImpl<JsDrugCheckMapper, JsDru
         return success();
     }
 
+    @Transactional
     @Override
     public AjaxResult edit(JsDrugCheck drugCheck) {
         EntranceBatch entranceBatch = entranceBatchMapper.selectEntranceBatchById(drugCheck.getEntranceBatchId().longValue());

+ 14 - 6
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsRestInspectionServiceImpl.java

@@ -14,11 +14,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.web.v2.v1.utils.UploadImage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.io.IOException;
-
-import static com.ruoyi.common.core.domain.AjaxResult.error;
 import static com.ruoyi.common.core.domain.AjaxResult.success;
 
 /**
@@ -41,11 +38,22 @@ public class JsRestInspectionServiceImpl extends ServiceImpl<JsRestInspectionMap
     @Autowired
     private PigpenMapper pigpenMapper;
 
+    @Transactional
     @Override
     public AjaxResult add(JsRestInspection jsRestInspection) {
-        restInspectionMapper.insert(jsRestInspection);
-        JsRestInspection restInspection = restInspectionMapper.selectOne(new QueryWrapper<JsRestInspection>().orderByDesc("id").last(" limit 1"));
         JsDivideCircle jsDivideCircle = divideCircleMapper.selectById(jsRestInspection.getDivideCircleId());
+        if(jsDivideCircle != null) {
+            jsRestInspection.setSeriesNo(jsDivideCircle.getSeriesNo() != null ? jsDivideCircle.getSeriesNo() : "");
+        }
+        restInspectionMapper.insert(jsRestInspection);
+        //JsRestInspection restInspection = restInspectionMapper.selectOne(new QueryWrapper<JsRestInspection>().orderByDesc("id").last(" limit 1"));
+        JsRestInspection restInspection;
+        if(jsRestInspection.getId() != null && jsRestInspection.getId() > 0) {
+            restInspection = restInspectionMapper.selectById(jsRestInspection.getId());
+        }else {
+            restInspection = restInspectionMapper.selectOne(new QueryWrapper<JsRestInspection>().orderByDesc("id").last(" limit 1"));
+        }
+
         if ("".equals(jsDivideCircle.getRestInspectionId()) || null == jsDivideCircle.getRestInspectionId()) {
             jsDivideCircle.setRestInspectionId(restInspection.getId().toString());
         } else {

+ 2 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsSampleServiceImpl.java

@@ -5,13 +5,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.web.v2.v1.entity.JsInstrumentMaintenance;
 import com.ruoyi.web.v2.v1.entity.JsSample;
 import com.ruoyi.web.v2.v1.mapper.JsSampleMapper;
 import com.ruoyi.web.v2.v1.service.IJsSampleService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -32,6 +32,7 @@ public class JsSampleServiceImpl extends ServiceImpl<JsSampleMapper, JsSample> i
     @Autowired
     private JsSampleMapper sampleMapper;
 
+    @Transactional
     @Override
     public AjaxResult add(JsSample sample) {
         JsSample jsSample = sampleMapper.selectOne(new QueryWrapper<JsSample>().orderByDesc("id").last(" limit 1"));

+ 19 - 0
app-system/src/main/java/com/ruoyi/app/domain/EntranceBatch.java

@@ -1,6 +1,9 @@
 package com.ruoyi.app.domain;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -145,6 +148,22 @@ public class EntranceBatch extends BaseEntity
         this.entranceTime = entranceTime;
     }
 
+    public void entranceTimeAdapter() {
+        if(entranceTime != null) {
+            LocalDateTime realTime = entranceTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+            if((realTime.getHour() == 0) && (realTime.getMinute() == 0) && (realTime.getSecond() == 0)) {
+                LocalTime nowTime = LocalTime.now();
+                realTime = realTime.withHour(nowTime.getHour())
+                        .withMinute(nowTime.getMinute())
+                        .minusSeconds(nowTime.getSecond())
+                        .withNano(nowTime.getNano());
+                entranceTime = Date.from(realTime.atZone(ZoneId.systemDefault()).toInstant());
+            }
+        }else {
+            this.entranceTime = new Date();
+        }
+    }
+
     @NotNull(message = "进场时间不能为空")
     public Date getEntranceTime() 
     {

+ 2 - 0
app-system/src/main/java/com/ruoyi/app/service/impl/EntranceBatchServiceImpl.java

@@ -97,6 +97,8 @@ public class EntranceBatchServiceImpl implements IEntranceBatchService {
     @Override
     public int insertEntranceBatch(EntranceBatch entranceBatch) {
         entranceBatch.setCreateTime(DateUtils.getNowDate());
+        //对入场时间进行适配,前端填报的入场时间只有日期,没有时分秒(时间被初始化为凌晨12点),那么自动设置当前系统的时分秒
+        entranceBatch.entranceTimeAdapter();
         return entranceBatchMapper.insertEntranceBatch(entranceBatch);
     }
 

+ 2 - 0
app-system/src/main/java/com/ruoyi/app/service/impl/ProductTraceServiceImpl.java

@@ -36,6 +36,7 @@ public class ProductTraceServiceImpl implements IProductTraceService {
      *@param productTraceParam 查询条件
      * @return 结果
      */
+    @Override
     public List<ProductTraceDTO> selectProductTrace(ProductTraceParam productTraceParam) {
         return entranceBatchMapper.selectProductTrace(productTraceParam).stream()
                 .map(item -> {
@@ -93,6 +94,7 @@ public class ProductTraceServiceImpl implements IProductTraceService {
      * @param  reqEntranceAndDistribute 入场和分销批次信息
      * @return 结果
      */
+    @Override
     public List<PorkProduceDTO> selectPorkProduceByBatch(ReqEntranceAndDistribute reqEntranceAndDistribute){
         return slaughterBatchMapper.selectPorkProduceByBatch(reqEntranceAndDistribute);
     }