Просмотр исходного кода

Merge branch 'dev' of http://110.41.163.243:9980/kd-aiot/kd-aiot-frontend-wms into dev

汪钰 3 лет назад
Родитель
Сommit
c7d568c7a9
22 измененных файлов с 3433 добавлено и 8 удалено
  1. 1 1
      .env
  2. 22 0
      src/store/modules/stockManagement.js
  3. 6 6
      src/views/login/index.vue
  4. 140 0
      src/views/warehouseManagement/stockLedger/allBatchDetails.vue
  5. 138 0
      src/views/warehouseManagement/stockLedger/batchDetails.vue
  6. 82 0
      src/views/warehouseManagement/stockLedger/components/BaseInfo.vue
  7. 135 0
      src/views/warehouseManagement/stockLedger/components/BatchDetailDialog.vue
  8. 389 0
      src/views/warehouseManagement/stockLedger/components/details/BaseInfo.vue
  9. 275 0
      src/views/warehouseManagement/stockLedger/components/details/BatchDetail.vue
  10. 226 0
      src/views/warehouseManagement/stockLedger/components/details/InWarehouse.vue
  11. 276 0
      src/views/warehouseManagement/stockLedger/components/details/InWarehouseDialog.vue
  12. 151 0
      src/views/warehouseManagement/stockLedger/components/details/InventoryAllocation.vue
  13. 109 0
      src/views/warehouseManagement/stockLedger/components/details/InventoryAllocationDialog.vue
  14. 238 0
      src/views/warehouseManagement/stockLedger/components/details/OutWarehouse.vue
  15. 131 0
      src/views/warehouseManagement/stockLedger/components/details/OutWarehouseDialg.vue
  16. 236 0
      src/views/warehouseManagement/stockLedger/components/details/ReportLoss.vue
  17. 262 0
      src/views/warehouseManagement/stockLedger/components/details/WarehouseDetail.vue
  18. 177 0
      src/views/warehouseManagement/stockLedger/components/item-list.vue
  19. 101 0
      src/views/warehouseManagement/stockLedger/components/item-search.vue
  20. 239 0
      src/views/warehouseManagement/stockLedger/enums.js
  21. 98 0
      src/views/warehouseManagement/stockLedger/index.vue
  22. 1 1
      src/views/warehouseManagement/warehouseDefinition/index.vue

+ 1 - 1
.env

@@ -1,2 +1,2 @@
-VUE_APP_NAME=凯德主数据平台
+VUE_APP_NAME=WMS仓储管理系统
 VUE_APP_API_BASE_URL=/api

+ 22 - 0
src/store/modules/stockManagement.js

@@ -0,0 +1,22 @@
+const state = {
+  stockLedgerBaseInfo: {}
+}
+
+const mutations = {
+  CHANGE_BASEINFO: (state, { key, value }) => {
+    // eslint-disable-next-line no-prototype-builtins
+    state.stockLedgerBaseInfo[key] = value
+  },
+  CLEAR_BASEINFO: state => {
+    state.stockLedgerBaseInfo = {}
+  }
+}
+
+const actions = {}
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions
+}

+ 6 - 6
src/views/login/index.vue

@@ -115,7 +115,7 @@
     // eslint-disable-next-line vue/multi-word-component-names
     name: 'Login',
     components: { I18nIcon },
