dengrui пре 7 месеци
родитељ
комит
c45dbbfef5

+ 16 - 0
src/api/storage/index.ts

@@ -70,3 +70,19 @@ export function wmsOrderAdd(
   });
 }
 
+export function getSemi(id: any): AxiosPromise<any> {
+  return request({
+    url: `/api/v1/semiFinishedStock/get/${id}`,
+    method: "get",
+  });
+}
+
+export function oprerate(
+  queryParams: object
+): AxiosPromise<any> {
+  return request({
+    url: "/api/v1/semiFinishedStock/add",
+    method: "post",
+    data: queryParams,
+  });
+}

+ 121 - 0
src/views/plan/workOrder/components/work-order-seqNos-page.vue

@@ -0,0 +1,121 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+      @row-click="rowClick"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
+      @selection-change="handleSelectionChange"
+    >
+      <template #footer>
+        <div style="float: right; margin-top: 10px">
+          <el-button type="primary" @click="onSelected"> 确定 </el-button>
+        </div>
+      </template>
+    </avue-crud>
+  </div>
+</template>
+<script setup>
+import { defineProps, ref } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/plan/seq",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const emit = defineEmits(["orderInfo"]);
+const onSelected = () => {
+  const array = ref([]);
+  selectedRows.value.forEach((item) => {
+    array.value.push(item.seqNo);
+  });
+  emit("orderInfo", array.value);
+};
+
+const props = defineProps({
+  workOrderCode: {
+    type: String,
+  },
+});
+const selectedRows = ref([]);
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  selection: true,
+  searchBtn: false,
+  addBtn: false,
+  menu: false,
+  deleteBtn: false,
+  column: [
+    {
+      label: "工单编号",
+      prop: "workOrderCode",
+      display: false,
+      overHidden: true,
+    },
+    {
+      label: "订单编号",
+      prop: "orderCode",
+      overHidden: true,
+    },
+    {
+      label: "流转卡号",
+      prop: "seqNo",
+      disabled: true,
+      overHidden: true,
+    },
+    // {
+    //   label: "状态",
+    //   prop: "workOrderState",
+    //   width: "80",
+    //   display: false,
+    //   type: "select", //类型为下拉选择框
+    //   dicUrl:
+    //     dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_work_order_state,
+    //   props: {
+    //     label: "dictLabel",
+    //     value: "dictValue",
+    //   },
+    // },
+    {
+      label: "创建时间",
+      prop: "created",
+      width: 180,
+      overHidden: true,
+      display: false,
+    },
+  ],
+});
+
+onMounted(() => {
+  search.value.workOrderCode = props.workOrderCode;
+  dataList();
+});
+watch(
+  () => props.workOrderCode,
+  () => {
+    search.value.workOrderCode = props.workOrderCode;
+    dataList();
+  }
+);
+</script>

+ 100 - 0
src/views/storage/semi/components/details.vue

@@ -0,0 +1,100 @@
+<template>
+  <div class="mainContentBox">
+    <el-table id="table" border :data="tableData">
+      <el-table-column prop="workOrderSeqNo" label="流转卡号" />
+      <!-- <el-table-column prop="checkStr" width="60" label="上限值">
+        <template #default="{ row }">
+          <span>{{
+            row.up ? dictS.getLableByValue("outsource_state", row.up) : "-"
+          }}</span>
+        </template>
+      </el-table-column> -->
+      <el-table-column prop="created" label="创建时间" />
+      <!-- <el-table-column label="操作" width="60">
+        <template #default="{ row }">
+          <el-button
+            link
+            type="primary"
+            size="small"
+            @click="deleteSettings(row.id)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column> -->
+    </el-table>
+    <el-form
+      style="margin-top: 10px"
+      :model="formData"
+      ref="ruleFormRef"
+      label-width="100px"
+    >
+      <el-form-item
+        label="流转卡号"
+        prop="workOrderSeqNos"
+        :rules="[
+          {
+            required: true,
+            trigger: 'blur',
+          },
+        ]"
+      >
+        <el-select v-model="formData.workOrderSeqNos" multiple>
+          <el-option
+            v-for="item in tableData"
+            :key="item"
+            :label="item.workOrderSeqNo"
+            :value="item.workOrderSeqNo"
+          />
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <el-button type="primary" @click="submit">出库</el-button>
+  </div>
+</template>
+<script setup>
+import { getSemi, oprerate } from "@/api/storage/index";
+import { useDictionaryStore } from "@/store";
+const { dicts } = useDictionaryStore();
+const emits = defineEmits(["close"]);
+const ruleFormRef = ref(null);
+const formData = ref({
+  stockId: "",
+  stockType: "2",
+  workOrderSeqNos: [],
+});
+const props = defineProps({
+  id: {
+    type: String,
+  },
+});
+const detailsData = ref();
+const tableData = ref([]);
+const getData = async () => {
+  const { data } = await getSemi(props.id);
+  detailsData.value = data;
+  tableData.value = detailsData.value.detailsList;
+};
+const submit = async () => {
+  await ruleFormRef.value.validate(async (valid, fields) => {
+    if (valid) {
+      const { code } = await oprerate({ ...formData.value, stockId: props.id });
+      if (code == "200") {
+        ElMessage.success("出库成功!");
+        ruleFormRef.value.resetFields();
+        getData();
+        emits("close");
+      }
+    } else {
+    }
+  });
+};
+onMounted(() => {
+  getData();
+});
+watch(
+  () => props.id,
+  () => {
+    getData();
+  }
+);
+</script>

