ysy 2 ani în urmă
părinte
comite
55547b6970

+ 2 - 1
src/enum/dict.js

@@ -30,5 +30,6 @@ export const numberList = [
   'order_source',
   'production_status',
   'plan_type',
-  'delivery_status'
+  'delivery_status',
+   'margin_code'
 ];

+ 0 - 0
src/views/materialPlan/components/ProductionVersion.vue → src/views/materialPlan copy/components/ProductionVersion.vue


+ 0 - 0
src/views/materialPlan/components/detail/material.vue → src/views/materialPlan copy/components/detail/material.vue


+ 0 - 0
src/views/materialPlan/components/detail/plan.vue → src/views/materialPlan copy/components/detail/plan.vue


+ 190 - 0
src/views/materialPlan copy/components/materialPlan-search.vue

@@ -0,0 +1,190 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="80px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
+        <el-form-item label="计划编码:">
+          <el-input clearable v-model="where.code" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
+        <el-form-item label="物料编码:">
+          <el-input
+            clearable
+            v-model="where.materialCode"
+            placeholder="请输入"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
+        <el-form-item label="牌号:" label-width="80px">
+          <el-input clearable v-model="where.brandNo" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 9, md: 12 } : { span: 9 }">
+        <el-form-item label="要求交付日期:" label-width="100px">
+          <el-date-picker
+            class="w100"
+            v-model="where.deliveryTime"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="yyyy-MM-dd"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
+        <el-form-item label="计划状态:" label-width="80px">
+          <el-select
+            v-model="where.statusList"
+            placeholder="请选择"
+            class="w100"
+          >
+            <el-option
+              v-for="item in statusOpt[activeName]"
+              :label="item.label"
+              :value="item.value"
+              :key="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 7, md: 12 } : { span: 7 }">
+        <el-form-item label="创建时间:">
+          <el-date-picker
+            class="w100"
+            v-model="where.createTime"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="yyyy-MM-dd HH:mm:ss"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-col>
+      <el-col
+        v-bind="styleResponsive ? { lg: 7, md: 12 } : { span: 7 }"
+        v-if="activeName == 'second'"
+      >
+        <el-form-item label="发布时间:">
+          <el-date-picker
+            class="w100"
+            v-model="where.releaseTime"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="yyyy-MM-dd"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-col>
+      <el-col
+        v-bind="
+          styleResponsive
+            ? {
+                lg: activeName == 'second' ? 5 : 12,
+                md: activeName == 'second' ? 12 : 24
+              }
+            : { span: activeName == 'second' ? 5 : 12 }
+        "
+      >
+        <div class="ele-form-actions">
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+          <el-button @click="reset" icon="el-icon-refresh-left" type="primary"
+            >重置</el-button
+          >
+        </div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+  export default {
+    props: ['activeName', 'statusOpt', 'planType'],
+    data () {
+      // 默认表单数据
+      const defaultWhere = {
+        materialCode: '',
+        brandNo: '',
+        statusList: '',
+        code: '',
+        releaseTime: [],
+        deliveryTime: [],
+        createTime: []
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere },
+        treeData: []
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive () {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    watch: {
+      activeName: {
+        handler () {
+          if (this.activeName) {
+            this.where.statusList = this.statusOpt[this.activeName][0].value;
+            this.reset();
+          }
+        },
+        immediate: true
+      }
+    },
+    created () {},
+    methods: {
+      /* 搜索 */
+      search () {
+        const where = { ...this.where };
+
+        for (const key in where) {
+          if (Array.isArray(where[key]) && where[key].length) {
+            where[`${key}Start`] = where[key][0];
+            where[`${key}End`] = where[key][1];
+          }
+        }
+        delete where.releaseTime;
+        delete where.deliveryTime;
+        delete where.createTime;
+
+        where.statusList = where.statusList.split(',');
+
+        this.$emit('search', where);
+      },
+      /*  重置 */
+      reset () {
+        this.where = { ...this.defaultWhere };
+        this.where.statusList = this.statusOpt[this.activeName][0].value;
+        this.search();
+      }
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .ele-form-actions {
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+  }
+</style>

+ 232 - 0
src/views/materialPlan copy/components/plan-edit-dialog.vue

@@ -0,0 +1,232 @@
+<template>
+  <ele-modal
+    :visible.sync="visible"
+    :closed="cancel"
+    :title="`${type == 'add' ? '创建' : '编辑'}配料计划`"
+    custom-class="ele-dialog-form"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+  >
+    <el-form
+      :model="formData"
+      ref="formRef"
+      label-width="120px"
+      class="ele-body"
+      :rules="rules"
+    >
+      <el-row :gutter="32">
+        <el-col :span="12">
+          <el-form-item label="选择物料" prop="materialName">
+            <el-input
+              placeholder="请选择"
+              :value="
+                formData.materialName &&
+                `${formData.materialName}(${formData.materialCode})`
+              "
+              @click.native="chooseMateriel"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="生产版本" prop="produceVersionName">
+            <el-input
+              :disabled="!formData.materialName"
+              :placeholder="!formData.materialName ? '请选择物料' : '请选择'"
+              v-model="formData.produceVersionName"
+              @click.native="chooseVersion"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="牌号" prop="brandNo">
+            <el-input v-model="formData.brandNo" disabled></el-input>
+          </el-form-item>
+        </el-col>
+        <!-- <el-col :span="12">
+          <el-form-item label="工艺路线名称" prop="brandNo">
+            <el-input v-model="formData.aaa"></el-input>
+          </el-form-item>
+        </el-col> -->
+        <el-col :span="12">
+          <el-form-item label="要求交付日期" prop="deliveryTime">
+            <el-date-picker
+              style="width: 100%"
+              v-model="formData.deliveryTime"
+              :pickerOptions="{
+                disabledDate: (time) =>
+                  time.getTime() <
+                  new Date(new Date().setHours(0, 0, 0, 0)).getTime()
+              }"
+              type="date"
+              placeholder="选择日期"
+              value-format="yyyy-MM-dd"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <!-- <el-col :span="12">
+          <el-form-item label="工艺路线版本" prop="brandNo">
+            <el-input v-model="formData.aaa"></el-input>
+          </el-form-item>
+        </el-col> -->
+        <el-col :span="12">
+          <el-form-item label="生产重量" prop="num">
+            <!-- <el-input v-model.number="formData.num">
+              
+            </el-input> -->
+            <el-row>
+              <el-col :span="21">
+                <el-input-number
+                  placeholder="请输入"
+                  class="w100"
+                  v-model="formData.num"
+                  :controls="false"
+                  :precision="3"
+                  :min="0"
+                ></el-input-number>
+              </el-col>
+              <el-col :span="3" style="text-align: center">
+                {{ formData.unit || 'kg' }}
+              </el-col>
+            </el-row>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="计划备注" prop="notes">
+            <el-input v-model="formData.notes" placeholder="请选择"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <div slot="footer">
+      <el-button @click="cancel">取消</el-button>
+      <el-button type="primary" @click="confirm">确定</el-button>
+    </div>
+
+    <!-- 选择物料 -->
+    <ChooseMaterial
+      ref="chooseRef"
+      @success="handleChooseMaterial"
+    ></ChooseMaterial>
+    <!-- 选择生产版本 -->
+    <ProductionVersion
+      ref="versionRef"
+      :productCode="formData.materialCode"
+      @confirm="versionConfirm"
+    ></ProductionVersion>
+  </ele-modal>
+</template>
+
+<script>
+  import ChooseMaterial from '@/components/CreatePlan/ChooseMaterial.vue';
+  import ProductionVersion from '@/components/CreatePlan/ProductionVersion.vue';
+  import { save, update } from '@/api/materialPlan/index';
+  import dayjs from 'dayjs';
+  export default {
+    components: {
+      ChooseMaterial,
+      ProductionVersion
+    },
+    data () {
+      return {
+        visible: false,
+        type: 'add',
+        rules: {
+          materialName: [
+            {
+              required: true,
+              message: '请选择物料',
+              trigger: ['blur', 'change']
+            }
+          ],
+          produceVersionName: [
+            {
+              required: true,
+              message: '请选择生产版本',
+              trigger: ['blur', 'change']
+            }
+          ],
+          deliveryTime: [
+            {
+              required: true,
+              message: '请选择要求交付日期',
+              trigger: ['blur', 'change']
+            }
+          ],
+          num: [
+            {
+              required: true,
+              message: '请输入生产重量',
+              trigger: ['blur', 'change']
+            }
+          ]
+        },
+        formData: {
+          deliveryTime: dayjs(new Date()).format('YYYY-MM-DD'),
+          num: null,
+          notes: '',
+          categoryId: '',
+          unit: '',
+          brandNo: '',
+          model: '',
+          produceVersionName: '',
+          materialCode: '',
+          materialName: ''
+        }
+      };
+    },
+    methods: {
+      async open (type, row = {}) {
+        this.type = type;
+        this.formData = Object.assign({}, this.formData, row);
+        this.visible = true;
+      },
+      chooseMateriel () {
+        this.$refs.chooseRef.open(this.formData.categoryId);
+      },
+      handleChooseMaterial (row) {
+        this.formData = Object.assign({}, this.formData, {
+          materialName: row.name,
+          categoryId: row.id,
+          materialCode: row.code,
+          brandNo: row.brandNum,
+          model: row.modelType,
+          unit: row.measuringUnit
+        });
+      },
+      confirm () {
+        this.$refs.formRef.validate(async (value) => {
+          if (value) {
+            const request = this.type == 'add' ? save : update;
+
+            // if (this.type == 'add') {
+            //   this.formData.produceVersionId = '1684162877351866369';
+            //   this.formData.produceVersionName = '挤压合金生产';
+            // }
+            await request(this.formData);
+            this.$message.success('保存成功!');
+            this.$emit('success');
+            this.cancel();
+          }
+        });
+      },
+      cancel () {
+        this.visible = false;
+        this.formData = {};
+        this.$refs.formRef.resetFields();
+      },
+      versionConfirm (cur) {
+        this.formData.produceVersionId = cur.produceVersionId;
+        this.formData.produceVersionName = cur.produceVersionName;
+      },
+
+      chooseVersion () {
+        if (!this.formData.materialName) {
+          return this.$message.error('请选择物料');
+        }
+        this.$refs.versionRef.open(1);
+      }
+    }
+  };
+</script>

+ 438 - 0
src/views/materialPlan copy/components/plan-view.vue

@@ -0,0 +1,438 @@
+<template>
+  <div class="plan-view">
+    <div class="description">
+      <div class="label"></div>
+      <!-- <div class="label">方案说明</div>
+      <div class="content">
+        <template v-for="(item, index) in rulesList">
+          <template v-for="(itm, idx) in item.list">
+            <template v-if="!itm.lastDisabled">
+              <div class="tag" :key="index + '' + idx">{{ itm.label }}</div>
+            </template>
+          </template>
+        </template>
+      </div> -->
+      <div class="operate">
+        <el-button type="primary" plain @click="handleRelease"
+          >发布当前方案</el-button
+        >
+        <!-- <el-button type="primary">保存</el-button> -->
+      </div>
+    </div>
+
+    <div class="display-box">
+      <el-button type="primary" plain size="small" @click="addOrder"
+        >添加工单</el-button
+      >
+      <!-- <el-button type="danger" plain size="small" @click="remove">删除</el-button> -->
+      <div class="items">
+        <span class="label">累计工单条数</span>
+        {{ tableData.length }}条
+      </div>
+      <div class="items">
+        <span class="label">累计生产重量</span>
+        {{ sumData.productNum }}{{ infoData.unit }}
+      </div>
+      <div class="items">
+        <span class="label">设备数量</span>
+        {{ sumData.equipment }}台
+      </div>
+      <!-- <div class="items">
+        <span class="label">成型剂需求</span>
+        14条
+      </div>
+      <div class="items">
+        <span class="label">混合料需求</span>
+        14条
+      </div> -->
+    </div>
+    <el-form :model="{ tableData }" label-width="0" ref="formRef">
+      <el-table :data="tableData">
+        <el-table-column type="index" label="序号"></el-table-column>
+        <el-table-column label="工单号" prop="code"></el-table-column>
+        <el-table-column label="生产重量" prop="" width="120">
+          <template v-slot="{ row, $index }">
+            <el-form-item
+              :prop="`tableData.${$index}.productNum`"
+              :rules="rule.productNum"
+            >
+              <el-input
+                type="number"
+                v-model.number="row.productNum"
+              ></el-input>
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column label="开始日期" prop="" width="160">
+          <template v-slot="{ row, $index }">
+            <el-form-item
+              :prop="`tableData.${$index}.planStartTime`"
+              :rules="rule.planStartTime"
+            >
+              <el-date-picker
+                class="w100"
+                :clearable="false"
+                v-model="row.planStartTime"
+                :pickerOptions="{
+                  disabledDate: (time) =>
+                    (row.planCompleteDate
+                      ? time.getTime() >=
+                        new Date(
+                          new Date(row.planCompleteDate).setHours(0, 0, 0, 0)
+                        ).getTime()
+                      : true) &&
+                    time.getTime() <
+                      new Date(new Date().setHours(0, 0, 0, 0)).getTime()
+                }"
+                type="date"
+                placeholder="选择日期"
+                value-format="yyyy-MM-dd"
+              >
+              </el-date-picker>
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column label="班次" prop="" width="160">
+          <template v-slot="{ row, $index }">
+            <el-form-item
+              :prop="`tableData.${$index}.classesId`"
+              :rules="rule.classesId"
+            >
+              <classesSelect
+                ref="classesSelectRef"
+                :init="false"
+                v-model="row.classesId"
+                @selfChange="(val) => handleClasseChange(val, row)"
+              />
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column label="设备编码" prop="deviceCode"></el-table-column>
+        <el-table-column label="设备名称" prop="deviceName" width="160">
+          <template v-slot="{ row, $index }">
+            <el-input
+              :value="row.deviceName"
+              @click.native="editOrder(row)"
+            ></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="可执行人"
+          prop="executorName"
+          min-width="220px"
+          show-overflow-tooltip
+        >
+          <template v-slot="{ row, $index }">
+            <template v-if="row.executorName.length">
+              <el-tag
+                type="success"
+                v-for="(item, index) in row.executorName.split(',')"
+                :key="index"
+                >{{ item }}</el-tag
+              >
+            </template>
+          </template></el-table-column
+        >
+        <el-table-column label="操作" prop="">
+          <template v-slot="{ $index }">
+            <el-link type="danger" @click="handleDelete($index)">删除</el-link>
+          </template>
+        </el-table-column>
+        <!-- <el-table-column type="selection"></el-table-column> -->
+      </el-table>
+    </el-form>
+    <equipmentDailog
+      ref="equipmentDailogRef"
+      @success="equipmentSelect"
+      :produceVersionId="infoData.produceVersionId"
+    />
+  </div>
+</template>
+
+<script>
+  import equipmentDailog from '@/components/CreatePlan/equipment-dailog.vue';
+  import classesSelect from '@/components/CommomSelect/classes-select';
+  import { getExector } from '@/api/workforceManagement/classes';
+
+  import { release } from '@/api/materialPlan/order.js';
+  import { getCode } from '@/api/codeManagement';
+  import { getRouteTabKey, removePageTab } from '@/utils/page-tab-util';
+  import { deepClone } from '@/utils';
+  export default {
+    components: { equipmentDailog, classesSelect },
+    props: {
+      infoData: {
+        type: Object,
+        default: () => ({})
+      },
+      orderList: {
+        type: Array,
+        default: () => []
+      }
+    },
+    data () {
+      return {
+        deleteList: [], //已保存删除项
+        tableData: [],
+        rule: {
+          productNum: [
+            { required: true, message: '请输入成型数量', trigger: 'blur' }
+          ],
+          planStartTime: [
+            { required: true, message: '请选择开始日期', trigger: 'blur' }
+          ],
+          classesId: [
+            { required: true, message: '请选择班次', trigger: 'change' }
+          ]
+        },
+        rulesList: [
+          {
+            type: 'radio',
+            value: '',
+            list: [
+              { label: '多设备优先', value: 0 },
+              { label: '多班次优先', value: 1 }
+            ]
+          },
+          {
+            type: 'checked',
+            value: [],
+
+            list: [
+              { label: '设备产能优先', value: 0 },
+              { label: '最早开始时间优先', value: 1 },
+              { label: '开始时间优先', value: 2, lastDisabled: true }
+            ]
+          },
+          {
+            type: 'checked',
+            value: [],
+            list: [
+              { label: '非空闲设备可用', value: 0 },
+              { label: '检修设备可用', value: 1 },
+              { label: '检修设备优先', value: 1, lastDisabled: true }
+            ]
+          },
+          {
+            type: 'radio',
+            value: '',
+            list: [{ label: '末单均衡', value: 0 }]
+          }
+        ],
+        selectionList: []
+      };
+    },
+    computed: {
+      sumData () {
+        let productNum = 0;
+        let equi = new Set();
+        this.tableData.forEach((ele) => {
+          productNum += +ele.productNum || 0;
+
+          equi.add(ele.deviceId);
+        });
+
+        return {
+          productNum,
+          equipment: equi.size
+        };
+      }
+    },
+    watch: {
+      tableData: {
+        immediate: true,
+        handler () {
+          this.$nextTick(() => {
+            this.$refs.classesSelectRef &&
+              this.$refs.classesSelectRef.getList();
+          });
+        }
+      },
+      orderList: {
+        immediate: true,
+        handler () {
+          if (this.orderList?.length) {
+            this.tableData = deepClone(this.orderList);
+          }
+        }
+      }
+    },
+    methods: {
+      back () {
+        const key = getRouteTabKey();
+        this.$router.push('/productionPlan');
+        removePageTab({ key });
+      },
+      // chooseItem(selection){
+      //  this.selectionList = selection
+      // },
+      // 发布
+      handleRelease () {
+        this.$refs.formRef.validate((value) => {
+          if (value) {
+            this.$confirm('发布工单后不可撤回,确定发布吗?', '发布确认')
+              .then(async () => {
+                const loading = this.$loading({
+                  lock: true,
+                  fullscreen: true,
+                  text: '工单发布中...'
+                });
+                try {
+                  // 反显对象会报错 status
+                  const data = await release([
+                    ...this.tableData.map((i) =>
+                      Object.assign({}, i, {
+                        status: 4,
+                        model: this.infoData.model,
+                        brandNo: this.infoData.brandNo
+                      })
+                    ),
+                    ...this.deleteList
+                  ]);
+                  if (data) {
+                    this.$message.success('发布成功!');
+                  } else {
+                    this.$message.error('发布失败,请重新发布!');
+                  }
+                  this.back();
+                } catch (error) {
+                  console.error(error);
+                }
+                loading.close();
+              })
+              .catch(() => {});
+          }
+        });
+      },
+      // 班次改变选择执行人
+      async handleClasseChange (val, row) {
+        if (!val) {
+          row.executorId = '';
+          row.executorName = '';
+        }
+        const res = await getExector(val);
+
+        let executorId = '';
+        let executorName = '';
+        res.forEach((item) => {
+          executorId += ',' + item.userVOList.map((itm) => itm.id).join(',');
+          executorName +=
+            ',' + item.userVOList.map((itm) => itm.name).join(',');
+        });
+
+        row.executorId = executorId.substring(1);
+        row.executorName = executorName.substring(1);
+      },
+      addOrder () {
+        if (this.tableData.length > 0)
+          return this.$message.warning('工单只能添加一条!');
+        this.$refs.equipmentDailogRef.open();
+      },
+      editOrder (row) {
+        this.$refs.equipmentDailogRef.openSingle([row], (current) => {
+          row.deviceCode = current.code;
+          row.deviceId = current.id;
+          row.deviceName = current.name;
+          row.planStartTime = current.planCompleteDate;
+          row.planCompleteDate = current.planCompleteDate;
+        });
+      },
+      async equipmentSelect (list) {
+        for (const pre of list) {
+          const code = await getCode('product_order_code');
+          // classesId	班次id		false
+          // classeName	班次名称		false
+          // code	工单号		false
+          // deviceCode	设备编码		false
+          // deviceId	设备id		false
+          // deviceName	设备名称		false
+          // executorId	执行人id		false
+          // executorName	执行人名称		false
+          // generativeRules	生成规则		false
+          // planCompleteTime	计划完成时间		false
+          // planStartTime	计划开始时间		false
+          // batchingPlanId	生产计划号		false
+          // batchingPlanCode	生产计划id		false
+          // workOrderType	工单类型
+          this.tableData.push({
+            classesId: pre.classesId,
+            code: code,
+            deviceCode: pre.code,
+            deviceId: pre.id,
+            deviceName: pre.name,
+            executorId: '',
+            executorName: '',
+            planCompleteTime: '', //当班下班时间,
+            planStartTime: pre.planCompleteDate,
+            planCompleteDate: pre.planCompleteDate,
+            batchingPlanId: this.infoData.id,
+            batchingPlanCode: this.infoData.code,
+            produceVersionId: this.infoData.produceVersionId
+          });
+        }
+      },
+      handleDelete (index) {
+        this.$confirm('确定删除当前数据?', '提示')
+          .then(() => {
+            const [item] = this.tableData.splice(index, 1);
+
+            if (this.orderList.find((i) => i.id == item.id)) {
+              item.deleted = 1;
+              this.deleteList.push(item);
+            }
+          })
+          .catch(() => {});
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .plan-view {
+    ::v-deep(.el-form-item) {
+      margin-top: 16px;
+      margin-bottom: 16px;
+    }
+  }
+  .description {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 10px 20px;
+    border: 1px solid rgba(215, 215, 215, 1);
+    background-color: rgba(242, 242, 242, 1);
+    .label {
+      margin-right: 20px;
+    }
+    .content {
+      flex: 1;
+      display: flex;
+      justify-content: flex-start;
+      align-items: center;
+
+      .tag {
+        padding: 5px 10px;
+        background-color: rgba(202, 249, 130, 1);
+        border-radius: 20px;
+
+        & + .tag {
+          margin-left: 10px;
+        }
+      }
+    }
+  }
+
+  .display-box {
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+    padding: 10px;
+
+    .items {
+      margin-left: 30px;
+      .label {
+        font-weight: bold;
+      }
+    }
+  }
+</style>

+ 0 - 0
src/views/materialPlan/detail.vue → src/views/materialPlan copy/detail.vue


+ 309 - 0
src/views/materialPlan copy/index.vue

@@ -0,0 +1,309 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <materialPlan-search
+        @search="reload"
+        :statusOpt="statusOpt"
+        :activeName="activeName"
+        ref="searchRef"
+      >
+      </materialPlan-search>
+
+      <el-tabs v-model="activeName" type="card">
+        <el-tab-pane label="未发布" name="first"></el-tab-pane>
+        <el-tab-pane label="已发布" name="second"></el-tab-pane>
+      </el-tabs>
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :key="activeName"
+        :initLoad="false"
+        :columns="columns"
+        :datasource="datasource"
+        :cache-key="`${activeName}materialPlanTable`"
+      >
+        <template v-slot:toolbar>
+          <el-button type="primary" @click="handleEdit('add')"
+            >创建计划</el-button
+          >
+        </template>
+        <template v-slot:code="{ row }">
+          <el-link type="primary" :underline="false" @click="goDetail(row)">
+            {{ row.code }}
+          </el-link>
+        </template>
+        <template v-slot:status="{ row }">
+          <span :class="{ 'ele-text-danger': row.status == 3 }">
+            {{ statusFormatter(row.status) }}
+          </span>
+        </template>
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-truck"
+            v-if="row.status == 2"
+            @click="handleOrderPublish(1, row)"
+          >
+            发布工单
+          </el-link>
+          <el-link
+            type="primary"
+            v-if="row.status == 3"
+            :underline="false"
+            icon="el-icon-truck"
+            @click="handleOrderPublish(2, row)"
+          >
+            重新发布
+          </el-link>
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="handleEdit('edit', row)"
+          >
+            修改计划
+          </el-link>
+          <el-link
+            type="primary"
+            @click="handleDel(row)"
+            :underline="false"
+            icon="el-icon-edit"
+          >
+            删除
+          </el-link>
+        </template>
+      </ele-pro-table>
+    </el-card>
+    <planEditDialog ref="planEditDialogRef" @success="reload" />
+  </div>
+</template>
+
+<script>
+  import materialPlanSearch from './components/materialPlan-search.vue';
+  import planEditDialog from './components/plan-edit-dialog.vue';
+  import { getList, del } from '@/api/materialPlan/index';
+  export default {
+    components: {
+      planEditDialog,
+      materialPlanSearch
+    },
+
+    data() {
+      return {
+        activeName: 'first',
+
+        // 加载状态
+        loading: false,
+        pageType: 'add',
+        dialogTitle: '',
+        isBindPlan: false,
+        statusOpt: {
+          first: [
+            { label: '所有状态', value: '3,2' },
+            { label: '待发布', value: '2' },
+            { label: '发布失败', value: '3' }
+          ],
+          second: [
+            { label: '所有状态', value: '7,4,5,6' },
+            { label: '待生产', value: '4' },
+            { label: '生产中', value: '5' },
+            { label: '已完成', value: '6' },
+            { label: '已延期', value: '7' }
+          ]
+        }
+      };
+    },
+    computed: {
+      // 表格列配置
+      columns() {
+        return [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            fixed: 'left'
+          },
+          {
+            slot: 'code',
+            prop: 'code',
+            action: 'code',
+            label: '计划编号',
+            align: 'center',
+            width: 200
+          },
+          {
+            prop: 'materialCode',
+            label: '编号',
+            align: 'center',
+            width: 150
+          },
+          {
+            prop: 'materialName',
+            label: '物料名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'brandNo',
+            label: '牌号',
+            align: 'center'
+          },
+          {
+            prop: 'num',
+            label:
+              this.activeName === 'second'
+                ? '计划生产重量(KG)'
+                : '生产重量(KG)',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 150
+          },
+          ...(this.activeName === 'second'
+            ? [
+                {
+                  prop: 'producedWeight',
+                  label: '已生产重量(KG)',
+                  align: 'center',
+                  showOverflowTooltip: true,
+                  minWidth: 150
+                }
+              ]
+            : []),
+          // {
+          //   prop: 'produceVersionName',
+          //   label: '生产版本',
+          //   align: 'center',
+          //   showOverflowTooltip: true,
+          //   minWidth: 110
+          // },
+          // {
+          //   prop: 'executeUserName',
+          //   label: '工艺版本',
+          //   align: 'center',
+          //   showOverflowTooltip: true,
+          //   minWidth: 110
+          // },
+          {
+            prop: 'deliveryTime',
+            label: '要求交付日期',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          ...(this.activeName === 'second'
+            ? [
+                {
+                  prop: 'completeTime',
+                  label: '实际完成时间',
+                  align: 'center',
+                  showOverflowTooltip: true,
+                  minWidth: 110
+                }
+              ]
+            : []),
+          {
+            columnKey: 'status',
+            label: '状态',
+            align: 'center',
+            slot: 'status',
+            action: 'status'
+          },
+          {
+            prop: 'createUserName',
+            label: '创建人',
+            align: 'center'
+          },
+          {
+            prop: 'createTime',
+            label: '创建时间',
+            align: 'center',
+            width: 160
+          },
+          ...(this.activeName === 'second'
+            ? [
+                {
+                  prop: 'releaseTime',
+                  label: '发布时间',
+                  align: 'center'
+                }
+              ]
+            : []),
+          ...(this.activeName === 'first'
+            ? [
+                {
+                  columnKey: 'action',
+                  label: '操作',
+                  width: 250,
+                  align: 'center',
+                  resizable: false,
+                  fixed: 'right',
+                  slot: 'action'
+                }
+              ]
+            : [])
+        ];
+      }
+    },
+    methods: {
+      statusFormatter(status) {
+        const obj = this.statusOpt[this.activeName].find(
+          (i) => i.value == status
+        );
+
+        return obj && obj.label;
+      },
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return getList({
+          pageNum: page,
+          size: limit,
+          ...where
+        });
+      },
+      handleEdit(type, row) {
+        this.$refs.planEditDialogRef.open(type, row);
+      },
+      handleDel({ id }) {
+        this.$confirm('确认删除当前数据!', '提示').then(async () => {
+          await del([id]);
+          this.$message.success('删除成功!');
+          this.reload();
+        });
+      },
+      // 发布工单
+      handleOrderPublish(type, row) {
+        this.$router.push({
+          path: '/materialPlan/workOrderPublish',
+          query: {
+            type,
+            id: row.id
+          }
+        });
+      },
+      handleTabChange() {
+        this.$refs.searchRef.reset();
+      },
+
+      /* 刷新表格 */
+      reload(where = {}) {
+        where.statusList = this.statusOpt[this.activeName][0].value.split(',');
+        this.$nextTick(() => {
+          this.$refs.table.reload({ page: 1, where });
+        });
+      },
+
+      goDetail({ id }) {
+        this.$router.push({
+          path: '/materialPlan/detail/' + id
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped></style>

+ 230 - 0
src/views/materialPlan copy/workOrderPublish.vue

@@ -0,0 +1,230 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <div class="page-title">
+        <el-page-header @back="back" content="发布工单"> </el-page-header>
+      </div>
+
+      <el-descriptions title="" :column="6" border class="mb-20">
+        <el-descriptions-item label="计划编号">{{
+          infoData.code
+        }}</el-descriptions-item>
+        <el-descriptions-item label="物料名称">{{
+          infoData.materialName
+        }}</el-descriptions-item>
+        <el-descriptions-item label="物料编码">{{
+          infoData.materialCode
+        }}</el-descriptions-item>
+        <el-descriptions-item label="牌号">{{
+          infoData.brandNo
+        }}</el-descriptions-item>
+        <el-descriptions-item label="型号">{{
+          infoData.model
+        }}</el-descriptions-item>
+        <el-descriptions-item label="生产版本">{{
+          infoData.produceVersionName
+        }}</el-descriptions-item>
+        <el-descriptions-item label="工艺路线名称">{{
+          infoData.routingName
+        }}</el-descriptions-item>
+        <el-descriptions-item label="工艺路线版本">{{
+          infoData.routingVersion
+        }}</el-descriptions-item>
+        <el-descriptions-item label="生产重量">{{
+          infoData.num
+        }}</el-descriptions-item>
+        <el-descriptions-item label="要求交付日期">{{
+          infoData.deliveryTime
+        }}</el-descriptions-item>
+        <el-descriptions-item label="创建时间">{{
+          infoData.createTime
+        }}</el-descriptions-item>
+      </el-descriptions>
+
+      <!-- <div class="rules-box">
+        <div class="rule-label">工单生成规则</div>
+        <div class="rule-wrapper">
+          <div class="content">
+            <div class="select-box" v-for="(item, index) in rules" :key="index">
+              <el-radio-group v-model="item.value" v-if="item.type === 'radio'">
+                <el-radio
+                  v-for="(itm, idx) in item.list"
+                  :key="idx"
+                  :label="itm.label"
+                ></el-radio>
+              </el-radio-group>
+              <el-checkbox-group v-model="item.value" v-else>
+                <el-checkbox
+                  v-for="(itm, idx) in item.list"
+                  :key="idx"
+                  :label="itm.label"
+                  :disabled="
+                    itm.lastDisabled
+                      ? item.value.length < item.list.length - 1
+                      : false
+                  "
+                ></el-checkbox>
+              </el-checkbox-group>
+            </div>
+          </div>
+          <div class="btn-box">
+            <el-tooltip
+              placement="top-start"
+              title="标题"
+              width="200"
+              trigger="hover"
+              content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。"
+            >
+              <el-button type="text" icon="el-icon-question"></el-button>
+            </el-tooltip>
+            <el-button type="primary" plain>一键生成方案</el-button>
+          </div>
+        </div>
+      </div> -->
+      <planView key="first" :infoData="infoData" :orderList="orderList" />
+      <!-- <el-tabs v-model="activeName" type="card">
+        <el-tab-pane label="默认" name="first"
+          ><planView key="first" :infoData="infoData"
+        /></el-tab-pane>
+        <el-tab-pane
+          v-for="(item, index) in planList"
+          :label="item.label"
+          :name="index"
+          ><planView :key="index" :infoData="infoData"
+        /></el-tab-pane>
+      </el-tabs> -->
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import planView from './components/plan-view';
+  import { getById, getReleaseInfoById } from '@/api/materialPlan/index';
+  import { getRouteTabKey, removePageTab } from '@/utils/page-tab-util';
+  export default {
+    components: { planView },
+    data () {
+      return {
+        activeName: 'first',
+        planList: [],
+        rules: [
+          {
+            type: 'radio',
+            value: '',
+            list: [
+              { label: '多设备优先', value: 0 },
+              { label: '多班次优先', value: 1 }
+            ]
+          },
+          {
+            type: 'checked',
+            value: [],
+
+            list: [
+              { label: '设备产能优先', value: 0 },
+              { label: '最早开始时间优先', value: 1 },
+              { label: '开始时间优先', value: 2, lastDisabled: true }
+            ]
+          },
+          {
+            type: 'checked',
+            value: [],
+            list: [
+              { label: '非空闲设备可用', value: 0 },
+              { label: '检修设备可用', value: 1 },
+              { label: '检修设备优先', value: 1, lastDisabled: true }
+            ]
+          },
+          {
+            type: 'radio',
+            value: '',
+            list: [{ label: '末单均衡', value: 0 }]
+          }
+        ],
+        infoData: {},
+        orderList: [],
+        planType: ['', '内销计划', '外销计划', '预制计划'],
+        id: null
+      };
+    },
+    methods: {
+      back () {
+        const key = getRouteTabKey();
+        if (this.type == 2) {
+          this.$router.push('/materialPlan');
+          removePageTab({ key });
+          return;
+        }
+        this.$confirm('返回后将清空所有方案,是否要继续?', '提示').then(() => {
+          this.$router.push('/materialPlan');
+
+          removePageTab({ key });
+        });
+      },
+      async getInfo () {
+        const data = await getById(this.id);
+
+        this.infoData = data;
+      },
+      async getReleaseInfoById () {
+        const data = await getReleaseInfoById(this.id);
+
+        this.infoData = data.productionPlan;
+
+        this.orderList = data.workOrderList;
+      }
+    },
+    created () {
+      const { query = {} } = this.$route;
+
+      this.type = query.type;
+      this.id = query.id;
+      if (query.type == 2) {
+        this.getReleaseInfoById();
+      } else {
+        this.getInfo();
+      }
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .rules-box {
+    padding: 20px 0;
+    display: flex;
+    justify-content: space-between;
+    .rule-label {
+      font-size: 18px;
+      font-weight: bold;
+    }
+    .rule-wrapper {
+      flex: 1;
+      display: flex;
+      justify-content: space-between;
+      align-items: flex-start;
+
+      .content {
+        flex: 1;
+        display: flex;
+        flex-wrap: wrap;
+        align-items: center;
+        padding: 0 10px;
+
+        .select-box {
+          border: 1px solid #ccc;
+          padding: 5px 10px;
+          margin: 0 10px 10px 0;
+        }
+      }
+
+      .btn-box {
+        display: flex;
+        justify-content: space-between;
+        width: 160px;
+      }
+    }
+  }
+
+  .mb-20 {
+    margin-bottom: 20px;
+  }
+</style>

+ 149 - 204
src/views/materialPlan/components/plan-edit-dialog.vue

@@ -1,232 +1,177 @@
 <template>
-  <ele-modal
-    :visible.sync="visible"
-    :closed="cancel"
-    :title="`${type == 'add' ? '创建' : '编辑'}配料计划`"
-    custom-class="ele-dialog-form"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-  >
-    <el-form
-      :model="formData"
-      ref="formRef"
-      label-width="120px"
-      class="ele-body"
-      :rules="rules"
-    >
+  <ele-modal :visible.sync="visible" :closed="cancel" :title="`${type == 'add' ? '创建' : '编辑'}采购配料计划`"
+    custom-class="ele-dialog-form" :close-on-click-modal="false" :close-on-press-escape="false" width="80%">
+    <el-form :model="formData" ref="formRef" label-width="120px" class="ele-body" :rules="rules">
       <el-row :gutter="32">
         <el-col :span="12">
-          <el-form-item label="选择物料" prop="materialName">
-            <el-input
-              placeholder="请选择"
-              :value="
-                formData.materialName &&
-                `${formData.materialName}(${formData.materialCode})`
-              "
-              @click.native="chooseMateriel"
-            ></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="生产版本" prop="produceVersionName">
-            <el-input
-              :disabled="!formData.materialName"
-              :placeholder="!formData.materialName ? '请选择物料' : '请选择'"
-              v-model="formData.produceVersionName"
-              @click.native="chooseVersion"
-            ></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="牌号" prop="brandNo">
-            <el-input v-model="formData.brandNo" disabled></el-input>
-          </el-form-item>
-        </el-col>
-        <!-- <el-col :span="12">
-          <el-form-item label="工艺路线名称" prop="brandNo">
-            <el-input v-model="formData.aaa"></el-input>
-          </el-form-item>
-        </el-col> -->
-        <el-col :span="12">
-          <el-form-item label="要求交付日期" prop="deliveryTime">
-            <el-date-picker
-              style="width: 100%"
-              v-model="formData.deliveryTime"
-              :pickerOptions="{
-                disabledDate: (time) =>
-                  time.getTime() <
-                  new Date(new Date().setHours(0, 0, 0, 0)).getTime()
-              }"
-              type="date"
-              placeholder="选择日期"
-              value-format="yyyy-MM-dd"
-            >
-            </el-date-picker>
-          </el-form-item>
-        </el-col>
-        <!-- <el-col :span="12">
-          <el-form-item label="工艺路线版本" prop="brandNo">
-            <el-input v-model="formData.aaa"></el-input>
-          </el-form-item>
-        </el-col> -->
-        <el-col :span="12">
-          <el-form-item label="生产重量" prop="num">
-            <!-- <el-input v-model.number="formData.num">
-              
-            </el-input> -->
-            <el-row>
-              <el-col :span="21">
-                <el-input-number
-                  placeholder="请输入"
-                  class="w100"
-                  v-model="formData.num"
-                  :controls="false"
-                  :precision="3"
-                  :min="0"
-                ></el-input-number>
-              </el-col>
-              <el-col :span="3" style="text-align: center">
-                {{ formData.unit || 'kg' }}
-              </el-col>
-            </el-row>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="计划备注" prop="notes">
-            <el-input v-model="formData.notes" placeholder="请选择"></el-input>
+          <el-form-item label="配料计划名称" prop="materialName">
+            <el-input placeholder="请选择" v-model="formData.materialName"></el-input>
           </el-form-item>
         </el-col>
+
+
+
+
+
       </el-row>
     </el-form>
 
+    <el-form :model="formData" ref="tableForm" >
+
+      <ele-pro-table ref="table" :needPage="false" :columns="columns"  row-key="id">
+
+
+        <template v-slot:toolbar>
+          <el-button size="small" type="primary" icon="el-icon-plus" class="ele-btn-icon" @click="showAdd">
+            添加销售订单
+          </el-button>
+        </template>
+
+
+
+
+          <template v-slot:code="{ row }">
+              <el-input placeholder="请输入" readonly v-model="row.code"></el-input>
+          </template>
+
+
+
+      </ele-pro-table>
+
+    </el-form>
+
     <div slot="footer">
       <el-button @click="cancel">取消</el-button>
       <el-button type="primary" @click="confirm">确定</el-button>
     </div>
 
+
+    <saleOrderPop ref="saleOrderRef"></saleOrderPop>
+
     <!-- 选择物料 -->
-    <ChooseMaterial
-      ref="chooseRef"
-      @success="handleChooseMaterial"
-    ></ChooseMaterial>
-    <!-- 选择生产版本 -->
-    <ProductionVersion
-      ref="versionRef"
-      :productCode="formData.materialCode"
-      @confirm="versionConfirm"
-    ></ProductionVersion>
+    <ChooseMaterial ref="chooseRef" @success="handleChooseMaterial"></ChooseMaterial>
+
   </ele-modal>
 </template>
 
 <script>
-  import ChooseMaterial from '@/components/CreatePlan/ChooseMaterial.vue';
-  import ProductionVersion from '@/components/CreatePlan/ProductionVersion.vue';
-  import { save, update } from '@/api/materialPlan/index';
-  import dayjs from 'dayjs';
-  export default {
-    components: {
-      ChooseMaterial,
-      ProductionVersion
-    },
-    data () {
-      return {
-        visible: false,
-        type: 'add',
-        rules: {
-          materialName: [
-            {
-              required: true,
-              message: '请选择物料',
-              trigger: ['blur', 'change']
-            }
-          ],
-          produceVersionName: [
-            {
-              required: true,
-              message: '请选择生产版本',
-              trigger: ['blur', 'change']
-            }
-          ],
-          deliveryTime: [
-            {
-              required: true,
-              message: '请选择要求交付日期',
-              trigger: ['blur', 'change']
-            }
-          ],
-          num: [
-            {
-              required: true,
-              message: '请输入生产重量',
-              trigger: ['blur', 'change']
-            }
-          ]
+
+import saleOrderPop from './saleOrderPop.vue'
+
+import ChooseMaterial from '@/components/CreatePlan/ChooseMaterial.vue';
+
+
+
+export default {
+  components: {
+    saleOrderPop,
+    ChooseMaterial,
+
+
+  },
+  data() {
+
+    return {
+      visible: false,
+      type: 'add',
+
+      tableData: [],
+
+
+      // 表格列配置
+      columns: [
+
+
+        {
+          prop: 'code',
+          label: '销售订单号',
+          slot: 'code',
+          showOverflowTooltip: true,
+          align: 'center',
+          minWidth: 110
         },
-        formData: {
-          deliveryTime: dayjs(new Date()).format('YYYY-MM-DD'),
-          num: null,
-          notes: '',
-          categoryId: '',
-          unit: '',
-          brandNo: '',
-          model: '',
-          produceVersionName: '',
-          materialCode: '',
-          materialName: ''
+
+
+
+
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 260,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          showOverflowTooltip: true
         }
-      };
-    },
-    methods: {
-      async open (type, row = {}) {
-        this.type = type;
-        this.formData = Object.assign({}, this.formData, row);
-        this.visible = true;
-      },
-      chooseMateriel () {
-        this.$refs.chooseRef.open(this.formData.categoryId);
-      },
-      handleChooseMaterial (row) {
-        this.formData = Object.assign({}, this.formData, {
-          materialName: row.name,
-          categoryId: row.id,
-          materialCode: row.code,
-          brandNo: row.brandNum,
-          model: row.modelType,
-          unit: row.measuringUnit
-        });
-      },
-      confirm () {
-        this.$refs.formRef.validate(async (value) => {
-          if (value) {
-            const request = this.type == 'add' ? save : update;
-
-            // if (this.type == 'add') {
-            //   this.formData.produceVersionId = '1684162877351866369';
-            //   this.formData.produceVersionName = '挤压合金生产';
-            // }
-            await request(this.formData);
-            this.$message.success('保存成功!');
-            this.$emit('success');
-            this.cancel();
+      ],
+      rules: {
+        materialName: [
+          {
+            required: true,
+            message: '请选择物料',
+            trigger: ['blur', 'change']
           }
-        });
-      },
-      cancel () {
-        this.visible = false;
-        this.formData = {};
-        this.$refs.formRef.resetFields();
+        ],
+
+
       },
-      versionConfirm (cur) {
-        this.formData.produceVersionId = cur.produceVersionId;
-        this.formData.produceVersionName = cur.produceVersionName;
+      formData: {
+        materialName: '',
+        positionList: []
       },
 
-      chooseVersion () {
-        if (!this.formData.materialName) {
-          return this.$message.error('请选择物料');
+ 
+    };
+  },
+  methods: {
+    async open(type, row = {}) {
+      this.type = type;
+      // this.formData = Object.assign({}, this.formData, row);
+      this.visible = true;
+    },
+
+
+    confirm() {
+      this.$refs.formRef.validate(async (value) => {
+        if (value) {
+          const request = this.type == 'add' ? save : update;
+
+
+          // await request(this.formData);
+          this.$message.success('保存成功!');
+          this.$emit('success');
+          this.cancel();
         }
-        this.$refs.versionRef.open(1);
+      });
+    },
+    cancel() {
+      this.visible = false;
+      this.formData = {};
+      this.$refs.formRef.resetFields();
+    },
+
+    datasource({  }) {
+      return []
+    },
+
+    reload() {
+      this.$refs.table.reload();
+    },
+
+    showAdd() {
+      this.tableData = this.$refs.table.getData();
+      this.$refs.saleOrderRef.open(this.tableData)
+    },
+
+    handleChooseMaterial() { },
+
+
+    chooseVersion() {
+      if (!this.formData.materialName) {
+        return this.$message.error('请选择物料');
       }
+
     }
-  };
+  }
+};
 </script>

+ 2 - 2
src/views/materialPlan/components/plan-view.vue

@@ -109,7 +109,7 @@
         </el-table-column>
         <el-table-column label="设备编码" prop="deviceCode"></el-table-column>
         <el-table-column label="设备名称" prop="deviceName" width="160">
-          <template v-slot="{ row, $index }">
+          <template v-slot="{ row}">
             <el-input
               :value="row.deviceName"
               @click.native="editOrder(row)"
@@ -122,7 +122,7 @@
           min-width="220px"
           show-overflow-tooltip
         >
-          <template v-slot="{ row, $index }">
+          <template v-slot="{ row }">
             <template v-if="row.executorName.length">
               <el-tag
                 type="success"

+ 78 - 0
src/views/materialPlan/components/saleOrder-search.vue

@@ -0,0 +1,78 @@
+<!-- 搜索表单 -->
+<template>
+    <el-form
+      label-width="120px"
+      class="ele-form-search"
+      @keyup.enter.native="search"
+      @submit.native.prevent
+    >
+      <el-row :gutter="24">
+
+        <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="销售订单号:">
+          <el-input v-model="where.code" placeholder="请输入"></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="物料编码:">
+          <el-input v-model="where.productCode" placeholder="请输入"></el-input>
+        </el-form-item>
+      </el-col>
+  
+
+  
+        <el-col v-bind="styleResponsive ? { sm: 4 } : { span: 4 }">
+          <div class="ele-form-actions">
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              class="ele-btn-icon"
+              @click="search"
+            >
+              查询
+            </el-button>
+            <el-button @click="reset">重置</el-button>
+          </div>
+        </el-col>
+      </el-row>
+    </el-form>
+  </template>
+  
+  <script>
+    export default {
+      data() {
+        // 默认表单数据
+        const defaultWhere = {
+            code: '',
+          productCode: '',
+          status: [1]
+    
+        };
+        return {
+          // 表单数据
+          where: { ...defaultWhere }
+        };
+      },
+      props: {
+
+      },
+      computed: {
+        // 是否开启响应式布局
+        styleResponsive() {
+          return this.$store.state.theme.styleResponsive;
+        }
+      },
+      methods: {
+        /* 搜索 */
+        search() {
+          this.$emit('search', this.where);
+        },
+        /*  重置 */
+        reset() {
+          this.where = { ...this.defaultWhere };
+          this.search();
+        }
+      }
+    };
+  </script>
+  

+ 185 - 0
src/views/materialPlan/components/saleOrderPop.vue

@@ -0,0 +1,185 @@
+<template>
+    <el-dialog :title="title" v-if="visible" :visible.sync="visible" :before-close="handleClose" :close-on-click-modal="false"
+        :close-on-press-escape="false" append-to-body width="70%">
+
+        <el-card shadow="never">
+            <saleOrderSearch @search="reload" />
+
+            <!-- 数据表格 -->
+            <ele-pro-table ref="table" :columns="columns" :datasource="datasource" :selection.sync="selection" row-key="id">
+
+
+            </ele-pro-table>
+
+
+        </el-card>
+
+        <div class="btns">
+            <el-button type="primary" size="small" @click="selected">选择</el-button>
+            <el-button size="small" @click="handleClose">关闭</el-button>
+        </div>
+    </el-dialog>
+</template>
+  
+<script>
+import saleOrderSearch from './saleOrder-search'
+import { getPageList } from '@/api/saleOrder';
+import dictMixins from '@/mixins/dictMixins';
+export default {
+    components: { saleOrderSearch },
+    mixins: [dictMixins],
+    data() {
+        return {
+            visible: false,
+            title: '销售订单',
+
+            // 表格列配置
+            columns: [
+                {
+                    columnKey: 'selection',
+                    type: 'selection',
+                    width: 45,
+                    align: 'center',
+                    selectable: (row, index) => {
+                        return !this.tableData.some((it) => it.id == row.id);
+                    },
+                    reserveSelection: true,
+                    fixed: 'left'
+                },
+                {
+                    prop: 'code',
+                    label: '销售订单号',
+                    align: 'center',
+                    showOverflowTooltip: true,
+                    minWidth: 150,
+                    slot: 'code'
+                },
+                {
+                    prop: 'lineNumber',
+                    label: '行号',
+                    align: 'center',
+                    showOverflowTooltip: true
+                },
+                {
+                    prop: 'productCode',
+                    label: '产品编码',
+                    align: 'center',
+                    showOverflowTooltip: true,
+                    minWidth: 140
+                },
+
+                {
+                    prop: 'productName',
+                    label: '产品名称',
+                    align: 'center',
+                    minWidth: 120
+                },
+                {
+                    prop: 'brandNo',
+                    label: '牌号',
+                    align: 'center'
+                },
+                {
+                    prop: 'model',
+                    label: '型号',
+                    align: 'center',
+                    minWidth: 120
+                },
+                {
+                    prop: 'productSumWeight',
+                    label: '合同重量',
+                    align: 'center'
+                },
+                {
+                    prop: 'contractNum',
+                    label: '合同数量',
+                    align: 'center'
+                },
+
+                {
+                    prop: 'status',
+                    label: '生产状态',
+                    align: 'center',
+                    showOverflowTooltip: true,
+                    formatter: (_row, _column, cellValue) => {
+                        return this.getDictValue('生产状态', _row.status);
+                    }
+                },
+
+
+            ],
+
+            // 表格选中数据
+            selection: [],
+
+            tableData: [],
+            current: null
+
+        }
+    },
+
+    watch: {
+
+    },
+    created() {
+        this.requestDict('生产状态');
+    },
+    methods: {
+
+        open(item) {
+            if (item) {
+                this.tableData = item
+            }
+
+
+            this.visible = true
+
+        },
+
+
+        /* 表格数据源 */
+        async datasource({ page, limit, where }) {
+            const data = await getPageList({
+                ...where,
+                pageNum: page,
+                size: limit
+            });
+
+            return data;
+        },
+
+        /* 刷新表格 */
+        reload(where) {
+            this.$refs.table.reload({ page: 1, where: where });
+        },
+
+
+
+
+
+
+        handleClose() {
+            this.visible = false
+            this.$refs.table.setSelectedRows([]);
+            this.selection = []
+
+        },
+        selected() {
+            if (!this.selection.length) {
+                this.$message.error('请至少选择一条数据');
+                return;
+            }
+            this.$emit('chooseModal', this.selection, this.current)
+            this.handleClose()
+        },
+    }
+}
+</script>
+  
+<style lang="scss" scoped>
+.btns {
+    text-align: center;
+    padding: 10px 0;
+}
+</style>
+  

+ 10 - 24
src/views/materialPlan/index.vue

@@ -10,8 +10,8 @@
       </materialPlan-search>
 
       <el-tabs v-model="activeName" type="card">
-        <el-tab-pane label="未发布" name="first"></el-tab-pane>
-        <el-tab-pane label="已发布" name="second"></el-tab-pane>
+        <el-tab-pane label="采购配料计划" name="first"></el-tab-pane>
+        <el-tab-pane label="生产配料计划" name="second"></el-tab-pane>
       </el-tabs>
       <!-- 数据表格 -->
       <ele-pro-table
@@ -28,9 +28,9 @@
           >
         </template>
         <template v-slot:code="{ row }">
-          <el-link type="primary" :underline="false" @click="goDetail(row)">
+        
             {{ row.code }}
-          </el-link>
+
         </template>
         <template v-slot:status="{ row }">
           <span :class="{ 'ele-text-danger': row.status == 3 }">
@@ -174,20 +174,7 @@
                 }
               ]
             : []),
-          // {
-          //   prop: 'produceVersionName',
-          //   label: '生产版本',
-          //   align: 'center',
-          //   showOverflowTooltip: true,
-          //   minWidth: 110
-          // },
-          // {
-          //   prop: 'executeUserName',
-          //   label: '工艺版本',
-          //   align: 'center',
-          //   showOverflowTooltip: true,
-          //   minWidth: 110
-          // },
+
           {
             prop: 'deliveryTime',
             label: '要求交付日期',
@@ -266,7 +253,10 @@
         });
       },
       handleEdit(type, row) {
-        this.$refs.planEditDialogRef.open(type, row);
+        if(this.activeName == 'first') {
+          this.$refs.planEditDialogRef.open(type, row);
+        }
+       
       },
       handleDel({ id }) {
         this.$confirm('确认删除当前数据!', '提示').then(async () => {
@@ -297,11 +287,7 @@
         });
       },
 
-      goDetail({ id }) {
-        this.$router.push({
-          path: '/materialPlan/detail/' + id
-        });
-      }
+ 
     }
   };
 </script>