出库并发货

2022-08-31  本文已影响0人  糖醋里脊120625
<!--
 * @Author: your name
 * @Date: 2021-05-28 14:02:07
 * @LastEditTime: 2021-07-29 15:08:44
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \shangyuan-supplychain-gypms\src\components\common\selectPrinter.vue
-->
<template>
  <div class="sendgoodspage">
    <el-dialog append-to-body title="详细信息" :visible.sync="displayshow" :before-close="closeAdd" width="1400px">
      <div class="publicstyle" v-loading="loading">

        <el-form class="infoObj_form" ref="infoObj" :model="infoObj" label-width="110px">
          <div class="info_box">
            <div class="info_item">
              <span class="label_span">订单号:</span>
              <span>{{ infoObj.orderNo }}</span>
            </div>
            <div class="info_item" v-if="infoObj.creatorType == 0">
              <span class="label_span">客户名称:</span>
              <span>{{ infoObj.customerName }}</span>
            </div>
            <div class="info_item" v-else>
              <span class="label_span">供应商名称:</span>
              <span>{{ infoObj.supplierName }}</span>
            </div>
            <div class="info_item">
              <span class="label_span">商品总数:</span>
              <span>{{ infoObj.productNum }}</span>
            </div>
            <div class="info_item">
              <span class="label_span">总价:</span>
              <span>{{ sumnumber }} 元</span>
              <!-- <span v-else>无协议价</span> -->
            </div>
            <div class="info_item">
              <span class="label_span" v-if="infoObj.supplyType == 10">配送日期:</span>
              <span class="label_span" v-else>自提日期:</span>
              <span>{{ Dateval }}</span>
            </div>
            <div class="info_item">
              <span class="label_span" v-if="infoObj.supplyType == 10">配送地址:</span>
              <span class="label_span" v-else>自提地址:</span>
              <span class="span_ss">{{ infoObj.supplyAddress }}</span>
            </div>
            <div class="info_item">
              <span class="label_span">订单状态:</span>
              <span>{{ infoObj.orderStatusDescription }}</span>
              <span class="unimpor" v-if="infoObj.canceledRemark">({{ infoObj.canceledRemark }})</span>
            </div>
            <!-- <div class="info_item">
              <span class="label_span">发货状态:</span>
              <span v-if="infoObj.ordSupplyStatus==0">待发货</span>
              <span v-if="infoObj.ordSupplyStatus==10">已发货</span>
              <span v-if="infoObj.ordSupplyStatus==20">已取消</span>
            </div> -->
            <div class="info_item">
              <span class="label_span">联系人:</span>
              <span v-if="infoObj.ordContactName">{{ infoObj.ordContactName }}({{ infoObj.ordContactPhone }})</span>
            </div>
            <div class="info_item">
              <span class="label_span">备注:</span>
              <span class="span_ss">{{ infoObj.remark }}</span>
            </div>
          </div>
          <div class="tabmain">
            <el-table :data="dialogTable" show-summary :summary-method="getSummaries">
              <el-table-column label="商品" min-width="200">
                <template slot-scope="scope">
                  <GoodsItem :imageSrc="scope.row.productInfo.image"
                             :imageIsShow="imageIsShow"
                             :name="scope.row.productInfo.name"
                             :spec="scope.row.productInfo.spec"
                             :netContent="scope.row.productInfo.netContent"
                             :netContentUnit="scope.row.productInfo.netContentUnit"
                             :level="scope.row.productInfo.level"/>
                </template>
              </el-table-column>

              <el-table-column label="数量" align="right" width="80">
                <template slot-scope="scope">
                  <span>{{ scope.row.productNum }} {{ scope.row.productInfo.spec }}</span>
                </template>
              </el-table-column>

              <el-table-column prop="supplyPrice" label="单价" align="right" width="120">
              </el-table-column>

              <el-table-column prop="dtlAmount" label="金额" align="right" width="120">
              </el-table-column>

              <el-table-column prop="remark" label="备注">
              </el-table-column>

              <el-table-column prop="" label="出库" align="left" min-width="220">
                <template slot-scope="scope">
                 <div class="outpart" v-for="(every,secondindex) in scope.row.looplist" :key="secondindex">
                  <!-- :disabled="scope.row.looplist.length>1 && every.loopNum>0 && every.loopStockId.length>0 " -->
                  <div class="loop_input">
                    <el-select
                      style="width:120px"  
                      :disabled="scope.row.looplist.length>1 && every.loopNum>0 && every.loopStockId.length>0 "
                      v-model="every.loopStockId" 
                      @change="optionsChange(
                      every.loopStockId,
                      secondindex,
                      every.Eachwarehouse,
                      scope.$index,
                       scope.row,
                      )" 
                    placeholder="请选择">
                    <el-option
                      class="warehouseoption"
                      v-for="item in every.Eachwarehouse"
                      :key="item.id"
                      :label="item.storehouseName"
                      :value="item.id">
                        <div >{{ item.storehouseName }}</div>
                        <span class="warehousename">库存数量:{{ item.stockNumber }}</span>
                        <span class="warehousename">库存批次:{{ item.batchNo }}</span>
                    </el-option>
                    </el-select>
                    <!-- @change="((val)=>{handleChange(val,scope.row,scope.$index,secondindex)})"
                    :disabled="scope.row.looplist.length>1 && every.loopNum>0 && every.loopStockId.length>0 " -->
                    <el-input 
                      style="width:60px" 
                      @change="((val)=>{handleChange(val,scope.row,scope.$index,secondindex)})"
                      v-model="every.loopNum" 
                      placeholder="数量"
                    >
                    </el-input>
                  </div>
                  <div class="loop_iocn">
                    <i v-if="secondindex>0" @click="delLoop( secondindex, scope.$index, )" class="el-icon-delete"></i>
                    <i  @click="addLoop( every.loopNum,scope.row,scope.$index,secondindex)" class="el-icon-circle-plus-outline"></i>
                  </div>
                 </div>
                </template>
              </el-table-column>

              <el-table-column prop="proddate" label="生产日期" align="left" width="150">
                <template slot-scope="scope">
                  <div class="loop_time" v-for="(every,secondindex) in scope.row.looplist" :key="secondindex">
                    {{every.looproductdate}}
                  </div>
                  
                </template>
              </el-table-column>

              <el-table-column prop="expirationdate" label="过期日期" align="left" width="120">
                <template slot-scope="scope">
                   <div class="loop_time" v-for="(every,secondindex) in scope.row.looplist" :key="secondindex">
                    {{every.loopoverduedata}}
                  </div>
                </template>
              </el-table-column>

              <el-table-column prop="" label="凭证" align="left" min-width="200">
                <template slot-scope="scope">
                    <div class="imgpz"  v-for="(every,secondindex) in scope.row.looplist" :key="secondindex" @click="imgclick(every)">
                      <div  class="pzlistimg" v-for="(imgitem, imgindex) in every.files" :key="imgindex"  >
                        <img :src="imgitem.url">
                      </div>
                    </div>
                </template>
              </el-table-column>
            </el-table>
          </div>
        </el-form>
      </div>
      <div slot="footer" class="dialog-footer">
        <el-button @click="closeAdd">取 消</el-button>
        <el-button type="primary" @click="addPrint">出库并发货</el-button>
      </div>
    </el-dialog>


    <FileViewer :visible.sync="fileViewer.visible" :files="fileViewer.files"/>
  </div>
