春风项目四线(合箱线、总装线)
hdy
2024-01-18 2cc5a1afe8296d148f0a32989395d538e5323a8e
jcdm-ui/src/views/main/om/productionOrde/planStatistics.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,657 @@
<template>
  <div class="app-container">
    <el-card class="box-card">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
      <el-form-item label-width="100" label="生产通知单" prop="productName">
        <el-input v-model="queryParams.productionNotice" placeholder="请输入生产通知单" clearable @keyup.enter.native="handleQuery"/>
      </el-form-item>
      <el-form-item label-width="80" label="生产订单" prop="workOrderNo">
        <el-input v-model="queryParams.workOrderNo" placeholder="请输入生产订单" clearable @keyup.enter.native="handleQuery"/>
      </el-form-item>
      <el-form-item label="机型" prop="typeZ">
        <el-input v-model="queryParams.typeZ" placeholder="请输入机型" clearable @keyup.enter.native="handleQuery"/>
      </el-form-item>
      <el-form-item style="float: right">
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button type="warning" icon="el-icon-copy-document" size="mini" @click="advancedQuery">高级查询</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <el-form :model="queryParams" ref="queryParams" size="small" :inline="true" v-show="advancedShowSearch" label-width="68px">
      <el-form-item style="margin-left: 14px" label="产品编号" prop="productCode">
        <el-input v-model="queryParams.productCode" placeholder="请输入产品编号" clearable @keyup.enter.native="handleQuery"/>
      </el-form-item>
    </el-form>
    </el-card>
    <el-card style="margin-top: 10px" class="box-card">
    <el-row :gutter="10" class="mb8">
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>
      <el-table border v-loading="loading" :data="productionOrdeList" @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55" align="center" />
        <el-table-column label="生产通知单号" width="160" align="center" prop="productionNotice">
        </el-table-column>
        <el-table-column label="生产订单" width="160" align="center" prop="workOrderNo">
        </el-table-column>
        <el-table-column label="机型" width="160" align="center" prop="typeZ">
        </el-table-column>
        <el-table-column label="产品编号" width="150" align="center" prop="productCode">
        </el-table-column>
        <el-table-column label="工单状态" align="center" prop="orderStatus">
          <template slot-scope="scope">
            <dict-tag :options="dict.type.order_state" :value="scope.row.orderStatus"/>
          </template>
        </el-table-column>
        <el-table-column label="需求数量" align="center" prop="planQty">
        </el-table-column>
        <el-table-column label="工作中" align="center">
        </el-table-column>
        <el-table-column label="已完成" width="160" align="center" prop="actualQty">
        </el-table-column>
        <el-table-column label="已报废" width="160" align="center" prop="scrapQty">
        </el-table-column>
        <el-table-column label="完成率" width="160" align="center">
        </el-table-column>
        <el-table-column label="合格率" width="160" align="center">
        </el-table-column>
      </el-table>
    </el-card>
    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
    <!-- æ·»åŠ æˆ–修改生产工单对话框 -->
    <el-dialog v-dialogpop-up :title="title" :visible.sync="open" width="1000px" append-to-body>
       <span slot="title">
        <i class="el-icon-s-order"></i>
        {{titleName}}
      </span>
      <el-form ref="form" inline :model="form" :rules="rules" label-width="80px">
        <el-form-item label="工单号" prop="workOrderNo">
          <el-input v-model="form.workOrderNo" placeholder="请输入生产订单" />
        </el-form-item>
        <el-form-item label="订单编号" prop="salesOrderCode">
          <el-input v-model="form.salesOrderCode" placeholder="请输入订单编号" />
        </el-form-item>
        <el-form-item label="产品编号" prop="productCode">
          <el-input v-model="form.productCode" placeholder="请选择产品" >
            <el-button slot="append" @click="handleSelectProduct" icon="el-icon-search"></el-button>
          </el-input>
          <ItemSelect ref="itemSelect" @onSelected="onItemSelected" > </ItemSelect>
        </el-form-item>
        <el-form-item label="产品名称" prop="productName">
          <el-input v-model="form.productName" disabled placeholder="请输入产品名称" />
        </el-form-item>
        <el-form-item label="种类" prop="productName">
          <el-input v-model="form.typeZ" disabled placeholder="请输入种类" />
        </el-form-item>
        <el-form-item label="实际数量" prop="actualQty">
          <el-input v-model="form.actualQty"  placeholder="请输入实际数量" />
        </el-form-item>
        <el-form-item label="车间编号" prop="workshopCode">
          <el-select style="width: 93%" @change="handleSelectChange(form.workshopCode)" v-model="form.workshopCode" placeholder="请选择车间编号">
            <el-option
              v-for="item in options"
              :key="item.workshopCode"
              :label="item.workshopName"
              :value="item.workshopCode">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item style="margin-left: -15px" label="产线编号" prop="lineCode">
          <el-select style="width: 93%" v-model="form.lineCode" placeholder="请选择产线编号">
            <el-option
              v-for="item in lineOptions"
              :key="item.lineCode"
              :label="item.lineName"
              :value="item.lineCode">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="工艺流程" prop="routeCode">
          <el-input v-model="form.routeCode" disabled placeholder="请输入工艺流程" />
        </el-form-item>
        <el-form-item label="产品BOM" prop="bomCode">
          <el-input v-model="form.bomCode" disabled placeholder="请输入产品BOM" />
        </el-form-item>
        <el-form-item label="工艺配方" prop="recipeCode">
          <el-input v-model="form.recipeCode" placeholder="请输入工艺配方" />
        </el-form-item>
        <el-form-item label="计划数量" prop="planQty">
          <el-input v-model="form.planQty" placeholder="请输入计划数量" />
        </el-form-item>
        <el-form-item label="需求日期" prop="demandDate">
          <el-date-picker style="width: 88%" clearable
            v-model="form.demandDate"
            type="date"
            value-format="yyyy-MM-dd"
            placeholder="请选择需求日期">
          </el-date-picker>
        </el-form-item>
        <el-form-item style="margin-left: -30px" label="备注" prop="remarks">
          <el-input v-model="form.remarks" placeholder="请输入备注" />
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item style="margin-left: 10px" label-width="120" label="计划开始时间" prop="planStartTime">
              <el-date-picker clearable
                v-model="form.planStartTime"
                type="date"
                value-format="yyyy-MM-dd"
                placeholder="请选择计划开始时间">
              </el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item style="margin-left: 76px" label-width="120" label="计划结束时间" prop="planEndTime">
              <el-date-picker clearable
                v-model="form.planEndTime"
                type="date"
                value-format="yyyy-MM-dd"
                placeholder="请选择计划结束时间">
              </el-date-picker>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
    <el-dialog v-dialogpop-up :title="title" :visible.sync="Createopen" width="400px" append-to-body>
       <span slot="title">
        <i class="el-icon-s-order"></i>
        {{titleName}}
      </span>
      <el-form ref="form" inline  :model="form" :rules="CreateRules" label-width="80px">
        <el-form-item   label="种类" prop="typeZ">
          <el-input disabled v-model="form.typeZ"  placeholder="请输入种类" />
        </el-form-item>
        <el-form-item  label="日期" prop="dateTime">
          <el-date-picker clearable
                          v-model="form.dateTime"
                          type="date"
                          value-format="yyyy-MM-dd"
                          placeholder="请选择日期" @input="handleCodeChange">
          </el-date-picker>
        </el-form-item>
        <el-form-item class="hidden-form-item" label="日期规则" prop="dateTimeRule">
          <el-input v-model="form.dateTimeRule"/>
        </el-form-item>
        <el-form-item   label="起始编号" prop="startCode">
          <el-input type="number"   :maxlength="3"  :pattern="'[0-9]{3}'" v-model="form.startCode"  placeholder="请输入起始编号" @input="handleCodeChange"/>
        </el-form-item>
        <el-form-item   label="起止编号" prop="startEndCode">
          <el-input disabled v-model="form.startEndCode"/>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitFormForBoxCode">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { listLineInfo } from "@/api/main/bs/lineInfo/lineInfo";
