瀏覽代碼

Merge branch 'qingban' of http://maven.jgiot.com:7012/jiaxiaoqiang/JG-ADMIN-TEMP into qingban

luoxiao 3 月之前
父節點
當前提交
3549ad1969

+ 33 - 0
src/api/craft/process/index.ts

@@ -97,3 +97,36 @@ export function syncOperation(data: Object) {
     data: data,
   });
 }
+
+export function treeDataList(data: object) {
+  return request({
+    url: `/api/v1/operation/item/group/list`,
+    method: "post",
+    data: data,
+  });
+}
+
+
+export function treeDataSave(data: object) {
+  return request({
+    url: `/api/v1/operation/item/group/add`,
+    method: "post",
+    data: data,
+  });
+}
+
+export function treeDataDel(data: object) {
+  return request({
+    url: `/api/v1/operation/item/group/del`,
+    method: "post",
+    data: data,
+  });
+}
+
+export function treeDataUpdate(data: object) {
+  return request({
+    url: `/api/v1/operation/item/group/update`,
+    method: "post",
+    data: data,
+  });
+}

+ 121 - 0
src/components/CommonTable/configs/tableConfig.ts

@@ -853,4 +853,125 @@ export const tableConfig = {
       },
     ],
   },
+
+  MATERIAL_GATHER: {
+    url: "/api/v1/op/operationItem",
+    column: [
+      {
+        label: "id",
+        prop: "id",
+        display: false,
+        hide: true,
+      },
+      {
+        label: "物料名称",
+        prop: "itemName",
+        addDisabled: true,
+        editDisabled: true,
+      },
+      {
+        label: "物料版本号",
+        prop: "recordVersion",
+        addDisabled: true,
+        editDisabled: true,
+      },
+      {
+        label: "物料编码",
+        prop: "itemCode",
+        addDisabled: true,
+        editDisabled: true,
+      },
+      {
+        label: "物料规格",
+        prop: "itemModel",
+        addDisabled: true,
+        editDisabled: true,
+      },
+      { label: "所需数量", prop: "num" },
+      {
+        label: "追溯类型",
+        prop: "traceType",
+        search: true,
+        filterable: true,
+        type: "select",
+        dataType: "string",
+        dicData: dicts.trace_type,
+        props: { label: "dictLabel", value: "dictValue" },
+      },
+      {
+        label: "单位",
+        prop: "unit",
+        search: true,
+        filterable: true,
+        type: "select",
+        dataType: "string",
+        dicData: dicts.danwei_type,
+        props: { label: "dictLabel", value: "dictValue" },
+      },
+    ],
+  },
+
+  OP_ACCESSORY: {
+    url: "/api/v1/operationAccessoryItem",
+    column: [
+      {
+        label: "id",
+        prop: "id",
+        display: false,
+        hide: true,
+
+      },
+      {
+        label: "物料名称",
+        prop: "itemName",
+        addDisabled: true,
+        editDisabled: true,
+      },
+      {
+        label: "物料版本号",
+        prop: "recordVersion",
+        addDisabled: true,
+        editDisabled: true,
+      },
+      {
+        label: "物料编码",
+        prop: "itemCode",
+        addDisabled: true,
+        editDisabled: true,
+      },
+      {
+        label: "物料规格",
+        prop: "itemModel",
+        addDisabled: true,
+        editDisabled: true,
+      },
+      // {
+      //   label: "是否需要",
+      //   prop: "isTrace",
+      //   type: "radio", //类型为单选框
+      //   dicData: [
+      //     {
+      //       label: "需采集物料",
+      //       value: 1,
+      //     },
+      //     {
+      //       label: "非必须采集物料",
+      //       value: 0,
+      //     },
+      //   ],
+      //   value: 1,
+      //   rules: [
+      //     {
+      //       required: true,
+      //       message: "是否需要",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      // },
+    ],
+  },
+
+
+
+
 };

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

@@ -4,6 +4,7 @@
     :title="tableTitle"
     width="1200"
     :before-close="handleClose"
+    :append-to-body="true"
   >
     <avue-crud
       ref="crudRef"

+ 133 - 21
src/views/base/craftManagement/route/components/bottomTable.vue