</template>


<script type="text/ecmascript-6">
import {Currenttimedate} from '../../utils/util'
import {canTeenAnalysisI} from "../../service/api/config";
import GoodsItem from '@/components/common/GoodsItem';
import FileViewer from "@/components/common/FileViewer"
import voucherApi from "@/service/api/voucher-api";

function convertFileUrlsToFiles(fileUrls) {
  // 一个产品可能有多个凭证。所以 map fileUrls 后,结构是[[],[]],需要使用 flat(1),扁平化数组的深度。
  return fileUrls && fileUrls.length > 0 ?
      fileUrls.flat(1).map(item => {
        return {url: item, type: item.substr(item.lastIndexOf(".") + 1)}
      }) : [];
}

function EachInventorySet(item) {
  return item
}

export default {
  components: {
    GoodsItem,
    FileViewer
  },
  props: {
    clickCell: {
      type: Function,
      default: function () {
      }
    }
  },
  data() {
    return {
      Deprodtime: "",
      errorimg: require('../../assets/img/nothing.png'),
      infoObj: {},
      zongjia: "",
      dialogTable: [],
      poploading: false,
      newimglist: [],
      mantext: "首页",
      displayshow: false,
      formLabelWidth: "140px",
      goodsprint: "",
      printList: [],
      markVal: "",
      publicobj: {},
      tableData: [],
      nametype: "",
      loading: true,
      sumnumber: "",
      Dateval: "",
      imageIsShow: true,
      //限制生产日期
      pickerOptions2: {
        disabledDate(time) {
          let _now = Date.now(),
              seven = 20 * 365 * 24 * 60 * 60 * 1000,
              sevenDays = _now - seven;
          return time.getTime() > _now || time.getTime() < sevenDays;
          //大于当前的禁止,小于20年前的禁止
        }
      },
      fileViewer: {
        visible: false,
        files: []
      }
    };
  },
  mounted() {

  },
  destroyed() {

  },
  created() {
    var d = new Date();
    this.Deprodtime = this.$format(d, 'yyyy-MM-dd')
  },

  methods: {
    changeloop(Eachwarehouse,eachloop){
      let hasIds= eachloop.map(item => {
        if(item.loopStockId){
          return item.loopStockId
        }
      })
      var result = Eachwarehouse.filter(function (item) {
          return hasIds.every(function (ele) {
              return ele !== item.id
          })
      })
      return result
    },
    delLoop(secondindex,ondeindex){
      this.dialogTable[ondeindex].looplist.splice(secondindex, 1);
    },

    addLoop(val,item,oneindex,secondindex){
      let that =this;
      let row  = {
        Eachwarehouse:  this.changeloop(item.Eachwarehouse,this.dialogTable[oneindex].looplist),
        loopStockId:"",
        loopNum:"",
        looproductdate:"",
        loopoverduedata:"",
      }
      for (var i = 0; i < this.dialogTable[oneindex].looplist.length; i++) {
        if (
          this.dialogTable[oneindex].looplist[i].loopStockId == "" ||
          this.dialogTable[oneindex].looplist[i].loopStockId == null ||
          this.dialogTable[oneindex].looplist[i].loopStockId == undefined ||
          this.dialogTable[oneindex].looplist[i].loopNum == "" ||
          this.dialogTable[oneindex].looplist[i].loopNum == null 
        ) {
          this.$message("请选择仓库和填写出库数量");
          return;
          break;
        }
      }

      let sum = 0;
      this.dialogTable[oneindex].looplist.forEach(item =>{
          sum = sum + Number(item.loopNum)
      })
      if(sum> this.dialogTable[oneindex].productNum){
        this.dialogTable[oneindex].looplist[secondindex].loopNum = ""
        this.$message.error("出库数量不得大于 产品数量");
        return false
      }  
      if(Number(val)> this.dialogTable[oneindex].productNum){
        this.dialogTable[oneindex].looplist[secondindex].loopNum = ""
        this.$message.error("出库数量不得大于 产品数量");
        return false
      }
      if(this.dialogTable[oneindex].looplist[secondindex].Eachwarehouse.length==1){
        this.$message.error("没有过多的仓库了");
        return false
      }

      console.log("判斷是否一直加")
      console.log(this.dialogTable[oneindex].looplist[secondindex].Eachwarehouse)
      
      this.dialogTable[oneindex].looplist.push(row)
      this.$forceUpdate() 
    
    },
    handleChange(val,item,oneindex,secondindex){
      let that =this;
      if(Number(val)> this.dialogTable[oneindex].productNum){
        this.dialogTable[oneindex].looplist[secondindex].loopNum = ""
        this.$message.error("出库数量不得大于 产品数量");
        return false
      }
    },
    optionsChange(val,secondindex,list,oneindex,item) {
      var data= list.filter((item)=>{
        return  item.id===val
      }) 
      //this.dialogTable[oneindex].looplist[secondindex+1].Eachwarehouse = this.changeloop(item.Eachwarehouse,this.dialogTable[oneindex].looplist)

      this.dialogTable[oneindex].looplist[secondindex].looproductdate =this.$format(data[0].productionDate, 'yyyy-MM-dd');
      this.dialogTable[oneindex].looplist[secondindex].loopoverduedata =this.$format(data[0].expirationDate, 'yyyy-MM-dd');
      this.loadVouchers(
        this.dialogTable[oneindex].productInfo.id, 
        this.dialogTable[oneindex].looplist[secondindex].looproductdate,
        oneindex,
        secondindex
        )
    },
    loadVouchers(productIds, productionDate, oneindex,secondindex) {
      voucherApi.listByProducts({productIds: productIds, productionDate: productionDate})
          .then(vouchers => {
            console.log(vouchers)
            if (oneindex > -1) {// 刷新某个商品

              let row = this.dialogTable[oneindex].looplist[secondindex];
              row.files = convertFileUrlsToFiles(vouchers.map(item => item.fileUrls));

            } else {// 刷新所有产品
              this.dialogTable.forEach(row => {
                // 过滤出凭证 》过滤出对应的文件集合 》转换为一级的数组集合 》转换成页面需要的数据
                row.files = convertFileUrlsToFiles(vouchers.filter(item => item.productId === row.productInfo.id).map(item => item.fileUrls));
              });
            }
            
            // 此处不进行单个或者多个列表刷新,直接统一刷新整个数据
            this.$nextTick(() => {
              for (let i = 0; i < this.dialogTable.length; i++) {
                this.$set(this.dialogTable, i, this.dialogTable[i]);
              }
            })
            console.log(this.dialogTable)

          })
    },
    imgclick(item) {
      console.log(item)
      if (!item.files || item.files.length <= 0) {
        return;
      }
      this.fileViewer.files = item.files;
      this.fileViewer.visible = true;
    },
    seebig(item) {
      const viewer = this.$el.querySelector('.picall').$viewer
      viewer.show()
    },


    // 处理时间
    DateAdd(interval, number, date) {
      switch (interval) {
        case   "y"   : {
          date.setFullYear(date.getFullYear() + number);
          return date;
          break;
        }
        case   "q"   : {
          date.setMonth(date.getMonth() + number * 3);
          return date;
          break;
        }
        case   "m"   : {
          date.setMonth(date.getMonth() + number);
          return date;
          break;
        }
        case   "w"   : {
          date.setDate(date.getDate() + number * 7);
          return date;
          break;
        }
        case   "d"   : {
          date.setDate(date.getDate() + number);
          return date;
          break;
        }
        case   "h"   : {
          date.setHours(date.getHours() + number);
          return date;
          break;
        }
        case   "m"   : {
          date.setMinutes(date.getMinutes() + number);
          return date;
          break;
        }
        case   "s"   : {
          date.setSeconds(date.getSeconds() + number);
          return date;
          break;
        }
        default   : {
          date.setDate(d.getDate() + number);
          return date;
          break;
        }
      }
    },
    getSummaries(param) {
      const {columns, data} = param;
      const sums = [];
      columns.forEach((column, index) => {
        if (index == 0) {
          sums[index] = "合计";
          return
        }
        if (index == 3) {
          sums[index] = this.sumnumber;
          return
        }
      });

      return sums;
    },

    //xxxxxxxxx
    addPrint() {
      console.log(this.dialogTable)
      let judgenum =true;
      let judgeid= true;
      this.dialogTable.forEach((ele, ind) => {
        if(ele.Eachwarehouse.length>0){ 
          let sum = 0;
          ele.looplist.forEach((single, index)=>{
            sum = sum + Number(single.loopNum)
            if(single.loopStockId==""){
              judgeid =false
              return false;
            }
          })
          if(sum!=ele.productNum){
            judgenum=false
            return false;
          } 
        }  
      });
      //alert(judgeid)
      if(judgeid==false){
        this.$message.error("请选择出库");
        return
      }
      if(judgenum==false){
        this.$message.error("出库数量一定要等于商品数量");
        return
      }  
      var arr = [];
      console.log(this.dialogTable)
      this.dialogTable.forEach((ele, ind) => {
        
        ele.looplist.forEach((single, index)=>{
          // if(single.loopStockId){
            let objs = {
            attachFileUrls:single.files?single.files.map(item => item.url):[],
            productionDate: single.looproductdate,
            expirationDate: single.loopoverduedata,
            shipNum: single.loopNum,
            productId: ele.productInfo.id,
            stockId:single.loopStockId
          };
          arr.push(objs);
          // }          
        })
      
      });
      let postdata = {
        orderId: this.infoObj.orderId,
        items: arr
      }
      console.log(postdata)

      this.$post(canTeenAnalysisI.OutboundAndDelivery, postdata)
      .then((res) => {
        if (res.code == 200) {
          this.$emit('fatherMethod', res.data);
          this.displayshow = false;
        } else {
          this.$message(res.message);
        }
      })

    },


    closeAdd() {
      this.displayshow = false;
    },
    // Changeshelftime(val) {
    //   let that = this;
    //   that.getqualityperioddata(val)
    // },
    getdetaile(val) {
      let that = this;
      this.imageIsShow = true;
      var postdata = val.orderId;

      this.displayshow = true;
      this.loading = true;

      this.$get(canTeenAnalysisI.orderModuleDetail + postdata)
          .then((res) => {
            if (res.code == 200) {
              let resData = res.data;

              this.infoObj = resData;
              this.sumnumber = (resData.orderAmount / 100).toFixed(2);

           
              let DetailID = [];
              resData.detailList.forEach((ele, ind) => {
                ele.supplyPrice = (ele.supplyPrice / 100).toFixed(2);
                ele.dtlAmount = (ele.dtlAmount / 100).toFixed(2);
                this.$set(ele, "proddate", "");
                this.$set(ele, "Eachwarehouse", []);
                this.$set(ele, "eachNum", '');
                this.$set(ele, "eachStockId", "");
                this.$set(ele, "expirationdate", "");
                this.$set(ele, "suresend", true);
                DetailID.push(ele.productInfo.id)
              })
              this.dialogTable = resData.detailList;
              this.loading = false;
              this.Inventory(DetailID.join(","))

            } else {
              this.$message(res.message);
            }
            this.loading = false;
          })
          .catch((err) => {
            console.log(err)
            this.dialogLoad = false;
            this.$message("请求服务器失败");
          })
    },
    // iiiii
    Inventory(ids){
     
        voucherApi.InventorCollection(ids)
        .then((resData) => {
          this.dialogTable.forEach(row => {
            row.Eachwarehouse = EachInventorySet(resData.filter(item => item.productId === row.productInfo.id));
          });
          this.dialogTable.forEach((ele, ind) => {
            this.$set(ele, "looplist", [
                {
                  Eachwarehouse:ele.Eachwarehouse,
                  loopStockId:"",
                  loopNum:"",
                  looproductdate:"",
                  loopoverduedata:"",
                }
              ]);
          })
           console.log(this.dialogTable)
        })

       
       
    },


  },
  watch: {}
};
</script>