import { listWorkshop } from "@/api/main/bs/workshop/workshop";
import { listProductBom } from "@/api/main/bs/ProductBom/ProductBom";
import { listTechnologyRoute} from "@/api/main/bs/technologyRoute/technologyRoute";
import ItemSelect  from "@/components/itemSelect/single.vue";
import {  addOrderSchedulingForBoxCode,getProductionNotice, upDownMove, listProductionOrde, getProductionOrde, delProductionOrde, addProductionOrde, updateProductionOrde } from "@/api/main/om/productionOrde/productionOrde";
import {
  listOrderScheduling,
  getOrderScheduling,
  delOrderScheduling,
  addOrderScheduling,
  updateOrderScheduling,
  generateNumbers
} from "@/api/main/bs/orderScheduling/orderScheduling";
import {listMaterial} from "@/api/main/bs/material/material";
import {listModelNumber} from "@/api/main/bs/modelNumber/modelNumber";
export default {
  name: "ProductionOrde",
  dicts: ['order_state','year','month','day'],
  components: {
    ItemSelect ,
  },
  data() {
    return {
      titleName: '',
      options: [],
      lineOptions: [],
      outputArray: [],
      showFlag:false,
      advancedShowSearch: false,
      workOrder: {
        status: 'ss'
      },
      // é®ç½©å±‚
      loading: true,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•ä¸ªç¦ç”¨
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      move: true,
      selectedRowIndex: -1, // å­˜å‚¨é€‰ä¸­è¡Œçš„索引
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
      total: 0,
      // ç”Ÿäº§å·¥å•è¡¨æ ¼æ•°æ®
      productionOrdeList: [],
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
      Createopen: false,
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        workOrderNo: null,
        salesOrderCode: null,
        productCode: null,
        productName: null,
        workshopCode: null,
        lineCode: null,
        routeCode: null,
        bomCode: null,
        recipeCode: null,
        orderStatus: "2",
        custom: null,
        marketAreaCode: null,
        softwareVersionCode: null,
        productCompanyCode: null,
        frontEndId: 0,
        idNums: null,
        typeZ: null,
        flag: null,
        adds:null,
        productionNotice: null,
      },
      materialQueryParams: {
        pageNum: 1,
        pageSize: 10,
        materialCode: null,
      },
      // è¡¨å•å‚æ•°
      form: {},
      updateStatusParameter: {
        id: null,
        orderStatus: null
      },
      // è¡¨å•æ ¡éªŒ
      rules: {
        id: [
          { required: true, message: "ID不能为空", trigger: "blur" }
        ],
      },
      CreateRules: {
        day: [
          { required: true, message: "不能为空", trigger: "blur" }
        ],
        month: [
          { required: true, message: "不能为空", trigger: "blur" }
        ],
        year: [
          { required: true, message: "不能为空", trigger: "blur" }
        ],
        dateTime: [
          { required: true, message: "不能为空", trigger: "blur" }
        ],
        startCode: [
          { required: true, message: "不能为空", trigger: "blur" }
        ],
      },
      change: {
        day: '',
        month: '',
        year: '',
      },
      markNo: '',
    };
  },
  created() {
    this.getList();
    this.initWorkshop();
  },
  methods: {
    //日期或开始编号输入时
    handleCodeChange(data){
      let dateTime = this.form.dateTime;
      let planQty = this.form.planQty;
      let startCode = this.form.startCode
      if(dateTime !== null && dateTime !== undefined
        && startCode !== null && startCode !== undefined) {
        let dateTimes = dateTime.split("-");
        let year = dateTimes[0];
        let month = dateTimes[1];
        let day = dateTimes[2];
        let dictYear = this.dict.type.year;
        let dictMonth = this.dict.type.month;
        let startCode = this.form.startCode
        let dateTimeRule = "";
        //å¹´
        for (let i = 0; i < dictYear.length; i++) {
          if (year === dictYear[i].label) {
            dateTimeRule = dictYear[i].value
            // this.form.startEndCode = startEndCode;
          }
        }
        //月
        for (let i = 0; i < dictMonth.length; i++) {
          if (month === dictMonth[i].label) {
            dateTimeRule = dateTimeRule + dictMonth[i].value;
          }
        }
        //日
        dateTimeRule = dateTimeRule + day;
        dateTimeRule = dateTimeRule + this.markNo;
        this.form.dateTimeRule = dateTimeRule;
        //赋值起始编码
        this.form.startEndCode = dateTimeRule +  startCode + "----" + dateTimeRule + String(parseInt(startCode) + parseInt(planQty)-1).padStart(3, '0') ;
      }
    },
    getProductionNotice(){
      getProductionNotice(this.queryParams).then(response => {
        this.$modal.msgSuccess("接收成功");
        this.queryParams = {}
        this.getList();
      });
    },
    //数组生成
    changeDay(day){
      this.change.day = day;
      let adds =this.form.typeZ+this.change.year+this.change.month+this.change.day+this.form.actualQty;
      this.form.adds = adds
    },
    changeMonth(day){
      this.change.month = day;
      let adds =this.form.typeZ+this.change.year+this.change.month+this.change.day+this.form.actualQty;
      this.form.adds = adds
    },
    changeYear(day){
      this.change.year = day;
      let adds =this.form.typeZ+this.change.year+this.change.month+this.change.day+this.form.actualQty;
      this.form.adds = adds
    },
    moveUp(row, val){
      console.log(val)
      const ids = row.id || this.ids
      let str = JSON.stringify(ids);
      let num = BigInt(str.replace(/[\[\]]/g, ''));
      this.queryParams.frontEndId = num
      this.queryParams.idNums = ids
      this.queryParams.flag = val
      upDownMove(this.queryParams).then(response => {
        this.$modal.msgSuccess("移动成功");
        this.getList();
      });
    },
    initWorkshop(){
      listWorkshop(this.queryParams).then(response => {
        this.options = response.rows;
      });
    },
    // åœ¨è¿™é‡Œç¼–写处理选中事件的逻辑
    //物料选择弹出框
    onItemSelected(obj){
      if(obj !== undefined && obj !== null){
        let productCode = obj.materialCode;
        this.form.productCode = productCode;
        this.form.productName = obj.materialName;
        this.form.typeZ = obj.typeZ;
        this.typeL = obj.typeZ;
        this.queryParams.productCode = productCode;
        this.queryParams.typeZ = typeZ
        listTechnologyRoute(this.queryParams).then(response => {
          this.form.routeCode = response.rows[0].routeCode;
        });
        listProductBom(this.queryParams).then(response => {
          this.form.bomCode = response.rows[0].bomCode;
        });
      }
    },
    handleSelectProduct(){
      this.$refs.itemSelect.showFlag = true;
    },
    advancedQuery(){
      this.advancedShowSearch = (this.advancedShowSearch) ? this.advancedShowSearch = false : this.advancedShowSearch = true;
    },
    handleCommand(status,id) {
      console.log(status)
      this.updateStatusParameter.id = id;
      this.updateStatusParameter.orderStatus = status;
      updateProductionOrde(this.updateStatusParameter).then(response => {
        this.$modal.msgSuccess("修改成功");
        this.open = false;
        this.getList();
      });
    },
    /** æŸ¥è¯¢ç”Ÿäº§å·¥å•åˆ—表 */
    getList() {
      this.loading = true;
      listProductionOrde(this.queryParams).then(response => {
        this.productionOrdeList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },
    // å–消按钮
    cancel() {
      this.open = false;
      this.Createopen = false;
      this.reset();
    },
    // è¡¨å•é‡ç½®
    reset() {
      this.form = {
        id: null,
        workOrderNo: null,
        salesOrderCode: null,
        productCode: null,
        productName: null,
        workshopCode: null,
        lineCode: null,
        routeCode: null,
        bomCode: null,
        recipeCode: null,
        planQty: null,
        actualQty: null,
        badQty: null,
        scrapQty: null,
        repairQty: null,
        actualOnlineQty: null,
        onlineCompletionMark: null,
        demandDate: null,
        planStartTime: null,
        planEndTime: null,
        actualStartTime: null,
        actualEndTime: null,
        serialNumber: null,
        orderStatus: null,
        createTime: null,
        updateTime: null,
        createUser: null,
        updateUser: null,
        remarks: null,
        streamNumber: null,
        custom: null,
        marketAreaCode: null,
        softwareVersionCode: null,
        productCompanyCode: null,
        spareField1: null,
        spareField2: null,
        spareField3: null,
        typeZ: null,
        spareField4: null,
        adds:null
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.id)
      this.move = selection.length!==1
      if(!selection.length){
        this.single = true
        this.multiple = true
      }else {
        if(selection[0].orderStatus === '1' && selection.length === 1){
          this.single = false
          this.multiple = false
        }
      }
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.initWorkshop();
      this.reset();
      this.open = true;
      this.titleName = "添加生产订单";
    },
    /** åŒæ­¥æŒ‰é’®æ“ä½œ */
    CreatehandleUpdate(Row) {
      this.initWorkshop();
      this.reset();
      const id = Row.id || this.ids
      getProductionOrde(id).then(response => {
        console.log(response.data)
        console.log(response.data.productCode)
        this.materialQueryParams.materialCode = response.data.productCode;
        listMaterial(this.materialQueryParams).then(response => {
          this.markNo = response.rows[0].mark
        });
        this.form = response.data;
        this.Createopen = true;
        this.titleName = "生成箱体条码";
        // return Array.from({ length: parseInt(this.actualQty) }, (_, index) => index + 1);
      });
    },
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleUpdate(row) {
      this.initWorkshop();
      this.reset();
      const id = row.id || this.ids
      getProductionOrde(id).then(response => {
        console.log(response.data)
        this.form = response.data;
        this.open = true;
        this.titleName = "修改生产订单";
      });
    },
    /** æäº¤æŒ‰é’® */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.id != null) {
            updateProductionOrde(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addProductionOrde(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /** ç”Ÿæˆç®±ä½“条码提交按钮 */
    submitFormForBoxCode() {
      let startCode = parseInt(this.form.startCode);
      let queryParams = {
        model: this.form.typeZ,
        modelDate: this.form.dateTimeRule,
      }
      listModelNumber(queryParams).then(response => {
        if(response.rows.length === 0){
          this.saveBoxCode()
        }else {
          let maxNumValue = response.rows[0].maxnumValue;
          if(startCode<maxNumValue){
            this.$message.error('新建的不能比查询出的小');
            return;
          }else {
            this.saveBoxCode()
          }
        }
      });
    },
    saveBoxCode(){
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.id != null) {
            addOrderSchedulingForBoxCode(this.form).then(response => {
              this.$modal.msgSuccess("保存成功");
              this.Createopen = false;
              this.getList();
            });
          }
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const ids = row.id || this.ids;
      this.$modal.confirm('是否确认删除生产订单编号为"' + ids + '"的数据项?').then(function() {
        return delProductionOrde(ids);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
    },
    /** å¯¼å‡ºæŒ‰é’®æ“ä½œ */
    handleExport() {
      this.download('om/productionOrde/export', {
        ...this.queryParams
      }, `productionOrde_${new Date().getTime()}.xlsx`)
    },
  }
};
</script>
<style lang="scss" scoped>
.hidden-form-item {
  display: none;
}
</style>