Преглед изворни кода

原料结转;原料库存;原料报损

hongxudong пре 2 година
родитељ
комит
5a0810b005

+ 33 - 0
src/api/pages/pdm/material-carryover.js

@@ -0,0 +1,33 @@
+/**
+ * @desc   : 原料结转
+ * @author : 洪旭东
+ * @date   : 2023-11-29 17:22
+ */
+export default {
+  materialCarryoverService:{
+    prefix:'/pdm-server/pdm/material_carryover/',
+    // 保存在产结转
+    saveProdCarryover:'save_prod_carryover',
+    // 反结转
+    reverseProdCarryover:'reverse_prod_carryover',
+    // 获取最大结转的账务月
+    getMaxProdCarryoverDate:'get_max_prod_carryover_date',
+  },
+  materialCarryoverItemService:{
+    prefix:'/pdm-server/pdm/material_carryover_item/',
+    // 根据结转Id获取结转明细数据
+    getProdCarryoverItemById:'get_prod_carryover_item_by_id',
+  }
+}
+
+/**
+ * @desc   : 成型模具路由
+ * @author : 姜宁
+ * @date   : 2023/2/8 13:16
+ */
+export const routeUrl = {
+  materialCarryover: {
+    carryover: {key: 'carryover', method: 'carryover'},
+    reverseCarryover: {key: 'reverseCarryover', method: 'reverseCarryover'},
+  }
+}

+ 20 - 0
src/api/pages/sheet/material-Inventory.js

@@ -0,0 +1,20 @@
+/**
+ * @desc   : 原料库存明细表
+ * @author : 洪旭东
+ * @date   : 2023-11-29 13:14
+ */
+export default {
+  materialInventoryService:{
+    prefix:'/pdm-server/pdm/material_inventory/',
+  }
+}
+
+/**
+ * @desc   : 路由
+ * @author : 洪旭东
+ * @date   : 2023-11-29 13:14
+ */
+export const routeUrl = {
+  materialInventory: {
+  }
+}

+ 0 - 21
src/api/pages/sheet/material-enter.js

@@ -1,21 +0,0 @@
-/**
- * @desc   : 原料入库
- * @author : 张潇木
- * @date   : 2023/10/11 10:35
- */
-export default {
-  materialEnterService:{
-    prefix:'/sheet-server/',
-  }
-}
-
-/**
- * @desc   : 路由
- * @author : 张潇木
- * @date   : 2023/10/11 10:35
- */
-export const routeUrl = {
-  materialEnter: {
-    add:{key:'add',url:'/sheet/mmg/material-enter/add'}
-  },
-}

+ 0 - 21
src/api/pages/sheet/material-out.js

@@ -1,21 +0,0 @@
-/**
- * @desc   : 原料出库
- * @author : 张潇木
- * @date   : 2023/10/11 10:35
- */
-export default {
-  materialOutService:{
-    prefix:'/sheet-server/',
-  }
-}
-
-/**
- * @desc   : 路由
- * @author : 张潇木
- * @date   : 2023/10/11 10:35
- */
-export const routeUrl = {
-  materialOut: {
-    add:{key:'add',url:'/sheet/mmg/material-out/add'}
-  },
-}

+ 0 - 0
src/api/pages/pdm/material-enter.js → src/api/pages/sheet/material-rds.js


+ 5 - 2
src/api/pages/sheet/material-scrap.js

@@ -5,7 +5,8 @@
  */
 export default {
   materialScrapService:{
-    prefix:'/sheet-server/',
+    prefix:'/pdm-server/pdm/material_scrap/',
+    revert: 'revert'
   }
 }
 
