浏览代码

盘点接口

廖泽勇 1 月之前
父节点
当前提交
d124fc3528

+ 1 - 1
src/main/java/com/jsh/erp/controller/pda/PdaController.java

@@ -122,7 +122,7 @@ public class PdaController extends BaseController {
         return getDataTable(list);
     }
 
-    @ApiModelProperty(value = "盘点任务详情-商品列表")
+    @ApiOperation(value = "盘点任务详情-商品列表")
     @GetMapping("/taskStocktakingItemList/{taskId}")
     public TableDataInfo taskStocktakingItemList(@PathVariable("taskId") Long taskId){
         startPage();

+ 14 - 1
src/main/java/com/jsh/erp/controller/stocktaking/StocktakingController.java

@@ -49,7 +49,10 @@ public class StocktakingController extends BaseController {
     @ApiOperation("新增盘点任务")
     @PostMapping("/add")
     public AjaxResult add(@RequestBody TaskStocktakingDTO taskStocktakingDTO) {
-        taskStocktakingService.add(taskStocktakingDTO);
+        boolean b = taskStocktakingService.add(taskStocktakingDTO);
+        if (!b){
+            return AjaxResult.error("创建失败,请联系系统管理员");
+        }
         return AjaxResult.success();
     }
 
@@ -82,6 +85,16 @@ public class StocktakingController extends BaseController {
         return AjaxResult.success(taskStocktakingService.listByTaskStocktakingId(taskStocktakingId));
     }
 
+    @ApiOperation("任务详情-修改")
+    @PostMapping("/detailUpdate")
+    public AjaxResult detailUpdate(@RequestBody TaskStocktakingDTO taskStocktakingDTO) {
+        boolean b = taskStocktakingService.detailUpdate(taskStocktakingDTO);
+        if (!b){
+            return AjaxResult.error("修改失败,请联系系统管理员");
+        }
+        return AjaxResult.success();
+    }
+
     /**
      * 任务详情-商品列表-编辑
      * @return

+ 1 - 2
src/main/java/com/jsh/erp/datasource/mappers/TaskStocktakingItemMapper.java

@@ -3,7 +3,6 @@ package com.jsh.erp.datasource.mappers;
 import com.jsh.erp.datasource.entities.TaskStocktakingItem;
 import com.jsh.erp.datasource.pda.vo.PDATaskStocktakingItemVO;
 import com.jsh.erp.datasource.vo.TaskStocktakingItemVO;
-import com.jsh.erp.datasource.vo.TaskStocktakingVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -12,6 +11,6 @@ public interface TaskStocktakingItemMapper extends BaseMapperX<TaskStocktakingIt
 
     List<TaskStocktakingItemVO> listByTaskStocktakingId(@Param("taskStocktakingId") Long taskStocktakingId);
 
-    List<PDATaskStocktakingItemVO> pdaList(@Param("number") Long taskId);
+    List<PDATaskStocktakingItemVO> pdaList(@Param("taskId") Long taskId);
 
 }

+ 27 - 0
src/main/java/com/jsh/erp/datasource/vo/TaskStocktakingItemVO.java

@@ -1,5 +1,6 @@
 package com.jsh.erp.datasource.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
@@ -20,6 +21,31 @@ public class TaskStocktakingItemVO {
     @ApiModelProperty("任务ID")
     private Long taskStocktakingId;
 
+    @ApiModelProperty("商品名称")
+    private String materialName;
+
+    @ApiModelProperty("系统编码")
+    private String systemSku;
+
+    @ApiModelProperty("商品单位")
+    private String commodityUnit;
+
+    @ApiModelProperty("生产日期")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date productionDate;
+
+    @ApiModelProperty("供应商名称")
+    private String supplierName;
+
+    @ApiModelProperty("商品编码")
+    private String barCode;
+
+    @ApiModelProperty("库存数量")
+    private String inventory;
+
+    @ApiModelProperty("仓库名称")
+    private String depotName;
+
     @ApiModelProperty("商品种类名称")
     private String categoryName;
 
@@ -30,6 +56,7 @@ public class TaskStocktakingItemVO {
     private Long creator;
 
     @ApiModelProperty("操作时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date operTime;
 
     @ApiModelProperty("新仓位货架")

+ 9 - 2
src/main/java/com/jsh/erp/datasource/vo/TaskStocktakingVO.java

@@ -5,8 +5,6 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
-import java.util.List;
-
 /**
  * 盘点任务
  */
@@ -26,4 +24,13 @@ public class TaskStocktakingVO extends TaskStocktaking {
     @ApiModelProperty("完成操作次数")
     private Long finishCount;
 
+    @ApiModelProperty("商品总数量")
+    private Long itemCount;
+
+    @ApiModelProperty("差异率")
+    private double differenceRate;
+
+    @ApiModelProperty("准确率")
+    private double accuracyRate;
+
 }

+ 13 - 0
src/main/java/com/jsh/erp/service/TaskStocktakingService.java

@@ -32,6 +32,13 @@ public interface TaskStocktakingService extends IService<TaskStocktaking> {
     TaskStocktakingVO detail(Long id) throws Exception;
 
     /**
+     * 任务详情-修改
+     * @param taskStocktakingDTO
+     * @return
+     */
+    boolean detailUpdate(TaskStocktakingDTO taskStocktakingDTO);
+
+    /**
      * 任务详情-商品明细
      * @param taskStocktakingId 盘点任务ID
      * @return
@@ -46,6 +53,12 @@ public interface TaskStocktakingService extends IService<TaskStocktaking> {
      */
     List<PDATaskStocktakingVO> pdaList(String number , Integer taskStatus);
 
+    /**
+     * PAD-盘点任务详情
+     * @param id 盘点任务ID
+     * @return
+     * @throws Exception
+     */
     TaskStocktakingVO pdaDetail(Long id) throws Exception;
 
     List<PDATaskStocktakingItemVO> pdaItemList(Long taskId);

+ 100 - 4
src/main/java/com/jsh/erp/service/impl/TaskStocktakingServiceImpl.java

@@ -3,6 +3,7 @@ package com.jsh.erp.service.impl;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jsh.erp.datasource.dto.TaskStocktakingDTO;
 import com.jsh.erp.datasource.entities.*;
@@ -23,6 +24,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
@@ -140,6 +142,74 @@ public class TaskStocktakingServiceImpl extends ServiceImpl<TaskStocktakingMappe
     }
 
     /**
+     * 任务详情-修改
+     * @param taskStocktakingDTO
+     * @return
+     */
+    @Override
+    public boolean detailUpdate(TaskStocktakingDTO taskStocktakingDTO) {
+        try {
+            List<String> collect;
+            List<MaterialExtend> materialExtendList;
+            //全盘,抽盘,处理任务明细
+            if (taskStocktakingDTO.getTaskType() == 1) {
+                materialExtendList = materialExtendMapper.selectList(new LambdaQueryWrapper<MaterialExtend>().ne(MaterialExtend::getInventory, BigDecimal.ZERO).isNotNull(MaterialExtend::getInventory));
+                collect = materialExtendList
+                        .stream()
+                        .map(MaterialExtend::getPosition)
+                        .collect(Collectors.toList());
+                List<Long> materialIdList = materialExtendList.stream().map(MaterialExtend::getMaterialId).distinct().collect(Collectors.toList());
+                List<Material> materialList = materialMapper.selectList(new LambdaQueryWrapperX<Material>().eq(Material::getId, materialIdList));
+                List<Long> categoryIdList = materialList.stream().map(Material::getCategoryId).distinct().collect(Collectors.toList());
+                taskStocktakingDTO.setCategoryCount(categoryIdList.size());
+                taskStocktakingDTO.setMaterialCount(materialExtendList.size());
+            } else {
+                materialExtendList = materialExtendMapper.selectList(new LambdaQueryWrapper<MaterialExtend>().in(MaterialExtend::getBatchNumber, taskStocktakingDTO.getMaterialExtendIdList()));
+                collect = materialExtendList.stream().map(MaterialExtend::getPosition).collect(Collectors.toList());
+                List<Long> materialIdList = materialExtendList.stream().map(MaterialExtend::getMaterialId).collect(Collectors.toList());
+                List<Material> materialList = materialMapper.selectList(new LambdaQueryWrapperX<Material>().in(Material::getId, materialIdList));
+                List<Long> categoryIdList = materialList.stream().map(Material::getCategoryId).distinct().collect(Collectors.toList());
+                taskStocktakingDTO.setCategoryCount(categoryIdList.size());
+                taskStocktakingDTO.setMaterialCount(materialExtendList.size());
+            }
+            //处理商品库位范围处理
+            String positionRange = extractRangePair(collect);
+            taskStocktakingDTO.setPositionRange(positionRange);
+            User currentUser = userService.getCurrentUser();
+            taskStocktakingDTO.setCreateBy(currentUser.getId());
+            taskStocktakingDTO.setCreateTime(new Date());
+            taskStocktakingDTO.setTaskStatus(1);
+            //生成任务
+            this.save(taskStocktakingDTO);
+            List<Long> taskStocktakingItemIdList = taskStocktakingItemMapper.selectList(new LambdaQueryWrapperX<TaskStocktakingItem>().eq(TaskStocktakingItem::getTaskStocktakingId, taskStocktakingDTO.getId())).stream().map(TaskStocktakingItem::getId).collect(Collectors.toList());
+            //生成任务明细
+            List<TaskStocktakingItem> addTaskStocktakingItemList = new ArrayList<>();
+            materialExtendList.forEach(item -> {
+                if (!taskStocktakingItemIdList.contains(item.getId())) {
+                    TaskStocktakingItem taskStocktakingItem = new TaskStocktakingItem();
+                    taskStocktakingItem.setTaskStocktakingId(taskStocktakingDTO.getId());
+                    taskStocktakingItem.setMaterialItemId(item.getId());
+                    addTaskStocktakingItemList.add(taskStocktakingItem);
+                }
+            });
+            List<Long> materialExtendIdList = materialExtendList.stream().map(MaterialExtend::getId).collect(Collectors.toList());
+            taskStocktakingItemIdList.forEach(item -> {
+                if (!materialExtendIdList.contains(item)) {
+
+//                    taskStocktakingItemMapper.updateById();
+                }
+            });
+            if (addTaskStocktakingItemList.size() > 0) {
+                taskStocktakingItemMapper.insertBatch(addTaskStocktakingItemList);
+            }
+        } catch (Exception e) {
+            log.error("创建盘点任务失败", e);
+            return false;
+        }
+        return true;
+    }
+
+    /**
      * 任务详情-商品明细
      * @param taskStocktakingId 盘点任务ID
      * @return
@@ -160,14 +230,40 @@ public class TaskStocktakingServiceImpl extends ServiceImpl<TaskStocktakingMappe
         return taskStocktakingMapper.pdaList(number , taskStatus);
     }
 
+    /**
+     * PDA-盘点任务详情
+     * @param id 盘点任务ID
+     * @return
+     * @throws Exception
+     */
     @Override
     public TaskStocktakingVO pdaDetail(Long id) throws Exception{
         TaskStocktakingVO detail = detail(id);
+        List<TaskStocktakingItem> itemList = taskStocktakingItemMapper.selectList(new LambdaQueryWrapper<TaskStocktakingItem>().eq(TaskStocktakingItem::getTaskStocktakingId, id));
         //已操作数量
-        Long count = taskStocktakingItemMapper.selectCount(new LambdaQueryWrapper<TaskStocktakingItem>()
-                .eq(TaskStocktakingItem::getTaskStocktakingId, id)
-                .isNotNull(TaskStocktakingItem::getCreator));
-        detail.setFinishCount(count);
+        long finishCount = itemList.stream().filter(item -> item.getCreator() != null).count();
+        //商品总数量
+        long itemCount = itemList.size();
+        //商品差异条数
+        long itemDifferenceCount = itemList.stream().filter(item -> item.getCreator() != null
+                && item.getDifferenceCount() != null
+                && item.getDifferenceCount() > 0).count();
+        //差异率
+        double differenceRate = 0;
+        //准确率
+        double accuracyRate = 0;
+        if (itemDifferenceCount > 0) {
+            differenceRate = BigDecimal.valueOf(itemCount)
+                    .divide(BigDecimal.valueOf(itemDifferenceCount), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+            accuracyRate = BigDecimal.valueOf(itemCount)
+                    .divide(BigDecimal.valueOf(finishCount)
+                            .subtract(BigDecimal.valueOf(itemDifferenceCount)), 4, RoundingMode.HALF_UP)
+                    .doubleValue();
+        }
+        detail.setDifferenceRate(differenceRate);
+        detail.setAccuracyRate(accuracyRate);
+        detail.setFinishCount(finishCount);
         return detail;
     }
 

+ 9 - 3
src/main/resources/mapper_xml/TaskStocktakingItemMapper.xml

@@ -8,9 +8,9 @@
             mc.`name` AS category_name,
             m.`name` AS material_name,
             m.system_sku AS system_sku,
-            m.commodity_unit AS commodity_unit,
+            me.commodity_unit AS commodity_unit,
             me.production_date AS production_date,
-            s.`name` AS supplier_name,
+            s.supplier AS supplier_name,
             me.bar_code AS bar_code,
             me.inventory AS inventory,
             d.`name` AS depot_name,
@@ -24,10 +24,13 @@
                 LEFT JOIN jsh_material m ON me.material_id = m.id
                 LEFT JOIN jsh_material_category mc ON mc.id = m.category_id
                 LEFT JOIN jsh_supplier s ON me.supplier_id = s.id
-                LEFT JOIN jsh_depot d AS me.depot_id = d.id
+                LEFT JOIN jsh_depot d ON me.depot_id = d.id
         WHERE
             tsi.delete_flag = 0
             AND tsi.task_stocktaking_id = #{taskStocktakingId}
+        ORDER BY
+            tsi.oper_time DESC,
+            tsi.id DESC
     </select>
 
     <select id="pdaList" resultType="com.jsh.erp.datasource.pda.vo.PDATaskStocktakingItemVO">
@@ -49,6 +52,9 @@
         WHERE
             tsi.delete_flag = 0
             AND tsi.task_stocktaking_id = #{taskId}
+        ORDER BY
+            tsi.oper_time DESC,
+            tsi.id DESC
     </select>
 
 </mapper>

+ 6 - 0
src/main/resources/mapper_xml/TaskStocktakingMapper.xml

@@ -31,6 +31,9 @@
             <if test="taskStatus != null and taskStatus != 0">
                 AND ts.task_status = #{taskStatus}
             </if>
+            ORDER BY
+                ts.create_time DESC,
+                ts.id DESC
         </where>
     </select>
 
@@ -55,6 +58,9 @@
                 LEFT JOIN jsh_user u ON ts.creator = u.id
         <where>
             ts.delete_flag = 0
+        ORDER BY
+            ts.create_time DESC,
+            ts.id DESC
         </where>
     </select>