-    data() {
+    data () {
       return {
         // 登录框方向, 0居中, 1居右, 2居左
         direction: 0,
@@ -135,7 +135,7 @@
     },
     computed: {
       // 表单验证规则
-      rules() {
+      rules () {
         return {
           loginName: [
             {
@@ -156,7 +156,7 @@
         };
       }
     },
-    created() {
+    created () {
       if (getToken()) {
         this.goHome();
       } else {
@@ -166,7 +166,7 @@
     },
     methods: {
       /* 提交 */
-      submit() {
+      submit () {
         this.$refs.form.validate((valid) => {
           if (!valid) {
             return false;
@@ -188,11 +188,11 @@
         });
       },
       /* 跳转到首页 */
-      goHome() {
+      goHome () {
         this.$router.push(this.$route?.query?.from ?? '/').catch(() => {});
       },
       /* 更换图形验证码 */
-      changeCaptcha() {
+      changeCaptcha () {
         // 这里演示的验证码是后端返回base64格式的形式, 如果后端地址直接是图片请参考忘记密码页面
         getCaptcha()
           .then((data) => {

+ 140 - 0
src/views/warehouseManagement/stockLedger/allBatchDetails.vue

@@ -0,0 +1,140 @@
+<template>
+  <div class="page">
+<!--    <div class="page-title">
+      <PageHeader
+        :title="`${baseInfo.assetCode || ''} ${baseInfo.assetName || ''}`"
+      ></PageHeader>
+    </div> -->
+    <div class="content-detail">
+      <el-tabs v-model="activeName">
+        <el-tab-pane label="基本信息" name="zero">
+          <BaseInfo :baseInfo="baseInfo"></BaseInfo>
+        </el-tab-pane>
+        <el-tab-pane label="库存明细" name="first">
+          <WarehouseDetail
+            v-if="activeName == 'first'"
+            :baseInfo="baseInfo"
+            :baseParams="baseParams"
+          ></WarehouseDetail>
+        </el-tab-pane>
+        <el-tab-pane label="批次明细" name="sixth" lazy>
+          <BatchDetail
+            v-if="activeName == 'sixth'"
+            :baseInfo="baseInfo"
+            :baseParams="baseParams"
+          ></BatchDetail>
+        </el-tab-pane>
+        <el-tab-pane label="入库单" name="second" lazy>
+          <InWarehouse
+            :baseInfo="baseInfo"
+            v-if="activeName == 'second'"
+            :baseParams="baseParams"
+          />
+        </el-tab-pane>
+        <el-tab-pane label="调拨记录" name="third" lazy>
+          <InventoryAllocation
+            :baseInfo="baseInfo"
+            v-if="activeName == 'third'"
+            :baseParams="baseParams"
+          />
+        </el-tab-pane>
+        <el-tab-pane label="出库单" name="fourth" lazy>
+          <OutWarehouse
+            :baseInfo="baseInfo"
+            v-if="activeName == 'fourth'"
+            :baseParams="baseParams"
+        /></el-tab-pane>
+        <el-tab-pane label="报损报溢" name="fifth" lazy>
+          <ReportLoss
+            :baseInfo="baseInfo"
+            v-if="activeName == 'fifth'"
+            :baseParams="baseParams"
+        /></el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+
+<script>
+// import PageHeader from '@/components/PageHeader'
+import BaseInfo from './components/details/BaseInfo.vue'
+import OutWarehouse from './components/details/OutWarehouse.vue'
+import InWarehouse from './components/details/InWarehouse.vue'
+import ReportLoss from './components/details/ReportLoss.vue'
+import InventoryAllocation from './components/details/InventoryAllocation.vue'
+import WarehouseDetail from './components/details/WarehouseDetail.vue'
+import BatchDetail from './components/details/BatchDetail.vue'
+
+export default {
+  components: {
+    // PageHeader,
+    BaseInfo,
+    InWarehouse,
+    OutWarehouse,
+    InventoryAllocation,
+    ReportLoss,
+    BatchDetail,
+    WarehouseDetail
+  },
+  data () {
+    return {
+      activeName: 'zero',
+      tableData: {
+        first: [],
+        second: [],
+        third: [],
+        fourth: [],
+        fifth: []
+      },
+      certificate: ''
+    }
+  },
+  computed: {
+    dimension () {
+      return this.$route.query.dimension
+    },
+    baseInfo () {
+      return ( {}
+        // this.$store.state.stockManagement.stockLedgerBaseInfo[
+        //   this.$route.query.key
+        // ] || {}
+      )
+    },
+    baseParams () {
+      return {
+        // inventoryCode: this.baseInfo.assetCode
+		
+		
+        // // name: this.baseInfo.assetName,
+        // // warehousingType: _warehousingType(this.baseInfo.assetType)
+        // //   .warehousingType,
+      }
+    }
+  },
+  created () {},
+  methods: {}
+}
+</script>
+
+<style lang="scss" scoped>
+.page {
+  background: #fff;
+  padding: 10px;
+  margin: 10px 0 10px 0;
+  height: calc(100vh - 80px);
+  padding: 10px;
+  overflow-y: auto;
+}
+.page-title {
+}
+.content-detail {
+  padding: 20px;
+}
+
+.certificate {
+  height: 65vh;
+  display: block;
+  margin: 10px auto;
+}
+
+</style>

+ 138 - 0
src/views/warehouseManagement/stockLedger/batchDetails.vue

@@ -0,0 +1,138 @@
+<template>
+  <div class="page">
+<!--    <div class="page-title">
+      <PageHeader :title="`批次号${baseInfo.batchNum || ''}`"></PageHeader>
+    </div> -->
+    <div class="content-detail">
+      <el-tabs v-model="activeName">
+        <el-tab-pane label="基本信息" name="zero">
+          <BaseInfo :baseInfo="baseInfo"></BaseInfo>
+        </el-tab-pane>
+        <el-tab-pane label="库存明细" name="first">
+          <WarehouseDetail
+            :baseInfo="baseInfo"
+            :baseParams="baseParams"
+          ></WarehouseDetail>
+        </el-tab-pane>
+        <el-tab-pane label="入库单" name="second" lazy>
+          <InWarehouse :baseInfo="baseInfo" :baseParams="baseParams"
+        /></el-tab-pane>
+        <el-tab-pane label="调拨记录" name="third" lazy>
+          <InventoryAllocation :baseInfo="baseInfo" :baseParams="baseParams" />
+        </el-tab-pane>
+        <el-tab-pane label="出库单" name="fourth" lazy>
+          <OutWarehouse :baseInfo="baseInfo" :baseParams="baseParams"
+        /></el-tab-pane>
+        <el-tab-pane label="报损报溢" name="fifth" lazy>
+          <ReportLoss :baseInfo="baseInfo" :baseParams="baseParams" />
+        </el-tab-pane>
+        <el-tab-pane
+          label="质检单"
+          name="sixth"
+          lazy
+          v-if="baseInfo.assetType == 3"
+        ></el-tab-pane>
+      </el-tabs>
+
+      <template v-if="activeName === 'sixth'">
+        <img class="certificate" :src="certificate" />
+      </template>
+    </div>
+  </div>
+</template>
+
+<script>
+import BaseInfo from './components/details/BaseInfo.vue'
+import OutWarehouse from './components/details/OutWarehouse.vue'
+import InWarehouse from './components/details/InWarehouse.vue'
+import ReportLoss from './components/details/ReportLoss.vue'
+import InventoryAllocation from './components/details/InventoryAllocation.vue'
+import WarehouseDetail from './components/details/WarehouseDetail.vue'
+import BatchDetail from './components/details/BatchDetail.vue'
+
+// import PageHeader from '@/components/PageHeader'
+import BatchDetailDialog from './components/BatchDetailDialog.vue'
+
+export default {
+  components: {
+    // PageHeader,
+    BaseInfo,
+    BatchDetailDialog,
+    InWarehouse,
+    OutWarehouse,
+    InventoryAllocation,
+    ReportLoss,
+    BatchDetail,
+    WarehouseDetail
+  },
+  data () {
+    return {
+      activeName: 'zero',
+      tableData: {
+        first: [],
+        second: [],
+        third: [],
+        fourth: [],
+        fifth: []
+      },
+      certificate: ''
+    }
+  },
+  computed: {
+    dimension () {
+      return this.$route.query.dimension
+    },
+    baseInfo () {
+      return (
+			{}
+        // this.$store.state.stockManagement.stockLedgerBaseInfo[
+        //   this.$route.query.key
+        // ] || {}
+      )
+    },
+    tableColumn () {
+      return this.tableColumnConfig[this.activeName] || []
+    },
+    baseParams () {
+      return {
+        inventoryCode: this.baseInfo.assetCode,
+        // // name: this.baseInfo.assetName,
+        // // warehousingType: _warehousingType(this.baseInfo.assetType)
+        // //   .warehousingType,
+        batchNum: this.baseInfo.batchNum
+      }
+    }
+  },
+  created () {},
+  methods: {
+    handleCellClick (row) {
+      this.$refs.batchDetailRef.open(this.activeName, {
+        ...row,
+        batchNum: this.baseInfo.batchNum
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.page {
+  background: #fff;
+  padding: 10px;
+  margin: 10px 0 10px 0;
+  height: calc(100vh - 80px);
+  padding: 10px;
+  overflow-y: auto;
+}
+.page-title {
+}
+.content-detail {
+  padding: 20px;
+}
+
+.certificate {
+  height: 65vh;
+  display: block;
+  margin: 10px auto;
+}
+</style>

+ 82 - 0
src/views/warehouseManagement/stockLedger/components/BaseInfo.vue

@@ -0,0 +1,82 @@
+<template>
+  <el-form>
+    <el-row>
+      <el-col :span="8">
+        <el-form-item label="编码">
+          <span>{{ baseInfo.assetCode }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="名称">
+          <span>{{ baseInfo.assetName }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="类型">
+          <span>{{ getDictValue('物品类型', baseInfo.assetType) }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="牌号">
+          <span>{{ baseInfo.brandNum }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="型号">
+          <span>{{ baseInfo.modelType }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="计量单位">
+          <span>{{ baseInfo.unit }}</span>
+        </el-form-item>
+      </el-col>
+      <!-- <el-col :span="8">
+        <el-form-item label="包装单位">
+          <span>{{ baseInfo.minPackUnit }}</span>
+        </el-form-item>
+      </el-col> -->
+      <!-- <el-col :span="8">
+        <el-form-item label="最小单元">
+          <span>{{ baseInfo.unit }}/{{ baseInfo.minPackUnit }}</span>
+        </el-form-item>
+      </el-col> -->
+      <el-col :span="8">
+        <el-form-item label="保质期">
+          <span></span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="24">
+        <el-form-item label="备注">
+          <span></span>
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+// import { useDictLabelFilter } from '@/utils/dict/index'
+// import { warehousingType } from '@/utils/dict/warehouse'
+// import dictMixins from '@/mixins/dictMixins'
+export default {
+  // mixins: [dictMixins],
+  props: {
+    baseInfo: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  filters: {
+    // useDictLabelFilter: useDictLabelFilter
+  },
+  data () {
+    return {
+      warehousingType
+    }
+  },
+  created () {
+    this.requestDict('物品类型')
+  }
+}
+</script>

+ 135 - 0
src/views/warehouseManagement/stockLedger/components/BatchDetailDialog.vue

@@ -0,0 +1,135 @@
+<template>
+  <el-dialog :visible.sync="visible" :title="`${title}明细`" width="70%">
+    <div class="info">
+      <div>批次号 {{ info.batchNum }}</div>
+      <div>{{ title }} {{ info.bizNum }}</div>
+    </div>
+    <el-table
+      :data="tableData"
+      height="500px"
+      class="w100"
+      border
+      :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+    >
+      <el-table-column label="序号" type="index"></el-table-column>
+      <el-table-column label="编号" prop="num"></el-table-column>
+      <el-table-column
+        label="生产日期"
+        prop="manufactureTime"
+      ></el-table-column>
+      <el-table-column label="过期日期" prop=""></el-table-column>
+      <el-table-column label="最小单元" prop="">
+        <template slot-scope="{ row }">{{
+          `${row.measurementUnit || ''}${row.unit}/${row.minPackUnit}`
+        }}</template>
+      </el-table-column>
+      <el-table-column
+        label="货位"
+        prop=""
+        v-if="title !== '调拨单号'"
+        show-overflow-tooltip
+      >
+        <template slot-scope="{ row }">{{
+          `${row.warehouseName}-${row.areaName}-${row.shelfCode}-${row.cargoSpaceCode}`
+        }}</template>
+      </el-table-column>
+      <el-table-column
+        label="调出货位"
+        prop="warehouseName"
+        v-if="title === '调拨单号'"
+      >
+        <template slot-scope="{ row }">
+          {{ row.warehouseName }} - {{ row.outWarehouseAreaName }} -
+          {{ row.outWarehouseAreaGoodsCode }} - {{ row.outGoodsAllocationCode }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="调入货位"
+        prop="inWarehouseName"
+        v-if="title === '调拨单号'"
+      >
+        <template slot-scope="{ row }">
+          {{ row.inWarehouseName }} - {{ row.inWarehouseAreaName }} -
+          {{ row.inWarehouseAreaGoodsCode }} - {{ row.inGoodsAllocationCode }}
+        </template>
+      </el-table-column>
+    </el-table>
+  </el-dialog>
+</template>
+
+<script>
+// import { titleCof } from '../enums'
+// import {
+//   getWarehouseSceneDetail,
+//   getTransferDetail
+// } from '@/api/stockManagement/stockLedger'
+export default {
+  props: {
+    assetCode: String
+  },
+  data () {
+    return {
+      visible: false,
+      title: '',
+      tableData: [],
+      info: {}
+    }
+  },
+  methods: {
+    open (active, { bizNum, batchNum, dialNumber }) {
+      this.title = titleCof[active]
+      this.info = { bizNum, batchNum }
+      switch (active) {
+        case 'second':
+          this._getWarehouseSceneDetail(bizNum, batchNum, 1)
+          break
+        case 'third':
+          this.info.bizNum = dialNumber
+          this._getTransferDetail(dialNumber, batchNum, 1)
+          break
+        case 'fourth':
+          this._getWarehouseSceneDetail(bizNum, batchNum, 2)
+          break
+
+        default:
+          break
+      }
+
+      this.visible = true
+    },
+
+    async _getWarehouseSceneDetail (bizNum, batchNum, bizStatus) {
+      const res = await getWarehouseSceneDetail({
+        bizNum,
+        batchNum,
+        bizStatus,
+        inventoryCode: this.assetCode
+      })
+      if (res?.success) {
+        this.tableData = res.data
+      }
+    },
+    async _getTransferDetail (bizNum, batchNum) {
+      const res = await getTransferDetail({
+        bizNum,
+        batchNum,
+        inventoryCode: this.assetCode
+      })
+      if (res?.success) {
+        this.tableData = res.data
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.info {
+  font-weight: bold;
+  color: #000;
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+  margin-bottom: 20px;
+}
+</style>

+ 389 - 0
src/views/warehouseManagement/stockLedger/components/details/BaseInfo.vue

@@ -0,0 +1,389 @@
+<template>
+  <div class="detail-box">
+    <el-descriptions title="" :column="5" size="medium" border>
+      <el-descriptions-item label="类型标识">
+        {{ baseInfo.classificationCode }}
+      </el-descriptions-item>
+      <el-descriptions-item label="物品类型">
+        {{ getDictValue('物品类型', baseInfo.assetType) }}
+      </el-descriptions-item>
+      <el-descriptions-item label="物品编码">
+        {{ baseInfo.assetCode }}
+      </el-descriptions-item>
+      <el-descriptions-item label="物品名称">
+        {{ baseInfo.assetName }}
+      </el-descriptions-item>
+      <el-descriptions-item label="允许拆包">
+        {{ baseInfo.isUnpack ? '是' : '否' }}
+      </el-descriptions-item>
+
+      <el-descriptions-item
+        :label="item.label"
+        v-for="(item, index) in uniqueData"
+        :key="index"
+      >
+        <template v-if="item.formatter">{{
+          item.formatter(baseInfo)
+        }}</template>
+        <template v-else>{{ baseInfo[item.prop] }}</template>
+      </el-descriptions-item>
+
+      <el-descriptions-item label="分类">
+        {{ baseInfo.classificationUrl }}
+      </el-descriptions-item>
+      <el-descriptions-item label="计量单位">
+        {{ baseInfo.unit }}
+      </el-descriptions-item>
+      <el-descriptions-item label="安全库存">
+        {{ baseInfo.safeStock }}
+      </el-descriptions-item>
+      <el-descriptions-item label="实时库存">
+        {{ baseInfo.realInventoryNum }}
+      </el-descriptions-item>
+      <el-descriptions-item label="锁单数量">
+        <!-- {{ baseInfo.assetType }} -->
+      </el-descriptions-item>
+      <el-descriptions-item label="空闲数量">
+        <!-- {{ baseInfo.assetType }} -->
+      </el-descriptions-item>
+      <!-- <el-descriptions-item label="允许转资产">
+        {{ baseInfo.assetType }}
+      </el-descriptions-item> -->
+      <el-descriptions-item label="包装单位">
+        {{ baseInfo.minPackUnit }}
+      </el-descriptions-item>
+      <!-- <el-descriptions-item label="包装数量">
+        {{ baseInfo.outInNum }}{{ baseInfo.minPackUnit }}
+      </el-descriptions-item> -->
+      <el-descriptions-item label="保质期">
+        <template
+          v-if="baseInfo.expirationDate || baseInfo.expirationDate === 0"
+        >
+          {{ baseInfo.expirationDate
+          }}{{ dateDict[baseInfo.expirationDateUnit] }}
+        </template>
+      </el-descriptions-item>
+      <el-descriptions-item label="库存累计重量" v-if="baseInfo.assetType == 4">
+      </el-descriptions-item>
+      <el-descriptions-item
+        :label="item.key"
+        v-for="(item, index) in selfDefinedParameter"
+        :key="index"
+      >
+        {{ item.value }}
+      </el-descriptions-item>
+      <el-descriptions-item label="描述" :span="5">
+        {{ baseInfo.description }}
+      </el-descriptions-item>
+    </el-descriptions>
+    <!-- 模具、物料 -->
+    <template v-if="[6, 3].includes(baseInfo.assetType)">
+      <div class="basic-details-title border-none">
+        <span class="border-span">匹配产品</span>
+      </div>
+      <el-descriptions title="" :column="5" size="medium" border>
+        <el-descriptions-item
+          v-for="(item, index) in productData"
+          :key="index"
+          :label="item.informationCode"
+        >
+          {{ item.informationName }}
+        </el-descriptions-item>
+      </el-descriptions>
+    </template>
+    <!-- 生产设备、产品 -->
+    <template v-if="[1, 4].includes(baseInfo.assetType)">
+      <div class="basic-details-title border-none">
+        <span class="border-span">匹配模具</span>
+      </div>
+      <el-descriptions title="" :column="5" size="medium" border>
+        <el-descriptions-item
+          v-for="(item, index) in mouldData"
+          :key="index"
+          :label="item.informationCode"
+        >
+          {{ item.informationName }}
+        </el-descriptions-item>
+      </el-descriptions>
+    </template>
+    <!-- 生产设备 -->
+    <!-- <template v-if="[1].includes(baseInfo.assetType)"> -->
+	<template>
+      <!-- <div class="basic-details-title border-none">
+        <span class="border-span">匹配备品备件</span>
+      </div> -->
+	  <HeaderTitle title="匹配备品备件" size="16px"></HeaderTitle>
+      <el-descriptions title="" :column="5" size="medium" border>
+        <el-descriptions-item
+          v-for="(item, index) in partData"
+          :key="index"
+          :label="item.informationCode"
+        >
+          {{ item.informationName }}
+        </el-descriptions-item>
+      </el-descriptions>
+    </template>
+    <!-- 模具、备品备件 -->
+    <!-- <template v-if="[6, 7].includes(baseInfo.assetType)"> -->
+	<template>
+      <!-- <div class="basic-details-title border-none">
+        <span class="border-span">匹配设备</span>
+      </div> -->
+	  <HeaderTitle title="匹配设备" size="16px"></HeaderTitle>
+      <el-descriptions title="" :column="5" size="medium" border>
+        <el-descriptions-item
+          v-for="(item, index) in facilityData"
+          :key="index"
+          :label="item.informationCode"
+        >
+          {{ item.informationName }}
+        </el-descriptions-item>
+      </el-descriptions>
+    </template>
+  </div>
+</template>
+
+<script>
+import { mapGetters, mapActions } from 'vuex'
+// import { getDetails as getMatchData } from '@/api/stockManagement/itemInformation'
+export default {
+  data () {
+    return {
+      productData: [],
+      mouldData: [],
+      partData: [],
+      bomData: [],
+      facilityData: [],
+      dateDict: {
+        minute: '分钟',
+        hour: '小时',
+        day: '天',
+        month: '月',
+        year: '年'
+      }
+    }
+  },
+  props: {
+    baseInfo: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  computed: {
+    ...mapGetters(['getDictValue']),
+    selfDefinedParameter () {
+			[]
+      // return JSON.parse(this.baseInfo.selfDefinedParameter) || []
+    },
+    uniqueData () {
+      switch (+this.baseInfo.assetType) {
+        case 3: //物料
+          return [{ label: '牌号', prop: 'brandNum' }]
+        case 8: //耗材
+          return [
+            { label: '型号', prop: 'modelType' },
+            { label: '规格', prop: 'specification' }
+          ]
+        case 4: //产品
+          return [
+            { label: '牌号', prop: 'brandNum' },
+            { label: '型号', prop: 'modelType' },
+            {
+              label: '标准单重',
+              prop: 'modelType',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return `${extendField.unqualifiedRate || '-'}KG`
+              }
+            },
+            {
+              label: '不良品率',
+              prop: 'modelType',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return `${extendField.unqualifiedRate || '-'}%`
+              }
+            }
+          ]
+        case 5: //'周转车'
+          return [
+            { label: '规格', prop: 'specification' },
+            {
+              label: '材质',
+              prop: 'texture',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return extendField.texture
+              }
+            },
+            {
+              label: '长宽高',
+              prop: '',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return `${extendField.length || '-'}/${
+                  extendField.width || '-'
+                }/${extendField.high || '-'}`
+              }
+            }
+          ]
+        case 2: //'舟皿'
+          return [
+            { label: '规格', prop: 'specification' },
+            { label: '型号', prop: 'modelType' },
+            {
+              label: '角度',
+              prop: '',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+
+                return { notA: '非A', A: 'A' }[extendField.angle]
+              }
+            },
+            {
+              label: '长宽高',
+              prop: '',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return `${extendField.length || '-'}*${
+                  extendField.width || '-'
+                }*${extendField.high || '-'}`
+              }
+            }
+          ]
+        case 1: //'设备'
+          return [
+            { label: '型号', prop: 'modelType' },
+            { label: '规格', prop: 'specification' }
+          ]
+        case 6: //'模具'
+          return [
+            { label: '牌号', prop: 'brandNum' },
+            { label: '型号', prop: 'modelType' },
+            {
+              label: '大模体型号',
+              prop: '',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return extendField.dieBodyModel
+              }
+            },
+            {
+              label: '最大冲压次数',
+              prop: '',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return extendField.maximumStampingTimes
+              }
+            },
+            {
+              label: '收缩系数',
+              prop: '',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return extendField.shrinkageCoefficient
+              }
+            },
+            {
+              label: '芯杆数量',
+              prop: '',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return extendField.mandrelNum
+              }
+            },
+            {
+              label: '模孔数量',
+              prop: '',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return extendField.dieHoleNum
+              }
+            },
+            {
+              label: '上冲头数量',
+              prop: '',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return extendField.upperPunchNum
+              }
+            },
+            {
+              label: '下冲头数量',
+              prop: '',
+              formatter (row) {
+                if (!row?.extendField) return ''
+                const extendField = JSON.parse(row.extendField)
+                return extendField.lowerPunchNum
+              }
+            }
+          ]
+        case 7: //'备品备件'
+          return [
+            { label: '规格', prop: 'specification' },
+            { label: '型号', prop: 'modelType' }
+          ]
+      }
+
+      return []
+    }
+  },
+  created () {
+    // this.requestDict('物品类型')
+    // this._getMatchData()
+  },
+  methods: {
+    ...mapActions('dict', ['requestDict']),
+    async _getMatchData () {
+      const res = await getMatchData({ id: this.baseInfo.materialId })
+      if (res?.success) {
+        for (const key in res.data.informationRelationMap) {
+          this.matchList(key, res.data.informationRelationMap)
+        }
+      }
+    },
+    matchList (key, data) {
+      switch (key) {
+        case 'w01': {
+          this.facilityData = data[key]
+          break
+        }
+        case 'w04': {
+          this.mouldData = data[key]
+          break
+        }
+        case 'w05': {
+          this.partData = data[key]
+          break
+        }
+        case 'w07': {
+          this.productData = data[key]
+          break
+        }
+        default:
+          break
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.detail-box{
+	margin: 0 auto;
+	.el-descriptions{
+		margin: 20px 0;
+	}
+}
+</style>

+ 275 - 0
src/views/warehouseManagement/stockLedger/components/details/BatchDetail.vue

@@ -0,0 +1,275 @@
+<!-- 批次明细 -->
+<template>
+  <div class="detail-box">
+    <el-form label-width="70px">
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="批次号">
+            <el-input
+              v-model="searchForm.batchNum"
+              placeholder="请输入"
+              size="small"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6" style="text-align: right">
+          <el-button
+            @click="search"
+            type="primary"
+            icon="el-icon-search"
+            size="small"
+            >搜索</el-button
+          >
+          <el-button @click="reset" icon="el-icon-refresh-left" size="small"
+            >重置</el-button
+          >
+        </el-col>
+        <el-col
+          :span="12"
+          style="
+            display: flex;
+            align-items: flex-end;
+            justify-content: flex-end;
+          "
+        >
+          <el-checkbox
+            v-model="searchForm.isZero"
+            true-label="true"
+            false-label="false"
+            @change="search"
+            >显示0库存批次号</el-checkbox
+          >
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table
+      :data="tableData"
+      :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+      ><el-table-column width="80px" label="序号">
+        <template slot-scope="{ $index }">
+          {{ $tableIndex($index, page, size) }}
+        </template>
+      </el-table-column>
+
+      <el-table-column label="批次号" prop="batchNum" sortable>
+        <template slot-scope="{ row }">
+          <el-popover
+            placement="bottom-start"
+            title=""
+            width="900"
+            trigger="click"
+          >
+            <el-table
+              :data="row.children"
+              height="300"
+              row-key="index"
+              :header-cell-style="{
+                background: '#EEEEEE',
+                border: 'none'
+              }"
+              v-loading="row.loading"
+            >
+              <el-table-column label="入库单号" prop="bizNum"></el-table-column>
+              <el-table-column label="入库场景" prop="bizScene">
+                <template slot-scope="{ row }">
+                  {{ getSceneState(+row.bizScene) }}
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="入库数量"
+                prop="outInNum"
+              ></el-table-column>
+              <el-table-column label="计量单位" prop="unit"></el-table-column>
+              <el-table-column
+                label="包装数量"
+                prop="measurementUnit"
+              ></el-table-column>
+              <el-table-column
+                label="包装单位"
+                width="120"
+                prop="minPackUnit"
+              ></el-table-column>
+              <el-table-column
+                label="库位"
+                prop=""
+                min-width="150"
+                show-overflow-tooltip
+              >
+                <template slot-scope="{ row }">
+                  {{ row.warehouseName }}-{{ row.areaName }}-{{
+                    row.shelfCode
+                  }}-{{ row.cargoSpaceCode }}
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="入库时间"
+                prop="createTime"
+              ></el-table-column>
+            </el-table>
+            <el-link
+              type="primary"
+              slot="reference"
+              @click.stop="handleExpand(row)"
+              >{{ row.batchNum }}</el-link
+            >
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="库存数量"
+        prop="realInventoryNum"
+      ></el-table-column>
+      <el-table-column label="计量单位" prop="unit"></el-table-column>
+      <el-table-column
+        label="包装数量"
+        prop="measurementUnit"
+      ></el-table-column>
+      <el-table-column label="包装单位" prop="minPackUnit"></el-table-column>
+      <el-table-column label="首次入库时间" prop="firstTime"></el-table-column>
+      <el-table-column label="最近出库时间" prop="lastTime"></el-table-column>
+      <el-table-column label="质检单" prop="" v-if="baseInfo.assetType === 3">
+        <template slot-scope="{ row }">
+          <el-button type="text" @click="_getAnalysisCertificate(row)"
+            >查看</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <Pagination
+      :total="total"
+      :page.sync="page"
+      :size.sync="size"
+      @pagination="handlePageChange"
+    />
+
+    <el-dialog :visible.sync="certificateVisible" title="质检单" width="55vw">
+      <div style="text-align: center; max-height: 80vh; overflow: auto">
+        <img class="certificate" :src="certificate" style="width: 50vw" />
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import Pagination from '@/components/Pagination'
+// import { sceneState } from '@/utils/dict/index'
+// import { useDictLabel } from '@/utils/dict/index'
+// import {
+//   inWarehouseSceneDetail,
+//   getAnalysisCertificate,
+//   getDetail
+// } from '@/api/stockManagement/stockLedger'
+// import { imageView } from '@/utils/index'
+export default {
+  components: { Pagination },
+  props: {
+    baseInfo: {
+      type: Object,
+      default: () => ({})
+    },
+    baseParams: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data () {
+    return {
+      searchForm: { batchNum: '', isZero: '' },
+      tableData: [],
+      size: 15,
+      page: 1,
+      total: 0,
+      certificateVisible: false,
+      certificate: ''
+    }
+  },
+  created () {
+    // this.getList()
+  },
+  methods: {
+    // getSceneState: useDictLabel(sceneState),
+    //质检单  资产类型、资产编码以及批次号获取质检单
+    async _getAnalysisCertificate (row) {
+      if (row.certificate) {
+        this.certificate = row.certificate
+        this.certificateVisible = true
+
+        return
+      }
+      const res = await getAnalysisCertificate({
+        code: this.baseInfo.assetType,
+        ...this.baseParams,
+        batchNum: row.batchNum
+      })
+      if (res?.success) {
+        if (res.data?.length) {
+          imageView(res.data[0]).then(res => {
+            this.certificate = res
+            this.$set(row, 'certificate', res)
+            this.certificateVisible = true
+          })
+        } else {
+          this.$message.error('未上传质检单!')
+        }
+      }
+    },
+    // 批次入库详情
+    async handleExpand (row) {
+      if (!row.children?.length) {
+        this.$set(row, 'loading', true)
+        const res = await inWarehouseSceneDetail({
+          ...this.baseParams,
+          bizStatus: 1,
+          batchNum: row.batchNum
+        })
+        if (res?.success) {
+          this.$set(
+            row,
+            'children',
+            res.data.map((item, index) => ({
+              index: index + '' + Date.now(),
+              ...item
+            }))
+          )
+        }
+        this.$set(row, 'loading', false)
+      }
+    },
+    search () {
+      this.page = 1
+      this.getList()
+    },
+    reset () {
+      this.searchForm = {}
+      this.search()
+    },
+    handlePageChange () {
+      this.getList()
+    },
+    async getList () {
+      const params = {
+        size: this.size,
+        page: this.page,
+        ...this.baseParams,
+        batchNum: this.baseParams.batchNum || this.searchForm.batchNum,
+        isZero: this.searchForm.isZero,
+        inventoryCode: this.baseInfo.assetCode,
+        name: this.baseInfo.assetName,
+        dimension: +this.$route.query.dimension
+      }
+      const res = await getDetail(params)
+      if (res?.success) {
+        this.tableData = (res.data.records || []).map((item, index) => ({
+          index: index + '' + Date.now(),
+          ...item
+        }))
+        this.total = res.data.total
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.detail-box{
+	margin: 20px auto;
+}
+</style>

+ 226 - 0
src/views/warehouseManagement/stockLedger/components/details/InWarehouse.vue

@@ -0,0 +1,226 @@
+<!-- 入库 -->
+<template>
+  <div class="detail-box">
+    <el-form label-width="100px">
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="入库场景"
+            ><el-select
+              placeholder="请选择"
+              v-model="searchForm.bizScene"
+              clearable
+            >
+              <el-option
+                v-for="item in sceneState"
+                :key="item.code"
+                :value="item.code + ''"
+                :label="item.label"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="入库单号" prop="bizNum">
+            <el-input
+              v-model="searchForm.bizNum"
+              placeholder="请输入"
+              size="small"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="入库数量">
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.warehouseStart"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.warehouseStart)) {
+                      searchForm.warehouseStart = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+            <el-col :span="2" style="text-align: center">~</el-col>
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.warehouseEnd"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.warehouseEnd)) {
+                      searchForm.warehouseEnd = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="包装数量">
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.packetStart"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.packetStart)) {
+                      searchForm.packetStart = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+            <el-col :span="2" style="text-align: center">~</el-col>
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.packetEnd"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.packetEnd)) {
+                      searchForm.packetEnd = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24" style="text-align: right; margin-bottom: 20px">
+          <el-button
+            @click="search"
+            type="primary"
+            icon="el-icon-search"
+            size="small"
+            >搜索</el-button
+          >
+          <el-button @click="reset" icon="el-icon-refresh-left" size="small"
+            >重置</el-button
+          >
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table
+      :data="tableData"
+      @cell-click="handleCellClick"
+      :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+      ><el-table-column width="80px" label="序号">
+        <template slot-scope="{ $index }">
+          {{ $tableIndex($index, page, size) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="入库单号" prop="bizNum"></el-table-column>
+      <el-table-column label="入库场景" prop="bizScene">
+        <template slot-scope="{ row }">{{
+          getSceneState(+row.bizScene)
+        }}</template>
+      </el-table-column>
+      <el-table-column
+        label="入库数量"
+        prop="measurementUnit"
+      ></el-table-column>
+      <el-table-column label="计量单位" prop="unit"></el-table-column>
+      <el-table-column label="包装数量" prop="outInNum"></el-table-column>
+      <el-table-column label="包装单位" prop="minPackUnit"></el-table-column>
+      <el-table-column label="操作人" prop="createUsername"></el-table-column>
+      <el-table-column label="审核人" prop="verifyName"></el-table-column>
+      <el-table-column label="入库时间" prop="verifyTime"></el-table-column>
+    </el-table>
+    <Pagination
+      :total="total"
+      :page.sync="page"
+      :size.sync="size"
+      @pagination="handlePageChange"
+    />
+    <InWarehouseDialog
+      ref="detailRef"
+      :assetCode="baseInfo.assetCode"
+      :baseInfo="baseInfo"
+    />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination'
+// import { getInWarehouseDetail } from '@/api/stockManagement/stockLedger'
+// import { sceneState } from '@/utils/dict/index'
+import InWarehouseDialog from './InWarehouseDialog'
+// import { useDictLabel } from '@/utils/dict/index'
+export default {
+  components: { Pagination, InWarehouseDialog },
+  props: {
+    baseInfo: {
+      type: Object,
+      default: () => ({})
+    },
+    baseParams: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data () {
+    return {
+      // sceneState,
+	  sceneState:[],
+      searchForm: {
+        bizNum: '',
+        warehouseEnd: '',
+        warehouseStart: '',
+        packetEnd: '',
+        packetStart: ''
+      },
+      tableData: [],
+      size: 15,
+      page: 1,
+      total: 0
+    }
+  },
+  created () {
+    this.getList()
+  },
+  methods: {
+    // getSceneState: useDictLabel(sceneState),
+    search () {
+      this.page = 1
+      this.getList()
+    },
+    reset () {
+      this.searchForm = {}
+      this.search()
+    },
+    handleCellClick (row) {
+      this.$refs.detailRef.open(row)
+    },
+    handlePageChange () {
+      this.getList()
+    },
+    async getList () {
+      const res = await getInWarehouseDetail({
+        bizStatus: 1,
+        size: this.size,
+        page: this.page,
+        ...this.baseParams,
+        ...this.searchForm,
+        batchNum: this.baseParams.batchNum || this.searchForm.batchNum
+      })
+      if (res?.success) {
+        this.tableData = res.data.records
+        this.total = res.data.total
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.detail-box{
+	margin: 20px auto;
+}
+</style>

+ 276 - 0
src/views/warehouseManagement/stockLedger/components/details/InWarehouseDialog.vue

@@ -0,0 +1,276 @@
+<template>
+  <el-dialog :visible.sync="visible" title="入库明细" width="70%">
+    <div class="info">
+      <div>入库单号 {{ info.bizNum }}</div>
+      <div class="search-box">
+        <el-input
+          v-model="searchVal"
+          size="small"
+          v-if="dimension === 1"
+          :placeholder="`搜索${assetTypeName}编码/批次号`"
+        ></el-input>
+        <el-input
+          v-else
+          size="small"
+          v-model="searchVal"
+          :placeholder="`搜索${assetTypeName}编码`"
+        ></el-input>
+        <!-- <el-button size="small" @click="handleCreateCode"
+          >批量生成二维码</el-button
+        > -->
+      </div>
+    </div>
+    <el-table
+      :data="showTableData"
+      height="60vh"
+      class="w100"
+      border
+      @selection-change="handleSelectionChange"
+      :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+    >
+      <el-table-column label="序号" type="index"></el-table-column>
+      <el-table-column
+        :label="`${assetTypeName}编码`"
+        prop="onlyCode"
+      ></el-table-column>
+      <el-table-column label="包装编码" prop="num"></el-table-column>
+      <el-table-column label="最小包装单元" prop="" v-if="!baseInfo.isUnpack">
+        <template slot-scope="{ row }">{{
+          `${row.measurementUnit || ''}${row.unit}/${row.minPackUnit}`
+        }}</template>
+      </el-table-column>
+      <el-table-column
+        label="批次号"
+        prop="batchNum"
+        v-if="dimension == 1"
+      ></el-table-column>
+      <el-table-column label="生产日期" prop="manufactureTime">
+        <template slot-scope="{ row }">{{
+          row.manufactureTime || row.procurementTime
+        }}</template></el-table-column
+      >
+      <el-table-column label="过期时间" prop="expirationTime"></el-table-column>
+      <el-table-column label="货位" prop="" show-overflow-tooltip>
+        <template slot-scope="{ row }">
+          {{
+            `${row.warehouseName}-${row.areaName}-${row.shelfCode}-${row.cargoSpaceCode}`
+          }}
+        </template>
+      </el-table-column>
+      <el-table-column type="selection"></el-table-column>
+    </el-table>
+    <QrPrint
+      ref="QrPrint"
+      @close="QrPrintClose"
+      :config="barCodeConfig"
+      :openBarCode.sync="openWindows"
+    />
+  </el-dialog>
+</template>
+
+<script>
+// import { getWarehouseSceneDetail } from '@/api/stockManagement/stockLedger'
+// import dictMixin from '@/mixins/dictMixins'
+// import { batchBarPrint } from '@/api/ledgerAssets/booksList'
+// import QrPrint from '@/components/print/printPDF.vue'
+
+// 条码类型枚举
+const codeTypeObj = {
+  生产设备: 0,
+  // 舟皿: '',
+  周转车: 1,
+  模具: 3,
+  混合料: 4,
+  混炼料: 5,
+  破碎料: 6,
+  返回料: 8,
+  返工料: 9,
+  备品备件: 10,
+  车削料: 11,
+  风管料: 12,
+  地面料: 13
+}
+export default {
+  // mixins: [dictMixin],
+  // components: { QrPrint },
+  props: {
+    assetCode: String,
+    baseInfo: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data () {
+    return {
+      openWindows: false,
+      visible: false,
+      tableData: [],
+      info: {},
+      barCodeConfig: [],
+      searchVal: '',
+      selectList: []
+    }
+  },
+  computed: {
+    dimension () {
+      return this.$route.query.dimension
+    },
+    showTableData () {
+      return this.tableData.filter(item => {
+        if (this.searchVal) {
+          return (
+            (item.onlyCode && item.onlyCode.indexOf(this.searchVal)) > -1 ||
+            (item.batchNum &&
+              this.dimension == 1 &&
+              item.batchNum.indexOf(this.searchVal)) > -1
+          )
+        }
+        return true
+      })
+    },
+    assetTypeName () {
+      return this.getDictValue('物品类型', this.baseInfo.assetType)
+    }
+  },
+  created () {
+    // this.requestDict('物品类型')
+  },
+  methods: {
+    open ({ bizNum, batchNum }) {
+      this.info = { bizNum, batchNum }
+      this._getWarehouseSceneDetail(bizNum, batchNum)
+
+      this.visible = true
+    },
+
+    async _getWarehouseSceneDetail (bizNum, batchNum) {
+      const res = await getWarehouseSceneDetail({
+        bizNum,
+        batchNum,
+        bizStatus: 1,
+        inventoryCode: this.assetCode
+      })
+      if (res?.success) {
+        this.tableData = res.data
+      }
+    },
+    handleSelectionChange (val) {
+      this.selectList = val
+    },
+    handleCreateCode () {
+      console.log(this.baseInfo, 222)
+      const classificationArr =
+        this.baseInfo?.classificationUrl?.split('-') || []
+
+      let index = 0
+      let barType
+      while (classificationArr[index]) {
+        barType = codeTypeObj[classificationArr[index]]
+        if (barType !== undefined) {
+          break
+        }
+        index++
+      }
+
+      if (barType === undefined) {
+        return this.$message.error('当前物品类型不支持生成二维码')
+      }
+      if (!this.selectList?.length) {
+        return this.$message.error('请选择数据')
+      }
+
+      this.handlPrint(barType)
+    },
+    QrPrintClose () {
+      this.barCodeConfig = []
+    },
+    async handlPrint (barType) {
+      this.openWindows = true
+      let params = this.selectList.map(item => {
+        return {
+          barType: barType,
+          bizId: item.id
+        }
+      })
+      let _this = this
+      const res = await batchBarPrint(params)
+      async function getResList () {
+        for (const el of res.data) {
+          const fontTypeObj = { 1: '宋体', 2: '微软雅黑', 3: 'Arial' }
+          let item = el
+          item.useModeList = item.useModeList.sort((a, b) => {
+            return a.barAvg.substr(4) - b.barAvg.substr(4)
+          })
+          const useModeList = item.useModeList
+          // 条码框数据
+          _this.barCodeConfig.push({
+            putType: el.putType,
+            qrCode: el.qrCode,
+            sizeLong: el.sizeLong,
+            sizeWide:el.sizeWide,
+            code1: useModeList[0].sampleData,
+            code2: useModeList[1].sampleData,
+            code3: useModeList[2].sampleData,
+            code4: useModeList[3].sampleData,
+            code5: useModeList[4].sampleData,
+            code6: useModeList[5].sampleData,
+            code7: useModeList[6].sampleData,
+            code8: useModeList[7].sampleData,
+            code9: useModeList[8].sampleData,
+            code10: useModeList[9].sampleData,
+            code11: useModeList[10].sampleData,
+            code12: useModeList[11].sampleData,
+            code13: useModeList[12].sampleData,
+            code14: useModeList[13].sampleData,
+            fontSizeCode1: useModeList[0].fontSize,
+            fontSizeCode2: useModeList[1].fontSize,
+            fontSizeCode3: useModeList[2].fontSize,
+            fontSizeCode4: useModeList[3].fontSize,
+            fontSizeCode5: useModeList[4].fontSize,
+            fontSizeCode6: useModeList[5].fontSize,
+            fontSizeCode7: useModeList[6].fontSize,
+            fontSizeCode8: useModeList[7].fontSize,
+            fontSizeCode9: useModeList[8].fontSize,
+            fontSizeCode10: useModeList[9].fontSize,
+            fontSizeCode11: useModeList[10].fontSize,
+            fontSizeCode12: useModeList[11].fontSize,
+            fontSizeCode13: useModeList[12].fontSize,
+            fontSizeCode14: useModeList[13].fontSize,
+            typefaceCode1: fontTypeObj[useModeList[0].fontType],
+            typefaceCode2: fontTypeObj[useModeList[1].fontType],
+            typefaceCode3: fontTypeObj[useModeList[2].fontType],
+            typefaceCode4: fontTypeObj[useModeList[3].fontType],
+            typefaceCode5: fontTypeObj[useModeList[4].fontType],
+            typefaceCode6: fontTypeObj[useModeList[5].fontType],
+            typefaceCode7: fontTypeObj[useModeList[6].fontType],
+            typefaceCode8: fontTypeObj[useModeList[7].fontType],
+            typefaceCode9: fontTypeObj[useModeList[8].fontType],
+            typefaceCode10: fontTypeObj[useModeList[9].fontType],
+            typefaceCode11: fontTypeObj[useModeList[10].fontType],
+            typefaceCode12: fontTypeObj[useModeList[11].fontType],
+            typefaceCode13: fontTypeObj[useModeList[12].fontType],
+            typefaceCode14: fontTypeObj[useModeList[13].fontType]
+          })
+        }
+      }
+      getResList()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.info {
+  font-weight: bold;
+  color: #000;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+  .search-box {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
+}
+</style>

+ 151 - 0
src/views/warehouseManagement/stockLedger/components/details/InventoryAllocation.vue

@@ -0,0 +1,151 @@
+<!-- 调拨 -->
+<template>
+  <div class="detail-box">
+    <el-form label-width="70px">
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="关键字">
+            <el-input
+              placeholder="请输入"
+              v-model="searchForm.key"
+              size="small"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="18" style="text-align: right">
+          <el-button
+            @click="search"
+            type="primary"
+            icon="el-icon-search"
+            size="small"
+            >搜索</el-button
+          >
+          <el-button @click="reset" icon="el-icon-refresh-left" size="small"
+            >重置</el-button
+          >
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table
+      :data="tableData"
+      :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+    >
+      <el-table-column label="序号" type="index"></el-table-column>
+     <!-- <el-table-column
+        :label="`${getDictValue('物品类型', baseInfo.assetType)}编码`"
+        prop="onlyCode"
+      ></el-table-column> -->
+      <el-table-column label="包装编码" prop="num"></el-table-column>
+      <el-table-column label="最小包装单元" prop="" v-if="!baseInfo.isUnpack">
+        <template slot-scope="{ row }">{{
+          `${row.measurementUnit || ''}${row.unit}/${row.minPackUnit}`
+        }}</template>
+      </el-table-column>
+      <el-table-column
+        label="批次号"
+        prop="batchNo"
+        v-if="$route.query.dimension == 1"
+      ></el-table-column>
+      <el-table-column label="调拔单号" prop="dialNumber"></el-table-column>
+
+      <el-table-column label="调出货位" prop="warehouseName">
+        <template slot-scope="{ row }">
+          {{ row.warehouseName }} - {{ row.outWarehouseAreaName }} -
+          {{ row.outWarehouseAreaGoodsCode }} - {{ row.outGoodsAllocationCode }}
+        </template>
+      </el-table-column>
+      <el-table-column label="调入货位" prop="inWarehouseName">
+        <template slot-scope="{ row }">
+          {{ row.inWarehouseName }} - {{ row.inWarehouseAreaName }} -
+          {{ row.inWarehouseAreaGoodsCode }} - {{ row.inGoodsAllocationCode }}
+        </template>
+      </el-table-column>
+      <el-table-column label="审核时间" prop="auditorTime"></el-table-column>
+    </el-table>
+    <Pagination
+      :total="total"
+      :page.sync="page"
+      :size.sync="size"
+      @pagination="handlePageChange"
+    />
+    <!-- <InventoryAllocationDialog
+      ref="detailRef"
+      :assetCode="baseInfo.assetCode"
+      :isUnpack="baseInfo.isUnpack"
+    /> -->
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination'
+// import { getTransferDetail } from '@/api/stockManagement/stockLedger'
+import InventoryAllocationDialog from './InventoryAllocationDialog'
+// import dictMixins from '@/mixins/dictMixins'
+export default {
+  components: { Pagination, InventoryAllocationDialog },
+  // mixins: [dictMixins],
+  props: {
+    baseInfo: {
+      type: Object,
+      default: () => ({})
+    },
+    baseParams: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data () {
+    return {
+      searchForm: {
+        key: ''
+      },
+      tableData: [],
+      size: 15,
+      page: 1,
+      total: 0
+    }
+  },
+  created () {
+    // this.requestDict('物品类型')
+    // this.getList()
+  },
+  methods: {
+    search () {
+      this.page = 1
+      this.getList()
+    },
+    handleCellClick (row) {
+      this.$refs.detailRef.open(row)
+    },
+    reset () {
+      this.searchForm = {}
+      this.search()
+    },
+    handlePageChange () {
+      this.getList()
+    },
+    async getList () {
+      const res = await getTransferDetail({
+        size: this.size,
+        page: this.page,
+        ...this.baseParams,
+        ...this.searchForm,
+        batchNum: this.baseParams.batchNum || this.searchForm.batchNum
+        // bizNum,
+        // batchNum,
+        // inventoryCode: this.assetCode
+      })
+      if (res?.success) {
+        // this.tableData = res.data
+        this.tableData = res.data.records
+        this.total = res.data.total
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.detail-box{
+	margin: 20px auto;
+}
+</style>

+ 109 - 0
src/views/warehouseManagement/stockLedger/components/details/InventoryAllocationDialog.vue

@@ -0,0 +1,109 @@
+<template>
+  <el-dialog :visible.sync="visible" title="调拨明细" width="70%">
+    <div class="info">
+      <div>调拨单号 {{ info.bizNum }}</div>
+      <!-- <div>
+        <el-input
+          v-model="searchVal"
+          placeholder="搜索原料编码/批次号"
+        ></el-input>
+      </div> -->
+    </div>
+    <el-table
+      :data="showTableData"
+      height="500px"
+      class="w100"
+      border
+      :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+    >
+      <el-table-column label="序号" type="index"></el-table-column>
+      <el-table-column label="原料编码" prop="onlyCode"></el-table-column>
+      <el-table-column label="包装编码" prop="num"></el-table-column>
+      <el-table-column label="最小包装单元" prop="" v-if="!isUnpack">
+        <template slot-scope="{ row }">{{
+          `${row.measurementUnit || ''}${row.unit}/${row.minPackUnit}`
+        }}</template>
+      </el-table-column>
+      <el-table-column label="调出货位" prop="warehouseName">
+        <template slot-scope="{ row }">
+          {{ row.warehouseName }} - {{ row.outWarehouseAreaName }} -
+          {{ row.outWarehouseAreaGoodsCode }} - {{ row.outGoodsAllocationCode }}
+        </template>
+      </el-table-column>
+      <el-table-column label="调入货位" prop="inWarehouseName">
+        <template slot-scope="{ row }">
+          {{ row.inWarehouseName }} - {{ row.inWarehouseAreaName }} -
+          {{ row.inWarehouseAreaGoodsCode }} - {{ row.inGoodsAllocationCode }}
+        </template>
+      </el-table-column>
+    </el-table>
+  </el-dialog>
+</template>
+
+<script>
+// import {
+//   getWarehouseSceneDetail,
+//   getTransferDetail
+// } from '@/api/stockManagement/stockLedger'
+export default {
+  props: {
+    assetCode: String,
+    isUnpack: Boolean
+  },
+  data () {
+    return {
+      visible: false,
+      title: '',
+      tableData: [],
+      info: {},
+      searchVal: ''
+    }
+  },
+  computed: {
+    dimension () {
+      return this.$route.query.dimension
+    },
+    showTableData () {
+      return this.tableData.filter(item => {
+        if (this.searchVal) {
+          return (
+            (item.onlyCode && item.onlyCode.indexOf(this.searchVal)) ||
+            (item.batchNum && item.batchNum.indexOf(this.searchVal))
+          )
+        }
+        return true
+      })
+    }
+  },
+  methods: {
+    open ({ bizNum, batchNum, dialNumber }) {
+      this.info = { bizNum, batchNum }
+      this.info.bizNum = dialNumber
+      this._getTransferDetail(dialNumber, batchNum)
+
+      this.visible = true
+    },
+    async _getTransferDetail (bizNum, batchNum) {
+      const res = await getTransferDetail({
+        bizNum,
+        batchNum,
+        inventoryCode: this.assetCode
+      })
+      if (res?.success) {
+        this.tableData = res.data
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.info {
+  font-weight: bold;
+  color: #000;
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+  margin-bottom: 20px;
+}
+</style>

+ 238 - 0
src/views/warehouseManagement/stockLedger/components/details/OutWarehouse.vue

@@ -0,0 +1,238 @@
+<!-- 出库 -->
+<template>
+  <div class="detail-box">
+    <el-form label-width="100px">
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="出库场景"
+            ><el-select
+              placeholder="请选择"
+              v-model="searchForm.bizScene"
+              clearable
+            >
+              <el-option
+                v-for="item in outputSceneState"
+                :key="item.code"
+                :value="item.code + ''"
+                :label="item.label"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="出库单号" prop="bizNum">
+            <el-input
+              v-model="searchForm.bizNum"
+              placeholder="请输入"
+              size="small"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="出库数量">
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.warehouseStart"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.warehouseStart)) {
+                      searchForm.warehouseStart = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+            <el-col :span="2" style="text-align: center">~</el-col>
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.warehouseEnd"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.warehouseEnd)) {
+                      searchForm.warehouseEnd = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="包装数量">
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.packetStart"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.packetStart)) {
+                      searchForm.packetStart = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+            <el-col :span="2" style="text-align: center">~</el-col>
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.packetEnd"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.packetEnd)) {
+                      searchForm.packetEnd = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24" style="text-align: right; margin-bottom: 20px">
+          <el-button
+            @click="search"
+            type="primary"
+            icon="el-icon-search"
+            size="small"
+            >搜索</el-button
+          >
+          <el-button @click="reset" icon="el-icon-refresh-left" size="small"
+            >重置</el-button
+          >
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table
+      :data="tableData"
+      @cell-click="handleCellClick"
+      :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+      ><el-table-column width="80px" label="序号">
+        <template slot-scope="{ $index }">
+          {{ $tableIndex($index, page, size) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="出库单号" prop="bizNum"></el-table-column>
+      <el-table-column label="出库场景" prop="bizScene">
+       <!-- <template slot-scope="{ row }">{{
+          getSceneState(+row.bizScene)
+        }}</template> -->
+      </el-table-column>
+      <el-table-column
+        label="出库数量"
+        prop="measurementUnit"
+      ></el-table-column>
+      <el-table-column label="计量单位" prop="unit"></el-table-column>
+      <template v-if="!baseInfo.isUnpack">
+        <el-table-column label="包装数量" prop="outInNum"></el-table-column>
+        <el-table-column label="包装单位" prop="minPackUnit"></el-table-column>
+      </template>
+      <el-table-column label="操作人" prop="createUsername"></el-table-column>
+      <el-table-column label="审核人" prop="verifyName"></el-table-column>
+      <el-table-column label="出库时间" prop="verifyTime"></el-table-column>
+    </el-table>
+    <Pagination
+      :total="total"
+      :page.sync="page"
+      :size.sync="size"
+      @pagination="handlePageChange"
+    />
+	<OutWarehouseDialg
+	  ref="detailRef"
+	  :assetCode="baseInfo.assetCode"
+	  :isUnpack="baseInfo.isUnpack"
+	  title="物品类型"
+	/>
+<!--    <OutWarehouseDialg
+      ref="detailRef"
+      :assetCode="baseInfo.assetCode"
+      :isUnpack="baseInfo.isUnpack"
+      :title="getDictValue('物品类型', baseInfo.assetType)"
+    /> -->
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination'
+// import { getInWarehouseDetail } from '@/api/stockManagement/stockLedger'
+// import { outputSceneState } from '@/utils/dict/index'
+import OutWarehouseDialg from './OutWarehouseDialg.vue'
+// import { useDictLabel } from '@/utils/dict/index'
+// import dictMixin from '@/mixins/dictMixins'
+export default {
+  components: { Pagination, OutWarehouseDialg },
+  // mixins: [dictMixin],
+  props: {
+    baseInfo: {
+      type: Object,
+      default: () => ({})
+    },
+    baseParams: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data () {
+    return {
+      // outputSceneState,
+	   outputSceneState:[],
+      searchForm: {
+        bizNum: '',
+        warehouseEnd: '',
+        warehouseStart: '',
+        packetEnd: '',
+        packetStart: ''
+      },
+      tableData: [],
+      size: 15,
+      page: 1,
+      total: 0,
+    }
+  },
+  created () {
+    // this.requestDict('物品类型')
+    // this.getList()
+  },
+  methods: {
+    // getSceneState: useDictLabel(outputSceneState),
+    handleCellClick (row) {
+      this.$refs.detailRef.open(row)
+    },
+    search () {
+      this.page = 1
+      this.getList()
+    },
+    reset () {
+      this.searchForm = {}
+      this.search()
+    },
+    handlePageChange () {
+      this.getList()
+    },
+    async getList () {
+      const res = await getInWarehouseDetail({
+        bizStatus: 2,
+        size: this.size,
+        page: this.page,
+        ...this.baseParams,
+        ...this.searchForm,
+        batchNum: this.baseParams.batchNum || this.searchForm.batchNum
+      })
+      if (res?.success) {
+        this.tableData = res.data.records
+        this.total = res.data.total
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.detail-box{
+	margin: 20px auto;
+}
+</style>

+ 131 - 0
src/views/warehouseManagement/stockLedger/components/details/OutWarehouseDialg.vue

@@ -0,0 +1,131 @@
+<template>
+  <el-dialog :visible.sync="visible" title="入库明细" width="70%">
+    <div class="info">
+      <div>出库单号 {{ info.bizNum }}</div>
+      <div>
+        <el-input
+          v-model="searchVal"
+          size="small"
+          v-if="dimension == 1"
+          :placeholder="`搜索${title}编码/批次号`"
+        ></el-input>
+        <el-input
+          v-else
+          size="small"
+          v-model="searchVal"
+          :placeholder="`搜索${title}编码`"
+        ></el-input>
+      </div>
+    </div>
+    <el-table
+      :data="showTableData"
+      height="60vh"
+      class="w100"
+      border
+      :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+    >
+      <el-table-column label="序号" type="index"></el-table-column>
+      <el-table-column
+        :label="`${title}编码`"
+        prop="onlyCode"
+      ></el-table-column>
+      <el-table-column label="包装编码" prop="num"></el-table-column>
+      <el-table-column label="最小包装单元" prop="" v-if="!isUnpack">
+        <template slot-scope="{ row }">{{
+          `${row.measurementUnit || ''}${row.unit}/${row.minPackUnit}`
+        }}</template>
+      </el-table-column>
+      <el-table-column
+        label="批次号"
+        prop="batchNum"
+        v-if="dimension == 1"
+      ></el-table-column>
+      <el-table-column
+        label="生产日期"
+        prop="manufactureTime"
+      ></el-table-column>
+      <el-table-column
+        label="采购日期"
+        prop="procurementTime"
+      ></el-table-column>
+      <el-table-column label="过期时间" prop="expirationTime"></el-table-column>
+      <el-table-column label="货位" prop="" show-overflow-tooltip>
+        <template slot-scope="{ row }">
+          {{
+            `${row.warehouseName}-${row.areaName}-${row.shelfCode}-${row.cargoSpaceCode}`
+          }}
+        </template>
+      </el-table-column>
+    </el-table>
+  </el-dialog>
+</template>
+
+<script>
+// import { getWarehouseSceneDetail } from '@/api/stockManagement/stockLedger'
+// import dictMixin from '@/mixins/dictMixins'
+export default {
+  props: {
+    assetCode: String,
+    title: String,
+    isUnpack: Boolean
+  },
+  // mixins: [dictMixin],
+  data () {
+    return {
+      visible: false,
+      tableData: [],
+      info: {},
+      searchVal: ''
+    }
+  },
+  computed: {
+    dimension () {
+      return this.$route.query.dimension
+    },
+    showTableData () {
+      return this.tableData.filter(item => {
+        if (this.searchVal) {
+          return (
+            (item.onlyCode && item.onlyCode.indexOf(this.searchVal)) > -1 ||
+            (item.batchNum &&
+              this.dimension == 1 &&
+              item.batchNum.indexOf(this.searchVal) > -1)
+          )
+        }
+        return true
+      })
+    }
+  },
+  methods: {
+    open ({ bizNum, batchNum }) {
+      this.info = { bizNum, batchNum }
+      this._getWarehouseSceneDetail(bizNum, batchNum)
+
+      this.visible = true
+    },
+
+    async _getWarehouseSceneDetail (bizNum, batchNum) {
+      const res = await getWarehouseSceneDetail({
+        bizNum,
+        batchNum,
+        bizStatus: 2,
+        inventoryCode: this.assetCode
+      })
+      if (res?.success) {
+        this.tableData = res.data
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.info {
+  font-weight: bold;
+  color: #000;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+}
+</style>

+ 236 - 0
src/views/warehouseManagement/stockLedger/components/details/ReportLoss.vue

@@ -0,0 +1,236 @@
+<!-- 报损报溢 -->
+<template>
+  <div class="detail-box">
+    <el-form label-width="100px">
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="盈/损/亏"
+            ><el-select
+              placeholder="请选择"
+              v-model="searchForm.status"
+              class="w100"
+              clearable
+            >
+              <el-option
+                v-for="item in statusList"
+                :key="item.code"
+                :value="item.code"
+                :label="item.label"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <!-- <el-form-item
+            :label="`${getDictValue('物品类型', baseInfo.assetType)}编码`"
+            prop="assetCode"
+          >
+            <el-input
+              v-model="searchForm.assetCode"
+              placeholder="请输入"
+              size="small"
+            ></el-input>
+          </el-form-item> -->
+		  <el-form-item
+		    label="物品类型"
+		    prop="assetCode"
+		  >
+		    <el-input
+		      v-model="searchForm.assetCode"
+		      placeholder="请输入"
+		      size="small"
+		    ></el-input>
+		  </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="盘点工单号" prop="workOrderCode">
+            <el-input
+              v-model="searchForm.workOrderCode"
+              placeholder="请输入"
+              size="small"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="报损溢单号" prop="breakageCode">
+            <el-input
+              v-model="searchForm.breakageCode"
+              placeholder="请输入"
+              size="small"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24" style="text-align: right; margin-bottom: 20px">
+          <el-button
+            @click="search"
+            type="primary"
+            icon="el-icon-search"
+            size="small"
+            >搜索</el-button
+          >
+          <el-button @click="reset" icon="el-icon-refresh-left" size="small"
+            >重置</el-button
+          >
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table
+      :data="tableData"
+      :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+    >
+      <el-table-column label="序号" type="index">
+        <template slot-scope="{ $index }">
+          {{ $tableIndex($index, page, size) }}
+        </template>
+      </el-table-column>
+      <!-- <el-table-column
+        :label="`${getDictValue('物品类型', baseInfo.assetType)}编码`"
+        prop="onlyCode"
+        width="200"
+      ></el-table-column> -->
+      <!-- <el-table-column label="包装编码" prop="num"></el-table-column> -->
+      <el-table-column label="最小包装单元" prop="" v-if="!baseInfo.isUnpack" width="150">
+        <template slot-scope="{ row }">
+          {{ row.measurementUnit }}{{ row.unit }} /{{ row.minimumUnit }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="批次号"
+        prop="batch"
+        v-if="dimension != 2"
+      ></el-table-column>
+      <el-table-column label="单价" prop="">
+        <template slot-scope="{ row }">
+          <template v-if="row.univalence || row.univalence === 0">
+            {{ row.univalence }} {{ priceList[row.univalenceUnit] }}
+          </template>
+        </template></el-table-column
+      >
+      <el-table-column
+        label="盘点工单号"
+        width="220"
+        prop="workOrderCode"
+      ></el-table-column>
+      <el-table-column label="盘点人" prop="executeUserName"></el-table-column>
+      <el-table-column label="盈/损/亏" prop="">
+        <template slot-scope="{ row }">
+          <span :style="{ color: statusColor[row.status] }">{{
+            statusOpt[row.status]
+          }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="报损溢单号"
+        width="220"
+        prop="breakageOverflowCode"
+      ></el-table-column>
+      <el-table-column label="操作人" prop="reportName"></el-table-column>
+      <el-table-column
+        label="审核人"
+        prop="accraditationUserName"
+      ></el-table-column>
+      <el-table-column
+        label="更新库存时间"
+        prop="updateInventoryTime"
+		 width="150"
+      ></el-table-column>
+    </el-table>
+    <Pagination
+      :total="total"
+      :page.sync="page"
+      :size.sync="size"
+      @pagination="handlePageChange"
+    />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination'
+// import { getBreakageOverflowDetail } from '@/api/stockManagement/stockLedger'
+// import dictMixin from '@/mixins/dictMixins'
+export default {
+  components: { Pagination },
+  // mixins: [dictMixin],
+  props: {
+    baseInfo: {
+      type: Object,
+      default: () => ({})
+    },
+    baseParams: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data () {
+    return {
+      searchForm: {
+        status: '',
+        assetCode: '',
+        workOrderCode: '',
+        breakageCode: ''
+      },
+      statusList: [
+        { label: '所有', code: '' },
+        { label: '盘盈', code: 3 },
+        { label: '盘损', code: 2 },
+        { label: '盘亏', code: 1 }
+      ],
+      statusOpt: {
+        1: '盘亏',
+        2: '盘损',
+        3: '盘盈'
+      },
+      statusColor: {
+        1: '',
+        2: '#F59A23',
+        3: '#70B603'
+      },
+      tableData: [],
+      size: 15,
+      page: 1,
+      total: 0
+    }
+  },
+  created () {
+    // this.requestDict('物品类型')
+    // this.getList()
+  },
+  computed: {
+    dimension () {
+      return this.$route.query.dimension
+    }
+  },
+  methods: {
+    search () {
+      this.page = 1
+      this.getList()
+    },
+    reset () {
+      this.searchForm = {}
+      this.getList()
+    },
+    handlePageChange () {
+      this.getList()
+    },
+    async getList () {
+      const res = await getBreakageOverflowDetail({
+        size: this.size,
+        page: this.page,
+        informationId: this.baseInfo.materialId,
+        ...this.searchForm,
+        ...this.baseParams,
+        batchNum: this.baseParams.batchNum || this.searchForm.batchNum
+      })
+      if (res?.success) {
+        this.tableData = res.data.records
+        this.total = res.data.total
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.detail-box{
+	margin: 20px auto;
+}
+</style>

+ 262 - 0
src/views/warehouseManagement/stockLedger/components/details/WarehouseDetail.vue

@@ -0,0 +1,262 @@
+<!-- 库存明细 -->
+<template>
+  <div class="detail-box">
+    <el-form label-width="90px">
+      <el-row>
+       <el-col :span="6">
+				 <!-- :label="`${getDictValue('物品类型', baseInfo.assetType)}编码`" -->
+          <el-form-item
+            label="物品编码"
+            prop="onlyCode"
+          >
+            <el-input
+              v-model="searchForm.onlyCode"
+              placeholder="请输入"
+              size="small"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6" v-if="dimension != 2">
+          <el-form-item label="批次号" prop="batchNum">
+            <el-input
+              v-model="searchForm.batchNum"
+              placeholder="请输入"
+              size="small"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="入库单号" prop="bizNum">
+            <el-input
+              v-model="searchForm.bizNum"
+              placeholder="请输入"
+              size="small"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="入库天数" prop="">
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.dayStart"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.dayStart)) {
+                      searchForm.dayStart = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+            <el-col :span="2" style="text-align: center">~</el-col>
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.dayEnd"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.dayEnd)) {
+                      searchForm.dayEnd = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="单价" prop="univalence">
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.univalenceStart"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.univalenceStart)) {
+                      searchForm.univalenceStart = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+            <el-col :span="2" style="text-align: center">~</el-col>
+            <el-col :span="11">
+              <el-input
+                v-model="searchForm.univalenceEnd"
+                @blur="
+                  () => {
+                    if (!/^\d+(\.\d+)?$/.test(searchForm.univalenceEnd)) {
+                      searchForm.univalenceEnd = ''
+                    }
+                  }
+                "
+                placeholder="请输入"
+                size="small"
+              ></el-input
+            ></el-col>
+          </el-form-item>
+        </el-col>
+        <el-col :span="dimension == 1 ? 6 : 24" style="text-align: right">
+          <el-form-item label="">
+            <el-button
+              @click="search"
+              type="primary"
+              icon="el-icon-search"
+              size="small"
+              >搜索</el-button
+            >
+            <el-button @click="reset" icon="el-icon-refresh-left" size="small"
+              >重置</el-button
+            >
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table
+      :data="tableData"
+      :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+      ><el-table-column width="80px" label="序号">
+        <template slot-scope="{ $index }">
+          {{ $tableIndex($index, page, size) }}
+        </template>
+      </el-table-column>
+     <!-- <el-table-column
+        :label="`${getDictValue('物品类型', baseInfo.assetType)}编码`"
+        prop="onlyCode"
+        width="200px"
+      ></el-table-column> -->
+      <el-table-column label="包装编码" prop="num"></el-table-column>
+      <el-table-column label="最小包装单元" width="150" prop="" v-if="!baseInfo.isUnpack">
+        <template slot-scope="{ row }">
+          {{ row.measurementUnit }}{{ row.unit }} /{{ row.minPackUnit }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="批次号"
+        prop="batchNum"
+        v-if="dimension != 2"
+      ></el-table-column>
+      <el-table-column label="单价" prop="">
+        <template slot-scope="{ row }">
+          <template v-if="row.univalence || row.univalence === 0">
+            {{ row.univalence }} {{ priceList[row.univalenceUnit] }}
+          </template>
+        </template></el-table-column
+      >
+      <el-table-column label="生产日期" prop="" width="200px">
+        <template slot-scope="{ row }">
+          {{ row.manufactureTime }}
+        </template>
+      </el-table-column>
+      <el-table-column label="采购日期" prop="" width="200px">
+        <template slot-scope="{ row }">
+          {{ row.procurementTime }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="过期日期"
+        prop="expirationTime"
+        width="200px"
+      ></el-table-column>
+      <el-table-column label="入库单号" prop="bizNum"></el-table-column>
+      <el-table-column
+        label="入库时间"
+        prop="createTime"
+        width="200px"
+      ></el-table-column>
+      <el-table-column label="入库天数" prop="day"></el-table-column>
+      <el-table-column label="货位" prop="" show-overflow-tooltip>
+        <template slot-scope="{ row }">
+          {{
+            `${row.warehouseName}-${row.areaName}-${row.shelfCode}-${row.cargoSpaceCode}`
+          }}
+        </template>
+      </el-table-column>
+    </el-table>
+    <Pagination
+      :total="total"
+      :page.sync="page"
+      :size.sync="size"
+      @pagination="handlePageChange"
+    />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination'
+// import { inventoryDetails } from '@/api/stockManagement/stockLedger'
+// import dictMixins from '@/mixins/dictMixins'
+export default {
+  components: { Pagination },
+  // mixins: [dictMixins],
+  props: {
+    baseInfo: {
+      type: Object,
+      default: () => ({})
+    },
+    baseParams: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data () {
+    return {
+      searchForm: {
+        univalenceStart: '',
+        univalenceEnd: '',
+        onlyCode: '',
+        batchNum: '',
+        bizNum: ''
+      },
+      priceList: { yuan: '元', wanyuan: '万元' },
+      tableData: [],
+      size: 15,
+      page: 1,
+      total: 0
+    }
+  },
+  computed: {
+    dimension () {
+      return this.$route.query.dimension
+    }
+  },
+  created () {
+    // this.getList()
+  },
+  methods: {
+    search () {
+      this.page = 1
+      this.getList()
+    },
+    handlePageChange () {
+      this.getList()
+    },
+    reset () {
+      this.searchForm = {}
+      this.search()
+    },
+    async getList () {
+      const res = await inventoryDetails({
+        size: this.size,
+        page: this.page,
+        ...this.searchForm,
+        ...this.baseParams,
+        batchNum: this.baseParams.batchNum || this.searchForm.batchNum
+      })
+      if (res?.success) {
+        this.tableData = res.data.records
+        this.total = res.data.total
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.detail-box{
+	margin: 20px auto;
+}
+</style>

+ 177 - 0
src/views/warehouseManagement/stockLedger/components/item-list.vue

@@ -0,0 +1,177 @@
+<template>
+  <div>
+    <!-- 数据表格 -->
+	<item-search @search="reload"> </item-search>
+    <ele-pro-table
+      ref="table"
+      :initLoad="false"
+      :columns="columns"
+      :datasource="datasource"
+      height="calc(100vh - 265px)"
+      full-height="calc(100vh - 116px)"
+      tool-class="ele-toolbar-form"
+      cache-key="systemOrgUserTable"
+    >
+      <!-- 表头工具栏 -->
+      <template v-slot:toolbar>
+      </template>
+      <!-- 操作列 -->
+      <template v-slot:action="{ row }">
+        <el-link
+          type="primary"
+          :underline="false"
+          icon="el-icon-edit"
+          @click="details(row)"
+        >
+          详情
+        </el-link>
+      </template>
+    </ele-pro-table>
+  </div>
+</template>
+
+<script>
+  import ItemSearch from './item-search.vue';
+  // import {
+  //   getUserPage,
+  //   removePersonnel,
+  //   unbindLoginName
+  // } from '@/api/system/organization';
+  import { getList, removeItem } from '@/api/classifyManage/itemInformation';
+
+  export default {
+    components: { ItemSearch },
+    props: {
+      // 机构id
+      organizationId: [Number, String],
+      // 全部机构
+      organizationList: Array,
+      current: {
+        type: Object,
+        default: () => ({})
+      }
+    },
+    data () {
+      return {
+		  searchForm:{
+		  	dimension:2
+		  }
+	  };
+    },
+    computed: {
+      // 表格列配置
+      columns () {
+        const privateColumn = [];
+        if (!['8', '1', '2', '5', '6', '7'].includes(this.current?.type)) {
+          // privateColumn.push({
+          //   prop: 'brandNum',
+          //   label: '牌号',
+          //   showOverflowTooltip: true
+          // });
+        }
+        return [
+          {
+            columnKey: 'index',
+            type: 'index',
+            width: 50,
+            align: 'center',
+			label: '序号',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
+		   ...privateColumn,
+          {
+            prop: 'code',
+            label: '物品编码',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '物品名称',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'classificationCode',
+            label: '物品类型',
+            showOverflowTooltip: true
+          },        
+          {
+            prop: 'measuringUnit',
+            label: '实时库存',
+            sortable: 'custom',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'packingUnit',
+            label: '计量单位',
+            align: 'center'
+          },
+          {
+            prop: 'categoryLevelPath',
+            label: '分类',
+            showOverflowTooltip: true
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 100,
+            align: 'left',
+            resizable: false,
+            slot: 'action'
+          }
+        ];
+      }
+    },
+    methods: {
+      /* 表格数据源 */
+      datasource ({ page, limit, where }) {
+        return getList({
+          ...where,
+          pageNum: page,
+          size: limit
+        });
+      },
+      /* 刷新表格 */
+      reload (where) {
+        this.$nextTick(() => {
+          this.$refs.table.reload({
+            pageNum: 1,
+            where: {
+              ...where,
+              categoryLevelId: this.current?.data?.id || this.current?.id
+            }
+          });
+        });
+      },
+      
+		details (row) {
+		  const key = Date.now()
+		  this.$store.commit('stockManagement/CLEAR_BASEINFO')
+		  this.$store.commit('stockManagement/CHANGE_BASEINFO', { key, value: row })
+		
+		  const url =
+			this.searchForm.dimension === 1
+			  ? '/warehouseManagement/stockLedger/allBatchDetails'
+			  : '/warehouseManagement/stockLedger/batchDetails'
+		
+		  this.$router.push({
+			path:url,
+			query: {
+			  key,
+			  dimension: this.searchForm.dimension
+			}
+		  })
+		},
+    },
+    watch: {
+      // 监听机构id变化
+      current: {
+        handler () {
+          this.reload();
+        }
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped></style>

+ 101 - 0
src/views/warehouseManagement/stockLedger/components/item-search.vue

@@ -0,0 +1,101 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="90px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+		<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+		  <el-form-item label="仓库:" prop="informationCode" label-width="60px">
+			<el-input
+			  clearable
+			  placeholder="请输入"
+			  v-model.trim="params.informationCode"
+			></el-input>
+		  </el-form-item>
+		</el-col>
+		<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+		  <el-form-item label="列表维度:" prop="informationName">
+			<el-input
+			  clearable
+			  v-model="params.informationName"
+			  placeholder="请输入"
+			></el-input>
+		  </el-form-item>
+		</el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="物品编码:" prop="informationCode">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.informationCode"
+          ></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="物品名称:" prop="informationName">
+          <el-input
+            clearable
+            v-model="params.informationName"
+            placeholder="请输入"
+          ></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <div class="ele-form-actions">
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+            size="small"
+          >
+            查询
+          </el-button>
+           <el-button @click="reset"
+             icon="el-icon-refresh-left"
+             size="small"
+             type="primary"
+           >重置</el-button>
+        </div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+<script>
+  export default {
+    data () {
+      // 默认表单数据
+      const defaultParams = {
+        informationName: '',
+        informationCode: ''
+      };
+      return {
+        // 表单数据
+        params: { ...defaultParams }
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive () {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search () {
+        console.log(this.current);
+        this.$emit('search', {
+          ...this.params
+        });
+      },
+      /*  重置 */
+      reset () {
+        this.params = { ...this.defaultParams };
+        this.search();
+      }
+    }
+  };
+</script>

+ 239 - 0
src/views/warehouseManagement/stockLedger/enums.js

@@ -0,0 +1,239 @@
+// import { sceneState, outputSceneState } from '@/utils/dict/warehouse'
+// import { useDictLabel } from '@/utils/dict'
+const minPackUnitFun = row => {
+  return `${row.measurementUnit || ''}${row.unit}/${row.minPackUnit}`
+}
+
+const bizSceneFormatter = useDictLabel(sceneState)
+const outputSceneStateFormatter = useDictLabel(outputSceneState)
+export const tableColumnConfigM = {
+  first: [
+    { label: '条码号', prop: 'barCode', type: 'barCode' },
+    { label: '编码', prop: 'num' },
+    { label: '最小单元', prop: '', formatter: minPackUnitFun },
+    { label: '生产日期', prop: 'manufactureTime' },
+    { label: '过期时间', prop: '' },
+    { label: '入库时间', prop: 'createTime' },
+    { label: '入库单号', prop: 'bizNum' },
+    {
+      label: '货位',
+      prop: 'bizNum',
+      formatter: row =>
+        `${row.warehouseName}-${row.areaName}-${row.shelfCode}-${row.cargoSpaceCode}`
+    }
+  ],
+  second: [
+    { label: '入库单号', prop: 'bizNum' },
+    {
+      label: '入库场景',
+      prop: 'bizScene',
+      formatter: row => bizSceneFormatter(+row.bizScene)
+    },
+    {
+      label: '入库数量',
+      prop: 'outInNum',
+      formatter: row => row.measurementUnit * row.outInNum
+    },
+    { label: '计量单位', prop: 'unit' },
+    { label: '包装数量', prop: 'outInNum' },
+    { label: '最小包装单位', prop: 'minPackUnit' },
+    // { label: '最小单元', prop: 'minPackUnit', formatter: minPackUnitFun },
+    // { label: '库位', prop: 'cargoSpaceCode' },
+    { label: '入库时间', prop: 'verifyTime' }
+  ],
+  third: [
+    { label: '调拔单号', prop: 'dialNumber' },
+    {
+      label: '调拨数量',
+      prop: 'outInNum',
+      formatter: row => row.measurementUnit * row.count
+    },
+    { label: '计量单位', prop: 'unit' },
+    { label: '包装数量', prop: 'count' },
+    { label: '最小包装单位', prop: 'minPackUnit' },
+    // { label: '包装数量', prop: 'measurementUnit' },
+    // { label: '最小包装单位', prop: 'minPackUnit' },
+    // { label: '最小单元', prop: 'minPackUnit', formatter: minPackUnitFun },
+    { label: '调出仓库', prop: 'warehouseName' },
+    { label: '调入仓库', prop: 'inWarehouseName' },
+    { label: '审核时间', prop: 'auditorTime' }
+  ],
+  fourth: [
+    { label: '出库单号', prop: 'bizNum' },
+    {
+      label: '出库场景',
+      prop: 'bizScene',
+      formatter: row => outputSceneStateFormatter(+row.bizScene)
+    },
+    // {
+    //   label: '出库数量',
+    //   prop: 'outInNum',
+    //   formatter: row => row.measurementUnit * row.outInNum
+    // },
+    { label: '计量单位', prop: 'unit' },
+    { label: '包装数量', prop: 'outInNum' },
+    { label: '最小包装单位', prop: 'minPackUnit' },
+    // { label: '包装数量', prop: 'measurementUnit' },
+    // { label: '最小包装单位', prop: 'minPackUnit' },
+    // { label: '最小单元', prop: 'minPackUnit', formatter: minPackUnitFun },
+    // {
+    //   label: '出库库位',
+    //   prop: 'cargoSpaceCode',
+    //   formatter: row =>
+    //     `${row.warehouseName}-${row.areaName}-${row.shelfCode}-${row.cargoSpaceCode}`
+    // },
+    { label: '出库时间', prop: 'verifyTime' }
+  ],
+  fifth: [
+    { label: '工单编号', prop: 'workOrderCode' },
+    {
+      label: '状态',
+      prop: 'status',
+      class: row => (row.status == 3 ? 'primary-text' : 'danger-text'),
+      formatter: row => (row.status == 3 ? '盘盈' : '盘亏')
+    },
+    {
+      label: '损溢数量',
+      prop: 'amount',
+      formatter: row =>
+        row.amount === null
+          ? ''
+          : row.status == 3
+          ? `+${row.amount}`
+          : `-${row.amount}`
+    },
+    { label: '计量单位', prop: 'unit' },
+    // { label: '包装数量', prop: '' },
+    // { label: '最小包装单位', prop: 'minimumPackUnit' },
+    // { label: '最小单元', prop: '', formatter: minPackUnitFun },
+    // {
+    //   label: '库位',
+    //   prop: '',
+    //   formatter: row =>
+    //     `${row.warehouseName}-${row.areaName}-${row.shelfCode}-${row.cargoSpaceCode}`
+    // },
+    { label: '审核时间', prop: 'planAuditTime' }
+  ]
+}
+// 物料
+export const tableColumnConfig = {
+  first: [
+    { label: '条码号', prop: 'barCode', type: 'barCode' },
+    { label: '桶号', prop: 'num' },
+    { label: '最小单元', prop: '', formatter: minPackUnitFun },
+    { label: '生产日期', prop: 'manufactureTime' },
+    { label: '过期时间', prop: '' },
+    { label: '入库时间', prop: 'createTime' },
+    { label: '入库单号', prop: 'bizNum' },
+    {
+      label: '货位',
+      prop: 'bizNum',
+      formatter: row =>
+        `${row.warehouseName}-${row.areaName}-${row.shelfCode}-${row.cargoSpaceCode}`
+    }
+    // { label: '条码', prop: 'barCode', type: 'barCode' }
+  ],
+  second: [
+    { label: '入库单号', prop: 'bizNum' },
+    { label: '入库场景', prop: 'bizScene' },
+    {
+      label: '入库数量',
+      prop: 'outInNum',
+      formatter: row => row.measurementUnit * row.outInNum
+    },
+    { label: '计量单位', prop: 'unit' },
+    { label: '包装数量', prop: 'outInNum' },
+    { label: '最小包装单位', prop: 'minPackUnit' },
+    // { label: '最小单元', prop: 'minPackUnit', formatter: minPackUnitFun },
+    // {
+    //   label: '库位',
+    //   prop: 'cargoSpaceCode',
+    //   formatter: row =>
+    //     `${row.warehouseName}-${row.areaName}-${row.shelfCode}-${row.cargoSpaceCode}`
+    // },
+    { label: '入库时间', prop: 'verifyTime' }
+  ],
+  third: [
+    { label: '调拔单号', prop: 'dialNumber' },
+    { label: '调拨数量', prop: 'count' },
+    {
+      label: '调拨数量',
+      prop: 'outInNum',
+      formatter: row => row.measurementUnit * row.count
+    },
+    { label: '计量单位', prop: 'unit' },
+    { label: '包装数量', prop: 'count' },
+    { label: '最小包装单位', prop: 'minPackUnit' },
+    // { label: '包装数量', prop: 'measurementUnit' },
+    // { label: '最小包装单位', prop: 'minPackUnit' },
+    // { label: '最小单元', prop: 'minPackUnit', formatter: minPackUnitFun },
+    { label: '调出仓库', prop: 'warehouseName' },
+    { label: '调入仓库', prop: 'inWarehouseName' },
+    { label: '审核时间', prop: 'auditorTime' }
+  ],
+  fourth: [
+    { label: '出库单号', prop: 'bizNum' },
+    {
+      label: '出库场景',
+      prop: 'bizScene',
+      formatter: row => outputSceneStateFormatter(+row.bizScene)
+    },
+    // {
+    //   label: '出库数量',
+    //   prop: 'outInNum',
+    //   formatter: row => row.measurementUnit * row.outInNum
+    // },
+    { label: '计量单位', prop: 'unit' },
+    { label: '包装数量', prop: 'outInNum' },
+    { label: '最小包装单位', prop: 'minPackUnit' },
+    // { label: '包装数量', prop: 'measurementUnit' },
+    // { label: '最小包装单位', prop: 'minPackUnit' },
+    // { label: '最小单元', prop: 'minPackUnit', formatter: minPackUnitFun },
+    {
+      label: '出库库位',
+      prop: 'cargoSpaceCode',
+      formatter: row =>
+        `${row.warehouseName}-${row.areaName}-${row.shelfCode}-${row.cargoSpaceCode}`
+    },
+    { label: '出库时间', prop: 'verifyTime' }
+  ],
+  fifth: [
+    { label: '工单编号', prop: 'workOrderCode' },
+    {
+      label: '状态',
+      prop: 'status',
+      class: row => (row.status == 3 ? 'primary-text' : 'danger-text'),
+      formatter: row => (row.status == 3 ? '盘盈' : '盘亏')
+    },
+    {
+      label: '损溢数量',
+      prop: 'amount',
+      formatter: row =>
+        row.amount === null
+          ? ''
+          : row.status == 3
+          ? `+${row.amount}`
+          : `-${row.amount}`
+    },
+    { label: '计量单位', prop: 'unit' },
+    // { label: '包装数量', prop: '' },
+    // { label: '最小包装单位', prop: 'minimumPackUnit' },
+    // { label: '最小单元', prop: '', formatter: minPackUnitFun },
+    // {
+    //   label: '库位',
+    //   prop: '',
+    //   formatter: row =>
+    //     `${row.warehouseName}-${row.areaName}-${row.shelfCode}-${row.cargoSpaceCode}`
+    // },
+    { label: '审核时间', prop: 'planAuditTime' }
+  ]
+}
+
+// export const
+
+export const titleCof = {
+  second: '入库单号',
+  third: '调拨单号',
+  fourth: '出库单号',
+  fifth: '工单编号'
+}

+ 98 - 0
src/views/warehouseManagement/stockLedger/index.vue

@@ -0,0 +1,98 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <ele-split-layout
+        width="256px"
+        allow-collapse
+        :right-style="{ overflow: 'hidden' }"
+      >
+        <div>
+          <div class="ele-border-lighter sys-organization-list">
+            <asset-tree
+              @handleNodeClick="onNodeClick"
+              ref="commonTree"
+              :treeFormate="
+                (list) => {
+                  return [
+                    {
+                      children: list,
+                      id: '0',
+                      level: 0,
+                      name: '库存台账',
+                      originId: null,
+                      originType: {},
+                      parentId: null,
+                      type: '',
+                      weight: 0
+                    }
+                  ];
+                }
+              "
+            />
+          </div>
+        </div>
+        <template v-slot:content>
+          <item-list :current="current" />
+        </template>
+      </ele-split-layout>
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import itemList from './components/item-list';
+  import AssetTree from '@/components/AssetTree';
+
+  export default {
+    components: { itemList, AssetTree },
+    data () {
+      return {
+        treeData: [],
+        current: {}
+      };
+    },
+    created () {},
+    methods: {
+      onNodeClick (data, node) {
+        this.current = node;
+      },
+      openEdit () {
+        const data = this.$refs.commonTree.getSelectList();
+
+        if (data?.id) {
+          let node = this.$refs.commonTree.getInstance().getNode(data.id);
+          const urlIdList = [data.id];
+          while (node.parent?.data?.id) {
+            urlIdList.unshift(node.parent?.data?.id);
+            node = node.parent;
+          }
+          data.urlIdList = urlIdList.filter((i) => i !== '0');
+        }
+        this.$router.push({
+          path: '/classifyManage/itemInformation/add',
+          query: {
+            pageTitle: '新建物品',
+            selectNode: JSON.stringify(data)
+          }
+        });
+      }
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .sys-organization-list {
+    height: calc(100vh - 264px);
+    box-sizing: border-box;
+    border-width: 1px;
+    border-style: solid;
+    overflow: auto;
+  }
+
+  .sys-organization-list :deep(.el-tree-node__content) {
+    height: 40px;
+
+    & > .el-tree-node__expand-icon {
+      margin-left: 10px;
+    }
+  }
+</style>

+ 1 - 1
src/views/warehouseManagement/warehouseDefinition/index.vue

@@ -179,7 +179,7 @@
     // components: { selectTree, tablePagination, WarehouseEdit },
     components: { WarehouseEdit },
 
-    mixins: [dictMixins],
+    // mixins: [dictMixins],
     data() {
       return {
         formData: {