Parcourir la source

盘点及冻结列表

yangg il y a 1 an
Parent
commit
7afb93f2d7

+ 11 - 0
manager-admin/src/api/goodsInventory.js

@@ -162,3 +162,14 @@ export function getSyncStock(id) {
     loaidng: false
   })
 }
+
+/* /admin/erp/warehouseOut/getGoodByWarehouse */
+
+export function getGoodByWarehouseInventory(params,id) {
+  return request({
+    url: `/admin/erp/warehouseOut/getGoodByWarehouseInventory/${id}`,
+    method: 'get',
+    loaidng: false,
+    params
+  })
+}

+ 8 - 0
manager-admin/src/api/goodsTransfer.js

@@ -205,3 +205,11 @@ export function transitDetail(stockId) {
   })
 }
 
+/* /admin/erp/warehouseOut/getLockedStock */
+export function getLockedStock(params) {
+  return request({
+    url: `/admin/erp/warehouseOut/getLockedStock`,
+    method: 'get',
+    params
+  })
+}

+ 45 - 88
manager-admin/src/views/basicSetting/goods/editForm/BasicInfo.vue

@@ -2,57 +2,28 @@
   <div>
     <el-form :model="formData" :rules="formRules" ref="formRef" label-width="130px">
       <el-form-item prop="name" label="商品名称" :rules="formRules.name">
-        <el-input
-          class="form-item-width"
-          v-model="formData.name"
-          :minlength="2"
-          :maxlength="100"
-          clearable
-          placeholder="请输入商品名称"
-        ></el-input>
+        <el-input class="form-item-width" v-model="formData.name" :minlength="2" :maxlength="100" clearable
+          placeholder="请输入商品名称"></el-input>
       </el-form-item>
       <el-form-item prop="en_name" label="商品英文名称" :rules="formRules.en_name">
-        <el-input
-          class="form-item-width"
-          v-model="formData.en_name"
-          :minlength="2"
-          :maxlength="100"
-          clearable
-          placeholder="请输入商品名称"
-        ></el-input>
+        <el-input class="form-item-width" v-model="formData.en_name" :minlength="2" :maxlength="100" clearable
+          placeholder="请输入商品名称"></el-input>
       </el-form-item>
       <el-form-item prop="sn" label="商品编号" :rules="formRules.sn">
-        <el-input
-          class="form-item-width"
-          v-model="formData.sn"
-          :minlength="2"
-          :maxlength="9"
-          @blur="snBlur"
-          placeholder="请输入商品编号"
-        ></el-input>
+        <el-input class="form-item-width" v-model="formData.sn" :minlength="2" :maxlength="9" @blur="snBlur"
+          placeholder="请输入商品编号"></el-input>
       </el-form-item>
       <el-form-item prop="category_id" label="商品类别" :rules="formRules.category_id">
-        <el-cascader
-          class="form-item-width"
-          v-model="formData.category_id"
-          clearable
-          :options="categoryList"
-          :props="{
-            label: 'name',
-            value: 'category_id',
-            emitPath: false,
-            checkStrictly: true
-          }"
-        />
+        <el-cascader class="form-item-width" v-model="formData.category_id" clearable :options="categoryList" :props="{
+          label: 'name',
+          value: 'category_id',
+          emitPath: false,
+          checkStrictly: true
+        }" />
       </el-form-item>
       <el-form-item prop="brand_id" label="品牌" :rules="formRules.brand_id">
         <el-select class="form-item-width" v-model="formData.brand_id" clearable>
-          <el-option
-            v-for="item in brandList"
-            :key="item.name"
-            :label="item.name"
-            :value="item.brand_id"
-          ></el-option>
+          <el-option v-for="item in brandList" :key="item.name" :label="item.name" :value="item.brand_id"></el-option>
         </el-select>
       </el-form-item>
       <!-- <el-form-item prop="goods_unit" label="商品单位" :rules="formRules.goods_unit">
@@ -76,20 +47,16 @@
           <el-radio :label=1>是</el-radio>
           <el-radio :label=2>否</el-radio>
         </el-radio-group> -->
-        <el-switch
-          v-model="formData.allow_sn"
-          :active-value="1"
-          :inactive-value="2"
-          active-color="#13ce66"
+        <el-switch v-model="formData.allow_sn" :active-value="1" :inactive-value="2" active-color="#13ce66"
           inactive-color="#ff4949">
         </el-switch>
       </el-form-item>
       <el-form-item label="商品图片" prop="image_list" :rules="formRules.image_list">
-        <upload-sortable :goodsGalleryList="formData.image_list" @change="handlePictureChange"/>
-      </el-form-item>
-      <el-form-item label="商品图标" prop="image_list" :rules="formRules.image_small">
-        <UploadSortIcon :goodsGalleryList="formData.image_small_list" @change="handlePictureIconChange"/>
+        <upload-sortable :goodsGalleryList="formData.image_list" @change="handlePictureChange" />
       </el-form-item>
+      <!-- <el-form-item label="商品图标" prop="image_list" :rules="formRules.image_small">
+        <UploadSortIcon :goodsGalleryList="formData.image_small_list" @change="handlePictureIconChange" />
+      </el-form-item> -->
       <el-form-item label="商品视频" prop="video">
         <div v-if="formData.video" class="video">
           <video :src="formData.video" class="video-play" controls="controls">
@@ -97,30 +64,14 @@
           </video>
           <i class="el-icon-close close" @click.stop="handleRemoveGoodsVideo"></i>
         </div>
-        <el-upload
-          :action="MixinUploadApi"
-          :on-progress="uploadVideoProcess"
-          :on-success="handleVideoSuccess"
-          :on-error="handleVideoError"
-          :before-upload="beforeUploadVideo"
-          :show-file-list="false"
-        >
-          <i v-if="!formData.video && !video.flag" class="el-icon-plus video-uploader-icon"/>
-          <el-progress
-            v-if="video.flag"
-            type="circle"
-            :percentage="video.uploadPercent"
-            style="margin-top:7px;"
-          />
+        <el-upload :action="MixinUploadApi" :on-progress="uploadVideoProcess" :on-success="handleVideoSuccess"
+          :on-error="handleVideoError" :before-upload="beforeUploadVideo" :show-file-list="false">
+          <i v-if="!formData.video && !video.flag" class="el-icon-plus video-uploader-icon" />
+          <el-progress v-if="video.flag" type="circle" :percentage="video.uploadPercent" style="margin-top:7px;" />
           <span v-if="video.errorTip" class="error" style="font-size: 12px;color:#f56c6c;">
             (视频上传失败,请重新上传!)
           </span>
-          <div
-            slot="tip"
-            class="el-upload__tip"
-            style="margin-top: -10px"
-            v-if="!formData.video"
-          >
+          <div slot="tip" class="el-upload__tip" style="margin-top: -10px" v-if="!formData.video">
             最多可以上传1个视频,建议大小10M,推荐格式mp4
           </div>
         </el-upload>