@@ -16,6 +17,8 @@ export default {
  */
 export const routeUrl = {
   materialScrap: {
-    add:{key:'add',url:'/sheet/mmg/material-scrap/add'}
+    add:{key:'add',url:'/sheet/mmg/material-scrap/add'},
+    //冲正
+    revert:{key:'revert',method:'revert'},
   },
 }

+ 9 - 0
src/config/index.js

@@ -752,6 +752,14 @@ export default {
     prodCarryoverItem: 'prodCarryoverItem',
   },
   /**
+   * @desc   : 原料结转明细
+   * @author : 洪旭东
+   * @date   : 2023-11-30 09:14
+   */
+  materialCarryoverItemTab: {
+    materialCarryoverItem: 'materialCarryoverItem',
+  },
+  /**
    * @desc   : 产品跟踪明细
    * @author : 姜宁
    * @date   : 2023/4/14 14:34
@@ -987,6 +995,7 @@ export default {
     techType: '生产-工艺类别',
     moldlineTag: '生产-成型标签',
     returnReason: '出库-退货原因',
+    scrapReason: '报损-损失原因',
   },
 
   /**

+ 19 - 2
src/locale/lang/zh-CN.js

@@ -1254,7 +1254,8 @@ export const columns = {
   //仓库
   whCode: '仓库编码',
   whName: '仓库名称',
-  whPlaceName: '仓位',
+  whPlaceCode: '仓位编码',
+  whPlaceName: '仓位名称',
   whCodeName: '仓库',
 
   stgName: '策略名称',
@@ -1403,6 +1404,7 @@ export const columns = {
   pdtQtyOut: '出库数量',
   checkId: '检验单号',
   carryUserId: '运输员工号',
+  materialModelId: '物料型号',
   materialModelCode: '物料编码',
   materialModelName: '物料名称',
   materialModelCategoryCode: '物料类别',
@@ -1426,6 +1428,21 @@ export const columns = {
   enterQty: '移入数量',
   tsfCode: '移库单号',
 
+  //原料报损
+  scrapTime: '损失时间',
+  dutyUserId: '责任人',
+  dutyUserName: '责任人',
+  scrapQty: '损失数量',
+  scrapCode: '报损单号',
+  scrapTime2: '报损时间',
+  scrapCreateUser: '报损工号',
+
+  //库存明细表
+  inventoryQty: '库存数量',
+  //原料结转
+  'material-carryover': '原料结转',
+  'material-carryover-item': '结转名细',
+
 }
 
 /**
@@ -1599,7 +1616,7 @@ export const messages = {
   W_192: '当前明细存在订单数量为0的数据',
   W_196: '当前明细存在显示顺序为空的数据',
   W_193: '当前明细存在重复物料型号',
-  W_194: '当前明细存在重复仓位名称',
+  W_194: '当前明细存在重复仓位编码或名称',
   W_195: '至少保存1条仓位',
   W_197: '未选择工序',
   W_198: '当前仓位中存在显示顺序为空的数据',

+ 11 - 1
src/view/mst/warehouse/index.vue

@@ -67,6 +67,8 @@
                    ref="detail-select"
                    name="detailTable"
                    :data="detailList">
+            <!-- 仓位编码-->
+            <DkTableColumn field="placeCode" :title="$t('whPlaceCode')"></DkTableColumn>
             <!-- 仓位名称-->
             <DkTableColumn field="placeName" :title="$t('whPlaceName')"></DkTableColumn>
             <!--显示顺序-->
@@ -163,7 +165,9 @@
         },
         editDetail:[{displayNo: 1}],
         detailColumn: [
-          //仓位
+          //仓位编码
+          { field: 'placeCode', title: self.$t('whPlaceCode'), type: 'text', width: 'auto' },
+          //仓位名称
           { field: 'placeName', title: self.$t('whPlaceName'), type: 'text', width: 'auto' },
           //显示顺序
           { field: 'displayNo', type: 'number', width: 'auto' },
@@ -306,6 +310,12 @@
           this.$Message.warning(this.$t('W_194'))
           return false
         }
+        noList = []
+        noList = noList.concat(this.editDetail.copy().filter(f => f.placeCode).map(m => m.placeCode))
+        if (noList.length != noList.unique().length) {
+          this.$Message.warning(this.$t('W_194'))
+          return false
+        }
         for(let i of this.editDetail){
           //显示顺序不可为空
           if (i.displayNo == null) {

+ 369 - 0
src/view/sheet/mmg/material-carryover/index.vue

@@ -0,0 +1,369 @@
+<!-- @desc:原料结转  @auth:洪旭东  @time:2023-11-30 09:11 -->
+<template>
+  <div class="main-div">
+    <!--加载中-->
+    <loading :loading="loading" v-if="!modalVisible"></loading>
+    <BaseIndexButtonGroup id="BaseIndexButtonGroup">
+      <template #left>
+        <!--    查询    -->
+        <BaseIndexButton right-button="material-carryover-select" ref="search" name="search"></BaseIndexButton>
+        <!--    清空条件    -->
+        <BaseIndexButton ref="clear" name="clear" ></BaseIndexButton>
+        <!--    结转    -->
+        <BaseIndexButton right-button="material-carryover-carryover" ref="carryover" name="carryover" :is-must-choose-flag="false"/>
+        <!--    反结    -->
+        <BaseIndexButton right-button="material-carryover-reverseCarryover" ref="reverseCarryover" name="reverseCarryover"/>
+      </template>
+    </BaseIndexButtonGroup>
+
+    <!--  查询条件区域  -->
+    <div id="search-cond-div" ref="search-cond-div" class="search-cond-class">
+      <SearchCond ref="searchCond" v-model="searchCond"
+                  @collapse-change="collapseChange" :setFlag="false"
+                  :searchContent="searchContent"
+      ></SearchCond>
+    </div>
+
+    <!--  表格部分  -->
+    <DkSplit mode="vertical" v-model="split" :height="tableHeight">
+      <DkTable slot="top" :id="'table-'+$options.name" ref="table-select" :data="tableData"
+               :height="this.tableHeight * split - 40" primaryKey="crovId" @pageChange="pageSizeChange"
+               :pageFlag="true"
+               :choose-flag="false"
+               :page-total="pageInfo.total"
+               :current-page="pageInfo.currentPage"
+               @current-change="currentChangeEvent($event)"
+               name="table">
+        <DkTableColumn field="crovCode"></DkTableColumn>
+        <DkTableColumn field="crovMonth" data-type="dateMonth"></DkTableColumn>
+        <DkTableColumn field="dateBegin" data-type="date"></DkTableColumn>
+        <DkTableColumn field="dateEnd" data-type="date"></DkTableColumn>
+        <DkTableColumn field="makeUserCodeName" :title="$t('makeUserCode')"></DkTableColumn>
+        <DkTableColumn field="makeTime" data-type="dateTime"></DkTableColumn>
+        <DkTableColumn field="remarks" width="auto"></DkTableColumn>
+      </DkTable>
+
+      <div slot="bottom" >
+        <DkTabs v-model="materialCarryoverItemTab" :options="detailOptions"></DkTabs>
+        <!--结转明细信息-->
+        <DkTable v-if="materialCarryoverItemTab === this.$config.materialCarryoverItemTab.materialCarryoverItem"
+                 :height="this.tableHeight * (1-split) - 30"
+                 primaryKey="itemId"
+                 :id="'table-'+$options.name"
+                 name="table"
+                 ref="receipt-select"
+                 :choose-flag="false"
+                 :data="materialCarryoverItem"
+                 :pageFlag="true"
+                 :page-total="detailPageInfo.total"
+                 :current-page="detailPageInfo.currentPage"
+                 @pageChange="detailPageSizeChange"
+        >
+          <DkTableColumn
+            v-for="(item, index) in materialCarryoverItemList"
+            :key="materialCarryoverItemTab+index"
+            :type="item.type"
+            :data-type="item.dataType"
+            :field="item.field"
+            :title="item.title"
+            :sum="item.sum"
+            :digits="item.digits"
+            :width="item.width"
+          >
+          </DkTableColumn>
+        </DkTable>
+      </div>
+    </DkSplit>
+
+    <!--结转-->
+    <DkModal
+      :loading="loading"
+      v-model="carryoverModal"
+      ref="modal_editAdd"
+      @on-visible-change="handleVisibleModal"
+      @modalOk="save"
+      :saveFlag="true"
+      :title="modalTitle"
+    >
+      <DkForm ref="formInline" v-model="formData" :col-count="1">
+        <DkFormItem prop="crovMonth" :required="true" :data-type="$config.dataType.date">
+           <DatePickerPop ref="crovMonth" v-model="formData.crovMonth" type="month" @onChange="onChange"/>
+        </DkFormItem>
+        <DkFormItem prop="crovMonthDateRange" :required="true">
+          <InputPop v-model="formData.crovMonthDateRange" ref="crovMonthDateRange" :readonly="true"/>
+        </DkFormItem>
+        <!--    备注    -->
+        <DkFormItem prop="remarks">
+          <InputPop v-model="formData.remarks" textareaFlag/>
+        </DkFormItem>
+      </DkForm>
+    </DkModal>
+  </div>
+</template>
+
+<script>
+
+import {indexMixin} from '@/mixins'
+
+export default {
+  name: 'material-carryover',
+  mixins: [indexMixin],
+  data() {
+    let self = this
+    return {
+      searchContent:
+        [
+          // 结转月份
+          {
+            itemCode: 'crovMonth',
+            valueFormat: {code: 'crovMonth', default: [new Date().addMonths(-6).toDateStr(), new Date().toDateStr()]},
+            valueKind: 'DATE_RANGE',
+          },
+        ],
+      materialCarryoverItem:[], // 用于结转明细数据
+      materialCarryoverItemList:[
+        {field: 'modelCode', title: self.$t('materialModelCode'), width: '200px', type: 'text'},
+        {field: 'modelName', title: self.$t('materialModelName'), width: '200px', type: 'text'},
+        {field: 'modelCategoryName', title: self.$t('materialModelCategoryCode'), width: '200px', type: 'text'},
+        {field: 'modelSpecs', width: '200px', type: 'text'},
+        {field: 'modelPlace', width: '200px', type: 'text'},
+        {field: 'inventoryQty', width: '200px', type: 'number'},
+        {field: 'unitName', width: '200px', dataType: 'text'},
+        {field: 'whName', width: '200px', dataType: 'text'},
+        {field: 'placeName', width: '200px', dataType: 'text'},
+      ],
+      materialCarryoverItemTab: this.$config.materialCarryoverItemTab.materialCarryoverItem,
+      detailOptions: [{label: self.$t('material-carryover-item'), name: 'materialCarryoverItem'}, //结转明细
+      ],
+      detailPageInfo: {
+        total: 0,
+        pageSize: this.$config.pageSize,
+        currentPage: 1
+      },
+      // 表单
+      formData: {
+        crovMonth:new Date().addMonths(-1),
+        crovMonthDateRange:'',
+        dateBegin:'',
+        dateEnd:'',
+        dateEndSearch:'',
+        makeUserId:self.$store.state.user.id,
+      },
+      carryoverModal:false,
+      modalTitle:'',
+    }
+  },
+  methods: {
+    // region 其他操作
+    /**
+     * @desc   : 获取结转的最大账务月
+     * @author : 姜宁
+     * @date   : 2023/4/10 11:01
+     */
+    getMaxProdCarryoverDate() {
+      let params = {
+        ftyId: this.$store.state.user.ftyId,
+      }
+      this.excute(this.$service.materialCarryoverService, this.$service.materialCarryoverService.getMaxProdCarryoverDate, params).then(res => {
+        if (res.code === this.$config.SUCCESS_CODE && res.data) {
+          let date = new Date(res.data);
+          this.formData.crovMonth = date.addMonths(1);
+        }
+        // 获取账务月开始和结束
+        this.getCarryoverAccountDate(this.formData.crovMonth.format());
+      })
+    },
+    /**
+     * @desc   : 获取账务月开始和结束
+     * @author : 姜宁
+     * @date   : 2023/2/7 14:09
+     */
+    getCarryoverAccountDate(month) {
+      let params = {
+        ftyId: this.$store.state.user.ftyId,
+        month: month,
+      }
+      this.excute(this.$service.commonService, this.$service.commonService.getCarryoverAccountDate, params).then(res => {
+        if (res.code === this.$config.SUCCESS_CODE) {
+          let stringDate = res.data.substring(1,res.data.length-1);
+          let list = stringDate.split(",");
+          this.formData.dateBegin = list[1];
+          this.formData.dateEnd = list[2];
+          this.formData.dateEndSearch = list[3];
+          this.formData.crovMonthDateRange = list[1] + this.$t('to') + list[2];
+        }
+      })
+    },
+    /**
+     * @desc   : 结转
+     * @author : 姜宁
+     * @date   : 2023/3/22 9:32
+     */
+    carryover(){
+      this.carryoverModal = true
+      this.modalTitle = this.$t('material-carryover')
+      this.modalParams = {
+        button: this.$config.formMode.carryover,
+        closeFlag: true
+      }
+      // 获取结转的最大账务月
+      this.getMaxProdCarryoverDate()
+    },
+    /**
+     * @desc   : 反结
+     * @author : 姜宁
+     * @date   : 2023/3/22 13:42
+     */
+    reverseCarryover(){
+      this.$IBMessage({
+          content: this.$t('Q_002', {'param': this.$v('reverseCarryover')}),
+          title: this.$t('systemQuestion')
+        },
+        {
+          ok: () => {
+            let params = {
+              ftyId: this.$store.state.user.ftyId,
+              crovId: this.$refs['table-select'].batchKeys[0]
+            }
+            this.excute(this.$service.materialCarryoverService, this.$service.materialCarryoverService.reverseProdCarryover, params).then(res => {//调用api接口
+              if (res.code === this.$config.SUCCESS_CODE) {
+                this.$Message.success(this.$t('I_001', {'param': this.$v('reverseCarryover')}))
+              } else {
+                this.$Message.warning(res.message)
+              }
+            })
+          },
+        }
+      )
+    },
+    /**
+     * @desc   : 结转月改变事件
+     * @author : 姜宁
+     * @date   : 2023/3/22 9:59
+     */
+    onChange(e){
+      if(e){
+        this.getCarryoverAccountDate(e.toDateStr())
+      }
+      else{
+        this.formData.dateBegin = ''
+        this.formData.dateEnd = ''
+        this.formData.dateEndSearch = ''
+        this.formData.crovMonthDateRange = ''
+      }
+    },
+    /**
+     * @desc   : 校验
+     * @author : 姜宁
+     * @date   : 2023/3/22 16:53
+     */
+    validData() {
+      if(new Date(this.formData.dateEnd).getTime() >= new Date().getTime()){
+        this.$Message.warning(this.$t('Q_014'))
+        return false;
+      }
+      return true;
+    },
+    /**
+     * @desc   : 保存数据
+     * @author : 姜宁
+     * @date   : 2023/3/22 13:40
+     */
+    saveData() {
+      return this.excute(this.$service.materialCarryoverService, this.$service.materialCarryoverService.saveProdCarryover, this.params)
+    },
+    /**
+     * @desc   : 分页查询
+     * @author : 姜宁
+     * @date   : 2023/3/22 15:20
+     */
+    detailPageSizeChange(detailPageInfo){
+      // 查询数据
+      this.getProdCarryoverItem(this.$refs['table-select'].batchKeys[0],detailPageInfo).then(res => {
+        if (res.code === this.$config.SUCCESS_CODE) {
+          this.materialCarryoverItem = res.data.list;
+          if (this.detailPageInfo.currentPage == 1) {
+            this.detailPageInfo.total = res.data.total
+            this.detailPageInfo.currentPage = 1;
+          }
+        }
+      });
+    },
+   /**
+    * @desc   : 获取在产结转明细信息
+    * @author : 姜宁
+    * @date   : 2023/3/21 15:57
+    */
+    getProdCarryoverItem(crovId,detailPageInfo) {
+     this.detailPageInfo.currentPage = detailPageInfo.currentPage;
+     this.detailPageInfo.pageSize = detailPageInfo.pageSize;
+      let params = {
+        ftyId: this.$store.state.user.ftyId,
+        crovId: crovId,
+        currentPage : this.detailPageInfo.currentPage,
+        pageSize : this.detailPageInfo.pageSize
+      }
+      return this.excute(this.$service.materialCarryoverItemService, this.$service.materialCarryoverItemService.selectByCond, params)
+    },
+    /**
+     * @desc   : 行切换事件
+     * @author : 姜宁
+     * @date   : 2023/3/21 15:57
+     */
+    currentChangeEvent({row}) {
+      if (row != null) {
+        // 获取在产结转明细信息
+        this.getProdCarryoverItem(row.crovId, this.detailPageInfo).then(res => {
+          if (res.code === this.$config.SUCCESS_CODE) {
+            this.materialCarryoverItem = res.data.list;
+            if (this.detailPageInfo.currentPage == 1) {
+              this.detailPageInfo.total = res.data.total
+              this.detailPageInfo.currentPage = 1;
+            }
+          }
+        });
+      }
+    },
+    /**
+     * @desc   : 获取数据
+     * @author : 姜宁
+     * @date   : 2023/1/29 11:11
+     */
+    getData(params) {
+      // 查询数据
+      let excute =  this.excute(this.$service.materialCarryoverService, this.$service.materialCarryoverService.selectByCond, params);
+      excute.then(res => {
+        if (res.code === this.$config.SUCCESS_CODE) {
+          this.materialCarryoverItem = []
+        }
+      });
+      return excute
+    },
+    /**
+     * @desc   : 给参数赋值
+     * @author : 姜宁
+     * @date   : 2023/1/29 15:15
+     */
+    setParams(){
+      this.params = {...this.formData}
+      this.params.crovMonth = this.formData.crovMonth.getFirstDateStr();
+    },
+    /**
+     * @desc   : 调用同一路由,需要使用这个方法去设置created的方法
+     * @author : 周兴
+     * @date   : 2023/2/8 12:55
+     */
+    createdInit(){
+      this.primaryKey = 'crovId'     // 设置主键
+    },
+    // endregion
+  },
+  created() {
+    this.routeObjName = 'materialCarryover'  // 设置路由名称
+  }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>