@@ -17,6 +17,7 @@
       @size-change="dataList"
       @current-change="dataList"
     >
+
       <template #filePath-form="scope">
         <!-- <single-upload v-model="form.filePath" />
         <FilesUpload v-model:src="form.filePath" v-model:src-list="form.filePath" /> -->
@@ -39,6 +40,14 @@
           :pdf-source="getSOAPpdf(row)"
         />
       </template>
+
+
+      <template #menu="{ row, index, type }">
+        <el-button @click="deleteTep(row.id)" text type="primary" v-if="props.isTree=='1'&&props.groupId"
+        >删除
+        </el-button
+        >
+      </template>
     </avue-crud>
     <CommonTable
       ref="commonTableRef"
@@ -48,7 +57,7 @@
       @selected-sure="onSelectedFinish"
     />
     <el-dialog v-model="dialogVisible">
-      <VuePdfEmbed :source="previewImgUrl" annotation-layer text-layer />
+      <VuePdfEmbed :source="previewImgUrl" annotation-layer text-layer/>
     </el-dialog>
 
     <el-dialog v-model="versionDV" title="请先选择版本号" width="500" center>
@@ -76,9 +85,9 @@
   </div>
 </template>
 <script setup>
-import { ref, getCurrentInstance } from "vue";
-import { useCrud } from "@/hooks/userCrud";
-import { getTableConfig } from "./configs";
+import {ref, getCurrentInstance} from "vue";
+import {useCrud} from "@/hooks/userCrud";
+import {getTableConfig} from "./configs";
 import PDFView from "@/components/PDFView/index.vue";
 import VuePdfEmbed from "vue-pdf-embed";
 import {
@@ -101,6 +110,15 @@ const props = defineProps({
     default: "",
     type: String,
   },
+  groupId: {
+    default: "",
+    type: String,
+  },
+
+  isTree: {
+    default: "0",
+    type: String,
+  },
 });
 
 const route = useRoute();
@@ -109,15 +127,15 @@ const afterDataListToGetBomVersion = () => {
   toGetBomVersion();
 };
 // 传入一个url,后面不带/
-const { url, form, data, option, search, page, toDeleteIds, Methords, Utils } =
+const {url, form, data, option, search, page, toDeleteIds, Methords, Utils} =
   useCrud({
     src: tableConfig[props.tableType].url,
     afterDataList: afterDataListToGetBomVersion,
   });
 
-const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+const {dataList, createRow, updateRow, deleteRow, searchChange, resetChange} =
   Methords; //增删改查