<style>
.warehouseoption{
  height: 72px!important;
}
.warehouseoption div{
  line-height: 22px!important;
}
.warehousename{
  display: block!important;
  color: #8492a6; 
  font-size: 13px;
  line-height: 22px!important;
}
.sendgoodspage .viewer-canvas {
  z-index: 999 !important;
}

.nosure {
  font-size: 12px;

  color: red;
}

</style>


<style lang="less">
.pzlistimg {
  display: inline-block;
  margin-left: 10px;
}

.imgpz {
  width: 201px;
  height: 58px;
  white-space: nowrap;
  overflow: auto;
  // overflow-x: scroll;
  display: flex;

  img {
    width: 50px;
    height: 50px;
    cursor: pointer;
  }
}

.w_140 {
  width: 140px !important;
}

.shangping {
  display: flex;
}

.producemain {
  margin-left: 20px;

  span {
    display: block;
  }
}

.scopeproduce {
  color: #909399;
  margin-top: 4px !important;
}

.unimpor {
  color: #c7c9d1 !important;
}

.tabmain {
  width: 100%;
  padding-top: 20px;
}

.tongji {
  width: 100%;
  height: 45px;
  line-height: 45px;
  background: #F5F7FA;
  box-sizing: border-box;
  padding: 0px 8px;

  span {
    display: inline-block;
  }
}