+ 1 - 0
src/view/sheet/mmg/material-enter/add.vue

@@ -97,6 +97,7 @@ export default {
         {
           field: 'whPlaceName',
           type: 'tableSelect',
+          controlId: 'whCodeName',
           selectField: 'placeName',
           param: () => {
             return {}

+ 7 - 16
src/view/sheet/mmg/material-enter/index.vue

@@ -42,7 +42,7 @@
           <DkTableColumn field="rdsTypeName" ></DkTableColumn>
           <DkTableColumn field="rdsDirectionName" :title="$t('orderStatus')" ></DkTableColumn>
           <DkTableColumn field="checkCode" :title="$t('checkId')" type="link"></DkTableColumn>
-          <DkTableColumn field="采购单号" title="采购单号" type="link"></DkTableColumn>
+<!--          <DkTableColumn field="采购单号" title="采购单号" type="link"></DkTableColumn>-->
           <DkTableColumn field="tsfCode" type="link"></DkTableColumn>
           <DkTableColumn field="opCreateTime" :title="$t('rdsCreateTimeIn')" ></DkTableColumn>
           <DkTableColumn field="opCreateUserName" :title="$t('rdsCreateUser')" ></DkTableColumn>
@@ -111,22 +111,13 @@ export default {
           valueKind: 'M-CHOICE',
         },
         // todo
+        // {
+        //   itemCode: '检验单号',
+        //   itemName: '检验单号',
+        //   valueKind: 'M-SEARCH',
+        // },
         {
-          itemCode: '采购单号',
-          itemName: '采购单号',
-          valueKind: 'M-SEARCH',
-        },
-        // todo
-        {
-          itemCode: '检验单号',
-          itemName: '检验单号',
-          valueKind: 'M-SEARCH',
-        },
-        // todo
-        {
-          itemCode: '移库单号',
-          itemName: '移库单号',
-          valueKind: 'M-SEARCH',
+          itemCode: 'tsfCode',
         },
         {
           itemCode: 'opCreateTime',

+ 104 - 0
src/view/sheet/mmg/material-inventory/index.vue

@@ -0,0 +1,104 @@
+<!-- @desc:原料库存明细表  @auth:洪旭东  @time:2023-11-29 11:43 -->
+<template>
+  <div class="main-div" ref="mainDiv">
+    <!--加载中-->
+    <loading :loading="loading" v-if="!modalVisible"></loading>
+    <!--按钮区-->
+    <BaseIndexButtonGroup id="BaseIndexButtonGroup">
+      <template #left>
+        <!--    查询    -->
+        <BaseIndexButton right-button="materialInventory-select" ref="search" name="search"></BaseIndexButton>
+        <!--    清空条件    -->
+        <BaseIndexButton right-button="materialInventory-clear" ref="clear" name="clear"></BaseIndexButton>
+      </template>
+      <template #right>
+        <!--   新建     -->
+        <BaseIndexButton right-button="materialInventory-add" ref="add" name="add"></BaseIndexButton>
+      </template>
+    </BaseIndexButtonGroup>
+
+    <!--  查询条件区域  -->
+    <div id="search-cond-div" ref="search-cond-div" class="search-cond-class">
+      <SearchCond ref="searchCond" v-model="searchCond"
+                  @collapse-change="collapseChange" :set-flag="false"
+                  :search-content="searchContent"></SearchCond>
+    </div>
+
+    <!--  表格部分  -->
+    <DkTable :id="'table-'+$options.name" ref="table-select" :data="tableData"
+             :page-total="pageInfo.total"
+             :current-page="pageInfo.currentPage"
+             :height="tableHeight" primaryKey="inventoryId"
+             :choose-flag="false"
+             @pageChange="pageSizeChange">
+      <DkTableColumn field="modelCode" :title="$t('materialModelCode')"></DkTableColumn>
+      <DkTableColumn field="modelName" :title="$t('materialModelName')"></DkTableColumn>
+      <DkTableColumn field="modelCategoryName" :title="$t('materialModelCategoryCode')"></DkTableColumn>
+      <DkTableColumn field="modelSpecs"></DkTableColumn>
+      <DkTableColumn field="modelPlace"></DkTableColumn>
+      <DkTableColumn field="inventoryQty"></DkTableColumn>
+      <DkTableColumn field="unitName" ></DkTableColumn>
+      <DkTableColumn field="whName" ></DkTableColumn>
+      <DkTableColumn field="placeName" ></DkTableColumn>
+    </DkTable>
+
+
+  </div>
+</template>
+
+<script>
+import { indexMixin } from '@/mixins'
+
+export default {
+  name: "material-inventory",
+  mixins: [indexMixin],
+  data(){
+    let self = this
+    return{
+      searchContent: [
+        {
+          itemCode: 'materialModelIdList',
+          itemName: 'materialModelId',
+          valueFormat: {code: 'materialModelIdList', field: 'modelId'},
+          valueKind: 'M-SEARCH',
+          magnifierType: self.$config.MagnifierType.modelMaterial
+        },
+        {
+          itemCode: 'whIdList',
+          itemName: 'whCodeName',
+          valueFormat: {code: 'whIdList', field: 'whId'},
+          valueKind: 'M-SEARCH',
+          magnifierType: self.$config.MagnifierType.warehouse
+        },
+        {
+          itemCode: 'placeIdList',
+          itemName: 'whPlaceName',
+          valueFormat: {code: 'placeIdList', field: 'placeId'},
+          valueKind: 'M-SEARCH',
+          magnifierType: self.$config.MagnifierType.warehousePlace
+        },
+      ],
+    }
+  },
+  methods:{
+    /**
+     * @desc   : 获取数据
+     * @author : 洪旭东
+     * @date   : 2023-11-21 13:46
+     */
+    getData(params) {
+      // 查询数据
+      return this.excute(this.$service.materialInventoryService, this.$service.materialInventoryService.selectByCond, params);
+    },
+  },
+  created() {
+    this.routeObjName = 'materialInventory'  // 设置路由名称
+  },
+  mounted() {
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 14 - 15
src/view/sheet/mmg/material-out/index.vue

@@ -42,7 +42,7 @@
         <DkTableColumn field="rdsTypeName" ></DkTableColumn>
         <DkTableColumn field="rdsDirectionName" :title="$t('orderStatus')" ></DkTableColumn>
         <DkTableColumn field="tsfCode" type="link"></DkTableColumn>
-        <DkTableColumn field="报损单号" title="报损单号" type="link"></DkTableColumn>
+        <DkTableColumn field="scrapCode" type="link"></DkTableColumn>
         <DkTableColumn field="returnReasonName" :title="$t('returnReason')"></DkTableColumn>
         <DkTableColumn field="区域" title="区域"></DkTableColumn>
         <DkTableColumn field="opCreateTime" :title="$t('rdsCreateTimeOut')" ></DkTableColumn>
@@ -114,12 +114,10 @@ export default {
           valueKind: 'M-CHOICE',
         },
         {
-          itemCode: '移库单号',
-          itemName: '移库单号',
+          itemCode: 'tsfCode',
         },
         {
-          itemCode: '报损单号',
-          itemName: '报损单号',
+          itemCode: 'scrapCode',
         },
         {
           itemCode: 'returnReasonList',
@@ -129,16 +127,17 @@ export default {
           },
           valueKind: 'M-CHOICE',
         },
-        {
-          itemCode: '分厂',
-          itemName: '分厂',
-          valueKind: 'M-CHOICE'
-        },
-        {
-          itemCode: '车间',
-          itemName: '车间',
-          valueKind: 'M-CHOICE'
-        },
+        // todo
+        // {
+        //   itemCode: '分厂',
+        //   itemName: '分厂',
+        //   valueKind: 'M-CHOICE'
+        // },
+        // {
+        //   itemCode: '车间',
+        //   itemName: '车间',
+        //   valueKind: 'M-CHOICE'
+        // },
         {
           itemCode: 'opCreateTime',
           itemName: 'rdsCreateTimeOut',

+ 81 - 22
src/view/sheet/mmg/material-scrap/add.vue

@@ -7,16 +7,19 @@
       <DkPanel prop="essentialInformation">
         <DkForm slot="content" ref="formInline" v-model="formData" :label-max-words="5">
           <!--损失原因-->
-          <DkFormItem prop="损失原因" label="损失原因" required>
-            <SelectPop ref="损失原因" :multiple="false" v-model="formData.b"/>
+          <DkFormItem prop="scrapReason" required data-type="number">
+            <SelectPop ref="scrapReason" :multiple="false" v-model="formData.scrapReason"
+                       :options="scrapReasonList" label-key="dataValue" value-key="dataId"/>
           </DkFormItem>
           <!--损失时间-->
-          <DkFormItem prop="损失时间" label="损失时间" required>
-            <DatePickerPop ref="损失时间" placeholder="请选择损失时间" :multiple="false" v-model="formData.b"/>
+          <DkFormItem prop="scrapTime" required data-type="date">
+            <DatePickerPop ref="scrapTime" :multiple="false" v-model="formData.scrapTime" type="datetime"/>
           </DkFormItem>
           <!--责任人-->
-          <DkFormItem prop="责任人" label="责任人" >
-            <SelectPop ref="责任人" :multiple="false" v-model="formData.c"/>
+          <DkFormItem prop="dutyUserId" required data-type="number">
+            <SelectMagnifier v-model="formData.dutyUserId"
+                             :type="$config.MagnifierType.user"
+                             :multiple="false"></SelectMagnifier>
           </DkFormItem>
           <!--备注-->
           <DkFormItem prop="remarks" :span="24">
@@ -50,14 +53,29 @@ export default {
   data(){
     let self = this
     return{
-      formData:{},
+      formData:{
+        scrapReason: null,
+        scrapTime: new Date(),
+        dutyUserId: null,
+      },
       detailColumns:[
         //物料型号编码
-        { field: '物料编码', title: '物料编码', type: 'tableSelect' },
-        { field: '物料名称', title: '物料名称', type: 'disabled'},
-        { field: '规格', title: '规格', type: 'disabled'},
-        { field: '产地', title:'产地', type: 'disabled'},
-        { field: '损失数量', title:'损失数量', type: 'number', },
+        {
+          field: 'materialModelCode',
+          title: self.$t('materialModelCode'),
+          sortBoolean: false,
+          type: 'tableSelect',
+          param: () => {
+            return {}
+          },
+          dataType: self.$config.tableSelectType.modelMaterial,
+          fieldUpdate: self.$updateColumns.materialEnterMaterialModel,
+        },
+        { field: 'materialModelName', title: self.$t('materialModelName'), type: 'disabled'},
+        { field: 'materialModelCategoryCode', title: self.$t('materialModelCategoryCode'), type: 'disabled'},
+        { field: 'modelPlace', title: self.$t('modelPlace'), type: 'disabled'},
+        { field: 'modelSpecs', title: self.$t('modelSpecs'), type: 'disabled'},
+        { field: 'scrapQty', type: 'number' },
         //仓库
         {
           field: 'whCodeName',
@@ -83,6 +101,8 @@ export default {
         //备注
         { field: 'remarks', type: 'text', width: 'auto'},
       ],
+      //报损原因
+      scrapReasonList: [],
     }
   },
 
@@ -93,8 +113,9 @@ export default {
      * @date   : 2023-08-11 11:27
      */
     setParams() {
-      this.params = this.formData
-      this.params.details = this.$refs.table.tableData
+      this.params = JSON.parse(JSON.stringify(this.formData))
+      this.params.scrapTime = new Date(this.params.scrapTime).format()
+      this.params.materialScrapItemList = this.$refs.table.tableData
     },
     /**
      * @desc   : 验证数据
@@ -102,10 +123,27 @@ export default {
      * @date   : 2023-08-11 11:25
      */
     validData() {
-      // if (!this.$refs.table.tableData.filter(f => f.pdtUniqueId).length) {
-      //   this.$Message.warning(this.$t('W_012'))
-      //   return false
-      // }
+      // 验证明细个数
+      if (!this.$refs.table.tableData.filter(f => f.materialModelId).length) {
+        this.$Message.warning(this.$t('W_012'))
+        return false
+      }
+      if (this.$refs.table.tableData.length !== this.$refs.table.tableData.map(m => m.materialModelId).unique().length) {
+        this.$Message.warning(this.$t('W_011', {param: this.$t('materialModelCode')}))
+        return false
+      }
+      if (this.$refs.table.tableData.some(s => !s.whId)) {
+        this.$Message.warning(this.$t('W_001', {param: this.$t('whCodeName')}))
+        return false
+      }
+      if (this.$refs.table.tableData.some(s => !s.placeId)) {
+        this.$Message.warning(this.$t('W_001', {param: this.$t('whPlaceName')}))
+        return false
+      }
+      if (this.$refs.table.tableData.some(s => !s.scrapQty)) {
+        this.$Message.warning(this.$t('W_001', {param: this.$t('scrapQty')}))
+        return false
+      }
       return true
     },
     /**
@@ -114,9 +152,7 @@ export default {
      * @date   : 2023-08-11 11:27
      */
     saveData() {
-      // return this.type === this.$config.formMode.add ?
-      //   this.excute(this.$service.productDeliveryService, this.$service.productDeliveryService.insertBatch, this.params)
-      //   : this.excute(this.$service.productDeliveryService, this.$service.productDeliveryService.reverse, this.params)
+      return this.excute(this.$service.materialScrapService, this.$service.materialScrapService.insert, this.params)
     },
     /**
      * @desc   : 清空
@@ -125,12 +161,35 @@ export default {
      */
     clear() {
       this.formData = {
+        scrapReason: null,
+        scrapTime: new Date(),
+        dutyUserId: null,
+      }
+      this.$refs.table.tableData = [{}]
+    },
+    /**
+     * @desc   : 报损原因
+     * @author : 洪旭东
+     * @date   : 2023-11-27 15:28
+     */
+    getScrapReason() {
+      let params = {
+        ftyId: this.$store.state.user.ftyId,
+        dictCode:this.$config.dictType.scrapReason
       }
+      this.excute(this.$service.commonService, this.$service.commonService.getDictionaryData, params).then(res => {
+        if (res.code === this.$config.SUCCESS_CODE) {
+          this.scrapReasonList = res.data
+          if (res.data.length === 1) {
+            this.formData.scrapReasonList = res.data[0].dataId
+          }
+        }
+      })
     },
   },
   created() {
     this.resizeTableFlag = true  // 计算表格高度
-
+    this.getScrapReason()
   }
 }
 </script>

+ 92 - 46
src/view/sheet/mmg/material-scrap/index.vue

@@ -7,17 +7,17 @@
     <BaseIndexButtonGroup id="BaseIndexButtonGroup">
       <template #left>
         <!--    查询    -->
-        <BaseIndexButton right-button="productDefect-select" ref="search" name="search"></BaseIndexButton>
+        <BaseIndexButton right-button="materialScrap-select" ref="search" name="search"></BaseIndexButton>
         <!--    清空条件    -->
-        <BaseIndexButton right-button="productDefect-clear" ref="clear" name="clear"></BaseIndexButton>
+        <BaseIndexButton right-button="materialScrap-clear" ref="clear" name="clear"></BaseIndexButton>
         <!--    冲正    -->
-        <BaseIndexButton right-button="productDefect-revert" ref="revert" name="revert"></BaseIndexButton>
+        <BaseIndexButton right-button="materialScrap-revert" ref="revert" name="revert"></BaseIndexButton>
         <!--    操作日志    -->
-        <BaseIndexButton right-button="role-log" ref="log" name="log"></BaseIndexButton>
+        <BaseIndexButton right-button="materialScrap-log" ref="log" name="log"></BaseIndexButton>
       </template>
       <template #right>
         <!--   新建     -->
-        <BaseIndexButton right-button="productDefect-add" ref="add" name="add"></BaseIndexButton>
+        <BaseIndexButton right-button="materialScrap-add" ref="add" name="add"></BaseIndexButton>
       </template>
     </BaseIndexButtonGroup>
 
@@ -34,16 +34,17 @@
       <DkTable slot="top" :id="'table-'+$options.name" ref="table-select" :data="tableData"
                :page-total="pageInfo.total"
                :current-page="pageInfo.currentPage"
-               :height="tableHeight*split -32" primaryKey="flowId"
+               :height="tableHeight*split -32" primaryKey="scrapId"
                :choose-flag="false"
+               @current-change="currentChangeEvent"
                @pageChange="pageSizeChange">
-        <DkTableColumn field="报损单号" title="报损单号" type="link"></DkTableColumn>
-        <DkTableColumn field="单据状态" title="单据状态" ></DkTableColumn>
-        <DkTableColumn field="报损工号" title="报损工号" ></DkTableColumn>
-        <DkTableColumn field="损失时间" title="损失时间" ></DkTableColumn>
-        <DkTableColumn field="损失原因" title="损失原因" ></DkTableColumn>
-        <DkTableColumn field="责任人" title="责任人" ></DkTableColumn>
-        <DkTableColumn field="报损时间" title="报损时间" ></DkTableColumn>
+        <DkTableColumn field="scrapCode" type="link"></DkTableColumn>
+        <DkTableColumn field="rdsDirectionName" :title="$t('orderStatus')" ></DkTableColumn>
+        <DkTableColumn field="opCreateUserName" :title="$t('scrapCreateUser')" ></DkTableColumn>
+        <DkTableColumn field="scrapTime" ></DkTableColumn>
+        <DkTableColumn field="scrapReasonName" :title="$t('scrapReason')"></DkTableColumn>
+        <DkTableColumn field="dutyUserName" ></DkTableColumn>
+        <DkTableColumn field="opCreateTime" :title="$t('scrapTime2')" ></DkTableColumn>
         <DkTableColumn field="remarks" width="auto"></DkTableColumn>
       </DkTable>
 
@@ -54,12 +55,15 @@
                primaryKey="nodeId"
                :choose-flag="false"
                :page-flag="false">
-        <DkTableColumn field="物料编码" title="物料编码"></DkTableColumn>
-        <DkTableColumn field="物料名称" title="物料名称"></DkTableColumn>
-        <DkTableColumn field="物料类别" title="物料类别"></DkTableColumn>
-        <DkTableColumn field="仓库" title="仓库"></DkTableColumn>
-        <DkTableColumn field="仓位" title="仓位"></DkTableColumn>
-        <DkTableColumn field="损失数量" title="损失数量"></DkTableColumn>
+        <DkTableColumn field="modelCode" :title="$t('materialModelCode')"></DkTableColumn>
+        <DkTableColumn field="modelName" :title="$t('materialModelName')"></DkTableColumn>
+        <DkTableColumn field="modelCategoryName" :title="$t('materialModelCategoryCode')"></DkTableColumn>
+        <DkTableColumn field="modelSpecs"></DkTableColumn>
+        <DkTableColumn field="modelPlace"></DkTableColumn>
+        <DkTableColumn field="whName" ></DkTableColumn>
+        <DkTableColumn field="placeName" ></DkTableColumn>
+        <DkTableColumn field="scrapQty"></DkTableColumn>
+        <DkTableColumn field="unitName" ></DkTableColumn>
         <DkTableColumn field="remarks" width="auto"></DkTableColumn>
       </DkTable>
     </DkSplit>
@@ -79,48 +83,90 @@ export default {
     return{
       searchContent: [
         {
-          itemCode: '报损单号',
-          itemName: '报损单号',
+          itemCode: 'scrapCode',
         },
         {
-          itemCode: '单据状态',
-          itemName: '单据状态',
+          itemCode: 'rdsDirectionList',
+          itemName: 'rdsDirection',
+          valueFormat: {
+            code: 'rdsDirectionList', data: [
+              {label: '完成', value: 1},
+              {label: '冲正', value: -1},
+            ], valueKey: 'value', labelKey: 'label',
+          },
           valueKind: 'M-CHOICE',
         },
         {
-          itemCode: '报损原因',
-          itemName: '报损原因',
+          itemCode: 'scrapReasonList',
+          itemName: 'scrapReason',
+          valueFormat: {
+            code: 'scrapReasonList', data: [], valueKey: 'dataId', labelKey: 'dataValue',
+          },
           valueKind: 'M-CHOICE',
         },
         {
-          itemCode: '报损日期',
-          itemName: '报损日期',
+          itemCode: 'opCreateTime',
+          itemName: 'scrapTime2',
           valueKind: 'DATE_RANGE',
         },
       ],
-      tableData:[
-        {'报损单号':'BS-DK-202310120JKR','损失原因':'自然损失','单据状态':'完成','损失时间':'2023-10-12 08:54:20','报损工号':'D1-2','责任人':'B4-1','报损时间':'2023-10-12 08:54:20'},
-        {'报损单号':'BS-DK-202310120JKR','损失原因':'自然损失','单据状态':'冲正','损失时间':'2023-10-12 08:54:20','报损工号':'D1-2','责任人':'B4-1','报损时间':'2023-10-12 08:54:20'},
-        {'报损单号':'BS-DK-202310120JKR','损失原因':'自然损失','单据状态':'完成','损失时间':'2023-10-12 08:54:20','报损工号':'D1-2','责任人':'B4-1','报损时间':'2023-10-12 08:54:20'},
-        {'报损单号':'BS-DK-202310120JKR','损失原因':'自然损失','单据状态':'冲正','损失时间':'2023-10-12 08:54:20','报损工号':'D1-2','责任人':'B4-1','报损时间':'2023-10-12 08:54:20'},
-        {'报损单号':'BS-DK-202310120JKR','损失原因':'自然损失','单据状态':'完成','损失时间':'2023-10-12 08:54:20','报损工号':'D1-2','责任人':'B4-1','报损时间':'2023-10-12 08:54:20'},
-        {'报损单号':'BS-DK-202310120JKR','损失原因':'自然损失','单据状态':'完成','损失时间':'2023-10-12 08:54:20','报损工号':'D1-2','责任人':'B4-1','报损时间':'2023-10-12 08:54:20'},
-        {'报损单号':'BS-DK-202310120JKR','损失原因':'自然损失','单据状态':'完成','损失时间':'2023-10-12 08:54:20','报损工号':'D1-2','责任人':'B4-1','报损时间':'2023-10-12 08:54:20'},
-        {'报损单号':'BS-DK-202310120JKR','损失原因':'自然损失','单据状态':'完成','损失时间':'2023-10-12 08:54:20','报损工号':'D1-2','责任人':'B4-1','报损时间':'2023-10-12 08:54:20'},
-        {'报损单号':'BS-DK-202310120JKR','损失原因':'自然损失','单据状态':'冲正','损失时间':'2023-10-12 08:54:20','报损工号':'D1-2','责任人':'B4-1','报损时间':'2023-10-12 08:54:20'},
-        {'报损单号':'BS-DK-202310120JKR','损失原因':'自然损失','单据状态':'完成','损失时间':'2023-10-12 08:54:20','报损工号':'D1-2','责任人':'B4-1','报损时间':'2023-10-12 08:54:20'},
-      ],
-      detailList:[
-        {'物料编码':'322000002N0000','物料名称':'石膏粉','物料类别':'原料','物料规格':'-','物料产地':'佛山','损失数量':'380','单位':'吨','仓库':'原料1仓','仓位':'A'},
-        {'物料编码':'532000002N0235','物料名称':'沙子','物料类别':'原料','物料规格':'-','物料产地':'佛山','损失数量':'2000','单位':'吨','仓库':'原料1仓','仓位':'B'},
-        {'物料编码':'652000002N0123','物料名称':'水泥','物料类别':'原料','物料规格':'-','物料产地':'佛山','损失数量':'5000','单位':'吨','仓库':'原料1仓','仓位':'C'},
-        {'物料编码':'241240002N3560','物料名称':'软管','物料类别':'辅料','物料规格':'-','物料产地':'河南','损失数量':'700','单位':'米','仓库':'辅料1仓','仓位':'A'},
-        {'物料编码':'652000002N0666','物料名称':'手套','物料类别':'劳保品','物料规格':'-','物料产地':'河南','损失数量':'800','单位':'个','仓库':'劳保1仓','仓位':'A'},
-      ],
+      tableData:[],
+      detailList:[],
     }
   },
+  methods: {
+    /**
+     * @desc   : 获取数据
+     * @author : 洪旭东
+     * @date   : 2023-11-21 13:46
+     */
+    getData(params) {
+      this.detailList = []
+      // 查询数据
+      return this.excute(this.$service.materialScrapService, this.$service.materialScrapService.selectByCond, params);
+    },
+    /**
+     * @desc   : 当前行改变事件
+     * @author : 洪旭东
+     * @date   : 2023-11-21 17:06
+     */
+    currentChangeEvent({row}) {
+      this.detailList = row.materialScrapItemList
+    },
+    /**
+     * @desc   : 冲正
+     * @author : 洪旭东
+     * @date   : 2023-11-22 11:22
+     */
+    revert (row) {
+      if (row && row.length) {
+        this.excuteNoParam(this.$service.materialScrapService, this.$service.materialScrapService.revert, [row[0].scrapId]).then(res=>{
+          if (res.code === this.$config.SUCCESS_CODE) {
+            this.searchData()
+          }
+        })
+      }
+    },
+    /**
+     * @desc   : 退货原因
+     * @author : 洪旭东
+     * @date   : 2023-11-22 13:32
+     */
+    getReturnReason() {
+      let params = {
+        ftyId: this.$store.state.user.ftyId,
+        dictCode:this.$config.dictType.scrapReason
+      }
+      this.excute(this.$service.commonService, this.$service.commonService.getDictionaryData, params).then(res => {
+        if (res.code === this.$config.SUCCESS_CODE) {
+          this.searchContent[2].valueFormat.data = res.data
+        }
+      })
+    },
+  },
   created() {
     this.routeObjName = 'materialScrap'  // 设置路由名称
+    this.getReturnReason()
   }
 }
 </script>

+ 4 - 1
src/view/sheet/mmg/material-transfer/add.vue

@@ -192,7 +192,7 @@ export default {
         this.setParams(arg)
         this.params.ftyId = this.$store.state.user.ftyId;// 给工厂赋默认值
         // 3、保存数据
-        if (this.$refs.table.tableData.some(s => s.outQty !== s.enterQty)) {
+        if (!this.formData.needConfirm && this.$refs.table.tableData.some(s => s.outQty !== s.enterQty)) {
           this.$IBMessage({
               content: this.$t('Q_023'),
               title: this.$t('systemQuestion'),
@@ -242,6 +242,9 @@ export default {
      */
     clear() {
       this.formData = {
+        carryUserId: null,
+        needConfirm: false,
+        remarks: '',
       }
       this.$refs.table.tableData = [{}]
     },

+ 2 - 2
src/view/sheet/mmg/material-transfer/index.vue

@@ -177,7 +177,7 @@ export default {
      * @date   : 2023-11-23 16:22
      */
     materialTransferConfirm (row) {
-      if (row[0].needConfirm){
+      if (row[0].needConfirm && row[0].rdsDirection === 0){
         this.confirmModal = true
         this.$nextTick(()=>{
           this.$refs.confirmTable.tableData = row[0].materialTransferItemList
@@ -194,7 +194,6 @@ export default {
     confirm () {
       let params = this.$refs['table-select'].batchRows[0]
       params.materialTransferItemList = this.$refs.confirmTable.tableData
-      console.log(this.$refs.confirmTable.tableData)
       if (this.$refs.confirmTable.tableData.some(s => s.outQty !== s.enterQty)) {
         this.$IBMessage({
             content: this.$t('Q_023'),
@@ -217,6 +216,7 @@ export default {
     doConfirm (params) {
       this.excute(this.$service.materialTransferService, this.$service.materialTransferService.confirm, params).then(res=>{
         if (res.code === this.$config.SUCCESS_CODE) {
+          this.searchData()
           this.$Message.success(vm.$t('I_001', {'param': vm.$v('materialTransferConfirm')}))
           this.confirmModal = false
         }