Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/qingban' into qingban

jxq 2 týždňov pred
rodič
commit
c0dd1b197b

+ 10 - 0
src/api/order/index.ts

@@ -142,6 +142,8 @@ export function exportDataInfo(type,id) {
   });
 }
 
+
+
 /**
  * 导入
  *
@@ -165,6 +167,14 @@ export function apsWorkOrder(params: any) {
     data: params,
   });
 }
+
+export function scrapWorkOrder(params: any) {
+  return request({
+    url: "/api/v1/process/info/scrap",
+    method: "post",
+    data: params,
+  });
+}
 export function distributeWorkOrder(workOrderId: any) {
   return request({
     url: "/api/v1/plan/aps/distribute/" + workOrderId,

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

@@ -86,3 +86,14 @@ export function oprerate(
     data: queryParams,
   });
 }
+
+
+export function outInv(
+  queryParams: object
+): AxiosPromise<any> {
+  return request({
+    url: "/api/v1/semiFinishedStock/out",
+    method: "post",
+    data: queryParams,
+  });
+}

+ 1 - 0
src/common/configs/buttonPermission.ts

@@ -62,6 +62,7 @@ const ButtonPermKeys = {
       work_order_lock: "plan:workOrder:lock",
       work_order_data: "plan:workOrder:data",
       work_order_downLoad: "plan:workOrder:downLoad",
+      work_order_scrap: "plan:workOrder:scrap",
       filtersheet_del: "plan:filtersheet:del",
       plan_task_batchUpdate: "plan:task:batchUpdate",
     },

+ 1 - 0
src/components/PDFView/index.vue

@@ -34,6 +34,7 @@
         cMapPacked: true,
       }"
       :page="showPdfNumber"
+      @rendered="rendered"
       annotation-layer
       text-layer
     />

+ 3 - 2
src/views/base/craftManagement/route/bindProcess.vue

@@ -280,7 +280,7 @@ import GroupProcess from "./components/groupProcess.vue";
 import GroupSort from "./components/groupSort.vue";
 
 defineOptions({
-  name: "bindProcess/:id/:prodtCode",
+  name: "bindProcess/:id/:prodtCode/:usable",
 });
 
 const styleStatus = ref(false);
@@ -371,7 +371,8 @@ const startGroup = () => {
   GroupProcessRef.value &&
     GroupProcessRef.value.startGroup(
       flowData.nodes,
-      route.fullPath.split("/")[4]
+      route.fullPath.split("/")[4],
+      route.fullPath.split("/")[6]
     );
 };
 const groupFinish = () => {

+ 7 - 2
src/views/base/craftManagement/route/components/groupProcess.vue

@@ -34,7 +34,9 @@ function confirmClick() {
   });
 }
 
-const startGroup = async (nodes: any[], routeId: string) => {
+const stateUsable = ref(null);
+const startGroup = async (nodes: any[], routeId: string, usable: any) => {
+  stateUsable.value = usable;
   nodesData.value = markRaw(nodes);
   if(nodesData.value){
     try{
@@ -62,6 +64,7 @@ defineExpose({
 });
 
 import type { CheckboxValueType } from "element-plus";
+import {number} from "echarts";
 
 const checkAll = ref(false);
 const indeterminate = ref(false);
@@ -144,13 +147,15 @@ const changeChecked = (key: string) => {
       <div v-for="key in new Map(Object.entries(groupData)).keys()" :key="key">
         <div class="name-container">
           <div class="group-name">{{ key }}</div>
-          <el-button link type="danger" @click="() => delete groupData[key]"
+          <el-button v-if="stateUsable === '0' || stateUsable === 'null'" link type="danger"
+                     @click="() => delete groupData[key]"
             >删除</el-button
           >
         </div>
 
         <el-select
           v-model="groupData[key]"
+          :disabled="stateUsable === '1'"
           multiple
           clearable
           filterable

+ 2 - 2
src/views/base/craftManagement/route/index.vue

@@ -565,7 +565,7 @@ const bindProcess = (row) => {
 const bindProcessPop = (row) => {
   if (row.routeData) {
     router.push({
-      path: `/base/craftManagement/bindProcess/${row.id}/${row.prodtCode}`,
+      path: `/base/craftManagement/bindProcess/${row.id}/${row.prodtCode}/${row.usable}`,
     });
     return;
   }
@@ -574,7 +574,7 @@ const bindProcessPop = (row) => {
     console.log(tableData.value);
     if (!tableData.value || tableData.value.length == 0) {
       router.push({
-        path: `/base/craftManagement/bindProcess/${row.id}/${row.prodtCode}`,
+        path: `/base/craftManagement/bindProcess/${row.id}/${row.prodtCode}/${row.usable}`,
       });
       return;
     }

+ 1 - 1
src/views/base/craftManagement/routeCommon/index.vue

@@ -274,7 +274,7 @@ const router = useRouter();
 // 绑定工序
 const bindProcess = (row) => {
   router.push({
-    path: `/base/craftManagement/bindProcess/${row.id}/null`,
+    path: `/base/craftManagement/bindProcess/${row.id}/null/null`,
   });
 };
 

+ 35 - 7
src/views/plan/workOrder/index.vue

@@ -161,6 +161,17 @@
           >生产数据包</el-button
         >
 
+          <el-button
+                  icon="el-icon-setting"
+                  text
+                  @click="scrap(row.id)"
+                  type="primary"
+                  v-if="row.workOrderState === '4'"
+                  :size="size"
+                  v-hasPerm="[buttonPermission.PLAN.BTNS.work_order_scrap]"
+          >报废</el-button
+          >
+
         <!--        <el-button
           icon="el-icon-notebook"
           text
@@ -334,13 +345,13 @@ import { useCrud } from "@/hooks/userCrud";
 import buttonPermission from "@/common/configs/buttonPermission";
 import ExcelShowingSGD from "./components/ExcelShowingSGD.vue";
 import {
-  apsWorkOrder,
-  distributeWorkOrder,
-  revokeWorkOrder,
-  lockWorkOrder,
-  exportOrder,
-  excelWorkOrder,
-  workOrderGroupStr,
+    apsWorkOrder,
+    distributeWorkOrder,
+    revokeWorkOrder,
+    lockWorkOrder,
+    exportOrder,
+    excelWorkOrder,
+    workOrderGroupStr, scrapWorkOrder,
 } from "@/api/order";
 import { useCommonStoreHook } from "@/store";
 import dictDataUtil from "@/common/configs/dictDataUtil";
@@ -355,6 +366,7 @@ import { exportDataInfo } from "@/api/order";
 import { getJobInfo, getWorkshopData } from "@/api/report";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
 import { updateWorkOrderInfo } from "@/api/plan";
+import {ElMessageBox} from "element-plus";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
 const updateTitle = ref("生产随工单");
 const workshopName = ref("");
@@ -373,6 +385,22 @@ const showProExcel = async (id) => {
   }
 };
 
+const scrap =(val)=>{
+  ElMessageBox.confirm("报废后所有操作不可回退, 是否确认报废?", "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning",
+  }).then(async () => {
+    scrapWorkOrder({workOrderId:val}).then(
+        (res)=>{
+            if(res.code==='200'){
+                ElMessage.success("操作成功");
+                dataList();
+            }
+        }
+    )
+  });
+}
 const exportDataZip = async (id) => {
   exportDataInfo(1, id).then((response) => {
     console.log(response);

+ 6 - 6
src/views/pro/traceability/components/testData.vue

@@ -42,7 +42,7 @@
     <el-pagination
       background
       :page-size="20"
-      :pager-count="8"
+      :pager-count="5"
       layout="->,prev, pager, next"
       :total="pageTotal"
       @current-change="handlePageChange"
@@ -167,11 +167,11 @@ const dialogVisible = ref(false);
 const tableData = ref([]);
 const lookData = (row) => {
   selectRow.value = row;
-  if (row.testData && "[]" !== row.testData) {
-    tableData.value = JSON.parse(row.testData);
-    dialogVisible.value = true;
-    return;
-  }
+  // if (row.testData && "[]" !== row.testData) {
+  //   tableData.value = JSON.parse(row.testData);
+  //   dialogVisible.value = true;
+  //   return;
+  // }
   testData(row.processId, row.deviceNo, currentPage.value.toString()).then(
     (res) => {
       if (res.code === "200") {

+ 23 - 0
src/views/storage/scrapped/index.vue

@@ -50,6 +50,12 @@
         </el-button>
       </template> -->
     </avue-crud>
+    <CommonTable
+      ref="ctableRef"
+      tableTitle="添加产品"
+      tableType="MARTERIAL"
+      @selected-sure="onSelectedFinish"
+    />
     <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
   </div>
 </template>
@@ -149,12 +155,17 @@ option.value = Object.assign(option.value, {
           trigger: "blur",
         },
       ],
+      click: () => {
+        startChooseProduct();
+      },
     },
     {
       label: "物料编码",
       prop: "materialCode",
       span: 12,
       search: true,
+      editDisabled: true,
+      addDisabled: true,
       rules: [
         {
           required: false,
@@ -173,4 +184,16 @@ option.value = Object.assign(option.value, {
     },
   ],
 });
+
+// 选择产品相关
+const ctableRef = ref(null);
+const startChooseProduct = () => {
+  if (ctableRef.value) {
+    ctableRef.value.startSelect();
+  }
+};
+const onSelectedFinish = (selectedValue) => {
+  form.value.materialName = selectedValue.materialName;
+  form.value.materialCode = selectedValue.materialCode;
+};
 </script>

+ 113 - 5
src/views/storage/semi/components/details.vue

@@ -17,7 +17,49 @@
         :row-style="rowStyle"
         :cell-style="cellStyle"
         @selection-change="selectionChange"
-    />
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="primary"
+          :size="size"
+          @click="dialog3.visible = true"
+        >出库
+        </el-button
+        >
+      </template>
+    </avue-crud>
+
+    <el-dialog
+      v-model="dialog3.visible"
+      :title="dialog3.title"
+      width="550px"
+      @close="dialog3.visible = false"
+    >
+      <el-input
+        v-model="outWorkOrderCode"
+        placeholder="选择出库工单号"
+        :prefix-icon="Search"
+        @click="dialog4.visible = true"
+      >
+      </el-input>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="dialog3.visible = false">取消</el-button>
+          <el-button type="primary" @click="outInventory">
+            确定
+          </el-button>
+        </div>
+      </template>
+    </el-dialog>
+    <el-dialog
+      v-model="dialog4.visible"
+      :title="dialog4.title"
+      width="950px"
+      @close="dialog4.visible = false"
+    >
+      <work-order-page @order-info="materialInfo2" :queryType="99"/>
+    </el-dialog>
   </div>
 </template>
 <script setup>
@@ -36,11 +78,13 @@ const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
 const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
-import { getSemi, oprerate } from "@/api/storage/index";
+import {getSemi, oprerate, outInv} from "@/api/storage/index";
 import { useDictionaryStore } from "@/store";
+import {Search} from "@element-plus/icons-vue";
 const { dicts } = useDictionaryStore();
 const emits = defineEmits(["close"]);
 const ruleFormRef = ref(null);
+const outWorkOrderCode = ref(null);
 const dialog1 = reactive({
   title: "工单号选择",
   visible: false,
@@ -49,6 +93,40 @@ const materialInfo1 = (value) => {
   formData.value.outWorkOrderCode = value.workOrderCode;
   dialog1.visible = false;
 };
+
+const materialInfo2 = async (value) => {
+  outWorkOrderCode.value = value.workOrderCode;
+  dialog4.visible = false;
+};
+const dialog3 = reactive({
+  title: "出库",
+  visible: false,
+});
+
+const dialog4 = reactive({
+  visible: false,
+  title: "工单编码选择",
+});
+const outInventory = () => {
+
+  outInv({
+    inStockId: props.id,
+    ids: toDeleteIds.value,
+    outNum: toDeleteIds.value.length,
+    outWorkOrderCode: outWorkOrderCode.value
+  }).then((res) => {
+    if (res.code == "200") {
+      ElMessage.success("出库成功!");
+    } else {
+      ElMessage.error("出库失败!");
+    }
+    dialog3.visible = false;
+    outWorkOrderCode.value = null;
+    search.value.inStockId = props.id;
+    dataList();
+  });
+
+};
 const formData = ref({
   stockId: "",
   stockType: "2",
@@ -97,8 +175,19 @@ option.value = Object.assign(option.value, {
   viewBtn: false,
   menu: false,
   addBtn: false,
+  selectable: (row) => {
+    // 返回 true 表示允许勾选,false 表示禁用勾选
+    return row.inventoryStatus === 1; // 例如:状态不是 "已审核" 的行才能勾选
+  },
   column: [
     {
+      label: "管号",
+      prop: "workOrderSeqNo",
+      editDisabled: true,
+      addDisplay: false,
+      search: true,
+    },
+    {
       label: "生产批号",
       prop: "workOrderCode",
       editDisabled: true,
@@ -112,11 +201,30 @@ option.value = Object.assign(option.value, {
       ],
     },
     {
-      label: "号",
-      prop: "workOrderSeqNo",
+      label: "出库工单号",
+      prop: "outWorkOrderCode",
       editDisabled: true,
       addDisplay: false,
-      search: true,
+      rules: [
+        {
+          required: true,
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "是否已出库",
+      prop: "inventoryStatus",
+      editDisabled: true,
+      addDisplay: false,
+      html: true,
+      formatter: (val) => {
+        if (val.inventoryStatus === 2) {
+          return '<b class="el-tag el-tag--success el-tag--light">是</b>';
+        } else {
+          return '<b class="el-tag el-tag--danger el-tag--light">否</b>';
+        }
+      },
     },
 
   ]

+ 14 - 3
src/views/storage/semi/index.vue

@@ -62,13 +62,12 @@
       v-model="dialog3.visible"
       :title="dialog3.title"
       width="950px"
-      @close="dialog3.visible = false"
+      @close="dialog3.visible = false;dataList();"
     >
       <Details
         :id="selectId"
         @close="
           dialog3.visible = false;
-          dataList();
         "
       />
     </el-dialog>
@@ -217,7 +216,7 @@ option.value = Object.assign(option.value, {
         },
       },*/
     {
-      label: "库数量",
+      label: "库数量",
       prop: "operateNum",
       addDisplay: false,
       editDisabled: true,
@@ -228,6 +227,18 @@ option.value = Object.assign(option.value, {
         },
       ],
     },
+    {
+      label: "出库数量",
+      prop: "outNum",
+      addDisplay: false,
+      editDisabled: true,
+      rules: [
+        {
+          required: true,
+          trigger: "trigger",
+        },
+      ],
+    },
 
     /*{
       label: "出入库类型",