@@ -181,7 +132,7 @@ export default {
   props: {
     propFormData: {
       type: Object,
-      default: () => {}
+      default: () => { }
     }
   },
   data() {
@@ -191,7 +142,7 @@ export default {
         image_list: [],
         video: '',
         market_enable: true,
-        allow_sn:2
+        allow_sn: 2
       },
       formRules: {
         name: [this.MixinRequired('请输入商品名称', 'blur')],
@@ -199,9 +150,9 @@ export default {
         category_id: [this.MixinRequired('请选择商品类别', 'change')],
         image_list: [this.MixinRequired('请添加商品图片', 'change')],
         market_enable: [this.MixinRequired('请选择是否上架', 'change')],
-        allow_sn:[this.MixinRequired('请选择是否启用序列号', 'change')],
-        brand_id:[this.MixinRequired('请选择品牌', 'change')],
-       /*  goods_unit:[this.MixinRequired('请输入商品单位', 'blur')] */
+        allow_sn: [this.MixinRequired('请选择是否启用序列号', 'change')],
+        brand_id: [this.MixinRequired('请选择品牌', 'change')],
+        /*  goods_unit:[this.MixinRequired('请输入商品单位', 'blur')] */
       },
       // 分类列表
       categoryList: [],
@@ -222,11 +173,11 @@ export default {
     this.getBrandAllList()
   },
   methods: {
-    snBlur(){
+    snBlur() {
       // 假设 localFormData 是你需要更新的数据
       this.$store.dispatch('setBasicInfoData', this.formData.sn);
-     /*  this.$emit('update-data', this.formData.sn);
-      sessionStorage.setItem("sn",this.formData.sn) */
+      /*  this.$emit('update-data', this.formData.sn);
+       sessionStorage.setItem("sn",this.formData.sn) */
     },
     /** 获取分类 */
     getCategoryAllChildren() {
@@ -261,17 +212,15 @@ export default {
       /* let url=fileList.map(el=>{
         return el.url
       })   this.formData.images = url.join(',') */
-      this.formData.image_list=fileList
+      this.formData.image_list = fileList
 
     },
-     /** 商品图片发生改变 */
-     handlePictureIconChange(fileList) {
-      /* let url=fileList.map(el=>{
-        return el.url
-      })   this.formData.images = url.join(',') */
-      this.formData.image_small_list=fileList
+    /** 商品图片发生改变 */
+  /*   handlePictureIconChange(fileList) {
 
-    },
+      this.formData.image_small_list = fileList
+
+    }, */
     /** 视频上传效验 */
     beforeUploadVideo(file) {
       const fileSize = file.size / 1024 / 1024 < 20
@@ -344,10 +293,12 @@ export default {
   width: 35%;
   min-width: 300px;
 }
+
 .form-item-width1 {
   width: 100%;
   min-width: 400px;
 }
+
 .video-uploader-icon {
   border: 1px dashed #d9d9d9;
   background-color: #fbfdff;
@@ -362,18 +313,22 @@ export default {
   line-height: 148px;
   text-align: center;
 }
+
 .video-uploader-icon:hover {
   border-color: #409eff;
 }
+
 .video {
   position: relative;
   width: 200px;
   height: 200px;
+
   .video-play {
     width: 200px;
     height: 200px;
     background: #000;
   }
+
   .close {
     position: absolute;
     right: 8px;
@@ -382,12 +337,14 @@ export default {
     color: #fff;
   }
 }
+
 /*折叠面板*/
 .el-collapse-item {
   /deep/ .el-collapse-item__header {
     padding-left: 10px;
     font-size: 14px;
   }
+
   /deep/ .el-collapse-item__content {
     padding-top: 10px;
     padding-bottom: 0;

+ 1 - 1
manager-admin/src/views/basicSetting/productClassAdd.vue

@@ -78,7 +78,7 @@
                 <el-table-column type="selection" width="55" />
                 <el-table-column prop="goods_vo.sn" label="商品编号"> </el-table-column>
                 <el-table-column prop="sku" label="sku"> </el-table-column>
-                <el-table-column prop="sn_code" label="序列号"> </el-table-column>
+               <!--  <el-table-column prop="sn_code" label="序列号"> </el-table-column> -->
                 <el-table-column prop="goods_vo.name" label="商品名称"> </el-table-column>
                 <el-table-column prop="spec_name" label="规格型号">
                 </el-table-column>

+ 8 - 8
manager-admin/src/views/dashboard/index.vue

@@ -135,14 +135,14 @@
             </router-link>
           </div>
           <div class="goods-statistics">
-            <el-table :data="OrderList.data" :loading="loading" :header-cell-style="{ textAlign: 'center' }">
-              <el-table-column prop="sn" label="订单编号">
+            <el-table :data="OrderList.records" :loading="loading" :header-cell-style="{ textAlign: 'center' }">
+              <el-table-column prop="order_vo.sn" label="订单编号">
               </el-table-column>
               <el-table-column prop="warehouse_name" label="仓库名称">
-                <template slot-scope="scope">{{ warehouseName(scope.row.warehouse_id) }}</template>
+                <template slot-scope="scope">{{ warehouseName(scope.row.order_vo.warehouse_id) }}</template>
               </el-table-column>
               <el-table-column prop="create_time" label="下单时间">
-                <template slot-scope="scope">{{ scope.row.create_time | unixToDate }}</template>
+                <template slot-scope="scope">{{ scope.row.update_time | unixToDate }}</template>
               </el-table-column>
               <el-table-column label="操作">
                 <template slot-scope="scope">
@@ -360,7 +360,7 @@ export default {
       API_order.getOrderList({
         page_no: 1,
         page_size: 10,
-        status: 'TO_BE_RETURN'
+        selectType: 'to_be_return'
       }).then(response => {
         this.loading = false
         this.goodsLendListWaitReturnData = response
@@ -372,10 +372,10 @@ export default {
     },
     /** 获取待发货订单 */
     GET_OrderList() {
-      API_order.getOrderList({
+      API_order.getSaleOrderOutList({
         page_no: 1,
-        page_size: 9,
-        status: 'TO_BE_SEND'
+        page_size: 10,
+        selectType: 'to_be_send'
       }).then(response => {
         this.OrderList = response
       })

+ 21 - 1
manager-admin/src/views/setting/serialList.vue

@@ -56,6 +56,13 @@
       <template slot="table-columns">
         <el-table-column type="selection" width="55" />
         <el-table-column prop="goods_vo.sn" label="商品编号" />
+        <el-table-column prop="inventory_id" label="盘点单ID">
+          </el-table-column>
+          <el-table-column prop="inventory_id" label="所在仓库">
+             <template slot-scope="scope">
+              {{ warehouseName(scope.row.warehouse_id) }}
+             </template>
+          </el-table-column>
         <el-table-column prop="goods_vo.name" label="商品名称" />
         <el-table-column prop="product_vo.spec_name" label="规格型号" />
         <el-table-column prop="sku" label="sku" />
@@ -233,7 +240,8 @@ export default {
         }
         ],
       },
-      SKUVisible: false
+      SKUVisible: false,
+      warehouseList:'',
     };
   },
   mounted() {
@@ -249,6 +257,15 @@ export default {
     ...mapGetters(["user"]),
   },
   methods: {
+    warehouseName(val) {
+      let name = ''
+      this.warehouseList.map((el) => {
+        if (el.id == val) {
+          return name = el.name
+        }
+      });
+      return name
+    },
     snCodeCancle() {
       this.SKUForm.id = ""
       this.SKUForm.snCode = ""
@@ -487,6 +504,9 @@ export default {
       API_Setting.getPage({ dictType: "sn_code_status" }).then((res) => {
         this.statusList = res.data;
       });
+      API_BasicSetting.getWarehouseListAll().then((response) => {
+        this.warehouseList = response;
+      });
     },
   },
 };

+ 30 - 11
manager-admin/src/views/stock/freezeList.vue

@@ -1,6 +1,6 @@
 <template>
     <div>
-       <!--  <div class="search">
+        <!--  <div class="search">
             <el-form ref="advancedForm" :model="advancedForm" label-width="160px">
                 <el-row>
                     <el-col :span="12">
@@ -20,7 +20,7 @@
             </el-form>
             <el-button @click="advancedSearchEvent"> 搜索 </el-button>
         </div> -->
-        <en-table-layout :tableData="tableData.data" ref="table" :loading="loading"
+        <en-table-layout :tableData="tableData.records" ref="table" :loading="loading"
             @selection-change="handleSelectionChange">
             <div slot="toolbar" class="inner-toolbar">
                 <!--    <div class="toolbar-btns">
@@ -33,14 +33,20 @@
                 <el-table-column prop="order_id" label="单据ID">
                 </el-table-column>
                 <el-table-column label="单据类型" prop="order_type">
+                    <template slot-scope="scope">
+                        {{ typeName(scope.row.order_type) }}
+                    </template>
                 </el-table-column>
-                <el-table-column label="是否默认解冻" prop="status">
+                <el-table-column label="状态" prop="status">
+                    <template slot-scope="scope">
+                        {{ scope.row.status ? '解冻' : '未解冻' }}
+                    </template>
                 </el-table-column>
                 <el-table-column prop="locked_num" label="冻结个数" />
                 <el-table-column prop="locked_time" label="冻结时间">
                 </el-table-column>
-                <el-table-column prop="un_locaked_num" label="解冻个数" />
-                <el-table-column prop="un_locaked_time" label="解冻时间" />
+                <el-table-column prop="un_locked_num" label="解冻个数" />
+                <el-table-column prop="un_locked_time" label="解冻时间" />
                 <!-- <el-table-column label="操作" width="250">
             <template slot-scope="scope">
               <el-button type="success1" size="mini" v-if="checkPermission(['goodsTransfer:submit'])"
@@ -66,12 +72,12 @@
             </template>
 
             <el-pagination v-if="tableData" slot="pagination" @size-change="handlePageSizeChange"
-                @current-change="handlePageCurrentChange" :current-page="tableData.page_no"
-                :page-sizes="[10, 20, 50, 100]" :page-size="tableData.page_size"
-                layout="total, sizes, prev, pager, next, jumper" :total="tableData.data_total">
+                @current-change="handlePageCurrentChange" :current-page="tableData.pages"
+                :page-sizes="[10, 20, 50, 100]" :page-size="tableData.size"
+                layout="total, sizes, prev, pager, next, jumper" :total="tableData.total">
             </el-pagination>
         </en-table-layout>
-       <!--  <el-dialog title="在途明细" :visible.sync="dialogVisible" append-to-body :close-on-click-modal="false"
+        <!--  <el-dialog title="在途明细" :visible.sync="dialogVisible" append-to-body :close-on-click-modal="false"
             :close-on-press-escape="false">
             <el-table :data="transitDetails" border class="sku-table">
                 <el-table-column prop="order_sn" label="订单编号" />
@@ -145,6 +151,7 @@ export default {
                 ],
             },
             selectedRow: null, // 用于记录当前选中的行
+            orderDetailTypeL:[]
         };
     },
     mounted() {
@@ -162,6 +169,15 @@ export default {
         ...mapGetters(["user"]),
     },
     methods: {
+        typeName(val) {
+            let name = "";
+            this.orderDetailType.map((el) => {
+                if (el.value == val) {
+                    return (name = el.label);
+                }
+            });
+            return name;
+        },
         /* 提交预警数量 */
         submitNum() {
             console.log(this.$refs["numAddForm"]);
@@ -224,6 +240,9 @@ export default {
             API_BasicSetting.getWarehouseListAll().then((response) => {
                 this.warehouseList = response;
             });
+            API_Setting.getPage({ dictType: "order_detail_type" }).then((res) => {
+                this.orderDetailType = res.data;
+            });
         },
         typeFilter(row) {
             return this.goodstransferType.find((type) => type.value === row).label;
@@ -351,10 +370,10 @@ export default {
         /** 获取商品调拨列表 */
         GET_GoodsTransferList() {
             this.loading = true;
-            API_GoodsTransfer.productStock(this.params)
+            API_GoodsTransfer.getLockedStock(this.params)
                 .then((response) => {
                     this.loading = false;
-                    //this.tableData = response;
+                    this.tableData = response;
                 })
                 .catch(() => {
                     this.loading = false;

+ 6 - 1
manager-admin/src/views/stock/goodsExchange/checkInventory.vue

@@ -96,11 +96,16 @@
                   ></el-input> -->
                 </template>
               </el-table-column>
-              <el-table-column label="库存数量" v-if="checkType == 'first'">
+              <el-table-column label="可用库存">
                 <template slot-scope="scope">
                   {{ scope.row.usable_stock }}
                 </template>
               </el-table-column>
+              <el-table-column label="实际库存">
+                <template slot-scope="scope">
+                  {{ scope.row.actual_stock }}
+                </template>
+              </el-table-column>
               <!-- <el-table-column label="差异">
                 <template slot-scope="scope">
                   入库减去库存

+ 45 - 30
manager-admin/src/views/stock/goodsExchange/goodsExchangeAdd.vue

@@ -12,7 +12,7 @@
         <el-select v-model="goodsExchangeAddForm.type" filterable allow-create clearable default-first-option
           :disabled="type === 'detail' || type === 'audit'">
           <el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value"
-            :disabled="item.value == 'SALE_OUT' || item.value == 'HAIL_OUT' || item.value == 'DAMAGE_OUT'" />
+            :disabled="item.value == 'SALE_OUT' || item.value == 'HAIL_OUT' || item.value == 'DAMAGE_OUT' || item.value == 'TRANSFER_OUT'" />
         </el-select>
       </el-form-item>
       <!-- <el-form-item label="订单" prop="order_sn" class="change-form-item">
@@ -145,17 +145,26 @@
                   :disabled="type === 'detail' || type === 'audit'"></el-input>
               </template>
             </el-table-column>
-            <el-table-column label="库存数量">
+            <el-table-column label="订单数量">
+              <template slot-scope="scope">
+                {{ scope.row.order_num }}
+              </template>
+            </el-table-column>
+            <el-table-column label="可用库存">
               <template slot-scope="scope">
                 {{ scope.row.usable_stock }}
               </template>
             </el-table-column>
-            <el-table-column label="剩余数量">
+            <el-table-column label="实际库存">
               <template slot-scope="scope">
-                <!-- 入库减去库存  -->
-                {{ scope.row.usable_stock - scope.row.out_num || 0 }}
+                {{ scope.row.actual_stock }}
               </template>
             </el-table-column>
+            <!-- <el-table-column label="剩余数量">
+              <template slot-scope="scope">
+                {{ scope.row.usable_stock - scope.row.out_num || 0 }}
+              </template>
+            </el-table-column> -->
             <el-table-column width="200" label="操作" v-if="type !== 'detail' && type !== 'audit'">
               <template slot-scope="scope">
                 <!-- <el-button
@@ -517,7 +526,6 @@ export default {
           return (
             el.goods_id === res.goods_id &&
             el.product_id === res.product_id &&
-            el.warehouse_id === res.warehouse_id &&
             el.product_vo.sku === res.product_vo.sku
           );
         });
@@ -666,20 +674,18 @@ export default {
           if (!this.goodsExchangeAddForm.product_list.length) {
             return;
           }
-          const isStockSufficient = params.product_list.map((el) => {
-            if (el.out_num < el.usable_stock) {
-              this.$message.error("该商品库存不足!");
-              return false
+          if (params.type == 'OTHER_OUT' || params.type == 'BORROW_OUT') {
+            const isStockSufficient = params.product_list.map((el) => {
+              if (el.out_num < el.usable_stock) {
+                this.$message.error("该商品库存不足!");
+                return false
+              }
+              return true
+            });
+            if (!isStockSufficient) {
+              return;
             }
-            return true
-          });
-          if (!isStockSufficient) {
-            return;
           }
-          params.product_list.map(el => {
-            el.product_stock_id = el.id
-            el.id = ''
-          })
           if (this.$route.name === "goodsExchangeEdit") {
             API_GoodsExchange.editWarehouseOut(id, params).then((response) => {
               this.$message.success("修改成功!");
@@ -693,6 +699,10 @@ export default {
             });
           } else if (this.$route.name === "goodsExchangeAdd") {
             // 新增入库
+            params.product_list.map(el => {
+              el.product_stock_id = el.id
+              el.id = ''
+            })
             API_GoodsExchange.warehouseOut(params).then(() => {
               this.$message.success("添加成功!");
               const { callback } = this.$route.params;
@@ -733,19 +743,17 @@ export default {
             this.$message.error("请选择商品!");
             return;
           }
-          params.product_list.map(el => {
-            el.product_stock_id = el.id
-            el.id = ''
-          })
-          const isStockSufficient = params.product_list.map((el) => {
-            if (el.out_num < el.usable_stock) {
-              this.$message.error("该商品库存不足!");
-              return false
+          if (params.type == 'OTHER_OUT' || params.type == 'BORROW_OUT') {
+            const isStockSufficient = params.product_list.map((el) => {
+              if (el.out_num < el.usable_stock) {
+                this.$message.error("该商品库存不足!");
+                return false
+              }
+              return true
+            });
+            if (!isStockSufficient) {
+              return;
             }
-            return true
-          });
-          if (!isStockSufficient) {
-            return;
           }
           if (this.$route.name === "goodsExchangeEdit") {
             API_GoodsExchange.editWarehouseOut(id, params).then((response) => {
@@ -759,6 +767,10 @@ export default {
               this.$router.push({ name: "goodsExchange" });
             });
           } else if (this.$route.name === "goodsExchangeAdd") {
+            params.product_list.map(el => {
+              el.product_stock_id = el.id
+              el.id = ''
+            })
             // 新增入库
             API_GoodsExchange.warehouseOut(params).then(() => {
               this.$message.success("添加成功!");
@@ -878,6 +890,8 @@ export default {
             this.goodsExchangeAddForm.change_time * 1000
           );
           response.product_list.map(el => {
+            el.order_num = el.out_num
+            el.out_num = 0
             if (!el.sn_code_list) {
               el.sn_code_list = []
             }
@@ -989,6 +1003,7 @@ export default {
     }
   }
 }
+
 .sn-code-container {
   max-height: 100px;
   /* 设置最大高度,超过这个高度将显示滚动条 */

+ 60 - 48
manager-admin/src/views/stock/goodsInventory/goodsInventory.vue

@@ -2,36 +2,39 @@
   <div>
     <div class="search">
       <el-form ref="advancedForm" :model="advancedForm" label-width="160px">
-        <el-row >
+        <el-row>
           <el-col :span="8">
-             <el-form-item label="盘点日期">
-                  <el-date-picker v-model="advancedForm.goodsInventory_time_range" type="daterange" align="center"
-                    :editable="false" unlink-panels :clearable="false" :default-time="['00:00:00', '23:59:59']"
-                    range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" value-format="timestamp"
-                    :picker-options="{ disabledDate(time) { return time.getTime() - 1 >= new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()).getTime() + 86400000 - 1 }, shortcuts: MixinPickerShortcuts }">
-                  </el-date-picker>
-                </el-form-item>
+            <el-form-item label="盘点日期">
+              <!-- <el-date-picker v-model="searchTime" type="daterange" align="center"
+                value-format="yyyy-MM-dd hh:mm:ss" :editable="false" unlink-panels :clearable="true"
+                :default-time="['00:00:00', '23:59:59']" range-separator="-" start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                :picker-options="{ disabledDate(time) { return time.getTime() - 1 >= new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()).getTime() + 86400000 - 1 }, shortcuts: MixinPickerShortcuts }">
+              </el-date-picker> -->
+              <el-date-picker v-model="searchTime" type="daterange" align="center"  :editable="false"
+              unlink-panels :clearable="true" :default-time="['00:00:00', '23:59:59']" range-separator="-"
+              start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd hh:mm:ss" >
+            </el-date-picker>
+            </el-form-item>
 
           </el-col>
           <el-col :span="8">
-             <el-form-item label="仓库">
-              <el-select v-model="advancedForm.out_warehouse_id">
-                <el-option
-                  v-for="item in warehouseList"
-                  :key="item.id"
-                  :label="item.name"
-                  :value="item.id"
-                />
+            <el-form-item label="仓库">
+              <el-select v-model="advancedForm.warehouse_id" clearable>
+                <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="盘点人">
-              <el-input
+              <!--  <el-input
                 v-model="advancedForm.inventory_person"
                 placeholder="请输入内容"
                 width="200px"
-              ></el-input>
+              ></el-input> -->
+              <el-select v-model="advancedForm.inventory_person_id" clearable>
+                <el-option v-for="item in adminList" :key="item.id" :label="item.real_name" :value="item.id" />
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
@@ -41,11 +44,11 @@
       </el-button>
     </div>
     <en-table-layout :tableData="tableData.data" :loading="loading" @selection-change="handleSelectionChange">
-     <div slot="toolbar" class="inner-toolbar">
+      <div slot="toolbar" class="inner-toolbar">
         <div class="toolbar-btns">
           <el-button size="mini" v-if="checkPermission(['goodsInventory:add'])" type="primary"
             @click="handleAddGoodsInventory">新增</el-button>
-        <!--   <el-button v-if="checkPermission(['goodsInventory:del'])" size="mini" @click="handleDeleteGoodsInventory()"
+          <!--   <el-button v-if="checkPermission(['goodsInventory:del'])" size="mini" @click="handleDeleteGoodsInventory()"
             type="danger" :disabled="multipleSelection.length === 0">删除</el-button> -->
         </div>
         <!--  <div class="toolbar-search">
@@ -55,8 +58,8 @@
               <el-form ref="advancedForm" :model="advancedForm" label-width="90px">
               </el-form>
             </template>
-          </en-table-search>
-        </div>-->
+</en-table-search>
+</div>-->
       </div>
 
       <template slot="table-columns">
@@ -69,7 +72,7 @@
               :to="{ name: 'goodsInventoryDetail', params: { id: scope.row.id } }">
               {{ scope.row.sn }}
              </router-link> -->
-            <span>{{scope.row.sn}}</span>
+            <span>{{ scope.row.sn }}</span>
           </template>
         </el-table-column>
         <el-table-column prop="inventory_time" label="盘点日期">
@@ -83,10 +86,9 @@
         </el-table-column>
         <el-table-column label="操作" width="450">
           <template slot-scope="scope">
-            <el-button  size="mini"
-              @click="handleCheckGoodsInventory(scope.row)">查看</el-button>
-              <el-button type="mini"
-              size="mini" v-if="scope.row.status=='NOT_HANDLE'" @click="handleSubmitGoodsInventory(scope.row)">同步</el-button>
+            <el-button size="mini" @click="handleCheckGoodsInventory(scope.row)">查看</el-button>
+            <el-button type="mini" size="mini" v-if="scope.row.status == 'NOT_HANDLE'"
+              @click="handleSubmitGoodsInventory(scope.row)">同步</el-button>
             <!-- <el-button v-if="scope.row.allowable.allow_audit && checkPermission(['goodsInventory:audit'])" type="mini"
               size="mini" @click="handleAuditGoodsInventory(scope.row)">审核</el-button>
 
@@ -181,6 +183,7 @@
 <script>
 import * as API_GoodsInventory from '@/api/goodsInventory'
 import Print from 'print-js'
+import * as API_Auth from '@/api/auth'
 import * as API_Setting from '@/api/setting'
 import * as API_BasicSetting from "@/api/basicSetting";
 import { Foundation } from '~/ui-utils'
@@ -204,7 +207,9 @@ export default {
       dialogVisible: false,
       // 当前已选择的行
       multipleSelection: [],
-      goodsInventoryForm: {}
+      goodsInventoryForm: {},
+      adminList: [],
+      searchTime:[],
     }
   },
   mounted() {
@@ -213,20 +218,27 @@ export default {
     this.GET_WarehouseList();
   },
   watch: {
-    $route: function({ query }) {
+    $route: function ({ query }) {
       this.params.page_no = 1
       this.GET_GoodsInventoryList()
     }
   },
   methods: {
-      /** 获取仓库 */
-      GET_WarehouseList() {
+    /** 获取仓库 */
+    GET_WarehouseList() {
       API_BasicSetting.getWarehouseListAll().then((response) => {
         this.warehouseList = response;
       });
+      API_Auth.getAdministratorList({
+        page_no: 1,
+        page_size: 9999,
+        user_state: 0
+      }).then(response => {
+        this.adminList = response.data
+      })
     },
     // 查看
-    handleCheckGoodsInventory(row){
+    handleCheckGoodsInventory(row) {
       this.$router.push({
         name: 'goodsInventoryCheck',
         params: {
@@ -304,13 +316,13 @@ export default {
           return '已处理'
       }
     },
-     //获取仓库名称
-     warehouseName(val){
-      let name=''
-      this.warehouseList.map(el=>{
-       if(el.id==val) {
-        return name=el.name
-       }
+    //获取仓库名称
+    warehouseName(val) {
+      let name = ''
+      this.warehouseList.map(el => {
+        if (el.id == val) {
+          return name = el.name
+        }
       })
       return name
     },
@@ -350,7 +362,7 @@ export default {
         this.goodsInventoryForm = response
         if (response.product_list && response.product_list.length) {
           var str = ''
-          response.product_list.forEach(function(i) {
+          response.product_list.forEach(function (i) {
             str += i.product_name + '、'
           })
         }
@@ -370,17 +382,14 @@ export default {
     },
     /** 高级搜索事件触发 */
     advancedSearchEvent() {
+      if (this.searchTime) {
+        this.advancedForm.start_time = this.searchTime[0];
+        this.advancedForm.end_time = this.searchTime[1];
+      }
       this.params = {
         ...this.params,
         ...this.advancedForm
       }
-      delete this.params.start_time
-      delete this.params.end_time
-      if (this.advancedForm.goodsInventory_time_range) {
-        this.params.start_time = parseInt(Number(this.advancedForm.goodsInventory_time_range[0]) / 1000)
-        this.params.end_time = parseInt(Number(this.advancedForm.goodsInventory_time_range[1]) / 1000)
-      }
-      delete this.params.goodsInventory_time_range
       this.params.page_no = 1
       this.GET_GoodsInventoryList()
     },
@@ -403,6 +412,7 @@ export default {
   background: #fff;
   overflow: hidden;
   padding: 30px 10px 10px 10px;
+
   /deep/ .el-form-item {
     .el-form-item__content {
       .el-input {
@@ -410,11 +420,13 @@ export default {
       }
     }
   }
-  .el-button{
+
+  .el-button {
     margin-top: -19px;
     margin-left: 20px;
   }
 }
+
 .print {
   margin-left: 790px;
 }

+ 202 - 58
manager-admin/src/views/stock/goodsInventory/goodsInventoryAdd.vue

@@ -7,38 +7,37 @@
         <el-input v-model="goodsInventoryAddForm.sn" :disabled="true"></el-input>
       </el-form-item>
       <el-form-item label="盘点时间" prop="inventory_time" class="change-form-item">
-       <span v-if="id">{{ goodsInventoryAddForm.inventory_time }}</span> 
-        <el-date-picker v-else v-model="goodsInventoryAddForm.inventory_time" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
-          :disabled="type === 'detail' || type === 'audit' || type==='check'" placeholder="选择日期时间">
+        <span v-if="id">{{ goodsInventoryAddForm.inventory_time }}</span>
+        <el-date-picker v-else v-model="goodsInventoryAddForm.inventory_time" value-format="yyyy-MM-dd HH:mm:ss"
+          type="datetime" :disabled="type === 'detail' || type === 'audit' || type === 'check'" placeholder="选择日期时间">
         </el-date-picker>
       </el-form-item>
       <el-form-item label="仓库" prop="warehouse_id" class="change-form-item">
-        <span v-if="id">{{ getWarehouse(goodsInventoryAddForm.warehouse_id)  }}</span> 
+        <span v-if="id">{{ getWarehouse(goodsInventoryAddForm.warehouse_id) }}</span>
         <el-select v-else v-model="goodsInventoryAddForm.warehouse_id" @change="handleChangeWareHouse"
-          :disabled="type === 'detail' || type === 'audit' || type==='check'">
+          :disabled="type === 'detail' || type === 'audit' || type === 'check'">
           <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
       <el-form-item label="盘点人" prop="inventory_person_id" class="change-form-item">
-        <span v-if="id">{{ getadminList(goodsInventoryAddForm.inventory_person_id)  }}</span> 
-        <el-select v-else @change="forceUpdate" v-model="goodsInventoryAddForm.inventory_person_id" :disabled="type === 'detail' || type === 'audit' || type==='check'">
+        <span v-if="id">{{ getadminList(goodsInventoryAddForm.inventory_person_id) }}</span>
+        <el-select v-else @change="forceUpdate" v-model="goodsInventoryAddForm.inventory_person_id"
+          :disabled="type === 'detail' || type === 'audit' || type === 'check'">
           <el-option v-for="item in adminList" :key="item.id" :label="item.real_name" :value="item.id" />
         </el-select>
       </el-form-item>
       <el-form-item label="制单人" prop="creator_id" class="change-form-item">
-        <span v-if="id">{{ getadminList(goodsInventoryAddForm.creator_id)  }}</span> 
-        <el-select v-else
-          v-model="goodsInventoryAddForm.creator_id"
-          :disabled="type === 'detail' || type === 'audit' || type==='check'"
-          @change="forceUpdate">
+        <span v-if="id">{{ getadminList(goodsInventoryAddForm.creator_id) }}</span>
+        <el-select v-else v-model="goodsInventoryAddForm.creator_id"
+          :disabled="type === 'detail' || type === 'audit' || type === 'check'" @change="forceUpdate">
           <el-option v-for="item in adminList" :key="item.id" :label="item.real_name" :value="item.id" />
         </el-select>
       </el-form-item>
       <el-form-item label="盘点类型" prop="inventory_type" class="change-form-item">
-        <span v-if="id">{{ getRoleSplit(goodsInventoryAddForm.inventory_type)  }}</span> 
-        <el-select v-else v-model="goodsInventoryAddForm.inventory_type" @change="handleChangeWareHouse"
-          :disabled="type === 'detail' || type === 'audit' || type==='check'">
-           <el-option v-for="item in typeList" :key="item.id" :label="item.label" :value="item.id" />
+        <span v-if="id">{{ getRoleSplit(goodsInventoryAddForm.inventory_type) }}</span>
+        <el-select v-else v-model="goodsInventoryAddForm.inventory_type" @change="handleChangeInventoryType($event)"
+          :disabled="type === 'detail' || type === 'audit' || type === 'check'">
+          <el-option v-for="item in typeList" :key="item.id" :label="item.label" :value="item" />
         </el-select>
         <!-- <el-cascader v-model="goodsInventoryAddForm.dept_id" :options="deptList"
           :disabled="type === 'detail' || type === 'audit' || type==='check'" :props="{
@@ -50,8 +49,10 @@
       </el-form-item>
       <div class="mx">
         <h3>商品明细</h3>
-        <el-button class="button" size="mini" type="primary" v-if="type !== 'detail' && type!=='check'"
-          @click="handleSelectWarehouseEntryBatch">选择</el-button>
+        <el-button class="button" size="mini" type="primary" v-if="type !== 'detail' && type !== 'check'"
+          @click="scanCode">扫码入库</el-button>
+        <el-button class="button" size="mini" type="primary" v-if="type !== 'detail' && type !== 'check'"
+          @click="handleSelectWarehouseEntryBatch" :disabled="selectBtn">选择</el-button>
       </div>
       <div style="width: 100%; display: block;">
         <el-form-item style="width: 100%;">
@@ -72,13 +73,16 @@
             <el-table-column label="sku">
               <template slot-scope="scope">
                 <span v-if="!id"> {{ scope.row.product_vo.sku }}</span>
-              <span v-else> {{ scope.row.product_vo.sku }}</span>
+                <span v-else> {{ scope.row.product_vo.sku }}</span>
               </template>
             </el-table-column>
-            <el-table-column label="序列号">
+            <el-table-column label="序列号" width="160">
               <template slot-scope="scope">
-                <span v-if="!id"> {{ scope.row.product_vo.sn_code }}</span>
-              <span v-else> {{ scope.row.product_vo.sn_code }}</span>
+                <div class="sn-code-container">
+                  <span v-for="item in scope.row.sn_code_list" :key="item.id">
+                    <p>{{ item.sn_code }}</p>
+                  </span>
+                </div>
               </template>
             </el-table-column>
             <el-table-column prop="product_vo.spec_name" label="规格型号">
@@ -90,23 +94,24 @@
             <el-table-column label="单位">
               <template slot-scope="scope">
                 <span v-if="!id"> {{ scope.row.product_vo.unit }}</span>
-              <span v-else> {{ scope.row.product_vo.unit }}</span>
+                <span v-else> {{ scope.row.product_vo.unit }}</span>
               </template>
             </el-table-column>
             <el-table-column label="库存数量">
               <template slot-scope="scope">
-                {{ scope.row.usable_stock }}
+                {{ scope.row.actual_stock }}
               </template>
             </el-table-column>
             <el-table-column label="盘点数量">
               <template slot-scope="scope">
-                <el-input v-model="scope.row.inventory_num" type="number" :min="0" :maxlength="20"
-                  :disabled="type === 'detail' || type === 'audit' || type==='check'"></el-input>
+                <span v-if="type === 'check'">{{ scope.row.inventory_num }}</span>
+                <el-input v-else v-model="scope.row.inventory_num" type="number" :min="0" :maxlength="20"
+                  :disabled="type === 'detail' || type === 'audit' || type === 'check'"></el-input>
               </template>
             </el-table-column>
             <el-table-column label="差异">
               <template slot-scope="scope">
-                {{ scope.row.usable_stock - scope.row.inventory_num || 0 }}
+                {{ scope.row.actual_stock - scope.row.inventory_num || 0 }}
               </template>
             </el-table-column>
             <!-- <el-table-column label="备注">
@@ -115,7 +120,7 @@
                 <el-input v-model="scope.row.remark" :min="0" :maxlength="20" :disabled="true" v-show="false"></el-input>
               </template>
             </el-table-column> -->
-            <el-table-column label="操作" v-if="type !== 'detail' && type !== 'audit' && type!=='check'">
+            <el-table-column label="操作" v-if="type !== 'detail' && type !== 'audit' && type !== 'check'">
               <template slot-scope="scope">
                 <el-button size="mini" type="danger"
                   @click="goodsInventoryAddForm.product_list.splice(scope.$index, 1)">删除</el-button>
@@ -126,19 +131,33 @@
       </div>
     </el-form>
     <div class="footer">
-   <!--    <el-button v-if="type === 'audit' && type !== 'detail' && type!=='check'" type="primary" @click="handlePassGoodsInventory()">通过
+      <!--    <el-button v-if="type === 'audit' && type !== 'detail' && type!=='check'" type="primary" @click="handlePassGoodsInventory()">通过
       </el-button>
       <el-button v-if="type === 'audit' && type !== 'detail' && type!=='check'" type="danger" @click="dialogVisible = true">驳回
       </el-button> -->
-      <el-button v-if="type !== 'audit' && type !== 'detail' && type!=='check'" type="primary" @click="submitGoodsInventoryAddForm">保存
+      <el-button v-if="type !== 'audit' && type !== 'detail' && type !== 'check'" type="primary"
+        @click="submitGoodsInventoryAddForm">保存
       </el-button>
-      <el-button @click="printIng" v-if="type=='check'">打印</el-button>
+      <el-button @click="printIng" v-if="type == 'check'">打印</el-button>
       <el-button @click="$router.back()">返回
       </el-button>
     </div>
-
+    <el-dialog title="扫码入库" :visible.sync="scanDialogVisible" width="30%" :close-on-click-modal="false">
+      <el-form ref="scanGoodsForm" :model="scanGoodsForm" label-width="120px" inline>
+        <!-- @blur="blurCode()" -->
+        <el-form-item label="sku" prop="bar_code">
+          <el-input v-model="scanGoodsForm.bar_code" ref="input" @keyup.enter.native="toSearch()" :minlength="0"
+            :maxlength="100"></el-input>
+        </el-form-item>
+        <el-form-item label="序列号" prop="sn_code">
+          <el-input ref="sn_input" v-model="sn_code" @keyup.enter.native="toSnCode()" :minlength="0"
+            :maxlength="100"></el-input>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
     <el-dialog title="提示" :visible.sync="dialogVisible" width="30%">
-      <el-form ref="goodsInventoryAddForm" :model="goodsInventoryAddForm" label-width="120px" inline style="width:900px">
+      <el-form ref="goodsInventoryAddForm" :model="goodsInventoryAddForm" label-width="120px" inline
+        style="width:900px">
         <el-form-item label="驳回原因" prop="reject_reason" required="true">
           <el-input v-model="goodsInventoryAddForm.reject_reason" type="textarea" :minlength="0"
             :maxlength="100"></el-input>
@@ -156,6 +175,7 @@
 import { mapGetters } from 'vuex'
 import { Foundation, RegExp } from '~/ui-utils'
 import * as API_GoodsInventory from '@/api/goodsInventory'
+import * as API_GoodsExchange from "@/api/goodsExchange";
 import * as API_Setting from '@/api/setting'
 import * as API_BasicSetting from '@/api/basicSetting'
 import * as API_Erp from '@/api/erp'
@@ -173,7 +193,10 @@ export default {
       type: '',
       /** 出库单表单*/
       goodsInventoryAddForm: {
-        product_list: []
+        product_list: [],
+        inventory_time: new Date(),
+        inventory_person_id: '',
+        creator_id: ''
       },
       /** 校验规则 */
       goodsInventoryAddFormRule: {
@@ -183,43 +206,154 @@ export default {
         creator_id: { required: true, message: '请选择制单人', trigger: 'change' }
       },
       warehouseProduct: null,
-      typeList:[
-      ]
+      typeList: [
+      ],
+      scanDialogVisible: false,//扫码窗口
+      scanGoodsForm: {},
+      sn_code: "",
+      sn_code_list: [],
+      index: "",
+      selectBtn: false
     }
   },
   computed: {
-    ...mapGetters(['user'])
+    ...mapGetters(['user']),
+    timeDefault() {
+      var date = new Date();
+      var s1 = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + (date.getDate()) + " " + date.getHours() + ':' + date.getMinutes() + ':' + date.getSeconds();
+      return s1;
+    },
   },
   mounted() {
-    if (this.$route.name === 'goodsInventoryEdit') {
+   /*  if (this.$route.name === 'goodsInventoryEdit') {
       this.type = 'edit'
     } else if (this.$route.name === 'goodsInventoryAudit') {
       this.type = 'audit'
     } else if (this.$route.name === 'goodsInventoryReturn') {
       this.type = 'return'
-    } else if (this.$route.name === 'goodsInventoryAdd') {
+    } else */ if (this.$route.name === 'goodsInventoryAdd') {
       this.goodsInventoryAddForm.creator_id = this.user.uid
       this.goodsInventoryAddForm.inventory_person_id = this.user.uid
       this.goodsInventoryAddForm.dept_id = this.user.dept_id
-      this.GET_WarehouseList({ dept_id: this.user.dept_id })
-     /*  this.$set(this.goodsInventoryAddForm, 'inventory_time', new Date().getTime()) */
+      this.goodsInventoryAddForm.inventory_time = this.timeDefault;
     } else if (this.$route.name === 'goodsInventoryDetail') {
       this.type = 'detail'
-    }else if(this.$route.name === 'goodsInventoryCheck'){
-      this.type='check'
-    }
-    if (this.$route.params.id) {
+    } else if (this.$route.name === 'goodsInventoryCheck') {
+      this.type = 'check'
       this.id = this.$route.params.id
       this.GET_goodsInventoryAddDetail()
+      this.GET_AdministratorList()
+      this.GET_DeptList()
+      this.GET_WarehouseList()
     }
     this.GET_AdministratorList()
     this.GET_DeptList()
+    this.GET_WarehouseList()
+
   },
   methods: {
+    handleChangeInventoryType(val) {
+      this.goodsInventoryAddForm.product_list = []
+      if (val.value === 'ALL_INVENTORY') {
+        if (!this.goodsInventoryAddForm.warehouse_id) {
+          this.$message.error('请先选择仓库!')
+          return
+        }
+        API_GoodsInventory.getGoodByWarehouseInventory({ page: 1, size: 10000 }, this.goodsInventoryAddForm.warehouse_id).then(res => {
+          res.records.map(el=>{
+            el.sn_code_list=[]
+          })
+          this.goodsInventoryAddForm.product_list = res.records
+          this.selectBtn = true
+        })
+      } else {
+        this.selectBtn = false
+      }
+
+    },
+    //扫序列号goodsInventoryAddForm.product_list[this.index].sn_code_list
+    toSnCode() {
+      API_GoodsExchange.getSnCode("inventory", this.sku, this.sn_code.replace(/\s+/g, '')).then((res) => {
+        this.sn_code = "";
+        // 假设res是一个对象,我们根据res的某个属性(如sn)来检查重复
+        let exists = this.goodsInventoryAddForm.product_list[
+          this.index
+        ].sn_code_list.find(
+          (item) => item.sn_code === res.sn_code && item.sku === res.sku
+        );
+        if (!exists) {
+          this.goodsInventoryAddForm.product_list[this.index].sn_code_list.push(
+            res
+          );
+        }
+        /* this.goodsInventoryAddForm.product_list[this.index].sn_code_list.push(
+          res
+        ); */
+        this.goodsInventoryAddForm.product_list[this.index].inventory_num =
+          this.goodsInventoryAddForm.product_list[
+            this.index
+          ].sn_code_list.length;
+        this.scanGoodsForm.bar_code = "";
+        this.$nextTick(() => {
+          this.$refs.input.focus();
+        });
+      });
+    },
+    /* 扫sku */
+    toSearch() {
+      API_GoodsExchange.getProduct(
+        this.goodsInventoryAddForm.warehouse_id,
+        this.scanGoodsForm.bar_code.replace(/\s+/g, '')
+      ).then((res) => {
+        res.sn_code_list = [];
+        this.sku = res.product_vo.sku;
+        // 查找当前商品是否已存在于列表中
+        const indexs = this.goodsInventoryAddForm.product_list.findIndex(
+          (el) => {
+            console.log("Comparing with:", el);
+            return (
+              el.goods_id === res.goods_id &&
+              el.product_id === res.product_id &&
+              el.warehouse_id === res.warehouse_id &&
+              el.product_vo.sku === res.product_vo.sku
+            );
+          }
+        );
+        // 如果商品不存在,则添加到列表
+        if (indexs === -1) {
+          this.index = this.goodsInventoryAddForm.product_list.length;
+          this.goodsInventoryAddForm.product_list.push(res);
+        } else {
+          this.index = indexs;
+        }
+        if (res.product_vo.have_sn) {
+          this.$nextTick(() => {
+            this.$refs.sn_input.focus();
+          });
+        } else {
+          /* this.scanDialogVisible = false; */
+        }
+      });
+    },
+    // 扫码入库
+    scanCode() {
+      if (!this.goodsInventoryAddForm.warehouse_id) {
+        this.$message.error("请选择仓库!");
+        return;
+      }
+      if(!this.goodsInventoryAddForm.inventory_type){
+        this.$message.error("请选择盘点类型!");
+        return;
+      }
+      this.scanDialogVisible = true;
+      this.$nextTick(() => {
+        this.$refs.input.focus();
+      });
+    },
     getadminList(value) {
       // Access orderTypeList directly from the component's data
       const type = this.adminList.find(type => type.id === value);
-      return type ? type.name : '未知类型';
+      return type ? type.real_name : '未知类型';
     },
     getRoleSplit(value) {
       // Access orderTypeList directly from the component's data
@@ -228,11 +362,11 @@ export default {
     },
     getWarehouse(value) {
       // Access orderTypeList directly from the component's data
-      const type = this.WarehouseList.find(type => type.id === value);
+      const type = this.warehouseList.find(type => type.id === value);
       return type ? type.name : '未知类型';
     },
     // 打印功能
-    printIng(){
+    printIng() {
 
     },
     /** 修改报单人 */
@@ -297,7 +431,7 @@ export default {
     },
     /** 获取仓库 */
     GET_WarehouseList(e) {
-      API_BasicSetting.getWarehouseListAll(e).then(response => {
+      API_BasicSetting.getWarehouseListAll().then(response => {
         this.warehouseList = response
       })
     },
@@ -306,6 +440,7 @@ export default {
         if (valid) {
           const { id } = this.goodsInventoryAddForm
           const params = this.MixinClone(this.goodsInventoryAddForm)
+          params.inventory_type = params.inventory_type.id
           if (params.dept_id) {
             params.dept_name = this.deptListAll.find(dept => dept.id === params.dept_id).name
           }
@@ -324,11 +459,12 @@ export default {
               inventory_num: item.inventory_num * 1,
               product_name: item.product_name,
               product_sn: item.product_sn,
-              product_id:item.product_id,
+              product_id: item.product_id,
               specification: item.product_specification,
               unit: item.product_unit,
               remark: item.remark,
-              product_stock_id:item.id
+              product_stock_id: item.id,
+              sn_code_list:item.sn_code_list
             }
             return query
           })
@@ -365,19 +501,22 @@ export default {
         return
       }
       const goodsData = await this.$EnwarehouseEntryBatch({
-        goodsApi:`/admin/erp/warehouseOut/getGoodByWarehouse/${this.goodsInventoryAddForm.warehouse_id}`,
+        goodsApi: `/admin/erp/warehouseOut/getGoodByWarehouseInventory/${this.goodsInventoryAddForm.warehouse_id}`,
         warehouseList: this.warehouseList,
         selectedIds: this.id ? this.goodsInventoryAddForm.product_list && this.goodsInventoryAddForm.product_list.map(item => item.id) : this.goodsInventoryAddForm.product_list.map(item => item.id),
         purchasePlanApiParams: { warehouse_id: this.goodsInventoryAddForm.warehouse_id }
       })
       this.goodsInventoryAddForm.warehouse_id = goodsData.warehouse_id
-      let ProductLendNum = goodsData.purchasePlans.map(item => {
-        const query = {
+      /* let ProductLendNum =  */goodsData.purchasePlans.map(item => {
+        /* const query = {
           product_id: item.product_id,
-          stock_sn: item.warehouse_entry_sn
+          stock_sn: item.warehouse_entry_sn,
+          sn_code_list:[]
         }
-        return query
+        return query */
+        item.sn_code_list = [];
       })
+      console.log(goodsData.purchasePlans);
       this.goodsInventoryAddForm.product_list = goodsData.purchasePlans
       /* this.getlistProductLendNum(ProductLendNum, goodsData.purchasePlans) */
     },
@@ -447,7 +586,7 @@ export default {
             return el
           }) */
         this.goodsInventoryAddForm = response
-        this.GET_WarehouseList({ dept_id: response.dept_id })
+        this.GET_WarehouseList()
         this.goodsInventoryAddForm.distribution_name = response.staff_name
         this.goodsInventoryAddForm.product_list = this.goodsInventoryAddForm.product_list.map(item => {
           item.product_specification = item.specification
@@ -536,7 +675,12 @@ export default {
     }
   }
 }
-
+.sn-code-container {
+  max-height: 100px;
+  /* 设置最大高度,超过这个高度将显示滚动条 */
+  overflow-y: auto;
+  /* 垂直方向上溢出时显示滚动条 */
+}
 /deep/ {
   .el-input--suffix .el-input__inner {
     padding-right: 10px;

+ 2 - 1
manager-admin/src/views/stock/goodsTransfer.vue

@@ -86,11 +86,12 @@
         </el-table-column> -->
         <el-table-column prop="actual_stock" label="实际库存" >
           <template slot-scope="scope">
-           <span :style="scope.row.actual_stock<scope.row.warning_stock?'color:red':''">{{ scope.row.actual_stock }}</span> 
+           <span :style="Number(scope.row.actual_stock)<Number(scope.row.warning_stock)?'color:red':''">{{ scope.row.actual_stock }}</span> 
           </template>
         </el-table-column>
         <el-table-column prop="usable_stock" label="可用库存" />
         <el-table-column prop="transit_stock" label="在途库存" />
+        <el-table-column prop="locked_stock" label="冻结库存" />
         <el-table-column prop="warning_stock" label="预警库存" />
         <el-table-column label="操作" width="250">
           <template slot-scope="scope">

+ 1 - 0
manager-admin/src/views/stock/goodsUnderstockAdd.vue

@@ -279,6 +279,7 @@ export default {
           params.product_list = params.product_list.map((item) => {
             const query = {
               num: item.num,
+              goods_id:item.goods_id,
               use_able_num: Number(item.usable_stock),
               product_id: item.product_id,
               product_stock_id: item.id

+ 21 - 4
manager-admin/src/views/stock/orderAdd.vue

@@ -137,7 +137,7 @@
           <el-table-column type="selection" width="40" align="center" />
           <el-table-column label="图标">
             <template slot-scope="scope">
-              <img :src="scope.row.goods_vo.image_small_list" alt="" width="50px">
+              <img :src="cleanUrl(scope.row.goods_vo.image_small_list)" alt="" width="50px">
             </template>
           </el-table-column>
           <el-table-column label="仓库名称">
@@ -167,11 +167,11 @@
               <span v-else> {{ scope.row.product_vo.sn_code }}</span>
             </template>
           </el-table-column>
-          <el-table-column label="规格型号">
-            <template slot-scope="scope">
+          <el-table-column prop="product_vo.spec_name" label="规格型号">
+           <!--  <template slot-scope="scope">
               <span v-if="!id">{{ scope.row.product_vo.spec_name }}</span>
               <span v-else>{{ scope.row.product_vo.spec_name }}</span>
-            </template>
+            </template> -->
           </el-table-column>
           <el-table-column label="单位">
             <template slot-scope="scope">
@@ -703,6 +703,23 @@ export default {
     this.OrderForm.marketing_id = JSON.parse(JSON.parse(localStorage.getItem("admin_user")).data).uid
   },
   methods: {
+    cleanUrl(url) {
+      // 检查URL是否以.png结尾
+      if (url.endsWith('.png')) {
+        // 找到.png后第一个下划线的位置
+        const index = url.indexOf('.png') + 4;
+        // 返回从开始到.png后的字符串
+        return url.substring(0, index);
+      }
+      // 如果不是.png,可以选择去除最后一个下划线后的部分
+      // 这部分根据实际情况调整,这里假设总是去除最后一个下划线后的内容
+      const lastIndex = url.lastIndexOf('_');
+      if (lastIndex !== -1) {
+        return url.substring(0, lastIndex);
+      }
+      // 如果没有下划线,返回原URL
+      return url;
+    },
     // 租赁时间
     timeChange(val) {
       let start = new Date(val[1]); // 将起始日期字符串转换为Date对象

+ 18 - 1
manager-admin/src/views/stock/orderCheck.vue

@@ -107,7 +107,7 @@
                     <el-table-column type="selection" width="40" align="center" />
                     <el-table-column label="图标">
                         <template slot-scope="scope">
-                            <img :src="scope.row.goods_vo.image_small_list" alt="" width="50px">
+                            <img :src="cleanUrl(scope.row.goods_vo.image_small_list)" alt="" width="50px">
                         </template>
                     </el-table-column>
                     <el-table-column label="仓库名称">
@@ -570,6 +570,23 @@ export default {
         this.GET_CustomerList();
     },
     methods: {
+        cleanUrl(url) {
+            // 检查URL是否以.png结尾
+            if (url.endsWith('.png')) {
+                // 找到.png后第一个下划线的位置
+                const index = url.indexOf('.png') + 4;
+                // 返回从开始到.png后的字符串
+                return url.substring(0, index);
+            }
+            // 如果不是.png,可以选择去除最后一个下划线后的部分
+            // 这部分根据实际情况调整,这里假设总是去除最后一个下划线后的内容
+            const lastIndex = url.lastIndexOf('_');
+            if (lastIndex !== -1) {
+                return url.substring(0, lastIndex);
+            }
+            // 如果没有下划线,返回原URL
+            return url;
+        },
         //获取仓库名称
         warehouseNames(val) {
             let name = [];

+ 19 - 14
manager-admin/src/views/stock/orderOutbound.vue

@@ -21,7 +21,7 @@
           </el-row>
           <el-divider></el-divider>
           <h3>发货人信息:</h3>
-          <el-row>
+          <el-row class="el-row">
             <el-col :span="12">
               <el-form-item label="发货人姓名:" prop="sender.name">
                 {{ deliveryForms.sender.name }}
@@ -172,10 +172,10 @@
               <el-table-column label="序列号" v-if="sn_code_list">
                 <template slot-scope="scope">
                   <div class="sn-code-container">
-                  <span v-for="item in scope.row.sn_code_list" :key="item.id">
-                    <p>{{ item.sn_code }}</p>
-                  </span>
-                </div>
+                    <span v-for="item in scope.row.sn_code_list" :key="item.id">
+                      <p>{{ item.sn_code }}</p>
+                    </span>
+                  </div>
                 </template>
               </el-table-column>
               <el-table-column prop="product_vo.spec_name" label="规格型号">
@@ -627,7 +627,7 @@ export default {
           },
         ],
         total_volume: [
-          { required: true, message: "请输入物品总体积", trigger: "blur" },
+        { required: true, message: "请输入物品总体积", trigger: "blur" },
         ],
         declared_value: [
           { required: true, message: "请输入物品价格", trigger: "blur" },
@@ -826,6 +826,7 @@ export default {
         if (valid) {
           this.btnType = true;
           const params = this.MixinClone(this.deliveryForms);
+          
           //发货详细地址
           params.receiver.province_city_area_address =
             params.receiver.province_name +
@@ -843,12 +844,12 @@ export default {
           this.product_list.map((el) => {
             item.goods_name = el.goods_vo.name;
             /* item.goods_price = el.product_vo.price; */
-            item.quantity = el.num;
+            item.quantity = el.orderNum;
             item.unit = el.product_vo.unit;
             return params.goods_list.push(item);
           });
           params.goods_num = this.product_list.reduce(
-            (sum, e) => sum + Number(e.num || 0),
+            (sum, e) => sum + Number(e.orderNum || 0),
             0
           );
           params.total_weight = Number(params.total_weight);
@@ -908,7 +909,7 @@ export default {
             return params.goods_list.push(item);
           });
           params.goods_num = this.product_list.reduce(
-            (sum, e) => sum + Number(e.num || 0),
+            (sum, e) => sum + Number(e.orderNum || 0),
             0
           );
           params.total_weight = Number(params.total_weight);
@@ -926,6 +927,7 @@ export default {
             this.$router.push({ name: "warehouseOut" });
           });
         } else {
+          console.log(this.deliveryForms);
           this.$message.error("表单填写有误,请检查")
           return false;
         }
@@ -1077,11 +1079,10 @@ export default {
         }
         res.order_item_vos.map((el) => {
           el.orderNum = el.num
-          el.num = 0
-          if(!el.sn_code_list){
-             el.sn_code_list = []
+          if (!el.sn_code_list) {
+            el.sn_code_list = []
           }
-         
+
           this.deliveryForms.total_weight = Number(
             el.product_vo.weight * el.num
           );
@@ -1126,7 +1127,6 @@ export default {
 }
 
 .el-col {
-  padding: 10px;
   position: relative;
 
   &:not(:first-child)::before {
@@ -1175,12 +1175,14 @@ export default {
 .order-item {
   margin-top: 30px;
 }
+
 .sn-code-container {
   max-height: 100px;
   /* 设置最大高度,超过这个高度将显示滚动条 */
   overflow-y: auto;
   /* 垂直方向上溢出时显示滚动条 */
 }
+
 .footer {
   width: 100%;
   padding: 10px;
@@ -1189,6 +1191,9 @@ export default {
   z-index: 999;
   margin-top: 30px;
 }
+.el-form-item{
+   margin-bottom: 15px
+}
 
 /deep/ .el-form-item__content {
   display: flex;

+ 4 - 3
ui-components/PickerWarehouseEntryBatch/src/defaultOptions.js

@@ -64,10 +64,11 @@ export const generalColumns = [
   // { label: '仓库名称', prop: 'warehouse_entry_id' },
   { label: '商品编号', prop: 'goods_vo.sn' },
   // { label: '库位号',   prop: 'code'},
-  { label: 'sku', prop: 'product_vo.bar_code' },
-  { label: '序列号',   prop: 'product_vo.sn_code'},
+  { label: 'sku', prop: 'product_vo.sku' },
+  //{ label: '序列号',   prop: 'product_vo.sn_code'},
   { label: '商品名称', prop: 'goods_vo.name' },
   { label: '规格型号', prop: 'product_vo.spec_name' },
   { label: '单位', prop: 'product_vo.unit' },
-  { label: '库存数量', prop: 'usable_stock' }
+  { label: '可用库存', prop: 'usable_stock' },
+  { label: '实际库存', prop: 'actual_stock' }
 ]