+ 372 - 0
src/views/storage/semi/index.vue

@@ -0,0 +1,372 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+      @row-save="createRow"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
+      :row-style="rowStyle"
+      :cell-style="cellStyle"
+      @selection-change="selectionChange"
+    >
+      <template #menu="{ size, row, index }">
+        <el-button
+          icon="el-icon-info"
+          text
+          @click="openDialog(row.id)"
+          type="primary"
+          :size="size"
+        >
+          详情</el-button
+        >
+      </template>
+    </avue-crud>
+    <el-dialog
+      v-model="dialog1.visible"
+      :title="dialog1.title"
+      width="950px"
+      @close="dialog1.visible = false"
+    >
+      <work-order-page @order-info="materialInfo1" />
+    </el-dialog>
+    <el-dialog
+      v-model="dialog2.visible"
+      :title="dialog2.title"
+      width="950px"
+      @close="dialog2.visible = false"
+    >
+      <work-order-seqNos-page
+        :workOrderCode="form.workOrderCode"
+        @order-info="materialInfo2"
+      />
+    </el-dialog>
+    <el-dialog
+      v-model="dialog3.visible"
+      :title="dialog3.title"
+      width="950px"
+      @close="dialog3.visible = false"
+    >
+      <Details
+        :id="selectId"
+        @close="
+          dialog3.visible = false;
+          dataList();
+        "
+      />
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import { useDictionaryStore } from "@/store";
+import Details from "./components/details.vue";
+const { dicts } = useDictionaryStore();
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/semiFinishedStock",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const openDialog = (id) => {
+  selectId.value = id;
+  dialog3.visible = true;
+};
+const dialog1 = reactive({
+  title: "工单号选择",
+  visible: false,
+});
+const dialog2 = reactive({
+  title: "流转卡号选择",
+  visible: false,
+});
+const dialog3 = reactive({
+  title: "详情",
+  visible: false,
+});
+const selectId = ref(null);
+const materialInfo1 = (value) => {
+  form.value.workOrderCode = value.workOrderCode;
+  form.value.workOrderCodeId = value.id;
+  form.value.stockType = "1";
+  form.value.workOrderSeqNos = [];
+  dialog1.visible = false;
+};
+const materialInfo2 = (value) => {
+  form.value.workOrderSeqNos = value;
+  dialog2.visible = false;
+};
+const seqDisabled = computed(() => {
+  return !form.value.workOrderCodeId;
+});
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: true,
+  labelWidth: 100,
+  editBtn: false,
+  viewBtn: false,
+  column: [
+    {
+      label: "产品编码",
+      prop: "materialCode",
+      editDisabled: true,
+      addDisplay: false,
+      rules: [
+        {
+          required: true,
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "工艺路线名称",
+      prop: "processRouteName",
+      editDisabled: true,
+      addDisplay: false,
+      rules: [
+        {
+          required: true,
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "库存数量",
+      prop: "stockNum",
+      editDisabled: true,
+      addDisplay: false,
+      rules: [
+        {
+          required: true,
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "出入库类型",
+      prop: "stockType",
+      editDisabled: true,
+      addDisplay: false,
+      rules: [
+        {
+          required: true,
+          trigger: "trigger",
+        },
+      ],
+      type: "select",
+      dicData: [
+        {
+          label: "入库",
+          value: "1",
+        },
+        {
+          label: "出库",
+          value: "2",
+        },
+      ],
+    },
+    {
+      label: "出库/入库数量",
+      prop: "operateNum",
+      addDisplay: false,
+      editDisabled: true,
+      rules: [
+        {
+          required: true,
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "工单编号",
+      prop: "workOrderCode",
+      editDisabled: true,
+      addDisplay: true,
+      rules: [
+        {
+          required: true,
+          trigger: "trigger",
+        },
+      ],
+      click: ({ value, column }) => {
+        if (column.boxType) {
+          dialog1.visible = true;
+        }
+      },
+      change: ({ value, column }) => {
+        if (value != form.value.materialCode) {
+          dialog1.visible = true;
+        }
+      },
+    },
+    {
+      label: "流转卡号",
+      prop: "workOrderSeqNos",
+      editDisabled: true,
+      hide: true,
+      disabled: seqDisabled,
+      addDisplay: true,
+      filterable: true,
+      rules: [
+        {
+          required: true,
+          trigger: "trigger",
+        },
+      ],
+      click: ({ value, column }) => {
+        if (column.boxType && dialog1.visible == false) {
+          dialog2.visible = true;
+        }
+      },
+      change: ({ value, column }) => {
+        if (value != form.value.workOrderCode && dialog1.visible == false) {
+          dialog2.visible = true;
+        }
+      },
+    },
+    {
+      label: "单位",
+      prop: "unit",
+      addDisplay: true,
+      filterable: true,
+      type: "select",
+      dataType: "string",
+      rules: [
+        {
+          required: true,
+          trigger: "trigger",
+        },
+      ],
+      dicData: dicts.danwei_type,
+      props: { label: "dictLabel", value: "dictValue" },
+    },
+
+    // {
+    //   label: "物料类型",
+    //   prop: "taskNo",
+    //   type: "select",
+    //   search: true,
+    //   width: 90,
+    //   overHidden: true,
+    //   dicUrl: dictDataUtil.request_url + "stock_material_type",
+    //   props: {
+    //     label: "dictLabel",
+    //     value: "dictValue",
+    //   },
+    //   rules: [
+    //     {
+    //       required: true,
+    //       message: "物料类型不能为空",
+    //       trigger: "trigger",
+    //     },
+    //   ],
+    // },
+    // {
+    //   label: "料箱编号",
+    //   prop: "vehicleCode",
+    //   editDisabled: true,
+    //   rules: [
+    //     {
+    //       required: true,
+    //       message: "料箱编号不能为空",
+    //       trigger: "trigger",
+    //     },
+    //   ],
+    // },
+    // {
+    //   label: "仓库坐标",
+    //   prop: "locationNo",
+    //   editDisabled: true,
+    //   rules: [
+    //     {
+    //       required: true,
+    //       message: "仓库位置不能为空",
+    //       trigger: "trigger",
+    //     },
+    //   ],
+    // },
+    // {
+    //   label: "二维码",
+    //   width: 120,
+    //   overHidden: true,
+    //   prop: "batchCode",
+    //   search: true,
+    // },
+
+    // {
+    //   label: "物料名称",
+    //   prop: "materialName",
+    //   width: 130,
+    //   overHidden: true,
+    //   click: ({ value, column }) => {
+    //     if (column.boxType) {
+    //       dialog1.visible = true;
+    //     }
+    //   },
+
+    // },
+    // {
+    //   label: "数量",
+    //   prop: "num",
+    //   type: "number",
+    //   min: 0,
+    //   max: 99999,
+    //   width: 150,
+    //   overHidden: true,
+    //   formatter: (val, value, label) => {
+    //     if (val.warningMsg) {
+    //       return val.num + "(" + val.warningMsg + ")";
+    //     } else {
+    //       return val.num;
+    //     }
+    //   },
+    // },
+  ],
+});
+const rowStyle = ({ row, column, rowIndex }) => {
+  if (row.warningMsg) {
+    return {
+      backgroundColor: "#f3d2d2",
+      color: "#6c6a6a",
+    };
+  }
+};
+const cellStyle = ({ row, column, rowIndex, columnIndex }) => {
+  if (columnIndex === 10) {
+    if (row.warningMsg) {
+      return {
+        color: "red",
+        fontWeight: "bold",
+        fontSize: "20",
+      };
+    } else {
+      return {
+        color: "#60fc56",
+        fontWeight: "bold",
+        fontSize: "20",
+      };
+    }
+  }
+};
+onMounted(() => {
+  dataList();
+});
+</script>