.allnum {
  margin-left: 543px;
  width: 102px;

  text-align: center;
}

.publich {
  text-align: center;
}

.eltitle {
  padding: 2px 0px;
  margin: 0px;
  font-size: 14px;
}

.bgline {
  width: 100%;
  height: 1px;
  background: #e8e8e8;
  margin-top: 14px;
  margin-bottom: 4px;
}

.imgpic {
  width: 100%;
  display: flex;

  .imagli {
    display: inline-block;
    margin-right: 8px;
  }
}

.border_none {
  border: none !important
}

.prindescript {
  div {
    display: inline-block;
    color: #bbb;
  }
}

.info_box {
  overflow: hidden;
  padding: 15px 15px 5px 15px;
  box-sizing: border-box;
  border: 1px solid #DCDFE6;
  border-radius: 10px;

  .info_item {
    padding-bottom: 10px;
    float: left;
    width: 50%;
  }

  span {
    color: #606266;
    font-size: 14px;
    line-height: 22px;
  }

  .label_span {
    display: inline-block;
    width: 110px;
    text-align: right;
  }

  .span_ss {
    display: inline-block;
    width: calc(100% - 120px);
    vertical-align: top;
  }
}
.outpart{
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.loop_input{
  display: flex;
  align-items: center;
}
.loop_iocn{
  font-size: 18px;
}
.loop_time{
  height: 36px;
  line-height: 36px;
}

</style>

``
上一篇下一篇

猜你喜欢

热点阅读