-const { selectionChange, multipleUpdate } = Methords; //选中和批量删除事件
+const {selectionChange, multipleUpdate} = Methords; //选中和批量删除事件
 
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 const bomVersion = ref(null);
@@ -158,7 +176,7 @@ const startCreat = () => {
       selectedVersion.value = bomVersion.value;
       goToSelectMaterial();
     } else {
-      getBomVersion({ materialCode: route.fullPath.split("/")[5] }).then(
+      getBomVersion({materialCode: route.fullPath.split("/")[5]}).then(
         (res) => {
           versionList.value = res?.data ?? [];
           versionDV.value = true;
@@ -250,12 +268,40 @@ const startCreat = () => {
     crudRef.value && crudRef.value.rowAdd();
   }
 };
+/**分组弹窗弹出选择的主料或者辅料*/
+const groupCreat = () => {
+  if (props.tableType === "wuliaocaiji") {
+    commonTableType.value = "MATERIAL_GATHER";
+    nextTick(() => {
+      commonTableRef.value?.startSelect({
+        operationId: route.fullPath.split("/")[4], //默认直接查所有的部件辅料)
+      });
+      commonTableRef.value?.mergeOption({
+        selection: true,
+        reserveSelection: true,
+      });
+    });
+  } else if (props.tableType === "fuliaoCJ") {
+    commonTableType.value = "OP_ACCESSORY";
+
+    nextTick(() => {
+      commonTableRef.value?.startSelect({
+        operationId: route.fullPath.split("/")[4] //查询工序下选择的物料)
+      });
+      commonTableRef.value?.mergeOption({
+        selection: true,
+        reserveSelection: true,
+      });
+    });
+  }
+};
+
 
 const saveSortData = async () => {
   multipleUpdate();
 };
 
-defineExpose({ startCreat, saveSortData });
+defineExpose({startCreat, saveSortData, groupCreat});
 
 const onSortChange = () => {
   data.value.forEach((item) => {
@@ -277,7 +323,6 @@ const esopList = ref([]);
 const checkItem = ref({});
 const checkList = ref([]);
 const onSelectedFinish = (itemValue) => {
-  console.log(itemValue);
   if (Object.keys(itemValue).length == 0) {
     ElMessage.error("请选择数据,数据不能为空!");
   }
@@ -288,6 +333,24 @@ const onSelectedFinish = (itemValue) => {
   checkItem.value.checkList = [];
   esopItem.value.esopList = [];
   esopList.value = [];
+  //主料分组保存
+  if (commonTableType.value === "MATERIAL_GATHER") {
+    console.log("选择", itemGroup.value);
+    if (!itemGroup.value) {
+      ElMessage.error("未选择分组信息!");
+    }
+    return;
+  }
+
+  //主料分组保存
+  if (commonTableType.value === "OP_ACCESSORY") {
+
+
+    if (!itemGroup.value) {
+      ElMessage.error("未选择分组信息!");
+    }
+    return;
+  }
   if (props.tableType === "wuliaocaiji") {
     itemValue?.forEach((item, index) => {
       const recordItem = ref({});
@@ -409,8 +472,9 @@ const onSelectedFinish = (itemValue) => {
       }
     });
   }
-};
 
+};
+const itemGroup = ref(null);
 const previewImgUrl = ref("");
 const dialogVisible = ref(false);
 const imgUrlClick = (itemValue) => {
@@ -426,14 +490,35 @@ onMounted(() => {
   routeId.value = route.fullPath.split("/")[6];
   search.value.operationId = route.fullPath.split("/")[4];
   url.value = tableConfig[props.tableType].url;
-  option.value = Object.assign(option.value, {
-    searchEnter: true,
-    addBtn: false,
-    searchShow: false,
-    header: false,
-    sortable: true,
-    column: tableConfig[props.tableType].column,
-  });
+  search.value.isTree = props.isTree;
+  if (props.groupId) {
+    search.value.itemGroupId = props.groupId;
+
+  }
+  //物料双规格分组的话没有编辑,删除要自定义
+  if (props.isTree === '1') {
+    option.value = Object.assign(option.value, {
+      searchEnter: true,
+      addBtn: false,
+      editBtn: false,
+      delBtn: false,
+      searchShow: false,
+      header: false,
+      sortable: true,
+      column: tableConfig[props.tableType].column,
+    });
+  } else {
+    option.value = Object.assign(option.value, {
+      searchEnter: true,
+      addBtn: false,
+      searchShow: false,
+      header: false,
+      sortable: true,
+      column: tableConfig[props.tableType].column,
+    });
+  }
+
+
   dataList();
   toGetBomVersion();
 });
@@ -452,14 +537,41 @@ watch(
       column: tableConfig[props.tableType].column,
     });
     dataList();
-    toGetBomVersion();
+  }
+);
+
+watch(
+  () => itemGroup.value,
+  () => {
+    console.log("改变", itemGroup.value);
+
+  }
+);
+/**监听分组是否变化*/
+watch(
+  () => props.groupId,
+  () => {
+    routeId.value = route.fullPath.split("/")[6];
+    url.value = tableConfig[props.tableType].url;
+    option.value = Object.assign(option.value, {
+      searchEnter: true,
+      addBtn: false,
+      searchShow: false,
+      header: false,
+      sortable: true,
+      column: tableConfig[props.tableType].column,
+    });
+    search.value.itemGroupId = props.groupId
+    itemGroup.value = "props.groupId "
+    console.log("监听", itemGroup.value);
+    dataList();
   }
 );
 
 const toGetBomVersion = () => {
   getRouteMaxVersion(
     route.fullPath.split("/")[6] ? route.fullPath.split("/")[6] : routeId.value
-  ).then(({ data }) => {
+  ).then(({data}) => {
     bomVersion.value = data;
   });
 };

+ 163 - 3
src/views/base/craftManagement/route/components/processComponent.vue

@@ -91,6 +91,12 @@
         >
         <el-button
           type="primary"
+          @click="bindCreate"
+          style="margin-bottom: 15px"
+        >绑定双规格</el-button
+        >
+        <el-button
+          type="primary"
           @click="saveSortData"
           style="margin-bottom: 15px"
           >保存顺序</el-button
@@ -102,7 +108,34 @@
         <SetExcel />
       </div>
     </div>
+    <el-dialog  v-model="dialog.visible"
+                :title="dialog.title"
+                width="900px"
+                @close="dialog.visible = false"
+                :destroy-on-close="true">
+      <el-container>
+        <el-aside width="200px" style="overflow: hidden">
+          <avue-tree :option="optionTree"
+                     :data="treeData"
+                     v-model="formTree"
+                     @node-click="nodeClick"
+                     @save="saveRow"
+                     @update="updateRow"
+                     @del="delRow"></avue-tree>
+        </el-aside>
+        <el-main>
+          <el-button
+            type="primary"
+            @click="creatGroupData"
+            style="margin-bottom: 15px"
+          >新增</el-button
+          >
+          <BottomTable ref="tableTreeRef" :tableType="tableType" :groupId="groupId" :isTree="'1'"/>
+        </el-main>
+      </el-container>
+    </el-dialog>
   </div>
+
 </template>
 <script setup>
 import { Back, Document, CirclePlus, Delete } from "@element-plus/icons-vue";
@@ -110,8 +143,8 @@ import { VueDraggable } from "vue-draggable-plus";
 import BottomTable from "@/views/base/craftManagement/route/components/bottomTable.vue";
 import SetExcel from "./setExcel/index.vue";
 import { comTypes } from "@/views/base/craftManagement/route/components/configs";
-import { saveCompoents, getCompoentsList } from "@/api/craft/process/index";
-
+import { saveCompoents, getCompoentsList,treeDataList,treeDataSave,treeDataDel,treeDataUpdate } from "@/api/craft/process/index";
+const formTree=ref(null);
 import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
 import {
   processesByRouteId,
@@ -121,7 +154,11 @@ const prodtCode = ref("");
 const routerId = ref("");
 const router = useRouter();
 const route = useRoute();
-
+const dialog = reactive({
+  title: "绑定双规格",
+  visible: false,
+});
+const itemData = ref([]);
 //组件是否已经改变,如果改变了需要点击保存,才能展示下面的table
 const isChanged = ref(true);
 const isNoneedEdit = ref(false); //有些组件是不需要编辑的,所以下面也不展示table
@@ -132,7 +169,18 @@ const loadTopList = () => {
     isChanged.value = false;
   });
 };
+const bindCreate=()=>{
+  dataDetail.value.materialType="1";
+  treeDataList(treeParam.value).then(
+    (data)=>{
+      if(data.code==='200'){
+        treeData.value=data.data;
+      }
+    }
+  )
+  dialog.visible=true;
 
+}
 //查询工艺路线的一些信息
 const routeInfo = ref()
 const loadRouteInfo = async () => {
@@ -141,12 +189,112 @@ const loadRouteInfo = async () => {
     routeInfo.value = res.data
   }
 }
+//弹窗传递分组id
+const groupId = ref(null);
+const nodeClick =(data)=>{
+  groupId.value=data.id;
+}
+const treeSave = ref({});
+const saveRow=(node, data, done, loading)=>{
+   console.log(data);
+    treeSave.value.operationId = route.fullPath.split("/")[4];
+    treeSave.value.label=data.label;
+    treeSave.value.value=data.label;
+    treeSave.value.materialType=materialType.value;
+    treeDataSave(treeSave.value).then(
+      (res)=>{
+        if(res.code==='200'){
+           ElMessage.success("操作成功!");
+          treeDataList(dataDetail.value).then(
+            (res)=>{
+              treeData.value=res.data;
+            }
+          )
+        }
+      }
+    ).finally(
+       done()
+    );
+}
+
+const delRow = (data, done) => {
+  ElMessageBox.confirm('此操作将永久删除此分组, 是否继续?', '提示', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(() => {
+
+    treeDataDel(data.data).then(
+      (resouce)=>{
+        done();
+        if(resouce.code==="200"){
+          ElMessage.success("删除成功");
+
+        }else {
+          ElMessage.error(resouce.msg);
+          treeDataList(dataDetail.value).then(
+            (res)=>{
+              treeData.value=res.data;
+            }
+          )
+        }
+      }
 
+    )
+  }).catch(() => {
+    ElMessage.info('已取消删除')
+  })
+}
+const dataDetail=ref({});
+const updateRow = (node, data, done, loading) => {
+  treeDataUpdate(data).then(
+    (resouce)=>{
+      done();
+      if(resouce.code==="200"){
+        ElMessage.success("修改成功");
+
+        treeDataList(dataDetail.value).then(
+          (res)=>{
+            treeData.value=res.data;
+          }
+        )
+
+      }else {
+        ElMessage.error(resouce.msg);
+      }
+    }
+
+  )
+}
+const optionTree = {
+
+  formOption: {
+    labelWidth: 100,
+    column: [
+      {
+        label: "关联名称",
+        prop: "label",
+      },
+    ],
+  },
+  props: {
+    labelText: "标题",
+    label: "label",
+    value: "value",
+    children: "children",
+  },
+};
+const treeData = ref(null);
+const treeParam = ref({});
+treeParam.value.operationId=route.fullPath.split("/")[4]
 onMounted(async () => {
   prodtCode.value = route.fullPath.split("/")[5];
   routerId.value = route.fullPath.split("/")[6];
   await loadTopList();
   loadRouteInfo();
+  dataDetail.value.operationId=route.fullPath.split("/")[4]
+
+
 });
 
 // 顶部====================
@@ -248,12 +396,16 @@ const getNameClass = (index) => {
 // 底部table ===============
 let tipTitle = ref({});
 const bottomTableRef = ref({});
+const tableTreeRef = ref({});
 const tableType = ref("MARTERIAL_BOM");
 
 const creatNewData = () => {
   bottomTableRef.value && bottomTableRef.value.startCreat();
 };
 
+const creatGroupData = () => {
+  bottomTableRef.value && bottomTableRef.value.groupCreat();
+};
 const saveSortData = () => {
   bottomTableRef.value && bottomTableRef.value.saveSortData();
 };
@@ -273,6 +425,8 @@ const getTipContent = (itemValue) => {
 const materialType = ref("1");
 const materialTypeChange = (val) => {
   materialType.value = val;
+  dataDetail.value.materialType=val;
+  treeParam.value.materialType=val;
   if (val === "1") {
     tableType.value = "wuliaocaiji";
   } else {
@@ -398,4 +552,10 @@ const materialTypeChange = (val) => {
   text-transform: none;
   margin-bottom: 16px;
 }
+
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
 </style>

+ 18 - 2
src/views/pro/traceability/components/testData.vue

@@ -14,9 +14,17 @@
       @current-change="dataList"
     >
       <template #menu="{ size, row, index }">
-        <el-button type="text" size="mini" @click="lookData(row)">
+        <el-button type="text" size="mini" @click="lookData(row)" v-if="!row.operationIds">
           查看
         </el-button>
+        <el-button
+          v-if="row.operationId != undefined && row.operationId != null"
+          type="primary"
+          link
+          size="small"
+          @click="doEdit(row, index)"
+        ><i-ep-edit />编辑
+        </el-button>
       </template>
     </avue-crud>
   </div>
@@ -69,6 +77,10 @@ const {
 } = useCrud({
   src: "/api/v1/testData/testData",
 });
+const crudRefJSSJ=ref(null);
+const doEdit = (row, index) => {
+  crudRefJSSJ.value && crudRefJSSJ.value.rowEdit(row, index);
+};
 const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
   Methords; //增删改查
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
@@ -89,7 +101,6 @@ defineExpose({ refreshTra });
 onMounted(() => {
   if (userStore.user.userId === 10000) {
     option.value.menu = true;
-    option.value.editBtn = true;
   }
 });
 
@@ -112,8 +123,13 @@ option.value = Object.assign(option.value, {
   viewBtn: false,
   editBtn: false,
   delBtn: false,
+  rowKey: "operationIds",
   column: [
     {
+      label: "工序名称",
+      prop: "operationName",
+    },
+    {
       label: "测试时间",
       prop: "created",
     },